デバッガ付きFlashPlayer9を強制的に入れる

 なぜかFirefox版のデバッガ付きFlashPlayser9が入らなかったので、強制的に入れる方法をめも。

 以下のURLから、デバッガ付きFlashPlayer9をダウンロードする。 ActiveX control content debugger (for IE) と書いてあるのがIE版で、Flash Player 9 Plugin content debugger (for Netscape-compatible browsers) と書いてあるのが Firefox等にいれる版です。SAはスタンドアロン版。

http://www.adobe.com/support/flashplayer/downloads.html

Firefox版でこれでダウンロードしたファイルを実行すると、XPのHomeエディションでは、 C:\WINDOWS\system32\Macromed\Flash\NPSWF32.dll というDLLがインストールされる。しかし、なぜかFirefoxのプラグインフォルダに入ってた通常バージョンとかは消されてしまう(‘A`) デバッガ付きをインストールすると、NPSWF32.dllがデバッガ付きになってるので、これをFirefoxのプラグインフォルダにコピーすればプラグインとして使えるようになるようだ。

C:\Program Files\Mozilla Firefox\plugins 以下に、先ほどのNPSWF32.dllをコピーします。これでFirefoxを起動すると、無事デバッガ付き FlashPlayer9がプラグインとしてインストールされます。

おまけで、古いバージョンのFlashPlayer をインストールしたいときは、以下のURLから拾える。

http://kb.adobe.com/selfservice/viewContent.do?externalId=tn_14266&sliceId=2

デバッガ付きFlashPlayer9を強制的に入れる

PHPで可変長の引数を扱う

 PHPで可変長の引数を渡したいときは、 call_user_func_array という関数を使う。可変長の変数を配列に入れて、第1引数に文字列で関数名を書いて、第2引数に可変長の引数を渡す。

例えば、sprintf みたいな書き方でエスケープした文字列を作る関数を定義してみると、以下のように書く。

// パラメータをエスケープするための処理。(MySQLにつないでからじゃないと使えない)
function escape_query($condition_ary)
{
    _db_connect();
    // フォーマットを取得(第1引数)
    $format = array_shift($condition_ary);
 
    // 第2引数以降が、エスケープすべき値
    $escaped_value_ary = array();
    foreach($condition_ary as $_val)
    {
        $_escaped_val = mysql_real_escape_string($_val);
        array_push($escaped_value_ary, $_escaped_val);
    }
 
    array_unshift($escaped_value_ary, $format);
 
    return call_user_func_array('sprintf', $escaped_value_ary);
}
 
//呼ぶとき Railsぽく
$conditions = array("select * from fruits where color = '%s' and name = '%s'", $_POST['color'], $_POST['name']);
$escaped_str = escape_query($conditions);
PHPで可変長の引数を扱う

Windowsで書いてcoLinux環境で実行

Core2で速いPCをオフィスに置いたので、coLinux環境作ってみた。

coLinuxで快適開発環境1 の記事がとても参考になりました。

ダウンロード

http://www.colinux.org/ のDownloadから、 coLinux-0.7.1.exe を落とします。あと、下のほうに2.4系と2.6系のkernelのイメージが何個ずつか置いてあるので、好きなものをダウンロードします。僕は Debian-4.0r0-etch.ext3.1gb.bz2 をダウンロードしました。

coLinux本体のダウンロード

coLinux-0.7.1.exe を実行してインストールします。インストール先は、c:/coLinux としました。インストールする内容は、Root Filesystem image Download のチェックをはずして、あとは coLinux 内の上4つを選択すればOKで、途中TAPの警告は続行でOK。これでcoLinux本体のインストールは完了します。

Debianのインストール・設定

さきほどダウンロードしたDebianの bz2 ファイルを解答すると、Debian-4.0r0-etch.ext3.1gb というファイルがあるはずなので、これを c:/coLinux フォルダへ移動します。インストールはこれで終わりです。

次に、起動の設定を行います。c:/coLinux に start-Debian.bat のようなバッチファイルを作り、中身に以下のように記述します。mem は使用するメモリ量、cobd0 はカーネルのイメージ、codb1はスワップのイメージみたいです。最後に ネットワークの設定をするようです。 tcp:Windows側から見たポート:coLinuxのポート という形で書くようです。以下の例だと、 Windowsの 127.0.0.1 の 8022番ポートが coLinux側の 22番ポートへ向いていることになります。Webサーバ、Railsの開発環境くらいが思いついたので以下のようになってます。あと、RascutとかMySQLのポートも追加したほうが使いやすいかも。

実際は一行で書かないとだめです。

colinux-daemon.exe
 kernel=vmlinux
 initrd=initrd.gz
 mem=256
 cobd0="C:/coLinux/Debian-4.0r0-etch.ext3.1gb"
 cobd1="C:/coLinux/swap.img"
 root=/dev/cobd0
 eth0=slirp,,tcp:5901:5900/tcp:8022:22/tcp:8080:80/tcp:13000:3000 ro

起動

先ほど作った start-Debian.bat から起動します。初回起動時は、user: root / password : root がデフォルトで設定されています。起動したときからネットワークにつながっていますが、ping はつながらないので疎通テストで ping を打っても何も帰ってきませんので、wget でテキトーなURLたたいてみるとわかるかも。

Windows側からputtyなどでつなぐ場合は、SSHサーバが起動しているとして start-Debian.bat で設定した SSHのポートへ向けたWindows側のポートにつなぎに行けばOKです。上の例だと tcp:8022:22 としているので、coLinux側で22番でSSHサーバを立ち上げておけば、Windowsからputty等で 127.0.0.1 の 8022番ポートでつながります。

coLinuxからWindowsのフォルダをマウント

sambaでつなぎにいきます。たぶんこれだけでいけたはず。

# apt-get install smbclient smbfs

適当にマウントポイント作ります。

$ mkdir /home/chihaya/windows
$ mountpoint -d /home/chihaya/windows

Windows側で共有フォルダを作成します。フォルダ名はなんでもいいです、共有名が参照される名前になります。ここでは Windows側に linux_share という共有フォルダを作っておきます。IPアドレスは 192.168.1.10 だったと仮定して進めます。

coLinux側からlinux_shareフォルダをマウントします。ファイルシステムは smbfs になります。

# mount -t smbfs //192.168.1.10/linux_share /home/chihaya/windows -o username=chihaya,password=mypass

エラーメッセージが出なければマウントされているはずです。ためしに、Windows側で linux_shareフォルダにファイルを作って、ls /home/chihaya/windows とすれば、見れているはずです。無事マウントできることを確認したら、 起動時に常にマウントされるように /etc/fstab に書いておきます。一番下に、以下の行を追加します。

//192.168.1.10/linux_share   /home/chihaya/windows   smbfs   rw,username=chihaya,password=mypass   0   0

ちなみに、NFSについてはNFSでネットワーク越しにマウント とかで詳しく。

容量を増やす

作業していたら、セッションのファイルを作る空き容量がないとか言われた…。見てみると、デフォルトでは1GBしか容量が確保されていないので、すぐいっぱいになってしまう。

http://clouder.jp/yoshiki/mt/archives/000406.htmlの記事を参考にして容量9.4GBにしたよ。

Windows側のコマンドプロンプトで、以下の操作をする。(c:\coLinux は coLinux のインストールディレクトリ)

C:\coLinux>fsutil file createnew disk10gb.img 10000000000

これで、100… バイトのイメージが出来る。これをcoLinux側から ext3 でフォーマットする。

上の方で作ったバッチファイルに、以下を追加。codb1=… の直後で。

cobd2="C:/coLinux/disk10gb.img"

これで coLinux を再起動します。すると、/dev/cobd2 にさきほどのイメージがあるはずなので、これをフォーマットします。その後、現在のルート直下の内容をコピーします。

# mkfs.ext3 /dev/cobd2
# mkdir /mnt2
# mount -t ext2 /dev/cobd1 /mnt2
# cd /
# tar cpf - `ls -1 | grep -v proc | grep -v mnt2` | (cd /mnt2; tar xpf -)
# mkdir /mnt2/proc

あとは、coLinux起動時のパラメータを変えてバッチを作ります。

実際は一行で書かないとだめです。

colinux-daemon.exe
 kernel=vmlinux
 initrd=initrd.gz
 mem=256
 cobd0="C:/coLinux/disk10gb.img"
 cobd1="C:/coLinux/swap.img"
 root=/dev/cobd0
 eth0=slirp,,tcp:5901:5900/tcp:8022:22/tcp:8080:80/tcp:13000:3000 ro

これで設定は終わり。共有フォルダでコード書いてれば、書いたり調べたりはWindowsで行って、実行はlinuxみたいな感じで使える。Linuxじゃないと環境作るのが難しいものがあったりするから、そういうので有効に使っていけるといいね。

Windowsで書いてcoLinux環境で実行

Rubyで受信メール解析

 Ruby1.9 は、mail でどうぞ -> Ruby1.9 でメール解析(変なヤバいもんログ内)

Tmailというライブラリを使うと、メールを解析して扱いやすくしてくれます。

Tmailのインストール

# gem install tmail

パース方法

ファイルからパースする

メールがファイルであるならば、Fileクラスのインスタンスを渡してTMailクラスのインスタンスを作る。

receive1.rb

#! /usr/bin/ruby -w
require 'rubygems'
require 'tmail'
 
file = File.open('mail.txt'){|f| f.read}
email = TMail::Mail.load(file)
p 'to: ', email.to
p 'from', email.from

TMail::Mail.load を使ってFileクラスのインスタンスを渡すとそれを解析してくれる。mail.txt で FromとToが以下のようになっていたとすると、それぞれが配列に入る。

From: from_address@ecpplus.net
To: to_address@ecpplus.net

$ ruby receive1.rb
"to: "
["to_address@ecpplus.net"]
"from: "
["from_address@ecpplus.net"]

標準入力からパースする

receive2.rb

#! /usr/bin/ruby -w
require 'rubygems'
require 'tmail'
 
email = TMail::Mail.parse(STDIN.read)
p 'to: ', email.to
p 'from', email.from
$ cat mai.txt|ruby receive2.rb
"to: "
["to_address@ecpplus.net"]
"from: "
["from_address@ecpplus.net"]

添付ファイルを取得する

tmailダウンロードするとサンプルがついているので、それにならう。

receive3.rb

#! /usr/bin/ruby
require 'rubygems'
require 'tmail'
 
def main
  mail = TMail::Mail.parse(STDIN.read)
  mail.to # To: を取得
  mail.from # From: を取得
  idx = 1 # 複数の添付ファイルがあった場合のファイル名にしてる
  mail.parts.each do |m|
    m.base64_decode
    File.open("#{idx}.#{ext(m)}", 'w') {|f|
      f.write m.body
    }
    idx += 1
  end
end
 
CTYPE_TO_EXT = {
  'image/jpeg' => 'jpg',
  'image/gif'  => 'gif',
  'image/png'  => 'png',
  'image/tiff' => 'tiff'
}
 
def ext( mail )
  CTYPE_TO_EXT[mail.content_type] || 'txt'
end
 
main
$ cat mai.txt|ruby receive3.rb

これで、1.jpg, 2.png のようなファイル名で添付ファイル保存されるので、これで何かしたかったら分かるように保存しておけばOK。

メールサーバに来たメールを解析するとき

メールサーバにメールが届いたらそれをトリガーにして エイリアス作って渡してあげます。トリガーのひきかたは、省略。
/etc/aliases に以下のように記述して、 chihaya@ に来たメールを引数で渡すようにします。

chihaya: "|/usr/bin/ruby  /home/chihaya/receive3.rb"

あとは STDIN.read で標準入力を読んで処理すれば大丈夫。解析後のデータを使ってお好きなように。

Rubyで受信メール解析

Sendでオブジェクトのプロパティに代入

オブジェクトのプロパティを send メソッドで参照するには、send の引数にプロパティの名前を渡せばいい。

たとえば、以下のようなUserクラスがあったときに send で nameをひっぱって来るには以下のようにする。

class User
  attr_accessor :name, :email
  def initialize(name, email)
    @name = name
    @email = email
  end
end
 
>> user = User.new('chu', 'chu@example.com')
=> #<user:0x2b5764296468 @email="chu@example.com", @name="chu">
>> user.name
=> "chu"
>> user.send('name')
=> "chu"

設定ファイルでフィールド決めて内部で処理するようなときはよく使う。

次に、send を使ってオブジェクトのプロパティに 値を設定したい場合は、 send に引数を二つ渡す。 ruby は プロパティへのアクセスも全てメソッドになってる。

name属性への代入は、 name= というメソッドに引数を渡していることになる。

>> user = User.new(‘chu’, ‘chu@example.com’)
=> #
>> user.send(‘name=’, ‘chu2’)
=> “chu2”
>> user.name
=> “chu2”

send について調べてみたら、以下のようになっていた。第一引数にメソッド名を渡して、そのメソッドに対する引数は可変長の第二引数以降に渡せばいいみたい。

send(name[, args … ])
send(name[, args … ]) { …. }
__send__(name[, args … ])
__send__(name[, args … ]) { … }

オブジェクトのメソッド name を、引数に args を渡して呼び出し、メソッドの実行結果を返します。
ブロック付きで呼ばれたときはブロックもそのまま引き渡します。メソッド名 name は文字列かSymbol です。
send が再定義された場合に備えて別名 __send__ も用意されており、ライブラリではこちらを使うべきです。また __send__ は再定義すべきではありません。
send, __send__ は、呼び出し制限 にかかわらず任意のメソッドを呼び出せます。
ruby 1.9 feature: 呼び出し制限がsend, __send__にも影響するようになり、レシーバを指定した呼び出しではprivateメソッドを呼び出せなくなりました。 privateメソッドを呼び出す必要がある場合はinstance_evalを使用してください。

Sendでオブジェクトのプロパティに代入

Rails.vim のよく使う機能まとめ

Vimで使用するRailsプラグインでよく使うコマンドのまとめ。

ファイルツリー一覧

project.vim が入っていれば、 :Rproject で、ファイルツリー一覧を左側に表示することができます。

ファイルへの移動

:Rcontroller [コントーラ名]
該当のコントローラ(app/controllers/[コントーラ名])へ移動
:Rmodel [モデル名]
該当のモデル(app/models/[モデル名])へ移動
:Rview [viewファイル名]
該当のView(app/views/[view名)ファイルへ移動
:Rlaout [layoutファイル名]
該当のLayout(app/layouts/[レイアウト名])ファイルへ移動
:Rhelper [helper名]
該当のHelper(app/helpers/[ヘルパー名])ファイルへ移動
:Rmigration [migration名]
該当のMigrationiファイルへ移動。001_ のバージョンは不要
:Redit [ファイル名]
Railsのトップディレクトリから辿ってファイルを開ける。
:Rlib [ライブラリのファイル名]
lib/ 以下の該当のファイルへ移動
:Rplugin [プラグイン名]
vendor/plugins からファイルを辿って開く。
:Rstylesheet, :Rjavascript
それぞれ、 public/stylesheets, public/javascripts 以下の該当のファイルへ移動

上記のコマンドは、R の部分を RS にすることでウィンドウを分割して開けます。

関連するファイルへの移動

gf
カーソルがある単語の関連するファイルへ移動。モデルやらヘルパーやらビューやら、色んなとこでめちゃめちゃ使う。
:A, :AE
同じウィンドウで開く。[f が割り当てられている。
:AS
新しいスプリットウィンドウで開く
:AV
新しいバーティカルなスプリットウィンドウで開く。
:AT
新しいタブで開く。
Rails.vim のよく使う機能まとめ