Diary?::2007-10

2007-10-01
Mon

(20:01)

クールビズ終了? 知るかよ。

2007-10-02
Tue

(23:51)

ここ読んでる人の 99% には関係ない話だけど、「ポスタル」の実写映画が公開されるとかいう話を聞いた。どうもあまりにやりすぎちゃったせいで公開延期 & 日本での公開の目処は立ってないらしいけど。ろくな映画にならなそうだから、多分見に行かないだろうな。

ちなみに「ポスタル」ってのはアメリカ産のアクションゲームというか単なる殺戮ゲームで、確かコロンバイン高校銃乱射事件の犯人がこのゲームにはまっていたということもあって発禁処分を喰らってるとんでもないゲームだ。やってることは本当単なる殺人でしかなく、大英帝国の「カーマゲドン」と並ぶビッグタイトルである。

2007-10-03
Wed

(20:19)

無茶苦茶適当なこと書くけど、 Web ページのデザインでプログラマを分類すると

  • やたらサイドバーとかに詰め込んでる: IDE 大好き、重厚長大な言語のプログラマ
  • 本文以外に貧相なぐらい何もない: 古参の Unix 系プログラマか古参の C ゲンガー

という傾向があるという印象。

(22:11)

ゆっくりはっきり喋ってくれる英語ニュースの VOA News Special English は結構ありがたい存在なのだけど、問題が二つ。 VOA News は Podcast を使えるらしいのだけど、

  • 俺は Podcast 用クライアントなぞ一つも知らん
  • その Podcast にはトランススクリプトが付いてこない

というわけで、適当なものをでっちあげることにした。とりあえずこんな感じ。

#!/usr/bin/env python
import feedparser
import os
import urllib2
from htmllib import HTMLParser
from formatter import AbstractFormatter, NullWriter
 
def get_mp3_url(url):
  parser = HTMLParser(AbstractFormatter(NullWriter()))
  print 'getting %s ...' % (url)
  text = urllib2.urlopen(url).read()
  parser.feed(text)
  for i in parser.anchorlist:
    if i.endswith('.mp3'):
      return i
  return ''
 
def main():
  try:
    feed = feedparser.parse('http://www.voanews.com/specialenglish/customCF/RecentStoriesRSS.cfm?keyword=TopStories')
    while 1:
      for i, v in enumerate(feed.entries):
        print '%2d: %s' % (i, v.title)
      num = int(raw_input('enter entry\'s number> '))
      if num == -1: break
      url = get_mp3_url(feed.entries[num].link)
      print url
      os.system('mplayer %s' % (url))
    return 0
  except KeyboardInterrupt, e:
    return -1
  except Exception, e:
    import traceback
    traceback.print_exc()
    return -1
 
if __name__ == '__main__':
  import sys
  sys.exit(main())

Feed Parser と MPlayer に依存してるので、事前にインストールしておくこと。というか Plagger でやれとの声が聞こえてきそうだけど、 Plagger なんぞ知らん。後は適当に改造すればトランススクリプトを表示させたりとか出来るようになるし、その場合 Tkinter で GUI フロントエンドを作るのも悪くなさそうだけど、今日はもうこれでいいや。

ところで VOA News って Last-Modified を出力してくれないのでこっちの方でキャッシュを持って負荷軽減が難しくなってる。一度 GET したら 12 時間の間はキャッシュを参照とかにした方がいいだろうな (そのぐらいの間隔でも大丈夫だろう)。

2007-10-04
Thu

(20:11)

世界樹の迷宮の続編が出るようだ。今年の冬に発売らしいが、ちょっとまてその時期俺多分死にかけてるぞ。まあ死にかけていても買うしやるけどね。

しかし前作とディレクターが違うってのが少し心配ではある。一応、前作でストーリーを書いてた人でまったくの外様ってわけでもないので、杞憂かもしれないけど。

(21:46)

前にも書いた気がするけど俺は引責辞任と言う言葉はおかしいと思っていて、これはどう考えても無責任辞任だろう。責任を取るってのは自分のしでかしたことに収集をつけることを指すはずで、本来なら辞めるのは一通りのことをやってからだろうし、そもそもそんだけの能力があったら辞める必要もないと思う。

(23:42)

昨日書いたアレを Tkinter で GUI バージョンにしてみた。あと mpg321 でも OK っぽかったのでそっちを使うように変更。例によって超手抜きだ。

#!/usr/bin/env python
 
##################################
####### Utility functions ########
##################################
import feedparser
import re
import urllib2
from htmllib import HTMLParser
from formatter import AbstractFormatter, NullWriter
 
def get_mp3_url_and_text(url):
  print 'getting %s ...' % (url)
  text = urllib2.urlopen(url).read()
  url = get_mp3_url(text)
  transscript = get_text(text)
  return url, transscript
 
def get_mp3_url(text):
  parser = HTMLParser(AbstractFormatter(NullWriter()))
  parser.feed(text)
  for i in parser.anchorlist:
    if i.endswith('.mp3'):
      return i
  else:
    raise Exception('mp3 url has not found.')
 
def get_text(text):
  transscript = []
  flag = False
  for line in text.replace('\r\n', '\n').replace('\r', '\n').split('\n'):
    if 'articleheadline' in line:
      flag = True
    if flag:
      transscript.append(trim_tag(line))
    if flag and '<script type="text/javascript" language="JavaScript">' in line: break
  return re.sub('\n+', '\n', '\n'.join(transscript))
 
def trim_tag(text):
  return re.sub(r'<.+?>', '', text).replace('&nbsp;', ' ').replace('&lt;', '<').replace('&gt;', '>').replace('&amp;', '&')
 
def get_entries():
  try:
    feed = feedparser.parse('http://www.voanews.com/specialenglish/customCF/RecentStoriesRSS.cfm?keyword=TopStories')
    for v in feed.entries:
      yield v.link, v.title
  except Exception, e:
    import traceback
    traceback.print_exc()
 
############################
###### Player Thread ######
############################
import subprocess
import threading
 
class PlayerThread(threading.Thread):
  def __init__(self, url):
    threading.Thread.__init__(self)
    self.proc = None
    self.pid = None
    self.url = url
    
  def run(self):
    self.proc = subprocess.Popen(['mpg321', '-q', self.url])
    self.pid = self.proc.pid
    self.proc.wait()
    return
  
  def stop(self):
    if self.pid == None: return
    subprocess.call(['kill', '-KILL', str(self.pid)])
    self.pid = None
 
########################
####### Tkinter ########
########################
 
from Tkinter import *
from ScrolledText import ScrolledText
 
class Application(Frame):
  def say_hi(self):
    print "hi there, everyone!"
 
  def createWidgets(self):
    self.widgets = []
    for link, title in get_entries():
      self.widgets.append(self.new_widget(link, title))
    self.quit = Button(self)
    self.quit["text"] = "QUIT"
    self.quit["fg"]   = "red"
    self.quit["command"] =  self.exit
    self.quit.pack({"side": "left"})
    self.script = ScrolledText(self, height=10)
    self.script.pack({"side": "bottom"})
    self.player = None
  
  def new_widget(self, url, title):
    btn = Button(self)
    btn["text"] = title
    btn["command"] = lambda: self.listen(url)
    btn.pack({"side": "top"})
    return btn
  
  def listen(self, url):
    self.stop()
    source, transscript = get_mp3_url_and_text(url)
    self.script.delete('1.0', self.script.index(END))
    #self.script.config(state=NORMAL)
    self.script.insert(END, transscript)
    #self.script.config(state=DISABLED)
    self.player = PlayerThread(source)
    self.player.start()
  
  def stop(self):
    if self.player != None and self.player.isAlive():
      self.player.stop()
      self.player.join()
  
  def exit(self):
    self.stop()
    self.master.quit()
  
  def __init__(self, master=None):
    Frame.__init__(self, master)
    self.pack()
    self.createWidgets()
 
if __name__ == '__main__':
  root = Tk()
  app = Application(master=root)
  app.mainloop()
  root.destroy()

Tkinter、便利っちゃ便利なんだけど面倒な部分もあるし何より資料が少ない。 Python のオフィシャルにはメカニズムに関する物しかなくて、基本的には「Tcl/Tk のマニュアル読んでそこから Python の Tkinter モジュールにラッピングしろ、対応付けの説明はしたぞ」って感じ。なので、こればっかりは Python のオフィシャルに期待するわけには行かないなあ。

現状では見てくれとトランススクリプトの読み易さが非常に可哀想な事になっているので、そこんところは改良が必要だな。というか、 PyGtk か PyQt でやった方が良かったかも知れん。

2007-10-05
Fri

(20:28)

昨日から少し風邪気味だったのが今日になって悪化。大事を取って休むことにした。で、薬局から帰ってくる時に本屋で「魔人探偵脳噛ネウロ」の 13 巻と「でろでろ」の 11 巻を見かけたんで購入。ネウロは最近感想書いたばっかりだからやけに刊行ペースが早く思えるな。

ネウロの方は相変わらず松井先生のセンスには唸らされっ放しで、ギャグパートもシリアスパートも信頼して読める一方、いろんな方面で問題になりそうなビーンボールを投げてくるんだからたまらない。今回のテロリストネタ、よく通ったな (宮崎一家ネタよりも多分マズい。飛行機テロと朝鮮系の面構えの首謀者って)。それにしてもラストの X の台詞が実にエロい。そもそもこの漫画は弥子がひたすらネウロに調教されているようなものなんで、根本的なところでエロいんだよな。下手なエロ漫画よりもずっといかがわしいよ。

でろでろは帯に堂々と「あの妹はとてもかわいい」とか書かれていて大笑い。そうだよなあ、確かに留渦ちゃんがこの漫画の一番の魅力になってるからなあ。それはそうと、この巻では相原のお姉ちゃんが大活躍だ。妹の岬ちゃんが出てこなかったのが非常に残念だが、それは次の巻に期待って事で。

2007-10-06
Sat

(17:35)

Firefox の「リンク以外のところでミドルクリックするとクリップボードの中身のアドレスにジャンプ」という動作はどうにかならないかと思っていたら (自動スクロールを無効にしておくとこれになる)、お約束というか何というか about:config から middlemouse.contentLoadURL を false にすればその機能を Off にできた。でもこれ、インタフェース設計としては間違ってるよな。

確かにクリップボードに目的の URL が入っているなら便利な場合もあるだろうけど、実際のところは URL でない文字列が入っていたりして、それでリンクを別タブで開こうと思って違う場所をクリックしたというケースが多そうだ。というか、俺はこれしかない。 Ctrl-L (新しいタブなら Ctrl-T), Ctrl-V, Enter と操作しても結果は同じで、俺にとっちゃこっちの方が速い。実際のところ、リンクになっていない URL 文字列をコピーしてそこに移動する場合、

  1. マウス (あるいはキャレットモード) で文字列を選択
  2. 文字列をコピー (Ctrl-C)
  3. 先に述べたキーボードショートカット

とやった方が 3 番目のところでミドルクリックとするよりも自然な操作になるだろう。なぜなら、ミドルクリックする場合「マウス -> キーボード -> マウス」と入力インタフェースが二回変わるが、上の例なら「マウス -> キーボード」と一回のスイッチで済むからだ (キャレットモードならそもそもスイッチが起こらない)。ちなみに右クリックメニューからコピーすればマウスのみで完結するが、それは明らかに手間がかかるしそういった操作を行うユーザがミドルクリックでの移動をするとはとても思えない (そもそも自動スクロールを無効にしていないだろう)。他のアプリケーションで URL をコピーしてきたとかなら、確かにワンアクションで済むかもしれない。でもその場合、アドレスバーに直接コピーするよなあ。

というわけで俺はこの機能は死んでいると思うんだけど、実装されているって事はそれなりにこの機能を使っている人がいるってことかな。

(20:16)

どーでもいいけど、 Firefox ってキャレットモードのときの Home/End の動作がテキストエディタのそれ (行頭/行末への移動) になるんだよな。で、キャレットモードのときにページの最初/最後への移動は出来なくなると。これもどうなのかなあ。そもそもキャレットモードにはどうも動作におかしいところが多々あるので、もう全然使ってないんだけど。

(23:00)

ゲームやってて一番脱力する時は何かって、二周目のプレイ時に間違って一周目と同じ選択肢を選んじまうことだな。

2007-10-07
Sun

(19:32)

ここ最近はマリオカート DS ばっかやってたわけだが、ようやく 150cc までクリア (ミラーはまだ)。当然俺はキャラはクッパでカートはタイラント、主な戦術は強引なドリフトでインサイドからの体当たりだったのだが、いくら敵をコース外に弾き飛ばしてもすぐさまリカバリしてくる 150cc は一体なんだったんだ。というかだな、カロンにクッパが直線で追いつかれるってのはどういうこった? 風圧シールド走法 (や、正式名称は違うけど) をしてるわけでもないのに。どう考えても敵の基本性能が上がっているとしか思えないんだけど、俺だったらそういう調整はやりたくないなあ。

まあこのシリーズはスーパーファミコンで出た当初から CPU が専用攻撃を持っていたりしたんで、そんなことを今更気にする必要もないか。

2007-10-08
Mon

(19:45)

郵政民営化直後のゆうちょ銀行で初日からシステム障害が起こって一週間過ぎても復旧できないってそれ親のダブル役満じゃねえか。

しかし記事の内容を信じると、どうにも不可解としかいいようがないな。事前にテスト導入してそこで不具合がなくて、それで本番で不具合発生となると過負荷を疑うんだけど、どうもそうじゃないっぽいしなあ。まあ、これ以上の情報は外部に出てこないだろうから考えても仕方がないんだけど。

それにしてもこれは陰謀論者にとっては恰好のネタだな。先日の安倍首相の退陣と絡めて、権力抗争ネタでいくつか陰謀論が作れそうじゃない?

(20:32)

どーでもいいけど、俺は本当はリンクフリーという言葉が嫌いだ。理由は以下。

  • 英語としてみると明らかにおかしい。この場合、「リンクがない」という意味になる
  • 「このサイトはリンクフリーです」と書かれた場合、自由にリンクできないサイトがあるとの解釈を与える

こういう宣言をしちゃうあたりが悪い意味での日本人っぽくて本当に嫌。

(21:45)

「HUNTER × HUNTER」の連載再開についてはノーコメントで行こうと思っていたんだけど、「10 回の連続掲載」ってなんじゃそりゃああああああああああああ!

えーと、次の単行本はいったいいつになるんでしょうか。

2007-10-09
Tue

(23:35)

「ファンタ謎のフルーツ」が何味と何味の組み合わせなのかさっぱりわからねー。色合いからすると片方はリンゴっぽいんだけどなあ。

2007-10-10
Wed

(23:49)

前に fontforge で適当に合成したフォント、 f と l や i を隣接させるとおかしなことになるな。こりゃあやっぱダメかなあ。

そもそも、本来なら fontconfig で解決するべき問題だよな。 fontconfig で Bitstream と M+ と IPA の合成フォントを指定すれば、上手い具合に補間してくれるはず。この場合も三点は Bitstream のものになるので、気に食わなかったらやっぱそこだけ削除することになるんだろうけど。

fontconfig はいまいちよくわからんので敬遠してきたけど、いい加減どうにかすっかな。

2007-10-12
Fri

(22:35)

また檜山さんのところで面白そうな話が出てる。

俺はとにかくコードを書いて動かすタイプなので、脊髄反射で書いてみた。言語は当然 Python。

def down(n):
  u = Undef(n)
  return u - 1
 
def up(n):
  return n + 1
 
def reset(n):
  return 0
 
class Undef(int):
  def __init__(self, n):
    int.__init__(self, n)
 
  def __add__(self, n):
    if self >= -1:
      return int(self)  + 1
    else:
      return Undef(int(self) + 1)
  
  def __sub__(self, n):
    if self > 0:
      return int(self)  - 1
    else:
      return Undef(int(self) - 1)
 
  def __str__(self):
    if self >= 0:
      return str(self)
    else:
      return 'undef(%d)' % (self)

一応これで

  • up は 1 インクリメント
  • down は 1 デクリメント、 0 への down の結果は未定義
  • reset は 0 にする

という仕様を満たしているはず。 0 への down が未定義でも、 up(down(0)) と処理した結果は 0 に戻っていてもバチは当たるまい、むしろ自然じゃないかなと考えたのでこうした。とりあえず実行結果は以下のとおり。

>>> funcs = [up, up, reset, up, down, down, down ,up, up, up]
>>> n = 1
>>> for f in funcs:
...   n = f(n)
...   print n
2
3
0
1
0
undef(-1)
undef(-2)
undef(-1)
0
1

この未定義な状態というか非決定性が何の訳に立つかというと、例えば構文解析とか正規表現の類では活用出来るよね。例えば次のような Wiki 文法のパースなんかではもろに非決定的な状態遷移が出てくる。

見出し
======
 
パラグラフ
 
+リスト1
+リスト2
  リスト2 の続き
 +ネストしたリスト
  +さらなるネスト
+リスト 3
 
パラグラフ

これをパースするには「空行で区切る」「連続した空行で区切る」の二つがあるけど、後者は実際に使ってみたらソースコードの埋め込みとかで問題が起こるのであまり実用的ではなく、必然的に前者になる (どーでもいいけど、この日記の出力が時々おかしいのは後者のアルゴリズムで日記の記法をパースしてるせいで入力に制限があるから。とっとと直さないといけないんだけど、面倒につき絶賛放置中)。

一行ずつ読み込むと当然それだけではパラグラフなのか見出しなのかとかがまったく判断できないので、「次にくる物によって決定」せざるを得ないわけ。こういうのを非決定性有限オートマトンと呼び、正規表現のうち現在多くのアプリケーションで使われている NFA (Nondeterministic Finite Automaton) エンジンがその代表例だと思う (それに対するのは DFA)。実際には NFA をそのまま扱うのは効率面とかで問題があるらしく、その場合 DFA に変換して処理する (NFA -> DFA の変換アルゴリズムがある) らしいのだが詳しいことは知らん。

ところでこの状態遷移の話は前から書かれている圏論の話に繋がりそうな気がするけど、俺はそこまで頭良くないので具体的なことはわからん。

2007-10-13
Sat

(15:31)

何ていうか、バカは何やっても何言ってもバカなんだなあ、というのが正直なところ。何の事かって? えーと、例の三馬鹿トリオと未だに亀田を擁護してる連中のことな。

それにしても内藤選手はあんな無茶苦茶に付き合って大変だったな。「蹴りが出なかっただけマシ」と友人がいってたけど、どっちにしろ終わってる内容だった。特に終盤で出たボディスラムや度々出たヘッドロックしたままの倒れ込み、これって物凄い危険行為じゃねえの? グローブ付けてるせいで受身をとりにくいボクシングでは致命的に思える。お互い倒れ込んだ後に内藤選手の頭を小突き続けたのも酷かったし、そもそもファイトスタイル自体が酷かった。これでボクシングを見限る人が出てきても、別に不思議じゃないよな。

あと解説も酷かったというか、本来なら解説する人は内藤選手みたく素人には何が凄いのかわかりにくい選手 (俺はいろんなサイトを見て回ってようやく凄さに気がついた。視線を使ったフェイントとか俺にゃわからんよ) の何が凄いか、その技術がどういった駆け引きを生むのかを解説して、より多くの人がより深くボクシングを楽しめるようにするべきじゃないかなあ。あの亀田に「(藩邸の差はあるけど) まだ分かりませんよ」とかいったり内藤選手の立ち回りを「時間稼ぎ」とか言う前に、あんたらにはやることが山ほどあるだろうに。

亀田人気がボクシングの振興に役立ってるっていうのは明白な間違いで、そりゃあ亀田三兄弟のおかげでボクシングの視聴率は上がったかもしれないけど、それでボクシング自体を楽しめる人って増えた? ボクシングというスポーツへの理解って深まった? どちらもノーどころか、ボクシングが単なるヤンキーの茶番と思われている節も大いにあると思うんだけど。これは K-1 などの新興の格闘技と比較して遥に厳しいルーリングのなされているボクシングにとって、マイナスでしかないと思うんだけどなあ。

どうにも亀田のオヤジとかには「勝てば人気が保てる」という考えがあるように見えるんだけど、じゃああんた、それじゃ何でアンディ・フグ選手が逝去された今も圧倒的な人気を誇っているのか説明出来ないだろう。フグ選手、負けるときはそれこそ派手に KO されてたんだよな。それでもその潔い負けっぷりとその後のリベンジ合戦、そして何より「カカト落し」「フグトルネード」などの必殺技を駆使した魅力的なファイトスタイルがあったからこれだけ支持されてるの。その半面、派手さがなくて玄人受けするアーネスト・ホースト選手はそこまで人気がなくて、やっぱこれは解説者の資質の問題なのかな。

(17:19)

Youg Guitar で Michael & Christopher の Amott 兄弟が特集されてるからってわざわざ C チューニングにする俺は根本的なところでミーハーなんじゃねえかと思いつつ、掲載されてるフレーズを練習中。小指を酷使した 6 連符リフとか開放弦へのプリングを含めたアップテンポのリフを「簡単」とか言い出すこの雑誌はやっぱ超絶ギタリストになりたい人向けの雑誌だよな。ちなみに俺は殆どのフレーズをそのままのテンポで弾けない。

それにしても Amott兄弟はギター構えて並ぶ姿が本当に様になってる。キャラクター的にもプレイヤー的にもちょうどバランスが取れてるし、 Angra の Kiko & Rafael と並んで理想的なギターコンビだよな。

2007-10-14
Sun

(12:33)

どーでもいいけど、怒りとか憎しみみたいな負の感情を持つことを否定してる人たちってのは相対的に木偶の坊率が高くなるよな。だって何か行動を起こすための原動力の 50% を放棄してるんだからな。いや、負の感情の方がより強烈な原動力となるなら、 50% どころの話ではないなあ。

(18:16)

中古ショップで見かけた GBA 用 FF5 をついつい買ってしまった。いや、あんまり懐かしかったもんで。

それにしても昔はこういうゲームも遊んでたんだけど、今やってみるとストーリーとイベントシーンがかったるくて仕方がないな。それでも FF5 はゲーム本編は面白いんだけど、 FF6 からはなぁ。 FF5 の時点で低レベルクリアとかアビリティ 0 クリアみたいな変態的なやり込みが前提で調整されてる部分があってそこがちょっと納得行かないんだけど、 FF6 は普通に進めるとまったく苦戦せずにラスボスをジャガれるバランスで、まったく面白くなかったなあ。

まあ、他の RPG もレベルをある程度上げると大抵は全く苦戦しなくなっちまうんだけどな。そう考えると、レベルの上限が低くて最高レベルでパーティー組んでもラスボスどころかダンジョン内の探索でも死の危険が付きまとう世界樹の迷宮は本当に大胆な調整だったな。続編でぬるくなっていないことを願うばかりだ。

2007-10-15
Mon

(20:38)

今の職場の環境には当然ながら Python がインストールされていないのだが、使っているソフトウェアの中に Jython を同梱してる物があったのでそれを使うことにした。が、これがまた大変な代物で

  • ユニコード文字列を扱うのにモジュールをインポートする必要がある
  • クロージャが無い (lambda 式の中で外部の変数を参照出来なかった)
  • 組み込みの関数などに __doc__ が無い
  • とにかくいろいろな物が無い

というちょっとイジメのような状況だったのだけど、それでもどうにかなるもんだ。

2007-10-16
Tue

(22:46)

わかってねーのに質問しにこないってのはどういうことだろうなー? そんなに俺が怖いのか? いや、確かに俺は口と目つきが非常に悪いが、それだけで怖がられると困るんだって。まあ冗談はさておき、 (他人から見て) くだらねーことで長時間悩まれると結局周囲にしわ寄せが行くんで、とっとと相談に来いという話なんだが。

もしも自分と同世代である俺との技術格差のせいで聞きにこれない (変なプライドを持ってる) ってんなら、そんなもん捨てろといいたい。そもそも俺は社会人としては二年目だけどプログラミングの経験は六年目なわけで、そういう意味じゃあ先輩に相談すんのは当たり前だろうに。

(23:02)

ところで今日は職場で「is で始まるメンバは述語メソッドに限定されるべきだ」という意見が出て、若干揉めることになった。俺としてはそんなことで騒ぐなってところが本音だが、まあ一応出しておいた意見は

  • 他にわかり易い名前が思いつかなかったのならそれでいいだろう
  • 外部に公開するメンバであれば述語メソッドとした方がよいが、そのクラス内部でしか参照しない状態変数にまで述語メソッドを付ける必要性はない
    • 当然その場合、新しいメンバ変数名を考える必要がある
    • その結果、わかりにくいコードになったら本末転倒
    • まさか xxxxFlag とか付けるつもり? ご冗談を

といったあたり。ネーミングやコーディングの規約・ルールってのは本質的じゃないところで悩まないようにするってのも目的の一つなんだけど、それに従った結果として本質的な部分に悪影響が出たら元も子もないだろうな。

実はそれと関連して別の部分でもちょいと揉めたんだけど、そっちはあんまり一般化できる話じゃないので割愛。まあ、やっぱ規約の類を「絶対的なルール」と捉えるか、「ガイドライン」と捉えるかの違いが原因だったのは同じなんだけど。

2007-10-17
Wed

(00:53)

別にリンク元の表示とかやってもいいと思わなくもないけど、アクセスログに残るリンクスパムの形跡は俺を躊躇させるには充分過ぎる。

(21:38)

もっぺん言う。 Excel はクソ。何がクソかって、単なる CSV ファイルを開いたときに

  • 0 で桁埋めした整数値をご丁寧にトリムしやがるとか
  • 桁数の大きな数値は勝手に指数表記にしやがるとか

とにかくこっちの入力したデータを勝手に弄くるのがクソだ。ったく、どこの誰だこんなデザインにしたのは?

(23:42)

大体最初から分かっていたことだけど、やっぱり俺のところに溢れたタスクが回ってくることになったか。他に出来る奴がいないのは俺もわかってることだから、ワイルドカードとして使われるのは諦めてはいる。だけど、いい加減俺も限界だぞ。

結局、今回俺は大体半月分の仕事が (まあ本来なら二、三日で終わる仕事だが、今の現場はなあ……) ねじ込まれたようなものだ。他のメンバーの遅延を解消するためには他に手はなかったのだろうということは理解してるが、もうそろそろ最後のカードを切るぞ俺は。

2007-10-18
Thu

(23:57)

「無茶な事業拡大はヤバい」という話題で真っ先に「データイースト」の名前を出す俺もかなりどうかしてると思うが、それが理解できる人がいて「チェルノブ」というタイトルが出てくる現場ってのも相当どうかと思う。

知らない人向けの説明: 「データイースト」ってのはかなりイッチャったセンスのゲーム会社。社長が暴走して椎茸栽培に手を出して倒産。あれ、直接の原因は違ったんだっけ? まあいいか、椎茸で倒産の方が面白くて (何故かガスマスクも売ってたよな、この会社)。で、「チェルノブ」ってのはそこが出したゲームで、主人公の設定が「原子力人間」という大変気まずいゲームで、当然ながら散々に叩かれた (一応、同社「カルノフ」の関連ゲームという言い訳はされてたし、カルノフとチェルノブは実はスラブ神話の神だったりするんだけど、どう考えても言い訳不能)。俗に言う不謹慎ゲームの走りになったゲームだと思う。あと「ファイターズヒストリー」もここで、確かその操作形態があまりにスト2だったせいでカプコンに訴訟された。

2007-10-19
Fri

(23:05)

例の大相撲リンチ殺人についての週刊現代の記事を読んだけど、これはバカでかい問題が二つ重なってるなあ。

一つは当然だけど相撲協会の腐りっぷりで、これはもう相撲協会解散でよくないか。とにかくこれ以上相撲協会を野放しにしていい理由はないと思うんだ。自浄能力の欠如した組織はとっとと潰れた方がいいと思うのだけど、そうさせたくない人達でもいるのかねえ。相撲が日本の伝統文化つったって俺らの世代は既にこういう事件でしか相撲界のことは知らなくなってきてるわけで、もうそろそろ死に絶える文化だろ。角界は特別だと思ってあぐらかいてたツケだ。

もう一つはもっと深刻で、日本の検死って滅茶苦茶に杜撰らしいね。何でも、検死の素人の警察官が現場で遺体を見て事件性のあるなしを判断しているとか、警察側が事件にするのを嫌がって「心不全で死んだことにしろ」と検死に当たった医師に要請するとか、そんなことが全国で横行してるのなら日本はやはり加害者天国ということになる。俺も暴漢に教われたとき、運悪くやる気のない警察官にぶち当たって襲われ損だったこともあるからな。

ところで元時津風部屋親方の山本容疑者 (いや、まだ容疑者じゃねえけど容疑者でいいだろ、警察も立件するみたいだし) は心労で寝込んでるとか言ってるけど、朝青龍も精神にキチャッタとか言ってたし亀田大毅もそんなこと言ってたよな (亀田はガチで参ってるのかも知れんけど)。最近はほとぼりが冷めるまで心労とか言って雲隠れするのが流行なのか? ぶっちゃけた話、メディアに晒されて叩かれるよりも人を殺してしまうことの方がはるかに衝撃を受けることだと思うのだが (鬼のような訓練をしている軍人ですら、戦闘を行うのを躊躇するらしい)。人を殺しておいてのうのうと引退して年寄襲名ってのは俺からすると本当に理解しがたい。

2007-10-20
Sat

(00:34)

Candlemass の "King Of The Grey Islands" を購入。今作の目玉は新しいヴォーカルの Robert Lowe なんだけど、これが予想外に強力でびっくり。 Messiah Marcolin が辞めたと聞いたときは落胆したけど、 Robert は Robert でいいヴォーカルだと思う。というか、この人結構なベテランみたい? サイババのような風貌からは信じられないほどの太い美声で暑苦しい歌唱を披露していた Messiah に対して、 Robert はより上の音域を使った通りのよい声で伸びやかに歌い上げている。それにしてもメンバー写真での白目はなんのつもりだ。

楽曲の方は相変わらず Black Sabbath 系のヘヴィネス + 北欧らしい陰鬱なメロディとまあ前作と同じ、というか今までと同じ。

2007-10-21
Sun

(14:20)

「キチガイ」って漢字で書くと「気違い」とか「気狂い」になるんだけど、俺は「既知外」に一票。

(18:54)

「熊出没注意」という酷いネーミングのジュースを思わず買ってしまった。いや、本当に惹かれたのはガラナ飲料ってところなんだけど。これまでの人生でガラナを使った炭酸ジュースに外れはなかったのでかなり期待していたんだが、どうやら認識を改める必要があるようだ。要するにあんまりおいしくなかった。一生に一度飲めばいい (飲まない方がいいとまではいかないかな)。

(23:40)

Gentoo の ebuild では必ず Gentoo プロジェクトで登録されているライセンスを指定する必要があるんだけど、その中にはクリエィティブ・コモンズの各種ライセンスもある。で、その一覧は以下の通り。

  • CCPL-ShareAlike-1.0
  • CCPL-Attribution-NonCommercial-NoDerivs-2.0
  • CCPL-Attribution-NonCommercial-NoDerivs-2.5
  • CCPL-Attribution-2.0
  • CCPL-Attribution-3.0
  • CCPL-Attribution-ShareAlike-2.0
  • CCPL-Attribution-ShareAlike-2.5
  • CCPL-Attribution-ShareAlike-3.0

歯抜けになってたりする理由は知らない。

ところで CCPL って OSI でオープンソースライセンスだと認められているわけではないのだよな (ライセンス一覧にない)。あと確か RMS はクリエイティブ・コモンズのサンプリングライセンスの類に特に否定的だったな。

もっともクリエイティブ・コモンズ側も「CCPL よか OSI の認めてるライセンス使え」といってるんだけど、それはどうかな。 CCPL の一番の利点は極めて融通の効くライセンスだというところで、ライセンス上の制限のためにデュアルライセンスにする必要性が殆どないのは利点だろう。でも確か Debian のコミュニティから「こんなん認められねえよ」と突っぱねられてたんだっけ。いつだか CCPL-Attribution-ShareAlike-3.0 と CCPL-Attribution-3.0 が認められるかもって話が出てたけど、あれ結局どうなったんだっけ。ちょっと調べたけどまだ作業中っぽい?

2007-10-22
Mon

(00:37)

それにしても最近は俺も仕事の上でかなり追い詰められてきた感がある。仕事自体はまったく難しくないのだけど、とにかく大企業病その物のような環境でまったくといっていいほど能率が上がらないこと、本来なら俺の仕事じゃねえ仕事が舞い込んで来ていること、そして俺が作業を進める上で既に済んでいないといけないクリティカルパスが全部フン詰まりということが問題だ (まあ、フン詰まりといっても俺が手を動かす仕事には影響がなく、単に承認手続きとかの部分だけど。でもそっちの方が実はもの凄い問題だ)。ってか、どうすんだこれ? さらなる問題は今後俺にどれだけ別の作業が降りかかるかであり、展開によっちゃマジで最後のカード切るぞ。

それにしても去年の今頃の俺に言いたい。今のうちにゴネろと。呑気に構えてないで戦えと。そんな簡単なプロジェクトじゃねえぞと。技術的な困難さは後から解決できても、政治的な困難さは未然に防ぐしかないんだぞと。

(22:55)

まあなんというか、究極とか真理とか、そういった類の存在を安易に信じている人に頭のいい人はいないよ。多分。

(23:17)

この一年で 6Kg 前後太った。アリエネエ。

えーと、とりあえず運動する習慣を取り戻すところから始めようと思います。学生時代はなんだかんだいって運動してたからなあ。

2007-10-23
Tue

(00:58)

Q
チェロでメタルは出来ますか?
A
出来ます

前々から評判は聞いていて気にはなっていた Apocalyptica だけど、これはアルバム買うしかないね。

2007-10-24
Wed

(00:34)

うわ、コンビニ行こうと思ったら財布の中に 300 円もないことに気がついた。

(23:29)

小学校の道徳で真っ先に教えるべきなのは、自分が間違っていたらそれをきちんと認めることだろうなんてことを、以下の議論を見ていて思ったりした。

それにしてもニュートン力学を「ガセネタ」扱いして平気でいられる神経はスゲーな。死んでも真似したくない凄さだけど。

2007-10-27
Sat

(01:11)

ここ二日ほど日記を書いていなかったのは単にプロジェクトが紅蓮地獄になっていたからなのだが、多分もっと火を吹くことになるのだろうと考えると実に頭が痛い。ってか誰だ、あんな夢物語なスケジュールを組んだクソバカタレは。俺があと三人いても間に合わんよ。

というわけで明日明後日と休日出勤してその代休は (取れると仮定して) 多分来月の半ばという実にチンコなスケジュールが待っているのだけど、ここで俺が踏ん張らなかったら責任問題だからな、会社の。いや、別に俺は今の会社に未練はないんだけど。

2007-10-28
Sun

(00:33)

昨日は散々だった。何がって、 12:00 ぐらいに出社して 22:00 まで働いてた。アリエネエ。そして今日も午後から出社して働かんといかん。ふざけるなと言いたいどころか既に上司にも散々不満を叩きつけているのだが、どっちにしろ暫く俺はここにいないといけない。

それでも状況が好転まではいかないものの、ある程度は先が見えてきたこともあって最後のカードを切らずに済みそうだ。いやまあ、今後の状況次第じゃ容赦なく切るけどね。少なくとも、今年度いっぱいは俺の持っているカードは MTG での「ヨーグモスの意志」クラスのエンドカードになるからな。

今のプロジェクトのクソなところは一つ二つではなくプロジェクトの全てがクソなので書くと長くなるのだが、とりあえず俺らの会社の最大のチョンボは時間と人の見積りが最悪だったということに尽きる。恐らく前のプロジェクトのコードの引き継ぎがあるのでそれほど実際のコード量は多くならないと踏んでいたのだろうが、

  • 前のプロジェクトのコードが腐っていたため、そのまま使うと木造住宅の上にサンダーバード基地を作るようなものになってしまう
  • 異常な検証機構やバカバカしい環境のためにコーディングやテストよりもくだらない文書作成と体裁チェックに時間がかかる
  • コードを書くその前にコードと殆ど等価なドキュメントを書かされる (俺は完全に無視していたし今も無視してる。バレないようにすればいいだけの話だ)

などの理由で実際にはとんでもない量の作業が発生していた。その上難しい部分は全て俺に回すという前提の元にスキルに問題のある野郎を連れてきて OJT もどきをさせようとしたのが問題だ。というか、研修を一月かそこらやっただけのペーペーをいきなり連れてくるなド畜生。

確かにソフトウェア開発における見積りはとても大変だというのはわかる。正確な見積りなんて出せるはずもなく、正確にコストを算出したいなら全てが終わってから計算する以外に方法はない。そしてそれが今のビジネスでは出来ない以上、誤差が出るのは仕方がない。そしてその仕方のない誤差を受け入れられないからこそ、プロジェクトが火の車になるわけだ。はっきりいってこんな突貫工事じゃひどい品質のコードが出来上がるに決まっているのだが、恐らく向こうもまともな品質評価は行っていないだろう。

そもそも、この現場における品質の定義を開発者が知らない時点でゲームセットだ。恐らくバカみたいに標準や規約を守らせれば品質が上がると考えているのだろうが、俺からすれば未経験かつ入社一年目のガキが取りまとめた標準なんぞを守って品質なぞあがるはずもないと思うし、そもそも標準や規約は仕事をより上手く進めるために存在する物であり、今のように現場に混乱をもたらすような標準なんぞとっとと捨てるべきなんだが。

そして例えば品質評価にソフトウェアメトリクスの計測ツールを使うのであれば全ての開発者がその評価基準を知っているべきだし、本来なら全ての開発者がそのツールを使えるようにするべきだ。どうして現場でコードを書いている人たちを蔑ろにするのか。そもそも俺たち以外のチームではドキュメントの担当者とコーディングの担当者が別人のケースが殆どなのだが、人的にも時間的にもドキュメント・コード・テストの三つが乖離すればするほどソフトウェアの品質は落ちていく。このことは「人間は物事を簡単に忘れる」「相手に自分の意志を完全に伝えることは不可能」という二点から自明だ。

ちなみに今のプロジェクトはウォーターフォールで進められているが、このプロジェクトの後ウォーターフォールを肯定する輩は俺たちの会社にはいないだろう。「ウォーターフォールはあと20年消えない」に書かれている指摘は全て正しい。

2007-10-29
Mon

(22:50)

前から書いている通り、今のプロジェクトは完全無欠のデスマーチである。どう考えても技術力のある人が足りなかったし、今では時間も全然足りない。あとは死人が出れば物理的にもデスマーチになる。俺は散発的に起こる強行軍程度で済んでいるが、酷い人は一体何か月の間休日がないのだろうという状態に陥っている (内容的に俺の手伝えない部分なので俺は巻き込まれていない、というだけでもあるんだけど)。あーそうそう、精神的に叩きのめされて現場を離れた人なら数人いるし、完全にメンヘラの症状になっている人もいる。

なんでこんなバカげた事態に陥るような決定がなされたのかというと、これはもう単純な話で

  • 下請けはギリギリの予算やスケジュールを提示して仕事を取る
  • 発注元はできるだけ金払いたくないし責任も取りたくない

という親の数え役満な状態だったわけだ。少なくともうちの場合は、こういうコードレスバンジーな仕事の取り方をして、それでどうにか仕上げるというやり方のようだ。そしてそこに新人教育すらろくすっぽ行われていないペーペーと、それまでは .NET しかやったことのなかった人が連れてこられて、俺はそのお守りをしていたわけだ。やってらんねえ。

.NET の経験がある方はそれだけマシじゃないかって? 違うね。まず前提として、コードを一行も書いたことがないのにこの世界に入ってくる奴は、現場で経験を積ませてもかなりの割合で潰しの効かないく人材になることを知っておくべきだ。俺もまさかここまで酷いとは思わなかったというか、結局元からプログラミング/ソフトウェア開発に興味をもって自発的に勉強している (そしてそれを勉強だなんて思っていない) ような人でない限り、ある特定の環境でしかまともにコードの書けない (いや、まともかどうかすら怪しい) クソプログラマに成り下がるのだ。はっきりと書いておくが、クソプログラマの生産性はマイナスだ。ゼロじゃねえぞ、マイナスだ。これはクソ野郎の尻拭いに他のメンバーが駆り出され、本来やらなくてもいい仕事をしていることから明らかだ。

それにしても本当に必要なスキルは J2EE パターンを実践したフレームワーク上でガタガタなコードを書いたり ASP でページをでっち上げたりする能力ではなく、それらの技術の成り立ちや存在する意味を考えた上でソフトウェアを作る能力の方だというのに、結局お偉いさんたちは何一つとしてそこらのことを理解してないのだ。

いつの間にか人材と教育の話になっていたのでちょっと話を戻すが、こういう完全に破綻しきった仕事の取り方はいい加減にやめてもらいたい。これは絶対に強力なエースの存在を前提にしていて、そのエースが不在だったり予想以上の負荷でエースから溢れが出ると一撃で破綻する。実際のところ難しい部分はすべて俺に任せて簡単な所だけ他の面子に任せるつもりだったらしいが、実は他の部分も結構地雷だったというオチで、さらには簡単と思われていた部分も書くのに難儀するようなのが集められましたという二段オチだ。

そして今俺には来月半ばを〆とすると一ヶ月分のスケジュールの中に二ヶ月分程度の仕事がぶち込まれていて、昨日ようやくそのうちの三週間分ぐらいを終えたところである。そろそろ俺も限界なのだが、とりあえずボーナスが出るまではどうにかするつもりである。その後は知らん。既に俺はカードを切る切らないではなく、誰に対していつ切るべきかの段階に達している。

2007-10-30
Tue

(11:58)

朝起きたら心の折れる音を聞いたので今日はお休み。

前々からちょっと体のおかしい部分を診てもらう必要があるなと思っていたので、午後から医者行ってくる。どうも皮膚数ヶ所と関節がおかしなことになってるっぽい。

(21:55)

これからは仕様を確定させてからでないとシステム開発は不可能です」だって? これ、ちょっとヤバいんじゃねえのか? 俺はこの辺の話は全然詳しくないが、直感的に以下の部分が特にヤバいと感じる。

もちろん実際にできるかどうかは別の話だが、実はそんな悠長なことを言ってはいられない。外部設計がしっかりできないと、2009年4月以降はSIビジネスに重大な支障が生じる。工事進行基準による会計処理が事実上、義務付けられるからだ。

進行基準ではプロジェクトの進捗状況に合わせて売上を計上するが、その進捗状況はコストで測る。従って、事前に原価総額を正確に見積もれなければならない。外部設計が確定していないと正確な原価総額なんか出せないから、要件定義や外部設計をいい加減にやっていると、システム開発の売上計上ができないなんていう事態にもなりかねない。

そもそも仕様を確定させるなんてことが全てのプロジェクトで可能なのかという話もあるが (俺はそれが出来ることがレアケースだと思ってる)、それよか元記事の「仕様確定を必須にする=プロジェクトの火種はほぼ消える」というのも怪しい。というかウソだろこれは。確かにユーザからの仕様変更は大変な火種になるけど、他にもソフトウェア開発上の火種はいくらでも転がっているわけで、そしてそれらの火種はユーザの仕様が固まっているかどうかに関係ない。ちょっと適当に書いていくと、

  • 開発中に露呈した見積りの誤り
  • 後の工程で分かった仕様の誤り
  • マヌケな開発プロセス/手法
  • 開発チームに紛れ込んだ無能
  • 中核メンバーのドロップアウト
  • そもそも現在の科学力では不可能な要求

とか色々出てくる。あ、上の奴は全部今のプロジェクトで起こったことだ。

ところで工事進行基準ってのは初めて聞いた言葉だったのだけど、 exBuzzWord の工事進行基準によると、建設業とかで長期工事の際に進行状況に応じて収益を計上する制度らしい。といっても、俺にはイマイチよくわからんが。でもこれ、ソフトウェア開発にそのまま適用できる制度じゃないだろう。

あんまり不安感を煽ったりするのはどうかと思うけど、とりあえずちょっとこれは頭の片隅には置いとこう。

(22:06)

どうも Scribes は以下の条件で結構なメモリ食い虫になるようだ (きちんと検証してません)。

  • 長時間立ち上げっぱなし (数日単位)
  • それなりの量のファイルを開く

まあ、 Scribes は入力補助のためのサービスを立ち上げてその上マルチスレッドで動作していたりするので、確かに一つのプロセスでメモリをそれなりに消費するだろうな。

ところで Python ってグローバルインタープリタロックのせいでマルチスレッドではパフォーマンスがたいして上がらなかったよな。その点については Guido van Rossum の http://www.artima.com/weblogs/viewpost.jsp?thread=214235 とそこへのコメントが参考になる。ちなみに俺は Bruce Eckel による以下のコメントに同意だ。

We do need some kind of solution, but it probably shouldn't be threads. I think a process-based approach is probably best. I'd like to see if it's possible to, from within one cpython instance, easily start up a second one in a different process and easily communicate between them. Then you could use an agent system and the programming would become very easy and safe, while effortlessly making use of multiple processors. And no GIL removal would be necessary.

2007-10-31
Wed

(22:37)

仕事の話ばっかりだと辛いだけなので、世界樹の迷宮2の話。小森の開発千夜一夜 Vol.4によると、前作で猛威を奮ったメディックとレンジャーが弱体化され、アルケミストが強化される模様。まあ、確かに前作のあれは問題だった。俺は事前情報のおかげで「医術防御禁止」「レンジャーは採取専門」と縛りを入れていたのだけど、今回は大丈夫っぽいな。あと今回はブシドーも強化をお願いします。前作は上段の構えでボス戦に叩き込む以外に使い道がなかったからなあ (そしてバードと相性が悪すぎたので使わなくなった)。

とりあえず前作で何も考えずに名前の印象だけでダークハンターを登録した者としては、もう少し装備の入手難易度をどうにかしてくれと言いたい。いくらなんでもミラージュベストとシャドウグラブが手に入り難すぎる。特に前者、クリア後のダンジョンに出る敵のレアドロップ 10 個必要ってのは一体どういうことだ。封じについては特に不満はないというか、流石にあれ以上封じ技が入り易くなったらゲームにならないだろう。

まあ、一番の不安は発売時期に俺の仕事がどうなっているかなんだが。一応、来月の終わりには一段落なのだけど、普通に他の人から溢れた作業が回ってきそうだ。って仕事の話はしないんだった。