2009/05/30

送信するContent-TypeでbloggerへHTMLを直接ポストできるとは

bloggerへメール経由で記事をポストする場合、体裁をコントロールしようと思ったら、送信前に直接HTMLコードを編集できた方が良いと思っています。
普通はそんな事を考えたりしないのでしょうけれど、改行は<br />を挿入しているか、<p>に対応する</p>が挿入されているか確認したいからです。

thunderbirdはいくらかコントロールする事が可能です。
それでもコードは確認できなさそうで、自分が二重に<p>を挿入していないかチェックするといった手段はなさそうで、ポストした後にblogger上でコードをチェックしないと不安です。

やはりメールでbloggerに記事をポストしようとするなら、普通のメールエディタとは少し違う機能が必要そうです。


ここから下はbloggerにポストした後で編集しています。
thunderbirdからポストしたオリジナルの記事はいくつか修正しています。

  • &lt;p&gt;の&部分が&amp;に変換されてしまい、タグのように表示できないため、ソースを手動で"&amp;lt;"を"&lt;"のように修正
  • 段落を囲む<p>に対応する</p>が挿入されないので手で挿入
  • ブラウザで75バイト近辺で改行されたところに<br>が入っているので、不適当なものは削除して必要なものも<br />で置き換え
  • 本物の改行は<br />で置き換えられてソースがみずらいので手動で改行
こんなところでしょうか。

改行文字は1 or 2バイト程度とはいえ、blogger全体では相当な量になるでしょうから、削除する意義があるのでしょう。(メール本文の改行コードはCRLFである必要はないはずだよなぁ…)
thunderbirdからの投稿はちょっと使えないかなぁ。

upload a blogger article via e-mail / e-mail経由でのブログ記事のアップロード

<p>e-mailインタフェースを使ったblog更新のテスト。</p>
<p>この仕組みは約に立つのか…。
<br />
他のWebを使って記事を追加する場合には、無茶してAPIを叩こうとするよりもメールで送った方が簡単かな。</p>

2009/05/28

ブログのテンプレートを更新

少し時間ができたのでbloggerに登録されている普通のテンプレートを元に自分用のテンプレートを作成してみました。

適当にテンプレートをいじって放置していたせいかアクセス数が激減していたりします。
まぁ良いんですけどね。

2009/05/19

pythonのsort()がselfを返さないとは

pythonでプログラムを書いていて、[].sort()の実装に少しはまりました。
selfを返してくると思ったんですができなくて、つまり次のようなコードが動くだろうと想定したところ失敗しました。

list01 = [0,1,2]
list02 = [2,1,0]
if list01.sort() == list02.sort(): print "success"
まぁこのコードは"success"を返すのですが、list02=[1,2,3]でも"success"が表示されます。
type(list02.sort())
<type 'NoneType'>
というわけで常に"None"同士を比較していたので、必ず"success"になってしまいます。

破壊的メソッドがselfを返すか、といわれれば微妙な感じはしますが、少なくともrubyはsort(), sort!()どちらもselfを返してくれるのでメソッドを続けて実行する事ができます。

自分でクラスを設計する時には、大抵は何か意味のある結果かNoneが戻ってしまうと思います。
何も返すものがなければselfかTrue or Falseぐらいを返すようにするのが良いと思うのですが、常にNone(==False)が返ってきやすい処理系というのはどうだろうか。

まぁ思想の違いなんでしょうけれど。

2009/05/18

Ubuntu 8.04でRAID 0デバイスを構成してみる

RAID5構成を使ってきましたが書き込み時の体感速度に満足できなかったので、RAID1を構成する事にしました。
理屈ではRAID5の方が早いはずなんですけれど、PCIカード経由のSATAと、オンボードとはいってもRAID用チップのSATAを全部足してRAID5を構成していたので、どっかでボトルネックがあるんじゃないのかなぁと思います。
hdparmではそこそこの結果を出していたんですけどね。

普通のUbuntu 8.04 amd64版 DVDから起動したものの、GUIではRAIDは構成できないので text modeで作業を進めたりしたものの、どうしてもRAIDディスク/dev/md0を削除できなくなりました。
そこで再起動してLiveモードでUbuntuを起動するとX11が動き出します。 "Install"アイコンを選ばなければ、普通のUbuntuなので"Terminal"を起動し手動でRAIDを再度構成します。

まずmdadmコマンドが入っていないので、これを導入します。

$ sudo apt-get install mdadm
続いてfdiskを使ってパーティションを確認します。
$ sudo /sbin/fdisk /dev/sda
....
Command (m for help): p
/dev/sdbについても同様にどのパーティションのIdが"fd Linux raid autodetect"になっているか確認します。
この環境では/dev/sda2 /dev/sdb2のIdが"fd"でした。 もしこれまでRAIDを構成していなければ、こんな面倒なことはせずに最悪でもalternate CDからの導入で済んだんだろうなぁ。
DVDではなくて普通のCD-ROM版ではテキストモードがないので、"alternalte"版のCD-ROMを用意する必要があります。

次はUbuntu 6.06の時と同じようにmdadmを使ってRAIDを構成していきます。

$ sudo mdadm --create --verbose /dev/md0 --level=raid1 --raid-devices=2 /dev/sda2 /dev/sdb2
これで/dev/md0が構成されるのでファイルシステムを作成していきます。
$ sudo mke2fs -j /dev/md0
$ sudo tune2fs -c 0 -i 0 /dev/md0
ここで再起動を行ないテキストモードで/dev/md0を/にマウントして導入を進めました。

古いマザーボードでいまだにAGPなビデオカードを使っていたりするし、SATAは1.5Gbしかサポートされないので、良い環境ではないですが、とりあえず大きな違いではありませんが満足するパフォーマンスは出せそうです。
Software RAID5を構成した時のチャンクサイズが64kだったりしたので、こういったところも体感速度に影響を与えたのかもしれません。

今回、RAID1を構成する前にRAID0を試してみましたが、"apt-get update"を実行中にリセットボタンを押したところ、あっという間に/homeにマウントしていた/dev/md1が不整合を起してしまいました。
RAID0を使うならRAID1+0じゃないとだめかなぁといったところです。

ああ、でもRAIDコントローラーが違うからRAID0+1で構成しないとあぶないかなぁ
RAID1+0にしておくとそれぞれのRAID1に1台づつ計2台が壊れても大丈夫だけれど、 RAID0+1だと1台までの冗長化しか取れないんだよなぁ。それでもコントローラーが壊れたりカードが不調になったりする可能性を考えればましかなぁ。

いやいや新しいマザーボードの購入を真剣に検討しましょう。

2009/05/14

シェルスクリプトのあぶないところ

pythonのblogを書いていて気がついたのですが、 スクリプトを作成する時に先頭を'#!'で始めてインタプリタを指定する事がよくあります。
その記事ではスクリプトの先頭を次のように書く事もできました。

#!/usr/bin/env python

動きとしては'#!'が特別な意味を持つものとしてOSに認識されているので、 /usr/bin/envを実行し"python", "is_equal.py"を引数として渡しています。
さらに/usr/bin/envはPATH環境変数から"python"というコマンドを探して、 /usr/local/bin/pythonのようにフルパスで起動し、"is_equal.py"スクリプトの内容を実行させようとします。

rubyやらtclshやらは/usr/local/binに配置されているという事は普通なので 不特定多数の環境で動くコードを提供しようとすると"#!/usr/bin/env"はよく使う手なのです。
この書き方はサンプルコードを配布する上では良いのですが、ユーザーがPATH環境変数を上書きしてしまうとうまく動きません。
例えばrubyが/usr/local/bin以下と~/bin以下に存在しているような場合に、それぞれライブラリが異なっていて片方ではちゃんと動いて、もう片方では動かないとか、隣りの人は動くのに、自分は使えないとか、そういう状況で「使えない」とだけメールがきてサポートするような羽目になるかもしれません。
setuidされているわけでもないので、不用意に管理者権限でコマンドが実行されたりはしませんが、 システム管理を仕事にするのなら、こういうところをちゃんと管理して意図した通りに動かしてこその管理者です。

よいマナー(作法)はあるのですが、そういうのがまとまっているところってあまりないですよね。
少なくとも必ずこれ読んどけ的なものの定番はない気がします。

Pythonの'is'と'=='の違い

pythonを使っていて、以下のようなコードを書いてはまってしまいました。

#!/usr/bin/python
l,r = "x,yy".split(",")
print l == 'x'
print l is 'x'
print r == 'yy'
print r is 'yy'
この結果は次のようになり、'is'の挙動は文字1つの場合と複数ある場合とで異なります。
$ python is_equal.py
True
True
True
False

たぶん効率化を図るコードが、1文字の文字列オブジェクトを作る時にキャッシュからコピーして返すと思うのですが、まだpythonの実装を確認していません。

'=='と'is'比較演算子は動きが違って正解なのですが、簡単なコードで検証して動いたものを本番データでテストして発覚しました。
まぁ'is'周りがおかしい事はすぐにつき止められたし、'is'を使うのは間違いだとは思いますが、今回はまりまってしまいました。

2009/05/10

Ubuntu 8.04 amd64でDB2 Express-C v9.5 fixpack2にアップグレードしてみる

そういえば仕事でUSに出張にいった時に英語を調べていて、"バージョンアップ"は和製英語だって気がついたんですよね。
なんとなくアップグレードとかバージョンアップとか混同して使っていたなぁ…。

さて、自分用にDB2 Express-CをUbuntu 8.04に導入していましたが、v9.5の後継としてv9.5 fixpack2がダウンロード可能になっていたので、インストールしました。
DB2の用語や概念はそれはそれで特殊ですが、まぁ勉強用なので簡単に使える本格的なRDBMSがあるのはありがたいです。
売り物ならFixpack2を単体でダウンロードしてv9.5に直接当てる事もできるのですが、Express-C版は無料なだけあって、そんな融通は効きません。
そこで今回はいままでのDB2 Express-C版に加えて新規に導入して、既に作成しているインスタンスを引き継ぎます。

いまはDB2 Express-C版が次のように入っています。

$ ls /opt/ibm/db2
V9.1  V9.5
今回は"/opt/ibm/db2/V9.5.2"に新規にv9.5 fixpack2版を導入します。

適当なディレクトリでダウンロードしてきた本体を展開します。

$ mkdir tmp
$ cd tmp
$ tar xvzf ../db2exc_952_LNX_x86_64.tar.gz
$ cd expc
インストーラーはreadmefirst.txtに書かれている通りに"db2setup"を使用します。
$ sudo env LANG=C ./db2setup
どうもUbuntu 8.04だと日本語が化けてしまい、手動でDB2に組み込まれているJREのfontconfig.propertiesなんかを変更する手段を取るのも不毛なので"LANG=C"を指定して英語で導入を進めます。
日本語がイイという場合には、"db2/linuxamd64/install/gui.tar.gz"を展開してプロパティファイルを置き換えたりしてから、圧縮してあげれば動きそうには見えます。Ubuntuが配布しているパッケージはちゃんとfontconfig.propertiesを置き換えてくれるので、/etc/java-6-sun/fontconfig.properties あたりのファイルと置き換えればなんとかなりそうです。

既に自分用のインスタンスがあるので、DASユーザーだけ作成してインスタンスの作成はスキップして新規ディレクトリに導入を始めます。
基本的にはこれぐらいでUbuntu 8.04にDB2 Express-C版が導入できました。

インスタンスの引っ越しは普通に

$ cd /opt/ibm/db2/V9.5.2/instance
$ sudo ./db2iupdt -u db2inst1 db2inst1
ぐらいで自分をfenced IDに指定して移行しています。
もし誰が作ったか分からないようなユーザー定義関数を使うならfenced IDは分離するべきなんでしょうけれどね。 自分で使うだけならGUIも余計に混乱する要素が多いので、手動でインスタンスを作ったり、カタログを作成したりする方法が便利です。
仕事で使うなら、いろいろ引き継いだり作業者のレベルを考慮してGUIにしてマニュアルを整備するんだろうけれど、ちょっとなぁ…。

2009/05/09

V-USB (a.k.a. AVR-USB) のライセンスをチェック

休日を利用してV-USBに名前がかわったAVR版ソフトウェアUSBドライバーのクライアント側コードを眺めていました。
libusbのサンプルコードを元に少し自分でライブラリを叩くと、firmwareのコードも含めてそれなり見通せるようになってきました。usbdrvのコードは複雑でまだまだ手をつけられませんが…。
とりあえず温度センサーICが余っているから気温ロガーでも作ってみる事にしましょう。 モールス信号練習機のお題も残ってるんだよなぁ…。

自分用にUSBデバイスを作成するのが目的なのでライセンスにはそれほど気をつかわなくても良いのですが、気になってV-USBのライセンスを眺めてみました。

ポイントはGPL v2と商用のデュアルライセンスになっているというところでしょうか。
Free版はGPL v2の元で配布されています。
これを採用する場合には、自作したデバイスを配布したり販売したりする場合には、コードもろもろ一式を提供する用意がある事を一緒に伝えなければいけないという事になります。
実際にはコードをデバイスにくっつけて提供するだけで十分で、必須ではないものの、V-USBのWebサイトに登録したりして積極的に公開するように求めています。

あとはそういった事を避けたかったり独自のIDが欲しい自作派のために1つのVID/PIDのペアを9.9ユーロ(だいたい1300円ぐらい)で商用ライセンスとして販売している点でしょうか。
どこかで公開する事を考えているなら協賛の意味で購入しても良いかなぁという値段にはなっています。

オープンソースなプロジェクトでもなくなって困るものにはPayPalでdonationをしたりしていますが、この値段でVID/PIDのペアが付いてくるなら買おうか迷うなぁ…。
もう少しV-USBを使ってみて、使い続けるなら購入する事にしましょう。

しかしIPAが公開しているGNU GPL v3 逐条解説書(第1版)を読むと、ストールマン先生というかGPLが大人になったなぁという印象です。
いや上から目線なのはおかしんですけどね。

2009/05/08

"1000人に1人"は多いのか少ないのか

DNA鑑定の精度が気になってGoogleで「"1000人に1人"」で検索すると新たな発見やらおもしろい発見やらがあります。

それはさておき、鑑定結果が正しいとして日本全体で12万人も対象者がいるというと、まぁやっぱりそれでも少ないかなぁ。
けれど自分が住んでいた人口3万人くらいの田舎で該当者が30人くらいかと思い直すと、めちゃめちゃ多く感じますね…。
これは分布が均一だという仮定の元に母数を極端に減らしたので、まぁ当然かもしれません。

よく"n人に1人"といいますが、だいたい母数を誤魔化して非常に珍しい事を際立たせるために使う場面が多いような印象です。
中高生に0.1%といえば、1000人クラスの学校で1人が該当する程度ですから、非常に稀だと実感してもらえると思います。だいたい一人の人間に認知可能な0.1%というのは非常に少ないというのが実感だと思います。

しかし母数が総人口となると、認知可能な範囲を越え過ぎているせいか、むしろ「それって多くない?」という印象も感じなくはありません。
やっぱり比率でものをいうのは正しくないというか、 数字の魔力というか、表現次第で受ける印象がコロコロ変化していくのがなんだか不思議です。

日本初のDNA鑑定結果にケチが付いたのか?

科学捜査というと決定的な事実をみせてくれるものとして、かっこ良く取り上げられる事が多いと思います。
個人的にも誤差はあるものの、高く安定した精度で一定の事実を明かにする事ができるものだと思っています。
それも高い精度が実証されている事が必要なのですけれどね。

日本初のDNA鑑定が証拠として採用された足利事件に関連して、信頼が揺らいでいるように思えます。
「科学は万能じゃない」、とかいう当たり前な事を結論として口に出してしまう思考停止な状態にならないようにしたいものです。
なぜこういう結果になったのか、その過程を検証する事が大事ではないでしょうか。

さてさてDNA鑑定自体は常にレベルアップを続けていて、90年代の技術は古すぎるという点がクローズアップされているような印象も受けます。でも技術だけの問題だったのかなぁ。精度に問題はあってもそれなりに裏付けはあったのだと思うのですよね。
報道によっては、DNA鑑定の結果に問題があった可能性と、そもそものサンプルが容疑者のものではなかったという可能性、それに捜査員などの汗が着いた可能性があったのだと指摘しています。
そもそも最初の地裁判決を報道する時にこれくらいの可能性を挙げていたら格好よかったのにね。 そういう記者もいたかもしれないけれど…。

閑話休題、捜査員や関係する職員たちのDNAがデータベースに登録されていないのか疑問なのですが、 警察庁科学警察研究所が身内の警察官から偽物のサンプルを渡されていた可能性もあるという事です。
こわい話しだなぁ。科警研の中の人がかわいそうな感じもする。
というか、かわいそうと思われて当然なくらいのショックを受けていて欲しいのだけれど…。

ただ、これよりも気になったのは容疑者のIQがかなり低いという点が明らかになってしまっている事です。
このレベルだと日常生活に不自由しない程度の認知・判断はできますが、人を疑うのは苦手なので詐欺のターゲットにされやすいところです。
暗示自体は想像力や認知度が高い方が効き易いわけで、納得させる事は少し難しいかもしれませんが、恐怖心をテコに使えば自白させる事は簡単なんじゃないでしょうかねぇ。
ひょっとすると捜査員も科警研の結論を信じて強引に捜査を進めたのかもしれません。
いずれにしても中の人たちにはショックな事でしょうね。

詐欺だって自白だって、相手の望んでいるように動くという点では同じですからねぇ。
無邪気なのか、むしろ本能的に空気を読み過ぎたかのかもしれません。こっちの方がこわいよなぁ…。

でも一番怖いのは犯人がやはり現在収監されている方なのかどうか確信が持てなくなっているという事でしょうか。
足利市近隣で似たような誘拐事件が起ったという報道もありましたしね…。 何かしらの結論は改めて出す必要があるのでしょう。

これからの予定!?

不況が表面化する前に転職したところまではよかったけれど、 まさか自分にリストラの風が吹いてくるとはあんまり思ってなかったなぁ

というか、今年中盤の景気次第かなと思っていただけに、このタイミングでは少し早かったなぁと思います。
2009 2Qはまだ中盤ですが、日銀支店の県内短観が過去最悪の数字だし、ここら辺の求人状況は期待できないよなぁ…。はぁ…。

結婚前にこんな状況になるとは…。まだまだ実感はないけど、困ったなぁ。

そういえば、ニュースで就職に失敗して他人に危害を加えてしまうような事件がありましたね。

原因と結果のバランスが悪すぎなので、もともと他人に危害を加えたいと思っていた人が、いい口実を見つけたっていうところなんじゃないかなぁ。

辛うじて理解できそうなのは、親や恋人に非難されたり問い詰められるのが怖くて、恐怖のあまり混乱して誤魔化すためにより重大な犯罪を犯してしまう、っていうストーリーかなぁ。
ああ、小さい頃から一流(と呼ばれる、もしくは親が決めた)企業への就職が人生のゴールだと言われてきて頑張ってきたのに、人生における最初のあまりにも大きな失敗が起きてしまった、とかならまだ分かる…か?
やっぱり共感できないや、わからない。

いずれにしても就職の失敗が大事になるというのは、過去の人生においてあまり失敗してこなかったのではないかなとは想像できます。
自分と同じような経験は若い頃にするべきではないと思うけれど、ほどほどの失敗というか後悔は耐性を付けるためにも若い頃に経験するのが良いでしょうね。
コミュニティが小さかったりすると若い頃のささいな失敗は意外に影響が大きかったりしますが…。

今年の母の日はする事もないしお墓参りかなぁ…。

2009/05/06

ATmega88p+AT24C256引き続き: マクロとコードの断片、気になったコーディング

基本的にAVR側がMasterとしてI2Cバスのクロックを制御しているためか、"TWINT"をセットする事でAVRの内部回路をスタートさせ、"TWINT"が再度セットされるまで待つというコードを良く書きます。

使っているWinAVRは20090313版ですが、"avr/io.h"の中でincludeされている"avr/sfr_defs.h"の中にloop_until_bit_is_setマクロがあり、よりプリミティブな書き方をするデータシートのコードよりも、これを使った方が見通しが良いと思います。

int twi_start() {
  TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTA);
  loop_until_bit_is_set(TWCR, TWINT);
  return TW_STATUS;
}
...
void usart_write_string(char *str) {
  for(int i=0; str[i] != '\0'; i++) {
    loop_until_bit_is_set(UCSR0A, UDRE0);
    UDR0 = send_char;
  }
}
...
r = twi_start();
if(r != TW_START && r != TW_REP_START) {
  usart_write_string("error at twi_start()\r\n");
  continue;
}
"loop_until_bit_is_clear"というのもありますが、どちらも中身をみるとおもしろいですね。
#define loop_until_bit_is_set(sfr, bit) do { } while (bit_is_clear(sfr, bit))
もちろん"bit_is_clear"の部分もマクロで、データシートのコーディングをまとめだだけなのかなと思いきや、ずっとさかのぼっていくと"sfr"部分は、
#define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr))
の"mem_addr"部分に還元されます。
考えてみたらコンパイラが意図しないタイミングで変更されるから、"volatile"を付けるべきなんですよね。
でもこの状況だとvolatile付けcastしても意味ないかな。 どっちにしても、グローバル変数とかは気をつけないとだなぁ…。

そうそう、twi.hの中で#defineされている"TW_STATUS"はデータシート中では"TWSR & 0xf8"と書かれている部分と同じですね。

あとは"_BV()"という書き方もよくみますが、実際には"#define _BV(bit) (1 << (bit))"というマクロとして定義されています。
AVR Studioではgccのオプションとしてデフォルトで"-std=gnu99"が定義されているので、変数宣言を関数の先頭で行なう必要がなくなって、"for(int i=0;..."のような書き方ができるようになっています。

プリプロセッサのマクロは便利ですが、使い過ぎは初心者の読もうという意欲を失なってしまう可能性があります。
AVRのプログラミングからC言語を始めるような方にはコードを読み易くするための工夫が、逆に作用する事があるかもしれません。
意味もわからず本に書かれたコードを単純にコピーして動かそうとして、動かずに呆然とした懐しい記憶が呼び起こされます。
いまの時点から過去を振り返ってみると、大学時代の時間を無駄に使って興味を追求していた贅沢な時間が必要だったのだなぁと思います。

ATmega88pとAT24C256をI2C通信させてみる

秋月で256Kbit EEPROMの"AT24C256"が売られていたので、ATmega88pのI2C通信の練習用に買ってみました。 しばらくブレッドボード上で接続したまま放っておいたのですが、5月の連休を利用して動かしてみました。
なんとか1文字を放り込んで取り出すのが精一杯ですが、まぁなんとか動いています。

今回、参考にしたのは以下のサイトです。

全体の構成

おおまかには"ATmega88p"+"AT24C256"+"AE-UM2232R"をブレッドボード上に接続しています。
"AE-UM232R"はデバッグ用のメッセージを出力させるために使用しています。 このコードは以前作成したものを使い回しました。

EEPROMもAVRもATMEL社製なので、データシートはどちらも同じような体裁で、どちらも読み易く構成されていると思いました。 英語なので細かいところまでは読まずに斜め読みでしたが、こんなドキュメントが構成できるようになりたいものです。
最初はデータシートとAVRのI2C通信について書かれたコードを手本に進めたのですが、 いくつかはまってしまうポイントがありました。

  • AVRマイコン側
    • twi.hの使い方
    • デバッグ用USART(シリアル)通信の文字化け
    • MT, MRモード用コードの送信タイミング
  • EEPROM側
    • "A0","A1"ピンの意味
    • SDA/SCLピンのプルアップ
結局は参考にしたサイトがピンポイントで同じ構成で、いろいろ説明があったので、足りないところはコードを読んで何とか形になりました。

twi.hの使い方

AVRでI2C通信をしようとAVR Freaksに辿り着くとtwi.hを使わずにコーディングしている方がいました。 まぁうまく動かないから投稿されていたわけですが、さすがにそのパワーはありません。
I2C通信をしたくてWinAVRを使っているならtwi.hを使うべしというのは、いろいろ検索してすぐに分かったのですが、微妙にコードが古かったり、RTCと接続したりする例があって、使えるかどうか微妙な感じでした。
I2C通信を始めるならコードをコピーするのではなく最初はいろいろ試行錯誤するのがお勧めです。

デバッグ用シリアル通信で文字化け

これは原因不明ですが、突然デバッグ用に使っていたkermitに出力される文字列が化けてしまいました。 出力自体はされているのですが、プログラムを以前テストした単純にエコーバックするものをロード仕直しましたが、それも上手く動きませんでした。
電源はAE-UM232Rから3.3Vを取っていたので、一度USBケーブルを抜き差しして電源を入れ直して、kermitを立ち上げ直してみたところうまく動きました。こんな事もあるんだなぁ。

MT, MRモード用コードの送信タイミング

ATmega88pのデータシートにはTWDRにSTARTコードをセットした後、TWDRにSLA_W、SLA_Rを設定する事でMaster TransmitterモードあるいはMaster Receiverモードを切り替えるようなサンプルコードが載っています。twi.hの中には"SLA+W", "SLA+R"の文字列でコメントがありますが、該当しそうなものは"TW_WRITE"、"TW_READ"のマクロがあります。

AT24C256のデータシートにはSTARTコードの後にデバイス指定のコードを加えて8bitを送信するように書かれています。 後から参考にしたリンク先のコードをみてわかったのですが、このタイミングでWRIETモードの時は"0xA0"、READモードの時は"0xA1"を送信する事で解決しました。

"A0","A1"ピンの意味

AT24C256のチップを複数バスに接続するために、固有のデバイス番号を振るために使う事ができます。 何にも接続しないとGNDになるようになっているようですが、微妙な条件があったので安心のためにはGNDと接続してしまうのが良さそうです。

このピンをプルアップすると、STARTコードの次に送るSLA_W, SLA_Rとして送信するコードが"0xA0", "0xA1"から変化します。
今度秋月に注文する時にAT24C256を追加して、バスらしくI2C通信を使ってみようと思います。

SDA/SCLピンのプルアップ

よくデータシートを読めばよかったのですが、SDA, SCLピンのプルアップの必要性に気がつくのに少し時間がかかりました。
プログラムを試す前にデータシートを読み直していて気がつきましたが、判っていれば当然な事だと思います。
しかしわかっていないと延々に見落してしまうところかもしれません。

2009/05/04

amazonからリージョン1なDVDの案内メールが届く

YouTubeやニコニコ動画なんかでも観る事ができますが、大好きなギタリストの中に Tommy Emmanuelさんがいます。
最初はMuriel AndersonさんのDVDでみて、びっくりしたのですが、それ以来DVDを買っていました。

たぶんそれつながりでAmazonから案内が来たのがCenter Stage (Ac3 Dol) [DVD] [Import] (2008)で、これはリージョン1です。
よく画面をみないと日本のプレーヤーでは再生できないと書いていないので、 Amazonさんのお勧めとしては、ちょっとこれは酷いんじゃないかなと思いました。

リージョンコードは再生ソフト、ドライブ供に5回ぐらいは変更可能なものなので、PCにDVDドライブを追加してリージョン1が再生できる環境は作れますが、リージョンという概念が嫌いなのでそこまでしたくないと考えています。

地域によってDVDの値段が違う事はしょうがないと思いますが、リージョン設定をするなら少し高くてもリージョンフリー版を準備するように義務付けて欲しいと思います。

なんにしてもニコニコ動画でTommyさんの動画ばかりが取り上げられて、Murielさんの動画がないのはなんか納得いかないなぁ。
こんな愚痴を書いている間にAmazonでGuitarscape Planet (Ws Ac3 Dol) [Blu-ray] [Import] (2006)をみつけたので注文してしまいました。

TYPINGMANIAで遊んでみる

TYPINGMANIA(タイピングマニア)というMP3に合せて歌詞をタイプするアプリケーションがある事を知って遊んでみました。
セガのタイピング・オブ・ザ・デッドなんかは好きなので、そんな雰囲気なのかなと思っていましたが、甘かったです…。

配布元のWebサイトでは11曲がセットアップされた状態で遊べるようになっていました。

"ythm"という曲を4,5回繰り返してみましたが、せいぜいCLASS: AA、Score:177117ぐらいが精一杯でした。
準備されている楽曲はゲームを意識して作成されたものではないようで、純粋に楽曲に合せて一定の区切り単位で切り替わる歌詞をタイプするようになっていました。
また歌詞一文字単位でタイミングをみているわけではないため、ゲーム性はあまり感じません。むしろ自分で口ずさむリズムに合わせてタイプするのがおもしろかったです。

単純な反射神経でスピードを追求してもおもしろくないというか、タイピングが苦手な方や曲が好みに合わないという方は最初「なんだこれは」と思うかもしれません。。
自分のタイピングスピードに合う、気にいった曲に合せて自分で設定ファイルを作成するとってもおもしろいのではないかなと思います。

少しユーザーを選ぶというか大人な雰囲気のアプリケーションですが、おもしろくて奥が深そうです。
まだ時間があるので何か手持ちのCDをひっぱり出してきて歌詞を打ち込んでみようと思います。

2009/05/03

CG-WLRGNXのセルフテストが終らない

ブロードバンドルーターを購入したものの1週間ほどでセルフテストが完了しなくなり、交換対応してもらいました。お店の対応はとっても親切で、ありがたかったです。

これまでも無線LAN付きのブロードバンドルーターを使っていましたが、WEPのままで、 PSPでたまに接続する程度でしたが、さすがにWPAを導入する事にしました。
NEC製が安定しているという話しもありましたが、これまで使っていたWLBAR-GSXが安定していました。 そこで今回もcoregaから値段がほどほど安いものを選びCG-WLRGNXを購入しました。

製品の設定はWindows Vista SP1から行ないましたが、固定IPを割り振った状態では画面遷移がうまくいきませんでした。そこでDHCPを有効にしたところ無事に画面が進みました。
ホスト名"corega.home"をIPアドレス"192.168.1.1"と対応させるための設定はC:\Windows\system32\drivers\etc\hostsファイルで行なっていましたから、DHCP設定しないとうまく行かなかったのはたまたまかもしれません。

設定が終った後はWLBAR-GSXと比べてレスポンスが良くなったような気がします。
ちゃんとデータを取っていませんが、まぁ満足いくレベルだと思います。

ただ、この状態で3日後に反応がなくなりACアダプタを抜き差しして電源のOff/Onで復活した後、ファームウェアはv2.00に上げてから、3日ほど経過してから再び反応がなくなりました。
また電源のOff/On後に初期化して、設定をしていた途中で反応がなくなり、この後はOff/Onをしても、セルフテストが終わらない状態になりました。

動いている間のパフォーマンスには満足しているんですけれどね。
いまは交換してもらったものを使っているので、これが安定して動く事を願っています。