RubyでホストのMac Addressを取得する方法(How to Use macaddr-1.2.0)

RubyでそのOSで認識されているネットワークインタフェースのMacアドレス一覧を取得する方法.
素直にifconfigを呼び出しでパースするのが早い気もするけど,macaddrなるgemsがあったので使ってみた.
インストールは

sudo gem install macaddr

でおわり.でも僕の環境ではsystemuが無いと怒られてrequire出来なかったのでsystemuも入れた.

sudo gem install systemu

Rdocを読む限りメソッドは2つ.
1つは一番若い名前のインターフェースのmac addressを取得する.
もう一つは複数のインターフェースが有る場合に全部のインターフェースのmac addressのリストを返す.

require 'rubygems'
require 'macaddr'

p Mac.addr
p Mac.addr.list

サンプルコードはこれで終わり.

RDocにはifconfigのラッパーだと書いてある.
したがって,Bridge Interfaceなども含めたifconfig -a で見えるmac addressを持つインターフェースは全部取れる.
本当にmac address,及びそのリストだけ取得される.
贅沢を言えば論理名を同時に取得するメソッドが欲しかった.

Adobe HTTP Dynamic StreamingとOSMFPlayerでストリーミングサーバー

大量に持っているmp4ファイルをどこからでも見れるようにストリーミングサーバーを作成したくて,色々調べてみた.
無料で作れる物としてはApacheにモジュール導入するだけで済むAdobe HTTP Dynamic Streaming+OSMFPlayerが一番イケてそうだったので,試しに導入してみたメモ.

導入環境はDebian 5.0.8 amd64 + Apache2.2.9
Adobe HTTP Dynamic Streaming自体はApache2.2以降なら動くらしい.
まず,Adobeのサイトから以下の3つの物をダウンロード(無料で作れるAdobeアカウントが必要)

HTTP Origin モジュール
File Packager
OSMFのサンプル

今日現在ダウンロードするとファイル名は以下の3つ.
adobe_f4f_apache_module100_linux_x64.zip
adobe_f4fpackager100_linux_x64.zip
OSFMPlayer_zeri2.zip

OSMFPlayerのファイル名がおかしいのは仕様だと思いますw
解凍した中に入っているファイル名の綴りは"OSFM"です.

まず,apacheのモジュールの導入.

unzip adobe_f4f_apache_module100_linux_x64.zip
cd HTTP_Module_1.0_Linux_x64/adobe/f4fmodule

中に以下の3つのファイルが入っている.
libexpat.so.1
libF4V.so
mod_f4fhttp.so
これをモジュール置き場にコピー.

apache2からmoduleは/etc/apache2/mods-availableに実体を置き,/etc/apache2/mods-enabledにシンボリックリンクを張る仕様になったのでその通りに...

sudo cp libexpat.so.1 libF4V.so mod_f4fhttp.so /etc/apache2/mods-available/
cd /etc/apache2/mods-enabled
sudo ln -s ../mos-available/libexpat.so.1 libexpat.so.1
sudo ln -s ../mos-available/libF4V.so libF4V.so
sudo ln -s ../mos-available/mod_f4fhttp.so mod_f4fhttp.so

Apacheに設定しているDocumentRoot(Defaultだと/var/www)の中あたりに配信するファイルを作成するディレクトリを作成.
バーチャルホストの設定とかはご自由に.

sudo mkdir /var/www/video

次に,Moduleへ処理を渡す設定ファイルを作成する.

sudo vim /etc/apache2/conf.d/dstreaming.conf

ファイルの中身は以下の内容
(備考)moduleのパスは絶対パスを書かないとうまく動かなかった...

LoadModule f4fhttp_module /etc/apache2/mods-enabled/mod_f4fhttp.so


HttpStreamingEnabled true
HttpStreamingContentPath "/var/www/video"

これで設定は終わるのでApacheを再起動

sudo /etc/init.d/apache2 restart

次に動画の変換.
File_Packerを解凍します.

unzip adobe_f4fpackager100_linux_x64.zip
cd HTTP_Module_1.0_Linux_x64/adobe/f4fmodule

中に実行バイナリとライブラリが入っているので,ライブラリを所定の場所へ移動.
実行バイナリは/usr/binあたりに入れます.

sudo cp libexpat.so.1 libF4V.so mod_f4fhttp.so /usr/lib/
sudo cp f4fpackager /usr/bin/
cd ~/

これで動画が変換できるはずなのでmp4ファイルを用意して変換します.
変換と言っても,ファイルの分割とマニフェストファイル作成が主な作業なのですぐ終わります.

sudo f4fpackager --input-file MP4FILE.mp4 --output-path /var/www/video
#MP4FILEの場所は適宜読み替えてください

これで/var/www/videoに.MP4FILE.f4m, MP4FILE.f4f, MP4FILE.f4xの3つのファイルが出来てるはずです.

次にブラウザでビデオを見るためのOMSFPlayerを設定します.
これは自由に作れるので,後に改造すれば良いんですが,とりあえずAdobeのサンプルをそのまま設置して見ます.

sudo cp OSFMPlayer_zeri2.zip /var/www/
cd /var/www
sudo unzip OSFMPlayer_zeri2.zip

これで
OSMFPlayer.htmlその他のファイルがDocumentRootに展開されます.
imagesとかscriptsなんてフォルダが出来るので,webコンテンツを既に持っているなら/var/www/playerみたいなディレクトリに展開する方が良いかもしれません.

これでブラウザで以下のようにアクセスすれば動画が見れます.

http://SERVER_ADDRESS/OSMFPlayer.html?url=http://SERVER_ADDRESS/video/MP4FILE.f4m

以上です.
iptables.htaccessの設定は各自ご自由に.

動画を追加したり,コンテンツリストとサムネイルを表示するようなフロントエンドが欲しくなるな.今度作るかな...

Synergyの導入(MacがサーバでUbuntuがクライアント)

23inchワイドディスプレイでMacUbuntuデュアルディスプレイ環境を構築していたが,キーボードとマウスは1セットにしたい.
これまではELECOMのKVM SWITCHで対応していたけど,KVMでマウスキーボードとメインディスプレイは切り替わるが,サブディスプレイは入力切り替えを別途しなければいけなかった.
また,MacUbuntuで別々な作業をしたいこともあるし,MacUbuntuでディスプレイを一台ずつ.それで居てマウスキーボードを共有できる方が便利じゃないかと考えた.
これを実現するのがSynergy.複数台のコンピュータで,どれか一台に繋がっているマウスとキーボードを共有できる.
ディスプレイが並んで居ることが前提で,マウスカーソルが隣のディスプレイと自由に行き来できるようになり,マウスカーソルが有る方にキーボードも繋がっていることになる.

今回はキーボードとマウスはMacにつなげる.UbuntuSynergy経由でMacのマウスとキーボードを共有.


まず,Macの設定.
Mac Portsで入るので

sudo port install synergy

設定ファイルはサーバになる方(キーボードとマウスが物理的に繋がってるマシン)にのみ必要.
Mac Portsでインストールすると,/opt/local/etc/synergy/に設定ファイルのサンプルがあるので,それを同じ場所にコピーして編集する.

sudo cp /opt/local/etc/synergy/synergy.conf.sample /opt/local/etc/synergy/synergy.conf
sudo vi /opt/local/etc/synergy/synergy.conf

設定内容は各マシンに名前をつける.各名前のマシンのIPアドレス,ディスプレイの位置関係を設定する.
今回は左のディスプレイがMac,右がUbuntu.
設定内容は以下のような感じ.synergy.conf.sampleにはディスプレイが上下の場合の設定も書いてるので,必要で有れば参考に.

section: screens
mac-air: ←Macの名前
192.168.0.63: ←MacのIP address
dev-ubuntu: ←Ubuntuの名前
192.168.0.30: ←UbuntuのIP Address
end

section: links
mac-air:
right = dev-ubuntumac-airのディスプレイに対して右にUbuntuのディスプレイ

dev-ubuntu:
left = mac-air  ←dev-ubuntuのディスプレイに対して左にmac-airのディスプレイ

end

設定が終わったら,実行.

sudo synergys

オプション無しでデーモンで起動する.-fをつけるとデバッグメッセージが表示できる.

続いてUbuntu.
Ubuntuはapt-getで入る.

apt-get install synergy

Ubuntuは今回はクライアントとして動作させるので設定は不要

sudo synergyc --name dev-ubuntu 192.168.0.63

debian 6.0.1にmozc導入

商用OSにかたっぱしからATOKを入れる僕的にDebian標準のAnthyは正直イラッとするのでMozcを導入してみた。
メモ。
参考はこの辺なんだけど、僕の環境ではちょっと違ったのでメモ。

ビルドに必要パッケージのインストール

sudo apt-get install libibus-dev libqt4-dev libssl-dev libcurl4-openssl-dev libssl-dev libprotobuf-dev protobuf-compiler scim libscim-dev gyp libgtest-dev libzinnia-dev svn-buildpackage

debパッケージ作成

mkdir /usr/src/mozc
cd /usr/src/mozc
sudo svn co http://mozc.googlecode.com/svn/trunk/src
cd src
debuild -uc -us

インストール

sudo apt-get install ibus python-ibus
sudo dpkg -i ../ibus-mozc_x.x.x.x_*.deb ../mozc-server_x.x.x.x_*.deb ../mozc-utils-gui_x.x.x.x_*.deb

~/.bashrc の最後に以下を追加

export XMODIFIRES="@im=ibus"
export GTK_IM_MODULE="ibus"
export QT_IM_MODULE=ibus

再起動して
gnome の左上のメニューの
システム->設定->入力メソッドの切替器
を選択して一覧から"Use iBus(ibus)"を選択.OK.

続いて
システム->設定->iBusの設定
を選択して,インプットメソッドのタブのなかで"インプットメソッドの選択"から
日本語->Mozc
を選択.追加.

これで標準でCtrl+Spaceで Mozcが起動するはず.
メニューバーの右端のMozcのアイコンを選択して
レンチのマーク->Property
で細かい設定ができる.
変換方法をATOKライクにしたかったらここで設定できる.

日本語でDebianをインストールした時にできるホームディレクトリの日本語フォルダを英語にする

Debianの新規インストール時に日本語でインストールをするとホームディレクトリにできる標準ディレクトリが日本語フォルダになる。
デスクトップ
ダウンロード
ピクチャ
ドキュメント
etc...
コンソールで生活する上でこれでは発狂しそうになるので英語に直す方法。

LANG=C xdg-user-dirs-gtk-update

これだけで一括で英語のフォルダに直してくれる。
日本語インストールしたら即座にやるべしw

Rubygems net/sshとnet/ssh/shellの関係

最近までrubysshをはった処理を書くときにはnet/sshを使っていた。
でもnet/sshでは、単発処理はかけるし、その標準出力は取得出きるけど、
cd hogehoge
touch hoge
cd
ln -s hogehoge/hoge fuge
みたいなディレクトリを移りながらの作業は記述できなかった。

そしたら、そういう目的用にnet/ssh/shellなるgem packageがあるのを発見。
この辺を参考にしながら導入した。
いくつか引っかかったのでメモ。
導入環境はDebian6.0.1
Ruby1.8.7 Rubygems1.3.7
net/sshが入っている事が前提なので、無ければ最初に

sudo gem install net-ssh

次に、 net-ssh-shellのインストール
普通にgemで入れる事もできるが、gemで入るバージョンにはバグがあるらしいのでgitで最新版を入れる。

git clone https://github.com/mitchellh/net-ssh-shell.git

ここで、添付のREADMEどおりにやったら、僕の環境ではうまくはいらなかった。
ので、ちょっとアレンジ。

cd net-ssh-shell
sudo gem install bundler
sudo gem install echoe
sudo gem build net-ssh-shell.gemspec

これでカレントディレクトリに
net-ssh-shell-0.2.0.gem
ができてるはずなので

sudo gem install net-ssh-shell-0.2.0.gem

で完了。
一応サンプルプログラム。
SSHセッションの呼び出し方はnet-sshとオプション共々同様。

#!/usr/bin/env ruby

require 'rubygems'
require 'net/ssh'
require 'net/ssh/shell'

Net::SSH.start('HOSTNAME', 'USERNAME',:keys =>'~/.ssh/id_rsa') do |ssh|
    ssh.shell do |sh|
        sh.execute! "cd /tmp"
        sh.execute! "touch testtest.test"
        p sh.execute! "exit"
    end
end

Ruby-gtk2のProgressBarの色を変える

gtk2のProgressBarを使っていて,バーがいっぱいになったら色を変えたいとする.
これにちょっとはまったのでメモ.
(目標の写真)

ProgressBarの色を変えたい場合は

sample_progress.modify_bg(Gtk::STATE_PRELIGHT,Gdk::Color.new(RED,GREEN,BULE))

みたいに書く.
RED,GREEN,BLUE はそれぞれ16bit(0~65535)の数字.
Gtk::STATE_NOMALじゃないかと思うんだが,STATE_NOMALだとバーの背景色が変わる.
そして,modify_fgなんじゃ無いかと思うんだが,modify_fgだとProgressBarのテキストの色が変わる.
英語のドキュメントを読んでもはっきりとした理由はわからんかった(汗

で,サンプルコード.

#!/usr/bin/env ruby

require 'gtk2'

#バーは2個
BarNum = 2

#PrgressBarを作成
progreBars = []
BarNum.times do |i|
    progreBars[i] = Gtk::ProgressBar.new
    progreBars[i].text = "#{format("%03d",i + 1)}       "
end


##Windowの終了
window = Gtk::Window.new
window.signal_connect("delete_event"){
    false
}

##プログラムの終了
window.signal_connect("destroy"){
    Gtk.main_quit
}

##2つのProgressBarを縦に整列
packbox = Gtk::VBox.new(false, 0)
packbox.pack_start(progreBars[0], true, true, 0)
packbox.pack_start(progreBars[1], true, true, 0)

#各ウィジットをwindowに貼り付け,タイトルセット.
window.border_width = 10
window.add(packbox)
window.title = "Ruby/GTK+2 Test Code"
window.show_all

#0.1秒間隔でランダムにバーを進める
Thread.start do
    loop do 
        barid = rand(BarNum)
        if progreBars[barid].fraction < 1.0 then
            progreBars[barid].fraction += 0.1
            progreBars[barid].text = "#{(progreBars[barid].fraction * 100.0).round}" + "\%"
            if progreBars[barid].fraction >= 1.0 then
                progreBars[barid].modify_bg(Gtk::STATE_PRELIGHT,Gdk::Color.new(0,65535,0))
            end
        end
        if progreBars[0].fraction >= 1.0 and progreBars[1].fraction >= 1.0 then
           return 0 
        end
        sleep(0.1)
    end
end

Gtk.main