2008/10/28

第1回北海道情報セキュリティ勉強会の予習

関連:[-*煙猴*-]: 「北海道情報セキュリティ勉強会」が開催されます

いよいよ今週、11/1(土)に開催が迫った、第1回北海道情報セキュリティ勉強会。参加の前に、発表者の予習をしておくと、より楽しめるのではと思いましたので、以下に列挙します。

●まっちゃだいふくさん
まっちゃだいふくの日記★とれんどふりーく★
まっちゃ139 Hiki
まっちゃ445勉強会
●サイボウズ・ラボ 竹迫良範さん
TAKESAKO @ Yet another Cybozu Labs
Webエンジニア武勇伝 第29弾 竹迫良範 氏 | サイボウズ・ラボ(Cybozu Labs)

また、今回の勉強会の発起人は以下の3名の皆さんです。発起人の皆さんのご尽力のおかげで、貴重な勉強会の北海道での開催が実現しました。一参加者として感謝の意を表します。
●蒲田さん
・(Webサイトが見つからなかったので代わりに)CLR/H
●ナオキさん
なお記
●iwmtさん
じゃば開発者の独り言

あぁ、楽しみだなぁ。

2008/10/27

@AngraMainyu:FavotterのRSSを取得して投稿する

@AngraMainyuに新機能追加。Favotter人気タブのRSSを取得して、最新1件を投稿する。Favotterに負荷がかからないよう、1日2回にした。


#! /usr/bin/ruby

require "time"
require "rubygems"
gem "twitter4r"
require "twitter"
require "pit"

require 'rss/2.0'
require 'open-uri'

begin
open('http://favotter.matope.com/rss.php?mode=best') do |http|
response = http.read

result = RSS::Parser.parse(response, false)

post = result.items[0].description
# 本当はpの前の空白はありません。
post.gsub!(/< p align=\"right\">.+?fav by/,'')
post.gsub!(/<.+?>/,'')
post.sub!(/\s/,' posted: ')
link = result.items[0].link

mess = ".@" + post + " " + link

config = Pit.get("AngraMainyu")
cl = Twitter::Client.new(config)
cl.status(:post,mess)
end
rescue
print "RuntimeError: ", $!, "\n";
end

WassrのAPIをRubyから使ってみる

参考:Wassr API Document - Wassr [お気軽メッセージングハブ・ワッサー]

(1)投稿。

#! /usr/bin/ruby -Ku

require 'uri'
require 'net/http'
require 'kconv'

begin
Net::HTTP.version_1_2
mess = Kconv.kconv("テストだよ!",Kconv::UTF8)
wmess = 'status=' + URI.escape(mess)

req = Net::HTTP::Post.new("/statuses/update.json?")
req.basic_auth "USERNAME","PASSWORD"
Net::HTTP.start('api.wassr.jp',80) {|http|
response = http.request(req,wmess)
}

rescue
print "RuntimeError: ", $!, "\n";
end

(2)タイムライン取得。
/statuses/public_timeline.xml→パブリックタイムライン
/statuses/friends_timeline.xml→フレンドタイムライン
/statuses/user_timeline.xml?id=USERNAME→指定したUSERの発言フィード
/statuses/sl_timeline.xml?id=USERNAME→SecondLifeのタイムライン(だと思う)

#! /usr/bin/ruby -Ku

require 'uri'
require 'net/http'
require 'rexml/document'

begin

Net::HTTP.version_1_2
req = Net::HTTP::Get.new('/statuses/friends_timeline.xml')
req.basic_auth("USERNAME","PASSWORD")

xml = Net::HTTP.start('api.wassr.jp',80) {|http|
http.request(req).body
}
doc=nil
doc=REXML::Document.new xml
doc.elements.each('statuses/status') do |elm|
print elm.elements['user/screen_name'].text.to_s.ljust(12)
print elm.elements['text'].text.to_s
print "\n"
end

rescue
print "RuntimeError: ", $!, "\n";
end

2008/10/26

穴の開いたジーンズをリペアした

10年くらい前に購入し、愛着あって履いていたジーンズの膝に大穴が開いてしまいました。ジーンズ自体はLevi's 517 REDLOOPで、まぁそんなに高価なものではないのですが、さすがに長年履いていると、膝に穴が開いたくらいで捨てるのは忍びない。ついでに新しいジーンズを買うような金も無い。そこで元手芸店の叔母にリペアしてもらいました。

こんな感じ。両膝とも結構大きな穴が開いていたのですが、裏布を当てて、ミシンでガタ縫いしてあります。さすが元手芸店をやってただけあって、ジーンズ用のミシンでさくさく修理してくれました。遠目に見るとあんまり目立ちませんね。

アップにしても、ちゃんと穴が塞がってます。ばっちりOKです。ついでに股ズレしていた部分も直してくれました。そっちはどうせ人の目にほとんど触れないところなので、気にもなりません。

一時期流行したダメージジーンズみたいなのはあまり好きでは無いのですが、これくらいならそんなに目立たないし、何より大事にしていた服がまた着れるというのは嬉しいものです。まだまだ履いてやろうと思います。ありがとう叔母さん!

2008/10/25

札幌Ruby会議01に参加してきました

関連:[-*煙猴*-]: 札幌Ruby会議01の参加登録が始まりました

今日はずっと楽しみにしていた札幌Ruby会議01でした。今日は前もって仕事を休みに設定してたので、たっぷり余裕を持って参加できました。来週の北海道情報セキュリティ勉強会とは大違いです(夜勤明けで参加になるんですよね...)

スイーツ懇親会は僕が予想していたものと大違いで、皆さん大量にお菓子を持ち合ってました。ケーキだと銘菓詰め合わせだのが並んでました。こんなに本気なものだったのか...僕もたくさん買っていけば良かった。

artonさんのセッションはActive Script Rubyに関するもので、業務上Windowsサーバの構築/運用が多い僕にとってすごく興味深いものでした。やっぱりWMIはちゃんと勉強する必要がありそうでした。しかしartonさん節はすごく面白かったです。豪快なお方でした。

hsbtさんはtDiaryのセッション。このBloggerに移行するまではtDiaryを使っていたので、pluginの話など面白かったです。tDiaryはシンプルで良いBlogシステムだと思います。

関さんのdRubyの話は、関さん自体の話の持っていき方がすごく面白かったのもありますが、僕としては特にBuzztterのお話が面白かったです。Twitterにも投稿しましたが、Buzztter は Twitter の中の人と連絡を取って、 60 秒キャッシュ制限のない Public Timeline からデータ取得してるそうです。どうやって収集しているのかすごく不思議だったのですが、これで謎が解けました。

もちろんLTも全部面白かったです。
(5分で分かる Measure)
(Sapporo RubyKaigi01 twada LT)

LTを経て最後は角谷さんのテストの話。内容ももちろん興味深かったのですが、角谷さんは本当にプレゼンが上手かったです。人を惹きつけるプレゼンってこういうことを言うのだなぁと感じました。
(札幌Ruby会議01で発表してきました - 角谷HTML化計画 (2008-10-25))

全体的に発表者のレベルがすごく高くて、LTを含めどの話も興味深く、飽きることなく聞かせて頂きました。僕のレベルだと難しいと感じたものももちろんあるのですが、発表の仕方が丁寧かつユーモアを挟みながらだったので、とても面白かったです。札幌Ruby会議02も島田さんが宣言されていたので、次回もぜひ参加させて頂きたいです。

最後になりますが、主催のRuby札幌の皆さん、発表者の皆さん、お疲れ様でした、そしてありがとうございました!

さて、その勢いで@dabesaと@AngraMainyuのデバッグをして、ついでに@dabesaをWassrにも登録させました。
dabesa - Wassr
WassrのAPIも少し勉強したいですね。今後の課題として、WMIとCGI.rbは勉強したいと思います。

2008/10/24

スープカレー:ORGANIC SOUP COLOMBO

ORGANIC SOUP COLOMBO

中央区北4条西4丁目、札幌国際ビル地下1階。札幌の老舗カレー屋「カリーハウス コロンボ」の姉妹店です。スープ専門店なのですが、スープカレーもあるということで行ってみました。

オシャレな店先。見た目どおり女性客が多い、というか僕が来店したときには僕以外全員女性客でした。スープ専門店なだけに様々なスープがあり、5種類の日替わりスープが用意されています。僕はスープカレーが目当てだったので、チキンスープカレーセット(\880)を注文。ラッシーがセットになっています。前金制で、また食器は自分で下げる形になります。

待つことなく、すぐに出てきました。食べてみると...あれ、なんだこれ。美味い。美味いぞこれ!スープカレーというより、ルーカレーに近い味わいなのですが、深みとコクがすごいです。普通のスープカレーのように、辛くは無いし、こってりもしていないんだけど、なんというか、スープとしての完成度がめちゃくちゃ高い。スープカレーじゃなく、スープとして抜群に美味いです。

具材はチキン、じゃがいも、ニンジン、チーズ、ブロッコリー、しめじ、卵。チキンは柔らかく煮込まれていてジューシーです。溶けたチーズがまた美味しい。ご飯は少なめだけど、スープのボリュームがたっぷりなので、男性でも満足できるんじゃないでしょうか。


スープカレーとして食べると物足りないのかも知れませんが、スープとして食べると満足度が高いです。カレーだけじゃなくて、他のスープもぜひ飲んでみたい。女性客で繁盛しているのも頷ける、これは名店かも知れませんね。

2008/10/23

会社は「出張先で遊ぶこと」を推奨すべきだ

業務上の都合で、出張に行く、という機会は良くあると思います。そんな時、仕事だけしかしていなかったりしませんか?それは個人だけでなく会社としても損だと思います。もちろん仕事をちゃんとこなすことも大事です。でも折角普段は来れない、遠い場所に来たのだから、そこで何かを得るために時間を使うことは、会社としても推奨するべきです。

例えば、その土地でしか見れないものを見たり、なかなか会えない人に会ったり、食べたこと無いものを食べたり。もちろん研修を受けたり、イベントに参加するのも良いでしょう。でもそれだけじゃなくて、遊ぶことだって大事だと思います。その全てが経験になり、全てが成長の糧になると思います。それは(もしかしたら)いつか仕事にとっても役立つかも知れません。例え直接的に仕事に役立たなくても、そういった「遊び」が個人の能力を高めるために絶対に必要だと僕は思います。

僕自身、出張で遠地に行った際には、どこかで遊ぶ時間を設けようとしますし、部下にも「余裕があるなら1泊追加して遊んで来い」と言ってます。遊ぶほど時間が取れないならば、せめて美味いものを食べてくるべきです。会社として、出張という機会を新しい経験を学ぶ場としても使うよう、どんどん推奨するべきだと思います。

2008/10/20

Hip-Hop Awards 2008

アメリカのアフリカン・アメリカン向けケーブルTVチャネル、BETが主催で2006年より行っているHip-Hop Awardsが、今年も開催されます。



全部で14の賞があるのですが、まぁどの賞を見てもLil wayneばっか。今年の勢いはすごいですねー。Cash Money勢は元々JuvenileだったりBig Tymersだったり功者揃いではあるのですが、Hot Boy$でも気勢を上げたLil wayneの昨今の暴れっぷりは凄いものがあります。

また、Lil Wayne、Kanye West、Jay-z、T.I.と今年良作をリリースした面子に混ざって、ちょこちょこDJ Khaledがノミネートされてますね。確かに「We the best」は素晴らしい出来でした。マイアミの勢いが良く分かる作品でしたし。

Hip-Hop Awards 2008は10月23日に発表になります。勢いに乗ったLil wayneがどこまで行くかも含めて、楽しみですねー。

Tha Carter III
Tha Carter III
posted with amazlet at 08.10.20
Lil Wayne
Universal Motown (2008-06-10)
売り上げランキング: 2418

鳩サブレーはなんで鳩なのか

小ネタ続きです。

東京土産として不動の地位を固めている鳩サブレー。皆さんご存知ですよね。鎌倉の豊島屋が販売している、鳩の形をしたサブレー(クッキーの一種)で、子供だけでなく大人にも好きな人が多いです。羽田空港でも販売されており、僕も先日自宅と会社への土産に購入しました。土産として重宝する理由のひとつに「日持ちする」というのもあるかと思います。最近多いクリームが入ってたり要冷蔵だったりする菓子類は、帰宅してすぐ渡すにはいいけれど、数日置くには難しいです。その点サブレーなら時間が開いても大丈夫、冷蔵する必要もありません。

その鳩サブレー、なんで鳩の形なんでしょう?豊島屋のWebサイトによると、

もともと、鶴岡八幡宮を崇敬していた初代は、八幡さまの本殿の掲額の(八)の字が鳩の抱き合わせであり、境内に一杯いる鳩が子供達に親しまれているところから、かねて「鳩」をモチーフに何かを創ろうと考えていました。そこにサブレー・三郎のヒラメキが来ました。あたかも八幡太郎義家、源九郎義経のごとく、鳩三郎(鳩サブレー)となったのです。

とのこと。鎌倉だけに鶴岡八幡宮の鳩をモチーフとしているのですね。ずっと東京土産だとばかり思い込んでいてすみませんでした。また上記の鳩三郎とは、初代店主が呼んでいた愛称であり、製品名としては明治時代からずっと鳩サブレーだそうです。歴史あるお菓子なんですね。

我が家の子供たちも大好きなので、また機会があれば買って帰りたいと思います。

なぜフランスは名前にドールとつけたがるのか

小ネタです。

フランス料理レストランや、オシャレなカフェや、ケーキ屋さんや、何となくフランスぽいお店の名前は、末尾に「ドール」と付くものが多いような気がしませんか?例えば札幌で有名な菓子店コートドールだったり、モンドール・チーズだったり。

気になって調べてみたのですが、「ドール」=「d'Or」とはフランス語で「金の」を意味するそうです。つまり、
・Cote d'Or = 金の丘
・Mont d'Or = 金の山
という意味なのですね。

しかし、「なぜフランスではD'orとつけた名前が多いのか?」は検索しても分かりませんでした。縁起が良いんでしょうか。誰か知ってる人教えてください。

2008/10/19

ニンテンドーDSを修理に出したら新品になって返ってきた

関連:修理品発送キットを使ってニンテンドーDSを修理に出す

10月1日、上記の通り我が家のニンテンドーDSを修理に出しましたが、本日戻ってきました。

症状はこんな感じでした。DQ5のボス戦で、倒した瞬間に固まった時の気持ちはとても悲しかったです...
---
軽い衝撃で固まる。
蓋を閉じるときちんと休止状態にならない。
---

任天堂からの返答以下の通りです。
---
お預かりしておりましたゲーム機ですが、ご依頼された症状が再現せず、検査に
おいても異常が見つかりませんでした。念のため本体を交換しシリアルNO.も
変更させて頂きましたので、再度ご確認お願い致します。お手持ちの保証書に
お張り頂くシリアルNO.ラベルを同封致しました。
---

そして箱から出てきた新品のニンテンドーDS。修理代\0。

な… 何を言ってるのか わからねーと思うが(AA略)

世界の任天堂の力を垣間見ました。このユーザサポートの良さも、任天堂ハードウェアが爆発的に普及した要因なのかも知れません。

ニンテンドーDS Lite クリスタルホワイト
任天堂 (2006-03-02)
売り上げランキング: 114

読了・森見 登美彦:[きつねのはなし]

この作家はストーリーテラーとしても優れているのだなぁと感じさせてくれました。
ホラーでは無く怪談に近い、ヌメっとした質感がどの話の根底にもあります。京都が舞台ということで、琵琶湖の影響でもあるのか、池だったり雨だったり汗だったり、水がキーワードとして多く出てきますね。全体的に疾走感があるわけでなく、どちらかといえば淡々と語られていくのですが、その裏にしっとりと描かれた違和感が怖いです。
古都らしく、京都の和の魅力が満載なのも面白い。京都は余所者には冷たい土地と良く言われますが、一度住んでみたいところではあります。

きつねのはなし
きつねのはなし
posted with amazlet at 08.10.19
森見 登美彦
新潮社
売り上げランキング: 15419

読了・森見 登美彦:[太陽の塔]

---
何かしらの点で、彼らは根本的に間違っている。
なぜなら、私が間違っているはずがないからだ。
---

こんな言葉で始まる本作品。日本ファンタジーノベル大賞受賞、ということだが、すごく真っ当な青春小説です。非モテの。

恐らく全男子の80%は経験したことがあるだろう、自意識過剰で、でも自分なりの規律には厳しくて、もやもやでどんよりな行き場の無い感情に支配されていて、性欲に踊らされるのも少しずつ慣れ初めて、そして暴走する恋愛感情を制御できない、10代後半から20代前半にかけた、まぁ酷い時期ですよね。屈折した非モテ意識からモテコミュニケーションに反発して、男同士でアホなことして、また女子から蔑まれるという、悲しい男のサガです。
そんな主人公の日常譚ですが、悲壮感が満ちていなく、ある種読了後に爽快ささえ感じるのは、淡々とした口調、コミカルな表現、そして思わず感情移入してしまう独白でしょうか。随所に散りばめられた詩的表現もすごく心地よい。クリスマスイブという非モテには万死に値するイベントに向けて、鬱屈した感情が屈折した自我と相まって高まっていく、というのはこの時期身につまされる人も多いかと思いますが、すごく上手に話しを進めていくなと感じました。

男性にとってはすごく共感する部分の多いこの小説、僕はすごく面白かったし、多くの男子が読むと良いと思います。

太陽の塔 (新潮文庫)
太陽の塔 (新潮文庫)
posted with amazlet at 08.10.19
森見 登美彦
新潮社
売り上げランキング: 5031

2008/10/18

チューブトレーニング用のチューブを買った

僕は現在シフト制勤務となっているので、夜勤や休日出勤が多々あります。もちろん平日日勤と比較するととても暇なのですが、仕事中である以上激しい運動、汗をかく運動はし辛い。何か運動する方法が無いかなぁ...と考えて、チューブトレーニングなら最適なのでは無いかと思いました。思い立ったら吉日、早速夜間営業しているドンキホーテに行って購入してきました。¥1,880でした。


実際に使ってみると、結構な抵抗があるのに、丈夫というか、切れそうな危うさが無い。軽くサイドレイズとアームカールしてみましたが、ゆっくりやれば結構筋肉に負担がかかっている気がします。ちゃんと正しい使い方さえすれば、運動不足の解消になりそう。
よくゴム臭いといわれるチューブですが、これに関してはそんなに酷くなかったです。下ろし立てのゴム手袋程度でしょうか。時間を置けば薄くなるんだと思います、たぶん。

販売元のD&MのWebサイトに様々な使用方法が書いてあるので、これを見ながら少し頑張ってみようと思います。せめて来月の健康診断までに-3k(そこか)

2008/10/15

久しぶりに身体一杯フットバッグした

ここのところ仕事が忙しくて時間が取れなかったり、時間が取れても強風だったり真夜中だったりで、なかなか練習できなかったフットバッグ。今日は久しぶりに休みだったので、思いっきり練習しました。1時間強、トゥストール(Max372回)→サイドストール(Max21回)→キック(Max50回)→左右連続ATW(Max21回)→DEXの練習、と、練習不足のわりには結構頑張れたと思います。せっかくなので携帯電話で動画を撮影して、Youtubeにアップしてみました。

右インATW→左インATW→左PickUp→右Mirage→右Pixie→右ClipperStallの流れです。バランスが悪いから身体が流れまくってるし、ストールも細かくなっちゃってますね。完全に右足のDEXに集中していますが、どうも左足はうまく回せなくて...なかなか上達しなくてジレンマを感じているのですが、そろそろ無理を承知で新しい技の練習をしてみたいです。Clipper Pickupとかチャレンジしてみたいですね。

正直なところ、フットバッグもアサラトもポイも中途半端なまま上達せず、すごく悔しいです。でも少しずつ頑張りたい。一緒にフットバッグする仲間がいれば、もっと楽しくなるんでしょうが...道民フットバッグフレンド募集中です。

2008/10/13

僕のカッコいいバックルについて

そのカッコいいバックルがこれです。


僕は中学1年生のころからAEROSMITHの大ファンで、そのまま洋楽→HR/HMにかぶれていったのですが、当時キクヤ楽器の3階にあったアーティストグッズショップ(現在は無くなりました)で、大枚(¥3,800。中学生には大金)はたいて購入したのがこのバックルです。ずるずる使い続けて15年、いまだに愛着があって使い続けてます。さすがに30代を間近に控え、中2病全開のロックバンドバックルはどうなんだろうと思わなくも無いですが、自重はしません。AEROSMITH最高だ!

AEROSMITHも1973年の「野獣生誕」から既に35年。スティーブン・タイラーも還暦を迎えてしまいました。2004年の「Honkin' on Bobo」が最後のアルバムリリースですが、ニュー・アルバムの制作を始めているという情報もあり、ぜひ次のリリースに期待したいところです。

パンドラの箱
パンドラの箱
posted with amazlet at 08.10.13
エアロスミス
Sony Music Direct (2004-07-07)
売り上げランキング: 191434

Ruby基礎練習(2):Integerクラス

Integerクラスについて色々調べてみました。と言ってもStringと比べれば数は無いのですが。

nextで次の整数を返す。
---
> 10.next
11
> i=10
> i.next
11
---
timesで0から数-1だけ繰り返す。
uptoで数からmaxまで1ずつ増やしながら繰り返す。
downtoで数からminまで1ずつ減らしながら繰り返す。
stepで数からstepを足しながらlimitを超えるまで繰り返す。
ブロック引数(例で言う"|i|")は省略可能。それぞれ数じゃなく変数でも可。
---
> 3.times {|i| p i}
0
1
2
> 3.downto(1) {|i| p i}
3
2
1
>1.upto(3) {|i| p i}
1
2
3
> 1.step(6,2){|i| p i}
1
3
5
---

スープカレー:スープカリー hirihiri 大通店

スープカリー hirihiri

支店を多く抱える有名店hirihiri。一度行ってみたいと思いつつ、店舗の遠さから未食だったのですが、いつの間にか大通店が出来ていたので食べてきました。

場所は南1条西2丁目、南1条KビルのB1F。丸井今井の南側、スタバの隣の飲食店街です。

店内に入ってみると、時間が14時とズレていたため、客は僕ともう1名の男性。祝日なのに少ないです。
店内はちょっとアジアンぽいオシャレな感じなのに、なぜかHipHopが流れていました。メニューを選んでいる間、店内のバックスペースから
店員男「ちょー○○さーん、俺今日の晩飯超悩んでんすけどーあれっすかーフカヒレとかー」
店員女「あーいいですねー、フカヒレー、フカヒレハンバーグとか」
店員男「ちょwwwフカヒレハンバーグwwwいいっすねー」
とか会話が聞こえてきて、もうなんか絶望的な気分になりました。フカヒレハンバーグって何だよアホか。

気を取り直して「hirihiri骨チキチキン」を注文、辛さは5番までが無料なので5番にしました。味は...えっと...これといって特徴が無い。いや、しょっぱい。あれ、塩キツいです。うーん。これ全部食べるの厳しい。

チキンもそれほど柔らかくなく、骨の外れが良く無い。辛さも無料のMAXなのにたいしたことない。なんだ、この店たいしたことないぞ?

チェーン展開する有名店だったので、期待していたのですが残念です。正直なところ、店員の態度が悪いとどんな店でも美味しくなく感じるものですよね。せめてフカヒレハンバーグが無ければあともうちょっと評価上げれたのに。僕の中ではもう1回行く価値は見出せませんでした。

Ruby基礎練習(1):Stringクラス

1ヶ月くらい前からRubyを勉強し始めたプログラム初心者の僕ですが、基本的なことを再度復習します。
とりえずStringクラスについて色々調べてみました。

前提。
---
> str1="abc"
> str2="def"
---
str1、str2の内容を変更せず、str1とstr2を連結する。
---
> p str1 + str2
"abcdef"
---
str1の内容を変更し、str2をstr1に連結する。
---
> str1.concat(str2)
> p str1
"abcdef"
---
str1[i,j]で、iバイト番目からjバイトの部分文字列を返す。
---
> p str1[1,1]
"b"
---
指定したバイト範囲の部分文字列を破壊的に変更することも可能。
---
> str1[1,1] = "123"
> p str1
"a123c"
> str1[2,2] = ""
> p str1
"a1c"
---
正規表現でマッチした文字列を破壊的に変更する。
---
> str1[/b/] = "123"
> p str1
"a123c"
---
先頭の文字を大文字に、他を小文字に返す。破壊的メソッドもある。
---
> p str1.capitalize
"Abc"
> p str1
"abc"
> p str1.capitalize!
"Abc"
> p str1
"Abc"
---
downcaseで小文字を、upcaseで大文字を返す。swapcaseで大文字を小文字に、小文字を大文字にして返す。破壊的メソッドもある。
---
> str1.upcase!
"ABC"
> str1.downcase!
"abc"
> str1="AbC"
> str1.swapcase!
"aBc"
---
文字列を中央寄せ、左詰、右詰する。
---
> p str1.center(10)
" abc "
> p str1.ljust(10)
"abc "
> p str1.rjust(10)
" abc"
---
第2引数を指定すると、空白ではなく指定した文字列で埋める。ljust,rjustでも同様。
---
> p str1.center(10,"*")
"***abc****"
---
chompで改行を、chopで最後の文字(改行含む)を取り除く。改行は"\r"、"\n"、"\r\n"。破壊的メソッドもある。
---
> str="abc\r\n\r\n"
> str.chomp!
"abc\r\n"
> str.chop!
"abc"
> str.chop!
"ab"
> str.chomp!
nil
> p str
"ab"
---
subで最初にパターンマッチする部分を、gsubでパターンマッチする全ての部分を置換する。破壊的メソッドも可。
---
> str="abcdefabcdef"
> p str.sub(/cde/,"GHI")
"abGHIfgabcdef"
> p str.gsub(/cde/,"GHI")
"abGHIfgabGHIf"
---
reverseは文字列を反転する。破壊的メソッドも可。
---
> p str1.reverse
"cba"
---
reverseでは日本語がうまくいかない。後述するsplitで一文字ずつ分割し、反転すれば可能。
---
> str="あいう"
> p str.reverse
"\244いあ\202"
> p str.split(//).reverse.to_s
"ういあ"
---
splitは指定されたパターンで文字列を分割し配列に格納する。パターンが空文字列の場合一文字ずつ分割する。
---
> str="ab,cd,ef"
> p str.split(/,/)
["ab", "cd", "ef"]
> p str.split(//)
["a", "b", ",", "e", "d", ",", "e", "f"]
---
split.reverseで配列の順番を反転することが出来る。
---
> p str.split(/,/).reverse
["ef", "cd", "ab"]
---
split.joinで配列にせず指定した文字で分割が出来る。
---
> str="ab,cd,ef"
> p str.split(/,/).join("<>")
"ab<>ed<>ef"
---
stripで先頭と末尾の空白を取り除く。lstripは先頭の空白を、rstripは末尾の空白を取り除く。空白文字の定義は " \t","\r","\n","\f","\v"。破壊的メソッドも可。
---
> str = " abc def "
> p str.strip
"abc def"
> p str.lstrip
"abc def "
> p str.rstrip
" abc def"
---

2008/10/12

Rubyのopen-uriでProxy認証を越える

参考:proxy 認証の通し方まとめ

(1)環境変数を設定

export http_proxy=http://foo:bar@proxy.example.com:8080

(2)/usr/lib/ruby/1.8/open-uri.rbを編集

216c216
< klass = Net::HTTP::Proxy(proxy.host, proxy.port)
---
> klass = Net::HTTP::Proxy(proxy.host, proxy.port, proxy.user, proxy.password)

(3)簡単な動作試験

#!/usr/bin/ruby -Ks

require 'open-uri'

open('http://www.smokeymonkey.net/') do |http|
p http.read
end

exit

僕の大好きな納豆

僕が東京で単身赴任生活を送っていた時期を知っている人には既知の事実かも知れませんが、僕は納豆が大好きです。朝食は基本的に白米・納豆・味噌汁があれば幸せです。白米と納豆と味噌汁の無い生活なんて僕には考えられません。ヴィバ納豆!納豆ラブだ!

そんな納豆ですが、食べる機会が多いだけに、食べ方も多種多様です。そこで僕の食べ方をいろいろご紹介しようと思います。納豆嫌いな皆さんにも、ぜひ自分好みの食べ方を探してみてほしいですね。

【ベーシック】
・和ガラシ
基本中の基本。言うまでも無いですが、納豆は100回混ぜてから和ガラシと投入して30回混ぜ、その後醤油を入れるのが基本。混ぜる前に醤油を入れるなど言語道断です。
・ネギ
わけぎよりは一本ねぎのほうが納豆に合うと思います。
・鰹節
鰹節は好みがあるので入れない人もいるかと思いますが、僕は大量に投入する派です。
・海苔
細かい刻み海苔を入れるとより風味が増します。
・鶏卵
鶏卵は、「鶏卵自体が新鮮な場合」もしくは「納豆自体が美味しくない種類の場合」に使います。鶏卵を入れてしまうと完全に卵の味が勝ってしまうので、普段は入れません。

【薬味チェンジ】
・黒胡椒
意外と合うのが黒胡椒。この食べ方は昔の上司に教えてもらいました。よく混ぜた納豆に挽いた黒胡椒をたっぷりとかけます。白胡椒だと駄目で、ちゃんと食べる寸前にペッパーミルで挽いたほうが美味しいです。他人に勧めると大体「えー?」って顔されるんだけど、僕としてはぜひチャレンジして頂きたい。
・柚子胡椒
柚子の風味も納豆に合います。ただ好みは分かれると思うので、万人向きでは無いかも。最近はチューブの柚子胡椒も売っているので、手に入りやすくなりました。
・茗荷
茗荷自体が大好きなのですが、納豆にも良く合います。細かく刻んで納豆に混ぜると、茗荷の香りが匂って食欲をそそります。
・山ワサビ
普通のワサビより山ワサビのほうが納豆には合います。下ろし立ての山ワサビの香りは白米が進みますよね。
・大根下ろし
これはわりとベーシックでしょうか。少し強めに絞った大根下ろしでさっぱりと食べられます。醤油の代わりにポン酢でも可。
・紅葉下ろし
大根下ろしが合うのだから紅葉下ろしだって合います。大量に投入しちゃうのが難点か。
・オクラ
ダブルネバネバで美味しさ倍増、元気100倍です。白米に混ぜるよりは乗せたほうが、熱が伝わらなくて美味しいと思います。
・なめ茸
ダブルネバネバ第2弾。納豆となめ茸を混ぜたものを絹豆腐にかけて、白髪葱を乗せ、ポン酢をかけると、お酒のつまみに最適。

【ダブル発酵】
・チーズ
納豆自体発酵食品ですが、発酵食品を発酵食品と混ぜる、というのは勝利の法則です。チーズのまろやかさが納豆の風味を際立たせます。プロセスチーズももちろん、ゴーダ、チェダー、カマンベール、カッテージ、何でも来いです。チャレンジしたことないけど、たぶんブルーチーズでも美味いと思う。
・キムチ
初めて食べたときはあまりの美味さに韓国人と結婚したいと思いました。チーズも加えるとなおベター。キムチの発酵が納豆の発酵に合さって味の深みがすごいことになります。キムチは酸味の強くないもののほうが合うと思います。また小さく刻んであげたほうが納豆とよく混ざって美味しいです。

【納豆臭さ減少】
・シーチキンマヨネーズ
割とメジャー。シーチキン缶の油を切って、マヨネーズと混ぜる。お好みで黒胡椒または和ガラシを。これを納豆と混ぜることで、食感も臭いも大分変わります。どちらかといえば納豆よりシーマヨが際立つので、納豆の食べ方としては邪道かも。
・マヨネーズ
シーチキンマヨネーズが合うなら、マヨネーズも合うんじゃね?合うんですよこれが。納豆全体が白くなり、粘りが強くなります。マヨネーズの酸味で納豆の臭みが減少されます。邪道といえば邪道なんだろうけど、あまり美味しくない納豆を食べるときには便利です。

なお、納豆はおかめ納豆の赤パッケージが一番美味しいです。緑パッケージはいまいち、赤カップは量が少ないです。金のつぶは僕の好みじゃないですね。やっぱり赤おかめです。

さぁ、レッツ納豆ライフ!

納豆の快楽 (講談社文庫)
小泉 武夫
講談社
売り上げランキング: 130234

2008/10/07

ポイ、ちゃんと練習してます

勢いでポイを手に入れた僕ですが、仕事が忙しくてなかなか時間が取れず、フットバッグでさえ1週間に1回くらいしか練習できていない状態。ですが、フットバッグと違ってそれほど汗もかかず、道具もポイだけあれば出来るとあって、夜勤の休憩時間にちょこちょこと練習しています。僕の職場は地下に休憩室があって、一人きりのことが多く、また2畳くらいの空きスペースがあるので、狭いながらもなんとかポイを回すことが出来ます。

POI COMMUNITYの練習動画を見ながら練習しているのですが、現在のところ、なんちゃってな感じですが、以下の技が出来るようになりました。

前まわし、後ろ回し
フロントターン(キャリーターン)
2ビートウィーブ
3ビートウィーブ
リアターン(リールターン)

何がなんちゃってなのかと言うと、
・体に平行、縦に垂直に回せてない→玉が体にぶつかって止まる。
・体の重心が左右にフラフラする。
・回転の速さが一定じゃない→右手の玉と左手の玉が180度真逆にならない。
という感じです。

ですので技が出来るといっても綺麗じゃないし、体にガンガンぶつかって止まります。時々後頭部や胸(たまに顔面も)にぶつかって、これがまた結構痛い。
でも楽しいんですよねー。ぐるぐる回しているとあっという間に1時間とか経過しちゃいます。予想外に体を使うので、15分も回していると額に汗が浮かんでくるので、運動不足解消にも良いです。3ビートウェーブは出来るようになった瞬間すごくうれしかったですね。まだ脛に玉がぶつかって止まりますけど。少し回せるようになってくると玉に紐がついてるやつが欲しくなりますね。

出来れば全面鏡に覆われた6畳くらいの個室で、ぶんぶん振り回して練習したいところです。なかなか上達しませんが、フットバッグと併せて地道に練習しようと思います。え、アサラト?はい、すみません、アサラトも頑張ります。

2008/10/05

人工無脳と僕

僕が人工無脳(当時は無能と表記することが多かったですね)を知ったのは1990年代後半~2000年くらいのチャット全盛期でした。テレホーダイの普及に併せてWebチャットや独自サーバを持つチャットアプリが爆発的に増殖し、その中に人工無脳を取り付けしたものが多く出回っていました。有名どころだと「ゆいぼっと」などでしょうか。僕も自分のWebサイトにインストールしたことがあります。

その後久しく興味を失っていたのですが、今年初頭のTwitter道民部新年会で人工無脳の勉強をしている@hadzimmeさんに出会い、いろいろ興味深いお話を聞かせて頂いて興味が再燃、結果@dabesa(初期型)の作成を行いました。

その後東京で人工無脳オフの末席に参加させて頂き、いろいろと興味深い話を聞かせてもらいました。@showyouさんに@ha_maのソースを拝見させてもらい、非常に刺激を受けました。また@negipoさんのお話は大変興味深く、「芸術性の高い人工無脳、一瞬キラリと輝くポストをさせたい」という言葉は僕の胸に深く突き刺さりました。

プログラマとして未熟な僕ですが、何とか面白いものを作りたいと考えた結果、@dabesa@AngraMainyuを作ってみました。
@dabesaは人工無能によるコミュニケーションを試したかったので、Replyを返す機能の他に挨拶の機能をつけました。これは人によってはうっとおしいんだろうと思いますが、僕はちょっと疲れたときに声をかけてくれるような、優しい奴になってくれればなと思っています。
@AngraMainyuはいかに面白い投稿が出来るかだけに重点を置いてるので、Reply機能は一応つけたものの、挨拶などの機能はつけませんでした。また@dabesaと違い多数の人の文章から投稿文を作成しているので、予想を斜め上に裏切るような投稿をしてくれればなと思っています。

僕のような素人が語るのもおこがましいですが、人工無脳はユーモア、芸術的アプローチとして進化してきた側面があります。人工無脳やbotに対し色々な批判があったり、嫌う人が多いのも知っていますが、僕は@dabesaや@AngraMainyuが、誰かの心にちょっとだけ触れることを言えるようになれたらな、と思っています。

2008/10/03

@dabesaと@AngraMainyuに返事をさせる

前回作った彼らですが、ただ投稿するだけだと面白くないので、Replyに反応するようにしてみました。Reply文の中の最初に出てくる名詞・動詞・形容詞・感動詞に反応して、形態素テーブルから文章を作って返事をします。名詞・動詞・形容詞・感動詞が含まれていない場合には無視します(笑)
ただ時々、文字化けした形態素をWhere条件にしてクエリを実行したときにエラーで落ちます。文字コードとか記号の扱いがダメなんだと思うけど、今日は断念。よし、祝杯あげるか。


#! /usr/bin/ruby -Ku

require 'rubygems'
gem 'twitter4r'
require 'time'
require 'twitter'
require 'pit'

require 'MeCab'
require 'mysql'
require 'net/http'
require 'rexml/document'
require 'kconv'

begin
mysql = Mysql::new('localhost','USERNAME','PASSWORD','DATABASENAME')
c = MeCab::Tagger.new(ARGV.join(" "))

config = Pit.get("dabesa")
cl = Twitter::Client.new(config)

flg = 0
sid = nil
idfile = open("repid.txt",'r')
idfile.each do |id| sid = id.chop end
idfile.close

req = Net::HTTP::Get.new("/statuses/replies.xml")
req.basic_auth("dabesa","PASSWORD")
xml = Net::HTTP.start('twitter.com',80) {|http|
http.request(req).body
}

doc=nil
doc=REXML::Document.new xml
doc.elements.each('/statuses/status') do |elm|
scname = elm.elements['user/screen_name'].text.to_s

if flg == 0 and elm.elements['id'].text.to_i >= sid.to_i then
idfile = open("repid.txt",'w')
idfile.puts elm.elements['id'].text.to_i
idfile.close
flg = 1
end
if elm.elements['id'].text.to_i <= sid.to_i then
mysql.close
exit
end
post = elm.elements['text'].text
post.chop!
post.gsub!(/@dabesa/i,'')
post.gsub!(/@/,'')
n = c.parseToNode(post)
n = n.next
nword = nil

while n do
feature = n.feature.split(/,/)
case feature[0].to_s
when Kconv.kconv("名詞",Kconv::UTF8),Kconv.kconv("動詞",Kconv::UTF8),Kconv.kconv("形容詞",Kconv::UTF8),Kconv.kconv("感動詞",Kconv::UTF8)
nword = n.surface
break
end
n = n.next
end

if nword != nil then
postline = nword
res = mysql.prepare("select surface,nextword from DATABASENAME where surface='#{Mysql::quote nword}'")
res.execute

while res.num_rows != 0 and nword != "EOL" do
nextwords = res.fetch[1].to_s.split(/<>/)
i = nextwords.size
nword = nextwords[rand(i)]
if nword == nil then nword = "EOL" end
postline = postline.to_s + nword.to_s
res = mysql.prepare("select surface,nextword from DATABASENAME where surface='#{Mysql::quote nword}'")
res.execute
end
postline.gsub!(/@/,'.@')
mess = "@" + scname + " " + postline.gsub(/EOL/,'')
cl.status(:post,mess)

end
end
mysql.close

rescue
print "RuntimeError: ", $!, "\n";
end

2008/10/02

Twitter人工無脳: @dabesa & @AngraMainyu

以前北海道開発オフの中で作成した、マルコフ連鎖を使用して日本語タイムラインから投稿文を生成してポストする人工無脳、@dabesa
しばらく放置されていたのですが、Rubyの勉強を始めたのを機に一念発起、Ruby化、DB化しました。最初に僕の半年分のTwitter Archiveを食わせ、後は定期的に僕のTwitter Archiveから更新分の投稿を取得して形態素解析しDBに投入。投稿は二階のマルコフ連鎖です。つまり@dabesaが投稿する要素は全て僕のTwitterへの投稿です。
Special Thanks to @showyou & @ha_ma.

(0)形態素テーブル作成。

create table dabesable (
id int not null auto_increment primary key,
surface text not null,
nextword text);

(1)テキストファイルを解析して形態素テーブルに登録するスクリプト。

#!/usr/bin/ruby -Ku

require 'MeCab'
require 'mysql'

begin
c = MeCab::Tagger.new(ARGV.join(" "))
mysql = Mysql::new('localhost','USERNAME','PASSWORD','DATABASENAME')

dfile = open("data.txt",'r')
dfile.each do |sentence|
sentence.chop!
n = c.parseToNode(sentence)
n = n.next
# 行頭単語の登録
res = mysql.prepare("select id,nextword from dabesable where id=1")
res.execute
newword = res.fetch[1].to_s + "<>" + n.surface
res = mysql.query("update dabesable set nextword='#{Mysql::quote newword}' where id=1")

while n do
surfword = n.surface
n = n.next
if n then
nextword = n.surface
else
nextword = "EOL"
end

res = mysql.prepare("select id,surface,nextword from dabesable where surface='#{Mysql::quote surfword}'")
res.execute

if res.num_rows == 0 then
# 単語が登録されていない場合には新規登録する
res_insert = mysql.query("insert into dabesable values(NULL,'#{Mysql::quote surfword}','#{Mysql::quote nextword}')")

else
# 単語が登録されている場合にはnextwordを追加する
qid,qsurf,qword = res.fetch
newword = qword.to_s + "<>" + nextword.to_s
res_update = mysql.query("update dabesable set nextword='#{Mysql::quote newword}' where id='#{qid}'")
end
end
end
mysql.close
dfile.close

rescue
print "RuntimeError: ", $!, "\n";
end

(2)タイムラインを解析して形態素テーブルに登録するスクリプト。

#! /usr/bin/ruby -Ku

require'rubygems'
gem 'twitter4r'
require 'twitter'
require 'time'
require 'pit'

require 'MeCab'
require 'mysql'
require 'kconv'

begin
# 前回の最新投稿のIDを取得
flg = 0
sid = nil
idfile = open("id.txt",'r')
idfile.each do |id| sid = id.chop end
idfile.close

c = MeCab::Tagger.new(ARGV.join(" "))
mysql = Mysql::new('localhost','USERNAME','PASSWORD','DATABASENAME')

config = Pit.get("dabesa")
cl = Twitter::Client.new(config)

# smokeymonkeyのArchiveを取得
timeline = cl.timeline_for(:user, :id=>'smokeymonkey') do |status|
# 前回取得より新しいデータがあれば最新のIDをファイルに保存
if flg == 0 and status.id.to_i >= sid.to_i then
idfile = open("id.txt",'w')
idfile.puts status.id.to_i
idfile.close
flg = 1
end

# 前回取得より新しいデータがなければ終了
if status.id.to_i <= sid.to_i then
mysql.close
exit
end

post = Kconv.kconv("#{status.text}",Kconv::UTF8)
post.chop!
n = c.parseToNode(post)
n = n.next
# 行頭単語の登録
res = mysql.prepare("select id,nextword from dabesable where id=1")
res.execute
newword = res.fetch[1].to_s + "<>" + n.surface
res = mysql.query("update dabesable set nextword='#{Mysql::quote newword}' where id=1")

while n do
surfword = n.surface
n = n.next
if n then
nextword = n.surface
else
nextword = "EOL"
end

res = mysql.prepare("select id,surface,nextword from dabesable where surface='#{Mysql::quote surfword}'")
res.execute
if res.num_rows == 0 then
# 単語が登録されていない場合には新規登録する
#res_insert = mysql.query("insert into dabesable values(NULL,'#{Mysql::quote surfword}','#{Mysql::quote nextword}')")
else
# 単語が登録されている場合にはnextwordを追加する
qid,qsurf,qword = res.fetch
newword = qword.to_s + "<>" + nextword.to_s
#res_update = mysql.query("update dabesable set nextword='#{Mysql::quote newword}' where id='#{qid}'")
end
end
end
mysql.close

rescue
print "RuntimeError: ", $!, "\n";
end

(3)形態素テーブルから文章を生成してTwitterに投稿するスクリプト。

#! /usr/bin/ruby -Ku

require 'rubygems'
gem 'twitter4r'
require 'time'
require 'twitter'
require 'pit'

require 'mysql'

begin
mysql = Mysql::new('localhost','USERNAME','PASSWORD','DATABASENAME')
res = mysql.prepare("select id,nextword from dabesable where id=1")
res.execute
nextwords = res.fetch[1].to_s.split(/<>/)
i = nextwords.size
nword = nextwords[rand(i)]
postline = nword

res = mysql.prepare("select surface,nextword from dabesable where surface='#{Mysql::quote nword}'")
res.execute

while res.num_rows != 0 and nword != "EOL" do
nextwords = res.fetch[1].to_s.split(/<>/)
i = nextwords.size
nword = nextwords[rand(i)]
if nword == nil then nword = "EOL" end
postline = postline.to_s + nword.to_s
res = mysql.prepare("select surface,nextword from dabesable where surface='#{Mysql::quote nword}'")
res.execute
end

postline.gsub!(/@/,'.@')
mess = postline.gsub(/EOL/,'')

config = Pit.get("dabesa")
cl = Twitter::Client.new(config)
cl.status(:post,mess)
mysql.close

rescue
print "RuntimeError: ", $!, "\n";
end


このタイムライン解析スクリプトと投稿スクリプトをcronで回してます。しばらくは試験期間中。

なお、同じ構造を使って、僕のFriendsタイムラインから投稿を取得する@AngraMainyuという人工無脳も作りました。コレは無秩序に投稿を取得し続けるので、最初はDBの形態素量も少ないのですが、徐々に成長すればいいなぁと思っています。

2008/10/01

修理品発送キットを使ってニンテンドーDSを修理に出す

我が家ではニンテンドーDS Liteを1台、家族共有で使っています。と言ってもほとんど子供がメイン、子供が寝てからは妻がメインと、僕が使うことはほとんどないのですが、やはり子供が遊ぶだけに荒い扱われ方をされることが多く、最近ではちょっとした衝撃で固まったり、スリープモードに入れなくなったりしていしまいました。さすがに不便を感じ始めたので、修理に出すことにしました。修理に出すにあたって、ニンテンドーDSシリーズ専用「修理品発送キット」なるものが無償で提供されるそうなので、取り寄せて見ました。

梱包品一式。箱、封印用のこわれものシール、本体梱包用の袋、ACアダプタ梱包用袋、ソフト梱包用袋、発送伝票、説明書。さすが任天堂、そつがありません。

箱を組み立てたところ。折り目に従ってたたんでいくだけなのでとても簡単です。

本体を梱包用袋に入れて収納したところ。

蓋を閉めて封印用のこわれものシールを貼ったところ。とても簡単です。後は発送用伝票と箱をゆうパック取扱店に持っていくだけ。

修理一つとっても、ユーザーへの親身な姿勢を感じさせる、これこそが「任天堂らしさ」なのでしょうね。

最後に、修理品発送キットが送られてきた紙袋の裏面。超可愛い。この袋欲しい。

スープカレー:すーぷかりー ひげ男爵

すーぷかりー ひげ男爵

今日は中央区北1条東2丁目と少し離れた場所にある「スープカレーひげ男爵」に行ってきました。店舗名とは裏腹に小綺麗な店舗で、喫煙席が別れていない以外は居心地が良かったです。
ランチタイムは\100引き、ランチタイム以外は髭の人\100引きという変なサービスを実施してます。僕は平日13時過ぎに行ったのですが、結構込み合っていました。

ベーシックにチキンを注文。辛さは6番まで無料、7番から有料です。僕は4番の辛口にしました。

具は、野菜のボリュームがすごいです。春雨が入っているのは珍しい。チキンは表面をカラッと焼き上げていて骨離れも良く美味しかったです。
スープは、一瞬ルーカレーっぽい味わいに「ん?」となりましたが、食べ進めるとどんどん美味しくなる。あっさりとしていて変な癖が無く、女性のお客さんが多いのも納得。
チキンで\950、ランチタイムだと\100引きで\850というコストパフォーマンスの高さも魅力的ですね。

僕としては久しぶりに満足点があげられるお店でした。また行きたいです。