Raspberry Pi 日記 (part1)

長嶋 洋一


2013年5月14日(火)

もう半年以上も前(スタートからは1年ほど前)、 「続・Propeller日記(4)」 2012年10月27日(土) のところに、そこそこ、Raspberry Piについて書いていた。 そして、 「続・Propeller日記(4)」 2012年11月5日(月) にもチラッと、Raspberry Piは登場していた。 さらに追加注文の分が届いて、 「続々・Propeller日記(1)」 2012年12月28日(金) で紹介していたが、それだけだった(^_^;)。 その後、3月末には久しぶりに台湾からShing-Kwei先生がやってきたり 、 4月マルマルで1件、久しぶりに 音楽心理学の研究 をやったり、 ゴールデンウイークを満喫したり した。

流れで行けば、引き続き「Propeller日記」の筈だったが、今年は特別研究費が予算枠の倍も応募があったとかで、全ての応募が大幅に減額されたために、今年、また「P板.com」で修正基板を作るかどうか、微妙になってきた。 そこて、ちょっと矛先を変えて、いよいよ満を持して、Raspberry Piにトライしてみることとなった。 ただし一昨日の週末を皮切りに、 学会発表4連発その1 というシーズンに突入してしまった。 果たして合間にどのように進むか不明だが(^_^;)、このような日記にして忘れないようにメモすることでなんとか進む、という昨今の流れを受けてのスタートである。 一応の風景としては、先週撮ったのは こんなカンジ である。

2013年5月15日(水)

前期は月曜に1コマ、火曜に3コマの講義があり、水曜日と木曜日は講義が無い。 今週は金・土と阪大に学会発表出張(+甲子園ライトスタンド観戦)の予定なので、今日と明日が「稼ぎ時」である。 実際には、まだ阪大でのプレゼンを作っていないし(^_^;)、来週の講義(「音楽情報科学」「サウンドデザイン」)の教材(講義ページ)は出来たものの、月曜4限の学科専門必修「メディア造形論」の学科教員持ち回り担当日なのに、そのプレゼンも作っていない(^_^;)。 まぁ、それは大阪往復の新幹線の車中、という予定なのである。 放課後には、今年度から水曜日に移動したアカペラがあり、連休中に3回のマラソンカラオケ(計23時間、計91曲)の成果として、今日のアカペラに新入生の見学・参加の表明が届いているのが、朝から楽しみでならない(^_^)。

まずはスタートの整理として、これまで手元にあったUnix/Linux/Raspberry Pi関係の資料、そして参考文献/資料についてまとめておこう。 書き出すと昔話が延々とあるが全て省略すると、とりあえずの登場人物として「ふーみん」は必須である。 現在、 東大 の先生をしている中村文隆さんであり、彼は僕にとってUnixの師匠であるが、僕は彼にとってComputer Musicの師匠である。 ともに京大理学部物理学科の卒業生で、20年ほど前、彼が京大ドクター時代に 僕の神戸山手女子短大音楽科の講義 の助手をしてもらって以来の付き合いで(その後、神戸山手の専任教員となり非常勤講師の僕を支えた)、音楽情報科学研究会やComputer Musicコミュニティが共通フィールドである。 ふーみんは強力なUnixオタクで、まだ日本に「Linux教の信者」が10人しかいなかった頃(まったく知られていない時代)からLinuxを使い倒している猛者である。 このページを含む僕のドメイン[nagasm.org]の共同管理者(root)にもなってもらっている。

以下の写真は、手元にあるRaspberry Pi関係の3冊の書籍であるが、分解したインプレスの本とCQ出版の本と並んでいる260ページの分厚い原稿は、まだ某出版社から出版される前の、ふーみんが執筆した「Raspberry Pi本」の校正前原稿である。 この本が出版されれば、日本のスケッチング業界でもまたRaspberry Piが大騒ぎになる事は確実であるが、この内容をテストユーザとして追いかけてみる、というのが、この「日記」のユニークなところになるかもしれない。 もちろん、たった4.6MBのPDFであるが、ふーみんの生原稿はここでは紹介できないので、あしからず(^_^;)。

さて、アナウンスから購入まで半年以上も待たされたRaspberry Piであるが、その間に手元に集めていた資料も整理しておこう。 以下のメモは最初のおさらいで、「Unix環境下でC言語のプログラムをコンパイルして実行する」という作業であった。

■MacOSXのターミナルでUnixする■

・ターミナルを起動する → 「/Users/nagasm」がdefault
	適当にDesktopなどにcdする

・ソースファイルはJeditで書き出す。拡張子は「*.c」

・コンパイルは「gcc ****.c」でOK → defaultの出力実行プログラムは「a.out」
	実行は「./」に続けてプログラムを指定する
	以下は出来た(^_^)

#include 

main(){
	printf("\n\tHello, World \n\n");
}

・その実行は「./a.out」でOK

・バックスラッシュの入力は「option+"?"」

・manから抜けるのは「control+"z"」

また、もう1年ほど前になるが、Raspberry Piを注文した時に、RSコンポーネンツから届いた「最新情報」という以下のメモもあった。

Rapsberry Piに関しての最新情報
If this e-mail isn't displaying correctly please click here.

https://eu.rs-email.com/pub/cc?_ri_=X0Gzc2X%3DWQpglLjHJlTQGhNza6E7ukLrn9zeYamjnza81zfozeApwuoHfrfzbDw8HrFMRVXtpKX%3DSRRYBRDWT&_ei_=EolaGGF4SNMvxFF7KucKuWOGPw6Bdvhs-6K7j8xi_jUm6w.Jg%3D%3D

Raspberry Piに関する最新情報

お客様のご登録情報
メールご登録ID: 3####7
ご登録日: 04/06

こちらより (Raspberry Piインフォメーションサイト)
https://eu.rs-email.com/pub/cc?_ri_=X0Gzc2X%3DWQpglLjHJlTQGhNza6E7ukLrn9zeYamjnza81zfozeApwuoHfrfzbDw8HrFMRVXtpKX%3DSRRYBSTWY&_ei_=EolaGGF4SNMvxFF7KucKuWMcpCo5wvQCpk3oqWSPqPGp6w_Rw52RdHZFP4Uv.Jg%3D%3D

いつ頃「Raspberry Pi」購入のご案内メールをお届け可能かが分かるようになりました。

2012年6月

当メールではお客様の登録に関する情報と、その他Raspberry Piに関する最新情報をお届けします。

RSでは今年8月までに約100,000個の入荷を予定しています。Raspberry Piのご注文時には、入荷予定に基づきお客様への出荷可能な日時をお知らせしております。

お待たせをしまして申し訳ございませんが、今後も順次入荷を予定しておりますので、案内の届いていない方は今しばらくお待ち下さい。

FAQはこちらよりご覧下さい。 FAQ's
http://authenticate.rsdelivers.com/staticpages/pi/faq.aspx

もっとRaspberry Piに関してお知りになりたい場合は、 エンジニアのためのコミュニティーサイト DesignSpark
http://www.designspark.com/ja/theme/raspberrypi
をご覧下さい。

Raspberry Piクィックスタートガイド
Raspberry Piの初期設定に関する記事になります。
http://rswww.co.jp/raspberrypi

https://eu.rs-email.com/pub/cc?_ri_=X0Gzc2X%3DWQpglLjHJlTQGhNza6E7ukLrn9zeYamjnza81zfozeApwuoHfrfzbDw8HrFMRVXtpKX%3DSRRYBSTUD&_ei_=EolaGGF4SNMvxFF7KucKuWOGPw6Bdvhs-6K7j8xi_jUm6w.Jg%3D%3D

Raspberry Piのアクセサリに関して
Raspberry Piはボードのみ出荷され、アクセサリ類は付いてきません。必要なアクセサリ類はこちらをご覧下さい。
http://rswww.co.jp/raspberrypi

https://eu.rs-email.com/pub/cc?_ri_=X0Gzc2X%3DWQpglLjHJlTQGhNza6E7ukLrn9zeYamjnza81zfozeApwuoHfrfzbDw8HrFMRVXtpKX%3DSRRYBSTWR&_ei_=EolaGGF4SNMvxFF7KucKuWOGPw6Bdvhs-6K7j8xi_jUm6w.Jg%3D%3D

RSでは「Raspberry Piキャンペーン」を実施中!
RSオンラインにご登録いただいた方の中から抽選で5名様にRaspberry Piをプレゼントします。キャンペーン期間: 2012年7月31日まで
http://rswww.co.jp/raspberrypi

https://eu.rs-email.com/pub/cc?_ri_=X0Gzc2X%3DWQpglLjHJlTQGhNza6E7ukLrn9zeYamjnza81zfozeApwuoHfrfzbDw8HrFMRVXtpKX%3DSRRYBSTWS&_ei_=EolaGGF4SNMvxFF7KucKuWOGPw6Bdvhs-6K7j8xi_jUm6w.Jg%3D%3D

その他Raspberry Piに関して
既にRaspberry Piをご購入をいただいた方の声など、Raspberry Piに関する最新ニュースはこちら。

https://eu.rs-email.com/pub/cc?_ri_=X0Gzc2X%3DWQpglLjHJlTQGhNza6E7ukLrn9zeYamjnza81zfozeApwuoHfrfzbDw8HrFMRVXtpKX%3DSRRYBRDWU&_ei_=EolaGGF4SNMvxFF7KucKuWOGPw6Bdvhs-6K7j8xi_jUm6w.Jg%3D%3D

Raspberry Piに関する日本語のFAQはこちら。
FAQ's
https://eu.rs-email.com/pub/cc?_ri_=X0Gzc2X%3DWQpglLjHJlTQGhNza6E7ukLrn9zeYamjnza81zfozeApwuoHfrfzbDw8HrFMRVXtpKX%3DSRRYBSTWW&_ei_=EolaGGF4SNMvxFF7KucKuWOGPw6Bdvhs-6K7j8xi_jUm6w.Jg%3D%3D

そして、ここから手元に「2012-09-18-wheezy-raspbian.zip」(460MB)をダウンロードしたり、ムービーを中心にいくつかの資料をゲットしていた。 ちなみに最新版として新たに「2013-02-09-wheezy-raspbian.zip」もダウンロードした。 明日あたりに注文していたSDカードが届いたら、さっそくこれを書き込む予定である。 そのためのマニュアルは以下である。

http://downloads.raspberrypi.org/verifying_an_image.html

Raspberry Pi Logo Raspberry Pi Distribution Downloads

File: 2013-02-09-wheezy-raspbian.zip
File Size: 470.72 MiB

You will be redirected in 5 seconds. Don't want to wait? Use a Direct Link.
SHA-1 Checksum: b4375dc9d140e6e48e0406f96dead3601fac6c81
Default login Username: pi Password: raspberry

Verifying an Image

The Raspberry Pi Images come with an SHA-1 Checksum. These are usually shown as a long series of characters that represent the value that was calculated when a mathmatical calculation was performed on the contents of a file that has been made available for download. The checksum is used to verify that the content is authentic and has neither been altered by an unauthorized third party, nor been damaged during the transfer process across the Internet.

MAC Instructions:

1. Download the image file from the Raspberry Pi website and make sure you have the icon of the downloaded file displayed somewhere in the Finder.

2. Open the Terminal application.

3. Run "/usr/bin/openssl sha1" (without the quotes), then put a space, drag the image file into the command prompt and press enter. Note that the command can take a few minutes to complete.

4. Compare the hash you have with the one specified on the page where you downloaded the file from

5. If they are the same then the file has been downloaded successfully. If the hash does not match you will have to download the file again.

そして、これまで観たことがなかったが、約1年前に、手元にゲットしていた上記のRaspberry Pi紹介サイトにあったデモ/チュートリアルのmovieを、ざっと確認してみた。 全て英語であるが(^_^;)、まあ、いい勉強である。 これ は、Raspberry Piとケーブルや周辺機器の接続についての解説である。 これ は、接続したRaspberry Piの電源を起動するあたりの解説である。 これ は、別なユーザが全体のチュートリアルをざっとまとめた記録のようである。 これ は、SDカードを最大容量まで拡張する方法の解説である。 これ から全16話のチュートリアルが並ぶが、まずはDebian Linuxの解説である。 これ は、VNCを使ってホストPCの画面内にRaspberry Piのリモート画面を表示する話題である。 これ は、Raspberry PiでC言語のプログラミングを行う、という話である。 これ は、コーディングスタイル(美しくプログラミング(^_^))という話である。 これ は、C言語でグラフィクスなどを交えたゲームを開発する概要である。 これ は、「初めてのゲーム・プログラミング」である。 これ は、ゲームのプログラミング・テクニック等の話題である。 これ は、「Pi Shooter」と名付けたサンプルゲームを完成にまでもっていく話である。 これ は、次のターゲットとして「Pi Snake」と名付けたゲームの開発を始めたところである。 これこれこれこれこれこれこれ は、その続きである。 これ は、Fedora's GUIという環境のインストールに関する話である。 これ は、GTK(Graphical ToolKit)で最初のC言語プログラミングをする、という話の前半である。 これ は、GTKで最初のC言語プログラミングをする、という話の後半である これ は、プログラミングに関する別のサンプルの話である。 これ は、プログラミングに関するまた別のサンプルの話である。 これ は、Raspberry Piチュートリアル全体の俯瞰のようである。 これ は、Xbox Media Centerにアクセスする事例紹介のようである。 結局、これらのチュートリアルビデオでは、Raspberry Piを小型のパソコンと位置付けていて、ふーみんの本のような物理コンピューティングの視点はほとんど無い、と確認できた。 つまり、今後、これをじっくりとまた観ることは、無いような気がする(^_^;)。

・・・ここまでグズグズしてなかなか踏み出さないのには理由があり、明日あたりに届くという、注文していたRaspberry Piシステム実験用の小型キーボードと小型マウスとSDカードを待っているからである。 ここの写真 に映っている小型の液晶テレビはビデオ信号モニタとして活用できるが、繋いでいるキーボードはMac用なので、微妙に文字コードが違っているのである。 また、いつもトラックボールを使っているので、ついでに小型マウスも購入したので、この風景はあくまで暫定である。 既に ここここ にあるように、Raspberry Piが立ち上がってLAN経由でインターネットの世界にまで出かける、という事は確認しているので、次に行うのはSDカードにOSのミラーイメージを書き込むところなのだが、その肝心のSDカード(4GB)は明日に納品予定なのである。

しかしここで思い出したのが、実験用に過去に仕入れていた、上の16GBのSDHCカードの存在だった。 幸いにも色々なデータのバックアップに使っているものの、4枚ほど使わずに余っていることが判明したので、今日はこれをやってみる事にした。 手順をこの日記に書いておけば、もう手元の文献(書籍)の完了したページはどんどん取り外して捨てていく、という方針である(^_^;)。 まずは、作業開始のデスクトップは以下である。2画面を開いたMac miniであるが、ターミナル、このHTMLファイル、サーバに送るFTPソフト、モニタするブラウザなどが広がっている。(^_^;)。

SDカードに書き込む方法は、文献ではLinuxとかWindowsとかも書かれているが、ここはMacOSXだけで十分である。 ユーティリティの「ターミナル」アプリケー ションをまず起動して、「diskutil list」とすると以下のようにディスクの一覧が出た。 これは内蔵HDD(160GB)と、外付けのTime Machine用500GBである。

nagasm-Mac-mini:Desktop nagasm$ diskutil list
/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *160.0 GB   disk0
   1:                        EFI                         209.7 MB   disk0s1
   2:                  Apple_HFS mini                    159.7 GB   disk0s2
/dev/disk1
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *500.1 GB   disk1
   1:                        EFI                         209.7 MB   disk1s1
   2:                  Apple_HFS work13                  499.8 GB   disk1s2
そしてここでSDカードリーダにSDカードを挿して再び「diskutil list」とすると以下のようにディスクの一覧が変化した。
nagasm-Mac-mini:Desktop nagasm$ diskutil list
/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *160.0 GB   disk0
   1:                        EFI                         209.7 MB   disk0s1
   2:                  Apple_HFS mini                    159.7 GB   disk0s2
/dev/disk1
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *500.1 GB   disk1
   1:                        EFI                         209.7 MB   disk1s1
   2:                  Apple_HFS work13                  499.8 GB   disk1s2
/dev/disk2
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     Apple_partition_scheme                        *16.1 GB    disk2
   1:        Apple_partition_map                         32.3 KB    disk2s1
   2:                  Apple_HFS 15GB-37                 16.0 GB    disk2s3
明らかに、新たに登場した「/dev/disk2」が、容量からもSDカードである。 このドライブを間違うと、HDDを消去してしまうので、ここは注意が必要なのである。 この状態ではOSがSDカードをドライブとしてマウントしているので、まずマウントを解除する必要がある。 ターミナルから「diskutil unmountdisk /dev/disk2」と打つと、「Unmount of all volumes on disk2 was successful」と表示されて、以下のようにアイコンがデスクトップから消えた。



これに続いて「dd」コマンドでSD カードにディスクイメージを書き込むことになる。 注意点としては、カレントディレクトリにイメージデータがある必要があるが、既にzipを解凍したイメージファイルはデスクトップにあり、ターミナルでデスクトップに移動しているので、ここはOKである。 また、ddコマンドはroot権限で実行する必要があるが、もともとお仕事用Macでは僕はrootなので、本に書かれている「sudo」はここでは不要である。 ということで、ふーみん本に従って、ターミナルから「dd if=2013-02-09-wheezy-raspbian.img of=/dev/disk2 bs=2M」と打ってみたところ、「dd: bs: illegal numeric value」と断られた(^_^;)。 ドキッとしたが、インプレス本では「bs=2M」でなく「bs=1m」と書かれていたので、「dd if=2013-02-09-wheezy-raspbian.img of=/dev/disk2 bs=1m」と入れると、無事に書き込みがスタートした(^_^)。 そして約5分後、無事に以下のようなメッセージが出て、1.9GBのLinuxの入ったSDカードになった。成功である。

デスクトップには、新たに以下のような内容のドライブが出現した。 16GBのSDカードのはずなのに、ほとんど残りが無い状態なので、これはRaspberry Piの環境設定機能で拡張する必要がある。 そこでターミナルから「diskutil unmountdisk /dev/disk2」と打つと、ちゃんとアイコンがデスクトップから消えたのでSDカードを外した。

そして、せっかくなので以下同文の繰り返しで、SDカードを計4枚、Raspberry Pi用に書き換えた。 次のSDカードを入れて、ドライブのアイコンと「/dev/disk2」を確認してアンマウントしようとしたらエラーになったが、これはFTPソフトが掴んでいるためであり、FTPソフトを一旦quitすると問題なく作業できた。 そして、いよいよ手元にあったRaspberry Piに入っていた、OS入りとして1枚だけ購入していたSDカードを、この新しいSDカードに差し替えて、まずは立ち上げてみた。 すると以下のように、何故か「generating swapfile ...」というメッセージとともに、長い長い沈黙に入った(^_^;)。

そしてこのまま10分以上、何も変わらないのを確認して、Raspberry Piから電源プラグを抜き、数秒してから、再度リブートした。 電源スイッチがないので、立ち上げ直すにはこれしかない。 すると今度は、以下のような表示が出て、5分間、待つのだという(^_^;)。なんだこりゃ。

ここで再び電源を抜いて、しばらくして入れても同じである(^_^;)。 これはヤラレタかもしれない。 とりあえずこの37番のSDカードを諦めて、38番の同等の(筈の)SDカードに差し替えてRaspberry Piを立ち上げてみた。 すると以下のように、「generating swapfile ...」で止まることもなくLinuxが立ち上がってあっさりと環境設定メニューに入ったので、SDメモリカードの領域拡張と、SSHサーバをイネーブルに設定してリブートした。 これは、もしSDカードが1枚きりだったら行き詰まっていたところだったが、助かった。 37番のSDカードは、もう一度、この合間にイメージ書き込みを行うこととした。

・・・しかし今度は、上の再起動で行う領域拡張のメッセージが、15分以上したところで画面から消えて真っ暗になってまたまたドキッとしたが、これはスクリーンセーバであって、キーボードのエンターキーで現れてくれた。 5分以上経過して、37番のSDカードのイメージ書き込みが終わっても、まだまだSDカードのリサイズは終わらない。 なかなかに不安な時間が経過した後に、以下のように今度は文字化けの画面となった。 キーボードのロケールをしていなかったからか(^_^;)、「pi」でのログインも出来ない。

とりあえずRaspberry Piの電源を抜き、再び立ち上げてみると、今度はさっきと違うところで止まったままになり、しばらくして表示が進んではまた止まり、と不思議な挙動を繰り返していて、20分たってもログイン画面まで到達しない。 うーーむ、なかなかRaspberry Piは厄介だぞ。

ここで、改めてRaspberry Piのハードウェアの正常(だいぶ基板が暖まったので温度の影響を懸念)を確認するために、Raspberry Piと一緒に買った4GBのSDカードに差し替えて立ち上げてみると、まったく何の問題もなく正常だった(これまで省略していたshutdownもちゃんと出来た)。 これを確認してから再び38番のSDカードに差し替えて立ち上げてみると、さっきとはまた違う、これまで見たことのない膨大なタイムアウトエラーと何かプロセスをkillしまくる(^_^;)、というメッセージが延々と出続けた。 止まっているよりはいいものの、いつまでたってもタイムアウトエラーを表示し続けるというのもあまり嬉しくない(^_^;)。

2013年5月16日(木)

昨日は上記で突然に終わっているが、実はあと少し、進んでいた。 ただし放課後となってアカペラが始まったので、全てをそっくりそのまま今日に引き継いだのである。 アカペラは正式な参加者も出現、さらに新しい見学者が数人、と盛況である。 ここから何人かでも参加してくれればbestである。(^_^)

昨日の最後あたりの不思議な現象をを整理すると、以下のようになっていた。 そして、ふーみんにメイルすると即刻返信があり、「2M」という記述の大文字がMacでひっかかった、という可能性が指摘された。 こうなると、「2m」で再度チャレンジ、という可能性も出て来るが、多くのMacユーザが「1m」でちゃんと動いているという。 「SDHCのClass 4で16GBなら問題なさそうに思えるんですが」というふーみんは、SDカードとの相性が原因では、との見立てである。

そして昨日は、アカペラまでの時間に、せっかくなので起動の様子を5本撮影して、動画としてYouTubeに上げていたのである。 以下に今日のスタートラインとしてその一覧をまとめておくが、これはまぁ、見ても何も面白くない(^_^;)ものである。 ちなみにその後、4枚目のイメージ書き込みした40番の16GBのSDカードで起動させたが、やはりトラブルとなったところで時間切れとなったのである。 簡単に言えば「全滅」というのが昨日の結果であった。 今日は、注文していた4GBのSDカードが届くし、Mac用でないきちんとしたJISキーボードも届くので、まぁ「仕切り直し」ということである。

午前中は明日の出張に関してあれこれ準備したり、突然に こんなページ を上げたりした。 なんせ久しぶりの甲子園ライトスタンドである(^_^)。 そして、ふーみん情報からSDカードを色々と試行錯誤しないといけない可能性も出て来たので、とりあえず以下のように色々と発注をかけた。 アスクルなので明日には大学に届くが、この週末はEC研究会で阪大に出張なので、試すのは来週になる。

その後、CGクリエイター検定試験の団体受験の受け付けとか、夏休みの高校への出前授業とか、バックアップデータの整理とか、あれこれするうちに15時を過ぎたが、ようやくここで業者が納品にやってきた。 以下がその全貌である。

小型軽量の二つ折りのキーボードは、なんだかかなりチャチいところが不安である(^_^;)。 USBケーブル巻取器付の小型マウスはなかなか良好であるが、フットレスト付トラックボールはいまいち、そしてこのトラックボールは業者も「こんなに大きいとは思ってませんでした」と言うほど巨大で、いきなり倉庫行きである。

とりあえず上のように、クラス10という4GBのSDカードに番号を振って、このような周辺でとりあえずの実験をスタートすることにした。 そして以下のように接続し、Raspberry Piとともに購入したSDカードで立ち上げて、今回はきちんと環境設定を行った。

ここで行った環境設定(SDカードの領域拡張は実行済み)について整理すると以下のようなことである。 もちろん、ネタ元はふーみん本である(^_^)。 ちなみにこのSDカードは既に立ち上げ使用していて環境設定メニューが出ないので、「sudo raspi-config」と打ってメニューを出したのだが、この二つ折りキーボードは予想以上にキー入力をちゃんと拾ってくれないこともあり、ミスタイプもあって、数回打ってようやく入力できた(^_^;)。

ここからは昨日の復習である。 新しいSDカードを「diskutil list」で「/dev/disk2」と確認して、「diskutil unmountdisk /dev/disk2」でアンマウントして、デスクトップにイメージを置いてそこにいる事を確認してから、今回はふーみんメイルを受けて「2m」として、「dd if=2013-02-09-wheezy-raspbian.img of=/dev/disk2 bs=2m」と入れると、無事に書き込みがスタートした(^_^)。
nagasm-Mac-mini:Desktop nagasm$ diskutil unmountdisk /dev/disk2
Unmount of all volumes on disk2 was successful
nagasm-Mac-mini:Desktop nagasm$ dd if=2013-02-09-wheezy-raspbian.img of=/dev/disk2 bs=2m
925+0 records in
925+0 records out
1939865600 bytes transferred in 267.567217 secs (7250012 bytes/sec)
nagasm-Mac-mini:Desktop nagasm$ diskutil list
/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *160.0 GB   disk0
   1:                        EFI                         209.7 MB   disk0s1
   2:                  Apple_HFS mini                    159.7 GB   disk0s2
/dev/disk1
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *500.1 GB   disk1
   1:                        EFI                         209.7 MB   disk1s1
   2:                  Apple_HFS work13                  499.8 GB   disk1s2
/dev/disk2
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *4.0 GB     disk2
   1:             Windows_FAT_32                         58.7 MB    disk2s1
   2:                      Linux                         1.9 GB     disk2s2
nagasm-Mac-mini:Desktop nagasm$ 
昨日は16GBだったがこちらは4GB、それも高性能なクラス10ということで、上のように、かなり短い時間でイメージ書き込みが終了した。 昨日はここから、とりあえず手元の4枚のSDカードにイメージ書き込みを行ったが、色々とトラブったのに懲りて(^_^;)、まずはこのSDカードをRaspberry Piに入れて立ち上げてみることにした。 すると以下のように、順調に立ち上がり、環境設定も無事に出来た。 さらに、Raspberry Piと一緒に購入したSDカードよりも、startxで起動した画面に何やらツールが増えていた(^_^)。

そして以下のように、日本語ロケールにしたお陰で、ちゃんと、ブラウザ「midori」で日本語のページが表示できた。 これは以前と比べたら、かなり大いなる進歩である。

ここで安心して、とりあえず、昨日いろいろと不調だった37-40番の16GBのSDカード(クラス4)を、元のようにMacフォーマットに戻して、元の場所に仕舞った。 そして、とりあえず忘れないうちに(デスクトップにターミナルが残っているので)、届いた新しい4GBのSDカード数枚(計1-5までの5枚)にイメージを書き込んで、さらに環境設定として「SDカードの領域拡張」「日本語キーボードの設定」「日本語ロケール」「SSHサーバ起動」まで設定して、正常にリブートして正常にシャットダウンする所まで確認できた。 昨日の不調が嘘のようである。 夕方になって一気に加速したが、まぁ今日はこんなところだろう。(^_^)

2013年5月19日(日)

5/17-18の週末は、5週に4回ある学会発表シーズンの第2弾として阪大に行き、エンタテインメントコンピューティング研究会で こんな 発表をしてきた。 そしてこの大阪出張では こんな お楽しみをしてきたので、Raspberry Piの進展はまったく無かった。(^_^;)

しかしこの間に、ふーみんから「SDカードとRaspberry Piの相性についてのサイト」ということで、 こんなページ の情報がメイルで届いた。 なんともこれは「百鬼夜行」とでも言うべき状況である(^_^;)。 明日には各社の色々なSDカードが届くので、時間をみて実験してみたいが、「メディア造形論」の担当もあるので、ぼちぼちである。

2013年5月20日(月)

身体のあちこちに疲れが残りつつ(^_^;)の月曜日であるが、いつもの2限の「音楽情報科学」に加えて、4限に 「メディア造形論」 担当 という大仕事があり、その準備で1限と3限が費やされて、無事に終わった脱力感(達成感)で5限が終わった。 さらに加えて、 第40期「虎の穴」募集 のページを作って上げたところで終了である。 実際には、以下のように各社のSDカードが入荷していたが、この実験は明日以降である。 もっとも明日も1限の「サウンドデザイン」と4-5限の「企画立案演習」があるので、まぁ、ぼちぼちであるが、果たしてどのSDカードがOKでどのSDカードが駄目なのか、ここできちんと記録しておきたいと思う。

2013年5月21日(火)

1限の「サウンドデザイン」と4-5限の「企画立案演習」の合間に、新しく届いた各社のSDカードにLinuxイメージを書き込んでのテストである。 ターミナルに入れて使うコマンドは以下である。

まず最初は、RSコンポーネンツからRaspberry Piを勝った時に一緒に買ったSDカードとたぶん同じ、トランセンドの4GB(class 6)である。 イメージ書き込み時間は「1939865600 bytes transferred in 267.241017 secs (7258862 bytes/sec)」である。 なんと結果は以下のように駄目で、Raspberry Piにセットして電源を入れて数分たっても、ずっと止まったままであった。

そこで仕方なく、電源を抜いて、再度入れてみると、今度は以下のように無事に立ち上がった。 その後は既に行った手順で環境設定、リブート、shutdown確認と「正常」であった。 いきなり1枚目から、なんとも不穏な雲行きである。(^_^;)

次は、同じトランセンドのマイクロSDカード4GB(class 4)である。 これは「5枚セット」ということで買ったが、代表として1枚だけ実験してみることにした。 イメージ書き込み時間は「1939865600 bytes transferred in 445.198589 secs (4357304 bytes/sec)」である。 なんと、上記の同じトランセンドの2倍近く時間がかかった事になるが、Raspberry Piに入れて立ち上げてみると、無事に1発OKであった。(^_^)

次は、イメーションの4GB(class 4)である。 これまでのカードでは「diskutil list」すると、サイズが「4GB」と表示されたのに、このSDカードは何故か「3.9GB」となっている。 どこのOEMなのだろうか(^_^;)。 イメージ書き込み時間は上のカードとほぼ同じ、「1939865600 bytes transferred in 427.842439 secs (4534065 bytes/sec)」であった。 Raspberry Piに入れて立ち上げてみると、無事に全てOKだった(^_^)。

ここから国内有名ブランドのシリーズである(ブランドが消滅しないことを切に祈りたい)。 次は、TDKのマイクロSDカード8GB(class 4)である。 「diskutil list」すると、サイズは「7.7GB」と表示された。 ちょうど裏でTimeMachineの定時バックアップとカチ合ったが、イメージ書き込み時間は「1939865600 bytes transferred in 427.054722 secs (4542429 bytes/sec)」であった。 Raspberry Piに入れて立ち上げてみると、無事に全てOKだった(^_^)。

次は、TDKの8GB(class 10)である。 「diskutil list」すると、サイズは「8.0GB」と表示された。 イメージ書き込み時間はまた短くなって「1939865600 bytes transferred in 270.501290 secs (7171373 bytes/sec)」である。 ここまでの規則性としては、SDカードに対して、マイクロSDカードでは、変換アダプタが何かやっているのか、ほぼ倍の時間がかかる、という推測が成立しそうである。 Raspberry Piに入れて立ち上げてみると、無事に全てOKだった(^_^)。

次は、SONYのマイクロSDカード4GB(class 4)である。 イメージ書き込み時間は推測通りに「1939865600 bytes transferred in 484.424596 secs (4004474 bytes/sec)」と、他にさしたるバックグラウンド処理も無かったのに、これまでで最長である。 Raspberry Piに入れて立ち上げてみると、無事に全てOKであり、何故か、明らかにこれまでのどのSDカードよりもLinuxシステムの反応が高速だった。

最後は、パナソニックのマイクロSDカード4GB(class 4)である。 イメージ書き込み時間は「1939865600 bytes transferred in 394.055054 secs (4922829 bytes/sec)」であり、「マイクロSDカードだと2倍近い時間がかかる」という経験則?に対してはかなり良好であった。 Raspberry Piに入れて立ち上げてみると、無事に全てOKだった(^_^)。とりあえずこの結果はふーみんにメイルで知らせてみよう。

さて、講義の合間にちょっとだけでも進めようとしたが、例によって行き詰まった(^_^;)。 とりあえず状況を整理して、ここはふーみん師匠に質問である。 次のステップとして、「Raspberry PiにSSHサーバを走らせて、外部のパソコンからSSHする」というところである。 SSHは入口であって、本命は以下のふーみんの昔の本にある「VNC」をここで使う、というところなのだが、まずはSSHである。

Raspberry Piの環境設定でSSHサーバを走らせる、と設定していることもあり、簡単に行くかと思ったら、これが難航しているのである(^_^;)。 どの解説本にもある通り、まずはRaspberry Piが研究室のLANでDHCPサーバから与えられたIPアドレスを「ifconfig」で取得すると、今回は「172.16.65.118」であった。 そこでMacのターミナルから以下のようにSSHを仕掛けると、拒絶された(^_^;)。 ただし、pingしてみると、ちゃんとRaspberry Piは生きている。

nagasm-Mac-mini:~ nagasm$ ssh pi@172.16.65.118
ssh: connect to host 172.16.65.118 port 22: Connection refused
nagasm-Mac-mini:~ nagasm$ ping 172.16.65.118
PING 172.16.65.118 (172.16.65.118): 56 data bytes
64 bytes from 172.16.65.118: icmp_seq=0 ttl=255 time=4.089 ms
64 bytes from 172.16.65.118: icmp_seq=1 ttl=255 time=4.144 ms
64 bytes from 172.16.65.118: icmp_seq=2 ttl=255 time=4.142 ms
64 bytes from 172.16.65.118: icmp_seq=3 ttl=255 time=4.142 ms
64 bytes from 172.16.65.118: icmp_seq=4 ttl=255 time=4.141 ms
64 bytes from 172.16.65.118: icmp_seq=5 ttl=255 time=4.148 ms
64 bytes from 172.16.65.118: icmp_seq=6 ttl=255 time=4.142 ms
64 bytes from 172.16.65.118: icmp_seq=7 ttl=255 time=4.163 ms
64 bytes from 172.16.65.118: icmp_seq=8 ttl=255 time=4.049 ms
64 bytes from 172.16.65.118: icmp_seq=9 ttl=255 time=4.077 ms
64 bytes from 172.16.65.118: icmp_seq=10 ttl=255 time=4.125 ms
64 bytes from 172.16.65.118: icmp_seq=11 ttl=255 time=4.172 ms
64 bytes from 172.16.65.118: icmp_seq=12 ttl=255 time=4.151 ms
^Z
[1]+  Stopped                 ping 172.16.65.118
nagasm-Mac-mini:~ nagasm$
また以下のように、Raspberry Piは研究室のLANからSUACのプロキシサーバを経由して、サーバの実態はシリコンバレーにあるという僕のドメインをアクセスしてちゃんと表示しているし、Raspberry Piのx-window内のターミナルからホストのMacにpingをかけてもちゃんとアクセス出来ている。

ここで、現象を明らかにするために、以下のようにもう1台のMac(PowerBookG4)をさらに立ち上げた。 互いを区別するために、メインのMac miniを「ホスト」と呼び、「Raspberry Pi」と「PowerBookG4」の3者で実験してみた。 まず、PowerBookG4からも、WiFi経由ならでやや時間はかかるものの、以下のようにホストにpingが通っている (ホストからPowerBookG4へのpingが通っていることも確認した)。 そしてホストの環境設定を「リモートログインを許可」とすることで、以下のようにPowerBookG4からホストには、ちゃんとSSHに成功しているが、上記と同じで、PowerBookG4からRaspberry PiへのSSHは「Connection refused」で即刻、断られた(^_^;)。

上の現象は、「リモートログイン許可」をしていないPowerBookG4に対して、ホストからSSHを求めた場合と同じ結果である。 ところで、Raspberry PiからホストへのSSHについては、「port 22: Connection Timed out」ということで、しばらく待たされてから切断される。 メッセージが異なっているのである。

ここでネットで「ssh connection refused」というキーワードでいくつかの情報を調べて、とりあえず「ssh -v -l」とかやってみたが、要するにポート22であっさりと接続拒否されている。 また、「/etc/ssh/sshd_config」の中身が問題のようだが、これをRaspberry Piの画面に表示しても膨大なので困った。 とりあえず「cat」コマンドでファイルに書き出してみたが、これはRaspberry PiのSDメモリカードのカレントに置かれていて、それをSSHで見れないから困っているのである(^_^;)。 とりあえずRaspberry Piをシャットダウンして、SDカードをMacに入れてみたが、当然ながらLinuxパーティションはMacから全く見えず、書き出した「/etc/ssh/sshd_config」の中身のファイルは、見えない。

・・・というあたりでタイムアップである。 ここまでをふーみんにメイルして、「/etc/ssh/sshd_config」の中身のどこをチェックして、どう直して(うーーむ、Unixのエディタかぁ(^_^;))、どうsshdをリブートするのか、おいおい挑戦してみよう。

2013年5月22日(水)

水曜日である。 後期の水曜日は1限が大学院科目、2限に芸文科目のメディアアーツ論、そして4-5限にサウンドデザイン演習、さらに放課後にアカペラと週の講義科目を全て集めたヘヴィな日であるが、前期は講義科目が月・火なので、水曜日は放課後のアカペラだけ、という「お仕事の日」である。 昨日ふーみんにメイルした質問の返信も届いて、朝から全開で頑張る筈であったが、こういうタイミングで将棋名人戦第4局の2日目なのであった(^_^;)。 過去に浜松で開催された時には このように 見に行ったこともあり、別にニコニコ動画の有料中継を見るわけではないが、とりあえずウインドウの一角に2ちゃんの将棋スレで遅々として流れてくる情報はウォッチしつつの一日となる。 昨日の1日目の「▲3七銀」までが定跡、という話題から、その定跡の最初の記録が1848年だという話題に、 このページ を改訂したり・・・と、あれこれ回り道をした。

見ましたが・・・なんか謎ですねぇ。

まず、一般論で、config fileの編集ですが、
sudo nano /etc/ssh/sshd_config
のように、nanoというテキストエディタが標準で使えます。
#vi を使うのは今や私のようなロートルくらいです・・・

sshのリスタートは、
sudo service ssh restart
で出来ます。

それでsshですが、まず、RPi 上で、ローカルホストに
sshできるかどうか確認してみてください。
ssh pi@127.0.0.1
で、これで接続できなければローカルになにか問題がある気がします。

ローカルホストに接続できるようなら、iptablesが設定されていないか、
以下で調べられます。
pi@raspberrypi ~ $ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

ただ、RPiの Wheezyではファイアウォールの設定はないはずなので、
わざわざ設定してなければかかってないはずで、上記のようになっている
はずだと思います。

特にRPiの設定をいじっていなければ(というかいじってないはずだと
思うんですが)、RPi の初期のsshの設定はむしろアブナイんじゃないかという
くらいオープンな設定になってます。

Mac側で、セキュリティソフトやファイアウォールで、sshのアクセスを
許可するホストが個別に設定されてたりしないでしょうか。
お手数ですが、まずそのあたりをチェックしてみてください。

ただ、ローカルホスト(127.0.0.1)への接続ができない場合、
sshdの設定がおかしい可能性もあります。
その場合、
sudo cp /etc/ssh/sshd_config /boot
として、その後RPiの電源を切り、取り出したSDカードを
Macなどで読んでみてください。

/boot だけは普通のWindows のFAT32システムになってます
(要するに普通のDOSパーティション)。なので、ここにコピーしておけば
MacやWindowsで普通に読み出すことができます。

読みだしたsshd_configをメールで送ってもらえればチェックできると
思います。
以上が、ふーみんからのメイルであった。頼もしい師匠である(^_^)。 とりあえず、SDカードに保存したファイルをRaspberry Piを切って、外から読み出す方法がまずは収穫である。 さっそく実行して(当然のことながらsudoが必要と判明)、「sshd_config」と、ついでに「ssh_config」も添えて、まずは このように 取り出したものをふーみんにメイルしてみた。 今日のパソコンの2画面は以下のようなカンジである。 ニコニコ動画の無料ライブ中継とそのミラーサイトはこの状態から進展がまったく無いのは判っているので閉じたが、けっこう画面を占有されている(^_^;)。

そしていよいよ、SSHに向けて、ふーみんメイルの最初からなぞっていく事にした。 まず、テキストエディタ「nano」であるが、以下のようにちゃんと動くことを確認した。 日本語環境はx-windowの中だけは実行できているので、基本的にはRaspberry Piが起動したら「startx」を起動して、その中でお仕事することにしよう。 「startx」の自動起動については、設定方法は確認しているが、行わない方針である。

sshdのリスタートは、最初、「sudo service sshd restart」とやって叱られたが(^_^;)、ふーみんメイルにあるように「sudo service ssh restart」であった。 ちゃんとメッセージが出て、ここまでOKと確認した。 次は「Raspberry Pi上でローカルホストにsshできるかどうか」である。 これも、「ssh pi@127.0.0.1」に対して最初のログインのための確認が出て、ログインが出来た。 ここまで問題ナシである。

まだホストPCからのコピペが出来ないので(そのためのSSHである(^_^;))、ふーみんメイルを慎重に手打ちする。 「ローカルホストに接続できるようなら、iptablesが設定されていないか」というところである。 以下の部分は、ふーみんの書いてくれた、そのまま同じであった。

pi@raspberrypi ~ $ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
そして、「Mac側で、セキュリティソフトやファイアウォールで、sshのアクセスを許可するホストが個別に設定されてたりしないでしょうか」であるが、研究室内のパソコンとRaspberry Piとは同じハブに刺さっていて、ファイアウォールは通過していない。 さらに、僕はポリシーとして、これまでの人生で、一度もセキュリティソフトを使っていないのである(^_^;)。 従って、ホスト側でssh先を禁止する術は無いのであった。 これでふーみんメイルの内容確認は終わりとなった。 ちょうど昼前に、いつもの薬をもらいに医者に行く予定があったので、ここで中断である。

そしてお昼に医者から帰ると、ふーみんからのメイルが届いていた。 「ちょっとググった感じ、Macだとホスト認証の鍵を自動で設定しないような雰囲気もあります。 Mac側で、"ssh-keygen -R 172.16.65.118 "としてから、RPiにssh してみてください」という事だったが、やってみると以下のように駄目だった(^_^;)。

nagasm-Mac-mini:~ nagasm$ ssh-keygen -R 172.16.65.118
/Users/nagasm/.ssh/known_hosts updated.
Original contents retained as /Users/nagasm/.ssh/known_hosts.old
nagasm-Mac-mini:~ nagasm$ ssh pi@172.16.65.118
ssh: connect to host 172.16.65.118 port 22: Connection refused
nagasm-Mac-mini:~ nagasm$
これに「駄目だった」と返信しつつ、フト思いついた事があり、以下のようにふーみんにメイルした。
ちょっと思いついたのですが、Raspberry Piを
3セットまで立ち上げるように周辺を揃えたので、
2台ないし3台のRaspberry Piを同時にハブに繋いで
立ち上げて、そいつら同士でsshしてみます。
そして後述のふーみんのメイルが届くのと入れ違いに、以下のように、2台を並べて立ち上げたRaspberry Piのそれぞれからお互いに、あっさりとssh出来たのである(^_^)。

こうなると、問題はMacの方である。MacからMacへはssh出来たが(当然か(^_^;))、少なくともRaspberry Pi同士でssh出来るのだから、Raspberry Piのsshdはちゃんと正しく動いているのである。 そしてふーみんから入れ違いに届いたメイルも、以下のようにまさにそこを指摘していた。

どうもMac側のsshにクセがあるような感じがします。

これから授業なので夕方まで反応できませんが、
とりあえずprivate network内限定であれば、
sudo apt-get install inetutils-inetd telnetd
としてtelnetdを入れ、
sudo nano /etc/hosts.allow
に、
in.telnetd: 172.16.65
を追加(172.16.65.0/24、と同じ意味です)してから
sudo /etc/init.d/inetutils-inetd restart
で、telnetで接続してしまったほうが楽かもしれません。
うーーむ、遂に、懐かしのtelnetかぁ(^_^)。 まさに、ローカルでの実験なのでtelnetで十分なのだ。 ちょうど、SSHが出来たらアプリケーションの追加という「apt-get」に挑戦しようと思っていたので、これは渡りに船である。 チラチラと名人戦もチェックしつつも、午後のお勉強としては最良のネタである。(^_^)

そこで2台でかさばっていたRaspberry Piを再び片付けて1台にして、x-windowから「sudo apt-get install inetutils-inetd telnetd」としてみると、なんと以下のように、ネット上をRaspberry Piのサイトに取りに行くということで、タイムアウトで失敗した(^_^;)。 そう、研究室からSUACの外に出て行くには、プロキシサーバを経由するので、ブラウザ「midori」で設定しているように、プロキシサーバの設定とパスワードが要るのであるが、この「apt-get」にはそんな立派な機能は無いのだ。 別プロセスのブラウザでプロキシサーバ経由で学外にアクセスする状態にしてから、改めてトライしても、結果は変わらなかった。

pi@raspberrypi ~ $ sudo apt-get install inetutils-inetd telnetd
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下のパッケージが新たにインストールされます:
  inetutils-inetd telnetd
アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 0 個。
184 kB のアーカイブを取得する必要があります。
この操作後に追加で 338 kB のディスク容量が消費されます。
エラー http://mirrordirector.raspbian.org/raspbian/ wheezy/main inetutils-inetd armhf 2:1.9-1
  'mirrordirector.raspbian.org' が一時的に解決できません
エラー http://mirrordirector.raspbian.org/raspbian/ wheezy/main telnetd armhf 0.17-36
  mirrordirector.raspbian.org:80 (89.16.177.202) へ接続できませんでした。 - connect (110: 接続がタイムアウトしました)
http://mirrordirector.raspbian.org/raspbian/pool/main/i/inetutils/inetutils-inetd_1.9-1_armhf.deb の取得に失敗しました
  'mirrordirector.raspbian.org' が一時的に解決できません
http://mirrordirector.raspbian.org/raspbian/pool/main/n/netkit-telnet/telnetd_0.17-36_armhf.deb の取得に失敗しました
  mirrordirector.raspbian.org:80 (89.16.177.202) へ接続できませんでした。 - connect (110: 接続がタイムアウトしました)
E: いくつかのアーカイブを取得できません。apt-get update を実行するか --fix-missing オプションを付けて試してみてください
上のRaspberry Piのx-window内のターミナルに表示されたメッセージは、もう一つターミナルを開けて、そこからテキストエディタ「nano」を開いて、そこにコピペしてファイルに書き出し、これをsudoで「/boot」にコピーして、Raspberry Piをシャットダウンして、SDメモリカードをMacに入れて読み出したものである。 なかなかに原始的であるが、これによって、指定されている「telnetd_0.17-36_armhf.deb」をMacでインターネットからゲットして、再びSDカードに戻してRaspberry Piに入れられないか・・・という作戦である(^_^;)。

すると、Macのブラウザが見た目はフリーズしてしまった。 ステータスバーを見た感じでは、「ftp.jaist.ac.jp」つまり日本のミラーサイトをアクセスしようとしているのだが、いつまでたっても繋がらないのである。 ここで思い出したのが、SUACのファイアウォール(プロキシサーバ)は、「:80」というような指定のURLを通さなかったのでは・・・という遠い記憶である。

そこで今度は、出張用のMacBookAirとPHSを用意して、研究室からPHSのダイヤルアップでネットに直接接続して、まず「telnetd_0.17-36_armhf.deb」をダウンロードした。 ところが「inetutils-inetd_1.9-1_armhf.deb」のURLを入れると「Not Found」となる(^_^;)。 そこで上位ディレクトリに移動すると、バージョンが上がって「inetutils-telnetd_1.9-2_armhf.deb」があったのでゲットした。 ついでに、隣りに並んでいた「inetutils-ftpd_1.9-2_armhf.deb」と「inetutils-ftp_1.9-2_armhf.deb」と「inetutils-telnet_1.9-2_armhf.deb」もゲットして、全てSDカードの「/boot」領域にコピーして、再びRaspberry Piに入れて立ち上げた (以下のように画面のラズベリーの色がピンクでなく青になってドキッとしたが、次にリブートしたら、何故か直った)。

これを「/boot」から、とりあえずカレントの「/home/pi」にコピーして、再び試みたが、結果は同じだった。 CQ本には「sudo apt-get install telnetd」というのも書いてあったので試したが、今度は以下のようなメッセージが出て駄目だった(これもsudoで/boot以下に書いたファイルをMacに移動している)。 なんとか、ネットから別途にゲットしたこれらを直接指定してインストール出来ないのかなぁ・・・というあたりで、まさに行き詰まった。

pi@raspberrypi ~ $ ls
Desktop                            log1.txt
indiecity                          log2.txt
inetutils-ftp_1.9-2_armhf.deb      ocr_pi.png
inetutils-ftpd_1.9-2_armhf.deb     python_games
inetutils-telnet_1.9-2_armhf.deb   telnetd_0.17-36_armhf.deb
inetutils-telnetd_1.9-2_armhf.deb
pi@raspberrypi ~ $ sudo apt-get install inetutils-telnetd
E: ロック /var/lib/dpkg/lock が取得できませんでした - open (11: リソースが一時的に利用できません)
E: 管理用ディレクトリ (/var/lib/dpkg/) をロックできません。これを使う別のプロセスが動いていませんか?
pi@raspberrypi ~ $ sudo apt-get install telnetd
E: ロック /var/lib/dpkg/lock が取得できませんでした - open (11: リソースが一時的に利用できません)
E: 管理用ディレクトリ (/var/lib/dpkg/) をロックできません。これを使う別のプロセスが動いていませんか?
pi@raspberrypi ~ $ 
ここで5限の時間帯になった。 ぼちぼちアカペラの準備とかもあり、名人戦もまったく見ていなかった(^_^;)。 とりあえず今日はここまでとして、また明日にトライしてみよう。

2013年5月23日(木)

さて木曜日である。 昨夜のアカペラでも多数の見学者が来て、遂にこの新学期の新メンバーは4人となり、あと少しさらに増えそうである(^_^)。 そのアカペラの最中に以下のふーみんメイルが届いていたが、試すのは心機一転のこの朝からである。 まさに、ターミナルからプロキシを明示的に指定するこのコマンドが欲しかったのである(^_^)。
読みました。
export http_proxy="http://suac.proxy.server:port""
認証が必要なら
export http_proxy="http://user:passwd@suac.proxy.server:port/"
としてからapt-getをやってみてください。
/etc/apt/apt.confに書くこともできるんですが、plain textのファイルに
パスワードを生書きするのもアレなので・・・
# exportの方も.bash_profileなんかに書くことが可能ですが
#同様の理由でなんかヤな感じです^^;
・・・しかし、ここから午前中もふーみんと何度かメイル交換する中で、作業はとても難航した(^_^;)。 要するにSUACのネットワークは学内のセキュリティを重視する、という極度に窮屈なポリシーのため、Raspberry Piがサーバからパッケージを入手するプロトコルが、あれこれ試したものの成功しないのである。 そのやりとりは このような ものである。 こうなると、学部長特別研究「スケッチング」でRaspberry Piを調べることはまさに研究テーマそのものであり、SUACの研究室で通常のSUACネットを使ったのではこれが疎外される、という事実を理由に、共同研究や学会プレゼンの可能性も加味して、LANドック付のモバイルWiFiルータを研究費で登録購入、というのが回り道のようで、実は王道だと思えてきた。

午後イチでSUAC情報室と財務室の担当者にメイルで相談・依頼して、「SUACネットでは出来ないこと」を確認するとともに、必要な時だけ「1日プラン(600円)」で使う、というモバイルWiFiルータ(ドックにDHCPのLANあり)という、ふーみんの推奨機器の購入の申請を相談した。 そして4限の学生委員会が終わったところで、情報室のメイルと財務室の書類も届いて、一気に申請書類を書き上げて送ってしまった。 これで、とりあえず自費で立て替え払いでモバイルWiFiルータを購入して、Raspberry Piを直結でインターネットに繋いで・・・という実験が、早ければ来週には開始できそうである(^_^)。 明日はゼミで院生と3回生2人のプロジェクトを応援して、週末の土日はいよいよ、 この発表 を音楽知覚認知学会で発表するために、岡山大に出張である。 阪大での発表は新大阪までの新幹線の中で作ったが、今回の発表は既にWebで完成公開しているので、直前チェックはまたまた新幹線の中でOKかな。

・・・と帰り支度をしていた時、ふと、YAHOOで「Raspberry Pi ssh mac」と検索したところ、いちばん最初に出て来たリンクが このリンク であり、 このムービー であった。 そして上のように、なんと、MacでSSHが出来てしまった(^_^)。 リモートでシャットダウンまで出来たのだから完璧である。 整理すると、以下の手順である。

ということで、なんと急転直下、sshが出来てしまった。 これでRaspberry Piでのプログラミングに進めることになった。 なんせ、Raspberry Piに繋いでいるビデオモニタでは文字がよく見えず、また二つ折りキーボードもチャチで困っていて、その環境では進めなかったのである。 当面これでtelnetは不要になったが、apt-getは走らないと困るので、モバイルWiFiの購入はそのまま進めることにしよう。

2013年5月24日(金)

もう金曜日である。先週の金曜日は阪大に向かっていたのでゼミが1週お休みになったので、今日は学生の進捗報告が楽しみである。 明日から週末は岡山大に向かうので、今日も作業としては「区切り」を狙っていこう。 何故か朝一番に、Wikipediaで綾瀬はるかの血液型がB型である、と確認して一日がスタートした(^_^;)。

昨日の帰り間際に突如、解決したSSHであるが、ふーみんに「ssh-keygen -R 172.16.65.###」というのを教わって試した時に駄目だったのは、続いて「ssh pi@172.16.65.###」と普通のsshと同じようにやっていたからである。 解説ムービーにあるように、昨日は最初に「ssh -X pi@172.16.65.###」とやったところ、開通したのである。 あらためて再度、今度は「-X」を付けないで「ssh pi@172.16.65.###」とやると、以下のようにOKであった。 「-X」は最初だけのおまじないのようである。

さて、朝イチで昨日からのニュースなどを読んでいると、立て続けにトリガがかかってきた。 まずメイルで届いたのは、KickStarterからの「Project Update #2: Maker Faire!」という知らせである。 Sketchingで知り合った友人たちのプロジェクトについては、既に2つ、 Blink(1)BrightEyes を、KickStarterで賛同出資して購入してきた(「日記」といいながらまったく続きがストップしているのはご愛嬌である(^_^;))。 この第3弾として、先日Sketchingコミュニティから届いたメイルに賛同出資したのが、 Clyde である。 あと19日で、目標としている45,000ドルに到達するかどうか、現在30,000ドルなのでちょっと微妙である(^_^;)。 今回届いたメイルはその続報で、アメリカで開催されたMaker Fairに出展した、という情報である。 なんとか、プロジェクトが実現して欲しい。

そして事務局財務室のMさんから電話があり、昨日の午後に提出していた「モバイルWiFiルータの購入のための申請書」が受理されたので買ってもOK、という事だった。 さすが、素晴らしいスピードに感謝である(^_^)。 そこで速攻で このページ に行って、ゼミ学生が集まるまでの10分間で、カード決裁の購入申込みを完了させてしまった。 1分後に届いたメイルは以下である。 いつ届いて、どのように使うのかまったく不明であるが、楽しみである。

このたびは、UQ WiMAXにお申し込みいただき誠にありがとうございます。
新規お申し込みの手続きが完了いたしましたので、ご連絡いたします。
お申し込みいただきました内容は以下のとおりです。

【お申込内容】              新規ご契約
【受付番号】                K027170###
【契約者ID】                C100278###
【料金契約番号】            U100640###
【料金プラン】              UQ 1 Day
【WiMAX搭載機器名】         AtermWM3800R白 × 1台
【WiMAX搭載機器名】         AtermWM3800R専用 クレードル × 1台

お申込内容の詳細は、弊社ホームページの「My UQ」よりご確認ください。
<パソコンからは>
http://www.uqwimax.jp/service/support/myuq.html
ご利用の際には、お客様が設定されたMy UQ IDとパスワードが必要です。
※My UQを初めてご利用になるお客様のMy UQ IDとパスワードは、以下の番号
 となります。
   My UQ ID :上記の受付番号(半角英数字10桁)
   パスワード:お申し込み手続き時に入力された「暗証番号」 (半角数字4桁)

■UQ 1 Day(1日利用プラン)のご利用について
UQ 1 Dayをご契約のお客様は「ご利用時間」をご購入いただく必要がござい
ます。詳しくは下記URLをご参照ください。
http://www.uqwimax.jp/service/price/price2.html 

UQ 1 Dayは、ご契約いただいた時点で「ご利用時間かんたん購入」が
有効になっています。最後にご利用された日の翌日から90日間は
My UQ ID/パスワードの入力をしなくてもWiMAX接続後ブラウザー
を起動するだけでご登録いただいたクレジットカードを
用いたご利用時間のご購入、および月額契約への変更が可能です。
ご利用にあたっては以下の点をご確認ください。

・意図せずWiMAX搭載機器を第三者に利用されてしまった場合、
 これらの手続きに伴う料金が発生する可能性があります。
 WiMAX搭載機器を盗難・紛失された際は、UQお客様サポートセンターに
 早急にご連絡いただけますようお願いします。

※「ご利用時間かんたん購入」を利用しない場合、My UQから
 無効にすることができます。無効にした場合は、ご利用時間のご購入、
 および月額契約への変更にあたって、手続きごとにMy UQ ID/パスワード
 によるログインが必要となります。

こちらは自動配信メールのため、当メールアドレスへの返信はできません。

今後ともUQ WiMAXをご愛顧いただきますよう、よろしくお願いいたします。
そしてふーみんからも以下のメイルが届いた。 確かに、昨日、うまくいったと確認してMacをシャットダウンする時に、起動したつもりの無かった「X11」というのがターミナルと別に立ち上がっていて、ヘンだと思ったのだった。
うーん・・・
> 最初だけ「-X」が必要のようです。
この「-X」は X11の転送を許可する、というオプションなんですよね。
なんでこんなもんが関係するのか、すごくpuzzlingです^^;
そこで、ゼミで学生に見せるために研究室中央のデスクに移動させていたRaspberry Piを再び元の場所に戻して、起動したところDHCPサーバから取得したIPアドレスが「172.16.65.154」と新しくなったのを確認して、再び、Macのターミナルから以下のようにやってみると、なんとssh出来てしまった。

これまた謎である。 このIPはたぶん初めての登録なのに、今度は「-X」を付けずに、つまり以前に駄目だった方法でも出来てしまったのである。 違いがあるとすれば、今回はRaspberry Piがssh元のコンピュータを既に認識している、という可能性ぐらいである。 まぁ、とりあえず出来てしまったので、これ以上の深入りはナシにしよう。

モバイルWiFiルータが来るまで棚上げするのは「apt-get」などの部分である。 「VNC」も別途にインストールする必要があるので、「apt-get」の後となる。 昨日、本命のテーマに関するあたりで こんなリスト も作っているのだが、焦らずに進めていこう(^_^;)。

そこで次のターゲットとしては、ふーみん本の「apt-get」や「VNC」を飛ばして、その次の「サウンド」である。 Macのターミナルからsshでログインしての作業なので、Raspberry Piの作業のログを、以前のようにいちいちSDカードの「/boot」領域に書き込んではシャットダウンしてMacにSDカードを差し込んで読み出す・・・という煩雑な作業が不要となり、ターミナルからのコピペで済むのはとても快適である(^_^)。 まずはサウンドドライバモジュールの確認である。 以下のように「sudo lsmod」とすると、「snd_bcm2835」というのが見つかった。

pi@raspberrypi ~ $ 
pi@raspberrypi ~ $ sudo lsmod
Module                  Size  Used by
snd_bcm2835            15846  0 
snd_pcm                77560  1 snd_bcm2835
snd_seq                53329  0 
snd_timer              19998  2 snd_pcm,snd_seq
snd_seq_device          6438  1 snd_seq
snd                    58447  5 snd_bcm2835,snd_timer,snd_pcm,snd_seq,snd_seq_device
snd_page_alloc          5145  1 snd_pcm
leds_gpio               2235  0 
led_class               3562  1 leds_gpio
joydev                  9316  0 
evdev                   9426  6 
pi@raspberrypi ~ $
サウンドの再生パッケージは既にインストールされている筈だ、ということで、以下のように「sudo apt-get install alsa-utils」と入れると、無事に確認できた。 もし入っていなければ、「apt-get」がまたインターネットに捜しに旅立つところであった。(^_^;)
pi@raspberrypi ~ $ sudo apt-get install alsa-utils
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
alsa-utils はすでに最新バージョンです。
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 0 個。
pi@raspberrypi ~ $
これでいよいよ、サウンド再生のテストである。 Max6で3分ほどかけて作った以下のレコーディングツールを使って、 以下のコマンドで、無事に女性の声で「Front, Center」という声が聞こえてきた(^_^)。 こんな音である

pi@raspberrypi ~ $ sudo aplay /usr/share/sounds/alsa/Front_Center.wav
再生中 WAVE '/usr/share/sounds/alsa/Front_Center.wav' : Signed 16 bit Little Endian, レート 48000 Hz, モノラル
pi@raspberrypi ~ $
そして次は、「hello_audio」というテスト用のパッケージである。 おまじないの連続であるが(^_^;)、まずは「cd /opt/vc/src/hello_pi/libs/ilclient」へ行け、という。 ここには以下のものがあり、Makefileの内容は以下である。
pi@raspberrypi ~ $ cd /opt/vc/src/hello_pi/libs/ilclient
pi@raspberrypi /opt/vc/src/hello_pi/libs/ilclient $ ls
Makefile  ilclient.c  ilclient.h  ilcore.c

pi@raspberrypi /opt/vc/src/hello_pi/libs/ilclient $ cat Makefile
OBJS=ilclient.o ilcore.o
LIB=libilclient.a
include ../../Makefile.include

pi@raspberrypi /opt/vc/src/hello_pi/libs/ilclient $
ここで、各プログラムの中身は、 ilclient.hilclient.cilcore.c である。 ここで「make」とすると、 こんな表示 が出た。 続いて、「cd ../../hello_audio」へ行け、という。 ここには以下のものがあり、Makefileの内容は以下である。
pi@raspberrypi /opt/vc/src/hello_pi/libs/ilclient $ cd ../../hello_audio
pi@raspberrypi /opt/vc/src/hello_pi/hello_audio $ ls
Makefile  audio.c  audioplay.h  hello_audio.bin  sinewave.c

pi@raspberrypi /opt/vc/src/hello_pi/hello_audio $ cat Makefile
OBJS=audio.o sinewave.o
BIN=hello_audio.bin
LDFLAGS+=-lilclient
include ../Makefile.include

pi@raspberrypi /opt/vc/src/hello_pi/hello_audio $
ここで、各プログラムの中身は、 audioplay.haudio.csinewave.c である。 ここで「make」とすると、 こんな表示 が出た。 ここでふーみん本には「./hello_audio 0」でサウンドが鳴る、とあったが以下のようにエラーで怒られた(^_^;)。 正解は「./hello_audio.bin 0」であり、 こんな音がした
pi@raspberrypi /opt/vc/src/hello_pi/hello_audio $ ./hello_audio 0
-bash: ./hello_audio: そのようなファイルやディレクトリはありません
pi@raspberrypi /opt/vc/src/hello_pi/hello_audio $ ls
Makefile  audio.c  audioplay.h  hello_audio.bin  sinewave.c
pi@raspberrypi /opt/vc/src/hello_pi/hello_audio $ ./hello_audio.bin 0
Outputting audio to analogue
pi@raspberrypi /opt/vc/src/hello_pi/hello_audio $ 
ふーみん本のバグ発見でちょっとだけでも貢献できたとしたら・・・嬉しい(^_^)。 この音 の作り方としては、 audio.c の中の、以下の部分ということになる。 C言語だと安心して読めるなぁ。

引き続きのトピックとして「タイムゾーン」「パスワード」「ユーザ登録」「無線LAN」「外部ストレージ」「runレベル」「メモリ配分」と続くが、とりあえず今回はパスして、必要になったら戻ってくることにした。 次の「ネットワーク設定」は、DHCPでなく固定IPを設定して、MacなどとOSCで連携する場合には必要になりそうなので、ここで色を付けておいた(^_^;)。 さらに「時計合わせ」「DNS」「hostname」「システム情報」と続いたが、これもとりあえず今回はパスして、必要になったら戻ってくることにした。

そしていよいよ、ふーみん本のトピックが「外部入出力」になった。 ここから残りの部分がメインである。 これは昨日メモした このリスト とも関係してくる世界である(^_^)。 ただし、実際にRaspberry PiのGPIOコネクタから外部に信号線を引き出して・・・という作業をするには、明日から2日間の出張を前にして、あと1時間ほどとなった今日は適さない(^_^;)。 そこで、「rcp」コマンドを調べて実験した。 以下のような手順で、ホストのMac内にターミナルウインドウを2つ開けて、片方はRaspberry Piにsshでログインしておき、もう片方はホストのMacを管理すると、それぞれのコンピュータ内のデータをネットワーク経由で自在にコピー出来るのである。

当然ながら、ホスト側からでもリモート側からでも、送信も受信も出来る。 これは今後、重宝することだろう。

2013年5月27日(月)

土日には 岡山大学 に行ったので、自宅に届いたモバイルWiFiルータを研究室に持って来たのは今日であった。 しかし2限に「音楽情報科学」があったので、実際に開梱したのは午後、そしてなんと以下のように、充電が完了するまでは使えない、というオレンジランプが3時間半も点灯しているので、5限にアポ(アカペラ新加入の新入生3人の特訓希望)がある今日は「おあずけ」である。 さらに明日も1限と4-5限があるので、別ネタで誤摩化して、何もない水曜日になるかもしれない。 なんせ「1-day」契約なので、2-3時間使っても、24時間使っても、600円ずつかかるのである。(^_^;)

2013年5月28日(火)

今日は1限に「サウンドデザイン」、4-5限に「企画立案演習」がある日なので、Raspberry Piはあまり進められない。 昨日は上記を書いた後、30分ほどするとモバイルWiFiルータの充電が完了したので、以下のようにLANと2種類のWiFi暗号化モードで、確かに接続できることだけ確認した。

ただし、この画面が出たところでストップしていて、つまり契約は出来ているが「1 day」課金をスタートしていないので、実際にネットには出て行っていない。 実験で「1-day」使用を3-4日も続ければ2000円とかになるので、いっそのこと「従量コース」か「1ヶ月定額コース」に移行してしまってもいいのだが、コース移行すると、さらに移行するには解約手数料とかがかかりそうで、なんとも悩ましい。(^_^;)

2013年5月29日(水)

さて、昨日は「東海地方は平年より11日早く、梅雨入りした模様」と報道されたが、いよいよ水曜日である。 CGクリエイター検定試験の受験登録手続きの締切日ということで多少の学生来訪はあるものの、放課後のアカペラ以外に講義がない、前期の「お勉強の日」である。 さっそく以下のようにセットアップして、モバイルWiFiルータの電源を入れ、立ち上がって接続開始するまでに数分かかると確認した。

Raspberry PiにはクレードルからLANケーブルで繋ぎ、PowerBookG4はWiFiで繋いでプロキシ設定を解除して「素通し」にしてみた。 まずはPowerBookG4でネットに出てみようとすると、以下のように1日利用の購入画面が出た。 これは海外出張で、乗り継ぎの空港などでそれぞれの場所のWiFiサービスに、クレジットカードで「1日利用」として数ドルを支払うのとまったく同じである。

上の画面が出てスグに以下のメイルが届いた。 これで24時間、フリーWiFiの開通である(^_^)。

2013/05/29

長嶋 洋一 様

日頃よりUQ WiMAXをご利用いただき誠にありがとうございます。
ご利用時間ご購入の手続きが完了いたしましたので、ご連絡いたします。
ご購入いただきました内容は以下のとおりです。

【お申込内容】   ご利用時間ご購入
【受付番号】    K027262###
【契約者ID】    C100278###
【料金契約番号】  U100640###
【ご利用時間】   600円(税込)/24時間

詳細は、弊社ホームページの「My UQ」よりご確認ください。
ご利用の際には、お客様が設定されたMy UQ IDとパスワードが必要です。

こちらは自動配信メールのため、当メールアドレスへの返信はできません。
お問い合わせの際は、下記フリーコールもしくは、下記URLのお問い合わせ
フォームよりお願いいたします。

今後ともUQ WiMAXをご愛顧いただきますよう、よろしくお願いいたします。
===========================
UQお客様サポートセンター
フリーコール 0120-929-###
(携帯・PHSからもご利用いただけます。)
受付時間 9:00 - 21:00 (年中無休)
※盗難・紛失については24時間受け付けいたします。
===========================
以下のように、Raspberry PiのIPアドレスを見ると「192.168.0.3」となっていて、PowerBookG4では「192.168.0.2」となっていた。 そこで、PowerBookG4からこの状態でRaspberry Piにsshできるかどうか試したが、結果は以下のように駄目だった(^_^;)。 WiFiルータからLANやWiFiでローカルに接続している機器にはDHCPでIPを割り当てているので、これは出来るような気がするのだが、謎である。

まずはふーみん本に従って、「sudo apt-get update」とやると、今度はプロキシで邪魔されず、快調にインターネットの世界に出て行き、多数の必要な情報をゲットしてきた。 そこでいよいよ次に、宿題だった「telnetd」のapt-getを試みることにした。 以下のように、今度は快調にインターネットの世界に必要なデータを取りに行ったが、しかし結果としては駄目であった(^_^;)。 telnetdはとりあえずsshが開通したので無くてもいいのだが、どうしても次に実験したい「VNC」の「apt-get install」もまた、やってみると駄目だった。 そこで、色々と試した このログ とともに、ふーみん師匠に問い合わせのメイルを出すことにした。

その後、ふーみん本にあった「xscreensaver」の「apt-get install」も試みたが、これも上記と同様に駄目だった。 さきに失敗したtelnetdのインストール失敗の結果がいつも表示されていて、どこまでがエラーなのかが判らない(^_^;)。 オープンソース文化の中心であるが、なかなかLinuxというのは厳しいのだった。 さらに、インプレス本ではもう1種類のVNCとして「x11vnc」というVNCサーバが紹介されていたが、これについても「apt-get install x11vnc」はほぼ同様にエラーだ、というメッセージが出て不成功だった。

その後、昼休みをまたいで、以下のようにRaspberry Piのブラウザ内で「Raspberry Pi日記」を眺めたりしていると(^_^;)、ふーみんからのメイルが届いた。

もうすぐ移動しちゃうのでshort replyですが・・・

> 「従量コース」のパケット量のイメージが
> 不明なので、乗り換えを躊躇しています。

従量制は、パケットのサイズがちょっと不明ですがjumbo frameなワケはないので
1.5kBとしても13MBくらい転送したらもう天井に当たります(実際はショートパケットが
かなりあるので数MBでサチっても全然不思議ではないくらい)。

つまり、まったく使わない月は基本料金380円だけですが、ちょっとでも繋いだら
まず天井に当たると思った方がいいです。

4,980円/600円=8.3なので、月に9日以上、1 dayを使うのであれば従量制も
選択肢に入るかとは思います。
実際には1 dayのinitial costとして登録料もあった気がしますし、その辺は
利用見込みによってちゃんと検討してみないとなんとも・・・

> apt-getでエラーが出ます。

流し読みなので見落としてるかもしれませんが、パッケージ認証用の
keyringの更新してましたっけ?

apt-get install debian-keyring
apt-get update

で更新できます。パッケージの正当性検証で引っかかってるような
メッセージが見えたので、念のため。
そうだ、僕は前期の水曜日はガラ空きだが、ふーみんは午後は非常勤で他の大学に行くのだった。 料金制については上記でほぼ想定通りで、たぶんちょっと使っただけで飽和するのだろう。 当面は「1 day」でいいのかな。

そして「keyringの更新」という上記の情報を受けて、改めてRaspberry Piでのトライを再開した。 その様子もまた このログ にまとめたが、前半は不調であった。 「sudo apt-get install debian-keyring」に対して、これまでと同様の以下のエラーが出た。

[ ok ] Stopping internet superserver: inetd.
[....] Starting internet superserver: inetdSegmentation fault
invoke-rc.d: initscript openbsd-inetd, action "start" failed.
dpkg: openbsd-inetd の処理中にエラーが発生しました (--configure):
 サブプロセス インストール済みの post-installation スクリプト はエラー終了ステータス 139 を返しました
dpkg: 依存関係の問題により telnetd の設定ができません:
 telnetd は以下に依存 (depends) します: openbsd-inetd | inet-superserver ...しかし:
  パッケージ openbsd-inetd はまだ設定されていません。
  パッケージ inet-superserver はまだインストールされていません。
  パッケージ openbsd-inetd は inet-superserver を提供していますが、まだ設定されていません。
  パッケージ inetutils-inetd は inet-superserver を提供しますが、まだインストールされていません。

dpkg: telnetd の処理中にエラーが発生しました (--configure):
 依存関係の問題 - 設定を見送ります
debian-keyring (2013.04.21) を設定しています ...
処理中にエラーが発生しました:
 openbsd-inetd
 telnetd
E: Sub-process /usr/bin/dpkg returned an error code (1)
pi@raspberrypi ~ $
そして「sudo apt-get update」に対しても、最後にこれまでと同様の以下のエラーが出た。
W: GPG エラー: http://ftp2.jp.debian.org wheezy Release: 公開鍵を利用できないため、
	以下の署名は検証できませんでした: NO_PUBKEY AED4B06F473041FA
W: GPG エラー: http://ftp.jp.debian.org wheezy Release: 公開鍵を利用できないため、
	以下の署名は検証できませんでした: NO_PUBKEY AED4B06F473041FA
pi@raspberrypi ~ $
そのため、これを経て、再度「sudo apt-get install inetutils-inetd telnetd」をやっても、「sudo apt-get install telnetd」をやっても、メッセージとして「telnetd はすでに最新バージョンです。」と出るものの、最後のエラーは「依存関係の問題により telnetd の設定ができません」となって成功しない。 同様にVNCについても「sudo apt-get install tightvncserver」に対して、「tightvncserver はすでに最新バージョンです。」と出て、同じ解決していないエラーを表示する。 これは午前中と見たところは同じである。

なんとか突破したいと眺めているうち、このエラーメッセージの中の、以下の部分に注目した。

dpkg: 依存関係の問題により telnetd の設定ができません:
 telnetd は以下に依存 (depends) します: openbsd-inetd | inet-superserver ...しかし:
  パッケージ openbsd-inetd はまだインストールされていません。
  パッケージ inet-superserver はまだインストールされていません。
  パッケージ openbsd-inetd は inet-superserver を提供しますが、まだインストールされていません。
  パッケージ inetutils-inetd は inet-superserver を提供していますが、まだ設定されていません。
そして駄目モトで「sudo apt-get install openbsd-inetd」とか「sudo apt-get install inet-superserver」をやってみるとまだ同様だったが、「sudo apt-get install xinetd」をやってみると、なんと出続けていたエラーメッセージが消えて、それまで見たこともない以下が表示された(^_^)。
[ ok ] Starting internet superserver: xinetd.
telnetd (0.17-36) を設定しています ...
ユーザ telnetd をグループ utmp に追加
Note: xinetd currently is not fully supported by update-inetd.
      Please consult /usr/share/doc/xinetd/README.Debian and itox(8).
pi@raspberrypi ~ $
こうなると、これまでにインストールしたつもりのパッケージは、以下のようにどれも「すでに最新バージョンです」となった。 これはつまり、出来てしまったのではないか(^o^)。
pi@raspberrypi ~ $ sudo apt-get install xscreensaver
・・・
xscreensaver はすでに最新バージョンです。
pi@raspberrypi ~ $ sudo apt-get install tightvncserver
・・・
tightvncserver はすでに最新バージョンです。
pi@raspberrypi ~ $ sudo apt-get install x11vnc
・・・
x11vnc はすでに最新バージョンです。
pi@raspberrypi ~ $
そして、ふーみん本の記事に従って「apt-cache search inetd」とか「apt-cache search vnc」とかやると、膨大な関係するライブラリの一覧が出て来たが、これは このログ を参照されたい。 そこで再び最後に「apt-get install debian-keyring」をしてみると、エラーもなく「debian-keyring はすでに最新バージョンです。」となり、最後に再び「sudo apt-get update」をすると、「公開鍵を利用できないため、以下の署名は検証できませんでした」という2行だけが出た。 検証できない、というのは無視し得るので(^_^;)、これで作業はOKっぽいので、モバイルWiFiルータからのLANを研究室LANに差し替えて、Raspberry Piをリブートした。

さて、いよいよ、ふーみんがかつて「VNC本」を出した、そのVNCをRaspberry Piで走らせる挑戦である。 まずはRaspberry Piのモニタは見えにくいのとキーボードがチャチくて正しく打てない(さらに「_」など発見できないキーがある(^_^;))ために、ホストのMacからsshして、以下のようにコマンド入力も結果の表示もMac側で行う体制である。

VNCサーバは起動したユーザの権限でリモートデスクトップを表示するために、rootでなく一般ユーザで起動するという。 初回だけは、起動時にVNCのためのパスワードを設定するよう求められるという。 ところが「tightvncserver」と入れると、「Illegal instruction」と表示された。 tightvncserverの場所を「sudo find / -name tightvncserver」で見つけて、「/usr/bin/tightvncserver」とやっても「Illegal instruction」と暖かく無視される(^_^;)。 「man tightvncserver」にあった、VNCパスワード設定コマンド「vncpasswd」とすると、今度は「Segmentation fault」と出た。 これは確か、よくない知らせである。(^_^;)

仕方ないのでroot権限で「sudo tightvncserver」してみると、初回なのに何も聞かれず、何もメッセージが出ないでカーソル行に戻ってきた。しかし「ps -e」してみても、実行プロセスの一覧にtightvncserverは見あたらない。 幽霊である。(^_^;)

そこで今度は、以前にふーみんがメイルしてくれた、以下を再びトライしてみた。 今度は「apt-get」で「telnetd」がインストールされたとすれば、これが出来る筈なのである。

とりあえずprivate network内限定であれば、
sudo apt-get install inetutils-inetd telnetd
としてtelnetdを入れ、
sudo nano /etc/hosts.allow
に、
in.telnetd: 172.16.65
を追加(172.16.65.0/24、と同じ意味です)してから
sudo /etc/init.d/inetutils-inetd restart
で、telnetで接続してしまったほうが楽かもしれません。
ところがこれまた、いろいろ試したが、以下のようにうまく行かなかった(;_;)。 何かが欠けているのだが、なんとも、今日からシトシト降り始めた梅雨のように、晴れないのであった。
Last login: Wed May 29 13:40:03 on ttys001
nagasm-Mac-mini:~ nagasm$ telnet pi@172.16.65.170
pi@172.16.65.170: nodename nor servname provided, or not known
nagasm-Mac-mini:~ nagasm$ telnet 172.16.65.170
Trying 172.16.65.170...
telnet: connect to address 172.16.65.170: Connection refused
telnet: Unable to connect to remote host
nagasm-Mac-mini:~ nagasm$ telnet pi@172.16.65.170
pi@172.16.65.170: nodename nor servname provided, or not known
nagasm-Mac-mini:~ nagasm$ telnet raspberrypi@172.16.65.170
raspberrypi@172.16.65.170: nodename nor servname provided, or not known
nagasm-Mac-mini:~ nagasm$ 
とりあえず、「apt-get」は出来た模様なので、ここでモバイルWiFiルータの電源を落として、ここまでの状況をふーみんにメイルした。 今日の放課後はアカペラ(新入生5人を含め、新学期の新規メンバーが6人(^_^))なので、続きは明日となる。 わずかに時間が余っていたので、Windows版のVNCサーバをゲットして走らせて、それに対してMac版(Java版?)のVNCクライアントとやりとり出来るか、を試してみることにした。 ところが「http://www.realvnc.com/」というサイトに行ってみると、Mac版もWindows版もあったので、とりあえず両方ともダウンロードしてみた。

とりあえず、最小限のことが出来ればいいので上のようにフリー利用としてゲットして、サーバにユーザ登録したところ、なんとアッサリと、以下のように、Mac側でもWindows側でも、それぞれVNCサーバとVNCクライアントを動かして、「相互にお互いのデスクトップをウインドウ内に表示し合う」(^_^;)という、まさに「合わせ鏡」が簡単に実現できてしまった(^_^)。 10年以上前から知ってはいたものの、最近のパソコンの高性能化もあって、ここまでサクサクと「合わせ鏡」が動くと、気持ち悪いのか気持ちいいのか、微妙な感覚である。(^_^;)

VNCサーバの停止は、サーバを起動した時に出て来るウインドウ内の「More...」の最下段にQuitがあり、Macではパスワードを求めてきたがWindowsでは単に「いいの?」だけだった。 そしてMac側のVNCサーバを停止すると、WindowsのVNCクライアントも自動終了した。 まぁ、相手が消失したのでこれは当然だろう。 ところがWindows側のVNCサーバを停止したところ、MacのVNCクライアントは以下のようになったまま、どこか遠くへ行ってしまい(^_^;)、この状態が無限に続いたので、アクティビティモニタでプロセスを強制終了することになった。

最後にVNCの実験が出来たので、今日もまずまずの進展である。 あとは、Raspberry PiでVNCサーバが動けば、もうMacからssh、rcp、そしてVNCと全てリモートで繋がることが出来る。 その先に、ようやく「Raspberry Piプログラミング」「Raspberry Piスケッチング」「Raspberry Piハッキング」の楽しい楽しい世界が拓けてくるのである。(^_^)

2013年5月30日(木)

昨日のモバイルWiFiルータの「1 day」料金のうちに確認、と昨夜は自宅にMacBookAirを持ち帰って試してみたが、やはり自宅マンションは電波状況が悪く、室内では圏外となった(^_^;)。 窓際にモバイルWiFiルータを置くと電波が1本だけ立って、無事にFlash Playerのアップデートなど接続を確認できた。

そして早起きして研究室に出て来たが、ちょっとだけ期待していたふーみんメイルは届いておらず、朝9時に「1 day」期限は切れた。 今日の1限には「音楽情報科学」の課題の相談で「しゃみーず」のアポがあり、2限には郵便局に行く用事、3限は学科会議、4限は教授会、放課後にはOG野口の来訪予定と、かなり埋まっている。 ふーみんメイルのトリガでも無い限り、たぶん今日はあまり進展しない予感である。

ただし、昨夜、先月あたりにフト思いついたあるアイデアが、次第にムクムクと成長してきた。 以下の写真はその一端を予感させる筈のものである。 どういう展開になるのかならないのか、それは僕も知らない。(^_^;)

・・・ということで、1限には こんなこと をしたり、2限にはCGクリエイター検定の振り込みに郵便局に行ったりしていると、ふーみんから以下のメイルが届いた。

えー、読みましたが・・・ちょっと今日は夕方まで外に出ているので
トリガは夜以降になる予定です^^;

RPi上のvncサーバの挙動はバイナリが壊れてるのかもしれないような
変な挙動ですね。
ちなみにpsは、今はps -e ではなく、ps ax かと思います。
-e で全ユーザのプロセス表示、はSYSV系のオプションですが、
Debianに入ってるpsが-eをaの意味で解釈したかどうか、
ちょっとすぐには思い出せません(& すぐに確認できません)。

aptの鍵認証がうまく入ってないために、依存関係が正しく
resolveされてない気もするので、夜に戻ったらその辺のfix 手順を
検討してみます。
やはり、この現象はただごとでは無いのだ。 「Segmentation fault」というのは、かなり悪い知らせだったような記憶がある(^_^;)。 そして昼休みには、ラストで滑り込んだ 40虎 の参加希望者が研究室に来ることになった。 これで今年も7人、まずまずである。

2013年5月31日(金)

またまた週末である。 先週まで3週連続で、週末に学会発表出張が続いた( 東京大阪岡山 )が、今週だけスキップして、明日の土曜日には、かつて一緒に 沖縄 に行った卒業生2人と、天気が良ければ遠鉄の屋上ビアガーデンの予定である(^_^)。 そして来週末(時の記念日のあたり)には、この学会出張シーズンの最後、時間学会での発表に山口(湯田温泉)に行く。

昨日の続報としては、午後にさらに1人が加わって、今年の 40虎 は8人ということになった。 今日の放課後には顔合せミーティングである。 また昨日の教授会の後には、「ドラえもん」シリーズの最終号を金重さんと作り、 このページ にまとめるとともに、これまで全11回(全10回だが、定期購読特典の「飛ぶのび太」が加わった)をまとめた このページ も作ったところで帰宅した。

昨日から今日にかけての将棋名人戦では、矢倉の定跡から森内名人が新手を繰り出した、と新聞に書かれていたが、研究室でネットを見てみると、なんとこの新手はボナンザが発見した新手で、後手が逆転勝利したという。 もし、今日の第5局で後手の森内名人が防衛すると、コンピュータの新手を人間が追随したことになるが、今日は以下の状況から、将棋を追いかけることはしないつもりである。

KickStarterの続報メイルも届いたがこれは棚上げである。 そして他にも、 パリでの国際会議ICEC2009 の僕のチュートリアルの受講者として知り合ったロシアの研究者 Denis Perevalov 氏、 その後、彼の紹介で 2010年のロシアツアー に繋がって以来、メイルでやりとりする仲であり、最近の彼の仕事としては これ とか これ とか これ とか これ とか、色々と頑張っている。 4番目のアプリは、ゼミの森川さんのiPad miniに入れてもらったのを見たが、なかなか素晴らしいサウンドアート(ゲーム/インスタレーション)である。 そのDenis Perevalov 氏とやりとりしているメイルもまた届いたが、一緒に届いていた以下のふーみんメイルから、Denisへの返信も後回しにいて(どうせ海外とのメイルは時差があるので半日遅れでもまったく関係ない)、今日は2-3限のゼミと放課後のミーティング以外は、ここに集中するぞ、と決めた(^_^)。

お待たせしました。

根本的な原因は、やはりkeyが無効になっていて
正しいパッケージを導入できていないことのような気がします。

sudo apt-get install debian-keyring
sudo apt-get install debian-archive-keyring
sudo apt-get install debian-edu-archive-keyring
sudo apt-get update

を試してみてください。

不完全な状態で何度かapt-getを繰り返しているので、一度、

sudo apt-get clean

をしてから、順次パッケージを入れ直してみた方がいいかもしれません。

個々のパッケージについては、

apt-get --purge remove (パッケージ)

で設定ファイルまで含めてアンインストールされます。

VNCは基本的にはビットマップ転送なので環境を問わず動かしやすいと
いうのはありますね。RPiだとfast etherなので解像度が高いと若干
苦しいところはあるんですが・・・
まぁ、MacとWindowsとのVNCでも、相手の画面がぐにゃり(^_^;)と転送されるのは体験しているので、CPUクロックが800MHzと低いRaspberry Piではさらに面白いぐにゃりとなるのは想定できるが、ここはVNCに向けて、キチンとやっていこう。 まずはふーみんメイルの後半の「sudo apt-get clean」と、「個々のパッケージを設定ファイルまで含めてアンインストール」というのを、ローカルに実行してみることにした。 過去のRaspberry Piでの作業ログを発掘して、まずは以下のようなリスト「check.txt」を整理した。 そしてRaspberry Piにsshで入って、Macのターミナル画面内で作業しようと思ったが、前半のアンインストールはリモートで作業出来ても、後半のapt-getはインターネット直結が必要なので、このリストをテキストファイル化してRaspberry Piにrcpして、作業は全てRaspberry Pi側で行うことにした。
■アンインストール
sudo apt-get --purge remove inetutils-inetd
sudo apt-get --purge remove telnetd
sudo apt-get --purge remove tightvncserver
sudo apt-get --purge remove openbsd-inetd
sudo apt-get --purge remove inet-superserver
sudo apt-get --purge remove debian-keyring
sudo apt-get --purge remove xinetd
sudo apt-get --purge remove xscreensaver
sudo apt-get --purge remove x11vnc

=========
■keyのセット(WiFiルータ開通後)
sudo apt-get install debian-keyring
sudo apt-get install debian-archive-keyring
sudo apt-get install debian-edu-archive-keyring
sudo apt-get update

■再度インストール(WiFiルータ開通後)
sudo apt-get install  inetutils-inetd
sudo apt-get install  telnetd
sudo apt-get install  tightvncserver
sudo apt-get install  x11vnc
sudo apt-get install  xinetd
sudo apt-get install  xscreensaver
sudo apt-get install  openbsd-inetd
sudo apt-get install  inet-superserver
sudo apt-get update
まずは順調に、静かにサクサクと前半のアンインストール作業が進み、 このように 「inet-superserver」だけは拒絶されたものの(^_^;)、無事に完了した。 ここでゼミの2限になったので中断したが、午後になって、まずはゼミの森川さんのインスタ作品の実験のために、ネオジム磁石と磁気センサとチルトセンサを発注した。 そしていよいよモバイルWiFiルータを立ち上げて、MacBookAirから新しい1 day契約で明日の朝までの24時間の契約を行った。 そして上記のメモの後半を順に行うと、telnetdで駄目(^_^;)と怒られたものの、全般的には順調に、 このように 推移して、どうやら無事にvncserverがインストール出来た。

そして、研究室LANに接続し直してRaspberry Piを再起動して、VNCのために無駄なメモリ消費を避けてデスクトップを開かずに、Macからsshした。 しかし、ほぼ先日と同様に、最初にtightvncserverを起動すると求められるというパスワード設定要求が出ないばかりか、またまた「Illegal instruction」というエラーであった。 sudoしても駄目、インプレス本にあった「x11vnc」でも、以下のように断られて、どうにもVNCサーバが起動しない(^_^;)。

pi@raspberrypi ~ $ ls
Desktop  check.txt  indiecity  log10.txt  log9.txt  ocr_pi.png  python_games
pi@raspberrypi ~ $ rcp log10.txt nagasm@172.16.65.31:Desktop/
Password:
log10.txt                                                 100%   18KB  18.4KB/s   00:00    
pi@raspberrypi ~ $ tightvncserver
Illegal instruction
pi@raspberrypi ~ $ x11vnc -storepasswd
Illegal instruction
pi@raspberrypi ~ $ tightvncserver -storepasswd
Illegal instruction
pi@raspberrypi ~ $ vncserver
Illegal instruction
pi@raspberrypi ~ $ vncserver -storepasswd
Illegal instruction
pi@raspberrypi ~ $ sudo tightvncserver
pi@raspberrypi ~ $ ps ax | grep tightvnc
 2166 pts/1    S+     0:00 grep --color=auto tightvnc
pi@raspberrypi ~ $ kill -9 2166
-bash: kill: (2166) - そのようなプロセスはありません
pi@raspberrypi ~ $ sudo kill -9 2166
pi@raspberrypi ~ $ ps ax | grep tightvnc
 2170 pts/1    S+     0:00 grep --color=auto tightvnc
pi@raspberrypi ~ $ sudo vncserver
pi@raspberrypi ~ $ ps ax | grep vnc
 2179 pts/1    S+     0:00 grep --color=auto vnc
pi@raspberrypi ~ $ sudo x11vnc -storepasswd
pi@raspberrypi ~ $ ps ax | grep vnc
 2187 pts/1    S+     0:00 grep --color=auto vnc
pi@raspberrypi ~ $ 
さて困った。 インストールに問題は無くなったものの、まだ「tightvncserver」は起動できない。 tightvncserverの起動はインプレス本では「vncserver」と書かれているが、いずれにしても、最初の起動で求められる筈のパスワード設定に来ない。 昨日の実験でサクサクと出来た、市販の「Real VNC」とはえらい違いである(^_^;)。 ここはまたまた、ふーみんヘルプの出番かなぁ。

ふーみん師匠にメイルを出してしまえば、とりあえず何をするかは決めていた。 Raspberry Piには、Pythonというインタプリタ言語環境があり、将来的に周辺回路とやりとりする際にも、速度などの条件を別にすればPythonベースのライブラリが充実しているとのことだったので、とりあえずこれを試してみることにした。 この部分のテキストは、インプレス本の「速習 : Python」であり、もちろんRaspberry Piはデスクトップなど起動せず、sshしたMac側での作業である。 以下のように、Macのターミナルでnanoを起動すると、ちゃんとテキストエディタになり、ctrl+Xで戻ることも確認した。

上の例のように、とりあえずPythonプログラムでは「#! /usr/bin/env python」という1行から始まること、実行の際には「python #######.py」と呼び出せばいいらしい。 IDLEとかの開発環境を使うのはVNCが開通してからにしたいので、当面はこのように進めていこう。 モバイルWiFiルータは無事にお仕事を終えたのでシャットダウンして、ついでに新品スッピンだとダサいので、ホワイトボディで白いMacシールが映えないため、以下のようなシールを貼ってイケメン化した。(^_^;)

そして次に、朝、棚上げしていたDenis Perevalov 氏のメイルを読んでみると、以下のように、僕の 音楽心理学研究のページ を、Googleの「日本語→ロシア語」翻訳機能で読もうとしているようであった(^_^;)。

Thanks for the your research on glockenspiel! I feel it is deep
investigation on sound perception.
Unfortunately, translation Japan->Russian is not perfect, 
and I can not understand clearly that means pictures like
http://nagasm.org/ASL/Glocken/jikken/0-2.jpg
有り難いことであるが、いつも使っている「エキサイト翻訳」から類推すると、とうていこの論文の内容は伝わらないだろうなぁ・・・と思いながら、とりあえず以下のような画像を添付して返信してみた。

するとここに、ふーみん師匠から以下のメイルが来た。 こうやって複数の物事が並列に進むというのは、なかなか充実感がある(^_^)。

うーむ、とりあえず

sudo apt-get upgrade

してみるとどうなるでしょう?

x11vncで同様の事例が5/26付けで海外のサイトに出ていました。
長嶋さんのところではtightvncとx11vncの両方が同じ症状を
示してるので、共通に使っているライブラリのバージョンに問題が
あるのかもしれません。
なるほど、ライブラリを入れたら、依存関係にある元ライブラリも全て更新しないといけないわけである。 さっそくやってみると、「503個、306MBのアーカイブを取得するぞ」、と表示され、モバイルWiFiルータの伝送速度の上限で連続してガリガリガリ・・・と猛烈にデータを取りに出かけた。

そして30分以上が経過して、事態は急展開した(^_^;)。 上記の「sudo apt-get upgrade」の膨大なメッセージはターミナルアプリのコピーペーストバッファから溢れるほどだったが、これを一部切れた状態でなんとかログファイルにして保存して、sudoでシャットダウンした。 そしてLANケーブルを研究室内DHCPに差し替えて再起動したところで、以下のように異常が発生した(^_^;)。

Raspberry Piが立ち上がるいつもの画面で「segmentation error」が連発し、立ち上がったものの、「ifconfig」をしてもIPアドレスが表示されない。 2度試しても同じ、というところで、「こりゃLinuxのファイルシステムが壊れた」と断定した。 幸いに、いくつものSDカードに最新のシステムを入れていたので、たぶんRaspberry Pi自体は壊れていないと想定して、SDカードを新しいものに交換して立ち上げると、無事にきちんと立ち上がった。 そしてここから、とりあえずtelnetdはパスして(^_^;)、精選した以下のコマンドを入れた。 実際には「sudo apt-get install debian-edu-archive-keyring」の最後に何か言われたので、そこで「sudo apt-get upgrade」をしてから再度「sudo apt-get install debian-edu-archive-keyring」とやったらOKとなり、あとはVNCだけ入れてみた。 そして最終的に全て何のエラーもなくパッケージのインストールやアップデートが成功した。

しかし、新しいRaspberry Piハードになったので、DHCPから同じIPアドレスをもらってもsshではパスワードエラーが出た。 この現象はかつて体験していたので、ネットから対策を発掘して、以下のようにメモするとともに実行して、無事に新しいRaspberry Piにsshできた(^_^)。
■sshの古いキーの削除方法■

・Finderの「Go」の「Go to Folder」で「/Users/nagasm/.ssh」とする

・「known_hosts」を開いて該当IPの部分を削除して上書きする
そしてそして、遂に、出来た。 5限には「第40期・虎の穴」のメンバーのうち6人が研究室に来て、熱心に「世界の名作CM傑作選」の映像に注視する中、ミーティング開始の18時の25分前になって、sshのリモート画面から「tightvncserver」を起動してパスワードを設定し、遂に以下のように画面にRaspberry Piのデスクトップが登場した。 思いのほか高速で、Raspberry PiのターミナルからMacに対してsshでログインしていて、またブラウザはちゃんとSUACのプロキシを経由して僕のサイトをアクセスし、EUC-JPの文字コードを全て正しく日本語表示している。 ここまで長かったが、これで準備は万端である。(^_^)

とりあえず、ふーみんに「出来ました」とメイルして、あとは「40虎」ミーティングに集中しよう。 40虎については、全員が揃ったところで発表する大ニュースもある。 名人戦は夕食を前にして、森内名人の防衛、というところも確認した。

まだ終わらないが、なかなかに濃い一日となった。

2013年6月1日(土)

もう6月である。 この日記は5月14日にスタートなので、まだ半月ほどであるが、だいぶRaspberry Piが身近になってきた。 今日は晩のビアガーデンだけだと思っていたら、昨日の午後に卒業生の山口クンからメイルがあり、急転直下、今日のお昼には彼が1106に来ることになった。 卒業しても 僕の研究室サイト をチェックしてくれる彼は、 40虎 のページを発見して、彼の作品「Tiny Living」の復刻修理をしたい、と申し出てきたのだ。 何度も「虎」に参加し、後輩の憧れの活躍をする山口クンの来訪というのは、後輩にもいい刺激となりそうである。(^_^)

モバイルWiFiルータの利用期限があと2時間ほどになったが、これに頼らず、今日の午前中に行う事は今朝、思いついていた。 Raspberry Piのシステムを入れたSDカードが1枚だけ、というのは心細いので、あと2-3枚は作るつもりだったのだが、昨日と同じことを繰り返すよりもうまい手があるのだった。 最初のSDカードは、ネットからダウンロードしたイメージファイルをターミナルの「dd」コマンドでSDカードに書き込んだので、今度は、昨日完成した、「sshが稼働し、VNCserverが稼働し、ブラウザではSUACのプロキシが設定されていてdefaultで[nagasm.org]に行く」というそのSDカードを読み込んで、新しいイメージファイルを作ってしまえばいいのである。 そこでインプレス本を参考に、以下の手順で昨日完成したSDカードからイメージファイル「ssh_vncserver_OK.img」を作った。

読み出したイメージファイルは、さっそくさらに新しいSDカードに書き込んで実験である。 今回は、ネットから落としたRaspberry Pi用のLinuxイメージは約2GBだったが、それを4GBのカードに書き込んで領域も拡張しているので、今後は最低でも4GBのカードに書き込むことになり、4GBであればそのまま、8GB以上であれば再度、領域を拡張することになる。 既にこの日記の前半にあったが、SDカードへのイメージファイルの書き込み手順を再録すれば以下となる。 同じことを計3枚、行ったので、その合間には こんなもの を調べて、業者に発注した。 そして、このイメージファイルから作成したSDカードで、ssh出来ることとvncserverが起動する(パスワード設定まで完了した状態)と確認したところで、いよいよ今朝、思いついたアイデアの実現に向かった。 それは、「マウスもキーボードもモニタも無しでRaspberry Piを走らせる」「複数のRaspberry Piを同時に走らせる」「DHCPでなく固定IPとする」という事である。 起動するたびに自分のIPアドレスを確認するのにマウスとキーボードとモニタが付いている、というのは、まるでパソコンである(^_^;)。 せっかくのRaspberry Piなので、LANケーブルと電源だけで動かしたいのである。 必要なことは全て、sshとvncでホストから行えばいい筈である。

そこで再びネット等の情報を元に、以下の手順で各Raspberry Piに固定IPを割り当てた。 SUACネットでは教員研究室のパソコン等は固定IPを申請登録することになっているが、開学以来、常に研究室に多数のWSやパソコンを持ち、実験で同時に多数のIPを使ってきたので、手持ちの(他とぶつからない)固定IPアドレスはたくさんあるのだった。

これにより、このRaspberry Piは固定アドレス「172.16.65.61」を持った。 同様にして「172.16.65.62」と「172.16.65.63」のRaspberry Piも作った。 いずれも、起動した場合には初期設定によってsshdは起動しているので、「sudo service ssh restart」は特に必要ない。 あとはユーザ権限で「tightvncserver」すれば、最初のSDカードで設定したパスワードでVNCも起動する。

そして昼前になって、山口クンに会いたいという40虎の学生2人がやってきて、さらに山口クンが訪れたちょうどその時、以下のような風景がまさに実現した。 3人にはこの最初のテストに立ち会ってもらった。

これはつまり、LANハブに刺さったLANケーブルと電源だけで立ち上がった3台のRaspberry Piがいる、という風景である。 ただし以下のように、ホストMacの2画面を見てみると、3台のRaspberry Piにそれぞれsshするターミナル画面があり、そこからそれぞれのRaspberry PiでVNCサーバを起動した上で、ホストは3つのVNCクライアント画面をそれぞれのRaspberry Piに対して接続しているのである。 各Raspberry Piは別々のWebページをきちんとアクセスして表示しており、そのVNC画面内で開いたターミナルから、あるいはホストのターミナルからsshした先で「sudo halt」するとちゃんとRaspberry Piはシャットダウンして、ターミナルのsshも接続が切れて戻り、VNCウインドウも消失した。

ここでお昼となったので、4人で昼食、そして山口クンの最近のCMの仕事の情報と動画を受け取った。 山口クンの仕事はさっそく、来週の講義で後輩たちに紹介しよう(^_^)。 そして、40虎の学生2人と山口クンとともに電子制御機器制作室に行って、 こんなカンジ で、山口クンの卒業制作作品「Tiny Living」(映像作品「trip」と2本立ての卒制)の現状確認などをした。

そして研究室に戻り、学生は上のように漫画に没頭し(^_^;)、山口クンは他の先生のところに行ったりしている合間に、今日のここまでの部分をまとめてアップした。 梅雨入りしてビアガーデンに向けて気になる雨雲は、以下のようになんとか免れられそうな気もするが・・・。

そして遠鉄ビアガーデンに出発するまで1時間を切ったところで、以下のように再度、小さく組み立ててみた。 これは来週には、LANケーブルとハブを小型化して、さらに小さくする予定である(^_^)。

今日はここまでである。 ビールが旨いのは間違いない。(^_^)

2013年6月3日(月)

早起きして朝から気合いを入れて出勤してきたのに、いきなりトラブルに遭遇した。 研究室のEPSONのインクジェットブリンタのインクが少なくなったというので交換してみると、純正の新品インクなのに、カートリッジを認識してくれない。 過去にも旧機種のEPSONでもあった事だが、いろいろと試して、結局、その入れたばかりの新品純正インクカートリッジを捨てて(^_^;)、さらに別の新品純正インクカートリッジを入れると、何事もなく正常になった。 つまりは「EPSONタイマー」という事なのか、これで純正インク5本セットが一式、お金だけ払って全く使わずにゴミとなった。 1時間以上も無駄に取られたのが悔しいが、EPSONもいい商売をしているなぁ(^_^;)。

午後には、昨夜から思いついていたアイデアに取りかかったが、なかなか相手が大きいので、そう簡単には突破できない。 そこでまず、「起動時に自動でユーザー[pi]でログインして、さらに[tightvncserver]を起動しておく」という環境設定を行った。 これにより、ホストのMacからいちいちターミナルでsshしてtightvncserverを起動してからVNCしなくても良くなる筈、という事である。 rcpはホストからでもRaspberry Piからでも出来るし、シャットダウンもVNC内でRaspberry Piのターミナルウインドウを開いて行えばいい。 そこでネットをキーワード「debian 自動起動 ログイン ユーザ」で検索して出て来た このページ の記述そのままで、簡単に実現できてしまった。 これは固定アドレスでもDHCPでも出来るが、DHCPだとホストからのVNCの対象IPが不明なので、固定IPだと便利なものとなる。 以下はまず、起動時に[pi]ユーザで自動ログインする設定の手順である。

そして以下は、起動時に[tightvncserver]を自動起動する設定の手順である。 これで終わりである。 この2つの設定ファイルは、上記の修正を加えた状態だと、以下のようになっている。
pi@raspberrypi ~ $ cat /etc/inittab
# /etc/inittab: init(8) configuration.
# $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $

# The default runlevel.
id:2:initdefault:

# Boot-time system configuration/initialization script.
# This is run first except when booting in emergency (-b) mode.
si::sysinit:/etc/init.d/rcS

# What to do in single-user mode.
~~:S:wait:/sbin/sulogin

# /etc/init.d executes the S and K scripts upon change
# of runlevel.
#
# Runlevel 0 is halt.
# Runlevel 1 is single-user.
# Runlevels 2-5 are multi-user.
# Runlevel 6 is reboot.

l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6
# Normally not reached, but fallthrough in case of emergency.
z6:6:respawn:/sbin/sulogin

# What to do when CTRL-ALT-DEL is pressed.
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

# Action on special keypress (ALT-UpArrow).
#kb::kbrequest:/bin/echo "Keyboard Request--edit /etc/inittab to let this work."

# What to do when the power fails/returns.
pf::powerwait:/etc/init.d/powerfail start
pn::powerfailnow:/etc/init.d/powerfail now
po::powerokwait:/etc/init.d/powerfail stop

# /sbin/getty invocations for the runlevels.
#
# The "id" field MUST be the same as the last
# characters of the device (after "tty").
#
# Format:
#  :::
#
# Note that on most Debian systems tty7 is used by the X Window System,
# so if you want to add more getty's go ahead but skip tty7 if you run X.
#
##1:2345:respawn:/sbin/getty --noclear 38400 tty1 
1:2345:respawn:/bin/login -f pi tty1 /dev/tty1 2>&1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6

# Example how to put a getty on a serial line (for a terminal)
#
#T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
#T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100

# Example how to put a getty on a modem line.
#
#T3:23:respawn:/sbin/mgetty -x0 -s 57600 ttyS3

#Spawn a getty on Raspberry Pi serial line
T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
pi@raspberrypi ~ $ cat .profile
# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.

# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
	. "$HOME/.bashrc"
    fi
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

if [ -z "$DISPLAY" ] && [ $(tty) == /dev/tty1 ]; then
	tightvncserver
fi
pi@raspberrypi ~ $
今後、さらに起動時に自動実行したいものがあれば、上記の後者に追加すればいいのだろう。 そしてお約束であるが、僕のパソコンはMacだろうがWindowsだろうが、全てこれにする、というデスクトップの壁紙を設定した。 元素材は、シリコングラフィクスのIndyワークステーションにdefaultで用意されていたものであるが、これをpngに変換して、rcpでRaspberry Piに送って、デスクトップ上の右クリックで出した「設定」メニューから指定すると、以下のように見慣れた風景となった。(^_^)

併せてRaspberry Piのターミナルウインドウのフォントサイズを10から11に、文字色をグレーからホワイトに、太文字を禁止に、カーソルを点滅に、と設定変更することで、もはやVNCで繋いでいる事を忘れるほど、親和性が高まった。 やはり、デスクトップは、こうでなくちゃ(^_^;)。 そしてぼちぼち16時となった。 アカペラ新加入の新入生たちが、レバの補習特訓にやってくるので、大ネタへの挑戦は明日以降として、今日はここまでである。

2013年6月5日(水)

日本が2014年ワールドカップ出場を決めた翌日である。 月・火の講義日は進まないとしても、なんとか水・木あたりにRaspberry Piを進めたいところであるが、今週末はいよいよ学会発表シリーズの最終回、時間学会(山口大)であり、予稿がたった1ページと簡単に(内容は後回しで(^_^;))済ませただけに、発表の準備に追われて、大ネタに挑戦、と言った割には進めない。

朝、ICMAから届いたメイルには、 このページ のプロジェクトで、「It is my great pleasure to announce immediate availability of the latest Pd-L2Ork, its K12 module, as well as the inaugural official version of Pd-L2Ork for the Raspberry Pi platform.」という研究者本人の言葉であった。

「Pd-L2Ork」はたぶん、NIMEとかで見た、ポータブルなオーケストラ演奏端末(楽器)なのだが、それよりも「Raspberry Piに載った」というのはニュースである。 そうか、Raspberry PiはPdが走るのであった。 僕はもっぱらMaxだが、ふーみんの本ではPdを紹介していたし、また新しいネタが増えた。 いずれ、ここにも挑戦しよう、と忘れないようにメモしておくことにした。

2013年6月6日(木)

例年より10日も早く「梅雨入り」宣言したものの、このところパッタリと雨が降らず、この週末の時間学会(山口)も、傘ナシで行けそうで何よりである。 月初の木曜日には教授会や委員会も無いが、1限に「音楽情報科学」のグループ「しゃみーず」のアポがあり、また3限にはゼミの拡大勉強会「電子回路講座」が予定されていて、時間的にはコマ切れである。 こういう日には小ネタを進めるに限る。(^_^;)

Raspberry Piでは、Pythonというスクリプト言語が、一種の売りとなっているらしい。 さっそくパソコンに「ぱ」でPythonを単語登録した。 ちなみに僕のパソコンで単語登録されているものは何かな、と思って「ことえりユーザ辞書」をエクスポートしてみたら、以下のようなものであった。 よく使う、一発で出にくいものを登録しているようである。 あまりパソコンを使い倒しているとは言えないなぁ。(^_^;)

"あ","Arduino","普通名詞"
"あ","AKI-H8","普通名詞"
"え","エンタテインメント","普通名詞"
"き","筋電","普通名詞"
"じぐ","治具","普通名詞"
"げ","Gainer","普通名詞"
"じ","XBee","普通名詞"
"いじ","以上、よろしくお願いいたします。","普通名詞"
"おんじ","音楽情報科学研究会","普通名詞"
"す","SUAC","普通名詞"
"す","SuperCollider","普通名詞"
"な","nagasm@suac.ac.jp","普通名詞"
"に","(^_^;)","普通名詞"
"ば","\","普通名詞"
"ぱ","Python","普通名詞"
"ぶ","BrightEyes","普通名詞"
"ぶ","Blink(1)","普通名詞"
"ぷ","Processing","普通名詞"
"ぷ","Propeller","普通名詞"
"ま","マルチメディア","普通名詞"
"め","メディア造形学科","普通名詞"
"ら","Raspberry Pi","普通名詞"
"こん","Computer Music","普通名詞"
そしてPythonであるが、Yahoo.comで調べると、なんだか以下のように多数のヘビの画像が並んでいるが(^_^;)、 このページ がWikipediaでの解説、 このページ が公式ページである。 今日は、このPythonを調べてみよう。

Wikipediaによると、なんとPythonは1980年代後半には提案されていたようである。 その言語としてのポリシーは以下のように、「美しくありたい」「暗黙でなく明示的に」「シンプルに」「複雑でなく高度な構造を作る」「可読性」であるという。 まぁ、このような理想は他の言語/処理系でもよく見かけるが(^_^;)、理想は重要である。

現在のPythonは2008年から登場したPython3.0のバージョンらしい。 ちゃんとした言語処理系で、膨大な「Syntax and semantics」の解説に閉口したが、こういうのは飛ばしてもいいのである。 ライブラリもかなり充実していて、サードパーティの「パッケージ」も、以下のような広範な領域で25000種類も出ているという。 これはつまり、Processingなどと同じように、速度を別にすれば、Pythonだけで何でも出来る、ということだろうか。 Pythonの開発環境としては、まずはshellのようにコマンドラインのインタプリタとして走る。 Perlみたいなものかな。 さらにRaspberry Piのデスクトップにもあった「IDLE」とか、他に「IPython」というグラフィカルなツールがあり、もっと本格的な「Python IDEs」がいくつもあるらしい。 そして「Implementations」のところを見ると、Pythonはバイトコードを経て多くのコンピュータにもインプリされているようで、 公式ページ の「ダウンロード」を見たら、Macというのもあった。 さっそくこれはゲットして実験してみなければ。

そして Wikipedia の「Use」のところを見ると、なんとPythonの使用例として こんなページ があり、「IDE」だけで17種類、「Applications」は数知れず(^_^;)、「Web applications」だけで11種類、「Video games」だけで11種類、「Web frameworks」だけで11種類、「Graphics frameworks」だけで5種類、「GUI frameworks」だけで4種類、「Scientific packages」だけで7種類、「Mathematical libraries」だけで4種類、・・・と続き、特筆すべきは「Embedded as a scripting language」もまた数知れず(^_^;)、多数が提供されているのであった。 そして、この「Use」の最後のところに、「The Raspberry Pi single-board computer project has adopted Python as its principal user programming language.」として、遂にRaspberry Piという名前が登場した。 歴史的に新しいものの特権である「良いとこ取り」の原則に従って、C(Arduino)でもJava(Processing)でもなく、Raspberry Piでは推奨プログラミング言語がPythonなのだ。

こんな巨大なコミュニティだとは全く知らなかったが、これは勉強するのに、相手にとって不足は無い(^_^)。 あまりに膨大な Wikipedia の記述に圧倒されたが、こうなれば、Raspberry PiのPythonに入る前に、以下の本丸の Python公式ページ をチェックしないと始まらないだろう。

この手の新しい環境に取り組む時はいつも、とりあえずダウンロードしてインストールして、とりあえず走らせながらチュートリアルを読みつつ試して、馴れる、という事である。 その通りに Pythonダウンロードページ から、最新の「Python 3.3.2 Mac OS X 64-bit/32-bit x86-64/i386 Installer (for Mac OS X 10.6 and later)」をダウンロードして(18MB)、インストールすると80MBほどになった。 アプリケーションとして登録されたフォルダにあるのは以下の4つだが、「Python Documentation.html」というエイリアスをブラウザで開くと、ヘルプとかチュートリアルなどのドキュメント類もオフラインで使えるようにインストールされているようだ(オンライン版は ここ である)。

上の「Python Documentation」の中で、「Library Reference」と「Language Reference」は、後で参照するものである。 「Tutorial」は、「start here」と書かれているように、良い子はここからスタートするのだが、いつものクセで、まずは Python Setup and Usage に行ってみた。 ここにある以下の中で、とりあえず必要なのは「4」だけである。

  1. Command line and environment
  2. Using Python on Unix platforms
  3. Using Python on Windows
  4. Using Python on a Macintosh
  5. Additional Tools and Scripts
その「Using Python on a Macintosh」の冒頭を見ると、「Mac OS X 10.8 comes with Python 2.7 pre-installed by Apple.」などと書いてある。 Appleが標準で搭載するほどPythonは普遍的なのだった。 要するに、Pythonプログラムを作って実行するには「IDLE」を使え、ということらしいので、まずはIDLEを起動した。 そして、せっかくなので同じ机の上にあるRaspberry Piも起動して、VNCウインドウからRaspberry Piのデスクトップにあった「IDLE 3」も起動した。 以下のように、Macの2画面に、Mac自身のIDLEと、VNCウインドウ内のRaspberry PiのIDLEとが同じように開いたわけで、ここからチュートリアルを追いかける際には、両方に同じPythonプログラムを走らせてみることで、コンパチビリティの確認までやってみよう(^_^;)、という事である。

・・・と、ここで「しゃみーず」と新しい三味線改造のミーティングをして、その後、3限に予定されていたゼミの電子回路講座ミーティングがメンバーの体調不良によってパス(延期)となったため、三味線改造の裏方作業を棚に上げれば(^_^;)、午後マルマル、Python探検に入るところだった。 しかし、なかなかそう快調に行かないところがまた、Raspberry Piなど先端領域の面白いところである。 ここから丸3時間以上、あれこれと苦闘することになった(^_^;)。 そして上記とほとんど変わらない以下の画面が、その最終状況である。

この経緯の状況を説明する。 なんせこの部分は、とりあえずは解決(折り合いをつけた)ものの、本質的には困ったままなので、ふーみん師匠に質問のメイルをする、という状況説明なのである(^_^;)。 まず、午前中の経過で、 これこれ という2画面で、MacでもRaspberry Piでも、同じPython開発環境のIDLE3が美しく開いた。 ここまでは本当に快調であった。 しかしよく見てみると、 この Raspberry Piのデスクトップに開いたIDLEの起動メッセージは以下のように、スッキリとしたものである。

Python 3.2.3 (default, Mar  1 2013, 11:53:50) 
[GCC 4.6.3] on linux2
Type "copyright", "credits" or "license()" for more information.
>>>
ところがこれに対して、Macで起動したIDLEの起動メッセージは以下のように、何か余計なことが書いてある(^_^;)。 結局、この余計なことをあれこれトコトン、調べる羽目となったのである。 余計に加わっていた情報とは、「このMacPythonで使っているTcl/Tk (8.5.7)は安定していないので、何か良くないことが起きてもゴメンね(^_^;)」ということであり、後に、藁をも掴む気持ちでその下のリンクに行くとは、まさか思ってもみなかった。
Python 3.3.2 (v3.3.2:d047928ae3f6, May 13 2013, 13:52:24) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "copyright", "credits" or "license()" for more information.
>>> WARNING: The version of Tcl/Tk (8.5.7) in use may be unstable.
Visit http://www.python.org/download/mac/tcltk/ for current information.
>>> 
ここで、快調に起動したMacPythonのIDLEについて、設定メニューからあれこれする、というのはよくあることである。 MacとRaspberry Piで持っているフォントが違うので、それぞれ見やすくフォントサイズを上げたりフォントを選んだりした。 そして、以下のようなメニュー(これはMacBook Airの画面)があったので、最初に起動した時の画面のpreferencの設定で、defaultでは「Open Shell Windows」となっていたので、試しに左の「Open Edit Windows」というのに変えてみたのである。 するとなんと、試しに起動しようとしたこの「IDLE.app」が、まったくホストMacで起動しなくなったのである(^_^;)。

まったくの無反応ということでなく、チラッと起動しかけて起動しない、という挙動であった。 これは過去の経験から、「何かが壊れた」(^_^;)、と確信した。 問題はMacということはUnixなので、その何かがどこにあるのか、捜すのが至難の業である、という事なのだ。 ここからまずやった事は、とりあえずインストールした「Python」をアンインストールして、再びインストールしてみる、という事である。 Webであちこち探しまわり、ようやくそれっぽい記述(ただしPythonのバージョンは3でなく2)を発見して、該当しそうなフォルダとファイル(多くが不可視ファイルであり、いちいち管理者権限が必要)を削除して、改めてダウンロードモジュールを解凍・インストール、というのを繰り返したが、現象はまったく変わらなかった。

そして、あれこれ消しているうちに判明したのは、Macではシステム領域にPythonの古いバージョンがPerlなどと同様に標準で入っていることで、それまで強制的に消してしまったとすると、今後、関係ないところで災いが起きる可能性が出て来た(^_^;)。 こうなればチャンスは一度しかないが、メインMacと同じバージョン(10.6.8)で止めている、出張/講演/公演用のMacBook Airである。 こちらに新たにMacPythonをインストールして、上記のような環境設定をしないで(^_^;)、その正しい環境から壊れていない正しいものをいただく、という作戦である。

Unix内でシステムファイルのシンボリックリンクを作ってシステム領域に置く、などというのは、Indyでやったのは20年ちかく昔のことで忘却したので、エイリアスでなくて参照される実体をそのままコピーして置いたりして、なんとか「ほぼ同等」にした。 さらに、インストールしたアプリのコンテンツ参照メニューから、ターミナルで実行するPythonを確定させて、なんとか ここの右下 のように、IDLEウインドウは開かないものの、ターミナルとしてはPythonを実験できるところまで、戻した。

これはたぶん、Python回りというよりも、Mac OSXのどこかに散在する、「Tcl/Tk 」関係のpreferenceファイルがヘンに壊れて上書きされてしまったのでは、というのが現状の見立てである。 まぁ、大多数のLinuxやWindowsのユーザと違って、わざわざMacPythonを使う、というユーザも少ないのか、ネットで調べてもこのようなトラブルはあまり質問が出ていない。 だいたい、最初の起動画面で「WARNING: The version of Tcl/Tk (8.5.7) in use may be unstable.」と断っているので、悪いのはこちらである。 とりあえず、お仕事のMacBookAirにもPythonが入ってしまったので(^_^;)、明日の午後から山口に向かう新幹線とか、山口大学での時間学会の合間などには、これで遊べることとなった。 午前中にインストールして判明した、膨大なドキュメントが全てオフラインである、というのは重要である。

そういえば、Raspberry Piを800MHzクロックから1GHzにオーバークロックさせて、それを32枚スタックしてスーパーコンピュータを作った・・・という ニュース が流れてきたが、まぁこれは誰でも考えることで、もうあと一歩、何か欲しいような気がした。 でも、実際にこれをゴリゴリ作る、というのも大事である。 なんせ電源だけで「+5Vで30A」は欲しくなるのだ。 僕が実際に作った この作品 (メイキング) では、100個のステッピングモータを駆動するのに「+5Vで30A」というスイッチング電源を4-5個、並べたが、それはそれは大変だったのだ(^_^;)。

2013年6月7日(金)

朝は久しぶりの小雨だったが、午後から山口に出発する頃には晴れて、あとは週末まで晴れそうである。 1限の終わりにアポを入れていた4回生の藤本さんとメイルで何往復かしたが、前回の作品「植物会議」( ) の続編として、今度は50個ほどのLEDとモーターを付けるのだという(^_^;)。 これは「SUAC board」の出番だと思うが、とりあえず以下のようにメイルしてみた。
インスタで多数の入出力の事例を以下に紹介しますので、来週までに研究してみて下さい。

●SUACインスタレーション(1)
http://nagasm.org/1106/installation/index.html
以下のそれぞれの作品解説の部分にあるリンクを参照

靄夜(もや) LED64個
Chessでポン! スイッチ64個
段虎 LED240個
磨く LED168個
ハコロ スイッチ24個

●SUACインスタレーション(2)
http://nagasm.org/1106/installation2/index.html
以下のそれぞれの作品解説の部分にあるリンクを参照

風見屏風(かざみびょうぶ) モーター100個
Cyber Kendang LED320個
Beat Box スイッチ384個
Octagon パソコン8台
circles LED168個
団欒 -だんらん- タッチスイッチ8個
白い絵本 RFIDカード15枚、磁気センサ5個
電子十二影坊 (Dodeca Propeller) マイコン13個、ビデオ12系統
はやくスシになりたい RFIDカード15枚
おはなしパネル RFIDセンサ(15枚用)×4系統
OTOkakecco マウス4個
ネジマキウォール ステッピングモーター100個(モーター400回路分)

●SUACインスタレーション(3)
http://nagasm.org/1106/installation3/index.html
以下のそれぞれの作品解説の部分にあるリンクを参

Fantastic World Journey ! スイッチ24個
二人はウラハラ RFIDカード15枚、パソコン3台
海潮音 可動金属板168枚、ソレノイド5個
双極灯のヒ モーター50個
girl's apartment パソコン10台
日本の住まいに木の文化を取り戻す提案 スイッチ25個
Revolution-J 改造ジャミネータ5台
OTOcakecco 衝撃センサ21個、3色LED21個(LED63個分)
双極式箱庭 モーター50個
カラーオーケストラ IDキューブ44個(個別電子回路内蔵)
誰かを待つ街 LED24個
植物会議 LED6個、モーター6個、センサ2個
Nepic 紫外線センサ24個

●ArduinoやPropellerから周辺回路を増設するために僕が作った基板の情報です
(望月さんの作品に使いました)

だいたい
http://nagasm.org/ASL/Propeller2/index4.html
あたりから読み始めて、
http://nagasm.org/ASL/Propeller3/index3.html
まで続きます。
この最後のページには、過去のインスタの技術情報もまとめてます
仮ゼミの土佐谷さんの「傘に仕込む加速度センサ」、「しゃみーず」の改造三味線用タッチセンサ、そしてこの藤本さんのシステムの支援、と、いよいよあれこれ製作モードに追われる日々が迫ってきているのを実感する(^_^)。 今週末の出張が終わると、とりあえずRaspberry Piを横に置いて、ハンダごてがテーブルの中央に陣取りそうである。

さて、2限のゼミ(とその直前に動態保存の作品「植物会議」の借用に来る藤本さん)までの約1時間、昨日のおさらいである。 アプリケーションとしてインストールした「Python」フォルダにリンクが置かれていたドキュメントHTMLの本体は、「file:///Library/Frameworks/Python.framework/Versions/3.3/Resources/English.lproj/Documentation/index.html」にインストールされていた。 この「Tutorial」は「file:///Library/Frameworks/Python.framework/Versions/3.3/Resources/English.lproj/Documentation/tutorial/index.html」にあり、最初の「2. Using the Python Interpreter」の先頭「2.1. Invoking the Interpreter」によれば、IDLEが起動しなくても関係なく、ターミナルで「python3.3」と入れればいいのであった。 以下のように無事、起動した。(^_^)

昨日のスクリーンショットでも連発したが、この画面はもはやターミナルではなくてPythonインタプリタなので、「ls」とか「pwd」とやっても駄目なのである(^_^;)。 使い方はチュートリアルに従って、なぞっていくしかないので、まぁ、いい英語の勉強である。 ターミナルで「python3.3」と入れたらPythonが起動したのは、「/usr/local/bin」という、通常シェルのパスが通っている場所にインストールされているためなので、Windowsではパスを指定する必要があるというが、ここは華麗にスルーである。(^_^;)

Pythonインタプリタを抜けてターミナルに戻るには、「>>>」というプロンプト直後に「ctrl+D」である。 「quit()」というコマンドでも同様に戻ることが出来た。 その後なにやらゴチャゴチャ書かれているところは、あまり重要でもなさそうなのでパスした。 その次の「2.1.1. Argument Passing」も、呼ばれた事に返すargの話のようだが、華麗にスルーした。

その次は「2.1.2. Interactive Mode」であるが、これはちょっと面倒くさい予感が出て来た(^_^;)。 サンプルリストをコピペでPythonインタプリタ画面に入れたのに、エラーが出たのである。 「>>>」のプロンプトで、まず「the_world_is_flat = 1」と入れた。 そしてまた出て来た「>>>」のプロンプトで、「if the_world_is_flat:」と入れると、続いての入力を待つということで、プロンプトが「...」になったので、ここで「print("Be careful not to fall off!")」を入れたら、サンプルでは表示される筈なのに、エラーが出たのだ。 試してみると、「...」の後に入れたのが駄目だったようで、タブでインデントしないといけないらしい。 改めてインデントしたら、以下のようにOKだった。 こういうのを「面倒くさい奴」と言う。Propellerのspin言語が、まさにこれである(^_^;)。 Pythonは、CやJavaのようにスペースやタブのインデントを無視してくれず、人間はインデントを意識しなければならないのだろうか。 それとも、これはインタプリタに限定した条件なのだろうか。

nagasm-Mac-mini:~ nagasm$ python3.3
Python 3.3.2 (v3.3.2:d047928ae3f6, May 13 2013, 13:52:24) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
... print("Be careful not to fall off!")
  File "", line 2
    print("Be careful not to fall off!")
        ^
IndentationError: expected an indented block
>>> if the_world_is_flat:
...     print("Be careful not to fall off!")
... 
Be careful not to fall off!
>>> 
タブでなくスペースだとどうなるか、と試してみると、なんと以下のように超・面倒くさいことが判明してきた。 こりゃ、なんか理念とは別に、Pythonにはあまり深入りしたくないカモ。(^_^;) こりゃ、なかなかPythonは繊細である。というか面倒くさい。 とりあえず次の「2.2. The Interpreter and Its Environment」に進む。 最初の「2.2.1. Error Handling」はパス。 次の「2.2.2. Executable Python Scripts」というのは、Pythonスクリプトを複数行のプログラムとして書いた時に、最初の行に「#! /usr/bin/env python3.3」というおまじないを入れておけば、「Python」に続けて呼び出すと、シェルスクリプトのように実行できるという。 また「$ chmod +x myscript.py」とすれば、Pythonナシでも実行可能に出来るという。 ここは重要そうなので実験してみると、以下のように、出来た。 見やすくするためにスペースを挟んでみたが、sudoでパーミッションを変えて実行可能にすればいいのであった。
nagasm-Mac-mini:Desktop nagasm$ cat test.py
#! /usr/bin/env python3.3
print("Hello, World (^_^)")

nagasm-Mac-mini:Desktop nagasm$ Python test.py
Hello, World (^_^)

nagasm-Mac-mini:Desktop nagasm$ test.py
-bash: test.py: command not found

nagasm-Mac-mini:Desktop nagasm$ ./test.py
-bash: ./test.py: Permission denied

nagasm-Mac-mini:Desktop nagasm$ $ chmod +x test.py
-bash: $: command not found

nagasm-Mac-mini:Desktop nagasm$ sudo chmod +x test.py
Password:

nagasm-Mac-mini:Desktop nagasm$ test.py
-bash: test.py: command not found

nagasm-Mac-mini:Desktop nagasm$ ./test.py
Hello, World (^_^)

nagasm-Mac-mini:Desktop nagasm$ 
「sudo chmod +x test.py」によって完成したPythonプログラムを、「sudo cp test.py /usr/local/bin/」としてPATHの通っている場所にコピーすれば、「./」を添えることなくどこからでも実行できる。 またその後に、「sudo mv /usr/local/bin/test.py /usr/local/bin/test」とやって拡張子を取れば、もはやどこからでも「test」という名前によって、ターミナルとかシェルで実行できるプログラムになるわけである。 これは今後、Pythonの機能を活用して、Raspberry Piのバックグラウンドで走るサービスプログラムに活用する予定である。 この後の「2.2.3. Source Code Encoding」はとりあえず「UTF-8」なのでパス、「2.2.4. The Interactive Startup File」と「2.2.5. The Customization Modules」もあまり重要そうでもないのでパスすることにした。

ここで午前中にゼミがあり、その後、大学から浜松駅に行き昼食。 そして新山口に向かう「のぞみ」に名古屋で乗り継ぐ「こだま」を待つ待合室で、次章、「3. An Informal Introduction to Python」からのスタートである。 「Formal」であるよりは期待できるかもしれない(^_^;)。 最初に「コメントアウトは[#}」というのがあったが、まぁこれは普通である。 当然だと思うが、以下のように、文字列としてダブルコーテーションで囲まれた中の[#}は無視される。

nagasm-3:Desktop nagasm$ cat test.py
#! /usr/bin/env python3.3
# this is the first comment
SPAM = 1                 # and this is the second comment
                         # ... and now a third!
STRING = "# This is not a comment."
print(STRING)

nagasm-3:Desktop nagasm$ Python test.py
# This is not a comment.

nagasm-3:Desktop nagasm$
次のトピックはインタプリタでは定番の「3.1. Using Python as a Calculator」である。 いちいちトレースするほどの事もなく、斜め読みでいこう。 まずは「3.1.1. Numbers」である。 Pythonでは「7/3」は「2.3333333333333335」であり、「7//3」とすると整数の商として「2」になった。 変数については、嬉しいことに以下のように型宣言など不要で使えるようだ。
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
浮動小数点に関して、以下のようにいじわるテストをしたが、ちゃんとしていた。 さすがである。(^_^)
>>> 1+1
2
>>> 1/3
0.3333333333333333
>>> 7/3
2.3333333333333335
>>> 7//3
2
>>> 1/3*3
1.0
>>> (1/3) * 3.0
1.0
>>> 3*(1/3)
1.0
>>> 1/3/3*9
1.0
これまで使ったことが無かったが、以下のように複素数も出来るらしい。 これは素晴らしい。(^_^)
>>> 1j * 1J
(-1+0j)
>>> 1j * complex(0, 1)
(-1+0j)
>>> 3+1j*3
(3+3j)
>>> (3+1j)*3
(9+3j)
>>> (1+2j)/(1+1j)
(1.5+0.5j)
記述の規則はちょっとJavaっぽいが、以下のように複素数の実部と虚部も取り出せるらしい。 だからといって、Pythonでフーリエ変換をする事は無いと思うが。(^_^;)
>>> a=1.5+0.5j
>>> a.real
1.5
>>> a.imag
0.5
ここから「こだま」車内である。 整数部のint()と小数部のfloat()という便利なものもあるが、当然ながら以下のようにこれは実数にしか効かないという。 そりゃ当然だ。(^_^;)
>>> a=3.0+4.0j
>>> float(a)
Traceback (most recent call last):
  File "", line 1, in ?
TypeError: can't convert complex to float; use abs(z)
>>> abs(a)  # sqrt(a.real**2 + a.imag**2)
5.0
Pythonのインタラクタティブモードでは、最後に表示された数値が後で「_」で参照できるという。 まさに電卓だが、このアイデアはなかなか面白い。 ただし、この変数「_」はread onlyで、ここに値を割り当てる変数として使っては駄目である。
>>> tax = 12.5 / 100
>>> price = 100.50
>>> price * tax
12.5625
>>> price + _
113.0625
>>> round(_, 2)
113.06
数値はほぼ想定内であった。 「こだま」が豊橋に着くあたり、次は「3.1.2. Strings」である。 文字列の柔軟な取り扱いについてはJavaが出て来たときに驚き、JavaScriptでまた驚いた。 アセンブラ/Cの世代には常に新鮮なのである(^_^;)。 いきなり以下の例に驚いた。 こんなの覚えられないぞ。(^_^;)
>>> 'spam eggs'
'spam eggs'
>>> 'doesn\'t'
"doesn't"
>>> "doesn't"
"doesn't"
>>> '"Yes," he said.'
'"Yes," he said.'
>>> "\"Yes,\" he said."
'"Yes," he said.'
>>> '"Isn\'t," she said.'
'"Isn\'t," she said.'
考えてみれば、このMcBook Airでは「バックスラッシュ」も辞書登録していなかった(^_^;)。 さっそく、「\」を「ば」で登録した。 「\n\」というのが、以下のように「長い行を繋ぐ」のに使われるらしい。
nagasm-3:Desktop nagasm$ cat test.py
#! /usr/bin/env python3.3
hello = "This is a rather long string containing\n\
several lines of text just as you would do in C.\n\
    Note that whitespace at the beginning of the line is\
 significant."
print(hello)

nagasm-3:Desktop nagasm$ Python test.py
This is a rather long string containing
several lines of text just as you would do in C.
    Note that whitespace at the beginning of the line is significant.
nagasm-3:Desktop nagasm$ 
だんだん次第にPythonのテキスト関係の変態さが出て来たようで、3つ連結したダブルコーテーションとかシングルコーテーションの以下の使い方はもう、ほぼ変態である。(^_^;)
>>> print("""\
... Usage: thingy [OPTIONS]
...      -h                        Display this usage message
...      -H hostname               Hostname to connect to
... """)
Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to
>>> 
文字列の「+」での連結はJavaで驚いて知っていたが、かけ算は参った(^_^;)。 やはり変態っぽい気がするが、これを活用すると「F5連打」のようなサイト攻撃ツールは簡単になるのかな。
>>> word = 'Help' + 'A'
>>> word
'HelpA'
>>> '<' + word*5 + '>'
''
なんとPythonでは「+」ナシでも、文字列をただ並べていると自動的に連結してくれるという。 余計なお世話のようだが、さらに以下のように「+」との混在はややこしい(^_^;)。
>>> 'str' 'ing'                   #  <-  This is ok
'string'
>>> 'str'.strip() + 'ing'   #  <-  This is ok
'string'
>>> 'str'.strip() 'ing'     #  <-  This is invalid
  File "", line 1, in ?
    'str'.strip() 'ing'
                      ^
SyntaxError: invalid syntax
Maxの「zl」を思い出すが、文字列から配列のように適当な場所の文字を取り出す、以下のようなものもあるらしい。
>>> word = 'Help' + 'A'
>>> word
'HelpA'
>>> word[4]
'A'
>>> word[0:2]
'He'
>>> word[2:4]
'lp'
>>> word[:2]    # The first two characters
'He'
>>> word[2:]    # Everything except the first two characters
'lpA'
三河安城を出たあたりでますますPythonの変態度は上がってきた(^_^;)。 Pythonでは以下のように、なんとC言語のように文字列の変更(文字単位の代入)ができないのだ。
>>> word = 'Help' + 'A'
>>> word
'HelpA'
>>> word[0] = 'x'
Traceback (most recent call last):
  File "", line 1, in ?
TypeError: 'str' object does not support item assignment
>>> word[:1] = 'Splat'
Traceback (most recent call last):
  File "", line 1, in ?
TypeError: 'str' object does not support slice assignment
そこでということか、取り出した文字列を自在に連結することで新しい文字列を作るという事らしい。 以下のように、文字列を参照するポインタがマイナスでも機能するあたり、まぁ変態であろう。(^_^;)
>>> word = 'Help' + 'A'
>>> word
'HelpA'>>> 'x' + word[1:]
'xelpA'
>>> 'Splat' + word[4]
'SplatA'
>>> word[:2] + word[2:]
'HelpA'
>>> word[:3] + word[3:]
'HelpA'
>>> word[1:100]
'elpA'
>>> word[10:]
''
>>> word[2:1]
''
>>> word[-1]     # The last character
'A'
>>> word[-2]     # The last-but-one character
'p'
>>> word[-2:]    # The last two characters
'pA'
>>> word[:-2]    # Everything except the last two characters
'Hel'
>>> word[-0]     # (since -0 equals 0)
'H'
>>> word[-100:]
'HelpA'
>>> word[-10]    # error
Traceback (most recent call last):
  File "", line 1, in ?
IndexError: string index out of range
解説として「One way to remember how slices work is to think of the indices as pointing between characters, with the left edge of the first character numbered 0. Then the right edge of the last character of a string of n characters has index n.」とあり、以下の図があるが、こんなのとても覚えきれないぞ。(^_^;)
上の図の解説は「The first row of numbers gives the position of the indices 0...5 in the string; the second row gives the corresponding negative indices. The slice from i to j consists of all characters between the edges labeled i and j, respectively. For non-negative indices, the length of a slice is the difference of the indices, if both are within bounds. For example, the length of word[1:3] is 2.」という事である。 勝手にしろ、というカンジである(^_^;)。

名古屋駅で「のぞみ」に乗り換えての続きである。 この「文字列」のトピックの末尾には、以下のリファレンスへのリンクが並んでいる。 これを全部追いかけたら、山口に着いても終わらないので、あっさりとパスする事にした。

次は「3.1.3. About Unicode」であるが、これは興味ないのでパスである。 その次は「3.1.4. Lists」である。 これは数値も文字列もごった煮にした「配列」ということだろうか。 ここを外すことは出来ないので眺めてみたが、さすがPython、以下のようにかなり自由である。
>>> a = ['spam', 'eggs', 100, 1234]
>>> a
['spam', 'eggs', 100, 1234]
>>> a[0]
'spam'
>>> a[3]
1234
>>> a[-2]
100
>>> a[1:-1]
['eggs', 100]
>>> a[:2] + ['bacon', 2*2]
['spam', 'eggs', 'bacon', 4]
>>> 3*a[:3] + ['Boo!']
['spam', 'eggs', 100, 'spam', 'eggs', 100, 'spam', 'eggs', 100, 'Boo!']
>>> a[:]
['spam', 'eggs', 100, 1234]
>>> a
['spam', 'eggs', 100, 1234]
>>> a[2] = a[2] + 23
>>> a
['spam', 'eggs', 123, 1234]
>>> # Replace some items:
... a[0:2] = [1, 12]
>>> a
[1, 12, 123, 1234]
>>> # Remove some:
... a[0:2] = []
>>> a
[123, 1234]
>>> # Insert some:
... a[1:1] = ['bletch', 'xyzzy']
>>> a
[123, 'bletch', 'xyzzy', 1234]
>>> # Insert (a copy of) itself at the beginning
>>> a[:0] = a
>>> a
[123, 'bletch', 'xyzzy', 1234, 123, 'bletch', 'xyzzy', 1234]
>>> # Clear the list: replace all items with an empty list
>>> a[:] = []
>>> a
[]
お約束のlen()だけでなく、文字列のネスティングもPythonはアリだった(^_^;)。 これもMaxの「prepend」「append」を思い出す、リストの連結ももちろんOKである。
>>> a = ['a', 'b', 'c', 'd']
>>> len(a)
4

>>> q = [2, 3]
>>> p = [1, q, 4]
>>> len(p)
3
>>> p[1]
[2, 3]
>>> p[1][0]
2
>>> p[1].append('xtra')
>>> p
[1, [2, 3, 'xtra'], 4]
>>> q
[2, 3, 'xtra']
「のぞみ」が岐阜羽島を通過する頃になって、ようやく、「3.2. First Steps Towards Programming」にやってきた(^_^)。 さて、いよいよプログラミングだ。 最初の例はフィボナッチ数列の計算・表示であるが、ここで気になっていたインデントを再び試してみると、「while」のループ内で、「インデント無し」はエラーだったが、以下のように「スペース1個」「スペース2個」「タブ1個」「タブ2個」は全てOKだった。 ちょっと安心した。(^_^;)
nagasm-3:Desktop nagasm$ cat test.py
#! /usr/bin/env python3.3
a, b = 0, 1
while b < 10:
print(b)
a, b = b, a+b

nagasm-3:Desktop nagasm$ Python test.py
  File "test.py", line 4
    print(b)
        ^
IndentationError: expected an indented block

nagasm-3:Desktop nagasm$ cat test.py
#! /usr/bin/env python3.3
a, b = 0, 1
while b < 10:
 print(b)
 a, b = b, a+b

nagasm-3:Desktop nagasm$ Python test.py
1
1
2
3
5
8

nagasm-3:Desktop nagasm$ cat test.py
#! /usr/bin/env python3.3
a, b = 0, 1
while b < 10:
  print(b)
  a, b = b, a+b

nagasm-3:Desktop nagasm$ Python test.py
1
1
2
3
5
8

nagasm-3:Desktop nagasm$ cat test.py
#! /usr/bin/env python3.3
a, b = 0, 1
while b < 10:
	print(b)
	a, b = b, a+b

nagasm-3:Desktop nagasm$ Python test.py
1
1
2
3
5
8

nagasm-3:Desktop nagasm$ cat test.py
#! /usr/bin/env python3.3
a, b = 0, 1
while b < 10:
		print(b)
		a, b = b, a+b

nagasm-3:Desktop nagasm$ Python test.py
1
1
2
3
5
8

nagasm-3:Desktop nagasm$ 
print()の書式は以下のように、ほぼ一般的である。 これはまぁ、助かる。
>>> i = 256*256
>>> print('The value of i is', i)
The value of i is 65536
そして以下のように、フィボナッチ数列をもっとたくさん表示するために、なんとコンマを指定することが出来るらしい。 このあたりは、さすがPythonというところかな。 ちょぅど「のぞみ」は京都に着いて、このセクションは終わりである。
>>> a, b = 0, 1
>>> while b < 1000:
...     print(b, end=',')
...     a, b = b, a+b
...
1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,
いよいよ次章は「4. More Control Flow Tools」、プログラミングのための本格的な制御構造である。 まぁ、CでもJavaでもspinでも、幾種類となく触れて来たものなので、そんじょそこらの変態度では驚かないぞ(^_^;)。 最初は「4.1. if Statements」からである。 いきなり以下のように、Pythonでは「elif」という単語が出て来た。 うーーーむ、気持ちは判るけど・・・。
>>> x = int(input("Please enter an integer: "))
Please enter an integer: 42
>>> if x < 0:
...      x = 0
...      print('Negative changed to zero')
... elif x == 0:
...      print('Zero')
... elif x == 1:
...      print('Single')
... else:
...      print('More')
...
More
次は「4.2. for Statements」である。 いきなり「The for statement in Python differs a bit from what you may be used to in C or Pascal.」ということで、身構える。 Pythonでは、「for」は以下のように再帰的に使えるということであるが、これは、君子危うきに近づかず、という事になりそうである。(^_^;)
>>> # Measure some strings:
... words = ['cat', 'window', 'defenestrate']
>>> for w in words:
...     print(w, len(w))
...
cat 3
window 6
defenestrate 12

>>> for w in words[:]:  # Loop over a slice copy of the entire list.
...     if len(w) > 6:
...         words.insert(0, w)
...
>>> words
['defenestrate', 'cat', 'window', 'defenestrate']
次は「4.3. The range() Function」である。 これは知らないので、ちょっと楽しみだが、どうやら数値の領域について再帰的にやってくれる組み込み関数らしい。
>>> for i in range(5):
...     print(i)
...
0
1
2
3
4

>>> a = ['Mary', 'had', 'a', 'little', 'lamb']
>>> for i in range(len(a)):
...     print(i, a[i])
...
0 Mary
1 had
2 a
3 little
4 lamb
ここまでは判ったが、次のサンプルで悩んでいるうちに新大阪を過ぎた。 以下のように、ステップについて解説しているのだが、これを実行して表示できないのだ。(^_^;)
range(5, 10)
   5 through 9

range(0, 10, 3)
   0, 3, 6, 9

range(-10, -100, -30)
  -10, -40, -70
以下の最初の部分にあった現象で悩んでいるうちに、もう新神戸になった。 そして、さらに後の「In many ways the object returned by range() behaves as if it is a list, but in fact it isn’t. It is an object which returns the successive items of the desired sequence when you iterate over it, but it doesn’t really make the list, thus saving space.」と「We say such an object is iterable, that is, suitable as a target for functions and constructs that expect something from which they can obtain successive items until the supply is exhausted. We have seen that the for statement is such an iterator.」という解説で、ようやく以下のように「list()」を使って以下のように表示できた。
>>> print(range(10))
range(0, 10)

>>> list(range(5))
[0, 1, 2, 3, 4]

>>> list(range(5, 10))
[5, 6, 7, 8, 9]

>>> list(range(0, 10, 3))
[0, 3, 6, 9]

>>> list(range(-10, -100, -30))
[-10, -40, -70]
>>> 
新神戸を出て、次は「4.4. break and continue Statements, and else Clauses on Loops」である。 これもよくある制御系であるが、まぁbreakを使うというのは既に危ないのである(^_^;)。 Pythonの例は以下であった。
>>> for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...             print(n, 'equals', x, '*', n//x)
...             break
...     else:
...         # loop fell through without finding a factor
...         print(n, 'is a prime number')
...
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3
PythonではC言語と同様に、breakとともにcontinueというのに以下のように対応しているという。 僕はbreakはswitch()で使うだけで、ifでは使わないようにしているりで、continueを使った記憶はあまり無い。 これを使わないと絶対に書けないロジックはたぶん無いし、使わないに越したことはないだろう。
>>> for num in range(2, 10):
...     if num % 2 == 0:
...         print("Found an even number", num)
...         continue
...     print("Found a number", num)
Found an even number 2
Found a number 3
Found an even number 4
Found a number 5
Found an even number 6
Found a number 7
Found an even number 8
Found a number 9
次のトピックは「4.5. pass Statements」だという。 なんだこれは。 passとは、名前のように「何もしない」という。 以下の例を見ても、何もピンと来ない。(^_^;)
>>> while True:
...     pass  # Busy-wait for keyboard interrupt (Ctrl+C)
...

>>> class MyEmptyClass:
...     pass
...

>>> def initlog(*args):
...     pass   # Remember to implement this!
...
次は「4.6. Defining Functions」である。 なんだかSuperColliderを思い出す。 しかし、ここで岡山までの時間を費やして、どうやらPythonのバグにひっかかった(^_^;)。 ここにある以下のサンプルをコピペでなく、実際に実行させようとしても出来ないのである。
>>> def fib(n):    # write Fibonacci series up to n
...     """Print a Fibonacci series up to n."""
...     a, b = 0, 1
...     while a < n:
...         print(a, end=' ')
...         a, b = b, a+b
...     print()
...
>>> # Now call the function we just defined:
... fib(2000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
やってみると以下のようになるのである。 これは試してみると、以前にあったdefを使わないサンプルでも同様であった。
nagasm-3:Desktop nagasm$ cat test.py
#! /usr/bin/env python3.3
def fib(n):    # write Fibonacci series up to n
	a, b = 0, 1
	while a < n:
		print(a, end=' ')
		a, b = b, a+b
fib(2000)

nagasm-3:Desktop nagasm$ Python test.py
  File "test.py", line 5
    print(a, end=' ')
                ^
SyntaxError: invalid syntax

nagasm-3:Desktop nagasm$
Pythonのチュートリアルのサンブルとして載っている、つまり「出来る」はずのコードでエラーが出るのである。 あれこれリファレンスを探ってみると、以下のように、ちゃんとprint()の書式の中に、「end=' '」と記述できる筈なのに。
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)

Print objects to the stream file, separated by sep and followed by 
end. sep, end and file, if present, must be given as keyword arguments.

All non-keyword arguments are converted to strings like str() does 
and written to the stream, separated by sep and followed by end. 
Both sep and end must be strings; they can also be None, which means 
to use the default values. If no objects are given, print() will just write end.

The file argument must be an object with a write(string) method; if it is 
not present or None, sys.stdout will be used. Whether output is buffered 
is usually determined by file, but if the flush keyword argument is true, 
the stream is forcibly flushed.

Changed in version 3.3: Added the flush keyword argument.
・・・どうしてもこの部分が解決できないまま、新山口まであと1時間となった。 別に結果を横に並べて表示できなくても本質的には関係ないとはいえ、なんか気持ち悪い(^_^;)。 仕方ないので、以下のようにして、続けようと思い切るまでにiPadで数曲を聞いて気を落ち着けた。
nagasm-3:Desktop nagasm$ cat test.py
#! /usr/bin/env python3.3
def fib(n):    # write Fibonacci series up to n
	a, b = 0, 1
	while a < n:
		print(a)
		a, b = b, a+b
fib(2000)

nagasm-3:Desktop nagasm$  Python test.py
0
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597

nagasm-3:Desktop nagasm$ 
このdefine関数は、以下のように値を返すサブルーチンにもなる。 まぁ、これもよくあるものだ。 ただし以下については、Pythonのチュートリアルのサンブルと違う。 バグを発見したので、ちゃんと出るように直してある。(^_^;)
nagasm-3:Desktop nagasm$ cat test.py
#! /usr/bin/env python3.3
def fib2(n): # return Fibonacci series up to n
	result = []
	a, b = 0, 1
	while a < n:
		result.append(a)
		a, b = b, a+b
	return result

f100 = fib2(100)
print(f100)

nagasm-3:Desktop nagasm$ Python test.py
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

nagasm-3:Desktop nagasm$
ここで広島、あと新山口まで30分である。 次には「4.7. More on Defining Functions」ということで「4.7.1. Default Argument Values」とか「4.7.2. Keyword Arguments」とか「4.7.3. Arbitrary Argument Lists」とか「4.7.4. Unpacking Argument Lists」とか「4.7.5. Lambda Forms」とか「4.7.6. Documentation Strings」とか「4.7.7. Function Annotations」とか「Intermezzo: Coding Style」とかあったが、あまりソソラレなかったので華麗にスルーした(^_^;)。 これでこの章はおしまいである。

「のぞみ」が広島駅を出発するのと同時に「5. Data Structures」のセクションとなった。 最初は何故か補遺ということで「5.1. More on Lists」とあり、以下のようにリストに追加されるメソッドがずらりと並んだ。 こりゃコピペ整形するだけで新山口に着いてしまいそうであるが、たぶん重要なのでメモとして置いておこう。 Maxの膨大な「zl」ファミリと同じようなものかな。

以下がそのサンプルだという。 ただしコピペなので、実際に走らせたらバグがある可能性は排除できない(^_^;)。
>>> a = [66.25, 333, 333, 1, 1234.5]
>>> print(a.count(333), a.count(66.25), a.count('x'))
2 1 0
>>> a.insert(2, -1)
>>> a.append(333)
>>> a
[66.25, 333, -1, 333, 1, 1234.5, 333]
>>> a.index(333)
1
>>> a.remove(333)
>>> a
[66.25, -1, 333, 1, 1234.5, 333]
>>> a.reverse()
>>> a
[333, 1234.5, 1, 333, -1, 66.25]
>>> a.sort()
>>> a
[-1, 1, 66.25, 333, 333, 1234.5]
そして次は「5.1.1. Using Lists as Stacks」である。 なんだか、このあたりから次第にPythonの自由なデータ構造の変態世界に入っていきそうな予感がある(^_^;)。 以下がサンプルだというが、リストをスタックとして使うなんて、良い子はやってはイケナイのではないか。
>>> stack = [3, 4, 5]
>>> stack.append(6)
>>> stack.append(7)
>>> stack
[3, 4, 5, 6, 7]
>>> stack.pop()
7
>>> stack
[3, 4, 5, 6]
>>> stack.pop()
6
>>> stack.pop()
5
>>> stack
[3, 4]
この次は「5.1.2. Using Lists as Queues」である。 このあたりもまた、SuperColliderとかProcessingとかを思い出してしまう。 あまりデータ構造とかに凝ったことが無かった、と思い知らされる。
>>> from collections import deque
>>> queue = deque(["Eric", "John", "Michael"])
>>> queue.append("Terry")           # Terry arrives
>>> queue.append("Graham")          # Graham arrives
>>> queue.popleft()                 # The first to arrive now leaves
'Eric'
>>> queue.popleft()                 # The second to arrive now leaves
'John'
>>> queue                           # Remaining queue in order of arrival
deque(['Michael', 'Terry', 'Graham'])
次は「5.1.3. List Comprehensions」である。 一瞥すると、ここはちょっと厄介そうである。 ちょうど新山口もあと10分というところなので、ここで新幹線車中お勉強をオシマイにして、パソコンを仕舞うことにしよう。 これだけお勉強できるというのは、テンションが上がる出張ならではの醍醐味である(^_^;)。

2013年6月8日(土)

昨日は山口までの新幹線の中で十分にお勉強したので、湯田温泉では気持ちよく、行きつけのカラオケスナック「かもん」に行って17曲ほど熱唱した。 そしていよいよ、時間学会の初日である。 朝になってホテルで確認のためにプレゼンのKeynoteを起動してみると、何度やっても止まる(^_^;)というトラブルがあったが、どうやら研究室のパソコンで作ったKeynoteはこのMacBookAirでは走らないのであった。 多量のムービーを取り込んだのが敗因だったようだが、起動しないのでテキスト部分をレスキューする事も出来ず、どうせ用意したムービーはあるので、予稿の1ページPDFを表示するだけのプレゼン、と腹を括った(^_^;)。

そして今は、無事に好評のうちに午前のセッションで発表を終えて、山口大学の正門前にあるココイチで昼食を済ませて会場に戻ったところである。 時間学会の大会は初日の午後は一般公開のシンポジウムなので、その開始まで2時間近くあり、ちょっとだけでも昨日の続きでPythonをお勉強しておこう(そうすれば晩はまた「かもん」に行ける(^_^;))、という計画だ。 1画面しかないので、MacBookAirの画面は以下のように窮屈だが、まぁ仕方ない。

さて「5.1.3. List Comprehensions」であるが、これは配列を簡単に作り出せるものだという。 以下の例のように、最初に空白の配列を定義して、for文のループで再帰的にappendしている。

nagasm-3:Desktop nagasm$ cat test.py
#! /usr/bin/env python3.3
squares = []
for x in range(10):
	squares.append(x**2)
print(squares)

nagasm-3:Desktop nagasm$ Python test.py
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

nagasm-3:Desktop nagasm$ 
ただしこれは、以下のようにしても同様だという。 なんか凄い、これは半変態的である。
nagasm-3:Desktop nagasm$ cat test.py
#! /usr/bin/env python3.3
squares = [x**2 for x in range(10)]
print(squares)

nagasm-3:Desktop nagasm$ Python test.py
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

nagasm-3:Desktop nagasm$ 
上の「squares = [x**2 for x in range(10)]」というのは、「squares = list(map(lambda x: x**2, range(10)))」とやっても同じだが、より判りやすいだろう、と言っている。 まぁ、変態の自画自賛である(^_^;)。 そして、このかつての「Unixスクリプトオタク」の世界は、以下の例でもテキメンである。 以下の、上の方が論理を追いやすいが、これは以下の下の方でも出来る、という事らしい。
nagasm-3:Desktop nagasm$ cat test.py
#! /usr/bin/env python3.3
combs = []
for x in [1,2,3]:
	for y in [3,1,4]:
		if x != y:
			combs.append((x, y))
print(combs)
print([(x, y) for x in [1,2,3] for y in [3,1,4] if x != y])

nagasm-3:Desktop nagasm$ Python test.py
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

nagasm-3:Desktop nagasm$ 
なんだか、ツイッターになぞらえてトリッキーなスクリプトで複雑なサウンドを生成するSuperColliderのオタクを彷彿とさせる例であるが、ここもあまり近づかずに行きたい(^_^;)。 さらに、以下のような色々なテクニックも紹介されていた。
>>> vec = [-4, -2, 0, 2, 4]
>>> # create a new list with the values doubled
>>> [x*2 for x in vec]
[-8, -4, 0, 4, 8]

>>> # filter the list to exclude negative numbers
>>> [x for x in vec if x >= 0]
[0, 2, 4]

>>> # apply a function to all the elements
>>> [abs(x) for x in vec]
[4, 2, 0, 2, 4]

>>> # call a method on each element
>>> freshfruit = ['  banana', '  loganberry ', 'passion fruit  ']
>>> [weapon.strip() for weapon in freshfruit]
['banana', 'loganberry', 'passion fruit']

>>> # create a list of 2-tuples like (number, square)
>>> [(x, x**2) for x in range(6)]
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]

>>> # flatten a list using a listcomp with two 'for'
>>> vec = [[1,2,3], [4,5,6], [7,8,9]]
>>> [num for elem in vec for num in elem]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
以下の例は、πの小数点以下の精度を再帰的に増やしたものである。 あまりにトリッキーだが、これで出来るというのは素晴らしい。 (結果が長いので手作業で改行していることに注意)
nagasm-3:Desktop nagasm$ cat test.py
#! /usr/bin/env python3.3
from math import pi
print([str(round(pi, i)) for i in range(1, 13)])
nagasm-3:Desktop nagasm$ Python test.py
['3.1', '3.14', '3.142', '3.1416', '3.14159', '3.141593', '3.1415927', '3.14159265', 
	'3.141592654', '3.1415926536', '3.14159265359', '3.14159265359']

nagasm-3:Desktop nagasm$ 
そして次は「5.1.4. Nested List Comprehensions」ということで、多次元の配列、あるいは配列のネスティングである。 Maxのjitterは64次元配列なので、あまり驚くことはないのだが、完結にまとめる記述法の変態度はアップしている。 以下の2つは同じだという。
nagasm-3:Desktop nagasm$ cat test.py
#! /usr/bin/env python3.3
matrix = [
	[1, 2, 3, 4],
	[5, 6, 7, 8],
	[9, 10, 11, 12],
]
print(matrix)
print([[row[i] for row in matrix] for i in range(4)])

nagasm-3:Desktop nagasm$ Python test.py
[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

nagasm-3:Desktop nagasm$ 
そして最後の例として、以下の3つは全て同等だという。 同じことを色々に表現できるのがプログラミングなのだが、これはちょっとやり過ぎではないのか(^_^;)。
nagasm-3:Desktop nagasm$ cat test.py
#! /usr/bin/env python3.3
matrix = [
	[1, 2, 3, 4],
	[5, 6, 7, 8],
	[9, 10, 11, 12],
]

transposed1 = []
for i in range(4):
	transposed1.append([row[i] for row in matrix])
print(transposed1)

transposed2 = []
for i in range(4):
	transposed_row = []
	for row in matrix:
		transposed_row.append(row[i])
	transposed2.append(transposed_row)
print(transposed2)

print(list(zip(*matrix)))

nagasm-3:Desktop nagasm$ Python test.py
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]

nagasm-3:Desktop nagasm$ 
ようやく配列シリーズが終わり、次は「5.2. The del statement」である。 リストから特定の要素をdeleteすると、以下のようにちゃんとリストは縮んでくれる、という事のようである。
>>> a = [-1, 1, 66.25, 333, 333, 1234.5]
>>> del a[0]
>>> a
[1, 66.25, 333, 333, 1234.5]
>>> del a[2:4]
>>> a
[1, 66.25, 1234.5]
>>> del a[:]
>>> a
[]
また、「del a」とすれば、変数「a」そのものも抹消してくれるという。 この次の「5.3. Tuples and Sequences」は、リファレンスとして「Sequence Types ― list, tuple, range」を引け、という膨大なものだったので、以下の例をコピペするのみでパスである。「Tuples」というのは、数値とテキストとをまとめて一つの塊に扱うというようなものらしい。
>>> t = 12345, 54321, 'hello!'
>>> t[0]
12345
>>> t
(12345, 54321, 'hello!')
>>> # Tuples may be nested:
... u = t, (1, 2, 3, 4, 5)
>>> u
((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))
>>> # Tuples are immutable:
... t[0] = 88888
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'tuple' object does not support item assignment
>>> # but they can contain mutable objects:
... v = ([1, 2, 3], [3, 2, 1])
>>> v
([1, 2, 3], [3, 2, 1])
そして次は「5.4. Sets」、集合である。 なんとPythonでは、以下のように集合の要素の確認だけでなく、要素間の引き算(取り除く)などの演算も出来るらしい。
>>> basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
>>> print(basket)                      # show that duplicates have been removed
{'orange', 'banana', 'pear', 'apple'}
>>> 'orange' in basket                 # fast membership testing
True
>>> 'crabgrass' in basket
False

>>> # Demonstrate set operations on unique letters from two words
...
>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a                                  # unique letters in a
{'a', 'r', 'b', 'c', 'd'}
>>> a - b                              # letters in a but not in b
{'r', 'd', 'b'}
>>> a | b                              # letters in either a or b
{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
>>> a & b                              # letters in both a and b
{'a', 'c'}
>>> a ^ b                              # letters in a or b but not both
{'r', 'd', 'b', 'm', 'z', 'l'}
「list comprehensions」にあったように、以下のようなことも出来るという。 シェルでやったらエラーが出たのが謎だが(^_^;)、Pythonインタプリタで出来るので、まぁいいか。
>>> a = {x for x in 'abracadabra' if x not in 'abc'}
>>> a
{'r', 'd'}
次は「5.5. Dictionaries」である。 これは、要素ごとにインデックスを振った配列のようなものらしいが、まぁLinuxのプロセスだって同様にIDで管理しているわけで、よくあるものだし、以下の例を眺めていると、色々と使えそうである。
>>> tel = {'jack': 4098, 'sape': 4139}
>>> tel['guido'] = 4127
>>> tel
{'sape': 4139, 'guido': 4127, 'jack': 4098}
>>> tel['jack']
4098
>>> del tel['sape']
>>> tel['irv'] = 4127
>>> tel
{'guido': 4127, 'irv': 4127, 'jack': 4098}
>>> list(tel.keys())
['irv', 'guido', 'jack']
>>> sorted(tel.keys())
['guido', 'irv', 'jack']
>>> 'guido' in tel
True
>>> 'jack' not in tel
False
「dict()」というコンストラクタを使って、以下のように直接に辞書を作ることもできるらしい。
>>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
{'sape': 4139, 'jack': 4098, 'guido': 4127}
このdictの、「キーと値」のペア、という概念は以下のようにPythonで適用されている。
>>> {x: x**2 for x in (2, 4, 6)}
{2: 4, 4: 16, 6: 36}

>>> dict(sape=4139, guido=4127, jack=4098)
{'sape': 4139, 'jack': 4098, 'guido': 4127}
次は「5.6. Looping Techniques」であり、「item()」メソッドを使って、上述の辞書の全体にわたって再帰的にループを回せる。 とりあえず以下のような例を並べるだけで次に行こう。
>>> knights = {'gallahad': 'the pure', 'robin': 'the brave'}
>>> for k, v in knights.items():
...     print(k, v)
...
gallahad the pure
robin the brave

>>> for i, v in enumerate(['tic', 'tac', 'toe']):
...     print(i, v)
...
0 tic
1 tac
2 toe

>>> questions = ['name', 'quest', 'favorite color']
>>> answers = ['lancelot', 'the holy grail', 'blue']
>>> for q, a in zip(questions, answers):
...     print('What is your {0}?  It is {1}.'.format(q, a))
...
What is your name?  It is lancelot.
What is your quest?  It is the holy grail.
What is your favorite color?  It is blue.

>>> for i in reversed(range(1, 10, 2)):
...     print(i)
...
9
7
5
3
1

>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
>>> for f in sorted(set(basket)):
...     print(f)
...
apple
banana
orange
pear

>>> words = ['cat', 'window', 'defenestrate']
>>> for w in words[:]:  # Loop over a slice copy of the entire list.
...     if len(w) > 6:
...         words.insert(0, w)
...
>>> words
['defenestrate', 'cat', 'window', 'defenestrate']
あとトピックが2つ、と先が見えてきた。 「5.7. More on Conditions」では、以下の例だけを見てもまったく不明であるが(^_^;)。説明が長いのでパスである。
>>> string1, string2, string3 = '', 'Trondheim', 'Hammer Dance'
>>> non_null = string1 or string2 or string3
>>> non_null
'Trondheim'
そしてこの章の最後の「5.8. Comparing Sequences and Other Types」は、まさにPythonならではの変態的概念である。 配列同士を比較できる、と思い込むそのアイデアには脱帽である(^_^;)。 「 'C' < 'Pascal' < 'Python'」というのは面白いが。
(1, 2, 3)              < (1, 2, 4)
[1, 2, 3]              < [1, 2, 4]
'ABC' < 'C' < 'Pascal' < 'Python'
(1, 2, 3, 4)           < (1, 2, 4)
(1, 2)                 < (1, 2, -1)
(1, 2, 3)             == (1.0, 2.0, 3.0)
(1, 2, ('aa', 'ab'))   < (1, 2, ('abc', 'a'), 4)
ここまで来たところで、ぼちぼちシンポジウムの会場に移動することにした。 そこそこ、Pythonについての整理、という意味では進んだ、ということにしよう。

2013年6月9日(日)

時間学会の2日目である。 長期天気予想とは外れて、朝からかなり雨が降っているが、帰る頃には雲の切れ間になりそうである。 SLやまぐち号に乗る時に雨が上がっていることを期待しよう。 昨日は懇親会の後でまた「かもん」に行って、18曲ほど熱唱した。

午前中は時間学会総会で、東京都の猪瀬知事の「日本標準時を2時間早める」という無茶苦茶な提案に対して、時間学会としてそれは無茶苦茶だろう、と提言する案とか、来年の時間学会は九州の大牟田の近くで、というような事があった。 けっこうちゃんと議論していたので、あまり内職は出来なかったが、ようやく某総選挙の結果を知った(^_^;)。 電波が1本しか立っていないのの、モバイルWiFiルータは快適にネットと接続してくれているので、ふーみんとメイルでやりとりしていたPureDataをRaspberry Piに入れる、というアイデアに関連して、 ここ をブックマークして、とりあえず2種類あるというので これこれ をダウンロードしてみたが、どうも ここ の記述だと、「Pd vanilla (or simply Pd)」は「the core of Pure Data, mainly written by Miller Puckette, focusing on audio signal and MIDI processing」で十分かと思ったら、「Pd extended」は「a version of Pd vanilla that comes with many libraries written by the community. Pd extended can be used for graphics rendering (GEM library), OSC communications, binary file processing, audio-visual streaming, physical modeling, sensor-based performances, and much more」ということなので、OSCを使えるという意味で最終的には「Pd extended」の方がいいのかもしれない。

午後の一般発表の最初のセッションは、3件とも考古学とか論理学とか哲学の「濃い」もので、ある意味では内職タイム候補であるが、判らないなりに面白いのが時間学会の発表なので(^_^;)、なかなかPdに着手する気にはならない。 上のように、とりあえず解凍した2種類のPdを実行させて、メニューからヘルプを引いたところ、Pd extendedではヘルプをオンラインに取りに行くのに対して、Pd vanillaのHTMLヘルプはオフラインで完備していた。 ということは、Pd vanillaは浜松に帰る「のぞみ」の車内のネタとして好適かもしれない。

・・・と上に書いたのは午後イチであったが、ここを書いているのは新幹線「のぞみ」の車中、ちょうど岡山駅である。 予定は未定である、というのはまさに時間学会的な言葉であるが、やはり予定は予定であって未定だった。 午後の3番目のセッションの2番目の発表の途中で、予定通りに予約したタクシーで湯田温泉駅に行ったところまでは、水曜日に人間ドックがあるので、無駄な足掻きとはいえ帰途は飲まないつもりだった。 しかし、指定を取っていたSL「やまぐち号」のC571が来てみるとテンションが上がり(^_^;)、やはり新山口駅ではワインとかあれこれを仕入れて、美味しく飲みつつの帰途となった。

そこで、とてもPdを試す余裕はないのだが、せめて今回の出張は3日ともRaspberry Piに関連してPythonを勉強した、という足跡を残す意味で、岡山から乗り換えの新神戸までの30分に、少しだけでも進めることにした。 新しいセクションは「6. Modules」である。 Pythonインタプリタでは、入れたものが全て出ると消えているので、これをスクリプトファイルに書き出して利用する、ということらしい。 しかし、これは既にやってきてことだ(^_^;)。

# Fibonacci numbers module

def fib(n):    # write Fibonacci series up to n
    a, b = 0, 1
    while b < n:
        print(b)
        a, b = b, a+b
    print()

def fib2(n): # return Fibonacci series up to n
    result = []
    a, b = 0, 1
    while b < n:
        result.append(b)
        a, b = b, a+b
    return result
最初のサンプルとして、上のリストを「fibo.py」としてカレントディレクトリに保存した。 冒頭におまじないの「#! /usr/bin/env python3.3」を入れていないのがポイントかもしれない。 これを用意した上で、以下が実行できますよ、という事らしい。
nagasm-3:Desktop nagasm$ cat test.py
#! /usr/bin/env python3.3
import fibo
print(fibo.fib(300))
print(fibo.__name__)
fib = fibo.fib
print (fib(500))

nagasm-3:Desktop nagasm$ Python test.py
1
1
2
3
5
8
13
21
34
55
89
144
233
()
None
fibo
1
1
2
3
5
8
13
21
34
55
89
144
233
377
()
None
nagasm-3:Desktop nagasm$ 
そして「6.1. More on Modules」の「6.1.1. Executing modules as scripts」では、既にやっていたが、Pythonスクリプトを実行可能にする手法が紹介されていた。 次の「6.1.2. The Module Search Path」を読み流して、その次の「6.1.3. “Compiled” Python files」は、フト昨日から気になっていた重要なトピックである。 Pythonインタプリタ内ではもちろん、おそらくシェル(ターミナル)内で「Python test.py」とやった場合は、やはりPythonモジュールが呼び出されて、Pythonスクリプトファイルを読み込みながら逐次実行しているように気がしたのである。 BASICコンパイラのようにバイナリにコンパイルできないか、知りたかったのである。

Pythonプログラムについては、バイナリ実行形式に変換された場合には「.pyc」という拡張子が付くらしい。 ただしBASICコンパイラと違って、明示的に「****.pyc」を作る必要は無いという。 Pythonインタプリタに対して「-O」フラグを付けて「.py」プログラムを実行すると、自動でバイトコード(プラットフォームに依存しない)が生成されて、その後に「.pyc」が呼ばれれば実行できる。 エラーがあれば「.pyc」は出来ず、呼んでも暖かく無視されるらしい。 いくつか「エキスパートのためのトピック」というのが続いていたが、まぁここは深入り不要かな。

・・・ここはもう、新神戸で「のぞみ」から乗り換えた「ひかり」が京都から名古屋に向かう車中である。 既に250cc+180ccの美味しいワインと「晋三ちくわ(前面に安倍首相の顔(^_^;))」「ふぐの骨の唐揚げ」などをいただいている。 さて次の「6.2. Standard Modules」というのは、たぶんC言語の「stdio.h」みたいなものだろうか。 とりあえず以下のサンプルをコピペしたが、あまり関係なさげである。

>>> import sys
>>> sys.ps1
'>>> '
>>> sys.ps2
'... '
>>> sys.ps1 = 'C> '
C> print('Yuck!')
Yuck!
C>
次のトピック「6.3. The dir() Function」は、ビルトイン関数「dir()」であるが、以下を見ると、もう「ご馳走さま」である。
>>> import fibo, sys
>>> dir(fibo)
['__name__', 'fib', 'fib2']
>>> dir(sys)  
['__displayhook__', '__doc__', '__egginsert', '__excepthook__',
 '__loader__', '__name__', '__package__', '__plen', '__stderr__',
 '__stdin__', '__stdout__', '_clear_type_cache', '_current_frames',
 '_debugmallocstats', '_getframe', '_home', '_mercurial', '_xoptions',
 'abiflags', 'api_version', 'argv', 'base_exec_prefix', 'base_prefix',
 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats',
 'copyright', 'displayhook', 'dont_write_bytecode', 'exc_info',
 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info',
 'float_repr_style', 'getcheckinterval', 'getdefaultencoding',
 'getdlopenflags', 'getfilesystemencoding', 'getobjects', 'getprofile',
 'getrecursionlimit', 'getrefcount', 'getsizeof', 'getswitchinterval',
 'gettotalrefcount', 'gettrace', 'hash_info', 'hexversion',
 'implementation', 'int_info', 'intern', 'maxsize', 'maxunicode',
 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache',
 'platform', 'prefix', 'ps1', 'setcheckinterval', 'setdlopenflags',
 'setprofile', 'setrecursionlimit', 'setswitchinterval', 'settrace',
 'stderr', 'stdin', 'stdout', 'thread_info', 'version', 'version_info',
 'warnoptions']
この「dir()」で表示されるのは、ビルトイン関数でない「variables, modules, functions, etc.」の名前である。 ビルトイン関数の一覧を見たい場合には、以下の「builtins」を使うという。 うーーむ、この執着度はやはり、変態ではないのか。
>>> import builtins
>>> dir(builtins)  
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException',
 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning',
 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError',
 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning',
 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False',
 'FileExistsError', 'FileNotFoundError', 'FloatingPointError',
 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError',
 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError',
 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError',
 'MemoryError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented',
 'NotImplementedError', 'OSError', 'OverflowError',
 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError',
 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning',
 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError',
 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError',
 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError',
 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning',
 'ValueError', 'Warning', 'ZeroDivisionError', '_', '__build_class__',
 '__debug__', '__doc__', '__import__', '__name__', '__package__', 'abs',
 'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable',
 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits',
 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit',
 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr',
 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass',
 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview',
 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property',
 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice',
 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars',
 'zip']
次のトピックは「6.4. Packages」である。 Pythonでのバッケージとは、例えば「A.B」と記述したモジュールでは、AというパッケージのBというサブモジュール、という感じで使われるようである。 以下のようなサンプルで階層構造を解説していたが、これはまるでSuperColliderのデジャヴである。(^_^;)
sound/                          Top-level package
      __init__.py               Initialize the sound package
      formats/                  Subpackage for file format conversions
              __init__.py
              wavread.py
              wavwrite.py
              aiffread.py
              aiffwrite.py
              auread.py
              auwrite.py
              ...
      effects/                  Subpackage for sound effects
              __init__.py
              echo.py
              surround.py
              reverse.py
              ...
      filters/                  Subpackage for filters
              __init__.py
              equalizer.py
              vocoder.py
              karaoke.py
              ...
いきなり「sound」とかそそられるサンブルが出て来たが(^_^;)、まぁここも眺めて通り過ぎることにした。 このサブトピックとして「6.4.1. Importing * From a Package」と「6.4.2. Intra-package References」と「6.4.3. Packages in Multiple Directories」があったが、まぁ必要があれば後で参照することにしよう。 これで、速攻だが「6. Modules」の章も終わりである。 次の章は名前としては気になる「7. Input and Output」であるが、どうも標準入出力あたりらしい。 その後のサブセクションを最後まで並べると以下であるが、SuperColliderと似ている香りがするので、どうもこの教条主義はもう、トレースするほどの事も無さそうである。 新幹線はここで名古屋に着いた。今日はここまでかなぁ、とも思うが、ちょっと気になって、上の「12. What Now?」を見てみると、「続きはWebで」というのか、とりあえず「The Python Standard Library」を見よ、という事だった。 しかしこのリンクのヘルプは膨大だった(^_^;)。
    1. Introduction
    2. Built-in Functions
    3. Built-in Constants
        3.1. Constants added by the site module
    4. Built-in Types
        4.1. Truth Value Testing
        4.2. Boolean Operations ― and, or, not
        4.3. Comparisons
        4.4. Numeric Types ― int, float, complex
        4.5. Iterator Types
        4.6. Sequence Types ― list, tuple, range
        4.7. Text Sequence Type ― str
        4.8. Binary Sequence Types ― bytes, bytearray, memoryview
        4.9. Set Types ― set, frozenset
        4.10. Mapping Types ― dict
        4.11. Context Manager Types
        4.12. Other Built-in Types
        4.13. Special Attributes
    5. Built-in Exceptions
        5.1. Base classes
        5.2. Concrete exceptions
        5.3. Warnings
        5.4. Exception hierarchy
    6. Text Processing Services
        6.1. string ― Common string operations
        6.2. re ― Regular expression operations
        6.3. difflib ― Helpers for computing deltas
        6.4. textwrap ― Text wrapping and filling
        6.5. unicodedata ― Unicode Database
        6.6. stringprep ― Internet String Preparation
        6.7. readline ― GNU readline interface
        6.8. rlcompleter ― Completion function for GNU readline
    7. Binary Data Services
        7.1. struct ― Interpret bytes as packed binary data
        7.2. codecs ― Codec registry and base classes
    8. Data Types
        8.1. datetime ― Basic date and time types
        8.2. calendar ― General calendar-related functions
        8.3. collections ― Container datatypes
        8.4. collections.abc ― Abstract Base Classes for Containers
        8.5. heapq ― Heap queue algorithm
        8.6. bisect ― Array bisection algorithm
        8.7. array ― Efficient arrays of numeric values
        8.8. weakref ― Weak references
        8.9. types ― Dynamic type creation and names for built-in types
        8.10. copy ― Shallow and deep copy operations
        8.11. pprint ― Data pretty printer
        8.12. reprlib ― Alternate repr() implementation
    9. Numeric and Mathematical Modules
        9.1. numbers ― Numeric abstract base classes
        9.2. math ― Mathematical functions
        9.3. cmath ― Mathematical functions for complex numbers
        9.4. decimal ― Decimal fixed point and floating point arithmetic
        9.5. fractions ― Rational numbers
        9.6. random ― Generate pseudo-random numbers
    10. Functional Programming Modules
        10.1. itertools ― Functions creating iterators for efficient looping
        10.2. functools ― Higher-order functions and operations on callable objects
        10.3. operator ― Standard operators as functions
    11. File and Directory Access
        11.1. os.path ― Common pathname manipulations
        11.2. fileinput ― Iterate over lines from multiple input streams
        11.3. stat ― Interpreting stat() results
        11.4. filecmp ― File and Directory Comparisons
        11.5. tempfile ― Generate temporary files and directories
        11.6. glob ― Unix style pathname pattern expansion
        11.7. fnmatch ― Unix filename pattern matching
        11.8. linecache ― Random access to text lines
        11.9. shutil ― High-level file operations
        11.10. macpath ― Mac OS 9 path manipulation functions
    12. Data Persistence
        12.1. pickle ― Python object serialization
        12.2. copyreg ― Register pickle support functions
        12.3. shelve ― Python object persistence
        12.4. marshal ― Internal Python object serialization
        12.5. dbm ― Interfaces to Unix “databases”
        12.6. sqlite3 ― DB-API 2.0 interface for SQLite databases
    13. Data Compression and Archiving
        13.1. zlib ― Compression compatible with gzip
        13.2. gzip ― Support for gzip files
        13.3. bz2 ― Support for bzip2 compression
        13.4. lzma ― Compression using the LZMA algorithm
        13.5. zipfile ― Work with ZIP archives
        13.6. tarfile ― Read and write tar archive files
    14. File Formats
        14.1. csv ― CSV File Reading and Writing
        14.2. configparser ― Configuration file parser
        14.3. netrc ― netrc file processing
        14.4. xdrlib ― Encode and decode XDR data
        14.5. plistlib ― Generate and parse Mac OS X .plist files
    15. Cryptographic Services
        15.1. hashlib ― Secure hashes and message digests
        15.2. hmac ― Keyed-Hashing for Message Authentication
    16. Generic Operating System Services
        16.1. os ― Miscellaneous operating system interfaces
        16.2. io ― Core tools for working with streams
        16.3. time ― Time access and conversions
        16.4. argparse ― Parser for command-line options, arguments and sub-commands
        16.5. optparse ― Parser for command line options
        16.6. getopt ― C-style parser for command line options
        16.7. logging ― Logging facility for Python
        16.8. logging.config ― Logging configuration
        16.9. logging.handlers ― Logging handlers
        16.10. getpass ― Portable password input
        16.11. curses ― Terminal handling for character-cell displays
        16.12. curses.textpad ― Text input widget for curses programs
        16.13. curses.ascii ― Utilities for ASCII characters
        16.14. curses.panel ― A panel stack extension for curses
        16.15. platform ― Access to underlying platform’s identifying data
        16.16. errno ― Standard errno system symbols
        16.17. ctypes ― A foreign function library for Python
    17. Concurrent Execution
        17.1. threading ― Thread-based parallelism
        17.2. multiprocessing ― Process-based parallelism
        17.3. The concurrent package
        17.4. concurrent.futures ― Launching parallel tasks
        17.5. subprocess ― Subprocess management
        17.6. sched ― Event scheduler
        17.7. queue ― A synchronized queue class
        17.8. select ― Waiting for I/O completion
        17.9. dummy_threading ― Drop-in replacement for the threading module
        17.10. _thread ― Low-level threading API
        17.11. _dummy_thread ― Drop-in replacement for the _thread module
    18. Interprocess Communication and Networking
        18.1. socket ― Low-level networking interface
        18.2. ssl ― TLS/SSL wrapper for socket objects
        18.3. asyncore ― Asynchronous socket handler
        18.4. asynchat ― Asynchronous socket command/response handler
        18.5. signal ― Set handlers for asynchronous events
        18.6. mmap ― Memory-mapped file support
    19. Internet Data Handling
        19.1. email ― An email and MIME handling package
        19.2. json ― JSON encoder and decoder
        19.3. mailcap ― Mailcap file handling
        19.4. mailbox ― Manipulate mailboxes in various formats
        19.5. mimetypes ― Map filenames to MIME types
        19.6. base64 ― RFC 3548: Base16, Base32, Base64 Data Encodings
        19.7. binhex ― Encode and decode binhex4 files
        19.8. binascii ― Convert between binary and ASCII
        19.9. quopri ― Encode and decode MIME quoted-printable data
        19.10. uu ― Encode and decode uuencode files
    20. Structured Markup Processing Tools
        20.1. html ― HyperText Markup Language support
        20.2. html.parser ― Simple HTML and XHTML parser
        20.3. html.entities ― Definitions of HTML general entities
        20.4. XML Processing Modules
        20.5. XML vulnerabilities
        20.6. xml.etree.ElementTree ― The ElementTree XML API
        20.7. xml.dom ― The Document Object Model API
        20.8. xml.dom.minidom ― Minimal DOM implementation
        20.9. xml.dom.pulldom ― Support for building partial DOM trees
        20.10. xml.sax ― Support for SAX2 parsers
        20.11. xml.sax.handler ― Base classes for SAX handlers
        20.12. xml.sax.saxutils ― SAX Utilities
        20.13. xml.sax.xmlreader ― Interface for XML parsers
        20.14. xml.parsers.expat ― Fast XML parsing using Expat
    21. Internet Protocols and Support
        21.1. webbrowser ― Convenient Web-browser controller
        21.2. cgi ― Common Gateway Interface support
        21.3. cgitb ― Traceback manager for CGI scripts
        21.4. wsgiref ― WSGI Utilities and Reference Implementation
        21.5. urllib ― URL handling modules
        21.6. urllib.request ― Extensible library for opening URLs
        21.7. urllib.response ― Response classes used by urllib
        21.8. urllib.parse ― Parse URLs into components
        21.9. urllib.error ― Exception classes raised by urllib.request
        21.10. urllib.robotparser ― Parser for robots.txt
        21.11. http ― HTTP modules
        21.12. http.client ― HTTP protocol client
        21.13. ftplib ― FTP protocol client
        21.14. poplib ― POP3 protocol client
        21.15. imaplib ― IMAP4 protocol client
        21.16. nntplib ― NNTP protocol client
        21.17. smtplib ― SMTP protocol client
        21.18. smtpd ― SMTP Server
        21.19. telnetlib ― Telnet client
        21.20. uuid ― UUID objects according to RFC 4122
        21.21. socketserver ― A framework for network servers
        21.22. http.server ― HTTP servers
        21.23. http.cookies ― HTTP state management
        21.24. http.cookiejar ― Cookie handling for HTTP clients
        21.25. xmlrpc ― XMLRPC server and client modules
        21.26. xmlrpc.client ― XML-RPC client access
        21.27. xmlrpc.server ― Basic XML-RPC servers
        21.28. ipaddress ― IPv4/IPv6 manipulation library
    22. Multimedia Services
        22.1. audioop ― Manipulate raw audio data
        22.2. aifc ― Read and write AIFF and AIFC files
        22.3. sunau ― Read and write Sun AU files
        22.4. wave ― Read and write WAV files
        22.5. chunk ― Read IFF chunked data
        22.6. colorsys ― Conversions between color systems
        22.7. imghdr ― Determine the type of an image
        22.8. sndhdr ― Determine type of sound file
        22.9. ossaudiodev ― Access to OSS-compatible audio devices
    23. Internationalization
        23.1. gettext ― Multilingual internationalization services
        23.2. locale ― Internationalization services
    24. Program Frameworks
        24.1. turtle ― Turtle graphics
        24.2. cmd ― Support for line-oriented command interpreters
        24.3. shlex ― Simple lexical analysis
    25. Graphical User Interfaces with Tk
        25.1. tkinter ― Python interface to Tcl/Tk
        25.2. tkinter.ttk ― Tk themed widgets
        25.3. tkinter.tix ― Extension widgets for Tk
        25.4. tkinter.scrolledtext ― Scrolled Text Widget
        25.5. IDLE
        25.6. Other Graphical User Interface Packages
    26. Development Tools
        26.1. pydoc ― Documentation generator and online help system
        26.2. doctest ― Test interactive Python examples
        26.3. unittest ― Unit testing framework
        26.4. unittest.mock ― mock object library
        26.5. unittest.mock ― getting started
        26.6. 2to3 - Automated Python 2 to 3 code translation
        26.7. test ― Regression tests package for Python
        26.8. test.support ― Utilities for the Python test suite
        26.9. venv ― Creation of virtual environments
    27. Debugging and Profiling
        27.1. bdb ― Debugger framework
        27.2. faulthandler ― Dump the Python traceback
        27.3. pdb ― The Python Debugger
        27.4. The Python Profilers
        27.5. timeit ― Measure execution time of small code snippets
        27.6. trace ― Trace or track Python statement execution
    28. Python Runtime Services
        28.1. sys ― System-specific parameters and functions
        28.2. sysconfig ― Provide access to Python’s configuration information
        28.3. builtins ― Built-in objects
        28.4. __main__ ― Top-level script environment
        28.5. warnings ― Warning control
        28.6. contextlib ― Utilities for with-statement contexts
        28.7. abc ― Abstract Base Classes
        28.8. atexit ― Exit handlers
        28.9. traceback ― Print or retrieve a stack traceback
        28.10. __future__ ― Future statement definitions
        28.11. gc ― Garbage Collector interface
        28.12. inspect ― Inspect live objects
        28.13. site ― Site-specific configuration hook
        28.14. fpectl ― Floating point exception control
        28.15. distutils ― Building and installing Python modules
    29. Custom Python Interpreters
        29.1. code ― Interpreter base classes
        29.2. codeop ― Compile Python code
    30. Importing Modules
        30.1. imp ― Access the import internals
        30.2. zipimport ― Import modules from Zip archives
        30.3. pkgutil ― Package extension utility
        30.4. modulefinder ― Find modules used by a script
        30.5. runpy ― Locating and executing Python modules
        30.6. importlib - An implementation of import
    31. Python Language Services
        31.1. parser ― Access Python parse trees
        31.2. ast ― Abstract Syntax Trees
        31.3. symtable ― Access to the compiler’s symbol tables
        31.4. symbol ― Constants used with Python parse trees
        31.5. token ― Constants used with Python parse trees
        31.6. keyword ― Testing for Python keywords
        31.7. tokenize ― Tokenizer for Python source
        31.8. tabnanny ― Detection of ambiguous indentation
        31.9. pyclbr ― Python class browser support
        31.10. py_compile ― Compile Python source files
        31.11. compileall ― Byte-compile Python libraries
        31.12. dis ― Disassembler for Python bytecode
        31.13. pickletools ― Tools for pickle developers
    32. Miscellaneous Services
        32.1. formatter ― Generic output formatting
    33. MS Windows Specific Services
        33.1. msilib ― Read and write Microsoft Installer files
        33.2. msvcrt - Useful routines from the MS VC++ runtime
        33.3. winreg - Windows registry access
        33.4. winsound ― Sound-playing interface for Windows
    34. Unix Specific Services
        34.1. posix ― The most common POSIX system calls
        34.2. pwd ― The password database
        34.3. spwd ― The shadow password database
        34.4. grp ― The group database
        34.5. crypt ― Function to check Unix passwords
        34.6. termios ― POSIX style tty control
        34.7. tty ― Terminal control functions
        34.8. pty ― Pseudo-terminal utilities
        34.9. fcntl ― The fcntl() and ioctl() system calls
        34.10. pipes ― Interface to shell pipelines
        34.11. resource ― Resource usage information
        34.12. nis ― Interface to Sun’s NIS (Yellow Pages)
        34.13. syslog ― Unix syslog library routines
    35. Undocumented Modules
        35.1. Platform specific modules
これを追いかけるのは嫌である。 Raspberry Piをやりたいのであって、Pythonをやりたいのでは無いのだ。 うーーーむ。 悩みつつ新幹線は名古屋から浜松に向かっていた。

2013年6月10日(月)

新しい週となった。 5週で4つの週末の学会出張シーズンも


これ

で終わり、次は7月中旬のシリコンバレー(Sketching2013)行きまで、ずっとSUACである。 あれこれ懸案の製作プロジェクトも待機しているので、しばしRaspberry Piとはちょっと縁遠くなるかもしれない。 とりあえず昨日までにPythonをザッと粗く眺めたので、もう後は実際にテストのプログラミングに入る、という楽しいフェーズなのに(^_^;)。 このRaspberry Pi日記も既にplain textのHTMLで229KBに達して、過去のPropeller日記とかであれば優に2話分を越えているが、区切りがつくまではこのまま進めよう。

金曜日の出張間際にふーみんから届いていたRaspberry Pi関係のメイルも追いかけたいが、出張から帰って朝7時に研究室に出てみると、また新しいメイルが届いていた。 まず、KickStarterからの「Project Update #6: Clyde: An Expressive Lamp for Creative Homes by Amanda Williams」というメイルが届き、目標の45,000ドルに対して、残り62時間で123,000ドルと到達して、 Clyde is funded! という朗報であった(^_^)。 いずれ届くことになる。楽しみである。

そして、2限の「音楽情報科学」で時間学会の話題を紹介するために、 このページ を作っていると、またメイルが届いた。 卒業生の尾島さんからで、彼女は卒業して就職した後で、仕事をしながら通信制の大学で教職に挑戦していたのだ。 僕はその時に、大学に提出する推薦書を「指導教員」という立場で書いて応援した。 そして、仕事しながらという事で4年かかったものの、この春に遂に教職を取得したという。 嬉しい話で、ぜひ教員採用試験も頑張って欲しい(^_^)。

ここで2限の「音楽情報科学」の講義があり、午後になって、出張の疲れが出て少しウトウトした。 やはり、生体リズムが崩れるというのはいけないのだ(^_^;)。 そして5限には、アカペラ新人の1回生有志が補習特訓のアポを入れているので、残り30分ほどとなった。 先週金曜日に山口に出かける頃にふーみんから届いていた以下の2本のメイルのうち、後の方についてやってみよう。

急ぎじゃない方が答えやすいので先に・・・

Pdですが,
	sudo apt-get install puredata
で入るかと.ただ,midiやOSCはともかく,audioは使い物に
ならないかもしれません.正弦波出力すらまともにいかないので.

PythonのOSCは,
	sudo apt-get install python-txosc
で入ります.単純なやつは
	http://opensoundcontrol.org/implementation/python-simple-osc
にもあります.

Pd用のものは
	sudo apt-get install pd-osc
です.UDPから自分でライブラリを起こすのはあんまりお勧めしません・・・

=================

IDLEの方ですが,手元にMacがないのでなんとも不確かですが,
IDLEが見に行ってるPythonのpathを,新規にインストールした
pythonのものに書き換えるのが正しいやり方な気がします.

今のパッケージは依存関係やなんやらがややこしくなっているので,
IDLEとPythonを上書きインストールで入れ直すのが正道でしょう.

IDLEが参照するpythonのPATHが見つからない場合は,
「忘れてしまった」と書かれているシンボリックリンクが次善の策かと.
システムデフォルトのpythonのディレクトリを適当な名前に変更しておき,
	sudo ln -s (新しいpythonのトップディレクトリ)  (システムデフォpythonのトップディレクトリ)
で新しい方を見に行くと思うんですが…

ちなみにPythonではプログラムの可読性を上げるために
tabでインデントするというコーディング規則をmustにしています.
慣れるとこっちの方が格段に楽です.

#昔のアセンブラでもスペースじゃなくtabでニーモニック
#書かないと怒ったのがありましたよね....
後のメイルの「tabのインデントがmust」というのは、ちょうど新幹線の中での勉強で遭遇していた(^_^;)。 ほんの数日でも、直面していないともう忘却の淵だったが、なんとか以下のようにやってみたが、やはりIDLEは起動しかけては落ちた。
nagasm-Mac-mini:~ nagasm$ sudo ln -s /Library/Frameworks/Python.framework/Versions/3.3 
	/System/Library/Frameworks/Python.framework/Versions/2.6
Password:

nagasm-Mac-mini:~ nagasm$ 
やはり簡単ではなさそうだ。 ただし、山口出張の間のあれこれで、別にIDLEを使う必要性はない(コンソールからPythonインタプリタが起動できるし、外部Pythonスクリプトで走らせることも出来る)ので、こちらはそのまま放置でもあまり困らない気がする。 ぼちぼち学生が来る時間となり、とりあえず今日はここまでである。 明日は講義日、そして水曜日は人間ドックで潰れるので、遅々としたRaspberry Piになりそうである。

2013年6月11日(火)

先週は梅雨入りしたのに雨が降らなかったが、今週は梅雨前線に台風が近付いてきて、ほぼ雨のようである。 今日は1限に「サウンドデザイン」があり、4-5限の「企画立案演習」までの時間に、Raspberry Piでなく、「しゃみーず」のためのシステムに着手して、 こんなところ まで進んだ。 過去に色々なインスタレーション作品に活躍した「8チャンネル・タッチセンサ」を、改造三味線の3本の弦に見立てたアルミ針金に触れる検出に利用するのであるが、まったくセンサの情報を忘却していたので、まずは8系統のセンサ出力をオシロで見てみると、OPアンプでハイゲイン増幅するので、ハム(電源ライン)に同期した身体ノイズがPWMのように得られることが判った。 これを、新たにダイオードで整流して、105のコンデンサと100kΩの時定数で受けると、そこそこいいカンジに減衰(積分)したので、この電圧をセンサ出力としてArduinoに与えることにした。 ArduinoからはXBeeで飛ばして、それを再びXBeeで受けたArduinoのPWN出力を積分してアナログ電圧にして、それをGainerで受けてホスト(たぶな今回はFLASH)に与える、という壮大な連鎖の作戦である(^_^;)。

ところがここまで来たところで事務局からメイルが入り、「退職した教員のMacの引き取り手を募集」というのに手を上げていた、MaxBookAirがOKということであった(^_^)。 これは嬉しいことで、お仕事用に活躍しているMacBookAirのスペアというかもう1台あれば欲しかったのである。 さっそく受け取って上のように並べて、まずはOSXを10.6から最新の10.6.8に上げつつ調べてみると、以下のような事実が判明した。 左端がいつも出張用に使っていたMacBookAir、中央が今回受け取ったMacBookAir、右端が研究室のお仕事用Mac miniである。

ちょっとだけCPUクロックが低いものの、メモリもSSDも同じと判明したので、ソフトをほぼ同等にインストールする事にした。 この作業は今週いっぱい、続きそうである。 なんか今日の部分だけだとRaspberry Piが関係なさそうだが、実はこの新しいMacBookAirが加わったことで、今後、ArduinoもPropellerもRaspberry Piも、開発作業にこれを使うという意味で、大活躍しそうなのである。(^_^)

2013年6月12日(水)

今日は年に一度の人間ドックで、朝6時半に研究室に出て来て、8時5分に大学を出て8時10分には病院に付き、そこから最後の胃カメラまで午前の健診をしたら11時を過ぎて、いったん大学に戻ってから12時半に再び病院に行き、午後の健診と問診を終えて研究室に帰ってきたのは15時過ぎとなった。 結果はなんと、あれだけ飲み続けてきたのに去年から悪化したところもなく、さらにファットスキャン(内蔵脂肪CT)は去年の数値よりだいぶ良くなった。 あいからわずの運動不足なので、理由としては「食べ順ダイエット」しか考えられない。 まぁこれで、また一年、楽しく飲めそうで、テンションが上がった(^_^)。

そこで夕方、以下のように一気にRaspberry Piシステムの小型化という懸案をやっつけた。 ACアダプタの無駄な電線を短くして、さらにUSBケーブルをカットして3本束ねて、「3台のRaspberry Pi」システムがこんなにコンパクトになった。 これで、7月のシリコンバレーでのSketching2013に持っていけそうな気配が出て来た。 ハードだけ持っていっても仕方ないので、いよいよ「魂」を込めていかなくては。



そしてさらに、明日の1限にアポのある「しゃみーず」に関連して、 昨日の状態 から気合いを入れて、なんと こんなところまで 進めてしまった(^_^)。 もともと、Arduinoでアナログ入力をXBee経由でMacに送る、という、去年のイーギョンフン君のインスタの改造三味線から臓物を取り出してきいの再利用なので、ここまでは簡単なのだった。 無事にArduinoのファームウェアを発掘して再書き込みして、また読み出す方のMaxパッチは、Propeller日記でヨーロッパに持参したシステムのサブパッチを再利用したので、たった1時間でここまで出来たのである。

YouTube

ただしここからは新規となる。 Maxで受けるのでなくて、これをArduinoとXBeeで受けて、ArduinoのPWMでアナログ出力して、それをGainerで受ける、という部分なので、これはまったく新しいルートである。 新米のMacBookAirへのソフトウェアのインストールもあらかた出来たので、試運転として、この作業はMacBookAirでやろうかな。 これで5限の終わり時刻となった。 お楽しみ、今日はアカペラである。(^_^)


「Raspberry Pi日記」トップに戻る