上記の日程で FuelPHP 勉強会 東京 Vol.1 が開催されました。
当初、勉強会に参加のみの予定でしたが、@mukaken さんに「何か発表しませんか?」とお声を掛けて頂いたこと、@peketamin さんの言葉に勇気付けられたこともあり、初めてではありましたが発表してきました。
先程も書きましたが、人前での発表なんて初めてで、とても聞き辛い発表だったと思います。スライドもガンガン進めて行って、「はえぇ〜よ!」って突っ込み入っても仕方ないなと反省してるところです。
ですが、当初の目標として自分が持っている情報を少しでも共有出来ればと思っていたので、その点については達成出来たのではないかと思っています。(勝手に)
とにかく、良い経験が出来ました。
会場をご用意して下さった VOYAGE GROUP さま、スタッフや参加頂いた皆さま方に再度お礼申し上げます。
なお、FuelPHP 勉強会 東京は今後も月1ペースで開催していくそうです。
ご興味ある方は参加してみては如何でしょうか。
(そういえば、女性の参加を熱望されてました)
---- 追記ここまで ----
意味不明なタイトルです。
先日、アップデートされて PC でも利用可能になった LINE ですが、タブレット版は Web アプリケーションと言う事もあって、非公式ながら API が存在しています。
タブレット版:https://t.line.naver.jp/
Skype や、MSN メッセンジャーと違って退席中や取り込み中の様なステータスがないので、メッセージが来て、ある一定時間未読状態だったら自動で「退席中です。」と返信する様にハックしてみます。
タブレット版の認証の仕組みから、自分は node.js を選択しました。
※選択理由は後ほど記述します。
node.js v0.4.10
使用モジュール:require v2.9.153
まずは下にアクセスして、セッションキーと RSA キーを取得します。
https://t.line.naver.jp/authct/v1/keys/line
▼取得した内容
session_key は、アカウントのメールアドレスとパスワードを組み合わせて使用します。rsa_key は、その組み合わせた物を暗号化する際に使用します。
サーバ側に送信する内容は、先程取得したセッションキー(session_key)と、認証の為のメールアドレス、パスワードを組み合わせた文字列です。下の様に組み合わせます。
文字列の長さをアスキーコードにしてるのは、各文字列の長さを示す為かと思われます。
LINE は、暗号化を JS のみで行なっていますが、独自の物ではなく、ライブラリとしてネット上で公開されている物を使用しています。
※自分が node.js を選択した理由は、このライブラリを利用する為です。
暗号化ライブラリ:RSA and ECC in JavaScript
node.js の場合、jsbn.js、rsa.js、rng.js、prng4.js を組み合わせて、モジュールとして使用します。
https://gist.github.com/2144164#file_rsakey.js
※コードが長いので、リンクのみ載せます。
var RSAKey = require('./rsakey.js'); などとして読み込んでください。
ライブラリを読み込んだ後は、RSAKey を使って暗号化します。先程取得した rsa_key をカンマ区切りで分割し、左から keyname, evalue, nvalue と言う変数に代入した後、下の処理を行なってください。
これで暗号化処理は終わりです。
送信先は https://t.line.naver.jp/rest/v1/login とし、POST で送信してください。
送信内容は以下のとおり
【注意点】
送信の際は、ユーザーエージェントに注意してください。
一部のユーザーエージェントは、サポート対象外とみなされて別ページへ飛ばされてしまいます。
リクエストヘッダに User-Agent: Chrome などを指定して送信してください。
うまくいけば、これでログインが成功します。
一つのアカウントしか認証出来ないと思うので、変な実装ですけど
node.js と cron が使えるので、dotCloud を活用しました。
なお、dotCloud での cron の設定等は省きます。
よし、うまくいった!と思ったのですが、繰り返しリクエストを投げていた所為か、LINE からブロックをされたみたいです。仕方ないですね。南無
リクエストの投げ過ぎには注意しましょう。
2012年4月7日追記
アカウント停止されたっぽいです。
FuelPHP のバリデーションには、他のフィールドと値が同じかどうかをチェック出来る match_field と言うルールが用意されています。
使い所としては、メールアドレスの入力確認、パスワードの入力確認などで使えます。
大変便利ですが、一点問題があります。
それは、入力時の値にしかマッチしない点です。
つまり、add_rule をフィルタとして扱った場合はマッチしないと言う事です。
実際の例を下に挙げてみます。
▼結果
string(72) "メールアドレス(確認)は、email1と異なっています。"
bool(true)
正しくマッチする様に、新たなルールを考えてみました。(以下の方法は、add_callable を使ってではなく、¥Fuel¥Core¥Validation を継承して実現させている点に注意してください。)
▼結果
bool(true)
match_validated_field は、バリデート後の値を元に比較を行いますので、結果は true となっています。
Validation クラスを継承してのルール追加が良い方法なのかは分かっていません。使用の際は自己責任でお願いします。
【追記:12/07/02】
よく考えたら、Validation#active を使えば、態々継承する必要なかった。
▼以下、修正後のソース
例えば下の例では、お名前と性別を required に設定しています。
▼結果
string(39) "お名前を入力してください。"
string(36) "性別を入力してください。"
性別が入力式であれば良いのですが、多くは男性/女性の選択式です。すると、エラー文言としては「性別を選択してください。」が相応しいと感じます。
しかし、validation.php には既に required の文言が設定されている為、性別用の文言を追加する事ができません。大変不便です。
そこで自分が考えたのが次の方法
validation.php はそのまま。新たに言語ファイルを一つ用意します。
▼結果
string(39) "お名前を入力してください。"
string(36) "性別を選択してください。"
更に、別のルールにも他とは違う文言を設定したい場合は、下の様にします。
フィールドを追加したい場合は、下の様にします。
他に楽な設定方法があれば教えてください。
]]>dotCloud のデフォルト設定では、PATH_INFO が取得出来ません。
■理由については下記を参照
DotCloud で PHP アプリを設置してみたときの色々 - 肉とご飯と甘いもの @ sotarok
index.php に PATH_INFO を動的に入れる方法も良いのですが、ここでは approot に仕込んだ nginx.conf で設定する方法を紹介します。
参考ページ:
https://bitbucket.org/lopter/symfony-on-dotcloud/src/6c7d0d7f3a7a/web/nginx.conf
これとは別に、dotCloud に WordPress を入れて、プログラム一式を wordpress ディレクトリに入れた場合の設定も調べたので、次いでにサンプルを載せておきます。正規表現の部分は改良の余地ありそう。
参考ページ:
WordPress › Support » Nginx Rewrite Rule for WordPress 3 (Multisite)
https://github.com/wakuworks/php-gumroad
PHP5.3 以上、MIT ライセンス
好きに改変してください。
※SplClassLoader などでクラスをロードしてください。
Smarty を愛用している事もあって、テンプレートを .smarty とするのは違和感があります。そこで、.tpl を View_Smarty に結びつく様にしてみます。
これで設定は完了です。次にテンプレートを読み込んでみます。
読み込む上で、下記二点に注意してください。
これらを踏まえて書いたソースはこちら
拡張子を省略しても、もちろん動作はします。
その場合は、各クラスの extension プロパティが適用されます。
View_Smarty の extension はデフォルトが "smarty" ですから、下記は welcome/index.smarty を読み込む事になります。
また、parser.php での拡張子の設定は、Parser¥View#forge でしか活かされません。このメソッドを使わず、自分でインスタンスを生成した場合は、全て自分で設定しなければなりません。
以下、設定例です。
これには明確な理由があります。例を挙げて説明します。
設定ですが、packages/parser/config 内の parser.php は何もいじりません。この parser.php を app/config 内にコピーし、ここに希望のデリミタを設定します。
本来はこれでデリミタの設定は完了のはずですが、残念ながら反映されません。実際にどの様に設定されているか確認してみます。
app/config/parser.php の設定は追加と言う形で、後ろにくっついてしまっています。
どの様に設定が扱われているか、packages/parser/classes/view/smarty.php を覗いてみます。
すると、デリミタの設定部分が下の様になっています。
これを見る限り、設定したデリミタの 0 と 1 の要素を読み込んでいる事が分かります。つまり、app/config/parser.php で設定した 2 と 3 は無視される訳です。
もし、どうしても Smarty のデリミタを変更したい場合は、大元の設定ファイルを変更する、または parser オブジェクトを直接変更する事になるかと思います。
【参考 URL】
» FuelPHP › Forums | General | Parser
どの様に実行されているかは、Validation#_run_rule 内を見ると分かります。
call_user_func_array を用いてルールを実行している為、trim と言った標準関数も呼び出せるという訳です。
ちなみに入力値の先頭から五文字目を抜き出したいと言った場合、この様に記述します。
後は validated() で取得出来ます。
次いで、callback で指定したい場合です。
(add_field での指定は分かっていないので、add_rule のみ説明します。)
callback の詳しい説明は下記を参照してください。
» PHP: 本ドキュメントにおける疑似的な型および変数 - Manual
例えば、下記の様なインスタンスメソッドと静的メソッドがあったとします。
(やっている事は内部で mb_substr を使っているだけです。)
これを add_rule するなら下記の様になります。
callback での指定方法はドキュメントには載っていない(と思う)ですが、add_rule のソースを見ると、引数が $callback となっているので、想定した作りなんでしょうね。
]]>よくある方法は、SDK から直接リソースを持ってくる方法です。
下記にリソースがありますので、プロジェクトにコピーして使います。
[SDK_DIR]/platforms/android-n/data/res
もう一つの方法は、APK 内からプログラムを用いて取得する方法です。
この場合も、private 関係なくリソースにアクセス出来ます。
【参考URL】
» mpigulski: Accessing com.android.internal.R resources from APK
この方法の利点としては、端末毎に UI が違っていても、それに合わせてリソースを取得できる点かと思います。(Drawable など)
実際にテストとして、QuickSearchBox のリソースを動的に読み込み、表示してみます。
▼結果
表示がおかしく見えますが、これはレイアウトのリソースのみ読み込んでいる為です。
]]>Validation はとても簡単ですが、ドキュメントにも書かれてなく、常々疑問に思っていたことがありました。
それは、
「フォームの内容を配列で受け取った場合、バリデートはどうやるの?」です。
「フォームの内容を配列で受け取る」と言うのは、下の構造で送信された場合を指します。(※三つの入力ボックスを置いています。)
これらの値を FuelPHP の Validation を通して取得したいと考えた時、真っ先に CodeIgniter での設定方法を思い浮かべました。
しかし、入力ボックスに入力した内容はどれ一つ取得できません。
$validation->validated() の中身を覗いてみます。
結果
理由はよく分かりませんが、設定の仕方が違うみたいです。
何か方法が無いか調べていたところ、一つのサイトを発見しました。
» FuelPHP Input arrays validation | Manuel João Silva
内容を見て分かった事は下記の二点
つまり、最初の入力ボックスの値をバリデートしたいのであれば、下記のとおり
全ての入力ボックスの値をバリデートしたいのであれば、下記のとおり
態々、一つ一つ追加するのは面倒ですが、うまくバリデートは出来ました。
]]>【実装例】
http://d.hatena.ne.jp/bardothodol/20100526
ただ、この修正だとパスの指定しか出来ない為、動的変更においては些か不便です。また、cURL の仕様によって @ マークを付けなくてはならないのも邪魔に感じます。そこで、自分なりに更に手を加えてみました。
バイナリでも指定が可能なので、かなり楽かなと思います。
全ソースコード載せたので、大分長いですね…。
参考サイト:
poochin's tech blog: OAuth/Twitter API で画像をアップロードする方法
CSSFrag Safari Extension // ShaunInman.com
ページ内リンクを行う際に URL にハッシュを付けて要素の ID(又は name 属性の値)を指定すると、その位置まで移動します。この指定を CSS セレクタでも可能にするのが CSSFrag です。
http://example.com/index.html#hoge
http://example.com/index.html#css(div:nth-child(2))
同様の機能を jQuery で実現しようとしたのが jQuery.cssFrag.js です。使用できるセレクタは CSSFrag とは異なり、jQuery のセレクタが使用できます。
※使用するには、クロスブラウザでの hashchange イベントを可能にする jquery.ba-hashchange.js の読み込みが必要となります。
ダウンロード:こちらから最新バージョンをダウンロードしてください。
検証ブラウザ:IE6/7/8/9, Safari 5.1, Google Chrome 12.0.742.122, Firefox 3.6.19, Opera 11.50
少し手直ししてみました。
結論から言うと、serialize, unserialize を使えば何にでもキャスト出来ます。
(※あまりにも強力過ぎるので、使用はオススメしませんが。。)
【参考】
javascript - Sorting an array of objects in Chrome - Stack Overflow
クイックソートは安定ソートではない為、例えば下記のコードを実行すると他とは異なった結果が返ってきます。安定させる為には return 0 を返さないように工夫が必要です。
V8 エンジンが使われている事もあり、node.js も安定していません。AS2 と AS3 の違いは面白いですね。
]]>