もう終戦記念日を過ぎちゃいましたが、お盆で実家に帰った際に祖父の古い写真を幾つか見つけたのでスキャンして従軍記のブログにアップしました。

是非、俺のしょうもないブログより見ていただきたいです。

大東亜戦争従軍記

専修大学の夜学(確か)に通っていた時の祖父。

ホント、こんな三四郎みたいな格好だったんですね。ビビるわぁ。

一応、僕にも小さい頃の祖父の記憶があります。お酒が好きで、宴会の席で盛り上がった時に手拍子だけで歌う歌、(浪曲っていうのかな?)を歌っていた記憶があります。手記の中で酒盛りをしたような場面が結構ありますが、手軽に音楽を流せる機械も無かった当時、宴会はこんな感じだったのかなあと今では思います。

ご存知の通りスマホのHTML5 Auidoは現状酷い状態です。

全プラットフォーム共通で再生できるフォーマットが無かったり、iPhoneは独自仕様で自動再生はできず、ユーザー操作由来のアクションからしか再生できなかったり、複数音が再生できなかったり、Androidは2.2までは全然動かなかったり。

対応策として知られているのがCSS SpriteならぬAudio Sprite。複数の音楽ファイルをつなげて一つのファイルにし、シーク位置を制御することで好きな音を鳴らしたりループしたりする姑息なテクです。

そんな面倒なことやってられるかと思ってたんですが、そろそろAudio Sprite用のツールも揃って来ました。

jukebox

zynga/jukebox

ひとつはAudio Sprite用の再生ライブラリjukebox。Zyngaが作ってるのでちょっとマジっぽいです。

var settings = { 
  spritemap: { 
    bgmusic: { 
      start: 0.00,
      end:  20.00,
      loop: true
    },
    shoot: { 
      start: 21.00,
      end: 22.50
    },
    kaching: { 
      start: 24.00,
      end: 24.75
    } 
  } 
};

var player = new jukebox.Player(settings);
player.play('bgmusic'); // faster, sprite entry's id
player.play(12.34); // slower, will search for matching sprite entry

一つにまとまった音楽ファイルと、それぞれの曲のstart位置、end位置、loopの有無の情報を元に簡単に再生できます。勿論AndroidでのFlashへのFallbackもやってくれます。

audiosprite

tonistiigi/audiosprite

もう一つが複数の音楽ファイルを一つにまとめる面倒な作業をやってくれるaudiospriteというnodeのライブラリ。

中身はffmpegのラッパーで、ファイルを全部をくっつけた上に各種プラットフォームをカバーするための複数種類のフォーマットで音楽ファイルを作成してくれます。更にjukeboxで使うための上記で言うsettingsにあたるデータをjsonで出力してくれるという気の効きよう。

iPhoneで一番パフォーマンスが出るCore Audio Format(caf)まで作ってくれるところが泣けます。

% audiosprite --help
info: Usage: audiosprite [options] file1.mp3 file2.mp3 *.wav
info: Options:
  --output, -o      Name for the output file.                             [default: "output"]
  --log, -l         Log level (debug, info, notice, warning, error).      [default: "info"]
  --autoplay, -a    Autoplay sprite name                                  [default: null]
  --silence, -s     Add special "silence" track with specified duration.  [default: 0]
  --samplerate, -r  Sample rate.                                          [default: 44100]
  --channels, -c    Number of channels (1=mono, 2=stereo).                [default: 1]
  --help, -h        Show this help message.

実際試したところ、ちょろっと音を出したい用途には使えそうです。しかし、スマホでネット上からダウンロードして鳴らすにはこのままでは駄目で、大きなファイルになった場合の動作が不安定でした。ローカルに何とかキャッシュする方法を探れば行けるかもしれませんが、僕が試したかった怖話のような大容量の音楽ファイルを鳴らす用途には難しそうです。

怖話をruby1.9.3-p194、rails3.2.8にアップグレードしました。

ビビリなのでとりあえずconfig.active_record.whitelist_attributesはまだで。

@machidaさんがsassをcompassベースにしたりと、そろそろ少し複雑化してきたコードベースの負債を返済中。

Diablo3の為にグラフィックボードを買ったものの、パソコンがマウスコンピューターで買った2万円台のMini-ITXだったため下記の有様でした。

流石にずっとオープンエアもなんなので適当なMicro-ATXケースを価格.com経由Amazonで買いました。

DALTON DT400-BK

元の謎の安物のマザーボードはMSIの880GM-P51という奴でした。スマホでマニュアルのPDFをダウンロードし、ピンを確かめながら移行完了。

新しいケースも電源付きで安物なのに騒音も普通で特に問題無し。一昔前よりPCパーツの品質は上がってるのかなーと感慨深いものがあります。

TVの裏にコソーリ設置する為に、奥行き:420mm・幅:240mmという寸法で探したケースなので設置してみてもピッタリ。やたら眩しい青いLEDは夜ウザいのでピン外しました。

いただきもののEeePCをオフィスのステータスモニターにすべく、Debian sqeezeをインストール。しかし、時間が経ってもスクリーンロックしないって設定が効かない。仕方無くubuntu12.04をインストール。こっちは効いた。(画面を閉じたらサスペンドしないって設定は効かない。)

VNCもGDMも違くて、Macでウィンドウとか動かしたらUbuntuの画面上で動いて欲しい。それにはデフォルトで入ってるデスクトップ共有を使う。ubuntu12.04ではシステム設定からは消えてるのでDashで"デスクトップ共有"で探すとある。パスワードを要求する設定にしないと何故かScreen Sharingが永久ぐるぐるなので設定する。

office@office-S101

これでかつる

% killall NetAuthAgent

うっっっっっっっっっっz

毎月経理処理のたびにVirtualBoxのWindows XPを立ち上げてて、東京三菱UFJ銀行に呪詛の言葉を吐きかけてたんですが、3回目の証明書更新(これをロストするととてつもなく面倒なことになる)の機会にMacで出来るかやってみた。

備頭巣低死苑

結果、IEで証明書をエクスポートして(エクスポート不可がデフォルトになってるのはそのチェックボックスを外す)MacのFirefoxで読み込み、IE8にUserAgentを偽装すれば行けた。

これは快適!

// Classes/MainViewController.m:
- (BOOL) webView:(UIWebView*)theWebView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSDictionary *headers = [request allHTTPHeaderFields];
    BOOL hasWhateverAddedHeader = NO;
    
    for (NSString *key in [headers allKeys]) {
		if([key isEqualToString:@"X-Access-From-Cordova"]) {
			hasWhateverAddedHeader = YES;
			break;
		}
	}
    
    if (!hasWhateverAddedHeader) {
        NSMutableURLRequest *newRequest = [request mutableCopy];
        [newRequest addValue:@"true" forHTTPHeaderField:@"X-Access-From-Cordova"];
        [theWebView loadRequest:newRequest];
        [newRequest release];
        return NO;
    } else {
        return YES;
    }
}

無理くり。ヘッダはCordovaLibではなくアプリの方いじるだけで行けました。

// Classes/Cleaver/CDVViewController.m:
    if (startFilePath == nil) {
        loadErr = [NSString stringWithFormat:@"ERROR: Start Page at '%@/%@' was not found.", self.wwwFolderName, self.startPage];
        NSLog(@"%@", loadErr);
        self.loadFromString = YES;
        appURL = nil;
    } else {
        appURL = [NSURL fileURLWithPath:startFilePath];
    }
+    appURL = [NSURL URLWithString:@"http://kowabana.jp"];

iPhone版はローカルファイル前提になってるのでCordovaLibを無理矢理変える。

>> helper.link_to 'foo', 'bar'
=> "<a href="\"bar\"">foo</a>"
>> app.users_path
=> "/users"