Hatena::ブログ(Diary)

130単位

2013-12-31

Sitespecを使ってみた感想

Background

  • 住んでるシェアハウスWebサイトがなかった
  • プロモーションの拠点として必要性を感じた
  • 最初は割とよく耳にするMiddlemanで作ろうかと思った
  • 直近で読んだr7kamuraさんの記事 no title に影響を受けた
    • "Middlemanの嫌いなところは、何をするにもMiddlemanに従う必要があることだった"
  • 必要十分そうなSitespecというツールがそこにあったので使ってみることにした

Goal

  • とりあえず1ページでよい
  • 費用や入居までの流れなどがわかればよい
  • デザインはシンプルかつそれなりな見栄えであればよい
  • コンテンツはMarkdownで書きたい
  • Herokuくらい簡単に公開したい

Sitespec with Sinatra

r7kamuraさんのブログ(ソース)はPadrino使ってますが、全部引用するのは忍びないのでSinatra使ってみました。

helpers do
  def markdown markdown_text
    renderer = Redcarpet::Markdown.new(Redcarpet::Render::HTML, fenced_code_blocks: true)
    renderer.render(markdown_text)
  end
end
use Rack::Static, :urls => ['/images'] #Sitespecに渡すアプリにこう書く

Others

Result

ぼちぼちコンテンツ増やしていきたいと思っています(あと入居者募集中です!)。

Conclusion

上記の画像の件ですが、Sitespecとしては "まずは画像のパスをSpecに書け" というテストファースト的コンセプトなんだと思います。RSpec派生ツールなので当然といえば当然なんですが、そこを理解するとスムーズに開発できる気がします。ほぼ学習コスト無しでいけるため、さくっと静的サイトを作りたい場合にはMiddlemanよりおすすめです、たぶん!

Links


4774158798
パーフェクトRuby (PERFECT SERIES 6)

*1:IFTTTなどでTwitterに流しているとなおさら

2013-11-24

Rails3.2 -> Rails4.0 アップグレード

2ヶ月遅れくらいで記事書いてます。実行時はRails4.0.0でしたが、4.0系であれば同様の手順でいけると思います。エラーで修正必須か非推奨警告のみかは曖昧だったりします。

Gemfile

#gem 'rails', '~> 3.2'
gem 'rails', '~> 4.0'
gem 'activerecord-session_store'

Rails

rake rails:update
  • bin 以下にrailsなどの実行ファイル
  • config以下は上書きされるので diff して必要な設定を書き戻し
  • config/initializers/filter_parameter_logging.rb 追加
  • config/initializers/secret_token.rb
    • secret_token -> secret_key_base
rake rails:update 以外のファイル
  • update
  • add
    • README.rdoc
    • app/controllers/concerns
    • app/models/concerns
  • remove
ApplicationController
  • protect_from_forgery
    • generateされるものは with: :exception になっており、通常はこのオプションがよい
    • :with オプションを指定しない場合は :null_session
Routing
  • :via 指定なしの match をなくす
  • put -> patch
    • 変更した場合はViewでlink_toの:method指定も :patch にする
正規表現
  • 意図しないマッチを避けるため ^ よりも \A、$ よりも \z か \Z を使う
ProtectedAttributes
  • Model から attr_accessible 削除
  • save/create の without_protection 削除
StrongParameters
  • 利用したほうがよいが、一時的に無効化する場合の設定
    • config.action_controller.permit_all_parameters = true
Scope / Conditioned associations
  • whereなどの条件をlambdaの中で指定
ActiveRecord::Base.all
  • Model.scoped -> Model.all
    • all が AR::Relation を返すようになった
Where condition
  • whereで関連先の条件を文字列で指定する場合は references(:table_name) が必要
Associationの細かい仕様変更
@blog.posts.size #=> 0
@blog.posts.build
@blog.posts.pop
@blog.posts.size #=> 0(Rails3) 1(Rails4)
Data attributes in view
= submit_tag 'submit', confirm: 'OK?', disable_with: 'processing...'
= submit_tag 'submit', data: { confirm: 'OK?', disable_with: 'processing...' }
Exception name

Gems

  • MetaSearch -> Ransack
    • MetaSearchはRails4で動かない
    • 依存度により移行はそれなりに大変で、そのうち別記事で書くかも
  • Spork -> Spring
    • 流行り/設定簡略化
  • DatabaseCleaner -> DatabaseRewinder
    • 流行り/速度改善 (※Ruby2.0のみ)

More information


4774155071
WEB+DB PRESS Vol.73

2013-10-15

Rails3.0 -> Rails3.2 アップグレード

今さら需要があるかわからない3.2へのアップグレード情報です。半年前にはほぼ準備完了していたんですが、諸事情あった末にようやく調整ができたので、先日アップグレードしました。ちなみにRails4リリース後のセキュリティメンテナンス対象は3.2系のみであるため、3.1系以前を運用されている方はできるだけアップグレードしたほうがいいと思います。

Gitのlogを見ながら書き起こしているため、エラーか非推奨警告かは曖昧な上に、もしかしたらバージョンアップ関係ない点もあるかもしれませんがご了承ください。

Gemfile

#gem 'rails', '~> 3.0'
gem 'rails', '~> 3.2'
#gem 'mysql2', '< 0.3'
gem 'mysql2'
gem 'devise-encryptable'
#gem 'jpmobile', '< 2.0'
gem 'jpmobile'
#gem 'spork', '> 0.9.0.rc'
#gem 'guard', '~> 0.8.8'
  • 古いバージョン指定を除外(コメントアウト分が3.0用)
  • DeviseでRestful Authentication互換のEncryptorを利用しているのでDevise Encyptable追加

Rails

rake rails:update
  • config以下が3.2のデフォルトで上書きされる
  • git diff で3.0の内容と比較しながら設定
config.assets.enabled = false
  • asset pipeline をオフにして3.0時代のasset管理を継続
has_many_association#clear
# has_many :posts
has_many :posts, :dependent => :delete_all
  • 3.0は @user.posts.clear = @user.posts.delete_all だった
  • 3.2は :dependent を指定しないと 関連idを NULL で UPDATE する
    • 関連idがNULL不可の場合、:dependent を :delete_all (または :destroy) にする
Rails.cache with specific instances
config.eager_load_paths += %W[#{config.root}/lib]
config.after_initialize do
  require_dependency 'my_class' unless defined? MyClass
end
  • キャッシュに独自クラスのインスタンスを保存しているとロードできない対策
MimeType
  • config/initializers/mime_types.rb でPDF追加してたけど不要になった

Gems

Devise
  • rails generate devise:install
  • git diff で3.0の内容と比較しながら設定
  • 新バージョン用のロケールファイルの入手
  • ルーティングの追加は devise_for のブロックではなく devise_scope で
<%#= confirmation_url(@resource, :confirmation_token => @resource.confirmation_token) %>
<%= confirmation_url(@resource, :confirmation_token => @token) %>
#User.__send__(:generate_token, 'encrypted_password').slice(0, 8)
Devise.friendly_token.slice(0, 8)
  • ランダム文字列生成
RSpec(Guard)
#guard 'rspec', :version => 2, :cli => '--fail-fast --drb' do
guard 'rspec', :cli => '--fail-fast --drb' do
  • :version 指定不要
Capybara
  • git mv spec/requests spec/features
  • Capybara2系の仕様により、Capybara::DSL を使うspecをfeaturesへ移動
#select @datetime.month.to_s, :from => 'created_at_2i'
select "#{@datetime.month}", :from => 'created_at_2i'
#select @datetime.hour.to_s, :from => 'created_at_4i'
select '%02d' % @datetime.hour, :from => 'created_at_4i'
  • optionのテキスト検出が厳格になった
#click_button 'resource_submit'
click_button '登録する'
  • FormBuilder で submit の id が付かなくなった
Fabrication
  • resource!{ ... } -> resource{ ... }
  • sequence はブロック化して遅延評価
  • :from => Resource -> :class_name => :resource

感想

そもそもアップグレードが遅れたのは、非エンジニアがpublic以下を編集することが多いアプリで、asset pipeline対応ができなかったのが原因でした。ただ対応しないという判断で割り切ってしまえば、2系から3系よりは、対象項目が少なかった印象です。またテストを書いていたため、(テスト自体の修正もあったものの)比較的安心して進めることができました。Model.pluckが使えるようになったのが地味にうれしいですね。


4844331566
改訂新版 基礎Ruby on Rails (IMPRESS KISO SERIES)

関連記事

2013-07-06

フィリピンでMinaの開発者と会いました

Mina

約1年前にデプロイツールCapistranoの対抗として登場したMina。自分も少しだけ使ったことがありました。ただ最近は開発がアクティブでなかったため、Capistranoでいいじゃんとツイートしたこともありました。そんなMina、フィリピン発なんですね。

で、自分が今フィリピンにきていて、Minaを現地エンジニアとの話のきっかけにしたりも何度かしました。そして開発者の GitHub followers が500超なのを見るに、Nadareiというチームはおそらくフィリピンで一番いけてるエンジニア集団なのではないかと勝手に想像してました。そんないけてる開発者と、あわよくば会えたりしたらいいなあと思っていました。

Manila.js meetup

Mina開発者が発起人でもあるManila.jsというコミュニティ。月イチでミートアップを開いていて*1、たまたま当日の開始1時間前に気づくことになったんですね。

Manila.js JavaScript meetup 016

チケットはSOLD OUTだったんですが、インターンの縁を利用して参加可能か確認して、勢いで参加してみました。バスとジプニーを計4台乗り継いでなんとか辿り着いたときには既にイベント終了間際でした。発起人 @rstacruz がJSクイズを出してノベルティをプレゼントしてました(jQueryの最新バージョンは?とかEmber.jsの開発者は?とか)。

f:id:deeeki:20130705045610j:image

Recorded videos

Talking w/ authors

イベント終了後、これまたありがたいことにインターン先エンジニアに仲介してもらって、@rstacruz 、そしてチームメンバーでMinaメイン開発者である @mikong と話すことができました。

  • 忙しかっただけで開発意欲はあって、つい最近Issue処理を再開したこと
    • "please be patient" といわれた
  • submodule対応のpull reqを送ったことがあること
  • 本番環境で使っているか?と聞かれて、いや趣味でだと答えたこと*2
  • チームでは基本的にRailsアプリを開発していること
    • でも最近はアプリの8割くらいJSを扱ってたりすること
  • どうやってインターン先を見つけたのかということ

衝撃だったのは、"マイナ"だと思っていた読み方が実際は"ミーナ"だったことでした。

それにしても、先にプロダクトの利用、PRがあったのちに、こうしてリアルに海外のエンジニアと会って話せるというのは感慨深いものですね。もっとこういう体験をしてみたいと強く思いました。できればプロダクト提供側としても、というのと、技術的な深い話もできるよう英語力を上げていきたいですね。

JSConf.asia

今年の11/28-29にマニラで開催予定だそうです。興味のある方は行ってみるといいんではないでしょうか!(スピーカーも募集しているみたいです)

関連記事

*1:今月で4回目

*2:実際は既にCapistranoに置き換えたのだけど

2013-06-28

フィリピンでエンジニアインターンしました

f:id:deeeki:20130628153722j:image

経緯

  • 1年前の留学時、IT企業の面接を体験してみたかったができなかった
  • そもそもお試しで英語で短期間働く体験ができたら理想的と考えた
    • 今回は2ヶ月の滞在に決め、後半の1ヶ月間を目標にした
  • 現地イベントでLTしたことでできそうな手応えを得た
    • 英語はそこそこでも、特に母国アドバンテージもあるRubyならいけるのではと

会社探し

  • 留学先のバギオではRubyを扱う会社は全く見つからなかった
  • マニラで探すことにした
    • あとから気づいたけどバギオという地域自体がマニラの何分の一かの狭さだった
  • 一般的な求人サイトで引っかかるRuby求人は派遣ばかりだった
  • 現地Rubyコミュニティで求人の投稿が少し見受けられた
    • 加えてGoogle検索して直接サイトが引っかかった数社をピックアップ
  • スキル/経験/希望(1ヶ月のみ/無給でOK)にGitHubリンクをつけてメール作成
    • 使いまわして各社にメール送信
  • 当然お断りもあったがほとんど返信してくれた

面談

  • 一番最初に興味ありの返事をくれた会社とSkype面談
    • それで速攻決まった
  • 質問は以下のようなことを聞かれた気がする
    • 開発経験年数(Rails経験年数)
    • なぜRuby/Railsを使っているか(日本製だから以外でw)
    • テストは書いているか(JavaScriptも)
    • 今はどのように仕事しているのか
  • でも口約束のみで、いちおう契約書類ほしいと伝えてもスルーだった
    • ので正直不安なままマニラに向かった
  • 開始3日前に再度Skypeで確認して、無事働くことになった

やったこと

  • Ruby2/Rails4/MongoDBによる社内ツール開発
    • 日本語のアプリ名にしたいといわれて自分が提案したのになった
  • GitHubプライベートリポジトリでのプルリク運用
    • 自分:CTOが7:3くらいの二人開発
  • PivotalTrackerでストーリー管理/Skypeで情報共有
  • 毎日午前中に全体スタンドアップミーティングで進捗確認
  • Spring/Turnip/Figaro/Cancanを初めて使ってみた
    • Spring with guard-rspec はかなり快適なTDD環境
    • Turnipは結局GherkinというCucumberの文法が必要なので慣れるまで大変
    • Cancanは機能豊富な割にはスクラッチの権限管理と作業量変わらない気がする

f:id:deeeki:20130628124704j:image

感想

開発面
  • 割とゆるく自由にやらせてもらえた
    • 多少別の仕事などもしてフルにやれてないが、コミット量と早さは評価してもらえた
  • インテグレーションテストは後回しにする傾向があるかもしれない
    • ControllerSpecを割と厚く書いてた
  • CTOはいわゆる風のプログラマーで、新しもの好きな印象
    • おかげで残されたバグもそこそこ踏んだ
    • push通知するSkypebotを途中で導入してた
    • プルリクでは要所要所でレビューしてもらった
  • 中間テーブルの命名について議論してみたりもした
  • 可能であればもうあと1-2人くらいとソーシャルにコーディングしたかった
    • 他のプロジェクトのリポジトリも見たいと相談したが、機密的に難しいようだった
その他
  • 英語力アップはそこまで期待できない
    • なぜならフィリピン人同士はほぼタガログ語で話すから
    • 中には英語に自信がない人もいるようだった(それでも日本人よりはできるけど)
    • そしてエンジニアだとそもそも黙々コーディングしてる時間のほうが長い
  • 自分とは英語で話してくれるので、そこをうまく活かせるかどうか
    • どの環境でもいえるが、話好き/積極性がものを言う(※持論)
      • 自分は真逆なので、実際にあまり伸びてないと思う
  • 会社は20人くらいの規模
    • 平均年齢は25歳くらい
    • CTOと他数人はシンガポールのRedDotRubyConfに参加してた
    • 学生インターンがRails TutorialでCapybara学んでてすごいと思った
    • 日本アニメだったり楽器だったりハードウェアに造詣が深い人もいた
    • 何人かは定時後夜中までオンラインゲームしてたりした
  • ランチは毎回誘ってもらい、ほぼDRYにいろいろな店を楽しめた
  • 夕食もたまにデリバリー頼んだり、臨時の出店的なところで食べたりした
  • たまたま会社が会場だった月1のRubyコミュニティミートアップに参加した
    • "Eat first!" といって先にピザを食べた
    • 日本のコミュニティやRailsアプリなどについてLTした
      • プロジェクタがなくて普通のモニタでのLTに面食らった
    • Ruby2.0やRails4使ってる人はまだ少なかった
    • 適当に2-3人話したり告知したりして解散、残りたい人は残るみたいな流れ
  • エアコンが20度で効きすぎて寒かった

f:id:deeeki:20130628153808j:image

まとめ

仕事の質に関しては、やはり日本(人)のほうが高いかなという印象でした。そして、英語がそこそこでも2-3年ほどのエンジニア経験があれば、開発メインであれば十分に通用するのを実感しました。

また、英語漬けになれる環境を求めるのであれば、完全な英語圏の国で働くのがよさそうです。ただ逆にフィリピンでも英語公用語の会社が増えれば、お互いに機会が広がりますし、語学学校の先という部分でビジネス的にも可能性があるのではないかと思ったりしました。

で、当初は1ヶ月の予定でしたが、ある程度慣れてしまったのと他の環境も経験してみたいという思いから、残り1週間は別の会社でインターンさせてもらいます。

とはいえ大変お世話になったので、今後も何かしらでお役に立てればと思います!

関連記事