BowerでJavaScriptのライブラリをラクラク管理

bower-logo

最近はどの言語でもモジュールのパッケージ化の考え方が進んでいますね!
NodejsのnpmやRubyのGemはとても一貫性が高くて好きです。
そして、その潮流はクライアントサイドのウェブ開発分野にも及んでいます。
TwitterがBowerというJavaScript/CSSのライブラリをパッケージ管理できるツールを公開しています。
これを使えば、ライブラリ間の依存関係をあまり意識せずに、手間をかけずに使う事ができますね!

Ruby on Railsでも簡単に使えるようなgem bower-railsが提供されています。
至れり尽くせりですね!

Railsで使う場合の使い方をざっとご紹介します。
インストールはnpmのコマンド一発。

#!bash
$ npm install -g bower

以下の行をGemfileに追記しましょう。

#!ruby
gem 'bower-rails', '~> 0.6.1'

依存関係はBowerfileという名前のファイルに以下のように記述します。

#!ruby
assets_path "assets/javascripts"

# Puts files under ./vendor/assets/javascripts
group :vendor do
  asset 'jquery'    
  asset 'jquery-ui' 
  asset 'jquery-ui-touch-punch' 
  asset 'jquery-ujs' 
  asset 'jquery-placeholder' 
  asset 'jquery.tagsinput' 
  asset 'modernizr' 
  asset 'bootstrap-select' 
  asset 'bootstrap-switch' 
  asset 'bootstrap3-typeahead' 
  asset 'BigVideo.js' 
end

使いたいライブラリがBowerにあるか調べるには、以下のコマンドを実行します。

#!bash
$ bower search <keyword>

gemとかpodと一緒ですね!
準備ができたらインストールしましょう。

#!bash
$ rake bower:install

これで、vendor/assets/javascripts/bower_components のディレクトリ下にインストールされます。
また、Bowerを単体で使う時に必要なファイルがvendor/assets/javascripts/bower.jsonに生成されているのが確認できます。

使ってみた感想としては、Rails用のgemがあるならそっちを使った方がすんなり動く印象です。
js単体のライブラリなどの使用に適しているのではと思いました。

よく使うgitのリポジトリ操作メモ

git

順番は特に意味ありません。ただのメモです!

コメント付きで全ての変更をコミット

#!bash
$ git commit -a -m "コメント"

変好内容を全て破棄

#!bash
$ git checkout -f

ブランチを作成して同時にチェックアウト

#!bash
$ git checkout -b hoge

ローカルのブランチを削除

#!bash
$ git branch -d hoge

リモートのブランチを削除

#!bash
$ git push origin :hoge

コミット履歴

#!bash
$ git log

特定のファイルのコミット履歴を表示

#!bash
$ git log file

自分専用の.gitignoreを設定する。各リポジトリのルートディレクトリに置かれた.gitignoreファイルと併せて適用される。
.bashrcなどに記述しておくといい。

#!bash
$ git config --global core.excludesfile ~/.gitignore

これも参考になります:

XCConfigを複数ファイル構成にする方法

xcode-configsettings_Icon

XCConfigは、XCodeのConfiguration Settings Fileの事で、DebugやReleaseで異なるプロジェクト設定を適用する事が出来る優れモノです。
下記のように、ファイルの新規作成画面の項目として出てくるやつですね。

Screen Shot 2014-01-07 at 3.25.50 AM

CocoaPodsとか使っていると、自動生成されたXCConfigに手を加えたい時があります。
でも、pod installする度に書き換えるのは面倒ですよね。
実は、XCConfigには#includeディレクティブが用意されているので、この悩みを簡単に解決できます。
includeディレクティブはC言語と全く同じ構文です。

#!c
#include "別のxcconfigへのファイルパス"

これを使って、以下のような構成にすれば、万事うまく行きます!

XCConfig composition example

[iOS] 動的なレイアウトを超手軽に実装する方法

autolayout

概要

AutoLayoutが超手軽に使える、Masonryをご紹介します!

AutoLayoutで動的レイアウト、しかし…

不特定なサイズの画像や長さのテキストを取り扱う時、どうしても固定サイズのViewレイアウトでは限界があります。
コンテンツのサイズに合わせて、動的にレイアウトを調整する必要があります。
また、単にText ViewやImage Viewのサイズを変えればいいのではなく、周辺のViewも調整が必要なので結構大変です。

そんな動的レイアウトの要件に対しては、AutoLayoutがよく使用されます。
AutoLayoutは、親Viewのサイズ変更があった時に子View同士の間隔やサイズを自動で調節してくれる技術です。
そのレイアウト方法は、Constraint(制約)と呼ばれるものをViewに与える事で定義します。
AutoLayoutを使うと有効な時とその利点は以下の2つです:

  1. Interface Builderを使って、動的なサイズや配置のViewヒエラルキーを組む時
    • 親Viewのサイズ変更に合わせてレイアウトしなおす処理を追加で書く必要が無くなる
    • 例: 不特定サイズの画像を表示するTable view cell内のViewのレイアウト
  2. Interface Builderを使わないでViewを組む時
    • 位置とサイズベースではなく、制約ベースでレイアウトを定義できる
    • 例: 「親Viewに対して上下左右に10pxのマージンを設けた子Viewを配置」というセマンティクスで定義できる

2つめは、異なるスタイルで記述できるという事なんですが、利点となるには苦しい理由があります。
僕の場合はInterface Builderを使わないので、2番が利点にならなければ使う意味はほぼありません。

超めんどくさいAutoLayoutの記述

コードベースでのUI実装において、AutoLayoutが利点となるには苦しいその理由は、AutoLayoutをコードで記述すると超冗長になるという点です。
つまり、全然簡単じゃない!楽じゃない!

「親Viewに対して上下左右に10pxのマージンを設けた子Viewを配置」を実際にコードで記述した場合、以下のようになります。

#!objectivec
UIView *superview = self;

UIView *view1 = [[UIView alloc] init];
view1.translatesAutoresizingMaskIntoConstraints = NO;
view1.backgroundColor = [UIColor greenColor];
[superview addSubview:view1];

UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);

[superview addConstraints:@[

    //view1 constraints
    [NSLayoutConstraint constraintWithItem:view1
                                 attribute:NSLayoutAttributeTop
                                 relatedBy:NSLayoutRelationEqual
                                    toItem:superview
                                 attribute:NSLayoutAttributeTop
                                multiplier:1.0
                                  constant:padding.top],

    [NSLayoutConstraint constraintWithItem:view1
                                 attribute:NSLayoutAttributeLeft
                                 relatedBy:NSLayoutRelationEqual
                                    toItem:superview
                                 attribute:NSLayoutAttributeLeft
                                multiplier:1.0
                                  constant:padding.left],   

    [NSLayoutConstraint constraintWithItem:view1
                                 attribute:NSLayoutAttributeBottom
                                 relatedBy:NSLayoutRelationEqual
                                    toItem:superview
                                 attribute:NSLayoutAttributeBottom
                                multiplier:1.0
                                  constant:-padding.bottom],

    [NSLayoutConstraint constraintWithItem:view1
                                 attribute:NSLayoutAttributeRight
                                 relatedBy:NSLayoutRelationEqual
                                    toItem:superview
                                 attribute:NSLayoutAttributeRight
                                multiplier:1
                                  constant:-padding.right],

 ]];

はい、やってられないですね!

Masonryでお手軽AutoLayout

AutoLayoutは便利だけど、NSLayoutConstraintによる記述は前述の通り冗長で面倒です。
それが原因で、利点を感じられず個人的に今まで全く使ってきませんでした。

しかし、Masonryというライブラリがこの悩みを一気に解決してくれました。
このライブラリは、AutoLayoutの学習コストを最小限に押さえつつ、少ない記述量で使用できるようにしてくれるものです。
これは嬉しい!

前述の例「親Viewに対して上下左右に10pxのマージンを設けた子Viewを配置」をMasonryで記述すると:

#!objectivec
UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);

[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
    make.edges.equalTo(superview).with.insets(padding);
}];

とっっっっっても簡単ですね!!
制約ベースでの記述は、HTMLとCSSのような感覚で書けるので、とても重宝しそうです。

[XCode] 見づらいコードをショートカットキー一発で綺麗に整形する方法

xcode

コードの整形は手間がかかる

代入文って10行とか20行とかになると、一気に見づらくなりますよね。
特に、Interface Builder使わないでコードでUIを組み立てたりしてると、プロパティの設定処理で平気で100行になります。
例えばこんなコード・・

#!objectivec
cell.backgroundView.layer.shadowColor = [UIColor blackColor].CGColor;
cell.backgroundView.layer.shadowOffset = CGSizeMake(0, 4);
cell.backgroundView.layer.shadowOpacity = 0.8;
cell.backgroundView.layer.shadowRadius = 10;
cell.backgroundView.layer.masksToBounds = NO;
cell.backgroundView.layer.shouldRasterize = YES;
cell.backgroundView.layer.rasterizationScale = [UIScreen mainScreen].scale;
cell.backgroundView.layer.contentsScale = [[UIScreen mainScreen] scale];
cell.selectedBackgroundView.layer.shadowColor = [UIColor blackColor].CGColor;
cell.selectedBackgroundView.layer.shadowOffset = CGSizeMake(0, 4);
cell.selectedBackgroundView.layer.shadowOpacity = 0.8;
cell.selectedBackgroundView.layer.shadowRadius = 10;
cell.selectedBackgroundView.layer.masksToBounds = NO;
cell.selectedBackgroundView.layer.shouldRasterize = YES;
cell.selectedBackgroundView.layer.rasterizationScale = [UIScreen mainScreen].scale;
cell.selectedBackgroundView.layer.contentsScale = [[UIScreen mainScreen] scale];

はい、とっても汚いですね。理想は・・

#!objectivec
cell.backgroundView.layer.shadowColor                = [UIColor blackColor].CGColor;
cell.backgroundView.layer.shadowOffset               = CGSizeMake(0, 4);
cell.backgroundView.layer.shadowOpacity              = 0.8;
cell.backgroundView.layer.shadowRadius               = 10;
cell.backgroundView.layer.masksToBounds              = NO;
cell.backgroundView.layer.shouldRasterize            = YES;
cell.backgroundView.layer.rasterizationScale         = [UIScreen mainScreen].scale;
cell.backgroundView.layer.contentsScale              = [[UIScreen mainScreen] scale];
cell.selectedBackgroundView.layer.shadowColor        = [UIColor blackColor].CGColor;
cell.selectedBackgroundView.layer.shadowOffset       = CGSizeMake(0, 4);
cell.selectedBackgroundView.layer.shadowOpacity      = 0.8;
cell.selectedBackgroundView.layer.shadowRadius       = 10;
cell.selectedBackgroundView.layer.masksToBounds      = NO;
cell.selectedBackgroundView.layer.shouldRasterize    = YES;
cell.selectedBackgroundView.layer.rasterizationScale = [UIScreen mainScreen].scale;
cell.selectedBackgroundView.layer.contentsScale      = [[UIScreen mainScreen] scale];

非常に綺麗です。
でも、スペース打つの面倒くさい。。

そこで、上記のようなコードの整形をショートカットキー一発で出来るXCodeプラグインをご紹介します!

XCodeプラグイン「XAlign」が便利

XAlignは、文字通りAligningを手伝ってくれるプラグインです。

インストール方法

コマンド一発で即完了。

#!bash
$ curl github.so/XAlign/build/install.sh | sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   896  100   896    0     0   1805      0 --:--:-- --:--:-- --:--:--  1851
Password:
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 34311  100 34311    0     0  52104      0 --:--:-- --:--:-- --:--:-- 52543

XAlign is installed. Please Restart Your Xcode.

More info: https://github.com/qfish/XAlign/

To uninstall XAlign, `curl github.so/XAlign/build/uninstall.sh | sh`
.

XCodeを再起動しましょう。

整形の実行

以下のデモンストレーションのように、「シフト+?+X」で自動整形を実行します。

XAlign

すごいですねww 今までの苦労は一体ww
#defineプリプロセッサ文や、@property構文などにも有効なようです。

みなさんもぜひ試してみてください!

[WordPress] Markdownで記述した記事内のソースコード部分をハイライトする方法

WordPress

この辺は至る所で既に書かれた話題だと思いますが、自分にあった方法の備忘録という事でご紹介します!
WordPressで楽しく記事を書くにあたって、僕の要件は下記の通りです:

  • Markdownで書きたい
  • 記事内で紹介したプログラムのソースコードのシンタックスをハイライトしたい
  • ハイライトのカラースキーマにSolarized-darkを使いたい

Solarizedの配色は見やすいしカッコイイのでマジでおすすめです。

これらは、以下の二つのプラグインを使用する事で実現できます:

しかし、ここで一点問題があります。
highlight.jsは、記述するプログラムの言語をタグのクラス名で明示的に指定出来ます。
指定しなければ、自動で言語を検出してくれますが、その精度はイマイチです。
残念な事に、Markdownの記法ではクラス名を指定出来ません。
だからといって、HTMLを部分的に書くなんて気持ちよさが半減です!
以下のプラグインがこの悩みを解決してくれました:

このプラグインで、Markdown記法でも言語を明示できるようになります!
以下のようにして、コードの最初の行に#!に続いて言語の名前を記述すればOK。

#!ruby
class Foo < Bar
  def hello
    puts "Hello World!"
  end
end

結果:

#!ruby
class Foo < Bar
  def hello
    puts "Hello World!"
  end
end

objectivecbashjavaなどhighlight.jsで対応している言語の名前を指定できます。
快適!

蛇足

もう少し調べたら、GitHub Flavored Markdown for WordPressというのがあって、three backticksでコードブロックが使えるようになるらしい。
現状で割と満足なので、また気が向いたらトライしてみよう。

CocoaPodsで自動生成されたターゲットにPreprocessor Macroを定義する方法

CocoaPods

どんな時に必要?

CocoaPodsベースのプロジェクトでアプリケーションを開発している時で、特に自前のモジュールもpodでパッケージングしている場合に必要になる事があります。
僕の場合は、pod化した自前モジュールをUnitTestしたい時でした。

ビルド方法によってPreprocessor Macroを切り替えたい

サーバサイドのAPIラッパモジュールを例にとって考えてみたいと思います。
サーバサイドには、ステージング環境や本番環境の切り替えが必要な事がよくあります。
また、その切り替え方法にはPreprocessor Macrosを使用するのが一般的だと思います。

達成したい要件は、以下のようにビルド方法によって環境を切り替える事です:

  • UnitTestの時は必ずステージング環境でコンパイル
  • このモジュールを使用するアプリケーションのワーキングスペースorプロジェクトでは、各ターゲットの設定に従う

Prefix Headerでは上手く出来ない

モジュールをpod化していなければ、普通にUnitTestターゲットのprefix header(*.pch)内に定義すればいいだけです。
しかしpod化している場合、モジュールはCocoaPodsが自動で生成したプロジェクトでコンパイルされるため、テストターゲットで定義したフラグは効果がありません。
さらに、Podsプロジェクトのprefix headerとかプロジェクトのBuild Settingsで設定しても、pod installを実行する毎にリセットされてしまいます。

Podfilepost_installでフラグを指定する

Podfileには、podがインストールされた後のイベントをHookできます。(参考: CocoaPods Guides – Podfile Syntax Reference)
これを使って、モジュールのターゲットのPreprocessor Macrosを変更できます。
Podfileは以下のように書きます:

workspace 'APIWrapper'

platform :ios, '6.0'

xcodeproj 'Tests/APIWrapper Tests'

target :'APIWrapper Tests', :exclusive => true do
   pod 'Kiwi/XCTest'
   pod 'APIWrapper', :path => './'
end

# インストール後に実行される処理を記述
post_install do |installer|

  POD_TARGET_NAME = "Pods-APIWrapper Tests-APIWrapper"

  # 変更したいビルドターゲットを探す
  classy_pods_target = installer.project.targets.find{ |target| target.name == POD_TARGET_NAME }
  unless classy_pods_target
    raise ::Pod::Informative, "Failed to find '" << POD_TARGET_NAME << "' target"
  end

  # ビルド設定を追加
  classy_pods_target.build_configurations.each do |config|
    # Debugターゲットのみ変更
    if config.name == "Debug"
      # Preprocessor Macrosを変更する
      config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)']
      # ステージングのフラグを立てる
      config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] <<  "STAGING"
    end
  end

end

これで、UnitTest用ワーキングスペースで、テスト対象のpodモジュールのPreprocessor Macrosを変更できます!
アプリケーション用のワーキングスペースでは、テスト用の設定は全く気にせずにコーディングできます。