2010年11月11日木曜日

(cakephp)core.phpでConfigure::write('Session.start', false);のときcontrollerでsession_startさせる [PHP]

core.phpでConfigure::write('Session.start', false);に設定していて、controller内でsession_startさせたい。
いろいろ検索したけど全然見付からなかった。

参考記事より以下のようにbeforeFilterで指定することで出来ました。
$this->Session->activate(TMP. "sessions/");

Session.startをfalseにするとSessionHelper->checkで常にfalseになる

2010年11月9日火曜日

-(ハイフン)を使った拡張アドレス [メール][qmail]

qmailを使って空メールから自動返信⇒会員登録システムを作る場合、regist@example.comに空メールを送る場合は、.qmail-registとかいうファイルを作成し、phpなどのプログラムを実行したりする。

ここで、同じドメイン下で、aaaという会員登録フォームとbbbという会員登録フォームがある場合、例えば、regist-aaa@example.comとregist-bbb@example.comなど複数ファイルを作成せずに、同じ.qmailファイルでプログラムを実行したり同じプログラムファイルで自動返信メールを送ったりする方法がある。
これはqmailの拡張アドレス部のワイルドカード(default)を利用した方法になる。

それぞれの空メール送付先をregist-aaa@example.comとregist-bbb@example.comとし、転送用のファイル名を.qmail-regist-defaultという名前にする。
そこで実行されるプログラム側で別途設定ファイルを読み分けるなりして自動返信内容を変える。
※例外処理をしっかりすればちょう便利。

Life with qmail(訳)

2010年9月8日水曜日

終了タグはいらない?[PHP]

知らなかった。。

PHPのみが記述されるソースファイルにはPHPの終了タグである ?> を書くべきではないということ。
PHPの勉強を初めてまず最初に目にするのは
<?php
echo phpinfo();
?>

というプログラムだったりする訳でして、PHPのプログラムは で終わるという事を最初に覚えるのですが、Zend のコード規約によるとどうやらそうじゃないみたい。

付録 A. Zend Framework PHP 標準コーディング規約 : A.2. PHP ファイルの書式
PHP コードのみからなるファイルでは、終了タグ ("?>") は決して含めてはいけません。終了タグは、PHP には必要ありません。 終了タグを省略することで、ファイルの最後にある空白文字が出力に影響することを防ぎます。

と明確に書いてある。これは、ここ最近 PHP に関するメーリングリストで交わされてたスレッドから初めてしった事。いやはや思いも寄らぬ新発見というか勉強になったというか。そんなスレッドを立てて下さった質問者の方に感謝。
確かに思い起こしてみると、終了タグの後に空白文字が意図せずに入っている事が原因で、header()関数をどこかで使ってるプログラムなんかでハマった事が何度かありました。そういう事態を防げる訳ですね。素晴らしい。

2010年8月2日月曜日

cakephpでのbake[PHP]

いつも忘れるのでメモ。
/path/to/cake -app /path/to/app bake

postfixで-(ハイフン)始まりのアドレスははじかれる[メール][postfix]

Postfixを利用している際、「invalid recipient syntax: "-xxx@example.jp"」などとエラーログが記録され、配送ができないことがある。これは、頭に「-」(ハイフン)が付くアドレスに対して送信ができない場合のものだ。
この場合には、次のように設定ファイル内に「allow_min_user」行を追加すればよい。
# vi /etc/postfix/main.cf
allow_min_user = yes

http://www.itmedia.co.jp/help/tips/linux/l0648.html
個人的にはMTAはpostfixが1番楽ちんな気がする。Postfix実践入門 (Essential Software Guide Book)

2010年7月31日土曜日

600万人の女性に支持されるクックパッドというビジネスの読後 [メモ][その他]

タイトルにある本を読んだあとの感想メモ。

プログラマーとして仕事をしていた際に、コンセプトや趣旨、目標などには出来るだけ口を出さないようにしているけど、根本的に疑問に思うことは多々ある。(それをよりよくしようとするための発言は出来るようになりたいとは思うが、それ自体を批判するような発言はさけたいと思って臨んでいる)
そもそも、そういった内容自体が曖昧で、例え多少明確にあったとしてもPMに認識がなかったりしてなのか、プロジェクトメンバー間での共有が出来ない場合も多い。
本で読んだだけなのだが、そこらへんがとても明確で強く、社内全体で共有出来るているところがとても羨ましいなぁと思った。
それはきっと当たり前のことなんだろうけど、なかなか出来ることじゃないと思う。


以下、書かれてた内容についてのメモ。
  • 「ランキング=おいしさ」ではなくおいしさはもっと主観的なもの。なのでランキングはない。ただし、有料コンテンツとして見ることが出来る(月額294円)
  • おかしげな書き込みをさせないようなサイト作り(割れ窓理論)
  • 広告も関連性があるかどうかを徹底的にチェックする。(女性が多いから女性向けの商品とかはNG。料理に関係してないとだめ。食品、調理器具など)
  • 説明が必要なサービスはレベルが低い。
  • 13文字を超えると可読性が悪くなり24文字を超えるとさらに悪くなる。そのため8〜13文字で伝えるようにしている。
  • ゴールを明確に。技術は目的ではなく手段である。(動画サービスをやりたい。なぜ?動画サービスは手段でしかない)
  • サイト内設計とは動線を作ること。関連検索など。アクセスログの解析。
  • 「ウォークスルー」ユーザが実際にどのような経路をたどったかを再現する。
  • レスポンスタイムの短縮。ディスクへの書き込みに比べて読み込みが多いため読み込みに関してはアクセスを分散。また出来るだけディスクでなくメモリへのアクセスを多くする。
  • PDCAサイクルの徹底
  • グーグルアースを使って書き込みが行われるとそこに旗が立つ(一人一人のユーザがいることが認識できる)
  • 詳細情報(地図や住所、電話番号)の印刷ボタン
  • データには恣意的な要素がどうしても入ってしまう(実験者効果みたいな?)
  • 本当の顧客とは誰なのか?ビジネスとして成り立つのは広告主からの支払いだが、ユーザがいなくなれば必然的に広告主もいなくなる。
  • 決められたお金でどれだけの利益を生み出せるか?給料をあげることか、社内環境を整備することか。
  • ノー残業手当。
  • 社員全員の会議を週に一回。マネージャーは3分で「一週間の目標」「ゴールの確認」「成果」「今週の課題」を共有。
  • 大切なのはモチベーションではなく役割。モチベーションは自己管理。やりたいこと、得意なこと、給料があがること。それらが重なっているか会社と個人が真剣に話し合う。そこにポジショニング出来れば、自立分散強調をうみ、個人が成長し会社が成長する。
  • 社長とマネージャーに対する全社員の評価制度。

「広告出稿」 → 「メディア(サイト)」

事例を作ることで広告代理店の認知をあげる。それによって広告主にも着目される。
広告主の商品を使ったレシピコンテスト(ウィンウィンの関係)

消えかかっているロングテール商品や伸び悩んでいる定番商品の再評価
・レシピが重複してるかどうかはどうやって判断するんだろう?
・ユーザのためのサービス作りが大切。
・少なくともスタッフ間ではそういう認識でいたい。

ちょっと古い本だけど、サービス業としてwebの仕事をしている人には是非読んでもらいたいなと思った。

2010年6月30日水曜日

docomoで「サイトが移動しました(301)」[携帯]

リンク先のURLの最後を「/」で終わらせないと「サイトが移動しました(301)」が出てしまう。
最初勝手にリダイレクトしてしまってるのかなって思ってプログラムを確認したのですが全然見付からず。。

http://planetarium-in-snowynight.blogspot.com?guid=ON
ではなく
http://planetarium-in-snowynight.blogspot.com/?guid=ON
にすると出なくなる。

strposとかで判定するといいかも。

2010年6月29日火曜日

携帯でmailtoをurlencodeする際の注意 [PHP][携帯]

携帯でmailtoを書くときは件名、本文をurlencodeしないと文字化けする場合があるけど、auでテストしてたら文字化けした・・・。
もしやと思って文字コードを変えてからやったら成功したのでメモっときます。

※cakephpの場合
if ($_Device->carrier == 'au' || $_Device->carrier == 'docomo') {
echo $html->link("送信する", "mailto:" . $_Config['regist_mail'] . "?subject=" . urlencode(mb_convert_encoding("新規会員登録", 'SJIS-win', 'UTF-8')) . "&body=" . urlencode(mb_convert_encoding("※件名と本文はこのままお送りください。", 'SJIS-win', 'UTF-8')));
} else {
echo $html->link("送信する", "mailto:" . $_Config['regist_mail'] . "?subject=" . urlencode("新規会員登録") . "&body=" . urlencode("※件名と本文はこのままお送りください。"));
}



2010/06/30 追記:
せっかくcakephpなのでhtmlhelperをextendsしてexhtmlhelperを作成しました。

class ExHtmlHelper extends HtmlHelper {
function mailto($title, $mail = "", $subject = null, $body = null, $carrier = 'docomo', $escapeTitle = true) {
if ($carrier) {
$carrier = strtolower($carrier);
}
if ($carrier == 'au' || $carrier == 'docomo') {
$subject = urlencode(mb_convert_encoding($subject, 'SJIS-win', 'UTF-8'));
$body = urlencode(mb_convert_encoding($body, 'SJIS-win', 'UTF-8'));
} else {
$subject = urlencode($subject);
$body = urlencode($body);
}
return $this->link($title, "mailto:" . $mail . "?subject=" . $subject . "&body=" . $body, null, null, $escapeTitle);
}
}

2010年5月12日水曜日

foreach と while each list [PHP]


$temp = array();
while (list($key, $val) = each($array)) {
$temp[$key] = $val;
}

foreach ($array as $key => $val) {
$temp[$key] = $val;
}


は等価、みたいな記述があったのでいつもはforeachを使ってたのだけれど試しにeachを使ったら$tempが空に。
あれって思って使い方を再度調べたらresetが抜けてたみたい。
配列の内部ポインタがリセットされてないのでそもそもwhile内でfalseを返してたのかな。

2010年5月11日火曜日

2010年3月18日木曜日

MeCab,MeCab-ipadic,php_mecabインストールメモ [PHP][形態素解析][MeCab]

下記サイトよりmecabと辞書になるmecab-ipadicをダウンロード。

また下記サイトよりmecabをphpより実行する拡張モジュール、php_mecabをダウンロード。

・mecabのインストール

# cd mecab-0.98
# ./configure
# make
# make install

・辞書をインストール

# cd mecab-ipadic-2.7.0-20070801
# ./configure
# make
# make install


・試しに実行
# mecab
今日は天気がありまりよくないですね。
今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
天気 名詞,一般,*,*,*,*,天気,テンキ,テンキ
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
あり 動詞,自立,*,*,五段・ラ行,連用形,ある,アリ,アリ
まり 名詞,一般,*,*,*,*,まり,マリ,マリ
よく 形容詞,自立,*,*,形容詞・アウオ段,連用テ接続,よい,ヨク,ヨク
ない 助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイ
です 助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
ね 助詞,終助詞,*,*,*,*,ね,ネ,ネ
。 記号,句点,*,*,*,*,。,。,。
EOS

おお。インストールされている。


次にユーザ辞書の追加。
ユーザ辞書を適当なディレクトリに作成して辞書をコンパイル、辞書のMecabへの認識を行う。
ユーザ辞書は所定のフォーマットにてCSV形式で作成する。
--フォーマット--
表層形,左文脈ID,右文脈ID,コスト,品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音
--------------

・辞書の作成
# touch /home/username/user.dic
# vi /home/username/user.dic
工藤,1223,1223,6058,名詞,固有名詞,人名,名,*,*,くどう,クドウ,クドウ

・辞書のmecabへの登録
# vi /usr/local/etc/mecabrc
userdic = /home/username/user.dic

・コンパイル
# /usr/local/libexec/mecab/mecab-dict-index -d/usr/local/lib/mecab/dic/ipadic -u /home/username/user.dic -f utf8 -t utf8 /home/username/user.dic


次にphp_mecabをインストール。
# cd php_mecab-0.3.0
# phpize
# ./configure --with-php-config=/usr/local/bin/php-config --with-mecab=/usr/local/bin/mecab-config
# make
# make install
Installing shared extensions: /usr/local/lib/php/extensions/no-debug-non-zts-20060613/

ここにインストールされたのかな。
# ls -al /usr/local/lib/php/extensions/no-debug-non-zts-20060613/
合計 136
drwxr-xr-x 2 root root 4096 3月 17 17:07 .
drwxr-xr-x 3 root root 4096 3月 17 17:07 ..
-rwxr-xr-x 1 root root 111579 3月 17 17:07 mecab.so
あった。

以下のようにphp.iniを編集しapache再起動。
# vi php.ini
extension_dir=/usr/local/lib/php/extensions/no-debug-non-zts-20060613/
extension=mecab.so
# apachectl restart
本当は今回追加したextension_dirはシンボリックリンクとかにした方がいいんだろう。

おしまい。



[ 参考 ]

2010年3月17日水曜日

形態素解析とNgramのさわり[形態素解析][Ngram]

入手可能な日本語の形態素解析エンジン

◆フリーで入手可能なもの(フリーなライセンスで、自由に入手出来る)
  • KAKASI(kanji kana simple inverter)、kakasi.namazu.org
  • MeCab(和布蕪)、mecab.sourceforge.net
  • ChaSen(茶筌)、chasen.naist.jp
    サンプル:http://www.kmusiclife.com/blog/2009/10/chasenphp.html
  • Juman、nlp.kuee.kyoto-u.ac.jp
  • Sen(MeCabのJavaへの移植)、ultimania.org、sen.dev.java.net
  • 日本語形態素解析Webサービス(Yahoo!デベロッパーネットワーク)、developer.yahoo.co.jp

◆市販されているもの
  • Rosette形態素解析システム、Basis Technology
    (Google、Amazon、MSN、楽天などで利用されており、世界で最も利用者の多い形態素解析エンジンであると言える)
  • 形態素解析エンジン言語郎、Zoo Corporation
  • 日本語形態素解析MARIMO ムーター株式会社
    (大規模な辞書を持たず、1000語程度の学習モデルのみで未知語、新語、流行語、略語、話し言葉に対応する。)
⇒from wiki http://ja.wikipedia.org/wiki/形態素解析


使用予定の解析ツール

◆MeCab


おまけ:形態素解析とNgramについて

  • 言語の分割には考え方として形態素解析とNgram方式がある。前者は自然言語的な文節として分割、後者はN文字ごとに分割しインデックスを作成する、という違いがある。
    http://gihyo.jp/dev/serial/01/make-findspot/0006
    http://www.accessup.org/pj/6_B4C9CDFDBFCDA4B5A4F3/20060203.html
  • 何サイトか説明を見てみましたが正確性を志向するのなら形態素解析、ノイズも混ざるが固有名詞や新語・造語などにも対応していくのならNgram方式がよさそう。ということで今回は形態素解析を使用する。

2010年3月10日水曜日

リスク [その他]

全ての発言にはリスクが伴うということをなぜ分からないかな。

2010年3月5日金曜日

twitter API にて oAuth認証してみる [API] [PHP]

仕事にて、twitterAPIを使って外部サイトからつぶやけるようにしようと思い、oAuth認証について試してみました。

まずはhttp://twitter.com/apps/newからアカウント登録して[CONSUMER_KEY]と[CONSUMER_SECRET]なるものをもらう。
その登録の際に、今回はwebアプリということで、「あなたの招待状」はBrowserを選択すると「Callback URL:」を入力出来るのでとりあえずそのときどきに指定しようと思い空にしておく。

それで、Google先生にきいてあれやこれやしたのだけどうまい具合にtokenが返ってこないしなんだか、「Desktop applications only support the oauth_callback value 'oob'」ってエラーっぽいのが返ってくる。

そこで再度登録ページにいってみたら先程の「Callback URL:」が「送信」になってて「Browser」じゃなくなってる。。
もしかしてーって思ってとりあえず「Callback URL:」を埋めて再度試してみたらちゃんとtokenが返ってきた。。

結構時間くったなぁ・・・。

[ 参考 ]

短縮URL [API] [AJAX]

このページについて「twitterにつぶやく」ボタンを生成する際に短縮URLを使ってみたくてtwitterが採用しているhttp://bit.ly/を使ってみた。

http://code.google.com/p/bitly-api/wiki/ApiDocumentationを見ながらやってみたけどすごく導入が楽だった。
http://bit.ly/にてユーザ登録を行い、http://api.bit.ly/shortenに「version」「longUrl」「login」「apiKey」をパラメータとして付加して送ると短縮したURLが帰ってくる。
さらにhttp://username .bit.ly/(だったかな・・・)にアクセスすると各短縮URLのクリック数なども見れて便利そう。