RubyMotionアプリでStoryboardを使うには

RubyMotionアプリでStoryboardを使ったら楽になるかなあ、ていうかそもそもRubyMotionでStoryboardって使えるのかしら、とぼんやり思ったのでggってみたらズバリなページが見つかりました。
RubyMotion で Storyboard を使う
非常に丁寧にまとまっています。ありがとうございます。
こちらにあるとおり、RubyMotionでもStoryboardはバッチリ使えました。
楽になるかはまだよく分かりません。。
とりま、使う手順をまとめてみました。

やること

  1. XcodeでStoryboardを作成する
  2. StoryboardファイルをコンパイルしてできたディレクトリをRubyMotionアプリのresourcesの下に配置する
  3. AppDelegateのapplicationメソッドの中でStoryboardを読み込み、Storyboard IDとともにrootViewControllerを設定する

1. XcodeでStoryboardを作成する

ここで作成するときのポイント。

最初に表示するViewControllerのStoryboard IDに任意値を設定する

Storyboardを読み込み、rootViewControllerを設定する際に必要になります。

SegueにIDを設定する

Segueによる画面遷移をRubyMotionでperformSegueWithIdentifierを使って実装してあげるため、IDが必要になります。

2. StoryboardファイルをコンパイルしてできたディレクトリをRubyMotionアプリのresourcesの下に配置する

StoryboardファイルをRubyMotionアプリのresourcesの下へコピーして、

$ ibtool --compile Main.storyboardc Main.storyboard

のようにコンパイルすると、Main.storyboardc というようなディレクトリが作成されます。

3. AppDelegateのapplicationメソッドの中でStoryboardを読み込み、Storyboard IDとともにrootViewControllerを設定する

UIStoryboardのinstantiateViewControllerWithIdentifierでStoryboard IDを指定します。

class AppDelegate
  def application(application, didFinishLaunchingWithOptions:launchOptions)
    return true if RUBYMOTION_ENV == 'test'

    @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
    @storyboard = UIStoryboard.storyboardWithName('Main',  bundle:nil)
    @window.rootViewController = @storyboard.instantiateViewControllerWithIdentifier('TopTab')
    @window.rootViewController.wantsFullScreenLayout = true
    @window.makeKeyAndVisible
    true
  end
end

サンプルアプリつくってみました。

MotionWithStoryboard

Capistranoタスクの中でbundle execする

ローカルのRailsアプリディレクトリでとあるrakeタスクを実行する処理をCapistranoのタスクで実行したかったです。こういう感じです。

Capfile
task :korejikkou do
  run <<-CMD
    cd #{toaru_rails_dir}
    bundle exec rake toaru
  CMD
end

これを

$ bundle exec cap

で実行すると、korejikkouの中のbundle execはcapコマンドを実行したディレクトリベースで動いてしまいます。。
困った。
こちらにあるように、bundle installには任意のGemfileを指定できるオプションがあるようですが、bundle exec にはないみたいです。
bundle のなかで bundle する

が、bundlerではBUNDLE_GEMFILEという環境変数にGemfileの場所がセットされるらしく、これを書き換えると意図してたことができました。

Capfile
task :korejikkou do
  org_gemfile = ENV['BUNDLE_GEMFILE']
  ENV['BUNDLE_GEMFILE'] = "#{toaru_rails_dir}/Gemfile"

  run <<-CMD
    cd #{toaru_rails_dir}
    bundle exec rake toaru
  CMD

  ENV['BUNDLE_GEMFILE'] = org_gemfile
end

(あとで気づいたが、bundle install –gemfileしてからbundle exec すれば指定したGemfileが使われるんだろう。きっと)

generator-angularでつくったプロジェクトでE2Eテストを実行する

モリモリ盛り上がってるAngularJSのプロジェクトひな形を作ってくれるgenerator-angular でE2Eテストをするためのメモ。

$ yo angular

でひな形をつくった時点で、

$ grunt test

でユニットテストをすぐ実行することができる。
が、E2Eテストを実行するタスクが見当たらない。
karma-e2e.conf.js というE2Eテスト用のkarmaの設定ファイルはつくられている。

ということで、karma-e2e.conf.jsのこの部分を

// Uncomment the following lines if you are using grunt's server to run the tests
// proxies: {
//   '/': 'http://localhost:9000/'
// },
// URL root prevent conflicts with the site root
// urlRoot: '_karma_'

コメントアウトする。

// Uncomment the following lines if you are using grunt's server to run the tests
proxies: {
  '/': 'http://localhost:9000/'
},
// URL root prevent conflicts with the site root
urlRoot: '_karma_'

testディレクトリ以下にe2eというディレクトリをつくって

$ mkdir test/e2e

この下にE2Eのテストを置く。

test/e2e/sample.js
describe('E2E: Testing Routes:',  function () {
  'use strict';

  beforeEach(function() {
    browser().navigateTo('/');
  });

  it('should display message',  function() {
    var message = element('h1').text();
    expect(message).toEqual("'Allo,  'Allo!");
  });
});

そして、おもむろにターミナルでサーバーを起動して。。

$ grunt serve

さらに別のターミナルでkarmaコマンドを叩けばtest/e2e以下のE2Eテストが実行される。

$ karma start karma-e2e.conf.js

どうもE2Eテストのあり方が定まっていないらしく、現在こういう中途半端な状態になっている模様です。
Add an E2E Spec When a View is Created

Google AppsアカウントでRedmineのOpenID認証

Redmineのバージョンは2.3.3です。

ストレートなOpenID認証ではないのですが、こういうユースケースをRedmineで実現しようとしました。

  1. Redmineにユーザーを登録しておく。ユーザーのメールアドレスはGoogle Appsアカウントのメールアドレスにする。
  2. Redmineのログイン画面でGoogle AppsアカウントのメールアドレスをOpenID URLに入力してログインする。入力されたメールアドレスのドメインをもとにしてGoogle AppsアカウントのOpenID認証を行う。
  3. 認証できたGoogle Appsアカウントのメールアドレスと同じアドレスを持つユーザーがRedmineにいる場合、Redmineのログイン成功とする。

RedmineはもともとOpenID認証の機能を備えており、adminでログインして、管理 - 設定 - 認証からOpenIDによるログインを有効にすることができます。
しかしこれだけでは上記のようなユースケースを実現できないので、Redmineをカスタマイズしました。こちらに置きました。
redmine-google-apps-openid

こちらが参考になりました。ありがとうございます。
RailsでGoogle AppsのOpenID対応アプリを作る

rvmで入れたgemを削除する

以前はずいぶんrvmのお世話になってましたが、最近の開発環境ではすっかりrbenvを使うようになっています。
けれどもサーバー環境ではまだrvmを使い続けてたりしてます。
RubyやRailsのバージョンアップがあったりしてgemがけっこうなディスク容量を食っていたので使ってないgemを削除しようと思い立ちました。
ちなみにMulti-User Installで入れたrvmなのでコマンドは適当に読み替えてください。

globalのgemsetを消す

globalの名前がついたgemsetを消さないと素のgemは消せないようです。 なのでまずglobalを消します。

$ rvmsudo rvm gemset delete global

素のgemを削除する

$ rvmsudo gem uninstall -axI `gem list --no-versions`

Rubyを削除する。Rubyだけ削除してもgemは消されないので注意。

$ rvmsudo rvm remove ruby-xxx-pxxx

参考にさせてもらったのはこちらです!
RVM の gemset を使う
ありがとうございます!

Xcodeプロジェクトをコピーして新しいプロジェクトをつくる

既存のXcodeプロジェクトをコピーして新しいプロジェクトを作って開発する必要がありました。
単純にファイルコピーしてもダメなんだろうなーと思ってたらやっぱりダメで、いろいろとやらないといけませんでした。
環境はXcode4.6.3です。

まず参考にしたのはこちらです。
Xcode4.5でiOSアプリのプロジェクト名を変更する方法
ざっとやることは

  • Identity の「Project Name」の項目を書き換える
  • スキーム名を変更する
  • グループ名を変更する
  • プロジェクト名を選択して[Build Settings]から古いプロジェクト名を新しいプロジェクト名に書き換える

で、これで基本的に完了な感じですが、自分の場合はARCがらみのエラーがたくさん出てきました。
これはプロジェクトのコピーではソースコードファイルのCompiler flagsは移行されないことが原因でした。
元プロジェクトのCompiler flagsの設定を新プロジェクトに設定して解消。

さらにこのあとにplistの警告が出てきました。
これには下記のとおりCopy Bundle Resoucesからplistをいったん取り除いてから再ビルドで解決しました。
he Copy Bundle Resources build phase contains this target’s Info.plist file …

Ruby2.0にアップグレードしてつまづいたこと

Ruby 1.9.3 / Rails 3.2.x でアプリを開発しています。

このたびRuby 2.0がめでたくリリースされたのでアップグレードしてみました。

で、ちょいちょいつまづいたことをメモしておきます。

つまづき:RVM on Mac OS Xでインストールエラー

まずRuby2.0のインストールにつまづきました。 ビルドでopensslがほにゃららのエラーがでてこけました。

対策: 下記のとおり。

$ brew update
$ brew install openssl
$ rvm get head
$ rvm install ruby-2.0.0 --skip-openssl --with-opt-dir="`brew --prefix openssl`"

(参考) Installing Ruby 2.0.0-preview1 with RVM on OS X                  

つまづき:iconvがない。

iconvが標準でついてこなくなりました。

対策:String#encodeで置き換える。

つまづき:respond_to?の仕様が変わった。

protectedメソッドにrespond_to?するとfalseが返ってくるようになりました。 私はテストがfailしたことがきっかけでこれが分かったのですが、最初はなにが悪いのかわからなくて混乱しました。

対策:Ruby1.9系と互換を保つにはprotected_to?の第二引数にtrueを指定する。

true指定でprotected/privateメソッドもrespondableになる。

(参考) PROTECTED METHODS AND RUBY 2.0

つまづき: PassengerのApacheモジュールがビルドできない。

ビルド中にこんなのを吐いて落ちました。

cannot load such file -- rubygems/builder

対策:Stableな3.0.19はRuby2.0に対応していないようです。

$ gem i passenger --pre

で4.0.0 RCのPassegerをインストールしてビルドします。

(参考) passenger-install-apache2-module doesn’t work on ruby 2.0

あと、この4.0.0 RCのPassegerではRails.rootにconfig.ruがないとRails 1 or Rails 2と見なされて起動しません。 こんなエラーメッセージが出ました。

This application is a Rails 3 application, but it was wrongly detected as a Rails 1 or Rails 2 application.

This is probably a bug in Phusion Passenger, so please report it

なのでconfig.ruをお忘れなく。

(参考) Passenger 3.9.1.beta incorrectly detects Redmine 2.2.1 as Rails 1/2 app

Kindle PaperwhiteがWiFiに接続できないとき

Kindle Paperwhiteを去年11月に購入して使っていたのですが、最近になって充電してください表示から画面が動かなくなってしまいました。 Amazonサポートに連絡すると、すぐに新しいものを送りますとのことで、2日後には新しいKindle Paperwhiteが届きました。

さっそくセットアップしていると、WiFiに接続できないエラーが。 これは1台目のときも同じことがありました。なのでメモしておきます。 (ちなみに自宅ではAppleのTimeCapsuleを無線ルーターに使っています)

WiFiネットワークの詳細を選んで、手動で設定します。 接続タイプに「スタティック」を選択します。 該当のWiFiネットワークに接続できているPCやスマホのネットワーク設定を参考にして

  • IPアドレス
  • サブネットマスク
  • ルータ
  • DNS

の設定をそれぞれ入力します。 IPアドレスは他の機器とかぶらないようにします。(192.168.1.xのxを9とかにして)

rails-compass導入に難儀した件

いい加減sass使わないとなと思い、どうせsass使うならcompass入れちゃおうと思いました。 compass導入にあたり参考にしたのはこちらです。 http://railscasts.com/episodes/334-compass-css-sprites

こちらのとおりにやってサーバーを起動してアクセスしたところ、 “File to import not found or unreadable: compass” のエラー。 ググってみると、rails-compassの導入にはRailsのバージョンとかなにやらが絡んでいろんな症状が出ている模様。

https://github.com/Compass/compass-rails/issues/19 を眺めていきますと、どうもassetsグループの中に定義しないやり方が有力のようなのでやってみました。 結果、それでうまくいきました。

変更前Gemfile
group :assets do
  gem 'sass-rails',    '~> 3.2.3'
  gem 'coffee-rails',  '~> 3.2.1'

  # See https://github.com/sstephenson/execjs#readme for more supported
  runtimes
  # gem 'therubyracer',  :platform => :ruby

  gem 'uglifier',  '>= 1.0.3'
  gem 'compass'
  gem 'compass-rails'
end
変更後Gemfile
group :assets do
end

gem 'sass-rails',    '~> 3.2.5'
gem 'coffee-rails',  '~> 3.2.1'

# See https://github.com/sstephenson/execjs#readme for more supported
runtimes
# gem 'therubyracer',  :platform => :ruby

gem 'uglifier',  '>= 1.0.3'
gem 'compass'
gem 'compass-rails'

assetsグループとはなんなのか・・ asset pipelineを支えるsprocketsのためのほにゃららだと思うのですが、そこから外しちゃうんだ・・ということでメモっておこうと思いました。

ちなみにこの難儀したときの環境は ruby 1.9.3p362 Rails 3.2.9 でした。 今現在Railsは重大なSecurity Fixがあったため3.2.10にアップデートすべきですね。 http://weblog.rubyonrails.org/2013/1/8/Rails-3-2-11-3-1-10-3-0-19-and-2-3-15-have-been-released/

Code Snippet Sample

$ sudo make me a sandwich
This is sample
class Sample
  def sample
    "sample"
  end
end
(server.js) download
var http = require('http');
http.createServer(function (req,  res) {
          res.writeHead(200,  {'Content-Type': 'text/plain'});
            res.end('Hello World\n');
            }).listen(8124,  "127.0.0.1");
console.log('Server running at http://127.0.0.1:8124/');
Awesome code snippet
Javascript Array Syntax MDN Documentation
var arr1 = new Array(arrayLength);
var arr2 = new Array(element0,  element1,  ...,  elementN);