かばだんなさん かく語りぬ Header Image

PHP から Zephir の拡張モジュールを使用する

前々回作った環境で前回ビルドした Zephir の拡張モジュールですが、今回はPHPのプログラムから拡張モジュールを呼び出してみましょう。

… 続きを読む



Zephir をWindows(64bit)に導入する。(ビルド編)

さて、前回 Zephir の環境構築までおこないました。今回は実際にZephirで作ったプログラムを使ってみましょう。

… 続きを読む



Zephir をWindows(64bit)に導入する。(環境構築編)

さて、Zephir の評価をしています。

Zephir というのはPHPのextentionを作成するための言語とツールのセットです。言語としての見た目は PHP に近いため PHP のエンジニアにも取っつきやすく、ツールとしてはこのZephirで書いたプログラムをC言語のプログラムに変換(プリコンパイル)してくれるツールがセットになっています。
つまりコンセプトとしては「PHPの拡張機能を C言語で作るのは敷居が高いので、PHPに近い言語で作れるようにしよう」というものです。

ところがこの Zephir、まだ情報が少なくて、特に Windows環境でのコンパイルについては、コチラに書かれているとはいえ、説明がちょっと不親切というか言葉足らずなため、HelloWorldを作ろうとしただけで四苦八苦です。
ということで、今日は私のやり方で Zephir の環境構築からコンパイルまで。

… 続きを読む



ZephirLexer の導入に手こずった

どうもご無沙汰しております。かばだんなさんです。

さて、最近思う所があってZephirLexerを導入しようと思ったのですが、手順の通りコマンドを流しても、下記の通りうまく認識されないようです。

    from zephir.zephir import ZephirLexer
ImportError: No module named zephir.zephir

インストールされているpythonのパッケージを見ると

$ pip freeze
zephir==0.2

と、ちゃんと入っているようなのですが・・・。

で、結論なのですが、私の環境では

[zephir-lexer]$ touch zephir/__init__.py

としてから、

[zephir-lexer]$ python setup.py install --force

といったように再度導入しました。

これで

$ python
>>> import zephir.zephir
>>> dir(zephir.zephir)
['Comment', 'ExtendedRegexLexer', 'Keyword', 'Literal', 'Name', 'Number', 'Operator', 'Other', 'Punctuation', 'RegexLexer', 'RubyLexer', 'ScalaLexer', 'String', 'Text', 'ZephirLexer', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'bygroups', 'copy', 'get_bool_opt', 'get_list_opt', 'html_doctype_matches', 'include', 'looks_like_xml', 'print_function', 're', 'this', 'using']
>>>

と、このとおりパッケージの中身を認識するようになりました。

以上、pythonは初めてなのでこれが正しいのかどうか分かりませんが、備忘録代わりに置いておきます。



CakePHPのPaginatorに独自のパラメータを追加(CakePHP2.3)

しばらく前に「CakePHPのPaginatorに独自のパラメータを追加」なんて記事を書きましたが、あれから2年もたちまして、PaginatorHelperも少しインターフェースが変わりました。ということで、同じことをCakePHP2.3系で書いたらどうなるかというのを書いてみましょう。

※ 詳しくは拙書「はじめてのCakePHP」(p.163)に書いておりますのでそちらをご覧ください。

【今回の要件】

例えば、会議予定の一覧画面で、[全て|今日の会議だけ]みたいなスイッチで絞り込みをしたいとしましょう。

やり方は色々あるのですが、どうせなら通常「http://あああ.com/・・・/index/page:2/sort:name/derection:asc」とかなってるURLにさらに「/today:1」みたいな独自のパラメータが追加できればいいですよね。

【namedパラメータが途中で消えないようにしよう(View編)】

この場合は Viewファイルに

<?php // 絞り込み条件リンクを作成 

	// 初期値セット
	$isOnlyToday = false;
	if (isset($this->params['named']['today'])) {
		$isOnlyToday= $this->params['named']['today'];
	}
	// リンク作成
	if ($isOnlyToday== true ) {
		$str1 = $this->Paginator->link('全て', array('today'=>true));
		$str2 = '今日の会議だけ';
	} else {
		$str1 = '全て';
		$str2 = $this->Paginator->link('今日の会議だけ', array('today'=>false));
	}
	echo sprintf("絞り込み条件:[ %s | %s ]", $str1, $str2);
?>

と書きます。これでページが変わろうとソート順が変わろうと、絞り込み条件はパラメータとして引き継がれ続けます。

もちろん同じような絞り込み条件を複数書いても、両方のパラメータがセットされます。でなきゃ実戦で使えませんからね(笑。

【引き継がれた条件で絞り込み検索(Controller編)】

次はコントローラ側です。ここではリクエストパラメータを受け取って絞り込み検索を行います。Bakeで焼いただけの自動生成されたソースでは

	$this->set('modelNames', $this->paginate());

となっていると思います。これを


	// 「今日分だけ」パラメータがセットされていれば条件追加
	// リスト6-11 (p.164)
	$scope = array();
	if (isset($this->request->params['named']['today'])
	 && $this->request->params['named']['today'] == true) {
		$today_str = date('Y-m-d');		// 今日の日付
		$scope = array('start_time LIKE '=> $today_str . ' %');
	}

	$this->Meeting->recursive = 0;
	$this->set('meetings', $this->paginate(null, $scope));

といった感じで書き換えればOKです。



ブログは「出会いの場」となり得るのか。

さて、少しCakePHPから離れましょう。

表題の件、さてブログというのは「出会いの場」となりうるのでしょうか?

私はこのブログを始める時に、出会いとしての効果は全く期待しておりませんでした。私がブログというツールの効果としてみていたのは、

  • 情報収集の場
  • 知っている方の考え方を知る場

程度でした。

ですから、私のブログでもコミュニケーション機能は最低限の実装に留めていますし、記事内容も「どこに行った」とか「何を食べた」というのがほとんどありません。そういのはfacebookやmixiでやる方が効率が良いと思っていたからです。

でもね、ブログを始めて5年経ちますと、時々ですが私のブログを読んだ知らない方からコメントやメールを頂く機会があるんですよ。そういう方はそれなりに接点が明確なので、繋がりやすく、後々一緒にお仕事をさせて頂く関係まで発展した例も幾度かあります。

ブログっていうのも意外と「出会いのツール」なんですね。頻度を考えると効率は良くありませんが、それを期待し過ぎなければかえって素敵な出会いがあると思います。

なんてね、久しぶりにブログを介して良識ある人と繋がったので機嫌がいいのです。



CakePHPプラグインのスキーマファイルを作る

CakePHPの最大の「売り」の1つが「柔軟で疎結合なプラグイン」ですから、自分でプラグインを作っている方も多いでしょう。
小さなプラグインならともかく、それなりのサイズのプラグインになってくると、プラグインで独自のテーブルが必要になりますね。

ですが、プラグインを公開するとして、DDLはどのDB向けに作成しましょうか?MySQL?PostgreSQL?SQLserverは要りませんか?まさか全部作りますか?メンテできますか???

こんな時に便利なのが、SchemaShell機構です。CakePHPのこの機能を使えば、PHPでテーブルの定義を作っておくと、導入先のそれぞれのDBに応じて自動的にSQL文生成が行われるのです。
CakeSchema

詳細は拙書 「2-2.スキーマファイルの作成」をご覧頂きたいのですが、プラグインのスキーマファイルの作成方法についてはページの都合で言及できませんでしたので、今日はプラグイン用テーブルのスキーマファイルの作成方法をご紹介します。

… 続きを読む



かばだんなさん、本でもかく語りぬ

こんばんは。かばだんなさんです。

さて、先日かばだんなさんが書いた本が出版されることとなりました。

はじめてのCakePHP (I/O BOOKS)
「はじめてのCakePHP (工学社)」

引き受けるに際しては、「『いまさら紙媒体?』と言われないためにはどうしたらいいか」ということが最大の課題でした。そこで、下記のような工夫を仕込みました。

1冊を通して1つのサンプルシステムを作る

ともすればWebでも紙媒体でもありがちな、「そのサンプルコードだけを読んでもよく分からない時に、関連する情報を探すんだけど載っていない」「このネーミングはCakePHPのルールなの?それともローカルルールなの?」ということを避けるために、小さめの1つのシステムを題材に一気通貫で説明しました。そのため、題材選びはちょっと大変でしたが、Web上のコンテンツでは少ない「まとまった情報」を提供できていると思います。

設計(モデリング)に1章ページを割いて解説する。

これは執筆を引き受ける時から考えていました。というのも、私は「結局のところ関数の使い方なんてWeb上のコンテンツにはかなわないだろう」と思っているからです。ですが、「設計→ソースコードの自動生成→具体的なコーディング方法」を一連の流れとして書けば、それはWeb上のコンテンツではなかなかできない、『価値』だと考えたのです。

索引を充実させる

これは既存の紙媒体の技術書に対するアンチテーゼでもあります。大体、今どきの技術書は索引が薄いか、あってもその単語を機械的に検索した結果を掲載しているものがほとんどで、だったらGoogle様に助けてもらえるWeb上のコンテンツの方が遥かに便利です。そこで索引を作成するに際しては、まず機械的に検索した結果を全部場に出し、そこから「この言葉を調べたい時はどんなシーンだろう?」ということを考えながら、記載すべきページ番号を絞り込んでいきました。これは機械にも、実際にコーディングしたことのないテクニカルライターにも書けまい(笑。

と、まぁ、こんなことをしていたらページ数を喰って、盛りだくさん過ぎる内容になってしまい、当初書きたかったことのうち、

・Ajax(JavaScript)連携の方法
・認証プラグインの利用方法
・キャッシュ機構の利用方法

などは泣く泣くバッサリとカットしなければなりませんでした。この辺りはいつか機会があったら別の所で書くとしましょう。

名前の読み仮名が違っていたり、CakePHPのロゴであるケーキから表紙をデザインしていく過程で、なぜかケーキがチーズになってネズミにかじられていたりと、突っ込みどころ満載ですが、よろしければ一度ご覧ください。

<<本屋さんへはコチラから>>

はじめてのCakePHP (I・O BOOKS)



サイト引っ越し手順(Apache編)

こんにちは。かばだんなさんです。

サイトのお引越しをする際に、Apacheのmod_rewriteを使用して新サイトなどにジャンプさせる手法は有名ですが、これって段取りに配慮しないと不親切なんですよね。

というのも、ブックマークをしてくださっている常連さんの場合、ある日突然リダイレクトで新サイトに飛ばされると、その時にURLを見てドメイン名が変わっている事に気付いてブックマークし直してくれればいいのですが、そうじゃないと「リダイレクトが効いてる間は新サイトに行けるけど、リダイレクトが解消されたタイミング(旧サイトを閉鎖したタイミング)でサイト行方不明」になってしまいます。

じゃあ旧サイトに「引っ越しました。新サイトのURLは・・・・」というお知らせを表示するのがいいのかというと、これだとクローラさんが引っ越し先に気付かないのでSEO的には一から出直しになってしまいます。

ということで私のやり方なのですが、 … 続きを読む



祖母永眠

さて、先週の金曜に祖母が永眠致しました。
急なことでしたので関係各位には無茶振り等してご迷惑をおかけしましたが、温かいお心遣いを頂きましてありがとうございます。

強行軍でしたので故郷の景色もゆっくり見られませんでしたが、関門海峡は雪でした。町も山も変わらずそこにありました。
身勝手なもので、普段遠く離れていると故郷の時間は止まったままのような錯覚を起こすのですが、止まっていた時間の中で少しだけ時間が動いた、または止まっていた風景の一部が抜け落ちた、そんな感覚です。

とにもかくにも止まっていて変わらない世界から日々変わっていく世界に戻ってきました。
はてさて・・・。