2010年12月31日金曜日

2010年最後なので

今年のまとめを画像一枚で現してみた。

はちゅねさんに支えられた一年でした。

hachune.net本格運用開始、みくった〜♪界隈のお手伝いなどなど、
一年中はちゅねさんまみれだった気がしなくもない。

その中で、いろんな人にいろいろお世話になりました。
本当にありがとうございました。そして、来年もよろしくお願いします。

それでは、また来年。

2010年12月12日日曜日

短縮URLを展開するRubyスクリプトを作ってみた

なにやら短縮URLを使い、不正なサイトにアクセスさせウィルスに感染させる行為が流行っているらしい(まぁ想定の範囲内だが)。そこで、短縮URLを展開できるrubyスクリプトをちょちょっと作ってみた。


#!/usr/bin/env ruby
#-*- coding: utf-8 -*-

require 'uri'
require 'socket'

uri = URI.parse(ARGV[0])
sock = TCPSocket.open(uri.host, uri.port)
sock.printf("GET %s HTTP/1.1\r\n", uri.path)
sock.printf("Host: %s\r\n\r\n", uri.host)
str = String.new
rsize = 512
while dat = sock.recv(rsize)
str << dat
break if dat.size < rsize
end
sock.close

str.each_line{|line|
puts $1 if line =~ /^Location:\s*(.*)$/
}


HTTPを直打ちしてLocationヘッダの内容を取得してるだけなので、ものすごく単純な上にウィルス感染の心配も無し。
bit.lyやamzn.to、t.co、htn.to、t.hachune.netなど、主要(?)な短縮URLサービスで使えることを確認済み。

以下からダウンロードも可能。
http://file.hachune.net/ex_surl.rb.gz


# これを作った後Google Newsを見ていたら、短縮URL展開サービスみたいのがニュースになっていた件

2010年11月25日木曜日

RubyでPIAPROからファイルを取得するライブラリを作ってみた

余裕がないとは言え、さすがに1ヶ月以上放置するのはいかがなものか、ということで、この間みくった〜♪に取り込まれた(らしい)、RubyでPIAPROからファイルを取得するライブラリを公開してみる。


中身について簡単に説明すると、

・ruby/httpsで認証用クッキー貰ってくる
・HTMLからダウンロードURL抽出
・そのURLとクッキーを利用し、open-uriでファイルをダウンロード

こんな感じ。

実際のコードは、こんな感じになる。
piapro = PIAPRO::Download.new(:user=>"miku", :passwd=>"Mi93kU3KumIKu")
piapro.download_url("http://piapro.jp/download/?view=content_image&id=mikumikumikumiku")



中身を見ると、ハードコードが多くて気持ち悪いとか、いろいろ感じるところはあるが…


ダウンロードはこちらから。
http://file.hachune.net/piapro.rb.gz

2010年10月18日月曜日

情報セキュリティスペシャリスト試験に行ってきた

10月17日に、平成22年度秋期の情報処理技術者試験があったので、またもや受けてきた。
朝4時に起きて山形会場まで車を走らせ、そこから夕方までずっと試験という、毎度のことながら結構ツラい日程。



前回(22年度春期)に受けた応用情報技術者試験(レベル3)が、午前76.25点、午後58.00点で午後2点足らずという絶妙な具合に不合格だったので、今回は思い切ってそれの上位である高度(レベル4)試験を受験することに。

秋に受験できる高度試験は、ITストラテジスト、システムアーキテクト、ネットワークスペシャリスト、情報セキュリティスペシャリスト、ITサービスマネージャの5つ。
ITストラテジスト、システムアーキテクト、ITサービスマネージャは実務が物凄く絡んでくる上に、午後II試験が論述式でかなり難しいので無理、ネットワークスペシャリストはイマイチ低層の部分が理解出来ていないので避け、一番身近で必要でそれなりに理解できている、情報セキュリティスペシャリストを受験することにした。

上に書いたこと以外にも、はちゅねどっとねっとの運用はほとんど自宅サーバで行なっているので、そのセキュリティ面は全て自分自身が管理しなければならず、その為に一定レベルの知識を揃えておくいい機会になる、というのもあった。



高度試験は、多岐選択式(四肢択一)の午前I(高度共通)、午前II(専門)、記述式の午後I、午後IIとあり、応用情報を取得しているか、一度高度試験を受験し、午前Iを通過していれば、2年間は午前Iが免除になる。
私の場合、春の応用情報で見事に落ちたので、午前Iから全ての試験を受験しなければならなかった。

自己採点結果は、
午前I … 30問中18問正解でギリギリ60点…?
午前II … 25問中21問正解で余裕

午後の手応えとしては、
午後I … G攻撃ワロタ
午後II … ('A`)

ということで、午前Iと午後II次第な感じだろうか…
午後IのG攻撃はどう見てもGumblarさんの問題で、ニヤニヤしながら問題を解いていた。
また、前日に何故か午後対策として初めて触ったperlの問題が全く出ず、思いっきりヤマが外れて泣くハメに。



大学3年の春に初級システムアドミニストレータ、秋に基本情報技術者、4年の春に応用情報技術者、秋に情報セキュリティスペシャリストと、順に情報処理技術者試験を受験してきた訳だが、「よくここまでこれたなぁ…」と思う。
大学自体、情報系でもなく普通の文系大学で、コンピュータ専門に勉強しようとか考えて入った訳でもない。大学2年になるまでプログラミングもしたことは無かったし、ルータの設定すら分からない状態だった。
そんな状態から2年半ぐらいでここまでこれたのだから、やる気出せば結構できるもんなんだなぁと思える。


まぁこれが終着点ってワケでは全く無いので、これからもずーっと続く。
はちゅねさん達と共に。

情報処理推進機構: 情報処理技術者試験
http://www.jitec.jp/

2010年9月30日木曜日

SQLite3-RubyでのSQL文のexecuteについて

よく考えずに適当にSQL文をexecuteするだけでそれなりのものは作れてしまうので、私の場合、ロクに考えずに作ってしまいがちになる。しかし、それなりに大きなもの、重要なものを作ろうとするとそういう訳にはいかないので、executeの基本的な使い方を纏めてみる。


今回サンプルとして利用するテーブルは以下の通り。

db = SQLite3::Database.new("test.db")
db.execute(<<EOS
CREATE TABLE IF NOT EXISTS Vocaloid
(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
Name CHAR UNIQUE NOT NULL,
Ver INTEGER NOT NULL
);
EOS
)



普通にexecuteする


毎度SQL文を組み立て、executeする。
SQLインジェクション対策を全て手動で行わなければならない為、非効率。

db.execute(<<EOS
INSERT INTO Vocaloid
(Name, Ver)
VALUES ('miku', 2 )

)



引数を渡し、executeする


引数に?に対応する値を順番に渡す。
quote等も自動的に処理してくれる模様。

sql = <<EOS
INSERT INTO Vocaloid
(Name, Ver )
VALUES (?, ?)
EOS
db.execute(sql, "miku", 2)



ハッシュ引数を渡し、executeする



sql = <<EOS
INSERT INTO Vocaloid
(Name, Ver )
VALUES (:Name, :Ver)
EOS
db.execute(sql, :Name => "miku", :Ver => 2)



prepareを利用する


SQL文をテンプレートとして用意しておいて、execute時に変数として渡す。

pre = db.prepare(<<EOS
INSERT INTO Vocaloid
(Name, Ver)
VALUES (?, ? )

)

pre.execute("miku", 2)
pre.execute("rin", 2)
pre.execute("meiko", 1)



prepareでハッシュ引数を使う



pre = db.prepare(<<EOS
INSERT INTO Vocaloid
(Name, Ver)
VALUES (:Name, :Ver)
EOS
)

pre.execute(:Name=>"miku", :Ver=>2)
pre.execute(:Name=>"rin", :Ver=>2)
pre.execute(:Name=>"meiko", :Ver=>1)



・参考

http://sqlite-ruby.rubyforge.org/sqlite3/faq.html


http://sqlite-ruby.rubyforge.org/classes/SQLite/Database.html

2010年9月8日水曜日

みくった〜♪のWindows版をMinGWでビルドしてみた

みくった〜♪は、全てのミク廃、そしてTwitter中毒者へ贈る、至高のTwitter Clientを目指すTwitter Client…として@toshi_a氏が開発しているソフトウェアである。

みくった〜♪

主にLinux向けとして開発されているようだが、初公開の時点で「Windows版無いの(´・ω・`)?」と言われたように、Windows版の需要がやはりそれなりに存在する。
そこで、MinGW使ってRuby/GTK2環境を整え、Windowsでもみくった〜♪を動作させることはできないものか?と考え、実際にやってみた。

※ただ使ってみたいだけ、という方はみくった〜♪ for Windowsのページみくった〜♪ for Windows 毎日0,12時に自動ビルドされるバージョンからどうぞ。



ビルドに必要なソフトウェアやライブラリは以下の通り。
MinGW GCC 4.5.0
ftp://ftp.jaist.ac.jp/pub/sourceforge/m/project/mi/mingw/Automated%20MinGW%20Installer/mingw-get-inst/mingw-get-inst-20100831/mingw-get-inst-20100831.exe

ruby 1.8.7-p302
ftp://ftp.ruby-lang.org/pub/ruby/ruby-1.8.7-p302.tar.bz2

ruby-gtk2-0.19.4
http://ftp.jaist.ac.jp/pub/sourceforge/r/project/ru/ruby-gnome2/ruby-gnome2/ruby-gnome2-0.19.4/ruby-gtk2-0.19.4.tar.gz

ruby-hmac-0.3
http://deisui.org/~ueno/ruby/hmac.html
http://deisui.org/~ueno/ruby/ruby-hmac-0.3.tar.gz

iconv
ftp://ftp.gnu.org/gnu/libiconv/libiconv-1.13.1.tar.gz

GTK+
http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.20/gtk+-bundle_2.20.0-20100406_win32.zip

Win32 OpenSSL
http://www.slproweb.com/products/Win32OpenSSL.html
http://www.slproweb.com/download/Win32OpenSSL-0_9_8o.exe

Microsoft Visual C++ 2008 SP1 再頒布可能パッケージ (x86) OpenSSL用
http://www.microsoft.com/downloads/details.aspx?familyid=A5C84275-3B97-4AB7-A40D-3802B2AF5FC2&displaylang=ja

可能な限りソースからビルドするようにしたが、OpenSSLとGTK+は面倒だったので、とりあえずWindows用バイナリを利用することにした。…OpenSSLをMinGWでビルドすれば、MSVC++ランタイム要らなくなるのだが…。



MinGWによるビルド環境の構築


以前はMinGW(コンパイラ)とMSYS(サブシステム)を個別に用意し、セットアップする必要があったが、現在はmingw-get-instパッケージに纏められた模様。これをダウンロードし、普通のソフトウェアのインストーラと同じようにウィザードを進めていくだけでビルド環境が整う。
デフォルトでは、Windowsのパス変数もMSYSのパス変数として登録されてしまい、混乱の原因となるので、PATH変数を変更しておく。

$ PATH="/mingw/bin:/usr/local/bin:/bin"




iconvのビルド


一番最初にiconvをビルドする。といっても、普通に

$ ./configure --prefix=/mingw
$ make
$ make install

のような感じでおk。
本当なら/usr/localあたりにprefixを置いて、そこにインストールすべきな筈なのだが、私のCFLAGSやLDFLAGSの認識がおかしいのか、rubyのiconvライブラリのextconf.rbが/usr/localに置いたiconvを見つけられないため、諦めて/mingwにprefixを置く。



必要なライブラリの展開


GTK+のアーカイブを解凍し、そのまま全て/mingwに展開する。
OpenSSLは、インストーラを実行しインストールした先にあるディレクトリを、GTK+同様に/mingwに展開する。
また、OpenSSLを利用するために必要なMicrosoft Visual C++ 2008 SP1 再頒布可能パッケージ (x86)もインストールしておく。



Rubyのビルド


いつも通りRubyをビルドする。

$ ./configure --prefix=/ruby
$ make
$ make install

prefixを/rubyにしたが、make installする際にMSYSの/を飛び越えるため(コンパイルしたRubyがインストールに使用されるから?)、Windows側の\rubyにインストールされるので注意が必要。
そして、Windows側にインストールされたRubyを、MinGWの/usr/localあたりに移動しておく。



Ruby/GTK2のビルド


Ruby/GTK2のアーカイブを解凍し、extconf.rbを先程作成したRubyで実行する。

$ /usr/local/bin/ruby extconf.rb

そして後はmake、make installするだけの筈なのだが、MinGWでRuby/GTK2をビルドすると何故か毎度gtkのビルドでコケる。
どうやらこれからビルドされる筈のgtk2.soを、ビルド前にリンクしようとするかららしい。
そこで、gtkのMakefileを編集する。
何らかのエディタでgtk/src/Makefileを開き、LIBS = $(LIBRUBYARG_SHARED)...で始まる行の、-lgtk2を削除。

後はいつも通り。

$ make
$ make install


この時点で、Ruby/GTK2自体の開発/実行環境は整っていることになる。
MSYSでの作業はここで終了。



必要なファイルのみを纏め、最小限のRuby/GTK実行環境を作成


MSYSの/usr/localにはRuby/GTKの実行環境が整っている(ライブラリは足りないが)ので、これを適当なディレクトリにコピーし、rubyディレクトリとする。
rubyディレクトリのbinに、iconv、OpenSSL、GTK+の*.dllをコピー。
そして、RubyのLOAD_PATHのどこかにruby-hmacを展開。
後はみくった〜♪をダウンロードして展開、普通に起動できれば、みくった〜♪実行環境完成となる。



mikutter.exeを作成


毎度コマンドラインでruby mikutter.rbとしたり、バッチファイルを実行するのはどことなく落ち着かない。
また、Rubyの環境すべてがrubyディレクトリに入っているので、配布するにしてもかなりのサイズになってしまう。
そこで、更に必要なファイルだけを纏め、Windowsの実行ファイル形式で配布する形をとる。
exeファイル化には、exerbを利用する。
exerbの使用方法は、
・mkexy mikutter.rbでレシピファイルmikutter.exyを自動生成
・exerb mikutter.exyとすると、mikutter.exeが作成される
という感じである。
ここで作成されたバイナリは、Ruby環境無しで動作するものなので、あとはmikutterのディレクトリ階層とdllの配置をするだけ。

exerbの詳しい使用方法、レシピファイルの書式については、
公式ページ http://exerb.sourceforge.jp/
やmikutter for Windows付属のmikutter.exyを参照して欲しい。



みくった〜♪ 本家
http://toshia.dip.jp/
http://mikutter.d.hachune.net/

みくった〜♪ for Windowsのページ
http://append.hachune.net/mikutter.html

みくった〜♪ for Windows 毎日0,12時に自動ビルドされるバージョン
http://file.hachune.net/mikutter/

2010年8月31日火曜日

今日ははつねさんの誕生日!

ということで、hachune.netとしてもなにかやらないといけないな、と。

それで完成したのがはちゅねドメインサービス!

簡単に言えば、Dynamic DNSとURL転送を切り替えながら使えるホスト名提供サービス、…ってところだろうか。
negi.d.hachune.netみたいなドメイン名を使ってボカロなサイト運営してみたい!って方が居ましたら、どんどん使ってあげてね!


はちゅねドメインサービス
http://www.hachune.net/domain.html


もっと分かりやすく面白い名前、募集中w

2010年7月7日水曜日

Debian LennyなMac MiniをPulseAudioサーバにする

Software Design 6月号やUbuntu Weekly Recipe 第106回 PulseAudioでリモートスピーカを使うで、Ubuntuでのスピーカーサーバの作り方が解説されていた。
UbuntuでできることがDebianでできない筈がねぇ!…ということで、Debianで挑戦してみた。

サーバ側


・alsa関連を入れる
# aptitude install alsa-utils


・PulseAudioとZeroConfモジュールを入れる
かなりパッケージ数が多いので注意。
# aptitude install pulseaudio pulseaudio-module-zeroconf


・サーバ起動時にPulseAudioデーモンが実行されるように設定する
/etc/default/pulseaudioのPULSEAUDIO_SYSTEM_START=0を1に変更。


・/etc/pulse/default.paを変更する

#load-module module-native-protocol-tcp
#load-module module-zeroconf-publish

以上の部分を、以下のように変更する。
auth-ip-acl=10.39.39.0/24は、サーバへのアクセスを許可するサブネットを指定する。

load-module module-native-protocol-tcp auth-ip-acl=10.39.39.0/24
load-module module-zeroconf-publish



・PulseAudioデーモンを起動する
# /etc/init.d/pulseaudio start


クライアント側


・paprefsをインストール
# aptitude install paprefs


・paprefsを起動し、Make disconverable PulseAudio network sound devices available locallyのチェックをOnにする


・「サウンドの設定」を開き、「出力」をpulse@サーバホスト名に設定する



後は、MPlayerやら何やらで再生して、サーバ側から音が出れば成功。
なかなか認識してくれない場合は、サーバをrebootしてみるのも手かもしれない。

2010年6月30日水曜日

RubyのYAMLライブラリで2バイト文字をそのまま扱う

RubyのYAMLライブラリでは、標準では日本語などの2バイト文字列をバイナリとして扱うようになっている。しかし、これでは人間が直接修正するのが非常に面倒である。

技術評論社のYAML解説ページには、Rubyのソースにパッチを当てビルドする方法や、ya2yamlを使用する方法が書いてあった。しかし、パッチを当てた環境をすべてに適用するのは非常に面倒であり、ya2yamlについては標準ライブラリではない上に、少々遅いという問題がある。

そこで、どうにかする方法はないものかとYAMLのソースを眺めていたところ、以下の方法であっさり解決してしまった。



#!/usr/bin/env ruby
# -*- encoding: utf-8 -*-

require "yaml"
require "yaml/encoding"

# String.is_binary_data?で必ずfalseを返すように書き換える
class String
def is_binary_data?
return false
end
end

data = {"はつね"=>"みく", "はちゅね"=>"みく", "かがみね"=>"りん・れん", "めぐりね"=>"るか"}

# 通常どおり表示
puts "Escape:"
puts yaml = YAML.dump(data)

# アンエスケープして表示
puts "Unescape:"
puts yaml = YAML.unescape(yaml)


一度エスケープされたものをまた戻すという、面倒なことになっているが、ソース修正するよりマシかな…と。
これで、YAMLで書き出して手動で編集…なんてことがやりやすくなるかもしれない。

2010年6月3日木曜日

RubyでWebサーバを作る(ベーシック認証/ダイジェスト認証)

WEBrickでベーシック認証を行うには、以下のようにする。


#!/usr/ruby1.9/bin/ruby1.9
#-*- encoding: utf-8 -*-

require "webrick"

# HTTPServerを作成
httpd = WEBrick::HTTPServer.new(:Port => 3939)

# Basic認証の設定(引数にはパスワードファイルへのパスを渡す)
pswd = WEBrick::HTTPAuth::Htpasswd.new("dot.passwd")
pswd.set_passwd("mikubox", "miku", "mikumiku") #realm, user, passwd
auth = WEBrick::HTTPAuth::BasicAuth.new(:UserDB => pswd, :Realm => "mikubox")

# HTTPServerの/loginにBasic認証を設定
httpd.mount_proc("/login"){|req, res|
# 認証
auth.authenticate(req, res)
res.body = "<html><head><title>みくかわいいよみく</title></head><body><p>OK.</p></body></html>"
}

# INTシグナルでサーバを停止
trap("INT"){httpd.stop}
# サーバを開始
httpd.start()



ベーシック認証では、パスワードが簡単に復号可能な状態でネットワーク上を流れるため、重要なものに利用するのは非常に危険。
そこで、ダイジェスト認証を利用する。


#!/usr/ruby1.9/bin/ruby1.9
#-*- encoding: utf-8 -*-

require "webrick"

# HTTPServerを作成
httpd = WEBrick::HTTPServer.new(:Port => 3939)

# ダイジェスト認証の設定(引数にはダイジェスト認証用のデータベースのパスを渡す)
pswd = WEBrick::HTTPAuth::Htdigest.new("dot.digest")
if pswd.get_passwd("mikubox", "miku", false) == nil
pswd.set_passwd("mikubox", "miku", "mikumiku") # realm, user, passwd
pswd.flush # ファイルに書き込む
end
auth = WEBrick::HTTPAuth::DigestAuth.new(:UserDB => pswd, :Realm => "mikubox")

# HTTPServerの/loginにダイジェスト認証を設定
httpd.mount_proc("/login"){|req, res|
# 認証
auth.authenticate(req, res)
res.body = "<html><head><title>みくかわいいよみく</title></head><body><p>OK.</p></body></html>"
}

trap("INT"){httpd.stop}
httpd.start()



どちらも比較的簡単に認証を実現することができた。
ベーシック認証はHTTPAuth::HtpasswdとHTTPAuth::BasicAuth、
ダイジェスト認証はHTTPAuth::HtdigestとHTTPAuth::DigestAuthと覚えておけば良いかと思う。



※ 追記
もっと簡単にベーシック認証を行う方法があった。

#!/usr/ruby1.9/bin/ruby1.9
#-*- encoding: utf-8 -*-
require "webrick"

httpd = WEBrick::HTTPServer.new(:Port => 3939)
httpd.mount_proc('/login') {|req, res|
WEBrick::HTTPAuth.basic_auth(req, res, "mikubox") {|user, pass|
user == 'miku' && pass == 'mikumiku'
}
res.body = "<html><head><title>みくかわいいよみく</title></head><body><p>OK.</p></body>
</html>"
}
trap("INT"){httpd.stop}
httpd.start

2010年5月30日日曜日

RubyでWebサーバを作る

最近全然書いてないな~ということで、RubyでWebサーバを簡単に作れるライブラリ、WEBrickについて書いてみる。


Ruby 1.8以上なら、


require "webrick"
WEBrick::HTTPServer.new(:Port => 3939, :DocumentRoot => ENV["HOME"]).start


たったこれだけで、TCPポート3939番に自分のHOMEディレクトリを公開してしまう、とんでもないWebサーバが出来上がる。Ruby on Railsで有名になったライブラリだが、Apacheを使うまでもない、実験用Webサーバが欲しい時などにもとっても便利。



・ CGIを利用する
拡張子を.cgiとしたファイルに実行属性を加えるだけ。

http.mount(Webサーバ上でのパス, WEBrick::HTTPServlet::CGIHandler, CGIとして実行するファイルのパス)

としてマウントすることもできる。


・VirtualHostを利用する
メインのHTTPServerに、別のServerNameを設定したオブジェクトをvirtual_hostとして渡す。
メイン以外のホストは、:Portをnil、:DoNotListenをtrueとする。

http = WEBrick::HTTPServer.new(:ServerName => "miku.hachune.net", :DocumentRoot => "miku/")
http.virtual_host(WEBrick::HTTPServer.new(:ServerName => "append.haachune.net", :DocumentRoot => "append/", :Port => nil, :DoNotListen => true))
http.start



・各ユーザのホームディレクトリの特定のディレクトリを公開する
/home/$USER/public_htmlを公開する場合、DocumentRootOptionsのUserDirを設定する。

:DocumentRootOptions => {
:UserDir => "public_html"
}



・MimeTypeを追加する
デフォルトで設定されているMimeTypesにマージする。

newmime = {"wav"=>"Audio/wav"}
mime = WEBrick::HTTPUtils::DefaultMimeTypes.merge(newmime)
WEBrick::HTTPServer.new(:DocumentRoot => ENV[HOME], :MimeTypes => mime).start



・indexが存在しない場合の、ファイル一覧を表示しないようにする

:DocumentRootOptions => { :FancyIndexing => false }



・最大クライアント数を制限する

:MaxClients => クライアント数



・アクセスできるファイル/ディレクトリを制限する
DocumentRootOptionsのNondisclosureNameに、公開したくないファイル/ディレクトリ名を配列で指定する。
ワイルドカードが使用可能。

:DocumentRootOptions => {
:NondisclosureName => [".ht*", "*~", ".svn"]
}



・他のURLに転送する

http = WEBrick::HTTPServer.new(:Port => 3939)
http.mount_proc("/"){|req, res|
res.set_redirect(WEBrick::HTTPStatus::MovedPermanently, 'http://hachune.net/')
}



・Cookieを渡す

http = WEBrick::HTTPServer.new(:Port => 3939)
http.mount_proc("/"){|req, res|
res["Set-Cookie"] = "hatsune=miku;Max-Age=3600;"
res.body = "<p>Cookieです。</p>"
}



・erb(組み込みRuby)を使う
WEBrickでは、HTMLファイルにRubyスクリプトを埋め込み、実行することも簡単にできる。

まず、MimeTypeにrhtmlをtext/htmlとして追加する。

:DocumentRootOptions =>{
:MimeTypes => WEBrick::HTTPUtils::DefaultMimeTypes.merge({"rhtml"=>"text/html"})
}

後は、拡張子をrhtmlとしたファイルに、
<%= Time.now.to_s %>
のように、必要な場所に埋め込む。


・指定された拡張子(cgi、rhtml)以外のファイル(rb、html)でCGIやerbを有功にする
require "webrick"の下あたりに以下の内容を記入しておく。
拡張子に合わせて、MimeTypeの設定も必要かもしれない。

module WEBrick::HTTPServlet
WEBrick::HTTPServlet::FileHandler.add_handler('rb', WEBrick::HTTPServlet::CGIHandler)
WEBrick::HTTPServlet::FileHandler.add_handler('html', WEBrick::HTTPServlet::ERBHandler)
end



他にもいろいろあるけれど、とりあえず一番必要とされそうな所だけ。
そのうちlogに関して等も追記する…と思う。

2010年5月3日月曜日

はつねさんAppendをサーバに入れてみた

こーのーいーえの~ こーのさーばぁが~♪
わたしっの~ あたらっしぃ~ いばーしょーなの~♪


…ということで、AppendはつねさんをWindows Server 2008 R2なはつねサーバにインストールしてみた。

インストール中
まぁ、以前から何度も試しているだけあって、今回も何の問題もなくインストールは進み…

インストールが成功しました!

Twitterでクリプトンの人が「インストールに20分ぐらいかかるかもしれません!」と言っていた割に、10分で終了。
まだまだPhenom X4 9750なはつねサーバはメインで現役だね(`・ω・´)シャキーン



歌ってもらった感じも、今のところ全く問題なし。
…スタンドアロンでしか試してないけど。



※おまけ
Appendはつねさんの着メールボイス的なものと、
Append聴き分けテスト的なもの
http://append.hachune.net

2010年5月2日日曜日

Amazon先生から何かが送られてきた

はちゅねさんはQRコードが気になるようです。
Amazonから荷物が届いた。コンビニ振込み14400円。



あぺんど!

キタ━━━━(゚∀゚)━━━━ !!!!!
キタ━━━ヽ(ヽ(゚ヽ(゚∀ヽ(゚∀゚ヽ(゚∀゚)ノ゚∀゚)ノ∀゚)ノ゚)ノ)ノ━━━!!!!
キタ━ヽ(=゚ω゚)人(*^ー゚)人(´・ω・`)人( ´∀`)人( ;´Д`)人(゚∀゚)人(´-`)ノ━━!!



そしてこれまでにない箱と内容物の豪華さ。
はつねさんの時はふつーのDVDケースに紙が数枚、って感じだったんだよな…
それが今回は、結構厚めの取説と、マウスパッド的なものまで入ってたり…(*´д`*)

見てみたい? ならAppend買おうね!(ぁ





使用許諾契約書。
これを守ってさえいれば、はつねさんはうちの子でいてくれるのである。



1+6つの表情を持つはつねさん。夢が広がるな…'`ァ,、ァ(*´Д`*)'`ァ,、ァ

2010年4月18日日曜日

応用情報技術者試験に行ってきた

平成22年度春期の情報処理技術者試験に行ってきた。
これまでの受験で、初級シスアド基本情報と連続合格することができていたので、今回は応用情報技術者試験を受験。



応用情報から、午後試験に記術式の問題が出現する。これがなかなかの曲者。
正直午後は…まったく自信が無い…


応用情報はレベル3ということもあって、午前もあんまり気が抜けなかった。
公開された解答例を用いて自己採点した結果、午前: 80問中63問正解という結構良い結果に。
「俺、応用情報午前通ったらはつねさんAppend予約するんだ…」と言ってしまっていたのだが…さてどうしようか…w


…午後は、午後の解答例の公開が遅い上に、そもそも解答を問題用紙に書き込んでいる余裕が無かったため、判定不能という…

応用情報以上は6月末に合格発表。
遠いなぁ…


各種試験の解答例や問題冊子は以下からダウンロードできる。
今年は今までよりサーバが軽くなった感じがするw
http://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2010h22.html

2010年4月10日土曜日

はちゅねCNAMEサービスも開始!

hachune.netドメイン有効活用計画第二弾、CNAME割り当てサービスを開始!

d.hachune.netのサブドメイン(例: mikutter.d.hachune.net)を、既に持っているドメイン名の別名として使用できるようにするサービスです。

これは、固定IPを持っているか、既にDynamicDNSなどでドメインを持っている向け、となります。

以下の場合は、利用出来ない場合があります。
・非固定IPアドレスで、Dynamic DNSでIPアドレスと関連付けられたドメインを持っていない
・ドメインを持っているが、IPアドレスを貰えないタイプのホスティングサービスを利用している(ブログサービスなど)


詳細ははちゅねCNAMEサービスのページでどうぞ。



対象者がかなり絞られる気もするけど…まぁ無いより良いよね(´・ω・`)
回線が光だったら、Dynamic DNSサービスとかホスティングサービスもできるんだが…

2010年4月4日日曜日

何を考えるかは人次第

阪大の方々がロボットを作ったらしい。
画像はリンク先参照。

女性そっくりのロボット開発 大阪大、笑顔やまばたきも
http://www.47news.jp/CN/201004/CN2010040301000448.html

>ロボットは座った状態の高さ140センチ、重量30キロ。パソコンやモニターで操作し、目や口、首など9カ所が動く
とのことなので、自立して何かをする、と言う訳では無い模様。
人に似せれば似せるほど不気味に感じるような…('A`)

阪大の石黒教授曰く、
>「自分の代わりに遠い場所に送ることで、新しい意思疎通の手段に使える。一緒に食事したり、恋愛したりできるようになるかもしれない」
…どちらかというと、「遠いところ(主に2Dの世界)から来てもらう」用途の方が需要がありそ(ry



同じタイプのロボットを「株式会社ココロ」というところが1千万円前後で販売しているらしい。
「孤独な科学者…?w」と思ってしまうのは私だけか(*´Д`)

子供手当てが酷いらしい

民主党がなにやらとんでもない事をしてくれたようで。

この法の一番の目玉は、
日本に両親が1年住んでるだけで、子供が外国に居ようが毎月 子供の数×13000円 貰える(審査もザル)
ということ。
しかも、来年度からは給付額を26000円にしたい、と言っているらしい。


まぁ、当然の結果として…
・子ども手当ての窓口に ネパール人、韓国人、中国人…
中には、200人子供がいる!という方も居る(?)模様。(月額260万円、年額3120万円)
非実在子供にまでお金を払いそうな勢い。この手当て金を狙った児童売買なども発生しそうな予感。


このための財源は、無論日本国民の税金な訳で。
日本国籍の子供は、将来このツケを払うハメになり、外国人はあくまで外国人なので、日本の税金が高くなったら祖国に逃げられる。
一番バカを見るのが日本の子供というすさまじい状況。
「子供」という聞こえのいい言葉で騙す最近の法案によくある手口。
良い事なんて何一つもない。


参院選の票集めだか何だか知らないが、これほどまでの悪法、今まで見たことが無い。
その上、外国人に参政権をあげるよ!なんて言ったりもしてる。
もう確信犯としか思えない。

マニフェストの時点で絶対不可能だと思っていたが、ここまであからさまにバカをやってくれるとは流石に思っていなかった…。とりあえず、身近な人にこの法の危険さを伝える、ということから始めるしかなさそう。


子供手当ての詳細(Wikipedia)は以下から
http://ja.wikipedia.org/wiki/%E5%AD%90%E3%81%A9%E3%82%82%E6%89%8B%E5%BD%93



久しぶりに書いた記事がこんなことになって申し訳ないのだが、あまりに酷かったので…

2010年3月22日月曜日

RubyでUDPなServer/Clientを作ってみた

なにやらUDPを使ったアプリケーションを作成することになりそうなので、各クライアントから来た要求を全クライアントに返すサーバと、送信/受信を行うクライアントを作成してみた。

UDPなので、相手に届いているかを保証することはできない。
よって、このサーバ/クライアントでは「伝えること」より「リアルタイムで発信すること」を重視する。


まずはサーバ側を作成。

#!/usr/bin/env ruby
#-*- encoding: utf-8 -*-

require "socket"

SERVERIP = "192.168.0.105"
SERVERPORT = "62000"

clientList = Array.new

sock = UDPSocket.new
# サーバとして待ち受けるアドレスとポートを指定 
sock.bind(SERVERIP, SERVERPORT)

while true
# sockに出力が来るのを待つ
# 来なかったらnilを返す
sel = IO::select([sock])
if sel != nil
sel[0].each {|s|
# 最大65535byte分のデータを受け取る。
# データは配列として渡される。
# ["文字列", ["アドレス種別", 送信元ポート番号, "送信元ホスト名", "送信元IPアドレス"]]
# ["192.168.0.105 :43433 miku > miku\n", ["AF_INET", 62000, "192.168.0.105", "192.168.0.105"]]
data = s.recvfrom_nonblock(65535)
string = data[0].chomp!
ip, port = data[1][3].to_s, data[1][1].to_i
clientList << {"ip"=>ip, "port"=> port}
clientList.uniq!
# 各クライアントに向けて返信する
clientList.each{|client|
printf("Server > %-15s:%5d %s\n", client["ip"], client["port"], string)
# 実際に返信する。send("文字列", フラグ, "送信先IPアドレス", "送信先ポート")
sock.send(sprintf("%-15s:%5d %s\n", client["ip"], client["port"], string), 0, client["ip"], client["port"])
}
}
end
end

sock.close


次にクライアント側を作成する。

#!/usr/bin/env ruby
#-*- encoding: utf-8 -*-

require "socket"

if ARGV[0] == nil
puts "ex) ./client.rb miku"
exit 1
end

NAME = ARGV[0]
SERVERIP = "192.168.0.105"
SERVERPORT = "62000"

# UDPのソケットを作成
sock = UDPSocket.new
# バインドするIPアドレスとポートを自動で割り当てる
sock.bind("0.0.0.0", 0)


# サーバからの情報を受け取り表示するスレッドを作成
thread = Thread.new {
while true
# sockに出力が来るのを5秒待つ。
# 来なかったらnilを返す。
sel = IO::select([sock], nil, nil, 5)
if sel != nil
sel[0].each{|s|
data = s.recvfrom_nonblock(65535)
puts data[0].chomp!
}
end
end
}

# サーバに情報を送信するループ
while true
string = STDIN.gets.chomp!
sock.send(sprintf("%-5s> %s\n", NAME, string), 0, SERVERIP, SERVERPORT)
end

sock.close



実際に使用すると、このようになった。
UDPサーバ/クライアント実行結果


これだけで、簡単なチャットサーバ/クライアントが作成できた。
Cで書いたものを見たあとだと、Rubyが簡単過ぎて泣ける。

2010年3月8日月曜日

Debian(PPC)でLinux-VServerを使ってみる

Debianでのchroot環境について調べていたところ、chrootよりずっといい感じのLinux-VServerなるものが見つかったので、忘れないように書いておく。
感じとしては、FreeBSDのJailと似たようなもの…な気がする。

・aptitudeでvserver用のカーネルとツールをインストール。
# aptitude install linux-image-2.6-vserver-powerpc \
> util-vserver \
> vserver-debiantools


・vserver用カーネルで起動するため、再起動。
# reboot


・vserver用ファイルを準備。
vserver名をmikuとし、ホスト名をmiku.v.hachune.net、ディレクトリツリーの場所を/vsv/miku、ネットワークインターフェースにeth2を使用、1番のエイリアス(eth2:1)として10.39.39.100/24を割り当てる。ループバックにはlo:1を使用する。
"--"以降はdebootstrapのオプション。ここではDebian Lennyをftp.jaist.ac.jpから取得するように設定する。

# vserver miku build \
> --hostname miku.v.hachune.net \
> --rootdir=/vsv/miku --context 39 \
> --interface 1=eth2:10.39.39.100/24 --interface 1=lo:127.0.0.1/8\
> -m debootstrap -- -d lenny -m ftp://ftp.jaist.ac.jp/pub/Linux/Debian/


…これだけ。
後は、通常のDebian同様、起動して入ってサーバを設定する。
日本語を使用したい場合はaptitude install localesするといい。
・vserverを開始
# vserver miku start
・vserverを停止
# vserver miku stop
・vserverに入る
# vserver miku enter
・vserverの状態を確認
# vserver miku status
・vserverを削除
# vserver miku delete


詳しくはmanのvserver、verver-build、vserver-statあたりを参考にすると良いらしい。
一部デバイスの関係で正しく動作しないアプリケーションがあるようだが、chrootだけよりいい感じ。
基本システムのみなので、インストール直後の容量が252MBと、かなり小さめなのも嬉しい。
Mac Mini G4では、XenやVMwareが使えないしな…。

linux-vserver.org
http://linux-vserver.org/


※追記
動くものと動かないものは以下のとおり。

動作確認:
bind9
apache

動作せず:
OpenVPN: /dev/net/tunが無いため不可。
dhcp3-server: eth2:1を正しく認識しない…?


その他必要そうな設定
・TimeZoneの設定
# dpkg-reconfigure tzdata

・digが必要な場合
# aptitude install dnsutils

2010年3月5日金曜日

OpenBSDのカーネルを再構築

これまた忘れそうなので書いておく。


・適当なところからカーネルのソース等を持ってきておく。
今回は、以下の4つを取得。
ftp://ftp.jaist.ac.jp/pub/OpenBSD/4.6/src.tar.gz
ftp://ftp.jaist.ac.jp/pub/OpenBSD/4.6/sys.tar.gz
ftp://ftp.jaist.ac.jp/pub/openBSD/4.6/ports.tar.gz
ftp://ftp.jaist.ac.jp/pub/OpenBSD/4.6/xenocara.tar.gz


・ダウンロードしたファイルを展開する。
# cd /usr/src
# tar xzf /home/miku/sys.tar.gz
# tar xzf /home/miku/src.tar.gz
# cd /usr
# tar xzf /home/miku/xenocara.tar.gz
# tar xzf /home/miku/ports.tar.gz


・カーネルをビルド
# cd /usr/src/sys/arch/i386/conf/
# cp GENERIC.MP HACHUNE
→カーネル設定の編集はここで。
MPカーネル(マルチプロセッサ用のカーネル)の設定は、殆どがGENERICカーネルをincludeしたものなので、細かい設定はGENERICを編集して変更する。

# config HACHUNE
Don't forget to run "make depend"
# cd ../compile/HACHUNE
# make depend
# make
→ EeePC(Atom N270、DDR2-667 2GB、20GB IDE-USB HDD)だと、大体20〜30分位で終了。

・Buildしたカーネルをインストール(古いものをbsd.oldとしてとっておく)
# mv /bsd /bsd.old
# cp bsd /bsd

・再起動
# reboot
→もしコケたらブートローダーでbsd.oldを指定して起動


・ユーザーランドのビルド
# cd /usr/src
# make obj
# make build
→ カーネルのビルドよりずーーっと時間が掛かるのでゆっくり待つ。

・再起動
# reboot



…と、ここまでやっていたHDDがクラッシュ。
実験用HDDだからまぁ良いのだが、やっぱり凹むな…

2010年2月28日日曜日

DebianでNFSサーバ&クライアント

ググれば大量に出てくるものを書いてもなんかなぁ...と思いつつも、
そんなことを考えていると全然Blogが書けないということに気がついたので、もう遠慮なく書くことにする。

今回は、かがみねサーバ(kagamine.h.hachune.net)の/home/mikuをめぐりねサーバ(megurine.h.hachune.net)の/home/mikuにマウントする。

まず、かがみねサーバ(NFS Server)の設定。
% sudo aptitude install nfs-kernel-server
% sudo vi /etc/exports
で、以下を追加する。
/home/miku *.h.hachune.net(ro,sync,no_subtree_check)


・ディレクトリをエクスポート(再エクスポート)する。
% sudo exportfs -ar
(nfs-kernel-serverを再起動する方法もある)

・公開できているか確認する。
% showmount -e


次に、めぐりねサーバ(NFS Client)の設定を行う。
/etc/fstabに以下を追加し、sudo mount -aする。
kagamine.h.hachune.net:/home/miku /home/miku nfs ro,sync 0 0

これでマウントできた。
サーバ側でshowmount -aコマンドを打つと、マウント状況が確認できる。
簡単だけれど、セキュアではないな…


/etc/exportsの書式は、man exports、
/etc/fstabのNFS関連の情報は、man nfs、
NFSエクスポートリスト操作コマンドexportfsの情報は、man exportfs
マウント情報確認コマンドshowmountの情報は、man showmount
を見ると良い。

Ruby1.9.1のcursesでUTF-8文字列を表示

RubyのCursesでプレイリスト操作ツールを作成しようとしたところ、文字化けして全然使い物にならないということが判明。ついでなので1.9.1にパッチを当ててビルドしてみることにする。

・ext/curses/curses.cを編集

追加:
+ #include "locale.h"

Init_curses関数内にsetlocaleを追加:
Init_curses()
{
+ setlocale(LC_ALL, "");


・ext/curses/extconf.rbを編集(ncurseswを探すようにする)

削除:
-if have_header(*curses=%w"ncurses.h") and have_library("ncurses", "initscr")
追加:
+if have_header(*curses=%w"ncurses.h") and
+ ( have_library("ncursesw", "initscr") or have_library("ncurses", "initscr") )
+ make=true
削除:
-elsif have_header(*curses=%w"ncurses/curses.h") and have_library("ncurses", "initscr")
追加:
+elsif have_header(*curses=%w"ncurses/curses.h") and
+ ( have_library("ncursesw", "initscr") or have_library("ncurses", "initscr") )
+ make=true


ruby-1.9.1-p378.tar.bz2をダウンロード
・ libncursesw-devをaptからインストール
% sudo aptitude install libncursesw-dev

・ビルド。-O2だと何故か途中でコケるらしいので、-O3にする。
% optflags="-O3 -pipe" ./configure --prefix=/usr/ruby19 --program-suffix=19

2010年2月19日金曜日

現状

なんか色々忘れそうなので書いておく。

ゼミ用論文…texA450枚越え。卒論として提出する時には一体どうなっていることやら…
応用情報技術者…毎日ちょっとずつ勉強。
Ruby…最近あんまり大きいのは作っていない。mtmef v2.0をさっさとどうにかしたい。Winでしか動かないのは不便過ぎる。
C…細かいのをいろいろやってる。
Python…あんまり触れてない。ついRubyに行ってしまう…

# はちゅね転送サービスの影響でAjaxが気になりだした。
# ちょっとやってみたら意外といけそうな気がした(ブラウザを気にしなければw)。
# 作業の効率化の為にも、zshをどうにかしたい。


鯖…最近環境を一期に更新中。去年作ったkagamine-server(Debian 5)大活躍。
逆にhatsune-server(WS2008R2)がちょっと弄れていない状態。
hatsuneは音楽関連専用機になりつつあるな…

megurine-serverは今年に入ってからほぼ常に稼働中。
春休み中にmegurine一度全部見直したいが、どうだろう。

hachune.net用Webサーバのバックアップもほぼ準備完了。
後は改良し続けるだけ…な気がする。
セキュリティの向上も必須。Gumblarとかにはまず引っかからないだろうけど。
公開サーバでパスワード認証とか怖すぎてもうできないw

# ルータがちょっと危険…かも?(VPN的な意味で)
# そろそろルータぐらい自作すべき(OpenBSDあたりでw)


まだ卒業まで1年ある。その間はひたすらこんな感じで勉強。
それでも、終わるのが早すぎて泣ける。

2010年2月14日日曜日

はちゅね転送サービス 開始!

以前勢いで取得したhachune.netドメインを使用し、URL転送サービスを作ってみた。

例えば、
otomania.hachune.netにアクセスが来たら、Otomaniaさんのページhttp://www.otomania.netに転送する
pocopoco.hachune.netにアクセスが来たら、たまごさんのページhttp://www.pocopoco.ccに転送する
twitter.hachune.netにアクセスが来たら、私のTwitterページhttps://twitter.com/Phenomerに転送する
といったことができます。

「サーバを間借りして作ったサイトに、分かりやすい名前が欲しい!」
「自分のボカロなサイト・ブログに分かりやすい別名を付けたい!」
などといった時に使えるかと思います。


詳細は以下からどうぞ。
http://hachune.net/hachune-forward.html


.comがドメイン広告になってるな…なんか寂しい。

2010年2月9日火曜日

CでOpenMPを使ってみる

せっかくマルチコアCPUがあることだし、全コアを全力で使えるプログラムを作ってみたいと考えていたが、いろいろ面倒で諦めがちだった。しかし、C/C++にはOpenMPという便利なものがあると聞いて、調べみたところ、本当に便利だったのでここに纏めてみる。


OpenMPを利用するには、GCC 4.2以降が必要で、コンパイル時に-fopenmpオプションを付ける必要がある。
% gcc openmp_test.c -o openmp_test -fopenmp

また、今回OpenMP関連で使用した関数とその役割は以下のとおり。
omp_get_thread_num() … 現在実行されているスレッドの番号を返す
omp_set_num_threads(10) … スレッド数を10に指定(通常はCPUコア数から自動的に割り振られる)


まずは一番簡単なスレッド作成方法。
スレッド処理したい関数の前に#pragma omp parallelを書くだけ。

#include<stdio.h>

int main(void){
int i;

#pragma omp parallel
for(i=0; i<20; i++){
printf("Thread %d : %d\n", omp_get_thread_num(), i);
}
return 0;
}


これをコンパイルし実行すると、

miku@kagamine:~/c-lang$ ./openmp_1
Thread 0 : 0
Thread 0 : 1
Thread 0 : 2
Thread 0 : 3
Thread 0 : 4
Thread 1 : 0
Thread 1 : 1
Thread 1 : 2
Thread 1 : 3
Thread 1 : 4

となったり、

miku@kagamine:~/c-lang$ ./openmp_1
Thread 1 : 0
Thread 1 : 1
Thread 1 : 2
Thread 1 : 3
Thread 1 : 4
Thread 0 : 0

となったりする。なにやら同時に処理されているように見え、スレッドの実験としては成功していることが分かる。
しかし、結果が安定していないため、このままではあまり使い物にならない。
開始したスレッド全てから変数iが参照され、変更されるためこうなってしまう。



そこで、変数iをスレッド内でプライベートに使うようにしてみる。

#include<stdio.h>

int main(void){
int i;

// 変数iをスレッド内プライベートとして渡し、スレッドを開始させる
#pragma omp parallel private(i)
for(i=0; i<3; i++){
printf("Thread %d : %d\n", omp_get_thread_num(), i);
}

return 0;
}

これを実行すると…

miku@kagamine:~/c-lang$ ./openmp_2
Thread 0 : 0
Thread 1 : 0
Thread 1 : 1
Thread 1 : 2
Thread 0 : 1
Thread 0 : 2

iの値はそのスレッド内のみの値として扱われ、
スレッド毎にi++されていることが分かる。



通常、全スレッドが全く同じ処理を繰り返しても意味が無い。
そこで、グローバルな変数iを操作するときのみ、排他処理を行わせる。

#include<stdio.h>

// 変数iをグローバルとして渡すが、printfとi++の部分を排他動作させる
int main(void){
int i;

i = 0;
#pragma omp parallel
while (i<10){
// 排他処理部分をブロックで指定
#pragma omp critical
{
printf("Thread %d : %d\n", omp_get_thread_num(), i);
i++;
}

sleep(1);
}
return;
}

これを実行すると…

miku@kagamine:~/c-lang$ ./openmp_3
Thread 1 : 0
Thread 0 : 1
Thread 1 : 2
Thread 0 : 3
Thread 1 : 4
Thread 0 : 5
Thread 1 : 6
Thread 0 : 7
Thread 1 : 8
Thread 0 : 9

iの値が、両スレッドで1づつ増えていっているのが分かる。

ただ、このテストプログラムには問題がある。
while (i<0)の判定後、whileループの中で別スレッドがiに値を追加し、
printf()するときにiの値が10または10以上になってしまうことがある(sleep(1)を外すと頻繁に発生する)。
この辺りを、正しく処理させるようにしないと、「数回に1回だけ何故かコケる」なんて厄介なバグになってしまうので、注意したい。



何でもかんでも排他処理させてしまうと、他の関数で実行中のスレッドにまで影響が及び、何かしらの問題(デッドロック等)が発生する可能性がある。
そこで、できる限り排他処理を使わないようにしてみる。
(ついでに、しっかり4コア使ってくれるのか確かめるため、dummy関数を用意した)

#include<stdio.h>
#include<unistd.h> // usleep()
#include<stdlib.h>


// ダミー処理関数(CPUに負荷を掛ける)
void dummy(int number){
int n, i, tmp;
int array[number];
for(i=0; i<number; i++){
array[i] = i;
}

for (n=0; n<number; n++){
for (i=0; i<number - 1; i++){
if (array[i] < array[i+1])
{
tmp = array[i];
array[i] = array[i+1];
array[i+1] = tmp;
}
}
}
return;
}


// 変数iをグローバルとして渡すが、printfとi++、dummy(10000)の部分をシングルスレッド動作させる
int main(void){
int i, while_count;

i = 0;
while_count = 0;

#pragma omp parallel
while (<<100){

// ブロック内をシングルスレッド動作させる
#pragma omp single
{
printf("Thread %d : %d\n", omp_get_thread_num(), i);
i++;
dummy(10000);
}
printf("Thread %d : loop...\n", omp_get_thread_num());
usleep(10);
while_count++;
}

printf("loop Count: %d\n", while_count);
return;
}



また、「ブロック内を他のスレッドが実行中なら、ブロック内の実行をスキップする」ということも可能。

#include<stdio.h>
#include<unistd.h> // usleep()
#include<stdlib.h>


// ダミー処理関数(CPUに負荷を掛ける)
void dummy(int number){
int n, i, tmp;
int array[number];
for(i=0; i<number; i++){
array[i] = i;
}

for (n=0; n<number; n++){
for (i=0; i<number - 1; i++){
if (array[i] < array[i+1])
{
tmp = array[i];
array[i] = array[i+1];
array[i+1] = tmp;
}
}
}
return;
}


// 変数iをグローバルとして渡すが、printfとi++、dummy(10000)の部分をシングルスレッド動作させる。
// もしその部分が別スレッドで処理中ならスキップする
int main(void){
int i, while_count;

i = 0;
while_count = 0;

#pragma omp parallel
while (i<100){

// single nowait : 他のスレッドがブロック内を実行中だったらスキップ
#pragma omp single nowait
{
printf("Thread %d : %d\n", omp_get_thread_num(), i);
i++;
dummy(10000);
}
printf("Thread %d : loop...\n", omp_get_thread_num());
usleep(10);
while_count++;
}
printf("loop Count: %d\n", while_count);
return;
}


#pragma omp singleと、#pragma omp single nowaitの場合を、
実際にコンパイルして実行、比較してみると、多分違いが分かる…と思う。
また、omp_set_num_threads(スレッド数)で、スレッド数を変更しながらいろいろ試してみるのも良い。


結構長い間やっていた筈なのに、C言語のBlog投稿は今回が初めて。
やっているけど書いていないことって、かなり多いな…。

2010年1月30日土曜日

様々なOSでRAMDiskを使ってみる

/ramに32MBのRAMDiskを作る、/etc/fstabの設定を比較してみた。
実験に使用したOSは、Linux(Debian 5.0 Lenny)、FreeBSD 8.0、OpenBSD 4.6の3つ。

Linux
tmpfs /ram tmpfs rw,size=32m 0 0

FreeBSD
md /ram mfs rw,-s32m 0 0

OpenBSD
swap /ram mfs rw,-s=65536 0 0


fstabの5列目は、「dumpが必要なファイルシステムであるか」、6列目は、「起動時にfsckを行う必要のあるファイルシステムであるか」であり、RamDiskにはどちらも必要ないので、0とする。

OpenBSDは、サイズで指定するのではなく、ブロック数で指定するので、直感的には分かりづらい感じ。
(試しに-s=32mとしてみたところ、そんなサイズ知らねぇよ、と言われた)
また、65535と1ブロック少ない値を設定したところ,
mount_mfs: reduced number of fragments per cylinder group from 8184 to 8112 to enlarge last cylinder group
と言われるので、おとなしく8192で割り切れる値にしておいた方が良さそう。


コマンドだと、こんな感じ。
Linux
# mount tmpfs -o rw,size=32m /ram

FreeBSD
# mount_mfs -s 32m -o rw md /ram

OpenBSD
# mount_mfs -s 65536 -o rw swap /ram

2010年1月15日金曜日

忙しくて更新停滞気味なので

論文やらレポートやらで忙しく、今年に入ってからロクに更新できていないので、とりあえずコンピュータ関連の時事ネタでも書いてみる。

ITmedia - Google、中国事業閉鎖の可能性 言論の自由の問題めぐり
http://www.itmedia.co.jp/news/articles/1001/13/news028.html

以前から問題になっていた、中国政府当局によるWebの検閲。
それに加え、今回、中国政府当局によると思われる、Googleに対する不正アクセスやサイバー攻撃が発生。
Googleの他にも、IT企業や金融企業に対する攻撃もあった模様で、これらに対する措置として、既に検閲の解除が行われており、場合によってはGoogleの中国からの撤退もあるかもしれない、とのこと。

中国政府主動の検閲や不正アクセスなどについては、ずーーっと前から問題になっていたので、あぁやっと来たか、という感じぐらいにしか感じないが…。

こういう問題が多数存在しているにも関わらず、一部のコストにだけ目が行って、その後どんな事態が発生するかをロクに調べず、また考えずに、とにかく中国に進出しようとしている企業は、長続きしない気がする。
(逆に言えば、リスクマネジメントがしっかりできる企業は成功する…かも? という)


この攻撃に利用されたのが、脆弱性でおなじみのIE6。
ITmedia - MicrosoftがIEの脆弱性を報告 IE 6狙った攻撃も
http://www.itmedia.co.jp/news/articles/1001/15/news040.html

企業とかならまだ分からんでもないが、個人で今IE6を使いつづける理由が分からない…。
Windows Updateしてれば自動的に更新される訳だし。



最近、IE以上にホットな脆弱性を日々お届けしてくれるのは、Adobe Reader & Adobe Flash Player。
これの脆弱性を利用したウィルスがGumblarである。

ITmedia - Gumblar攻撃はボットネット化が狙い?
http://www.itmedia.co.jp/enterprise/articles/1001/15/news034.html

改竄されたWebページを開き、不正なファイルをダウンロードしてしまい、それを開こうとしたAdobe ReaderやAdobe Flash Playerの脆弱性が原因でコンピュータの権限が乗っ取られ、不正なプログラムをシステムに仕込まれてしまう。
そしてその不正なプログラムがユーザの打ち込んだパスワードを利用し、そのユーザが管理しているWebページを不正ファイルがダウンロードされるように改竄、そのWebサイトから感染拡大する、というのが、Gumblar流行の流れ。

普段見ているサイトが感染源になったりするので、今まで対策として挙げられていた「あやしい〜は開かない」などというものは一切通用しない。
自分が加害者になるかもしれないということを頭に入れ、http://www.jpcert.or.jp/at/2010/at100001.txtなどを参考にしながら、抜けの無い対策を行う必要がある。

一番危ないのは、ノーガード戦法のWindows XPユーザであることは間違いなさそう。
ユーザが気がつかないように活動するからスパイウェアなんて呼ばれているのに、「感染したこと無いから私は大丈夫」と言っている人が少なからず…アハハ(ノ∀`)ハハハ…


…なんだか微妙な話題が多いな…

ブログの利用状況の統計を確認してみた

このブログでは、どのようなユーザが利用しているのか気になったので、Google Analyticsの統計の一部を確認してみた。
期間は、09年12月15日〜10年1月14日

閲覧ブラウザ
Internet Explorer
6 - 637
7 - 1919
8 - 1165

Firefox
3 - 150
3.5 - 2114
3.6 - 24

Chrome
3 - 378
4 - 239

Opera - 273
Safari - 141
Lunascape - 89

徐々に少なくなりつつあるものの、未だにIE6を使っている人は、かなりの数存在しているということが分かる。
私としてはOperaたんにもう少し勘張ってもらいたいところなのだが…


利用OS
Windows
7 - 3037
XP - 2831
Vista - 905
Server2003 - 60
2000 - 59
98 - 2
CE - 1

Macintosh
Intel 10.6 - 90
Intel 10.5 - 52
PPC 10.4 - 13
PPC 10.5 - 5
Intel 10.4 - 3

Linux - 141
iPhone - 18
iPod - 6
SunOS - 3
FreeBSD - 1
NetBSD - 1
OpenBSD - 1

既に7がトップとなっているのは、恐らく「Windows 7 x64でRAM Diskを使う」の記事があることが一番の原因と考えられるが、実際に使っている人も多いと思われる。
SunOS、FreeBSD、NetBSD、OpenBSDは、恐らく自分自身かと…。
あと、サポートがとっくの昔に切れたWindows 9x系でインターネットに接続するのは、ぜひ止めて頂きたい。


意外な結果が出ていたのが、画面の解像度。
1280x1024 - 1,452
1920x1200 - 1,033
1024x768 - 849
1920x1080 - 803
1680x1050 - 736
1280x800 - 667
1440x900 - 355
1366x768 - 293
1600x1200 - 244
1400x1050 - 103

ここ最近一番安く売っていた(気がする)フルHD(1920x1080)が、WUXGA(1920x1200)に負けているという結果に。


あと気になるのは、「どんな立場の人から見られているのか」ということだろうか。
とりあえず、アクセスしてきたコンピュータのサービスプロバイダ一覧を見ていると、何処かで聞いたことのある大企業も沢山…。しかも、滞在時間が意外と長い物も多く、一体何を見ていたのか非常に気になるところw

2010年1月1日金曜日

2010年ということで

あけましておめでとうございます!
今年もよろしくお願いします。

新年だし、トップ絵変えようと思ったのだが、いいネタが思いつかなかった…。
多分正月休み中ぐらいには変える…かな。