2009年9月30日水曜日

PHPの"file_get_contents"でHTTP通信

スズキです。

下記サンプルコードでもわかるように、
"file_get_contents"だけでも相当なことができます。

--------【PHP】--------
$url = "http://www.suz-lab.com";
$data = array( // POSTするデータ
  "user" => "suz",
  "pass" => "lab"
);
$header = array( // 送信するヘッダ
  "Authorization: Basic " . base64_encode("suz:lab"), // Basic認証も
  "User-Agent: " . $_SERVER["HTTP_USER_AGENT"]
);
$options = array("http" => array( // httpsでもhttp
  "method" => "POST",
  "content" => http_build_query($data),
  "header" => implode("\r\n", $header)
));
$content = file_get_contents($url, false, stream_context_create($options));
var_dump($http_response_header); // レスポンスヘッダ
var_dump($content); // レスポンスボディ
-------

stream_context_createの"HTTPコンテキストオプション"の詳細はこちらです。
http://www.php.net/manual/ja/context.http.php

"Google Analytics API"もブログにまとめなきゃ…

--------
http://www.suz-lab.com

2009年9月29日火曜日

Bazaarが2.0.0になってた…

スズキです。

こちらの記事で紹介され、気づきました。
http://dsas.blog.klab.org/archives/51491918.html

以前、Bazaarでのバージョン管理は「志半ば」になっていたので、
「2.0」を機に、再度、挑戦します。

> TortoiseBZRが(たぶん)実用レベルになった
ようだし…

「nonadmin」のパッケージも用意されてるし…
https://launchpad.net/bzr/+download

あとは、Eclipseのプラグインがいい感じになってれば、かなー…

--------
http://www.suz-lab.com

2009年9月26日土曜日

"GAE/J"でURLフェッチ

スズキです。

下記を参考に、Input/OutputStreamを利用する形にしてみました。
http://code.google.com/intl/ja/appengine/docs/java/urlfetch/overview.html#Fetching_URLs_with_java_net

--------【JAVA】--------
...
resp.setContentType("text/html; charset=utf-8");
URL url = new URL("http://www.suz-lab.com/");
InputStream input = url.openStream();
OutputStream output = resp.getOutputStream();
IOUtils.copy(input, output); // Commons IO
...
--------
※ "Commons IO"を利用しています。
http://commons.apache.org/io/

setContentTypeのところは、
フェッチ元のContentTypeを自動でセットするようにすべきだなー…

--------
http://www.suz-lab.com

2009年9月23日水曜日

Google Chrome Portable 3.0.195.21

スズキです。

以前、初めて自分のポータブル環境に導入したのがバージョン「2」のものでした。
http://blog.suz-lab.com/2009/07/google-chrome-portable.html

久しぶりにチェックしたらバージョン「3」が出ていたので、早速アップデートです。
http://stadt-bremerhaven.de/google-chrome-finalversion-v3-nach-einem-jahr/

ブックマークの引継ぎ、どうやるんだろう…

【Version】ソフトウェア リリース情報【Up】
http://jbbs.livedoor.jp/bbs/read.cgi/computer/41921/1247625425/

--------
http://www.suz-lab.com

2009年9月22日火曜日

CentOSでNFSの設定

スズキです。

EC2にて下記AMIを利用してNFSを設定しようとしたら…
http://blog.suz-lab.com/2009/09/suz-lab-centos-ami-539.html
非常に時間がかかってしまいました…

【サーバ側】

まずはNFSに関するパッケージのインストールです。
# yum install nfs-utils
(portmapも一緒にインストールされます)

そして"/etc/exports"にて、NFSにてマウントできるディレクトリを指定します。

--------【exports】--------
/export/suz-lab suz-lab-client(rw,no_root_squash)
--------
("rw,no_root_squash"などのオプションの説明は下記より)
http://www.linux.or.jp/JM/html/nfs-utils/man5/exports.5.html

最後にサービスの実行してサーバ側は終了です。

# /etc/init.d/portmap start
# /etc/init.d/nfs start

と思ったら、こんなエラーが出てしまいました。

Starting RPC idmapd: FATAL: Module sunrpc not found.
FATAL: Error running install command for sunrpc
Error: RPC MTAB does not exist.

下記情報によると、
http://d.hatena.ne.jp/tueda_wolf/20080904/p1
"/etc/fstab"を次のように追記する必要があるようです。

--------【fstab】--------
...
rpc_pipefs /var/lib/nfs/rpc_pipefs rpc_pipefs defaults 0 0
--------

再起動したくなかったので、実際はmountコマンドにて対応しました。

# mount -t rpc_pipefs rpc_pipefs /var/lib/nfs/rpc_pipefs

再度、サービスを起動しなおすと、無事エラーがでなくなりました。

# /etc/init.d/nfs restart

【クライアント側】

ここがうまくいかず、時間ばかり使ってしまったのですが、
結論としては、以下のように"nfs-utils"をインストールしなければいけませんでした…

# yum install nfs-utils

下記情報より、portmapも起動しておく必要があるようです。
http://d.hatena.ne.jp/rx7/20080222/p1

# /etc/init.d/portmap start

最後に、mountコマンドで、適当なディレクトリにマウントします。

# mount -t nfs suz-lab-server:/export/suz-lab /mnt/suz-lab

とにかく、長かった…

--------
http://www.suz-lab.com

2009年9月21日月曜日

"Elastic Load Balancing"(ELB)でインスタンス(EC2)の追加/削除

スズキです。

こちらの続きです。
http://blog.suz-lab.com/2009/09/amazon-ec2elastic-load-balancingelb.html

【追加】
# ./elb-register-instances-with-lb suz-lab-00 --instances i-xxxxxxxx i-yyyyyyyy
INSTANCE-ID i-xxxxxxxx
INSTANCE-ID i-yyyyyyyy

【削除】
# ./elb-deregister-instances-from-lb suz-lab-00 --instances i-xxxxxxxx
i-xxxxxxxx
No instances currently registered to LoadBalancer

EC2の初期のセッティングがまだまだ面倒(時間がかかる)…

--------
http://www.suz-lab.com

"Amazon EC2"で"Elastic Load Balancing"(ELB)

スズキです。

"Amazon EC2"で"Elastic Load Balancing"(ELB)を設定してみました。
今回は、わけあって、Mac(bash)での作業です。

まずは、下記よりツールのダウンロードです。(Javaが必要です)
http://developer.amazonwebservices.com/connect/entry.jspa?externalID=2536&categoryID=88

次に、環境変数の設定です。

# export AWS_ELB_HOME=/Users/suzuki/Dropbox/suz-lab/common/sbin/ec2/elb
※ 上記ツールを配置したディレクトリを指定して下さい。

# export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home
※ Macの場合は上記のようです。

# export EC2_PRIVATE_KEY=/Users/suzuki/Dropbox/suz-lab/common/etc/ec2/suz-lab/pk.pem
# export EC2_CERT=/Users/suzuki/Dropbox/suz-lab/common/etc/ec2/suz-lab/cert.pem
※ Amazonから取得したキーを指定します。
※ 環境変数に関しては下記も参考になります。
http://blog.suz-lab.com/2009/04/centos53ami_20.html

そして、実際にELBの作成です。(AWS_ELB_HOMEにいる前提で)

# ./elb-create-lb suz-lab-00 --availability-zones us-east-1a \
--listener "lb-port=80,instance-port=80,protocol=http" \
--listener "lb-port=443,instance-port=443,protocol=tcp"

ELB(suz-lab-00)宛ての80番(HTTP)と443番(HTTPS)を、登録されているインスタンスの
80番(HTTP)と443番(HTTPS)にバランシングするようにしています。

ちなみに443番の方の"protocol"が"tcp"になっているのに注意です。

実行結果は下記のようになり、下記のホスト名を、CNAMEレコードでDNS登録すれば、
任意のホスト名でELBが利用できるようになります。

DNS-NAME suz-lab-0000000000.us-east-1.elb.amazonaws.com

最後に、この作業をなぜMacで行ったかというと、
Windowsのコマンドプロンプトからだと、なぜか、"--listener"を複数指定すると、
レスポンスが返ってこなかったからです…

これからは、コマンドライン上の作業はMacでやることにしよう…
(Dropboxで同期してることだし…)

--------
http://www.suz-lab.com

2009年9月18日金曜日

SUZ-LAB謹製 CentOS AMI アップデート (5.3.9)

スズキです。

Manifestは下記となります。
ami.suz-lab.com/ami-centos-core-5.3.9.img.manifest.xml

変更点は次の通りです。

(1) S3のバケットを"ami-suz-lab.com"から"ami.suz-lab.com"に変更
(2) "yum update"でアップデート
(3) ec2-api-toolsをアップデート
(4) ec2-ami-toolsをアップデート
(5) Javaをアップデート(1.6.0_16)

掲示板でもアナウンスしています。
http://jbbs.livedoor.jp/bbs/read.cgi/computer/41921/1240456398/

Enjoy!

--------
http://www.suz-lab.com

2009年9月17日木曜日

HTTP(リクエスト)ヘッダーから携帯の画面サイズを取得

スズキです。

EZwebとSoftBankは下記のようにHTTP(リクエスト)ヘッダーから取得できるようです。

【EZweb】
Key: x-up-devcap-screenpixels
Value: 240,375

【SoftBank】
Key: x-jphone-display
Value: 480*854

オレオレPHPフレームワークが携帯にも対応してきた…

--------
http://www.suz-lab.com

2009年9月16日水曜日

MySQLでUNIQUE制約はインデックスを作成するか?

スズキです。

答えは、「します」。

以下、検証結果です。

まず、下記のテーブルを用意します。

--------【SQL】--------
CREATE TABLE CMN_PREF (
  PREF_ID INTEGER AUTO_INCREMENT,
  PREF_CD CHARACTER(2) NOT NULL,
  PREF_NAME VARCHAR(255) NOT NULL,
  PREF_NAME_KANA VARCHAR(255) NOT NULL,
  INS_DATETIME DATETIME NOT NULL,
  UPD_DATETIME DATETIME,
  DEL_DATETIME DATETIME,
  PRIMARY KEY(PREF_ID)
);
--------

次にインデックスの確認です。

mysql> show index from CMN_PREF\G
*************************** 1. row ***************************
Table: CMN_PREF
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: PREF_ID
Collation: A
Cardinality: 47
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:

主キーに対するインデックスが作成されていることがわかります。

下記に、上記の項目に対する詳しい説明があります。
http://nippondanji.blogspot.com/2009/03/mysqlexplain.html

このテーブルに対して、下記SQLのように、実行計画を調べてみます。

--------【SQL】--------
EXPLAIN SELECT *
FROM CMN_PREF
WHERE
  PREF_CD = '01' AND
  DEL_DATETIME IS NULL
--------
id: 1
select_type: SIMPLE
table: CMN_PREF
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 47
Extra: Using where

PREF_CDにはインデックスが作成されていないので、
"type"が"ALL"になっており、"rows"が"47"になってしまっています。

つまり、フルテーブルスキャンがおきています。

そして下記SQLにて、PREF_CD(とDEL_DATETIME)に
UNIQUE制約をつけます。

--------【SQL】--------
ALTER TABLE CMN_PREF ADD UNIQUE (
  PREF_CD,
  DEL_DATETIME
)
--------

同様にインデックスの状況を見てみると、以下のように、
今度は、PREF_CDに対するインデックスが作成されていることがわかります。

mysql> show index from CMN_PREF\G
*************************** 1. row ***************************
Table: CMN_PREF
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: PREF_ID
Collation: A
Cardinality: 47
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
*************************** 2. row ***************************
Table: CMN_PREF
Non_unique: 0
Key_name: U1
Seq_in_index: 1
Column_name: PREF_CD
Collation: A
Cardinality: NULL
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
*************************** 3. row ***************************
Table: CMN_PREF
Non_unique: 0
Key_name: U1
Seq_in_index: 2
Column_name: DEL_DATETIME
Collation: A
Cardinality: NULL
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
Comment:

同じSQLで実行計画を確認すると、
今回は、インデックスが利用されていることがわかります。
("type"が"ref"で"rows"が"1"になっています)

id: 1
select_type: SIMPLE
table: CMN_PREF
type: ref
possible_keys: PREF_CD
key: PREF_CD
key_len: 15
ref: const,const
rows: 1
Extra: Using where

ということで上記を反映したら、今、動かしてるSQLが、かなり速くなりました…

--------
http://www.suz-lab.com

2009年9月15日火曜日

CentOS(5.3)でNTPを利用した時刻合わせ(その2)

スズキです。

「その1」は下記です。
http://blog.suz-lab.com/2009/04/centos53ntp.html

今回は、設定ファイル(/etc/ntp.conf)に手を出しています。
といっても、参照サーバを"ntp.nict.jp"にしているだけです。

--------【ntp.conf】--------
...
#server 0.centos.pool.ntp.org
#server 1.centos.pool.ntp.org
#server 2.centos.pool.ntp.org
server ntp.nict.jp
...
--------

あとは、いつもの、

# service ntpd start
# chkconfig ntpd on

です。

ようやく実験用CentOS群(VMware)の時刻が正確になった…

--------
http://www.suz-lab.com

MySQLで全文検索インデックスの作成

スズキです。

何もせず、下記のようなSQLを実行するとエラーになってしまいます。

select * from SUZ where match(SUZ_NAME) against('suzuki');

なので下記のように、全文検索インデックスを作成して対応します。
(当たり前ですが…)

alter table SUZ add fulltext(SUZ_NAME);

そろそろ、ローカルTritonn準備するか…
http://sourceforge.jp/projects/tritonn/releases/

--------
http://www.suz-lab.com

"Amazon S3"を独自ドメインで利用

スズキです。

そろそろ"suz-lab"専用Mavenリポジトリが欲しくなり、
それを、"Amazon S3"で実現しようと思い、
せっかくだから、独自ドメイン(maven.suz-lab.com)にしようってことでのTipsです。

何も考えずにBucketを作成(mojo-suz-lab.com)して、
そこにアクセスするためのホスト名(mojo-suz-lab.com.s3.amazonaws.com)
maven.suz-lab.comになるようにDNSに登録して、
http://maven.suz-lab.com
にアクセスしてみると、下記のようなエラーXMLが返ってきてしまいました。

--------【XML】--------
<Error>
  <Code>NoSuchBucket</Code>
  <Message>The specified bucket does not exist</Message>
  <BucketName>maven.suz-lab.com</BucketName>
  <RequestId>C1505AC276D2EB33</RequestId>
  <HostId>...</HostId>
</Error>
--------

独自ドメインのホスト名とBucketの名前は合わせないといけないようです。

ですので、Bucketを"maven.suz-lab.com"で作り直して、
そこにアクセスするためのホスト名(maven.suz-lab.com.s3.amazonaws.com)
maven.suz-lab.comになるように再度DNSに登録しなおして、
http://maven.suz-lab.com
にアクセスしてみると、今度は下記のようなエラーXMLが返ってきてしまいました。

--------【XML】--------
<Error>
  <Code>AccessDenied</Code>
  <Message>Access Denied</Message>
  <RequestId>6543BF2B10674739</RequestId>
  <HostId>...</HostId>
</Error>
--------

これは、単にアクセス制限の設定し忘れでした…

ということで、maven.suz-lab.comのBucketに誰でもアクセスできるように設定し、
再度"http://maven.suz-lab.com"にアクセスすると、
ようやく今度は、中身が閲覧できるようになりました。

ということで、次は、中身を入れていこう。

--------
http://www.suz-lab.com

2009年9月14日月曜日

PHPで"Google Analytics API"を利用

スズキです。

下記ライブラリを用いて、PHPで"Google Analytics API"を利用してみました。
http://code.google.com/p/gapi-google-analytics-php-interface/

コードは下記のようになります。

--------【PHP】--------
require 'gapi.class.php';

define('ga_email','test@suz-lab.com');
define('ga_password','test');
define('ga_profile_id','00000000');

$ga = new gapi(ga_email,ga_password);

$ga->requestReportData(
  ga_profile_id, // Report ID
  array('pagePath'), // Google Analytics dimensions
  array('uniquePageviews'), // Google Analytics metrics
  "-uniquePageviews", // Dimensions or Metrics
  null, // Filter logic for filtering results
  null, // Start of reporting period
  null, // End of reporting period
  1, // Start index of results
  10 // Max results returned
);

foreach($ga->getResults() as $result) {
  print($result->getUniquePageviews() . ": ");
  print($result->getPagePath() . "\n");
}
--------

そして、上記コードの結果は次のようになりました。

639: /
399: /2008/09/jquerypost.html
398: /2008/10/query.html
329: /2008/02/jquery.html
215: /2009/01/mfc71dll.html
213: /2007/12/java.html
170: /2008/08/javascript.html
143: /2008/05/eclipseeuc-jp.html
142: /2008/01/firefox.html
134: /2007/06/oraclenextvalcurrval.html

あとは、下記を参考に、自分の好きなDimensionsとMetricsを選択すればOKです。

【"Dimensions"と"Metrics"のリファレンス】
http://code.google.com/intl/ja/apis/analytics/docs/gdata/gdataReferenceDimensionsMetrics.html

【"Dimensions"と"Metrics"の有効な組み合わせ】
http://code.google.com/intl/ja/apis/analytics/docs/gdata/gdataReferenceValidCombos.html

オレオレPHPフレームワークにも組み込もう。

--------
http://www.suz-lab.com

2009年9月11日金曜日

PHPの絵文字変換ライブラリ

スズキです。

久しぶりに携帯PHP開発に伴い、
以下の絵文字ライブラリを使ってみようと思ってます。

【HTML_Emoji】
http://www.revulo.com/PHP/library/HTML_Emoji.html

と、思って準備していたら、絵文字使わないかもしれない…

--------
http://www.suz-lab.com

「ポートの渡し」で"Port Forwarding"

スズキです。

Mac(Snow Leopard)でのVPN(Tunnelblick)の調子が悪く、
自宅のMacにVPN経由で直接SSHできなくなってしまいました。

仕方ないので、同じ自宅のVPN接続されているWindows経由(Port Forwarding)
でできないかと、その手のソフトウェアを探してみると、下記が見つかりました。

【ポートの渡し】
http://www.orangemaker.sakura.ne.jp/product/PortForward/
※ ポータブルです!

上記をWindows上で立ち上げ、
22番ポートをMacの22番にフォワーディングするようにしておくと、
VPN経由でのWindowsマシンへのSSHが、Macに接続されるようになります。

これで、無駄に、Windowsのリモートデスクトップを使う必要もなくなります。

早く、Tunnelblick、バージョンアップしないかなー...

--------
http://www.suz-lab.com

2009年9月9日水曜日

Pidgin(Portable)とSkype(Portable)との連携

スズキです。

こちらのプラグイン(Pidgin)を利用します。
http://eion.robbmob.com/

"Pidgin Portable"の場合は、"libskype.dll"をダウンロードし、
"App\Pidgin\plugins"の下に配置すれば、OKです。

そして再起動することで、Pidgin上でSkypeアカウントを作成できるようになります。

ちなみに、Portableついでに、SkypeもPortableにしたくなるのですが、
それは、Skype.exeを適当な場所にコピーして、下記のように実行するだけで実現できます。

Skype.exe /datapath:"S:\common\var\skype" /removable

※ "S:\common\var\skype"は適当なフォルダに置き換えてください。

Skypeの会議室は便利だなー。

--------
http://www.suz-lab.com

2009年9月8日火曜日

"rsyslog"でログをMySQLに

スズキです。

rsyslog(mysql)のインストールの次は、ログをMySQLに格納です。
http://blog.suz-lab.com/2009/09/centosrsyslogmysql.html

まずは下記のようにテーブル群を作成します。

shell # mysql -u root < /usr/share/doc/rsyslog-mysql-2.0.6/createDB.sq

次に適当なユーザーを追加して、上記のテーブルが利用できるようにしておきます。

mysql > CREATE USER rsyslog IDENTIFIED BY 'rsyslog';
mysql > GRANT ALL PRIVILEGES ON Syslog.* to rsyslog

MySQLの準備が整ったら、下記のようにrsyslogの設定ファイルに追記です。

--------【rsyslog.conf】--------
...
$ModLoad ommysql.so
*.* :ommysql:localhost,Syslog,rsyslog,rsyslog
--------
※ HOST, DB, USER, PASS, の順番です。

そしてサービスを再起動すると

shell # /etc/init.d/rsyslog restart

上記のテーブルにログが格納されていることが確認できるはずです。

次は、テーブルに格納したログをWebで閲覧できるようにしよう。

--------
http://www.suz-lab.com

Pidgin Portable 2.6.2 リリース

スズキです。

上書きするだけで、データを引き継いだまま、バージョンアップできます。
http://portableapps.com/news/2009-09-07_-_pidgin_portable_2.6.2

そろそろ、Skypeとの連携も再度チャレンジしてみよう。

--------
http://www.suz-lab.com

crossdomain.xml(完全体!?)

スズキです。

<cross-domain-policy>
  <allow-access-from domain="*"/>
</cross-domain-policy>

でも問題ないっぽいけど、Eclipseとかで注意されてしまうので…

--------【crossdomain.xml】--------
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM
    "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
  <allow-access-from domain="*"/>
</cross-domain-policy>
--------

ブログのペースが復活しだした気がする…

--------
http://www.suz-lab.com

2009年9月7日月曜日

Linuxのzipコマンドでディレクトリ構造を取り除く

スズキです。

Linuxのzipコマンドを使って、何も考えずにファイルを圧縮すると
ディレクトリ構造も含めて圧縮されてしまいます。

# pwd
/hoge

# zip test.txt.zip test.txt

Windowsで適当な場所で解凍すると下記のように展開される。
hoge/test.txt

ディレクトリ構造が必要ないときは"-j"オプションを利用します。

# pwd
/hoge

# zip -j test.txt.zip test.txt

Windowsで適当な場所で解凍すると下記のように展開されます。
test.txt

そういえば、近頃ブログ全然書いてない…

--------
http://www.suz-lab.com

CentOSにrsyslog(mysql)をインストール

スズキです。

以前、syslogのログをMySQLにで管理したいなーと思い、
その準備としてsyslog-ngをインストールしたのですが、
http://blog.suz-lab.com/2009/09/syslogsyslog-ng.html

yumのパッケージをいろいろ調べてみると、rsyslog-mysqlという、
まさに、やりたいことを実現してくれそうなものを見つけたので、
このrsyslog(mysql)を試してみることにしました。

まあ、syslog-ngのときと同様、下記のようにインストール&自動起動の調整です。

# yum install rsyslog-mysql

# service syslog stop
# service rsyslog start

# chkconfig syslog off
# chkconfig rsyslog on

次は、MySQLとの連携の設定です。

--------
http://www.suz-lab.com

Windowsの共有フォルダをCentOSで自動マウント

スズキです。

SMB系のパッケージをインストールする必要があると思ったら、
mountコマンドのみ(cifs)でいけるみたいです。

自動マウントするには、下記のように、"/etc/fstab"に追記します。

--------【fstab】--------
//192.168.11.2/suz-lab /mnt/suz-lab cifs username=suz,password=suz!23 0 0
--------

これで、自宅環境のバックアップと作業効率が同時にUPしたぞ!

--------
http://www.suz-lab.com

2009年9月4日金曜日

"syslog"から"syslog-ng"へ

スズキです。

とりあえず、下記のようにインストールしただけ…

# yum install syslog-n
(syslog-ng i386 2.1.4-1.el5 epel)

# service syslog stop
# service syslog-ng start

# chkconfig syslog off
# chkconfig syslog-ng on

syslog使って面白いことできないかなー?

--------
http://www.suz-lab.com