Write and Run

it's a simple way, but the only way.

2014年を迎えて(なお2013年は終わった模様)

あけましておめでとうございます。旧年はお世話になりました。今年もよろしくお願いします。(ここまでが台本です)

KOBA789の2013年まとめ

年のはじめからいろいろあったといえばあったのですが、どれも悪いことではなく、とても良いことのほうが多かったという印象です。振り返ってみると、ここ数年で1番平和で純粋に幸せな年でした。具体的には、ゲヒルンに Join したり、文化祭で無茶言いまくって暴れたり、筑波大に合格したりしました。

2014年とは

2013年の次の年で、2015年の前の年です。まぁ例によっていろいろあると思います。

2014年の目標

2013年がだいぶ平和だったので、2014年はおかしな年になって欲しいなぁという感じです。というわけでして、周囲の皆々様、心の準備をお願いします。

問題解決能力について

問題解決能力とは、筑波大学アドミッションセンターにおいてアドミッションセンター入試に合格するために必要な能力として説明されている能力のことである。この説明だけではわかりづらいため、この能力がどんな時に必要になり、役に立つのか、いくつかの例を用意した。

問題を解決しなければ友達の家で寝ることもままならない。

終電を逃した場合、往々にして問題解決能力は必要となる。

このように、問題解決能力とは生きるために必要な力であると言える。「終電を逃さないように早めに帰宅しよう」というのは回避であって解決ではないと考えられるので、これに該当しない。つまり、問題解決能力を備えた人物は日頃から終電を逃していると結論づけられる。

また、問題解決能力が発揮されるのは終電を逃した時だけではない。私が筑波大学に願書を提出する際、最も難しかったのは期限であった。そこで、郵便局のシステムを調べ、どこなら遅くまで受け付けてくれるかを調べた。

こうして、8月5日必着の資料を8月4日の19:40頃に発送しても間に合わせることができたのである。問題が解決されていることが確認いただけると思う。

以上のような事例からわかるように、問題解決能力を備えた人間は終電に限らず日頃から「ギリギリ」の生活をしていることがわかる。つまり、自分をピンチに追い込むことでこそ、問題解決能力が発揮されるということである。土壇場で焦るのは悪いことであると考えられがちであるが、常に身を危機に晒しておくということは、問題解決能力を高めるために必要なことなのである。

筑波ACの2次試験を受けに来ました

こんにちは、KOBA789 です。

今日は(というか昨日からですが)、筑波大学のAC入試の2次試験を受けに、筑波大学までやって来ました。

つくば、案外遠くて、交通機関のておくれリスクが高いので前泊をしました。つくばセンターのとこのホテルに泊まりました。駅近くて快適。

昨日の夜はオムライスを食べました。そして今日の朝はミスドで、昼は @Moneto_Tk さんなどとラーメンを食べました。この2日間、結構いいもの食べてます。幸せです。

というわけで控室からブログを書いています。あー、30分の拘束時間、長いなー。

面接、楽しみです。

@camelmasa さんから、誕生日に HHKB Pro2(墨)が届きました

KOBA789です。先日18歳になりました。

誕生日にアマゾンのほしい物リストを SNS に放流してました。そうしたら、@ さんからリプライが。



そしてほしいものリストを確認する俺。HHKB Pro2 が消えている……!?

結構焦りました。

そして今日。

f:id:koba789:20130810130656j:plain
f:id:koba789:20130810130751j:plain

届きました! @ さん、ありがとうございます!

これで大学入試のための自己推薦資料を書こうと思います。また機会があればちゃんとお返しもしようと思います。何度も繰り返して恐縮ですが、@ さん、本当にありがとうございます!!

ATmega328Pを内部発振でArduino化して便利に使う

最近 AVR(ATmega328P)でいろいろ作ってたので、そのときに学んだことをまとめておきます。

ATmega328Pを内部発振で動かせば水晶発振子は必要はありませんし、Arduino化すれば、Arduino IDE やそのライブラリが使えるのでとっても便利です。

ひつようなもの

  • ATmega328P
    • 秋月で売ってる。250円。たくさん買おう。
  • AVR ISP mkII
    • 秋月で売ってる。2千円くらいかな。
  • 適当な基盤とかブレッドードとか
  • (あると便利)USB から5V 取り出すケーブル
    • 自作しましょう
  • パソコン
    • 今回は MBA。Win/Linux/Mac なんでもいいと思う
  • avrdude
    • コマンドラインの AVR 書き込みプログラム
    • Mac なら brew でインストールできる気がする

準備

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. 本質ではなく振る舞いだけを追いかけてとりあえず使えるようになる
  2. 本質に興味を持ち、調べることでそれを理解する
  3. 本質にもとづいて、振る舞いを捉えられるようになる

フェーズ1と3は表面だけを見れば同じように見える。手戻りしているようにすら見える。しかしそれは違う。このような手順を追うからこそ、飽きずに学習を続けることができるのだ。
フェーズ1の存在を忘れてフェーズ2から学習を始めることを勧めるのは良くないと思う。

んで推察とか

フェーズ1を終えると、フェーズ3を終えた人と同等の技術があるかのように思えてしまうがそれは間違いなのだ。にも関わらず、フェーズ1を終えただけでフェーズ3まで終えた人と同等の技術力を主張する人がいる。
すると、それを嫌がって、(これも間違いなのだが)フェーズ1から学習を始めるなと主張する人がいる。
そういうことなんじゃないかなぁ。

ちなみに

自分はよく Node.js を使いますが過去に「Node.js ではフレームワークを使うな」という発表をニコニコ超会議1でやりましたが、それはまた、別の理由です。