page_adsence

2011年12月27日火曜日

mysql_pconnectはmysql_closeで閉じても意味がない

マニュアルに書いてありました。
mysql_close() は、mysql_pconnect() により生成された持続的リンクを閉じません。

へー。

2011年12月24日土曜日

PS Vitaのソフトとメモリーカードが届いた。

今日ソフトとメモリーカードが届いたので、早速みんゴル6をやってみた。
カードを差すと問答無用でインストールされた。
ソフトにメモリーカード必須って書いてあったから、そのせいかも。
そうじゃないソフトはインストールなしでいけるんだろうか?
せっかくディスクじゃなくなったんだから、カードからロードしてもいいのに。
速度的にはインストールしたほうが断然早いんだろうけど。。。
メモリーカード大容量のは売ってなくて8GBしかないから、
あんまりインストールしたくないなー。
まぁいいや、その辺は別のソフトを買ってみたら試してみたいと思う。

インストールが終わってから、早速プレイ開始。
いつもと同じ感じのみんゴルでした。
特にこれと言って特筆すべき点もなく・・・。
キャラを使えるようにするのにラウンドしてポイント貯めないといけないのが面倒くさいってくらいかな。
あと、タッチに対応させる必要あったのか?って疑問が。
最初のメニューとかはタッチでいけるけど、ゴルフをやってる最中は基本全部ボタンだし。
タッチいらねー。

とはいえ、ゲームのクオリティ自体は相変わらずの安定感。
時間つぶしにはもってこいかな。

あと一個思ったのはゲームの難易度上がった気がする。
まだ全然始めたばっかですが、早くもコースの難易度が高くなってきた気がする。
こんなもんだったっけなー。

2011年12月18日日曜日

PS Vitaが届いた

12/17の昼に起きたらVitaが届いていた。
まさか発売日に本当に届くとは・・・。
正直ちょっと意外でした。

楽天ブックスで買ったのですが、あまりいい口コミ情報なかったので、
まぁ来ないだろうと高をくくっていたのですが、以外に当日届きました。

とはいえ、ソフトも買ってないしメモリーカードも買っていないので、結局何もできず。

とりあえず充電とソフトウェアアップデートだけしました。
あとなんかチュートリアルのゲームみたいなやつをちょろっとやって終了。

本体自体はPSP-1000を使っていた自分からすると大分軽く感じる。
画面はでかくて綺麗だけど保護フィルムも何も買っていないので、若干触るのが躊躇われたけどそのまま使っています。
明日あたりTSUTAYAで保護フィルムだけ買ってこようかな。

L、Rボタンは前のPSP-1000よりはいい感じに俺好み。
けど○とか×とかのボタンの押し具合はちょっと気に入らない。
アナログスティックは大分使いやすくなった。

とりあえずこんな感じでした。
ソフトとメモリーカードが明日届くから、
そしたらもうちょっと使ってみようと思います。

BootCampを使ってWindowsを使ってみて思った。

やっぱWindowsはWindowsマシンで使ったほうがいいね。
MacはMacとして使うのが一番。
MacでWindowsが動くようになってもう大分経つし、もうそろそろいんじゃねって思ったのですが、
やはり使いにくいことには変わりないですね。

キーボードとかマウスとか色々設定すれば使えないことはないから、
その辺は頑張って設定していこうかと。

2011年12月16日金曜日

MVACモデルに関して

MVACモデルって考え方を今更知りました・・・。
デブサミ2009で発表されてたのに・・・。

比較的長い間MCVモデルの考え方を元に作られているMojaviとかSymfonyとかを使ってきたけど、
MVACモデルって考え方はいいかも。

まずMVCって何なのって話。
MVCとは、「ソフトウェアの設計モデルの一つで、
処理の中核を担うModel、
表示・出力を司るView、
入力を受け取ってその内容に応じてViewとModelを制御するController
の3要素の組み合わせでシステムを実装する方式」のことです。
その考えを元に作られたフレームワークで、よく使われているがMojaviとSymfonyです。

もうちょっとそれぞれの役割を詳しく説明すると、以下のようになります。
Model
データのやり取りやロジック部分を担当する。オブジェクト層やサービス層に分類することも出来る。
View
Controllerから受け取ったデータから、実際の表示の生成を行う。
Controller
ユーザからのリクエストを受け取り、リクエストをハンドリングしたり、Modelをいくつか利用して処理を行う。またその時作成したデータをViewに受け渡す。

しかし、MVCモデルではControllerの役割の中に、リクエストを元にハンドリングするという役割と、Modelをいくつか利用して処理を行うという2つの異なる役割を持っていることがネックでした。
そのせいでソースが煩雑になってしまい勝ちだったのです。

そこで出てきたのがMVACモデルの考え方です。

Model
データのやり取りやロジック部分を担当する。オブジェクト層やサービス層に分類することも出来る。
View
Controllerから受け取ったデータから、実際の表示の生成を行う。
Application
Controllerから受け取ったデータから、複数のModelを利用し、実際の処理を行う。
Controller
ユーザからのリクエストを受け取り、リクエストをハンドリングして、Applicationにデータを渡す。

参考文献:http://d.hatena.ne.jp/shiba_yu36/20110303/1299123350


多分ターゲットのシステムがどういったものかでマッチする場合とマッチしない場合もありそうですが、今後もこういった考え方に関しては常にいい方法がないか考えていきたいと思います。

2011年12月13日火曜日

wgetで別名をつけて保存する方法

やり方は以下の通り。

wget -O 保存するファイル名 URL


クエリストリングをつける場合は、URLをダブルクォーテーションでくくる必要がある。

2011年12月8日木曜日

シンボリックリンクを維持したままコピーする方法とrsync時にシンボリックリンクを維持する方法

今日たまたまシンボリックリンクをコピーしたら普通のディレクトリになっちゃったって話を聞いたので、
調べてみた。
オプションいるだろうなとは思っていたけど、案の定でした。

$ cp -dr srcdir destdir

rsync時に注意しないといけない点として、シンボリックリンクをrsyncするディレクトリに指定すると
ただのフォルダとしてコピーされてしまうので、注意が必要。
回避方法としては、シンボリックリンクが張ってある階層の一階層上のディレクトリを指定してやればOK。
もし必要のないファイルやフォルダがある場合は、excludeで指定してやればよい。

2011年12月1日木曜日

アンドロイドの標準ブラウザ

初めてスマホ向けのブラウザアプリ?見たいなものを作ったのですが、
そのときにアンドロイド端末の一部だけ動かないという現象があったのでメモ。

まず起こった現象としては、外部のJavascriptファイルが読まれないというもので、
今回はJqueryと自作のJSを2ファイルの合わせて3ファイルを読み込んでいたが、
各ファイルの先頭と末尾にalert文を仕込んでロードしてみても、
アラートメッセージが出てこないというもの。

androidの実機でのデバッグをどうやればいいのかよくわかっていなかったので、
古典的ではありますが、alertメッセージを多用してデバッグしてみた。

で、1時間程デバッグしてみたら予約語を関数名に使用していたことが原因だった。
iphoneとか一部のandroidで動いていたために、気づくのが遅くなってしまった。
いい関数名を思いつかなかったからとりあえずつけていた関数名があだになってしまった・・・。

今後はとりあえずの関数名でも、もうちょっと考えて名前をつけよう。

2011年11月16日水曜日

symfonyでメンテナンス画面に簡単に切り替える方法

symfonyを使っている案件でDBメンテが入るため、サービス停止をしないといけない状況になった。
なんとか簡単にメンテナンス画面を出せないかと思っていたら、ありましたよ。
ググったら一発で出てきました。

ものすごく簡単にできました。
まず、メンテナンス中に表示するHTMLの用意をします。
用意する場所は以下の通り。

$ vi config/unavailable.php

この「unavailable.php」にメンテナンス中に表示させるHTMLを記載する。

次にsetting.ymlを編集します。

$ vi apps/アプリケーション名/config/settings.yml
all:
  .settings:
    check_lock: true

各環境で分けたい場合はprod、test、devのそれぞれの場所に書いてください。
で、念のためsymfony ccします。

以上で準備は完了です。

実際にメンテナンス画面にする方法は以下の通り

例)prod環境をメンテナンス中にする方法
$ ./symfony project:disable prod

例)dev環境をメンテナンス中にする方法
$ ./symfony project:disable dev

たったこれだけでメンテナンス画面に切り替えることが出来ます。
すばらしいですね。
ものすごい楽です。

メンテナンスを解除する場合
例)prod環境のメンテナンスを解除する方法
$ ./symfony project:enable prod

例)dev環境のメンテナンスを解除する方法
$ ./symfony project:enable dev

解除もこの通りです。
最高です。

2011年11月11日金曜日

iPhone4のiOSをPC Freeでアップデートしてみた。

本日配信が開始されたiOS5.0.1からいよいよiPhone単体でのソフトウェアアップデート(OTA)が可能になった。
なので、早速iOSをアップデートしてみる。
会社で。

設定 → 一般 → ソフトウェアアップデート

の順でアクセスし、アップデートを開始する。
で、注目のファイル容量はなんと45MB弱!

前回iOS5にした時のファイル容量が800MB弱だから、20分の1位になってる!
恐るべし差分アップデート。

しかもダウンロードにかかった時間は5分程度。
前回は3時間以上かかってダウンロードしてたのに・・・。

で、気になるアップデートにかかった時間は

わずか20分!

驚愕ですね。
これなら充電しながらじゃなくてもいけるんじゃないでしょうか?
なんにせよ便利になったので、よかったです。

2011年11月5日土曜日

MacBookProでちょっとした設定変更をした

まずファンクションキーの設定を変更した。
出荷状態のままのファンクションキーは、光度や音量等の設定を変更する為に使用するようになっていますが、
それをWindowsのように、普通のファンクションキーとして使う場合にはちょっと設定変更が必要になります。

変更方法は以下の通り。
アップルマーク → システム環境設定 → キーボード → F1、F2などのすべてのキーを標準のファンクションキーとして使用にチェック

このチェックを入れるとファンクションキーの挙動が通常のPC同様の挙動になります。
光度や音量等を変更する場合はfnキーと同時にF1を押すことで、デフォルトの機能が使用できます。

やっぱMacとWindowsは全然違うから、使い慣れていないと厳しいですね・・・。
とはいえこれになれないといけないので、いろんな機能をどんどん使っていきたいと思います。

2011年11月4日金曜日

ようやく届いたMacBookPro

11/3にようやく届きました。
購入時に出てきたお届け予定日通りなのですが、アクセサリ別発送のせいで余計に長く感じました。
とはいえようやく届いたMacですが、とりあえず開封の儀を執り行いました。
やっぱAppleの包装というか、パッケージングにこだわっている感じがいいですね。
で、箱を開けて一番最初に思ったのが、

15インチでけぇ!!

実物一回も見てなかったんで、見とけよって話なんですが、
12.1インチから15インチにジャンプアップしたので、びっくりしました。
で、箱から取り出して起動。

「ジャーン」という起動音と共に快調に動き出しました。
この起動音は昔から変わらないですね。

とりあえずウイルススキャンとかインストールしてBootCampを使ってwindows7もインストール。
最初はものすごく静かだったんですが、さすがにディスクが回ったりし始めるとファンが回る音が気になるくらいの音量になりました。
XCodeをインストールしているときも結構熱くなったんですが、なんで何だろう。
理由はよくわからないですが、普通に使っている分にはLet's note W7に比べればだいぶ静かです。
とはいえファンが全力で回り始めると同程度の音がしました。
常時全力で回っていたLet'sと、過負荷がかかった時のみ全力で回るMacBookProとでは
感じる騒音具合が結構違います。

筐体の熱さに関してもMacBookProのほうがマシですね。
Let's Noteの直接肌に触れさすとやけどするってくらい熱くなることはないです。
ネットとかしているだけではほんのりあったかくなる位で、ファンの音は一切しないです。
正直Macがここまで静かだとは。
今まではファンレスPCを探して使うようにしていましたが、これであればファンが付いてても全然問題ないです。

やっぱいいっす。
Mac。

2011年10月27日木曜日

jquery.tmpl.jsがかなり便利

Javascriptでテンプレートエンジンって、今まで使っていなかったんですが、
jquery.tmpl.jsが結構便利な感じ。

配列の中に、連想配列をいれた状態で$.tmplに渡すと、配列の数分のHTMLが生成されて返ってくる。
今までeachでまわしたり、文字列を置換したりしてたのが一気にできる。
これ、結構やばいかも。

2011年10月25日火曜日

MacBook Proが発送されるまで

今回初めてappleのサイトから商品を購入してみたのですが、
ちょっと不安になった場所があったのでメモ。
あと、発送されるまでにかかった時間をメモ。

今回は銀行振り込みを選んで購入したのですが、
ここでちょっと不安になった。
どうやらappleは決済システムを決済ASP業者に任せてるみたいで、
振込先情報を得ようとするとappleのサイトからSMBCファイナンスサービス決済ステーションのサイトに飛ばされるようです。
いきなり外部サイトに飛ばされるので、「えっ!!」って感じになりました。
サイトのデザインもいきなりダサい感じになるので、ものすごく不安な気持ちになりましたが、
三井住友銀行グループが運営している決済サービスみたいなので、
まぁ大丈夫だろうといった感じでした。

で、その日のうちに振込み手続きをして、翌日の昼前には取引成立のメールが来ました。
取引成立メールが届いてから8時間後位に商品発送のメールが届きました。

注文してから振込み、発送までにかかった日数はわずか1日。
サイトに表示されていた到着予定日が11月3日とかになっていたので、
思った以上に早かったです。
まぁ発送されただけなので、ここから到着までどのくらいかかるかはわかりませんが、
発送された場所が「ADSC支店」となっていて、そこはどうやら品川にあるらしいので、
明日の夜までには届くんじゃないかなーと勝手な希望を持っています。

楽しみ!

10/27追記
と思ったら、届いたのは一緒に買ったアクセサリーだけ…。
よく見たらアクセサリーと別々の発送だった。
別にmac持ってないのにこんなの来ても意味ないし!!
しかも10/28の17時から10/30までは出荷も停止になるって。
カスタマイズしている時は3営業日だったのに、一番最初にもらったお届け予定日が11/3とかって
おかしいと思ったら、その辺考慮されてるのかな…。
いずれにせよがっかりの一日でした。

2011年10月24日月曜日

MacBook Proを買っちゃった。

ついにポチってしまいましたよ。。。
本日19時半頃に一度appleのストアにアクセスできなくなるって状況になったんですが、
その10分後位にアクセスしてみたら、アップデートされていました。

キタ!

ついにアップデートされました。
まぁマイナーアップデートなんで、見た目とかは全然変わってないんですけど、
ちょっとだけスペックアップされてました。

Intelが次に出すIvy BridgeのCPUは今のSunday Bridgeとそんなに変わらないみたいなんで、
とりあえずこの辺で買いかなと。

今週末ぐらいには届くはず。
あー、チョー楽しみ!!

2011年10月23日日曜日

藤本輝海ことTERUがヤバイ!!

今までぜんぜん知らなかったんですが、今年買ったDVDにいた藤本輝海ことTERUがマジでハンパない!
今年から011 Artisticのライダーになったらしいのですが、グラトリがヤバイです。

今年も何本かDVDを買ったんですが、TERUのグラトリを見た後だと他のプロのグラトリが霞んで見えます。
新原雄蔵を初めて見たとき以来の衝撃でした。

具体的に何がヤバイかって説明が文章では難しいのですが、
とにかく一度見てほしいですね!

2011年10月7日金曜日

PEAR mailのsendに関して

CcやBccに送る場合にheaderにCcやBccのアドレスを含めるだけでは送れない。
なので全てsendの第一引数に配列か宛先をカンマ区切りで結合した形で入れないといけないのですが、
カンマ区切りで文字列結合した際に、Ccは問題なく送信できてるんですが、Bccがうまくいかないという現象があった。
カンマ区切りの文字列ではなく、配列で渡した場合は特に問題なく送れたので
とりあえずそっちで対応することにした。

送れないバージョン

$to      = 'hogeTo@mail.com, fugaTo@mail.com';
$cc      = 'hogeCc@mail.com, fugaCc@mail.com';
$bcc     = 'hogeBcc@mail.com, fugaBcc@mail.com';
$from    = 'from@mail.com';
$subject = 'test mail subject';
$body    = 'test mail body';

$mime    = new Mail_Mime("\r\n");
$body    = mb_convert_encoding($body, 'ISO-2022-JP');
$subject = mb_encode_mimeheader($subject, 'ISO-2022-JP', 'B', "\r\n");

$headers = array(
  'To'      => $to,
  'Cc'      => $cc,
  'Bcc'     => $bcc,
  'From'    => $from,
  'Subject' => $subject,
);

$to = implode(',', array($to, $cc, $bcc));

$mail = Mail::factory($mailSystem, $params);
$mail->send($to, $headers, $body);

送れるバージョン

$to  = array('hogeTo@mail.com', 'fugaTo@mail.com');
$cc  = array('hogeCc@mail.com', 'fugaCc@mail.com');
$bcc = array('hogeBcc@mail.com', 'fugaBcc@mail.com');

$from    = 'from@mail.com';
$subject = 'test mail subject';
$body    = 'test mail body';

$mime    = new Mail_Mime("\r\n");
$body    = mb_convert_encoding($body, 'ISO-2022-JP');
$subject = mb_encode_mimeheader($subject, 'ISO-2022-JP', 'B', "\r\n");

$headers = array(
  'To'      => implode(",", $to),
  'Cc'      => implode(",", $cc),
  'Bcc'     => implode(",", $bcc),
  'From'    => $from,
  'Subject' => $subject,
);

$to = array_merge($to, $cc, $bcc);

$mail = Mail::factory($mailSystem, $params);
$mail->send($to, $headers, $body);

2011年9月28日水曜日

MySQLって正規表現使えたんだ・・・。

今日初めて知った。
MySQLって正規表現使えるんだ…。
でもマルチバイトはうまくいかない場合があるみたい。
mregexpっていうユーザー定義関数があるらしく、それをインストールするとどの文字コードでもうまくいくって話。

でも、この記事とかこの記事とか見るとバイナリで比較するような感じで検索すればいけんじゃねって感じです。

まぁ時間がある時に試してみようと思います。

DoctrineのSELECT文に関して

DoctrineでSELECT文を上書きする際にハマったのでメモ。

対象テーブルは2テーブル
・account(アカウント一覧)
・friends(友達一覧)
・check(チェックしたユーザー一覧)

以下のようなSQL文をDoctrineから生成しようとしたがうまくいかなかった。
SELECT *, account_id IN (1,2,3,4) AS is_friend FROM friends ORDER BY is_friend DESC;

やりたいことは以下の通り。
checkテーブルのデータを各種条件を指定して取得し、
そのデータを友達かどうかをキーにしてソートする。

最初に書いていたのはこんな感じ。

$query = Doctrine_Core::getTable('Check')
           ->select('*, account_id IN (1,2,3,4) as is_friend')
           ->where('delete_flg = ?', 0)
           ->limit(10)
           ->offset(0)
           ->orderBy('is_friend DESC');

SELECT内に書かれている「account_id IN (1,2,3,4)」の部分がうまく解釈されずに、
本来であればいる「1」かいないか「0」の2種類の結果がis_friendに格納されて返ってくるはずなのだが、
is_friendにはcheckテーブルに含まれるaccount_idが入って返ってきてしまっていた。

原因はどうやらparseSelectの中でやっている処理っぽい。
さすがにこの部分を書き換えるわけにはいかないので、
どうにかできないかと色々と試してはみたのだが、結局わからず終い。

どうしたものかと思っていたのだが、
だったら別のSQLの書き方で同じ結果を取得できるようにすればいいんじゃないかと思った。

JOINとかしてやる方法はパフォーマンス的に悪すぎるので却下。
なんとかSQL一発で取れる方法を探していたらありましたよ。

「CASE」

これ使えばいけるかもと思って、早速MySQLでコマンド叩いてみた。
SELECT *, CASE WHEN account_id IN (1,2,3,4) THEN 1 END AS is_friend FROM friends ORDER BY is_friend DESC;

いけた!
全く同じ結果ではないですが、is_friendに1かNULLが入る感じの結果が返ってきました。
CASEもう一個書けばNULLのとこを0返すようにできますが、必要ないと思ったのでやっていません。

で、今度はこれをちゃんとDoctrineが作ってくれるのかってとこです。

$query = Doctrine_Core::getTable('Check')
           ->select('*, CASE WHEN account_id IN (1,2,3,4) THEN 1 END AS is_friend')
           ->where('delete_flg = ?', 0)
           ->limit(10)
           ->offset(0)
           ->orderBy('is_friend DESC');

これを実行してみると、SQLのSyntaxエラーに…。
ググってみたら、意外とさっくり出てきた。
どうやらCASE~ENDの前後に括弧をつけるといけるらしい。
早速試してみた。

$query = Doctrine_Core::getTable('Check')
           ->select('*, (CASE WHEN account_id IN (1,2,3,4) THEN 1 END) AS is_friend')
           ->where('delete_flg = ?', 0)
           ->limit(10)
           ->offset(0)
           ->orderBy('is_friend DESC');

出来た!!!

エラーもなく、希望通りのレスポンスが返ってきました。
やはり複雑なSQLになるとDoctrineを使うのも一苦労ですね…。
Doctrineのキャッシュを使いたいがためにDoctrineで頑張ってやってましたけど、
それに見合うかどうかも判断する必要がありますね。
毎回こんな感じでハマってると時間がいくらあっても足りない…。

フレームワークでデバッグする際に使える関数

PHPでデバッグする際によく使う関数にvar_dumpやprint_r等がありますが、
symfony等のフレームワークを使用している場合、こういったダンプ関数を使ってブラウザ上に情報を出力しようとすると、出力する情報量が多すぎてブラウザがクラッシュしてしまうことが多々あります。
こういった時に使える便利な関数がいくつかあったので、メモしておくことにします。
※但しバックトレースに関してはsymfonyで試しにやってみましたが、駄目でした・・・。


debug_backtrace
バックトレースを生成する
debug_print_backtrace
バックトレースを生成する
get_included_files
include または require で読み込まれたファイルの名前を配列として返す
get_defined_constants
すべての定数の名前とその値を連想配列として返す
get_class
オブジェクトのクラス名を返す
get_class_method
クラスメソッドの名前を取得する
get_class_vars
クラスのデフォルトプロパティを取得する
get_object_vars
指定したオブジェクトのプロパティを取得する
get_parent_class
オブジェクトの親クラスの名前を取得する

2011年9月21日水曜日

symfony2のインストール方法

今頃ですが、symfony2のインストール方法です。

今回は以下の環境にインストールをしていきます。
CentOS 5.5
Apache 2.2
PHP 5.3.6
MySQL 5.5.12

Symfonyの設置先ディレクトリは以下の通りです。
/path/to/dir/

まず設置先ディレクトリへ移動します。
$ cd /path/to/dir/

で、ここからソースをダウンロードしてきます。
「Symfony Standard」か「Symfony Standard without vendors」のいずれかを選択してダウンロードします。
通常は「Symfony Standard」をダウンロードしてくることになるかと思いますが、
gitをインストールしている環境では「Symfony Standard without vendors」を選択しても良いみたいです。
まぁ結局ダウンロードすることには変わりないので、お好きな方を選んで下さい。
「Symfony Standard without vendors」を選んだ場合には、ダウンロード後にgit経由でvendor系のファイルをインストールすることになります。

ダウンロードが完了後、落としてきたファイルを解凍します。
$ tar -xzpf Symfony_Standard_Vendors_2.0.1.tgz

解凍が完了すると、Symfonyディレクトリが作成され、その中にいくつかファイルやディレクトリがあります。

で、その解凍して出てきたSymfonyディレクトリへ移動。
$ cd Symfony

Symfonyがきちんと使用できる環境なのかチェックしてくれるファイルがありますので、
それを実行します。
$ php app/check.php
********************************
*                              *
*  Symfony requirements check  *
*                              *
********************************

php.ini used by PHP: /etc/php.ini

** WARNING **
*  The PHP CLI can use a different php.ini file
*  than the one used with your web server.
*  If this is the case, please ALSO launch this
*  utility from your web server.
** WARNING **

** Mandatory requirements **

  OK        Checking that PHP version is at least 5.3.2 (5.3.6 installed)
  OK        Checking that the "date.timezone" setting is set
  OK        Checking that app/cache/ directory is writable
  OK        Checking that the app/logs/ directory is writable
  OK        Checking that the json_encode() is available
  OK        Checking that the SQLite3 or PDO_SQLite extension is available
  OK        Checking that the session_start() is available
  OK        Checking that the ctype_alpha() is available
  OK        Checking that the APC version is at least 3.0.17

** Optional checks **

  OK        Checking that the PHP-XML module is installed
  OK        Checking that the libxml version is at least 2.6.21
  OK        Checking that the token_get_all() function is available
  OK        Checking that the mb_strlen() function is available
  OK        Checking that the iconv() function is available
  OK        Checking that the utf8_decode() is available


[[WARNING]] Checking that the posix_isatty() is available: FAILED
            *** Install and enable the php_posix extension (used to colorized the CLI output) ***


[[WARNING]] Checking that the intl extension is available: FAILED
            *** Install and enable the intl extension (used for validators) ***
  OK        Checking that a PHP accelerator is installed
  OK        Checking that php.ini has short_open_tag set to off
  OK        Checking that php.ini has magic_quotes_gpc set to off
  OK        Checking that php.ini has register_globals set to off
  OK        Checking that php.ini has session.auto_start set to off

** Optional checks (Doctrine) **

  OK        Checking that PDO is installed
  OK        Checking that PDO has some drivers installed: mysql, sqlite

今回の僕の環境では特になにもエラーが出なかったので何もしていませんが、
エラーが出た場合は不足しているものをインストールしてあげましょう。

で、この後にwithout vendorsを選んだ方はvendorライブラリをインストールします。
$ php bin/vendors install

以上で設置作業は完了です。

ここからはバーチャルホストの設定ですが割愛します。
ドキュメントルートは以下のディレクトリに設定します。
/path/to/dir/Symfony/web

webディレクトリ直下にconfig.phpというファイルがありますので、
ブラウザからここにアクセスしてみます。
但し、localhostからしかアクセスできるようになっていないので、適宜修正して下さい。
僕の場合は自分のIPを追加しておきました。

設定が成功していると「Symfony Configuration」というタイトルのページが表示されます。
以上でSymfonyの設置は完了です。

次回はSymfony2の初期設定の手順を書いていきたいと思います。

2011年9月13日火曜日

memcacheのインストール

memcacheが標準っぽくなってきたので、自分のVMWare上にも入れてみた。
まずyumからインストールする
必要であればリポジトリを指定してやる。
yum install memcached

以下のファイルを作成し、中身を書く。
# vi /etc/php.d/memcached.ini

extension=memcache.so

で、apache再起動。

きちんと読み込まれているか確認
php -i | grep memcache

/etc/php.d/memcached.ini,
memcache
memcache support => enabled
memcache.allow_failover => 1 => 1
memcache.chunk_size => 8192 => 8192
memcache.default_port => 11211 => 11211
memcache.default_timeout_ms => 1000 => 1000
memcache.hash_function => crc32 => crc32
memcache.hash_strategy => standard => standard
memcache.max_failover_attempts => 20 => 20
Registered save handlers => files user memcache

で、起動させる。
memcached -d -m 128 -l 127.0.0.1 -p 11211

ちなみにオプションはこんな感じ
オプション 説明 デフォルト値
-l <ip_addr> memcachedがListenするIPアドレス。 セキュリティを考慮するときちんと指定したほうがよい。 INDRR_ANY
-d デーモンとして起動
-s <file> Unixソケットへのパス
-P <filename> PIDファイルの指定。デーモンとして動作した場合のみ有効。
-u <username> memcachedを起動するユーザーを指定。root権限で実行した場合のみ有効。
-p <num> ListenするTCPポート番号。 11211
-U <num> ListenするUDPポート番号。 0, Off
-m <num> キャッシュとして利用するメモリの最大容量。単位はMB。 64
-c <num> 最大同時接続数。 1024
-M メモリを使い果たしたとき勝手にキャッシュを削除しないでエラーを返す
-n <bytes> キャッシュ1件(key+value+flags)に割り当てる最小サイズ 単位はバイト。 48
-v errorとwarningを出力
-vv -vに加えてクライアントコマンドとレスポンスを出力
-i ライセンス表示
-h バージョンとヘルプの表示
-r コアファイルのサイズ制限を最大化する。
-k 巨大なキャッシュを扱うときにキケンなオプション。
-f <factor> チャンクサイズの増加係数 1.25
-b 管理されたインスタンスの起動

起動できているか確認してみる。
$ telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
set foo 0 0 3     (保存コマンド)
bar               (データ)
STORED            (結果)
get foo           (取得コマンド)
VALUE foo 0 3     (データ)
bar               (データ)

とりあえずこんな感じです。

2011年9月12日月曜日

myPageStateとmemcacheの相性の悪さに関して

前の会社の人が作ったライブラリでmyPageState.class.phpを今回の案件で使用してみたのですが、
memcacheとの相性が悪いのか、symfony1.4との相性が悪いのかよくわかりませんが、セッションから値が取れないという不具合が発生しました。

前の会社でもsymfony(ver.1.2ですが)を使ってフォームを作る時には大体使っていたのですが、
こういったことは起こったことがありませんでした。

なので消去法でいくと一番怪しいのはmemcacheかなと。

最初はmemcacheにオブジェクトを突っ込んでた(memcacheが勝手にserializeする)んですが、
その場合には3割位の確率でmyPageState経由で保存したセッション情報の取得に失敗してしまうという現象が起きました。
仕方ないのでオブジェクトを配列にして保存するように修正してみた。
一応発生しにくくはなったものの、根本的な原因がわかってないので、
発生しないという状態までは持っていけませんでした。
しかし一体何が原因なんだろう…。
不思議です。

2011年9月7日水曜日

symfonyのfilterに関して

symfonyを久々に使って、filterを使うことになった。
symfonyの中核を担っているらしいフィルタの機能ですが、今回初めて使ってみた。
フィルタは必ず通るので、全部に対して通したい場合は比較的楽なんですが、
ユーザーのステータスを見て、どこかにリダイレクトとかさせたりする場合は、
下手をすると無限ループに陥るので注意が必要。
一度無限ループに陥ると、どういう状態になっているのか分からなくなってしまうので、
きちんと状態をログファイルに出力するようにしたほうがよい。

filterの設置場所は以下の通り。
project_root/app/アプリ名/lib/filter/~Filter.class.php

基本的な書き方としては以下の通り。
<?php
class myTestFilter extends sfFilter
{
  public function execute($filterChain)
  {
    // 入力時に実行されるfilter
    if ($this->isFirstCall())
    {
      // contextとかはこうやって取れる
      $context    = $this->getContext();
      $user       = $context->getUser();
      $controller = $context->getController();
      $request    = $context->getRequest();

    }

    $filterChain->execute();

    // 出力時に実行されるfilter
  }
}

ちなみにログの出力方法はこんな感じ。
$logger = sfContext::getInstance()->getLogger();
$logger->info('ログメッセージ');

Fillder2を使ってみた

前々から使ってみようと思って、英語版しかないためずっと日本語化パッチがでるのを待ってたんですが、いよいよ待ち切れずに使ってみた。

マジで便利。

最高です。

いままではProxomitronとSwitchProxyを使ってローカルリダイレクトさせてたんですけど、
Fiddlerだとこれ1つでいける。
やばいです。

まだ全然使いこんでないので、ただリクエストがあったファイルをローカルのファイルと差し替えるみたいな感じしかやっていませんが、色々と便利機能が他にもありそうです。

とりあえず使い方に関しては以下の通り。
http://d.hatena.ne.jp/seiunsky/20100516/1274022823

画面遷移なしで画像のアップロードをするときの罠

Ajaxを使って画面遷移なしで画像をアップロードするってことになったらしく、
調べてみたら別にできないことではないし、やってる人はいっぱいいるみたいでした。
で、早速やってみたら以外にサクッといけた。

Javascript単体でファイルのアップロードはできないので、サーバ側にデータをPOSTする必要がある。
だけど普通にPOSTすると画面遷移が発生してしまう。
それを回避するためにiframeを使用する。
普通にformでpostする際には(1)のように記述するが、
画面遷移なしでやる場合には(2)のように記述する必要がある。

(1)通常
<form action="test" method="post">
form elements…
</form>

(2)
<iframe name="iframeName"></iframe>
<form action="tset" method="post" target="iframeName">
form elements…
</form>

このようにすると、POSTされたデータ自体はiframeに飛んでいき、
iframe内で画面遷移が発生するが、現在ページを表示している方には影響がない。
また、iframe自体を画面外に飛ばしておくことで、ユーザーには遷移が行われていることを見られずに
画像をアップロードすることが可能になる。

但し何点が注意点がある。
1つはformのPOST先であるiframeをdisplay:noneにするような形で対応すると、
Safariでtargetに指定したiframeではなく、新しいウィンドウに対してPOSTされてしまうので注意が必要である。

2つ目はサーバ側からクライアントに対してデータを返す際のContent-Typeだ。
通常サーバ側でjsonを返す場合のContent-Typeは「application/json」だが、
「application/json」で返すと謎のnoscriptタグにメッセージが付加されて返ってきてしまい、
jsonオブジェクトのパースに失敗するが、「text/javascript」にしてみたらいけた。
しかし、jquery.uploadのライブラリを使ってアップしようとした場合には「text/html」で返すように指定してねって記述があるので、実は「text/html」が一番いいのかも知れない。
今回は色々と切羽詰まっていて、複数ブラウザで確認していないのでなんとも言えませんが、
ライブラリが使っているContent-Typeが安全そう。

まぁ自分で実装する機会があればぜひやってみよう。

2011年9月2日金曜日

MySQLで1時間毎にまとめた情報を取得したい場合

SUBSTRINGで時間までをとってやり、GROUP BYをしてやればOK

以外にさっくりいった。

2011年9月1日木曜日

eclipse

ファイル→新規→PHPプロジェクト

ワークスペース内に新規プロジェクトを作成にチェックする。
そうすると入力したプロジェクト名がワークスペース以下に作成される。

次へを押して、ソースのフォルダを追加を押すと、ビルドしたいディレクトリを指定できる。
ここでcacheやlogを抜いておくとよい。
ビルドすると、ソースの問題点やエラーがでる。

symfonyのprod環境のログ出力に関して

symfonyのprod環境に関してはプロジェクトルート以下に作成されているlogディレクトリ以下に、
ログファイルが作成されないようになっている。
これを出力するように変更するには、各アプリケーションディレクトリの下にあるコンフィグファイル内にあるfactories.ymlを修正する必要がある。

prod:
#  logger:
#    class:   sfNoLogger
#    param:
#      level:   err
#      loggers: ~


この部分を上記のようにコメントアウトすることで、ログファイルが生成されるようになる。

ちなみに、 自分でアプリケーションログに吐きだしたい場合は以下のように書くことで出力が可能になる。

$logger = sfContext::getInstance()->getLogger();
$logger->info('出力したいメッセージ');

2011年7月30日土曜日

OAuthの署名を作る時の注意点

今回自分が担当する案件でOAuthを使うことになった。
その時にいくつかハマったので、その時のメモ。
基本multipart絡みです。

1点目
OAuthの署名を作る際の注意点
OAuthの署名を作る時には基本的には送るパラメータを全て使って署名を作成することになっているが、multipartの場合は署名を作る際にPOSTのパラメータを含んではいけない。
POSTのパラメータを含んだ状態でPOSTすると署名が一致せずにエラーになってしまう。

2点目
multipartの場合POSTで署名を送っても取得できないので、
headerに入れてやる必要がある。

3点目
multipartで送る場合でもクエリストリングは通常通り渡されるので、
署名を作る際にはそれを含めてやらないといけない。

とりあえず注意点としてはこの位。

2011年7月24日日曜日

AppleがMac OS X LionとニューモデルのMac mini、Macbook Airを発売

WWDCが6月に行われ、そこで発表されたMacOS X Lionがついに販売開始!
一緒に出るであろうと言われていたハードのほうも、Mac miniとMacbook AirのNewモデルも販売開始されました。
また、アクセサリとしてApple Thunderbolt Displayも合わせて販売開始されていました。
やっぱMacはいいですね~。
ものすごく欲しくなってきました・・・。
まぁ、僕の物欲はおいて置いて、各ハードの感想です。

Mac miniはいつの間にか電源アダプタがなくなっていて衝撃でした。
ちょっと昔まではものすごいでかい電源アダプタがケーブルの途中にあったんですが、
それがあのサイズの中に収められるようになって・・・。
技術の進歩はすごいですね。
それ以外に関しては基本マイナーチェンジしたって感じです。

Macbook Airは相変わらずの薄さといった感じですが、
やはりサブノートとしてしか使い道はないですね。
メインマシンとして使うには全体的にパワー不足な感が否めません。
とはいえ普段ネットとメールしかやらないような人にはまったく問題ないので、
そういった方にはぜひ使ってみてもらいたいです。

今回のメインであるThunderboltはminiもAirも両方とも搭載されましたが、
いかんせん周辺機器が少ないので、今はそこまで魅力的な感じはしません。
Apple純正のものは何かと高い・・・。
Apple Thunderbolt Displayは27インチディスプレイで84,800円、
外部ストレージであるPromise Pegasus(NAS)は一番安い4TB(4x1TB)モデルで99,800円。
気軽にポチっとできる感じのお値段ではないですね・・・。
本体は昔に比べて劇的に安くなりましたが、周辺機器は相変わらずです。
そこが残念。
早くいろんなメーカーからThunderbolt対応の周辺機器が出てきて欲しいものです。

まぁ色々感想を述べていましたが、現状メインPCはWindowsなので、
特にこれといってなにかあるわけではないのですが・・・。

でも新しいPCが発表されるとやっぱ欲しくなるよね!
ということで早速見積をしてみた。
以下が見積もったスペック。

CPU2.2GHzクアッドコアIntel Core i7 L3 6M
メモリ8GB 1333MHz DDR3 SDRAM - 2x4GB
HDD750GBシリアルATAドライブ、5400 RPM
ドライブ8倍速SuperDrive (DVD±R DL/DVD±RW/CD-RW)
ディスプレイMacBook Pro 15インチ高解像度非光沢ワイドスクリーンディスプレイ
キーボードバックライトキーボード (JIS) + 製品マニュアル
アクセサリAppleCare Protection Plan for MacBook Pro
Mini DisplayPort - DVI アダプタ
Moshi MiniDisplayポート to HDMI Adapter

しめて263,595円ナリ。

これプラスBoot Camp使ってインストールする予定のWindows7 Ultimateが31,402円(Amazon.jp)

計294,997円

約30万、正直この出費は痛い・・・。
今の会社に入ってからためた貯金がパーになってしまう・・・。
とはいえ、現在使っているLet's note W7はもう使い始めて3年。
そもそも基本スペックの低いマシンで、Adobe製品を使っているものだから、
Fireworksでメモリ不足になって表示できなくなったりと、色々と弊害が出てきております。
まぁPC買った時にAdobe製品買うとは思ってなかったから、
スペック不足なのは分かっていたんですけどね。

ああー、欲しい!
いつポチっとしてもおかしくないな・・・。

2011年7月20日水曜日

GULLWINGを1シーズン使ってみた感想

まぁ以前初めて乗った時の感想が大体なんですが…。

■やわらかさが半端じゃない!
とにかくオーリーがしやすい。
板のセンター部分がロッカー構造になっているので、
脚力がなくてもオーリーできる。
あと、板をひきつけるのもやりやすかったです。
ちなみに、どのくらい脚力がなくてもできるかというと、
キャンバーボードではヤクルト1本分くらいの高さまでしか飛べない人が、
バスケットボール分位の高さ位まで飛べてました。


■浮力もそこそこある
パウダー用にセットバックしなくてもそこそこ板が浮く。
ちょっと後ろに加重してやると、「ふわっ」って感じで浮く。
なので、グラトリ用のセッティングでもなんとかなる。
1日中パウダーランとかだと厳しいですが…。


■バター系トリック
プレス自体はやりやすいんですが、
プレスしながらスピンする時に、ちょっと気を抜くと、
ロッカー部分が引っかかってこけるってことがあります。
まぁこれもテクとうか、ちゃんと加重しろよって話ですね。


■スピントリックもなんのその
引っかけてスピンするので、その辺はどうなのかなーと思ってましたが、
そこまで気になる程ではないです。
とはいえキャンバーに比べると、ノーズとテールが雪面から離れているので、
キャンバーよりはちょっと前に加重を増やして引っかける感じで、
問題無く飛べました。
たまに引っかからなくてすっぽ抜ける時もありましたが、
まぁこれは腕の問題だと思います。


■キッカー、パイプ
キッカーやパイプには入ってないのでわかりません。


■総括
全体的になんでもこなせる板ではありますが、キッカー、パイプには向かないと思います。
とはいえ011 Artisticらしいグラトリ主体で考えられているいい板だと思います。
柔らかい板なので、高速滑走をしていると若干バタつく感じはありますが、
僕はグラトリ中心に練習しているので、あまり高速滑走しないし、
大キッカーやパイプにビビって入らない僕にはぴったりの板です。
グラトリもしやすいし、パウダーも楽しめるし、ポコジャン、3~5mクラスのキッカー程度なら全然飛べます。
まぁ、飛ぶだけしかできないので、キッカーでスピントリックしようとした場合にどうなのかってのはわからないですが・・・。

今シーズンは自分のやりたいことに合った板を見つけられたんじゃないかなと思います。
去年まで乗っていた011のAIとかは、脚力のない自分には硬かったかなと思います。
初代FLAT KINGを乗っていた位がちょうどよかったのかなと思いつつ、
GULLWINGの柔らかくも、ハリのある感じが気に入りました。
来シーズンもこの板でスノーボードライフを満喫したいと思います。

2011年7月12日火曜日

TRANSWORLD SNOWboarder's BIBLE 2011-2012を買ってきた

6月末から発売を楽しみにしていたSNOWboarder's BIBLEですが、実は昨日発売されていたので買ってきた。

ちなみに、SNOWboarder's BIBLE以外にも、FreerunやSnowStyleも出てましたが、
やっぱボリュームで選ぶなら間違いなくSNOWboarder's BIBLEでしょう。

まだ途中までしか見ていないですが、やばいですね。
今年もいろいろなメーカーから面白そうなボードがどんどん出てきてます。
あと、去年に比べてダブルキャンバーの板が増えてきました。
去年はロッカーボード全盛って感じで、ダブルキャンバーはまだまだ少なかったのですが、
今年はボードを出している各メーカーほとんどがダブルキャンバーの板を出しているような印象です。

毎年どこかのメーカーから新しいテクノロジーを使ったギアが出てきていますが、
Dragonのフレームレスのゴーグルにはちょっとビビりました。
一回試しにつけてみたいです。
視野角広くするためなんでしょうけど、結局スポンジ部分はどうしようもないから、
そこまで劇的に変わるのかなってのが、ちょっと疑問ではあります。

あと、一部のメーカーからミニボードみたいなのが出てきてますね。
YONEXが今期から出すUnfixって板は126cmでノーズとテールがハンマーヘッドになっている板。
あとは011 Artisticが去年からFAT ZEROという通常乗る板よりも10cm短いサイズの板をチョイスして乗るってもの。
両方に共通するのは、板のサイズ自体は短いものの、有効エッジ長やウエスト幅はなるべく通常の板と同程度のサイズになっているところ。
取り回しのしやすさを向上させつつ、今までの板と同じ感じで乗れるって感じらしいです。
機会があれば乗ってみたいけど、試乗会とかもう終わってるしな~。
誰か買う予定の人いないかなー。

2011年7月8日金曜日

携帯絵文字に関して

携帯の絵文字を変換するものはいくつかあるが、
HTML_EmojiとMobilePictogramConverterの合わせ技が一番いいかも知れない。
多分この2つを合わせることで、かゆい所に手が届く感じがします。
HTML_Emojiは使ったんですけど、MobilePictogramConverterはまだ使ってないので、
なんとも言えませんが…。

HTML_Emojiに関して
商用利用も可能な絵文字変換ライブラリ。
拡張が簡単。
絵文字のマッピングテーブルさえ用意できれば何にでも変換することが可能。
だけどその絵文字のマッピングテーブルを用意するのがだるい。

使い方は以下の通り。
// ソースを読み込む
require_once 'HTML/Emoji.php';

// 現在のキャリアの絵文字に変換する場合
$emoji = HTML_Emoji::getInstance();

// 指定のキャリアの絵文字に変換する場合
$emoji = HTML_Emoji::getInstance(キャリア名(docomo or au or SoftBank));

// 変換する(フィルタ名は配列で指定することも可能)
$convetHtml = $emoji->filter($htmlText, フィルタ名);

とりあえず簡単な使い方に関してはこの位で。
あとはマニュアルを見た方が早いです。
HTML_Emojiのマニュアル

2011年7月6日水曜日

スマホ上で動くデバッグツール「Socketbug」

やれることとしては以下の通り。
・PC上のブラウザコンソールからJavaScriptを実行するなど各種リモート操作
・スマホブラウザに表示されているアプリのソースコードを得てPC上ブラウザに表示
・スマホブラウザのエラーをPCのブラウザコンソールに表示する
・スマホブラウザの現在のHTMLソースをPC側のブラウザでみる(通常はiPhoneブラウザでソースを覗いたりできない)

仕組みとしてはNode.jsで構築されたサーバを通じて、スマートフォン側のブラウザと、
PC側のブラウザがリアルタイムで通信して、スマホ側のエラーをPC側にリアルタイム送信したり、
逆にPC側での操作をスマホ側にリアルタイムに送信してリモートで操作することが出来るというものみたいです。

Node.jsで構築されたサーバを通じてと書かれていますが、
これはSocketbug側で提供されているわけではなく、自前で用意する必要があります。
スマホとPC両方からアクセスできるようにしないといけないので、
自分が開発で使っているVMWareが使えない…。

PHPでgzファイルの扱いに関して

PHPで.gzで圧縮されたファイルを扱う場合、どうやって解凍するのかなーと思って調べてみたら、
実は解凍するとかしなくても、ファイル関数と同じ感じで使える関数があるみたい。

以下はgzファイルを開いて読み込む処理
$rowに圧縮ファイルの内容が格納される
$handle = gzopen(ファイルパス, 'モード');
while ( !gzeof($handle) ) {
    $row = gzget($handle, 1000);
}

2011年6月29日水曜日

Vimで折りたたみ

長いソースになってくると読むのが大変になってくるが、折りたたみと画面分割コマンドを併用することで
結構読みやすくなると思う。

画面分割に関しては以前のエントリに記載した通りなので、
今回は折りたたみに関してまとめた。

よく使うコマンド
zi      折り畳みの有効無効の切り替え
zf      折り畳みを作成する
za      折り畳みの開け閉め
zd      折り畳みを削除する

時々使うコマンド
zA      折り畳みの開け閉め(再帰)
zD      折り畳みを削除する(再帰)
zE      全ての折り畳みを削除
zR      全ての折り畳みを開く
zM      全ての折り畳みを閉じる

折り畳みの種類の切り替えとか
set fdc=0           折り畳みカラム幅の設定
set fdm=manual      手動
set fdm=marker      マーカー
set fdm=indent      インデント

これらを駆使してこれからもVimを使い続けたいと思う。

HTML5を利用したJavascriptのアニメーションサイトがすごい!

このPaper.js。
やばい!

http://paperjs.org/examples/

こんなの作ってみたいなー。
試しにソース落としてきたけど7091行…。

じっくり読みます…。

今更だけどHTML5について調べてみた。

HTML5が出てからもう大分経ちますが、そろそろいろいろなブラウザでHTML5の主要な機能が出そろってきました。(とはいえまだまだ未対応の部分も多いですが…。)
そこでちょっと調べてみた。
まずセキュリティに関して。
調べてみたらこんな記事が出てきました。

「HTML5は優先順位を間違った。もういちどセキュリティの設計からやり直すべきだ」と語るJavaScript大家のDouglas Crockford氏
HTML5は安全か? 開発者が留意すべきセキュリティ問題
HTML5とは何かを簡単にまとめてみた

まぁ確かにいろいろ便利になったと思われる一方で、セキュリティに関してどうなんだろうと疑問に思っていましたが、案の定でした。
セキュリティに関してはまだまだ不安なところが多く、重要な情報を保存する時には使う気にはなれないですね。
とはいえ、漏れても問題ないようなデータに関しては、ガンガン使っていっていいと思います。
やっぱり使わないとわからないですしね。

ただ、悪いことばかりじゃないみたいです。

iframe用のサンドボックス機能をサポートする計画があり、それを使うと「データをどう解釈するかを開発者が選択することを可能にする」らしい。
「この機能を正しく利用するとサードパーティーの悪質な広告や、信頼できないコンテンツを受け取るフレームなどが再表示されるのを防ぐのに役立つ」

具体的にどうすればいいのかとか書いてないので、なんとも言えないんですが、
Javascriptを使う時にiframe使うとデバッグしづらいから、極力iframeを使いたくないんだけど、
その辺は開発中はiframeのみ表示して開発する感じにすれば何とかなるかな。
今後はどんどんと試していきたいです。

新しいiPhone4のケースが来た

iPhone4のケースプログラムでもらったケースがぶっ壊れてきたので、新しくケースを買ってみた。

ちなみに今まで使っていたのは
Griffin Reveal Etch iPhone 4 Graphite

よく尻ポケットに入れてたせいなのかも知れないのですが、
シリコン部分とカーボン部分をつないでいる部分が剥がれてきたってのと、
剥がれてきてから、シリコン部分が伸びてきてしまったので、さすがに買い換えようかなと。

で、新しいケースはシリコンかカーボンかどっちか1素材を使っていて、接着部がない、値段もそこそこのケースという条件で探してみました。

結果、新しいケースはこれにしました。
TUNEWEAR iPhone4用ソフトケース SOFTSHELL for iPhone4 ブルー TUN-PH-000047

ゴムとプラスティックの中間みたいな感じで、TPU素材というものを使っているそうです。
Amazonでのレビューも実際ケースを着用した時の色が写真と違うってこと以外は悪くないし、
iPhone4の黒にケースを着用した時の写真を購入者が上げてくれているので、
それを見て問題ないかなと。

で、先日届いたので早速ケースをつけかえてみた。
まず色に関して。
色はやっぱり写真と違ってもっと暗い感じの青になりますね。
別に僕は気にならないです。

続いて装着感。
いいですね、iPhone4にぴったりはまっていい感じです。
まぁこれに関しては使い続けてみて、伸びてきてブカブカになったりしないかとか、
いろいろ試してみたいと思います。

最後にボタン類の操作性。
全体的に硬いですね。
電源ボタン、ボリュームボタン共に押すのにそこそこ力が要ります。
これは買ったばかりだからかもしれないですが、
前のはそんなでもなかっただけに、ちょっと残念です。

まぁこれから使い続けてみてどうなるかですね。

Snowboarderカタログ号を立ち読みしてきた

Snowboarderのカタログ号が出てたので、ちょっと立ち読みしてきた。
立ち読みといってもパラパラと中身を見た程度ですが。
正直このカタログを買う気にはなれなかった。
まぁ一番早く出るカタログなんで、しょうがないといえばしょうがない。
新しいテクノロジーとかに関しての記事とかなかった(見つからなかった)し、
オレの好きな011も載ってなかったし。

やっぱ本命は7月上旬発売予定のSNOWboarder's BIBLE。
毎年買ってるけど、ボリュームが半端ないから読んでてもいろんな発見があるし、楽しいし、テンション上がる!
早く発売しないかなー。

JSファイル読み込み時のブロックを回避する方法

通常、ブラウザはいくつかのファイルを同時にダウンロードするようになっているが、
外部ファイル化されたscript要素のロードに入ると、他のファイルの読み込みがブロックされてしまう。
ブロックされる時間は、Javascriptファイルのダウンロード、構文解析、実行が完了するまで。

ブロックによる影響を最小限に抑えるには、bodyの閉じタグの直前にscript要素を記載することで、
画面側への影響は最小限に抑えられる。

さらにJavascriptのファイルを1ファイルにまとめて圧縮することで、その時間を短縮することが可能になる。
どうしても複数ファイルに分ける場合は、Javascriptのソースの中でscript要素を作成し、
DOMに追加することで並列にロードをすることが可能になる。

2011年6月28日火曜日

Nightly tester toolsの出番が増える

Nightly tester toolsが何かというとFirefoxの互換性のないアドオンを強制的に動かすアドオンで、
Firefox3.6系から4系に上げる時から使い始めたんですが、これから必要になる頻度が高くなってくるかも。

Firefoxは原則6週間ごとにメジャーバージョンアップするってことなんで、
これ入れてないとアドオンがしばらく使えない期間が発生するかも。

実際、Firefox3.6から4に上げたタイミングだと、13個入れているアドオンのうち、半分以上が使えなかった。
しかもFirebugやFireMobileSimulatorなど主要な開発ツールが未対応で、正直これでは仕事にならない。
Firefox4から5に上げた時も、同じくらい使えないアドオンがあった。
まぁ、4から5に上げた時はリリース日当日に上げたので、しょうがない部分も多少はあるが…。

これから6週間ごとにアップデートされていくが、基本的には後方互換は保っているとはいえ、
一時的にアドオンが使えなくなる事態は避けないといけない。

というわけで、Nightly tester toolsを使わずにはいられない。

2011年6月27日月曜日

TRANSWORLD SNOWboarder's BIBLE2011-12

まだ発売してないけど、そろそろ発売時期が近くなってきた。
トランスワールドのブログをみる限り7月上旬らしいから、もうすぐだ。
去年ウェア以外買い換えたので、今年は買ってもウェアと小物位だと思うけど、
カタログみて新しい技術が取り入れられたボードとか見ると、マジでテンションあがる。
早く発売してほしいなー。

PHPUnit3の導入方法

最近自分のソースにバグが多いことが嫌になってきたので、テストをきちんと書いてみようかと思ってPHPUnitを導入してみようかと思い、その作業ログを残してみました。
そもそもPHPUnitなんて使ったこともなければ、まともに調べたこともなかった。
PHPUnit自体はPHPUnit、PHPUnit2、PHPUnit3とあり、PHPUnitはPHP4用、PHPUnit2とPHPUnit3はPHP5用として配布されているみたいです。
PHPUnit3はPHPのバージョンやPEARのバージョン等がかなり新しくないと入らないみたいなので、
PHPUnit3を入れられる要件を満たしていない場合は無理に入れる必要はないかもしれません。
今回は調べながらいろいろやってたので、無駄にPHPUnit→PHPUnit2→PHPUnit3とインストールと削除を繰り返してしまいました…。

で、作業ログ。
とりあえず、PHPのバージョンをアップデートして、PHPUnitのインストールを試みる。

まずPHPUnitはソースを落としてきて置いただけ。
PHP4用に書かれてるんで参照渡しのところでWarningが出てた。
これしかないのかと思って調べているとPHPUnit2ってのがあることに気付いた。
さらに、PHPのバージョンを上げればPHPUnit3が使えるみたいなので、
それを使ってみることにした。

# pear channel-discover pear.phpunit.de
Channel "pear.phpunit.de" is already initialized

既に追加済みでした。
で、インストール

# pear install phpunit/PHPUnit
Did not download optional dependencies: ezc/ConsoleTools, use --alldeps to download automatically
phpunit/PHPUnit requires PEAR Installer (version >= 1.9.2), installed version is 1.9.1
phpunit/PHPUnit can optionally use PHP extension "dbus"
phpunit/File_Iterator requires PEAR Installer (version >= 1.9.2), installed version is 1.9.1
phpunit/PHP_CodeCoverage requires package "phpunit/File_Iterator" (version >= 1.2.2)
phpunit/PHPUnit_MockObject can optionally use PHP extension "soap"
downloading DbUnit-1.0.1.tgz ...
Starting to download DbUnit-1.0.1.tgz (39,055 bytes)
......done: 39,055 bytes
downloading Text_Template-1.1.0.tgz ...
Starting to download Text_Template-1.1.0.tgz (2,783 bytes)
...done: 2,783 bytes
downloading PHP_Timer-1.0.0.tgz ...
Starting to download PHP_Timer-1.0.0.tgz (2,536 bytes)
...done: 2,536 bytes
downloading PHPUnit_MockObject-1.0.8.tgz ...
Starting to download PHPUnit_MockObject-1.0.8.tgz (18,199 bytes)
...done: 18,199 bytes
downloading PHPUnit_Selenium-1.0.2.tgz ...
Starting to download PHPUnit_Selenium-1.0.2.tgz (16,412 bytes)
...done: 16,412 bytes
downloading YAML-1.0.5.tgz ...
Starting to download YAML-1.0.5.tgz (9,966 bytes)
...done: 9,966 bytes
downloading XML_RPC2-1.0.8.tgz ...
Starting to download XML_RPC2-1.0.8.tgz (67,063 bytes)
...done: 67,063 bytes
downloading PHP_TokenStream-1.0.1.tgz ...
Starting to download PHP_TokenStream-1.0.1.tgz (7,250 bytes)
...done: 7,250 bytes
downloading Cache_Lite-1.7.10.tgz ...
Starting to download Cache_Lite-1.7.10.tgz (30,348 bytes)
...done: 30,348 bytes
downloading ConsoleTools-1.6.1.tgz ...
Starting to download ConsoleTools-1.6.1.tgz (869,994 bytes)
...done: 869,994 bytes
downloading Base-1.8.tgz ...
Starting to download Base-1.8.tgz (236,357 bytes)
...done: 236,357 bytes
install ok: channel://pear.phpunit.de/Text_Template-1.1.0
install ok: channel://pear.phpunit.de/PHP_Timer-1.0.0
install ok: channel://pear.phpunit.de/PHPUnit_Selenium-1.0.2
install ok: channel://pear.symfony-project.com/YAML-1.0.5
install ok: channel://pear.php.net/Cache_Lite-1.7.10
install ok: channel://components.ez.no/Base-1.8
install ok: channel://pear.phpunit.de/DbUnit-1.0.1
install ok: channel://pear.phpunit.de/PHPUnit_MockObject-1.0.8
ERROR: unable to unpack /tmp/pear/download/XML_RPC2-1.0.8.tgz
install ok: channel://components.ez.no/ConsoleTools-1.6.1
install ok: channel://pear.phpunit.de/PHP_TokenStream-1.0.1

失敗…。
pear listでPEARのバージョンを確認してみると
# pear list
Installed packages, channel pear.php.net:
=========================================
Package Version State
PEAR 1.9.1 stable

1.9.1か…。
しかたないのでアップデート
# pear upgrade PEAR
downloading PEAR-1.9.2.tgz ...
Starting to download PEAR-1.9.2.tgz (295,120 bytes)
............................................................done: 295,120 bytes
downloading Archive_Tar-1.3.7.tgz ...
Starting to download Archive_Tar-1.3.7.tgz (17,610 bytes)
...done: 17,610 bytes
downloading Structures_Graph-1.0.4.tgz ...
Starting to download Structures_Graph-1.0.4.tgz (30,318 bytes)
...done: 30,318 bytes
downloading Console_Getopt-1.3.1.tgz ...
Starting to download Console_Getopt-1.3.1.tgz (4,471 bytes)
...done: 4,471 bytes
downloading XML_Util-1.2.1.tgz ...
Starting to download XML_Util-1.2.1.tgz (17,729 bytes)
...done: 17,729 bytes
upgrade ok: channel://pear.php.net/Archive_Tar-1.3.7
ERROR: unable to unpack /tmp/pear/download/Structures_Graph-1.0.4.tgz
upgrade ok: channel://pear.php.net/Console_Getopt-1.3.1
upgrade ok: channel://pear.php.net/XML_Util-1.2.1
upgrade ok: channel://pear.php.net/PEAR-1.9.2
PEAR: Optional feature webinstaller available (PEAR's web-based installer)
PEAR: Optional feature gtkinstaller available (PEAR's PHP-GTK-based installer)
PEAR: Optional feature gtk2installer available (PEAR's PHP-GTK2-based installer)
PEAR: To install optional features use "pear install pear/PEAR#featurename"

もう一回インストール

# pear install phpunit/PHPUnit
phpunit/PHPUnit can optionally use PHP extension "dbus"
downloading PHPUnit-3.5.13.tgz ...
Starting to download PHPUnit-3.5.13.tgz (118,553 bytes)
..........................done: 118,553 bytes
downloading File_Iterator-1.2.6.tgz ...
Starting to download File_Iterator-1.2.6.tgz (3,439 bytes)
...done: 3,439 bytes
downloading PHP_CodeCoverage-1.0.4.tgz ...
Starting to download PHP_CodeCoverage-1.0.4.tgz (115,029 bytes)
...done: 115,029 bytes
downloading XML_RPC2-1.0.8.tgz ...
Starting to download XML_RPC2-1.0.8.tgz (67,063 bytes)
...done: 67,063 bytes
install ok: channel://pear.phpunit.de/File_Iterator-1.2.6
install ok: channel://pear.php.net/XML_RPC2-1.0.8
install ok: channel://pear.phpunit.de/PHP_CodeCoverage-1.0.4
install ok: channel://pear.phpunit.de/PHPUnit-3.5.13

完了。

xhprofを使ってみる

前回は自分の環境にxhprofをインストールするまで完了したので、
今回はそれを実際に使ってみる。

例として以下のソースのプロファイルが取りたい場合

$action = new Action;
$action->execute();

まず、インストール時に作成された「xhprof_html」ディレクトリと「xhprof_lib」ディレクトリの場所を確認しておく。
今回の場合は「/tmp/pear/download/xhprof-0.9.2/」以下の2つのディレクトリがある。
2つのディレクトリはドキュメントルート以下にコピーして設置しておく。

で、以下の記述を追加する。
require_once '/tmp/pear/download/xhprof-0.9.2/xhprof_lib/utils/xhprof_lib.php';
require_once '/tmp/pear/download/xhprof-0.9.2/xhprof_lib/utils/xhprof_runs.php';

xhprof_enable();

$action = new Action;
$action->execute();

$xhprofData = xhprof_disable();
$sourceName = 'HTML Generator';
$xhprofRuns = new XHProfRuns_Default();
$runId      = $xhprofRuns->save_run($xhprofData, $sourceName);
echo '<a href="http://example.co.jp/xhprof/xhprof_html/index.php?run='.$runId.'&source='.$sourceName.'" target="_blank">xhprof Result</a>';

以上で追記しないといけない内容に関しては完了である。
これで実行すると、最後にechoで出力しているリンクをクリックするとプロファイルができている。
ちなみに、callgraphを出そうとする場合は、別途graphvizをインストールする必要がある。
インストール方法は以下の通り。

# cd /etc/yum.repos.d/
# wget http://www.graphviz.org/graphviz-rhel.repo
# yum install graphviz

xhprofをインストール

xhprofってのがあるってのを聞いて、とりあえず入れてみた。
pecl経由で簡単にインストールできるのかと思いきや、phpizeでエラーになってしまって、
どうにもインストールできなかったので、結局手動でインストールした。

まず、適当な場所にxhprofをダウンロードしてくる。
自分の場合は/tmp/pear/downloadの中に落としてた。

# wget http://pecl.php.net/get/xhprof-0.9.2.tgz

解凍する

# tar xvfz xhprof-0.9.2.tgz

ディレクトリを移動する。

# cd xhprof-0.9.2/extension/

ビルドする

# phpize

configure

# ./configure --with-php-config=/usr/bin/php-config

Makefile作成

# make

make testでエラーがないかチェック

# make test

インストール

# make install

インストールが完了すると「/tmp/pear/download/xhprof-0.9.2」以下に「xhprof_html」と「xhprof_lib」というフォルダができる。
この2つのフォルダ内のファイルを使ってプロファイルをWeb上に表示させる。

iniファイルに「extension=xhprof.so」を追加

# vi /etc/php.d/xhprof.ini

syntaxチェック

# /etc/init.d/httpd configtest

apache再起動

# /etc/init.d/httpd graceful

phpinfoを確認
xhprofという項目があればインストール完了

# php -i

で、インストールは完了。
次回は設置して、実際に使用してみる。
使用する際に、必要なファイルはこのインストールしたディレクトリ内にあるので、
パスを忘れないようにすること。
今回の場合は「/tmp/pear/download/xhprof-0.9.2/」以下にあるファイルを使用する。
必要に応じてコピーして使うのもあり。

2011年6月16日木曜日

MySQLで特定のテーブルだけdumpする

最後にテーブル名を追加してやれば、問題なくdumpできる。

mysqldump -u ユーザー名 DB名 テーブル名 > dump.sql

dumpするテーブルは複数でもいける。
スペース区切りで追加していけばOK。

mysqldump -u ユーザー名 DB名 テーブル名1 テーブル名2 > dump.sql

PHPアクセラレータ(APC)の導入とそのメリット

PHPはスクリプト言語だが、単純なインタプリタ言語ではない。
PHPスクリプトの実行時は、常に「ランタイム・コンパイラ」が自動的にスクリプトをバイトコードへコンパイルし、これを「エグゼキュータ」が実行する。
コンパイルといってもOSネイティブなバイナリに変換されるわけではなく、エグゼキュータが解釈可能な形式へ変換される。

PHPスクリプトは実行の度に毎回コンパイルされる。このため、ランタイム・コンパイラが同じスクリプトのコンパイルを何度も余分に行っていることになり、パフォーマンスは犠牲になっている。

アクセラレータなしの場合
リクエストが来る
      ↓
スクリプト読み込み
      ↓
スクリプト解析
      ↓
スクリプトコンパイル
      ↓
スクリプト実行
      ↓
レスポンスを返す

アクセラレータありで、キャッシュされている場合
リクエストが来る
      ↓
スクリプト実行
      ↓
レスポンスを返す

上記を見てもらうとわかるようにスクリプトの読み込み、解析、コンパイルという部分がまるっと必要なくなる。
ソース量が多ければ多いほど高速化に期待が持てる。

というわけで導入方法は以下の通り。

ソースコンパイルとかyumで入れるとかいろいろと方法はあるみたいですが、
既存のリポジトリにphp-apcがなかったので、PECLでインストールをしてみました。

[root@localhost yum.repos.d]# pecl install apc
downloading APC-3.1.9.tgz ...
Starting to download APC-3.1.9.tgz (155,540 bytes)
.................................done: 155,540 bytes
54 source files, building
running: phpize
Configuring for:
PHP Api Version:         20090626
Zend Module Api No:      20090626
Zend Extension Api No:   220090626
Enable internal debugging in APC [no] :
Enable per request file info about files used from the APC cache [no] :
Enable spin locks (EXPERIMENTAL) [no] :
Enable memory protection (EXPERIMENTAL) [no] :
Enable pthread mutexes (default) [yes] :
Enable pthread read/write locks (EXPERIMENTAL) [no] :

中略

Build process completed successfully
Installing '/usr/lib/php/modules/apc.so'
Installing '/usr/include/php/ext/apc/apc_serializer.h'
install ok: channel://pecl.php.net/APC-3.1.9
configuration option "php_ini" is not set to php.ini location
You should add "extension=apc.so" to php.ini

赤文字になっている部分はいろいろと質問されているみたいなんですが、
とりあえずインストールしてみたかっただけなので、
Enter連打でインストール完了。

# vi /etc/php.d/apc.ini
extension=apc.so

上記を追加して保存。
apache再起動

# /etc/init.d/httpd restart

phpinfoで確認

# php -i
Configuration

apc

APC Support => disabled
Version => 3.1.9
APC Debugging => Disabled
MMAP Support => Enabled
MMAP File Mask =>
Locking type => pthread mutex Locks
Serialization Support => broken
Revision => $Revision: 308812 $
Build Date => Jun 15 2011 19:31:38

Directive => Local Value => Master Value
apc.cache_by_default => On => On
apc.canonicalize => On => On
apc.coredump_unmap => Off => Off
apc.enable_cli => Off => Off
apc.enabled => On => On
apc.file_md5 => Off => Off
apc.file_update_protection => 2 => 2
apc.filters => no value => no value
apc.gc_ttl => 3600 => 3600
apc.include_once_override => Off => Off
apc.lazy_classes => Off => Off
apc.lazy_functions => Off => Off
apc.max_file_size => 1M => 1M
apc.mmap_file_mask => no value => no value
apc.num_files_hint => 1000 => 1000
apc.preload_path => no value => no value
apc.report_autofilter => Off => Off
apc.rfc1867 => Off => Off
apc.rfc1867_freq => 0 => 0
apc.rfc1867_name => APC_UPLOAD_PROGRESS => APC_UPLOAD_PROGRESS
apc.rfc1867_prefix => upload_ => upload_
apc.rfc1867_ttl => 3600 => 3600
apc.serializer => default => default
apc.shm_segments => 1 => 1
apc.shm_size => 32M => 32M
apc.slam_defense => On => On
apc.stat => On => On
apc.stat_ctime => Off => Off
apc.ttl => 0 => 0
apc.use_request_time => On => On
apc.user_entries_hint => 4096 => 4096
apc.user_ttl => 0 => 0
apc.write_lock => On => On

とりあえず入ったみたいです。
使ってみたらまた感想を書いてみたいと思います。
とはいえVMWare上の自分しか使わないサーバなので、対して効果はないと思いますが…。

2011年6月10日金曜日

CentOS5.5でSendmailの設定

自分のVMWareはNAT接続しているので、メールの受け取りはできないですが、
送信だけであればできるので、それ用に設定してみた。
詳しいことはわからないので、ググって調べながら設定した。

sendmailの設定ファイルは「/etc/mail/sendmail.cf」というところにあるファイル。
けどこのsendmail.cfというファイルは直接編集することはしない。
ではどうやってこのsendmail.cfファイルを編集するかというと、
sendmail.mcファイルを修正し、それをm4マクロで変換したものをsendmail.cfファイルに書くこむことで、
更新が可能。

で、sendmail.mcファイルの変更内容は以下の通り。
※設定に失敗する可能性を想定してsendmail.mcとsendmail.cfは必ずバックアップを取っておくこと!

# vi /etc/mail/sendmail.mc
追加
define(`confMAX_MESSAGE_SIZE’,`10485760′)dnl ← 送信メールのサイズの制限(10MB) default:制限無し
define(`confMAX_RCPTS_PER_MESSAGE’, `50′)dnl ← 1つのメールで指定できる宛先数の上限を制限 default:制限無し

修正(先頭に「dnl」を削除することでアンコメントできる)
FEATURE(`masquerade_envelope’)dnl
MASQUERADE_AS(`example.com’)dnl ← 自分のドメイン
MASQUERADE_DOMAIN(localhost)dnl
MASQUERADE_DOMAIN(localhost.localdomain)dnl

コメントアウト(先頭に「dnl」を追加することでコメントアウトできる)
dnl EXPOSED_USER(`root’)dnl ← EXPOSED_USER(`****’)で指定されたユーザはドメインのマスカレードを行わない(rootもマスカレードする)
dnl DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA’)dnl ← デフォルトではローカルからのメールしか受け付けない(外部からのメールを受信出来ない)
dnl FEATURE(`accept_unresolvable_domains’)dnl ← 発信者のアドレスのドメインがDNSで解決出来ない場合、SMTPセッションのMAIL FROM:を拒否する

で、保存してcfファイルを生成
# m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf


メールサーバで受け取るドメインを指定
今回のサーバでは受信しないので、特に設定はいじらず。
# vi /etc/mail/local-host-names
localhost
localhost.localdomain
example.com ← 自分のドメイン


転送を許可 / 拒否するホストを記載する
# vi /etc/mail/access
Connect:localhost.localdomain RELAY
Connect:localhost RELAY
Connect:127.0.0.1 RELAY
Connect:192.168.1 RELAY
Connect:192.168.10 RELAY ← 許可するセグメント
Connect:172.16.10 REJECT ← 許可しないセグメント


DBに追加
# makemap hash /etc/mail/access.db < /etc/mail/access
sendmailを再起動
/etc/init.d/sendmail restart

2011年6月3日金曜日

MySQLの日付関連の便利関数のまとめ

MySQLで日付を取得したりするのにいろいろと便利な関数があるので、それをメモっておく。

現時刻を取得する方法
mysql> SELECT CURRENT_TIME;
+--------------+
| current_time |
+--------------+
| 10:43:15     |
+--------------+


日付を取得する方法
mysql> SELECT CURRENT_DATE;
+--------------+
| current_date |
+--------------+
| 2011-06-03   |
+--------------+


現在の日時を取得する方法(どちらで取っても同じ結果が取れる)
mysql> SELECT CURRENT_TIMESTAMP;
+---------------------+
| current_timestamp   |
+---------------------+
| 2011-06-13 10:14:47 |
+---------------------+

mysql> SELECT NOW();
+---------------------+
| now()               |
+---------------------+
| 2011-06-13 10:14:47 |
+---------------------+


曜日を取得する方法
mysql> SELECT DAYNAME(NOW());
+----------------+
| DAYNAME(NOW()) |
+----------------+
| Friday         |
+----------------+


曜日を数字で取得する方法(月曜日が0で1ずつ増えていく)
mysql> SELECT WEEKDAY(NOW());
+----------------+
| WEEKDAY(NOW()) |
+----------------+
|              0 |
+----------------+


今年に入って何日経過したかを取得する方法
mysql> SELECT DAYOFYEAR(NOW());
+-------------------+
| DAYOFYEAR(NOW())  |
+-------------------+
|               154 |
+-------------------+


今月に入って何日経過したかを取得する方法
mysql> SELECT DAYOFMONTH(NOW());
+-------------------+
| DAYOFMONTH(NOW()) |
+-------------------+
|                10 |
+-------------------+


月末の日付を取得する方法
mysql> SELECT LAST_DAY(NOW());
+-----------------+
| LAST_DAY(NOW()) |
+-----------------+
| 2011-06-30      |
+-----------------+


先月末を取得する方法
mysql> SELECT LAST_DAY(DATE_ADD(NOW(), INTERVAL -1 month));
+----------------------------------------------+
| LAST_DAY(DATE_ADD(NOW(), INTERVAL -1 month)) |
+----------------------------------------------+
| 2011-05-31                                   |
+----------------------------------------------+


日付を整形して取得する方法
mysql> SELECT DATE_FORMAT(NOW(), '%Y%m%d%H%i%s');
+------------------------------------+
| DATE_FORMAT(NOW(), '%Y%m%d%H%i%s') |
+------------------------------------+
| 20110603093243                     |
+------------------------------------+


文字列を整形して日付にする方法
mysql> SELECT STR_TO_DATE(201106030932, '%Y%m%d%H%i%s');
+------------------------------------+
| STR_TO_DATE(NOW(), '%Y%m%d%H%i%s') |
+------------------------------------+
| 2011-06-03 09:32:00                |
+------------------------------------+


といった感じでいろいろな関数が用意されている。
以下のページに詳しく載っているので参考にする。

http://www.limy.org/program/db/mysql/mysql_operators.html

2011年6月2日木曜日

3キャリアのUserAgentに関して

アクセスしてきたユーザーが携帯かPCかを調べるために、携帯側のUserAgentに関して調べてみた。
Docomoの場合は「DoCoMo」、auの場合は「KDDI」、ソフトバンクは「Vodafone」か「SoftBank」という文字列が含まれている。
なお、auキャリアの判別には”UP.Browser”という文字列も使われていたのですが、これは当時「HDML(UAに”KDDI”を含まない)」と「WAP2.0(UAに”KDDI”を含む)」という2種類のフォーマットがあった時の名残りであり、現在では「WAP2.0」のみとなっているので、”KDDI”という文字列で見つける方がよい。

また同様にSoftbankでも、かつては「J-PHONE」という文字列も使われていましたが、これも既に停波済みなので無視してもよい。

2011年5月31日火曜日

UserAgent一覧

スマートフォンとPCの見分けをつけるために、UserAgentの一覧を調べてみた。

■PCブラウザのUserAgent一覧
http://www.openspc2.org/userAgent/ ← 詳細なとこまで書いてあるがちょっと古いので微妙…
http://pst.co.jp/powersoft/html/index.php?f=5311 ← 簡単にしか書いてない

■スマホのUserAgent一覧
http://www.kagua.biz/android/ualist.html

■携帯のUserAgent一覧
・ドコモ
http://www.nttdocomo.co.jp/service/imode/make/content/spec/useragent/index.html

・au
http://www.au.kddi.com/ezfactory/tec/spec/4_4.html

・Softbank
http://creation.mb.softbank.jp/terminal/?lup=y&cat=ua

・WILLCOM
http://www.willcom-inc.com/ja/service/contents_service/common/pdf/user_agent.pdf

スマホの方は更新されてるみたいなんで、それなりに利用できますが、
PCブラウザのUserAgentの一覧は去年の6月以降更新されていないみたいです。
もろもろ最新のブラウザのUserAgentが入っていないので、
微妙に使いづらい…。

どっかが公式でUserAgentの一覧作ってくれないかなー。

2011年5月30日月曜日

PHPUnit3の使い方

前回に引き続きPHPUnit3に関してのメモ。

早速PHPUnit3を使ってみた。

$ vi ArrayTest.php
<?php
require_once 'PHPUnit/Framework.php';

class ArrayTest extends PHPUnit_Framework_TestCase
{
    public function testNewArrayIsEmpty()
    {
        // 配列を作成します。
        $arr= array();

        // 配列のサイズは 0 です。
        $this->assertEquals(0, count($arr));
    }

    /**
     * メソッド名がtestで始まっていないが,「@test」
     * アノテーションを使用していることに注意
     *
     * @test
     */
    public function arrayContainsAnElementTest()
    {
        // 配列を作成します。
        $arr= array();
 
        // 配列にひとつの要素を追加します。
        $arr[] = 'hoge';
 
        // 配列のサイズは 1 です。
        $this->assertEquals(1, count($arr));
    }
}

んで、保存してテストしてみる。
$ phpunit ArrayTest
PHP Notice:  Please no longer include "PHPUnit/Framework.php". in /usr/share/pear/PHPUnit/Framework.php on line 50
PHPUnit 3.5.13 by Sebastian Bergmann.

..

Time: 1 second, Memory: 3.25Mb

OK (2 tests, 2 assertions)

テスト自体に問題はなさそうだけど、PHP Noticeが出てる…。
なんでだろうと思って調べてみたら、Framework.phpからAutoload.phpに変ったらしい。
「Framework.php」をrequireしても動くが、上記のようにNoticeが出る。
Noticeが出てるのもいやなので、「require_once 'PHPUnit/Framework.php';」→「require_once 'PHPUnit/Autoload.php';」に書き換えてやる。

$ vi ArrayTest.php
<?php
require_once 'PHPUnit/Framework.php';
               ↓
require_once 'PHPUnit/Autoload.php';

class ArrayTest extends PHPUnit_Framework_TestCase
{
    public function testNewArrayIsEmpty()
    {
        // 配列を作成します。
        $arr= array();

        // 配列のサイズは 0 です。
        $this->assertEquals(0, count($arr));
    }

    /**
     * メソッド名がtestで始まっていないが,「@test」
     * アノテーションを使用していることに注意
     *
     * @test
     */
    public function arrayContainsAnElementTest()
    {
        // 配列を作成します。
        $arr= array();
 
        // 配列にひとつの要素を追加します。
        $arr[] = 'hoge';
 
        // 配列のサイズは 1 です。
        $this->assertEquals(1, count($arr));
    }
}

$ phpunit ArrayTest
PHPUnit 3.5.13 by Sebastian Bergmann.

..

Time: 1 second, Memory: 3.25Mb

OK (2 tests, 2 assertions)

するとNoticeが出なくなる。
これで気持ちよく使えそうだ。

2011年5月25日水曜日

au端末の「リクエストされたページ表示できません」に関して

今回やっている案件で、該当するCSVファイルがなかった場合にエラーのメッセージだけ出力する(echo $error_msgのみ)という実装をしていたのですが、Docomo,Softbank,FireMobileSimulaterのDocomo、Au、Softbankはいずれも問題なかったが、Auの実機の場合にみ「リクエストされたページが表示できません」というメッセージが出てきてしまった。

ググってみたら原因はすぐに判明した。

どうやらAu端末はHTMLのヘッダ部分の記述をきちんと書いてあげないといけないらしい。
なので、エラーの場合はエラー用のテンプレートを作ってそこにエラーメッセージを渡すように修正した。

また、なぜFireMobileSimulaterのAuはうまく表示できたのかというところだが、
そんな仕様は実装されていないのだと思われる。
やはり実機に代わるツールとまでは言えない。
とはいえ現状でも十分便利ですけどね。

unity3D

会社の人に教えてもらったのですが、unity3Dというのがすごいらしい。
以下のようなプラットフォームへの対応が可能。
iPhone/iPod Touch/iPad、Mac、PC、Web、Wii、Xbox360、Android、PlayStation 3

iPhoneやAndroidだけじゃなく、PCやコンシューマ向けゲーム機用にも作れるみたいです。
ただし、それぞれのプラットフォーム向けに作成するためにはいろいろと制約があるみたいです。
たとえばiPhoneアプリを作りたい場合はintel MacとMacOS 10.6 Snow Leopard以降のOSが必要になります。
Androidの場合はWinXP SP2以降、MacOS 10.5.8以降でAndroid SDKとJava Development Kit(JDK)が必要になります。

全プラットフォーム向けの開発をWinでできれば幸せだったんですが、
さすがにそこまでは面倒見てくれないみたいです。
残念。
とはいえちょっと面白そうなので、いろいろと試してみたいなーと思います。

2011年5月24日火曜日

jslinuxってすげー

なんだか最近ネットにちょくちょく上がってくるjslinux。
なんだろうと思って調べてみた。

なにかというとブラウザ上でLinuxをエミュレートしてるもの。

まじでか!と思ったんですけど、普通に動いてました。
Linuxの全てが使えるわけではなく、一部の機能だけのようです。
また、速度的にも実用的なレベルとは言い難いですね。
以下のURLでデモが動いています。

http://bellard.org/jslinux/

すごいの一言。
そもそもブラウザ上でLinuxを動かそうという発想がすごい。
とりあえず何ができるのかとか全く調べてないので、取り急ぎ紹介だけ。

http://journal.mycom.co.jp/news/2011/05/19/012/index.html

2011年5月20日金曜日

携帯コンテンツ作成にあたって

携帯向けサイトを作成するにあたって気をつけないといけないこと。
今まで携帯向けコンテンツを作ることはめったになかったんですが、
転職したので携帯コンテンツを作ることもしばしば。。。
そこである程度基本的なフォーマットを調べてみました。
ぶっちゃけどこまであってるんだか、よくわからんのですが、指標として一応。

  • 1ページ当たりのファイルサイズは9kb以下に抑える(画像等含む)
  • CSSは外部ファイルではなく、HTMLタグ内にstyleを書くようにする
  • サイトの横幅は240pxか、スクロールバーの分を見込んで228px以内にする
  • 文字コードはやはりShift-JISがいい。(最近の携帯はUTF-8でもいけるが対応機種を広めるのであればShift-JISが無難)
  • 画像形式はJPEGかGIF。ただしGIFは一部の機種でしか使えないので、JPEGに統一するのが望ましい。
  • Tableタグは使わない
  • DOCTYPEの宣言は以下の通り。XHTML Mobileを宣言することが重要。クローラーにモバイルサイトだときちんと伝えるためには必要。
  • フォントサイズの指定はDocomoは普通にHTMLと同様の指定方法でも問題ないが、auとsoftbankは問題あり。ピクセルで指定するのがいいらしい。
  • mailtoを使用する場合、SoftBankはUTF-8のままURLエンコードしても問題ないが、DoCoMoとauはURLエンコード前にShift_JISに変換しておかないと、題名などの文字が化けてしまう。
  • 回り込みはauのみfloat:leftで対応できなかったみたいなので、alignを指定する必要がある。

<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
<title>サイトタイトル</title>
</head>

シェルスクリプトで自分自身のパスを調べる方法

PHPで実行しているスクリプトのディレクトリを取得する場合は、

dirname(__FILE__);


と書くことで取得できますが、シェルの場合はどうやって取得するのかわからなかったので調べてみた。
で、取得方法としては以下の通り。

$ vi test.sh
BASE_DIR=`dirname $0`
echo $BASE_DIR


で実行されているシェルのディレクトリを取得することができる。
しかし、これをこのままechoするとなんだか残念な気分にならざるを得ない。
実行すると以下のようなレスポンスが返ってくる

$ ./test.sh
.


なんて残念な…。
「.」だけです。
相対パスで返ってくる。
もうちょっと調べてみると、こういう取り方をすればいいのかという記事がありました。
その方法は、

$ vi test.sh
BASEDIR=`cd \`dirname $0\`; pwd`
echo $BASE_DIR


ものすごく納得しました。
確かにこの方法であれば、シェルが実行されているディレクトリを絶対パスで指定することができます。
これで環境が変わっても、ディレクトリ構成さえ一緒であれば、問題無く使えます。

2011年5月16日月曜日

Everything

先日会社の同僚の人にEverythingっていうファイル検索のアプリを教えてもらったんですが、
どうやら今の会社では使えないという話を聞いて、その原因を調べてみました。
結論から言うと、

「やっぱ無理!」

ってことに落ち着いてしまいました…。

で、以下が詳細。
「Everything」とはファイル検索ツールで、NTFSでフォーマットされたのローカルドライブのみ対応。

昔一度ファイル検索するためにgoogleデスクトップを使ってみたが、
正直重くて使い物にならなかった。
しかし、この「Everything」というツールはめっちゃ高速らしい。
インストーラー版とZIP版があり、両方とも日本語対応。
但し、ZIP版の場合は、Langファイルも合わせてダウンロードする必要がある。

会社のPCで使用しようと思ってダウンロードしてきてみたが使えなかった。
というのもNTFSのファイルシステムで、ファイルの変更履歴として保存している「USNジャーナル」を直接読み取ることで、
高速なインデックスを可能にしているのだが、
その「USNジャーナル」は管理者しか開けないというもの。

会社のPCで試しにwindowsのコマンドプロンプトでchkdskコマンドを実行してみたのだが、

「アクセスは拒否されました。」

案の定アクセスができない…。
ちなみにchkdskコマンドは指定されたディスクの状態を確認し表示するコマンドで、
USNジャーナルを参照して状態の確認をしている。

2011年5月11日水曜日

jCalendar.jsでは年月日のセレクトボックスが必ずないと挙動がおかしくなる

今までjCalendar使ってましたが、今回初めて年月しかないセレクトボックスを作った際の挙動がおかしかった点。
1ヶ月間の数字の集計をする際に、セレクトボックスで年月を指定するように作ったのだが、
postして次の画面に進んだ後に戻るとHTMLにselectedときちんと書かれているにも関わらず、
別の月が選択されてしまうという現象が起こった。

HTMLの記述は間違ってなさそうだし、そもそも別の部分(年月日)で試した場合は問題ない。
で、Firebugでブレイクポイントを設定してリロードしてみた。
すると、最初はちゃんとした月が選択されているが、

$(要素).jcalendar();

を実行された後に月が当月に変ってしまう状態になっていた。
別のところでは問題なく動いているので、jCalendar自体がバグっているとは考えにくい。
なので、とりあえず日のセレクトボックスを足してみたら、
見事にちゃんとした挙動になりました。

本来ならソース読んでから対応するのが当たり前なのですが、
ちょっと急いで帰りたかったら、とりあえずおk。
後でソース読もう。

2011年5月10日火曜日

メール便使用時には注意が必要

先日注文していた商品がクロネコメール便で届くはずだったんですが、未だに手元に来ず・・・。
伝票番号を元に追跡すると2日前に投函完了になっている。
本日ヤマトに問い合わせをしてみたが、配達員の記憶だけが頼りで、それ以上は調べようがないとのこと。
出てくることを願うばかりです。

今回初めてこういった郵便事故にあったのですが、
気になっていろいろとネットで調べてみたら、記事が出るわ出るわ・・・。
今までクロネコヤマトは結構しっかりしてる印象だったんですけど、それはあくまで宅急便での話しで、
メール便はバイトや嘱託の人達が配ってるみたいで、投函先のポスト間違いやら色々とあるみたいです。
さらには過去にメール便を配達せずに自宅や自家用車に保管してた事件がおきてるみたいです。

皆さん困ってらっしゃる方に対して
「メール便ではなくなっても困らないようなものしか送らないようにしましょう」とか、
「メール便はそういうものだから、最初から入札するな」とか書かれていますが、
そんな届くかどうか確約できないようなサービスを提供しているクロネコヤマトに問題があると思います。

そもそもメール便に配達事故がよくあるなんてこと、一度経験したような人しか知らないだろうし、
実際自分も今回初めてそういうことになってから調べ始めて、メール便ってそういうものなのかって知りました。
クロネコのメール便自体を何とかしてもらわないと、二度と使う気にはなれません。
佐川急便より追跡システムもしっかりしてるから信頼していたのですが、がっかりです。

6/1追記
あれから営業所に電話してクレームを入れてみた。
クロネコ側が指定してきた時間に電話がかかってこなかったりと、
イライラしましたが、最終的には紛失。
代替品を送りますという結果になりました。
代替品の確保ができなかった場合にどうなるのかは未定ですが、
とりあえず弁償はしてくれそうです。

6/10追記
支店長判断で代替品の確保はせずに、代金の弁償のみになった。
多分代替品の確保がめんどくさいからだと思う。
翌日に連絡するって言ってたのに、
こっちから電話をかけるまで何も対応しないヤマト。
最悪・・・。

2011年5月8日日曜日

クロネコメール便

今回初めてクロネコメール便を使って商品を送ってもらったのですが、到着するまで結構かかりました。
佐川急便に比べるとクロネコは早いって印象だったんですけど、メール便は別みたいですね。

一応ヤマトのサイトに行って、メール便の配達にかかる日数は同じ都内だと3日と書かれています。
今回のケースでは夕方発送で、ついたのが翌々日の朝。
3日という記述だと丸3日なのか、発送してから3日以内に配達するのかはよく分かりません。

とりあえず今回の場合も正常なんでしょうが、宅急便と比べちゃうので遅く感じてしまいますね。
宅急便とかだと夕方発送してても翌日の昼とかには大体ついてました。
その感覚で待ってたので、ものすごく待った気がします。
まぁ次回からはメール便には気をつけよう。
送料安いのはいいけど、到着が遅いのはもどかしい。

2011年5月7日土曜日

iOSのアップデート

iOS4.3.3がリリースされたので、アップデートをしているのですが、
iOS4位からアップデートにやたら時間がかかるようになった気がする。
iOSのアップデートファイル自体の大きさもだんだんでかくなってきてて、今では666.2MB。
CD-ROM一枚分の容量になってる。
しかもiphoneユーザーが増えたからかも知れないけど、iOSのダウンロードにめちゃくちゃ時間がかかる。
速度は100K出ればいい方。
OSのアップデートに4時間って・・・。
節電節電といっている現在で、無駄に4時間もPC立ち上げてないといけないのは無駄すぎる。
そろそろ差分アップデートの提供を本気で進めて欲しいものです。

iOS5以降からはOTA(Over The Air)に対応するかもみたいな噂も出てきていますが、色々と障害があるようです。
技術的な話ではなく、政治的な話で。

確かに3Gの回線でiOSのアップデートとかされた日には、ソフトバンクの回線がかなり圧迫されることは間違いないですね。
それで電話とか繋がりませんとか、サーバー落ちましたとか、そういったことになりかねません。
AppStoreのアプリも20MB以上はWifi経由でダウンロードするようになっているんだし、
Wifi経由でアップデートしてくださいって言うのじゃだめなんですかねー。
自宅にWifi環境がない人もいると思うので、今までのガラケーの文化から考えるとちょっとなーという気もしますが。

つーかOTAになったところで、4時間も通信してたらバッテリ切れそうなので、
OTAよりも差分アップデートのほうを先に提供して欲しいですね。
差分アップデートで容量が減ったら、通信の帯域的な問題はクリアになる気がするので、
それで解決できそうなんだけどな・・・。

ちなみにOTAというのは、ガラケーのファームウェアアップデートのように携帯端末のみでのアップデートを可能にするものです。

2011年5月6日金曜日

globとopendirの速度に関して

glob vs opendirで速度を検証しているサイトがあった。
最近はglobって便利だし、opendirよりすっきりするからいいなーと思って結構使っていたのですが、
ベンチマークとってるサイトみると、opendirの方が早いみたいですね。

で、試しにソースをコピって自分のVMWare上でベンチマーク取ってみたのですが、

「あれ、globの方が早くね?」

ファイル数の問題かも知れないですが、1K程のcsvを150ファイル程置いて試してみたところ
平均的にはglobの方が早かったです。
requireしてるファイルの容量は関係ないと思うんで、
やっぱファイル数かな。
150ファイルって結構多いと思うんですが、
何ファイルだったらopendirの方が早くなるのかなー。
暇な時にその辺もベンチ取れたらなーと思います。
つっても、opendirよりglobの方が綺麗に書けるから、
自分的にはglob推奨していこうと思います。

ベンチ取ったソースは下記の通り。
<?php

//Waste a little time to offset PHP's startup.
for($i=0; $i<20; $i++) { 
    print ' '; 
}

$start_time = time()+microtime(true);

ob_start();
for($x=0; $x < 20; $x++) {
    $dir = 'cache/';
    if (is_dir($dir)) {
        if ($dh = opendir($dir)) {
            while (($file = readdir($dh)) !== false) {
                //Include the file 
                include($file);
            }
            closedir($dh);
        }
    }
}
ob_end_clean();

print ((time()+microtime(true)) - $start_time). ' (opendir time)<br />';


$start_time = time()+microtime(true);

ob_start();
for($x=0; $x < 20; $x++) {
    //Include the function files
    foreach (glob("cache/*.html") as $file) {
        //Include the file 
        include($file);
    }
}
ob_end_clean();

print ((time()+microtime(true)) - $start_time). ' (glob time)<br />';
?>

bash系のファイルに変更を加えた場合の反映方法

bashファイルに変更を加えた場合、すぐにその設定内容を反映させるためのコマンド。

$ source ~/.bashrc
$ source ~/.bash_profile

2011年4月26日火曜日

機種依存文字の文字コード変換

今回やっている案件で、CSV内に記述されているマルチバイトの文字をaddslashesでエスケープしている処理があった。
しかし、文字コードがSJISだったために、5C問題に該当する部分のSQLは全て失敗していた。
なので、その改修を今回行うために調べた内容を残す。

まずaddslashesについて調べてみた。
addslashesはマルチバイトに対応してないのに、普通に使われていてビビった。
とはいえ、全くエスケープされないわけではないので、
深く調べずにやると今回のような現象が起こる。

で、mysql_real_escape_stringを使うのが普通なのだが、
この関数も結局マルチバイトに対応しているわけではないので、


CSVに記述されているSJISの機種依存文字をMysqlのDBに入れようとした際のログ。
要件としては、機種依存文字や5C文字を安全にエスケープする方法を探す。

機種依存文字は基本的にはSJISには存在してない。
なので
mb_convert_encoding($text, 'utf-8', 'sjis');
などをしようものなら、あっという間に?とかに文字化けてしまう。
なので、

$str = mb_convert_encoding(mb_convert_encoding($text, 'sjis-win', 'sjis'), 'UTF-8', 'sjis-win');

上記のように一度sjisからsjis-winにエンコードしてから、UTF-8にエンコードをする。
こうすることで機種依存文字を文字化けさせることなく、文字コードを変換できる。

で、UTF-8に変換することで、5C問題は解決されるので、ここでエスケープする。

$str = mysql_real_escape_string($str);

で、エスケープした文字列を再びsjisに戻す。

$str = mb_convert_encoding($str, 'sjis-win', 'UTF-8');

ここで注意しないといけないのは、元のsjisに戻してしまうと、機種依存文字が文字化けしてしまうこと。
sjisには機種依存文字が存在しないので、戻す時はsjis-winに戻さないと、正常に表示できない。

とりあえず今回調べた感じだとこんな感じ。
なんか最初っからsjis-winからutf-8で変換できんじゃねって思ってやってみたらいけたし!!
まぁ試した文字はあんまりいっぱい試してないので、もしかしたら駄目な場合もあるのかも。
でも理論的には問題無さそうな気がする。
というわけで、最終的にはこんな感じで。

$str = mb_convert_encoding($text, 'UTF-8', 'sjis-win');
$str = mysql_real_escape_string($str);
$str = mb_convert_encoding($str, 'sjis-win', 'UTF-8');

MySQLでFLUSH PRIVILEGESを使うとエラーが出る

CentOSに入っているMySQLでFLUSH PRIVILEGESを実行したところ、

ERROR 1146 (42S02): Table ‘mysql.servers’ doesn’t exist

とでた。
ググってみるとmysqlのDB内のserversというテーブルがないってエラーでした。
消した記憶ないのに、こんな現象になっているのは腑に落ちないんですけど、
とりあえず以下のSQLを流してみたら問題無かった。

CREATE TABLE `servers` (
 `Server_name` char(64) NOT NULL,
 `Host` char(64) NOT NULL,
 `Db` char(64) NOT NULL,
 `Username` char(64) NOT NULL,
 `Password` char(64) NOT NULL,
 `Port` int(4) DEFAULT NULL,
 `Socket` char(64) DEFAULT NULL,
 `Wrapper` char(64) NOT NULL,
 `Owner` char(64) NOT NULL,
 PRIMARY KEY (`Server_name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='MySQL Foreign Servers table';


何でこのテーブル無くなったんだろう…。
間違えて消したのかな。。。

2011年4月25日月曜日

svnで衝突を解消するためのコマンド

なんか最近svnを使う機会が減ってきたのでメモ。

hoge.phpというファイルが衝突した場合の解消手順

1.衝突したファイルを開いて、衝突マーカの部分を修正し、保存。
$ vi hoge.php
<<<<<<< .mine
aaaa
bbbb
=======
bbbb
cccc
>>>>>>> .r2
.mimeとなっている部分はローカルで修正を加えたもの。
.rXXXとなっている部分はリビジョンXXXで修正が加えられたもの。

正しくマージして保存した後に、該当のファイルに対して解消のコマンドを打つ。
svn resolved hoge.php

MySQLでユーザーの追加や権限等の設定

毎回忘れてググっているので、忘れてもいいようにメモ。

ユーザーの追加には以下のようなSQLを流す。
mysql> GRANT <操作名> ON <データベース名>.<テーブル名> TO <ユーザ名>@<ホスト名> IDENTIFIED BY '<パスワード>';
mysql> FLUSH PRIVILEGES;

操作名は下記にある表の中から選んで使用する。
セキュリティを全く考慮しないのであれば、ALLでも問題はない。
データベース名やテーブル名を指定することで、指定したデータベースやテーブル以外にはアクセスできないようなユーザーを作成することができる。
ユーザー名はDBに接続する際に使用するユーザー名
接続先のDBがあるホスト名またはIPを記載する。
WebサーバとDBサーバが一緒であれば、localhostで繋がる。
WebサーバとDBサーバが異なる場合は、DBサーバのホスト名またはIPを記載することで接続できる。
「FLUSH PRIVILEGES」はユーザー情報の反映のためのSQLで、これをしないと作成したユーザーで
ログインすることはできない。


操作名一覧
ALL
  すべての権限を設定出来るユーザを追加
ALTER
  ALTER TABLE(テーブル変更)の使用を許可
CREATE
  CREATE TABLE(テーブル作成) の使用を許可
CREATE TEMPORARY TABLES
  CREATE TEMPORARY TABLE(一時テーブルの作成) の使用を許可
DROP
  DROP TABLE(テーブルの削除) の使用を許可
INDEX
  CREATE INDEX(インデックス作成) および DROP INDEX(インデックス削除) の使用を許可
LOCK TABLES
  SELECT 権限を持つテーブルで LOCK TABLES(テーブルのロック) の使用を許可
PROCESS
  SHOW FULL PROCESSLIST の使用を許可
REPLICATION CLIENT
  スレーブおよびマスタのサーバーを知る権利を付与
REPLICATION SLAVE
  レプリケーションのスレーブに必要(マスタからバイナリログを読み取るため)
SHOW DATABASES
  SHOW DATABASES によりすべてのデータベースが表示される
SHUTDOWN
  mysqladmin shutdown の使用を許可

2011年4月17日日曜日

2010-2011シーズンまとめ

去年は北海道に篭っていたので、東京からの通いでゲレンデに行くのは1年ぶり。
車で10分でゲレンデに着くってのもいいけど、
2~3時間かけて車でゲレンデに行く途中の感じも捨てがたいですねー。
篭っていた前のシーズンに比べると、今年は大分行ったなー。
今シーズンのシーズンインは12月29日にかぐらにて。
ちょっと遅めのシーズンインだったので、今年もそんなにいけないかなーと思っていましたけど、
以外に行ってました。
回数的には6回と少な目ですが、うち泊まりが3回あったおかげで、滑走日数としては9日間となりました。
ただ、地震の影響もあり、結局3月5日に行った南郷スキー場がすべり収めになってしまいました・・・。

今シーズン行ったゲレンデレポ
・かぐらスキー場(2010/12/29)
まぁシーズンインでしたし、ゲレンデの状態もそこそこでした。
昼過ぎ位からちらほら雪が降ってきてちょっとはコンディションが上がったかな程度です。
ちょっと時間が経つとすぐにアイスバーンが見えるとこが何箇所かありました。
ただ、まだ他のゲレンデが空いていないこの時期に、ものすごく人が少なかったので、
リフト待ちとかなくて楽だったなぁー。
初めて一緒に滑るメンバーだったので、それはそれで楽しかったですけど、
よくいくゲレンデだし、特にコレといった感想はないですね。

・かぐらスキー場(2011/1/29)
かぐら2連続。
神立行く予定だったのですが、急遽かぐらへ変更になりました。
結構雪降ってて、パウダーが楽しめました。
行きなれているかぐらですが、パウダーにありつける機会はなかなかないので、
楽しかったですねー。
また、初めて一緒に行く人とかもいてさらに楽しさアップな感じでした。
ただ、やっぱかぐらは平らだなーって思いました。
ゲレンデ的にはいまいちな感じを再実感。

・野沢温泉スキー場(2011/2/5~2011/2/6)
今シーズン初の泊まりイベント。
野沢温泉はDVDで見てから行きたくてしょうがなかったゲレンデだったので、
ものすごく楽しみにしてました。
その期待を裏切らないめっちゃ面白いゲレンデでした!!
どのコースにも結構な数のポコジャンがあって、
サイズは小さいですけど、かなり楽しめます!
さらに頂上から左右にコースが分かれるんですが、
そこの真ん中が最高に楽しい!!!
谷みたいな感じになってて、ちょっとしたハーフパイプ気分が味わえます!
でもそこそこ雪あるので、めっちゃ疲れます・・・。
ゲレンデ合流ちょっと前くらいにいい感じのサイズのポコジャンがあって、そこも楽しめました。
このコースに行くまでのリフトの乗り継ぎは微妙ですが、
行く価値アリのゲレンデでした。

・パルコール嬬恋(2011/2/11~2011/2/12)
今シーズン2回目の泊まりイベント。
ゲレンデ自体は行ったことのあるゲレンデだったし、
行ったときにめっちゃ吹雪いてた思い出が強くてあまり楽しいイメージはありませんでした。
また、インター降りてからも雪が全然なくて大丈夫かって思ってましたけど、
ゲレンデに着くころにはちらほら降り出してきていい感じに。
コース脇を楽しむって感じではないですが、コンディションがよかったので楽しめました。
また、泊まったホテルもよかったし、一緒に行った面子もよかったので最高に楽しかった!
やっぱ場所ってそれほど重要じゃないっすねー。

・上越国際スキー場(2011/2/19~2011/2/20)
3週連続の泊まりイベントのラスト。
初日の朝はコンディションが最高によくって、パウダーだらけ!
しかも山の向こう側に移動したら人がいないいない。
がっつりパウダーを僕らで頂いちゃいました。
ただ、ゲレンデ間の移動はかなりきついですね・・・。
1本滑るまでに40分くらいゲレンデを移動してました。
本当にリフトの乗り継ぎが悪い悪い・・・。
ゴンドラもないので、山頂に行くのにも結構な時間がかかります。
それさえなければ結構よかったんですが・・・。
コース脇の傾斜とかはそんなでもなかったですが、
所々にポコジャンがあって、1回めっちゃ高さの出たジャンプができたので最高に気持ちよかったです。
また行きたいかといわれると、コンディション次第では行ってもいいかなぁ~って感じですね。
やっぱリフトでの乗り継ぎが悪いのは結構致命的です。

・南郷スキー場(2011/3/5)
結局これが今シーズンラストランになってしまいました・・・。
今シーズンよく一緒に行っている人が南郷いいよって話を聞いていて、
ずっと僕の中で行ってみたいと思っていたゲレンデでした。
が、福島県でしかもインターを降りてから80km以上とめっさ遠いんです。
下道だけで大体2時間くらい・・・。
でも、それだけの価値のあるゲレンデでした。
滑り始める前まで雪ががっつり降っていたので、パウダーを散々頂いた後に、
いい感じのポコジャンもあって最高に楽しかったです。
南郷スキー場は間違いなく今シーズンNo1のゲレンデでした!
ぜひ来シーズンも行きたいですねー。

2011年4月12日火曜日

pear upgradeでのエラーその2

pearでupgradeしようと思ったら再びエラーが。

WARNING: channel "pear.php.net" has updated its protocols, use "channel-update pear.php.net" to update
Cannot install, php_dir for channel "pear.php.net" is not writeable by the current user

pearのチャンネルが古いらしい。

# pear channel-update pear.php.net

と実行する。

pear/PEAR dependency package "pear/Console_Getopt" downloaded version 1.3.1 is not the recommended version 1.2.3, but may be compatible, use --force to install
pear/Archive_Tar requires PEAR Installer (version >= 1.5.4), installed version is 1.4.9
pear/Console_Getopt requires PEAR Installer (version >= 1.8.0), installed version is 1.4.9
No valid packages found
upgrade failed

PEARとArchive_Tar及びConsole_Getoptとのバージョンの兼ね合いで、upgradeできないみたい。

なので、Archive_TarとConsole_Getoptを強制的にアップデートする。

# pear upgrade --force Archive_Tar
# pear upgrade --force Console_Getopt

で、完了後に

# pear upgrade pear

あと、pearでインストール時にパーミッションが足りないと下記のようなメッセージがでるんだ。
初めて知った。
ぶっちゃけわかりずらい…。
PHP Fatal error:  Call to undefined method PEAR::raiseerro() in /usr/share/pear/PEAR/REST.php on line 165

2011年4月6日水曜日

scpの通信ログをログファイルに残す方法

cronに登録してあるシェルスクリプト内でscpで通信していて、
その通信ログをログファイルに残そうと思って、リダイレクトしてみたんですが、
ログファイル自体は問題無く生成されたんですが、中身が一向に書き出されない。
で、原因を調べてみたら同じ問題にぶち当たってる人が知恵袋で聞いてました。


scpコマンドでのファイル転送結果を、ログ出力する方法を教えてください。


コマンドとしてはこんな感じらしい。
以下の場合は別サーバからファイルを受信する時のログをa.logにリダイレクトさせるってもの。
知恵袋の回答ではlocalhostをノンパスログインできる状態にしてからやるって書いてあったけど、
とりあえずパスワードありでもログが出せるかどうかの検証だけはできたので、試してみた。

ssh -t -q -A localhost scp user@server:送信元ファイル名 送信先ディレクトリ 1>>a.log


ちなみに指定されているsshのオプションを解説すると、
tオプションは仮想端末を割り当てるためのオプション。
qオプションは警告メッセージ・診断メッセージを抑制するためのオプション。
Aオプションは認証エージェントの転送を許可するためのオプション。

一応上記の方法でログは書きこまれるようになりました。
しかし、scpのログを残すだけでこんなに作業しないといけないとは…。
面倒くさいなぁ~。

sshコマンドのオプションについて

sshコマンドのオプションについて調べてみた。
実はデフォルトのマニュアルに載ってないオプションが結構たくさんあってビビる。
意味がよくわかってない部分もありますが、とりあえず記載しておく。

オプション名 説明
-1 SSHのバージョン1を使用します。
-2 SSHのバージョン2を使用します。
-4 IPv4を指定します。
-6 IPv6を指定します。
-A 認証エージェントの転送を許可します。
-a 認証エージェントの転送を禁止します。
-b IPアドレス 複数のIPアドレスをもつ場合、バインドするIPアドレスを指定します。
-C データを圧縮します。
-c 暗号方式 暗号方式を指定します。
  • 3des(トリプルdes方式)
  • blowfish(ブロック暗号方式)
  • des(des方式)
-D [IPアドレス:]ポート番号 転送に使用するポート番号を指定します。
-e エスケープ文字 エスケープ文字を指定します。
-F ファイル名 設定ファイルを指定します。
-f バックグラウンドで実行します。
-g ホストが転送されたローカルなポートに接続することを許可します。
-I デバイス名 スマートカードのデバイスを指定します。
-i ファイル名 RSA認証 / DSA認証の際に秘密鍵を読むファイルを指定します。
-k GSSAPI証明書をホストに転送することを禁止します。
-L[クライアントIPアドレス:]ポート番号:ホストIPアドレス:ポート番号 クライアント→ホストのポート転送の際のアドレス・ポートを指定します。
-l ログイン名 ログイン名を指定します。
-M 接続を共有する為のmasterモードに設定します。
-m メッセージ認証コード MAC(メッセージ認証コード)を指定します。
  • hmac-md5
  • hmac-sha1
  • umac-64@openssh.com
  • hmac-ripemd160
  • hmac-sha1-96
  • hmac-md5-96
-N リモートコマンドを無効にします。
-n 標準入力からの読み込みを禁止します。
-O コマンド 制御コマンドを実行します。
chesk
マスタープロセスが走っているかのチェックを行います。
exit
マスタープロセスに終了を指示します。
-o オプション 設定ファイルと同じ形式でオプションを指定します。
-p ポート番号 ホストに接続するポートを指定します。
-q 警告メッセージ・診断メッセージを抑制します。
-R [クライアントIPアドレス:]ポート番号:ホスト:ポート番号 ホスト→クライアントのポート転送を行います。
-S ソケットのパス 制御を共有する際に制御用ソケットのパスを設定します。
-s ホスト側でサブシステムの実行を行います。
-T 仮想端末の割り当てを禁止します。
-t 仮想端末を割り当てる。
-V バージョンを表示します。
-v 進行中のデバッグメッセージの表示を行います。
-w クライアント側のトンネルデバイス,[:ホストのトンネルデバイス] トンネリングするクライアントのデバイスとホストのデバイスを設定します。
-X X11 の転送を許可します。
-x X11 の転送を禁止します。
-Y 信頼されたX11転送を許可します。

vimで文字コードを修正する

よく使うけど、結構忘れるのでメモ。

vimでファイルを開いたりするとファイルが文字化けしている場合がある。
こういった場合には、ファイルの文字コードを指定して開きなおす必要がある。
まず開いたファイルの文字コードを変更して読み込む方法は以下の通り。
:e ++enc=文字コード
例)
:e ++enc=utf-8


ファイルの文字コードを指定して保存する方法は以下の通り。
:set fileencoding=utf-8

2011年4月4日月曜日

CSSで上下に中央寄せする方法

ここに書かれていた。
書き方としては以下の通り。
IE6と7以外に関してはtable-cellを使う。
IE6と7に関してはインライン要素として扱うと、「vertical-align」が使えるようになるので、下記のような記述になっている。
ちなみに下記に書かれている「* html」はIE6用のハックで、「*:first-child+html」はIE7用のハックである。
これを記述した場合にはそれぞれのブラウザでしか反映しないに出来る。

div {
    display:table-cell;
    margin-bottom:1px;
    vertical-align:middle;
}

/* IE 6 hack */
* html div {
    display:inline;
    zoom:1;
}

/* IE 7 hack */
*:first-child+html div {
    display:inline;
    zoom:1;
}

2011年4月1日金曜日

IE6でfirst-childとlast-childを使うには

IE6でfirst-childやlast-childを使いたい場合には以下のようにする。
例)背景色を変えたい場合
* html div {
    background-color: expression((this.parentNode.firstChild == this) ? '#FFB6C1': '#DADADA';
}

ちなみに同じ要素に対して、first-childとlast-childを使いたい場合は以下のようにする。
* html div {
    background-color: expression((this.parentNode.firstChild == this) ? '#FFB6C1' : (this.parentNode.lastChild == this) ? '#ADD8E6' : '#DADADA');
}

とこういった感じでやる。
ちなみに上記はIE6のみに適用するように記述してある。
expressionとかをいっぱいやりすぎるとサイト全体が重くなるので要注意。
ただでさえJavascriptの処理が遅いIE6で連発するのは危険。
どうしようもない場合にこれを使う位の感じで使った方がよい。

ついでに調べていたらexpressionはやたらめったら評価されてしまうので、
one-time expressionを使いましょうって記事がありました。
以下が例です。(時間によって適用される背景色が変わるようになっているみたいです。)
<style>
P {
    background-color: expression(altBgcolor(this));
}
</style>
<script>
function altBgcolor(elem) {
    elem.style.backgroundColor = (new Date()).getHours()%2 ? "#F08A00" : "#B8D4FF";
}
</script>

expressionが設定されているスタイルを上書きするようになってるみたいです。
確かにこれなら一度評価された時点で上書きされてしまうので、
何度も評価される事態を回避できます。
これならある程度の数を使っても大丈夫そうです。

2011年3月31日木曜日

CSSを動的に追加したい場合にIE6でうまくいかない件

jqueryのプラグインっぽく作ってるカレンダーのやつでcssとかHTMLにいちいち差し込むの面倒なので、
JS側で後から追加しようと思っていたら、なんかIE6だけうまくいかない現象があった。

通常のブラウザはJqueryでlinkタグをheadに追加する形で問題なかったが、
IE6はそうはいかないらしい。
なので、IE6用に処理を追記する形をとった。

document.createStyleSheet(cssUrl);

この1行を追加するだけでいけました。
意外と楽にいけた。

2011年3月28日月曜日

jCalendar.jsに関して

セレクトボックスと連動型のカレンダーを探していたら、jCalendar.jsというのが見つかったので、
早速使ってみた。
このjCalendar.jsは制約として1ページにつき、1つのカレンダーしか作れないようになっている。
1ページに複数入れたい場合は改造が必要になる。その改造方法に関しては別のエントリーで解説する。

jCalendar.jsのダウンロードはここから可能です。

使い方は以下の通り。
  • 1.Jquery.jsをダウンロードしてくる。
    (対応バージョンは一応1.0.4 or 1.1.2と書かれていますが、今回1.4.3を使ってみましたけど、特に問題無かったです。)
  • 2.jCalendar.jsとjCalendar.cssを上記サイトのuseタブをクリックしたページの
    「Download jCalendar — source or compressed or svn checkout
    からダウンロード。
    今回はデザインや挙動を含め、いろいろと変更することが想定されたので、source版をダウンロードしました。
  • 3.年月日のセレクトボックスにそれぞれ「jcalendar-select-year」、「jcalendar-select-month」、「jcalendar-select-day」のクラスをつける。
  • 4.クラスを付加した年月日のセレクトボックスを<div class="jcalendar-selects">で囲む。
  • 5.それをさらに<fieldset class="jcalendar">で囲む。
  • 6.Jsで以下のコードを実行。
    $(function(){
        $('fieldset.jcalendar').jcalendar();
    });

※注意点
セレクトボックスのvalueで1桁の数字を0詰めしている場合は、カレンダーを操作してもセレクトボックスの値が書き変わらないので、注意が必要。

デフォルト状態での使い方は以上。
一応使用可能状態のHTMLも以下に記述しておく。

<fieldset class="jcalendar">
    <div class="jcalendar-selects">
        <select class="jcalendar-select-year">
            <option value="2011">2011</option>
        </select>
        <select class="jcalendar-select-month">
            <option value="3">3</option>
        </select>
        <select class="jcalendar-select-day">
            <option value="1">1</option>
        </select>
    </div>
</fieldset>

2011年3月15日火曜日

文字コードを変換する

ファイルの文字コードを調べたりするのに使う。

文字コードがわからないファイルを以下の方法で開くときちんと見れる
nkf ファイル名

オプション一覧
-j(省略可能) : JISコード(ISO-2022-JP)を出力
-e           : EUCコードを出力
-s           : Shift-JISコードを出力
-w           : UTF-8コードを出力(BOM無し)
-Lu          : unix改行形式(LF)に変換
-Lw          : windows改行形式(CRLF)に変換
-Lm          : macintosh改行形式(CR)に変換
-g(--guess)  : 自動判別の結果を表示
--overwrite  : 引数のファイルに直接上書き
--version    : バージョン情報を表示(インストール済チェック)

文字コードを確認する方法
$ nkf -g example.txt

文字コードをEUC-JPに変換する
$ nkf -e --overwrite example.txt

文字コードをUTF-8に変換する
$ nkf -e --overwrite example.txt

VMWareの仮想ディスクの拡張方法

VMWareで最初にパーティション切ってた容量がいっぱいになっってきたので、拡張してみた。
Windwosの方の空き容量が100GB以上あったので、とりあえず8GBから20GBに拡張してみた。
手順は以下の通り。


1.まず現状を確認する。
使用率が76%になっていてあまり空き容量に余裕がないことが確認できる。
確認したらVMWareを落とす。

# df -h
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
                      7.2G  5.1G  1.7G  76% /
/dev/hda1              99M   12M   82M  13% /boot
tmpfs                 506M     0  506M   0% /dev/shm

2.VMWare-Serverに付属している「vmware-vdiskmanager.exe」を探す。
VMWareのインストールディレクトリ内にある。
通常であれば
「C:\Program Files\VMWare\VMware Server」の中にあります。

3.vmdkファイルの場所を探す。
基本的には「C:\Virtual Machines\[OS名]\[OS名].vmdk」になります。
似たような名前で「[OS名]-flat.vmdk」というファイル名があり、仮想HDD容量分のファイルがありますが、
使用するのはこちらではなく、「[OS名].vmdk」というファイルになります。

3.コマンドプロンプトを立ち上げて、「vmware-vdiskmanager.exe」があるディレクトリへ移動します。
cd C:\Program Files\VMWare\VMware Server

4.vmdkファイルを拡張します
vmware-vdiskmanager.exe -x 20GB C:\Virtual Machines\[OS名]\[OS名].vmdk

5.拡張が終わると以下のようなメッセージが出ます。
なにかWARNINGが出てますが、問題ありません。
Grow: 100% done.

The old geometry C/H/S of the disk is: 7281/16/63
The new geometry C/H/S of the disk is: 10402/16/63
Disk expansion completed successfully.

WARNING: If the virtual disk is partitioned, you must use a third-party
         utility in the virtual machine to expand the size of the
         partitions. For more information, see:
         http://www.vmware.com/support/kb/enduser/std_adp.php?p_faqid=1647

6.VMWareを立ち上げて状態を確認
容量が増えていることを確認する
# fdisk -l
Disk /dev/hda: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1          13      104391   83  Linux
/dev/hda2              14        1044     8281507+  8e  Linux LVM

7.パーティションを作成する
# fdisk /dev/hda
このディスクのシリンダ数は 2610 に設定されています。
間違いではないのですが、1024 を超えているため、以下の場合
に問題を生じうる事を確認しましょう:
1) ブート時に実行するソフトウェア (例. バージョンが古い LILO)
2) 別の OS のブートやパーティション作成ソフト
   (例. DOS FDISK, OS/2 FDISK)
コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本領域 (1-4)
p
領域番号 (1-4): 3
最初 シリンダ (1045-2610, default 1045):Enter
Using default value 1045
終点 シリンダ または +サイズ または +サイズM または +サイズK (1045-2610, default 2610):Enter
Using default value 2610

コマンド (m でヘルプ): t
領域番号 (1-4): 3
16進数コード (L コマンドでコードリスト表示): 8e
領域のシステムタイプを 3 から 8e (Linux LVM) に変更しました

コマンド (m でヘルプ): wq
領域テーブルは交換されました!

ioctl() を呼び出して領域テーブルを再読込みします。

警告: 領域テーブルの再読込みがエラー 16 で失敗しました: デバイスもしくはリソースがビジー状態です。
カーネルはまだ古いテーブルを使っています。
新しいテーブルは次回リブート時に使えるようになるでしょう。
ディスクを同期させます。

8.状態を再び確認
/dev/hda3が追加され、そこに空き容量が割り当てられていることを確認する
# fdisk -l
Disk /dev/hda: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1          13      104391   83  Linux
/dev/hda2              14        1044     8281507+  8e  Linux LVM
/dev/hda3            1045        2610    12578895   8e  Linux LVM

9.リブートもしくはpartprobeを実行する。今回はpartprobeで即時反映させる。
# partprobe

10.物理ボリュームを作成する
# pvcreate /dev/hda3
Physical volume "/dev/hda3" successfully created

11.既存のボリュームグループ(VG) に新しいパーティションを追加する
# vgextend VolGroup00 /dev/hda3
  /dev/hdc: open failed: メディアが見つかりません
  Volume group "VolGroup00" successfully extended

12.既存の論理ボリューム(LV) を追加したパーティションの分、拡張する。既存のLV は lvdisplay で確認。たぶん 「LogVol00」
# lvdisplay -C
  /dev/hdc: open failed: メディアが見つかりません
  LV       VG         Attr   LSize   Origin Snap%  Move Log Copy%  Convert
  LogVol00 VolGroup00 -wi-ao   7.38G
  LogVol01 VolGroup00 -wi-ao 512.00M

13.vgdisplay で拡張できるサイズを確認する
# vgdisplay
  /dev/hdc: open failed: メディアが見つかりません
  --- Volume group ---
  VG Name               VolGroup00
  System ID
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  4
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               19.84 GB
  PE Size               32.00 MB
  Total PE              635
  Alloc PE / Size       252 / 7.88 GB
  Free  PE / Size       383 / 11.97 GB
  VG UUID               pvKmW5-rMWe-K7gi-IMhr-xaBy-GPDZ-xs14kc

14.[PE Size] * [Free PE] の値が拡張できるサイズとなるので、32MB * 383 = 12256MB を拡張する。
# lvextend -L +12256MB /dev/VolGroup00/LogVol00
  /dev/hdc: open failed: メディアが見つかりません
  Extending logical volume LogVol00 to 19.34 GB
  Logical volume LogVol00 successfully resized

15.ファイルシステムを拡張する。
# resize2fs /dev/VolGroup00/LogVol00
resize2fs 1.39 (29-May-2006)
Filesystem at /dev/VolGroup00/LogVol00 is mounted on /; on-line resizing required
Performing an on-line resize of /dev/VolGroup00/LogVol00 to 5070848 (4k) blocks.
The filesystem on /dev/VolGroup00/LogVol00 is now 5070848 blocks long.

16.容量が増えていることを確認する
# df -h
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
                       19G  5.1G   13G  29% /
/dev/hda1              99M   12M   82M  13% /boot
tmpfs                 506M     0  506M   0% /dev/shm

キャッシュフォルダ等のフォルダをsvn管理下から除外する方法

なんか毎回ハマってる気がするのでメモ。
svnで編集する際に使用するエディタにviを指定(もともと指定している場合は不要)
$ export SVN_EDITOR="vi"

カレントディレクトリを開き、管理外にしたいディレクトリ名を記載する。
このコマンドを実行するとviが開く
$ svn propedit svn:ignore .

開いたviに管理外にしたいディレクトリ名を記載する。
例)カレントディレクトリにあるcacheディレクトリを除外したい場合
cache

で、保存して閉じる。
ちなみに、一度svn管理下に置いてしまった場合はsvn deleteで削除し、
svn管理外の状態にした状態で除外する必要がある。

2011年3月11日金曜日

MySQLの高速化を図った時のログ

今取り組んでいる仕事で、集計データを格納しているテーブルが30個近くあり、それを一つのViewにまとめてしまおうと思ったのですが、調べてみていろいろとわかったのでメモ。

集約するような場合にビューを使用すると致命的に遅くなってしまう。
なぜかというと、結局ビューも実体をもたないただのクエリだから。
そんなビューに対して集約するようなクエリを投げると以下のような流れで集約の作業が行われる。

元テーブルでそれぞれ集約→その結果を結合してさらに集約

ということで、ビューで集約はできない。
じゃあどうするか。

次に思い浮かんだのは全テーブルを1つのテーブルにしてしまうこと。
しかしそれでは素材数によっては1日でかなりの量のレコードが追加されていくことになる。
MyISAMの場合、1テーブルの最大サイズは4GBまでになっており、
何年も集約結果が蓄積されていくことを考えると実現することは難しい。

となるとどういった方法がいいのか…。
結局各テーブルからデータを取得する際にインデックスを適切に貼り、
ひとつひとつのクエリの実行速度を上げていくしかないと思う。
ひとつひとつのクエリの実行速度が上がれば、ビューを作成してもかかる時間は短縮されるはず。

2011年3月9日水曜日

DBDesigner4からMySQLサーバに接続する方法

DBDesigner4から自分のWindowsに入れてあるVMWare上のMySQLサーバに接続しようとした時のログ。

MySQLに接続しようとすると
「 dbExpress Error Invalid Username/password」
というエラーが発生して繋がらなかった。
で、MySQLを見てみたら、外部ホストから接続できるようにしてなかった。

MySQLにログインして、mysqlのDBを選択
GRANT ALL PRIVILEGES ON *.* to ユーザー名@"ホストIP" IDENTIFIED BY 'パスワード' WITH GRANT OPTION;

で、もう一回試してみたら再び同じエラーが…。
ググってみると、いろいろ引っかかってきた。

MySQL4.1以降の認証方式の違いで、MySQLに接続時に必ず
「 dbExpress Error Invalid Username/password」
といったエラーが発生する。
これは
「ユーザー名かパスワードが違う」
というエラーで、認証情報があっていても繋がらない。

これを回避するには以下のSQLを実行する必要がある。
SET PASSWORD FOR 'ユーザー'@'ホスト' = OLD_PASSWORD('新パスワード');
例)
SET PASSWORD FOR 'root'@'Windows上のVMnet8のIP' = OLD_PASSWORD('新パスワード');

で、もう一回接続。
キターーー。

とりあえず、これで問題ないみたいです。
が、PHP5.3以降はこの設定が使えないみたいなので、
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('新パスワード');
とする必要があるみたいです。

非SSLページからSSLページへリダイレクト

非SSLページからSSLにリダイレクトさせたい場合は、ssl.confに記載されている部分には触れずに、
httpd.conf内のバーチャルホストの設定を変更する。

<VirtualHost *:80>
    ServerName ~~~
    ServerAdmin ~~~
    DocumentRoot ~~~
    ErrorLog ~~~
    CustomLog ~~~
    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{SERVER_PORT} !^443$
        RewriteRule (.*) https://%{HTTP_HOST}$1 [L,R]
    </IfModule>
</VirtualHost>

赤文字で記載されている部分を追記し、apacheの設定をリロードすればリダイレクトされるようになる。
この設定はポート443以外でアクセスされた全てのリクエストをSSLページにリダイレクトする。
という設定である。
例)
http://test.co.jp/test.phpにアクセスがあった場合に、https://test.co.jp/test.phpにリダイレクトされる。

2011年3月8日火曜日

mod_rewriteを使おうとしたらOSデフォルトのWebページになってしまった

.htaccessを使って新集計ツールサーバに来るアクセスを全てメンテナンスページにリダイレクトさせる設定をしようとした。
とりあえずhttpd.confの中のAllowOverrideがNoneになっていたので、そこをAllに修正して保存しreload
<Directory />
    Options FollowSymLinks
    AllowOverride None → All
</Directory>


で、.htaccessに以下のように記述してページにアクセス。
<Directory ~~~>
ErrorDocument 503 /html/maintenance.html

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{REQUEST_URI} !=/html/maintenance.html
  RewriteCond %{REQUEST_URI} !=/images/construction.jpg
  RewriteRule ^.*$ - [R=503,L]
</IfModule>
</Directory>


すると、CentOSデフォルトのWebページが表示されてしまった。
エラーログを見ると以下のようなエラーが出ていた。
Options FollowSymLinks or SymLinksIfOwnerMatch is off which implies that RewriteRule directive is forbidden: ディレクトリパス


mod_rewriteを使うディレクトリでは「Options FollowSymLinks」が必要だったので、
そこを.htaccessに追加したら問題なく動いた。
Options FollowSymLinks
ErrorDocument 503 /html/maintenance.html

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{REQUEST_URI} !=/html/maintenance.html
  RewriteCond %{REQUEST_URI} !=/images/construction.jpg
  RewriteRule ^.*$ - [R=503,L]
</IfModule>

2011年3月7日月曜日

mysqlの世代バックアップとリストアに関して

mysqlの世代バックアップは以下の通り。
cronの実行時間に関しては適宜変更する。
以下の記述で4日間分のバックアップが残る

* * * * * mysqldump -u ユーザー名 -p パスワード データベース名 --default-character-set=文字コード | gzip > db/dump_`date +"\%Y\%m\%d_\%H"`.sql.gz
* * * * * find db/ -type f -name "dump_*.tar.gz" -mtime +3 -daystart | xargs rm

バックアップからデータベースにリストアする方法は以下の通り。
zcat ダンプファイル名.gz | mysql -u ユーザー名 -p パスワード データベース名

こんな感じでリストアできるみたい。
zcatコマンドとかつかったこと無かったけど、こんな風に使うのか。

2011年3月4日金曜日

PHPで数字かどうかを判定する

今まで数字かどうかは正規表現使ってましたけど、実はこんな関数があって、こっちの方が早いらしい。
今後はこれを使っていこうと思う。

ctype_digit

PHPの三項演算子のネストは使わない方がいい

何回か三項演算子をネストさせようとして、思い通りにいかなかくてあきらめていたけど、
PHPの仕様だったみたいです。
PHPで三項演算子のネストは駄目だ。

2011年3月2日水曜日

MySQLで「Got error 28 from...」と出るときの対処法

MySQLでmysqldumpを取ろうと思ったら、dumpファイル自体は生成されているが、明らかに容量が少ないファイルができていた。
で、出てくるエラーメッセージが「Got error 28 from storage engine」

ググってみたら、ディスクの容量が足りないってことが原因だったみたい。
dfコマンドで確かめてみたら確かに100%使い切っていた…。
VMWareのディスクを拡張したことで解決!
VMWareのディスク拡張方法はこちらに記載しました。

2011年2月25日金曜日

inputの属性にdisabled="true"が含まれているとPOSTされない件

disabledがtrueになっている要素に関してはPOSTされないらしい。
POSTしたい場合は、JSでPOSTする前にdisabledをfalseにしてからPOSTするか、
disabled属性ではなく、readonly属性に変更するという2種類の対応方法がある。

例)
<form action="hoge.php" method="post">
    <input type="text" name="disabled" disabled="true" /> ← こっちはPOSTされない
    <input type="text" name="readonly" readonly="readonly" /> ← こっちはPOSTされる
</form>

2011年2月24日木曜日

PHPで多次元配列のソートをする方法

array_multisortを使えば多次元配列のソートが可能なのは知っていたけど、
ソートキーって複数設定できたりするってことを初めて知った。

例えば二次元配列要素内の

二つの要素をソートキーに使いたい場合、

分類、商品売上順とか

伝票日付、伝票番号、行番号とか。。。

【コード、年齢】でソートを行う例です。

$data[] = array('code' => '01','age' => 30);
$data[] = array('code' => '02','age' => 25);
$data[] = array('code' => '01','age' => 18);

foreach($data as $key => $val)
{
$sortcode[$key] = $val['code']; //第一キー指定
$sortage[$key] = $val['age']; //第二キー指定
}

array_multisort($sortcode,SORT_ASC,$sortage,SORT_ASC,$data);

ソート実行前

Array
(
[0] => Array
(
[code] => 01
[age] => 30
)

[1] => Array
(
[code] => 02
[age] => 25
)

[2] => Array
(
[code] => 01
[age] => 18
)

)


ソート実行後

Array
(
[0] => Array
(
[code] => 01
[age] => 18
)

[1] => Array
(
[code] => 01
[age] => 30
)

[2] => Array
(
[code] => 02
[age] => 25
)

)

文字コードのShift-JISとSJISは別物らしい

Ajaxで通信しているところで、通信元はShift-JISで記載されてて、API側のPHPにはSJISと記載されていた。
てっきり同じ文字コードだと思っていたので問題ないんじゃないかと思っていたけど、
実際は別物で、きちんと書き分けないと文字化けしてしまう。

2011年2月22日火曜日

グラフィックボード増設

会社のPCでデュアルモニターにしようとしてグラボ買って増設したんですが、
知らないことが多すぎて無駄に時間食ってしまった…。

よっぽど特殊なマザボじゃない限りはオンボードのグラボと増設したグラボの共生は無理らしい。
PCIe x16は基本的には排他制御になっていて、さしたら他のグラボは使えなくなる。
なのでデュアルにしたい場合は増設するグラボの出力端子が2つ以上あるものを使う必要があり、
今回の場合はD-sub×2が必要だったが、現状はD-sub×1、DVI×1、HDMI×1の状態になっている。
なので、DVIをD-subに変換するコネクタを買ってDVIに挿す必要がある。

グラボの増設ってPCIeスロットに挿してドライバ入れれば動くと思ってたけど、意外と面倒だ…。

2011年2月16日水曜日

vimで画面分割

デュアルディスプレイにできない代わりに、せめて画面分割でもやろうと思って調べてみた。
とりあえずやり方は以下の通り。
:sp
画面を上下に分割
:vsp
画面を左右に分割
:sp ファイル名
指定したファイルを分割した画面に表示
:vsp ファイル名
指定したファイルを分割した画面に表示
Ctrl-w p
画面間の移動
Ctrl-w k
上の画面に移動
Ctrl-w j
下の画面に移動
Ctrl-w l
右の画面に移動
Ctrl-w h
左の画面に移動
Ctrl-w +
カーソルのある画面を一行分大きくする(縦)
Ctrl-w -
カーソルのある画面を一行分小さくする(縦)
Ctrl-w >
カーソルのある画面を一行分大きくする(横)
Ctrl-w <
カーソルのある画面を一行分小さくする(横)
Ctrl-w =
画面のサイズを同じにする

2011年2月14日月曜日

マグネトラクションエッジ

今日たまたまボードの話でマグネトラクションエッジについて話題に上がったので、
書いてみる。

「マグネトラクションエッジ」

聞いたことない単語だったけど、これはエッジが波打ってるやつのことらしい。
LIBのバナナとかがそうなっているのは知ってたけど、
正式名称は知らんかった。

アイスバーンでもガッツリ噛んでくれるらしい。
へー。

2011年2月10日木曜日

javascriptで0詰めしたい場合

jsでsprintfみたいに0詰めしたりできる関数ないかと思って探していましたが、
結局みなさん自作してるみたいですね。
今回は時間がなかったのでただ0詰めするだけの方法を調べました。
こんな感じでできるみたいですね。

// これを03にする
var time = '3';
var tmp  = '0'+time;
tmp.slice(-2);

楽だ。

2011年2月3日木曜日

winSCPでファイルやフォルダ名に日本語が含まれているとうまく転送できない件

新しい会社に入ってからやたらwinSCPの調子が悪いと思っていたら、
どうやらファイルのパスに日本語が混ざっているのが原因らしい。

日本語が混ざっているフォルダにあるファイルをwinSCP経由でサーバにコピーしようとすると、
「ファイル・フォルダ XXXXXXXX はありません」
というエラーメッセージが出てきてコピーできなかった。

ファイルを日本語が含まれていない場所にコピーしてから、
サーバにコピーすると問題無くアップロードできました。
今までは無意識に日本語ファイル名が含まれてないところから上げていたんだと知って、
ちょっとびっくり。

やっぱり日本語ファイル名とかフォルダ名はつけない方がいいなー。

2011年2月2日水曜日

rsyncの書き方

rsyncはネットワーク経由のコピーも可能なファイル・ディレクトリ同期ツールで、コマンドひとつでディレクトリツリーを一気に転送できるほか、差分のみの転送やコピー対象の条件指定といった多彩な機能を搭載している。 rsyncという名前に反してローカル間のコピーも可能で、makeファイル内でデータディレクトリを丸ごとコピーするといった用途にも便利に使えます。

基本的な書き方は以下の通り
rsync [オプション] コピー元 [コピー元...] コピー先


参考サイト
http://webos-goodies.jp/archives/51213844.html
http://d.hatena.ne.jp/kobapan/20091016/1255677010
http://d.hatena.ne.jp/pyopyopyo/20040925/p3

多重ループから抜ける方法

通常、ループ処理を行っている途中で、そのループから抜ける場合はbreakと記述する。


foreach( $array as $key => $value ){
    if ( $key == 1 ) break;
}

多重ループの場合は一度breakと記述するだけでは、現在プール処理している部分から抜けるだけで、
その外側のループはそのまま処理されてしまう。
こういった場合には以下のように記述する


以下の場合は$array1のループ処理は通常通り処理されてしまう。
foreach( $array1 as $key1 => $value1 ){
    foreach( $array2 as $key2 => $value2 ){
        if ( $key2 == 1 ) break;
    }
}

以下の場合は2重ループの外側までbreakされる。
foreach( $array1 as $key1 => $value1 ){
    foreach( $array2 as $key2 => $value2 ){
        if ( $key2 == 1 ) break 2;
    }
}

こういった形で、breakの後に数字を記述することで、その数のループ処理から抜けることができる。
break以外にcontinueでも同様のことができる。