Diary?::2008-08

2008-08-01
Fri

(20:32)

今日からまた新人が二人。何か二人ともプログラミングの経験はあるっぽくて、うち一人はなんか基本放置でツッコミどころがあったらちょこちょこと指摘すれば良さげ。もう一人の方はまだわからんが、楽観視はできんだろうな。

ところで研修していて不思議に思うのは、何で API とかにわかんねー単語が出てきたときに調べないで、わかんねーまま使おうとする奴がいるのかなってこと。今日あった事例だと、 String クラスの split メソッドを使おうとして、渡した文字列に正規表現で使うメタキャラクタが含まれていてエラーになるってのがあった。それでちょっと聞いてみたら、どうにも「正規表現」というものは全然知らなくて、何となく使用例のコードを見て使えそうだから使ったらしい。

とりあえず「そういうときはちゃんと調べろ」と言っておいたけど、こんなレベルの指導を自分よりも学歴年齢ともに上の奴にしてると非常に情けなくなる。

しかし何で Java の String って split に正規表現しか渡せないかなあ。これのせい(いやそれは言い過ぎか)でいろんなプロジェクトで StringUtil とかいう名前のユーティリティクラスが作られてるんだけど。俺は絶対にこの仕様を考えた奴はアホだと思う。

(23:20)

何一つ調べずに書くけど、いわゆるロストジェネレーションとか就職氷河期ってのは、社会と個人両方の問題であってどっちかが 100% 悪いわけじゃねえだろう。どこ行っても求人がなかったって話を聞くけど、中小企業とか零細企業も含めての話なのかね、それって。なんとなくだけど、

  • いい学校・いい会社・いい人生という価値観を押し付けた社会
  • その価値観に疑問を持たなかった若者

という喧嘩両成敗の側面って少なくないと思うんだけどな、俺としては。まあ、どっちかっつーと社会の方が悪いようには思うけど。どっちが先に腐ったのかはわかんないけど、大学などの高等教育の形骸化とか企業が高等教育を受けた人材を活用できないっていうどうしようもない問題があるわけだろ。ってかプログラミングの研修やってると、形骸化した大学教育の暗部をまざまざと見せつけられるんだが。

あとこれは本題から外れるけど、何でみんなわざわざ大企業に行くかなあというのが正直な感想。俺は大企業なんて社内の制度やら何やらが面倒くさそうで最初からパスって感じで、実際に一緒に仕事してみたら俺の想像以上に面倒くさい印象で、やっぱ入らなくて正解だった。中小企業に入って一気にエースクラスの扱いを受けて、辞められたらマズいポジションを利用して好き勝手に振る舞うっていうのも悪くないと思うんだけどな。

俺は名もない中小企業なら社内で勝ち抜ける確率は悪くないと踏んでいたし、実際にはほとんど不戦勝に近かったし、それで会社の上層部には「クソなプロジェクトに突っ込んだら次こそ辞める」って脅しをかけることに成功してるし。おまけに技術職から管理職への無理やりなコンバートも既に封殺済みだ。

実際にやってみてわかってけど、中小企業ジャックってのはかなり有効な戦略だ。特に自分の本当に好きな事・やりたい事があんまり金を必要としていなくて、なおかつ商業ベースじゃ難しい場合なんかはこれを最初の選択肢にしても良さそうだ。

さらに脱線するけど、博士号持ちがコミュニケーション能力ないとかいうのは大嘘。理系(笑)はコミュニケーション能力ないというのも大嘘。そういう「コミュニケーションできない偏屈な研究者」っていうステレオタイプのイメージが強いから、みんなそう思ってるだけ。一般にコミュニケーション能力があると思われてそうな体育会系(笑)の連中とか文系(笑)の連中がダメダメってのもしょっちゅう見てるし、っていうか研修担当の俺と全然コミュニケーション取れてないし、結局できる奴はできるしダメな奴はダメなんだって。っていうか、そんなところでダメかどうか判断できたらこんなに採用や研修で苦労しねえっての。

……なんつーことを、「没落エリートの出現—ビジネス社会から疎外される高学歴就職難民たち」を読んで思ったり。そういう没落エリート(笑)の受け皿みたいな事をやってるのがうちのような中小企業で、俺はそういう自分よりも偏差値が 20〜30 は上な(そして大抵年齢も上な)没落エリート(笑)の指導をしてるわけで、まあ没落といってもワーキングプアにまではならない生き方も十分選択できるんじゃないかな。

2008-08-02
Sat

(20:10)

あんまり咳が酷いんで病院に行ってきたが、「恐らくアレルギー、もしかしたら咳喘息の可能性も」というおっかねえことを言われて何か吸引する系の薬が処方された。まずは一ヶ月ほどそれを服用してみろとのことだけど、その薬って症状を抑えるわけじゃねえから、仮にだんだん良くなるにしても、この症状とは最低あと一ヶ月以上はつきあわにゃならんのか。

俺がこんな調子な一方で、ちょっと前に盲腸でぶっ倒れた妹一号がこんどは腹膜炎の疑いアリとかで入院しやがった。それで数日入院した結果、何だかよくわかんなかったから別の病院に移し変えることになった。その病院、一時期は医師と看護師が大量に辞めちゃって機能が麻痺したこともあって、ぶっちゃけ信頼度はあんまり高くなかったりするんだけどな。でも地元で唯一の総合病院だしなー。

そんなわけで流石に心配になったんで実家に戻って様子を見てきたんだが、病気よりも何よりもやっぱり今の仕事を辞めたいとか言われた。まあ、事務職を希望しておいて CAD やらされてたんじゃ辞めたくもなるわな。ちなみに妹の同期はみんな既にトンズラしてて、本人曰く「逃げ損なった」んだそうな。やれやれ。

2008-08-03
Sun

(21:26)

金曜あたりから左目がものもらいっぽくて痛いというか違和感があるんだが、未だに治ってねえ。一応、土曜に実家に戻ったときに薬局で調合してもらった薬を使ってはいるんだが。

明日の朝になってもダメだったら、会社の近場の眼科に行った方が良さげだ。

(22:21)

まーこんなもんで何かがわかるわけでもないけど、俺はこの手の○○診断系プログラムじゃなかなか危険なスコアをしょっちゅう出してるので、今回はどうなることやらと思ってやってみた。

診断結果/あなたには、治療が必要です。

現在のあなたは、ストレスで身動きが取れない状態になっていませんか?
これは、周囲の環境にも原因があるかも知れませんが、それだけではなくあなたの性格的な問題も、あるかも知れません。

自分でも、どうして良いかわからない時には、人に頼ってみる事も必要かもしれません。
その必要がないと思うのであれば、それも結構だと思います。

すげー。治療が必要だってよ、治療が。ちょっと調べてみたら、どうもこのプログラムじゃ最高(最低)のスコアがこれっぽいな。

まあ、こんなもんを信じてたらキリがないんで、俺は全然気にしてないけどな。

2008-08-04
Mon

(21:03)

今日は眼科に行き損ねた。いや、今日中に仕上がると言っていた仕事があったもんでね。明日は前半休取ってるんで、明日こそは診てもらおう。これで明日の朝に治ってたら大笑いだが、俺は半面回復能力が終わっているのでこのままほっとくと金曜ぐらいまでは治らない気がする。いや、マジで怪我とかの治りが悪いと思うんで(ってか怪我や病気の程度を見誤っているだけか)。

喉の調子は相変わらず。やっぱアレルギーか? 諸事情により引越しは一年半ぐらいしてからするつもりだったけど、もしかしたら早いとこ引っ越して生活環境を改善させないとダメかもしれん。次こそはフローリングの部屋にしないと、ハウスダストやダニで体力を削られ過ぎる。

あとどうでもいいけど、今のアパートに引っ越して三年以上経つけど、先週の土曜に初めて行くまで、歩いて 10 分かそこらの距離に総合病院があることを知らなかった。いや、 Google Map で病院の位置をよくよくみたら大変な近場で大変驚いた。これまでは歩いて 30 分ぐらいの診療所に通ってたんだよなー。

確か「人の話を聞かない男 地図が読めない女」とかいう本があったと思うけど、俺は全然まったく地図が読めなくて、さらには住所とかも「○○町何丁目」とか書かれてもさっぱりで、ぶっちゃけ GPS も指定してくれよとか割と素で思ってる。最近の携帯電話には GPS 機能が付いてるわけで、これなら適当にアタリを付けながら大まかに目的地に向かっているかどうかわかるじゃん。

ちなみに今の会社に入社してから数日は東京駅で迷子になりかけた。今でも京葉線とかのあたりはよくわからない。

(23:50)

Hydrogen で作ったドラムパターンを MIDI インポートして Rosegarden 食わせたら、ライドシンバルが全部ハイ・タムに置き換わっていやがった。くそったれ。もしかしたら俺がへまった可能性もあるが、やっぱ Hydrogen は単体で使った方が良さそうだ。そもそも Hydrogen のドラムキットと手持ちの Sound Font のドラムキットじゃ、音色も何もかもが違うし。

2008-08-05
Tue

(22:42)

最近になって研修課題の見直しを進めてるんだが、何かもうどういじってもダメくさいな。そもそも根本的な問題が本人がマジになるかどうかなんだから、課題が多少大雑把でも関係ないんだよな。じゃあどうやってマジになってもらうかっていうと、そんな風に仕向けることができたら学校の先生は何一つとして苦労しねえよ。

というかさ、本当に IT 業界に興味があるんなら面接受ける前に何かしらプログラミング言語の学習を始めとけって話なんだよ。我流で覚えて結果ダメダメでも、そっから矯正するのは適正があるかどうかもわからん奴に研修するよりもずっと楽な事の方が多いだろうよ。

しかし研修と平行して社員向けの Web システムを開発して、それとは別に会社のブログ向けのプログラミングと記事の執筆もしてると時間が足りなくなる。それで身につくスキルが OFBiz なんつーニッチというかマイナーというか、多分日本で使ってるのはうちぐらいな意味不明なシステムの知識なんだから、なんつーかやってらんねーよな。

まあ、 Java のコードを一行も書かずに簡易な BTS を作れたんだから、当初の予想以上の収穫ではあったが。ただこれ、全てにおいてテクノロジーがマニアックだから、流行るかどうかといわれると無理としか言いようがないんだが。

2008-08-06
Wed

(21:22)

どこから入り込んできたんだかしらんが、家の中に芋虫があああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ!!

……これほどまでに一人暮らしを後悔したことはなかったといってもいい。

追記:ゴキジェットを大量に噴霧してぶち殺すことに成功。今度引っ越すときはなるべく自然の香りのしないところにしよう。

(22:28)

来月からまた新人が一人入るんだが、これがまた 32 歳で未経験らしい。何でも今の仕事が非常に不安な状態らしく、それで思い切って転職するんだと。相当必死だったらしいが、だからって取るか普通。俺には人事権なんぞ与えられていないのでどうにもならんが。

せいぜい入社するまでに勉強しておいてくれというか、流石に切羽詰まっていれば必死にやってくれるだろ。というか、そう信じたいよ。

2008-08-07
Thu

(00:55)

Linux には Jack っていうオーディオ入出力のポートを切ったり繋げたりできるソフトウェアがあって、それを使ってレコーディングとかガリガリやろうと思ったら、以下のソフトウェアを Jack サポートを外してコンパイルしてたのに気がついた。

Fluidsynth
ソフトウェア MIDI。サウンドフォントが使える
Qsynth
Fluidsynth の GUI フロントエンド
Hydrogen
ドラムマシン

つーわけで全部再コンパイルする羽目になった。最初はそんなにいろんな機能を使わないだろうと思って最小限のオプションでコンパイルしてたけど、結局色々と必要になってしまったなあ。

(07:50)

if not any(func, iterable): return False
for i in (func(x) for x in iterable): do_something(i)

if not any(func, iterable) return False
for i in (func(x) for x in iterable) do_something(i)

のどっちが自明かなんぞ考えるまでもなくわかりそうなものなんだが。っていうかリンク先で「変わらん」とされてる例でも、俺は可読性がかなり違っていると思うんだがなあ。

(20:13)

何でいい年こいた社会人に「ちゃんと返事をしろ」「質問に答えろ」などと言わねばならんのだ。ってか全然コミュニケーションになってねえよこれじゃ。あと「索引見れば大体あたり付くんだから本をちゃんと読んで調べろ」とか指導するのも辛い。これ小中学生レベルの指導内容だよ。おかげで既にどうすれば社内の雰囲気を悪くせずにクビ宣告できるかを考えてるんだけどなー、俺は。

だからいい加減に心を入れ替えてくれというか、お前ら採用するのにいくらかかってると思ってんだよ!! 金出して採用広告打ってこれじゃあなあ……。いやまあ、俺には面接したり採用・不採用の決定権はないんで、どういう応募者がいるのかについてはよくわからん部分もあるんだが。

2008-08-08
Fri

(00:03)

何か qjackctl でサンプリングレートを変えても 48KHz でしか録音できねえ。使ってる MTR はインポート可能な WAV ファイルのサンプリングレートが 44.1KHz なので、このままじゃ使い物にならん。それで調べてみたんだが、ちょっと絶望的な状況になった。

うげー、 AC97 ってもろに俺の PC で使ってるサウンドカードじゃねえか。つまりあれか、 ALSA を使ってる限りは 48KHz で録音するしかないってことか。

しょうがねえから、 sox っていう自称 "The swiss army knife of sound processing programs" なツールでサンプリングレートを変換することにした。それで一応解決はしたけど、やっぱ釈然としねえな。

2008-08-09
Sat

(01:08)

採用するにも金がかかるという話を何度か書いてきた気がするので、ちょっとここで具体的な数字を出してみる。まずは俺の今の勤め先は前年度の時点で社員数が55人で売上が5億円弱、経常損益が4000万円弱となっていて、ほんとはここから税金とかで差っ引かれるけど俺はそこら辺はとんと疎いんでよくわからん。さらには多重下請け構造でピンハネしたりされたりでイマイチ金の流れが不明だが、

  • 役員や事務を除いて50人の実働部隊がいる
  • 会社の利益がもろもろ差っ引いて3000万円
  • 平均給与は23万円、賞与も同額で年2回支給
  • 諸経費を大雑把に計算すると、一人当たり23万円/月のコストがさらにかかる

とすると、単価はおおよそ55万円で月あたり5万円の売上ぐらいというなんとなくありそうな数字になったと思うので、とりあえず以降は会社が自由に使える金が3000万円あると適当に仮定して話を進める(いやきっと自由に使っちゃいけないんだろうけど、経営についてはまるで知らんのでよくわからん)。

まずは採用するには広告を出さねばならんのだが、とりあえず今回は5月よりほぼ連続で計三回の広告出稿をしていて、合計で220万円ほどかかっている。自由に使える金の7%が既に消えているわけだ。というか、社員4人が一年働いて叩き出せる利益だ。広告打つだけでこれだよ。

それで今回は8人ほど採れる予定で既に6人ほど雇っているが、まあ仮に全員同時期、とりあえず4月に雇ったとしよう。まずは研修期間中は当然稼ぎゼロなので、いろいろ込みで月あたり16万円ほどかかるとする。研修期間は3ヶ月なので、この時点で単純に考えても一人あたり48万円ほどの出費だ。その後9ヶ月ほど現場に出すとして、偽の業務経歴書を作らない場合は(うちはやってねえと思う。多分)単価は30万円取れればいい方で、20万円というのも普通にあるだろう。相変わらず月あたり16万円かかるとして、もろもろの諸経費込みで多分平均で月あたり8万円ぐらいは赤字になってるんじゃねえかな(適当)。それで初年度は120万円のコストが一人当たりかかると仮定する。つまり初年度にすげえコストがかかってるってのが実際の数字はどうあれ予想できる。何せ今回の仮定の下では、自由に使える金の30%ほどが融けてる計算だ。

二年目以降は月50万円未満では仕事を請けていないらしいので(真偽不明)、給与を20万円、賞与は15万円、諸経費は相変わらず23万円で1月の売上が4.5万円だとして、年間で出せる利益は54万円、三年目は月56万円で仕事を請けて年間で72万円ぐらいの利益だと適当に仮定する。二年目と三年目で出した利益でようやく初年度のコストが回収できる計算だ。

細かい数字は俺は経営にはノータッチなのでわからんし、俺はいろいろと例外的な存在なので俺の単価をベースに計算は出来ない。そもそもここまであんまり深く考えずに計算してるんだけど、なんか結果を見たらこれはあながち間違いではないように思えるな。

そうなると3年目を終えるまでに退職されると大損で、どうせなら研修期間中にダメな奴は切り飛ばしてその後の損失を回避するのが得策ということだ。もちろんダメな奴が残ることの悪影響は山のようにあるけど、金銭的なものをみるだけでもかなり中小企業的にはギリギリの戦いをしてるというのはわかると思う。経営の事なんぞまったくわからん俺が適当ぶっこいてこれだから、経営陣はさらにシビアに見ていると思った方がいいだろうな。

だからうちにくる人に限らずIT業界の実務経験なしの人達にいいたいのは、マジで勉強してくれということ。あんたらを採るだけでも相当なコストがかかっていて、そして結果ダメだった場合には中小企業的にはかなりキッツイ損失が待ち受けている。っていうか本当にIT業界に興味があるんならまずは独学でいいからやってみてくれ。まず何よりこの業界は、本当にプログラミング・ソフトウェア開発が好きじゃないとかなり辛いものがあると思う。既に順当にドロップアウトした奴を二人見てるし、そろそろ引導を渡さないといけない奴もいるし。

追記:今回の計算では広告を打つことによる企業の認知度の向上は考慮に入れてない。ぶっちゃけ、無視できる程度の効果しかないと思うし。

(08:40)

何かロシアとグルジアが戦争おっ始めたっぽいぞ。しかし「国際的な関心を集めるべく北京五輪の開催時期に合わせたとする見方もある」ってのは酷いな。普通は自重するもんだろ、こういう時期には。

しかしちょっと調べたみた限りじゃ、グルジアとロシアの対立ってチェチェン問題と割と地続きで、っていうかこれ収集つくのか? 何しろチェチェン問題ってイスラム教 vs キリスト教なわけで、、こいつらは飽きもせずに数世紀に渡って殺し合いをしてきたからな。元ネタは同じユダヤ教なくせに。

2008-08-10
Sun

(15:30)

ストリートファイター4をちょいとやってきたが、結局これもマニア向けかなあ。スーパーコンボとウルトラコンボをキャラ一人につき一つずつ割り当てて、それぞれ「攻めた勢いで使う技」「一発逆転を狙う技」と役割を持たせてやることをはっきりさせたのはいい。でもそれでもまだマニア向けに凝りすぎな部分がある。

セービングアタックまわりの仕様なんてのは際たるもので、これビギナーが一朝一夕に理解できる代物じゃないだろ。乱入抑制のビギナーモードがあるといっても限界があるし、何ていうか複雑化してドツボというマニア向けゲームのスパイラルからは抜け出せてないっぽい。それでもギルティギアとかよりはだいぶ敷居が低いとは思うが。

(19:08)

会社で新人とかに教えていて困る質問というのは、やはり「オブジェクト指向って何ですか?」といった類の質問で、実のところこれは未だにどう答えていいかわからない。ぶっちゃけてしまえばオブジェクト指向プログラミングというのは構造化プログラミング同様にプログラミング手法の一つで、構造化プログラミング言語を用いた方が構造化プログラミングを行いやすいのと同様に、オブジェクト指向プログラミング言語を用いた方がオブジェクト指向プログラミングは行いやすく……という話を新人にできるかヴォケ!!

そもそもこういったプログラミング手法というのは基本的にソフトウェアの開発・保守の効率を向上させるためのもので、そのご利益を体感するにはある程度の規模のコードを書く必要があるのだけど、研修で書くコードなんぞたかの知れた規模でしかない。

構造化プログラミングというのはおもくそ簡単に説明してしまえば恣意的な制御のジャンプを抑制するもので、誤解を恐れずに書いてしまえば goto 文を飼い慣らすためのものだ。なので、近代的な言語は break, continue, return といった形での飼い慣らされた goto だけを採用する事が多い。例外処理は goto というよりは longjmp じゃねえのかとも思うが、これも飼い慣らされたジャンプには変わりない。

それじゃあオブジェクト指向プログラミングはどうなのかと言われると、やはり誤解を恐れずに書けば関数ポインタテーブルへのシンタックスシュガーだ。そもそも C 言語の頃から関数ポインタを用いた多態と詳細の隠蔽ってのはできたわけで、クラスベースにしろプロトタイプベースにしろ多態性ってのは本質的に関数ポインタだと思ってる(クロージャもプラスアルファで入るか?)。継承だのカプセル化だのといった枝葉末節は極めてどうでもいいし、どちらにしろ C などのレベルで実現不能ではない。ただ非構造化プログラミング言語で構造化プログラミングを行うのにそれなりのコストがかかるのと同様に、非オブジェクト指向プログラミング言語ではオブジェクト指向プログラミングにコストがかかるってだけ。

じゃあどのぐらいコストがかかるのかというと、試しに C 言語でオブジェクト指向プログラミングをやってみればわかる。今回はハッシュテーブルを利用してプロトタイプベースの実装を睨んだコードにしたが、まあ構造体を使っても面倒な事には変わりない。ソースは以下の通り。

#include<stdio.h>
#include<malloc.h>
 
/*****************
 * ハッシュ関数など *
 * 定数値は適当    *
 * ***************/
const int HASHSIZE = 3000;
const unsigned int HASHSEED = 17;
 
unsigned int hash(char *str) {
  unsigned int h = 0;
  unsigned char *c;
  for (c = (unsigned char *)str; *c != '\0'; c++) {
    h = HASHSEED * h + *c;
  }
  return h % HASHSIZE;
}
 
/**********************
 * オブジェクトの要素 *
 * ********************/
typedef struct HashVal {
  char *key;
  void *obj;
} HashVal;
 
#define Object HashVal*
#define Attr HashVal*
 
/************************
 * オブジェクトの初期化 *
 ************************/
Object initialize(void) {
  Object obj = (Object) malloc(sizeof(HashVal) * HASHSIZE);
  return obj;
}
 
/****************
 * メンバの取得 *
 * **************/
void* getAttr(Object obj, char *name) {
  int h = hash(name);
  Attr attr = &obj[h];
  if (attr != NULL) {
    if (strcmp(attr->key, name) != 0) {
      return NULL;
    }
    return attr->obj;
  } else {
    return NULL;
  }
}
 
/****************
 * メンバの割当 *
 * **************/
void setAttr(Object obj, char *name, void* attr) {
  int h = hash(name);
  Attr newattr = (Attr) malloc(sizeof(HashVal));
  newattr->key= name;
  newattr->obj = attr;
  obj[h] = *newattr;
}
 
int foo(Object obj) {
  puts("foo");
  return 1;
}
 
int bar(Object obj) {
  puts("bar");
  return 1;
}
 
int main(void) {
  Object obj;
  obj = initialize();
  setAttr(obj, "foo", &foo);
  printf("%d\n", ((int (*)(Object)) getAttr(obj, "foo"))(obj));
  setAttr(obj, "foo", &bar);
  printf("%d\n", ((int (*)(Object)) getAttr(obj, "foo"))(obj));
  return 0;
}

メモリの解放もエラー処理もやってねえし、ハッシュの衝突とかあんま考えてねえし、実はこれでも全力で手を抜いたのだ。それでこれなんだから、本格的にやろうと思ったらオブジェクト指向プログラミングのためのコードだけでもデバッグが大変だろう。さらに上記のコードは splint などの静的解析ツールにかけると警告の山になるので、そもそもコードの品質は良いとは言えない。それを直すのは面倒なんでそのままにしちゃったけど、本来はこれでよしとしちゃダメなレベルだ。つまり決して不可能ではないが、 C 言語のような言語ではオブジェクト指向プログラミングは超面倒ということ。

似たような事を Io で書くとこうなる。

obj := Object clone
obj foo := method("foo" println; return 1;)
obj foo println
obj foo = method("bar" println; return 1;)
obj foo println

あんまりナイーブに比較していいものではないけど、オブジェクト指向プログラミングのエミュレートは大変ってことはわかると思う。

なんか話がえらいことずれて行った気がするけど、とにかくオブジェクト指向プログラミングを理解させるにはこうしたプログラミング手法の進歩の話をせざるを得ず、研修中にちょこちょこと話して理解させることのできるような代物じゃないわけだ。流石に俺は 21 世紀になって「動物クラスを継承してワンワンニャーニャー」なんてごまかしでお茶を濁せるような恥知らずじゃねえし。

俺としては関数プログラミングの概念も教える必要があると思っていて、というのもクラスベースのオブジェクト指向プログラミング言語はプロトタイプベースのそれの特殊ケースであり、プロトタイプベースは関数型言語で大抵はエミュレートできる、というか関数型言語のサブセットに近いと思ってる。それと契約プログラミングとインターフェースの関係とか、オブジェクト指向プログラミングの周辺知識って意外と多いのよ。

そしてここら辺をちゃんと学んでる職業プログラマというのは今の会社ではほぼ皆無で(60人中3人もいないと思う)、実際には新人に教える前に他の社員がダメダメなのだ。というわけで他の社員にもこの辺の知識は是非とも学んでほしいというか、あまりに知識・スキルに差があると議論にならねえんだよクソッタレ。少なくとも今日書いた内容はたいしたものじゃねえんだけどなあ。

追記:よくよく見たら const を付けるべきところに付いてねえとか、最初に書き上げた時に思ったよりもツッコミどころ満載だなあ。まあいいか、手抜きだって書いてるし。

2008-08-11
Mon

(23:01)

何かパートナー企業の新人(VB の経験はあるらしい)にも研修を受けさせることになった。まあ、完全に知識ゼロではないので他の連中よりはマシだろう。

それにしてもこっちからいろいろ構ってやらないと何も進まない奴ってのは一体大学で何を学んで来たんだ? 大学ってのは講義はあくまでもベースに過ぎず、施設や人脈を利用して自発的に専門的な事を学ぶところで、そんな受身な態度でいられるようなところじゃねえはずなんだが。

かと思ったら、バカと東大は使いようの書評に『「先生、何やったら“優”をくれるんですか?」と質問する東大生』なんつー事例が書かれていやがった。うーむ、俺と友人はどんだけ講義の内容より上の事を学んで講義内容をコキ下ろせるかとか、そういう事にやっきになっていたんだがなあ。おかげで極めて歪な形で学習が進んだものだし、こうして体得した精神性というのはむしろ社会に出た後に役に立つんだがなあ。

2008-08-12
Tue

(00:22)

一昨日は関数プログラミングから C レベルの手続き型プログラミングの間にプロトタイプベースとクラスベースの OOP がプロットされるとか言うような事を書いたけど、それとは直行した概念として型システムがあって、これは何となくだけど、論理型言語を頂点にして C や Java みたいなところへ降りて動的型付けへ至る道がある気がしてる。俺が Haskell とかに目を付けたのは、何となく推論を含む強い型付けは論理型に近いところにあるような気がしたからでもある。当然、確証はまだ無い。

そしてその辺をすべて統括する概念が契約による設計だと思うのだが、それを説明できるほど俺の頭はよくないのでとりあえずアイディアだけ書いとく。それでも何となく感じていることを書き出すと(かなり曖昧で適当な書き方なんでワケワカだろうけど)、

  • 制御フローの一貫性を保つための構造化プログラミング
  • 権限の一貫性を保つための関数プログラミング由来の手法
  • 性質の一貫性を保つための型システム
  • 上記のすべてを包含してシステムの一貫性に関わる契約

という事なのだが、これが核心を突いているのか的外れなのかさえわからん。何しろ、まだ考えが全然まとまってないんだから。残念ながら、今の俺の脳みその限界はこのあたりらしい。

(22:53)

  1. できる奴の不足を補うために、できる奴を見つけて採用したい
  2. 中小の下請け企業なのでそもそも応募の絶対数が少ない
  3. 応募者を増やすには広告を打つ必要がある
  4. さらに敷居も下げないと応募者が来ない
  5. 敷居を下げるとどう考えても向いてない奴がやってくる
  6. 向いてない奴を無理に使ったところで本人のスキルも単価も伸びない
  7. スキルが伸びないと上流工程や基盤技術の仕事ができない
  8. 上流や基盤ができないのでビジネスが広がらない
  9. 中小企業としての地位が固定されていく
  10. そこから脱却するためには良い人材を入れるか育てる他無く、そして最初に戻る

2008-08-13
Wed

(21:53)

新人のうち一人に本採用拒否の通告をすることになった。いや、もう上司がしたんだっけな。できればそういう事にはしたくなかったが、最初のうちは全然勉強してなかったし、一旦最後通告を出してから厳しく指導しても全然身につかなかったし、何より本人がプログラムを書くことを苦痛にしか感じていないようなんだから仕方がない。

他の新人にも歩みの遅い奴はいるけど、そういう奴でも全然思い通りにならなかったコードが動くようになったとき、それまで沈んでた表情が明るくなるんだけど、結局そいつは最後までプログラムが動くということに喜びを見出せなかったように思える。それは本人も辛いだろうし、周囲にとっても辛いことなんだよな。

それでも、そういう決定的に資質の欠けてる奴を末端のコーダーとして多重下請け構造の最低辺に送り込んで、実際のコードと一対一対応なプログラム設計書を渡して厳しい監視下に置いたり、あるいは「機械にやらせろよ」と言いたくなるようなクソな雑用をクソな現場でやらせたり、そういった人間の尊厳が怪しくなるような仕事をさせれば多分最低限の人月単価は取れるとは思うし、そうやって稼いでいるところが今の会社にないとは言わないし、他の会社もやってることだ。

ただ、俺はもうそういうのは心の底からゴメンで、「ダメな奴を無理やり使うためのクソのような統制」「クソのような統制による士気の低下」「メンタル面をやられることによる無能レベル以下への転落」という不幸の連鎖をこれ以上拡大させないために、やっぱここで本採用拒否をしとかないとダメなんだ。

private void foo() {
  int a = 1;
  int b = 2;
  int c = sum(a, b);
}
 
private int sum(int x, int y) {
  return x + y;
}

そいつは結局最後までこのコードがまったく理解できなかった。文法もまったく覚えられなかったし、値を渡したり戻したりという概念も理解できなかった。きっともっと根本的なところで何も理解できなかったんだろう。

もしもこの日記を読んでいて、そして他の業種からこの世界に転職したいと思っている人がいるなら、お願いだから転職する前にプログラミングを学び始めて、それでプログラミングが面白いと思えたときにだけ転職してほしい。そうでない人にとってこの世界は酷く辛いだろうし、見ているこっちも辛い。

2008-08-14
Thu

(00:19)

そういやあと一週間かそこらで Dragonforce の新譜が出るんだよなーと思ってオフィシャルサイトをチェックしたら、新作からの PV が既に公開されてた。

まあ、相変わらず。しかし ZP は化粧濃すぎないか? V 系にでもなるつもりか。大体お前らはアキバ系のバンドだろ。そういや Herman が指に付けてるエフェクター、あれアキバの Music Vox で売ってたんだよな。俺はああいうギミック奏法をやる余裕なんぞないので買わなかったけど。

(22:30)

昨日書いたことの続き。適正があるかどうかすらわからん素人をプログラマとして採用してしまうという状況はまったくもって恥ずべき事であり、面接の時にコードを書かせたり自分の作品を提出させたりすれば間違った採用は激減するという意見はまったくもってその通りだ。それじゃあ自分の会社でそういった採用条件を用いたとして、それでも応募者が十分やってくると自信を持って言えるところがどれだけあるんだ?

実際のところ俺は「面接時にコードを書かせるという条件で一度やってみろ」という意見を出しているが、返ってきた答えは「それじゃあ応募者が来ない」だった。確かに中途採用ですらまったくの未経験がぞろぞろとやってくる現状で、そんなハードルを設けたら応募者は激減する。ここ数ヶ月の状況でいえば、恐らく 10 人中 3 人しかハードルを乗り越えられないだろう。新卒の状況はもっと酷く、恐らくここ三年に限定すれば俺以外の全員が脱落していただろう。

前にも書いたが採用には金がかかるもので、広告費だけでも今回は 220 万円ほどかかっている。採用にかかるコストというのは採用できた社員に均されるもので、今回は広告費だけで見ると一人採用するのに 22 万円という金額になり、平均的な社員の月あたりの利益では三〜四ヶ月分の金額だ。これがもしも 3 人しか取れなかったら、費用対効果は 30% 以下に落ちてしまい、ペイするまでの期間がその分長くなってしまう。

そして末端のコーダーとできるプログラマの平均的な人月単価の格差は倍もなく(せいぜい 1.3 倍?)、そして面接の時点でコードを書ける奴がその後順当にスキルと単価を伸ばせるという保証もなく(実際多少コードが書けたけど最終的にアレだった奴とかいるし)、できる奴の少数精鋭を揃えるよりも玉石混交で採った方が間違った採用で発生するコストを計算しても金になるという現実があり、前者の方が明らかに金になるような状況に持っていかない限り「未経験者歓迎」の文字が採用広告から消えることは決してない。

これは本当に恥ずべき事態であり、どうにかして改善しなければならない。ただ、実際のところ未経験で入ってから伸びる奴というのも存在するし、まったくの不向きでもなければそれなりに仕事をこなせるようにはなり、そういった人達にチャンスが与えられない世界もやはり間違っている。

もっともプログラミングというのは PC とインターネットがあればほぼノーコストで学び始めることができるので、それでも面接までに何も準備してこないというのはダメだと言われるかもしれないが、果たして自分の専門外の分野について独学で学び始めるという事ができる奴がこの日本にどれだけいるのか凄まじく疑問だ。というかうちは研修問題の一部をお試し版というか予習版として公開しているのだが、入社するまでにそれに目を通した奴は揃いも揃ってプログラミングの経験者だったというお寒い現実があるのだよな……。

2008-08-15
Fri

(23:23)

採用拒否の通告を出したといっても、確か法律上は一ヶ月の猶予期間を設ける必要があって、その間に決められたノルマを達成できたら採用拒否は取り消すということになっていたらしい。まあ、今までのペースじゃ確実に無理なノルマなので結局ダメだと思うけど、それを乗り越えられるんならそれはそれでいいか。

もっとも同期の奴より

「今日そいつのノートを見たら、 String#indexOf の Javadoc をそっくりそのまま書き写したページがあった

という恐ろしい報告を受けているので、何ていうかやっぱもうダメだ。そいつは勉強してないんじゃなくて勉強の仕方が壊滅的に間違っていて、はたから見ると全然勉強してないようにしか見えないんだ。そういうひたすら黒板の内容をノートに取る的なやり方はそもそも勉強じゃなくて、勉強してるというポーズに過ぎないんだけどなあ。

その新人はこれまで派遣だか契約社員だかで雇用が不安定な状態で、とにかく正社員として働きたいと思っていて、それで藁にもすがる思いで「未経験者歓迎」なうちに来ちゃったんだよな。でも「未経験者歓迎」といっても「未経験者でも確実に仕事ができるようになります」じゃねえんだよな。今の状態じゃ採用拒否は確実だし他の分野でも厳しい物があると思うので、今後に役立つようにもうちっとマシな勉強方法とかを教えておいた方がいいかも知れん。

2008-08-16
Sat

(15:55)

いやー、 Google Street View はすごいねー。何が凄いって、俺が初めて行く診療所とかに迷わず着けたんだよ、このサービスのおかげで。俺は駅から徒歩 20 分程度の場所に散々迷った挙句 3 時間ほどかけてたどり着いたという前科が山のようにあるので、マジでこのサービスは大ヒットだ。

もっともそういう使い方するなら大通りの情報だけがありゃあ十分で、住宅街とかにバンバカ突撃する意味はまったくねーよなー、っていうかそっち方面の詳細な情報のニーズなんて犯罪者以外にはねーよなーとも思うわけで、こういう大雑把さというか下品さはある意味 MS にも通じるというか、むしろこれはアメリカ的な下品さか。

まあ、 Google という会社の戦略というのは各国の常識、倫理、法律をまず頭から無視して俺国俺法サービスをおっぱじめて、何かあってから対応とかそういうものだからな。ビバリーヒルズコップ風にいえば「尋問する前に発砲」スタイルで、案外これって有効な手段だったりするんだよな。品性というか知性というかそういうものは何一つ感じられないけどよ。

それにしてもそうやって他人の価値観を土足で踏みにじってそれで「クール」とか言われるのは実に羨ましいので俺もそういう人生を送ってみたいとかちょっと思ったけど、でも「お兄ちゃんは他人のプライバシーに土足で踏み込んでお金を稼いでいます」とかいったら妹たちが二度と口きいてくれなくなりそうなのでやっぱ俺は普通の稼ぎ方でいいです、ハイ。

2008-08-17
Sun

(23:15)

ふと立ち寄った楽器店で KAOSSILATOR なんていう代物があったので、思わず買ってしまった。それで適当にいじくり回しているうちに何か曲を作ってみたくなったので、試しにやってみた。

1 分かそこらで終わるので精神的苦痛はそれほど受けないはずだ。ちなみに作曲自体は 1 時間もかかっていない。というか、作曲のプロセスはこんな感じ。

  1. 録り貯めておいたリフから適当な奴をチョイス
  2. リフから曲のキーを逆算してソロを大雑把に考える
  3. 何ビートの曲にするか勘で決める
  4. 終了

というわけで、作業を始めたのが 20 時ぐらいで、たしか 21 時ぐらいにはドラムの打ち込みを終わらせて、そっからギターリフとベースを録音してソロを入れて、一番の目玉の KAOSSILATOR を録音してと一通り終えたのが 22:40 ぐらいかなあ。というわけで、今回はまったくもって何一つとして練習してないので覚悟して聴くべし。ってか KAOSSILATOR はぶっつけ本番やり直しなしなんだよな。まだ全然効果的な使い方がわからないから、何回録り直しても多分一緒だろうし。

曲のタイトルはもちろん KAOSSILATOR の外見からつけたってのもあるんだけど実はもう一つ意味があって、というのもこの曲録り終わってから「何かに似てるなー」と思ってたら、信じられないことに In Flames の "Touch Of Red" にギターソロがそっくりだった。いや、全体としては違うソロなんだけど、ソロの入りの部分がもうそのまんま。でも他にソロのネタもなかったし、まあいいやと思ってそのままにしちまった。

ベースが何やってるか相変わらずわからんが、まあなんていうかリズムギターを思いっきり歪ませたらベースともろに干渉しちゃって、さらに KAOSSILATOR の音ともぶつかりまくって、結果としていろいろダメダメなわけだが、まあおかげで明らかに縦のラインが揃ってないのを多少は誤魔化せてるからいいか。

しかし BPM 100 で 16 分音符を全部ダウンピッキングするのは疲れる。単純計算すると、 BPM 200 で 8 分音符を全部ダウンピッキングしてるようなものだからな。でもそれぐらいできないと BPM 200 オーバーの曲で 16 分音符が弾けないんだよな。前に録音した Paranoid もリフは全部ダウンで弾いてるしな(こっちは BPM 160 ぐらい)。

というわけで手に入れてから半日も経ってないのでまだよくわからん事だらけだけど、これは結構遊べそうな気がする。何せ適当に指でなぞってるだけでフレーズらしき物が出来上がったりするからな。今のところあんまりメタルっぽいフレーズにはならないけど、むしろそっちの方がありがちな感じにならなくていいか。

あ、 Vorbis タグにも書いておいたけど CC の BY でライセンスしてあるんで、何かに使いたいとかいう人が万が一いたらどうぞご自由に。

2008-08-18
Mon

(00:43)

しかし流石に何も考えずに適当にぐねぐねと出力したノイズをやはり何も考えずに録音した音の上に重ねても何にもならんということがわかってたけど身をもって実証できたので、次からはもうちっときちんとした曲を作……れたら誰も苦労しねえっての。

そして今までの時点で十分以上にカオスだった各種の配線が今回追加した KAOSSILATOR のおかげでさらなるカオスになってしまっていて、さてどうしたもんか。ラックに段を増やせばまだしばらく戦えそうだけど、ラックの部品がどこの店でも取扱い中止になってるんだよな。

いっそここらできちんとした奴に買い換えるべきかもしれないなー。

(22:06)

結局例の新人は、猶予期間の終了を待たずして辞めることになった。まあ、これ以上居続けても仕方がないだろうしな。採用する方が悪いと言われそうだし実際そうなんだけど、まず俺は人事については権限なんざもってないからな。それに面接だけじゃ向き不向きとかなんてわからないし、募集要項に「面接の前にプログラミングについて通り一遍の知識だけでも身につけとけ」とか書いた程度で、うちみたいな所への応募って激減するらしいし。

でもまあ、応募する方も何考えてんだかなーって思うのも確かで、自分が向いてるかどうかわからん専門技術の世界に飛び込むって、それ紐付けないでバンジーするのと同じだろ。

そして来月にはまたコードレスバンジージャンパーが二人ほどやってくる予定で、もうこれについては入社するまでに勉強しておいてくれと切実に思う。上司が研修で使う書籍を渡してあるはずだから、できればそれ全部に目を通して一通りのプログラムを書いておいてほしい。

しかし 29 と 32 というのはかなりアレな年齢だ。これが入社までに猛勉強してくれるような人なら全然いいんだけど(ポーズだけでなく行動の伴う人は歓迎)、ぼけーっと過ごしてしまうような人だとキツいなあ。

(23:26)

今年は特にまだ夏休み取ってないんだよなあ。来月までに取っておかないと完全に取りそびれてしまうんで、今週末あたりに取っておくかなあ。

2008-08-19
Tue

(22:05)

NHK 教育テレビのアニメ系超絶早回しスピードバカメタルバンド、 Dragonforce の "Ultra Beatdown" を買ってきた。とりあえず一回聴いて感じたことを曲ごとに書いてみる。

  1. Heroes of Our Time
    • PV になった曲。二回目のヴァースでピアノだけがバックになるところが素晴らしい。だからキーボードソロをギターソロの代わりに入れろと。
  2. The Fire Still Burns
    • あんまり印象に残らなかった。まあ、こいつらは曲が長すぎるんで、何回か聴かないと真価がわからんという面もある。
  3. Reasons to Live
    • Dragonforce にしてはスローな曲(十分疾走してるけど)。アレンジやフレーズが面白い曲なんでふと気になって曲のクレジット見たら、案の定キーボードの Vadim とベースの Frederic が関わってた。
  4. Heartbreak Armageddon
    • なんつータイトルだ。イントロは良いのだけど、そっから先はまあまあというかいつも通り。
  5. The Last Journey Home
    • ミドルテンポの曲に超速ソロパートをブチ込んだ単なるキチガイ曲。インパクトはあるけど、まあネタ曲。
  6. A Flame for Freedom
    • バラード。 Dragonforce のバラードには外れが無い。どれもどっかで聴いたような曲とかいうツッコミはやめよう。
  7. Inside the Winter Storm
    • 半分過ぎたあたりから 2nd で聴いたようなパートにならねえかこれ? いやまあもっと言えば全体的に前に聴いたような感じがするんだけど、こいつらの音楽は洗脳音楽なんで細かいことは忘れよう。 Sam 、やっぱりいっぱいいっぱいじゃねえのか?
  8. The Warrior Inside
    • 通常版のオーラス。メインテーマのメロディを聴いて大体ネタが割れたので曲のクレジットを見たらやっぱ Vadim も一緒に書いてた。この曲に関してはギターソロ入れずにキーボードソロだけでやってほしかった。まあ、この曲に限った話じゃないけどな。
  9. Strike of the Ninja
    • 何か特別版のボーナスらしい。 Dragonforce にしてはスローで、爆走してない曲の方がギターソロがいい気がするけど、気がつかなかったことにしよう。
  10. Scars of Yesterday
    • これまた特別版のボーナス。 Vadim のキーボードがもっとも全面に出た曲で、レイヴか何かのようなフレーズが飛び出す。これが一番面白い曲というのは一体どうなんだ、というかこれも書いたの Vadim と Frederic かよ。
  11. E.P.M.
    • Frederic の書いた曲。確かに他の曲と違うといえば違うか。もうちょっと普通のヨーロピアンメタルに近い感じだけど、結局は Dragonforce のような。

手を替え品を替えてるつもりでも結局は同系楽曲の金太郎飴アルバムというのはもうみんな流石にわかっているだろうというか、流石にもうここまでやればご立派としかいいようがないよな。普通の神経してたら 2nd か 3rd の時点で満足するか反省して方向性を大きく変えると思うんだけど、こいつらマジで速いアルバムしか作るつもりが無いらしい。

通算四枚目でネタ切れとか曲構成が無茶苦茶とかそういう事実に向き合ってるのか気がつかないふりをしてるかは不明だけど、とにかく過剰なアルバムを作りつづける姿勢は褒めておいてもいいと思うんだ。間違っても Herman や Sam みたいなギタリストになりたいとか思わないけど。あとどう考えても Sam はかなりネタが苦しくなってきてるので、他のメンバーはもっと手伝ってやろうぜ。

2008-08-20
Wed

(01:14)

どうやら採用拒否というのは今の会社が始まって以来の事らしいのだけど、それは会社としてまずいだろうと思った。何せ向き不向きのまったくわからん素人を雇うんだからそれなりに不適格者が出てくるはずで、それを切れないと現場に迷惑がかかるっての。いや、切っちゃうと確かに本社の空気は多少悪くなるだろうし、切る方も辛い面があるってのは前にも書いてるんだけど。それでも見習い期間の奴を切るという選択肢をもたらしたのが明らかに会社で一番若い俺というのはかなりマズい。

しかし今回の奴は凄く特殊なケースだったかもしれない。ソースの暗記とかコピペ元を探してきて誤魔化すとか、そういう暗記重視の試験勉強的な能力は高かったんだよな。何となくだけど、そういったやり方で大学まで行けて社会に出れちゃって、それが成功体験になってしまって、結局そこから抜け出せなかったのかなと思う。 Javadoc の写経とかやってんのを見る限りでは。

でも特定の成功体験に拘るのって事実上の自殺行為なんだよ。システム開発やった事のある人ならわかるでしょ、前のプロジェクトのやり方を踏襲してグダグダな状態になるとか。そんなに自殺したいなら、周囲に被害がでる前に俺があの世に送ってやるから名乗り出ろよといいたい。環境が違えば何が最善な行動かなんてコロッと変わるし、同じような環境でも集まった人員によってはやっぱり変わるし、単純に時間の経過でだって変わるだろう。そういう事を人生の早い時期のどこかで学んでないと適応障害とかいう状態になって、それで何事も上手く行かなくなったりするんじゃないか。

まあ、既にいなくなった奴のことをあーだこーだと書いても仕方がないんだが。

(22:55)

むー、場合によっては C# の仕事かー。いや、俺は別にいいんだけど他の社員は大丈夫なのかな、と思っていたら、どうも俺が他のメンバー全員の Mentor めいたことをやるというのが前提のようだ。ちょっと待て、マジで俺にそこまでやらせんのか。……って他にできそうな奴がいないから仕方ないけど、なんだかなあ。

もっともそれを言うなら今の会社で R&D をやってるのって俺ぐらいしかいないというか、他の連中が現場に出てようやく俺がそういう事をできる余力が生まれるという状態なんで、このままじゃ俺と他の社員のスキル格差がさらに開いちまうぞ。それにプライベートの時間を使ってプログラミングとかソフトウェア工学の学習をしてるような奴の絶対数がそもそも少なくて、どうにもこのままじゃみんな Java と心中だよなあ。それを防ぐためにもやっぱ企業内での情報交換とかは重要なんだけど、今んところ俺が一人で旗振ってるようなもんだからなー。

ところで最近思うのは世の中の問題の結構な部分が「俺/私が世の中で通じない」という状況への適応力不足な気がしてきて、とりあえず今回採用拒否にした新人とか、前の現場で俺に散々尻拭いをさせて気がついたらフェードアウトしてた奴とか、うちに巡り巡ってやってくる学歴はあるけど職歴見たら「ありゃあ?」な奴らとか、何か結構みんな似てるんだよな。

俺の価値観と 100000000000000000000000 光年離れたところにあるんで気がつかなかったけど、勉強しようとしない理由の一つに「自分の理解を越えている物があることを認めたくない」っていう、信じがたい理由があるんだよな。いや、マジで「わからない物を見るのが嫌だから勉強しない」って奴は存在するぜ。それでそういう奴ってのはいわゆるお受験的な勉強はできるってパターンが多くて、つまりは一つの成功体験に縛られて、そこから逸脱したものを認められなくて、泥沼にはまっていくと。ニートとか氷河期とか没落エリートとか時代遅れの技術者って、この「同じ手がいつまでも通じると勘違いした結果」という部分が決して少なくないと思うな。

まあ、ぶっちゃければ挫折が嫌なだけなんだな。挫折したり苦労したりすんのをあんまり拒否しすぎると、ある時に一挙にツケを払わないといけなくなるってのに。

もっとも本人だけを責めるのも酷っちゃそうだから、うちみたいな企業が永世フリーターのワーキングプアよかちったあましな選択肢として存在しないといけないんじゃねえかなとも思うんだが、それにしても最近は俺の懐も破れそうなんで、新人も他の社員も本当みんな勉強してくれよ。せめて「Java が廃れたらどうすんの?」「俺が死んだらどうすんの?」の二つには答えられるようになってくれよ。

……というか俺程度の技術者が会社始まって以来のエースと言う時点でゲーム終了かもしれんが。

2008-08-21
Thu

(00:33)

  1. 新しい仕事の話をするために待ち合わせ場所にいったら、ピンハネ業者の男が現れた。ちなみにそいつは服装も言葉遣いも頭も悪かったという
  2. そのピンハネ業者の男に指示されて別の場所に向かったら、第二のピンハネ業者の男が現れた。そいつは頭は悪かったようだが、最低限の身なりと言葉遣いはできていたという
  3. 実際の仕事場に付くまでに第三のピンハネ業者の男が現れ、ようやくまともな仕事の話になった
  4. その日は最終的に一次請けの人間とも会ったが、その仕事は目に見える範囲だけで「顧客」「一次請け」「二次請け」「三次請け」「四次請け」というレイヤーがあり、つまり五次請けの仕事が回ってきたということらしい

……いや、俺の話じゃないよ? ま、こういう事もあるってわけよ。

(01:08)

薬のおかげでだいぶ症状は落ち着いてきたけど、まだ多少咳が出るな。それでも日常生活というか研修で指導するのに支障のでるレベルじゃなくなったんで、まあいいか。でもこれ、薬の服用止めたらまた元に戻るような気がするなー。何にせよ再来週にもっぺん検査するっぽいので、それまでは何とも言えないか。

(20:28)

ぬー、やっぱ次の仕事は C# か? まあ、コンペで勝たないと取れないわけで、今からグダグダ考えていても埒があかないんだけど。というわけで、今日は Java と C# の簡単な比較表を作る羽目になった。まあ、あくまでも A4 一枚で収まる程度の軽いものだったけど。

しかし C# の言語仕様で究極的に理解不能なのが null 許容可能にできるプリミティブ型だ。これは最悪だ。何が最悪って、 null こそ近代プログラミング言語が解決しなければならない問題であり、というのも無思慮な null の使用はソースコードの可読性、メンテナンス性、デバッグ性を急落させるからだ。たとえ型宣言のある言語であっても、戻り値として null が返された瞬間にその情報を失ってしまう。そして null 参照による例外のスタックトレースに、当然 null がどこに現れたかは出ていても、どこから null がやってきたかは書かれていない。というわけで、俺は null が無条件に参照型の値になれる言語を安全などとは認めていない。

この null 問題の解決方法はないわけではなくて、その一つが DbC 、契約による設計だ。これは Java でも AspectJ などでできるが、俺はそういったサードパーティのライブラリなしでは契約プログラミングのできない言語はいい加減滅ぶべきじゃないかと思う。確か Sun はアスペクトは決して Java に取り込まないとか言ってた気がするけど、既に現状 Generics とかで複雑化してるんだからもう取り込んじまえって感じだな。ま、とりあえず実際にやると次のような感じになるかな。くだらない例で悪いけどさ。

//Test.java
public class Test {
  public static void main(String[] args) {
    System.out.println(new Test().foo());
  }
  
  public String foo() {
    return null;
  }
}
 
//Dbc.aj
aspect Dbc {
  pointcut atFoo(): execution(String Test.foo());
  
  after() returning(String s): atFoo() {
    if (s == null) {
      throw new RuntimeException("foo");
    }
  }
}

AspectJ を使ってコンパイルして実行すれば、実行時例外が投げられるのがわかると思う。元のソースファイルにアスペクトというか契約の情報が出てこないのが極めて気にくわないが、そこら辺は開発規約とチェックツールで頑張るしかないか。もっともこの辺の話を理解してついてこれる開発者が現場にあんまりいないので、実践で有効なのかどうかのチェックすらできていないのが情けないのだが(別に難しい話じゃねえだろうに)。

俺的にこの問題に一番有効な解法を与えていると思うのが Haskell で、 Maybe モナドなどをみると代数的データ型とモナドの組み合わせの強力さがわかる。やはり強い型付けとか型安全性を謳うならこのぐらいやってくれないとな。もっとも Haskell は俺も使いこなせないので、さらに実戦での有効性が不明なんだけど。

とにかく、いい加減何も考えずに null を使うのはやめにしないか。こいつはプログラミング言語のセマンティクスに現れた特異点であり、この世界の邪悪の根源であり、ドラムバッグ一杯につまったクソ虫だ。特にバカでかいフレームワークを読み解いている最中に null 参照で死なれると、本当に追うのが厄介な事が多いんだよ。

そういや C# の null 許容可能プリミティブ型の説明でデータベースの null 値とプリミティブ型の間のインピーダンスミスマッチがどうのこうのという話を読んだことがあるけど、データベースにおける null は汎用のプログラミング言語における null 以上の厄介者で、端的に言えばハルマゲドンをもたらすものだ。関係モデルにおける null というか三値論理のヤバさについては「3値論理 —— 神のいない論理」が大変参考になる。というわけで、可能な限りすべてのカラムに NOT NULL 制約をつけよう。

追記:じゃあ null 使っちゃダメなら何使えばいいんだと言われそうだが、 NullObject 使えって感じだな。

追記2:文脈でわかると思うけど、上で書いてるデータベースってのは RDB のことね。

(22:40)

そういやバーチャファイターの新バージョンについて何も書いていなかった気がするので、とりあえず何回か遊んでみた感想を箇条書きにて。

  • 相変わらずゲーム性がマニアック過ぎ。鉄拳よりも操作性は好きなんだが
  • 複雑度のインフレは当然治まっていないので、完全に初心者お断り
  • というか俺みたいなフラッとゲーセンに立ち寄る程度の人間にはかなりキツい
  • 相変わらずカードを作っていないと遊んでくれる人が激減する
  • 新キャラのジャン紅條が空手使いだったので、カードはジャンで登録した
    • 前作で持ちキャラだったゴウは俺の主力技が変更されたりなんだりしていて萎えたので使わない方向で
  • 正拳突きで突撃して二択を迫るのが基本らしい。空手らしい重い打撃をブチ込むのは楽しいが、いささか上段攻撃が多すぎないか
  • 技の多くが直線的なので、どうも軸移動の上手い相手にはキツそうだ

結局今回もやり込む暇なんぞなさそうなので、あっという間に脱落しそうだ。

2008-08-22
Fri

(23:04)

何ていうか、疲れた。具体的な事を書こうと思ったが、どうにも腹の底からドス黒い感情が逆流してきて仕方がないので風呂に入ってからちと休もう。

2008-08-23
Sat

(00:45)

日本語が多少怪しいけどプログラムの書ける外国人とプログラミングはまったくの未経験でコミュニケーション能力にも乏しい日本人、俺だったら何の躊躇もなく前者を採用するんだけどなあ。大体、わざわざ日本語勉強して日本の会社を受ける人達が「愛国無罪」とか叫んで暴れてるバカと同じ穴のムジナなわけないだろうが。

(23:53)

仕事のことを書こうかと思ったけど、気が滅入ってきたので最近クリアしたゲームの事を書くことにする。

大学の時からの友人がずっと前に賞賛してたので先月頭あたりに買ったんだった。発売されたのは一年以上前だけど、スクエニのゲームなんで入手は容易だろう、多分。詳しいゲームシステムは説明がかったるいんでオフィシャルサイトを見てくれって感じだけど、この上下の画面でそれぞれ別といってもいい戦闘システムというアイディアは予想以上に面白かった。

「上下の画面で別戦闘が同時進行? 無理じゃん」と思う人が多分多数派で、ぶっちゃけ無理なんだけど、そこは工夫次第でどうにでもなる。アクションゲームが得意じゃない人は上画面をオートにして練習できるし、そもそも同時に両方の画面に集中する必要性は全然ない。たとえば俺のプレイスタイルはこんな感じだった。

  • まずは戦闘開始時に敵の配置を把握、攻撃方針を決める
  • 基本は下画面をメインに戦い、上画面は敵の密集している方向などに攻撃を適当に(上画面はほぼ見ない)
  • 下画面で弾切れになったり、敵が減ったりしたら上画面メインに戦う(下画面はほぼみない)
    • 装備と敵の組み合わせによっては上画面メインでずっと戦うこともある
  • 両画面とも敵の情勢を見つつ、攻撃と回避を切り替えていく(メインでない画面はチラ見する程度)
  • 敵の攻撃は基本的に激しくないので、意外とじっくりと画面を見れる

というわけで、両方の画面を注視しないといけない事なんて殆どなかったりする。どちらの画面に集中するかの方針を戦闘開始前の数秒で決定し、状況を素早く判断しつつ上下の画面への集中を切り替え、システム上大きく変動するダメージ倍率などを計算して戦うというアドリブ性と戦術性がこのゲームの最大の売りだろうな。

あともう一つ凄いシステムとして、その時点の最大値の範囲でレベルを任意のレベルに調整できるというものがある。つまりはレベル 10 だけどレベル 1 にして戦うという事が可能になるわけだ。そしてレベルを下げて戦うと敵のアイテムドロップ率が上がるというとんでもないデザインがなされており、敵のドロップ率のところに 1% とかの無茶なレートの指定されてる奴も、レベルを下げれば入手可能な率が現実的な数値に上がる。さらにはアイテムを入手すれば最大 16 連戦まで可能で、連戦すると敵が強くなるのと引き換えにドロップ率などが上がる。というか、そうでもしないと 0.1% とかのドロップレートのアイテムが手に入らない。

そしてトドメに難易度が「EASY」「NORMAL」「HARD」「ULTIMATE」と用意されており、特定難易度というか ULTIMATE でしか手に入らないアイテムもあり、つまり俺のようなゲームマゾかつゲームサドにとっては夢のようなシステムだ。そうだよ、俺はもっと敵を殺したり逆に殺されたりしたいんだよ!

あ、シナリオとかキャラクターは「中二病」の一言で終わるのだけど、クリア後のおまけで本編のストーリーの「裏側」が語られるのはなかなかのサービス。まあそっちも結局「中二病」には違いないのだけど、ここまで仕込めばご立派。

本編のクリアにかかった時間はそれほどでもなかった気がするけど、結局 50 時間以上遊んでたな。それでもアイテムのコンプリートとか出来てないので、そういうのにムキになる人は 100 時間ぐらい遊べるんじゃなかろうか。

あとこれはすげーどうでもいい話なんだけど、腐ったお姉様的にはヨシュアって受けと攻めのどっちなんだ? いや、何ていうかこいつって明らかにそういうのを狙ってるキャラじゃん。

2008-08-24
Sun

(15:29)

これは結構同意だなあ。「先生にいい風に評価される絵の描き方」なんてどうでもいいけど、もっと基本的なレベルの技術や理屈をちゃんと教えた方が、最終的に自由に伸び伸びできるようになると思うぞ。

俺がやってるのは絵じゃなくて音楽だけど、こっちも学校での教育はガタガタだったなあ。テクニックとか理論めいたことって、もっと学校で教えても良いと思うぞ。ってか「理論ばかりじゃ感性が阻害される」とか言ってる連中は白痴じゃねえのか? 理論を学んだ程度で潰れる感性なんざ、所詮その程度だっつーの。というか感性を活かすにはむしろ理論って重要だと思うぜ。

俺は社会人になってからギターを始めたんだけど、それで日本でドレミファソラシを音名に使ってるのが割と間違いだった知った時は驚いた。移動ドで表記する場合、絶対的な音の高さは CDEF.. で表記してドレミファの方は相対的な音の高さの表記に使うんだよな。つまり CDEFGAB の C アイオニアン(メジャー)スケールも、 ABCDEFG の A エオリアン(マイナー)スケールも、どっちも第一音を「ド」として扱うってわけ。間違えた C メジャーも A メジャーもドレミファソラシで扱うのが移動ドだ。今まで書いていたのは間違い。俺はこういうことを学校で習った覚えが全然無いんだけど、一体この国の音楽教育はどうなってるんだ? クラシック聴かせて鍵盤ハーモニカとリコーダーだけ与えて、それで理屈もわからず演奏させて一体どうしたいんだろうなあ。せめて運指のこつとかパターンぐらい教えようぜ。あと数学や理科の好きな奴にはメジャースケールには構成する音が同じ対応するマイナースケールがあるとか、民謡で使われる音階はクラシックの音階から音を抜いた結果だとか、そういう仕組み的な事を教えると間違いなく喜ばれるぜ。そういう楽しみ方を増やすためにも、いわゆる理系教育は重要だってわけだ。

24 年ほど生きてきて痛感したのは、どうもこの国はバカを有り難がる国だということだ。これは芸術科目に限った話じゃないけど、とにかく理論と実践が完全に二律背反で、どっちもできるようになろうという発想が全然無い。むしろ理論的な事を知っていると「頭でっかち」と揶揄される始末だ。俺がヘタクソながらもギターやベースを弾いて曲をアップできてる理由って、理論的なところからどうやって運指パターンやフレーズを作ったりすりゃいいか計算してる部分が大きいんだけどなあ。

そりゃあ歴史に残るような名演や名曲を残せる連中はそういった感性も鋭いんだろうけど、じゃあそういう上澄み連中だけにしか音楽や絵画が許されていないって、それどんだけ貧相な世界なんだよ。俺みたいなヘタレが何かしら演奏したり作曲したりするには、どうしても理論を知っておく必要があるんだっての。そもそも俺のような下手の横好きが一定数以上いないと、楽器店とかが潰れちまうだろ。

あと昼の仕事をして稼いだ金を趣味に突っ込むという生き方もこの国には存在しないっぽくて、俺はその一点だけでも日本は先進国の皮をかぶった後進国だと断言するね。俺がプログラム書かないで音楽やってんのは普通に考えりゃ無駄以外の何物でもないけど、豊かさってのはどんだけの無駄を許容できるかで決定されるんだよ、ヴォケ。

あと好きこそものの上手なれとかいうけど、その「好き」にはいろいろと段階があるんだよ、そもそもの話として。最初は単なるミーハー的な「好き」だったのが、実際に自分でできるようになってもっと「好き」になるわけだろ。学校の芸術教育ってのは「ミーハー的に好き」の段階にあるかどうかも怪しいガキどもに感性とか個性とかの口当たりのいいお題目を押し付けて、それで芸術嫌いを生み出してるんだよ。ガキというか人間なんて単純だから、ある程度「できる」ことを嫌いになるなんて滅多に無いんだよ。

いい加減、「感性」と「根性」と「空気」だけで構成された教育は終わりにしないか。ついでに書いとくと、うちの会社にやってくる未経験プログラマ志望のうち、明らかに覚えの悪い奴はどうにもこの「感性」と「根性」と「空気」に毒されているように思える。まずは「理」を学べ、「理」を。この「理」を学ぶことの面白さってのは初等教育の極めて重要な要素だと思うんだが、今はどうなってんだろ。改善してりゃそれでいいんだけど。

(18:32)

極めて大雑把にうちの会社の仕事のとり方を書いてしまうと、以下の三つになる。

  • ピンハネ業者から仕事をもらって相手先に常駐して開発(実は一番多い。俺はそっちには回されてないけど)
  • 一時請けの SIer から仕事をもらって相手先に常駐して開発(俺のいる部門が主にやってる)
  • 一時請けの SIer から仕事をもらって自社で開発(あんまりない。というか最近になってやるようになった)

最初の奴は論外として、目指すべきは最後の奴、自社持ち帰りだ。これはセキュリティとかいろいろうっせーのがあって大変だけど、下請けのソフトウェアハウスが利益を最適化するのにうってつけだ。なぜなら、客先常駐だと送り込んだ人数分しか金が取れないが、自社持ち帰りの場合必然的に向こうもこっちの細部を監視できないので、頭数の自由が効くのだ。それはもう、笑えるぐらいに効く。

例えば「10 人月の作業を 2 ヶ月で」などという契約であれば、普通の客先常駐ならまず5人送って 2 ヶ月拘束という事になる。それに対して自社持ち帰りの場合、できる奴 5 人が 1 ヶ月で終了させれば、時間対利益でみれば客先常駐の場合の 2 倍の利益になる。あるいは、 2 ヶ月かけるが開発に使うフレームワークの研究などを行って技術者の育成に投資を行うこともできる(これは最近少しやった)。金銭面での折り合いさえ付けば、まったく何も問題ないだろう?

実際には持ち帰り仕事のためには目玉となるような技術的アドバンテージなどが必要で、上に書いたように単純に利益 2 倍でボロ儲けみたいな事にはならないが(向こうも多少はその辺を計算するので)、普通の客先常駐よりも遥かに利益は産みやすいはずだ。

ここでの問題が一次請けなどとの意思疎通で、そもそも上流工程がアレだと開発の現場が大混乱に陥るので、上流工程のできる人間を一次請けのところに送り込む必要も出てくる。なので、自社持ち帰りをきちんとやろうとするのは一般の中小の下請け企業には結構敷居が高いだろうな。もっともそれができれば多重下請けスパイラルからの脱出につながるので挑戦する意義はある。

というわけでうちの会社では自社持ち帰りでの仕事を増やそうとしてるんだが、そのための切り札が俺というのは一体何を考えてんだか。何か最近業務経歴書をアップデートさせられたんだが、マジで俺を餌に営業するようだ。まさか俺一人で競合他社とのコンペに勝てるとまでは思っていないだろうが、それにしてもなあ。

(23:27)

ギターの練習してたらちょっと良さげなリフができたんで、それをサンプルにして付け焼き刃でも音楽理論とかその辺の知識が面白く使えるということを書いてみる。

ファイルの内訳は

  • demo1.ogg:リフ
  • demo2.ogg:試しに弾いてみたフレーズ
  • demo3.ogg:ちょっとだけひねったフレーズ

何も考えずに Audacity で録音してミックスしたんで、まあ細かいことは気にしないように。大体、縦のラインが揃ってないなんていつものことだろ!(ツッコミ厳禁)

じゃあまずは最初にリフのタブ譜から。

e|-----------------------------
B|-----------------------------
G|---8----9----11-----9-----98-
D|---9----9-----9-----9-----99-
A|0-0--0-0--0-0---0-0---0-0---0
E|-----------------------------

5 弦開放を刻みつつ、 B のメジャー3rd、 E のパワーコード(転回)、 B のパワーコードを弾くというただそれだけのリフだ。どっかで聴いたことがある気がするけどそんなことはどうでもいい。とりあえずこれに何かしらフレーズを付けてみたくなったわけだが、こういうときに一番手っ取り早いのは多分コード進行から作る方法だろう(普通はメロディからコードを作るんだろうけどさ)。

しばしコード一覧表とにらめっこした結果、とりあえず「B/A -> Bsus4/A」の繰り返しということにした。というか、そうでもしないと 5 弦開放の説明が付かん。まあメジャーコードと sus4 の繰り返しって割と普通だからこれでよしとしよう。あとは曲のキーだが、 B メジャーでいいだろう、多分。

というわけで何も考えずに B メジャーのフレーズを被せたのが demo2.ogg だ。本当に適当に弾いたんでえらいことありがちなフレーズになっちまった。とりあえずタブ譜はこんな感じ(ってかタブ譜打ち込むのめんどい)。音符の長さは適当なので、脳内保管してな。

e|---------------------14-12-11----------14-12-11---
B|11~~~12~~13-12-11-12----------12~~11~~----------12
G|--------------------------------------------------
D|--------------------------------------------------
A|--------------------------------------------------
E|--------------------------------------------------

別にこれで終わりでも良かったんだけど、何となく気持ちが悪い。何が気持ち悪いかって、ベースになってる A 音が B メジャーには出てこないのが気持ち悪い。こんなことならフレット 2 つずらして A メジャーでリフを弾けば良かった。そんなこといっても仕方ないんで、「ギター・スケール・パーフェクト・ブック」から以下の条件に合うスケールを探した。

  • メジャー 3rd を持つ
  • 第 7 音と第 1 音の間が 1 音

これに該当するのは……ミクソリディアンスケールだ。超長旋法の異名を持つスケールで、こいつはアイオニアン(メジャー)と響きがそこそこ近いのでうってつけだ。具体的には、アイオニアンの第 7 音を半音下げた形になり、アイオニアンの第 5 音から並べたスケールだ。

という発想で弾いたのが demo3.ogg ね。明らかにピッキングし損なってる部分があるけど、これまたいつものことなので気にしないように。何か録り直すのがかったるかったんで。タブ譜は以下のとおり。

e|---------------------------------------------------------11-14-12-11---
B|-----10-9~~12-10-9-12-10-9-12-10-9-12------10-9-10-12----------------12
G|9-11----------------------------------9-11-----------------------------
D|-----------------------------------------------------------------------
A|-----------------------------------------------------------------------
E|-----------------------------------------------------------------------

無理やり一般的な長調/短調に当てはめると E メジャーになるので、そこを取っ掛かりにしてフレーズを作ってみた。こっちは 5 分ぐらい考えた。フレーズの締めは demo2 とあえて同じにしてみたが、今思えばそうする必要性はなかったかも。この時点でコード進行とかはうっちゃりを喰らってるわけだけど、まあ別にいいんじゃね?

ここまで読んだ人たちは俺があまりにいい加減にコードやら教会旋法を使ってるのに呆れたと思うけど、まあ音楽理論ってのはそんなもんじゃない? 未だに何で完全 4 度及び 5 度が安定した響きなのかとか、基本的な事すら解決してないらしいからな。だからまあ、既存の理論を良いように使ってむしろ理論を拡張していくっていう方向で良くねえか。

ところで理論的なことに拒否感を示す奴らってのは、かなりの割合で「理論の修正・拡張」の視点が欠落してる気がするけどそれってどうなんだ。まともな高等教育を受けていれば、既存の理論をベースに独自の理論体系を作るという発想程度はあって当たり前だと思うんだけどなー。特に音楽理論って「本当は間違いだけどなしくずし的にアリ」って感じで拡張してるわけだろ。だったらいいように使わせてもらおうぜ。

2008-08-25
Mon

(11:45)

夏休みなので今日はお休み。しかし三連休の間ずっと天気が悪いって、一体どれだけ引きが弱いんだ。

(13:44)

冷蔵庫に何も入ってないし家賃も払わないといけないしということで、雨が降ってるけど出かける事にする。

(22:38)

通勤時間の暇つぶし用ゲームにアクション RPG 系が欲しいなーと思って立ち寄った店で、「ソーマブリンガー」ってのを見つけたんで試しに買ってみた。別にそんなに期待してなかったんだけど、ちと立ち上げてやってみたらかなりの時間ぶっ続けでやってしまった。

「世界樹の迷宮」とか「ダンジョンエクスプローラー」にも言えることだけど、どうにも俺はいびつにキャラクターをカスタマイズできるゲームが好きらしい。現状、攻撃力をバカみたいに伸ばしてローキック一発で雑魚を屠って遊んでる。

あとこの手のゲームでありがちな「ストーリーをどこまで進めたか忘れる」という事故への対策として、シナリオのあらすじを読み返せるとかが付いてるのは好印象。俺は割とイベントシーンとか流しちゃうんで、「俺は一体どこに行けば良いんだ」という状況に割となりがちだからな。これでイベントシーンをうっかり飛ばしても大丈夫だ。

しかし公式ページが途中で投げっ放しになってることからも、実はあんまりプッシュされてるゲームじゃなかったのかねえ。

2008-08-26
Tue

(19:52)

何か流石にできの悪い研修生対策として、月水金は研修に専念してくれという指令が出た。ってちょっとまて、そうなると週二日しか今のプロジェクトに専念できんぞ。確かに今の状態じゃ微妙通り越してヤバいのはわかるし、ここでさらにバンバカ切っちゃったら士気への影響とか採用にかかったコストの回収とか、いろいろあるってのもわかるんだが。

で、その問題になってるレベルの奴がどういうコードを書いているかというとだな……まずは一般的に初学者がやりがちなミスから見せるか。

SomeClass sc = new SomeClass();
List<SomeClass> list = new ArrayList<SomeClass>();
while (/* 適当な条件文 */) {
  sc.setFoo(...);
  sc.setBar(...);
  list.add(sc);
}

同じインスタンスを使いまわして残念という奴で、こういうのは何がわかってないのか見た瞬間に当たりが付くので教え易い部類に入る(いや、参照型の概念を教えるのは結構面倒くさいんだけどよ)。もっとも、このコードも自力でスクラッチから書けたわけではないのがアレなんだが。まあそれは不問にしておこう。

それにしても次のコードはねえだろうと思った。

private int someMethod(SomeClass a, AnotherClass b) {
  a = new SomeClass();
  b = new AnotherClass();
  ...
}

お前この一ヶ月半近くの間何やってきたんだよ。本気でこればっかりは意味がわからなかったのでよくよく話を聞いてみたら、他のメソッドが全部次のように冒頭でローカル変数を作っていて、それを深く考えずに真似したらしい。

private List<SomeClass> makeSomeClassList() {
  SomeClass sc = new SomeClass();
  List<SomeClass> list = new ArrayList<SomeClass>();
  ...
}
 
private List<AnotherClass> makeAnotherClassList() {
  AnotherClass sc = new AnotherClass();
  List<AnotherClass> list = new ArrayList<AnotherClass>();
  ...
}

……まあ、最初のうちは思わず閉口するようなヘマをするのは仕方がないので、これも不問にしたいといえばしたいんだが、そいつの問題点ってまさに「下手の考え休むに似たる」って感じで、要するに講師の俺がちょくちょく見に行ってやらないと一時間でも二時間でもコードとにらめっこしたまま固まって、上みたいなコードを書くのならまだしも何もできてない事があるんだよな。多分だけど、一日放っておいたらマジで一日固まってると思う(今のところ途中で俺が痺れを切らして話しかけてしまってる)。

そしてこれでも、話を聞きにいくと多少は進展するだけ前に採用拒否した奴よりもマシってのが、なんていうか終わってるところだよなー。まあ下を見たらキリがないのでそれはもう忘れておこう。

しかしこういう何度言ってもアドバイスを受けに来ないで固まりっぱなしの奴ってどうすりゃいいんだろうな。とりあえず俺は採用拒否以外にはノーアイディア。

(21:09)

sumim’s smalltalking-tos 経由で http://www.flownet.com/ron/papers/lisp-java/instructions.html なんてものを知ったので、とりあえず解いてみた。一応言っとくけど、言語は Python な。きちんと計ってないけど、かかった時間は以下のとおりだったと思う。

  • 会社の昼休みに問題文を読んで「30 分でいけるな」と判断して解き始める
  • 見積りの倍の 1 時間で書き終え……たと思ってたんだが
  • 帰ってきてから凄まじい勘違いに気がついて、急遽書き直し

なので問題文を読む時間含めて 2 時間と 30 分ってところか。正直 Python 使ってこれというのは時間かかりすぎな気がしなくもないけど、まあそれが俺の実力なんだろうな。辞書の作り方とかそんなことより、 flatten を書き損じて頭を抱えてたのは内緒だ。

def str2tuple(s):
    r = []
    for c in s:
        r.append(c.lower())
        r.append(c.upper())
    return  tuple(r)
 
def word2num(word, mapping):
    r = []
    for c in (i for i in word if i.isalpha()):
        for k in mapping:
            if c in k:
                r.append(str(mapping[k]))
    return ''.join(r)
 
def words2dict(wlist, mapping):
    r = []
    for w in wlist:
        r.append((word2num(w, mapping), w))
    return tuple(r)
 
def encode(phone, dictionary):
    def _encode():
        found = False
        if not phone: yield '', 0
        else:
            for s in (phone[:i] for i in range(len(phone), 0, -1)):
                for k, v in ((a, b) for a, b in dictionary if s == a):
                    found = True
                    yield v, len(s)
            if not found:
                yield phone[0], 1
    
    for e, l in _encode():
        if l > 0 and l < len(phone):
            for x in [[e] + [e2] for e2 in encode(phone[l:], dictionary)]:
                yield x
        else:
            yield [e]
 
def flatten(arg, none=''):
    def _(ls):
        if not ls: yield none
        for l in ls:
            if isinstance(l, list):
                for i in flatten(l):
                    yield i
            else:
                yield l
    r = list(_(arg))
    return r
 
def escape(s):
    return s.replace('-', '').replace('/', '')
 
def validate(args):
    orig, enc = args
    esc = escape(orig)
    if len(esc) < len(enc):
        return False
    is_num = False
    for c in enc:
        if c.isdigit():
            if is_num:
                return False
            is_num = True
        else:
            is_num = False
    return True
 
slist = 'E', 'JNQ', 'RWX','DSY', 'FT', 'AM', 'CIV', 'BKU', 'LOP', 'GHZ'
wlist = """an
blau
Bo"
Boot
bo"s
da
Fee
fern
Fest
fort
je
jemand
mir
Mix
Mixer
Name
neu
o"d
Ort
so
Tor
Torf
Wasser""".split()
phones = """112
5624-82
4824
0721/608-4067
10/783--5
1078-913-5
381482
04824""".split()
mapping = dict(map(lambda xi: (str2tuple(xi[1]), xi[0]), enumerate(slist)))
dictionary = words2dict(wlist, mapping)
for e in filter(validate,
            reduce(lambda a, b: a + b,
                map(lambda x:
                    [(x, flatten(v)) for v in encode(escape(x), dictionary)],
                    phones))):
    print e[0] + ': ' + ' '.join(e[1])

割とコードの切り詰め競争的な意味合いもある気がしたので、若干詰めて書いた。文字列をハードコードしてる部分とかを抜いた論理行だけなら 70 弱といったところで、正直まだまだ詰められるけどまあ俺はそっち方面にはさほど興味は無いのでこれでいいや。ちなみに本題のファイルは使ってない。そっち使うとなるともうちょっとデータ構造もアルゴリズムも変える必要があると思うけど、面倒になった(元は会社での気分転換だしな)。

特にこのコードに付いては書くことがないのだけど、あえて書くなら再帰とジェネレータと内部関数だな。この手の処理になると、ほぼ手癖でこういうコードになっちまう。

2008-08-27
Wed

(00:53)

すげーどうでもいいけど、今この時間になって会社帰りに寄ったコンビニに傘を置き忘れてきたことを思い出した。どうせもうなくなってるだろうから取りにいくつもりはないけど、今年に入ってから何本目だよ傘なくすのって。

(20:59)

意外と広告打てば応募って来るものなんだなー。ま、あくまでも「応募」だけの話なんで、こっから面接にたどり着かない人も結構いるんだけどね。面接と筆記試験で落とされるのも一定数いて、それを差し引くと当初の応募者のうちどんだけ残るかというと、半分も残らないかもという感じだ。なのでまずは応募者を増やさないといけないってのはわかるんだ。でもなあ。

ちなみに今回採用強化に踏み切った上司も、まったく勉強しないでソフトウェアの会社を受けにくる奴らばかりというのには流石に不満とか疑問を持っていて、やっぱ内心どうにかしたいとは思っているらしい。いや、なんつーかそれは俺も同じなんだけど、でも結局は本人の意識次第でしかないんだよな。インターネットに接続してる PC があればいくらでもプログラミングについて調べられる以上、まったく何も知らずにやってくるのはつまりそういう奴だって事。

その一方で、俺の同期にまったくの未経験でやってきてからプログラミングにきちんと取り組んで、今では Lisp の勉強を始めてる奴もいるわけで、そういう何かしらの切っ掛けや刺激さえあれば伸びる部類の人へ門戸を閉ざすってのも俺としては賛同しかねる部分がある。ただ、そういうのはあくまでもレアキャラで、そのレアキャラのためにクソみたいなコーダーを量産する事が果たして正しいのかと言われると悩む(レアキャラ以外を切り捨てると会社の売上が落ちるか潰れるかするのでここでは除外)。規約や標準にゲロみたいな項目が大量に盛り込まれて、その一方でまともな開発ツールが導入されなくて、それで下がった生産性と増大した管理ワークに管理職の人らが忙殺される原因の一つが、かなりの数のゴミが現場に送り込まれるからだろうからな。

……そういや、週明けにやってくる奴らってまたもや未経験なんだよな。今渡こそ、入社までに何かしらのことはしてきて欲しいと思うよ。

2008-08-28
Thu

(20:03)

今日は研修よりも開発に力を入れる日だったので、聞きにこられない限りは基本放置でやっていたのだけど、見事なまでに一日フリーズしっぱなしなお方が出現しました。というわけで明日どうフォローしようか頭を抱えてる。いや、マジでどうすんだこれ。

(22:11)

PC 持ってなくて情報系の大学に進学した俺が言うのもなんだが、プログラマとして応募してきて PC 持ってないというのはキツいよな。

まあ、その後 PC 買って挽回してどうにかなってる奴もいるから、これまた完全にダメとは言いきれないが。

2008-08-29
Fri

(23:45)

シグルイ 11 巻を読んで唖然とした。これまでもアナーキーな翻案というか原作をだしにしたブルータルなエピソードのオンパレードだったが、今回もやはり期待通りというか期待以上の仕事っぷりだ。というかだな、ガマ剣法をああいう風に料理するか?

それよりも気になるのは、今後も御前試合のエピソードを盛り込む予定なのかってところ。チョイ役とはいえ月岡も出てきてるし、「無明逆流れ」をメインストーリーにして他の試合をちょこちょこと絡ませるって手法なのかな。ただでさえ話の進みが遅い上に無茶苦茶なので、そういうやり方にならざるを得ないといえばそうかもしれんが。

2008-08-30
Sat

(23:08)

凄くどうでもいい話なんだけど、 MS の OOXML ってめちゃくちゃ複雑でデタラメでとてもじゃないけどそれを使ったアプリケーションって書きたくないような代物でしょ。つまりはオープンな企画だけど事実上独占とかそういう戦略なわけだけど、確か GCC もソースをプロプライエタリな奴に転用させないために、あえて無茶苦茶な設計にしてあるとか言う話を思い出した。

GCC の方は俺も別にソース読んで確認したわけじゃないので、まあヨタの部類だけど。でもそういう、オープンだけど超絶に複雑怪奇で新規参入を阻害みたいな姿勢はまったくもって論外だな。その点、ドキュメントゼロでも設計が常識的で解読しやすかった Sribes みたいなソフトウェアはまだだいぶマシだ。つまり、

  • 完璧にドキュメント化されてるけど複雑怪奇な設計
  • 完璧にドキュメント化されてないけど解読の容易な設計

だったら後者の方がマシじゃね?

2008-08-31
Sun

(00:15)

ふとした気の迷いでボクサーブリーフを試しているんだが、これはこれでアリだ。もっとも間違えて前綴じの奴を買ってしまい、その点は凄まじく後悔してるんだが。でも同じメーカーで前綴じの奴しかなかったらそれはちとダメだな。

(00:58)

新人研修担当官として、何か平易かつ論外じゃない本はないかと探したりしてるんだが、まあなんつーか結論としては「そんなもんない」なんだな。当たり前といっちゃそうだけど、何かしらの専門分野に挑むんだからいわゆる「カタい入門書」を自分なりに咀嚼して理解しないといけなくて、それって高等教育を受けてりゃ程度の差こそあれ、みんなできてないと困るんだよな。

ところが「Java 言語プログラミングレッスン」すら理解できないようなのが実際にいて、これって「大脳新皮質が損傷していなくて日本語のわかる哺乳類ヒト科ならこんぐらい読み通せ」レベルの易しさの本だぜ。まあそういうのは単に勉強してないだけだろうが。

(22:49)

突然 PC が起動しなくなったんでどういう事かと調べてみたら、信じられん事に /home のマウントに失敗してた(ResierFS のシステム領域が死んだらしい)。幸い最低限のバックアップは取ってあったので被害は最小限に抑えられてはいるが、バックアップ用のパーティション以外は /home も他のパーティションも物理的には同じ HDD なんだよな。つまり、他が死ぬのも時間の問題だ。こりゃあ新規に HDD を買って再セットアップした方が良さそうだな。