4 月 21
MySQL
Image via Wikipedia

たまにやるのにやり方いつも忘れるから自分用にメモ.

テーブルをそのまま別のPCのデータベースに移したいときに使います.
別のやり方もあると思うけど,個人的にはテーブルの作成からやってくれるこの方法が好き.

mysqldump --u [user_name] --p --database [db_name] --tables [table_name]
> output.sql

これでテーブルの内容を,output.sqlというファイルに出力することができます。

ファイルをlessなどで見れば,内容がわかると思います。

これを他のデータベースに挿入するには,

mysql -u [user_name] -p [db_name] < output.sql

でOK。

Reblog this post [with Zemanta]
1 月 19
Hard Core Ruby
Image by rbieber via Flickr

Rubyは便利だけど遅い.

実行が遅い分,プログラムを書くコストは下がるので,それはトレードオフだが,それでもRubyのプログラムをできるだけ速く動かしたい時はそのプログラムの性能を評価する必要があります.

参考にしたのは,
まつもと直伝 プログラミングのオキテ 第13回 プログラムを高速化する

まつもと直伝 プログラミングのオキテ 第18回 プログラムを高速化する(その2)

詳しいことは上記のページを見れば丁寧に説明してあります.

基本的には

$ time ruby hoge.rb

でかかる時間が測定できる.値が結構変わるので,何回かやっていい値で評価するのがいい.
で、どの辺で時間を食ってるのか、ボトルネックを知るためには

$ time ruby -rprofile hoge.rb

で,見れます.

でもこれよりも,

$ ruby-prof hoge.rb

のほうが測定が早くできてよいみたい.

ubuntuであれば

$ sudo apt-get install ruby-prof

でインストールできます.

詳しいことは上記のサイトを見てもらうのがよいので省略.

Reblog this post [with Zemanta]
1 月 15

subetter
こないだ,twitterにくだらないギャグをpostするプログラムを書いたので,今度は他の人からの投稿を受け付けて,ギャグリストに追加するプログラムを書きました.

これで誰でも思いついたくだらないギャグをsubetterに言わせることができます.

進化したsubetter

ついでに,ギャグをテキストファイルに保存するのはなんかかっこ悪いので,MySQLにも入れることにしました.いずれMySQLに完全に移行したいですが,まだ両方やってます.

まだいくつか問題があって,MySQLにそのままじゃ入れられない文字の処理とか,全然よく分かってないのでその辺から修正しなきゃと思っています.

プログラムはこんな感じ.

require('rubygems')
gem('twitter4r','0.3.0')
require('twitter')
require "mysql"

flag = 0
msg = nil

my = Mysql::new("localhost", "user", "passwd", "db_name")

client =Twitter::Client.new(:login => 'subetter',:password => 'passwd')

client.messages(:received).each do |msg|
#メッセージのテキストを取得,改行文字を省く
joke = msg.text
joke = joke.strip

#メッセージの送り主を取得
user_name = msg.sender.screen_name

que = "SELECT * FROM jokes WHERE joke='" + joke + "'"
res = my.query(que)
res.each do |row|
flag = 1
end
#p flag

if flag == 0
sql = "INSERT INTO jokes VALUES ('','" + user_name + "','" + joke + "')"
#mysqlにギャグを登録
my.query(sql)
#テキストファイルにもギャグを登録
file = open("/home/jun/Dropbox/cyg/work/ruby/twitter/jokes.txt", 'a')
file.puts joke
file.close
else
flag = 0
end
end

exit
7 月 17

自分の環境はwindows Vista + Cygwin + zsh です.

まず,環境変数LANG=ja_JP.SJISにすれば,lsなどの出力で日本語ファイル名が文字化けする問題は解決すると思います.

しかし,なぜかc言語で書いたプログラムをgccでコンパイルするときに出るエラーが文字化けしてしまいました.

この原因を解決するために
YACI/基本的な作り方 - Co-Coa Wiki
を参考にして,
環境変数OUTPUT_CHARSET=sjis
としてやると,無事に日本語で文字化けすることなく出力されました.

しかし,「警告: 制御が非void 関数の終りに到達しました」
という日本語のエラーメッセージはなんかかっこ悪い.

エラーメッセージは英語のほうが慣れているというのもあって,結局エラーメッセージを英語で出力することにしました.

それは、環境変数LC_MESSAGES=C
としてやるとokです.

環境変数を変える方法としては,コントロールパネルのシステムの詳細設定から変えるか,または.zshrc(bashの人は.bashrc)に

export LANG=ja_JP.SJIS
export OUTPUT_CHARSET=sjis
export LC_MESSAGES=C

などと記述してやればokです.

6 月 27

Phidgets というのは有名なセンサーノードの一つで,日本でも買えます.

Phidgets 取扱製品一覧 - ぷらっとオンライン

基本的なキット(おそらく5万円程度)で,明るさセンサ,タッチセンサ,圧力センサ,スライダーセンサ,つまみ型センサ などがついてくるんだと思います.詳しくはぷらっとオンラインのページをご覧ください.
自分は研究室にあったキットを使いました.

今回はプログラムを書くための準備の説明です.

LinuxにおいてPhidgetsを扱うプログラムを書くためには,まずPhidgetsのサイトから必要なものをダウンロードします.トップページから左側のメニューにあるDownloadsペンギンの絵をクリックします.

Step 1 と書いてある部分からLinux Sourceをダウンロードします.

Step 2 から開発プラットフォーム(今回はC/C++)を選んで,

Step 3 からC/C++のExamplesと, C API Manualをダウンロードしましょう.

最初にダウンロードしたファイル(Phidgetlinux_x.x.x.2008xxxx.tar.gzという感じの名前)を展開すると.Phidgetlinuxというファイルができると思います.中にはphidget21、webserviceというフォルダ,READMEがあるかと思います.

READMEを読めば分かるのですが,次にターミナルでphidget21のディレクトリまでいきます.

cd (展開したフォルダ名)/Phidgetlinux/phidget21

そこで,

make

sudo make install

と打つと,プログラムを行う準備ができます.

今日はここまで.

5 月 15

まずvalgrindの導入.

ubuntu-linuxであれば

sudo apt-get install valgrind

で入れることができる.

使いかたは,簡単.

まずプログラムを書いて,-gオプションをつけてコンパイルします.

gcc  -g hoge.c

そして,チェック

valgrind ./a.out

ではこれで実際どのようになるのか,簡単な例で見てみましょう.

hoge.c

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int *num = malloc(10*sizeof(int));
num[10] = '1';
}

配列を越えて書き込んでいます.これをチェックすると

==3734== Invalid write of size 4==3734==  at 0x804839A: main (hoge.c:7)
==3734==  Address 0x417B050 is 0 bytes after a block of size 40 alloc'd
==3734==    at 0x4021620: malloc (vg_replace_malloc.c:149)
==3734==    by 0x8048390: main (hoge.c:6)
==3734==
==3734== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 11 from 1)
==3734== malloc/free: in use at exit: 40 bytes in 1 blocks.
==3734== malloc/free: 1 allocs, 0 frees, 40 bytes allocated.
==3734== For counts of detected errors, rerun with: -v
==3734== searching for pointers to 1 not-freed blocks.
==3734== checked 59,628 bytes.

などど出て,hoge.cの6行目で不正なメモリアクセスがあるとわかります.
本当はもっとたくさん文章が出てきます.

ですが,この程度のチェックならコンパイル時に

gcc -Wall -g hoge.c

とすれば,はじいてくれます.-Wallオプションもいつもつけるようにしましょう.