« 2005年12月 | メイン | 2006年02月 »

2006年01月 アーカイブ

2006年01月02日

あけましておめでとうございます。

今年もよろしくお願いいたします。
ということでグリーティングページを作ってみました。

http://www.minfish.jp/happynewyear/2006/
(音が出るので注意)

2006年01月05日

PHPでExcelファイルの入出力

自分用メモ。
環境はOSX10.4+php5+PEARです。

■Excelファイルを出力する場合

Spreadsheet_Excel_Writer(PEAR版)を使用。PEAR版はOLEというパッケージ依存。PHP_Class版もあるらしいけど、ファイルの容量に7MBの制限あるらしい。

・インストール

php5をインストールしていると、新しく別のPEARが勝手にインストールされてしまう。なのでphp.ini内のinclude_pathを変えるか、新しい方のPEARを使用する。(ここではまりました。)

※デフォルトのPEARのパス
/usr/bin/pear
※php5のPEARのパス
/usr/local/php5/bin/pear

先にOLEをインストール。

# sudo pear install OLE

次に、Spreadsheet_Excel_Writerをインストール。

# sudo pear install Spreadsheet_Excel_Writer
# pear list

としてインストールされているのを確認。

Archive_Tar              1.1     stable
Console_Getopt           1.2     stable
DB                       1.6.2   stable

      〜 中略 〜

OLE 0.5 beta
Spreadsheet_Excel_Writer 0.9.0 beta

どちらもBeta版なので注意。

・サンプル
ここに載っていたのを参考に。
『ふたつのしっぽ』

ただし、文字コードを変換する際にmb_convert_encodingを使用するとき3つ目の引数に"auto"を指定する必要があった。

<?php
//PEARクラスのインクルード
include_once 'Spreadsheet/Excel/Writer.php';
//ワークブックの生成
$workbook = new Spreadsheet_Excel_Writer();
//ワークシートの生成
$worksheet =& $workbook->addWorksheet(mb_convert_encoding("シート01","SJIS","auto"));
//列幅の設定
$worksheet->setColumn(0,0,5);    //1列目幅5
$worksheet->setColumn(1,1,10);   //2列目幅10
$worksheet->setColumn(2,5,2);    //3-6列目幅2
//書式の設定
$format1 =& $workbook->addFormat();
$format1->setColor("red");
$format1->setBold(1);
$format1->setItalic(1);
$format1->setBorder(1);
$format1->setBorderColor("blue");
//値を定義
$worksheet->write(0,0,"001");
$worksheet->writeString(0,1,mb_convert_encoding("ほげほげ","SJIS","auto"),$format1);
$worksheet->writeNumber(1,0,"001",$format1);
//式を定義
$worksheet->writeFormula(2,0,"=SUM(A1:A2)");
//HTTPヘッダー出力
$workbook->send("sample.xls");
//excel出力
$workbook->close();
exit;
?>

ファイルを出力する際はSpreadsheet_Excel_Writerをnewするときに引数にファイル名を渡すとExcelファイルが生成される。

$workbook = new Spreadsheet_Excel_Writer("sample2.xls");

その場合、sendメソッドは不要。echo文を含めるとファイルが壊れるので注意。print文はokだった。


■Excelファイルから入力する場合

Spreadsheet_Excel_Reader(SourceForge)を使用。ファイルをダウンロードしてきてphp.iniに記載されているinclude_path内にコピー。

が、Mac版のExcelファイルだとブラウザがハングアップしてしまった。
headerのフォーマットがwindows版と違うためで、"Root Entry"となっている所がMac版だと"R"になってためらしい。

Spreadsheet_Excel_Readerを解凍して/Excel/oleread.incの、204行目付近の

if ($name == "Root Entry") {

if ($name == "Root Entry" || $name == "R"){

とする。(参考

サンプルソースはこんな感じ。

<?php
require_once 'Excel/reader.php';
$data = new Spreadsheet_Excel_Reader();
   // エンコーディングの設定(shift-jis)
   // mb_convert_encodingを使用iconvも使用可
$data->setUTFEncoder('mb');
$data->setOutputEncoding('sjis');
$data->read('sample.xls');
error_reporting(E_ALL ^ E_NOTICE);
for ($i = 1; $i <= $data->sheets[0]['numRows']; $i++) {
	for ($j = 1; $j <= $data->sheets[0]['numCols']; $j++) {
		echo "¥"".$data->sheets[0]['cells'][$i][$j]."¥"¥t";
	}
	echo "<br />¥n";
}
?>


これでも、大量の日本語テキストがあると、あんまし上手くいかなくて、excelのシートの右下のセルにダミーで数字を入れたらなぜか動いた。
セルのフォーマット指定の読み込みとかも挙動がおかしい。

やはり、素直にCSVに変換してテキストファイルとして読み込むのが吉みたい。

2006年01月11日

ボーダー/ボーダレス

プログラマーとデザイナーの境界

なるほど。最近とてもリアルに感じてます。

2006年01月13日

PHPのフレームワークSymfonyでWebアプリ作成(1)

前回、Ruby on Railsで敗退&放棄してたのですが、今度はsymfonyにチャレンジしてみました。

関連エントリー:Ruby on Rails を試してみた。

環境は自宅のG5です。

symfonyはPHP5で言う所のRailsみたいなwebアプリケーション・フレームワークです。プロジェクトサイトには以下のような特徴が列挙されていました。

* シンプルテンプレートとヘルパー
* キャッシュ管理
* スマートURL
* スカッフォルディング
* 他言語対応とI18Nサポート
* オブジェクトモデルとMVC
* Ajaxサポート
* 企業向けも大丈夫

ほほう。

PHPのフレームワークは他にも

* Mojavi
* Agavi
* Cake
* Symfony
* maple
* Seagull

などがあって、実はそのうち上の4つをすでに試してます。以下雑感。

Mojaviはとりあえずインストール、チュートリアルアプリ制作までは上手く言って、Pearライブラリとかsmartyとかを組み込めたのですが、手作業が多くてなんか嫌で×。(すみません、あくまで好みです。)

Mojaviの派生であるAgaviはMojaviにヘルパーがくっついたみたいので、Smartyもサポートしてると書いてあり、かなり良さげ。と思ったのですが、インストール、チュートリアルアプリ制作とすすめて、smartyの組み込みでつまずいてダメ。もうちょっとねばれば動いたかもしれないのですが、とりあえず保留。

Cakeはチュートリアルの途中で面倒になって放棄。へたれです。というか、このてのフレームワークはやっぱり独特のドライブ感というか、ヘルパーとかの魔法っぽさ(あれ?もうできちゃったの?みたいなの)が肝なのではないでしょうか。チュートリアルのみたく空のクラスをいっぱい書いてというのは、どうかなあと。

で、最後のSymfonyです。

結論から言うと、僕にもフレームワークでアプリ作れたよ。10分どころかその30倍くらいかかったけど。(号泣
OSX独特と思われるトラップもいくつかあったのでそれもあわせて、次のエントリーでレポートしたいとおもいます。

2006年01月16日

PHPのフレームワークSymfonyでWebアプリ作成(2)インストール

間があいてしまいましたが、インストール編です。
以下の環境でインストールをしてみました。

OSX10.4.4
PHP 5.0.4(アップデートせなば。)
PEAR

SymfonyはPEARライブラリとして提供されているPHPのフレームワークです。インストールするには、PEAR 1.4.6が必要なので、既にインストールしている場合は

# pear list

でバージョンを確認し必要であれはアップグレードします。

# sudo pear upgrade --alldeps PEAR

次に、symfonyはphingというライブラリに依存関係にあるためインストールします。

# pear install http://phing.info/pear/phing-current.tgz

いよいよsymfonyインストールのインストールです。
まず、ライブラリが置いてあるサイトをpearに登録します。

# pear channel-discover pear.symfony-project.com

で、インストール。

# sudo pear install symfony/symfony

これで完了といきたい所なのですが、OSXでPHP5をインストーラーからインストールした場合にはトラップがあります。

ためしにコマンドラインからsymfonyでプロジェクトをイニシャライズしてみます。

# mkdir testProject
# cd testProject/
# symfony symfony init-project testProject

で、以下のようなエラーが出ます。

Parse error: parse error, expecting `'('' in /usr/local/php5/lib/php/symfony.php on line 19

これは、コマンドラインのphpのバージョンが5で動いてないからだそうです。php5をOSXにインストーラーからインストールすると旧バージョンと平行してインストールされるためのようです。

# php -v 
PHP 4.3.11 (cli) (built: May 31 2005 23:41:02)
Copyright (c) 1997-2004 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies

こんな感じ。
参考:リンク

なので、/usr/bin/以下にphp5をコピーするか、ハードリンクを張る必要があります。

# sudo mv /usr/bin/php /usr/bin/php4bkup
# sudo cp /usr/local/php5/bin/php /usr/bin/php

と、とりあえず。

#  php -v                                      
PHP 5.0.4 (cli) (built: Apr  4 2005 17:32:28)
Copyright (c) 1997-2004 The PHP Group
Zend Engine v2.0.4-dev, Copyright (c) 1998-2004 Zend Technologies
Oppenheim:~/Sites/phptest/sfbookmark tSato$ 

も一度。

# symfony init-project testProject

で、ドドドドッとファイルとフォルダが生成されます。
インストールはこんな感じです。

つづきます。(たぶん。。。)

2006年01月30日

PHPのフレームワークSymfonyでWebアプリ作成(3)単純なWebアプリ作成

ずいぶん間があいてしまいました。

そのあいだ、世の中いろいろと騒々しい感じだったですが、ひとりこもってSymfonyであれこれ作ってました。
ここで書いておこうと思ったTipsとかもいろいろあるにはあったのですけど。

調べているうちに、基本的な使い方等は他にもblogで書かれている方が結構いる事が分かったのですが、書く事で自分が覚えるという事と、自分用メモのため続けます。

手始めに、ブックマークアプリの作り方から。

まず、ウェブ共有のrootディレクトリにフォルダ作成。

# mkdir bookmark
# cd bookmark

で、プロジェクトのイニシャライズ

# symfony init-project bookmark

で、ドドドドッとファイルとフォルダが生成されます。

# symfony init-app myapp

という感じにアプリケーション部分のファイルとフォルダを用意。
ブラウザで以下のURLにアクセスすると「Congratulations!」の文字が!

http://localhost/~myuser/bookmark/web/

apachのmod_rewriteモジュールを使用するので該当のコメントを外します。
OSX10.4だと、httpd.confはここにあります。

# vi /private/etc/httpd/httpd.conf  

AddModule mod_rewrite.c
LoadModule rewrite_module modules/mod_rewrite.so
↑コメントを外す。

で、各ユーザー向けの.confを修正

# sudo vi /private/etc/httpd/users/myuser.conf 

でファイルを開いて以下の設定を追加。

<VirtualHost *:80>
  DocumentRoot "/Users/myuser/Sites/bookmark/web"
  DirectoryIndex index.php

Alias /sfbookmark /Users/myuser/Sites/bookmark/web/app

<Directory "/Users/myuser/Sites/bookmark/web">
AllowOverride All
</Directory>
</VirtualHost>

apachを再起動すると以下のURLでデフォルト画面にアクセスできるようになります。

http://localhost/

参考:サブディレクトリにインストールするやり方(英語)

次に、使用するデータベースのスキーマを作ります。MySQLを使用。

テンプレートをコピーし、

# cp config/schema.xml.sample config/schema.xml

以下のXMLを張り付け。

<?xml version="1.0" encoding="UTF-8"?>
 <database name="symfony" defaultIdMethod="native">
   <table name="bookmark_items" phpName="Items">
     <column name="id" type="integer" required="true" primaryKey="true" autoincrement="true" />
     <column name="title" type="varchar" size="255" />
	 <column name="url" type="varchar" size="255" />
   </table>
 </database>

で、モデルの作成。

# symfony build-model

sqlファイルを作成。

# symfony build-sql

ディレクトリを移動すると

# cd data/sql
# ls

schema.sql sqldb.map

といった感じでsqlファイルが作成されている。
DBを用意し、

# mysql admin -u youruser -p create bookmark
# mysql -u youruser -p bookmark < data/sql/schema.sql

と言った感じにテーブルを作成。

次にorm.ymlファイルを修正

# vi app/config/orm.yml
all:
  adapter:  mysql
  host:     localhost
  database: bookmark
  username: youruser
  password: yourpass

次にアプリケーションのscaffoldingを作ります。
これは、データベースのやり取り・CRUD(Create Read Update Delete)のテンプレートを自動的に作成してくれる機能です。この機能のおかげでSQL文をやこまかい処理を意識する事無くデータベースとやり取りするページのベースを作成してくれます。

まずはこんな感じに。

# symfony generate-propelcrud app items items

http://localhost/items

にアクセスすると、一覧が取得でき、編集できるページができています!

全体の見栄えをいじるのは

app/templates/layout.php

今作ったアクションの見栄えをいじるのは

app/modules/items/templates/以下

またアクションをいじってモジュールの動作を変える事もできます。

app/modules/items/actions/actions.class.php

注意するべきはそれぞれのファイルに命名規約があり

モジュールのクラス名は

モジュール名Actions

となり、アクションは

actions/actions.class.php

内のメソッド名に

executeアクション名(最初の文字は大文字)

と言った具合に書いていきます。なので、たとえば、itemsというモジュールにlistというアクションを追加するなら

class itemsActions extends sfActions
{
	public function executeList()
	{
		// ここにコードを書いていく
	}
}

の用な形式になります。

また、テンプレートはtemplatesフォルダ以下に

アクション名Success.php

のかたちでファイルを作成していきます。

空のメソッドとHTMLだけのテンプレートを用意すると、何の処理も加えずテンプレートに記述したまま表示します。

と言った具合で、単純ではありますが、初めてのウェブアプリができました!

簡単に試したい人はsandboxも最近公開されてるみたいです。
(いろいろバグがあるみたいですけど。。。)

symfonyは個人的にかなり面白いと思ったので、なにか技を発見したら随時公開していこうかと思います。

2006年01月31日

OSXでviを使おう

いままではmiをメインに使ってたのですけど、まどろっこしくなってきて、最近viを使う事が多くなってきました。Emacsも挑戦したのだけど、OSXのデフォルトで入っているのは動きがちょっともっさりしてて、操作も難しすぎるので即諦め。

というわけで、viをちょっとカスタマイズしてみたくなりました。

OSXのviは正確にはvimのことらしく、viの高機能版という位置づけらしいです。viのカスタマイズはユーザディレクトリの.vimrcというテキストファイルを編集して行います。

ぼくが設定した.vimrcはこんな感じ。

:set enc=utf-8
:set fenc=utf-8
:set fencs=sjis,iso-2002,euc-jp
:map z $
set autoindent
set showcmd 
set ruler
set incsearch
set number
syntax enable
autocmd FileType php :set dictionary=/Users/myUser/.vim/dict/php.dict
:colorscheme desert
:set softtabstop=4
:set showmatch
:set matchtime=15

.vimrcから読み込むファイルはユーザーディレクトリの下に.vimというディレクトリを切ってそこに入れるそうです。

syntax enableにして色付けを行い、入力補完で、phpの辞書を入れておきました。

参考:Vim で PHP 関数の辞書を作成する方法についてのメモ

インサートモードで入力したいphpのスクリプトを数文字入れて「Ctrl-x, Ctrl-k」を押すと候補が出てきます。

カラースキームも変更できるみたいで、その場合は.vim/colors以下にファイルを保存して、

:colorscheme スキーム名

で有効になるらしい。とりあえず、desertというカラースキームが見やすそうなので採用。

参考:カラースキーム

という事で、viの画面はこんな感じになりました。

vim.gif

脳内補完がすすめばコードがはやく打てそうな感じ。

その他参考:
Vim日本語ドキュメント
viのコマンドモード早見表

About 2006年01月

2006年01月にブログ「minfish.jp/blog」に投稿されたすべてのエントリーです。過去のものから新しいものへ順番に並んでいます。

前のアーカイブは2005年12月です。

次のアーカイブは2006年02月です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 3.35