Lionでportが動かなかった

新しいMacBookPro買ったので移行アシスタントでSnow Leopardのディスクからデータ移したらportで入れたツールまできちんと移っててすごいなぁと感心してたんだけど(Snow Leopard以前の移行アシスタントではportそのものも移せなかったような気がするけど気のせい?)
実際にportを使ってみると port selfupdate とかするとエラーが出ちゃってとりあえず入れてたやつは動いているけど、新規でインストールとか出来ない状態になってました。

なんだろなぁと思いながらもしかしてLion用のXcode入れないとダメなんじゃね?とか思ってApp Storeからインストールしてみたら案の上動いたからとりあえずメモ

Filed under: Mac,Programming — maesan 6:16 PM

ロケットネットでもベンチマークしてみた

何かロケットネットさんがキャンペーンで50GBのディスク容量にも関わらず年間1,000円キャンペーンをやってたので思わず釣られてみたw
いやいや、月額じゃなくて年額1,000円ですよ!これは事件です!

まぁ共用のレンタルサーバーということでVPSとも違うのであんまり自由度も無いけど、取りあえずデータのバックアップ用にでも使おうかと思って借りてみました。
念のため(というかこれが目的になってる節もありますがw)いつものようにPHPspeedをやってみたぜ!
ちなみにOSはCentOSっぽいです。

ちょっと前にやった[AWS] EC2マイクロインスタンスのベンチマークしてみたに追記する形でまとめます。

ベンチ結果

EC2 micro
EBS
EC2 small
instance-store
さくらVPS
512
ServersMan@VPS
Standard
ロケットネット
Synthetic
PHP BenchMark
3,267 1,262 2,507 1,693 3,794
Synthetic
MySQL BenchMark
13,748 5,234 11,072 5,168 6,005
Synthetic
Read/Write BenchMark
865 792 1,406 901 2,910
Real World
PHP BenchMark
2,639 1,320 4,659 3,090 4,493
Real World
PHP & MySQL BenchMark
838 994 2,179 1,287 2,054
Server BenchMark 1,415 969 2,548 1,300 2,838

正直なところ驚きました。
当然ながらVPSやら共用サーバーは当たり外れがあると思いますので、一概に断言はできませんがロケットネットのパフォーマンスはかなりスゴいです。
キャンペーン無しの値段でも初期費用1,575円、月額735円ということで一番安いため、大した性能は期待していませんでしたが、比較したやつの中ではトップクラスでした。後発有利とはいえこれは結構驚きです。
回線品質は確認してないですけどCDN的な使い方もアリかもしれないです。

おまけレベルですがsshも使えて、実際触っていても引っかかる感じが全くないのでアリだと思います。ただ、rsyncでバックアップしようと思ってたのにやっぱりrsync使えなかった(つーか初めに確認しろよオレw)ので若干ショックです><
chmodすら無くてftp経由でパーミッション変更しないといけないとかイミフw
まぁバックアップの方法は適当に考えることにしよう。

Railsも使えるっちゃ使えるみたいなのですが、いかんせんバージョンがかなり古いですねぇ。普通のホームページやらblogやらphp使ったサイトとかなら全然おkですが、ちょっと凝ったことをしようと思ったらやっぱちょっと厳しいですね。
(この辺りがPHPでサイト作る人が圧倒的に多い理由じゃ無いかといつも思う。)

まとめ

ロケットネットがオススメの人
・画像いっぱい動画もうpなホームページを作りたい人
・お手軽に独自ドメインでブログとかメールとかやってみたい人
 →ただ使い勝手的にhetemlロリポのがオススメw
・ちょっとWebアプリの作り方を勉強してみたいし、PHPだと捗るって聞いた人
・ターミナルの黒い画面が苦手なのでブラウザでイロイロ設定したい人

ロケットネットがオススメじゃない人
・容量とか別に無くてもいい人
・Railsってかなり捗るって聞いた人
・Google先生と仲良くなるにはPythonとDjangoだろって人
・サーバーをイロイロいじって勉強したい人
・735円出すのが惜しい人
 →つーか月額100円台からあるよね今。。。

ちなみに自分的にお気に入りというかオススメランキングはこんな感じ
EC2 > さくらのVPS > ロケットネット > ServersMan@VPS

ServersMan@VPSはベンチに現れていませんが、頻繁に反応が鈍くなります。ssh使っててもイライラするレベルw
今ServersMan@VPSで運用している業務アプリがあるのですが、今月末にちょっとメンテを入れるのでそのタイミングでEC2のTokyoに切り替える予定なくらいあまり気に入っていないw
まぁこの辺はOpenVZの仕様的なところも関係するのかもしれないですね。



まぁ、とりあえず一年1000円で使えるうちにから借りとけってことですw

Filed under: AWS,Internet,Linux — maesan 2:01 AM

[MySQL] レプリケーションしてみた

定期的にmysqldumpとかでバックアップするのもイイんだけど、確実性を求めるならやっぱレプリケーションだろうと思いやってみた。
ちなみに定期的にmysqldumpするのは間違って更新しちゃったり消しちゃった的な時には有用なのでやっとくことに越したことはないです。

MySQLのレプリケーションって?

簡単に説明すると、バックアップを取りたいサーバー(マスター)とバックアップ先のサーバー(スレーブ)を用意して、マスターが更新される度に同じ内容でスレーブを更新する仕組みです。更新はほぼリアルタイムに行われるため、更新系はマスターで、参照系はスレーブでやるとかそういう負荷分散的な使い方ができます。
スレーブは複数にしたり、そのスレーブをマスターとして更に多段にスレーブをつなげることもできます。
ただ、複数のマスターをバックアップするスレーブとかはできないです。(物理的に1台のサーバーに複数のMySQLを立ち上げてスレーブにするってのはアリですが)

手順

レプリケーションユーザー作成

まずレプリケーション用のユーザーを用意します。
これはスレーブからマスターにアクセスする用に使うユーザーで、スレーブから接続できるように設定する必要があります。
んでセキュリティー的にレプリケーションの権限だけにしたほうがよいです。
マスターサーバーで以下を実行

mysql>GRANT REPLICATION SLAVE ON *.* TO ‘hoge_rep’@'スレーブのIP’ IDENTIFIED BY ‘hoge_password’;

ちなみにデフォルトで外部サーバーからmysqlに接続できないように設定されている場合があるので、my.cnfのbind-address設定を確認したほうがよいです。

bind-address = 127.0.0.1

とかなってたら自分自身からしかアクセス出来ませんのでコメントアウトするなりしてください。

マスターサーバーとスレーブサーバーの設定

マスターのバイナリログをスレーブが取得しにきて同期する仕組みなのでバイナリログを有効化擦る必要がありますので以下を追記する(コメントアウトされてたら有効にする)
またマスターとスレーブの文字コードが異なるとまずいことになるので明示的に設定したほうがよいです。
特定のDBのみレプリケーションしたい場合はbinlog_do_dbやbinlog_ignore_dbを設定すればおkです。

[mysqld]
server-id=11111
log_bin=/var/log/mysql/mysql-bin.log
default-character-set=utf8
binlog_do_db=hogehoge_database

[mysql]
default-character-set=utf8

server-idは何でも、スレーブとかぶらなければおkです。
基本的にスレーブ側はserver-idを設定するだけで良いのですが、レプリケーションしたいDBを限定するにはreplicate-do-dbやreplicate-ignore-dbを指定します。ただし、バイナリログを取得してから対象のDBを絞り込むため、ネットワークのトラフィック量は減りません。そのためネットワークの負荷を下げたい場合はマスター側でbinlog-do-dbを設定したほうがよいです。

[mysqld]
server-id=22222
default-character-set=utf8
replicate-do-db=hogehoge_database

[mysql]
default-character-set=utf8

ただし、スレーブをマスターにして更にスレーブをぶら下げたいときは

[mysqld]
server-id=22222
default-character-set=utf8
replicate-do-db=hogehoge_database
log_bin=/var/log/mysql/mysql-bin.log
log_slave_updates

と書く必要があります。

設定が終わったらmysqlは再起動してください。

データの複製

差分で同期していく仕組みなのでレプリケーションを開始する時には全く同じデータである必要があります。そのためマスターのデータをスレーブにコピーします。
ファイルをrsyncとかでコピーしても大丈夫だとは思いますが、普通にmysqldumpを使ってみることにします。
この時、現在のログのファイル名と位置をメモしておきます。

mysql>FLUSH TABLES WITH READ LOCK;
mysql>SHOW MASTER STATUS;
+——————+———-+——————-+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+——————-+——————+
| mysql-bin.000028 | 2849935 | hogehoge_database | |
+——————+———-+——————-+——————+

で、この状態のまま別のターミナルでmysqldumpします

$mysqldump -r root -p hogehoge_database –lock-all-tables > hogehoge.sql

元のターミナルでロックを解除します

mysql>UNLOCK TABLES;

そして今度はスレーブでデータをインポートして、レプリケーションをスタートします。

$mysql -u root -p hogehoge_database < hogehoge.sql

mysql>CHANGE MASTER TO
MASTER_HOST=”master.example.com”,
MASTER_USER=”hoge_rep”,
MASTER_PASSWORD=”hoge_password”,
MASTER_LOG_FILE=”mysql-bin.000028″,
MASTER_LOG_POS=2849935;
mysql>START SLAVE;

以上でレプリケーションが開始されます。

参考ページ

MySQL レプリケーションのセットアップ手順

Filed under: MySQL — maesan 7:18 PM

[AWS] EBSブートについての覚え書き

エントリー[AWS] EC2マイクロインスタンスのベンチマークしてみたでも書いてましたが、EC2のマイクロインスタンスはEBSブートのAMIでしか使えません。今までinstance-storeのAMIしか使ったことが無かったので、イメージの保存〜リカバリーの勝手が分からずちょっと自分なりに調べてみたので覚え書きにする。

 

そもそもEC2って?

元々EC2ではEBSってのは無くて、instance-storeのみでサービスしてたらしいです。

AMIイメージから起動して使用する手順

  1. S3に保存されているAMIイメージを選択する
  2. クラウド上にイメージを展開する
  3. オンメモリでインスタンスが展開される。シャットダウンすると消える

起動しているインスタンスを永続化する手順

  1. インスタンスのイメージを作成する
  2. 作成したイメージをS3にアップロードして保存する

この辺の流れはシンガポールが追加されたAmazon EC2で遊んでみた[S3編]を参考にしてください。

S3はストレージサービスと言っても普通にマウントして使うようなやり方はできなくて、httpを使ってファイルを送受信するだけのシンプルなサービス(何せSimple Storage Service → S3ですからw)なので、インスタンスからマウントできるようなストレージサービスとしてEBS(Elastic Block Storage)ってのが提供されるようになったようです。

 

EBSについて

ではS3とは別のEBSって何かってことですが、EBSを使う流れは簡単にいうとこんな感じ

EBSの使い方

  1. サイズを指定してボリュームを作成する
  2. 作成したボリュームを起動中のインスタンスにアタッチする
  3. インスタンスでアタッチしたボリュームをマウントする

ココまではイイんだけど、じゃあEBSブートって何よ?ってのが疑問になったわけ。イメージ的にはシャットダウンしても消えないインスタンスが使えるようになるんだって思って、だいたい合ってました。

EBSブートのインスタンスが起動するまでの流れ

  1. EBSブート用のAMIから起動する
  2. 自動的にEBSボリュームが作成され、イメージが展開される
  3. EBSボリュームからインスタンスが起動する
  4. 終了するとstop状態でEBSボリュームが残る (設定でterminateにもできるので注意)
  5. terminateするとEBSボリュームが消える

インスタンスの状態にはrunningとterminateとstopってのがあって、terminateするとデータ全部消えちゃいます。EBSだとterminateしても消えないのかなって思ったけど残念ながら消えます><その代わりEBSにはstopって状態が存在して、stopにしておくとスナップショットをとって保存しておけます。また、stopならそこからもう一度起動することもできます。

 

スナップショットからAMIイメージを作成してリカバリーする方法

stopにしておけばデータは消えないのですが、同じインスタンスをもう1個立ち上げたいとか誰かにオレオレAMIを公開したいとかできないし、stopのままおいておくのもなんか気持ち悪いのでどうやってEBSブートAMIを作るのか調べました。
スナップショットはManagement Consoleからでも簡単にできるのですが、AMIイメージの作成はManagement Consoleからはできず、コマンドラインインターフェースを使う必要がありました。
実際の手順はこのページ「EC2においてEBS Snapshotでバックアップを取得しそれをリカバリする方法」がスゴくわかりやすかったです。

インスタンスの情報が以下でスナップショットの名前がsnap-xxxxxxxxとすると
Root Device: /dev/sda1
Kernel ID: aki-xxxxxxxx
RAM Disk ID: ari-xxxxxxxx 

コマンドはこんな感じ

#ec2-register -n イメージ名 -d ‘イメージの説明’ –root-device-name /dev/sda1 -b /dev/sda1=snap-xxxxxxxx -a i386 –kernel aki-xxxxxxxx –ramdisk ari-xxxxxxxx

*64bitの場合はi386をx86_64に

これでMy AMIにオレオレイメージが作成されましたのでいつでもインスタンスを立ち上げることができるようになりました。

Filed under: AWS,Internet — maesan 11:30 PM

[AWS] EC2マイクロインスタンスのベンチマークしてみた

いつの間にやらEC2にsmallインスタンスの更に下のmicroインスタンスってのが使えるようになったらしいので、ちょっとやってみた。

他のサービスと比較

まずは似たようなサービスと比較してみます。
AWSの東京リージョンも最近できましたが、前からシンガポール使ってたので、それ基準で。
VPSとEC2は違うものですが、値段的に同じくらいのさくらVPSとServersMan@VPSも表に入れてみた。

  スペック 初期費用(年) 料金/時間 料金/月間
EC2 スモール
(オンデマンド)
CPU:仮想1コア
メモリ:1.7GB
ストレージ:160GB*
0 $0.095 $68.4 (約5,700円)
EC2 マイクロ
(オンデマンド)
CPU:仮想1コア
メモリ:613MB
ストレージ:従量(EBS)
0 $0.025 $18 (約1,500円)
EC2 マイクロ
(リザーブ)
CPU:仮想1コア
メモリ:613MB
ストレージ:従量(EBS)
$54 $0.01 $7.2 (約600円)
さくらのVPS
512
CPU:仮想2コア
メモリ:512MB
ストレージ:20GB
0 980円
ServersMan@VPS
Standard
CPU:仮想2コア
メモリ:512MB
ストレージ:30GB
0 980円

*ただしシャットダウンすると跡形も無く消え去ります><

スモールはちょっと頭抜けてますが、マイクロのリザーブは初期費用入れるとだいたい980円くらいなのでさくらVPS 512やServersMan@VPS Standardとほぼぴったりな感じです。
ただ、EC2はデータの転送量に応じた料金がかかりますし、EC2のマイクロインスタンスはEBSブートのみなのでストレージ費用も別途かかります(月$0.1/GB+I/0に応じて)
そのためやっぱちょっと金額は他と比べるとかかっちゃいます。ただ、普通のVPSと違ってアクセスが集中した時でもある程度ブーストしてくれるのでその辺はクラウドの強みかなと思います。

ベンチマーク!

では皆さんも大好きなベンチマーク結果をw
ベンチマークはAWS, さくらVPS, hetemlでベンチマークしてみたと同じくPHPspeedでやってみました。
アレから時間も経ってるので、スモールとさくらVPSも再計測してみました+ServersMan@VPSも最近使い始めたのでそれもまとめてみました。

  EC2 micro
EBS
EC2 small
instance-store
さくらVPS
512
ServersMan@VPS
Standard
Synthetic PHP BenchMark 3,267 1,262 2,507 1,693
Synthetic MySQL BenchMark 13,748 5,234 11,072 5,168
Synthetic Read/Write BenchMark 865 792 1,406 901
Real World PHP BenchMark 2,639 1,320 4,659 3,090
Real World PHP & MySQL BenchMark 838 994 2,179 1,287
Server BenchMark 1,415 969 2,548 1,300

まとめ

いや、何かの間違いと思いたいのですが、EC2のsmallが一番しょぼいってどうよ?w
何かもう全部マイクロインスタンスに変えてやろうかと思ってしまったわ><
ちなみにsmallとmicroは同じAMIで、instance-storeで使ってたAMIをEBSに変換してmicroで使ってみました。
(この辺はまた別エントリーで書いてみます)
EBSブートの方がinstance-storeよりもIO性能が低いってAWSのページには書いてあったのですが、全然変わらないというかむしろ逆転している感が漂っています。。。

相変わらずさくらVPSがスゴすぎるのはいうまでもない感じですが、ServersMan@VPSが意外と健闘している感じがします。実際使ってみるとServersMan@VPSはたまに引っかかる感じというか、遅いと感じる時があるのですが、ベンチマークとってみるとあまり目立ってばらついては無かったです。

一番ばらつきが大きかったのがEC2のmicroでした。短期ブーストってAWSの説明に書いてあったけど、いざという時は瞬発力を発揮してくれるのかもしれないですね。

まぁ取りあえずさくらのVPS
使っとけば間違いは無いってことですかね?W



Filed under: AWS,Internet,MySQL,PHP — maesan 12:36 AM

格安SSL証明書導入の記録

SNIについてですがwww.maesan.jpの証明書でmaesan.jpも証明できるのでこの記事でSNI対応できてるというのは間違っていると思われます(コメント指摘ありがとうございます!)
この記事に書いてある無理矢理な方法ではなく、きちんと対応したバージョンのapacheを使ってください><


いままでSSLの証明書取得とか設定とか、レンタルサーバー側に任せっきりだったのでちょっと勉強がてら格安SSLの「エンジョイSSLダイレクト」って所を使ってmaesan.jpドメインをSSL化してみた。
何ていうか名前からしてアレな感じですが、値段は驚きの1,400円w そんな価格の証明書で大丈夫か?w

手順

サーバーのSSL化は以下の手順で行います。
1.CSRの作成
2.SSL証明書発行申し込み
3.サーバーのSSL設定

CSRの作成〜証明書発行申し込み

CSRってのは企業の社会的責任のアレじゃなくて、Certificate Signing Requestの略らしく、簡単にいうと公開鍵+サーバーの情報が含まれた謎の文字列のことです。

サーバーはDebian使ってますが、基本的な手順は一緒と思われます。

まずは秘密鍵の生成を行います。

#openssl genrsa -out maesan.jp.key 2048

秘密鍵とは公開鍵で暗号化されたものを復号化する鍵のことで、秘密鍵で暗号化されたものは公開鍵で復号化できるんだった気がしますが、それはRSAだけだったかよく分からなくなってきたので、詳しい説明は賢い人に聞いてください!

んで次にCSRの生成を行います。

#openssl req -new -key maesan.jp.key -out maesan.jp.csr
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Kyoto
Locality Name (eg, city) []:Kyoto
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Maesan&Co.,Ltd.
Organizational Unit Name (eg, section) []:空白でおk
Common Name (eg, YOUR name) []:www.maesan.jp
Email Address []:空白でおk

Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:空白でおk
An optional company name []:空白でおk

CSRはテキストで以下のような謎の文字列です
これを申し込みページにコピペすればおk

-----BEGIN CERTIFICATE REQUEST-----
MIICpDCCAYwCAQAwXzELMAkGA1UEBhMCSlAxDjAMBgNVBAgTBUt5b3RvMQ4wDAYD
VQQHEwVLeW90bzEYMBYGA1UEChQPTWFlc2FuJkNvLixMdGQuMRYwFAYDVQQDEw13
d3cubWFlc(◕‿‿◕)IIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnr0R
XAGjybsym3IjKWsCec3/Gea9rptRELwjA5LMRHftSLB47nD1d+WktU34jEyQ/8GQ
MFsSVjaBIAhU4EfnGサンプルだよA3pWBxcEe|\ ___ /|G+FeIZpi71HSa4
FxqQVurIL/qxEkCoy23L0+17Ee5KGSiUNKjKI/人◕‿‿◕人\byGoDHQsIh4bH
hG7BItU0uFVnN3+dzQdyn9tLL1XEIcOvfXY7G5G/EQaiKDLbyUJQo9FWpYjxtdLx
Div0tIhehpK/zzpryTBwu3AkU1n1tp2fOSy6W/hDUvt7IjA90BYlqsIalK8io0hF
t7o+smIpvkdmb+6AewIDAQABoAAwDQYJKoZIhvcNAQEFBQADggEBAELWERkrZDxB
b1xt5NRPrhFPf0rBX/+tFo( つ◕ω◕)つIKwm4ZuuspvUBfj+OMmYFfe3BE7lU2S
cS/gFT9iSIWmT2hqV5jX9Z5iYqg6kYf7fBUlmmkeZjMw8v3XqSeST8U+6On+hfzp
7DGaYUO∩(⊙∀⊙)∩wJnUn/6AvYuqmLb3n3lhUE+f5t8xZl1FGGo7HwBDinCa8L
Gwfg6gmVYNKQpEJGhIL62+PKaWrMvcU5XHa9yYRMv4t41MyJ4tSXSk+TeO1ViWp8
VynoKbMhyლ(❛o❛ლ)AtNz0fYU/ga2v2hX6g1r7u54KuaIht5CSml2abTeyETCF67
8wpc7VVFwbQ=
-----END CERTIFICATE REQUEST-----

ちなみに申し込みフォームで証明書送付先メールアドレスがroot@www.maesan.jpとかになっちゃって困ったのですが、取りあえずそれで進めて問題なかったです。

で、申し込み終わってPayPalで決済も終わったのに5分どころか一晩連絡無しw
いやいや、最短5分とか書いてあったしw
まぁ営業時間外っぽい時間だったし、色々と流れ的にテンポが悪いとこもあったので、きっと中の人が手作業で進めてるところがあるような気がするw

取りあえず翌朝にメールがきまして、トラッキングページから送付先のメールアドレスも変更して、RapidSSLからメールが届き、承認すれば証明書(中間CAも)がメールにて送付されてきました。

サーバーの設定

SSLの設定ですが、www.maesan.jpとmaesan.jpをVirtualHostで分けたいなと思いましたが、debianのaptのapacheは2.2.9でSNIに対応するのはapache2.2.12以降らしいのでダメっぽい。しかし、ダメ元でやってみるw

まずはmod_gnutlsをインストール

#apt-get install libapache2-mod-gnutls

で、mod_gnutlsの設定
/etc/apache2/ports.conf
mod_sslのとこをコメントアウトして以下を追記

<IfModule mod_gnutls.c>
Listen 443
NameVirtualHost *:443
SSLStrictSNIVHostCheck off
</IfModule>

バーチャルホストの設定
/etc/apache2/sites-available/www.maesan.jp-ssl

<VirtualHost _default_:443>
ServerName www.maesan.jp
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/maesan.jp.crt ←証明書
SSLCertificateKeyFile /etc/apache2/ssl/maesan.jp.key ←秘密鍵
SSLCACertificateFile /etc/apache2/ssl/maesan.jp.cacrt ←中間証明書
以下略
</VirtualHost>

/etc/apache2/sites-available/maesan.jp-ssl

<VirtualHost _default_:443>
ServerName maesan.jp
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/maesan.jp.crt ←証明書
SSLCertificateKeyFile /etc/apache2/ssl/maesan.jp.key ←秘密鍵
SSLCACertificateFile /etc/apache2/ssl/maesan.jp.cacrt ←中間証明書
以下略
</VirtualHost>

モジュールとサイトの有効化

#a2enmod gnutls
#a2dissite default-ssl
#a2ensite www.maesan.jp-ssl
#a2ensite maesan.jp-ssl
#/etc/init.d/apache2 restart

Syntax error on line 19 of /etc/apache2/ports.conf:
Invalid command ‘SSLStrictSNIVHostCheck’, perhaps misspelled or defined by a module not included in the server configuration
failed!

やっぱダメかw
SSLStrictSNIVHostCheckの行をコメントアウトして起動してみると動いた。

試しに https://maesan.jp/https://www.maesan.jp/ にアクセスしてみたらなんだかちゃんとVirtualHostで動いてるw
しかもWindows2000のIE6でも動いた!とりあえずおkとするw

まとめ

超格安のSSLですが、本当に大丈夫なのかと思いまして、古めの環境も含めてチェックしてみました。

おkだったもの
 Mac: Safari5.0.3, Firefox 3.6.14, Chrome 9.0.597.107, Opera 11.01
 Windows XP: IE8, Chrome 9.0.597.98, Firefox
 Windows 2000: Firefox 3.6.14, Opera 10.63
 iPhone

警告でたの
 Windows 2000: IE6

SNI(名前ベースのSSL VirtualHost)は全部いけた。というか本当に上の設定で正しいかどうかは不明なのであまり参考にしない方がイイかもw

VISTAと7が手元に無い+IE7を確認してないのでアレですが、とりあえずは使えるレベルなのではないでしょうか?
ただ、このブログのアクセス解析してもIE6が結構な割合でいるので(こんな技術系ブログでIE6のユーザーが多いのもどうかと思いますがw)、万人向けのネットショップとかだとためらってしまうかもしれないですね。XPのIE6で警告でなかったらおkかも知れませんね。

もし上記アドレスにアクセスして警告とか出る環境があればコメントかtweetしてもらえるとありがたいです!

身も蓋もないことをいうと、1,400円で簡単に証明できてしまうようなものなので自己署名のSSLとどれほどの違いがあるのかと思えてしまいますよねwww

追記:
 Windows XPでIE6の環境を作って試したら問題なくいけました。
 ついでにヨメの古いガラケーで試すとwww.maesan.jpはいけてmaesan.jpはムリだった。
 →正直コレはSNIの問題じゃないかと思ったり思わなかったり。。。

参考URL

エンジョイSSLダイレクト
Ubuntu で Apache 2.2 でマルチドメイン SSL を設定するには

Filed under: Internet,Linux,覚え書き — maesan 5:02 PM  Comments (2)

[cakePHP] floatのフィールドが指数表記になっちゃう

cakePHPでfloatのフィールドを使った場合、7桁を超える数値を入れたらフォームで指数表記されちゃうのが困る。

これが

こうなる

仕方ないのでviewで

$this->data["Article"]["point"] = sprintf('%.2f', $this->data["Article"]["point"]);

って書いたらいけるかと思ったらいけなかった。
よくよく考えたらviewをレンダリングする前にformが出来上がってんじゃなかったっけ?w
ってことに気付いて素直にcontrollerに書いたら期待通りに動いた。

function edit($id = null) {
if (!$id && empty($this->data)) {
$this->Session->setFlash(__('Invalid article', true));
$this->redirect(array('action' => 'index'));
}
if (!empty($this->data)) {
if ($this->Article->save($this->data)) {
$this->Session->setFlash(__('The article has been saved', true));
$this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The article could not be saved. Please, try again.', true));
}
}
if (empty($this->data)) {
$this->data = $this->Article->read(null, $id);
$this->data["Article"]["point"] = sprintf('%.2f', $this->data["Article"]["point"]);
}
}


何かイマイチすっきりしないのですが、他の解決策ないのかねぇ?

Filed under: cakePHP,PHP,Programming — maesan 5:17 PM

[cakePHP] 1.3でForm->selectのパラメータ変わったのか

今までだと、formヘルパーを使って空白を出さないselectは以下の様に書いてました

echo $this->Form->select('hoge_id', $hoges, null, null, false);

で1.3でこれやるとダメで、ソース見たらこうやるのが正しいっぽい

echo $this->Form->select('hoge_id', $hoges, null, array('empty' => false));

だれかCookbookのフォームヘルパーのselectのページを修正してください><
http://book.cakephp.org/ja#!/ja/view/1430/select
↑英語版を見るとそっちは正しいみたいだった!

Filed under: cakePHP,PHP,Programming — maesan 11:31 PM

[Python] メール送信

Pythonでメールを送信したかったのでやってみた

基本的には以下のページのコピペなのですが、1点引っかかったのでメモ
Pythonでメールを送信したい人のためのサンプル集

#!/usr/bin/env python
# encoding: utf-8

import smtplib
from email.MIMEText import MIMEText
from email.Utils import formatdate

def SendMail(to_addr, subject, body, from_addr=None):
if from_addr is None:
from_addr = "hoge@maesan.jp"
msg = MIMEText(body)
msg["Subject"] = subject
msg["From"] = from_addr
msg["To"] = to_addr
msg["Date"] = formatdate()

s = smtplib.SMTP()
s.sendmail(from_addr, [to_addr], msg.as_string())
s.close()

if __name__ == '__main__':
from_addr = 'hoge@maesan.jp'
to_addr = 'foo@maesan.jp'
subject = 'test mail'
body = 'test'
SendMail(to_addr, subject, body, from_addr)

これでおkだと思ってたのですが、実行すると

AttributeError: SMTP instance has no attribute ‘sock’

ってエラーがでた。

多分メールサーバーとの接続に失敗したのかなと思い、明示的にサーバーとポートを指定したら動いた。

# s = smtplib.SMTP() # ↓こんな感じに変更
s = smtplib.SMTP("localhost", 25)

参考ページ

Pythonでメールを送信したい人のためのサンプル集
[ mailman-Bugs-1315417 ] SMTP problem

Filed under: Programming,Python — maesan 11:29 AM

jQueryで.postしようと思ったらfileはpostできない件

今更ながらjQueryにハマってまして、今日も画面遷移なしで画像がアップロードできるスクリプトを書こうとしたのですが、Javascriptではfileをpostできないことに気付いた><

で、画面遷移なしでファイルをアップロードしようと思ったらiframeを使ったりするらしい。Ajaxではないけど、Ajaxっぽい動きですな。

ということでサクっと書いてみた

アップロード用ページ upload.html

<html>
<head>
<style>
#dummy{
/* display:none; するとSafariだとおかしくなるらしい? */
border:0px;
width:0px;
height:0px;
}
#image{
display:none;
max-width:480px;
}
</style>
</head>
<body>
<iframe name="dummy" id="dummy"></iframe>
<div id="message"></div>
<img id="image"></div>
<form action="upload.php" method="post" target="dummy" enctype="multipart/form-data">
<input type="file" name="img" />
<input type="submit" value="Upload">
</form>
</body>
</html>

注意点はiframeにdisplay:none;するとSafariだとおかしくなるらしいんだけど、ウチの環境では別にどっちでも行けた(Mac OSX 10.6.6, Safari 5.0.3)
http://groundwalker.com/blog/2007/02/file_uploader_and_safari.html

ファイルアップロード処理とか upload.php

<?php
$error = 0;
$msg = "";
$filename = "";
if ($_FILES["img"]["error"] == 0) {
$info = getimagesize($_FILES['img']['tmp_name']);
if ($info[2] != 2 && $info[2] != 3 && $info[2] != 6) {
$msg = "画像ファイルでお願いします。";
$error++;
} else {
$exts = array(2 => '.jpg', 3 => '.png', 6 => '.bmp');
$ext = $exts[$info[2]];
$filename = "tmp/hoge".$ext;
move_uploaded_file($_FILES["img"]["tmp_name"], $filename);
chmod($filename, 0666);
$msg = "ファイルをアップロードしました。";
}
} else {
$msg = "ファイルのアップロードに失敗しました。";
$error++;
}
// jsonで出してeval
$results = sprintf('{"error":"%s","msg":"%s","filename":"%s"}', $error, $msg, $filename);
?>
<html>
<head>
<script src="jquery.js"></script>
<script type="text/javascript">
//<![CDATA[
$('document').ready(function(){
var results = eval('(<?php echo $results;?>)');
// 親ウィンドウのオブジェクトはwindow.parent.documentってやったらとれる
$('#message', window.parent.document).html(results["msg"]);
if (results["error"] == 0) {
$('#image', window.parent.document).css('display', 'block').attr('src', results["filename"]);
}
});
//]]>
</script>
</head>
<body>
</body>
</html>

別にこの程度ならjQuery使う必要は全然ないんですけどねw
フツウに書いてもコード量は変わらんですw

ポイントはjQueryでiframeから親windowのDOM要素を操作する場合は
$(‘対象のidとか’, window.parent.document)
ってやるとできる。

素のjavascriptで書いた
parent.document.getElementById(“対象のid”)
とほぼ一緒かな。

Filed under: Javascript,PHP,Programming — maesan 9:15 PM
 iTunes Store(Japan)
 iTunes Store(Japan)
 iTunes Store(Japan)
 iTunes Store(Japan)
 iTunes Store(Japan)