伸長するsliceの取扱い

Goで何かしら値を計算した結果をsliceに格納するときにcapを事前に設定出来ない場合もある。 // capがわかってない場合 var slice []T // cap(N)がわかっている場合 slice := make([]T, 0, n) append時にcapが足りない場合、slice内部の値をコピーして伸長す…

[WIP]文書間類似度の参考文献

WIP

最近、仕事で記事レコメンドアルゴリズムをコンテンツベース(文書間類似度)を用いて実装して、記事CTRを大幅(高いものだと700%くらい)に上げられた。 そのとき調べたことを雑にまとめておく。 論文 http://www.sciencedirect.com/science/article/pii/S0…

ISUCON6

毎年恒例のISUCONに参加(オシャレ怪盗スワロウテイル)してきました。今年で4回目の挑戦になります。 ISUCON6予選 いわゆる、はてなキーワードクローン実装です。 加えて、各機能が別アプリ(別プロセス)で動作しており相互間はAPIでやり取りするという構…

fontdがCPUリソースを喰う

mac

ここ1、2年(遅くなったり普通だったりしたりして原因がわからず放置していた...)、Macのターミナル(iTerm)で作業すると、 fontd プロセスがとても重くなりもっさりする現象が続いていた。 原因は、zshのプロンプトに機種依存文字を使っていたからだった。 た…

goroutineのテストを同期的に行う

とある関数の評価値 ― 例えばファイルに文字列を書き込む ― をテストしたい場合、 その評価がgoroutine内だと、テスト側から実行しても、タイミングによって取得できないことがあります。 そこで、テスト側から評価するときにはchanelを渡す用にして、そのch…

ISUCON5予選

例年どおり、 @f440 とチームを組み、優秀な若者 @corrupt952 を加えて挑戦しました。 準備 過去の予選問題をチームでいろいろなアプローチで、実際の予選と同じ時間で解く 正攻法だったり 1プロセスオンメモリといったピーキー実装 各人がそれぞれミドルウ…

データ駆動 + Test::Unit

大量のログデータの処理の前段階として、fluentプラグインで処理させるときのこと。 fluentプラグインのテストはTest::Unitで書くのが主流なようで、Test::Unitを書いている。 ただ、プラグインは大量のデータを処理するので、テストケースの量も多くなって…

Redis 3.0.0

https://raw.githubusercontent.com/antirez/redis/3.0/00-RELEASENOTES 正式にRedis Clusterをサポートするstable版がリリースされたのでコード読んだりぽちぽち触ってみている。 クラスタリングとは全然関係ないのだけどdict.cはHash関数つくりたくなると…

Ruby2.2

わりと、Hashのkeyで評価したいことがあるな~と思っていたのだけど、Ruby2.2から表現できるようになっていた。 gist.github.com

コードレビューするときの視点

普段、Ruby(RailsやSinatraといったWAFにおける)のコードレビューするときに、 こういった事を念頭においてレビューする、というものが自分の中だけで閉じている気がしているので、 文章にしてリスト化しておくことでコードレビュー時に、自分自身も漏れが少…

Golangでエレガントだと思うこと

@kana さんとハッカソンしていて、Golangのどこが好きか? と聞かれた時にうまく説明できなかったのでまとめておきます。 よく、Golangはgoroutineとchannelが取り上げられることが多いと思いますが、 それよりも、僕がGolangをGolangたらしめていると考えて…

octopusに待望のsharding + replication構成がサポートされそう

Railsで、master/slave構成を作る場合や垂直分割する場合などは、octopusに頼る場合が多いです。 ただ、sharding + replicationの構成はずっとpendingのままで、僕も何度かトライしたことがあるのですがうまい設計を練ることができずにそのまま指を加えたま…

JSONを扱うときにkeyとfieldを対応づける

Goの、encoding/json の Unmarshal で、例えばJSONデータのkeyが小文字の場合、自動でcapitalizeしてくれる。 pakcage main import( "encoding/json" ) type A struct { A_Id int Field string } func main() { jsonBlob := []byte(` {"a_id": 100, "field":…

effective-goではない何か

去年からGolangを書き散らかしてみて、だいぶセンス感じとれるようになってきたので、Golangを書くときのイディオムのようなものをまとめてみる。 Golangをコーディングするディレクトリ 簡単な、10行20行くらいで済むコードであればどこで書いてもいいのだ…

ISUCON3 - 予選から本戦を終えて

TwitterでISUCONに参加したいとぼやいていたら、@f440 さんが一緒にどうかと誘ってくれたので、ISUCON3に参加してきました。 オシャレ怪盗スワロウテイルとして参加し、本戦2位という結果で幕を閉じました。 参加した動機として、自分がWebエンジニアとして…

SO_REUSEPORT ソケットオプション

Linux Kernel3.9(BSDでは割と以前から実装されていたけど)で取り込まれたSO_REUSEPORTソケットオプションは、異なるプロセスで同一のポートにbindできるようになるので、いろいろおもしろいことができそう。 https://lwn.net/Articles/542629/ これがmerge c…

guard文のあれこれ

あるメソッドで、渡されたパラメータによっては処理をまったくしないということがある。 その場合guard文を書くことでネストが深くならなくて、読みやすくなることはイディオムとしてよく知られている。 しかし、guard文を書くと逆に読みにくくなってしまう…

Mac OS -> Ubuntu

教授がMac OSをメインで使っていた影響で、学生時代からメインマシンにMacを使ってきたけれども、転職を期にUbuntuへ移行しました。 職場の開発マシンがUbuntuなので、普段からプログラミングスタイルや開発環境のノウハウを貯める xmonadの完成度が高くてプ…

nodeでRedisを使ってセッション管理

フレームワークにexpressを使う場合、connectが提供するsessionモジュールを使うと楽に実装できる。 さらに、Redisにセッションデータを保存する場合、connect-redisを使うと楽だ。 https://github.com/visionmedia/connect-redis 他にも、express-session-r…

nodeでWebアプリを開発するときに考えること

僕は、全体を俯瞰して作り出すので遅いのだけれども、トータルとして同じくらいのスピードになるかなと思って、新しい言語やフレームワークを使うときは、まずは全体で必要になりそうな技術であったり、問題点を潰すことにしています。 フレームワーク node…

Rubyの標準ライブラリ及びgemのtagsファイルをロードする

Vimスクリプトを書いた。 https://github.com/yoppi/config/blob/master/vim/dot.vim/ftplugin/ruby/tag.vim プログラミングしているときに、実装を知りたいときがよくあるので、Vimで素早くタグジャンプできるようにした。 ただ、 手動でtagsファイルを生成…

redisable

というgemを作った。 http://github.com/yoppi/redisable RubyオブジェクトをRedisとマッピングさせる既存の有名なライブラリに、 redis-objects(https://github.com/nateware/redis-objects) ohm(https://github.com/soveran/ohm) の2つがあるけど、次の欲…

RSpecMocks/rr

TestDoubleライブラリをrr(Double Ruby)からRSpec標準のRSpecMocksに切り替えてるのだけど、やっぱり違和感がある。 rrはTestDoubleの考えをそのままライブラリ化した実装で、xUnit Test Patternsを熟読した人にとって馴染み易いと思う。 だけど、RSpec Mock…

redis-commander

ローカルで開発しているときに、複数のredis-serverを立ち上げるので、たとえばsessionのテストでkeyを削除したくなったり、 アプリのデータを入れたくなったりしたときに、redis-cliで「どのプロセスに繋げばいいだっけ」ということが多々ある。 redis-comm…

thinのコードネーム

awk

が、rails serverするたびに目に入るので気になって一覧にしてみた。 $ git log -p lib/thin/version.rb | grep '\+\s*CODENAME' | awk 'match($0,/[\047"](.*)[\047"]/) { print substr($0,RSTART,RLENGTH) }' "Straight Razor" "Knife" "Chromeo" "Low-bar…

Amazonで配送先住所を間違って発注してしまった場合

Amazonで本を大量に買ったのだけど届け先を昔の住所で発注してしまって、変更しようとしても、配送準備中で変更できなくて詰んだ感ある。— Hirokazu Yoshidaさん (@yoppiblog) 2013年4月10日 def 住所変更可能か? 状況 == "未発送" end def 配送先住所をweb…

Enumerable#entries

にはまったというお話。 class Hash def method_missing(method, *args) ret = self[method] || self[method.to_s] return ret if ret super end end h = {root: {hoge: 1, foo: 2}, entries: [{hoge: 3, foo: 4}, {hoge: 5, foo: 6}]} h.entries #=> [[root…

免責条項

たまに「私は経験が浅く〜この記事の内容には間違いがあるかもしれません〜」という書き出しがある記事をみかけるのは、日本人の文化なのかなと思っていたら、英語圏の人もそういう文化があるんだ。 Disclaimer: This is my first blog post on frontend web…

RubyやRailsの情報収集

勉強会で話していて3回くらい「どこからRubyやRailsの情報を仕入れてますか」のような質問をされたので、 自分はどうやって情報収集してるんだろうとふと考えてみると、 Rails Casts(pro購読するのおすすめ) http://railscasts.com/ Ruby Weekly(メールで定…

Alfred2

mac

Alfred遅いとか言ってたけど、Alfred2にしたらすこぶる調子がよいのでQuickSilverからAlfredに戻した。