12月 2010 のブログ記事

こちらでSeezooCMS用のWiki記法ブロックを公開しているわけですが、
これを作った理由が、おそらくみなさんの役に立つのではということで、
Tipsを書いておきます。
 
SeezooにはWYSIWYGなHTMLブロックなど必要な機能はひと通り揃っていて、
企業の担当者レベルで非常に更新のしやすいシステムですが、
一個だけ不満が。
それがテーブル作成でした。
 
WYSIWYGなHTMLエディタには、テーブル機能が搭載されておらず、
HTMLコードを直で書かないといけない。
そして、一般担当者レベルでは、表組みはテーブルが一番分かりやすい。
 
ということで、何か簡単にテーブルを書ける方法がないかということで、
作ったのがwiki記法ブロックです。
 
wiki記法ブロックに

||セル1||セル2||
||セル3||セル4||

と書けば、

<table>
<tr><td>セル1</td><td>セル2</td></tr>
<tr><td>セル3</td><td>セル3</td></tr>
</table>

と自動で出力してくれる。
 

||~セル1||セル2||
||~セル3||セル4||

と書けば

<table>
<tr><th>セル1</th><td>セル2</td></tr>
<tr><th>セル3</th><td>セル3</td></tr>
</table>

と自動で出力してくれる。
 
という仕組みです。
 
どうですか?これならHTMLわからない人でもテーブルを簡単に書けます。
 


ただ、ここまでの説明だと、飾りっけのないテーブルになってしまいますので、
本日のバージョンアップで任意のidとclassを振れるようにしていますので、
例えば、テンプレート用CSSやカスタムCSSに

.wikiclass table {
 margin: 0px;
 padding: 0px;
 background-color: #FFFFFF;
    border-spacing:0px;
    border-collapse:collapse;
    empty-cells:show;
    width:100%;
    border-top:1px solid #663300;
    border-left:1px solid #663300;
    background-color: #FFFFFF;
}
.wikiclass table td {
    border-right:1px solid #663300;
    border-bottom:1px solid #663300;
    padding:3px;
    margin:0px;
}
.wikiclass table th {
    background-color: #F6F6F6;
    border-right:1px solid #663300;
    border-bottom:1px solid #663300;
    padding:3px;
    width:30%;
    margin:0px;
}

と書いておき、classに「wikiclass」を設定すれば、装飾のされたテーブルを表示できるようになります。
 
どうですか?地味だけど便利でしょ?
 
ご活用ください。

先日作ったSeezooCMS用のWikiコードブロックをバージョンアップしました。
 
・作成したブロックを<div>で囲み、そこに任意のidとclassを付与できるようにしています。
 これにより、CSSやカスタムCSSで、そのブロックに任意のCSSを適用できます。
 
・初版では、wikiブロックにHTMLコードを入れた場合、自動サニタイズされる仕様になっていましたが、
 それを回避しています。<script>などもそのまま出力されてしまいますので、
 セキュリティホールを作らないように注意が必要です。
 
以上が今回のバージョンアップです。
ダウンロードはこちらから

PHPを使ってGoogleショッピングAPIを叩きたく、調べていたら、
ZendFrameworkの「ZendGdata」で比較的簡単に出来る。
 
が、、、いかんせんドキュメントが少ない上に、
公式が英語のみでいろいろわけわからんかったけど、なんとかできた。
その覚書。
 

<?php
require_once( 'Zend/Gdata.php');
require_once( 'Zend/Gdata/ClientLogin.php');
require_once( 'Zend/Gdata/Gbase.php');    

//クライアントのインスタンス作成。ログインIDとパスワードを設定
$client = Zend_Gdata_ClientLogin::getHttpClient( 'ログインID(メアド)', 'パスワード', Zend_Gdata_Gbase::AUTH_SERVICE_NAME );
$service = new Zend_Gdata_Gbase($client);    

//新たなエントリーを作るためのインスタンス作成
$newEntry = $service->newItemEntry();    

//商品名(タイトルだけど商品名として扱われる)
$newEntry->title = $service->newTitle('商品名');    

// データの登録先を定義(Googleショッピングの場合はProducts)
$newEntry->itemType = "Products";
  
//概要(コンテンツだけど概要として扱われるらしい
$content = "概要概要概要概要";
$newEntry->content = $service->newContent($content);
$newEntry->content->type = 'text';    

//品番
$newEntry->addGbaseAttribute("id", "品番", "text");    

//状態 new|used|refurbished
$newEntry->addGbaseAttribute("condition", "New", "text");    

//商品ページURL
$newEntry->addGbaseAttribute("link", "URL", 'url');    

//価格
$newEntry->addGbaseAttribute("price", "値段 JPY", "numberUnit");    

//対象国(これを忘れるとチェックが通らない。忘れがちなので注意。
$newEntry->addGbaseAttribute("target_country", 'JP', 'text' );    

//データ挿入実行(テスト実行は2番目の引数をtrueにする。
$createdEntry = $service->insertGbaseItem($newEntry, false);    

?>

 
だいたいこんな感じ。
これ以外のフィードアイテムについては、
Googleのフィード仕様の説明をご覧になればわかるかと思います。

なお、注意点として、ZendGdataはAPIでエラーが出たとき、FatalErrorとなります。
エラートラップなどの必要性がありますので、そのへんの実装は各自行ってくださいね。
 
私はこれを直で使うわけでなく、XMLのフォーマットを知りたかったから。
同じ様にAPIのXMLのフォーマットを知りたいという人は、
Zend/Gdata/App.phpのpost()の中で、「$requestData['data']」をecho()すれば幸せになれます。


追記:2010/12/28
上記の方法は「ClientLogin」を利用しています。
ClientLoginの場合、ログイン失敗などするとCaptcha認証が必須となり、
ログインしようとするとHTTPエラーコード403が戻りますが、
ZendGdataでは、これをハンドリングする仕様にはなってないようです。
実際の利用時は、ZendGdataに含まれるHTTPクライアントオブジェクトを拡張するなどして、
Captcha必須のエラーハンドリングを行えるようにしたほうが良いでしょう。
 

昨日、PostgreSQLのVACUUMを怠り、
インデックス肥大化で接続できなくなるという事態を引き起こしてしまいました。
クライアントには大変申し訳ない限り。。。
 
そうなったときの対処法をメモ。
 
serviceとして起動していると、対処できないので、
コマンドから、サービス停止して、シングルユーザーモードでVACUUMすればOK。
 
まず、postgresユーザーになる。

su - postgres

大抵の場合rootでは操作できなくなってると思う。
で、rootからposgresユーザーになればいい(と思う)
 
次、サービス停止。

pg_ctl stop

シングルユーザーモードで起動。

postgres データベース名

 
VACUUMを実行
 

backend> VACUUM

肥大化した色んなものをゴニョゴニョしているというお知らせが続く…
↑この表示がおわったら「Ctrl+D」でシングルユーザーモードを解放。
 
念のため、これを繰り返した方がいい。
 
で、何も出なくなったら、サービス起動

pg_ctl start

こんな感じ。

seezoo cms(http://seezoo.org/)が楽しい。
プログラマ的に言って拡張がかなり楽!!
 
a-blog cms(http://www.a-blogcms.jp/)といい、
名古屋の人が作るツールは楽しい物ばかりだ。
 


昨日、seezooの開発元の音生さん(http://neo-navi.net/)に伺った際に、
色々話を聞かせていただいて、
その内容をもとにseezoo用のブロックを作ってみた。
 
前々からほしいと思っていた、wiki記法ブロックを作った。
パーサーを自分で書くのは大変だったので、
PEARのText_wikiに頼っている。

ダウンロードはこちらからどうぞ。


【インストール方法】

1)まず、PEARのText_wikiをインストールします。
PEARコマンドが使える場合は、
通常通りコマンドでインストールしてください。
 
使えない場合は、

・PEAR(ベースシステム)

http://pear.php.net/package/PEAR/download

をダウンロードして、解凍してできる、
PEAR.phpとPEARディレクトリを
system/application/libraries/ディレクトリに置きます。

・Text_Wiki

http://pear.php.net/package/Text_Wiki/download

をダウンロードして、解凍してできる、
Textディレクトリを同じく
system/application/libraries/ディレクトリに置きます。
 
 
2)ブロックを置く。
先ほど上記にてDLしたWikiブロックを解凍してできる、
kiyowikiディレクトリを、
blocksディレクトリに置きます。
 
3)ブロックを有効にする。
管理画面のブロック管理にいくと、
「インストール可能なブロックのリスト」に、
「Wiki記法ブロック」というのが追加されているので、
それを有効します。

あとは、通常のブロックと同様、
ページ編集画面で「Wiki記法ブロック」を追加して、
表示されるテキストエリアにWiki記法を書けばOKです。
使える記法については、
http://pear.reversefold.com/dokuwiki/text_wiki:samplepage
ここを参考にしてください。


 
ここまで来て気づいた。。。
Text_WikiのインスタンスをいちいちViewで有効にしてる…orz
動くには動くけどスマートじゃないし、色々無駄。。。
そのうちヘルパとして用意したバージョンを公開しますね。
とりあえず、利用される場合は、
完全自己責任の名のもとに使うベータ版として利用してくださいね。
あくまでも、これは私のお勉強のためのものですから!!

あ、そしてもう一個気づいた、wiki記法ブロックにidとclass付けれるようにしたほうがいいな、、、カスタムCSSで自由に操作できるもの。
 


追記:バージョアンアップ 2010/12/29

・作成したブロックを<div>で囲み、そこに任意のidとclassを付与できるようにしています。
 これにより、CSSやカスタムCSSで、そのブロックに任意のCSSを適用できます。
 
・初版では、wikiブロックにHTMLコードを入れた場合、自動サニタイズされる仕様になっていましたが、
 それを回避しています。<script>などもそのまま出力されてしまうので、
 セキュリティホールを作らないようにしてください。

昨日、音生さんに伺った際に、
「PHPでヘンなHello,world出力とか面白いよね」
みたいな話があったのを思い出した。
 
MIME64エンコードから出力とか、
16進数から出力とか考えたけど、あるよなー多分。
って思って、もうちょっと考えて「BrainFuck」で出力したら面白いんじゃね!?
とか思って、調べたら、もうやってる人がいた(^-^; なんちゅー。。。
 


 
BrainFuckとは、冗談言語と呼ばれる種類のプログラミング言語で、実用性は皆無。
基本的にメモリのポインタ増減だけで命令を表現する、難読言語です。
 
BrainFuckでHello,world!を表現すると、
 

+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-.
------------.<++++++++.--------.+++.------.--------.>+.

 
、、、、当然意味がわからん、、、、
 
まぁ、これを使ってPHP上で何か出力仕様という魂胆だ。
 


 
「PHP BrainFuck」でググったら、
なんと、PHP用のBrainFuckインタプリタがあった!
http://daniel.lorch.cc/projects/brainfuck/ 
 
ここにすでにサンプルとして、Hello,wordl!がある!!
 
が、あえて自分で書く!
 
インタプリタをダウンロードして解凍してできる「brainfuck.php」をrequire/includeして、
brainfuck()にBrainFuckの命令を引数として渡してやると、
返り値にインタプリタの実行結果が帰るので、それをecho()する。
 

<?php
include_once('brainfuck.php');
echo( brainfuck('+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-.
------------.<++++++++.--------.+++.------.--------.>+.'));
?>

 
こんな感じです。


 
まったく使えないTipsですねwwww

前の記事でCodeIgniterを使うことを決めたと書きましたが、
ダメな所ももちろんたくさんあります。
 
http://oddwit.com/blog/2007/coming-to-hate-code-igniter 
 
こんな記事もありますし。
 
私は個人的にテンプレートが生PHPなのがうーん。だったのが、最初躊躇した理由です。
PHP自体がテンプレートエンジンのオーバーテクノロジー(だと、PHP開発陣ですら公言している)なので仕方ないですが。
とはいえ、phpタグをHTMLコーディングする人に書いてもらうのはどうしてもいやだ。
 
という理由で、EthnaかSoyCMSのフレームワークかで悩んだのですが、
 

@kiyotchi CodeIgniterの事であれば僭越ながら色々お話できるかもです。SeezooもCodeIgniterで作ってるので、プラグイン作り放題ですよーwあと、Smartyプラグインは http://bit.ly/eWYqAC とかを参考にドゾー。less than a minute ago via web


 
という情報をいただく。
 
ただ、Cakeとかも一応Smartyつかえるけど、かなりCakeの良さをそぎ落として使うことになるのは、よく知られたはなし。CodeIgniterではどうかな?と思って、寝ずにやってみた。
 
うん。かなりいい感じ。無理なく使えるって感じです。各ライブラリの独立性が高いのと、コントローラーが柔軟なおかげですね。
 


 
上記のTipsだと、CIのライブラリフォルダにsmartyを突っ込みましょうとかいてありますが、
CI → Apache/BSD
Smarty→LGPL
と、真っ向からぶつかる訳ではないですが、
やっぱりライセンス的に切り分けておきたいので、
SmartyはSmartyのみで、PEARディレクトリか、include_pathの通っているパスへインストールして使うことに。
 
その場合、CodeIgniter/system/libraries/Smarty_parser.php の
 

require "smarty/Smarty.class.php";

は、インストールの仕方で、パス指定が変わるので注意。

来春からひとり立ちをして生きて行くことになったわけですが、
それに伴い、高速開発というのも視野にいれて行動しなくてはいけなくなりました。
 
かなりECに特化したフレームワーク(Perl|PHP)を自作して使っているのですが、
自作フレームワークだとそれ自体をUPGRADEする時間も必要になって大変だ。
 
というわけで、PHPのものだけ、オープンのものをさがすことに。
有名どころから
 


 
・CakePHP http://cakephp.jp/
RoRをお手本にしたフレームワーク。
PEARなどの既存ライブラリに依存せず、かなり広汎なサイト構築に対応。
「なんでも屋」な印象。
既存ライブラリに依存してないのはいいけど、
ちょっとカッチリしすぎていて、自分の設計思想には合わず。
 


 
・Symfony http://www.symfony-project.org/
こちらもきれいなMVCパターン。
かなり堅牢なアプリケーションが開発できる。
規模という意味ではおそらく、一番広く対応できる。
こちらもかっちりしすぎていて、自分の設計思想には合わず。
 


 
・Ethna http://ethna.jp/
GREEが自社開発用のためにつくったフレームワーク。
MVCながら、緩い制約。コマンドラインがちょっと面倒。
全体的に好みなんだが、DB接続のデフォルトがPEAR_DBなので、ちょっと困った。
日本製っていうのが大きいし、稼動実績は目に見えてわかる。
PEAR_MDB2採用なら飛びつく。そこだけが惜しい。
 


 
・ZendFramework http://framework.zend.com/
PHPの言語エンジンの開発元謹製のフレームワーク。
かなり色んなライブラリが揃ってるのが魅力。言わば第二のPEARみたいな。
各機能はそこだけ切りだして使えるのもPHPっぽくて良い。
が、、、PHP5.2.4以上なのが困った。まだ5.1系沢山抱えているので。。。
 


 
・ちいたんhttp://php.cheetan.net/
cakeに影響をうけながら、フレームワークとしての機能はMVCの分離にとどまっているのが、
いいなぁと思って、1年くらい前からチェックはしていた。
でも、まぁよくも悪くも、何もなさすぎて、、、
 


 
・SoyCMSのフレームワークhttp://www.soycms.net/
フレームワークとして、独立しているわけではないのですが、
SOY CMSはベースに独自フレームワークを使っています。
CMSなのでテンプレートエンジンが素晴らしいとこがいいです。
が、ドキュメントが少なくて、断念。
 


 
・CodeIgniter http://codeigniter.jp/
周りに使っている人が少なくて、いまいちマイナーな感じをうけていたので、
後回しになっていました。
コマンドライン操作がいらない。コーディング規約がゆるい。
MVC分離にはなっているが、ぶっちゃけモデルいらない。
セッションを全てcookieに保存するところがうーん。
これまでの資産が活かしやすい。
 
  


 
ほかに、MapleやMojaviなどもありますね。
 
PHPは言語じゃなくて、ツールやフレームワークだよと思っているので、
その上にガチガチのフレームワークを乗っけるのは好きではない。
これまでの資産が活かしたい。
コマンドラインを叩かず、ぶち込めば基本的に動くものがほしい。
 
という個人的なわがままを一番満たしてくれたのが、CodeIgniterなので、
これを採用することにしました。
 


 
早速、これまでの資産をCodeIgniterに移植する作業をしていますが、
ちょっとの書き換えで済むので、すごくラクです。
良くも悪くもPHPを知ってないと、使いこなせないのかなという印象もありますが。
とりあえず、なんか一個作ります。
 


 
自作フレームワークも並行してさらにEC専用になるように磨いていきます!
 
ちなみに、自作フレームワークは、
・説明書が書けないレベルになっとる。
・あまりにもEC専用で、私の仕事の手の内を見せることになる。
・フレームワークの名前に元カノの名前が付いとる。
ということで、公開はしません。絶対にww。