トランジスタでNOT回路とNAND回路を作った

ArduinoRaspberry Piのデジタルピンはどういう仕組で読み書きをするんだろうと疑問からどんどん掘り下げていって、ちょうど手元にトランジスタがあるからこれで論理回路を作ってみよう、まずは一番簡単なNOTからやろう、と思ったらNOTだけで週末が終わってしまいました。

何につまずいていたかというと、データシートでどの足がゲートなのか確認したのだけども、図が「下から見た図」なのに「上から見た図」だと勘違いしていたのでトランジスタの向きが逆、というところでした。

↑このツイートの時点ではまだ上から見た図だと思い込んでいる。

首都大学東京の「情報通信特別講義」で話してきました

首都大学東京システムデザイン学部1-2年生配当科目「情報通信特別講義」で1時間半の講義をしてきました。

講義資料はアンケート結果をもらってから加筆して公開する予定です。

今回、複数人の講師による講義でした。

小町先生が他の講師の講義も含めて #tmutalks というタグでツイートしています。首都大学東京システムデザイン学部1-2年生配当科目「情報通信特別講義」 - Togetterまとめ

自分のTweetまとめ

講義の後の質疑・雑談や他の講師の話を聞いて、僕が違和感を持ったところ(僕の講義で使った「言語」で表現するなら「現実と自分の理解のギャップ」)について後からいくつかツイートしたので転載して加筆修正しておきます。

■「コネが大事」という言葉の真意について

「一言で要約すると、コネが大事」というような話が何度か出たのですけど、僕個人は「コネ」という言葉はあまり使いません。そのギャップが何から生まれたのか考えてみました:

僕が学生の頃「コネが大事」と言うオッサンは嫌いだった。自分がオッサンになって、彼らが何を伝えたかったかがわかるようになった。当時の自分の「コネ」という言葉の解釈と、彼らの「コネ」という言葉の解釈にズレがあったのだ、と今では考えている。

当時の僕は、「コネ」を「親がすごい」みたいな「運で決まるもの」と捉えていた。しかし、学生にアドバイスをするオッサンがそんな「本人の努力でどうにもならないこと」を重要だとか言うはずがない。彼らの言っているのは「努力で作ることができるコネ」のことだ。これはどうやって作られるか?

その作り方がこれ:「人と仲良く。過去に仲良くすると助けてくれるが、過去にいじわるすると跳ね返ってくる。」 自分が困ったときに助けてもらえる「コネ」は、ヘラヘラ笑いながら名刺交換していても作れない。自分から率先して人を助けることによって作られる。 https://t.co/LToipAZb7e

(参考: ギブ&テイクはギブから始まる 焼畑農業をやめるために---新卒準備カレンダー 2011春)

というわけでオッサンの言う「コネが大事」ってのは、当時の自分にわかりやすいように噛み砕くと「周りの人を助けることで、自分が困ったときに助けてくれる人を増やそう、それが大事」ということだと思うんだ。誰もそこまで噛み砕いて教えてはくれなかったが。


■「流行りものに飛びつこう」について

たぶん id:overlast さんの講演の中で語られたのであろう「流行りものに飛びつこう」という言葉について、これも「コネ」と同様にオッサンの中の解釈と学生の中の解釈がズレそうだなと思ったのでつらつらと書いてみました:

「流行りものに飛びつこう」も、割とハイコンテキストな言い方なのではないかと懸念している。「数学が大事」「より抽象度の高い知識ほど応用範囲が広い」というテーゼが通奏低音として流れていることを前提として、アンチテーゼとしてあえての「流行りものに飛びつこう」だよね?

抽象度の高い知識の方が応用範囲が広いから、年を取るに従ってそういう知識の重要度が上がる。オッサンたちは普段の生活の中でその必要性を痛感していて、だから学生に「大学の数学とか超重要」などといったアドバイスをする。一方で抽象的知識は経験と結びつかないと応用しにくい、それを学ぶモチベーションも維持しにくい。

それを踏まえて「流行りものに飛びつこう」は若者の戦略としては有用だ。経験を積み上げているオッサンと若者の戦いは基本的に若者が不利だが、流行りものはスタートラインの差が小さいから、体力や自由にできる時間の多い若者に有利になる。有利な土俵で勝つことで、注目や実績や人脈を(オッサンに取られる前に)奪い取る戦略は若者向きだ。

一方で、その「流行りもの戦略」での成功体験に囚われるとジリ貧になる。僕が最初に出した本はJythonの本で、本を出す実績を積んだ点は成功だったが、個人的には内容の陳腐化の速度が予想以上で、題材選択の失敗と解釈している。それが二冊目の題材選択に強く影響している。

(5年経っても陳腐化しないことを目指して書かれた「コーディングを支える技術〜成り立ちから学ぶプログラミング作法」のこと)

まあ「若者がオッサンと戦う上での戦略」みたいなことを言ったけど、33歳のオッサン当時に、流行りもののword2vecの本を出す話が来た時には「飛びついて実績を作る」戦略を選んだわけだなあ、今考えると。機械学習の広いテーマの解説だと機械学習自体が本業のPFNとかの人に蓄積の量でかなわないから、流行りもの戦略を採用した、と事後的には解釈できる。

話を少し戻すと「流行りものに飛びつこう」が若者の戦略として有用なのは対オッサン戦略としてだけではない。積み上げの少ない分野だから、他人のやってないことを実現するまでの時間が短い。注目の分野だからフィードバックを貰える確率も高い。つまり学習サイクルが速く回せる。

「学習のサイクルを速く回す」というコンセプトは、実は教育関係の本ではなく、意外かもしれないがベンチャーの経営に関する本で学んだ。「リーン・スタートアップ」だ。遡るとこれは経営戦略における派閥の一つで、その話はサイボウズ式の原稿に書いたのでそのうち公開される予定。

Raspberry Pi 2 B 日記

Facebookの友達限定公開でワイワイやってたんだけどブログにまとめろと圧力を掛けられたのでボチボチまとめていこうと思います。

最初に

Raspberry Pi 2 B & Raspbianです。その他の環境のことは知りません。以下でRasPiと書いた場合でもRaspberry Pi 2 Bのことを指します。

$ uname -a
Linux nishio 3.18.11-v7+ #781 SMP PREEMPT Tue Apr 21 18:07:59 BST 2015 armv7l GNU/Linux

用意すべきもの

「RasPiはキーボードやHDMIケーブル、モニターがなくても使える」は命題としては真です。デフォルトでsshdが動いているので、ユーザpi、パスワードraspberryでログインして使えます。僕もそれを真に受けて最初はその構成でいじり始めました。

ただし、sshdが起動しないようなトラブルが起きた瞬間、HDMIがないと問題の詳細を知るすべがなく、キーボードがないと設定を書き換えるすべがなく、「イメージを焼き直してゼロからやり直し」しか手がなくなります。

僕は結局、HDMIケーブルとUSBキーボードを用意しました。

Amazonベーシック ハイスピードHDMIケーブル 2.0m (タイプAオス - タイプAオス)

買って後悔したもの

AmazonでRasPiを見ると、一緒に良く買われているものとして以下の2つがおすすめされます。そうか、おすすめか、と何も考えずに買ってしまったのですけど、結局買ったことを後悔して別のものを買いなおしました。

microSD

TranscendmicroSDですが、しばらく使っているうちに以下のような現象が起こるようになりました。

  • イメージを焼きこんだ直後は問題なく動いているが、リブートするとカーネルパニック
  • イメージを焼きこんだ直後でも動かない

カーネルパニックの内容は「Unable to mount root fs」ブートローダが走った後rootをマウントしようとして失敗するというもの。その後、全く同じカーネルパニックを起こしている人のブログを発見し(Raspberry PiでSDカード相性が原因で起動エラーを繰り返す時の対処法 | 1ft-seabass.jp.MEMOmicroSDのハードウェアが原因である可能性を疑ってコンビニで売ってたmicroSDPanasonic class10 8GB RP-SMNB08GJK)に変えてみたらあっさり動いたのでTranscendmicroSDの問題である可能性が高いかと。

Transcendで同じカーネルパニックを起こし、ディスクの修復をしてイメージを焼きこんだ直後は動いたけども、リブートしているうちに動かなくなるというよく似た報告(Raspberry Pi死んだ - にるぽっぽ)ではTranscendを2枚ダメにしてから東芝に変えて、その後は再発してないようですね。

友人の意見:

  • とりあえずSandisk使え、ToshibaSandiskにしてから考えろ
  • Sandisk使ってる
  • Toshiba使ってる、FSが壊れることはあるがイメージを焼き直せば問題なく使える

今後はとりあえずSandiskを使うことにします。Raspberry Pi 2 推奨 16GB SanDisk MicroSDHC Card SDSDQUAN-016G-Z4A

USB Wifi

BUFFALOのWLI-UC-GNMEですが、最大消費電力が2.5Wです。

RasPi経験1日目はiPhoneについてきた1A(=5W)のACアダプタを使っていたのですが、ということは供給される電力の半分をUSB Wifiが消費してしまうということです。ちなみに上記microSDがリブートすると壊れる問題が発生したのはこのUSB Wifiを装着してからのことなので、これの電力消費が大きいことが原因になっているかもしれません。検証はしてません。

まあなんにせよ、触ってあまりの熱さにびっくりしたので1.3WのPLANEX 無線LAN子機 GW-USNANO2A (FFP)を買いなおしました。

ACアダプタ

上記の電力不足が上記microSD破損につながっている可能性があるという件、1AのACアダプタを使うのはRasPiを不安定にする可能性が高いと考えて、2.2Aのに変えました。妻が使っていたのを奪ったのでAmazonで同じ商品を見つけられないのだけどYAZAWAテーブルタップ型1AC+2USB2A 0.5m 黒 H3005BK2U2AのようなUSBポートのついてるACタップです。

追記: 10台以上のRasPiを運用している人から「Transcendを使っているけど問題が起きたことはない。電源はAnkerのを使っている」という情報がありました。Anker 20W 2ポート USB急速充電器 71AN7109-W2A

WindowsでのZeroconf

IPアドレスDHCPで振られる場合、それをどうやって特定するかが問題になります。RasPiではデフォルトでahavi-deamonが動いているのでZeroconfでraspberry.localを名乗ります。つまり「ssh pi@raspberry.local」でログインできるわけです。

ネットワークが固定なら、固定IPを振るという選択肢もなくはないですが、特にネットワークを移動する予定がある場合や、自分自身がネットワークの管理者ではない場合にはZeroconfの方が有用です。ちなみに、僕は家でいじりつつ、会社にもっていって無線LANにつなぎたいのです。

Macでは試してないですが、デフォルトでBonjourが動いているのでこれで名前解決ができるはずです。Windowsの場合、iTunesをインストールすることで名前解決ができるようになりました。

僕の環境では起動時に"avahi-daemon disabled because there is a unicast .local domain"とエラーメッセージを出してavahi-daemonが止まることがありました。妻が同じくらいの時間帯にMacbookAirを使っていたのでそれがunicast .local domainを作ったのかもしれません。/etc/default/avahi-daemonを以下のように書き換えて無視するようにしました。 see: Raspberry Pi avahi-daemon disabled because there is a unicast .local domain - solved - JackenHack

AVAHI_DAEMON_DETECT_LOCAL=1


同一ネットワーク内に複数のRasPiが存在しうる場合、名前で特定できなくなるので、/etc/hostnameと/etc/hostsを編集しておくべきでしょう。

Wifiの設定

ssh経由だけで使っている場合、ネットワーク設定を失敗してつながらなくなると「イメージ焼き直し」しか手がなくなるのでよくないです。僕は結局キーボードを調達しました。

オフィシャルの解説:Setting WiFi up via the command line - Raspberry Pi Documentation。日本語でも「Raspberry 無線LAN」とかで検索すればいくらでもヒットするかと思います。Adafruitの解説:Setting up Wifi with the Command Line | Adafruit's Raspberry Pi Lesson 3. Network Setup | Adafruit Learning System

/etc/network/interfacesにSSIDやパスワードを直接書いてしまうやりかた(以下、直書き)と、wpa_supplicantを使う方法とがあります。まずはwpa_supplicantで試しました。wpa_supplicantはRasPiでデフォルトでインストール済みです。

$ ps -ef | grep wpa
root 3239 1 0 14:28 ? 00:00:00 /sbin/wpa_supplicant -s -B -P /var/run/wpa_supplicant.wlan0.pid -i wlan0 -D nl80211,wext -c /etc/wpa_supplicant/wpa_supplicant.conf


この設定をやっていたころHDMIケーブルやキーボードがそろってなかったので詳細は検証していないのですけど、/etc/network/interfacesにはデフォルトでiface eth0 inet manualと書かれていて、Wifi設定時にこれを編集しないで残すとDHCPクライアントがエラーで起動せず、有線ごとつながらなくなったように思います。iface eth0 inet dhcpにすればOK。

「初回USB Wifiを刺した時にwlan0の項目が書かれる」という説明をよく目にしますが、wlan1ってインターフェイスもinterfacesに書かれていました。これを消さずに残してもDHCPクライアントがエラーで起動しないように思います。検証はしていません。

wpa_supplicantに詳細な情報を書く場合、当然ルータ側の設定と同一にする必要があります。SSIDがステルスでないなら、iwlist wlan0 scanでスキャンするのが良いと思います。で、こちらにスキャン結果と設定ファイルの書き方の対応表があるので参考にするとよいかと。Raspberry Pi • View topic - wpa supplicant config file

wpa_supplicantを使っていて無線LANがうまく動かない場合、まずはwpa_supplicantを使わない直書きの方法で試して、問題がwpa_supplicantにあるのかどうか問題を切り分けるのがよいでしょう。僕の場合は使わない方法で問題なくつながりました。

設定を変えたらrebootしろと書いてあるケースが多いですが、sudo ifdown wlan0; sudo ifup wlan0 とか sudo service networking restart でオンオフできます。

またwpa_supplicantは設定ファイルを変更すると数秒で自動的に読み直すはずで、手動だとwpa_cli reconfigureで設定リロードができます。一度、直書きでつながっている状態で設定リロードしたらエラーメッセージを表示してwpa_supplicantプロセスが死んでしまったので、上でps -efで確かめた際のコマンドラインオプションで起動しなおしました。

再起動するよりもコマンドラインからオンオフした方が、その後のDHCPの動きなど変更の結果が観察できて状況を理解しやすいと思います。

ケーブル直結

(書きかけです)

avahi_autoipd

シリアル接続

アナログデータを読む方法

解決編:kintone APIでレコードを更新しようとして"不正なJSON文字列です。"

PUTして"不正なJSON文字列です。"と怒られたので「JSON文字列として不正なのか?改行があるせい?マルチバイト文字列だから?」とキョドったけど{foo: {value: 'bar'}}とすべきところを{foo: 'bar'}にしていたことが原因だった。

Web+DB Pressで連載しています

今までの連載は2〜3か月遅れでgihyo.jpに掲載されています。: 「視点を変えてみよう

頂いたフィードバックが散らばるのはもったいないと思ったのでこちらでまとめていきたいと思います。

第1回

この件補足すると、書籍「組織パターン」にはゲートキーパーについての記述はなく、同じ著者による「生成的開発プロセスパターンランゲージ」でパターンとして紹介されています。gatekeepersという言葉は、今回のコラムで紹介したAllenの1969年の論文で使われている用語でもあります。「生成的開発プロセスパターンランゲージ」の参考文献からはAllenの1977年の論文へ言及がありました。

第2回

会話にACK(Acknowledgement)がありますか?会話をTCPプロトコルで説明している記事。
会話が苦手という人は読むと良いと思います。
WEB+DB PRESS vol.87 | 響雲

第3回


第4回

第5回

最終回

今日のしりとり

「xで始まってx+1で終わる5シラブルの単語」(濁音・半濁音は無視)

後払い→居候→盂蘭盆会→恵比須顔→応援歌→乾燥機→貴金属→腐りかけ→現代語→コンデンサ→桜飯→シロナガス→隙間風→全教祖→袖の下→太鼓持ち→地域別

続きはまた今度。

    • -

前回やった時「x→xの5シラブル」を全部列挙して「ワルシャワ」で終わったというおぼろげな記憶があったので「x→x+1」にしてみたら予想外に難易度が高かった。終わってから確認したら、前回やったのは文字数制限なしでの「x→x」だった。そもそもワルシャワは4シラブル。

Facebookの特定グループ内の会話を全バックアップした

Facebookは検索できなくて辛くて、kintoneに移行することにしたのだけども、でも「今までにFacebookに書いたあの情報、どこに書いてたっけ、こっちに転載したいんだけど」みたいなことが起きちゃうわけですよ。

粗削りな解決方法だけどとりあえずこんな感じ:

  • 右に出てる余計な通知divを削除
  • スクロールを繰り返して全スレッドを表示
  • スレッドが折りたたまれているのを展開するために下記コードを出力が0になるまで実行(非同期だからwhileで回すのできないし、本当はforEachもいきなり何十リクエストもパラで走るので良くないだろうなぁと思う)
  • PDFに印刷
var xs = document.getElementsByClassName('UFIPagerLink'); [].forEach.call(xs, function(x){x.click()}); console.log(xs.length)

100ページのPDFが出力されたりして大変だけど、一応検索はできるはずだ。

追記:投稿の本文が長い場合にダイジェストされているのも戻さないといけない。a.see_more_link。