単純に include するだけだと、クラスメソッドは追加できないんですね。知らなかった。 Module#include を使って、 extend してやるのが良さそうです。『 Ruby 逆引きハンドブック』の P139 を参考にしました。
module M
def self.included(mod)
mod.extend ClassMethods
end
module ClassMethods
def parse doc
p "parsing... #{doc}"
self.new(doc)
end
end
end
class C
include M
def initialize doc
p "initializing... #{doc}"
end
end
p C.parse 'hoge'
# >> "parsing... hoge"
# >> "initializing... hoge"
# >> #<C:0x0000010085a830>
'ワンライナーで作る N-gram 解析'.split(//).each_cons(4).map(&:join) => ["ワンライ", "ンライナ", "ライナー", "イナーで", "ナーで作", "ーで作る", "で作る ", "作る N", "る N-", " N-g", "N-gr", "-gra", "gram", "ram ", "am 解", "m 解析"]
split(//) は 1 文字ずつ配列にするためのイディオムです
'ワンライナー'.split(//) => ["ワ", "ン", "ラ", "イ", "ナ", "ー"]
要素を重複ありで n 要素ずつに区切り、ブロックに渡して繰り返します。
[instance method Enumerable#each_cons:より引用]
今回引数を 4 にしたので 4-gram になってます。2-gram にしたいなら each_cons(2) ですね。
'ワンライナー'.split(//).each_cons(2).to_a => [["ワ", "ン"], ["ン", "ラ"], ["ラ", "イ"], ["イ", "ナ"], ["ナ", "ー"]]
map(&:join) は map{|x| x.join} と一緒です。 to_proc ってやつですね。
'ワンライナー'.split(//).each_cons(2).map(&:join) => ["ワン", "ンラ", "ライ", "イナ", "ナー"]
正直なところ僕は自分の技術者としてのクリエイティビティは諦めていて、僕が新しい何かを生み出すことは出来ないと思っているけれど、その新しい何かを生み出すことが出来る技術者を、北海道で育てることこそが、僕のやるべきことなんじゃないかと思ってる。
[[-*煙猴*-]: Q.「技術者が中央に集中してしまう流れは止められないのか」より引用]
geekになれないからこそなりたいと努力する人と、なれないのに口だけでなりたいと言う人と、なれないからこそ別な道を歩む人がいる。 俺は最後の道を歩むことを決断した。 弱みを補強するのはもういいや、弱みを強みに変える人生にしていく。
[Twitter / exLeaf: geekになれないからこそなりたいと努力する人と、な ...より引用]
僕は技術者としてあんまり大成できないかもしれないなぁと自身で思っています。だけど、見切りをつけるにはまだ早いのかなとも思っていて、まだあきらめてはいないです。ダメだとわかっているなら、早めにあきらめて他の能力を磨いた方がいいのかもしれないですが…どのタイミングで判断したらいいんでしょうねぇ。
ちょうど札幌にいたのでLOCAL DEVELOPER DAY '10 /Winterに行きました。LOCAL の人のうち、半分くらいは初めて会ったのかな。IRC ではダラダラやってますが、実際に会うと不思議な感じですねー。単なるお客さんではなくて LOCAL の一員として参加したかったので、会場設営を手伝ったのですが、実際に役に立ったのかは微妙でしたw
以下感想など
小堤さんの発表。ExtJSって名前はなんとなく聞いたことがありますが、実際に使ってみたことないんですよねー。
こういう手厚い(印象)のライブラリって、誰もサポートしなくなって古びてしまった時、それに掛けてた時間や開発のノウハウが無駄になってしまうのが怖いのですが、ExtJS は開発する会社を作って、マイルストーンも用意してと、「この先もバリバリ進化していきますよ」というメッセージを感じられたのが良かったです。
あとExtJSって Composite パターンで作られているんだなと思いました。いいですよね Composite。
印象に残った一言「ExtJS はただの javascript ライブラリじゃない。RIA フレームワークだ」
鈴木さんの発表。Web ブラウザからテストしちゃう Selenium の Tips でした。
Selenium は Web アプリケーションで回帰テストする場合にかなり有力な候補になるんじゃないでしょうか。でも今まではとっかかりがなかったので、抵抗なく試してみる良いきっかけになりました。
これお客さん側の立場から見たものが問題ないのを確認するテストですよね。「ビジネス上の要件を満たしているか」ということになるのかな。むしろ設計書もこれで書いておけばいいのでは…もしくは設計書から自動生成できるといいなぁと妄想しました。
印象に残った一言「ソフトウェアを成長させる。変えたい所だけ変えて、それ以外は変わらない。それを selenium で担保しよう。」
佐藤さんの発表。スキーマレスなストレージとかいいよね!という話。
CouchDB とか MongoDB はドキュメント指向 DB というもので、簡単に言うと Hash を DB に突っ込む感じで使うみたいです。既存の RDB と違うのは「あらかじめカラムを規定しておく必要がない」という点。作りながら変更していくような開発スタイルには向いているかもしれませんね。あとネイティブに O/R マッパーっぽく書ける点が魅力的でした。
今の所 CouchDB の方がメジャーなそうですが、 MongoDB は http://php.net/mongo にあるように php とは深い仲なので PHPer な佐藤さんは MongoDB を紹介したそうですw
印象に残った一言「KVS と RDBMS のあいだを狙った立ち位置」
小野寺さんの発表「実家に電話してお母さんにサーバーリセットをお願いする」。話したい内容がギチギチに詰まっていて面白かったです。どう考えてもまにあわない詰め込みにするのが LT のコツかもと感じた。
島田さんの発表「プロフェッショナルとして、自分が作るソフトウェアが利用者の生活の向上させられるかどうか」。ちょうどこの間TDDの話題が出てて、この辺ともからむのかなと思いました。あとこれかな
作る技術をバックボーンにして、 話をまとめる力をつけて、 要件をまとめる力をつけて、 交渉をまとめる力をつけて、 費用抑える力つけて、 お客さんの要件を引き出して、実現して、貢献して、 初めて仕事が成り立ってるんだろうが、 ビジネスが成り立つんだろうが。
[2010-02-16 - 山本大@クロノスの日記より引用]
淡々と話しつつ、熱い内容の LT でした。
菅井さんの発表「ニーソタイマー」。ニーソ好きとしてはこれが一番印象に残っていますw
「あの人達みたいにうまくできない」って、一番初めの世代は思わないんだよね。だって先例がないから。二番目以降に熱を伝えつつ、負担に思わせないにはどうしたらいいのかなー…ってのは僕の大学時代からの課題で未だに答えは見つかりません。見つけたら教えてください…
小岩さんの発表「セキュリティの先輩は軍隊や警察。そのマニュアルからセキュリティを学ぶ」。僕には衝撃の内容でした。開発はパターンランゲージなんかの建築に学ぶことが多いみたいですが、セキュリティは何から学ぶかなんて考えたこともなかったので…個人的には今回一番ささった LT でした。
すげーいいこと言ってたのに、最後にパッションがほとばしってしまいましたがw
松井さんの発表「文字の長さによって、範囲の精度が変わる」。この仕様は面白いなーと思いました。ある程度情報が欠落しても大体あってるって何かに使えないかな… LT 中では SQL の LIKE 検索なんかと相性がいいとおっしゃられていましたね。
原さんの発表「仮想化レンタルは、ほっとくと皆同じ脆弱性を持つことになるよ」。ごもっとも…あと NTP ずれまくるってのは知りませんでした
riafさんによる当日ムチャ LT 振り対応の苦労wネタをストックしておけるのは素晴しいですね。
ぬまたさんによる発表「毎日更新、毎日先端、毎日リスキー、 build or may die」。linux-next を追いかけろという話でした。プレゼンの内容よりプレゼンスタイルが熱かったw
まいむぞうさんによる発表「Android のブラウザを使うと、スクレイピングが楽かもしれない」。ブラウザで表示している内容に直接アクセスできるのは確かに便利ですよね。ruby だと mechanize なんかを使うと似たようなことができ…るのかな?
設楽さんによる発表。絵文字って統一企画がなくてあんまり…と思っていたのですが、絵文字が現実にここにある以上、取り扱えた方がいいですよね。だいぶん苦労されているんだなーと思いました。
石田さんの発表。PostgreSQL の型とか関数とかを追加する方法をライブコーディング。僕には全然馴染がない話だったのですが、こうやって拡張するのか!という驚きがありました。思ったより簡単(そう)に拡張できるんですね。石田さんのプログラマらしいつぶやきと共に進むプレゼンスタイルはおもしろかったですw
印象に残った一言「『C 言語を使ったことがある人』とは聞かないですよ」
須藤さんの発表。 MTA に用意されている(ことが多い) milter という仕組みを使ってメールフィルタを作ろうという内容。smtp ネイティブ の挨拶などためになりましたwそういえば僕 ruby/groonga を 32bit 環境で使おうとしてコケたのを ML に報告して解決方法を教えていただいたのでした。須藤さんにご挨拶しそこねたなー…その節はお世話になりました。
印象に残った一言「SMTP はツンデレ」
"なんぞこれ?".to_ngram # => ["なん", "んぞ", "ぞこ", "これ", "れ?"]
のような振舞を実装しました。
# -*- coding: utf-8 -*-
class String
def to_ngram n=2
self.split(//).each_cons(n).map(&:join)
end
end
"なんぞこれ?".to_ngram # => ["なん", "んぞ", "ぞこ", "これ", "れ?"]
"お前たちの文化は我々と同化する。".to_ngram(4) # => ["お前たち", "前たちの", "たちの文", "ちの文化", "の文化は", "文化は我", "化は我々", "は我々と", "我々と同", "々と同化", "と同化す", "同化する", "化する。"]
ワンライナーで作る N-gram 解析をちょこっと変えただけです。本当に簡単ですよねー。もしもっと簡単な方法があれば教えてください…
サムネイル生成機能つきプラグイン image_ex.rb を有効にしただけではサムネイル生成がされませんでしたので,まとめておきます.
4つ手順があります.
特に2番の作業は,今の所本家wikiにはさらりとしか書かれていないので要注意です.後で直しておきます.
たぶんダメでしたー…
プログラマが簿記受ける時の一番の敵は、繰り返し処理を素早く自分でしないといけないところだな…
[Twitter / ヽ(´・肉・`)ノより引用]
これにつきますね.試験前くらいもうちょっと真面目にやろう.
http://www.consadole.net/cs-kanto/article/57
見たことのある人達が集まっていました.今年もがんばりましょー
_ ´∀`)Ψ [タイミングってのは難しいですね・・・ 大成ってのも難しいし各自判断が分かれるかもしれませんけど、 この業界で..]
_ ヽ(´・肉・`)ノ [確かに仕事とする上での最低限ラインは「食っていけるかどうか」になるのかもしれませんねー. でも最近「ハイブリッドワ..]