ペアプログラミングまつり in 晴海

10/2-10/3の一泊二日でペアプログラミングまつりが晴海グランドホテルで開催されます。
偶然同じ日程の同じ会場でphp matsuriというイベントも開催されているそうです。
さっき思いつきました野良企画のでよろしくお願いいたします。
エディタやキー配列やIDEはグーパンチで決めればいいと思うのですが、
git, svn, php, pear, lime, phpunit, などがあればおもにぼくが楽しめると思います。

広告

10進数と16進数の変換メモ

10進数と16進数の変換メモ
php, ruby, javascript 比較
題材
32(10進数) <-> 0x20(16進数)の相互変換をする

ruby
$ irb
irb(main):001:0> “0x20”.hex
=> 32
irb(main):002:0> 32.to_s(16)
=> “20”
irb(main):003:0> “%b” % 32
=> “100000”
irb(main):004:0> “%o” % 32
=> “40”
irb(main):005:0> “%x” % 32
=> “20”

php
$ php -a
Interactive shell

php > echo hexdec(‘0x20′);
32
php > echo dechex(32);
20
php > echo decoct(32);
40
php > echo octdec(’40’);
32
php > echo base_convert(’32’, 10, 16);
20
php > echo base_convert(‘0x20’, 16, 10);
32

javascript (firebug console)
>>> parseInt(20, 16)
32
>>> parseInt(‘0x20’, 10)
0
>>> parseInt(‘0x20′, 16)
32
>>> 32.toString(16)
{ message=undefined source=undefined =undefined }
>>> ’32’.toString(16)
“32”

なんぞこれ ぐぐる
JavaScript で n 進数を扱う: Days on the Moon

サンプルコードに空白が開いてる  ピリオド2つ版もある

>>> 32 .toString(16)
“20”
>>> 32..toString(16)
“20”

えーなんだこれ

わかった ()でくくってやればいいのか
>>> (32).toString(16)
“20”

できた おしまい

参照先

ruby
riで探してよくわからなかったのでるりまのIntegerからいもづる
php
phpマニュアルをhexでサイト内検索していもづる
javascript
漠然とgoogleに頼る

yumでざっくりphp5.3を入れた

家の環境にようやくphpいれた
何入れるんだっけ?と覚えていなかったのでyumのlistみながら適当に入れた だいたいこんなもんだったようなうろおぼえ ひどい

$ yum list php\*
$ sudo yum install php php-pdo php-mysql php-pgsql php-xml php-pear php-mbstring php-cli php-common php-gd php-mcrypt php-readline

エラーログ用のディレクトリを作成して、errorログはそこに吐くように設定

$ sudo mkdir -p /var/log/php
$ sudo vim /etc/php.ini
error_log = /var/log/php/php_errors.log

$ php –version
PHP 5.3.2 (cli) (built: Mar 6 2010 08:33:02)

symfony 2009 Advent Calendarをこれから写経するところからはじめてみる
http://www.symfony-project.org/more-with-symfony/1_4/ja/

追記(2010-03-28)
これ写経ものじゃなかった やっぱりjobeetにする

追記(2010-04-03)
php-devel が抜けていた
pecl のモジュール入れるときにphpize が必要で、php-develに入っている

php5.3をmake install

php5.3を入れたのでconfigureオプションを書いておく。
$ ./configure –help
とにらめっこしたけれど最終的にはよく分からなかった。
checkinstallでrpmから入れたかったけれど下記エラーが解決できないのでめげた。シンボリックリンクもあるんだけど入らない。なぜかmake installだと入る。なぜだ。

# rpm -ivh /usr/src/redhat/RPMS/i386/php-5.3.1-1.i386.rpm

エラー: 依存性の欠如:        libcurl.so.4 は php-5.3.1-1.i386 に必要とされています
$ ./configure \
--prefix=/opt/php5_3_1 \
--program-suffix=531 \
--with-apxs2=/usr/sbin/apxs \
--enable-mbstring \
--enable-mbregex \
--enable-gd-native-ttf \
--enable-sockets \
--enable-exif \
--with-curl=shared,/opt/curl \
--with-gettext \
--with-gmp \
--with-openssl \
--with-zlib \
--with-layout=GNU \
--enable-ftp \
--with-gd=shared \
--with-mysqli=mysqlnd \
--with-mysql=mysqlnd \
--with-xmlrpc=shared \
--enable-dom=shared \
--enable-soap=shared \
--with-xsl=shared \
--enable-xmlreader=shared \
--enable-xmlwriter=shared \
--with-pdo-mysql=shared \
--enable-zip \
--enable-zend-multibyte \
--with-mcrypt \
--enable-pdo=shared \
--with-pdo-sqlite=shared \
--with-sqlite=shared
$ make
$ sudo make install

.bashrc
alias php5.3=’/opt/php5_3_1/bin/php531′
$ source ~/.bashrc

$ php5.3 -v
PHP 5.3.1 (cli) (built: Dec  6 2009 00:28:27)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies

結局curlが有効にならないけどいったんまあいいとする
make install のほうがチェックが適当なのかな

remiからyumでphp5.2.10を入れる

結論から言うと

# yum –enablerepo=remi update php –exclude=php*5.3*
これでremiからyumでphp5.2.10が入る

$ php -v
PHP 5.2.10 (cli) (built: Jun 21 2009 11:10:43)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies

apacheをreloadしてやって完了


phpのバージョンを5.2.8から上げようとしてremiを見ると5.3.0しかない。

murahashi kenichi: yumでないと使えない子なので UtterRambl …

yumでないと使えない子なので UtterRamblingsでphp5.2.11+mysql5.0 か remiでphp5.3.0+mysql5.1か の二択
とつぶやいたら @suzuki が手取り足取り教えてくれた。

suzuki: @sanemat メモった。http://bit.

@sanemat メモった。 http://suzuki.tdiary.net/20091004.html#p02

ただ、教えていただいた方法だとぼくの環境が悪いのかうまくいかなかったのでremiのforumを探す
php-pecl-apc
installation for php 5.2.10 (missing dependency) (Page 1) – User
support – Les RPM de Remi – Forums

Problems
with php 5.3, how to reinstall 5.2.10? (Page 1) – User support – Les
RPM de Remi – Forums

で、下記でいけそうな感じがしたのでやってみたらbingo

# yum –enablerepo=remi update php –exclude=php*5.3*
変にexcludeにマッチしちゃうものがあったらダメだけど、特にそういうこともなく、無事にphp5.2.10が入ったように見える

おしまい

返す刀でmysqlのバージョンも上げておいた

# service mysqld stop
# yum –enablerepo=remi update mysql

# service mysqld start

$ mysql –version
mysql  Ver 14.14 Distrib 5.1.39, for redhat-linux-gnu (i686) using readline 5.1

最終的に出来た環境は
php5.2.10 + mysql5.1.39 なり

「つらくないコードを書こう」という題でlimonadeの話をしてきた PHP勉強会@関東#46

第46回PHP勉強会@関東でLT「つらくないコードを書こう」という題でlimonadeの話をしてきました。

LT資料
http://www.slideshare.net/sanemat/20090930-phpstudy-limonade
デモ用コード
http://github.com/sanemat/ktsukishima/tree/phpstudy46

参加者のみなさんとust越しに見てくださった方には段取り含めた不手際でごめんなさいというしかない発表でした。でも後悔せずにまたやります。ありがとうございました。

以下デモでやりたかったことをまとめておきます。


デモでやりたかったこと

想定

http://example.com/
のドキュメントルート
/home/foo/app/public/

目標

サブディレクトリ下に携帯3キャリア対応のページを作成
ただし、ライブラリなど余計なファイルはドキュメントルート下におかないこと
http://example.com/limonade/

事前確認

下記ファイルを編集してapacheとvirtualhostが設定済みか確認
/home/foo/app/public/index.html

ファイル確認

$ cd /home/foo/app
$ ls -R
.:
public

./public:
index.html

この時点では./public/index.htmlのみ。

git clone

/home/foo/app/
下にlimonade+ライブラリ+サンプルファイルのlimonadeディレクトリを作る

$ git clone git://github.com/sanemat/ktsukishima.git limonade
Initialized empty Git repository in /home/foo/app/limonade/.git/
remote: Counting objects: 148, done.
remote: Compressing objects: 100% (74/74), done.
remote: Total 148 (delta 51), reused 146 (delta 50)
Receiving objects: 100% (148/148), 156.50 KiB | 150 KiB/s, done.
Resolving deltas: 100% (51/51), done.

limonadeディレクトリが出来たのでそこに移動

$ cd limonade

phpstudy46タグが振ってあるので、チェックアウト

$ git checkout phpstudy46
Note: moving to "phpstudy46" which isn’t a local branch
If you want to create a new branch from this checkout, you may do so
(now or later) by using -b with the checkout command again. Example:
  git checkout -b <new_branch_name>
HEAD is now at e3d6438… delete initial files

一階層上に戻る

$ cd ..

以下のファイルがgitリポジトリから引っ張ってこられた

$ ls -R
.:
limonade  public

./limonade:
lib  public  vendor  views

./limonade/lib:
AUTHORS-limonade  LICENSE-limonade  limonade.php

./limonade/public:
index.php  sample.css

./limonade/vendor:
HTML  LICENSE-HTML_CSS_Selector2XPath  Net  PEAR.php  Text

./limonade/vendor/HTML:
CSS  CSS.php  Common.php

./limonade/vendor/HTML/CSS:
Error.php  Mobile.php  Selector2XPath.php

./limonade/vendor/Net:
UserAgent

./limonade/vendor/Net/UserAgent:
Mobile  Mobile.php

./limonade/vendor/Net/UserAgent/Mobile:
Common.php   DoCoMo      EZweb.php  NonMobile.php  Willcom.php
Display.php  DoCoMo.php  Error.php  SoftBank.php

./limonade/vendor/Net/UserAgent/Mobile/DoCoMo:
ScreenInfo.php

./limonade/vendor/Text:
Pictogram

./limonade/vendor/Text/Pictogram:
Mobile  Mobile.php

./limonade/vendor/Text/Pictogram/Mobile:
Common.php  Docomo.php  Exception.php  Ezweb.php  Nonmobile.php  Softbank.php  data

./limonade/vendor/Text/Pictogram/Mobile/data:
docomo_convert.json  ezweb_convert.json  softbank_convert.json
docomo_emoji.json    ezweb_emoji.json    softbank_emoji.json

./limonade/views:
layout.default.html.php  qa_how_to_start.html.php

./public:
index.html

ちなみにこのlimonade本体は0.4のブランチにauto_globals_jit onでも動作するパッチをあてたもの
またディレクトリ構成をフレームワーク付属のものとは変えています

limonade

まだここには何もない
http://example.com/limonade/

ドキュメントルートに移動

$ cd /home/foo/app/public/

追加アプリのpublicディレクトリにシンボリックリンクを張る

$ ln -s ../limonade/public limonade

Hello limonade!
http://example.com/limonade/

How to Start limonade?
http://example.com/limonade/?/how_to_start/

$ cd /home/foo/app/limonade
$ vi views/qa_how_to_start.html.php

before(), after() で分かりやすいフック

limonade/public/index.php
のbefore(), after() の記述によって
テンプレート内では$emoji変数でdomomoの基本絵文字が3キャリア互換で記述できる
たとえば<?=$emoji[154];?>とやれば爆弾の絵文字が出せる。

(ここがモンスターメソッドになってしまったのでもうちょっとましな設計が必要)

before()でしていること
Net_UserAgent_Mobile呼び出し
Text_Pictogram_MobileでdocomoのUTF-8絵文字としていったん全部扱う
テンプレート記述を中間記法に変換する

after()でしていること
Net_UserAgent_Mobileの判別でdocomo, au, softbankにそれぞれ振り分け
キャリアごとに
xmlのencodingとhtmlのheadを表示する文字コード表記に置き換え(docomo, auはShift_JIS, softbank, pcはUTF-8)
出力文字列の文字コードを変換
docomoの場合のみHTML_CSS_MobileでCSSをインラインに変換
絵文字をキャリアごとに出力フォーマットを変えて出力
headerのContent-Typeをキャリアごとに出力

目標確認

サブディレクトリ下に携帯3キャリア対応のページを作成
ただし、ライブラリなど余計なファイルはドキュメントルート下におかないこと
http://example.com/limonade/
達成!

メッセージ

コアとちょっとのファイルでやりたいことが実現できる
ファイル数が少ないこと、ファイルが小さいこと、それももちろんだけれど、
コアも含めたアプリ全体の見通しのよさがlimonade一番のメリット

how to install memcached and to use in php and ruby

memcachedのインストール、設定とphp, rubyからの使い方。
php, ruby間でのmemcache越しのデータやり取り。覚え書き。
rubyはirbから、phpはphp -a からそれぞれ対話型で呼び出し。

インストール
# yum –enablerepo=remi,rpmforge,epel,centosplus install memcached
version 1.4.1 installed from remi

php
# pecl install memcache
version 2.2.5 installed

# yum install php-pecl-memcache
ではだめ。
インストール完了したように見えるがエラーが発生

ruby
$ sudo gem install cached_model

seattle.rb作のrails用(activerecord用)プラグイン
そのうちこれもいるよね、ということでまとめて入れてしまう
同時にmemcache-clientがインストールされる
必要なのはmemcache-client

サービス
# service memcached start
# chkconfig memcached on

php 使い方
$m = new Memcache;
$m->addServer( ‘127.0.0.1’, 11211 );
$m->add( ‘foo’, ‘bar’, 0, 3600 );
echo $m->get( ‘foo’ );
bar

ruby使い方
require ‘rubygems’
require ‘memcache’
cache = MemCache.new( ‘127.0.0.1:11211’ )

cache[‘hoge’] = {‘piyo’ => ‘piyopiyo’}
=> {"piyo"=>"piyopiyo"}
p cache[‘hoge’]
{"piyo"=>"piyopiyo"}
=> nil

phpからruby
$m->add( ‘foo’, ‘bar’, 0, 3600 );

p cache.get( ‘foo’, true )
"bar"
=> nil

rubyからphp
cache.set( ‘eleven’, ’11’, 0, true )
=> "STORED\r\n"

echo $m->get( ‘eleven’ );
11

やりとりできるのは文字列型に変換されたものなので注意
というよりはたまたまうまくやり取りしているように見えるだけの気がする
後ろ側はメモリ上のkeyvalueストアなんだから、調べてきちんと渡せば出来そうだけど
用途がなさそう
jsonにしてつっこんで別言語から引っ張り出す方がまだ現実的?
それだと言語別のmemcacheにした意味があんまね。

rubyからphp
ache.set( ‘eleven’, [1,2,3], 0, true )
=> "STORED\r\n"

var_dump( $m->get( ‘eleven’ ) );
string(3) "123"

phpからruby
$m->set( ‘unko’, array(0,1,2,5), 0, 3600 );
var_dump( $m->get( ‘unko’ ) );
array(4) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [2]=>
  int(2)
  [3]=>
  int(5)
}

cache.get( ‘unko’, true )
"a:4:{i:0;i:0;i:1;i:1;i:2;i:2;i:3;i:5;}"
=> nil

参考リンク
[memcached] memcache-client導入手順(Rubyクライアント) – Life with IT
http://l-w-i.net/t/memcached/0install_003.txt
ruby,php,perlでmemcacheの中身を使い回す | Parse Error
http://sugizou.jugem.jp/?eid=132
java で memcached に入れたものを ruby で取り出す (その逆も) – Learning to be Me
http://d.hatena.ne.jp/bubbles/20081029/1225291896

PHPのORM(ググったー)

どれも使ったことないけどググったのでまとめておく
目的はlimonade or fitzgerald から使うこと

●フレームワーク別

zend framework
  Zend_Db
cakephp
  railsのactiverecordっぽい独自実装
symfony
  propel or doctrine

ざっくりググった印象
・Zend_Dbいまいちだよね→doctrine使いたい
・propelからdoctrineに移行すべきか否か
・symfony使ってる人たちが参考になりそうだ(フレームワーク内製でないから)
(参考)
Doctrine vs. Propel: 2009 update | CodeUtopia – The blog of Jani Hartikainen
http://codeutopia.net/blog/2009/05/16/doctrine-vs-propel-2009-update/

なのでこの中だとdoctrineがよさそう

http://develop.ddo.jp/new-tech/php/framework/symfony/memo12/orm/propelとdoctrineの違い
propelとdoctrineの違いをjobeet(symfonyのサンプルプログラム)で比較
TRAJOIN
http://trajoin.1ms.jp/original/ja/1.2/jobeet/en/03.txt

違いを見る以前にどっちもわりとげんなりしたので、必要な部分だけPDOで書いちゃうのが正解な気がしてきたが進む

●propelとdoctrine以外

Doctrine vs. Propel: 2009 updateの中であがっていたのが
Outlet PHP ORM と PHP ActiveRecord の二つ。
rails厨としてはphp-activerecordが気になるけどSupported Databases MySQL, SQLite,
(oracle and postgres very soon) って書いてあったのでやめる。

●ライブラリリンク先

Propel
http://propel.phpdb.org/trac/
Doctrine – PHP Object Relational Mapper
http://www.doctrine-project.org/
Welcome – Outlet PHP ORM
http://www.outlet-orm.org/site/
PHP ActiveRecord in Launchpad
https://launchpad.net/php-activerecord

●結論

(目的はlimonade or fitzgerald から使うことだから)
ORMでなくとりあえずPDOで
CRUDきちんと要るならcakephpかsymfony+doctrine使うでしょ

PHP懇親会でLT「PHP: The Good Parts」してきた

第45回PHP勉強会@関東(
PHP懇親会)

の全員LTで、はじめてLTをしちゃいました。自己紹介+自分の疑問質問を言う、というフリーダムなLTにしたのでちょっとドキドキしました。

なんだかんだいって自分なりに貢献できることってあるよね、という実感ができるイベントでした。

===
2009-08-01 15:30-
@六本木 はてな

@sanemat LT資料「PHP: The Good Parts」
http://www.slideshare.net/sanemat/20090801phpstudy-sanemat

じぶんのLTが気になって食事に集中できないかと思いきや、思いっきり飲み食いしてテンションがあがる。
自分の数人前からはさすがにお酒控えたけどそのぐらいです。

@kakeibotの項目分類がまともに作ってあって面白い。

===
懇親会
Keep
 会場運営ありがとうございます
 プロジェクタが揺れないようにエアコンの風を当てないなど細かい勉強会Tipsがよくできてる
 あたたかい目で見てくれた
Problem
 開催負荷高くない?平気?
Try
 開催負荷を抑えるにはどうしよう

じぶん
Keep
 初LTおつ
Problem
 全員のLTタイトルぐらいメモっておくべきだった
 帰り日比谷線で寝ちゃって何度もいったりきたりした
 想像以上にてんぱっていたらしい
 準備不足
Try
 同じ話すことでももっと切り口と持っていき方を高めよう

なお、@kakeibotが言うことは正しいので、PHP懇親会は「勉強」とのことです。ありがとうございました。

フレームワークの話を聞いてきた

events.php.gr.jp – 第42回PHP勉強会@関東
http://events.php.gr.jp/events/show/75
に参加してきました。

CMSとフレームワークの話
CMSの中にかんたんなCRUDのアプリを入れたい、逆にフレームワークの中にCMSを組み込みたい、という要望はよくある。特に利用者の学習・習熟を考えるといちいちリセットしていられないというのはわかる。検討はしても最終的に組み込んだことはまだないので、実際に使っている(使おうとしている)話は参考になった。

複雑なSQL使ったときもモデルの便利機能使いたい話(propel)
レールから外れるときに「レールから外れるとフレームワーク使えねー」にいくのではなくどうにかしてレールに戻す方法考えれば楽なので、あとはその戻す方法だという話。
具体的には、DBのテーブルと1対1では紐づかないモデルの話。自分でレコードセット取ってきて、レコードセットを解釈してモデルの一般的なオブジェクトに落とし込むところに、自分で突っ込んでやればよい。そういうのはメソッド追っかけていけば直感で分かるとのこと。
参照だけなんだからもっとやりようあるんじゃね?とか同じモデルの中においた方が見通しよくね?とかはたぶん話の本質でないので措く。

じゃあどこにまとめるかって言うのは考える余地があると思う。syuukeisとかいうモデルは作りたくないもんなあ。

サービス志向の話(mobasif)
携帯向け軽量フレームワークの話。サービスをすばやくリリースして回収するところを志向してすべてが作られている。開発の機動力重視。アプリの層が薄いこと(=軽いこと)による処理速度重視。

ディスパッチャにユーザ認証が組み込み。
ユーザ認証は、端末固有番号を用いたいわゆる「かんたんログイン」がメイン?
いきなり書くときはべたっとSQLを書くときもある、再利用するときにはじめて切り出す。
フレームワークにも手を入れる。サービスごとのmobasifがあり、それは公開しているものともまた違う。スケルトンとしてのmobasif。

互いのサービスが疎になっていて(なっているのかな?)、インターフェイスさえ変わらなければ別にいいのかな、とも思う。

全体的に思ったこと1 テスト
フレームワークは自身のプロジェクトで十分テストが行われているので、フレームワーク自体を疑うテストコードは書かない。に染まりつつある自分としては、それを書かざるをえないのは直感的にいやだ。でも、きっとそこは見通しのよさでカバーするんだろう。というか本体に直接手を入れようと、継承してきて自分で手を入れる仕組みが出来ていようと、結局把握してないとダメなのは変わらないのか。

全体的に思ったこと2 情報が来てないのかそれとも感じていないのか
自分の話。アウトプットとインプットの比率がいびつで、アウトプット不足を個人的にはどうにかしたいのだけれど、そもそもインプットも足りてないのを実感。過多なぐらい情報はあるんだから集め方と飲み込み方が悪いんだなあと思う。

全体的に思ったこと3 ライブラリ
pear, pear2, openpear, github, coderepos,
…場はいっぱいあるんだけどどうライブラリを利用したものかずっと困り中。どのライブラリがトレンドでどれがdeprecatedなのか追いつけていない。もっと低次元で言えば、検索で引っかかったブログのエントリ中のコードをコピペするのはさすがにもうやめたい。

===

Keep
会場運営ありがとうございました。
thechaw(チョー)…cakephp界のgithubを教えてもらった。

Problem
電源はあるけど自分の席まで届かなかった。次は延長コードとタップ的なものを持参する。

Try
懇親会で質問できたけど、勉強会でも質問する。
勉強会では名札してたけど、懇親会では外してしまった。つけとく。