アーカイブ
Cでgearman workerを書いてRubyのclientから呼び出す
gearmandをソースからインストールして、Cライブラリのlibgearmanが使えるようになった。
これでC言語でworkerを作ってRubyのclientから呼び出せる。環境はUbuntu9.04とgearmand0.11
■Cでworkerを書く
str_reverseというアビリティを持つworkerを作る。
ほぼAPIドキュメントのままだが、jobの引数を受け取るのと、値を返せるようにがんばった。ジョブ失敗した時とかのエラー処理全然書いてない。たぶんenum gearman_return_tを返せばいいんだろうけど
strreverse-worker.c
// 文字列をreverseして返すworker
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <libgearman/gearman.h>
void *job_str_reverse(gearman_job_st *job, void *cb_arg, size_t *result_size,
gearman_return_t *ret_ptr)
{
char *str = (char *)gearman_job_workload(job);
int len = strlen(str);
printf("str:%s length:%d\n", str, len);
char reverse[len];
for(int i = 0; i < len; i++){
reverse[i] = str[len-i-1]; // 文字列を逆にする
}
char *result = strdup(reverse); // 結果の文字列はコピーしてポインタで返す
*result_size= gearman_job_workload_size(job);
*ret_ptr= GEARMAN_SUCCESS;
return result;
}
int main(int argc, char *argv[])
{
gearman_return_t ret;
gearman_worker_st worker;
gearman_worker_create(&worker);
gearman_worker_add_server(&worker, "127.0.0.1", 7003);
gearman_worker_add_function(&worker, "str_reverse", 0, job_str_reverse, NULL);
while(1) gearman_worker_work(&worker); // ジョブ登録したらループで待つ
gearman_worker_free(&worker);
return 0;
}
Makefile
# Linux用Makefilemakeするとstrreverse-workerができる。
SRC = strreverse-worker.c
DST = strreverse-worker
prefix=/usr/local
INCPATH=$(prefix)/include
LIBPATH=$(prefix)/lib
GEAR_LIBS=$(LIBPATH)/libgearman.a
all:
g++ -O $(SRC) -o $(DST) -I$(INCPATH)/libgearman -L. -L$(LIBPATH) $(GEAR_LIBS)
■Rubyでclientを書く
xing-gearman-serverを使うといい
client書く。実行時引数を一つずつstr_reverseに登録するclient。
strreverse-client.rb
#!/usr/bin/env ruby
require 'rubygems'
require 'gearman'
c = Gearman::Client.new(['localhost:7003'])
taskset = Gearman::TaskSet.new(c)
ARGV.each{|str|
puts "add task #{str}"
task = Gearman::Task.new('str_reverse', str)
task.on_complete{|result|
puts "return: #{str} => #{result}" # 文字列が逆になって返ってくる
}
taskset.add_task(task)
}
taskset.wait(100) # wait 100(sec)
■動かしてみる
worker動かす
./strreverse-worker
clientから3つ文字列登録
ruby strreverse-client.rb hello konitiwa asdfhujiko
すると文字列返ってくる
add task hello
add task konitiwa
return: hello => olleh
add task asdfhujiko
return: konitiwa => awitinok
return: asdfhujiko => okijuhfdsa
worker側の標準出力はこうなってた
str:hello length:5
str:konitiwa length:8
str:asdfhujiko length:10
workerを3つバックグラウンドで起動しておく
./strreverse-worker&
./strreverse-worker&
./strreverse-worker&
凄い勢いで処理されてるので非同期になってるのかよくわからない
ruby strreverse-client.rb hello konitiwa asdfhujiko aaiiaaiiaaii hogehogehogehoge mmmasdffajkl23rwdfv ahsdga9sd8uf9p8u nbjkasdoif98pu
add task hello
add task konitiwa
return: hello => olleh
add task asdfhujiko
return: konitiwa => awitinok
add task aaiiaaiiaaii
return: asdfhujiko => okijuhfdsa
add task hogehogehogehoge
return: aaiiaaiiaaii => iiaaiiaaiiaa
add task mmmasdffajkl23rwdfv
return: hogehogehogehoge => egohegohegohegoh
add task ahsdga9sd8uf9p8u
return: mmmasdffajkl23rwdfv => vfdwr32lkjaffdsammm
add task nbjkasdoif98pu
return: ahsdga9sd8uf9p8u => vfdu8p9fu8ds9agd
return: nbjkasdoif98pu => vfdu8up89fiods
Inspiron Mini9に外付けUSB RAID HDDをつけてファイルサーバー化した
Ubuntuが入ってるDellのInspiron Mini9を回収してきたので、IO DATAの外付けRAID HDDをつけてファイルサーバーにした。
もともとうちではGLANTANKを使ってたんだけど、部屋の掃除をしたら急にファンの音が気になるようになったので、もう3年以上使ってるし入れ替える事にした。
inspironは4GBのSSDでファンレス。外付けHDDもファンレスなのでとても静かになった。
売り上げランキング: 675

Cost-Efficient & Convenient!
結構いいww
順調です
ミラーでのフォーマットが時間がかかる
動画専門で使っています■ほしい機能
ただのNASではなく
- 音が静か
- RAID1でミラーリングしてデータが消えないようにしたい
- 家のdynamic dnsを更新
- 家の外からもe-mobileでsshでログインできたり、mercurialやgitのリポジトリを置ける
- rsyncで大学にある巨大なファイルをダウンロードさせておく作業を任せられる
- sambaでwindowsのファイル共有にも参加する
- 念のためモニタとキーボードも付いていて、ネットワークが壊れている時も操作しやすい
- Inspiron Mini9と外付けHDDどちらが壊れても迅速に入れ替え・復旧できる構成にしたい
- apacheとhgweb.cgiを動かしてmercurialのリポジトリビューアを置きたい
- 巨大ファイルのやりとりのためにapacheは動かしておきたい
■HDC2-U2.0の設定
まずRAID1に設定し直す。後でやると中身がフォーマットされるので。
パソコンに接続しないで、ACアダプタだけ刺す。
電源モードスイッチをONに切り替える。起動する。
裏にあるRAID SETUPボタンを3秒押し続けると電源LEDが点滅しはじめる。
前側のFUNCボタンを押す毎に電源LEDの色が変わる。
青:RAID0 ストライピング
紫:RAID1 ミラーリング
緑:マルチディスクモード
なので、紫にする。裏側のRAID SETUPボタンを押して設定終了。
パソコンに接続して容量が1TBに減っている事を確認。これでミラーリングモードになった
■HDC2-U2.0のフォーマット
inspiron mini9に接続して起動。
sudo apt-get install gpartedgpartedでHDDのパーティションをフォーマットする。ubuntuをインストールする時に出てくるツール。
which gparted
sudo gparted
全部ext3でフォーマットした。しばらく待つ。
■HDC2-U2.0をマウントする
マウントポイントを作っておく
mkdir /home/sho/ex
/dev/sdb1としてHDC2-U2.0が認識されていたので
/etc/fstab を編集
/dev/sda2 / ext3 defaults 0 0自分のホームディレクトリの下に置く。
proc /proc proc defaults 0 0
/dev/sdb1 /home/sho/ex ext3 defaults 0 0
マウントする
sudo mount -a
これで/home/sho/ex/ 以下はRAIDで守られる。
■sambaのインストールと設定
sudo apt-get install samba
/etc/samba/smb.conf を編集
[global]
workgroup = MSHOME
coding system = UTF-8
doc charset = cp932
unix charset = UTF-8
wins support = yes
[ex]
path = /home/sho/ex
comment = ex
browseable = yes
read only = no
create mask = 0755
directory mask = 0755
sambaからはHDC2-U2.0の中以外は見える必要が無いので、[homes]とかは ; で全部コメントアウトした。
samba再起動
sudo /etc/init.d/samba restart
■Dynamic DNSの更新
mydns.jpを使っているんだけど、ここはDiCEとかを使わなくてもBasic認証で更新できる。
crontab -e で設定追加
*/10 * * * * wget --spider http://mydns-username:password@www.mydns.jp/login.html10分おきに更新する。
■その他
あとはまあ普通のLinuxなので、mercurialとかgitとかapacheをインストールしておしまい。
SSDの容量を稼ぐために、Inspiron Mini9に入ってたゲームやGIMPやEvolutionメールやOpenOfficeを全部消した。
ML115 + Ubuntu9.10 64bit環境で音を出す
元サーバーマシンを、開発用のデスクトップマシンにした。
Windowsをインストールするとすんなりいくらしいんだけど、64bit版Ubuntuで音を出そうとすると大変だった。
PCIスロットが3.3V用で、5V用のサウンドカードだと切り欠きが合わなくて刺さらない。そして刺さっても64bitでのまともなサウンドドライバが無くて音がホワイトノイズだらけになる。
このUSBスピーカーを刺して他のサウンドデバイスを刺さないようにすれば音が出る。音質はたぶんそんなに良くないけど。
売り上げランキング: 798

ちょっと不便。
安いし簡単
値段以上の価値はあります
音は及第点(値段の割には)
価格以上の音質他にも、Creative Sound Blaster 5.1 VXを使うと音が全部ホワイトノイズになってしまうが、
alsamixer -Dpulseで音量をギリギリまで絞ると一応聞こえなくもなかった。
alsamixer -Dhw
参考:[ubuntu-jp:1749] Jaunty において Creative Sound Blaster 5.1 VX 上で再生する音声が全てホワイトノイズに
あとはAppleのMac用の小さいキーボードと、Microsoftの光学式マウスの安い奴を使ってる。
AspireOneにUbuntuをインストールして使っている
春頃にTeleshadowの実装のために、修理品のAspireOneをNTTストアで2万ちょっとで買って使ってたんだけど、修論が終わってまあTeleshadow動かす為だけに置いておくのももったいないのでUbuntu9.04を入れてみた。
これけっこうよかった。最近は開発がLinux中心なので、持ち歩く事も多い。
せっかくなのでセットアップをまとめておく
■Windows
Windowsはもうあまり使ってない。
AspireOneの起動時に winlogon.exe がエラーを出してたんだけどこれは「アプリケーションの追加と削除」からLaunch Managerを削除したら出なくなった。
そもそもメモリが1GBだけなので、Windows動かすのがけっこうつらい。
■インストール
参考:AspireOneにUbuntu9.04インストール – 橋本詳解
CD-ROMドライブが無いのでUNetbootを使ってインストールした。
デスクトップ版Ubuntu9.04のisoイメージをダウンロードしてきて、UNetbootのWindows版で空のUSBメモリ(1GB)をUbuntuインストールディスク化した。
AspireOneに刺して、BIOS起動時にF12押してUSBデバイスからbootするようにすると、GUIのインストーラが出てくる。
パーティションをUbuntu 60GB、Windows 40GBに切り直してインストールした。
内臓カメラ、キーボード、無線もすぐ使えた。
インストール中

■e-mobile
最近イーモバイルのD23HWを買った。
GUIとCUIそれぞれから使える。電波強度が表示できないけど実用上問題は無い。
pon, poffコマンドの場合:emobile D23HWを使う(CUIで) – 橋本詳解
gnome-pppの場合:emobile D23HWを使う(CUIで) – 橋本詳解
■デスクトップの設定
ワークスペースを2×2に増やして、ウィンドウをキーボードショートカットでワークスペース間移動できるようにする。
キーボードショートカットの設定から、ctrl+上下左右キーで上下左右のワークスペースに移動するよう設定。ctrl+shift+上下左右キーでウィンドウを上下左右のワークスペースに移動するように設定。
左上Firefoxとemacs、右上Terminal、左下ThunderbirdとSkypeとPidgin、右下予備というふうに置いておくと、全部フルスクリーンにしておいても画面切り替えでなんとかなるので小さい画面でも戦える。
あとapt関係のアップデートと、ssh, zsh, emacs、mercurial、ruby関連、opencv、boostなどのインストールをする。
参考:Thinkpad X32にUbuntu 8.10 Desktop版をCDから入れた – 橋本詳解
■キーボード
キーボードの設定から「capslockをもう一つのctrlキーに設定」を選択
日本語入力。SCIMの全体設定で開始に変換キー、終了に無変換キーを割り当てる。他は全部キーを削除する。
これでMacと同じように、ホームポジションに置いた時親指で日本語入力をON/OFFできるようになる。
キータッチはネットブックの中ではけっこういいと思う。キーも大きくて押しやすいし、記号キーの配列も変態じゃないからコード書くのにも支障ない。
■電源
バッテリーは2時間もつ。ACアダプタはinspiron miniのが同じ電圧だったのでそっちを持ち歩いている。
■WiFi
Gnome標準の最初からついてるやつでばっちり
■サスペンド
ちゃんとできる。よく使ってます
■Firefox
最初から入ってる。拡張のHideMenubarを入れると画面を有効活用できる。
あとはGreasemonkeyでLDRize、Autopagerize、minibuffer
拡張のIt’s all text、Adblock plus、SBMカウンタ、TabMixPlux、Tomblooなど。
ブックマークは普段使ってるMacbookProからHTML形式でエクスポート・インポートした。
FlashPlayer10もAdobeのサイトでインストールできる。
スムーズスクロールはoffにする。
■Thunerbird
sudo apt-get install thunderbirdWindowsからもってきたプロファイルがそのまま使えた。
~/.mozilla-thunderbird/の下にコピーすれば読み込まれる。
■IM
PidginでMSNメッセンジャーとGoogleTalkが使える。Skypeはダウンロードしてきてインストール。
Pidginはすぐ[ツール]→[個人情報]で「コンタクトリスとの人のみ許可」に設定しないとspamがいっぱい来る。
■Gyazo
Linux版がある。
/usr/local/bin/gyazo として置いて、画面の上のパネルにショートカットを追加してすぐ使えるようにする。
■DropBox
Linux版がある。インストール後に再起動すると使える。
メニューにも登録されるし、dropboxコマンドからも動かせる。
dropbox start
dropbox stop
dropbox status
■Office
OpenOffice.orgが入っている。Word/Excel/PowerPointを見るのは問題ない。excelの高度なマクロなどは再現されてるか不安で、結局あまり使ってない。
■プロジェクタ
設定が難しい。10分ぐらいかけても画面が出せなかった。
プレゼン前に確認しておいた方がいい。
というわけで長時間プログラミングはしたくない環境だけど、おでかけしながらサーバーのタスクを監視したり簡単なスクリプトを書いたりする環境はできた。
よかったよかった
BeagleBoard(Ubuntu9.04)とArduinoやmoxaを接続し、シリアル通信でやりとりする
BeagleBoardはTIの作ったオープンソースハードウェア。こっそり春頃からいじっていたんだけど書いてなかった。
スペックに難はあるが、ディスプレイとサウンド出力つきの組み込み環境が俺でも作れるのは魅力。作品のレベルをプロダクトに近い所まで引き上げられる。
最近CRESTでのプロジェクト用にARM版Ubuntu9.04をbuildしてインストールして、Arduinoと接続する所までやったので書いておこう。
今はApache2とruby1.8.7(いずれもaptでインストールした)を使って、外付けしたArduinoとmoxaからデータを読み取っている。とりあえず大学院棟の明るさをCdSで取得してwebに公開している → http://shokai-b.mag.keio.ac.jp/light

■準備
BeagleBoardと、インストール時にパソコンとBeagleBoard間でシリアルコンソールを使うのに必要なBeagleケーブルはdigikeyで購入できる。他の部品は国内で全て入手可能。

■Ubuntu9.04をBeagleBoardにインストール
OSはSDカードにインストールする。
最初デスクトップ版をインストールしてみたけど重すぎた。AngstromやHandheld Mojoならそれなりに動くけど、フルのUbuntuデスクトップはウィンドウマネージャをtwmにしても無理だった。
今回の用途にはCUIがあれば十分だったので、最低限のbuildツールを含んだARM用イメージを作って起動させた。
なお作業はext3のファイルシステムが読み書きできる必要があるので全て別のUbuntu Desktopで行った。
- BeagleBoardにUbuntu Desktop版インストール – 橋本詳解
- BeagleBoardにUbuntuセットアップ(GUIなし)、sshdを入れてリモートログインしてみる – 橋本詳解
- いろいろインストールして環境を整える – 橋本詳解
- Rubyまわりをインストール – 橋本詳解
これで、ApacheやRubyやsshdはもちろん、emacsと各種elisp、gemとeasy_install、rails2やsinatra、mongrel_clusterとapache2でmod_proxy_balancerなどがaptとgemでさくっとインストールできた。
このへんのサーバサイドアプリ開発環境のセットアップの容易さはubuntuさすが。
処理速度は体感でDebian化した白箱より速い。SDカードなのであまりR/Wしたくないがたぶん外付けUSB-HDDも認識できるんじゃないだろうか。そうすると、クローラ作ったり簡単なbotを動かす程度の俺は自宅サーバ環境はBeagleBoardで十分という可能性もある。
処理速度とストレージ読み書きに不安はあるが小型かつバッテリーでも動かせるUbuntu Linux環境ができた。
■Arduino / moxaとの通信
BeagleBoard基板上のシリアルコンソールに使ったポートをArduinoやmoxaとの通信を使った。
本当はUSBで接続したかったけどできなかった。
FTDIチップのドライバはaptでインストールできるが、USBに接続しても認識されない(/dev/ttyUSB0に現れない)
同じバージョンのUbuntuデスクトップを別のAMD64マシンで用意して、同じようにセットアップをしたがこちらは認識した。ARM版Ubuntuが何かおかしいのかもしれない。
64bitAMDマシンではlsmodした時にFTDIチップを監視してるプロセスがいるんだけど、BeagleBoardではlsmodしてもいない。
誰かLinux詳しい人教えてくれるとうれしいです・・・
しかたないのでセットアップに使ったBeagleケーブルのオス版を作って通信に使う。
シリアルポートの9つのピンにはよく見ると番号が振ってあり、それをBeagleBoardの基板上の1~9ピン(10は無視する)と接続する。
シリアルポート側は
12345
6789
のようになるが、BeagleBoard上のコネクタは
13579
2468
となっているのでとても捻れる。気合いではんだづけする。基板上のシルク印刷をよく見てね。




これで、Arduinoの外側にあるRX / TXピンにMAX232(ADM3202)を接続すればBeagleBoardとシリアル通信できる。

ArduinoにCdS(明るさのセンサ)なんかを接続して数値をBeagleBoardに送り続ければいい。
/etc/event.d/ttyS2 を削除して再起動すると、/dev/ttyS2がシリアルコンソールではなくシリアルポートとして開ける。
screen /dev/ttyS2
でモニタできる。
UNIX系なので、シリアルポートもFileとして簡単に読み出せた。
Arduino + BeagleBoard(Ubuntu) シリアルポートを読んでたまにファイルに書き出す – 橋本詳解
通信できる手段が整えばあとは好きにできる。



最近のコメント