Archive for the ‘楽しいコーディング’ category

NetBeans IDE 6.7のRubyでコードカバレッジが気持ちイイ!

7月 9th, 2009

フラクタルな品質

最近ソースの『品質』が気になる! 20代だったら気合で作っていたな。気合でデバッグして。 だけど、やはり足場あためないとね。コードレベルでも。 すべてはフラクタル構造なのでコードレベルから固めていかないとね。

コードカバレッジ

RubyでコードカバレッジをRcovを使ったが、もっと簡単に出来ないかと調べていた。

やはり、NetBeans IDE 6.7のリリースに含まれていそうとのこと、早速インストール。

すげ~、簡単にRubyのカバレッジが取得できます!^^v しかも、ソース行単位で実行されたかされてないか緑と赤の背景色で一目でわかります。 エンジニアは左脳に寄りがちだから、 このような感覚的なツールは使っていて気持ちいいです!

NetBeans IDE のダウンロードはこちらから。

Restful_authenticationとforgot_passwordで楽々ユーザ認証!

7月 3rd, 2009

Railsのプラグイン『restful_authentication』と『forgot_password』で楽々にユーザ認証部分が作れます。 restful_authenticationは、ユーザ登録やEメールを送ってEメール上のリンクをクリックしないと本登録にならないようなフローなども設定できます。 ログイン処理と、ログインされていないと表示出来ない設定もページ単位で簡単に出来ます。 ここらへん、まじめに作ると結構骨が折れますね。。。

こんな時に、『restful_authentication』と『forgot_password』を使うと汎用性の高いユーザ認証部分が手軽に作れて便利ですよ!

下記、インストールメモです。

ローカル環境上でgitコマンドの準備

私はWindows環境だったので下記URLからGitをダウンロードしてインストール
http://code.google.com/p/msysgit/downloads/list

RailsプロジェクトへPluginの導入

Railsプロジェクトのルートで、下記コマンドを実行
script/plugin install git://github.com/technoweenie/restful-authentication.git
script/plugin install git://github.com/greenisus/forgot_password.git
上記Netbeansからでは入らなかったのでコマンドで実行

ユーザ認証コードをGenerate

script/generate authenticated user sessions --include-activation
script/generate forgot_password forgot_password user
出力されるコードが一部間違っているので下記修正 # 50行目をコメントアウト
#PasswordMailer.deliver_reset_password(@user)
ForgotPasswordMailer.deliver_reset_password(@user)
routeも勝手に追加してくれます。 しかし、下記Routeは追加が必要です。
map.activate '/activate/:activation_code', :controller => 'users', :action => 'activate', :activation_code => nil
ApplicationControllerに下記1行を追加
include AuthenticatedSystem

DB作成

rake db:migrate

ログイン画面を開く

http://localhost:3000/loginをアクセスしたらRouteエラーが出た
ActionController::RoutingError in Sessions#new
Showing app/views/sessions/new.html.erb where line #3 raised:
session_url failed to generate from {:controller=>"session", :action=>"show"} - you may have ambiguous routes, or you may need to supply additional parameters for this route.  content_url has the following required parameters: ["session", :id] - are they all satisfied?
Extracted source (around line #3):
rake routesを実行してRoutesの設定確認を行った。 ログイン画面の、下記パスを認識してくれないので、書き換えました。
<% form_tag session_path do -%>を <% form_tag :controller => 'sessions', :action => 'create' do -%>に書き換えた
無事に会員登録(仮登録、本登録)、ログイン認証、パスワード再発行まで自動で出来ました!

これは、会員系のサービス作るのであればすごく手軽に作れます。

皆様もお試しください。
参照:http://www.func09.com/wordpress/archives/348

4月21日(火)はJJUG主催CCC@代々木に行こう!(無料)

4月 16th, 2009

来週火曜日、4月21日はJJUGのクロスコミュニティカンファレンスに行きませんか? Andoroidで拡張現実を作った今村さんからのMixiお誘いに便乗。

お時間調整できる人、一緒に行きましょう!

開催にあたって

日本Javaユーザグループ(JJUG)は、「コミュニティのコミュニティ」、「Javaに閉じず」をコンセプトに活動を行なってきました。CCC(クロスコミュニティカンファレンス)は、そうした活動の、年に二回の集約点です。 今回は、OracleのCoherenceの開発者の一人、Brian Oliver氏を基調講演に迎えて、「クラウドを支えるグリッド技術」について講演願います。 今年は、クラウド関連のセッションが多いのが一つの特徴です。 「クラウドの特徴について」「Google App Engineについて」「SunのOpen Cloud Platformについて」「Amazon+Hadoop」といったセッションが予定されています。注目すべきは、Modegrammingという新しい枠組みを提唱している浅海智晴氏の「Agile Modegramming for Cloud」というセッションです。また、JJUGに始めて、マイクロソフト社の萩原正義氏が、MSのクラウド技術をテーマに登壇するのも見逃せません。また、Slim3の構想を温めているひがやすを氏が、きっと面白いお話をしてくれると思います。 その他にも、IBM Jazz, WebBean, Java FX, Scala, Android, UIなど、豊富な内容のセッションが用意されています。入門者向けのハンズオン企画もあります。 様々なコミュニティが一堂に会するこの場で、新しい技術情報を交換し、さまざまな議論に耳を傾け、フェース・トゥ・フェースで、開発者間・コミュニティ間の親睦を深めましょう。 きっと有意義な一日になるはずです。 JJUG 会長 丸山 不二夫  

開催概要

開催日時 2009年 4月 21日 (火) 9:30 – 19:25 (9:00 開場)
会場 国立オリンピック記念青少年総合センター 東京都渋谷区代々木神園町3-1 小田急線参宮橋駅下車徒歩7分/ 地下鉄千代田線代々木公園駅下車徒歩10分  >> 会場までの地図
参加費 無料
申込方法 こちらよりお申し込み下さい。 (申し込みページ運営 : 株式会社ジャスミンソフト)
主催 日本 Java ユーザグループ
詳細は、http://www.java-users.jp/contents/events/ccc2009spring/index.htmlをご覧ください。

オープンソースは、彼が作った!

4月 11th, 2009

コピーライト(著作権)とは、異なるコピーレフトを提唱。 ソースコードは隠蔽するものではなく、オープンでみんなで分かち合うものだとしたフリーソフトウェア運動をの中心人物。 今のLinuxや、あらゆるソフトウェアが無償で手に入る世の中を作ったのは、この人が居たから。

エンジニアだったら知っているGCCや、emacsや GNU makeなどをも彼の作品。 中学時代、SHARPが純正で作ったCC(Cコンパイラ)より、GCCのほうが綺麗なアセンブリを吐いたことで驚いた!

ある種教祖的な存在でハッカーの間では知らない人は居ない。 とても、アナーキーな人で僕は好きです。

参照、http://ja.wikipedia.org/wiki/リチャード・ストールマン 

リチャード・ストールマン   リチャード・ストールマンと梨木

お会いしてもやはり、グルな感じでした。。

Twitterしたら、自動でMixiエコー作ったよ!! 『twitter2mixi.rb』

4月 9th, 2009

今日、作りました!

Twitterしたら自動で自分のMixiエコーを書いてくれるプログラム~。

梨木のTwitterが自動で梨木のMixiエコーに投稿してくれます!! TwitterMailも一緒に使って携帯からすぐにポストできます。 http://twittermail.com/

twitter2mixi

twitter2mixi.rb

#!/home/cyberwave/local/bin/ruby -Ks
require 'rubygems'
require 'mechanize'
gem('twitter4r', '&gt;=0.2.0')
require 'twitter'
require 'open-uri'
require 'kconv'
require 'yaml'
require 'csv'
 
# 環境準備
# gem install twitter4r
# gem install mechanize --version "= 0.8.5"
 
# コンフィグ情報読込
config = YAML.load_file(File.expand_path(File.dirname(__FILE__)) + '/twitter2mixi.yaml')
 
# twitter つぶやき取得
twitter = Twitter::Client.new(:login =&gt; config['twitterusername'], :password =&gt; config['twitterpassword'])
timeline = twitter.timeline_for(:user)
status = timeline[0]
puts status.user.screen_name, status.text.toutf8
twitterlaststatus = status.text.toutf8
if twitterlaststatus == nil
  exit
end
 
# つぶやき更新状況の確認
f = open(config['statustempfile'])
mixilaststatus = f.gets
f.close
print mixilaststatus
 
if mixilaststatus == nil || twitterlaststatus.chomp != mixilaststatus.chomp
  puts "Mixiエコーを更新します。"
  f = open(config['statustempfile'], 'w')
  f.puts twitterlaststatus.chomp
  f.close
 
  # Mechanizeの初期化
  agent = WWW::Mechanize.new
 
  # Mixiへ ログイン
  puts "login to mixi by #{config['mixiusername']}"
  page = agent.get('http://mixi.jp/')
  form = page.forms[0]
  form.fields.find {|f| f.name == 'email'}.value = config['mixiusername']
  form.fields.find {|f| f.name == 'password'}.value = config['mixipassword']
  form.fields.find {|f| f.name == 'next_url'}.value = '/home.pl'
  page = agent.submit(form, form.buttons.first)
 
  # mixi エコー を開く
  puts 'open echo page.'
  page = agent.get("http://mixi.jp/recent_echo.pl")
 
  # エコー書き込み
  form = page.forms[1]
  form.fields.find { |f| f.name == 'body' }.value = twitterlaststatus.toeuc
  page = agent.submit( form,form.buttons.first )
 
  puts 'Mixiエコー更新成功!'
end

twitter2mixi.yaml

twitterusername: (Twitterアカウント)
twitterpassword: (Twitterパスワード)
mixiusername: (Mixiアカウント)
mixipassword: (Mixiパスワード)
statustempfile: (テンポラリファイルへのパス)

Mixiな皆様、これ見てください!梨木のMixi足あと公開中。

3月 23rd, 2009

Rubyは楽しいな。簡単にいろいろ作れる。

今日は、Mixiの足あとをハックしました。
梨木のMixiに訪れると、「梨木を読む」の右側のサイドメニューに訪れた人のプロフ画像が張られます~。

Mixi利用者皆様、僕のMixiに遊びに来てくださいね~。

梨木のMixiアドレス
http://mixi.jp/show_friend.pl?id=12876

mixiLog.rb

#!/usr/local/bin/ruby -Ks
require 'rubygems'
require 'mechanize'
require 'open-uri'
require 'kconv'
require 'yaml'
require 'csv'
# 環境準備
# gem install mechanize --version "= 0.8.5"
# コンフィグ情報読込
config = YAML.load_file(File.expand_path(File.dirname(__FILE__)) + '/mixilog.yaml')
# Mechanizeの初期化
agent = WWW::Mechanize.new
# Mixiへ ログイン
puts "login to mixi by #{config['username']}"
page = agent.get('http://mixi.jp/')
form = page.forms[0]
form.fields.find {|f| f.name == 'email'}.value = config['username']
form.fields.find {|f| f.name == 'password'}.value = config['password']
form.fields.find {|f| f.name == 'next_url'}.value = '/home.pl'
page = agent.submit(form, form.buttons.first)
if /url=([^"])"/ =~ page.body
link = 'http://mixi.jp' + $1.to_s
agent.get(link)
end
# 友達リスト初期化
friendArray = []
accessCount = 0
# 「足あと」を2ページ取得
puts 'get show_log.'
2.times {|pageno|
page = agent.get("http://mixi.jp/show_log.pl?page=#{pageno+1}").body.tosjis
htmlDoc = Hpricot(page)
# 総アクセス数の取得
if pageno==0
accessCount = htmlDoc.at("div.logListCenter/p/strong").inner_html
end
# 足あとから友達の情報を取得
(htmlDoc/"ul.logList01/li").each do |oneFriend|
datetime = oneFriend.at("span.date").inner_html
name = oneFriend.at("span.name/a").inner_html
link = oneFriend.at("span.name/a")['href']
friendid = link.scan(/id=\d*/)[0][3..10]
if friendArray.assoc(friendid)==nil
friendArray &lt;&lt; [friendid, name, datetime, link]
end
end
}
# マイページ総アクセス数を書き出し
thisyear = Time.now.strftime("%Y")
today = Time.now.strftime("%Y/%m/%d")
time = Time.now.strftime("%H:%M:%S")
outfile = File.open(config['mixilogpath'] + '/mixilog' + thisyear + ".csv", 'a')
CSV::Writer.generate(outfile) do |writer|
writer &lt;&lt; [today, time, accessCount]
end
# 友達プロフィール画像を取得
puts 'get new friend profile image'
friendArray.each { |oneFriend|
# 友達画像ローカルファイル名
imageFileName = "/#{oneFriend[0]}.jpg"
# 友達の画像が無ければ取得
if not File.exist?(config['imagecachepath'] + imageFileName)
# 友人のプロフィール画像をローカルへコピー
puts 'create ' + config['imagecachepath'] + imageFileName
# 友達のプロフィール画像URL取得
page = agent.get(oneFriend[3]).body.tosjis
htmlDoc = Hpricot(page)
friendProfileImageUrl = htmlDoc.at("div#myProfile/div/img")['src']
# open.
dstFile = File.open( config['imagecachepath'] + imageFileName, "wb" )
srcFile = open( friendProfileImageUrl, "rb" )
# copy.
dstFile.write( srcFile.read )
# close.
dstFile.close
srcFile.close
end
}
# 足あとHTML作成
puts 'writing ashiato html file'
ashiatoHtmlFile = File.open(config['ashiatoHtmlFile'],'w')
update = Time.now.strftime("%m/%d %H:%M")
count = 0
friendArray.each { |oneFriend|
width = 48 - count
if width &lt; 8
width = 8
end
ashiatoHtmlFile.print "&lt;a href="http://mixi.jp/show_friend.pl?id=#{config[" target="_blank"&gt;&lt;img src="\" border="0" alt="#{oneFriend[1].toutf8}" hspace="0" vspace="0" width="#{width}" align="middle" /&gt;"
count += 1
if count&gt;=config['number']
break
end
}
ashiatoHtmlFile.print "&lt;br /&gt;"
ashiatoHtmlFile.print "&lt;span style="font-size: xx-small;"&gt;Last Update:#{update}&lt;br /&gt;Powered by &lt;strong&gt;mixiLog&lt;/strong&gt;.&lt;/span&gt;"
ashiatoHtmlFile.close

mixilog.yaml

username: (あなたのMixiアカウント)
password: (あなたのMixiパスワード)
mixiid: (あなたのMixiId)
imagecachepath: (プロフ画像書き出しディレクトリフルパス)
imagecacheurl: (上記プロフ画像のURL)
mixilogpath: (アクセス数保存先)
ashiatoHtmlFile: (足あとHTML出力名)
number: (足あと出力数)

今日から始まるRuby:Desknets2ical.rb、Step3 『sftpで自動ファイル転送編』

3月 16th, 2009

今回つくろうとしている、Desknets2icalですが、社内のWindows上で実行しそこからGoogleカレンダーのアクセスできるところにiCalをアップロードできるように考えています。

前回までで、iCal生成は出来ましたので、今回はこのiCalを任意のサーバーにアップするために、sftpを実行します。これが出来れば、社内のDesknetsデータをiCal形式にして任意のサーバーに公開できます。そこのURLをGoogleカレンダーに設定すればDesknetsがGoogleカレンダーにインポートできます!

では早速、net-sftpをインストールしなければいけないのです下記コマンドにインストールして下さい。

gem install net-sftp

私はここでgemのバージョンが低いとエラーが出てしまいましたのでgemのバージョンアップを行いました。

gem update --system
gem install net-sftp

無事にnet-sftpもインストールできましたね。

それでは、メインの下記スクリプトを実行してみてください。プログラム中の、usernameとpasswordとアクセス先は任意に変更してくださいね。 たった、3行でsftpがかけてしまうんですね。簡単です! 今日もこれで、desknets2icalの製作が一歩近づきました

step3_scpConnect.rb

require 'net/sftp'
# sftp接続
# yourhost.jp、yourusername、yourpasswordは書き換えてください
Net::SFTP.start("yourhost.jp", "yourusername", :password =&gt; 'yourpassword') do |sftp|
sftp.upload! './step3_scpConnect.rb', '/your/host/path/step3_scpConnect.rb'
end

今日から始まるRuby:Desknets2ical.rb、Step2 『iCalファイルの生成編』

3月 11th, 2009

前回のデスクネッツデータをCSVデータ読み込みは簡単だったですね? その時間をiCal形式にしなければいけません。

Rubyでは、icalendarライブラリをインストールしていなければいけません。

gem install icalender

インストールできましたか? icalenderライブラリと、gemという手軽なライブラリ取得プログラムのお陰で、iCalデータを超簡単に作れます! ファイルフォーマットを知らなくても作れてしまうんです。 嬉しいですね、作りたいプログラムを粘土細工のようにサクサク作れてしまいます。

step2_icalMake.rb

require 'rubygems'
require 'icalendar'
require 'kconv'
# iCalオブジェクトの生成
cal = Icalendar::Calendar.new
# イベントを作成
cal.event do
dtstart       DateTime.new(2009, 03, 09, 10), {'TZID' =&gt; 'Asia/Tokyo'}  # 変更箇所
dtend         DateTime.new(2009, 03, 10, 11), {'TZID' =&gt; 'Asia/Tokyo'}  # 変更箇所
summary       "社内会議"
description   "Aプロジェクト進捗会議"
end
# STANDARD コンポーネントを生成
standard_component = Icalendar::Component.new('STANDARD')
standard_component.custom_property('dtstart', '19700101T000000')
standard_component.custom_property('tzoffsetfrom', '+0900')
standard_component.custom_property('tzoffsetto', '+0900')
standard_component.custom_property('tzname', 'JST')
# VTIMEZONE コンポーネントを生成
vtimezone_component = Icalendar::Component.new('VTIMEZONE')
vtimezone_component.custom_property('tzid', 'Asia/Tokyo')
vtimezone_component.add(standard_component)
cal.add(vtimezone_component)
# iCalファイル生成
File.open("sample.ics", "w+b") { |f|
f.write(cal.to_ical.toutf8)
}

今日から始まるRuby:Desknets2ical.rb、Step1 『CSVの読込編』

3月 9th, 2009

今日から始まるRuby、Desknets2icalを作るよ! 第1回目は、デスクネッツの吐き出すCSVデータをRubyで読み込む方法です。 僕も先週から本格的にRubyをはじめたので、構文あまあまだと思います。 (Ruby達人いたらどんどんコメント頂いた、よりルビストになれる書き方ご指南をいただければ幸い^^)

デスクネッツからスケジュールを吐き出すと、1行目がヘッダ情報で、2行目がユーザ情報になります。 ですので、3行目からCSVデータをパースして見ます。

step1_desknetsFileRead.rb

require 'csv'
require 'kconv'
ary = Array.new
# Desknetsのエクスポートデータの読み込む
CSV.open("./desknets_exp.csv", 'r') do |row|
ary &lt;&lt; row
end
ary.shift
ary.shift
ary.each do |one|
# 開始日と終了日の取得
startday = one[3]
endday = one[5]
# 開始時間と終了時間の取得
starttime = one[4]
endtime = one[6]
if starttime == nil
starttime = ''
end
if endtime == nil
endtime = ''
end
# 予定のタイトルと内容の取得
subject = one[7]
memo = one[8]
where = one[9]
if subject == nil
subject = ''
end
if memo == nil
memo = ''
end
if where == nil
where = ''
end
# 画面出力
puts startday + " " + starttime + " ~ " + endday + " " + endtime + " | " + subject + " " + memo + " " + where
end

ソースコードが見やすい、ソースコードがカラフルに!

3月 6th, 2009

コードハイライターをMTに入れました。
今、Rubyかじってます。

Google Code Prettifyと、
SHJS入れましたが、SHJSが良い感じでした。
テーマが40種類近くあるんですよ。
僕は、Acidテーマにしました!
綺麗でしょ。


 

require 'rubygems'
require 'icalendar'
require 'kconv'
# iCalオブジェクトの生成
cal = Icalendar::Calendar.new
# イベントを作成
cal.event do
dtstart       DateTime.new(2007, 07, 02, 10), {'TZID' => 'Asia/Tokyo'}  # 変更箇所
dtend         DateTime.new(2005, 07, 02, 20), {'TZID' => 'Asia/Tokyo'}  # 変更箇所
summary       "Meeting with the man."
description   "Have a long lunch meeting and decide nothing..."
klass         "PRIVATE"
end
# STANDARD コンポーネントを生成
standard_component = Icalendar::Component.new('STANDARD')
standard_component.custom_property('dtstart', '19700101T000000')
standard_component.custom_property('tzoffsetfrom', '+0900')
standard_component.custom_property('tzoffsetto', '+0900')
standard_component.custom_property('tzname', 'JST')
# VTIMEZONE コンポーネントを生成
vtimezone_component = Icalendar::Component.new('VTIMEZONE')
vtimezone_component.custom_property('tzid', 'Asia/Tokyo')
vtimezone_component.add(standard_component)
cal.add(vtimezone_component)
File.open("sample.ics", "w+b") { |f|
f.write(cal.to_ical.toutf8)
}