2008-02-29 :-)
_ 朝ったー
0540 起床。ねむ
_ [崎元仁][松尾早人][岩田匡治][植松伸夫][葉加瀬太郎][ファイナルファンタジーXII]通勤ったー
ファイナルファンタジーXII
ゲームはまだクリアしてません。作曲は崎元仁さん、松尾早人さん、岩田匡治さん、植松伸夫さん、葉加瀬太郎さん。といってもメインで作曲しているのは崎元仁さんです。 松尾早人さん、岩田匡治さんは 2, 3 曲、植松伸夫さんは「Kiss Me Good-Bye」、葉加瀬太郎さんは交響詩「希望」を書いてます。崎元仁さんテイストあふれる作品になっています。崎元仁さん、松尾早人さん、岩田匡治さんnは「伝説のオウガバトル」など「オウガシリーズ」の作曲を担当していました。オウガシリーズを知ってるひとは「オウガっぽい曲」という印象を持つかもしれません。
崎元仁厨全開の日記を以前書きましたが[ 20070118#p05 ] FF12 の曲の特徴を要約すると以下になります。
- オーケストラ風味の音を駆使
- とくに弦楽器、管楽器
- 目立たない音楽[ 20070705#p06 ]
- メインのメロディが分かりづらい
メインのメロディが分かりづらい、というのは同じく崎元仁さんが曲を書いたグラディウスV もそうだったのだけど、メインのメロディを担当する音が目まぐるしく変わります。聴いているぶんには楽しめるのですが、コピーするときは苦労するようです。Over the Sky を書いたひとたちがそう言ってました。
面白いのが「FINAL FANTASY 〜FFXIIバージョン〜」です。FF1 から FF6 までの「FINAL FANTASY」( 以降 旧版 と略す )と FF7 から FF10 までの「FINAL FANTASY」( 以降 新版 と略す )が少し音が異なります。
旧版 FF1「オープニング・テーマ」の以下のところに注目。
新版 FF9「Melodies Of Life〜Final Fantasy」の同じところ。
FF12 の該当箇所。
旧版は 1 つ前の音符から 1 つ下げてるのに対して、新版は 1 つ前の音符から 3 つ下げてます。
FF6 までは旧版の音に馴染んでいたので FF7 からの新版の音は違和感があり、どうしても上記の部分が好きになれませんでした。FF12 で旧版が使われており、むしろ「FINAL FANTASY 〜FFXIIバージョン〜」は FF4 「オープニング」と同じです( FF4 の楽譜は持ってません )。おっさんゲーマーには嬉しいです。
B000EWBCQ0
_ 仕事
0830 出勤。
_ 「IT技術者」ってなんだ?
Mk さん「痛い技術者のことだよ」
_ [ISO8601][日付][時刻]ISO 8601 - 日付と時刻の組み合わせ
<date>T<time> のように日付と時刻の間にTを挟んで表記する。(例:2004-04-01T12:00:00+09:00=日本時間での2004年4月1日の正午)
quickml がログに書く形式はこれだったのね。
module QuickML class Logger : private def puts_log (msg) @mutex.synchronize { time = Time.now.strftime("%Y-%m-%dT%H:%M:%S") # これ @log_file.puts "#{time}: #{msg}" } end
_ [biff][CD-ROM][メール][コードリーディング][がらくた][高林哲]がらくたを読む - cdbiff
cdbiff はメールの到着を CD-ROMドライブを使ってお知らせするツールです。
メールの到着を知らせる biff という伝統的なプログラムがあります。cdbiff は知らせる手段に CD-ROM を使ったものです。呆れるほどくだらないプログラムですバカです( 褒め )。
読みます。
Ruby プログラムです。
#! /usr/bin/env ruby
プログラムの概要が書いてあります。1 行で分かるようなシンプルな書き方を見習いたいです。
# cdbiff - a mailbox flag for a CD-ROM drive
冒頭に Copyright があります。GPL です。
# Copyright (C) 2001 Satoru Takabayashi <satoru@namazu.org> # All rights reserved. # This is free software with ABSOLUTELY NO WARRANTY. # # You can redistribute it and/or modify it under the terms of # the GNU General Public License version 2.
getoptlong というライブラリを要求しています。
require 'getoptlong'
getoptlong は以下のライブラリのようです。SRA のひとらしいです。SRA こわい。
README-ja があるので読みます。
`getoptlong.rb' は、GNU の getopt_long() とまったく同じ方式でコマンド 行オプションの解析を行う Ruby のライブラリです。Ruby バージョン 1.1 およびそれ以降のバージョンで動作します。
getopt_long とはなんでしょう。getoptlong-ja.doc を読みます。.doc とありますが中身は plain text です。
GNU getopt_long() とは? ======================= GNU geopt_long() は、コマンド行オプションの解析を行う C の関数です。多 くの GNU ソフトウェアがこの関数を使用しています。GNU geopt_long() そし て `getoptlong.rb' には、以下のような特徴があります。 * 伝統的な一文字オプションに加えて、長いオプションに対応しています。長 いオプションは `-' の代わりに `--' で始まります (例: `--version')。 * 長いオプションは、一意に定まる限り後方を省略することができます (例: `--version' は、`--ver' と略すことができます。ただし、他のオプ ション名が `--ver' で始まらない場合に限ります)。 * 特殊な引数 `--' によって、オプションの解析を強制的に終了します。
次。使い方を印字します。
def print_usage print "\ Usage: cdbiff [OPTION] -f, --file=FILE Monitor FILE [/var/mail/$USER] -c, --command=COMMAND Execute COMMAND when mail arrives [eject] -i, --interval=SECONDS Monitor at intervals of SECONDS [30] -h, --help Display this help and exit " end
オプションの引数や、デフォルト値( 引数を与えなかった場合 )などを印字しています。[ ] でくくったものがデフォルト値だと予想するたんに cdbiff と実行すると以下の状態で実行されることが推測できます。
- /var/mail/$USER を監視する
- mail が来たら eject を実行する
- 監視する間隔は 30 秒
次。parse_options の定義です。
def parse_options options = Hash.new parser = GetoptLong.new parser.set_options(['--file', '-f', GetoptLong::REQUIRED_ARGUMENT], ['--command', '-c', GetoptLong::REQUIRED_ARGUMENT], ['--inerval', '-i', GetoptLong::REQUIRED_ARGUMENT], ['--help', '-h', GetoptLong::NO_ARGUMENT]) parser.each_option {|name, arg| options[name.sub /^--/, ""] = arg } if options['help'] print_usage exit 1 end return options end
オプションの名前と引数の組のハッシ20040804#p03ュとして使います。
options = Hash.new
parser.set_options でオプションの名前と引数の有無を設定してます。
parser.each_option でオプションの名前と( もしあれば )引数を取得します。
parser.each_option {|name, arg| options[name.sub /^--/, ""] = arg }
name.sub /^--/, "" で name ( オプションの名前 )についている -- を削除します。たとえば --command を command に置換します。「キーは name( オプションの名前 )、値は arg( オプション引数 ) 」というハッシュを作っています。
if options['help'] はオプションに help が含まれていたら print_usage して exit してます。
main の定義を見ます。ここの main は C の main という意味はありませんし Ruby に main というメソッドは存在しません( しないですよね )。main メソッドを定義する必要はありません。高林哲さんが書いた quickml も main から始まっているのでたぶん習慣として main を定義してるのだと思います。
最初にオプションを解析してます。先ほど読んだ parse_options です。
options = parse_options
オプションのデフォルト値を設定します。print_usage に書いてあったオプションです。
filename = "/var/mail/#{ENV['USER']}" command = "eject" interval = 30
filename = "/var/mail/#{ENV['USER']}" では環境変数 USER に設定されている値を ENV から取得してます。ENV は環境変数を表すオブジェクトです。ハッシュと同じインターフェースを持っています。存在しない環境変数を指定すると nil が返ります。たとえばこう。
irb(main):003:0> ENV['notexist'] => nil
このプログラムはお手軽な一発ネタプログラムなので環境変数の有無は気にしなくていいでしょう。
次のコードではオプションを設定しています。もしオプションを指定されていれば。
filename = options['file'] if options['file'] command = options['command'] if options['command'] interval = options['interval'].to_i if options['interval']
この「本体 if 条件」という構文は「if 修飾子」といいます。if 修飾子を使った場合は最初にやりたいことを書けるのでプログラマーの意図が伝わりやすくなります。
次が cdbiff のメインになる処理です。永久ループしてます。メールボックスの更新時刻が現在時刻よりも新しければ CD-ROM ドライブを開けます。
last = Time.now ← 最初に現在時刻を取得しておく while true begin current = File::mtime(filename) ← メールの更新時刻 rescue next end if current > last system(command) ← CD-ROM ドライブを開ける last = current end sleep(interval) ← 30 秒眠る end
File::mtime(filename) の filename にディレクトリを指定するとディレクトリの mtime を返します。なので filename に Maildir 形式のディレクトリを指定しても cdbiff 動作します。ruby すごい。
_ [/bin/sh][shell][pushd][popd]/bin/sh に pushd,popd は無いのだね
tdiary-current を追いかけるためのスクリプト[ 20080215#p10 ]を実行して気づきました。
% /bin/sh $ pushd pushd: not found
_ [トヨタの闇]トヨタの闇
内側から見た富士通「成果主義」の崩壊[ 20040804#p03 ]と似たノリです。
文が扇動的であり頭が悪そうな書き方だったり著者が世間知らずだったりするんですが、それはそれとしてカイゼン活動のために自分が犠牲になるのだったら本末転倒だよなあ。
4828413995