長めの有給がはじまった

長い有給をもらえて来週は全部休みなので、温泉に行く予定。あんまり観光ポイントがないみたいなので、散歩したりしてゆっくりすごしたい。あと、N-Stylesさんの記事を眺めてたらガルパンの4DX見たい機運がたかまったので見にいきたい。温泉にいっても数日余裕があるはず。

他方、今やってる CourseraのMachine Learningの前半の山たるNeural Networkが今週と来週の範囲になってる。宿題がたいへんらしいのでじっくりやりたい。

奥さんが二日ほど出張してる間の生活が一気に破滅しておもしろかった。昨日は飲みにいってずっとビーダマンの話をしてたし、今日は同僚のアニソンDJ聞きながらめっちゃ良いってずっといってた気がする。そういえばビーダマンは明日届く。

ビーダマン買った

ひとでくんのアドバイスで日々の日記もここに書いていきます。

会社でビーダマンが流行り過ぎていて、なつかしくなって僕も買ってしまった。三人兄弟で一度に三つくらい買ってもらうことが多くてそこそこビーダマン持っていた気がする。

買ったノーチラスポセイドンは大量のビー玉を装填して連写できてプレイパリューが高くて楽しいやつ。本体はヒールっぽい見た目なんだけど、とにかくバックパックがかっこいいので会社に勢ぞろいするはずの別のかっこいいビーダマンに装着して遊びたい。

手を動かして電子工学を学ぶ

このエントリは、はてなデベロッパーアドベントカレンダーの20日目のエントリです。昨日の記事は id:aereal さんの連打を支える技術でした。明日の記事は id:astj さんです。

最近はWeb技術以外にもできることを増やそうと考えて、電子工学に入門しています。ほとんど何もしらないところからの入門ですから、理論を学びつつ手を動かして何か作ってみる作戦でいきたいところです。 しかし、自分の場合、手を動かすために丁度良い課題に取り組みたいものの、何をやればまったくわかりませんでした。

こんな風に困ってしまうことは、0から電子工学に学びはじめたい人にとっては、よくあるのではないでしょうか。そこで、このエントリでは、電子工学をはじめる人がとりあえず何か手を動かして学ぶための方法をご紹介したいと思います。

TL;DR

Make: Electronics ―作ってわかる電気と電子回路の基礎を読み、紹介されている実験をやってみましょう。実験に必要な道具や部品を簡単に購入するためのリストを作ったので参考にしてみてください。完。

Make: Electronics ―作ってわかる電気と電子回路の基礎 ((Make:PROJECTS))

Make: Electronics ―作ってわかる電気と電子回路の基礎 ((Make:PROJECTS))

とはいえ、これだけではあんまりなので、もう少し以下のことについて詳しく紹介します。

  • どういうスタンスの本か
  • 実際にどんな実験ができるか
  • 本をスムーズに読みすすめ、実験を実施するためのアドバイス
  • どういうことができるようになるか

"発見による学習" を目指した本

書籍の紹介にもあるようにこの本はとにかくまず手を動かして部品を組み立て、動かしてみることに重点を置いています。 本文の中心は実験のレシピで、実験の合間合間にコラムがあって理論について詳しく説明してくれます。実験をして何が起こったかを見た後、なぜそのようになったかを理解できるような構成です。

道具や部品の購入の仕方の解説も充実しています。各章には、"ショッピングリスト"というコーナーがあって、何を買う必要があるか具体的に紹介してくれます。実験を進めながら、道具や部品をそろえていくと、普段の電子工作をするには十分な装備が整います。

手を動かしながら、電子工学を学びたいひとにはぴったりの内容です。

実際にできる実験

実験は基本的なオームの法則を確かめるところからはじまり、LEDを点灯させたり、スイッチやリレーについて学びます。もうすこし進むとトランジスタを使ってみたり、555タイマーと呼ばれるICをつかった実用的な回路の作成に取り組みます。4章までの基本変ではデジタルICを使ってみるところまでを学びます。目次も見てください。

ちなみに、一番はじめの実験は、"電気を味わえ!"です。9Vの四角い電池の端子をなめて、その味をたしかめます。結構ピリっとします。LEDをありとあらゆる方法でぶっこわしたり、可変抵抗を分解して構造を調べたりする結構激しい実験もあって楽しいです。

どのような実験ができるか具体的なイメージが湧くよう、いくつか実際に組み立てた回路をご紹介します。すべて本のレシピのとおりに組んだ回路です。

オームの法則をたしかめる

はじめはこういう素朴な回路を作ります。左の四角い箱は電池ボックスです。テスターを使って電流や電圧を測って、ふむふむちゃんとオームの法則の通りだなっていうのを確かめます。



リレーによる発信回路(うるさい音がなります)

スイッチを押している間、リレーがONとOFFを繰り返す回路です。カチカチとリレー内部の物理スイッチが切り替わる音がします。コンデンサをいれないとスイッチが高速に反応しすぎて放っておくとリレーが壊れます。透明のリレーを買ってくると、中の様子がみれておもしろいです。


555タイマによるトーン生成(うるさい音がなります)

555という名前の便利なICを使った実験がいろいろのっています。これは555でトーンを発生させてスピーカーで聞く実験です。手に持っている可変抵抗のボリュームをまわすと音の周波数が変化します。


7セグメントLEDの点灯

4026という7セグLED用のデジタルICを使って7セグメントのLEDを点灯しています。555タイマを使って次々と数字をカウントアップするようにしてあります。

ぱっと見では複雑に見える回路もまじっていますが、理解しながら順番にすすめていくと、それほど難しくないような構成になっています。

スムーズに実験を行うためのアドバイス

基本的には本に書かれたレシピ通りに道具や部品をそろえ、手順通りに組み立てれば、スムーズに実験が行えるようになっています。しかし実際に道具や部品を揃えようとすると少し注意することがあります。具体的には以下のようなことです。

部品の仕様の意味を先に理解する: 部品の仕様の意味がわからないと、本を読みすすめる前に先に部品をまとめて購入しようとすると困ります(電子部品の通販は送料が必要なことが多いのでまとめて購入したくなります)。何の知識もない状態で、ノンラッチのDPDTのリレーを購入せよといわれても厳しいものがあります。ショッピングサイトにはDPDTではなく双極双投と表示さていることもあります(同じ意味です)。つまり、本文を先にちょっと読んで部品の種類が区別できるようになってから買い物をするとスムーズです。

手に入り難い部品や道具がある: この本初版が2010年で少し古いことと、元々アメリカで読まれることを前提にしているため手に入らない部品があります。手に入らないものは仕方ないので、いくつかの実験はあきらめることになります。幸いそれほど手に入らない部品はありませんでした。自分の場合は74LSシリーズのデジタルICが手に入らず実験23をあきらめることにしました。

必ずしも購入しなくても良い部品や道具がある: まず、スキップ可能な実験があります。自宅用の警報装置を作るという実験があるのですが、必要なければ回路だけ試してみてケースなんかは作らないで進めることができます。そうすると、穴開けドリルやホビー用のこぎりは買わずに済みます。また、この本は一通りの電子工作をするのに十分な道具を用意していく流れになっています。なので、ミニマムで済まそうとすれば買わなくて良い道具もあります。例えばヒートガンはすぐに買わなくても、当分はドライヤーで代用できます。

自分としては、回路を組んだり理解するよりも、部品を買うほうが知らないことだらけで大変でした。

Make: Electronicsの実験のための部品リスト

部品を買うのはなかなか結構大変でしたので、僕が実際に Meke: Electronicsを読むのにあたって購入した部品リストを公開したいと思います。

Make: Electronics の 1 ~ 4 章のショッピングリストに対応しています。それぞれ、購入すべきかどうかの判断と実際に購入したもののURL(あれば)などをまとめています。ぜひご活用ください。(自分で部品を買うとそれはそれで体力は付きそうなので、チャレンジしてみてもよいと思います。)

以下の点にご注意ください。

  • 購入すべきかの判断は目安程度にどうぞ。メモもご参照ください。
  • 私が購入しなかったものは部品の例を掲載していません。
  • 部品の例のURLは、前半は主に共立エレショップ、後半は主に マルツのものを掲載しています。理由は、一部の部品が特定のショップでしか販売してなかった(2N6027 トランジスタ -> 共立エレショップのみ, 4026十進カウンタ -> マルツのみ)のと、その部品を購入するときにまとめて他の部品も購入したかったためです。他のショップのほうが安い場合(特に秋月)もあると思いますので、適宜ご検討ください。
  • もっと良い部品があるなど耳寄り情報、ツッコミどころなどがありましたらぜひ教えてください!

ちなみに買い物の合計額は4万円をこえているので結構迫力のある額です。自分でまとめてみてまじかってなっています...。節約テクはいろいろあるかもしれません。

できるようになったこと

この本をひととおり読んだ知識を生かして、先日行なわれたはてなの開発合宿では、ESP8266というWiFiモジュールを使ったデバイス作成にチャレンジし、なんとか形のあるものを作ることができました(チームメンバーに多分に助けてもらいましたが!)。

f:id:hakobe932:20151204110908j:plain:w480

Splatoonをしすぎて断線した Wii U GamePadの電源ケーブルを修理できるようにもなりました。

まとめ

手を動かして電子工学を学ぶためにぴったりの書籍として、Make: Electronics ―作ってわかる電気と電子回路の基礎をご紹介しました。また、実際の実験の様子や本を読む際の注意点や便利なショッピングリストもご紹介しました。

コンピュータサイエンスやWeb開発の技術だけでも無限に学ぶことはありますが、時にはお隣の分野の電子工学などを学んでみても、自分のできることの範囲が広がり、よりおもしろいことができるようになるかもしれませんね。正月休みなどにぜひ取り組んでみてください!

アクターによる並行処理アーキテクチャの解説

社内勉強会でアクターによる並行処理アーキテクチャについて解説した時の資料です。しれっと公開してあった資料に思いの外ブクマがついていたのに気付いたので、せっかくなのでこちらにも掲載しておきます。

既存技術の解説なのでアクターについて知っている人にとって新しい情報はないと思います! 特に何ベントカレンダーでもないです。



今後Erlang使うの?

Erlang VMの運用ノウハウなさすぎるので、すぐ使おうという機運はなさそう。ScalaのAkka Actorが十分実用的なアクターシステムらしいし、Scalaは導入済みなのでそちらのほうが有力な選択肢になるか。アクターシステムではないが、goでも近いことはできるのでさくっと並行処理システムを構築するには良いと思う。趣味ならElixirつかいたい。

参考文献

良い資料がいろいろあって、多分に参考にさせていただいています。ながめると理解が深まるかもしれません。

Erlangのプロセスの実装については以下がくわしいです。

さらに理解を深めたければ以下の資料が参考になります

すごいErlangゆかいに学ぼう!

すごいErlangゆかいに学ぼう!

Java並行処理プログラミング ―その「基盤」と「最新API」を究める―

Java並行処理プログラミング ―その「基盤」と「最新API」を究める―

関西2015年秋アニメ 放送時間まとめ

今期も関西における今期のアニメの放送状況を表にまとめました。いつもどおりしょぼいカレンダーのデータを利用させていただいています。ありがとうございます。予約設定時の確認などにお役立てください。

今期の関西最速はなんと1作品となりました...。近年では放送時間の地域差が少なくなってきているので、Twitterなどでおなじ時間に盛り上がれてよいのですが、それはつまり関西最速もへってしまうということなので、複雑です。さて注目の関西最速は以下の作品です。

進撃!巨人中学校実写映画などでも最近話題の進撃の巨人のスピンオフ作品です。メインのストーリーとは無関係のパラレルワールドが舞台です。こういった作品もアニメ化、しかも関西最速ということで、MBSの力がはいっていることが伺えますね。

関西最速作品以外にもガンダムの新作やワンパンマン、ご注文はうさぎですか??等個人的に気になる作品ももりだくさんです。それでは関西のみなさん今期も頑張りましょう。

関西2015年秋アニメまとめ

これより↓の部分はherokuが動いていないと表示されないかもしれません...。


YAPC::Asia Tokyo 2015 に参加した #yapcasia

今年はトーク応募もしなかったのだけど、最後のYAPCということではりきって参加してきた。

トークで印象に残ってるのは、kazuhoさんのHTTP/2時代のウェブサイト設計と、Brad FitzpatrickさんのProfiling & Optimizing in Go

kazuhoさんのトークはだいたい毎年聞かせていただいてる気がする。今年の発表もとても丁寧で、HTTP2で何が良くなるのか、といった点をわかりやすく説明していただいて合点がいった。ダウンロードすべきリソースの数をなるべく減らすようなテクニックがHTTP2時代にはむしろ避けるべきであるというような知見は、アプリケーションエンジニアとっても必要だと感じた。

Brad Fitzpatrickさんの発表は、ライブコーディング形式で、有名ハッカーのコーディングの様子がみれて有益だった。Goのデバッギング/プロファイリングはちょっとやったことあるんだけど、Brad Fitzpatrickさんが何かする度に知らないテクニックが披露されて、めちゃくちゃためになった。mackerel-agentを作ってるときにメモリリークがないかをがんばって調べたことがあったので、メモリリークを検知する良い方法がないかを質問してみたりした。昔調べてやってた方法がそんなにはずれてなかったぽくて安心した。

一日目、YAPC::Asia 2007のTシャツをきていたら、Brad Fitzpatrickさんには「そのTシャツぼくももってるよ! 明日着てくる予定さ!」的なことを話かけられてびっくりした。着て来てよかった。

YPACにはじめて参加したのが2007年で、当時は学生だった。その時はほとんど知り合いとかいなかった。YAPCのコミュニティにあこがれて、がんばってPerlを勉強したり、Plaggerのプラグイン書きまくったりして、すこしづつWeb界隈の知り合いもふえて、そのうちコミュニティの雰囲気もわかってくるようになった。そのつながりで、はてなインターンに参加したりしたあとはてなに入社したりしてる。YAPCでは、通常トーク2回、LTも2回発表させていただくことができて、ほんとうに良い経験になった。1000人いるところでLTする経験まじでないので、度胸がついたと思う。

miyagawaさんもYAPCあるあるのセッションでたぶんおっしゃっていたと思うんだけど、自分にとってもYAPCやPerlのコミュニティはエンジニアとしての原点かなーと思う。今参加すると、知ってる人が大勢いて本当に同窓会みたいで、今年で終わってしまうのが、なごりおしい。

僕がWebエンジニアとして楽しく毎日やれてるのも、YAPCあってのことです。2006年から2015年にいたる関係者のみなさま、本当にありがとうございました。

Goによるプライベートネットワークへのアクセスを禁止するHTTPクライアントの実装

クローラのように、ユーザからの入力に応じて任意のURLにHTTPリクエストを発行するソフトウェアは、誤ってプライベートネットワークへのリクエストを処理しないようにする必要があります。悪意のあるユーザが故意にプライベートなネットワークに対してリクエストして、内部情報にアクセスするといった攻撃を行う可能性があるからです。

PerlではLWPx::ParanoidAgentLWPx::ParanoidHandlerといったモジュールが便利です。これらのモジュールは、リクエスト先のURLをチェックしてプライベートネットワークへのリクエストを禁止してくれます。単にIPアドレスをチェックするだけでなく、ホスト名をDNSで解決して得られたIPアドレスをチェックしたり、リダイレクト先のURLをチェックしたりしてくれます。まさに偏執的です。

このLWPx::ParanoidAgentと同様の機能をもったGoのライブラリを実装しました。

github.com

ParanoidhttpはGoの標準ライブラリのnet/httpで提供されているhttp.Clientのparanoidなバージョンを作ってくれるファクトリです。以下のように利用できます。

// DefaultClientを利用すると簡単に利用できます(http.DefaultClientと同じ設定です)
res, _ := paranoidhttp.DefaultClient.Get("http://www.hatena.ne.jp")

// プライベートネットワークへのアクセス時にはエラーが返ります
_, err = paranoidhttp.DefaultClient.Get("http://192.168.0.1")

// attackers-host.net がプライベートネットワークのIPに名前解決されたり、
// プライベートネットワークにリダイレクトされてもエラーになります
_, err = paranoidhttp.DefaultClient.Get("http://attackers-host.net")

// 自分でhttp.Clientを作ってカスタマイズもできます
// 内部で利用されるhttp.Transportやhttp.Dialerのオブジェクトも返却されるので
// 同様にカスタマイズできます
client, transport, dialer := paranoidhttp.NewClient()
client.Timeout = 10 * time.Second
transport.DisableCompression = true
dialer.KeepAlive = 60 * time.Second

便利ですね。

実装的には、http.Tranportをラップしてリクエスト時にリクエスト先のホストをチェックしています。URLのホストがIPアドレスでない場合はDNSに問い合わせてIPアドレスを取得してチェックします。

とにかく使いたい機能だけを実装したという感じで以下のような制限があります。

  • ブラックリスト/ホワイトリスト機能がない
  • 名前解決時のタイムアウトが設定されてない(OSのリゾルバのタイムアウトに依存してる)
  • 名前解決にかかる時間がhttp.Clientのタイムアウトに含まれない
  • IPv6に対応してない(よくわからないのでIPv6では接続できないようにしてある)

がだいたい問題ないと思います。必要あればissueたてたり、PullRequestをおねがいします。一応実環境でも使っています。

以上、どうぞご利用ください。

追記

TOCTOU攻撃に対して脆弱であるとの指摘をいただきました。ホストやIPの安全性チェックの直後に、DNSレコードを変更するような操作によって、危険なIPアドレスへのアクセスをひきおこす可能性がありました。

Goによるプライベートネットワークへのアクセスを禁止するHTTPクライアントの実装 - はこべブログ ♨

外部で名前解決してアドレスチェックしてから、HTTPライブラリ内でもう一度名前解決してるようにみえる / Dialer実装内での名前解決を「置き換える」形で実装しないとTOCTOU攻撃が可能になるのでよくない / 修正された

2015/08/05 10:36
b.hatena.ne.jp

指摘をうけて修正しました。ありがとうございます!