cron の設定ですべての行に#を付けてコメントにして保存して終了。再度開くとすべて消えているのね。そんなものなのか。
今回やってしまってビックリした。cronの設定のバックアップがあったので事なきを得た。
とある5丁目で活動する還暦を過ぎたWebプログラマーの覚え書きです。それとかかってくる迷惑電話や、家業のアパート経営について。
cron の設定ですべての行に#を付けてコメントにして保存して終了。再度開くとすべて消えているのね。そんなものなのか。
今回やってしまってビックリした。cronの設定のバックアップがあったので事なきを得た。
アマチュア無線のログデータの交換フォーマットであるADIFデータフォーマットを解析して、PHPの配列に展開するクラスライブラリであるphp-adifをGitHubに公開しました。ここからダウンロードできます。バグ報告は、GitHubのPull Requestで受け付けます。
アマチュア無線は今となっては、とてもマイナーな趣味であり、しかもそのログ交換データフォーマットですので、ほとんど使われることはないでしょうね。もし、ログを取り込んで処理をするなんてアプリケーションを作成するときにお使いください。自分もこのクラスライブラリを使って、もっとマイナーなサービスを作成しようかな・・・。
今回はソースを公開するというよりも、試しにGitHubでどのようにソースを公開するかを理解するほうの実験の意味合いが大きいと思います。
アマチュア無線のログデータを交換するデータ形式にADIF(Amateur Data Interchange Format)というものがあります。趣味のプログラムでインポートクラスライブラリをPHPで作成してみました。
ADIFでは
Head Data Head Data Head Data
<eoh>
<call:6>WN4AZY<band:3>20M<mode:4>RTTY<qso_date:8>19960513<time_on:4>1305<eor>
<call:5>VK9NS<band:3>40M<mode:5>PSK63<qso_date:8>20101022<time_on:4>0111<eor>
のような形式になります。元々の仕様は、シングルバイトしか考えていないようなので、こちらに日本語を含んだマルチバイト文字を設定すると対応が難しくなります。見ての通り、コロン(:)の次にはデータ長が入ります。例えば、日本で一番使われている某ログソフトではシフトJISしか考えていないので、日本語を含んだコメントは
<comment:6>テスト
のようにマルチバイト文字は2バイトで出力されてしまいます。しかし、UTF8上では、2バイトに限らないので、このデータ長での指定は使えません。<>の区切り文字で解析していくことになります。コメントに<を使われたりすると、値の終了がどこだかわからなくなってしまいます。シフトJISのまま処理しようすれば、マルチバイト文字の2バイト目に<を使われれば難しくなります。
ADIFのドキュメントを読んでも<>:のような区切り文字をエスケープすることは記述されていませんので、どうしてもデータ長で値を読み込んで行くのでしょう。
某ログソフトのADIFのエクポートが、
<comment:3>テスト
のように、文字数で出力してくれればいいのにと思うのですが、昔のシフトJISを基準にしているので無理だろうなと思うのでした。後はADIFのバージョン3に記述されているXMLベースのADXファイルフォーマットに期待です。
電波を出すには必ずアマチュア無線の国家資格が必要です。電波法令を守って楽しみましょう。
MongoDBの「Quickstart」の「Install MongoDB on Windows」に従って、サービスで動かそうとすると、
C:\>\mongodb\bin\mongod.exe --config=c:\mongodb\mongod.cfg
all output going to: C:\mongodb\log
logpath [C:\mongodb\log] should be a file name not a directory
Thu Aug 16 14:16:10 dbexit:
Thu Aug 16 14:16:10 shutdown: going to close listening sockets...
Thu Aug 16 14:16:10 shutdown: going to flush diaglog...
Thu Aug 16 14:16:10 shutdown: going to close sockets...
Thu Aug 16 14:16:10 shutdown: waiting for fs preallocator...
Thu Aug 16 14:16:10 shutdown: closing all files...
Thu Aug 16 14:16:10 closeAllFiles() finished
Thu Aug 16 14:16:10 dbexit: really exiting now
なんてエラーになってサービスに登録できない。ドキュメントの通りのままだと動かないようだ。
そこで、C:\mongodb\logに空のlog.txtというファイルを作って、c:\mongodb\mongod.cfgに
logpath=C:\mongodb\log\log.txt
dbpath=C:\mongodb\data
というようにファイル名まで指定してあげると
C:\>\mongodb\bin\mongod.exe --config=c:\mongodb\mongod.cfg --install
all output going to: C:\mongodb\log\log.txt
C:\>net start MongoDB
The Mongo DB service is starting.
The Mongo DB service was started successfully.
のように無事に起動できるようになった。
CakePHPでMongoDBをつなげてテストデータの投入のシェルとかを書いています。
データの投入の前にMongoDBのコレクション(RDBならテーブルかな)の全データクリアをしたいのですが、今まではこのようにTRUNCATEをSQLで呼び出していました。
$this->Model->execute('TRUNCATE TABLE table);
これはMongoDBでは動きません。MongodbSource.phpにはtruncate()というメソッドがりますが、どう呼び出したら動くかわからず、以下のようにしました。
$this->Model->query(array('$eval' => 'db.collection.drop();'));
$evalってなあに? といった状況です。もっといい方法があるかも。
PHPのマイナーなフレームワークを調べていたら、既に日本人によるユーザー会が立ち上がっていた。
オープンソースのカンファレンスに行くと、とってもたくさんのユーザー会が存在することがわかる。まるでユーザー会立ち上げマニアがいるみたいだ。立ち上げたらキチンとユーザー会としての活動をしてくれればいいのだが、飽きたかどうかわからないが、放置されているユーザー会も多いこと。
ちなみに前述のユーザー会のホームページの最終更新日は、去年の11月でした。国内のユーザー会が分裂してしてグダグダになって、周りから取り残されてしまったオープンソースのCMSもあったけ。
最近買った格安タブレットのSmartQ K7ですが、充電アダプターは付属していません。USBケーブルから充電します。
手元にあるAC-USBアダプターで充電してみたが、充電できないアダプターがあるようです。
PCIの1個口のアダプターはダメ。ノーブランドの2個口もダメでした。充電できたのは、ダイヤテックのAC-USBアダプターでした。アンペアの関係でしょうか?
ちなみにPCから直接つないだUSBケーブルでの充電はOKでした。これが一番安全かもしれません。あとはプリンストンのBluetoothのヘッドセットのACアダプターが、たまたまプラグがあっていたので、これでも充電できました。
Google+: View post on Google+
iPodがダメならiPhoneということで渋谷のビックカメラで購入。最初からアップルのことだからiPodは修理不能と諦めていました。
手続きして30分ほどで引き渡し。説明、確認と、携帯電話を購入するときって、何でだんだん面倒になっていくのかな・・・。
早速、帰りの電車の中でアドレス帳の引き継ぎの設定を始めます。しかし、ネットワークにつながらないなんておっしゃいます。
家に帰って調べてみると、iPhoneのアクチベーションをしなければいけないのね。ビックカメラの店員さんは、何も言ってなかったな。
リセットしてアクチベーションを行います。途中、アップルIDをメールアドレスで入れろと言われたので、ツレのアドレスを入れたら既に登録していると怒られた。この辺りはよくわからなかった。Gmailのアドレスを入れたら何となくOKだった。皆さんよくiPhoneの設定がわかるのね。Androidの端末を持っていると、逆にわからないかもしれない。
アドレス帳の同期をとって、PCのiTunesとミュージックの同期をとって、保護フィルムを貼ってツレに引き渡して完了。何か仕事でiPhoneでチェックするときには使うことを申し渡しておく。
Google+: View post on Google+
CakePHP2のテストで、$defaultのDBを見に行ってしまう。と書きましたが、解決しました。
/App/Model/AppModel.php で__construct()を定義したとき、正しく引数を受け取って親クラスに渡してあげないといけなかったようです。
public function __construct($id = false, $table = null, $ds = null) {
parent:__construct($id, $table, $ds);
// 何かの処理
}
のように引数を明示的に書いてあげます。
テストケースのsetup()にあるモデルを設定しているClassRegistry::init()が中で$useDbConfigをtestでモデルオブジェクトをインスタンスにしているところがあって、そのときのパラメータがクラスに引き渡されていないのが原因でした。
CakePHP2でテストするときに、/app/Config/database.phpの$testではなくて$defaultで指定したDBを見に行ってしまいます。こちらの対処方法のメモ。
テーブルにtext型の項目があると、memoryではなくてMyISAMでテストのテーブルを自動的に作りに行きます。この辺りが関係しているかもしれません。こちらはbakeすると、Fixtureの$fieldsの中にtableParametersに設定されています。
テストの途中でexit()して上げると、$testのほうのDBにテストのためのテーブルをFixtureからcreate tableしてくれていることを確認できます。しかし、テストケースでは、$defaultのほうのDBを見に行きます。
CakePHP2のCookbookに書いているように、Fixtureに
public $useDbConfig = 'test';
と書いてもダメでした。
public $import = array('table' => 'articles', 'connection' => 'test');
のようにしてもダメ。
結局は、
class ArticleTestCase extends CakeTestCase {
public $fixtures = array('app.Article');
public function setUp() {
parent::setUp();
$this->Article = ClassRegistry::init('Article');
$this->Article->useDbConfig = 'test';
}
のように無理矢理モデルの$userDbConfigにtestをして対応しました。
もっと良い方法があるのでしょうね。これだと、joinされたFixtureのテーブルデータだと見つからないのてテストできないとか問題が残ります。
マニュアルに書いていないことは何とか対応しなければいけないのは大変です。