starseeker

「usefulなライブラリを求めてるのにstarseekerを使ってない?」

「ふざけるな!」

「本日より貴様をスノーボール二等兵と呼ぶ」

「いい名前だろ、気に入ったか?」

成人男性の98%が利用してるというstarseeker.soに関して、残念ながら残りの2%に該当してしまった人(もしいるとすれば)にご説明させて頂きます。

starseekerとは

githubで自分がfollowしている人がstarを付けたrepositoryを毎朝メールしてくれるサービスです。

ただ僕はRSSもTwitterも見ない人のものは全く見ない代わりに見ると決めた人はひとつも漏らさず見るスタイル(情報収集スタイルについて - komagata)なので、starseekerもRSSフィードで見てます。

例えば、

moroさんがstarしてるreposは何か実用的でちょこっと便利なやつなんだろうなーとか

junoさんがstarしたのは、俺が知らないなんかおしゃれなgemとかなんだろう、とか

kenchanさんはすごくエッジなライブラリを見つけててすごいな、とか

全く知らなかったclojureを始めた時も、clojureの有名な人をfollowしとけばそこから直ぐに良い人が見つかって広がりました。

ビジネスマンが日経読んでないと上司に怒られる・・・みたいな。これが無い生活は考えられません。

あと、starseeker.so自体もruby2.0.0-p0, rails4beta1, pumaでソースがとても綺麗で参考になりました。

まあ、控えめに言って 神サービス ・・・ ですよね。

#263 Client Side Validations - RailsCasts

modelに定義したvalidationルールを使ってclient sideでもjsでvalidateしてくれるclient_side_validationsは糞便利なんですが、hiddenな要素はvalidateできない。

例えば、user_idがhiddenであって、特定のユーザーをブロックしたい時にはhidden要素もclient_side_validationsでvalidateしたい。

jsを2行書けば済むことなんですが、今後もありそうなのでgemにしました。

komagata/client_side_validations-with_hidden · GitHub
# Gemfile:
gem 'client_side_validations-with_hidden'
// app/assets/javascripts/application.js:
//= require rails.validations
//= require rails.validations.with_hidden

API側も自分で作ってる時など、webmockをrequireしてるのに「本当に大丈夫かな?」と実リクエストを飛ばしたい時があるので下記。

WebMock.allow_net_connect!

残したままpushすると大惨事になるので注意が要る。

webmockがmockしてくれない

「webmock使ってるのにresponse bodyが空で帰ってくる」

webmockを勝手にhttp proxy的に捉えてて「おかしいなあ」なんてハマってたんですがwebmockはhttpをmockしてるわけじゃなくて特定のclassをmockしてるだけなんですよね。考えてみれば当たり前なんですがREADMEにちゃんと対応してるライブラリが書いてある。

Supported HTTP libraries

  • Net::HTTP and libraries based on Net::HTTP (i.e RightHttpConnection, REST Client, HTTParty)
  • HTTPClient
  • Patron
  • EM-HTTP-Request
  • Curb (currently only Curb::Easy)
  • Typhoeus (currently only Typhoeus::Hydra)
  • Excon

parallel requestが簡単にできるtyphoeusのメソッドの中で、single requestをするpostメソッドとかを使ってたら常にresponse bodyが空。(何故parallel requestのためのライブラリでsingle requestを使ったのか小一時間問い詰めたい > 俺)

ちゃんとTyphoeus::Hydraしか対応してないって書いてありますね。RestClient.postにしたらあっさり動きました。

しかし、コジャレたライブラリにチャレンジしていく姿勢は失わず行きたい!

ActiveRecordでserializeを使った場合、デフォルトではyamlでserializeされる。独自のserializerを実装すればそれを渡せる。

Post < ActiveRecord::Base
  serialize :meta, Foo.new
end

しかしデフォルトではjson用のserializerが無いのでserializer-railsを使うと便利。

Post < ActiveRecord::Base
  serialize :meta, format: :json
end

xmlも使えたり、gzip圧縮できたりもする。

mrbrdo/serialize-rails · GitHub

先週の日曜日にデザイナーの為のgem作成勉強会をFJORDでやりました。

RubyGemsによるデザインの再利用 // Speaker Deck

元々は@machdaさんが

「jsとかsassのmixinとかがgemになってると楽でいい。作り方教えて欲しい」

と言ってたので1人に教えるんだったら勉強会にしようと思いつきで10分ぐらいでATND建てたのでした。

デザイナーといってもみんなgitやterminal使えてrubyの環境つくれること前提って感じだったのでいきなりgem作成は厳しいかもですが、複雑化する長期プロジェクトではcssのgemによる構造化はほぼ必須かなって気がしました。

追加:

@kyokutyoさんが手順を公開されていました。

デザイナーの為のgem作成勉強会に参加しました = 2012.10.14.Sun • FIXME

怖話でcomment付ける対象なんて"怖い話"だけに決まってるじゃん!

class CreateComments < ActiveRecord::Migration
  def change
    create_table :comments do |t|
      t.text :body
      t.references :story

      t.timestamps
    end
  end
end

余裕過ぎワロタwww

1年後・・・

"怖い漫画"・・・だと・・・!?

\( ^o^)/ オワタ

じゃ、じゃあ、comic_commentsというテーブルを・・・(レガシー直行)

commentをcommentableにする

でも大丈夫、後からでもcommentableに移行できます。今回はacts_as_commentableを使いました。

# Gemfile:
gem 'acts_as_commentable', '2.0.1'
% rails g comment

modelとmigrationでファイルを上書きしそうになるけど上書きしない。

# app/models/comment.rb:
class Comment < ActiveRecord::Base
  include ActsAsCommentable::Comment
  belongs_to :commentable, polymorphic: true, counter_cache: true
end
# app/models/story.rb:
class Story < ActiveRecord::Base
  has_many :comments, as: :commentable, dependent: :destroy
  acts_as_commentable
  attr_readonly :comments_count
end
# app/models/comic.rb:
class Comic < ActiveRecord::Base
  has_many :comments, as: :commentable, dependent: :destroy
  acts_as_commentable
  attr_readonly :comments_count
end

polymorphicかつcounter_cache使う時は、相手先をreadonlyにしとく必要があるみたいです。

class AddCommentableToComment < ActiveRecord::Migration
  def up
    rename_column :comments, :story_id, :commentable_id
    add_column :comments, :commentable_type, :string, default: 'Story'

    add_index :comments, :commentable_id
    add_index :comments, :commentable_type
  end

  def down
    rename_column :comments, :commentable_id, :story_id
    remove_column :comments, :commentable_type
  end
end

これで既にコメントが沢山あってもcommentableへの移行がバッチリ。この調子でtag, category, voteもどんどんやっていこう!

Macを再インストールしたのでrvmが新しくなったからか、capれない。

% bundle exec cap staging deploy
/Users/komagata/.rvm/lib/rvm/capistrano.rb:5:in `': RVM - Capistrano integration was extracted to a separate gem, install: `gem install rvm-capistrano` and remove the `$LOAD_PATH.unshift` line, note also the 'set :rvm_type, :user' is now the default (instead of :system). (RuntimeError)

長いエラーをちゃんと読むと、rvmのcapistrano関連の部分はrvm-capistranoとして別gemになったようです。Gemfileに追加します。

group :development do
  gem 'rvm-capistrano'
end

また「$LOAD_PATH.unshiftしてんのを取れ」と出てるので大抵の人はRAILS_ROOT/config/deploy.rbに書いてる下記を取ればOK。

$:.unshift(File.expand_path('./lib', ENV['rvm_path'])) # REMOVE ME!

コンパイラが変わるという大転換期なので仕方無いとは思いますが、Xcode依存のゴタゴタはプログラマーにも厄介。デザイナーさんに環境作ってと気軽に言い辛いここ最近のMac環境です…。

This week in open source — giant robots smashing into other giant robots

We have officially stopped maintaining the following open source products: limerick_rake, trout, shoulda-context, and jester.

shoulda-contextが更新終了。怖話では全部コレでテスト書いてるのに。なんてこった!U2plusは混在してたのをRSpecに統一したところで調度良かったが・・・。

This week in open source — giant robots smashing into other giant robots

Hey! shoulda-context has a maintainer! His name is Travis Jeffery (travisjeffery) and he’s got commit rights and everything! Thank you, Travis.

なんて思ってたらメンテナが見つかって復活。もう何が何やら・・・。

gemは問題無くできるものの、CIがエラー。

$ bundle exec rake
/home/vagrant/.rvm/gems/ruby-1.9.2-p290/gems/bundler-1.0.21/lib/bundler/rubygems_integration.rb:143:in `block in replace_gem': rake is not part of the bundle. Add it to Gemfile. (Gem::LoadError)
from /home/vagrant/.rvm/gems/ruby-1.9.2-p290/bin/rake:18:in `
' Done. Build script exited with: 1

よく見ればちゃんと書いてある。

# gemspec:
s.add_development_dependency 'rake', '~> 0.9.2.2'
s.add_development_dependency 'rdoc', '~> 3.11'

Tracis-CIでrakeとrdoc使うからdevelopment_dependencyには入れとかなきゃいけない。

dm-validations-i18n.gem version 0.3.9 released.

This gem can localize error messages for dm-validations.

I made it, because dm-core or dm-validations are not have localized error messages, and authors of them will not provide them.

The gem supports locales en, ja, ru, zh-CN and zh-TW. These locales made by  gugods, makevoid and others in several countries. I really appreciated their works.