@camelmasa さんから、誕生日に HHKB Pro2(墨)が届きました
KOBA789です。先日18歳になりました。
誕生日にアマゾンのほしい物リストを SNS に放流してました。そうしたら、@camelmasa さんからリプライが。
@KOBA789 こばくんに投資した。(wishlist的な意味で)
2013-08-09 11:05:20 via web to @KOBA789
@camelmasa マジすか! ありがとうございます!!!!
2013-08-09 11:07:24 via twicca to @camelmasa
@KOBA789 誕生日おめでとうございます :D
2013-08-09 11:08:18 via web to @KOBA789
そしてほしいものリストを確認する俺。HHKB Pro2 が消えている……!?
@camelmasa て、え、もしやものすごく高価なものを……なんか申し訳ないです。でも、ありがとうございます!!
2013-08-09 11:08:42 via twicca to @camelmasa
結構焦りました。
そして今日。
届きました! @camelmasa さん、ありがとうございます!
これで大学入試のための自己推薦資料を書こうと思います。また機会があればちゃんとお返しもしようと思います。何度も繰り返して恐縮ですが、@camelmasa さん、本当にありがとうございます!!
ATmega328Pを内部発振でArduino化して便利に使う
最近 AVR(ATmega328P)でいろいろ作ってたので、そのときに学んだことをまとめておきます。
ATmega328Pを内部発振で動かせば水晶発振子は必要はありませんし、Arduino化すれば、Arduino IDE やそのライブラリが使えるのでとっても便利です。
ひつようなもの
準備
1
ATmega328P を基盤なりブレッドボードなりに実装。ISP 端子も実装しましょう。んで電源を接続する。(後述する AVR ISPmkII は 5V を供給してくれない)
2
AVR ISP mkII を接続。このとき、USB から 5V 取れると便利。
3
avrdude コマンドでヒューズビットを書き込む。コマンドはこんな感じで。
avrdude -p m328p -c avrispmkII -b 115200 -P usb -U lfuse:w:0xE2:m -U hfuse:w:0xDA:m -U efuse:w:0x05:m
ここまでで、ハードウェアの方の準備はおわり。このあとはソフトウェア側の準備。
4
Arduino のプロファイル(?)を書き換える。Mac なら /Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/boards.txt を書き換える(他の OS は知らない)。以下の行を良い感じの場所に挿入。
############################################################## avr_int8.name=Arduino Internal 8MHz avr_int8.upload.protocol=arduino avr_int8.upload.maximum_size=32256 avr_int8.upload.speed=57600 avr_int8.bootloader.low_fuses=0xe2 avr_int8.bootloader.high_fuses=0xde avr_int8.bootloader.extended_fuses=0x05 avr_int8.bootloader.path=optiboot avr_int8.bootloader.file=optiboot_atmega328.hex avr_int8.bootloader.unlock_bits=0x3F avr_int8.bootloader.lock_bits=0x0F avr_int8.build.mcu=atmega328p avr_int8.build.f_cpu=8000000L avr_int8.build.core=arduino avr_int8.build.variant=int_8
5
ピンのマッピングを書き換える。内部発振にすることでクリスタル用のピンも I/O に使えるようになるので、使えるようにする。
/Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/variants/standard をコピーして /Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/variants/int_8 とし、その中にある pins_arduino.h を書き換える。132行目からをこんな感じに置き換える。
const uint8_t PROGMEM digital_pin_to_port_PGM[] = { PD, /* 0 */ PD, PD, PD, PD, PD, PD, PD, PB, /* 8 */ PB, PB, PB, PB, PB, PC, /* 14 */ PC, PC, PC, PC, PC, PB, /* 20 - PB6*/ PB, /* 21 - PB7*/ }; const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = { _BV(0), /* 0, port D */ _BV(1), _BV(2), _BV(3), _BV(4), _BV(5), _BV(6), _BV(7), _BV(0), /* 8, port B */ _BV(1), _BV(2), _BV(3), _BV(4), _BV(5), _BV(0), /* 14, port C */ _BV(1), _BV(2), _BV(3), _BV(4), _BV(5), _BV(6), /* 20 - PB6 */ _BV(7), /* 21 - PB7 */ };
これでデジタルピンに20と21が増えました。
プログラムを流し込む
あとはプログラムを流しこむだけです。適当に Blink とかを examples から開いて書き込みましょう。AVR ISP mkII を通して書き込むので、書き込みボタンを押すときは Shift を押しながらです。すると AVR ISP mkII を使って書き込めます。このように書込装置を使う場合、ブートローダは必要ありません。
まとめ
内部発振では動作速度は 8MHz となりますが、delay などが遅くなったりということはありません。boards.txt でクロックを指定しているので分周設定をうまいことやってるんだと思います。あと、内部発振は精度が悪いので通信とか厳しいかなと思ったのですが、I2C や 9600bps のシリアル通信は問題なく動きました。内部発振は CR 発振なので動作温度に依るところがありそうですが、常温だとひとまず平気っぽいです。
これで高いカネ払ってボード買わなくても Arduino の開発環境が使えますし、ライブラリも豊富なので、非常に便利ですね!
フレームワーク使うな的な話を見て
最初からフレームワークの使い方だけを勉強するようなことをするな、って話らしいね。納得はするけど、俺だったらそんな助言はしないなぁ、と思ったので書こうと思った次第。(このブログ、この手のスピリチュアルエンジニアリングの話多い気がする)
思い出そう
プログラミングを始めた時の自分を。
初めて画面に HELLO が表示された時、俺は 10 PRINT "HELLO" の意味なんて知らなかった。CPU がどうやって動いているのかも、そもそも CPU の存在すらも噂程度の知識でしか認識していなかった。メモリというものもあるらしい。ハードディスクというものもあるらしい。メモリとハードディスクの違いってなんなんだろう……。
その後
インタプリタの存在も簡単な実装も知って、CPU やメモリの存在や、動きも知った。なるほど、こうやって動いていたのか。なんだ、簡単じゃないか、はじめからこれを知っていれば簡単だったのに……。
誰かに教えたい
いずれ、こう思うようになる。ならないかもしれないけど。
そして教えるときに考えるんだ。「基礎から学んだ方が効率的だ」と……。
しかし
果たしてそうなのだろうか。意味もわからず座学を机上で学ぶことの苦痛さを忘れていないだろうか。
中には座学を嫌だと思わなかった人もいるかもしれないが、僕の(狭い)観測範囲では座学を楽しんで学んで実務能力を身につけたような人はいない。多くの人は、実際に手を動かして試行錯誤するほうが楽しいのではなかろうか。
まとめると
プログラミングを学ぶ流れは3つのフェーズに分けられると思っている。
- 本質ではなく振る舞いだけを追いかけてとりあえず使えるようになる
- 本質に興味を持ち、調べることでそれを理解する
- 本質にもとづいて、振る舞いを捉えられるようになる
フェーズ1と3は表面だけを見れば同じように見える。手戻りしているようにすら見える。しかしそれは違う。このような手順を追うからこそ、飽きずに学習を続けることができるのだ。
フェーズ1の存在を忘れてフェーズ2から学習を始めることを勧めるのは良くないと思う。
んで推察とか
フェーズ1を終えると、フェーズ3を終えた人と同等の技術があるかのように思えてしまうがそれは間違いなのだ。にも関わらず、フェーズ1を終えただけでフェーズ3まで終えた人と同等の技術力を主張する人がいる。
すると、それを嫌がって、(これも間違いなのだが)フェーズ1から学習を始めるなと主張する人がいる。
そういうことなんじゃないかなぁ。
プログラミングの話
楽しいよね。
塩ビ板にマザーボードなどをマウントした
今日は以前買っておいて放置していた透明な塩ビ板(5mm厚)を使ってPCケース(というか板)を作ってみました。
塩ビ板に適当に穴を開けてそこにネジを通しただけです。
拡張ボード用の穴を全部開ける前がこんな感じ。
そして完成したのがこんな感じ。ちゃんと見るとわかりますが、拡張ボードの突起が挿さるための穴が開いています。
机の横に置いて Windows8 のインストーラを起動している風景です。
ちなみに塩ビ板は10mmのジュラコンスペーサを使って挟まれており、下はネジ頭の2mm+10mm、マザーボードとの間は10mmのスペースが開いています。
また、HDDはインチネジ(自分は国内標準のミリネジに対してインチキネジと呼んでいる)で固定すべきなのですが、なにぶんインチキなのでそんなものはストックになく、無理やりM3のネジで固定しました。そのうちなんとかします。
このマシンはサーバーとしてではなく、開発用として使う予定です。そのためのグラボや電源なども今日 Amazon でポチッってしまいました。ああ、散財が激しい……。
Stream#pipeの破棄イベントの伝播
あっさりハマってメモリリークさせまくったので報告。
さっそく本題。まず図を用意。
Readable Stream -(pipe)-> Transform Stream -(pipe)-> Writable Stream
みなさんご存知のデータの流れ。しかし、問題は破棄イベントの伝播方向。
Readable Stream が閉じた場合
- Readable Stream が閉じる
- Transform Stream が閉じる
- Writable Stream が閉じる
=> 全部閉じる
よいですね。
Writable Stream が閉じた場合
- Writable Stream が閉じる
- おしまい
_人人人人人人人人人人人人人人人人_ > Writable Stream しか閉じない <  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄
=> 源流側が破棄されない
まとめ
正直、知らんかった(バカ)。