OmniAICreator/Qiita-1.07M huggingface dataset:
Chefハンズオン#3 サードパーティクックブックを利用したレシピの作成


他のクックブック内のレシピを利用する
------------------------------

サードパーティクックブックを利用する前に、まずは他のクックブックを呼び出す方法について紹介します。

Chefでは各レシピを `include_recipe` で呼び出し合うことが出来ます。

例えば sample クックブックのレシピ内で、resource-sample クックブックの default レシピが欲しい場合は以下のように記述します。

```ruby:sample/metadata.rb
depends 'resource-sample'
```

```ruby:sample/recipe/default.rb
include_recipe 'resource-sample::default'
```

同一のchef-repoに含まれるクックブックについては`metadata.rb`の記述は必要ありませんが、意識して依存性を記述したほうがよいでしょう。

また、defaultレシピを使う場合は `include_recipe 'resource-sample'` と省略することも出来ます。

### レシピが重複してもいいの？

上記のようにsample2からsampleを利用した状態で、両方のレシピをrun_listに含めることが出来ます。この場合はどのような挙動になるでしょうか。

sample::defaultが重複するように思えますが、実際の実行結果は二重に実行することはありません。重複するものは同じリソース定義なので、Chefの実行時に一つのリソース定義とみなしています。

サードパーティのクックブックを利用する
--------------------------------

同様の手段でサードパーティのクックブックをインターネットから取得して利用することが出来ます。

クックブックの管理するツールにはいくつかありますが、ここでは[Berkshelf](berkshelf.com)を利用します。
まず、第一回の`knife solo init`コマンドでchef-repoを作成した際に、既に生成されている `Berksfile` を編集します。

```ruby:Berksfile
source 'https://supermarket.getchef.com'

cookbook 'java', '~> 1.27.0'
```

タイミングによって `source` の部分のURLが違うかもしれません。旧URLでも利用可能なようですが、Berkshelf公式サイトでも書き換わっているため、随時修正するのがよいでしょう。



上記ではjavaクックブックを指定しました。まずはこのクックブックをダウンロードしてみましょう。

```
$ berks vendor cookbooks
$ ls cookbooks/
```

cookbooks/ 以下に java クックブックがダウンロードされます。これで利用可能になります。sample3クックブックを作って呼び出してみましょう。

```
$ knife cookbook create sample3 -o site-cookbooks
```

```ruby:sample3/metadata.rb
depends 'java'
```

```ruby:sample3/recipe/default.rb
include_recipe 'java::default'
```

```json:nodes/vagrant.json
{
  "run_list": [
    "recipe[sample1]",
    "recipe[sample2]",
    "recipe[sample3]"
  ]
}
```

`knife solo cook vagrant` を実行すると、javaがインストールされます。特に指定がない場合、openjdk-6-javaがインストールされるはずです。

(TODO: java -version, echo $JAVA_HOMEの結果)

しかし、Java6は既にObsolateですし、OpenJDKじゃなくてOracle Javaが使いたい、という場合はあるでしょう。その時はクックブックに予め設定されている属性(attribute)を書き換えてあげます。

```ruby:sample3/attributes/default.rb
default[:java][:jdk_version] = '8'
default[:java][:install_flavor] = 'oracle'
default[:java][:oracle][:accept_oracle_download_terms] = true
```

再度実行してみると、Javaのバージョンなどが更新されます。
ついでに、JAVA_HOMEなどの環境変数もきちんと更新されます。

(TODO: java -version, echo $JAVA_HOME)

### run_listに直接書いてはいけないの？

sample3クックブックで
Swift - Xcode 6(.1-Beta)? における変更点

というわけで[デカiPhoneとキョダiPhone]と[iではじまらないのかいWatch]が出た裏で、[Swiftも1.0に]なりましたね。

[デカiPhoneとキョダiPhone]: http://www.apple.com/jp/iphone-6/
[iではじまらないのかいWatch]: http://www.apple.com/jp/watch/
[Swiftも1.0に]: https://developer.apple.com/swift/blog/?id=14

## OS X Target には XCode 6.1-Beta が必須

一番重要なのはこれ。**XCode 6 GMではSwiftでOS X Appsはビルドできないどころか、プロジェクトの新規作成さえできません**。これを見落として6GMをインストールしてちょっと汗りました。「iOS Appsしか作りません」という方以外は、必ず**6.1-Beta**の方をインストールしましょう。

ちなみに Yosemite は DP7 のままですね。今まで一緒だったので少しリズムが狂いました。

## Beta6より引き続き…

[Optional型に関するさらなる改良]が進んでいるようです。

[Optional型に関するさらなる改良]: http://qiita.com/dankogai/items/9058a8d4209cf59580db#2-1

これの絡みかどうかわかりませんが、[swift-json]で`NSURL.URLWithString(url)`と書いていたところが今回引っかかって`NSURL(string:url)`と[書き直しました]。

[swift-json]: http://qiita.com/dankogai/items/e3d9882f4d25bc44cc03
[書き直しました]: https://github.com/dankogai/swift-json/commit/a24611b5726c41451dc3bcd1d1a8b99f0b4c1eef

こちらからはとりあえず以上です。

Dan the Swift Newbie
継承されたフィルターを、特定のコントローラーだけ無効化

#Rubyで特定の子コントローラだけで無効化したい

個人用メモ
親コントローラー設定したフィルターを、子コントローラーでは無効化したい時の書き方

skip_before_filter / skip_after_filter を使うのが一般的なようです

##特定のフィルターのみ無効化

###skip_before_filterのonlyで指定

* 親コントローラー

```
class ApplicationController < ActionController::Base
  before_filter :test_filter

  private

  def test1 # test_filterが実行される
    …
  end
end
```

* 子コントローラー

オプションでonlyを指定しているので、test2だけ無効化される

```
class ChildController < ApplicationController
  skip_before_filter :test_filter,
                     :only => :test2

  def test2 # test_filterが実行されない
    …
  end

  def test3  # test_filterが実行される
    …
  end
end
```

##特定のフィルター以外を無効化

###skip_before_filterのexceptで指定

```
class ChildController < ApplicationController
  skip_before_filter :test_filter,
                     :except => :test2

  def test2 # test_filterが実行される
    …
  end

  def test3  # test_filterが実行されない
    …
  end

  def test4  # test_filterが実行されない
    …
  end
end
```

## 備考

###after_filterの場合

skip_after_filter で skip_before_filterと同じようにすればOK
【プログラミング48(/2 -1)手】Abstract Factory


## ポイント
具体的なクラスを明確にすることなく、関連し合うオブジェクトの集まりを生成することができるクラスを利用したパターン。
簡単に言えば、AbstractFactory（抽象Factoryクラス）を作成し、ConcreteFactory（具象Factoryクラス）を組み合わせて使ったり、効率的に管理するためのパターンだそう。


## サンプルコード
※以下サイトと同じですので、割愛。
http://morizyun.github.io/blog/ruby-design-pattern-14-abstract-factory/

## 所感
* 矛盾のない組み合わせて、オブジェクトを生成できるFactoryMethodだそう。
* 抽象化しておくことで、具象クラスの追加、削除更新を容易にする。  
  DBとかのアクセスオブジェクトで、Oracle,MySQLなどの  
  ミドルウェアの差異による部分を隠匿するのに使ったりするらしい。
* 言っていることは何となくわかるのだけど、
  実際にFactoryMethodだけじゃだめー。というパターンに出くわさないと、
  その差異を明確に自分に取り込めない気がする。。ので疑問は認識した状態で一端放置することにする。

## 参考
http://think-on-object.blogspot.jp/2011/11/factoryfactory-methodabstract-factory.html
http://capm-network.com/?tag=%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-AbstractFactory
S3 に CloudFront を適用するときの注意点

CloudFront では Minimum TTL という設定項目でキャッシュ時間を指定できますが、S3 に CloudFront を適用する場合、何もしなければ **Minimum TTL は有効に働かず、キャッシュ時間はデフォルトの「24時間」になってしまう**ことがあります。

[CloudFrontのキャッシュ時間(TTL)はどの程度なのか](http://dev.classmethod.jp/cloud/aws/cloudfront-ttl/) 

こちらの表にまとまっているように、キャッシュ時間はオリジンサーバーのヘッダの返却値と Minimum TTL との掛け合わせによって算出されます。
S3 ではデフォルトではこれらのヘッダは設定されないため、メタデータに「Cache-Control: max-age=0」を設定する必要があります。

CloudFront の Minimum TTL は**必ず有効に働くわけではない**ことに注意しましょう。
既存プロジェクトにSwiftでExtensionを作ったらなんか動かない時の対処法


iOS8GM出ましたね！いまiOS8対応真っ盛りだと思います。

# ObjCのアプリでSwiftのExtensionを作るとクラッシュ
iOS8でExtensionが追加され挑戦されている方が多いかと思います。
そしてターゲットがわかれているのであえてSwiftに挑戦されている方もいるでしょう。ここで罠がありましたのでお知らせします。ObjCのアプリでSwiftのExtensionを作るとクラッシュします！

# 原因
Swiftを実行するにはSwift Standard Libraryが含まれている必要がありますが、ObjCのプロジェクトにはこれは含まれません。
そしてExtensionなどはそれ自身ではStandard Libraryを持っておらず、埋め込んだアプリのStandard Libraryを利用する仕様となっています。
したがって、ObjCのプロジェクトに対してSwiftでExtensionを作るとStandard Libraryが無いので読み込めずExtensionが即落ちして起動しなくなります。

# 対処法
メインのアプリの方にSwift Standard Libraryを入れる必要があります。
対応方法はメインアプリの方のBuild SettingsでEmbedded Content Contains Swift CodeをYESに設定します。
![スクリーンショット 2014-09-10 14.35.15.png](https://qiita-image-store.s3.amazonaws.com/0/32525/8017512e-5a82-bc4d-2470-e0d0e2c0ccec.png "スクリーンショット 2014-09-10 14.35.15.png")

あとなCleanして本体アプリをビルドした後にExtensionをビルドすれば動くようになるはずです。

# ソース
Xcode6のリリースノートにKnown Issueで書いていました。
Xcode6.1までに直っていることを期待したいです。


>The build step which embeds the Swift standard libraries in a bundle only runs for application product types, and only if the application itself, independent of any embedded content, contains Swift source files.
When building an application that does not contain Swift source files but embeds other content (like frameworks, XPC services, app extensions, and so on) that does contain Swift code, you must set the build setting Embedded Content Contains Swift Code (EMBEDDED_CONTENT_CONTAINS_SWIFT). That way the Swift libraries will be included in the application. (17757566)
http://adcdownload.apple.com//Developer_Tools/xcode_6_gm_seed_txl4k3/xcode_6_release_notes.pdf
Playframework の Lang でつらいところ


## 基本的な使い方

Playframework で国際化するときには `play.api.i18n.Messages()` を使う。

https://www.playframework.com/documentation/2.3.x/ScalaI18N

````
val title = Messages("home.title")
````

でもって `conf/messages`, `conf/messages.ja` などに次のように書いておくと翻訳される。

````
home.title=ホーム
````

`Messages("home.title")` は [`play.api.i18n.Messages`](https://www.playframework.com/documentation/2.3.x/api/scala/index.html#play.api.i18n.Messages$) の `apply()` メソッドを呼び出している。`apply()` メソッドは `play.api.i18n.Lang` 型 (以下 `Lang`)の implicit 引数を取る。

````
def apply(key: String, args: Any*)(implicit lang: Lang): String
````

`Messages.apply()` はテンプレートの中で使われることが多い。
公式ドキュメントでは twirl テンプレートに implicit で Lang を渡すように Note が書かれている。

````
@* テンプレートの引数宣言。implicit で Lang を渡す *@
@()(implicit lang: Lang)

<h1>@Messages("home.title")</h1>
````

テンプレート以外の場合でも同じように implicit で渡すことができる。

````
  // Scala コード中で implicit として渡す
  def title(implicit l: Lang) = Messages("home.title")
````

コントローラメソッドを Action で書くときは implicit な `play.api.mvc.Request` を取るようにして使う。


````
  def index = Action { implicit request =>
    Ok(views.html.index())
  }
````

## 問題

`Lang` implicit を渡し忘れてもコンパイルエラーにならない。

`Lang` companion object に implicit が定義されている。引数で渡し忘れるとそちらが使われる。

なお companion object の実装は、JVMが動作している環境のデフォルト言語となる。リクエストごとに言語を切り替えたいことが多いため、companion object の実装が使われると残念な思いをすることが多い。

### よくある例1. テンプレートの引数で宣言し忘れる

````
@* (implicit lang: Lang) を付け忘れ *@
@()

<h1>@Messages("home.title")</h1>
````

### よくある例2. 関数の引数で宣言し忘れる

````
  // (implicit l: Lang) を付け忘れ
  def title = Messages("home.title")
````

### よくある例3. implicit request を付け忘れる

`Request` から `Lang` へは `play.api.mvc.Controller#request2lang()` の implicit 変換がなされるが、`Request` がなければ `Lang` へも変換されない。

````
  // implicit request => を付け忘れ
  def index = Action {
    Ok(views.html.index())
  }
````

### よくはないけどはまった例

わかったよ。implicit で引き回すから忘れるんだろう。普通の引数にすればいいじゃないか。

````
  // Play 2.2 では companion object の Lang が使われてしまう
  def index = Action { implicit request =>
    // 暗黙的なものを取り出して、
    val lang = implicitly[Lang]
    // 以下 lang を明示的に渡して回る
    ...
  }
````

Play 2.2 では `Request` から `Lang` に変換する implicit def の名前が lang で、local 変数によって implicit が効かなくなる模様。（Scala のバグ？)
lang 以外の変数名(例えば `_lang`)を使えば期待したとおり動作する。

Play 2.3 では request2lang という名前に置き換わった。 `val request2lang = ...` とすれば同じような問題が発生しそう。

https://github.com/playframework/playframework/issues/2605
https://gist.github.com/tkawachi/8e4987441f775786d1d8

## 解決法

<del>だれか良い解決法をください。</del>
コメント欄に素敵な解決策が。

## メモ

IntelliJ で Cmd+Shift+p を押すと、カーソルがある場所で使われている implicit がどこで定義されているかを参照することができる。便利。知らなかった。
 
![Screen Shot 2014-09-10 at 14.17.35.png](https://qiita-image-store.s3.amazonaws.com/0/5441/a7c8de78-d4a9-5ab6-6bf6-086150c0d7b2.png "Screen Shot 2014-09-10 at 14.17.35.png")

http://confluence.jetbrains.com/display/IntelliJIDEA/Working+with+Scala+Implicit+Conversions
AWS Cloud Storage & DB Day - TA-02 AWSストレージ関連サービスの正しい理解と使い方講座

# クラウドストレージを使う意義
## 用途
* ファイル
* DB
* ログデータ
* バックアップアーカイブ
* ビッグデータ
* メディアコンテンツ

## 重労働なストレージ管理
* サイジングは難しい
* ハードウェア関連の管理が厳しい

## システム毎に独立したストレージがいる。
* 3～5年単位で繰り返し
* 管理に忙殺されるため、有効利用できてない

## クラウドストレージを使うことで
* データの有効利用に役立つ
* 蓄積と利用のループ
 * コンテンツグラビティ

## AWSの各サービスはAmazonS3を軸にしている
* 特徴
 * 高い耐久性
 * 柔軟性

## Amazon S3
*  高頻度アクセスを想定した安価かつ耐久性の高いオンラインサービス
* 99.99999999%

## Amazon Glacier
* 低頻度アクセスを想定した超安価かつ耐久性の高いコールドストレージサービス
* 取り出すのに3~4時間程度かかる。

## AWS Storage Gateway
* オンプレミス環境と連携したバックアップ＆ストレージゲートウェイ

## Amazon EBS
* 仮想ディスク
* スナップショット
* 暗号化サポート
* SSDサポート

## Amazon Zocalo(ぞかろ)
* コラボレーション機能(Web画面上でフィードバック)

# case
## ファイルサーバ
### 小中規模
* EBSを共有
* 社内からつなぐ場合はVPN or 専用線
* バックアップはワンクリックでS3
### 大規模
* Storage Gatewayを経由してS3とつなぐ
 * I-SCSIとして見える。
 * 最大150TB
* Strage Gatewayを社内において、S3にデータ格納のみ行う方法もあり。

## バックアップストレージ
* Storage Gatewayを使う
 * サーバからの見え方は外部ディスクとして見える。
* NAS経由でS3にバックアップ

## アーカイブ
* S3→Glacier(Life Cycle Policyで設定も可能)
* S3経由でファイル出し入れ
* AWS Import Export
 * 日本ではまだ提供していない 
 * パートナー企業さんが日本では提供

## データHUBストレージ(S3)
* データ収集
 * Kiness
 * fluentd
* 各種サービスへの展開
 * Elastic MapReduce(Hadoop)
 * RedShift
* ファイル共有
 * S3をFTPのように使う
 * iamで管理(必要なデータを必要な人に)

## コンテンツ配信用のストレージ
* Webサーバ(静的コンテンツ)
* CloudFlontと組み合わせる
* 動的コンテンツはEC2

## 動画配信
* Elastic Transcoder
【追記あり】Unity で出力したプロジェクトが iOS8 でビルドできない (できなかった) 件について

# 最新情報 [Update: 2014-09-19]

Unity 4.5.4f1 にて、iOS 8 (ってか Xcode 6) への対応が済んでいるようです。

全部調べきったわけじゃ無いけど、一応ビルドが通って、普通に起動できるレベルまでは確認しました。

ただし、iOS 8 から Push Notification の仕組みが変わっているため、Unity が提供している `NotificationServices.RegisterForRemoteNotificationTypes()` を使っている場合には、APNs への登録は動作しません。

自前で Native Plugin 書くなりしましょう。

\# ひょっとしたら、パッチリリースで対応されてるかも？ ← まだ調べてない。

# 以下古い情報
本日 (2014-09-10) に Apple のプレス向け発表会で iPhone6 やら Apple Watch やら Apple Pay やらが発表されましたね！

で、Xcode 6 の GM seed も公開されております！

iPhone 6 やら iPhone 6 Plus やらのシミュレータも入っております！

ってことは、当然「動くかな？」って試すのが人の性ってものです。

## 先に結論

うごきません。

ビルド出来ません。

## 環境

* Unity: 4.3.4f1
* Xcode: 6 GM seed

4.5.3 では試してないけど、Trampoline 見る限りでは同じだと思う。

## 原因

Unity が吐き出すクラスの中に使えなくなった定数を用いている箇所があるため。

具体的には *Classes/Unity/CMVideoSampling.mm* 内の50行目と63行目。

「`GL_BGRA_EXT` なんかないよー」って言われます。

## 対策

まぁ、代替となる定数に変えるのが手っ取り早いんじゃないかと。

```objective-c:50行目
-		sampling->cvTextureCacheTexture = CreateTextureFromCVTextureCache(sampling->cvTextureCache, cvImageBuffer, w, h, GL_RGBA, GL_BGRA_EXT, GL_UNSIGNED_BYTE);
+		sampling->cvTextureCacheTexture = CreateTextureFromCVTextureCache(sampling->cvTextureCache, cvImageBuffer, w, h, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE);
```

```objective-c:63行目
-		GLES_CHK(glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, texData));
-		GLES_CHK(glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, texData));
```

これで本当に影響が一切ないのかどうかは調べてません。自己責任でヨロ。

<ins>影響あるらしいです。詳しくは追記参照のこと。</ins>

## おまけ

毎回書き換えるのが面倒だ！って人は `PostProcessBuild` で書き換えるか、Trampoline いじっちゃいませう。

Trampoline の場所は以下の通り。
* Unity 4.3.4f1 の場合: */Applications/Unity/Unity.app/Contents/PlaybackEngines/iPhonePlayer/iPhone-Trampoline/Classes/Unity/CMVideoSampling.mm*
* Unity 4.5.3f1 の場合: */Applications/Unity/Unity.app/Contents/PlaybackEngines/iOSSupport/Trampoline/Classes/Unity/CMVideoSampling.mm*

# 追記

## 2014-09-19 10:20

Unity の自動アップデート通知が降ってこなかったので気付かなかったんですが、実は Unity 4.5.4f1 が既にリリースされており、それを使ったところ無事にビルドできました。

この記事は既に陳腐化しておりますｗ

## 2014-09-11 12:45

コメント頂戴しまして、どうやら、上記の修正方法は拙い様子。

具体的にどう拙いかはボクの知識が足りず、理解出来ませんでしたが、Unity 本体のアップデートを待ちましょう。

Facebook の [Unity ユーザ助け合い所](https://www.facebook.com/groups/unityuserj/permalink/752519271474682/) での情報によると、iOS8 と Xcode 6 への対応が行われた 4.5.4 が近々来るらしいです。
アプリをiPhone6/6+のStandard viewに対応させる

ドキュメントは見つけられず。

`Launch Image Source`に画像を指定してもZoom viewのまま。
RetinaHD5.5/4.7を指定しても変わらず。原因はよく分かりませんでした。
（古くから伝わる秘伝の`.xcodeproj`だからかもしれません）

代わりに、`Launch Screen File`を指定したらStandard viewで起動しました。

`Launch Screen File`には`storyboard`か`xib`を指定。

そういえば、`xib`は遅いから使わないのが常識みたいな時代もありました。
工数見積の際に子供の看護リスクを織り込む計算式

#はじめに

あるプロジェクトにアサインされたエンジニアに子供がいる場合、子供の病気・怪我の看護などで稼働不能になる場合があります。
スケジュール管理のために工数見積を出す場合（クライアントに出す見積もりとは別）、予めこのリスクを織り込む計算式を作成しました。

※なお、各値は私の経験上の概算値であり、統計的有意性のある値ではありません。どなたか関連する統計をご存じの方は情報をお願いします。

#加算値

| 子供の年齢 | リスク加算値(r) |
|:-----------|------------:|
| 0 - 3       | +0.04 |
| 4 - 8     |      +0.02 |
| 9 -       |      +0.01 |

#調整係数

| 条件 | 調整係数(x) |
|:-----------|------------:|
| 12 - 2月       |        +0.2 |
| 6 - 7, 9月 (8月は夏休みで怪我が増えるため除外) |      -0.2 |
| パートナー等と看護をシェアできる場合     | -0.1 ~ -0.9 |

#計算式

シビアに見積もった工数をdとした時の計算式：
` d + d(( r1 [ + r2 … + rn] ) * x1 [* x2] )`

#例

例）1, 3, 5歳の子供がいて、夫婦で看護を半々にシェアできるエンジニアの当初の見積工数が30人/日、時期は1月~2月の場合

` 30 + 30 * (( 0.04 + 0.04 + 0.02 ) * 1.2 * 0.5 ) = 31.8 `

ということで計算後の見積工数は32人/日ということになります。

#さいごに

半分ネタで半分本気です :jack_o_lantern: :ghost:
作成したgemを扱う際の注意点

## 背景

最近gemを作成していたが、その際にハマった点・やらかした点を整理して、備忘録として残しておく。


## 前提

gitを使ってgemを開発していること。
bundle gemでgemの雛形を作成していること。


## build時の注意点

#### buildする前にgit addする

gem作成途中に動作確認をしようと思ってbuildしてinstallしたが、上手く動作しないことがあった。
unpackして中身を確認したところ、以下の状況。

* 既存のファイルの変更分は反映されている
* 新規作成したファイルが含まれていない

調べてみるとgit add していないことが原因だった。

##### なぜgit addしないとbuildされたgemに新規作成したファイルが含まれないのか？

bundle gemで作成したgemの雛形のgemspecにはspec.filesの指定がある。

```rb:mygem.gemspec
Gem::Specification.new do |spec|
  # ... 省略 ...
  spec.files         = `git ls-files`.split($/)
end
```

spec.filesはgemに含めるファイルを指定するもので、git ls-filesを使って指定している。
git ls-filesはgitのインデックスに登録されているファイル群を表示するコマンド。
gitのインデックスにはgit addすることで初めて登録される。

ようは、新規ファイルはaddしないとbuild対象にならないよ、ってことだった。


#### rake buildする前に同一バージョンのgemファイルがないか確認する

rake buildでpkg下にgemを作成した場合、既にファイルがある場合は上書きされない。
メッセージ上ではgemを新たに作ったように見えるので注意。

```bash
$ ls pkg/
mygem-0.0.1.gem

$ rake build
mygem 0.0.1 built to pkg/mygem-0.0.1.gem.
```

## push時の注意点

#### buildしたgemを確認してからpushする

build時の注意に記載したように、開発中にgemを作ってpkg下に配置したままだった場合、
rake releaseすると、既存のgemは上書きされず、開発中のgemがpushされてしまう。

個人的には以下の手順でpush(rake release)している。

1. pkg下の該当バージョンのgemがあれば削除
1. rake release前にrake build -> gem unpackで中身を確認 -> OKならgem削除
1. rake release

#### rubygems.orgに登録したgemは同一バージョンで差し替えできない

rubygems.orgの仕様。
同一バージョンのgemはpushできない (差し替えできない)

```bash:gem-push
$ gem push pkg/mygem-0.0.1.gem 
Pushing gem to https://rubygems.org...
Repushing of gem versions is not allowed.
Please use `gem yank` to remove bad gem releases.
```

```bash:rake-release
$ rake release
mygem 0.0.1 built to pkg/mygem-0.0.9.gem.
Tag v0.0.1 has already been created.
rake aborted!
Pushing gem to https://rubygems.org...
Repushing of gem versions is not allowed.
Please use `gem yank` to remove bad gem releases.
...
```

前述のように開発中のgemを誤ってpushした場合等は、該当バージョンを公開停止して、次のバージョンをpushするしかなくなる。

gemの公開停止は後述。


## gemを公開停止する

#### rubygems.orgに登録したとあるバージョンのgemを公開停止する

gemの公開停止にはgem yankコマンドを使う。
yankコマンドがない場合はgemcutterをインストールして使う。

**間違ったバージョンを消さないように注意する。**

```bash
## yankコマンドがない場合
$ gem yank mygem -v 0.0.1
ERROR:  While executing gem ... (RuntimeError)
    Unknown command yank

$ gem install gemcutter
$ gem yank mygem -v 0.0.1
```


## 参考

* [Bundler](http://bundler.io/)
* [Missing File in Gem after Build](http://stackoverflow.com/questions/16922322/missing-file-in-gem-after-build)
Goの構造体に付加するタグを複数にしたい場合

Modelとなる構造体に対して、dbのテーブルとのマッピングやjsonのkey名を指定したいときに、tagを利用する方法がある。

たとえば、Id・Description・CreatedAt というフィールド名を持つTodoという構造体と、それぞれがsnake caseとなっているDBテーブルのフィールドの紐付けは、構造体宣言時にこういうタグをつければいい。

```go:models/todo.go
package models

import "time"

type Todo struct {
    Id          int       `db:"id"`
    Description string    `db:"description"`
    CreatedAt   time.Time `db:"created_at"`
}
```

※ gorpの場合、テーブル名と構造体の紐付けは別の場所で行う

ここで、「このモデルそのままViewに投げてJSONで出力したいな〜」となったとき、
Todo構造体のフィールド名がそのままKey名になるため、以下のようなJSONになってしまう。

```json
{ "Id":1, "Description":"代々木公園から蚊を駆逐する", "CreatedAt":"2014-09-10T14:02:22Z"}
```

ここで気になるのが、「タグを複数つけることはできないのか」ということだが、問題なくできた。
バッククォート中にスペースで区切ることで、タグを複数付加することができる。

```go:models/todo.go
package models

import "time"

type Todo struct {
    Id          int       `db:"id" json:"id"`
    Description string    `db:"description" json:"description"`
    CreatedAt   time.Time `db:"created_at" json:"created_at"`
}
```

JSON表示するとこのとおり。

```json
{ "id":1, "description":"代々木公園から蚊を駆逐する", "created_at":"2014-09-10T14:02:22Z"}
```

## 注意事項

上記記事は Martini Webフレームワークおよびそのrenderプラグイン、そしてORマッパーにgorpを使用することを想定して作成した。
スマホアプリの画面設計には MetaMoJi Note がオススメ！

スマホアプリ開発で画面設計をしたいときにMetaMoJi Noteを使ったら、非常に良かったので紹介します。

# MetaMoJi Note とは

手書きノートアプリケーションです。
http://product.metamoji.com/ja/anytime/

通勤時間に電車の椅子に座って、
これで画面設計をガリガリ書いてます。

# メリット
## 手軽に書けて、部分選択で微調整が可能。
紙のノートに設計すると、デザインを微調整したい場合、
細かいところを消しゴムで消して、再度書きなおしての繰り返しだと思いますが、
metamoji noteだと、調整したい部分を範囲選択で選んで、直すだけなので、手間になりません。

## テンプレートを予め作っておくと、簡単に画面作成ができる。
自分はiPhone5sの画面サイズの縦横比を元に枠線を定義したA3サイズのテンプレートを使って、設計してます。

### （例）テンプレート用紙
![画面定義書_template.jpeg](https://qiita-image-store.s3.amazonaws.com/0/6727/2a55fd57-e55f-de8f-8029-f494eefabf77.jpeg)

上記のテンプレート用紙を作成して、下記のような画面設計を行ってます。

### 画面設計図（仮）
![画面定義書.jpeg](https://qiita-image-store.s3.amazonaws.com/0/6727/78810f5e-bc35-8578-af21-710186e00936.jpeg)

## PDFや画像ファイルに変換可能で、クラウドサービスに連携できるので、データを簡単にシェアできる。

できた設計書は画像に変換して、クラウドサービス（Dropbox, Google Drive等）に連携できます。
自分はチームメンバーにこの方法でデータをシェアしてます。
ページ毎に画像変換ができるので、モックアプリ（[POP](https://popapp.in/) 等）と連携して使い勝手を即座にテストするということも可能です。

# デメリット
## 有料アプリ
有料アプリで800円しますが、これだけ便利に設計できるノートアプリはなかなか無いので、オススメです。

# ついでに宣伝
上記で画面設計をしたiPhoneアプリを先日、リリースしました。
英単語をサクッと覚えたい方はぜひ使ってみてください。

[秒速英単語 - 1秒1問・短期間で覚える英単語帳アプリ](https://itunes.apple.com/us/app/miao-su-ying-dan-yu-1miao1wen/id879782688?mt=8)

以上です。
LinkedListとArrayListの要素削除速度比較

要素を削除したりする場合はArrayListよりLinkedListのほうが速い、ということは本で読んだので、実際どの程度違うのか、自分のマシンやってみた。
確かに、LinkedListはちょっぱやで、60～100倍くらい速かった。
ArrayListだけの方は実行する度処理時間が大きく変わった。
LinkedListの方は、ArrayListで生成したリストをaddAllしているんだけど、大したコストではない模様。

### 出力

```
after ArrayList iterator removal:list.size() = 0
処理時間:1146ミリ秒
after LinkedList iterator removal:list.size() = 0
処理時間:18ミリ秒
```

### コード

```java

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

public class Test {

	static int NUM = 100000;
	static String STR = "123456";
	public static void main(String[] args) {
		Test test = new Test();
		long a = System.currentTimeMillis();

		test.arrayListOnlyIteration();
		long b = System.currentTimeMillis();

		//計測
		System.out.println("処理時間:" + (b - a) + "ミリ秒");
		test.arrayListAndLinkedListIteration();

		//計測
		System.out.println("処理時間:" + (System.currentTimeMillis() - b) + "ミリ秒");
	}

	private void arrayListAndLinkedListIteration() {
		// TODO Auto-generated method stub
		List<String> list = new ArrayList<String>();
		for (int i = 0; i < NUM; i++) {
			list.add(STR);
		}
		LinkedList<String> ll = new LinkedList<String>();
		ll.addAll(list);
		Iterator<String> it = ll.iterator();
		while (it.hasNext()) {
			it.next();
			it.remove();
		}
		list = new ArrayList<String>();
		list.addAll(ll);
		System.out.println("after LinkedList iterator removal:list.size() = " + list.size());
	}

	private void arrayListOnlyIteration() {
		List<String> list = new ArrayList<String>();
		for (int i = 0; i < NUM; i++) {
			list.add(STR);
		}
		Iterator<String> it = list.iterator();
		while (it.hasNext()) {
			it.next();
			it.remove();
		}
		System.out.println("after ArrayList iterator removal:list.size() = " + list.size());
	}

}
```

以上になります。
Angular.jsでservice-&gt;controller、service-&gt;他のserviceに通知を出す方法


通知する側は
>$rootScope.$broadcast(イベント名);

で通知。

受け取る側は
>$scope.$on(イベント名, function(event) {});

や
>$rootScope.$on(イベント名, function(event) {});

で受け取る

###service->controllerに通知を出す方法
***

```sample.js
angular.module('sampleApp')
	.factory('SampleService', ["$rootScope", function($rootScope) {
		var data = 'サンプルデータ';
		function setData(val) {
			data = val;
			// SampleServiceのdataの値が変わったことを通知
			$rootScope.$broadcast('changeData', data);
		}
	}])
	.controller('SampleCtrl1', function ($scope) {
		// SampleServiceのdataの値が変わったことをキャッチ
		$scope.$on('changeData', function(event, data) {
			// ロジック
		});
	})
	.controller('SampleCtrl2', function ($scope) {
		// SampleServiceのdataの値が変わったことをキャッチ
		$scope.$on('changeData', function(event, data) {
			// ロジック
		});
	}); 
```


###service->他のserviceに通知を出す方法
***

```sample.js
angular.module('sampleApp')
	.factory('SampleService', ["$rootScope", function($rootScope) {
		var data = 'サンプルデータ';
		function setData(val) {
			data = val;
			// SampleServiceのdataの値が変わったことを通知
			$rootScope.$broadcast('changeData', data);
		}
	}])
	.factory('OtherService', ["$rootScope", function($rootScope) {
		// SampleServiceのdataの値が変わったことをキャッチ
		$scope.$on('changeData', function(event, data) {
			// ロジック
		});
	}]);
```
Google Drive の共有権限のデフォルトを変更する方法


こんにちは [@isseium](http://twitter.com/isseium) です．
Google Apps を使って組織内アカウントを管理して，Google Drive で情報共有しているチームや会社も多いのではないでしょうか？

MS Office を使わずに Google SpreadSheet や Google Docs などを活用している方々もよく目にするようになりました．

私は Google の SpreadSheet をよく使っていますが，作成したファイルの権限が自分だけになっており，組織内にシェアするときに毎回ファイル毎に公開権限を変更しなければならず，なんとかならないかなと思いまして調べてみました．


変更方法はとっても簡単で，組織内の共有設定を変更するのは下記のページにアクセスして

https://admin.google.com/AdminHome?fral=1#AppDetails:service=Drive+and+Docs&flyout=sharing


![google setting](http://i.gyazo.com/e7c7257d213bb9088a0f0fca366d078b.png)

権限を変更するだけです！

今回は，「リンクを知っている組織のユーザ」にしました．
これによって，権限の追加などをしなくても Slack などで「はいどうぞ〜 http://<google drieの url>」ってだけでファイルを渡せるようになりました．

便利ですね！
AWS Cloud Storage & DB Day - TA-01 AWSにおけるデータベース・サービスの活用

# AWS上にあるDBシステムの使い分けについて。
* フルマネージド・データベースの特性に応じた使い分け
* 運用管理システム管理者がやってたことをAWSが受け持ち。
 * 運用管理コストを下げる。

# SQL vs. NoSQL
* 日本ではSQLDBが多用
 * ACID属性
* NoSQL
 * 低レイテンシ、高スループット、シンプルなAPI
 * Webセッション管理]

# SQLデータベース
## RDS
* 特徴
 * 数クリックで作成
 * セキュリティグループ、VPC対応
* EC2で自作 VS.RDS
 * ハードウェアにかかわる作業は一切やらない
 * アプリケーションのみに特化
 * ReadReplica(MySQL)
 * MultiAZ
 * トランザクションログ(5分に1回S3に)
 * FailOverかかっても、DNSが自動に登録するため、アプリケーションではなにもしない。
* 使いどころ
 * 容易なスケールアップ
 * 既存資産の活用(人材、アプリ)
 * 運用管理コスト(バックアップ、パッチ適用)の削減
 * DCをまたいだ可用性 Multi-AZ

## Redshift
* 分析用の大容量業務統合DB
* 列指向型(カラムナ)データベース
 * 分析処理向き
* S3、DynamoDB等から直接データ取り込みが出来る。
* Case Study(MUJI Passport)
  * ターゲットマーケティング
  * AccessLog→サイトカタリストの内容を格納しBIツールで解析
* 使いどころ
 * データウェアハウス(100GB以上が向く)
 * OLTPでは使用しない(トランザクションはダメ)
 * BIツールからの分析
 * ROI(投資対効果)が不透明な中で大規模な投資リスクを下げる

# NoSQL
## ElastiCache
* 端的にいうとメモリキャッシュ
 * RDBでもシャーディングすればできるけど、後々大変。
* 何が出来る？
 * memcached, redisをサポート
 * MultiAZ
* Auto Discovery for memcached
 * Java,PHP client
* マネックス証券 Monex Insight
 * 速度を求められるところ
 * 各Tierが数分でスケールアップ可能
* つかいところ
 * key-valueでのアクセス
 * RDSで永続化されたデータを前提とし、キャッシュとして利用。

## DynamoDB
* AWSが独自で開発
 * データが3箇所のAZに保存される
 * ストレージ容量も自動でスケールアップ
 * Read/writeはそれぞれ必要な分だけ設定
 * 利用分だけの従量課金ストレージ
* 使い始めるには？
 * テーブルKey-Indexを決める
 * Read-Writeを決める
* Hash Key - Range Key
 * Hash Key：RDBでいうPK
 * Range Key：セカンダリキーのような使い方。
* 使いところ
 * キーとクエリでのアクセス
 * 堅牢性
 * スループットの容易な増減によるピーク付加への対応
 * 事実上無制限なDB(前段階で考えなければいけない、要件がカットできる。)

# EC2で自作する
* 用途に合わない場合は、EC2で自作する
 * AWSでできないことはEC2でやる。
 * が、当然運用コストは上がる。
データベースの排他制御レベルについて

## 排他制御は2種類ある
- 扱うデータによって２種類の排他制御を使い分ける
- UPDATE, DELETE の実行時は自動で行ロックがかかる
- UPDATE用のデータを取得するSELECTを実行するときにロックするかどうかの話

 >データの同時更新を防ぐための排他制御
 > http://codezine.jp/article/detail/6764

## A. 悲観的排他制御

- SELECT時にも行ロックを行う（SELECT ~ FOR UPDATE)、ロックしたユーザーしか更新できない。
- 利点：同時実行でも更新の衝突は起きない
- 欠点：パフォーマンスが落ちる。デッドロック（※）の懸念も増える

※２本以上のトランザクションが同タイミングで実行されたとき、
互いのロックにより処理が進まなくなってしまう状態

## B. 楽観的排他制御

- SELECT時にはロックをしないので、複数のユーザーが同時に更新できる。
- 利点：SELECT時にロックしない分パフォーマンスが向上する。
- 欠点：同時更新で衝突が起こる可能性
JavaScriptで文字列を複数行に記述するやり方




JavaScriptにはヒアドキュメントがありませんが、
下記のように行末に\を付けることで複数行の文字列を変数に代入することが出来ます。

```sample.js
var listCode = '\
     <li class="" data-pref-name="{{name}}" data-is-selected="false">\
          <span class="name">{{name}}</span>\
          <span class="count">{{coount}}</span>\
     </li>';
```

###追記
noyaさんのコメントにある通り、
Google JavaScript Style Guideでは\による文字列の連結は使わない方が良いとありました。
※というより、明確に「このような書き方は禁止です」と・・・

こちらの和訳ではECMAScript5では標準化されたとあるので、
この記事は一応残しておきます。
http://cou929.nu/data/google_javascript_style_guide/#string

noyaさん、有り難うございました。
CloudFront で SNI を利用する場合は TLS で

CloudFront に独自 SSL 証明書を適用する場合、下記の２パターンからクライアントサポートを選ぶ必要があります。

- IP モード
- SNI モード

IP モードでは全てのクライアントからアクセス可能となりますが、[月額 600 ドル](http://aws.amazon.com/jp/cloudfront/custom-ssl-domains/)かかってしまいます。
そのため、SNI モードで運用される方も多いと思いますが、SNI モードでサポートされるクライアントはどんなものなのでしょうか？
CloudFront では下記のように説明してあります。

>CloudFront serves your content over HTTPS only to clients that support SNI. Older browsers and other clients that don't support SNI can't access your content over HTTPS.

SNI に対応していないブラウザやその他のクライアントでは利用出来ないよ、と・・・そのままですね。
では SNI とはどんなものなのでしょうか？

[Server Name Indication - Wikipedia](http://ja.wikipedia.org/wiki/Server_Name_Indication) 

>Server Name Indication (SNI) では、TLSに拡張を加えることでこの問題に対処する。
TLSのハンドシェイク手続きで、HTTPSクライアントが希望するドメイン名を伝える（この部分は平文となる）。
それによってサーバが対応するドメイン名を記した証明書を使うことが可能になる。

SNI は TLS の拡張として実現されています。
そのためクライアントには（SSL ではなく）TLS でアクセスしてもらう必要があります。

今時のブラウザで対応していないものは無いと思いますが、例えば想定しているクライアントがネイティブアプリだったりすると、利用しているライブラリによっては SSL で https を実現しているものもあったりするので、そういった場合には注意が必要です。
markdown + remark.js + gh-pages でプレゼン資料を公開する


# remark.js とは

ref: https://github.com/gnab/remark

[![remark.js](https://qiita-image-store.s3.amazonaws.com/0/14790/a48a05bc-d1fa-b5d8-25f5-e1f5d44673a9.png)](http://gnab.github.io/remark/)

markdown をスライドに変換する javascript 。シンプル。

web サーバなどたてなくても、ローカルでもスライドが表示できる。なんといっても、html(+remark.js) と markdown を __別々に管理__ できるのがよい。

```Markdown:sample.md
# slied 1 
- 1ページ目
---
# slide 2
- 2ページ目
```
```html:html
<DOCTYPE html>
<html>
<head><title>Presentation</title></head>
<body>
  <script src="http://gnab.github.io/remark/downloads/remark-latest.min.js" type="text/javascript"></script>
  <script type="text/javascript">
    var slideshow = remark.create({sourceUrl: "sample.md"});
  </script>
</body>
</html>
```

# スライドの操作

- `j` 次のスライド(`→` `↓` `PgDown` `Space`)
- `k` 前のスライド(`←` `↑` `PgUp`)
- `c` スライドの clone
- `f` フルスクリーン
- `p` プレゼンモード
- `h` ヘルプの表示

※ Firefox の Vimperator を使っているとキー操作が出来ないので、`Shift` + `Esc` なので一時的に無効化する

### スライドの clone

スライドを clone すると、元のスライドでページ移動した際、clone 先のスライドも同期して移動する。なので、プレゼンを行う時は

1. ノートPC で、スライド表示
1. `c` で別スライドを立ち上げ、外部ディスプレイ側に移動させた後、`f` でフルスクリーン化
1. ノートPC のスライドは、`p` でプレゼンモードし、スライドを操作

って感じでいける。よく考えられてると思う。

# ローカルで動かしてみる

以下は、 MaxOSX でのコンソール操作。

```console
# サンプルをダウンロード
git clone git@github.com:harasou/slides.git

# ブラウザで開く
open slides/sample.html
# ブラウザが Google Chrome の場合
open -a "Google Chrome" --args --allow-file-access-from-files $(pwd)/slides/sample.html
```
![screenshot-harasou github io 2014-09-11 14-17-24.png](https://qiita-image-store.s3.amazonaws.com/0/14790/a4c6fdbf-1cdf-2299-76d7-22b505bd15c9.png)

ちなみに、上記サンプルでは、デフォルトで `remarkjs.md` を開きますが、こんな感じでパラメータにファイル名を渡すと、そのファイルを開くことが出来ます。

```
file:///<ダウンロードしたディレクトリ>/sample.html?apache_module.md
```

# スライドの作り方

本家のページを見れば、だいたいわかる。

- 本家
    - wiki による説明：https://github.com/gnab/remark/wiki
    - remark のサンプル：http://gnab.github.com/remark
    - remark のサンプル（ソース）：https://github.com/gnab/remark/blob/gh-pages/index.html
- @harasou
    - remark.js 使った簡単な説明：http://harasou.github.io/slides/

# gh-pages で公開する

静的なページが動けばよいだけなので、gh-pages にアップするのが良さそう。

1. 適当なリポジトリ(ex. [harasou/slides](https://github.com/harasou/slides))を GitHub に作成し、clone 後、gh-pages ブランチを作成

    ```console
    git clone git@github.com:harasou/slides.git
    cd slides
    git checkout --orphan gh-pages
    ```
1. html と markdown 作成し、github にアップ

    ```console
    mkdir slides
    vim index.html slides/remarkjs.md
    git add index.html slides/remarkjs.md
    git commit -m "..."
    git push origin gh-pages
    ```
    slides ディレクトリ配下の markdown を読み込むように、index.html を記載
1. gh-pages にアクセス
    - http://harasou.github.io/slides/
    - http://harasou.github.io/slides/?apache_module.md
    
    gh-pages が表示されない場合は、[このあたり](https://help.github.com/articles/creating-project-pages-manually)を参考に。
Googleのマテリアルデザインの左上からななめに表示するやつ

人のソースを見て勉強しようシリーズ第3弾
[Google Material Design Hierarchical Timing デモ](http://jsdo.it/matsui_a/9omq4/)

今回の参考ソースは[ここ](http://codepen.io/prajwalkman/pen/eLlGw)

![sample3.gif](https://qiita-image-store.s3.amazonaws.com/0/3140/98c497b8-4bbc-3fa8-0839-8ba139b8a94c.gif)

CSS3にアニメーション、JSにはタイミングとか記述してる。


## CSS
```
.container {
  width: 460px;
}
.item {
  transform: scale(1);　                 //要素の拡大
  transition-timing-function: ease-out;  //ゆっくり終わる
  backface-visibility: hidden;　         //ちらつき対策
  perspective: 1000;　                   //3D変形の奥行き　Firefox用...?
}
.visible {
  transform: scale(0);
}
```

どうして	`backface-visibility: hidden;` を入れてるんだろうと思って、調べてみたら、CSSのTransformsでTransitionと組み合わせて、要素を移動させたり、拡大縮小させたりするとちらつくことがあるので、その対策としていれてるっぽい。
`perspective: 1000;`　の方は何で入れてるかわからなかったけど、2年前の記事でFirefoxの Transforms がいけてないというのがあったのでその対応策とか...?



## JS

```
(function() {
  var appear,
      delay,
      disappear,
      i,
      offset,
      _i,
      _len,
      item;

  item = $(".item");
  for (_i = 0, _len = item.length; _i < _len; _i++) {
    i = item[_i];
    offset = i.offsetLeft + i.offsetTop;
    delay = offset / 1000;
    $(i).html(delay); //.itemに時間を表示
    $(i).css({
      'transition-delay': "" + (delay * 1.318) + "s", //アニメーションがはじまるタイミング
      'transition-duration': "" + 0.3 + "s" //アニメーションにかかる時間
    });
  }

  //.itemを非表示にしていく
  appear = function() {
    return setTimeout((function() {
      $('.item').addClass('visible');
      return disappear();
    }), 1500);
  };

  //.itemを表示    
  disappear = function() {
    return setTimeout((function() {
      $('.item').removeClass('visible');
      return appear();
    }), 1500);
  };

  appear();

}).call(this);
```
表示の方法は.visibleを付けたり消したりして行うので基本の動きはCSS3。
表示非表示のタイミングについては.itemのx,y座標を足して1000で割った値に1.318かけた値にしてるみたい。この1.318という数値設定が謎。好み？


あとなんで即時関数に.call(this);つけるの？って思ったら関数内のthisがundefinedになるかららしい。
（もともとCoffeeで書かれてたのをコンパイルするとそうなるっぽい。）
Extract EXIF with sips

Macのコマンドラインで画像のEXIFを取得したい場合は`sips`コマンドが便利

```
sips -g all *.jpg
```
でjpg画像のEXIF一覧が得られる。これを使って画像の撮影日時にrenameする[スクリプト](https://github.com/Lewuathe/zipPicture/blob/master/rename_creation.py)を書いた。

```py
# -*- coding: utf-8 -*-

import os
import sys
import commands

if __name__ == "__main__":
    pics = [pic for pic in os.listdir('.') if pic.startswith('DSCN')]
    for pic in pics:
        cmd = "sips -g all " + pic +  "  | grep creation | awk '{print $2,$3}'"
        out = commands.getoutput(cmd).split()
        dst = out[0].replace(':', '-') + ' ' + out[1].replace(':', '.') + '.jpg'
        print '{pic} ->  {dst}'.format(pic=pic, dst=dst)
        os.rename('./' + pic, './' + dst)

```

デジカメで取った写真を整理する時に便利。
ローカルでgitを使用した後、gitHubに登録する方法


開発当初はローカル環境でgitを使っていたが、
途中からgitHubにpushする際の手順を説明します。


###gitHubにアクセスし、新規リポジトリを作成する
***
https://github.com/
![screenshot-github.com 2014-09-09 11-54-35.png](https://qiita-image-store.s3.amazonaws.com/0/34439/4020a040-f68e-9df1-3372-c8fd69ac97ec.png "screenshot-github.com 2014-09-09 11-54-35.png")
![screenshot-github.com 2014-09-09 15-27-31.png](https://qiita-image-store.s3.amazonaws.com/0/34439/8ef88494-86c3-d27e-46d1-37c1af149b33.png "screenshot-github.com 2014-09-09 15-27-31.png")



1、リポジトリ名入力
2、Public選択(有料アカウントならPrivateも選択可能)
3、Create repositoryをクリックしてリポジトリを作成する。



###リモートリポジトリを登録する
***
![screenshot-github.com 2014-09-10 10-14-41.png](https://qiita-image-store.s3.amazonaws.com/0/34439/9528af52-6aa2-3b3c-e7a1-470cfc4fb8ec.png "screenshot-github.com 2014-09-10 10-14-41.png")

新規リポジトリ作成後に表示される上記画面の1の内容をコピーし、
以下の内容をターミナルに入力する。

```
git remote add origin 上記画面でコピーした内容
```

例)

```
git remote add origin git@github.com:your-account/repository-name.git
```




上記コマンドによってoriginという名前(識別子)で
git@github.com:your-account/repository-name.gitのリモートリポジトリを指すようになります。




###ローカルの内容をリモートリポジトリに送信する
***
ローカルのmasterブランチの内容を上記で登録したリモートリポジトリに送信します。
ローカルのブランチがmasterでない場合は下記のコマンドでmasterブランチに移動しておいてください。

```
git checkout master
```


下記のコマンドを入力してローカルの内容をリモートリポジトリに送信します。

``
git push -u origin master
```

>To git@github.com:アカウント名/リポジトリ名.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin. 


というメッセージが表示されると成功です。 
上記コマンドでリモートリポジトリにmasterという名前のブランチが作成され、
ローカルのmasterブランチの内容が送信されました。


master以外のブランチをリモートに送信するには以下のコマンドを入力します。
※ローカルのfeatureブランチをリモートのfeatureブランチに送信する場合。

```
git checkout feature
git push origin feature
``
procmailでメールの件名に連番をふる

fmlとかメーリングリスト管理ミドルウェアを別途入れるのが面倒だったので。

```bash:$HOME/.forward
"| IFS=' ' && exec /usr/bin/procmail -f- || exit 75 "
```

```bash:$HOME/.procmailrc
MAILDIR=$HOME/Maildir/
DEFAULT=$MAILDIR
LOGFILE=$HOME/procmail.log

# 連番をつけてみる
:0 fhw
*^From: member@mailinglist.com
| NUM=`cat count`; sed -e "s@\(^Subject:\) \(.*\)@\1 [$NUM] \2@"; expr $NUM + 1 > count
```

これで`member@mailinglist.com`から届いたメールの件名に連番を付与する。
【プログラミング48(/2 -1)手】Factory Method


## ポイント
参考サイトで述べられているように、
「コンストラクタの代わりに生成用関数を用意」して、
変更や追加、保守を容易にする手法。


## サンプルコード
<script src="https://gist.github.com/onody/69ec0583c701ecb330c1.js"></script>
https://gist.github.com/onody/69ec0583c701ecb330c1


## 所感

* ポイントのところで述べていることだけだと、何のこっちゃという感じだ。  
要は、コンストラクタ（rubyならinitialize、phpなら__construct）などを、  
汎用的に作って、汎用化できないところは、サブクラスでやっておいて、  
スーパークラスへの依存度を下げようということみたい。


## 参考
http://qiita.com/irxground/items/d1f9cc447bafa8db2388
http://morizyun.github.io/blog/ruby-design-pattern-11-factory-method/
http://think-on-object.blogspot.jp/2011/11/factoryfactory-methodabstract-factory.html
coffeescript, jade, stylus, expressを利用する際のGruntfile.coffee


以下の設定で、jade,coffee,stylファイルを更新した際、自動でhtml, js, cssファイルを生成。
さらに何もしなくてもページ更新走ってくれる。（パスは各自設定）
ブラウザのアプリインストールする必要あるけど、livereroadすばらしすぎる
grunt defaultで起動

``` Gruntfile.coffee

module.exports = (grunt) ->
  
  grunt.initConfig
    coffee:
      app:
        expand: true
        cwd: 'src/'
        src: '**/*.coffee'
        dest: './'
        ext: '.js'

    jade:
      default:
        expand: true
        cwd: 'src/public/partials'
        src: '*.jade'
        dest: 'public/partials'
        ext: '.html'

    stylus:
      default:
        expand: true
        cwd: 'src/'
        src: '**/*.styl'
        dest: './'
        ext: '.css'

    copy:
      main:
        files: [
          src: "src/views/index.jade"
          dest: "views/index.jade"
        ]

    express:
      dev:
        options:
          script: 'bin/www'

    watch:
      options:
        livereload: true
        
      coffee:
        files: '**/*.coffee',
        tasks: ['coffee']

      jade:
        files: 'src/public/partials/*.jade',
        tasks: ['jade']

      stylus:
        files: '**/*.styl',
        tasks: ['stylus']        

      copy:
        files: 'src/views/*.jade'
        tasks: ['copy']

      express:
        files: 'src/*'
        tasks: ['express']
        options: {
          spawn: false
        }
        
    grunt.loadNpmTasks 'grunt-contrib-coffee'
    grunt.loadNpmTasks 'grunt-contrib-jade'
    grunt.loadNpmTasks 'grunt-contrib-stylus'
    grunt.loadNpmTasks 'grunt-contrib-watch'
    grunt.loadNpmTasks 'grunt-contrib-copy'
    grunt.loadNpmTasks 'grunt-express-server'

    grunt.registerTask 'default', ['express', 'watch']

```
Goのテスティングフレームワークの現状確認してみた

> この記事は2014年に書かれた記事です。やる気戻ったのでそのうち更新します

## 謝辞

めっちゃ参考にしました。ありがとうございます！
~~[go言語のテスティングフレームワークについて — さにあらず](http://blog.satotaichi.info/testingframeworks-for-golang)~~ リンク切れ

この記事が約1年前に書かれたので、現状どうなってるかメモがてらに記事作ってみました。

## 分類

アサート系かBDD系かで分けてみる。

|Assertion Style|BDD Style|
|---|---|
|testing <br/> [Testify](https://github.com/stretchr/testify) <br/> [PrettyTest](https://github.com/remogatto/prettytest) <br/> [TestFlight](https://github.com/drewolson/testflight) <br/> assert *1 <br/ > [go-check](https://github.com/go-check/check) *2 | [Ginkgo](https://github.com/onsi/ginkgo) <br/> [Goblin](https://github.com/franela/goblin) <br/> [GoConvey](https://github.com/smartystreets/goconvey) <br/> [Gospel](https://github.com/r7kamura/gospel) <br/> [GoSpec](https://github.com/orfjackal/gospec) *3 |

> *1 最近検索したらリポジトリいっぱいでてきて、どれのこと言ってたか完全に忘却してしまっった
> *2 [github.com/go-check/check](https://github.com/go-check/check)。元は launchpad.net/gocheck
> 　いくつか使われているようで、`import "launchpad.net/gocheck"` のままになっててテストが通らないプロジェクトが散見される。
> *3 開発終了を宣言。GoConveyを利用するようにと表明している。

## スター数、最終コミットからの期間、Issue数、Pull Req数

> 2014-09-10現在

|Name|Stars|Last Commit| Issues | Pull Requests |
|---|---:|---|---:|---:|
|testing|-|-|-|-|
|Ginkgo|441|1 day ago *3|6|0|
|Goblin|143|7 months ago|5|0|
|GoConvey|1093|13 days ago|17|1|
|Testify|569|12 hours ago|11|3|
|Gospel|60|5 months ago *4|0|0|
|PrettyTest|109|8 months ago|2|0|
|TestFlight|79|4 months ago|0|0|
|assert|92|2 years ago|3|2|
|GoSpec|110|1 month ago *5|1|4|
|go-check|68|2 months ago|4|2|

> *3 READMEとLICENSEの更新によるもの。コード最終更新は5 days ago
> *4 LICENSE追加によるもの。コード最終更新は9 months ago
> *5 開発終了宣言によるREADMEの更新によるもの。コード最終更新は3 years ago

## まとめ

アサート系を使うならTestify、BDD系を使うならGoConveyかGinkgoっぽい。
go-checkはギリギリ生きてる感じがする。
Windows環境でRedmine Pluginの開発環境を構築する

# これは何？

* Windows環境でRedmineのプラグインを開発する環境を整えた際のメモ
* WindowsはXP、Windows Server 2012 R2 で試した。

# 手順

## 開発環境のサーバを立ち上げるまで

1. [bitnamiのページからRedmineの最新版](https://bitnami.com/stack/redmine)をダウンロード
1. Redmineのインストール先を ```C:\Bitnami\redmine-2.5.2-2```にする。（フォルダはredmineバージョンに従う）ここで初期ユーザの登録時のパスワードは後のMySQLのrootのパスワードにもなる。
1. 環境変数パスに ```C:\Bitnami\redmine-2.5.2-2\ruby\bin``` を追加する。
2. ```ruby -v``` でrubyのバージョンが```ruby 2.0.0p481 (2014-05-08) [i386-mingw32]```が出ることを確認。
3. ```C:\Bitnami\redmine-2.5.2-2\apps\redmine\htdocs```に```cd```する
4. ```gem install bundler``` を実行する
5. ```bundle install```
6. ```set RAILS_ENV=production```
7. ```bundle exec rake generate_secret_token```
8. テスト用のDBのパスワードをインストール時に作った初期ユーザのパスワードに変えておく。```C:\Bitnami\redmine-2.5.2-2\apps\redmine\htdocs\config\database.yaml```の中身を変更する。

```yaml:database.yaml
development:
  adapter: mysql2
  database: redmine_development
  host: localhost
  username: root
  password: # here #
  encoding: utf8
```

8. ```bundle exec rake db:create```
9. テスト用のDBのパスワードを空白に戻す。```C:\Bitnami\redmine-2.5.2-2\apps\redmine\htdocs\config\database.yaml```の中身を変更する。

```yaml:database.yaml
development:
  adapter: mysql2
  database: redmine_development
  host: localhost
  username: root
  password: "" # here #
  encoding: utf8
```

8. ```bundle exec rake db:migrate```
9. ```bundle exec rake redmine:load_default_data```
10. ```C:\Bitnami\redmine-2.5.2-2\apps\redmine\htdocs\config\additional_enviromant.rb```の```config.action_controller.relative_url_root```の行をコメントアウトする
10. ```bundle exec rails server webrick``` or ```bundle exec rails server``` でサーバを起動

## plugin開発をするまで

1. ```C:\Bitnami\redmine-2.5.2-2\apps\redmine\htdocs``` をカレントディレクトリにしておく。
2. 下記のコマンドを打つ

```bash:
ruby script/rails generate redmine_plugin redmine_standard
```
※ redmine_standard　という名前は任意。

ここら辺までできれば、参考資料を参考に進めるとよい。

## 既にあるプラグインを導入する場合

～テーブルがありません的なエラーにお目にかかると思われます。
下記のコマンドを打ってみましょう。（プラグインで使うDBテーブルを作るコマンド）

```bundle exec rake redmine:plugins:migrate```


# 参考資料

* [Rails を知らない人のための Redmine プラグイン開発ガイド](http://www.r-labs.org/projects/r-labs/wiki/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E9%96%8B%E7%99%BA%E3%82%AC%E3%82%A4%E3%83%89)
 - Railsを知らない前提で解説していただけるので助かる。
* [プラグイン チュートリアル（公式日本語訳？）](http://redmine.jp/guide/Plugin_Tutorial/)
* [rake xxx と bundle exec rake xxx の違い](http://ka-zoo.net/2013/07/difference-of-rake-xxx-and-bundle-exec-rake-xxx/)
 - bundle exec ってなんでいちいちつけんのよって話が気になったらコチラ。
LinkedListのiterator()を呼ぶと結局return listIterator();している

※src.zip は java7 のものを見てます。

ListとIteratorの関係がよくわからなくなったので調べていたところ、[ListIterator][li]というものを見つけた。
[ListIterator][li] は、next()だけじゃなくてprevious()もあるよ、というクラスらしい。
そんな需要があるのか、へーと思ってたら、なんとLinkedListのイテレートにはListIteratorしか使えないということになってた。

```java:AbstractSequentialList.java※LinkedListのスーパークラス
    /**
     * Returns an iterator over the elements in this list (in proper
     * sequence).<p>
     *
     * This implementation merely returns a list iterator over the list.
     *
     * @return an iterator over the elements in this list (in proper sequence)
     */
    public Iterator<E> iterator() {
        return listIterator();
    }
```

ArrayList.java#iterator() はそんなことはないし、なぜだろう。

[li]:http://docs.oracle.com/javase/8/docs/api/java/util/ListIterator.html
ubuntuでchromedriverをインストールする

macはbrewとかでインストールできるが、ubuntuはzipを落として入れる方法しか見つからなかった。binのパスは適時読み替えてください。

```zsh
wget -O /tmp/chromedriver.zip http://chromedriver.storage.googleapis.com/2.21/chromedriver_linux64.zip && sudo unzip /tmp/chromedriver.zip chromedriver -d /usr/local/bin/; sudo chmod +x /usr/local/bin/chromedriver;
```

## Links

- [chromedriver.storage.googleapis.com/index.html](http://chromedriver.storage.googleapis.com/index.html)
traitの動的mix-in時の自分型(self-type)使用有無によるコードの違い

## はじめに
処理コンテキストに応じて、クラスの振る舞いを変更したいとする。
こんな時はインスタンス生成と同時にtraitをmix-inして無名サブクラスを作る作戦が取れる。
なおこの時、trait側でベースとなるクラスのメンバ変数やメソッドにアクセスする際に自分型を使う場合と使わない場合でコード量や宣言内容が変わってくるため簡単にまとめたいと思う。

## コード

### mix-inするtraitの宣言
トレイトBの方がmix-in先を固定していないためより抽象的といえるが、一方でここでの用途はFooの振る舞いを変更するためのtraitなのだ、というように使用が限定的に決まっているのなら不必要な抽象と言える。
そこでトレイトAのように自分型を使って参照をもってしまえばmix-in先のメンバ変数に容易にアクセスできるため、より簡潔に書くことができるようになる。

```scala
trait A { self: Foo =>
  override def compute = self.str * (self.num * 2)
}

trait B {
  val str: String
  val num: Int

  def compute = str * (num * 3)
}
```

### ベースクラスとコンパニオンオブジェクト
Bをmix-inするとcomputeメソッドはFooにもBにも宣言されていることからコンパイルエラーとなる。以下のようにどちらのcomputeを使うのかを明示的に宣言してやる必要がある。
一方、Aは既にA側のcomputeをoverrideすると宣言していることからnew時に明示的に宣言してやる必要はない。

```scala
class Foo(val str: String, val num: Int) {
  def compute = str * num
}

object Foo {
  def apply(str: String, num: Int)(implicit mode: Mode = ModeNormal) = mode match {
    case ModeA => new Foo(str, num) with A
    case ModeB => new Foo(str, num) with B {
      override def compute = super[B].compute
    }
    case _ => new Foo(str, num)
  }
}
```

### Main部

```scala
object Main extends App {
  implicit val mode = ModeB
  val foo = Foo("*", 2)
  println(foo.compute)  // ******
}
```

### Mode部

```scala
trait Mode
object ModeA extends Mode
object ModeB extends Mode
object ModeNormal extends Mode
```
VirtualBox(Mac)でCentOS5系を実行するとCPU使用率が高い問題への対処法


##前提
* 仮想化アプリ: VirutalBox
* ホストOS: Mac (Marvericks)
* ゲストOS: CentOS 5系

###状況
なぜか知らないが、Macbook Air上でVirtalBoxを使ってCentOS5.4起動していると、CPUを20〜30持っていかれる。
だんだんキーボードの上らへんが熱くなってきてうざい。
Cent上でtop打ってもCPU食ってない。なんで？？

VMの/etc/grub.confに起動オプションを追加
---
デフォルトで起動されるカーネルの起動オプションに **divider=10** を追加する。
CPU割り込みを1/10にすることでアイドル時のCPU使用率を下げる。

```
kernel /vmlinuz-2.6.32-71.29.1.el6.x86_64 ro root=/dev/mapper/vg_centos6-lv_root divider=10
```

参考
---
[VirtualBoxでCentOSを動かすとCPU使用率が高い場合の対処](http://linux.just4fun.biz/CentOS/VirtualBox%E3%81%A7CentOS%E3%82%92%E5%8B%95%E3%81%8B%E3%81%99%E3%81%A8CPU%E4%BD%BF%E7%94%A8%E7%8E%87%E3%81%8C%E9%AB%98%E3%81%84%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6.html)
[最新情報]Xcode6 GM seed導入で発生したエラー内容&解決方法

# ついに出ました！xcode6 GM!


![スクリーンショット 2014-09-10 11.57.15.png](https://qiita-image-store.s3.amazonaws.com/0/15812/15c952c2-3922-57c5-9ed4-ca0074dd5a25.png)


[ダウンロードはこちら](https://developer.apple.com/xcode/downloads/)

今まで使っていたxcode6 beta5〜xcode6 beta7を捨てて、
xcode6 GMに変更していた際に
git コマンドが使えなくなるエラーが出ました。


## エラー内容
<b>git branch</b>

```shell-session
xcrun: error: invalid active developer path (/Applications/Xcode.app/Contents/Developer), missing xcrun at: /Applications/Xcode.app/Contents/Developer/usr/bin/xcrun
```

<b>git status</b>

```shell-session
Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo.
```

## 対策内容
pathの向き先がおかしいといった内容なので向き先を変えるため以下の
コマンドを実行

```shell-session
sudo xcode-select -switch /
```

## 結果

無事に解決！

<b>git branch</b>

```shell-session
  master
* update_bra
```


<b>git status</b>

```shell-session
On branch update_an
nothing to commit, working directory clean
```
Debian Wheezy(armhf)でhandbrakeをビルドする

#コンパイル作業に必要なパッケージのインストール
[ここ](https://trac.handbrake.fr/wiki/CompileOnLinux)を参照

#yasm1.3.0のコンパイル・インストール
```bash
wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
tar zxvf yasm-1.3.0.tar.gz
cd yasm-1.3.0
./configure
make
make install
```

#handbrake 0.9.9.1のコンパイル・インストール
最新のtrunkリポジトリでは、x265のサポートが入っておりコンパイルに失敗する。
x264エンコードができればよいので、tagsから0.9.9.1を取得する。
```bash
svn co svn://svn.handbrake.fr/HandBrake/tags/0.9.9.1 handbrake
cd hanrbrake
./configure --launch --disable-gtk
cd build
make install
```
kelbimで管理するAWS,ELB

#kelbim


AWSのELBの設定をRubyのDSLで管理できるCLIツール。

作成者サイト
http://so-wh.at/entry/20131105/p1

Github
https://github.com/winebarrel/kelbim

##手順

###インストール

インストール

```
➜ gem install kelbim --no-ri --no-rdoc
```

確認

```
➜  kelbim -v
kelbim 0.2.6
```

```
➜  kelbim  kelbim
Usage: kelbim [options]
    -p, --profile PROFILE_NAME
    -k, --access-key ACCESS_KEY
    -s, --secret-key SECRET_KEY
    -r, --region REGION
    -a, --apply
    -f, --file FILE
    -n, --elb-names NAMES
        --dry-run
        --ec2s VPC_IDS
        --without-deleting-policy
    -e, --export
    -o, --output FILE
        --split
        --split-more
    -t, --test
        --show-load-balancers
        --show-policies
        --no-color
        --debug
```

security credentialsを記載

```
➜  vim ~/.aws/credentials
[default]
aws_access_key_id=AKIxxxxxxxxxxxxxxxx
aws_secret_access_key=xxxxxxxxxxxxxxxxxxxxx
```


###ELBの情報を取得

ELBの確認

```
➜   kelbim -e -r ap-northeast-1 --show-load-balancers
{
  "vpc-[id]": {
    "[elb-name]": "[elb-dns]ap-northeast-1.elb.amazonaws.com"
  }
}
```


ELB情報の取得

--ec2オプションで指定のVPCのみ出力

```
kelbim -e -o ELBfile -r ap-northeast-1 --ec2s vpc-[id]
```

```
cat ELBfile

c2 "vpc-[id]" do
  load_balancer "[elb-name]" do
    spec do
      # DNS Name: [elb-dns].ap-northeast-1.elb.amazonaws.com
      pending('This is an example')
      url = URI.parse('http://www.example.com/')
      res = Net::HTTP.start(url.host, url.port) {|http| http.get(url.path) }
      expect(res).to be_a(Net::HTTPOK)
    end

    instances(
      "[instans-name]"
    )
…
…
…
```


###ELBのテスト、設定適用

RSpecでのテスト

```
➜ kelbim -t
Test `ELBfile`
*

Pending:
  vpc-[id]> [elb-name]
    # This is an example

Finished in 0.00033 seconds
1 example, 0 failures, 1 pending
```

ELBの適用

別アカウントの場合はcredentialsを追記し、-pで指定。
別VPCの場合は、ELBfileを書き換えておく。

```
➜  kelbim  kelbim -a -o ELBfile -p sato -r ap-northeast-1
Apply `ELBfile` to ELB
Comparing vpc-[id]> [elb-name]
Update LoadBalancer: vpc-[id]> [elb-name]
  set attributes={:access_log=>{:enabled=>false}, :connection_settings=>{:idle_timeout=>30}, :cross_zone_load_balancing=>{:enabled=>true}, :connection_draining=>{:enabled=>true, :timeout=>300}}
```

###etc

お手軽なELBの管理と移行が可能になった！