2009/04/14(火)閑話休題
(↑コード量で評価される職場があると本気で信じている)
例えば BOD管理プログラムでも、
- 布バルクを処理する関数
- 皮バルクを処理する関数
- 金属鎧バルクを処理する関数
- 武器バルクを処理する関数
- 鍛冶小口のみのバルクを処理する関数
長い条件分岐が関数の頭についたとしても、リファレンスが多重になっても同じ処理は少ないことの方がいいという考えで書く。「バンダナ」<->「bandana」の変換も、現状一単語しかないけどハッシュで辞書を持たせて汎用的に変換することを想定した関数を作る。
条件分岐の中身は変数の設定をしたりリファレンスの向き先を変えるだけで、分岐の中身が長いわけではない。
もちろん、短ければいい、という考えではなくあくまでも同じ処理は複数存在しない、という考え。いわゆる難読プログラムコンテストみたいなコードは書かないし、スカラー一つ分のメモリをケチる、とかはしない。
同じ処理が複数存在しない、といっても、コードパスが異なる場所に必要な場合は複数存在させる。この場合でも、完全に汎用的に書けるものは追い出す。例えば上の辞書変換みたいな関数。
正規表現についても、グローバルマッチアンカー等を使ってまとめられるならまとめる。
とか考えて書いてると、多くて数百行でお腹いっぱいになる。
いわゆるデスマーチとかの現場の人ってどのくらい書くんだろうなぁ、と気になった次第。デスマーチだと1日っていう時間単位は存在しないか。
# 最近 C 書いてねーなー
2009/04/14(火)続・UOA ベンダーエージェントの(略
サンプルデータを用意して、パーサーを書いた。バンダナのローカライズにも対応した。
これで行けそうだ。が、コードが凄く汚いので直す必要あり、でも疲れたので暫くやらない。
サンプルデータ:
Bulk Order Deed Blessed 重量: 1 大口 Spined Leather 高品質 個数: 15 leather skirt: 15 leather bustier: 0 leather shorts: 0 female leather armor: 0 studded bustier: 0 studded armor: 0, 価格: -- Bulk Order Deed Blessed 重量: 1 小口 Spined Leather 高品質 個数: 15 female leather armor: 0, 価格: -- Bulk Order Deed Blessed 重量: 1 大口 Barbed Leather 標準 個数: 15 studded gorget: 15 studded gloves: 15 studded sleeves: 15 studded leggings: 15 studded tunic: 0, 価格: -- Bulk Order Deed Blessed 重量: 1 小口 Horned Leather 高品質 個数: 10 studded leggings: 0, 価格: -- Bulk Order Deed Blessed 重量: 1 大口 Horned Leather 標準 個数: 15 leather skirt: 0 leather bustier: 0 leather shorts: 0 female leather armor: 0 studded bustier: 0 studded armor: 0, 価格: -- Bulk Order Deed Blessed 重量: 1 大口 Barbed Leather 高品質 個数: 15 leather cap: 0 leather gorget: 0 leather gloves: 0 leather sleeves: 0 leather leggings: 0 leather tunic: 0, 価格: -- Bulk Order Deed Blessed 重量: 1 大口 Agapite Ingot 高品質 個数: 20 platemail gorget: 0 platemail gloves: 0 plate helm: 0 platemail arms: 0 platemail legs: 0 platemail tunic: 0, 価格: -- Bulk Order Deed Blessed 重量: 1 大口 Agapite Ingot 高品質 個数: 20 chainmail coif: 0 chainmail leggings: 0 chainmail tunic: 0, 価格: -- Bulk Order Deed Blessed 重量: 1 小口 Barbed Leather 標準 個数: 20 bone armor: 0, 価格: -- Bulk Order Deed Blessed 重量: 1 大口 Dull Copper Ingot 高品質 個数: 20 chainmail coif: 0 chainmail leggings: 0 chainmail tunic: 0, 価格: -- Bulk Order Deed Blessed 重量: 1 小口 Shadow Iron Ingot 標準 個数: 20 chainmail coif: 0, 価格: -- Bulk Order Deed Blessed 重量: 1 小口 Shadow Iron Ingot 標準 個数: 15 ringmail leggings: 0, 価格: -- Bulk Order Deed Blessed 重量: 1 大口 Verite Ingot 高品質 個数: 20 ringmail gloves: 0 ringmail sleeves: 0 ringmail leggings: 0 ringmail tunic: 0, 価格: -- Bulk Order Deed Blessed 重量: 1 小口 Dull Copper Ingot 高品質 個数: 20 platemail legs: 0, 価格: -- Bulk Order Deed Blessed 重量: 1 小口 iron ingots 高品質 個数: 20 platemail tunic: 0, 価格: -- Bulk Order Deed Blessed 重量: 1 小口 Dull Copper Ingot 高品質 個数: 10 plate helm: 0, 価格: -- Bulk Order Deed Blessed 重量: 1 小口 cloth 高品質 個数: 20 kilt: 0, 価格: -- Bulk Order Deed Blessed 重量: 1 小口 cloth 高品質 個数: 20 バンダナ: 0, 価格: -- Bulk Order Deed Blessed 重量: 1 大口 cloth 標準 個数: 20 バンダナ: 20 shirt: 20 skirt: 20 thigh boots: 0, 価格: -- Bulk Order Deed Blessed 重量: 1 大口 Copper Ingot 標準 個数: 20 chainmail coif: 0 chainmail leggings: 0 chainmail tunic: 0, 価格: -- Bulk Order Deed Blessed 重量: 1 小口 iron ingots 高品質 個数: 20 ringmail gloves: 0, 価格: -- Bulk Order Deed Blessed 重量: 1 小口 iron ingots 高品質 個数: 20 ringmail leggings: 0, 価格: -- Bulk Order Deed Blessed 重量: 1 小口 iron ingots 高品質 個数: 20 ringmail leggings: 0, 価格: -- Bulk Order Deed Blessed 重量: 1 小口 iron ingots 高品質 個数: 20 ringmail sleeves: 0, 価格: --出力:
出力内容は、素材-ブツ-品質-数 で、これが内部のハッシュDB のキー名になる。ブツのスペースはアンダースコアに変換してある。
spined-leather_female_large-HQ-15 spined-female_leather_armor-HQ-15 barbed-studded_large-NQ-15 horned-studded_leggings-HQ-10 horned-leather_female_large-NQ-15 barbed-leather_male_large-HQ-15 agapite-plate_large-HQ-20 agapite-chain_large-HQ-20 barbed-bone_armor-NQ-20 dull_copper-chain_large-HQ-20 shadow_iron-chainmail_coif-NQ-20 shadow_iron-ringmail_leggings-NQ-15 verite-ring_large-HQ-20 dull_copper-platemail_legs-HQ-20 iron-platemail_tunic-HQ-20 dull_copper-plate_helm-HQ-10 iron-fences_large-HQ-15 shadow_iron-tear_kite_shield-NQ-10 leather-leather_male_large-HQ-20 leather-studded_armor-HQ-15 cloth-kilt-HQ-20 cloth-bandana-HQ-20 cloth-girl_large-NQ-20 copper-chain_large-NQ-20 iron-ringmail_gloves-HQ-20 iron-ringmail_leggings-HQ-20 iron-ringmail_leggings-HQ-20 iron-ringmail_sleeves-HQ-20ここまで整形すれば、この形のデータを処理する機能はすでに付いてるので後は本体にマージするだけ。
しっかし、コンピュータが処理するのに優しくないデータを処理するといろいろ例外的な処理が必要になって無駄にコードが増える。そうすると、
- 気持ち的にすごい疲れる
- 後の仕様変更やローカライズによるデータの変化の可能性を考えると戦々恐々
確認中に既存のスクリプトにバグが2個見つかりました。
- ringmail glove がありませんでした。
- plate helm が platemail helm になっていました。
2009/04/13(月)眠れない
マッタリした BGM を流そうと The Bossa Nova を流してみた。
なんだこれは。Bossa の曲を古いアメリカンスタンダードみたいな演奏で流している。
- 展開ごとに音量レベルの動きが大きい。
- サビの部分に耳が痛くなる系の盛り上がり。
- 3声、4声によるコーラス
- ガットギター
- ソロ、デュオ、トリオ
- 力の抜けたヴォーカル
- サンバの変則的な不割りと Jazz をベースにしたリズム
寝つけに流した音楽なのにイラっとくる。
で、こういうコンピレーションには必ずセルジオ・メンデスのマシュケ・ナダが出てくる。Bossa Nova か?アレは。
@jazz Cafe Bossa Edition
をセットしなおして寝る。
2009/04/12(日)続・しらす
江ノ島の神社を江ノ島エスカーを使わずてくてくと巡る。
昼過ぎに行ったのに、入り口付近のお店は並んでいる。観光地のセオリーとして、奥まで行けば空いているだろうとそのまま入っていくと、空いているお店発見。奇しくも波乗りレストランのDVDで紹介されていたお店ではないか。
生しらす丼を三杯酢とお醤油で食べるんだけど、三杯酢はたっぷり掛けた方がおいしい。お醤油は完全にお好みで。
蛸の串焼きを食って汚れた手を神社の手水で洗ったりしつつ、さざえの壷焼きを食べたりしつつお参り。
意外と混んでて驚く。奥に行くほど人が減るのはどういうことか。みんな、奥津宮まで行けよ。
蛸の串焼きを食いながら歩いているときに、ロッキーのしらす屋の前を通り過ぎる。特に波乗りレストランがどうとかで宣伝はしてないようで、普通に営業中。もうお腹いっぱいなので華麗にスルー。
片瀬江ノ島駅から辺津宮、中津宮、奥津宮と歩き、岩屋のある稚児が淵の干潟まで歩いたら流石に疲れた。同じ道を帰るのは絶対にイヤだ。と思っていたら、駅のすぐそばまで船が出ているらしい。まさに渡りに船とはこのことよ。
行きで、小田急江ノ島線の急行を逃して各駅がすげーウザかったので帰りは贅沢にロマンスカーで帰る。
贅沢といっても江ノ島<->新宿で特急料金は¥600ちょっと。
一人でいくのは寂しいので、前日に元地元の友人達にメールを飛ばしたんだけど、結局一人で行ってきた。
SPAM 対策なんだろうか、最近の携帯キャリアって複数アドレスに一括送信するときに、存在しないアドレスがないか送信前にチェックしている?そして誤ったアドレスがあるとどれが誤ってるか伏せたままエラーを返す?
メアド変更したのに登録してなかった人がいたので、他の人には送れているものだと思って最初はそのアドレスにのみ送信。送信成功、でもお仕事なので無理だそうで。
どうやら他の人にも送られていないのでは?と気づいてもう一度一括送信。送れたものだと思っていたが、夜に携帯を見たら再度同じエラー。明日行こうぜ!なメールを今更送ってもいい答えは得られなそうなのと、もうめんどくさいので一人で行くことに。メアド変えて黙ってるヤツ誰だ!
海はいいなー。福島の会津育ちなので海って馴染みがないんだけど、なんかいいなー。
2009/04/11(土)メインPC復活
FreeBSD なファイルサーバに HDD を繋いで、[fman:dd] でコマンドでさくっと。
元のディスクを繋いで、
$ sudo dd if=/dev/da0 of=/win_da0.img bs=1m新ディスクを繋いで
$ sudo dd of=/dev/da0 if=/win_da0.img bs=1m新ディスクを元のPCに繋いで終わり。
ついでにTVチューナーと無駄に3台繋がっていたHDDを一つ取り外し。省電力でエコ。
元のディスクは
$ sudo dd of=/dev/da0 if=/dev/null bs=1mでゼロクリアしてから捨てます。