2010年3月17日水曜日

JammingからLogophileへ

これまで愛用してきた辞書検索ソフトJammingをアップグレードしてLogophileにしました。JammingとLogophileは複数の辞書を一度に検索して表示するのでとても便利です。 Jammingが持っていた文字の入力などの問題はLogophileで解消されていますが、今まで使ってきたCambridge Advanced Learner's Dictionaryという辞書が使えなくなりました。Logophileの説明ではこの辞書の第二版と第三版はサポートしているそうですが、第一版はあまりにも古いので除外したのかもしれません。現行版を買う良い機会です。 ところで、私の環境(PowerPC)でLogophileが奇妙な挙動をしています。研究社の和英英和辞典*1で参照の→をクリックすると全て"zzz, z-z-z-"(マンガのいびき)という単語にジャンプします。PowerPCでは遅すぎて寝てしまうようです(笑) *1) 研究社 1995 新英和中辞典 第6版 新和英中辞典 第4版 LogoVista

2010年3月15日月曜日

SQLiteとPHP

AppleのサイトにSQLiteとPHPをMac OS Xで使う方法が書かれていました。

PHP the Easy Way: Enabling PHP and SQLite on Mac OS X Leopard http://developer.apple.com/mac/articles/internet/phpeasyway.html

しかし、ここに書かれているPHPとSQLiteを使用するスクリプトはそのままではMac OS X 10.5.8では動きません。すこし調べてみると、ソースコードを以下のように変更すると動作しました。
■ 変数を表す'\$'を全て'$'に変更
■ PDOの引数を変更
1. PDO命令の引数'sqlite:'の後にデータベース名'../Public/Drop Box/test.db'を追加
2. PDOは引数のセパレーターを','に変更
3. 引数のユーザ名が変数'$user_db'を初期化宣言
最初の項目はPHPの通常の変数宣言方法にしただけです。

次の項目は、PDO命令の引数を三カ所変更しています。
まず、データベース名が指定されていない問題の修正と、データベースを保存する場所の指定です。'../Public/Drop Box/'ディレクトリのパーミッションは他のユーザからは書き込みのみの設定になっています。'~/Sites'ディレクトリのパーミッションを書き込み可能にする方法もありますが、後で元に戻すのを忘れた場合に危険であると考えてこのようにしています。

次に、セパレータが'.'になっていたものを','に変更しました。

最後に本来はユーザ名が設定されるべき引数に初期化宣言されていない変数'$user_db'が設定されていたため、この変数を初期化宣言しています。今回は暫定的に'myName'で初期化していますが、変数'$user_db'自体を削除してしまうのも一案です。この場合には文末の'echo'文にある変数'$user_db'も削除します。

以上の変更を加えて、さらにHTMLに入れたものが以下のようになります。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
 <meta http-equiv="content-type" content="text/html; charset=utf-8">
 <title>php_sqlite</title>
</head>
<body>
<?php
// create a SQLite3 database file with PDO and return a database handle (Object Oriented)
$user_db = 'myName';
try {
 $dbHandle = new PDO('sqlite:../Public/Drop Box/test.db','$user_db');
}catch(PDOException $exception){
 echo 'test error<br>';
 die($exception->getMessage());
}
// create page view database table
$sqlCreateTable = 'CREATE TABLE pageView(id INTEGER PRIMARY KEY AUTOINCREMENT, page CHAR(256), access INTEGER(10))';
$dbHandle->exec($sqlCreateTable); // remove or 'comment out' this line after first run
// insert page visit in database with a prepared statement
$sqlInsertVisit = 'INSERT INTO pageView (page, access) VALUES (:page, :access)';
$stmt = $dbHandle->prepare($sqlInsertVisit);
$stmt->bindParam(':page', $_SERVER['PHP_SELF'], PDO::PARAM_STR);
$stmt->bindParam(':access', time(), PDO::PARAM_INT);
$stmt->execute();
// get page views from database
$pageVisit = $dbHandle->quote($_SERVER['PHP_SELF']);
$sqlGetView = 'SELECT count(page) AS view FROM pageView WHERE page = '.$pageVisit.'';
$result = $dbHandle->query($sqlGetView);
$pageView = $result->fetch(); // store result in array
// print page views and filename
echo '<blockquote>This page has been viewed <b>'.$pageView['view']. "</b> times, according to <em>$user_db</em>.</blockquote>";
echo '<blockquote>Edit <em>'.$_SERVER['SCRIPT_FILENAME'].'</em>
to learn how this works.</blockquote>';
?>
</body>
</html>
上記のスクリプトをファイル名"test1.php"等として、ホームディレクトリの'~/Site/'に置いて以下のULRでアクセスします。
http://localhost/~(userName)/test1.php
なお、上記のファイルの少し編集すると「Web 共有」を「切」にしたままでTerminalから以下のように実行する事もできます。
php -f (ファイル名:例test2.php)
まず、上記コードの'<?php'から'?>'までを別のテキストファイル(ファイル名:例test2.php)にし、データベースの保存場所を変更します。コードは以下のようになります。
<?php
// create a SQLite3 database file with PDO and return a database handle (Object Oriented)
$user_db = 'myName';
try {
 $dbHandle = new PDO('sqlite:test.db','$user_db');
}catch(PDOException $exception){
 echo 'test error<br>';
 die($exception->getMessage());
}
// create page view database table
$sqlCreateTable = 'CREATE TABLE pageView(id INTEGER PRIMARY KEY AUTOINCREMENT, page CHAR(256), access INTEGER(10))';
$dbHandle->exec($sqlCreateTable); // remove or 'comment out' this line after first run
// insert page visit in database with a prepared statement
$sqlInsertVisit = 'INSERT INTO pageView (page, access) VALUES (:page, :access)';
$stmt = $dbHandle->prepare($sqlInsertVisit);
$stmt->bindParam(':page', $_SERVER['PHP_SELF'], PDO::PARAM_STR);
$stmt->bindParam(':access', time(), PDO::PARAM_INT);
$stmt->execute();
// get page views from database
$pageVisit = $dbHandle->quote($_SERVER['PHP_SELF']);
$sqlGetView = 'SELECT count(page) AS view FROM pageView WHERE page = '.$pageVisit.'';
$result = $dbHandle->query($sqlGetView);
$pageView = $result->fetch(); // store result in array
// print page views and filename
echo '<blockquote>This page has been viewed <b>'.$pageView['view']. "</b> times, according to <em>$user_db</em>.</blockquote>";
echo '<blockquote>Edit <em>'.$_SERVER['SCRIPT_FILENAME'].'</em>
to learn how this works.</blockquote>';
?>
上記のファイルをphp命令の引数(例test2.php)として渡して実行させます。なお、手軽に試す事を目的としているために、出力結果は正しく改行されず<em>などのhtml文字列も含まれます。

さらに、上記のファイルを以下のようにするとTerminalから通常の命令と同様に実行できます。
まず、上記のファイルの先頭に以下の一行を付け加えます。
#!/usr/bin/php
上記のファイルをファイル名'test.sh'等として保存し、Terminalから以下の命令を実行します。
chmod 744 (ファイル名:例test.sh)
上記の変更を加えて実行形式にしたファイルは以下のように実行できます。
./(ファイル名:例test.sh)
なお、上記の二例ではデータベースのファイル'test.db'はそれぞれのファイルが置かれている場所に保存されます。

2010年3月8日月曜日

iPhone側でFTPやWebDAV


iPhone OS側でFTPやWebDAVのファイルサーバを開いてデータをやり取りしているAppを続けて見つけました。

EBPocket free
無料の辞書検索ソフトで、EPWINGという書式の辞書データを検索できます。コンピュータから辞書データをiPhone OSに転送して検索しますが、この転送時にiPhone OS側でFTPサーバを開いて転送します。Finder標準の[サーバへ接続...]命令のFTPは読み出し専用のため、Mac OS X標準のftp命令をターミナルで使います。

Discover
無料のファイル共有ソフトです。AppleのMobileMeのiDiskでも採用されているWebDAVでiPhone OSにファイルサーバを開き、iPhone OSにファイルを転送するとpdfなどのファイルが見られます。Finder標準の[サーバへ接続...]命令で、WebDAVサーバ内のファイルを読み書きできます。

ただし、Discoverは取り込んだデータを呼んでいる最中もWebDAVサーバが起動したままのように見受けられ、消費電力が気になります。

似たようなプログラムにDoc Viewer Liteがありますが、こちらはMac OS X側でFTPサーバを開いて、Doc Viewer Liteから取り込みます。無料版ではコピーできるファイル数に制限があります。

Apple標準のファイル共有ソフトとしてiDiskがありますが、わざわざInternet上のサーバ経由でデータをやり取りするのは面倒ですし、重要なデータをInternet経由で転送するのは保安の意味でも気になります。

EBPocket freeとDiscover、Doc Viewer Liteの三つに共通して言える事は、ユーザインタフェースのデザインが悪いという点です。本当に必要な機能の選択と配置ができていないために、色々と機能がありますが使いにくいデザインになっています。