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
1 月 13

なかなか苦労しました.

一番参考になったのは,

Ubuntu 8.04.1 に Ruby on Rails 2.1.0 を入れる - neconnect.net

です.

やること

$ sudo apt-get install ruby rdoc irb ruby1.8-dev rubygems libopenssl-ruby
$ sudo gem update --system
$ sudo apt-get remove rubygems
$ sudo ln -s /usr/bin/gem1.8 /usr/bin/gem
$ sudo gem install rails

で,Ruby on railsの環境ができます.古いgemを入れてからアップデートして,古いgemを削除して新しいgemへのリンクを作るようです.

自分はMysqlを使いたいので,

$ sudo apt-get install mysql-server libmysql-ruby1.8 libmysqlclient15
$ sudo gem install mysql

をやって,起動時には

rails -d  mysql

をやるとデータベースをmysqlにしてrailsを実行できます.

これを毎回やるのは忘れそうなので,~/.zshrc(bashなら~/.bashrc)に

alias rails="rails -d mysql"

を追加しました.

で,twitter4rを使うには,

$ sudo gem install json
$ sudo gem install twitter4r

たしかこんな感じでいけると思います.

1 月 09
Image representing Twitter as depicted in Crun...
Image via CrunchBase

Rubyの勉強をちょっと昨日から始めたので,練習にtwitterにギャグをPostするプログラムを書いてみました.

subetter

1日1回ということでそんなにうざくないので,せっかくだからフォローしてやってください.

これを作るためにやることは

  • 1行に1つギャグを書いたテキストファイルを作る
  • テキストファイルをランダムで1行読む
  • それをtwitterにポストする
  • それをcronで1日1度実行する

っていう簡単なお仕事.

まず,ギャグを書いたテキストを作ります.
これは,いい方法が思いつかなかったのでとりあえずネットで適当に集めてきて自分でテキストファイルを作りました.まだギャグが30くらいしかない.さびしい.

で,それをランダムで1行読むっていうのは勉強したから簡単だったんだけど,twitterにpostするにはどうすればいいのかなって思って調べてみると,

twitterでbotを作りたい.(2) - reverleveeの日記
という,ほとんど同じことをやっている方を見つけたので,それを参考にさせてもらった.というか,最初からこれを拝借すれば早かったな.

ということで,自分の汚いコードは捨てて,その人のプログラムをコピペしたプログラムがこちら.
subetter.rb

require('time')
require('rubygems')
gem('twitter4r','0.3.0')
require('twitter')

lines = 0

msg = nil

open("jokes.txt"){|file|
while tmp = file.gets
lines += 1
end
}

open("home/user/....../jokes.txt"){|file|
#ファイルのパスは絶対パスで書かないとcronで読み込むときに失敗します
msg = file.readlines[rand(lines)]
# print msg
}

client =Twitter::Client.new(:login => 'subetter',:password => 'password')
client.status(:post, msg)
exit

jokes.txtにギャグを書きこみます.

文字化けは文字コードが原因なので,UTF-8で統一するように.

で、定期的にポストするには,Linuxの場合

crontab -e

でcronを設定することができます.

# m h dom mon dow command
00 15 * * * ruby /home/user/......../ruby/subetter.rb

これで毎日15時にギャグをつぶやきます.

次は,他の人がギャグを登録できるようにすることと,つっこみ側も作って2つで漫才を行うことを考えている.

Reblog this post [with Zemanta]
1 月 07

新たにLinuxマシンを使う必要があったので,古いthinkpadにUbuntu8.10を入れて使うことにした.

つまづいたところがいくつか。

Ubuntuのisoイメージを焼いたDVD(またはCD)ブートの際認識されない

→これはたいていディスクにちゃんとイメージとして焼けてないことが原因です.
isoを焼けるソフトを探してきて焼きましょう.
ちなみに自分はDVDDecrypterというソフトを使ってDVD-Rに焼きました.

で、インストール.
BIOSとかインストールの際のパーティションなどは初心者にはちょっと難しいですが,他のサイトを参考に注意深くやってください.

インストール後につまづいたこと

ネットワークにつながらない

ケーブル挿したらネットワークにつなごうとはするんだけど、なぜか繋がらない。
これは他に原因があるっぽいのであきらめて、無線LANでつなぐことを考える。

無線LANのランプがついていないので、ドライバがないのかな、と考える.

googleでちょっと検索して、

Thinkpad R30 に ubuntu 8.10 ja をインストール まずは無線LAN

を参考にして、インストールのときに使ったLiveDVDを入れます.

メニューバー?の「システム」→「システム管理」→「Synaptic パッケージマネージャ」を開いて
「設定」→「リポジトリ」のに下の方の「CD-ROM/DVDからインストール」の「Ubuntu8.10 ‘Intrepid Ibex’のCD-ROM」チェックを入れ、OKを押してから、一度Synpaticパッケージマネージャを終了させます。

そして、再びSynpaticパッケージマネージャを起動し,「未インストール」の中から
「linux-backports-modules-intrepid-generic」をダブルクリックとかして、選択します.

同時に~も入れてください っていうのもOKして、「適用」を押すと、インストールが始まります.

それが終わったらPCを再起動してください。
きっとこれで無線LANが使えるようになります。

無線がWPAだとパスワードが通らない
→なぜか入力したパスワードがバグっちゃうみたい。
とりあえず別の無線LAN(WEP)で妥協した。
→結局,メニューバー?のネットワークのアイコン右クリックして「接続の編集」から対象となるネットワークを選んで「無線セキュリティ」からパスワード入力したら接続できた。
謎。
Fonの場合は,ちょっと違うらしい.

音量の調節ができない
→未解決。スクロールするたびに変な音がなるのは消した。
「システム設定」→「サウンド」から。

トラックポイントとセンターボタンによるスクロールができない
Ubuntu Intrepid (8.10)でThinkPadのトラックポイントを有効にするを参考に,
/etc/hal/fdi/policy/mouse-wheel.fdi
を作成する.
昔と設定方法が変わったので要注意。

で、PC再起動したらスクロールできるようになります。

とりあえず以上です.

1 月 05

今年は読書しよう.

そう決意して,とりあえず就活に向けてなんか本でも読もうと思い,どこかで薦められていた絶対内定2010 面接の質問 (絶対内定シリーズ)を読みました.

この本を読んで,

さまざまな観点から自分を見るっていうのは大事.
長所や短所なんていうのはもちろん,こだわりだとか夢だとかをちゃんと他人に説明できるようにならなければ.

そんなことを思いました.

他の本にも似たようなことが書いてあると思うので,特にこの本を押す理由もないのですが,比較的見やすかったのと,具体例や人事側の視点などが書かれていた点がよかったとおもいます.

この本をきっかけに,自分の経験や性格やアピールポイントなどを考えようと思ってマインドマップを書いてみたりしました.

こういうときのマインドマップは考えがまとまるのでおすすめ.

1 月 02

MySQLでautoincrementを1に戻すSQL.忘れてしまうので自分のためにメモ

ALTER TABLE `テーブル名` PACK_KEYS =0 CHECKSUM =0 DELAY_KEY_WRITE =0 AUTO_INCREMENT =1;

これはレコードを全部削除したあと(delete from テーブル名;)
に行います

12 月 30

ちょっとトラブルもありましたが、無事に終わりました.

手順とハマったことをメモっておきます.

やること

1, まずバックアップ

何をバックすればいいかわからなかったから、元のファイル(woredpressのトップディレクトリから)を全部ローカルに一度ダウンロードしました.

その次に,データベースのデータをバックアップします.

自分の場合は面倒だからやらなかったけど大丈夫でしたが、本当はやった方がいいと思います.もっと価値あるブログをお持ちの方々は特に.

2, ワードプレス2.7日本語版の準備

WordPress 2.7 日本語版リリースのお知らせ
からダウンロードします.
ダウンロードしたら,解凍して,本来ならwp-config-sample.phpに倣ってwp-config.phpというファイルを作ります.設定を今までのwp-config.phpを参考に埋めていきます.

ところが,これが自分の場合は何かがよくなかったようで,後でトラブルの原因になりました.
wp-config.phpは作らなくてもあとでブラウザ上から設定可能なので大丈夫です.

アップロードして設定

まず,アップロードの前に,現在のwordpressの使用中のプラグインを一度全部停止してください.

ダウンロードしたwordpress2.7のファイルを,今までwordpressが置かれていたフォルダのそのままアップします.古いものは消しちゃっても構わないと思いますが,自分は古いものはそのままで,ftpソフトの「新しかったら上書きする」という方法でアップしました.

アップできたら,http://****.com/wp-admin/upgrade.php
にアクセスして,アップグレード作業を実行します.
これで終了です.

もしwp-config.phpを作っていなかった場合は,ここで設定画面になります.設定してからもう一度upgrade.phpにアクセスしてください.

wp-configに関するトラブル

自分の場合,アップしたあとupgrade.phpにアクセスすると,なぜか変な画面になって,wp-configがそのままテキストとして見えてしまっていました.
おそらくwp-config.phpの文字コードとかパーミッションとかの設定の問題だと思いますが,その場合は,wp-config.phpを削除してupgrade.phpにアクセスすると,configの設定の画面に行けます.これで設定することも可能です.

configの設定をしたあと、もう一度upgrade.phpにアクセスするとupgradeがおこなわれます.

2.7にアップグレードすると,ダッシュボードが大きく変わります.ちょっとかっこよくなった

12 月 26

最終的には図のようなグラフを書きたい.

と思いまして,いろいろ調べたところ,GraphVizというソフトが使えそう,と思いました.
WindowsでもLinuxでもMacでも使えます.

1, 環境をつくる

Ubuntuからは,まず

sudo apt-get install graphviz

これだけ.

windowsでは
まず http://www.graphviz.org/ からダウンロードしてインストール.
cygwinにパスを通すため,graphvizの実行ファイルのディレクトリ(例えば,Program Filesの下にインストールした場合は C:\Program Files\Graphviz\bin)を環境変数の「$Path」に追加します.(「コントロールパネル」→「システム」→「システムの詳細設定から」)
そして再起動.

2, 使ってみる

簡単なグラフを書いてみましょう.

digraph G{
  morning -> afternoon
  afternoon -> evening
  evening -> night
  night -> morning
}

こんな感じでつないで書ける.簡単.
これをtest.dotと名前を付けて保存します.

そして,シェルから

dot -Tpng test.dot -o test.png

として実行すると,問題がなければtest.pngという画像ができています.

test.png

test.png


png以外にも,jpgやgif,psなどにすることも可能です.

3, 作成

あとは参考になりそうなサイトなどを調べて,自分で作ってみてください.
【特選フリーソフト】テキストをグラフに変換 Graphviz : ITPro
PHPにおけるグラフ描画とアルゴリズム : Codezine
テキストから図を作成 - Graphviz : アシアルブログ
dotを使ったグラフ描画[pdf]
個人的には,最後のドキュメント(pdf)が,サンプルプログラムも多く載っていてよかったです.

4, 注意

先ほど示した方法では,必ずノード同士に「ランク」というものが存在するため,ソーシャルグラフのようなグラフはかけません.
そこで,

dot -Kneato -Tpng test.dot -o test.png

というように,-Kneatoというオプションをつけて実行することで,ランクを持たないグラフを書くことができるようです.
そうすると,先ほどのグラフは

test.png2回目

test.png2回目


となります.

5, おまけ

最後に,サンプルとして最初に載せたグラフのコードを載せて置きます.

digraph G{
  size="4,4"; //画像の大きさを指定
  ratio=fill    //画像の大きさまでグラフを引き延ばすように指定

/Homeの形と塗りつぶす色,塗りつぶすことを指定
  Home [shape=house, fillcolor="#FFE4C4", style=filled];

//線の色を指定
  edge [color="#000080"]

//ノードの塗りつぶす色,フォントなどを指定
  node[fillcolor="#E6E6FA", style=filled, fontname="monospace"];
  Home -> Internet
  Office -> Internet
  Internet -> amazon
  Home -> Office [weight=4];
  Home -> Gym
  Home -> Park
  amazon -> Home [weight=2];
  Nengajo -> Home
  Office -> Nengajo
  Super_Market -> Home
  Gym -> Super_Market
}

12 月 06

ケータイに大事なメールが来るのに、会議が始まってケータイが見れない!
ケータイを家に忘れてきた!

なんて時にパソコンからそのメールを見て、返信することが出来たら便利かも。

ということで、Gmailを利用して、ケータイに来たメールに返信する方法を紹介します。

方法

1,ケータイのメールを転送

これはケータイによって設定方法が異なるのですが、まずケータイのメールをgmailに自動転送するように設定します.

2,Gmailのフィルタを設定

ケータイからのメールがいちいちGmailの新着メールとして表示されるのは鬱陶しいので,フィルタを設定して,既読にし,さらにラベルを付けて特定のフォルダに保存します.

ここからフィルタの設定へ

ここからフィルタの設定へ

宛先にケータイのメールアドレスを設定

宛先にケータイのメールアドレスを設定


なお、メーリングリストなど,宛先がケータイのアドレスではないメールには適用されないため、必要であれば別途設定してください.
フィルタの設定

フィルタの設定


ここでは、既読にしてmobileというラベルをつけ、受信フォルダを飛ばして、アーカイブしてます.

これで、ケータイにきたメールを必要なときだけ、Gmailから見ることが可能になります.

ブラウザを使ってみる場合は,絵文字もちゃんと表示されます.
メールソフトで受信した場合は文字化けすると思います.

3,ケータイのメールアドレスから返信

ここまでで,パソコンからケータイにきたメールを受信できるようになったので,それにパソコンから返信しましょう.

まずはgmailの右上の方の「設定」のアカウントタブから,「他のメールアドレスを追加」を選びます.

新たにウィンドウが開くので,そこでケータイのメールアドレスを入力すると,ケータイに確認メールが送られ,確認が完了すると,次回からGmailメールの差出人にケータイのメールアドレスを選択できるようになります.

これで,Gmailからケータイのメールアドレスでメールを送信することができるようになります.