サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
災害への備え
gnarl.hatenadiary.org
トポロジカルソート - Wikipedia 依存関係を定義したグラフを元に処理順決めるときに使ったりするあれです、あれ。 gitのコミットオブジェクト(複数の親を持つ可能性がある)を並び替える必要があったので調べた。 Rubyには tsortというライブラリが標準添付されているので便利。1.7あたりからある模様。 トポロジカルソートには ノードの集合を取得する あるノードが繋がっている先のノードを取得する というデータ構造に依存する処理が必要で、それを用意してやればtsortがうまいことやってくれる。 require 'tsort' class Nodes include TSort def tsort_each_node(&block) # ノードを列挙してblockに渡す処理を実装する end def tsort_each_child(node, &block) # node が繋がっ
前提 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なら、対応する]に
明示的なメソッド定義以外も検出して欲しいですよね!!! 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
退職します
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
この記事はDataSpiderにおけるコンポーネント間のインタラクションの設計と実装 : 小野和俊のブログの勝手に補足記事です。 コードが良くわからなかったので図を書いてみた。 詳細な説明は元記事へどうぞ。 最も原始的な実装方法: コンポーネントの相互参照 各コンポーネントは、処理に必要なコンポーネントへの参照を直接持っている。 この例ぐらいだと非常にシンプルだが、コンポーネント間が密結合しているため、機能を拡張したいときに問題となる。 Mediatorパターン 各コンポーネントは、別のコンポーネントを直接持つ代わりにMediatorへの参照を持っている。 Mediatorは、コンポーネントからのリクエストに応じて適切なコンポーネントに指示を出す。 Role Objectパターン DIっぽい仕組みが導入されたりして複雑なので、処理に関係ないところは簡略化してあります(本当はコンポーネントが
みたいなケース。 repo1にrepo2をくっつけたいというときは、 # プロジェクトの場所が ~/repo1, ~/repo2の場合 ~/repo1 $ git remote add repo2 ~/repo2/ ~/repo1 $ git fetch repo2 # repo1にrepo2のコミットオブジェクトとブランチ情報が追加される ~/repo1 $ git merge repo2/master # repo1/masterにrepo2/masterをマージみたいなかんじでいけます。 コンフリクト出たとかは、まあふつうにどうにかする。
ストーリーとしては、 $ vi main.rb ... $ vi newclass.rb ... $ git commit -a -m '一部機能をNewClassに分離' $ vi main.rb $ git commit $ vi sub.rb $ git commit ... $ git status # Untracked files: # (use "git add <file>..." to include in what will be committed) # # newclass.rb $ うっ bash: うっ: command not foundみたいなケースですね。 bash: うっ: command not found # 「本来そのファイルを入れるはずだったコミット」の手前までを指定してrebase -i $ git rebase -i HEAD~~~~~ #
あけましておめでとうございます。しかしそんなことは関係ない。正月から平常運行だしVimいじってたら休みが終わった。 さて本題。これはヘルプに書いてあるけど、 let g:Align_xstrlen=3 をすることで正しくハンドリングされます。 ただ、このオプションを設定すると異常に重い+カーソルがファイル末尾に飛ぶという謎な挙動を示すので、修正したやつを用意しました。 https://github.com/todesking/vim-align/tree/xstrlen-fix どうぞご利用ください。
これはRuby Advent Calendarの21日目の記事です*1。20日目は@sasata299さんのHerokuって便利だし利用までたった3ステップですお!!でした。 はじめに 本当は「Pure Rubyで動くかっこいい形態素解析エンジンができた!!!」みたいな記事を書く予定でしたが、目標のクオリティに達しなかったのでリリースは延期されました。 クリスマスごろにリリースされるといいですね。 さて、この記事では、Haskellのような純粋関数型言語がどのように副作用を伴う処理を実現しているかについて、Rubyによる実装を使って解説します。モナドという言葉が全く出てこないのでアレルギーのかたも安心ですね。 純粋関数とは 同じ引数を渡す限り、どのような順番で何度呼んでも同じ結果が返るような関数のことです。 何が問題なのか puts 'hello!' res1=gets puts 'hel
環境 Mac OSX 10.6 概要 Spaces使って各画面にコンテキストごとのアプリを配置してる場合、ショートカットで画面切り替えてから同一画面内でタスクスイッチできたほうが効率が良いのでCmd-Tabをどうにかしたい。 Witchでもできないしどうしたものかと思ったら*1標準機能だけでできたので報告します。 Ctrl+F4でいける!!!! この設定はシステム設定のKeyboard→Keyboard shortcuts→Keyboard and Text Input→Move focus to active or next windowで変えられるので、Opt-Tabとかに設定すれば幸福が実現します。よかったですね。 と思ったら 直前に使っていたウィンドウを覚えてくれるわけではないので、ウィンドウが3つあったらどうあがいても1→2→3の順で遷移します(つらい)。 結論 AppStore
今やってる仕事の関係で、形態素解析アルゴリズムについてちょっと調べる必要があったので、ついでにRubyで形態素解析ライブラリを作ってみた。という内容の発表です(のはずだが、Rubyのコードが一文字も書いてないですね……)。 スタート形態素解析 View more presentations from todesking ちょっとプレゼンのクオリティがひどいので、近いうちにブログで補足記事を書こうと思っております。 ソースは https://github.com/todesking/okura にて公開中。 Pure Rubyでgem一発で入るような形態素解析ライブラリがあると、Windowsやherokuなどで形態素解析動かせてけっこうべんりなきがします。 直近(来週くらい)の開発では、 gem化 辞書もgem化 辞書のコンパイル Double Array Trieの採用 未知語処理対応
人月商売が悪だと思っている、イノセントなあなたへ - GoTheDistance メリットとして挙げられているのが「開発側がリスクを取らなくていい」しかない…… お前らそんなに金が欲しいか、私は欲しいですが、しかも多少クソなプロダクトを作っても金もらえるとか最高だし、いやしかしそれってクライアントから見ても最高なのか?そのやりかたが価値あるソフトウェアを作るために優れたやり方だとはどうしても思えないし、クソなプロダクトを作ってもクライアントがリスクを負うだけで金をもらえるってことはクソじゃないプロダクトを作る理由が減るってことだ、ということはつまり、クソなプロダクトを作るための簡単なお仕事をするハメになるということで、温室栽培された軟弱なエンジニアーはそういったレガシーかつ要求技術レベルが低そうな環境には耐えられないので転職するしかない、つまりSIerのリスクが低くても私は幸せになれないの
人体用電流源とゆうのは人体に電流を流すための装置で、入手可能な部品で簡単に作れるように工夫されています。 三半規管に電流を流すことで身体が傾いたように感じられてたのしい!!!(フラフラ)、みたいな用途に使いますが、危険すぎて他の人に体験してもらうことがはばかられるので(賠償金払えないし……)代わりに制作情報を公開しています。 http://todesking.com/hitosinigaderu/ どうぞご利用ください(自己責任で)。
cygwinだとモードが644->755に突然変わったりして困るので。 $ git config core.filemode false
MBAの魅力といえばあの薄く鋭いデザインですが、ボディ手前側が尖っているので姿勢によっては角の部分で手首を痛めることもしばしば。 外付けのパームレストをつける?屋外で変な姿勢でインターネットするときにいちいちつけてられないし、せっかくの完成されたデザインを変な外付け部品で壊したくない…… そんなあなたにソリューション: 400番くらいの耐水ペーパーで削る 左のくぼみ部分に比べて、右側のエッジがなめらかに整形されていることがおわかりになるだろうか? 外見はほとんど変化ないが、手首へのダメージを確実に軽減してくれる。以上ライフハックでした。
価値あるソフトウェアを作ることが目的、パターンやプラクティスがが手段。 一般的な受託開発においてアジャイルなやり方を適用するのが難しいのは、そもそも目的が違うからではないのか。 (一般的な/意識の低い)受託開発において、我々は 価値あるソフトウェアではなく、顧客の要件を満たすソフトウェアを作り 柔軟なリリースでなく、定められた納期に向けて開発し ソフトウェアの生んだ価値ではなく、事前に予測された規模に応じた支払いを受ける この構造においてアジャイルな手法を適用することは、SIerの利益を減ずることになるのではないか?
プラグインのインストール後などには再起動するオプションが表示されるんですけど、それ以外の場合に再起動する方法がわからない……。 http://{JENKNS_HOST}/safeRestart にアクセスすることで再起動できます。設定画面からリンク貼ってないよなあ。
次のページ
このページを最初にブックマークしてみませんか?
『<s>gnarl,</s>技術メモ”’<marquee><textarea>¥』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く