犬ターネット

Archive : 2011年06月

mixiやめて結構たちますが

唯一の心残りが、福満しげゆき先生の日記が見られなくなったこと。誰か先生の近況おしえろください


PHPアプリケーションの設定ファイルの話

アプリケーションの設定は .xml とか .yaml 使って外部ファイル化すると思うんですけど、最近は設定を直接 PHP に書いてます。こんな具合に。

<?php
/** C.php */
class {
  const DB_HOST '192.168.3.50';
  const DB_PORT '1234';
  const DB_USER 'mgng';
  const DB_PASS 'password';

  public static $INI = array(
    'default_charset'   => 'UTF-8',
    'mbstring.language' => 'Japanese',
  );
}

const は配列を定義できないので、連想配列で設定持たせたい場合は public static 使うしかなくてちょっと気持ち悪いんですが、でもこうしておけば、

<?php
require_once '/path/to/conf/C.php';

echo C::DB_HOST// 192.168.3.50
foreach ( C::$INI as $key => $val ) {
  ini_set$key$val );
}

みたいに設定使いたいところで require_once するだけで済むし、設定ファイルをパースするオーバーヘッドもファイル読み込みエラー処理もいらないし、

エラーになるとすればせいぜい書式ミスって PHP が Parse error 吐くだけ(アプリケーションも実行されなくて安心)だし、まあ、いろいろ楽。

っていうの、一般的なのかな。


Google +1 ボタン

をつけたけど正直よくわかってない。


kocorono DVD, consume + new pieces II, カセットテープをMP3に変換するプレーヤー

kocorono DVD

ブッチャーズはそこまで好きなバンドじゃないんだけど、DVD見たらあまりにも人間臭くて好きになりました。

consume + new pieces II

DVDに収録されてる「鍵並木」、タイトルが「鍵並木■」って感じでモザイクはいってたんだけど、クレジット見たら「鍵並木道」になってた。ほー

カセットテープをMP3に変換するプレーヤー

買ったはいいんだけど、肝心のカセットテープが見つからない... 引越しのときに捨てた可能性高い... しぬ...


twitterのアイコン画像を取得するAPI

が欲しかったのでつくった

こういうふうに書くと

<img src="http://app-mgng.rhcloud.com/twicon?id=mgng" />
<img src="http://app-mgng.rhcloud.com/twicon?id=mgng&amp;size=mini" />
<img src="http://app-mgng.rhcloud.com/twicon?id=mgng&amp;size=normal" />
<img src="http://app-mgng.rhcloud.com/twicon?id=mgng&amp;size=bigger" />
<img src="http://app-mgng.rhcloud.com/twicon?id=mgng&amp;size=org" />

こういうふうに表示される。





ソースを見てもらえればたいした処理してないことがわかるんだけど、いくつか工夫。

  • twitter API 経由だと速攻でアクセス制限くらうので http://twitter.com/[id] のソースを直接取得→パース
  • Cache-Control ヘッダつけて1時間はブラウザキャッシュ

くらい。PHPだとこういうのサクっとつくれるのでいいですね。

--- 追記 ---

http://b.hatena.ne.jp/forestk/20111115#bookmark-67640845
これじゃだめなの? http://api.twitter.com/1/users/profile_image/manbe_kun.json?size=bigger

いいと思います。

--- もいっちょ追記 ---

https://dev.twitter.com/docs/api/1/get/users/profile_image/:screen_name を見ると

This method must not be used as the image source URL presented to users of your application.

ってかいてあるから、

<img src="http://api.twitter.com/1/users/profile_image/manbe_kun.json?size=bigger" />

みたいなことはしないほうがよさそうですね。


なんの役にも立たないインターネットが大好きです

ライフハック?はぁ?


インターネットを使い始めた頃

当時連載していた新井英樹の「ザ・ワールド・イズ・マイン」をインターネットで検索してみたら、どこかの掲示板がヒットして、そこでは頻繁に意見交換が行われていたので

名前:(本名)
E-mail:(当時つかっていたメールアドレス)
内容:「ぼくもワールドイズマイン大好きです!みなさんの投稿たのしみにしています!」

と書き込みしたところ、それ以降書き込みが途絶えた。

ちなみに、2ちゃんねる に書き込んだんだけど。


Flashが使えるかどうかの判定js

swfobject 使えばいいんだろうけど、単体で動作するようなの欲しかったのでググッたら見つかりました。助かりました。

http://www.allinthemind.biz/markup/javascript/javascriptflash_player.php


バンド活動に疲れた

趣味で定期的にバンド活動している。

最初は、やりたいことが形になって、友達の輪が広がって、よい音楽にふれられる機会がふえて、憧れていたバンドが自分の企画にでてくれてとにかく楽しかった。

そのうち、色んな企画に呼ばれる機会が増えてきた。

ノルマが付き纏い、自分のライブの告知をしていかなくちゃいけなくて、来てくれたバンドのライブに遊びにいって一晩で何件もライブハウスをハシゴするようになった。

仕事も週末も忙しくて休むヒマがなかった。

二日酔いで会社にいった。

バンドに興味がなかった恋人に振られた。

メンバー内でも「告知をする人」と「ほとんどしない人」がでてきた。

あくま趣味なのでそこまできつく言う事もできずせめて自分が動いてるのを見て動く気になってほしいと思いながら動いた。

それでも動かないメンバーは何かと理由をつけて動かなかった。

ふらふらで明け方、山手線寝過ごして何周もしながら何をやってるのかよくわからなくなった。

好きなことなのに疲れてしまった。

そもそも好きだったのかわからなくなってしまった。

今、ライブハウスにはバンドが溢れてる。

お客さんも8割バンドマンでみんなそれぞれバンドを組んでいて、バンドのためにCDを買いライブのためにライブにいくひとが多いのかもしれない。

どんな有名な人を呼んでいてもそれは周りの友人達を惹きつけるためで、集まるのはせいぜい出演バンドの友達の友達の友達のバンド。

結局内輪でバンド無限ループ。

行けばそれなりに楽しめるけど、最後に残るものがみつからない。

音楽がずっと好きで、かっこいいプレイをしていたバンドマンに憧れていただけなのに。

ライブハウスで生まれる不思議な一体感に憧れていただけなのに。

いつの間にか音楽が目的でなくなっている。

なにがしたいのかがわからなくなっている。

ネタ元:クラブイベントに疲れた


カレントディレクトリ配下のファイル内文字列一括置換

いつもわすれるんだこれ。おれは頭がわるいのかもしれない。

# *.html の「kuso」を「unko」に置換
find . -type f -name '*.html' -print0 | xargs -0 perl -i -pe 's/kuso/unko/g'

試験的に

botのフォローは基本的に無視してたんだけど、試験的に @roujinbot だけ相互フォローしてみた。あと簡単な reply も実装した。


おれ

今日誕生日でした!忘れてた!プレゼントは10万円がいいな!10万円ください!


ffmpeg + ffmpeg-php で m4a のタグ情報読み込む

ffmpeg + ffmpeg-php でPHPから m4a のタグ情報とってみる。環境は CentOS、PHP-5.3.3。

まず ffmpeg をインストール。ffmpeg-php のコンパイルに必要なので ffmpeg-devel もインストール。

$ yum install ffmpeg
$ yum install ffmpeg-devel

次に ffmpeg-php 本体を ここ からダウンロード、/usr/local/src/ に配置してコンパイル。

$ cd /usr/local/src/
$ tar -xjf ffmpeg-php-0.6.0.tbz2
$ cd ffmpeg-php-0.6.0
$ phpize
$ ./configure
$ make
…

/usr/local/src/ffmpeg-php-0.6.0/ffmpeg_frame.c: In function ‘zim_ffmpeg_frame_toGDImage’:
/usr/local/src/ffmpeg-php-0.6.0/ffmpeg_frame.c:336: error: ‘PIX_FMT_RGBA32’ undeclared (first use in this function)
/usr/local/src/ffmpeg-php-0.6.0/ffmpeg_frame.c:336: error: (Each undeclared identifier is reported only once
/usr/local/src/ffmpeg-php-0.6.0/ffmpeg_frame.c:336: error: for each function it appears in.)
/usr/local/src/ffmpeg-php-0.6.0/ffmpeg_frame.c: In function ‘zim_ffmpeg_frame_ffmpeg_frame’:
/usr/local/src/ffmpeg-php-0.6.0/ffmpeg_frame.c:421: error: ‘PIX_FMT_RGBA32’ undeclared (first use in this function)
make: *** [ffmpeg_frame.lo] エラー 1

エラー。ググッたら回避方法がすぐ見つかったので修正。

$ vim ffmpeg_frame.c
336: _php_convert_frame(ff_frame, PIX_FMT_RGBA32);
421: avpicture_alloc((AVPicture*)frame, PIX_FMT_RGBA32, width, height);
432: ff_frame->pixel_format = PIX_FMT_RGBA32;
↓
336: _php_convert_frame(ff_frame, PIX_FMT_RGB32);
421: avpicture_alloc((AVPicture*)frame, PIX_FMT_RGB32, width, height);
432: ff_frame->pixel_format = PIX_FMT_RGB32;

念のため make distclean してから再コンパイル。

$ make distclean
$ ./configure
$ make
…
Build complete.
Don't forget to run 'make test'.

作成された ./modules/ffmpeg.so をコピー、併せて php.ini も修正。

$ cp ./modules/ffmpeg.so /usr/local/lib/php/extensions/
$ vim /usr/local/lib/php.ini
extension_dir = "/usr/local/lib/php/extensions"
extension=ffmpeg.so

php から ffmpeg.so モジュールが読み込まれてるか確認。

$ php -m
…
face_detect
ffmpeg
fileinfo
…

サンプルPHPスクリプト書いてみる。手元の .m4a はデータ取得できた。

$ vim test.php
<?php
$file_path = './sample.aac';
$m = new ffmpeg_movie($file_path);
echo
  'comment  : ', $m->getComment(), "\n",
  'title    : ', $m->getTitle(), "\n",
  'artist   : ', $m->getArtist(), "\n",
  'copyright: ', $m->getCopyright(), "\n",
  'genre    : ', $m->getGenre(), "\n",
  'track    : ', $m->getTrackNumber(), "\n",
  'year     : ', $m->getYear(), "\n"
;

$ php test.php
comment  :
title    : Recreate
artist   : Born Of Osiris
copyright:
genre    :
track    : 5
year     : 2011

.mp3 だと手元の環境ではこんな感じになって何も表示されない。

$ php test.php
[mp3 @ 0x9a69be0]max_analyze_duration reached
[mp3 @ 0x9a69be0]Estimating duration from bitrate, this may be inaccurate
comment  :
title    :
artist   :
copyright:
genre    :
track    : 0
year     : 0

.mp3 の場合は ID3 使うなどすればいいんじゃない


OpenCVとPHP用顔検出拡張(face_detect)使って顔検出するまで

CentOS, PHP-5.3.3, OpenCV-2.2.0, face_detect-0.0.1(※ちょっと手を加えた)で作った。

OpenCV インストール

OpenCV いれるのに CMake が必要なのであらかじめいれとく。

$ yum install cmake

OpenCV-2.2.0 をダウンロード、/usr/local/src/ 以下に配置して解凍。

$ bzip2 -d OpenCV-2.2.0.tar.bz2
$ tar -xvf OpenCV-2.2.0.tar

解凍した OpenCV-2.2.0 ディレクトリに移動してインストール作業。pythonインターフェースはいろいろあって無効にした。

$ cd /usr/local/src/OpenCV-2.2.0/
$ mkdir release
$ cd release
$ cmake -D BUILD_EXAMPLES=ON -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_NEW_PYTHON_SUPPORT=NO -D WITH_1394=OFF -D ENABLE_OPENMP=ON ../
$ make
$ make install

face_detect インストール

今度は OpenCV の PHP用拡張 face_detect をダウンロードしてインストール作業。

$ cd /usr/local/src/
$ wget http://www.netflowers.co.jp/face_detect/face_detect-0.0.1.tar.gz
$ tar -xzvf face_detect-0.0.1.tar.gz
$ cd face_detect-0.0.1/

face_detect-0.0.1 は 古い OpenCV(1.x?) 用の拡張なので、このままビルドしてもうまくいかない。なので、ソースをちょっと書き換える必要がある。まず、cvHaarDetectObjects の引数の数が変更されているので、face_detect.c と face_detect.xml を修正。

$ vim face_detect.c
137: objects = cvHaarDetectObjects(gray, cascade, storage,
138: 1.1, 2, CV_HAAR_DO_CANNY_PRUNING, cvSize(0, 0), cvSize(0, 0));

$ vim face_detect.xml
45: objects = cvHaarDetectObjects(gray, cascade, storage,
46: 1.1, 2, CV_HAAR_DO_CANNY_PRUNING, cvSize(0, 0), cvSize(0, 0));

次に、OpenCV のライブラリ名も 2.2 から大きく変更されているので、config.m4 を修正。

$ vim config.m4
35: PHP_ADD_LIBRARY_WITH_PATH(opencv_core, $PHP_FACE_DETECT_DIR/lib, FACE_DETECT_SHARED_LIBADD)
36: PHP_ADD_LIBRARY_WITH_PATH(opencv_objdetect, $PHP_FACE_DETECT_DIR/lib, FACE_DETECT_SHARED_LIBADD)
37: PHP_ADD_LIBRARY_WITH_PATH(opencv_highgui, $PHP_FACE_DETECT_DIR/lib, FACE_DETECT_SHARED_LIBADD)
38: dnl PHP_ADD_LIBRARY_WITH_PATH(cxcore, $PHP_FACE_DETECT_DIR/lib, FACE_DETECT_SHARED_LIBADD)
39: PHP_ADD_LIBRARY_WITH_PATH(opencv_ml, $PHP_FACE_DETECT_DIR/lib, FACE_DETECT_SHARED_LIBADD)

※ opencv_core, opencv_objdetect, opencv_highgui, opencv_ml を見にいくように修正すればいい。

ここまでやったら phpize → configure → make 実行。うまくいけば ./modules/face_detect.so が作成される。

$ phpize
$ ./configure
$ make
$ ls ./modules/face_detect.so
./modules/face_detect.so

作成された face_detect.so を PHPから認識させるために php.ini を修正。php.ini の設定に併せて face_detect.so も配置。

$ vim /usr/local/lib/php.ini
extension_dir = "/usr/local/lib/php/extensions"
extension=face_detect.so
$ cp modules/face_detect.so /usr/local/lib/php/extensions/

php -m で face_detect が表示されればOK。

$ php -m | grep face
face_detect

動作確認

face_detect 関数は検出された顔の数だけ座標(x, y, width, height)の配列を返す。これを利用して元の画像の顔部分を赤い四角で囲うだけの簡単なPHPスクリプトを書いた。

ちなみに「haarcascade_frontalface_alt.xml」は OpenCVで用いる「正面顔」識別情報定義ファイル。実パスは /usr/local/share/opencv/haarcascades/haarcascade_frontalface_alt.xml だけどローカルコピーして使ってる。

実行結果。Battlesの人たちの顔が赤く検出されました。

20110620144508

20110620144509

雑感

処理が重たいけど、顔座標検出だけだったら充分かも。

より細かく制御したかったら、face.com API 使えばいいと思う。


iPad

昨日銀座らへんに行ってきたので、ついでにアップルストア銀座店行ってiPad触ってきた。

...うん...使い道わからないのでいらない...iPhoneあればいいや。


たしかに

http://engineer.typemag.jp/entania/2011/06/g-1.php

たしかに、Perl 書いてから PHP に戻ってくると「おう... だせぇ...」ってなるんだけど、
おれは file_get_contents がある限り PHP を使い続けます。


PHPでGET/POSTパラメータ等の変数名にドットが含まれると勝手にアンダースコアになるのでころしたいところだが対処する

昨日の続き。対処方法をググってコピペして動作確認した。対処の仕方は、

  • GETメソッドの場合は $_SERVER['QUERY_STRING'] を参照
  • POSTメソッドの場合は php://input を参照

となる。以下ソース。

なんとなく class にしたけど、function params(){} のほうが呼び出しは楽だろう。

あと、params() 呼び出すと GET と POST 両方もってきちゃうので、引数にGET/POST指定して該当するほうだけ取得、のほうがいい気がする。


PHPでGET/POSTパラメータ等の変数名にドットが含まれると勝手にアンダースコアになるのでころす

このステキ仕様すっかり忘れてた...

http://www.php.net/manual/ja/language.variables.external.php
変数名のドットやスペースはアンダースコアに変換されます。たとえば <input name="a.b" /> は $_REQUEST["a_b"] となります。

どうにかするには $_SERVER['QUERY_STRING'] とかをどうこうするしかないのかなーPHPころす

(続きます)


運用中twitterボット(2016-02-18 更新)

---- 凍結されたもの ----

@lilyfrankybot リリーフランキーの名言

@junmiura みうらじゅんの名言

@k_emiko_bot 上沼恵美子の名言

@catchcopybot メンズナックルのキャッチコピー

@news_gebo 1時間に何度かニュースをゲボ

@roujinbot 老人

@mgng2 森ボーイ

@teisisho 亭師匠

---- 凍結されたものここまで ----

@g_ikenob 経済のことをギャル文字でつぶやきます。

@yoshikidr YOSHIKIがドラムを叩いたり伝説をつぶやきます。

@houdaibot 洋楽の邦題をつぶやきます。

@bokubot 僕が小規模につぶやきます。

@1gyoubot 1行だけつぶやきます。

@shinitawa 死ぬときのセリフをつぶやきます。

@onarabot おならをします。


zen-codingで覚えたいコマンド

タグ名[プロパティ1=値1 プロパティ2=値2 ...]

a[href=http://example.com/ title=unko]

<a href="http://example.com/" title="unko"></a>

form:post[action=hoge.php name=f]

<form action="hoge.php" method="post" name="f"></form>

要素.class名$*数字 でカウントアップ

ul>li.class$*5

<ul>
<li class="class1"></li>
<li class="class2"></li>
<li class="class3"></li>
<li class="class4"></li>
<li class="class5"></li>
</ul>

+ショートカット

ul+

<ul>
<li></li>
</ul>

ol+

<ol>
<li></li>
</ol>

table+

<table>
<tr>
<td></td>
</tr>
</table>

select+

<select name="" id="">
<option value=""></option>
</select>

zen-coding 便利すぎてしぬ


僕がはてなブックマークを非公開にしたたった1つの理由

エロサイトブックマークしたいからに決まってるだろ


キルマンデーズのテーマ

ファック!ファック!ファックマンデー!キル!キル!キルマンデー!
ファック!ファック!ファックマンデー!キル!キル!キルマンデー!

月曜ころす ブルーマンデー
キルマンデー チープサラリー

ファック!ファック!ファックマンデー!キル!キル!キルマンデー!
ファック!ファック!ファックマンデー!キル!キル!キルマンデー!

アイムインレストルーム メイクニューシット
キルマンデーキル キルマンデーミーティング

(ギターソロ)

資本主義

(バケツいっぱいのミミズをばら撒くソロ)
(チェーンソーソロ)
(切腹ソロ)
(ストリップ)

ファック!ファック!ファックマンデー!キル!キル!キルマンデー!
ファック!ファック!ファックマンデー!キル!キル!キルマンデー!

ウィーアーキルマンデーズ

キルマンデーズのみなさん


wgetでクロールした際にファイル名に余計なクエリストリングがついてしまうので一括リネームしたい

Webサーバやアプリケーションの設定でリンクに

  • guid=onを自動付与しちゃってたり
  • URLにセッションID埋め込んだり

してると、wgetでクロールした際にファイル名にまで

  • index.html?guid=on&sess=xxxxxxx
  • info.html?guid=on&sess=xxxxxxx

といった具合にクエリストリングがついてしまう。邪魔。

なので、一括リネームするワンライナーコマンドを...書きたかった...けど...途中まで考えて嫌になったのでsystemコマンド+PHPで処理した。

findコマンドで指定ディレクトリ配下の html, jpg, gif, txt, css ファイルパス一覧を取得して、「?なんたら」がファイル名に含まれていたらその部分を削除リネーム。

こういうのをサクッとワンライナーで書けるようになりたいれす(´ω`)


Jakszyk. Fripp And Collinsm, あら恋

Jakszyk. Fripp And Collins / A Scarcity of Miracles

あらかじめ決められた恋人たちへ / CALLING

Jakszyk. Fripp And Collinsはキングクリムゾンのニュー形態とかなんとかって話です。

あら恋は特典でDVDがついてきた。これから見る。


範馬勇次郎に何か言わせるサービス

画像処理しなきゃならなくなったのでリハビリがてら作った。

勇次郎


wget でクロール

仕事でクロール必要になったので、wgetさんにお願いした。

wget 
--recursive 
--page-requisites 
--domains=www.example.com 
--reject=*aaa.php 
--tries=2 
--wait=10 
--user-agent="tekitou user agent" 
http://www.example.com/

上から

  • --recursive … 再帰取得してね
  • --page-requisites … ページ構成上必要な画像類も取るよ
  • --domains=www.example.com … 取得するファイルは www.example.com ドメインのものだけだよ
  • --reject=*aaa.php … なんたらaaa.php ってファイルは除外ね
  • --tries=2 … 取得失敗したら2回までリトライしよう
  • --wait=10 … サーバ負荷考えてクロール頻度は10秒ね
  • --user-agent="tekitou user agent" … ユーザエージェントも指定しよう
  • http://www.example.com/ … ここからまず取得するよ

同期が退職してた

久々に別事業所にいく機会があり近況報告や世間話などしていたんだけど、同期のAがいない。話を聞くと、去年の12月に退職、地元に帰って原発関連の仕事に転職したとのこと。大丈夫か。


便秘

尻が便秘すぎてつらい