インタープリタのソース
https://github.com/peta-okechan/dashielyes
単なるBrainfuck派生です。
Brainfuck プログラムの翻訳機能も付いてるので、既存の資産?を有効活用?できます。
ダァ!! シエリイェッス!!をダァ!! シエリイェッス!!たらしめているのは、12行目の command_expressions のみなのでそこを変更すれば容易にBrainfuck系の他言語を実現可能です。
インタープリタのソース
https://github.com/peta-okechan/dashielyes
単なるBrainfuck派生です。
Brainfuck プログラムの翻訳機能も付いてるので、既存の資産?を有効活用?できます。
ダァ!! シエリイェッス!!をダァ!! シエリイェッス!!たらしめているのは、12行目の command_expressions のみなのでそこを変更すれば容易にBrainfuck系の他言語を実現可能です。
http://www.ustream.tv/recorded/17318760
話者のキャラも好きですし、内容も興味深い点があってなかなか面白かったです。
それについて書いていきたいと思いますが、その前に僕が何者かについて。
小5でプログラミングを始めました。
といっても親父がどこからかMSXマシン(CF-3300)を貰ってきて、ゲーム機だ〜!と喜び勇んでスイッチを入れたものの、いきなりBASICのプロンプトが出るだけでサッパリ???な感じでした。
よく覚えてませんが、なんか数字を入れたら計算出来る事が分かって、巨大な電卓として使ってたような気がします。
小6、図書館で調べたらあれはMSXという種類のパソコンでBASICというプログラミング言語でプログラミングすればゲームが作れるということを知り、幾つか簡単なゲームのソースが載ってる本を借りて帰り、写経でもするようにそのまま打ち込むということをやってました。
キーボードに触るという事さえ慣れてなかったので一文字一文字キーがどこにあるのか探しながらなので大変でした。
あまりにも大変なので姉と一行交代で打ち込んだりしてましたが、子どもがしかも手打ちでやってるからSyntax Errorの嵐で。
ゲームが動いたときは達成感がありました。
でも当時持ってたゲームボーイのゲームに比べたらショボくて完成したゲームはあまり遊ばなかった気が。
姉と共同作業するのが楽しかったし、たまに打ち間違いはしたけれど運良くSyntax Errorにはならなくて、ゲームがバグる、っていうのがもの凄く楽しかった記憶があります。
中学時代は部活(陸上部・短距離)に明け暮れててあまりプログラミングはやりませんでした。
ちなみに3年間学年で一番100m走が速かったです。
さらにちなみに塾も行かず宿題もろくにせず授業以外ではまったく勉強せず授業中もろくにノートも取らず、ってな調子でしたが成績は安定して2番でした。
1番は両親が高校の教師をやってるかわいい女の子でその子もガリ勉タイプではなくて仲よかったです。
というかみんなと仲が良かったです。
3年の頃、親父が仕事のためにPC-9821V10を買ってそこでWindows95を使い始めました。
Windowsは高機能でMSXと比べたら別ものって感じでした。
ふと新しいパソコンでもMSX使ってたときと同じようにBASICでゲーム作りたいなと思って色々調べてたら、BASICのフロッピーが付属してるのを発見し、そのフロッピーから起動すると前みたいにBASICが使える事が分かりました。
前打ち込んだプログラムを新しいPCに打ち込んでみると、動きが早すぎてゲームにならなくて、どうしよう…とちょっと途方に暮れつつも物凄い性能向上だとワクワクした記憶があります。
高校に入ったら卓球部に入りました。そして半年で辞めました。
部活は楽しかったんですけど。
中学の部活がキツすぎて、一生分の辛さを味わった気になってました。
あと当時は怠惰な方向に進むのに憧れてたんでしょうね。それは今もあまり変わらない気はしますがw
高校時代は主なプログラミング活動としては、ベーマガ読んで載ってるプログラムを打ち込むってのをやってました。
あと自力でゲームを作ったり。
物理が好きで、星が2個しか出てこない星の重力のシミュレータを作ったり、3Dにも興味があって、擬似?ワイヤフレームの3Dハンググライダーゲームとか作りました。
今ではもうその時作ったデータが入ったフロッピーは多分ないです。
あとお年玉かなんかでVB6を買って(いや姉に買ってもらったのかも)Windows環境でのプログラミングを始めました。
BASICでにVisualが付いただけだから似たようなもんだろと思ってましたが、プログラミングモデルの概念から全然違ってて呆然としましたね。
VBについては良い書籍・雑誌と出会わなかった事もありあまり活動しませんでした。
プログラミングを勉強するために国立の某工業大学に入りました。
第二希望の大学だった(第一希望は親に反対された。かなり遠いところだったから気持ちは分かる)ので最初からあまりやる気が出ず。
授業も実践的なものを期待してたんですが、超抽象的だったり学術的だったりして退屈してしまい、ろくに授業も受けず昼夜逆転で友達と夜遊び&ゲーム三昧の日々を過ごしました。
今は勿体無いことしたなーと思ってます。
一応Pascal, C, C++とかUnixとかVerilogの授業は興味があってそれなりにちゃんと受けてました。
それで自分のプログラマとしての底力がグンと上がった気がします。
3年で中退して、とりあえず親父の会社でブルーカラーの仕事をすることに。
これが僕の社会人デビューです。
ここで自分の仕事に感謝されると嬉しいという事が分かりました。
仕事はだいたい定時に終わるので、このころはプライベートな時間でVBやC#やらやってました。
Cマガのパズル問題をC#で解いたりしてました。
この仕事で全然うまくやっていけると思ってましたが、飽きっぽい性格なのとプログラミングを仕事にするということが頭から離れないのとで、2年で辞めました。
そして地元のSIerに就職しました。
いろんな企業に常駐させてもらったりして色々経験になりました。
自虐的な業界あるあるネタもこのころたくさん仕入れさせていただきました。
大人数で働いたりして、自分のレベルというものもなんとなく分かりました。
プログラマと非プログラマの間に深い溝がある事も知りました。
でもプログラマ人生という観点からはこのころが一番楽しくなかったです。
非合理的なプロジェクトの進め方、汚い設計、汚いソース、デスマーチなどなど。
続けてもたいした経験にはならなさそうと感じたので、ここも2年で辞めました。
次はWeb系のIT企業に就職しました。
今はもうない会社です。
自社サービスを自社で作るという方針で、やりやすかったです。
でもプログラマが自分一人しかいなくて、予算もないので、体勢的な限界を感じていました。
色々プロトタイプを作って提案したりプログラマを新たに雇い入れるよう働きかけたり色々やりましたが、あまりうまくは行かず、ゆるやかに死んでいく会社を立て直すことはできませんでした。
経営側に技術への理解、というか自分の会社が売りにしてるものへの理解がないとやはり厳しいようです。
このころにPHPやLinuxについて勉強しました。
そして今は独立し会社の社長をやってます。
といってもひとりだけの会社なので、全然会社って感じではないです。
前の会社のお客さんを抱えつつ、サーバの管理やったり、ちょっとしたアプリを作ったりして細々と暮らしています。
今は個人プログラマでもマネタイズの方法が色々あっていいですよね。
だらだらとやってますが、プログラマ人生の中では子供の頃に次い楽しいです。
色々自由に出来るので色々学んでますが、代表的なのはPythonですね。
もっと早くに出会いたかったです。
はい。ということで前置きが長くなりましたが本題です。
高校の頃から経験を振り返りながらなんとなく同じこと考えてましたが、知識のグラフが大事というのはホントそうだと思います。
プログラミングだけじゃなく学校の勉強とかでもそうです。
知識のグラフを作る = 学ぶ事そのもの と言っても過言ではないのではないでしょうか。
詰め込み学習は脳の容量を消費しますが、知識のグラフを作ることは脳の容量を増やす、そんな感じがします。
関数に注目してる点については、なるほど!と思いました。
自分にとっては当たり前で空気のような存在だからこそ着目しづらいところでした。
最終的に手続き型言語を使うとしても、設計や学習を関数型言語で行うと効率がよかったり上手くいったりするなんて話をどこかで聞いた記憶があります。
自分が学んだ経緯からどうしてもハードウェアに近い層から積み上げるべきと考えがちでしたが(もちろん一流になるなら避けて通れない所だと思いますが)、ハードウェアと表層のプログラムの間にはネットワークを含むような巨大な層が横たわり、いっぽう軽量言語全盛でライブラリが充実してる現在においては、言語学的に抽象的なところから入った方が、とにかく自力でコードを書けるようになる、って事への近道かもしれないと思いました。
初心者プログラマに向けてのメッセージとして自分が漠然と思ってた事が明確になってて、動画をみながらうんうんとうなずいてしまいました。
ただ、chibicodeの宣伝も兼ねてるようで初心者プログラマ向けとしてはちょっと蛇足な部分もあったかなと思います。
具体的にはMapReduceの部分が他の重要トピックと同列に扱われてる点ですかね。
MapReduceは大規模なデータを分散処理するのに適したアルゴリズムで、最近流行ってるというか、大量のデータを捌く必要がある場面では必須と言ってもいいくらいにはなってますし、そんなにデータが大量じゃなくてもコードをスッキリ書くためにその考え方が使えたりはしますが、言語学的に特別な意味があるわけではなくて、あれはあくまでも星の数ほどあるアルゴリズムの中の一つでしかないです。
関数に着目してるのでそれを使って何か驚きを与えるために今流行のMapReduceを持ってきたのは必然だと思います。
でもそれを専門でやるプログラマでなければ、そんなのがあるよね程度で頭の片隅に置いておけばいいという程度の事だと思います。
プロが初心者向けのレシピを作ってそれをプロが実践したらパフォーマンスが落ちた、という話も面白いです。
確かにそうかもしれません。
勉強を教えるにしても、相手に分かりやすいように説明してもなかなか響かないとき、自分が発した言葉を冷静に思い返すと逆に分かりづらいなと感じるときが多々あります。
自分の思考プロセスを細かく観察して、細かくステップに分けて伝わらないだろうなと思っても勇気をもって伝えるのがいいのかなと思いました。
SIerの頃は中国やインドに仕事を奪われるから、早くプログラマを脱却して偉くなりなさいなんて言われてましたが、それ以上に現在はパイが増えてきているので楽観してます。
まぁプログラマは大丈夫でも日本のSIerはだめでしょうけどね。
コンピュータサイエンスではOSが一番難しいってのはやっぱり向こうでもそうなんだw とちょっとおもしろいなと思いました。
20年ぐらいプログラミングやってきて、最初の10年は一番知識の吸収力がある時期にも関わらずあまり伸びませんでした。
それは周りに聞ける人が全くいなかったからだと思います。
誰か教えてくれる人がいたらよかったのにと思います。
だから今、周りに聞ける人がいるなら存分にその人を利用して欲しいと、そう思います。
初めて上野動物園に行ってきました!
わたくし生まれも育ちも熊本の山の中でございまして、今は海のない埼玉に住んでるんですが、基本田舎者です。それもかなりの。
そんな僕が東京の、上野の、動物園、そうあのパンダとかで有名な上野動物園に行ったというのは人生におけるちょっとした事件でありました。
寝てるパンダとか、水に入ったまま微動だにしないカバとか、色々とやる気のない動物たちを見ながら、「まぁ自分もオリの中で遠巻きに見られながらなんもしなくても3食しっかり出るような環境ならやる気出ないよなー」とか思ったり、しかしそう思いつつも心の奥から湧き上がるキャッキャウフフ感に戸惑ったり。
しかしアルマジロですよ。アルマジロ。
正直そんな動物が存在することさえ意識に無かったんですが、見てびっくり。
あまりの可愛さと、他の動物が基本やる気がない中ひとりだけ頑張ってるその姿、「これが俺の仕事なんだ!」という気迫さえ感じられました。
ひたすら回り続けるアルマジロを見て、「自分の今までの人生も巨視的にはこんな感じで、これからもこんな感じだろうし、こうあるべきなのかもな」という答えみたいなものをいただきました。
Unboxing動画をあげてみました。
例によってグダグダでしゃべりがキモイ点がございますが勘弁してつかぁさい。
オンラインで注文してから10日で届きました。
カスタマイズ出来る点のみ挙げると構成は以下のとおりです。
CPU: Intel Core i3 2357M(2コア4スレッド1.3GHz)
メモリ: 4GB
HDD: 250GB
バッテリ: 6セル
無線LAN: Intel Wifi Link 1000
キーボード: 英語キーボード
さっそく、HP Mini 2140に最初から内蔵されてたIntelのSSD(HP専用ではあるが初代Mainstream 80GBと同等品)を抜き出して交換することにしました。
まだ電源も入れないうちに裏蓋を外しHDDを取り出す。
別のPCへそのHDDとSSDを繋いでknoppixで起動する。
まず、ddrescueでHDD全体のバックアップをとる。
全体が80GBに収まるようGPartedでWindows領域のパーティションを縮小し、その後に続くリカバリ領域のパーティションを前に詰める。
そしてHDDの前80GB分をSSDへイメージコピー。
SSDをX121eに繋いで起動。
という手順で難なく移行できました。
BIOSからのリカバリ機能の呼び出しもOKです。
裏蓋も3つねじを外すだけで、ストレージ、メモリ、Mini PCIE(フルサイズとハーフサイズの二つ)にアクセスでき、いい感じです。
注意すべき点は、通常の9.5mm厚じゃなくて7mm厚の2.5インチHDD/SSDじゃないと入らないっぽいところです。
WEI(Windows エクスペリエンスインデックス)は上から、4.9、5.5、5.2、6.1、7.5でした。
CPUの数値が一番低いですが、Atomなネットブックと比べるとかなりの高性能さを体感できると思います。
例えばAtomだとSkypeで映像通話をしてるとChromeを開くだけでかなり重かったりするんですが、Core i3 2357MだとSkypeをやってる事を忘れるくらい他の作業も軽々とこなします。
SSDの恩恵も大きいかもしれませんが、映像通話しながらVirtualBoxでWindows7の仮想マシンを立ち上げても、やたら重いといったストレスは感じませんでした。
ちなみに、初期状態ではVT-xが無効になってました。
BIOSで有効にする必要があります。
さらにVT-dの項目もBIOSにありましたが、有効にしてもCPU-Zで読んだ限りでは有効にならないようです(まぁi3ですから)。
基本的に満足してますが、問題点も3つほど感じました。
液晶画面がざらついて見える(ドットとドットの間にうっすらと格子が見える感じ)。
USBの帯域の問題か内蔵のWebカメラと本体右側のUSBポートを同時に使うとWebカメラが不安定になることがある。
値段相応の質感なのでThinkPad Xシリーズな感じがしない。
2011/07/30追記はじめ
Webカメラの問題については、Skypeを使ってるときに発生します。
Skypeで映像通話を開始すると数十秒でSkypeが強制終了します。
他のUSBポートを使ってなくても発生しました。
ググったところSkypeの不具合として似たような問題の報告を幾つか見ることができました。
有効な解決策としてSkypeのバージョンを正常に動作するものに下げるという事が挙げられてましたので、ThinkPadではなくSkypeに原因があるのかもしれません。
ちなみに現在最新のSkype5.5を試してみましたがダメでした。
元々バンドルされてた5.0だと今のところ問題は起きてません。
2011/07/30追記おわり
まぁでもAtom搭載のネットブックで最大の不満だったCPU性能が、X121eを手に入れることにより大幅にアップしたということをこれでもかというほど体感できてるので、満足しております。
ビットレートの関係から基本的に動画の長さは1回につき20分前後を目安にして作ってるのですが、編集でカットや早送りを多用するようになると、最終的にどのくらいの長さになるか収録中に考えながらやるのが物凄い負担になってきます。
(なので今までは最終的に動画の尺が変わるような編集はあまりしてきませんでした。)
ということで収録用タイマーを作ってみました。
ちょっとググった感じだとなさそう(少なくとも”みんなが使ってる、これ使っときゃOK、定番中の定番”みたいなのはなさそう)でしたので。
ほんとにちょっとしたアプリなんでわざわざ作ろうって人が少ないのかも。
基本的にはスタートボタンを押してからの経過時間を表示するだけですが、一時停止ボタンで時間の経過を止めたり、2倍速ボタンで時間の経過を2倍の遅さにすることができます。
つまり収録中に「ここはカットだな」ってところで一時停止を押したり、「ここは2倍速くらいで早送りだな」ってところで対応するボタンを押すと、編集後の最終的な動画の長さがだいたい計れるという寸法となっております。
これを初めて使って収録したのが、【実況】Splinter Cell: Double Agent ほぼ初見プレイ part 27 ‐ ニコニコ動画(原宿)となります。
しかしたまたま話がそれなりに進んだ回なのであまり早送り編集使ってませんw
これからこれでバンバン編集して動画の退屈度がいくらかでも下がればいいなと思ってます。
以下ソースです。
いつものように自分の環境(Mac OS X 10.6.7 + python.org配布のMac版Python2.7) でしか動作確認してません。
nicotimer.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import Tkinter as tk
import tkMessageBox as MsgBox
import time
class TimedFrame(tk.Frame):
u'''一定間隔で繰り返しメソッドを実行する機能を持つFrameクラス'''
def __init__(self, master = None):
tk.Frame.__init__(self, master)
self._timings = []
self.fps = 30
def addTiming(self, func, interval, *args, **kwargs):
u'''一定間隔で実行する関数を登録'''
self._timings.append(dict(func = func, interval = interval, next_time = None, args = args, kwargs = kwargs))
def startTimer(self):
u'''タイマーの開始'''
self.after(1000 / self.fps, self.framein)
def framein(self):
u'''一定間隔の処理を誤差の蓄積なしに実行する'''
for t in self._timings:
if t['next_time'] is None:
# 初回の処理をすぐに実行するため現在時間を設定
t['next_time'] = time.time()
if time.time() >= t['next_time']:
# 次の処理を実行する時間なので実行する
t['next_time'] += t['interval']
t['func'](*t['args'], **t['kwargs'])
self.after(1000 / self.fps, self.framein)
class App(TimedFrame):
def __init__(self, master = None):
TimedFrame.__init__(self, master)
self.time_label = tk.Label(self)
self.time_label['font'] = ('Helvetica', '48', 'bold')
self.time_label['text'] = '00:00'
self.status_label = tk.Label(self)
self.status_label['font'] = ('Helvetica', '24', 'bold')
self.status_label['text'] = u''
self.start_stop_button = tk.Button(self)
self.time_control_buttons = []
_btn = tk.Button(self)
_btn['text'] = u'一時停止'
_btn['command'] = (lambda b: (lambda: self.by(0, b)))(_btn)
self.time_control_buttons.append(_btn)
self.temporary_stop_button = _btn
# 1, 2, 3, 4, 10倍速ボタンを生成
for n in (1, 2, 3, 4, 10):
_btn = tk.Button(self)
_btn['text'] = u'%d倍速' % n
_btn['command'] = (lambda by_x, b: (lambda: self.by(by_x, b)))(n, _btn)
self.time_control_buttons.append(_btn)
self.__dict__['by_%d_button' % n] = _btn
self.time_label.pack()
self.status_label.pack()
self.start_stop_button.pack()
for _btn in self.time_control_buttons:
_btn.pack(side = tk.LEFT)
self.pack()
self.stop()
self.addTiming(self.tick, 1)
self.startTimer()
def start(self):
self.started = True
for _btn in self.time_control_buttons:
_btn.configure(state = tk.NORMAL)
self.status_label['text'] = u'%d倍速' % self.by_x
self.start_stop_button.configure(text = u'ストップ', command = self.start_stop)
def stop(self):
self.started = False
self.sec = 0.0
self.sec_delta = 1.0
self.by_x = 1
for _btn in self.time_control_buttons:
_btn.configure(state = tk.DISABLED)
self.status_label['text'] = u'停止中'
self.start_stop_button.configure(text = u'スタート', command = self.start_stop)
def start_stop(self):
if self.started:
if not MsgBox.askokcancel(u'確認', u'次にスタートボタンを押すとカウントがリセットされます。\nよろしいですか?'):
return
self.stop()
else:
self.start()
def tick(self):
if self.started:
_min = self.sec / 60
_sec = self.sec % 60
self.time_label['text'] = '%02d:%02d' % (_min, _sec)
self.sec += self.sec_delta
def by(self, by_x, btn):
self.by_x = by_x
self.sec_delta = 0.0 if by_x == 0 else 1.0 / by_x
self.status_label['text'] = btn['text']
if __name__ == "__main__":
app = App()
#app.master.geometry('+600+1200')
app.mainloop()