2015年2月1日日曜日

気温と高度の関係

一般に「100m高くなると、0.6℃気温が下がる」言われている。

ところで、飛行機に乗るとエンターテイメント端末で、現在の高度、速度、外気温が表示できることがある。
最近、飛行機に乗る機会があったので、表示された高度、外気温、時刻をメモしてきた。
高度と外気温の関係をプロットしてみたものが図1である。



図1 気温と高度の関係

実線が離陸時、破線が着陸時のデータである。黒と青は往路と復路で別の日(いずれも1月の晴れの日)である。往路の到着地は、出発地から西に820kmの地点(復路は逆)。

注目するポイントがいくつかある。
1. 「100m高くなると、0.6℃気温が下がる」は、大体当てはまっているようだ。

2. 10000m付近で気温の低下が止まっている。対流圏界面が見えているかもしれない。

3. 1500mから2000m付近でグラフが折れまがっているものがある。空気のかたまりの境界を通過しているのかもしれない。
(青実線(day2,up)は2000m付近のデータが飛んでいる。雲はなかったので、見かけ上は温度一定だが、実際は黒破線(day1, down)と同様に一度上がっているかもしれない。)

教訓

「自分で」測定してみたわけではないけれど、データをさわってみると見えてくることがある。


参考文献

気象庁, "大気の構造と流れ", http://www.jma.go.jp/jma/kishou/know/whitep/1-1-1.html, 2015年2月1日閲覧

2014年9月21日日曜日

スクリプトの仕組み(いくつかの実験と考察)

序


私はscriptをよく使うのだが、scriptが走るときに具体的に何が起こっているのかを確認したいと思って、いくつか実験してみた。
(注意!!以下は、FreeBSDでの話です。)

実験1

スクリプト:hoge.scm
#!/usr/local/bin/gosh 
(define (main args)
  (print args))
実行結果
$ aho.scm
$ hoge.scm
(./hoge.scm)
$ gosh hoge.scm
(./hoge.scm)
interpreterにscriptを渡すのと、scriptを直接実行するのとは同じようだ。

実験2a

スクリプト:hoge.echo
hoge.echo
#!/usr/bin/echo
This is echo.
実行結果
$ ./hoge.echo 1 2 3
./hoge.echo 1 2 3
$ echo ./hoge.echo 1 2 3
./hoge.echo 1 2 3

実験2b

スクリプト:hoge.echo
#!/usr/bin/echo -n
This is echo.
実行結果
$ ./hoge.echo 1 2 3
./hoge.echo 1 2 3(改行なし)
$ echo ./hoge.echo 1 2 3
./hoge.echo 1 2 3(改行あり)

実験2c

スクリプト:hoge.echo
#!/usr/bin/echo -n that is echo
This is echo.
実行結果
$ ./hoge.echo 1 2 3
-n that is echo ./hoge.echo 1 2 3
$ echo ./hoge.echo 1 2 3
./hoge.echo 1 2 3
#!の後には、好きな実行ファイルが来ていいようだ。
しかし、echoはスクリプト名を引数として受け取ることは想定していないので、
$ echo filename
の形式は意味を成さない。

実験3a

スクリプト:hoge.c -> コンパイルしたものは hoge
#include < stdio.h >

int main(int argc, char **argv){
  int i;
  for(i=0; i;< argc; i++){
    printf("argv[%d]=%s\n", i, argv[i]);
  }
  return 0;
}  
実行結果
$ ./hoge 1 2 3
argv[0]=./hoge
argv[1]=1
argv[2]=2
argv[3]=3

実験3b

スクリプト:hoge.hoge
#!./hoge
実行結果
$ ./hoge.hoge 1 2 3
argv[0]=./hoge
argv[1]=./hoge.hoge
argv[2]=1
argv[3]=2
argv[4]=3

実験3c

スクリプト:hoge.hoge
#!./hoge -s
実行結果
$ ./hoge.hoge 1 2 3
argv[0]=./hoge
argv[1]=-s
argv[2]=./hoge.hoge
argv[3]=1
argv[4]=2
argv[5]=3

実験3d

スクリプト:hoge.hoge
#!./hoge -s witch
実行結果
$ ./hoge.hoge 1 2 3
argv[0]=./hoge
argv[1]=-s witch
argv[2]=./hoge.hoge
argv[3]=1
argv[4]=2
argv[5]=3

実験4

スクリプト:hoge.awk
#!/usr/bin/awk -f
BEGIN{
    for (i=0; i < ARGC; i++){
 print "ARGV[" i "]=" ARGV[i]
    }
}
実行結果
$ hoge.awk 1 2 3
ARGV[0]=/usr/bin/awk
ARGV[1]=1
ARGV[2]=2
ARGV[3]=3

$ awk -f hoge.awk 1 2 3
ARGV[0]=awk
ARGV[1]=1
ARGV[2]=2
ARGV[3]=3

結論

スクリプト:script
#! <interpeter>  <arg>
--- 
---
が
$ script argv1 argv2
として、実行されると、

裏では、(forkした後に)
argv[0] = <interpreter>
argv[1] = <arg>
argv[2] = script
argv[3] = argv1
argv[4] = argv2
として、execが実行される。
(ただし、<arg>が空の時には、
argv[0] = <interpreter>
argv[1] = script
argv[2] = argv1
argv[3] = argv2
と一個ずれる。)

別の書き方をすれば、次のようになる。
execve("script", "argv1", "argv2")
↓(shellが、scriptの最初の2バイトを読んで「scriptだ!」と気づく)
あらためて、
execve("<interpreter>", "<arg>", "script", "argv1", "argv2")
する。


スクリプト中の一行目の<args>はひとまとまりとして、<interpreter>に渡される。
したがって、<args>が空白で区切られたいくつかのフレーズを含んでも正しく解釈されない。
空白を含まないオプションを一つだけ与えたときのみ、意図した動きをする。
(実験2と実験3、/usr/src/bin/echo/echo.c)

interpreterがいわゆるスクリプト言語の場合は、argv1以降だけにトリミングして渡してくれるているので、interpreterにscriptを渡すのと、scriptを直接実行するので、同じように実行することができるようだ。
(sourceコードを見たのだけれど仕組みがわからなったので、誤解しているかもしれない。)
(実験1と実験4)

今のところは、考察は以上。

環境

OS:FreeBSD 9.3-STABLE r268734

以上

2014年9月14日日曜日

Arduinoとの通信(FreeBSDでのシリアル通信)

Arduinoが何かをしゃべるように、プログラムしたとする。
(例えば、Serial.println())を使う。)
何を喋っているかをTerminalで受け取るには、次のようにすればよい。
$ (stty speed 57600; cat) </dev/cuaU0
解説すると、標準入力(stdin)を/dev/cuaU0に切り替え、stty speedで、Arduinoが喋るスピードで耳を傾けるように設定する。
その後は、catによって、/dev/cuaU0から入力されたものを、terminalに表示する。

Arduinoを/dev/cuaU0として認識して、いきなりstdinに切り替えられるのは、 Arduino上の、FT232RL(FDTI社)のUSB-Serial変換石に対応した、 デバイスドライバがあるから。
FT232RLが乗っていないArudinoでは、うまくいかないかもしれない。
kernelが、USBに刺さったものをデバイスファイルに見えるように、 適当に/dev/cuaU0に割り当ててくれる。

stty speed 57600で terminal input baud rateを設定している。
Arduinoのプログラムで設定した値と合わせる必要がある。
baudは「ボー」と読む。

環境
OS:FreeBSD 9.3-STABLE r268734
ports:arduino-1.0.5_2,1, arduino-mk-0.10_1
arduino:CQカチャduino (Arduino Duemilanove互換)

2013年10月26日土曜日

FreeBSDでArduino 2

FreeBSDでAVRの続きです。

前回のあらすじ(のうち本当に必要な部分)

CQカチャduinoを買って、portsからdevel/arduinoとdevel/arduino-mkをインストールした。
arduinoを起動する(terminalから「arduino」で立ち上がる)と、IDEが立ち上がるのだけど、uploadができなかった。

dialerに追加

uploadに失敗したときのエラーメッセージを見ると次のように書いてある。
check_group_uucp(): error testing lock file creation Error 
details:Permission deniedcheck_lock_status: No permission to create lock
 file.
please see: How can I use Lock Files with rxtx? in INSTALL
何かの権限が足りていなそうだ。

さらに、とりあえず/dev/cuaU0のステータスを見てみた。
$ ls -l /dev/cuaU0
crw-rw----  1 uucp  dialer  0x9a Sep 32 19:23 /dev/cuaU0
ということで、自分をdialerに追加した。一度ログアウトが必要かも。
$ pw groupmod dialer -m username

これで、/dev/cuaU0の書き込み権限がもらえたので、(ユーザー権限で走っている)Arduino IDEからuploadが可能になった。
(前回の記録では、sudoしてルート権限で書き込んでいた。)

本当は、 Port devel/arduino serial port problems [SOLVED](メーリングリストの過去ログ)を見て分かったのだけれど、せっかくなので「手探りで解決する風」の話に再構成しました。

USBシリアル関係の設定

~/.arduino/prefrence.txtで次の2つの値を設定する。
serial.port=/dev/cuaU0
serial.debug_rate=57600
*.inoのsetup()でシリアル通信の速度を設定する。
Serial.begin(57600)

これでArduinoとして動いた。Serial monitorもシリアル通信の速度を設定したら使えた。さて、何して遊ぼうかな。

2013年9月8日日曜日

FreeBSDでAVR (旧タイトル:FreeBSDでArduino)

Arduinoの互換機を手に入れたのだけど、家のマシンがFreeBSDなので開発環境を整えるのにちょっと調べ物が必要だったので、その記録を残しておくことにする。

参考文献
[1]
中尾司(2013),『Arduino実験キットで楽ちんマイコン開発』, CQ出版

[2]
坂井弘亮,<http://kozos.jp/kozos/avr_04.html>, (AVR編第4回)AVRとArduinoについて,調べたことをまとめておこう (2013年9月8日アクセス)

[3]
<http://playground.arduino.cc/FreeBSD/CLI>, Arduino Playground - CLI, (2013年9月8日アクセス)

[4]
<http://wiki.livedoor.jp/avoild/d/Arduino%28Duemilanove%29%A4%F2%C9%E1%C4%CC%A4%CEAVR%A5%DE%A5%A4%A5%B3%A5%F3%A4%C8%A4%B7%A4%C6%BB%C8%A4%A6>
Arduino(Duemilanove)を普通のAVRマイコンとして使う, (2013年9月8日アクセス)

環境
OS:FreeBSD 9.1-STABLE #2
ports:arduino-1.0.5.1, arduino-mk-0.10
arduino:CQカチャduino (Arduino Duemilanove互換)

実験
まず、[1]の互換機(CQカチャduino)が、Arduino Duemilanove互換であることを確認。
CQカチャduinoのUSBコントローラはFT232であるのだけれど、[3]を読むと十分に昔からFT232はサポートされているようだったので、CQカチャduinoを購入した。

数日後、CQカチャduinoが届いたのでUSBケーブルでつないでみた。
FreeBSD 9.1では、標準のカーネルでFT232を認識できて、カーネルモジュールは不要であった。
[2]にあるように、/dev/cuaU0として認識された。

引き続き、devel/arduinoとdevel/arduino-mkをportからインストールした。
端末から、arduinoを起動すると、IDEが立ち上がった。
ちょこちょこと[1]のサンプルコードを打ち込んで、コンパイルするとコンパイルできた。
しかし、uploadができない。Tools->Serial Portでポートを指定してやらねばならないのだけど、どうも指定できない。
この辺でIDEは諦めた。CUIでの操作に抵抗はない。

気を取り直して、[3]を参考に、新しいディレクトリで、もう一度サンプルコード(led.c)を用意した。
なお、[1]のIDE用のコードと違って、[3]のコードはmain文がある。IDEは関数setup()、loop()を定義するだけで、IDE内で自動的にmain()を用意してくれることになっているのだろう。多分、次のような感じ。

int main(){
  setup();

  while(1){
    loop();
  }
}

で、ターミナルで次を実行する。

avr-gcc -DF_CPU=16000000UL -mmcu=atmega328p -o led.out led.c
avr-objcopy -O ihex -R .eeprom led.out led.hex
sudo avrdude -V -F -c stk500v1 -p m328p -b 57600 -P /dev/cuaU0 -U flash:w:led.hex

[1]との差分は、次の点。
  • blink.cの代わりにled.cにした。
  • avr-gcc
      -mmcu=atmega328pにした。(でもmanには選択肢として出ていないので本当に聞いているかは不明)
  • avrdude
      -p m328pにした。
      -b 57600 にした。
    (avrdude: stk500_recv(): programmer is not respondingとエラーが出たから調べたら、[4]に書いてあった。)


これで、コンパイル、アップロードに成功した。
情報を残して行ってくれた、皆さんのおかげです。ありがとうございます。

次は、Arduinoとシリアル通信できるようにしたい。

2013年10月26日追記:
もともとは、FreeBSDでArduinoだったのだけれど、AVRとしてしか使っていないので、タイトルを変えました。 FreeBSDでもArduinoとして使えているので、それは別途どこかで述べます。

2013年9月7日土曜日

2013年の西瓜 まとめ

今年の夏もそろそろ終わりなので、2013年に食べた西瓜についてまとめようと思います。
購入日購入単位重さ 産地 購入価格*
5月19日1/6-熊本398円
6月1日1/6-熊本280円
6月12日1/6-千葉297円
6月15日
(黄色い西瓜)
1/6-千葉398円
6月19日1/6-千葉450円
7月5日1/61.4kg鳥取458円
7月7日1/61.1kg鳥取398円
7月9日1/61.166kg鳥取458円
(購入時は150円引き)
7月10日1/61.503kg鳥取458円
7月12日1/61.223kg鳥取458円
7月13日ホール5.4kg千葉1,570円
7月24日1/61.450kg山形336円
7月27日1/61.172kg山形398円
7月31日1/61.315kg山形398円
8月2日ホール5.85kg山形1,580円
8月12日ホール5.20kg山形1,980円
8月23日ホール1.299kg長野397円
合計34kg **10,562円
  * 購入店舗は一つではない
  ** 測定していない1/6は1.2kgと推定

今年もごちそうさまでした。

2013年7月14日日曜日

Haltとcast

物理学者(見習い)は、数学とコンピュータにお世話になっております。

最近行ったドイツとグーテンベルク博物館で「この言葉はっ!!」と思ったものがいくつかあったので、紹介します。 (さらっと並列に書きましたが、グーテンベルク博物館はドイツに含まれるという関係です)

HALT

マイクロプロセッサの命令で「MPU停止!」の命令です。 ( HALT - 通信用語の基礎知識) Z80だと機械語は76hでしたね。

ドイツの街ではバス停が「Halt」なのです。バス停のマークが「H」で、何でなのかなと思っていたら、Haltの頭文字でした。
Z80の方のHaltは昔から知っていたので、すごく合点がいきしました。
nullだけでなく、haltもドイツから入ってきた言葉だったのですね。ふむふむ。

cast

プログラミング言語において、型変換することです。 ( キャストとは: - IT用語辞典バイナリ) type conversionとも言います。schemeのstring->numberみたいなのはcastと言うのでしょうか。

活版印刷用語でのcastは、matrixと呼ばれる活字の型(鋳型)に、鉛などの金属を融かして注ぎ、活字(type、AとかBとか)を作る工程です。活字(type)を並べてインクを活字につけて、紙を載せて押し付けると紙に文字が印刷されます。

Matrixとtypeは、もちろん凹凸、左右が逆だけれど、同じ意味をもっています。プログラミングでの「型変換」と雰囲気が似てると感じます。

(おまけ)Still

"Extra Still"と書いてある水を買ったら、炭酸でした。
Still waterは、ぶくぶくしていない(炭酸の入っていない)水をさすのに、ぶくぶくだったのです。
よく読むと"wasser mit sehr wenig kohlensäure"(water with very weak carbonic acid、とても弱い炭酸入りの水 の意味)と書いてあります。
私には全然弱く感じません。ばっちり炭酸水です。うーん。

結局、ペットボトルを振って二酸化炭素を追い出しました。でも硬い水でした。味がします。
水よりビールがおいしい国でした。