2009年 05月 28日

gerry++

三日連続

スカラクロウラ - アクター

うーんよくわからない。while(true)/receive と loop/react の違いもよくわからない (スレッド作るかそうじゃないかだけの違い?)

クローラっぽいのを練習がてら書いてみた。あんまりわかりやすくはないなぁという気もする。もっといい書きかたあるのかな。

  • 一度に走るリクエストは2つまで
    • あらかじめ2つリクエストを出す Actor を作ってそれのキューにいれていく
  • List あたりが微妙にわかりにくい。普通に shift/push したい

http://gist.github.com/119257

あれこれ最初、スカラクロウラとかエントリで言いたかっただけだったのに、全くそんなこと忘れてエントリ書いてた

MP3 ID3 文字コード関係を仕様書にあたってみる

仕様がどうなっていようと使ってるやつが対応してないと意味ないですけどね!!

ID3v1

http://mpgedit.org/mpgedit/mpeg_format/mpeghdr.htm#MPEGTAG

  • 文字コードについて記述なし
  • title, artist, album それぞれ 30bytes しか書けない

ID3v2

2.3

http://www.id3.org/id3v2.3.0

  • If nothing else is said a string is represented as ISO-8859-1 characters in the range $20 - $FF. Such strings are represented as , or if newlines are allowed, in the frame descriptions. All Unicode strings use 16-bit unicode 2.0 (ISO/IEC 10646-1:1993, UCS-2). Unicode strings must begin with the Unicode BOM ($FF FE or $FE FF) to identify the byte order.

要は

  • ISO-8859-1
  • UTF-16
  • UTF-16BE

でしか書けない。

2.4

http://www.id3.org/id3v2.4.0-structure

   Frames that allow different types of text encoding contains a text
   encoding description byte. Possible encodings:

     $00   ISO-8859-1 [ISO-8859-1]. Terminated with $00.
     $01   UTF-16 [UTF-16] encoded Unicode [UNICODE] with BOM. All
           strings in the same frame SHALL have the same byteorder.
           Terminated with $00 00.
     $02   UTF-16BE [UTF-16] encoded Unicode [UNICODE] without BOM.
           Terminated with $00 00.
     $03   UTF-8 [UTF-8] encoded Unicode [UNICODE]. Terminated with $00.
  • ISO-8859-1
  • UTF-16
  • UTF-16BE
  • UTF-8

で書ける。場合によっては ISO-8859-1 と UTF-8 でしか書けない場合がある? (Tag restriction あたり。よくわからない)

個人的なベスト

  • ID3v1 は書かない
    • 今時 ID3v2 に対応してないプレイヤーとか捨てればいい
    • 文字化けの元
  • ID3v2.3 にしておく
    • 文字コードは UTF-16(LE)
2009年 05月 27日

部分適用・メソッド呼びだしの syntax suger・デフォルト引数

メモメモ。簡単な Singleton Logger を実装してみる

//#!scala

object Logger {
	var level = 0

	def log (message: String, level: Int) {
		if (this.level <= level) {
			println(message)
		}
	}

	def log (message: String):Unit = log(message, 1)

	def debug = log(_: String, 0);
	def info  = log(_: String, 1);
	def warn  = log(_: String, 2);
	def error = log(_: String, 3);
	def fatal = log(_: String, 4);

	// この例の場合はこうしたほうがいい気がする
	// def log (message: String):Unit = info
}

Logger.level = 1

Logger debug "debug"
Logger info "info"
Logger warn "warn"

部分適用は _ と型さえ書けばいいっぽい? 引数の順番に制限はないようだ

Logger foo argLogger.foo(arg) の syntax sugar らしい。引数一つのときに省略ができるというルールではなくて、レシーバも含めた syntax sugar のようだ

デフォルト引数は Ruby とかのように仮引数に書くことはできなくて、overload で定義するっぽい。このとき overload する側のメソッドは、返り値の型の宣言が必要らしい

gerry++

二日連続

2009年 05月 26日

gerry++

2009年 05月 23日

memo

$ command git log --pretty=format:"%ad %an" --date=short | grep cho45 | awk '{ t[$1] += 1 } END { for (u in t) print u, t[u]}' |sort
$ gnuplot << EOF
set xdata time
set timefmt "%Y-%m-%d"
plot "/tmp/dt" using 1:2 with lines
EOF
2009年 05月 22日

コマンドラインのmp3 id3 タグ編集ツール

linux のコマンドラインで id3v2 を編集するやつってたくさんある割にろくなものがなくて、文字化けしたり正しいフォーマットで書きこめなかったりするのだけど、とりあえず使える方法を見つけたのでメモ

eyeD3 をとりあえず使う。python で書かれた id3 タグ編集ツール。そこそこよくできているけど、正しく文字コードを扱わない。

$ echo $LANG
ja_JP.UTF-8

$ eyeD3 --version
eyeD3 0.6.14 (C) Copyright 2002-2007 Travis Shirk <travis@pobox.com>

$ eyeD3 --set-encoding=utf16-LE --to-v2.3 --artist "ふー" --title "ばぁー" foo.mp3 
foo.mp3 [ 6.01 MB ]
--------------------------------------------------------------------------------
Time: 6:34      MPEG1, Layer III        [ 128 kb/s @ 44100 Hz - Joint stereo ]
--------------------------------------------------------------------------------
Setting artist: ふー
Setting title: ばぁー
Converting tag to ID3 version v2.3
Writing tag...
ID3 v2.3:
title: ã°ãã¼          artist: ãµã¼
album:          year: None
track:  

UserTextFrame: [Description: Tagging time]
2009-05-21T15:39:24

というふうに、頑張って書いてくれるのはいいけど、自分で書いたやつをちゃんと読みだせていない。

とりあえず決め打ちでちゃんと書けてくれさえすればいいので

#!/usr/bin/env python

import eyeD3
import os, sys
from optparse import OptionParser

parser = OptionParser(usage=u'%prog [opts] target.mp3')
parser.add_option("-T", "--title",
    dest   = "title",
    action = "store",
    type   = "string",
)
parser.add_option("-A", "--artist",
    dest   = "artist",
    action = "store",
    type   = "string",
)
parser.add_option("-L", "--album",
    dest   = "album",
    action = "store",
    type   = "string",
)

(options, args) = parser.parse_args(sys.argv[1:])
if not len(args) == 1:
    sys.stderr.write("requires target.mp3")
    exit();
target = args[0]

tag = eyeD3.Tag()
tag.link(target)
tag.header.setVersion(eyeD3.ID3_V2_3)
tag.setTextEncoding( eyeD3.UTF_16_ENCODING )

if options.title:
    tag.setTitle( unicode(options.title, 'UTF-8') )
if options.artist:
    tag.setArtist( unicode(options.artist, 'UTF-8') )
if options.album:
    tag.setAlbum( unicode(options.album, 'UTF-8') )

tag.update()

os.execlp("eyeD3", "", target)

というのを非常に頑張って書いた。Python 無理です。

なんかこれだと foobar2000 で場合によって文字化けする。なんなんだろ…… 判定に失敗するんだろうか。

firefly (mt-daap) だと大丈夫なんだけどなぁ。なんで id3 をまともに付けられる/読める環境になってないんだろ

2009年 05月 20日

Android 環境構築

やるだけやっとこうと重いました。

  • sdk を展開 → ~/sdk/android-sdk-mac_x86-1.5_r1
  • ~/sdk/android-sdk-mac_x86-1.5_r1/tools を PATH に追加

android コマンドが管理ツールらしい

$ android create avd --name test --target 2
# Android 1.5 ベースの AVD がつくられる
# 指定する id は android list でみれる

$ android list
Available Android targets:
id: 1
     Name: Android 1.1
     Type: Platform
     API level: 2
     Skins: HVGA (default), HVGA-L, HVGA-P, QVGA-L, QVGA-P
id: 2
     Name: Android 1.5
     Type: Platform
     API level: 3
     Skins: HVGA (default), HVGA-L, HVGA-P, QVGA-L, QVGA-P
id: 3
     Name: Google APIs
     Type: Add-On
     Vendor: Google Inc.
     Description: Android + Google APIs
     Based on Android 1.5 (API level 3)
     Libraries:
      * com.google.android.maps (maps.jar)
          API for Google Maps
     Skins: HVGA (default), HVGA-L, QVGA-P, HVGA-P, QVGA-L
Available Android Virtual Devices:
    Name: test
    Path: /Users/cho45/.android/avd/test.avd
  Target: Android 1.5 (API level 3)
    Skin: HVGA

$ emulator -avd test

するととりあえずエミュレータは起動する。コマンド名が攻めすぎててヒく

2009年 05月 19日

IMK 版の AquaSKK 場所 memo

/Library/Input Methods/AquaSKK.app/Contents/Resources