2009/12/06

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 のほうがチェックが適当なのかな

2009/10/06

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 なり

2009/10/03

「つらくないコードを書こう」という題で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一番のメリット

2009/09/23

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

2009/09/22

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使うでしょ

2009/08/06

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懇親会は「勉強」とのことです。ありがとうございました。

2009/04/30

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

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
懇親会で質問できたけど、勉強会でも質問する。
勉強会では名札してたけど、懇親会では外してしまった。つけとく。

2008/01/16

2chトリップを変換するfilterKey2Trip

2ちゃんねるのトリップを変換する関数filterKey2Tripをまとめました。phpです。

UTF-8、EUC-JP、Shift_JISで確認済みです。EUC-JPの場合のみPHP versions 5.2.1以上が必要です。

マルチバイト対応 str_replaceのmb_str_replaceを
mb_str_replace (mb_replace) - fetus
http://fetus.k-hsu.net/document/programming/php/mb_str_replace.html
から持ってくる必要があります。

/**
 * filterKey2Trip
 *
 * 「name#key」を「name ◆trip」に変換するフィルタです
 * 同時に◆(\x81\x9f)を◇(\x81\x9e)に変換します
 * PHP versions >= 5.2.1
 *
 * Copyright (c) 2008 sanemat
 *
 * @param   string   $beforeFilter  変換前文字列
 * @param   string   $useEncoding   変換前文字列の文字エンコーディング 省略時はUTF-8
 *                                  UTF-8なら'UTF-8', EUC-JPなら'cp51932',
Shift-JISなら'SJIS-win'
 * @param   string   $tripEncoding  トリップ変換時の文字エンコーディング 省略時はSJIS-win(通常SJIS-win)
 * @return  string   $afterFilter   変換後文字列
 * @license http://www.opensource.org/licenses/mit-license.php The MIT License
 * @link    http://sane.justblog.jp/blog/2008/01/2chfilterkey2tr.html
 *
 *
 * mb_str_replace
 * マルチバイト対応 str_replace
 * @version     Release 2
 * @author      HiNa (hina@bouhime.com)
 * @copyright   Copyright (C) 2006-2007 by HiNa(hina@bouhime.com).
 * @link
http://fetus.k-hsu.net/document/programming/php/mb_str_replace.html
 *
 * 参考
 * ◆ 全サーバトリップ統一作戦
 * http://qb3.2ch.net/test/read.cgi/operate/1067245837/
 * XOOPS Cube日本サイト - BluesBBにトリップ機能を!
 * http://xoopscube.jp/modules/xhnewbb/viewtopic.php?topic_id=246&forum=2
 **/
function filterKey2Trip($beforeFilter, $useEncoding = 'UTF-8',
$tripEncoding = 'SJIS-win')
{
       $afterFilter = '';

       mb_convert_variables($tripEncoding, $useEncoding, &$beforeFilter);
       $beforeFilter = mb_str_replace("\x81\x9f", "\x81\x9e",
$beforeFilter, $tripEncoding);

       if(preg_match('/([^#]*)#(.+)/', $beforeFilter, $match)) {
               $salt = substr($match[2]."H.", 1, 2);
               $salt = preg_replace("/[^\.-z]/", ".", $salt);
               $salt =
strtr($salt,"\x3A-\x40\x5B-\x60\x00-\x2D\x7B-\xFF","A-Ga-f.");
               $trip = substr(crypt($match[2], $salt),-10);
               $afterFilter = $match[1]."\x20\x81\x9f".$trip;
       }else{
               $afterFilter = $beforeFilter;
       }

       mb_convert_variables($useEncoding, $tripEncoding, &$afterFilter);
       return $afterFilter;
}

関連
◆ 全サーバトリップ統一作戦
http://qb3.2ch.net/test/read.cgi/operate/1067245837/
XOOPS Cube日本サイト - BluesBBにトリップ機能を!
http://xoopscube.jp/modules/xhnewbb/viewtopic.php?topic_id=246&forum=2
2chトリップを吐き出す関数 - ?D of K
http://d.hatena.ne.jp/ofk/20070303/1172911262
fixed-area :: [PHP] 2ちゃんねるトリップ算出関数
http://www.fixed-area.com/blog.php?id=8

2007/09/23

MVCのひな型

models/subject.php

<?php
class Subject extends AppModel {
}

controllers/subjects_controller.php

<?php
loadModel("Subject");
class SubjectsController extends AppController{
       public $uses = null;

       function index() {
               $dao = new Subject();
               $this->set('subjects', $dao->findAll());
               }
}

views/subjects/index.thtml

<h1>投稿</h1>
<table>
   <tr>
       <th>Id
       <th>名前</th>
       <th>お題</th>
   </tr>

  <!-- ここで、 $subjects 配列のループをまわして、投稿情報を printing out します。 -->

   <?php foreach ($subjects as $subject): ?>
   <tr>
       <td><?php echo $subject['Subject']['id']; ?></td>
       <td>
           <?php echo $html->link($subject['Subject']['name'],
"/subjects/view/".$subject['Subject']['id']); ?>
       </td>
       <td><?php echo $subject['Subject']['subject']; ?></td>
   </tr>
   <?php endforeach; ?>

</table>

MVCを一気に。ただ、subjectにコントローラやビューって必要なのかな?お題一覧のテーブルを出してそこを表示したり変更したりするような機能は要らない気がするんだなあ。何に何が必要なのかがイマイチよくわかってません。余計なものを作ってしまった分には後で消すのは簡単なのでとりあえずそういうことで。

この辺を参考にしました。
Blog-side CakePHP わかりずらい3点
http://blog.takeda-soft.jp/blog/show/190
Blog-side CakePHP わかりずらい+2点
http://blog.takeda-soft.jp/blog/show/192

2007/09/22

セットアップとDBの準備

xreaにワラワラwebアプリ置くことを考えると

  1. CakePHP のコアライブラリ - /cake
  2. アプリケーションコード(コントローラ、モデル、レイアウト、ビューなど。) -/app
  3. アプリケーションの webroot ファイル(画像、javascript, CSS など) -/app/webroot

1はすべて共通でpublic_html外
2はアプリごとにpublic_html外
3はアプリごとに(ドメインごとに)public_html内

にそれぞれ置く必要があります。

3.4.?CakePHP のセットアップ
http://cakephp.jp/doc/ch03s04.html
の日本語マニュアルにそのまんまの記述があるので指示通りに設定しました。

次はDBの暫定テーブルです。

CREATE TABLE 'subjects' (
   id INTEGER PRIMARY KEY UNIQUE NOT NULL,
   name TEXT NOT NULL,
   subject TEXT NOT NULL,
   status TEXT NOT NULL,
   host TEXT NOT NULL,
   mobilenum TEXT DEFAULT '',
   answersec INTEGER NOT NULL,
   votesec INTEGER NOT NULL,
   created TEXT NOT NULL,
   modified TEXT DEFAULT ''
)

今のところDBはこんな感じにしておきます。

次にデータベース接続の設定config/databaseです。

class DATABASE_CONFIG {
       var $default = array(
               'driver' => 'sqlite',
               'persistent' => false,
               'host' => '',
               'login' => '',
               'password' => '',
               'database' => '../../path/to/database.db',
               'prefix' => ''
       );
}

webroot/indexの中で設定した定数をDBのパスに使おうとしてダメだったので、とりあえず相対パスで指定しました。

ブログチュートリアル設定の名残(config/routes.phpがそのまま)だからpostsコントローラがないぞ!って怒られますが、これは次以降のエントリで。

追記 2007.09.23

データベースのパスをフルパスに変えました。

class DATABASE_CONFIG {
	public $default = array(
		'driver' => 'sqlite',
		'persistent' => false,
		'host' => '',
		'login' => '',
		'password' => '',
		'database' => 'c:/path/to/database.db',
		'prefix' => ''
	);
}

cakeちょっとずついじる宣言

CakePHPのチュートリアルを動かしてみてもいまいちわかったようなわかってないような状態。さらには、いろんな人が掲示板なりblogなりで書いているtips的なところまで自分が追いついていないので、みんなが何を喋っているのかわからない。

かといって基本的なシステムを備えたものを習作として作る、というのは性に合わない。やっぱり例によって自分が欲しい適当なものを作っていきなり実戦投入してみる、という方向性で。

  • 毎日ちょっとずつでもいいから手を動かす
  • 箱(デザイン)から決めるとモチベーションが上がる
  • ちょっとずつ書くことで諦めにくくする

このあたりの先人の知恵を参考にしていこう。

2007/09/16

Cakeブログチュートリアルで早速詰まる

CakePHP 1.2.0.5427alphaでブログチュートリアルをそのまま実行してみる。

Notice: Method input() is deprecated in HtmlHelper: see FormHelper::input or FormHelper::text in /path/to/cake/libs/view/helpers/html.php on line 608

とかいうエラーがいくつか出る。 いくつかのメソッドはdeprecatedな上、submitなんてメソッド無いよ、ってことらしい。 わからないなりにgoogleりながら修正。
Nabble - CakePHP - (HtmlHelper::submit) Deprecated: Use FormHelper::submit instead | switch off?
http://www.nabble.com/(HtmlHelper::submit)-Deprecated:-Use-FormHelper::submit-instead-%7C-switch-off--t3584569.html

controllerに追加

public $helpers = array('Html', 'Form',);

add.thtmlを

<h1>投稿の追加</h1>
<form method="post" action="<?php echo $form->url('/posts/add'); ?>">
<p>
タイトル:
<?php echo $form->input('Post.title', array('size' => '40')); ?>
<?php echo $form->error('Post.title', 'タイトルは必ず入力してください。'); ?>
</p>
<p>
本文:
<?php echo $form->textarea('Post.body', array('rows' => '10')); ?>
<?php echo $form->error('Post.body', '本文は必ず入力してください。'); ?>
</p>
<p>
<?php echo $form->submit('保存'); ?>
</p>
</form>

に書き換えることでエラー無しに作動。

OOP理解するには使いたいフレームワークを利用しながらソース読むのが一番速いよ、とのアドバイスを実行しようとしていた矢先、出だしで詰まると取っ掛かりすらさっぱりわからなくてちょっと困りました。 MVCやらコントローラやらヘルパやら少しずつ理解していくつもり。

2007/06/23

SimpleXMLに渡す前にマルチバイト関数で変換

實松アウトプット: 自分で作ったAPIを自分で使うのに苦戦中
http://sane.justblog.jp/blog/2007/06/api_3a46.html

$xml = @simplexml_load_file($url);

で変換出来たり出来なかったりする問題は

$xmlstr = file_get_contents($url);

mb_convert_variables('UTF-8','SJIS-win',&$xmlstr);
$xmlstr = str_replace('encoding="Shift_JIS"', 'encoding="UTF-8"', $xmlstr);

$xml = new SimpleXMLElement($xmlstr);

に変える事で解決。文字コード弄るの怖くて出来るだけ素通しするようにしてきたのですが、機種依存文字まで含めてちゃんと変換できていました。ちゃんと変換できるのならば、データベースからiwnid,nonyuから全部含めてUTF-8にしたかったなあ。Shift_JISをpreg_matchするのはしんどい…。後の祭り。

2007/06/18

自分で作ったAPIを自分で使うのに苦戦中

iwnidAPIで引っ張り出せるのはShift_JISのXML。これをSimpleXMLに掛けるとタイトルがUTF-8に変換されて返ってきちゃう。simpleXMLがShift_JIS読めないからなんだろうけど、なんとかShift_JISのままで返るようにしたい。2バイト文字を<![CDATA[ ]]>の中に入れておけば無理やりなんとかならないものかな。

多分setなんとかみたいな設定系のものをsimplexml_load_fileの前に入れればいいんだろうけど、設定が見つけられず。苦戦中。

2007/06/10

autoPrepareとautoExecuteのwhere句

PEAR::DBのautoPrepareとautoExecuteはINSERT文やUPDATE文書かなくていいので便利です。プレースホルダで勝手にエスケープしてくれるので重宝しますが、where句はエスケープせずそのまま使われるとマニュアルに書いてあります。だからwhere句にプレースホルダ使いたい時だけはsql文書いて対応しています。でもせっかくautoExecute使ってるのに混在するのは気になります。

実際私がwhere句に用いる部分、特にUPDATE文はプライマリキーでしかも連番をインクリメントしてる部分なのでわざわざエスケープする必要も無いんですが、「ここは生の文が使われるからSQLインジェクションに気をつけるんだぜ!!」って警告してあるところに外部由来の変数流し込むのは後から見直すときにちょっと気になりそう。そこに入れる前に変な入力は一応はねてるんだけど、この変数がなんなのかについて追っていってみないときちんと安全かわからないのではイマイチ。

PEAR::AuthのsetAuthDataでハマる

getAuthDataでテーブルからデータ引っ張ってこれるんだからsetAuthDataで書き戻せそうに見えます。マニュアル読んでもそんな感じですし。でもだめ。ぐぐってみたところ

OKWave pear のAUTHでsetAuthDataで登録できません 教えてください http://okwave.jp/qa2138626.html

この回答読む限りsetAuthDataいみねええ。PEAR::DBで書き戻して解決したけど、もう。

2007/06/03

validate2chThread - validate 2ch thread

/** validate2chThread - validate 2ch thread
  *
  * Description
  *   bool validate2chThread ( string $URL [, string $mode ] )
  *   Validate 2ch Thread from URL.
  *
  * Parameters
  *   URL
  *     The input string.
  *   mode
  *     Let you define What type of 2ch URL you want to validate.
  *     "2" matches 2ch, "b" matches bbspink, "m" matches machiBBS,
  *     and its default is "2bm".
  *       ex) mode="2b" matches 2ch and bbspink.
  *
  * Return Values
  *   Returns TRUE if valid 2ch thread, FALSE if not.
  **/
function validate2chThread($URL,$mode ="2bm")
{
  $domain = array();
  $domains ="";
  $pattern = "";
  
  if( strpos($mode, "2" ) !== false){ $domain[] = "2ch\.net"; }
  if( strpos($mode, "b" ) !== false){ $domain[] = "bbspink\.com"; }
  if( !empty($domain) ){
    $domains = implode("|", $domain);
    $pattern = "^http://[0-9a-zA-Z]+\.({$domains})/test/read\.cgi/[0-9a-zA-Z]+/[0-9]{9,10}(/?|/[0-9a-zA-Z_\-/]+)$";
  }
  
  if( strpos($mode, "m") !== false ){
    $pattern = ( empty($pattern) ) ? "^http://[0-9a-zA-Z]+\.machi\.to/bbs/read\.pl\?BBS=[0-9a-zA-Z]+&KEY=[0-9]{9,10}$" : "({$pattern}|^http://[0-9a-zA-Z]+\.machi\.to/bbs/read\.pl\?BBS=[0-9a-zA-Z]+&KEY=[0-9]{9,10}$)";
  }
  
  return preg_match("`".$pattern."`", $URL) ? true : false;
}

2007/05/14

nonyu b0.1.0

[完成] datを読んで表示する簡易read.cgi出来ました。

スレ削除、レス削除機能付きですがsubject.txtとindex.htmlの作成がiwnidに任せっきりなのでどう公開していいのかよくわかんなかったりする。

[要対策] 与えられたdatを無条件で読み込んでしまっているので、妙なdatを拾ってきたりdat取得先が変なdat作ってたりするとそれを実行してしまう。

dat中に出てくるタグって<br>と<b>と<a>だけかな。名前欄に出てくるのが<b>(ただしdatには</b><b>として出てくる)、日付のところに<a>、本文に<br>と<a>のはず。

これらを残してstrip_tags
→この三つを他の文字に置き換えてhtmlspecialchars_decode
→htmlspecialchars
→置き換えたものを戻す

これでいいのかな? なんかもうちょっといいやり方はないものか。

2007/04/29

車輪の再発明read.cgi編

独自の削除フラグを持ったread.cgiのphp版を作ろう。

もうちょっと正確に言うと独自の表示しないフラグを持ったread.cgiのphp版。表示部分はdatに残ってるレスアンカーのリンクやbe,株のリンクを取っ払った簡易表示。理想としたらにくちゃんねるみたいな多機能だったり自分で表示形式を選択して記憶したりだったりなの作れたらいいんだろうけど、というかスキルがあれば作りたいけどcookieとjavascriptを1から勉強しなきゃいけないので無理。

2007/04/01

iwnid b0.1

iwnid b0.1が完成しました。fsockopen使ってHEADで更新確認はするしGETで差分取得はするしで実用に耐えます。

始めたころに書いた、というか公式マニュアルとその下のユーザー投稿からあまり意味もわからずにコピペした部分が今ならもう少し最適化して書ける気もします。がその辺はいまさらって感じもするのでペンディング。

問題は条件に合うサーバがそう多くないことです。容量の関係でどうしても海外無料サーバ中心に探すことになりますが、fsockopenが使えなかったり、2chへのアクセスが制限されていたり。日本語圏ならサーバの危険な雰囲気を感じ取れることもあるけど、英語圏だとよくわかんないです。

さてあとはエラー処理とパーミッションがらみのfixがしばらく必要ですね。

2007/03/29

文字コードの取り扱い

文字コードって環境に合わせて相互変換すればいいわけじゃないのか。 shiftjis→utf8→shiftjisに変換すると从*'v')→从*?v?)に化ける。

文字コードはそのまま、ひたすらそのまま触らずに変数に入れっぱなしにするのが吉と。内部では出来るだけutf8で、と勝手に思い込んでたのは間違い。 subject.txtの出力方法再調整・index.htmlをutf8じゃなくてshiftjisで吐き出すように今までのを書き換える必要アリ。

2007/03/27

見えてきたけど放棄して楽な道へ

實松アウトプット: 配列の操作が難しい の続き。なんだか見えてきた。

$dat_hand_array[y][0]を配列$y0arrayに取得。
$dat_auto_array[x][0]を$y0arrayと比較して、$y0arrayに無い場合にxを返す。
返ってきたxと$dat_auto_arrayで$dat_x_arrayを作る。

こんな感じかな?

いや、やっぱいいや。グダグダ考えずに一次元目のキーにdatのキー入れちゃった方が全然楽そ

配列の操作が難しい

二次元配列の操作が難しい。

$dat_hand_array
Array
(
    [0] => Array
        (
            [0] => 1173338640
            [1] => http://ex22.2ch.net/test/read.cgi/morningcoffee/1173338640/
            [2] => 1174895506
            [3] => hand
            [4] => 249

        )

    [1] => Array
        (
            [0] => 1173423620
            [1] => http://ex22.2ch.net/test/read.cgi/morningcoffee/1173423620/
            [2] => 1174895506
            [3] => hand
            [4] => 922

        )

    [2] => Array
        (
            [0] => 1173060327
            [1] => http://ex22.2ch.net/test/read.cgi/morningcoffee/1173060327/
            [2] => 1174895566
            [3] => hand
            [4] => 423

        )

)
$dat_auto_array
Array
(
    [0] => Array
        (
            [0] => 1173060327
            [1] => http://ex22.2ch.net/test/read.cgi/morningcoffee/1173060327/
            [2] => 1174895566
            [3] => auto
            [4] => 236

        )

    [1] => Array
        (
            [0] => 1173340422
            [1] => http://ex22.2ch.net/test/read.cgi/morningcoffee/1173340422/
            [2] => 1174895842
            [3] => auto
            [4] => 36

        )

)

  • $dat_auto_array[x][0]の値の中で$dat_hand_array[y][0]の値の中に無い場合、そのx番目の配列を$dat_x_arrayに次々抜き出す。
  • $dat_hand_arrayと$dat_x_arrayをくっつけて$dat_all_arrayを作る。

一個目の操作が出来ね

最近のトラックバック

information

  • author : sanemat
    表記はsanemat あるいは SANE もしくはsanematsu, sane
    sanemat's portfolio
    (murahashi kenichi)
  • サイト内検索
ブログ powered by TypePad