Hatena::ブログ(Diary)

kansuke426の日記 このページをアンテナに追加 RSSフィード

2010-12-03

カゴヤVPSはエロサイトの楽園?

増田自分でWEBサービスを作りたいと思っている人へで知ったのですが、カゴヤVPSを出しているらしい。カゴヤ・クラウド/VPSによると現在はβ版で正式リリースは来年2月とのこと。

増田の記事で気になったのは、カゴヤVPSがエロサイト可なのか否か。

KAGOYA クラウド/VPS βテスター 3期募集に応募してみた。によると現在規約自体が無いらしいので最終的にエロ可となるのかよく分からないのですが、さくらVPSもServerManもエロNGなので仮に可能となった場合日本のVPSのシェアが一転する可能性が。

エロ可なら私も借りる予定。

2010-12-02

Windows7 Starterで*NIXのLPRプリンタに印刷する

ぶっちゃけ似たようなトラブル抱えてる人が日本にどんだけいるのか分かりませんが、http://technet.microsoft.com/ja-jp/library/cc731857%28WS.10%29.aspxに書かれているとおりWindows7 Starterから*NIXのlpd経由で直接印刷することは難しいようです。

直接印刷できないんだったら間接的にやってやれということでトラブルシューティングしてみました。

  1. Windowsに出力するプリンタのドライバを入れる
  2. 出力先をFILEにして印刷
  3. sftpとかでサーバに印刷ファイルをアップロード
  4. cp FILE /dev/lpt0 (デバイスファイルは適当に)

cpじゃなくてもlprでも印刷できると思いますがrawモードにするの面倒くさかったのでcpする方が手っ取り早かったです。

2010-11-26

datetimeオブジェクトをUNIXタイムスタンプに変換する方法

datetimeオブジェクトUNIXタイムスタンプに変換するコードは必要になる場面が結構多いと思うのですが、単純に変換できなかったりするのでよく忘れたりします。今日も忘れたのでメモっときます。

まず手順的には、datetime.utctimetuple()でUTCのtimetupleに変換し、UTCのtimetupleをcalendar.timegmでUNIXタイムスタンプに変換します。こう書いちゃうと簡単なんですけど、timeモジュールじゃなくてcalendarモジュールにtimegmが入ってるのを知らないと調べるのも一苦労です。

具体的にはこんな感じです。

>>> import calendar
>>> import datetime
>>> dt = datetime.datetime.now()
>>> print dt.utctimetuple()
(2010, 11, 27, 2, 17, 43, 5, 331, 0)
>>> dt2 = datetime.datetime.fromtimestamp(calendar.timegm(dt.utctimetuple()))
>>> print dt2
2010-11-27 11:17:43

変換過程でミリ秒部分が消えちゃうので注意してください。

2010-11-19

CDからCDAファイルを取り込みアルバムごと最高品質のMP3を作るスクリプト

MacBookで音楽聴きたいなーと思いiTunes Storeでなんか買おうかなーと思っていたのですが、よく考えたらBSD BoxにCDあるのでそっから持ってきた方が早いということで試行錯誤してみました。同じ悩みをかかえている方はあまりいないと思いますが参考程度にメモしておきます。

まず個人的な要求スペックはこんな感じです。

  1. MacBookにつなげるCD-ROM等は持ってない
  2. BSD BoxにCD-ROMがあるのでそれを使いたい
  3. コマンドラインからCD単位でバッチ処理したい
  4. MP3タグを自動で付けたい
  5. MP3の録音品質をできるだけ高くしたい

Mac用のDVD-ROMを買えって気もしますが他に使う予定も無いのでとりあえずパスの方向で。

使うもの

CDとMP3へのアクセスにはcdparanoiaとlameコマンドを使います。特に深い意味はありませんがスクリプトPythonで作成することにしました。CDDBデータベースへのアクセスしてMP3タグにCDの情報を埋め込みたいのでcddb-pyを使います。

スクリプト

cdparanoiaでCDから曲単位でCDAファイルを作成し、lameMP3に変換します。コマンド実行のついでにCDDBデータベースを参照してmp3にタグを付与します。

実行に際してはCD-ROMデバイスをDEVICE変数にセットしてください。

CDを挿入した状態でスクリプトを実行すると、"アーティスト名/アルバム名"ディレクトリに曲単位でmp3ファイルを作成します。MP3のファイル名は"曲名.mp3"になります。ついでにMacへ転送する用のアルバム単位でzipしたファイルも作成します。

実行中すべてのCDAファイルとMP3ファイルをハードディスクに展開しますので1GB程度の空き容量が必要です。CDAファイルは実行後削除します。

こちらの環境はBSD Boxですが、OS依存の箇所はそんなにないので*NIXならだいたい動くと思います。

#!/usr/bin/env python

import os, sys, re, glob, tempfile
import CDDB, DiscID

# TODO 要設定
DEVICE = '/dev/cdrom'

def shquote(s):
    return "'%s'" % s.replace("'", "'\\''")

def sh(cmd):
    if os.system(cmd) != 0:
        raise UserWarning, cmd

def remove_dir(d):
    for f in glob.glob('%s/*' % d):
        os.unlink(f)
    os.rmdir(d)

rc_space = re.compile(r'\s')

def fix_path(s):
    return rc_space.sub('_', s.replace('/', '-'))

def main():
    tmpdir = tempfile.mkdtemp(prefix='mp3-', dir=os.getcwd())

    try:
        cdrom = DiscID.open(DEVICE)
        disc_id = DiscID.disc_id(cdrom)

        (query_status, query_info) = CDDB.query(disc_id)
        if isinstance(query_info, list):
            query_info = query_info[0]
        (read_status, read_info) = CDDB.read(query_info['category'],
                                             query_info['disc_id'])

        artist, album = read_info['DTITLE'].split(' / ', 1)
        dstdir = '%s/%s' % (artist, album)

        print 'Processing %s / %s' % (artist, album)
        print

        # NOTE -p だとCDAファイルが読み取れなかったので -r にしてます
        # big-endian マシンの場合 -R に変えてください
        sh('cd %s; cdparanoia -r -B -d %s' % (shquote(tmpdir), shquote(DEVICE)))

        try:
            os.makedirs(dstdir)
        except OSError:
            pass

        max_track = 0
        while True:
            max_track += 1
            if not read_info.has_key('TTITLE%d' % max_track):
                break

        i = 0
        while True:
            title = read_info.get('TTITLE%d' % i)
            if not title:
                break
            i += 1

            cda = '%s/track%02d.cdda.raw' % (tmpdir, i)
            dst = '%s/%s.mp3' % (dstdir, title.replace('/', ' '))
            cmd = ('lame -r -b 320 --preset insane '
                   '--tt %s --ta %s --tl %s --ty %s --tn %d/%d --tg %s '
                   '%s %s' %
                   (shquote(title), shquote(artist), shquote(album),
                    shquote(read_info['DYEAR']), i, max_track,
                    shquote(read_info['DGENRE']),
                    shquote(cda), shquote(dst)))

            print 'Creating %s' % dst
            sh(cmd)

        zip = fix_path(dstdir)
        print 'Creating %s' % zip
        sh('zip -r %s.zip %s' % (shquote(zip), shquote(dstdir)))

    finally:
        remove_dir(tmpdir)

if __name__ == '__main__':
    main()

TODO

  • CDDBクエリに失敗するとスクリプトも異常終了しますが、手持ちのCDだと問題になったことがないので放置
  • iTunes的にはgracenoteのMusicID等をiTunes用のMP3タグとして埋め込むと良い感じらしいですが、CDAファイルからMusicIDを求める方法を調べきれませんでしたので未対応

参考サイト

MP3の音質については以下のサイトを参考にしました。個人的には知識0なので何も保証できません。

gracenoteのMusicIDとiTunesの関係については以下のサイトが詳しいです。

2010-11-16

イベント透過なビューの作成

イベント的に透過なビューの作り方の説明です。色的に透過なビューはOpaqueを設定してください。

UIViewのイベントハンドリング

iPhoneではFirst Responderのみがイベントを受け取ります。UIViewを重ね合わせた時、Z軸上でユーザーから見て後ろに回ったビューに対してイベントは伝達されません。

二つのビューがあり、Z軸上で前にあるビュー上のボタン等のユーザーインタラクション可能な要素(サブビュー)がイベントをハンドリングしなかった際に、後ろのビューへイベントを伝搬させたい場合は、前のビューのhitTestメソッドを以下のようにオーバーライドする必要があります。

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    UIView *rv = [super hitTest:point withEvent:event];
    return (rv == self ? nil : rv);
}

もうちょっと簡単な方法があるような気がしますが、調べた範囲では無さそうです。isUserInteractionEnabledをYESにするとサブビューに対してもイベントが飛ばなくなりますので、上のようなシチュエーションには有効ではありません。

画像を用意しないと何を解決したいのか分かりにくい気もしますが面倒くさいのでパスってことで。