cocoa.vimをしばらくメンテします

先月からiPhoneアプリを書きはじめているんだけど、オフィシャルのcocoa.vimがメンテされなくなって、4年、シンタックスハイライトも古いままだし、メソッドのコードコンプリーションはこわれているしで使えなくなっていたので、しばらくメンテすることにしました。

https://github.com/kentaroi/cocoa.vim

Tags: cocoa vim Objective-C cocoa.vim

By Kentaro Imai on November 17th, 2014

Maintained cocoa.vim

I start maintaining cocoa.vim in my fork in a period of Swift.

https://github.com/kentaroi/cocoa.vim

Tags: cocoa vim Objective-C cocoa.vim

By Kentaro Imai on November 17th, 2014

binding.pryは長すぎる

長い間Pryに移行しなかった理由のひとつがbinding.pryが長すぎるということで、Pryが良いらしいことはみんなが主張していたので、そうなんだろうと思っていたが、Pryに移行するまでには至っていなかった。

一昨日、何故かPryをもう一度試してみようという気持ちになり、binding.pryにエイリアスをはる方法を検索してみたが、良い結果は得られなかった。

そこで、エイリアスをはるだけのためのgemを作ってみた:pry-alias(Github)

これをインストールすれば、bpと書くだけでブレイクポイントを設定できる。

なんとかPryを使っていけそうな気がする。
 
 


pry-aliasを使えば、デフォルトでは、bpだが、環境変数で自由にエイリアスを設定できる。例えば、以下のように設定することで、適当にbを連打してもブレイクポイントを設定できる。

# ~/.bashrc or ~/.zshrc
export ALIAS_FOR_BINDING_PRY=bbbbb,bbbb,bbb,bb

Tags: ruby pry

By Kentaro Imai on June 12th, 2014

binding.pry is too long to type

I have not switched to Pry for a long time, because binding.pry is too long to type.

However, everyone has been saying that Pry is powerful, Pry is great..., and finaly, the day before yesterday, I decided to switch to Pry and googled the way to create alias for binding.pry.

Surprisingly, it seems no one create an alias for binding.pry at least correctly.

Therefore, I created a gem.

Usage

Just install pry-alias

# Gemfile
gem 'pry-alias'

Now you can set breakpoints with bp (or whatever you want).

Enjoy!

Tags: pry ruby

By Kentaro Imai on June 12th, 2014

Capistrano 3について

Capistrano 3が出てから、いろいろと解説記事も出てきている。

マルチステージ環境、きれいな実装、より良いDSLなどを紹介した好意的な記事が多いように思う。

僕も最近使い始めていたので、いろいろと試行錯誤していたことをまとめて、Tips的な記事を書こうと思っていた。だけど、結局止めにした。

これはCapistrano 3を使ってみた経験からの結論なんだけれど、Capistrano 3はまだ使うべきじゃない。あまりにも機能が削られていて使い物にならない。

例えば、

  • shellがなくなっている。
  • HOSTFILTERが使えない。
  • パスワード付きのsudoが使えない。

等々

正直、まだ使えるレベルまで実装されていない。
簡単な機能さえまともに使えない(信頼できない)。

デプロイのためのツールだから、実装が綺麗かどうかなんて関係ない。使えるか使えないかだ。

そういう意味で、Capistrano 3はまだ使えない。
今はまだCapistrano 2を使い続けるべき。

Tags: Capistrano

By Kentaro Imai on November 21st, 2013

体調ちょっと回復してきた

体調がちょっと回復してきたので、
ちょっとずつやりかけてたこと再開していこうと思います。

って言っても、すぐにいろいろ出せるって感じではないですけど。

Tags: 日常

By Kentaro Imai on June 27th, 2013

Wardenのコントローラテストヘルパー

Railsには、色々と認証のためのライブラリがありますよね。

Restful-authentication, Authlogic, Device, Sorcery... と僕も色々試してみた結果、最近、Wardenというものに落ち着きました。

Wardenは、フレキシブルだという触れ込みのSorceryやAuthlogicよりもフレキシブルで、というかスクラッチから書くのに近いのですが、Deviseと同様に、routesファイルなどから、認証を利用できるので、非常に自由度が高い設計ができる利点があります。

ただ、そんな理想的なWardenにも欠けているものがあって、それはコントローラテストのためのヘルパーがないことで、これでは使い物にならない・・・ということで、僕が試しに書いてみました。

と言っても、ほとんどのコードはDeviseのDevise::TestHelpersから引っ張ってきたもので、Devise絡みのコードを取り除いて、Railsのconfigを読み込むようにコードを書き換えただけのものです。

このヘルパーをincludeすれば、コントローラテストからwardenにアクセスできるので、例えば、ログイン状態にするために、warden.set_user(user)したり、現在ログインしてるユーザを取得するために、warden.userとかできます。

# test/test_helper.rb

require 'test_helpers/warden.rb'

class ActionController::TestCase
  include Warden::Test::ControllerHelpers
end
# test/test_helpers/warden.rb

module Warden
  # Warden::Test::ControllerHelpers provides a facility to test controllers in isolation
  # Most of the code was extracted from Devise's Devise::TestHelpers.
  module Test
    module ControllerHelpers
      def self.included(base)
        base.class_eval do
          setup :setup_controller_for_warden, :warden if respond_to?(:setup)
        end
      end

      # Override process to consider warden.
      def process(*)
        # Make sure we always return @response, a la ActionController::TestCase::Behavior#process, even if warden interrupts
        _catch_warden {super} || @response
      end

      # We need to setup the environment variables and the response in the controller
      def setup_controller_for_warden
        @request.env['action_controller.instance'] = @controller
      end

      # Quick access to Warden::Proxy.
      def warden
        @warden ||= begin
          manager = Warden::Manager.new(nil, &Rails.application.config.middleware.detect{|m| m.name == 'Warden::Manager'}.block)
          @request.env['warden'] = Warden::Proxy.new(@request.env, manager)
        end
      end

      protected

      # Catch warden continuations and handle like the middleware would.
      # Returns nil when interrupted, otherwise the normal result of the block.
      def _catch_warden(&block)
        result = catch(:warden, &block)

        if result.is_a?(Hash) && !warden.custom_failure? && !@controller.send(:performed?)
          result[:action] ||= :unauthenticated

          env = @controller.request.env
          env['PATH_INFO'] = "/#{result[:action]}"
          env['warden.options'] = result
          Warden::Manager._run_callbacks(:before_failure, env, result)

          status, headers, body = warden.config[:failure_app].call(env).to_a
          @controller.send :render, :status => status, :text => body,
            :content_type => headers['Content-Type'], :location => headers['Location']

          nil
        else
          result
        end
      end
    end
  end
end

Tags: Rails Warden testing

By Kentaro Imai on June 22nd, 2012

Controller test helpers for Warden

Restful-authentication, Authlogic, Device, Sorcery... I was tired of wandering authentication libraries for Rails.

At the end, I settled into Warden.

Warden gives us full flexibility. It's far more flexible than Sorcery or Authlogic, actually to use Warden is more like writing authentication from scratch. And, we can access authentication in routes file as Devise.

But Warden had lacked one thing: test helpers for controller testing.

So, I wrote controller test helpers for Warden.
Most of the code was extracted from Devise's Devise::TestHelpers.
I cut off Devise related code and wrote some code for loading Rails application config.

With this test helpers, you can access to warden in your controller test, and you can do such as warden.set_user(user) to login, and warden.user to get current user, etc.

# test/test_helper.rb

require 'test_helpers/warden.rb'

class ActionController::TestCase
  include Warden::Test::ControllerHelpers
end
# test/test_helpers/warden.rb

module Warden
  # Warden::Test::ControllerHelpers provides a facility to test controllers in isolation
  # Most of the code was extracted from Devise's Devise::TestHelpers.
  module Test
    module ControllerHelpers
      def self.included(base)
        base.class_eval do
          setup :setup_controller_for_warden, :warden if respond_to?(:setup)
        end
      end

      # Override process to consider warden.
      def process(*)
        # Make sure we always return @response, a la ActionController::TestCase::Behavior#process, even if warden interrupts
        _catch_warden {super} || @response
      end

      # We need to setup the environment variables and the response in the controller
      def setup_controller_for_warden
        @request.env['action_controller.instance'] = @controller
      end

      # Quick access to Warden::Proxy.
      def warden
        @warden ||= begin
          manager = Warden::Manager.new(nil, &Rails.application.config.middleware.detect{|m| m.name == 'Warden::Manager'}.block)
          @request.env['warden'] = Warden::Proxy.new(@request.env, manager)
        end
      end

      protected

      # Catch warden continuations and handle like the middleware would.
      # Returns nil when interrupted, otherwise the normal result of the block.
      def _catch_warden(&block)
        result = catch(:warden, &block)

        if result.is_a?(Hash) && !warden.custom_failure? && !@controller.send(:performed?)
          result[:action] ||= :unauthenticated

          env = @controller.request.env
          env['PATH_INFO'] = "/#{result[:action]}"
          env['warden.options'] = result
          Warden::Manager._run_callbacks(:before_failure, env, result)

          status, headers, body = warden.config[:failure_app].call(env).to_a
          @controller.send :render, :status => status, :text => body,
            :content_type => headers['Content-Type'], :location => headers['Location']

          nil
        else
          result
        end
      end
    end
  end
end

Tags: Rails Warden testing

By Kentaro Imai on June 22nd, 2012