ロリポップ!のDBダンプデータを持ってきてMySQL5系に突っ込む時にやったこと

5月 7th, 2012

メモエントリーです。
とある事情によりロリポップ!で動いていたWordPressの環境をまるごと開発に持ってくる必要があり、何も考えずにダンプとってDBに突っ込もうとしたら怒られたのでメモ。

バージョンアップしてれば問題なさそうですが、DBデータがMySQL4系だったりするとcreate文でこけたりするので以下のように置換をかけました。

# エンジンの指定方法を置換
sed -e "s/TYPE=MyISAM/ENGINE=MyISAM/"
# タイムスタンプ型の(14)みたいな書き方は無効なので置換
sed -e "s/timestamp(14)/timestamp/"
# データ突っ込んだら文字化けしてよくみたらset NAMES ujisなんてのが居たのでutf8に
sed -e "s/ujis/utf8/"

DBの中身によっては他にもあるかもしれませんがとりあえずこんな感じで書式を合わせたらなんとかなった。
この際だからエンジンもinnoDBに変えたりして良い気もしますが開発用なので気にしない。

逆にいってしまえばこれだけの修正で4系→5.5系で動かせるMySQLの互換性はなかなかすごいですね。


イガイトカンタン -PhoneGapからTitaniumMobileに乗り換えて10日くらいでアプリを作った話

3月 12th, 2012

Phonegap→Titaniumに移行して10日でandroidアプリを作ってリリースしてみました的な記録。
コードは一行も出て来ませんごめんなさい。
そんな面倒なことしないでもっとこうしたらええがな、みたいな突っ込み歓迎です。

つくったもの

ももいろクローバーZの情報をトータルフォローする非公式アプリ「ももクローム!

え、これ何するやつ?

(最近なかなか会えない、になりつつある)今会えるアイドル、週末ヒロインももいろクローバーZの最新情報を1アプリでチェックすることが出来ます。あんまこういう言い方したくないけどようするにファンアプリ的なやつだよ!
現在以下の情報に対応しています。

・メンバーブログ、スタッフブログ、新着ニュース
・公式スケジュール
・アイテム情報
・公式動画

環境

・android端末 HTC X06HT
・titanium studio on windows7 on thinkpad x201
・自身は昔Java、は普段PHPをメインで使っていてJSはjQueryとセットでたまに使う程度

かかった時間と前提条件

・業務時間外の作業(平日の夜+休日)で約10日
・サーバー側の実装はほぼほぼ終わった状態でスタート
・アイコンとか画像全般はももクロファンデザイン出来るやつに外注

PhonegapからTitaniumへ移行した理由

基本的に端末機能をほとんど使わないため最初はPhonrgap+jQueryMobileで開発していた
→割と慣れたjQueryでの開発なので初速は結構でた。↓くらいの状態には一日で出来ました。

当初のUIはこんな感じ。jQueryMobileのテーマローラー使用。割と綺麗。

 

が、以下の理由により断念

・ページ遷移時に同じ位置にあるボタンをタップしてしまう現象を回避できず
→ボタンをタップして画面遷移した際に、同じ位置にあったボタンに対してもタップイベントが走ってしまう。イベント制御を色々試してみたが回避出来ず。
・httpでのサーバーからのデータ取得がこける(これは後に別の問題と判明)
・固定ヘッダの挙動がいまいち(スクロールで再描画される。たまにでない。)
・その他android上での挙動が全般的にイマイチ(ページ遷移時の再描画など)

Titaniumでの実装で時間がかかった部分

・INTENTの機能や、andoridのメニュー機能はサンプルをみながら割とあっさり実装できた
Titanium Mobileで開発するiPhone/Androidアプリのサンプルやネット上のサンプルを参考に書けばおk

・UIの調整にとにかく時間がかかる
参考までに以下UIの変遷

一覧

1)とりあえず一覧表示(サイズ指定がpxなのでやけに小さい)
2)dip指定を覚えて サイズはいい感じに
3)と思ったらgaraxy nexusで端っこがきれてる
4)ロゴと背景画像を分け、背景横幅100%、ロゴをセンタリングで解決

詳細

1)とりあえず詳細表示
2)フキダシっぽくしてみたけど横に張り付き
3)フキダシに収まるようにしたけど実際は横幅いっぱいまでwebviewがあるため中のリンクを踏むと悲しい見た目に
4)なんとかフキダシ内部にwebviewを置くことに成功

記事のプレビューエリアはフキダシにしよう、と当初から決めていましたがここのUI調整だけでえらい時間かかりました。

最終的に
・ベースとなるコンテンツエリアのビューを定義(縦は表示領域の余ってるところ全部)
・その上にヘッダとフッタをイメージビューで配置
・真ん中に背景画像にフキダシの横の線部分を設定したビューを配置。さらにそのうえに左右にマージンをとったwebviewを配置

で解決。
手法としてはCSSで画像使って角丸設定するのと同じような感覚なんだけど、透過部分がうまくいかなかったり、マージンが効かなかったりというのを調整し、その都度実機転送して確認、を繰り返し。

そんな面倒なことをして、わざわざ表示する領域を狭くしてまでフキダシを設置するのもどうなのよ、というコメントを頂いたりもしますが、フキダシにしたほうがこうももかが喋ってるような感じでめっちゃ気持ち伝わるやんけ!
というこだわりによるものなのであしからずご了承ください。

はまった点など

・デバッグ方法
→Titanium Studioのデバッグメニューは「Android Emulator」しか出てこないので、しばらくそれでデバッグしていたんですが、「端末じゃないと再現しない」、「エミュレーター重いしよく落ちる」のでかなりストレスです。
とはいえTi.API.debugから出力したメッセージもみたい、とあれこれやっていたところ、最終的に実機で実行して、android sdk標準のddmsを単体で立ち上げ、フィルターでTi.APIとか指定する方法でデバッグが出来そうだったのでそのようにしました。

余談ですが、Ti.〜とかでログ出していると、他のTitaniumで開発されたアプリが引っかかったりして楽しいです。

・画像のサイズが合わない
→dip指定と100%指定を組み合わせてなんとか乗り切りましょう

・マーケットにあがらない
→最後の最後でマーケットに上がらない現象が発生。アイコンが云々みたいなエラーメッセージを出されるが実際は全然別の原因で、自分の場合はi18n/en/string.xmlが存在しなかったのが原因。全然ちゃうやん・・。他にも「AndroidManifest.xmlの不備」などが原因であがらなかったりするようなのでアップ時には余裕を持ってやりましょう。

・http://〜で指定した画像が出てこない
→android.permission.WRITE_EXTERNAL_STORAGEで書き込み権限を持っていないとダメ。キャッシュの関係なんですが、SDカードの読み書きとか別にしねーし、と思っててもこれ入れとかないと画像が出ません。

今後の課題

・メモリ管理(オブジェクトの破棄とか)、モジュール化などをちゃんとやるようリファクタリング
→リリースしたら終わり、というものでなければこのへんちゃんとやらんとダメね。手を抜いてちゃダメさー
・自身のjsのスキルアップをしつつ、シングルコンテキストな感じで書き直したい
・内部にデータキャッシュ機構を持たせたい

参考リンク

一番役だったのは書籍「Titanium Mobileで開発するiPhone/Androidアプリ」ですが、参考にした諸々のリンク先をあげておきます。
androidアプリ開発のため、偏ってます。

titanium-mobile-doc-ja
基本的な情報は大体ここで

Titanium Mobile API Documents
APIドキュメント

Titanium BBS(JP unofficial)
日本語非公式掲示板。困った時はここで。

【Titanium Advent Calendar 2011:十九日目】Androidアプリも作ろうぜ!~Androidアプリに実装すべきTipsたち
この記事超参考になりました

Community Questions & Answers
本家のQA。英語ですがSDKのクリティカルなバグ情報とか対処法が見つかったりします

その他色々ありましたが見つけたら追記。
余談としてandroid固有の話(たとえばサイズ別画像の用意)などはネイティブのandroid開発資料などが役に立ちます。

まとめ

・Titaniumは結構簡単にアプリを作れるがUI調整には時間がかかる

・実機転送の間の過ごし方をなにがしか考えておく

・必要なのは高いモチベーションと折れない心

・実機はなるべく多くの種類を用意した方がよい。解像度の低い端末ではいきなりアイコンがでかくなったりしてびびる。

特に3つ目の高いモチベーションは大事。
そもそも私はこのアプリを自分が使いたいから、という理由で開発していたわけですが、開発期間中に手に入れたももいろクリスマス in 日本青年館~脱皮:DAPPI~をみたい衝動を抑え開発作業を続けるのは非常な困難を伴いました。
あー俺はなんでこの超いいDVD見るの我慢してこんな地味な作業を続けなければならないんだろう、という不毛な考えが浮かぶようではアプリ開発はままなりません。
必要なのは折れない心です
絶対諦めないwe are!

 


MacPortsでphpとlibyamlをインストール

2月 25th, 2012
sudo port install php5
sudo port install php5-mbstring

apacheは別にいらなかったんだけどログみてたら入ってる予感・・。
peclのyamlを使いたいのでlibyamlをいれる

sudo port install libyaml
pecl install yaml

libyamlの場所を聞かれる。
autodetectだと見つからないので明示的に指定。
portsのインストール先からなんとなくここやろって入れたら合ってた。

/opt/local

あとはphp.iniに足せばいいんだけどportsでいれた場合iniはここにある

/opt/local/etc/php5

ついでにerror_reportingやらtimezoneやら設定するととりあえずいい感じですね。


muninのapache関連のデータ取得で忘れがちな点

2月 9th, 2012

メモエントリーです。

シンボリックリンクを追加

ln -s /usr/share/munin/plugins/apache_accesses /etc/munin/plugins/apache_accesses
ln -s /usr/share/munin/plugins/apache_processes /etc/munin/plugins/apache_processes
ln -s /usr/share/munin/plugins/apache_volume /etc/munin/plugins/apache_volume

httpd.confに以下を追加(これよく忘れる・・)

ExtendedStatus On

locationで設定出来ないケースもあるのでバーチャルホストで定義してしまう

#status
<VirtualHost *:80>
    ServerName 127.0.0.1
    <Location /server-status>
      SetHandler server-status
      Order deny,allow
      Deny from all
      allow from 127.0.0.1
    </Location>
</VirtualHost>

curlなどで叩いてみる

curl http://127.0.0.1/server-status

問題なければmunin-nodeをrestart


Windows+Eclipseで(ゴテゴテした)快適なCake開発環境を作る(CakePHP Advent Calendar 2011 11日目)

12月 11th, 2011

@mon_satさんからバトンを受け取ってのAdvent Calendar2011 11日目担当EG(@EGMC)です。
初参加で地味ネタですが、開発環境の話ってあまり聞かないのでとりあえず自分なりに育てた開発環境の話をしてみます。

※注 この前置きは長いのでさっさと本題に入りたい方は「開発環境構築編(ここから本編)」へどうぞ

ネタはWindows+EclipsePDT+その他tools。
昨今、勉強会に行くと皆MacBook Airなどを片手に、華麗にターミナルを開いてVimやEmacsで優雅にコーディングしている光景を目に致します。
そんな光景を横目に見つつ、しかしThinkpadでWindowsを起動してEclipseでもっさり開発している人たちも一定数いるはずだ!と信じてこのエントリーを書く次第です。いるかなあ。いるといいなあ。
前提として環境は

・開発サーバー(物理でもVPSでも)を外部(VMとかではなく)立てていて、DBは同サーバー(または同一ネットワーク内)にある
・ローカル環境はWindows+EclipsePDTで構築しており、プロジェクトは作成済み
・ソース編集はローカルで行うが、DBの操作やデバッグ(ログのtailとか)はリモートで行う
・ローカルのWindows環境にもphpがインストールされてる(bake用)

とします。
それ以前の情報は検索すればすぐ当たると思うので他に譲ります。
なお、cake1.3系で書きますが2.0系でも基本的に同じような事が出来ます。
環境設定上examle.netとかにしている部分は適宜ご自分の環境に置き換えてくださいませ。

なぜWindowsなのか?

・プラットフォームに依存したエディタとか、使い慣れたツールがたくさんあるからです。例えば私はHTMLエディタにCrecsent EVEを使ってます。

なぜEclipseなのか?

・元々自分がJava開発をメインでやってたのでその流れて使い始め、慣れていたというのが大きい
・起動の重さとかは色々あるものの、強力な補完機能(コード、Docコメント)、コードへのジャンプ、バージョン管理連携、プラグイン拡張など現実的な機能が多い
・最悪外部エディタが起動出来たり結構なんとかなる
・他の環境(Andoroid開発環境とか)と同居出来る
・起動の遅さについてはRAMDISKなどを使ってある程度は改善出来る

なぜ外にサーバーを立てるのか?

・自分の場合、会社と家で使うPCが違ったりするのでローカルに環境作ると何かと面倒くさい
・外部から叩かれる(例えばFacebookのプラグイン入れたりとか)ような機能を追加したりする
・他の人と環境を共有したりする
・↑みたいなことが無ければ全然VMでいいかなーと思ってます

使うツール群

Eclipse PDT(IDE)
WinSCP(ファイル転送)
PortFowarder(ポート転送)

開発環境構築編(ここから本編)

1)ファイルの自動転送

今回の構成では開発環境はリモートにあるのですが、ソースの反映は書き換えたらリアルタイムで行いたいですよね。
というわけで変更を即座に反映するよう自動転送します。
WinSCPの同期機能を使います。

ローカルはEclipseのプロジェクトフォルダを指定してパスを合わせます。
これで監視下のフォルダで変更があると即座にリモートへ転送してくれます。
無視したいファイル(.svnなど)はこんな感じで除外リストに入れておきましょう。

この状態でセッション保存しておけば、起動→接続→CTRL+Uですぐ同期をスタート出来ます。

2)Eclipseの自動補完を効かせる

なぜEclipseなのか?の所で補完機能を使いたいからだよ!と書きましたが、フレームワーク故にというかCakeはあまりモデルそのものをnewしたりしないので、そのままではほとんど補完が効きません(モデル、コンポーネント、etc・・)。
というわけで補完を効かせるようにコードをいじります。
正直、IDEの補完機能のために不要なコードを足すのはどうなの?という思いもありますが開発効率や動作速度を天秤にかけてこの方法を採用しています。

app_controller.phpに

/**
* Userモデル
*
* @var User
*/
var $User;

/**
* セッションコンポーネント
*
* @var SessionComponent
*/
var $Session;

/**
* authコンポーネント
*
* @var AuthComponent
*/
var $Auth;

/**
* セキュリティコンポーネント
*
* @var AuthComponent
*/
var $Security;

のように書いてどのクラスかを教えてあげます。

これで補完が効くようになります。

3)ローカルからbakeを使う

cakeといえばbakeですよね。
モデルやコントローラの生成が楽に行えますが、リモートで生成したファイルをいちいち持ってくるのは面倒です。
ローカルで(かつIDE内で)作ります。

bakeは当然phpが必要なのでローカルのWindowsマシンにphpを入れます。
bake.batはphpにパスが通ってる前提なのでパスを通します。

さて、これでbakeは実行出来るのですが、モデルの情報を取得するのにDBに接続しなければなりません。
ローカルにDB作るという方法もありますが、いちいち二重化させるのは面倒なのでリモートのDBに繋ぎたいです。
ポート転送を使いましょう。
Teratermのポート転送機能などもありますが、今回はPortForwarderを使います。

config.txtはこんな感じで

Host dev.example.net
HostName dev.example.net
# hostname or IP address

User hoge
# username on server. NEEDED

LocalForward 13306 localhost:3306
# localforward info1

Compression yes
# if you need compression

IdentityFile dev.example.net-key.rsa

13306ポートをリモートサーバーの3306に転送してます。
これでPortForwarderを立ち上げてDBの接続先を13306にすれば繋がります。
開発環境と、ローカルで接続情報が異なる場合は実行パスの判定などを行って接続先を切り替えます。

core.phpで切り替える場合は例えばこんな感じで

if (__FILE__ === 'C:\path_to_workspace\project\app\core.php') {
// ローカルでbakeするための設定
    define( '_DB_HOST' , '127.0.0.1:13306' );
    define( '_DB_NAME' , 'projectname' );
    define( '_DB_USER' , 'user' );
    define( '_DB_PASS' , 'pass' );
} else {
    // サーバーで動かすための設定
    define( '_DB_HOST' , '127.0.0.1:3306' );
    define( '_DB_NAME' , 'projectname' );
    define( '_DB_USER' , 'user' );
    define( '_DB_PASS' , 'pass' );
}

※ちなみにCake2.x系の場合はPORTは別指定になりますね

bake用の実行構成を実行→外部ツールから作成します。

これでIDEからbakeが実行出来ます。

ファイルの生成を行った後、F5でファイルのリフレッシュを行うと反映されますね。

ここまでやると晴れて快適に補完も効き、bakeも使え、ソースも同期される開発環境が構築出来ます。

ちなみにここまでの設定をすべて行って必要な諸々を起動すると画面はこんな感じになります。

・・・・まあ非常にWindowsらしい感じですね、うんうん。
立ち上げているものも多く、そもそもサーバー側で作業すれば楽なことも多々ありますが、まあこれはこれで慣れればいいものですよー。
Windowsで開発をされている方のお役に立てれば幸いです。
あと、こんな面倒なことしなくてもこんなんありまっせ!みたいな情報もあれば是非twitterなどで突っ込んで頂ければと思います。

そんなこんなで初参加のCakePHP Advent Calendar 2011でした。明日は@slumbers99さんです!


CakePHPのShell内部でemailビューをレンダリングしてQdmailでメールを送る

11月 17th, 2011

タイトルまま。
我ながらこれは悪手だと思うがとりあえずこの方法で実現は出来ましたので公開。
こんなやり方もあるよ!とかあれば是非twitterなどでツッコミくださいませ。
ちなみにビューはSmartyプラグインを使っていますがこの場合基本ビューはなんでもよく、ヘルパーも普通に使えると思います(多分)_。

環境

PHP5.3.6
CakePHP1.3系
Qdmail1.2.6b

そもそもの問題点

cakeのというか、Qdmailの仕様で、ビューのemailエレメントを使ってメール本文を構築する際に、コントローラーに値をセットして渡す必要がある。
コントローラーからメール送信する場合はそれでよいが、シェルなどから(例えばユーザーに対しての一斉送信などで)メールを送る場合はコントローラーが存在しないため値の受け渡しが出来ないので考えた結果コントローラをでっちあげる事にしたという話。

サンプル

<?php

App::import('Core', 'Controller');
App::import('Component', 'Qdmail');
App::import('Core', 'Router');

class HogeShell extends Shell {

    var $uses = array('User');

    function startup() {

    }

    function main() {

        // qdmail
        $this->Qdmail = new QdmailComponent();
        // テンプレートに入れ込むためのデータ
        $userdata = $this->User->read(null, 100);

        // Qdmailコンポーネントに食わせるためのダミーコントローラーを生成
        App::import("Controller", "App");
        $dummycontroller = new AppController();
        // 値をセット
        $dummycontroller->set("user", $userdata);
        // startupを自分で呼んでダミーコントローラーを渡す
        $this->Qdmail->startup($dummycontroller);

        $this->Qdmail->to($userdata['User']['email']);
        $this->Qdmail->subject('シェルからのメール送信');
        $this->Qdmail->from('test@example.com');
        // emailエレメント使う
        $this->Qdmail->cakeText( null ,'users.notice');
        $this->Qdmail->send();
    }
}

これで生成したAppコントローラーを経由して値の受け渡しが出来、送信時にviews以下のテンプレートを使用することが出来る。
コントローラーはもちろんダミーで無駄な生成コストがかかってるがとりあえずやりたい内容は実現出来た。

そもそもの話というか不満点

emailの送信はコントローラーだけでなく色々なレイヤーで行われるので、コントローラーに依存したくない。画面出力に使わない値をメール送信のためだけのコントローラーにバインドするというのもちょっと気持ち悪い。
(まとめて配列でパラメータを渡すとかでいいと思う)

いずれにせよこれはあまり筋の良い解決法とは思われないので、何か良い方法を考えたい・・。


CakePHP2.0.2で意地でもTwigを使ってみる

11月 15th, 2011

CakePHPの2.0系が最近安定版リリースされましたね。
まだまだ情報は少ないですが、折角なので新規の開発は1.3系ではなく2系でやりたい!と思うこの頃です。

さて、CakeといえばテンプレートエンジンはSmartyを使う人が多い印象ですが私は圧倒的にTwigが好きです。然り、Twigが好きなわけです。

CakeでTwigを利用するプラグインはこんな感じでKjell Bublitz氏が作成されているわけですが、早くも2系に実験的ながら対応しました的なことが書いてあるのでこれは!ということで導入してみました。
2系の仕様がよくわかってなかったりドキュメントがまだアレだったりと色々ありましたがとりあえず動かせてます。

環境:
CakePHP2.0.2
Twig1.3.0(stable)
cakephp-twig-view(commit a5fc2e6291)

導入:
1)基本的にInstallationに書いてある通りのフォルダ階層で突っ込みます。

こんな感じで、Plugin直下にtwig_viewを配置。
Twig本体はvendorsの下に配置。

2)初期設定諸々

app/Config/bootstrap.phpあたりに下記コードを追加してプラグイン有効化

CakePlugin::load('TwigView');

app/Controller/AppController.phpにてviewClassの変更
(2系は$viewではないっぽい)

class AppController extends Controller {

    public $viewClass = "TwigView.Twig";
}

3)app/Plugin/views/twig.phpの編集
そのままだと動かなかったのでパスまわりの修正をする。
・Twigオートローダーの読み込み

// Load Twig Lib and start auto loader
App::import('Vendor', 'TwigView.TwigAutoloader', array(
'file' => 'Twig'.DS.'lib'.DS.'Twig'.DS.'Autoloader.php'
));
include_once __DIR__ . '/../vendors/' . 'Twig'.DS.'lib'.DS.'Twig'.DS.'Autoloader.php';

・・App::importがなぜかうまく読み込めてなかったので無理矢理include・・App::importの仕様がようわからんです。

・2系用にパス周りの修正とautoescape
まとめてこんな感じに書き換えちゃいました。
autoescapeは後述しますがちょっと問題があるのでお好みで。私はonにしました。

    function __construct(&$controller, $register = true) {

        parent::__construct($controller, $register);

        if($this->isCake2()) {

            // just collecting for str_replace
            $this->templatePaths = array(
                APP.'View',
                ROOT.DS.'cake'.DS.'Lib'.DS.'View'
            );
            $loader = new Twig_Loader_Filesystem(APP.'View');
        } else {
            $this->templatePaths = array(
                APP.'views',
                ROOT.DS.'cake'.DS.'libs'.DS.'view'
            );

            // we always look in APP, this includes error templates.
            $loader = new Twig_Loader_Filesystem(APP.'views');
        }
        // setup twig and go.
        $this->Twig = new Twig_Environment($loader, array(
            'cache' => TWIG_VIEW_CACHE,
            'charset' => strtolower(Configure::read('App.encoding')),
            'auto_reload' => (bool) Configure::read('debug'),
            //'autoescape' => false
            'autoescape' => true
        ));;

        // overwrite some stuff
        $this->Twig->addExtension(new CoreExtension);

        // activate |trans filter
        $this->Twig->addExtension(new Twig_Extension_I18n);

        // activate |ago filter
        $this->Twig->addExtension(new Twig_Extension_TimeAgo);

        // activate basic filter
        $this->Twig->addExtension(new Twig_Extension_Basic);

        // activate number filters
        $this->Twig->addExtension(new Twig_Extension_Number);

        if (isset($controller->theme))
            $this->theme =& $controller->theme;

        $this->ext = '.tpl';
    }

}

$this->isCake2()を使ってざっくりパスの切替をしています。
$this->isCake2は親で設定されるプロパティを使って判定しているので、親のコンストラクタの後に諸々の処理を移動しています。

4)使ってみる

コントローラーでこんな値を設定してみて


public function index() {

    $array_vars = array("foo" => "<bar>","hoge" => "<hogehoge>" );

    $this->set("hello", "<hello! It's a beautiful Twig World!!>");
    $this->set("array_vars", $array_vars);

}

出力してみます。ビューファイルの拡張子は.tplで(変更可能)

<div>
変数:
     {{hello}}
</div>
<div>
連想配列:
<ul id="sortable_list">
{% for k,v in array_vars %}
    <li> {{ k }} , {{ v }}</li>
{% endfor %}
</ul>
</div>
<div>
ヘルパー:
    {{form.create()|raw}}
    {{form.input('input')|raw}}
    {{
    form.input('email', {
        'label': 'Your E-Mail Address'| trans
        })
    |raw}}
    {{form.end()|raw}}
</div>

こんな感じに出力されます

<や’もエスケープされてますね。
オートエスケープをオンにするとヘルパーで生成したコードもエスケープされてしまうので|rawで出力しています。
ここらへんを考慮してデフォルトオフにしているんでしょうが、出来ればヘルパーで生成した場合は自動で生出力とかにしたい・・。

ざっくりまとめ

2.0対応の部分についてはまだドキュメントなども追いついてない部分がありますがとりあえず動かすことは出来ました。
ソースはすべてgithubで公開されているので自分もフィードバック送ったりしたいところですがgitの使い方がようわからん・・。使わないとなあ。

また、2系の仕様がイマイチよくわかってないのでTwigの読み込みがApp::importになってたりアヤシイ感じなのでここはこうじゃないだろ!というツッコミお待ちしております。


第57回PHP勉強会@東京で濃ゆい話を聞いてきた

11月 12th, 2011

初心者向け負荷軽減のはなし(taka0024/60分/php中級者~Webプロデューサーを目指す人へ)

@taka0024さん

・初心者向け負荷低減
・負荷軽減はお金になるよ!

最初にアンケート
1)立場は?
→プログラマーが多数

2)何やってる?
→自社サービスが多数

3)負荷軽減やってる?
→結構やってるが多数

ある日突然負荷軽減して欲しいといわれたら?
携帯SNS→プログラム作り直せば?→いやそりゃ無理っしょ→で、実際に負荷低減した話。
初心者向け、と銘打ってましたがDBの水平、垂直分割が出てきたり結構色々。

tips)
materはブラックホールエンジンを使ってレプリケーションさせる
クエリアナライザを使う
普通のクエリログもみる
MySQLのバージョンは新しいのを使おう。

気になったけど聞きそびれた点・・・)
具体的にどの程度の効果があったのか、ざっくりの数値かグラフレベルでみたいなあ。
インフラのコスト面での話。

触れてはいけないほうの闇の話(sasezaki/10分/PHP初級者)ykll

@sasezakiさん

・コードは書いたとおりに動く
・個々一番氏へのお礼がありました

どこまで書いていいかわからないが
・メンテナは大変・・・
・テストコードがis_array

雑感)
・なにそれこわい
・テストコードのパッチ・・は・・面倒・・なのかな?

PHP がいっぱい(@yuya_takeyama/10分/PHP のバイナリを日常的にビルドする人向け)

@yuya_takeyamaさん

node.js / Socket.io → リアルタイムwebapp
→node楽しいよnode

phpenv →バージョンの切替、pearとかも
php-build→こっちはビルドツール

php-build
・ビルドらくちん
・依存パッケージは自分でいれる
・依存関係でこけてる場合はtmpの中にログがはかれるのでみてね

phpenv globalでバージョン切替
phpenv-v each で各バージョンで実行出来る

php-buildのconfigureオプションは?
→定義ファイルでいじればいいよ。マルチバイトとかね。

pure PHPでのバイナリ処理(yoya/20分/PHPでのWebプログラミングに飽きてきた人)

@yoyaさん
スライド

・purephp→標準関数を使う
・2進数大好き

jpg、png、gifなど、仕様を知っていれば画像サイズとかはさくっと取れる

openpear/IO_Bit
・byte/bit処理するのに便利
・応用例→IO_SWF

PHP用回帰テストツール-PROVE(@yohgaki/10分~30分)

@yohgakiさん

・realip
→プロキシとか挟んだ場合にリモートアドレス取るの面倒だよね
→まあmod_rpafとか色々あるけど、ロジック側でさくっと何かするには便利かも

PROVE
・個人利用は無償
・PROVEは内部動作を場合によってはオーバーライドすることで環境に依存しないテストを実行

これ

perl Regexp::Assemble を php に移植する話(rti/25分/他の言語も気になる人)

@super_rtiさん
スライド

・多分今回一番盛り上がったスライド。懇親会の中だったのでツッコミ多数。
・perlの正規表現自動生成エンジン(って言い方あってるかな・・)perl Regexp::Assemble をPHPに移植する話
・一行ごとにPHPコードに置き換え。言語仕様の壁を結構無茶な方法で乗り越え・・。
・実行速度は(perl5.8.8とのPHP5.4の比較では)高速。十分実用ですね。
・メンテナ募集、githubにあります。
テストサイト。落ちるとくじらが飛ぶそうです。皆さん頑張ってくじらを出しましょう!

・・・この後の家電の話も相当面白かったんですが力尽きたので割愛。

総じて(事前にアジェンダみてわかってはいましたが)濃ゆい発表で非常に面白かったです!
あとハイパーのエンジニアとしてお声がけくださった皆様ありがとうございました。cakeの愚痴ばっかですいません。

最後に、会場提供してくださったVOYAGE GROUPさんありがとうございました。
第57回PHP勉強会@東京


CakePHPで直前のクエリをチェック

11月 6th, 2011
App::import('Model', 'ConnectionManager');
$db = ConnectionManager::getDataSource('default');
$this->log($db->getLog(), LOG_DEBUG);

こんな感じで。

thanks →@deeeki


Titanium環境構築メモ

7月 5th, 2011

昨日のWEBサービス開発者のはじめてのTitanium勉強会で諸々開発についていい話を聞いたのだけど、環境構築がすこぶる面倒だったので今のうちにメモしておく。

開始前に気づいて事前準備としてTitanium StudioとKichenSinkプロジェクトのダウンロードはやっておいたのだけど、進めていくうちにこれも足りねーってことになったので・・。

環境:Windows7(Home Premium) SP1

最終的に入れたもの

  • Titanium Studio

http://www.appcelerator.com/(要登録、Community)

  • JDK 1.6.0_26

http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u26-download-400750.html

  • Andoroid SDK

(これいれないとプロジェクトが作れない)

このうち足りなかったのはJDKとAndoroid SDK。

JREだと動かないので注意(javacとか使うので・・そりゃそうだ)。

パスを通すもの(環境変数)

  • JAVA_HOMEのパス(C:\Program Files\Java\jdk1.6.0_26)など
  • (多分)PATH(%JAVA_HOME%\bin)も通しておく

JDK、Andoroid SDK、Titanium Studioは結構ダウンロードに時間がかかるので気長にやりましょう。