2006/12/20

PHP file_exists() と is_file()

ファイルの存在確認には file_exists() を良く使います。が、これはファイル、もしくはディレクトリがあれば true を返すという関数です。で、またはまったのですが。

$chech_file = $my_dir . "/" . $my_file;
if (file_exists($check_file))....

とすると $my_file が指定されていなくても $my_dir は存在しているので答えは true になってしまいます。このときは

if (is_file($check_file))....

とすれば false が返ってきます。

2006/12/17

PHP mojavi + smarty + calendar

フレームワークの mojavi と、テンプレートの smarty、そして PEAR の Calendar を利用してカレンダーを書くことに挑戦。

ディレクトリは以下のようになります。

home_directory
+ mojavi
+ lib
+ opt
+ Calendar
+ Decorator
+ Engine
+ Month
+ Table
+ Util
+ smarty
+ internals
+ plugins
+ public_html
+ webapp
+ modules
+ MyCalender
+ actions
- YoteihyouAction.class.php
+ templates
- yoteihyou.tpl
+ views
- YoteihyouView_success.class.php

YoteihyouAction.class.php ファイル

<?php
require_once(OPT_DIR . 'Calendar/Month/Weekdays.php');
class YoteihyouAction extends Action
{
function execute (&$controller, &$request, &$user)
{
$year = 2006;
$month = 12;

$calendar = new Calendar_Month_Weekdays($year,$month,0);
$calendar->build();

$week = 0;
while ($day = $calendar->fetch()) {
$the_day = array();
$the_day['bgcolor'] = "#FFFFFF";
if ($day->isFirst()) {
$the_day['bgcolor'] = "#FFCCFF";
$week++;
} else if ($day->isLast()) {
$the_day['bgcolor'] = "#B3E7FF";
}

if ($day->isEmpty())
{
$the_day['day'] = " ";
} else {
$the_day['day'] = $day->thisDay();
}
$calendar_list[$week][$day->thisDay()] = $the_day;
}

$request->setAttribute('calendar_list', $calendar_list);
$request->setAttribute('year', $year);
$request->setAttribute('month', $month);

return VIEW_SUCCESS;
}
}
?>

YoteihyouView_success.class.php ファイル

<?php
require_once(LIB_DIR . 'CustomSmartyRenderer.class.php');
class YoteihyouView extends View
{
function & execute (&$controller, &$request, &$user)
{
$renderer =& new CustomSmartyRenderer ($controller, $request, $user);
$renderer->setTemplate('yoteihyou.tpl');
$renderer->setAttribute('year', $request->getAttribute('year'));
$renderer->setAttribute('month', $request->getAttribute('month'));
$renderer->setAttribute('calendar_list', $request->getAttribute('calendar_list'));

return $renderer;
}
}
?>

yoteihyou.tpl ファイル

<head>
<meta equiv="Content-Type" content="text/html; charset=euc-jp">
<meta equiv="Content-Language" content="ja">
<title>新しいページ</title>
</head>
<body>

<table border="0" cellpadding="2" cellspacing="0">
<caption>{$year} 年 {$month} 月</caption>
<tr>
<th align="center"><span style="color:#FF0000;">日</span></th>
<th align="center">月</th>
<th align="center">火</th>
<th align="center">水</th>
<th align="center">木</th>
<th align="center">金</th>
<th align="center"><span style="color:#0000FF;">土</span></th>
</tr>
{foreach from=$calendar_list key=week item=values}
<tr>
{foreach from=$values key=day item=the_day}
<td bgcolor="{$the_day.bgcolor}" align="right">
{$the_day.day}
</td>
{/foreach}
</tr>
{/foreach}
</table>

</body>
</html>

2006/11/21

日本PostgreSQLユーザ会九州支部セミナー

11月20日に久しぶりにセミナーが開かれることになり、私も参加してきました。

PostgreSQL のバージョン8.2のお披露目第一号になる予定だったそうですが、残念ながらリリースが延びてしまい、予告編と言うことになってしまいました。それでも新機能については「石井達夫」氏が自ら解説されて大変充実したものとなりました。

その後の懇親会も和気藹々とした雰囲気の中で、技術的な話から失敗談までいろいろな話題で盛り上がっていました。私はと言えば、頓珍漢なことを言ってせっかくの話に水をさしてばかりで、皆様には迷惑ばかりをかけていたようです。

ここしばらく、この手の集まりに参加してなかったのですがやっぱり良いものです。これからも積極的に参加していきたいと思っています。

2006/11/16

pgAdmin III を使っての作業

コマンドラインから、カチャカチャするのに比べたらものすごく楽です。

で、またハマッタ話。 (こればっかり)

pgAdmin III を立ち上げると、まずどのサーバに接続するかを選択します。このときにきちんと目的の利用者でオープンすれば何のことはないのですが、ついつい手を抜いてデータベース管理者の権限でオープンしてしまいます。同一サーバ内の別のデータベースが気軽にのぞけてしまうので、なかなかやめられません。

が、ここで「クエリーツール」を呼び出して create table とかをしてしまうと、テーブルの所有者がデータベース管理者になってしまいます。当然です。で、ここでアプリケーションから接続するとどうなるか。利用者が違うので当然今作ったテーブルにはアクセスできません。あ~~。しかしここであせってしまうわけです。プログラムを見直してもどこもおかしくないのに、テーブルからデータが取得できない・・・

半年ぐらい前にもハマッテしまったということは内緒です。

2006/10/27

GetShortPathName

長いファイル名を短いファイル名に変換します。

.Net にはこの変換手続きがないので kernel32.dll を使います。こんな感じ。

[DllImport("kernel32.dll")]
extern static int GetShortPathName(string s1, StringBuilder s2, int i1) ;

public static string Long2Short(string long_pass)
{
StringBuilder short_pass = new StringBuilder(260);
System.Diagnostics.Process process = new System.Diagnostics.Process();
GetShortPathName(long_pass, short_pass, short_pass.Capacity) ;

return short_pass.ToString();
}


で、戻り値に注意しないといけないのですが、実はこの関数は実在するファイル・ディレクトリしか変換してくれないんですね。ということは実在しないファイルを指定するとどうなるか、空が帰ってきます。

これで、はまってしまいました。 fileOpen のときは問題ないのですが fileSave のとき新規に保存しようとすると処理に失敗してしまいます。調べてみるとまだ存在しないファイルなので変換が行われずコケていたと言う落ちでした。

2006/09/29

買いたい本

ちょっと懐が、でも欲しい。
忘れないために張っておきます。

2006/09/19

Zebra5 機能限定版の公開開始

Zebra5 の機能限定版を新たに作りました。今までの Zebra5 を「フル機能版」と位置づけて、それに対して機能限定版とし、価格も大幅に引き下げてお求めやすい物としました。

小規模事業所などで Zebra5 を利用する人が限られているような場合や、運用で十分セキュリティを確保できるようなお客様に、簡単に設定できて簡単に運用できるようになりました。

基本構成は「 Zebra5 PostgreSQL Windows 版同梱」 と同じですが、Zebra5 にいくつかの機能制限が設けられています。
  • 利用者管理機能を省略
    利用者ごとにレベルわけをして閲覧・変更の権限を与える機能がなくなり、全ての利用者が全ての機能を利用できるようになりました。
  • ログ(操作記録)の作成を省略

  • 自由に設計できる表8枚を省略
    表名・項目名は自由に設定変更ができますので、未使用の項目があればそれを割り当てることができます。
  • 運用形態は Windows マシンに全てをインストールするスタイルのみ
    ネットワーク関連の設定が省略されています。

  • そのほかの機能(自由に設計できる帳票、全ての項目が対象となる検索機能、項目同士の四則演算機能、分析機能など)は、フル機能版と同様に利用することができます。

    価格は税込みで¥50,400です。

    島村製作所のホームページからダウンロードできます。
    http://www.shimamuraworks.com/

    2006/09/08

    Zebra5 PostgreSQL 同梱版の公開開始

    Zebra5 のインストールセットに PostgreSQL Windows 版を同梱したバージョンの公開を開始しました。


    今まではクライアントアプリケーションプログラムである Zebra5 と、データベースソフトである PostgreSQL を別々にダウンロードしてきて、別々にインストールする必要がありました。しかしこれではコンピュータに詳しくない方々にはちょっと敷居が高く感じられたようです。

    そこで、新しいバージョンからは今までどおりのインストール方法に加えて、PostgreSQL も同時にインストールでき、途中の設定を省いたバージョンを提供することになりました。これでインストールすれば今までの手間が大幅に省略できます。現場の担当者の方でも試しにインストールしてみることが簡単にできるようになりました。

    是非お試しください。

    ホームページ
    http://www.shimamuraworks.com/

    ダウンロードページ
    http://www.shimamuraworks.com/computer/application/zebra/download.html

    2006/08/11

    DataSet WriteXML ReadXML

    データベースにある特定のデータを自由に入れ替えできるようにと思い、DataSet の WriteXML と ReadXML を使ってあれこれしていたのですが、はまってしまいました。

    数字項目と、文字項目だけからなるテーブルであれば単純に

     dataSet1.WriteXml(filename);

    と、

     dataSet1.ReadXml(filename);
     dataAdapter1.Update(dataSet1);

    で読み書きができてしまいます。しかしこれに Boolean の項目が追加されたところでハマッテしまいました。タイミング悪くひとつの DataSet に複数のテーブルを登録した場合と被ってしまって、問題の切り分けに丸一日かかってしまいました。

    で、解決策は『「スキーマ」も一緒に書き出しておく』でした。書き出し時に

     dataSet1.WriteXml(filename, XmlWriteMode.WriteSchema);

    としておくことで、スキーマ情報が付加された XML ファイルが生成されます。これを読み込めば Boolean 項目があってもすんなりと通ります。

    2006/08/05

    Zebra5 Beta 公開開始

    オリジナルパッケージソフト「個人データ管理システム Zebra5」β版の公開を開始しました。

    今回のバージョンアップの目玉はなんと言っても .Net に対応したことと、データベースソフトを採用したことです。今まではコンピュータの性能などの理由でデータを独自に管理してきました。しかしコンピュータの性能も上がり、ネットワークが当たり前になり、フリーで高性能のデータベースが登場してきたからにはこれを採用しない手はありません。採用したデータベースは PostgreSQL です。 日本語環境での絶大な支持を得ています。Windows ネイティブで動作するバージョンも安定してきたので大丈夫だと思います。

    そしてなんといっても最大の変更点は .Net Framework に対応したことです。開発言語も思い切って C# で一から書き直しました。今までは Delphi を開発言語にしていましたが、ここ数年 Delphi はちょっと元気がありません。情報も不足気味です。C# はまだ生まれてから日が浅いですが、後発の利点でかなり使いやすくなっています。

    ちょっと言い訳。プログラムを一から書き直したので、旧バージョンの機能を完全にカバーし切れていません。これからどんどん追加していく予定です。基本機能(全ての項目で検索ができること、帳票が自由に設計できること)は、押さえていますので公開に踏み切りました。

    どうか試してみてください。

    http://www.shimamuraworks.com/

    2006/07/25

    イメージの表示

    C# で PostgreSQL にラージオブジェクトとしてイメージを登録・表示する方法です。

    Npgsql のヘルプにはファイルからイメージを読み取ってデータベースへ登録したり、データベースからファイルに書き出す方法は書いてありますが、データベースから直接 PictureBox にデータを流し込む方法が書いてありません。 以下のようにすると直接流し込めます。

    NpgsqlTransaction transaction = myConnection.BeginTransaction();
    LargeObjectManager lom = new LargeObjectManager(myConnection);

    LargeObject lo = lom.Open(oid, LargeObjectManager.READWRITE);

    Byte[] byteBLOBData = new Byte[0];
    byteBLOBData = lo.Read(lo.Size());
    MemoryStream stmBLOBData = new MemoryStream(byteBLOBData);
    this.pictureBox1.Image = Image.FromStream(stmBLOBData);

    lo.Close();
    transaction.Commit();

    2006/07/03

    Npgsql

    Windows 上の C# から PostgreSQL に接続する方法はいくつかありますが、そのうちのひとつです。

    いままでは PgsqlCom を使っていたのですが、Windows 版の PostgreSQL をインストールしたら Npgsql のセットが一式入っていたのでこれで試してみました。

    順調にいっていたのですが日本語データを扱うところで躓いてしまいました。最初にコネクションを張らないといけないのですが、ここで Encoding の指定をしないといけません。PgsqlCom と同じ接続文字列だと日本語のところでこけていて、エラーメッセージに EUC_JP なんたらと出てまきす。あれこれ調べて Encoding にたどり着きました。

    同時に読み込ませる文字列も Encoding にあわせておく必要があります。C# からデータを流し込むときは文字コードが UNICODE なのですが、メモ帳などで作っただけだと ANSI になっていますので、こちらも UNICODE にしておく必要があります。

    実際には以下のような感じ

    NpgsqlConnection con = new NpgsqlConnection("Server=127.0.0.1;Port=5432;User Id=myuser;Database=mydb;Encoding=UNICODE;Password=mypass");

    あとは、その他のデータプロバイダと同じ感覚で利用できるのでアプリケーション側のスタイルが統一されてプログラムの見通しがよくなるでしょう、使いこなせれば…

    この接続文字列の Server を 192.168.1.1 のようにするとほかのサーバ ( FreeBSD など ) で稼動している PostgreSQL にも繋ぐことができます。C# 側で変更は発生しません、これは便利。

    いつもお世話になっているサイト
    http://www.postgresql.jp/

    2006/06/13

    Google Earth (Release 4 - BETA)

    見えてしまいました、自宅が・・・

    バージョン3では、低解像度で住宅地そのものがぼんやり見えているだけでしたが、こんどのは見えてますね、かなりはっきりと。データ自体がちょっと古いのが気になりますが、それでもここまで見えればたいしたものです。各国政府がやきもきするのもうなずけます。

    ゆくゆくはリアルタイムという話になるのでしょうが、情報やインフラを誰が握るのかで意味が違ってくるでしょう。いい方向に進むことを願います。

    http://earth.google.com/earth4.html

    2006/06/12

    PrintPreviewDialog

    いまさらながらに恥ずかしい話ですが、Visual Studio .new ver 2003 の C# で、印刷プレビューを表示した後、そのまま続けてプレビューウィンドウの左上にある印刷ボタンをクリックしても何にも印刷されない現象が起こります。

    でも、PrintDocument.Print() ではきちんと印刷されます。

    ん~~なんで。

    ネットを徘徊してもなかなか対処法が見つかりません。え、これって常識なの? まともな対処法は既知のことなの? と落ち込むことしばらく。やっと英語のサイトで正解を見つけました。

    なんでも、印刷用のデータが最後まで参照されてしまったから出てこないんだよ、ということで、OnBeginPrint でデータをさしているポインタを元に戻せばいいんだよ。と書いてありました。

    え~~そういう仕様なの・・・

    で、BeginPrint のタイミングでデータカウンタを「0」に戻せば、きれいに出てきました。
    でもこれって、どうだかなぁ。と思う仕様ですね。

    2006/05/17

    FreeBSD 6.1 で ssl 接続

    データベースサーバマシンを構築する必要が出てきたので、インストールのテストをやり始めました。

    といっても、インストールマシンを一台用意して・・・という作業も今は昔。Microsoft Virtual PC 様さまです。iso イメージファイルを直接 CD ドライブとしてマウントできるので CD を焼く必要もありません。何度でも手軽にやり直すことができます。微妙に設定を変えたマシンを何台も用意することもできます。ありがたいものです。

    で、本題。

    リモートから UTF-8 TeraTerm Pro で接続しようとしたら、ログインのところで失敗してしまいます。FreeBSD 4.11 のときは素直にインストールして、どこも設定をいじらずにリモートから ssh ログインできていたのですが、今回は全然駄目です。あれこれ調べたら(本当は、聞いてまわったら) ssh の既定値が変わっているとのこと、早速教えてもらったとおりに変更したらすんなりと繋がりました。

    /etc/ssh/sshd_config ファイル中の PasswordAuthentication を yes にする。

    これで、今まで通りの接続ができます。

    また、この設定変更をしなくても TeraTerm の方でログインするときに
    Use plain password to log in
    ではなく
    Use challenge/response to log in(keyboard-interactive)
    を選択することでも接続することができます。

    が、知り合いからは PuTTY を使え!!とメールが来ました。ん~~、だって PuTTY 使ったことが無いんだもん・・・

    2006/05/01

    OS の再インストール

    VMWare Player をインストールしたら OS がおかしくなってしまいました。ネットワーク関係が全て応答しなくなって、さらに、デスクトップの動作も不安定になってしまいました。アンインストールしても症状が改善しなかったので思い切って OS を入れなおすことにしました。

    Windows についての深い知識があればどこをどういじればいいのかわかると思うのですが、お恥ずかしながらそのレベルの知識を持ち合わせていません。

    やっと Windows 2000 から WindowsXP Pro になりました。

    で、なんで VMWare Player をインストールしようとしたかというと PC-BSD の VMWare 版があったので動かしてみようかなぁ、と思ったからなのでした。結局、PC-BSD はまだ見ることができません。

    2006/04/30

    SketchUp

    さすが、Google という感じです。これだけのものを Free で出すなんて。一番びっくりしたのは Google Earth との連携です。SketchUp のチュートリアルの最後は、練習で作った家のモデルを Google Earth に貼り付けるところで終了します。なんということだ・・・

    早速、自分の家を作って貼り付けようと思ったのですが、SketchUp のメニューに緯度・経度を設定する画面がありません。ヘルプには書いてあるので Free 版の制限でしょう。と、思ってあれこれいじっていると、できました。Google Earth で自分の家を表示させておいてから、そのロケーションを SketchUp に取り込むことができました。簡単な小屋を作って Google Earth に貼り付けることに成功。

    これでバーチャルマイホームが作れます。夢が膨らみますね。

    http://sketchup.google.com/

    2006/04/25

    SQL Server Express Edition のインストール

    Windows2000Pro SP4 にインストールしているのですが、MDAC のバージョンが適切ではないといって途中で止まってしまいます。

    MDAC 2.8 をインストールしてから再びインストールすると今度は Native Client が無いといって途中で止まってしまいます。

    プログラムの追加と削除に SQL Native Client はあるのですが、削除をしようとするとエラーが出て削除できません。

    で、結局OSから入れなおして、先に MDAC を入れてから SQLServer を入れるとうまくいきました。

    皆様のところではいかがですか?

    2006/04/22

    PHP でメール送信

    今回は忘備録。

    PHP で日本語のメールを送るときは mb_send_mail() を使えば文字コードのコンバートなど考えなくて大丈夫、というところに結構な落とし穴もあって…

    4番目以降の引数でヘッダーなどがいろいろ設定できるけど、この部分は自分で文字コード変換をしないといけない。

    "From: 島村製作所 <info@shimamuraworks.com>" とかを書きたいとき、これをこのまま第4引数に渡すと文字化けが発生。『島村製作所』の部分を変換する必要がある。

    $aaa = mb_convert_encoding("島村製作所", "ISO-2022-JP", "EUC-JP");
    $bbb = mb_encode_mimeheader($aaa, "ISO-2022-JP", "B");
    $headers = "From: $bbb <info@shimamuraworks.com>";
    mb_send_mail($to, $title, $body, $headers);

    こんな感じ。

    2006/04/13

    Google Calendarと Human Interface Guidelines

    Google Calendar のβ版が公開されました。ざっと見ただけなんですが、なかなか使いやすいです。ほかにもいくつか Web Calendar を使ったことがあるのですが、どれも、あっちをクリック、こっちをクリックしないとなかなか目的の操作をすることができません。その点 Google Calendar は一歩先をいってるなぁという感じがしました。

    どうしてなんだろうなぁ、と何気に考えていると思い出されるのは「モードでユーザを制限しない」という言葉。そう、Apple の Human Interface Guedelines に書かれている言葉です。プログラム屋さんの目で見ると、その場、その場に適した処理をするためには決められた筋道をとおって、決められた処理をこなしていく必要があり、それを実現する一番確実で簡単な方法が、「モード」を設けて操作を制限することです。でも、そんな事情を知らないユーザにとってみれば、やりたいことができないことほどフラストレーションが溜まるものもありません。だから、その考え方は捨てようね、といっているのですね。この本は。

    でも、これを真に受けて業務プログラムを組むと、とんでもない目にあうということも、経験してみないとわからないもので・・・  要は「使い分け」なんですが、なかなかこれが難しい。

    ネットでこの本のことを調べてみたら、復刊って盛り上がっているようですね。廃刊になってたの? 知らなかった・・・ 原書を買って辞書を片手にプログラムを組んでたの昭和の時代です(遠い目)。

    2006/04/11

    いよいよスタート

    ここでは、ハマッタ事や気がついたことなどを書き留めていこうと思います。

    まずは、格闘中の Microsoft Visual C# 2005 Express Edition から。

    「データソース」に表示されているテーブルをフォームにドラッグ&ドロップすると DataSet, BindingSource, TableAdapter, BindingNavigator と DataGridView もしくは必要なだけの TextBox が設定されます。サンプルデータベースを貼り付けると、追加・修正・削除が説明どおりに動作します。

    ところが、自分で定義したテーブルを同様の手順で設定してもデータの修正だけがどうしてもできません。 DataSet に適切な UpdateCommand が設定されていないとエラーが表示されてしまいます。

    で、テーブルに Primary Key が設定されていないことに気がついて、これを設定するとすんなりと動いてしまいました。んー、一日半悩んだぞっ!!

    これが正解かどうかはまだわかりませんが、とりあえず解決ということで。