2006年5月アーカイブ

今日会社の人と話してて、それ Plagger でできるんじゃね?ってことになってやってみた。いや別になんてことはなくて、30boxes とかのカレンダーサービスで管理しているデータを Plagger で取ってきて携帯で見られるようにするって話です。

30box は自分のカレンダーのデータを RSS で吐いてくれるので、それを Plagger で取ってきて、 Publish::CHTML で携帯用に整形しているだけです。簡単やねぇ。
plugins:
  - module: Subscription::Config
    config:
      feed:
          - url: http://30boxes.com/rss/12345/FooBar/24rj394fk093i30w409i4r/1/

  - module: Aggregator::Simple

  - module: Publish::CHTML
    config:
      title: 30boxes
      work: /path/to/htdocs
Google Calendar でもやろうと思ったけど、Google Calendar はデータを Atom で吐き出してるっぽいのですが、設定でタイムゾーンをちゃんと +09:00に設定してるのに吐き出された Atom のスケジュールの予定時間のタイムゾーンはそうなってない。

DateTime系がまだよくわかってない部分もあるのですが、それをローカルのタイムゾーンに修正するためのフィルタも Plagger にはまだないっぽい(Filter::RSSTimeZoneStringやFilter::RSSLiberalDateTimeやFilter::FloatingDateTimeとかでできるかなと思ったが、違うっぽ(?))

あとで調べて必要なら作ってみるかな。

ffmpegをインストールして、下記のブログに載っていたオプションで生成した動画を iPod へ転送したらあっけなく見られました。(いやうそ、その前に試行錯誤すること3時間でした…)

FFMPEG And The Video iPod | Huebel Family Online

ffmpeg -vcodec xvid -b 350 -qmax 10 -bufsize 4096 -g 300 -acodec aac -ab 96 -ac 2 -i input.avi -s 320x240 -aspect 16:9 output.mp4


ちなみにffmpeg のインストール方法は「第152回
早く来い! iPod with Videoの到着を待ちきれずにH.264エンコード(2)
」を参考にしました。ここに載っている、FAAC、FAAD2、x264、liba52、そして追加で libxvidをインストールしてから(追記ただ、これ全部は必要ないかも。結局ビデオコーデックは xvid しか使ってないから x264 とかはいらないかな?)、

./configure --enable-faac --enable-faad --enable-a52 --enable-x264 --enable-pthreads --enable-gpl --enable-xvid

として、あとは make; sudo make install でインストールするだけです。そうそう、各ライブラリをインストールするために、nasmやautomake、libtoolが必要でした。

文頭で紹介した変換オプションはそのまま使ったので、音質や画質が最良のものかどうかは別です。もっとよいオプションがあるかもしれません。ちなみに今回変換したのは、.mpg → .mp4 です。あとYouTube から取ってきた .flv を変換して iPod に読み込んでみたらちゃんと見られました。

あと取ってくるところは Plagger でやろうと思います。

論点が違うのかもしれないけど、なんとなく書きたくなったので書いてみる。

自分は本を自腹で買う派です。なんでかと言えば、id:nipotan さんが書いてるように

http://d.hatena.ne.jp/nipotan/20060511/1147328208

勉強するのに必要な PC やら書籍やらソフトウェアやらも、仕事を支えるための、言わば仕事道具だから、自腹じゃないですか。
手を動かす仕事なんだから手だって仕事道具。肩コリだって仕事道具を使った上で消耗してしまった結果。「消耗品」と考えれば、自腹であるのも普通。

という理由だったり、id:tokuhirom さんが書いているように、

http://d.hatena.ne.jp/tokuhirom/20060513/1147476176

だって、書籍は今後もし転職したとしたら、その時に持ってけないじゃないですか。(転職する可能性が皆無の人はともかく)
あと、俺は書籍はカキコミまくるので、買ってもらったものだとやりづらいというところもある。

という理由があります。これらに同感です。


今働いてる会社が特殊という理由が大きいのですが、今自分の働くために使ってる環境は、「本」以外にも「キーボード」も「ディスプレイ」も、そして「コンピュータ」ですら自腹で買ったものです(会社支給のものも使ってはいます)。まぁ流石に普通の会社であればコンピュータ、ディスプレイ、キーボードは提供されるのが普通だと思います(前職のときは支給されていました)が、たとえそういう会社に入ったとしてもせめてキーボードだけは自分で買ったものを使いたい、使い慣れたものを使いたいと*普通*に思います。(その意味では、キーボードとか本とかは大工の道具箱みたいなものなんだろうと思うし、プログラマというのは職人というカテゴリに入ってる職種なんだろうと思います。)


あと 1 つ思うのは、今の仕事が趣味の延長線上なのかそうでないのかという違いによっても、自腹で買うかどうかについての感じ方が違ってくるんじゃないかと思います。もし自分がプログラミングやシステムなんて好きでもないし、やりたくもないと思っていたとしたら本は自腹で買っていないかもしれません。「なぜ俺がこんな高いものを買うんだ、会社で買ってもらおう」と思いそうです。それに好きでもない仕事をしていたら、次に転職する会社でやる仕事が違っていたりする場合も多いんじゃないかと思うから、せっかく買った本を活用できない場合も多そうな気もしたりする。

まとめると、

http://d.hatena.ne.jp/charsbar/20060513/1147511355

逆説的な言い方をすると、そういうコスト意識なしに買っているものは、仕事に使うものなんじゃなくって、単なる趣味・道楽の道具でしかない。そりゃあ道楽に使う金まで経費に計上しちゃいけませんやね。

ということを id:charsbar さんが書いていますが、自分が本を自腹で買うのはここで言う「趣味・道楽」の延長線上に仕事があるというのが結構大きいんじゃないかなぁと思います。そう思うのは自分だけかもしれませんが。

最近 Ruby を覚えてるのだけど、emacs で ruby-mode を使うための設定。なんも特別なことはしてません。たんなるメモです。

ソースの misc にある *.el ファイルを /usr/local/share/emacs/site-lisp などにコピーしてから下記を設定すればいいっぽい。
(autoload 'ruby-mode "ruby-mode"
  "Mode for editing ruby source files" t)
(setq auto-mode-alist
      (append '(("\\.rb$" . ruby-mode)) auto-mode-alist))
(setq interpreter-mode-alist (append '(("ruby" . ruby-mode))
                                     interpreter-mode-alist))
(autoload 'run-ruby "inf-ruby"
  "Run an inferior Ruby process")
(autoload 'inf-ruby-keys "inf-ruby"
  "Set local key defs for inf-ruby in ruby-mode")
(add-hook 'ruby-mode-hook
          '(lambda ()
             (inf-ruby-keys)))

VMWare Playerを一ヶ月ぐらい使ってたのですがどうもノートPCの挙動が重くなったりするので colinux に戻しました。
使い方としては VMWare Player はずっと起動しっぱなしにして、その間にノートは何回もスリープさせたり復帰させたりする使い方をしてました。そうするとどうもノートのスリープからの復帰時間が遅いときは5分とかかかるようになってしまって…。MWare Player のメモリ設定とかも32MBとかにしてみたが効果ないので colinux に戻りました。

ちなみに ubuntu を使ってたのですが、これが悪いのかな?わからん…。

Yahoo! Widget の Widget を作っていたときのことです。 バイナリファイルを Base64 にエンコードする必要があったのですが Yahoo! Widget の Windows 版に付属する UnixUtils のコマンドでは今のところそういったコマンドが用意されていません。Mac OS X の Yahoo! Widget ならば Perl とかを使ってゴニョゴニョできるのですが、Windows 環境だとどうすることもできないのということで、Windows の Yahoo! Widget にも付属している gawk を使って変換するスクリプトを作りました。

オリジナルのコードはこちらにあるもので、これを改造しました。
結構高速化をしてみたのですが、それでもWindows 環境で実行するとちょっと遅いですね。。。でもこれを使えば Windows 環境の Yahoo! Widget でもバイナリファイルを Base64 エンコードすることができるようになります!
BEGIN {
    if (ARGC < 2) {
        print "\nEncode an file to BASE64.";
        print "\nUsage: b64enc.awk <filename>\n";
        exit;
    }
    else ARGC = 1;

    BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    result = ""

    for (i = 0; i < 256; i++){
        asc[sprintf("%c", i)] = i
    }

    RS = ""

    while (getline < ARGV[1])
        data = data $0

    while (length(data) > 0) {
        # Specify byte values
        if (length(data) == 1){
            byte1 = asc[substr(data, 1, 1)]
            byte2 = 0
            byte3 = 0
        }
        if (length(data) == 2){
            byte1 = asc[substr(data, 1, 1)]
            byte2 = asc[substr(data, 2, 1)]
            byte3 = 0
        }
        if (length(data) >= 3){
            byte1 = asc[substr(data, 1, 1)]
            byte2 = asc[substr(data, 2, 1)]
            byte3 = asc[substr(data, 3, 1)]
        }

        # Create BASE64 values
        base1 = rshift(byte1, 2)
        base2 = lshift(and(byte1, 3), 4) + rshift(and(byte2, 240), 4)
        base3 = lshift(and(byte2, 15), 2) + rshift(and(byte3, 192), 6)
        base4 = and(byte3, 63)

        # Compose BASE64 string
        if (length(data) == 1){
            result = result substr(BASE64, base1 + 1, 1)
            result = result substr(BASE64, base2 + 1, 1)
            result = result "=="
            data = ""
        }
        if (length(data) == 2){
            result = result substr(BASE64, base1 + 1, 1)
            result = result substr(BASE64, base2 + 1, 1)
            result = result substr(BASE64, base3 + 1, 1)
            result = result "="
            data = ""
        }
        if (length(data) >= 3){
            result = result substr(BASE64, base1 + 1, 1)
            result = result substr(BASE64, base2 + 1, 1)
            result = result substr(BASE64, base3 + 1, 1)
            result = result substr(BASE64, base4 + 1, 1)
            data = substr(data, 4)
        }
    }
    print result
}
A というすでにいろんなメソッドが定義されているクラスがあって、その中に foo っていうメソッドがすでにあったとします。で、その A というクラスを継承した B というクラスを作ったとして、でもあるプログラムで B のインスタンスを生成して $b->can('foo') ってやったときだけ真にならない(他のメソッドが呼ばれたときは真にする)方法ってないかということで先日 id:nipotanや id:ikebe と話をしていたところ、UNIVERSAL::can なるものをみつけた。これを使えばやりたいことはできるのではという話になりました。

UNIVERSAL::can はなにをするもんかというと、それを use したクラスに can というメソッドを定義すれば、そのクラスのインスタンスに対して $instance->can('hoge') ってやると、そのクラスに定義した can が使われるというものだそうで、これを上手く上記の問題に照らし合わせると。。。

B というクラスで、
sub can { $_[1] eq 'foo' ? undef : UNIVERSAL::can($_[0], $_[1]) }
という風に can を定義しておけば、やりたいことができるんじゃないかと。
テストコードの全容は下記のような感じです。これを実行すると $b->can('foo') は false なので sub foo { warn "foo" } は実行されず、$b->can('bar') はコードリファレンスが返されるので sub bar { warn "bar" } が実行されます。

#!/usr/local/bin/perl
use strict;

package a;

sub new { bless {}, shift }
sub foo { warn "foo" }
sub bar { warn "bar" }

package b;

use base qw(a);
use UNIVERSAL::can;

sub can { $_[1] eq 'foo' ? undef : UNIVERSAL::can($_[0], $_[1]) }

package main;

my $b = b->new;
$b->can('foo') && $b->can('foo')->();
$b->can('bar') && $b->can('bar')->();
これ他にやりかたあるんだろうか…。ちなみに、普通の can は perldoc UNIVERSAL とやると説明が書いてあるというのも初めて知りました。。。
追記
コメントにありますが、当初やりたかったことは B のクラスに sub can {} を定義してやれば $b->can() って呼んでやるのであれば解決するという結論になりました。UNIVERSAL::can() を使う場合には UNIVERSAL::can モジュールを use してやる必要があるようです。
C-[ d
今日にぽたんと探していて発見しました。これは便利だ。
これって正当な方法なのかな?挙動としては下記のようになります。(※ []をカーソルとします)
% /home/clouder/[]foo/bar
↓
% /home/clouder/[]/bar

入門csh & tcsh
入門csh & tcsh
posted with amazlet on 06.05.02
ポール デュボワ Paul DuBois 鈴鹿 倫之 福沢 康裕
オライリー・ジャパン (2002/02)
売り上げランキング: 134,690

検索

広告

月別 アーカイブ

OpenID対応しています OpenIDについて
Powered by Movable Type 5.12