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の三つに共通して言える事は、ユーザインタフェースのデザインが悪いという点です。本当に必要な機能の選択と配置ができていないために、色々と機能がありますが使いにくいデザインになっています。

2010年2月7日日曜日

iPod touchとiDisk

iPhone OSが3.1になった辺りから、iPod touchとiDiskの相性が悪くなっています。

WiFiが使えない、あるいはWiFiを切った状態でiDiskを起動したり、「最近使った項目」のPDFファイルを読もうとすると「予期しないエラー (年月日と時間)予期しないエラーが起きました(22)。」と表示されます。

この件に関するAppleのSupport Discussionsを見つけましたが、結論は出ないままでした。

Apple - Support - Discussions - MobileMe iDisk app broken on iPhone OS ...

iPhone OSが3.1.3になっても状況は変わらず、2009年9月11日の最初の投稿以来 5ヶ月間、解決策がないままになっています。Appleでは症状が出ないとか書かれていて、不思議な話です。

2010年1月14日木曜日

OptiBay Hard DriveKit

チョット気付かなかった商品が出ました。

MacBook Proは私も使っていますが、なぜかこのような商品は思い付きませんでした。

MCE OptiBay Hard DriveKit(オプティベイ ハードディスクKit) for for MacBookPro 15/17インチ(ユニボディ) and MacBook(ユニボディ) スリムドライブ内蔵用ケース付 [OBSATA0GB-UNB+Case]:秋葉館楽天市場店
http://item.rakuten.co.jp/akibakan/10012744/

光ドライブをHDDに入れ替えようという商品で、さらに取り外した光ドライブは外付けドライブに利用しています。

HDDの容量が増えるという点でもよいのですが、取り外した薄型光ドライブを外付けにして無駄にしないだけでなく、持ち運びによる故障からも守れるという点が秀逸です。

正直言って薄型の光ドライブを持ち運びに使用するのは・・・個人的にはいい気持ちがしません。もちろん数年前と比べれば雲泥の差で良くはなっていて、少々のホコリにも強くはなっていることは聞いていますが・・・心配です。その意味でMacBook Airや最近の光ドライブなしの小型で廉価なノートPCは思い切った良い製品だと思っています。

この商品はそのような心配をなくし、さらに容量を増やせるという意味で興味深いと思います。また、元のHDDも含めてSSDにして振動対策も万全にするというのも一案かもしれません。

欲しくなってきました(笑)

2010年1月7日木曜日

WebページのPDF変換

AppleのSafariでWebページをPDFに変換しようとするとうまくできない場合があります。たとえば以下のIBMのサイトです。

http://www.ibm.com/developerworks/library/j-classpath-unix/

このページをMac OS XのプリントでPDFに変換すると以下のようになります。


きっと何処かに見たままにPDF変換できる方法がありそうに思うのですが、見つかりません。不便に思っていると、以下のような記事を見つけました。

[ウェブサービスレビュー]ウェブページの好きなところだけを印刷できる「PrintWhatYouLike」:レビュー - CNET Japan
http://japan.cnet.com/review/editors/story/0,3800080080,20397652,00.htm

実際のサイトは以下の場所にあります。
PrintWhatYouLike.com
http://www.printwhatyoulike.com/

試すと以下のようになりました。

2010年1月5日火曜日

ACアダプタの謎

昔から不思議に思っていた謎が解けました。

AppleのACアダプタは真四角のデザインで、日米の二端子コンセントプラグであれば美しくまとまったデザインです。しかし、他の国で採用されている三端子プラグなどはどういうデザインなのだろうと思っていました。

こう言うデザインです。
まずは220Vの三端子プラグ アダプタはこんな感じで、かなりデカイです。

組み立てるとこんな感じになりますが、ブザマと言うのは言い過ぎでしょうか?

2009年11月20日金曜日

InDesignのJavaScript

知人からの相談でInDesignのJavaScriptをいじっているのですが、日本語版と英語版でかなり異なるようです。

メソッドやプロパティの一部は日本語版にはあって英語版にはなかったり、プロパティがあっても読み出し専用になったりしています。さらに、CS2のメソッドの一部がCS3やCS4では大幅変更されて使えなくなっています。

既存のスクリプトの表記を少し手直しするだけのはずが、何度も書き直しをする羽目になりました(苦笑)