bamcompileを使ってPHPからexeファイルを作成

1月 27th, 2008 admin

顧客が作ったCSVを使ったアプリを作っているんですが

  • 全角英数字が混じる
  • (株)やローマ数字などいわゆる機種依存文字が混じる

ので、全角英数字を半角にし、機種依存文字を適当に変換するスクリプトを書いた。
ただそんなことをサーバサイドでやるのもアホらしいのでPHPをexeにしてくれるbamcompileってのを使った。

作ってみてPHPってバカにされているけど日本語処理に関しては他の言語よりかなり便利に使えることに気が付いた。
文字の扱いって他の言語じゃこんなに簡単じゃないと思う。(だから駄目だとか言われるんだろうけど)

bamcompileについて

bamcompile 本家
http://www.bambalam.se/bamcompile/
【PHP TIPS】 38. bamcompileでスタンドアロンEXEアプリを作ろう:ITpro

http://itpro.nikkeibp.co.jp/article/COLUMN/20070507/270089/

exeの作り方

僕はまずconvert.phpってのをつくり

C:\bamcompile1.21>bamcompile.exe -e:C:\xampp\php\extensions\php_mbstring.dll ./convert.php

ってやった。-eのオプションは任意のエクステンションを埋め込む用。
これだけでconvert.exeってのができて実行できるんだ。すげー!

今回の成果物の使い方

C:\>convert.exe old.csv

って感じで第一引数にファイル名を指定してやる。毎回コマンドプロンプトを立ち上げるのは面倒なのでショートカットを作成しておく予定。

ダウンロード

なんか嬉しいのでダウンロードできるようにしておく。
convert.zip(1.44MB)
(ウイルスチェックはしてありますし、悪意もありませんが、これをダウンロード及び実行したことによっていかなることが起こっても責任は一切負いません。)

PHPのソース

www.shibata.tv – Essay – 機種依存文字変換スクリプト
http://www.shibata.tv/essay/essay_515.html

↑ここのコードをお借りしました。

<?php
mb_language('ja');
mb_internal_encoding('SJIS');

if(!isset($argv[1]) || !file_exists($argv[1])){
	echo "第一引数にファイルを指定してください。";
	exit;
}

$filename = $argv[1];

echo "converting...\n";

$file = file($filename);
$newdata = '';

foreach($file as $v){
$v = replaceText($v);
$v = mb_convert_kana($v,'KVa');
$newdata .= $v;
}

$fp = fopen("new_".$filename,'w');
fwrite($fp,$newdata);

echo "converted ".count($file)."lines\n";

function replaceText($str){
$ret = $str;
$arr = array(
// 丸付き文字
'①' => '(1)',
'②' => '(2)',
'③' => '(3)',
'④' => '(4)',
'⑤' => '(5)',
'⑥' => '(6)',
'⑦' => '(7)',
'⑧' => '(8)',
'⑨' => '(9)',
'⑩' => '(10)',
'⑪' => '(11)',
'⑫' => '(12)',
'⑬' => '(13)',
'⑭' => '(14)',
'⑮' => '(15)',
'⑯' => '(16)',
'⑰' => '(17)',
'⑱' => '(18)',
'⑲' => '(19)',
'⑳' => '(20)',
'㊤' => '(上)',
'㊥' => '(中)',
'㊦' => '(下)',
'㊧' => '(左)',
'㊨' => '(右)',

// ローマ数字
'Ⅰ' => 'I',
'Ⅱ' => 'II',
'Ⅲ' => 'III',
'Ⅳ' => 'IV',
'Ⅴ' => 'V',
'Ⅵ' => 'VI',
'Ⅶ' => 'VII',
'Ⅷ' => 'VIII',
"Ⅸ\" => 'IX',
'Ⅹ' => 'X',
'ⅰ' => 'i',
'ⅱ' => 'ii',
'ⅲ' => 'iii',
'ⅳ' => 'iv',
'ⅴ' => 'v',
'ⅵ' => 'vi',
'ⅶ' => 'vii',
'ⅷ' => 'viii',
'ⅸ' => 'ix',
'ⅹ' => 'x',

// 単位文字
'㍉' => 'ミリ',
'㌔' => 'キロ',
'㌢' => 'センチ',
'㍍' => 'メートル',
'㌘' => 'グラム',
'㌧' => 'トン',
'㌃' => 'アール',
'㌶' => 'ヘクタール',
'㍑' => 'リットル',
'㍗' => 'ワット',
'㌍' => 'カロリー',
'㌦' => 'ドル',
'㌣' => 'セント',
'㌫' => 'パーセント',
'㍊' => 'ミリバール',
'㌻' => 'ページ',
'㎜' => 'mm',
'㎝' => 'cm',
'㎞' => 'km',
'㎎' => 'mg',
'㎏' => 'kg',
'㏄' => 'cc',
'㎡' => 'm<sup>2</sup>',

// その他
'№' => 'No.',
'㏍' => 'K.K.',
'℡' => 'TEL.',
'㈱' => '(株)',
'㈲' => '(有)',
'㈹' => '(代)',
'㍾' => '明治',
'㍽' => '大正',
'㍼' => '昭和',
'㍻' => '平成',
);
return str_replace( array_keys( $arr), array_values( $arr), $str);
}
?>

テスト環境から本番環境へのファイル適用

1月 26th, 2008 admin

いつも設定ファイルをこうやって書いて

<?php
	//本番用
	define("FILE_UPLOAD_DIR","/xxx/yyy/xxx/");
	//テスト用
	//define("FILE_UPLOAD_DIR","/aaa/bbb/");
?>

subversionでignore属性つけてあるから完璧。とか思ってたんだけど。

よく考えたらapp_controller.phpとかで

<?php
	if($_SERVER['HTTP_HOST'] == "www.example.com"){ //本番環境のホスト名
		//本番環境
		config("dependent_settings");
	}else{
		//テスト環境
		config("test_dependent_settings");
	}
?>

って環境変数で設定ファイルを切り替えるようにしておけば、テスト環境と本番環境のファイルがまったく同じにできるんだと下記のページをみて気が付いた。

CakePHP 環境に応じてDBの設定を変える | Shin x blog
http://www.1×1.jp/blog/2006/09/cakephp_db_config.html

デプロイの方法とか今まで全然調べてなかったことなのでもうちょっと調べてみようと思う。みんなきっといいツールを使ってる(作ってる)はず。

PHPフレームワーク比較2008

1月 16th, 2008 admin

調査機関Gを利用してフレームワーク名の検索回数を元にフレームワークの人気を調査してみた。

01.PNG

参考までにmojaviをいれたけどやっぱり第1世代なのね・・・

11.PNG
と思っていたら日本(だけ)ではまだまだ現役のようです。

CakePHPからAkelosに入門

1月 15th, 2008 admin

Blog-side Akelosにしました

この記事を読んでしまったおかげで
CakePHPへの「あの配列地獄はなんなんとかならんのか」という違和感が不満へと変わってしまった

ということでAkelosに入門することにしてみる。

前書き

XAMPPでAkelosのテスト
・ユーザの管理をする
・ユーザにはそれぞれ管理者レベルみたいな属性がつく
こんなのを作りたいと思います。

ファイルを配置する

http://www.akelos.org/download
から最新版をダウンロード(0.8)
subversionからのインストールを薦めているけど、僕の環境ではなぜかチェックアウトが出来なかった。

今回はドキュメントルートの下にbasicというフォルダを作ってそこにそのまま配置した。
0.PNG

データベースを用意

あらかじめ3つのデータベースを作っておく、本番用、開発用、テスト用(ユニットテスト)
SQLiteが使えないXAMPPのPHP4なのでMySQLを使います。

CREATE DATABASE `basic` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE `basic_dev` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE `basic_tests` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

インストール

http://localhost/basic/

にアクセスしてインストーラを起動、
1.PNG
・DBの設定を入力
・言語の設定(関係ないかもしれないけどjaをenより前に移動した)
2.PNG

マイグレーションファイルを作成

RoRを使っていれば知っていると思うのですが、データベースのテーブルを作ったり、カラムを追加したりっていう作業ははマイグレーションという仕組みで管理します。
便利というよりは、この仕組みを使うことでスキーマの変更を必ずファイルに記録するようになるってのが個人的には嬉しいです。

app/installers/basic_installer.php

<?php

class BasicInstaller extends AkInstaller
{
 function up_1(){

     $this->createTable('users',
        'id,'.
        'email,'.
        'password,'.
        'authority_id,'.
        'is_active'
    );

     $this->createTable('authorities',
        'id,'.
        'level,'.
        'desctiption'
        );
 }

 function down_1(){
     $this->dropTables('users','authorities');
 }
}

?>

こんなファイルを作ります。
up(次)とdown(前)の状態を記述することでデータベースのスキーマをバージョン管理できます。
さっそくupさせてみましょう

C:\xampp\htdocs\basic>php script/migrate Basic install

するとデータベースにusersとauthoritiesというテーブルが作成されています。
3.PNG

scaffold

C:\xampp\htdocs\basic>php script/generate scaffold user
C:\xampp\htdocs\basic>php script/generate scaffold authority

4.PNG
これで

http://localhost/basic/user/

http://localhost/basic/authority/

に一覧・追加・編集・削除・詳細表示ができる画面ができあがっています。
CakePHPでいうbakeですね。

リレーション

users.authority_idとauthorities.idを連携させます。
まず、モデルの設定から
model/user.php

<?php

class User extends ActiveRecord
{
	var $belongs_to = 'authority';
}

?>

model/authority.php

<?php

class Authority extends ActiveRecord
{
	var $has_many = 'users';
}

?>

user”s”って複数形になっているのに注意

次はコントローラー
controllers/user_controller.php

<?php

class UserController extends ApplicationController
{
	var $models = 'user, authority';

    function show()
    {
        $this->user = $this->User->find(@$this->params['id'], array('include' => 'authority'));
    }

最後に入力フォーム
views/user/_form.tpl

<?php  echo $active_record_helper->error_messages_for('user');?>

    <p>
        <label for="user_email">_{Email}</label><br />
        <?php  echo $active_record_helper->input('user', 'email')?>
    </p>

    <p>
        <label for="user_password">_{Password}</label><br />
        <?php  echo $active_record_helper->input('user', 'password')?>
    </p>
    <p>
        <label for="authority">_{Authority}</label><br />
        <?=$form_options_helper->select('user', 'authority_id', $Authority->collect($Authority->find(), 'level', 'id'));?>
    </p>
    <p>
        <label for="user_is_active">_{Is active}</label><br />
        <?php  echo $active_record_helper->input('user', 'is_active')?>
    </p>

こんなんで連携してくれるようになる
5.PNG

CakePHPとの違い

・コントローラー名は複数形(users)だがURLは単数形になる
・has_manyのときは相手を複数形の名前で指定する必要があってはまった

次回は

本当にRoRと似てるなーと大枠をつかめたので次回はユーザ認証を作ってみたいと思います。

3キャリア対応携帯サイト開発スターターキット

1月 10th, 2008 admin

前回作ったフレームワークみたいなやつに、

  • 全角カタカナ=>半角カタカナ変換
  • 3キャリア対応の絵文字の自動変換

をつけて携帯サイト開発スターターキットとしたら便利だったので公開します。
絵文字の自動変換部分には、MobilePictogramConverterを使っています。これは便利です。凄いです。

ダウンロード

msk.zip(533kb)
ライセンスはLGPLとします。

セットアップ

ダウンロードしたファイルを展開して下図のように配置します。
tree.PNG
PHPの4.3ぐらいが入っていればそのまま動くはずです。
各種パスなどは好きに変更してください、configなどへのアクセス制限をかけておくことをお勧めします。

使い方

テンプレートにファイルを追加していくだけでページを増やしていくことができます、詳しくは「フレームワークの使い方」を見てください。

templates/index.phpには./index.php?a=indexでアクセスできる
templates/shop/cart.phpには./index.php?a=shop_cartでアクセスできる
こんな感じ。簡単でしょう?

絵文字の入れ方

絵文字の入れ方は同梱のサンプルかMobilePictogramConverterの使い方を見てください。

技術的にすごいところ

ありません。
MobilePictogramConverterを作った人に感謝するだけです。