東北地方太平洋沖地震(1)

昨日(2011年3月11日)、東北・関東地方でマグニチュード8.8というとんでもない地震が発生しました。昨日は首都圏の電車はすべて止まってしまったので、千葉県の職場に近い実家に泊まり、今日(3月12日)になってようやく都内の自宅に帰ってきました。家の中は本棚や飾り棚、テーブルにあったものがかなり散乱していました。いまでも余震でゆらゆらと揺れつづけるなか、片付けをしています。15階建てマンションの6階なのですが棚に吊ってあるものや照明器具が数分おきにユラユラと揺れています。

今回の地震と地震に伴う大津波では宮城、岩手、福島のなどの特に海沿いで甚大な被害が出ています。特に仙台は学生時代を過ごした街で、大きな被害が伝えられている荒浜の辺りは気晴らしにボーッとしに出かけた場所ですので、「あの荒浜が・・・」という気持ちでいっぱいです。また、荒浜と七北田川をはさんだ反対側、仙台港のすぐそばの蒲生地区には家庭教師のアルバイトで毎週訪問していたお宅があるのですが、当時は堤防もないような状態でした(そのかわり、なかなかすばらしい景色だったのを覚えています)し、河口からわずか数百メートルというところでしたので、ひとたまりもなかったのではないかと思います。その後、特に連絡を取り合っているわけではないのですが、いろいろとお世話になったこともあり、せめてご無事でいていただければと思います。その他にも、海沿いのお家ではないものの、当時お世話になった知り合いがたくさんいらっしゃいます。連絡も取れないので心配です。

ところで、今回の地震に先立って、11日の12時50分くらいだったでしょうか、職場の窓から地鳴りというか、「コォォォォーッ」というちょっと不気味な音がして、何だか分からない胸騒ぎがしていました。音については最初は空調のダクトの音かと思ったのですが、空調のダクトの方向とは違いましたし、いつもの空調の音とは異なります。窓の外から音がするのかと思って、窓を少し開けてみたのですが、外からは風の音の方が大きいようでした。しかし、窓を閉めると再び「コォォォォーッ」という音がしました。ひょっとしたら、窓自体から音がしていたのかもしれません。側にいる人に確認しようと思ったのですが、その人は寝ていたので確認しませんでした・・・。その人に話していれば、前兆現象だったかどうか確認できたのですが・・・。

Ubuntuの動画プレイヤー(totem)の履歴表示を消す

Ubuntuに付属の動画プレイヤーには「動画」メニューの中に再生履歴を表示する機能があるのですが、その履歴を消去することができません。適当に検索していたら、メニューから表示を消す方法がわかりましたので、メモしておきます。

/usr/share/totem/totem.ui ファイルを開き、「recent」を含む以下の2行(黄色文字を含む2行)を消去すると、表示が出なくなります。

これで履歴を表示しないようにできます。
他のアプリケーションでも同様のファイルでメニューを制御できるのでしょうかね・・・。

HS-15Pを動かしてみる(4)LCD追加

Arduinoの嬉しいところは、電子工作の世界としては珍しくライブラリがあるところです。

で、早速LCDモジュールを接続し、LCDに出力してみました。表示内容は左から室温、湿度、センサ抵抗値の対数値です。写真を見るとわかるのですが、室温25度、湿度25%なので、めちゃくちゃ乾燥しています。

接続したLCDは秋月の300円LCDモジュール(HD44780U使用、16文字×1行)です。この手のLCDモジュールは画面の右半分と左半分のアドレスが連続していなかったりします。そのため何らかの工夫が必要になるのですが、残念ながらArduinoのLiquidCrystalライブラリはそこまではサポートしていないようです。ソースをみてもそれらしい記述はありません。ただ、20文字×4行のLCDモジュールを想定した処理は入っているようですので、それを利用して8文字×2行として設定を行い、右半分は2行目扱いで文字を表示することでお茶を濁しました。

HS-15Pを動かしてみる(3)Arduino編

無事に「HS15P湿度センサの簡易動作実験」の追試ができたところで、これをArduinoに移植してみました。

回路図は・・・・省略。

  • Analog0にLM35DZの出力を接続
  • Analog1に湿度センサと0.022uFの間の端子を接続
  • Analog2に湿度センサを接続(デジタル出力ポートとして使用)

という接続です。

ソフトウェアの方はほぼそのままの移植ですが、

  • A/D変換はArduinoのライブラリを使用
  • I/O端子制御もArduinoのライブラリを使用
  • シリアル出力もArduinoのライブラリを使用
  • ループで時間調整しているのを delayMicroseconds()に置き換え
  • 変数名をちょっとそれっぽく、と思ったけど中途半端・・・

などの変更をしました。それ以外はそのまま移植しましたが、あっさりそれっぽく動きました・・・。ただ、校正のための道具がないので、そこまで・・・と思ったのですが、もうちょっと頑張ってみます。

まず、元のATTINY13でHS15Pの代わりに用意した1KΩ、10KΩ、100KΩ、1MΩの抵抗をつけてデバッグ用に出力されている抵抗の対数値を記録します。1KΩ時が219、10KΩ時が180、100KΩ時が140、1MΩ時が99と、ほぼ理論値通りになりました。

この抵抗をArduino版に接続すると、1KΩ時が226、10KΩ時が181、100KΩ時が141、1MΩ時が100といずれも少し大きめの値が出力されます。これは充電時間が長めになっているからだと思われます。

そこで、時間設定を0.1us単位で管理して、delayMicroseconds()に渡す際に10で割ってやると、1KΩ時が240、10KΩ時が209、100KΩ時が141、1MΩ時が99と、大きな誤差がでるようになってしまいました。おそらく除算を必要とするようになってしまったので、結果的にwaitが増えてしまったのでしょう。

結局、測定レンジを充電時間で指定するのではなく、インデックスで指定するようにしてwaitの時間はその中で swtich()~case で充電開始終了を含めたテーブル形式にして、待ち時間も調整することにしました。その結果、1KΩ時が219、10KΩ時が180、100KΩ時が139、1MΩ時が99と、ほぼ合うようになりました(当然ですが・・)。

これでセンサをHS-15Pに戻せば概ね正しい値を測定できるはずです。

HS-15Pを動かしてみる(2)

組み上げたら、まずヒューズビットを書き込みます。

$ avrdude -c avrisp2 -p t13 -P usb -t
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.01s
avrdude: Device signature = 0x1e9007
avrdude> r lfuse
>>> r lfuse
0000 6a |j |
avrdude> r hfuse
>>> r hfuse
0000 ff |. |
avrdude> w lfuse 0 0x3a
>>> w lfuse 0 0x3a
avrdude> w hfuse 0 0xff
>>> w hfuse 0 0xff
avrdude> quit
>>> quit
avrdude: safemode: Fuses OK
avrdude done. Thank you.

次に、プログラムを書き込みます。

$ avrdude -c avrisp2 -p t13 -P usb -U flash:w:TestHS15.hex:i
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e9007
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file “TestHS15.hex”
avrdude: writing flash (896 bytes):
Writing | ################################################## | 100% 0.38s
avrdude: 896 bytes of flash written
avrdude: verifying flash memory against TestHS15.hex:
avrdude: load data flash data from input file TestHS15.hex:
avrdude: input file TestHS15.hex contains 896 bytes
avrdude: reading on-chip flash data:
Reading | ################################################## | 100% 0.26s
avrdude: verifying …
avrdude: 896 bytes of flash verified
avrdude: safemode: Fuses OK
avrdude done. Thank you.

・・・・が、このままではシリアルの論理が違うので、このままでは表示できません。

2SC2120を1段間に入れて、論理を反転させました。また、よく考えると温度を取得するためのLM35DZのA/D変換の基準電圧はVccで5Vが前提になっています。しかしPICによるシリアルモニタから供給できるのは3.3Vなので、正常に温度が取得できなくなるはずです。ですので、外部電源5Vで動作するように改めました。

DebianのPCにつないで、screenをシリアルターミナルとして起動すると、A/D変換値、温度、湿度の順で周期的に出力されます。(screenコマンドは、C-a H でログファイルを吐くので、その機能でファイルに記録することもできる)

ちなみに自分の部屋の湿度は暖房あり(エアコン使用)で20%台、暖房無しで30%程度でした。非常に乾燥しやすい部屋とはいえ、あってるのかよくわかりません。

そこで、ビニール袋に濡らしたティッシュペーパーと共に入れて封をして放置してみたところ、23度20%(ソースをみるとわかりますが、20%以下は計測できません)からぐんぐん袋内の湿度が上昇し、すぐに80%近く、30分くらいで90%くらいになりました。

HS-15Pを動かしてみる(1)

部屋の片付けをしていたら、秋月で買ったHS-15Pという湿度センサが出てきました。

ずいぶん前に使っていた加湿器が強力過ぎて部屋が水浸しになってしまったので、その制御に使おうと思って買ってあったものですが、結局加湿器自体使わなくなってしまったのでお蔵入りしてすっかり忘れていました。

で、「HS15P湿度センサーの簡易動作実験」を参考にして、湿度センサを動かしてみることにしました(単なる追試とも言う)。こちらのページでは「インチキ動作させる」などと書かれていますが、至ってマジメに手抜き動作をされておられます。バカ正直にデータシートやアプリケーションノートの通りに動かすのではなく、基本原理に立ち返って考え直すこういう工夫、とっても大事だと思うんですよね~。

で、写真のように適当にちゃちゃっと組み上げます。ICクリップの下にいるのがATTINY13Aです。・・・・が、写真はHS15P取り付け前でした・・・。シリアルは受けるだけなので、以前作ったシリアルモニタを1chだけ使います。

~つづく~

Ubuntu無線LANが不通になった・・・

Ubuntuは結構頻繁にアップデートマネージャでのアップデートが出ます。本来は一つ一つ確認しながら進めればいいのでしょうが、たくさんあるのでアップデートマネージャの表示が出たら特に確認せずに進めてしまいます。

で、先日もいつものようにアップデートマネージャでポチッとアップデートをしたら、再起動後に無線LANの接続ができなくなってしまいました。

理由がわからなかったのですが、とりあえずドライバを再度インストールしたら使えるようになりました。

IPv6のアドレスに思う

ここしばらく、IPv6対応でいまできることってなに、ということでいろいろやってみましたが、その中で疑問に思うことがあるので記載します。

IPv6のアドレスの長さは128bitなので、IPv4の32bitに比べると2^96倍もあって事実上無数にある、という説明がされています。しかし、IPv6のアドレス構造を見てみると、「前半がプレフィックス・ネットワークID」「後半がインタフェースID」となっています。また、サブネットマスクは/48か/64のどちらかであまり意識することはない、とされています(Wikipediaによる)。また、同じくWikipediaによると、同じくOCNによるIPv6サービスでは月額300円で/64のネットワークブロックを2つ取得できる、とされています。

つまり、/48とか/64のアドレスが従来のIPv4グローバルアドレスに相当し、従来NATなどのプライベートIPアドレスで対応していた部分に/64の下のアドレスを企業内や家庭内で割り振る、ということになるのだと思います。そう考えると、「IPv4の32bitに比べると2^96倍」というのは誇張で、2^32倍くらいに考えるのが妥当なんだと思います。

さらに、IPv6アドレスの割り当て状況をみると、IANAは地域のRIRに/12単位でIPv6アドレスの割り当てを進めていくように見えます。従来IPv4ではこれが/8の単位だったのでしょう。ここで気づくのは、一度に割り当てる単位で数えるとIPv6とIPv4は16倍の違いしかない、ということです。まあ、それでも/12のIPv6アドレスブロックを/48の単位でエンドユーザーに割り当てていくと割り当ての際に/36の自由度があって、IPv4全体のアドレス空間以上を一度にRIRに割り当てることになるのだから、あまり心配はないのかもしれません。ただ、今後、それこそ家電製品どころか照明器具、壁のスイッチ、水道の蛇口、窓ガラス、扉、錠前・・・などに組み込まれたワンチップマイコンのようなものまでもIPv6を喋るようになるかもしれない、ということを考えると、無闇にアドレスブロックを浪費しても大丈夫なのだろうか、という気もします。

無駄な心配でしょうかね??

≪おまけ≫
Arduinoというか、フィジカルコンピューティングの世界でIPv6っていろいろ面白い使い方があるような気がするのだけど、どうでしょうかね。実験だけならIPv4でも十分だから別にIPv6でなくたっていいのだけど。

DebianにWordPressをインストール

IPv6で接続可能になったDebianですが、WordPressをインストールしてみることにしました。簡単そうな参考サイトはここでしょうか・・・。

# aptitude install wordpress

でjavascript,mysql,perl,phpなどの関連モジュールが一気にインストールされます。

・・・が、mysqlのサーバ自体はインストールされていないようですので、インストールします。

# aptitude install mysql-server

php5のインストールを認識させるため、apache2を再起動します。

# /etc/init.d/apache2 restart

/var/www/index.htmlを消去し、/var/www/index.php に以下の内容を作成します。

<?
php phpinfo();
?>

生成後、「http://(IPアドレス)」にアクセスして、PHPの状態が表示されるのを確認します。

・・・・

いろいろやってるうちに、メモが取りきれませんでした(^^;

なので、覚えていることだけ。

  • aptitudeでインストールされるWordPress本体は英語版なので結局消した。場所(/usr/share/wordpress)だけはそのまま利用したけど。
  • データベースの生成はWebMinから例えば「wordpress」という名前で生成。今回は最終的に「wordpress_v4」と「wordpress_v6」で生成した。特に変わった設定は不要。生成したデータベースにアクセスするユーザー「wordpress」も作成した。
  • 結局、WordPressの日本語版 tar.gz をダウンロードして展開したものを 「/usr/share/wordpress/vpv4」「/usr/share/wordpress/vpv6」として2箇所に置いた。(1箇所で済む方法もありそうだけど)
  • それぞれのディレクトリの中の wp-config.php にデータベースへのアクセス情報を設定した。ただし、IPv6の場合、サイトのアドレスをIPv6のアドレス(FQDN)に書き換えなければならない(デフォルトだとIPv4のアドレスが入るので、そこでおかしくなってしまう)ので、一旦下記のVirtualHostの設定をv4アドレスで接続して、サイトのアドレスを書き換えてからv6で使えるようにした。
  • それぞれのアクセスのための Apache2 の設定を /etc/apache2/sites-available/default にVirtualHostとして設定した。片方はIPv4、もう片方は IPv6で設定。VirtualHost設定時にはports.confなども確認しないとアクセスできないことがある。(最初は8080ポートにv6を設定したので、ports.conf と ip6tables の穴が開いてなくて接続できなかった。)

といったところでしょうか。

これで一応、IPv6アドレスからWordPressにアクセスできました。・・・置くコンテンツは特にないし、それ以上にPentium500MHz+192MBでは重くて使いようがないのですけどね。

(追伸)
ここのバックアップサイトにしてみようかと思ったのだけど、テーマの設定でプレビューすらできないので、消してしまいました・・・。

Debianで起動時にFreenet6に接続する

現在の状態では、Debianは起動後に手動で /usr/local/gogoc/bin/gogoc を起動しなければならないのですが、これを自動化したいと思います。

そこで、Debianの起動スクリプトを作ります。ここ(@IT)にあるのを雛形に、以下のようなファイルを作りました。

#!/bin/bash
setip6tables() {
    ip6tables -P INPUT DROP
    ip6tables -P FORWARD DROP
    ip6tables -P OUTPUT ACCEPT
    ip6tables -F
    ip6tables -Z
    ip6tables -X
    ip6tables -N ufw6-after-forward
    ip6tables -N ufw6-after-input
    ip6tables -N ufw6-after-logging-forward
   :
   :(長いので中略)
   :
    ip6tables -A ufw6-before-output -m state --state RELATED,ESTABLISHED -j ACCEPT
    ip6tables -A ufw6-before-output -j ufw6-user-output
    ip6tables -A ufw6-skip-to-policy-forward -j DROP
    ip6tables -A ufw6-skip-to-policy-input -j DROP
    ip6tables -A ufw6-skip-to-policy-output -j ACCEPT
    ip6tables -A ufw6-track-output -p tcp -m state --state NEW -j ACCEPT
    ip6tables -A ufw6-track-output -p udp -m state --state NEW -j ACCEPT
}
clearip6tables() {
    ip6tables -P INPUT DROP
    ip6tables -P FORWARD DROP
    ip6tables -P OUTPUT DROP
    ip6tables -F
    ip6tables -Z
    ip6tables -X
}
start() {
    echo -e "Set ip6tables: "
    setip6tables
    echo -e "Starting gogoc Freenet6 client: "
    /usr/local/gogoc/bin/gogoc -y -f /usr/local/gogoc/bin/gogoc.conf -r 180 &
    return 0
}
stop() {
#    killproc gogoc
    echo -e "Clear ip6tables: "
    clearip6tables
    return 0
}
case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
esac

本来なら、ip6tablesの設定はわけた方が良さそうな気もしますが、ここに含めています。
また、gogoc(Freenet6クライアント)の停止のしかたがわからないので、代わりにip6tablesで全てをDROPする設定をするようにしました。

このファイルを /etc/init.d/gogoclient として root で保存し、ファイル属性を 700 に変更します。そして起動時に呼ばれるようにするため、update-rc.dを使って設定します。

# sudo update-rc.d gogoclient start 99 2 3 4 5 .
update-rc.d: warning: /etc/init.d/gogoclient missing LSB information
update-rc.d: see
Adding system startup for /etc/init.d/gogoclient …
/etc/rc2.d/S99gogoclient -> ../init.d/gogoclient
/etc/rc3.d/S99gogoclient -> ../init.d/gogoclient
/etc/rc4.d/S99gogoclient -> ../init.d/gogoclient
/etc/rc5.d/S99gogoclient -> ../init.d/gogoclient
#

再起動すると、自動的にFreenetに接続するようになります。なお、起動時はなぜか素直につながらないことが多いようですが、リトライするうちにつながるようです。

停止する際は、

# /etc/init.d/gogoclient stop

で全てのIPv6をブロックするようにip6tablesを設定変更します。