前提 ActiveRecord 3.2.11 実装 クラスの決定はActiveRecord::Inheritance#instantiate(record)内で行ってるので、そこにパッチ当てればいける。 ただ、クラスの決定はロード時にしか行われないわけで、動的に変わるカラムを元にしたSTIを定義すると意味不明状態になるというリスクがある。typeカラムに格納されたクラス名のみを元にするっていうARの設計は妥当なのかも。
前提 ActiveRecord 3.2.11 実装 クラスの決定はActiveRecord::Inheritance#instantiate(record)内で行ってるので、そこにパッチ当てればいける。 ただ、クラスの決定はロード時にしか行われないわけで、動的に変わるカラムを元にしたSTIを定義すると意味不明状態になるというリスクがある。typeカラムに格納されたクラス名のみを元にするっていうARの設計は妥当なのかも。
けど無理っぽいので本体改造してみた Module#const_addedを定義しておいて、定数定義する関数の本体が rb_const_set(VALUE klass, ID id, VALUE val) なので、そこに細工して定数セット後に const_added を呼んでやればOK。 ただしrb_const_setはRuby起動時のクラス階層初期化時にも呼ばれるので、その際はスルーする必要がある。 というわけでこうするとよさそうだった。 https://github.com/todesking/ruby/commit/ff4112340a149faf18cbe288fee02a419f801bcc class A def self.const_added(id) puts "#{self}::#{id} added" end end A::X = 10 #=> "A::X added"
MySQLのwarningって、 文字列が長すぎたから勝手に短くして保存しておいたよ! 数字が大きすぎたから適当な数字を保存しておいたよ!! 数値として解釈できない文字列があったから0とみなして比較したよ!!! など、無視すると死ぬ系メッセージであることが多いんだけど無視されがちなので困り者。 insert系のwarningについてはsql_modeの設定を変えることでエラーにできるんだけど、その設定がなされてなかったり、selectがヤバイみたいなケースもあったりしてな(;´Д`) というわけで、ActiveRecord側でチェックするモンキーパッチを書きました(for mysql2)。 1クエリ実行ごとにshow warning投げてるので本番にはおすすめしない。 Mysql2::Client、リリースバージョンにはwarning_countがないので……。HEAD使うか、次バージョン
追記: Gem化されたよ!! カオティックなViewを修正する場合、ここの記述を直したいけどどのpartial見ればいいんだってことがたまによくあるのです。
Xcode入れるとSpotlightに勝手に「デベロッパ」という項目が追加され、システム環境設定から無効化できない!!!滅びろApple!!!!!!! 環境 OS X 10.7 やり方 ここ参照。 http://hints.macworld.com/article.php?story=20110805192212447 open ~/Library/Preferences/com.apple.spotlight.plistして、Dictionaryの項目を追加。name: SOURCE, enabled: NOに設定して保存。後はログインしなおせば消えます。 注意事項 plistを編集して消しても、システム環境設定のSpotlightの項目を開くとデベロッパメニューがふたたび有効化されます。滅びろApple
boost_lambda_style_proc $ gem install boost_lambda_style_proc名前が長い…… 最初はboost_style_lambdaにしようと思ったけどLambdaじゃなくてProcを生成するためのライブラリなので誠実ではない!!!となった結果こうなった(長い) Boost::LambdaっていうのはC++のBoostという普通のテクニックを駆使したライブラリの一部で、 // 5で割り切れて30より大きい要素を探す。 vector<int>::iterator it = find_if( vec.begin(), vec.end(), _1%5==0 && _1>30 ); http://www.kmonos.net/alang/boost/classes/lambda.html という書き方ができる。 Rubyで書くなら [10, 23,
類似gemとしては ActiveRecord用のweighted_random {value => weight} 形式のHashを使う weighted_randomizer というのがあったけど、当方のユースケースには合わなかったので自作した。 weighted_sample $ gem install weighted_sampleで入ります。 require 'weighted_sample' [1, 9, 90].weighted_sample_by {|x| x} # => 1(1%), 9(9%), 90(90%) 任意のEnumerableで使えるけど、内部的に2回eachしてるのでご留意ください。 重みに使えるのは、今のところ整数のみです(要望があればFloatにも対応するんじゃないかな or プルリクせよ)。
ニコニコ超会議における、Hogelog氏による最速brainfuck処理系の発表 残念なパンを食べながら残念な言語でハッカソンをする会の開催 といった現象が私の中で化学反応を起こした結果、BF処理系の最適化にゴールデンウイークを費やすという残念な結果となった。 処理系概要 hogelog氏のfast-bfにいくつか最適化を加えました。プロジェクトは以下。 https://github.com/hogelog/fast-bf 処理系はC++で書かれており、BFのソースを読んでその都度最適化しながら中間コードに変換、それをx86の機械語に変換してから実行します。 BF概要 レジスタ: p: 操作対象のメモリ位置を示す 命令: >: pの値を+1する <: pの値を-1する + pが指すメモリの内容を+1する -: pが指すメモリの内容を-1する [: pが指すメモリの内容が0なら、対応する]に
2012-04-07: 新しいブラウザでうまく動いてなかったので修正しました(関数の引数にclassという名前を使っていた) してみました。 こないだ社内SICP勉強会で図形言語のところをやったんだけど、動かしてみなければわかりづらいし手軽に動かせる環境がない。各種Scheme処理系で動かす方法を施行しては挫折、結局動かず大変残念な気分になったので作った。会社で。 仕事もしてますよ。 図形の描画にはprocessing.jsで知ったcanvas要素を使用。けっこう高機能でいいですね。 以前言語開発合宿のとき作ったtodescheme(命名ujihisa)をエンジンに、ブラウザ上にScheme処理系を構築、その上で図形言語を実行しています。
明示的なメソッド定義以外も検出して欲しいですよね!!! class A < ActiveRecord::Base attr_reader :x attr_writer :y attr_accessor :z has_one :one belongs_to :one has_many :many has_and_belongs_to_many :mannny end ctags標準だとこれらのアクセサ定義には対応してませんが、--regex-<ファイルタイプ> オプションでタグとして検出するパターンを追加可能です。 今回だと、~/.ctagsにこのように書けばOK。 --regex-ruby=/^[[:space:]]*(has_(one|many)|has_and_belongs_to_many|belongs_to)[[:space:]]+:([a-z0-9_]+)/\3/ --rege
4年弱勤務していたチームラボ株式会社を退職し、3月末から株式会社ドリコムで働いています。 転職のきっかけは、受託開発との関わり方に悩んだことでした。 ソフトウェアの美しさというのは、工具の美しさと似ています。何らかの目的を達成するために作られ、経験によって磨き上げられた機能美こそがその本質です。 明確な目的のために作られ、常に改善され、価値を生み出す。私はそのような美しいソフトウェアに奉仕したいと思っていますが、果たしてその文脈に受託開発というものがどの程度当てはまるのかわからなくなってしまった*1。実際に作ったものがどの程度の価値を生むかによらず、期限までに決められたものを作ることで収入が得られる構造においては、美しいソフトウェアを作るモチベーションを保つことはとても難しい。未熟な私にとって、そのような環境で長時間過ごすことは死亡リスクでした。 ドリコムでは、Ruby1.9+Rails3
この書き方はまずいからあとで直そう→直さない あとで拡張する必要がありそうだ、必要になったら設計を変えよう→まずい設計のまま他人に使われる コミュニケーションしなくても正しい判断ができるようにする 正解がないことは、走りながら臨機応変に変えなければならない。でも、始まった時から正解がわかることがある。そういうものについては、最初からよく考えて正解を選ぶ。 どちらか迷ったら、変えやすいほうを選ぶ。AからBとBからA、どっちが変えやすい? 初期に書くコードはすごく重要。後から参加する人は既存のコードにスタイルを合わせる。 軌道を修正するコストは早ければ早いほど小さい。 仕組みを変えることにはコストが伴う。心理的コストも。 走り出したら何も考えられない。よく考えてから走る。あるいは、走ってない人が考える。 一度動き出した仕組みを変えるときは、移行コストが小さくなるようよく考えた上で、無理やり変え
eeepc買ったら当然日本語配列、US配列キーボードも売ってるようだが色々面倒、ソフト的になんとかできれば楽なんだがなーと思ってなんとかしたら実用的なレベルになりました。 基本的なリマップ設定はUSB メモリに入るキー配列変更ソフトウェア | nDikiを参考にさせてもらいました。 配列をより一致させるためEnterの位置変えたり\をEnterにもってきたり。 ほかにもレジストリいじってLALTと無変換スワップしたりしてる。 リマップ用ahkスクリプトは以下: #UseHook ; ひらカタ、無変換殺す vkF2sc070:: vk1Dsc07B:: return ; 変換:space vk1Csc079::SPACE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 1段目 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
12月にさくさくテキストマイニングで発表したpure Rubyによる形態素解析エンジンをgem化しました。 まだ発展途上で機能が少なかったりパフォーマンスが悪かったりしますが、いちおう動くレベル*1になったので公開します。 注意事項 バージョン0.0.xのうちは、インタフェースや辞書フォーマットは頻繁に変更される予定です。 ある程度安定したら0.1.0出します。 今のところ、Ruby1.9系専用です。 取得 gem install okuraでインストールできます。 ソースは https://github.com/todesking/okura 使い方 MeCabフォーマットの辞書データを使用します。 動作確認はMeCab用NAIST辞書で行いました。 最初にokura compileコマンドで辞書をコンパイルします $ okura compile mecab-naist-jdic-0.6
概要 Vimにおいて Ruby編集時に(filetype=ruby) foldmethod=syntaxを指定していて 括弧の対応が取れていない状態で Insertモードで文字入力すると すごく重い。ファイルのサイズが大きい場合に顕著。 # ... loop { array=[1,2, # たとえばこのへんで入力してるとき } # ... 原因 matchitとかmatchparenあたりかと思ったが違った。 very slow insert mode in classes · Issue #8 · vim-ruby/vim-ruby · GitHub 結論としては、 foldmethod=syntax に設定してるのが原因。 解決方法 Insert modeのときはfoldmethodを変更する事で解決する。 私は以下の設定を使いました。 Keep folds closed while
http://d.hatena.ne.jp/gfx/20120223/1329996834 (o.f=o.f)()はglobalになった これの解釈はどうすれば…。 こういうのは仕様書見ればだいたい解決する。 http://www.ecmascript.org/docs.php 今回は3rdを参照しましたが5thでも同じであろう。 メソッド呼び出しは11.2.3のFunction callsなので、それを見る。 => 最初に(o.f=o.f)を評価 => =を使っているので、11.13.1 Smple Assignmentのルールに従って処理される。 => LeftHandSideExpression = o.f, AssignmentExpression = o.f => この処理の返り値は、GetValue(AssignmentExpression)である。 => 8.7.1 GetV
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く