2012-01

2012-01-01 

ファッキンニューイヤー。俺より幸せな奴はみんな死ね。

さて結局Catyのデバッグしながら年を越したわけだが(檜山さんも)、まあ新年早々ものすごい仕様変更が入って元旦から普通に働いてる。あと元旦早々pygraphvizのバグにぶち当たった。

例えばpygraphvizで以下のようにサブグラフ(クラスター)を作成し、サブグラフのノードあるいはエッジにそのサブグラフ特有のデフォルト属性を設定したいとする。

import pygraphviz as gv
g = gv.AGraph() # 親となるグラフ
c = g.subgraph([1, 2], 'cluster_a') # サブグラフ
c.node_attr(fontcolor=red) # サブグラフのノードのデフォルトフォント色は赤

ところが最後の行の設定は何故か反映されない。というかnode_attrへの操作がgraph_attrに反映されたりする。node_attrそれ自体を代入して置き換えるのはダメ。

じゃあどうするかというと、次のようにやるしかない。

import pygraphviz as gv
g = gv.AGraph() # 親となるグラフ
c = g.subgraph([], 'cluster_a') # サブグラフ
for n in [1, 2]:
  c.add_node(n, fontcolor=red) # ノード毎に設定

極めてダサいやり方だが、仕方がない。エッジのデフォルト属性及び一部のグラフ属性も同様のバグにより設定できないので、このようにノードやエッジに片っ端から属性を設定していくこと。


2012

せっかくなので曲を書いた。タイトルについてはノーコメント。

仕事を終えてすぐに書き上げて即録音したので、演奏がちょいとグダグダ。ミックスも相当適当。というかディレイかけすぎた。一部をあとで差し替えるかもしんない。

追記: 結局ミックスだけやり直した。リズムギターの音量とイコライザの設定を変えてすっきりさせた。

2012-01-03 

例によってまたpygraphvizの話題なのだが、これ描画ツールとしてはすげえよくできてるんだけどAPIはちょっと残念。

次のようにエッジをノードよりも先に追加してしまうと、後にノードを追加してもそれが反映されず、エッジ追加時に自動で追加されるノードが使われてしまうようだ。これはノード属性を指定する場合などで問題になる。

import pygraphviz as gv
g = gv.AGraph() # 親となるグラフ
g.add_edge('a', 'b')
g.add_node('a', style='filled') # styleが反映されない。

なので、必ず先にノードを追加すること。

import pygraphviz as gv
g = gv.AGraph() # 親となるグラフ
g.add_node('a', style='filled') # これはOK
g.add_edge('a', 'b')

これ、後から追加したノードを優先でも良かったような。

2012-01-05 

リポジトリにpushしようとしたらbitbucketが落ちやがってて大変むかついている所だが、何が大変ってIssue Trackerにアクセスできないのが大変。ソースコードなどについては、それこそ分散バージョン管理だとソフトウェアの性質としてリポジトリがエクストリームに冗長化されているので、万が一bitbucketでヤバい事が起こっても大規模なソースコードの紛失には繋がりにくい。

が、Issue Trackerだけは何故かバージョン管理されてないんだよな。前に何度か書いた気がするけど、Issue/Bug Trackerもリポジトリに載せない積極的な理由が見当たらない。さらにちゃんとしたデータフォーマットの仕様を策定しておけば、インポート/エクスポートも容易になると思うんだけど。


今月発売のゲームで気になるのは「ラビリンスの彼方」かな。去年のRPGだとアンチェインブレイズレクスがあんまりな出来で、セブンスドラゴン2020もちと肩透かし気味。なのでこれには結構期待してる。

何度も書いてるけど仕事その他で時間はいくらあっても足りないぐらいなので、その合間に遊んだゲームがクソゲーだとかなり萎える。それがクリアまで時間のかかるゲームだと尚更。いやまあ、もう「クソゲー呼ばわりはエンディング見てから」なんてポリシーをさっさと捨てればいいだけっちゃそうなんだが。

2012-01-07 

ハナコ@ラバトリー 2

「スマートフォンを操るブロガーの花子さん」がいろいろ活躍するハートフル愉快漫画、これにて完結。流石の面白さ。

絵が下手なのを逆手に取って、あるいは開き直ってネタとネームの巧拙で勝負をかけてきた漫画家が原作に回って原作をしっかり読み込む作画を味方に付けた結果、素朴な絵柄にどことなく不穏な雰囲気を漂わせ、時に極めて観念的な施川漫画とは良い意味で対極の、実にわかりやすい一品になった。施川漫画の入門として一番オススメできるかも。

2012-01-08 

The Wizard
Ride

またまた演奏だけ録ってあって歌だけ入れてなかった奴を歌入れ。Black Sabbathの“The Wizard”(“Black Sabbath”に収録)とCathedralの“Ride”。(“The Eternal Mirror”に収録。)

The Wizardはブルースハープの旋律が印象的な曲で、試しにブルースハープを買ってきて吹いてみたんだが、これがまた難しくて難しくて。まず一度に一つの音だけを出すというのが困難で、何よりリズムを合わせるのが本当に大変。多分絶対的な難度としてはかなり簡単な部類の曲だとは思うんだが。ちなみに曲のテーマは白魔術師、モデルは指輪物語のガンダルフだとか。

Rideは2nd以降のCathedralの代表曲、というかCathedralはドゥーム系の曲が割と似たような調子になりやすいというか、持ちネタのバリエーションに欠けるというか、まあそんなわけでちょっとアルバム全体を通して聴くと意外と印象が薄くなるのが本音なんだけど、出来の良い曲を一曲取り出してみるとやっぱり独特のグルーヴが格好いい。

2012-01-09 

Rainroom

まだ演奏だけ録ってあって歌を入れてなかったのがあったので、適当に歌入れ。Katatoniaの2ndアルバム“Brave Murder Day”より“Rainroom”。このアルバムは彼らがブラックドゥームからゴシックへ、そしてプログレッシヴなオルタナティブメタル路線へと方針転換した重要作で、名曲揃いの中でも一際目立つのがこの曲。

Jonase Renkseの盟友にしてOpethの中心人物Mikael Åkerfeldtがグロウル担当で参加してるが、これがJonasのクリーンヴォーカルと相性抜群で良い味だしてる。これ以降のKatatoniaは完全にクリーンヴォーカルのみにシフトしたので、清濁混合のヴォーカルが聴けるという意味で貴重な作品でもある。

2012-01-11 

俺は新年の抱負とかそういうのを書かない主義なのだが、今年はちょっと一つ抱負というか目標と言うかそういうのを設定したい。いやまあ、要するに去年は体のいろんな所が壊れ気味だったので、今年はもうちょっと健康になるよう努めるということなんだけど。何しろ今悪くしてんのが首と肩と腰と耳で、ちょいと仕事に影響が出かねないんで。

腰以外については元を正せば全部肩こりが悪いので、肩こりの緩和・解消ということになるか。年末年始は運動をサボってたので、そろそろ再開した方がいいかもしれん。

2012-01-14 

昨日だか一昨日だか、なんでギターなどの弦楽器は利き手でピッキングして逆でフィンガリングするのかという話題でちょっと盛り上がったが、実は俺もある理由から利き手でフィンガリング、逆でピッキングというのをやってみたことがある。何でそんな事をしたかというと、

という好奇心と実用上の二つの理由による。それでちょっとチャレンジしてみて実感したが、やっぱピッキングは利き手でやらないと厳しい。そもそもギターはピッキングでリズムを刻んでそれに間に合うように左手を動かすわけだから、ピッキングそれ自体はできるだけ無意識にやってないといけないわけだ。それにピッキングは多くの場合フィンガリングよりも細かいコントロールが必要で、さらに持久力も要求される。曲の間中ずっとフィンガリングも忙しい超絶ギタリストの曲は左手も大変な事になってるけど、大抵は曲の大半の時間は右手の方がずっと大変。

つまり難しくて疲れる動きリズム面で極めてシビアに長時間続けなければならないので、そりゃ利き手でないと難しい。世の中には左利きだけど右手でピッキングしてる人とかいるけど、そういう人たちはどれほどの修練を積んだのだろうかと考えると気が遠くなってくる。

2012-01-17 

ここ数日また肩こりが悪化してきてちとマズい状態なのだが、まあもう職業病なので半ば諦めている。とはいえリハビリは続けないとな。

それはさておき最近のCatyだが、いろいろ優先順位が変動してあまり手の付いていなかった総称コマンドと型パラメータの処理をひとまず実装。

これまでは以下のような型定義が問題なくできていたが、型変数のデフォルト値が計算できないのでコンパイルエラーになるよう修正。

command pass<T> :: T -> T // Tのデフォルト値が不明なのでエラー

今度からは次のように書く。

command pass<T default any> :: T -> T // Tが具体化されない場合はanyとして振る舞う

これで型変数Tのデフォルト値はanyと扱える。

またコマンドを使うときに以下のように具体化して使うこともできる。

"s" | pass<string>

多少手を付けてからまた放置していた推論エンジンを実装すれば、明示的に型パラメータを具体化する必要はあまりないと思うが。

2012-01-18 

FFの音ゲーの体験版をダウンロードして遊んでみたが……俺は全然音ゲーやらないんだけど、これでいいのかと思ってしまった。

最も低難度の譜面はトリガーの密度が薄いので気がつかなかったが、残り二種類の譜面、特に一番難しい究極の譜面で上記の問題が顕著で、中間の難度の熟練の譜面ですら既に怪しい部分がある。基本の譜面だけなら問題ないっぽいけど、熟練の譜面までは初見で簡単にクリアできて遊びごたえゼロだったからなあ。曲毎の難度のランクもないみたいだし。もしや体験版で配布されてる曲が外れ譜面かとも思ったが、でもFF6のボス戦の曲が外れというのはないよなあ。

もっとも俺が音ゲーをやらない最大の理由は「絶対にここタメてずらしても格好いいって」とかそういうアレンジができないという物なので、そもそもジャンルとしての魅力は無かった。それでも懐かしのBGMが多数収録されてるなら買ってもいいかなと思っていたが、ちょっとこれは購入しかねる。

2012-01-21 

11日の日記で「去年は体のいろんな所が壊れ気味だったので、今年はもうちょっと健康になるよう努める」などと書いておいてなんだが、ここ数日は首と肩の調子が去年の最悪だった時期並みに悪化。昨夜あたりから持ち直してきたが、昨日とか痛みとだるさで集中力が途切れまくってた。なんかもう、俺は会社勤めとか肉体的な問題で不可能なんじゃないか。(事あるごとに言ってる気がしないでもない。)

それはさておき、「ラビリンスの彼方」を買ってきたわけだが。

ゲーム始めた直後の画面がコレもんでしてねえ。

一体これは何事かと思ったら、これはいわゆるチュートリアル部分の最初の方で、それが「ファミコンっぽい画面のMMORPG風チュートリアル」という斬新なものだった。斬新過ぎてわけがわからない。他のプレイヤーの台詞という形でシステムを説明させてはいるが、まあ会話形式の方が親しみやすい・解り易いというのはあるかもしれない。俺自身、リプレイ記録風の攻略日記を書いたらえらいこと好評だった経験があるんで。でもこうしてゲーム内でやられるとウザいというか、テンポが悪く感じてしまった。

その後いろいろあってゲーム本編に入るのだが、これは3DダンジョンRPGというよりはアドベンチャーゲームで、なんというかいろいろと割り切ったシステムで相当人を選びそうだ。成長システムは属性の変更の他は今のところHPと攻撃のチャージ可能数に割り振れるだけで、装備品の概念もなく、今のところ純粋に基本システムを使った戦術だけで戦う内容。戦闘システム自体は頭を使う必要アリでなかなか面白い。割と近いシステムのゲームを挙げるとするならワイズマンズワールドかな。

しかしまだシステムが解放されきっていない(=チュートリアル期間)とはいえ、致命的にテンポが悪くないかこれ。移動がややもっさり気味で、操作方法もスライドパッドが前後左右への移動で旋回がLRというのは俺としてはちょっと気に食わない。旋回が45度単位なのも今のところもっさり感を強めてるだけ。仲間の台詞も少女のリアクションもテンポを損ねているだけのような。

とはいえまだまだ序盤。せっかくの新規タイトルだし、この先面白くなることを期待してプレイしてこう。

2012-01-24 

なんだかんだで仕事で必要になったので、子孫セレクタを実装した。あとは隣接セレクタと属性セレクタが未実装だが、前者はみしかしたら実装するかもしれないが、後者はあまりにもCSSに特化した仕様であまり普遍性がないから、まず仕事じゃ使わないだろう。


ネット上ではちょくちょく我が子可愛さのあまり頓珍漢な放射線対策に精を出したり妙な業者に引っかかっている親を見かけるが、そういう行為は子供が大人になる過程でまともな知識を身に付けるにつれ、単なる愚かしい行為の記憶になっていくんじゃないか。

そして自分の親のどうしようもないバカさ加減や身勝手さに気がついた子供が親にかける台詞は「さっさと死ね」でしかない。俺の母親は俺が病気にかかったときに信仰している宗教の儀式らしきものをおっ始めたりしたもんだが、俺はその事については親の愛情なんてものを感じる以前に、こんなバカの股ぐらをくぐって生まれてきたことへの屈辱を感じている。

バカからの愛情なんて迷惑なだけだよ。


自由というのは一定数のバカを許容しないと成立しないし、別の観点からは俺もそのバカの一人だという自覚程度はあるが、それでも尚、子供の人生に暗い影を落とすレベルのバカ親はどうにかならないものかと思う。いやそれを完璧にどうにかしようとしたら、それこそ親権なんてもんは全否定で国が子供を召し上げるみたいなディストピアにしかならんだろうが。

2012-01-25 

ここで指摘されている事の多くは俺がドロップアウトしたSI業界で実際に目にしてきたし、コードレビューという具体的な実装レベルだけでなく設計レベルの話でも通じるものがあると思う。実際の話として、俺が多忙になってレビューしたり設計についての話し合いに参加出来なくなったりした途端に、とんでもない設計ミスで最終的に俺の負担が激増した事もあった。

それで今のCatyプロジェクトの実際的な問題として、コード書いてるのが俺一人でコードレビューのしようがないというのがある。定期的に実装がグチャグチャになっていそうな部分をちょこちょこリファクタリングしてはいるが、それでも第三者の視点からの客観的なレビューには及ぶはずもなく。


ラビリンスの彼方だが、とりあえずこれ関連の事は下記のページで書くことにした。

いやホント全然クソゲーじゃないし没個性なわけでもないんだけどねえ。

2012-01-26 

一見すると簡単だけどアドホックで一貫性や普遍性に欠けるコードというのは、結局のところ技術的な負債にしかならないという事を実感した一日だった。もっとも、技術的な負債にならないような手段を実現するのに時間がかかりすぎる場合(大抵は仕様についてのコンセンサスが取れないとか)、後で直すことを前提にそういった負債を抱えざるを得ないこともあるっちゃある。

ちなみに「一見すると簡単だけどアドホックで一貫性や普遍性に欠けるコード」の条件を満たしやすいものの中に、テストコード、もっと限定するなら単体テストのコードがあるように思う。大体そういうのはインターフェースに対してテストを行うという原則から思いっきり外れまくってるもので、こんなこと書いてる俺もCatyプロジェクトのテストのうち、実装言語で書いたテストは全部負債になったと言っても過言ではない。いや、これはあまりインターフェースがつめられてない時期に書かれたという事情があるにはあるのだが。

結局生き残ったのはCatyScriptで書かれたFITだけで、これはまず間違いなく役に立つし資産になっている。

2012-01-28 

実に面倒な仕事が一段落したので、疲れた頭でちょっと妙な曲というか音を録ってみた。曲名はナイアルラトホテップの別名なのだが、これは妹に聴かせたところ「何かが這い寄ってくるような音」と言われたので、こういうタイトルにした。

Crawling Chaos

5分ぐらいの即興演奏をパートごとにバラし、paulstretchで10分に引き伸ばしてミックスしたキワモノ。ジャンルとしてはドローン・メタルとかドローン・ドゥームとか言われる音と思われる。ひたすら轟音がグオオオンと鳴りつづけるのがこのジャンルの基本だが、俺としては即興ながらも多少は旋律を意識して弾いたつもりなので、Sunn O)))とかよりは聴きやすいはず。多分。

2012-01-30 

これまでCatyScriptにはいわゆる普通の条件分岐は存在しなかったのだが(別に俺も檜山さんもそういう処理を書くつもりはなかった)、諸事情により必要だという結論になったとのことなので実装した。大体こんな感じ。

case {
  undefined  => "undefined",
  string     => "this is string",
  1  => "1",
}

条件分岐というよりはパターンマッチ。普通の条件分岐っぽく「100以上の整数とそれ未満で分ける」のような場合はこんな感じ。

case {
    integer(minimum=100) => ">= 100",
    integer(maximum=99) => "< 100",
}

これが汎用のプログラミング言語だったらふざけんなとキレる構文だが、CatyScriptはそうではないので今のところはこれでいいか。Syntactic Sugarを導入するのは先で良い。

もっとも条件文のところは単なる型表現なので、今のところは「Aで始まる文字列」などは書けなくなっている。いや、単純なものならそんな難しくもないけど、ここに正規表現使いたいとか言うのはもう勘弁して欲しい。