OmniAICreator/Qiita-1.07M huggingface dataset:
exception_notificationでrailsの例外をslackに送る


### Railsで発生した例外をSlackに送りたい
* [exception_notification](https://github.com/smartinez87/exception_notification)がslack対応している様なので使ってみる。

#### Gemfile
* slack対応版が未だgithubのmasterにしか無いのでgithubから取得


```rb
gem 'exception_notification', :github => 'smartinez87/exception_notification'
gem 'slack-notifier'
```

#### 雛形生成
```bash
bundle exec rails g exception_notification:install
      create  config/initializers/exception_notification.rb
```

#### exception_notification.rb編集
* [ここ](https://github.com/smartinez87/exception_notification#options-4)にはtokenはapi tokenと書いてあるがwebhooksのtokenでOK
* ActiveRecord::RecordNotFound, AbstractController::ActionNotFound, ActionController::RoutingError はdefaultで監視から外れている様なので必要であれば```config.ignored_exceptions = ''```を追加する

##### 旧
```rb
 config.add_notifier :slack, {
    :team => "チーム名称",
    :token => "webhooks token",
    :channel => "#グループ"
  }
```

##### 新
```rb
 config.add_notifier :slack, {
    :webhook_url => "webhooks url",
    :channel => "#グループ"
  }
```


#### application_controller.rbの編集
* application_controller.rbで例外をハンドリングする

```rb
  rescue_from Exception, with: :render_500
...
  def render_500(e)
    ExceptionNotifier.notify_exception(e, :env => request.env, :data => {:message => "error"})
    render template: 'errors/error_500', status: 500
  end
```
AWSのELBにSSLを設定する（Nginx）


AWSでELBを利用していて、Nginxでサーバ構築している場合の設定方法です。

#### 参考

- [SSLストア 1,050円でRapidSSLをnginxに簡単導入！](http://morizyun.github.io/blog/ssl-store-nginx-conf-webapp-introduction/)
- [AWSに適切なSSL証明書の購入を考える](http://dev.classmethod.jp/cloud/aws-ssl-certificate/)

### SSLについて

- SSLは通信の暗号化
- サブドメインでも利用する場合「ワイルドカード」対応のものを選択

SSLについて分からない場合でもAWSのELBへの設置であれば以下の手順でOKです。


### CSRの作成

証明書購入後のアクティベートで必要となるもの。事前に作成しておく。今回のAWS・ELBへのSSL設定の場合、ローカルで作成しても問題なかった。その他の環境の場合はサーバ側での作成が必須となるかもしれない？（Keyがサーバ側にあるかどうかだと思う、AWSではELBにアップロードするので。）。

- [Amazon ELB 用に、パスフレーズなしのCSRを作成する手順](http://kwstaff.tumblr.com/post/62571252341/amazon-elb-csr)

> AWSのELBに設置する場合は、パスフレーズなしのCSRをもとにSSLを発行する必要があります。

ということらしい。

- 2048bitの鍵 `openssl genrsa -des3 -out XXXXXXXX.key.pem 2048` ※ 適当なパスを入力（次で使用）
- パスワードを削除する `openssl rsa -in XXXXXXXX.key.pem -out XXXXXXXX.key_np.pem`
- CSRの作成 `openssl req -new -key XXXXXXXX.key_np.pem -out XXXXXXXX.csr.pem`
  - Country Name: JP
  - Common Name: *.example.jp
  - Email Address: ****@example.jp
- CSRの確認 `openssl req -in XXXXXXXX.csr.pem -text`

### メール受信の準備

ワイルドカードSSLで例えば`*.example.jp`を取得する場合、以下の様なアドレスが必要となる（アクティベート後の情報受信のため）。CSRの作成時に入力するアドレスかSSLストアに登録したアドレスか不明だが、メールは複数送信される。メールが届かないと次に進めなくなるかもしれないので、ここではしっかりと受信準備しておく。

- admin@example.jp
- admin@*.example.jp

※ 上記以外に、administrator, hostmaster, webmaster, postmasterやWhoisに公開登録されているアドレス。


### 証明書の購入

- [SSLストア](http://www.ssl-store.jp/)

今回はRapidSSLのワイルドカード9,720円/1年を購入する。Paypalでデポジットとして入金して購入する。
カートに入れる容量で対象の項目を選択し、決済する。

`アクティベートしてください`というボタンが表示されるのでクリックして進む。`アクティベート待ちの証明書`の項目から購入した証明書の証明書番号をクリック。

### アクティベート手順

- STEP1 CSRの貼り付け
  - サーバの種類をその他を選択
  - 作成したCSRをペースト（BEGINの行を含む）
- STEP2 お客様情報入力
  - 受信のためのメールアドレスを選択
  - その他情報の入力
- STEP3 確認画面
  - 内容を確認し登録ボタンをクリック
- STEP4 完了

メールが届くので、メール内のリンクから承認する。

- https://products.geotrust.com/orders/A.do?p=XXXXXXXXXXXXXXX

すると、再度メールが届き、以下の情報が記されている。

- Web Server CERTIFICATE SSLサーバ証明書
- INTERMEDIATE CA 中間証明書


### AWSのELBに設置する

EC2のメニューからELBを選択し、Listenerにhttpsを追加すると、SSL Certificateが設定できるので、`Upload a new SSL Certificate`を選択し、以下の手順で登録する。

- Certificate Name: `*.example.jp`
- Private Key: XXXXXXXX.key_np.pemの内容 ※ パスワードを除去したKeyで、CSRではない。
- Public Key Certificate: Web Server CERTIFICATE SSLサーバ証明書
- Certificate Chain: INTERMEDIATE CA 中間証明書

### nginxの設定

Nginxの設定については色々やり方があると思う。

```
    location / {
      proxy_set_header Host $http_host;
      proxy_redirect off;
      proxy_next_upstream error;

      if ($http_x_forwarded_proto != "https") {
        rewrite ^(.*)$ https://$server_name$1 permanent;
      }

      # Add HTTP Strict Transport Security for good measure.
      # https://developer.mozilla.org/ja/docs/Security/HTTP_Strict_Transport_Security
      #add_header Strict-Transport-Security "max-age=31536000; includeSubDomains;";
    
      proxy_pass http://backend;
    }
```
透過ダイアログの作り方

#### 1.透過ダイアログ用のテーマを作成する

```xml:styles.xml
<style name="TransparentDialogTheme" parent="@android:style/Theme.Light">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
</style>
```

#### 2.背景色を定義する(背景画像を当てない場合)

```xml:styles.xml
<color name="dialogbg">#a0909090</color>
```

先頭の二桁を00にすると完全な透明になります。

#### 3.Dialog用のレイアウトxmlを作成する

・レイアウト背景に、2.で作成した背景色を設定するか、半透明の画像を当てる

```xml:mydialog.xml
android:background="@color/dialogbg"

or

android:background="@drawable/dialogbg_image"
```

#### 4.DialogFragmentを継承したダイアログクラスを作成する

```java:MyDialog.java
public class MyDialog extends DialogFragment {

  @Override
  public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = new Dialog(getActivity(),
        R.style.TransparentDialogTheme);
    // ダイアログの背景を完全に透過。
    dialog.getWindow().setBackgroundDrawable(
        new ColorDrawable(Color.TRANSPARENT));
    // フルスクリーンでダイアログを表示。
    dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
        WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
    dialog.setCanceledOnTouchOutside(false); // キャンセル不可の場合
    setCancelable(false); // キャンセル不可の場合
    return dialog;

  }

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
      Bundle savedInstanceState) {
    View content = inflater.inflate(R.layout.mydialog, null);
    return content;
  }
}

```

#### 5.表示する

```java:MainActivity.java
MyDialog dialog = new MyDialog();
dialog.show(getFragmentManager(), "tag");
```
Pythonで関数の実行時間を計測する


[timeitモジュール](http://docs.python.jp/2/library/timeit.html)を使う。

timeitメソッドに実行するpythonスクリプトと実行回数を書く。

```
s = '''
print "hogheoge"
'''

timeit.timeit(stmt=s, number=10000)
```

結果は秒で返ってくる。

```
0.12250304222106934
```

複数のモジュールを跨いでボトルネックを探す場合などは[プロファイラ](http://docs.python.jp/2/library/profile.html)を使うのが良さそう。自分は、プロファイラで大まかに当たりをつける→関数群を`timeit`で確認する→改善する、という感じでやってます。
Flash(+Stage3D)の背景を透明化する

Stage3Dが現れる前(FlashPlayer10以前)はFlashの透過は割と簡単だったのですが、Stage3Dのせいでややこしくなったようです。
Stage3DってのはFlashで(まあまあ)本格3Dを扱うための機能なので、結構重要です。

Flash(Not Stage3D) + HTML 
-----------------------------
HTML上で以下のオプションを設定

    wmode="transparent"

Flash(Not Stage3D)+NativeWindow
-------------------------------
AIRのアプリケーション記述XMLのinitialWindowの項目に以下の設定を追加します。

    <systemChrome>none</systemChrome> 
    <transparent>true</transparent> 

Flash(Stage3D) + HTML 
-------------------------------
できないような気がします。
wmodeにtransparentとdirectの両方を設定したいのですが、それが無理なので。。。

Flash(Stage3D)+NativeWindow
-------------------------------
ここからが本題です。
AIRのアプリケーション記述XMLのinitialWindowに以下の設定を追加します。

    <systemChrome>none</systemChrome> 
    <transparent>true</transparent> 
    <renderMode>direct</renderMode>  

  
__ただしこのままだと透明色でクリアしたとしても背景が残ります。__

    context3D.clear(1, 0, 1, 0);//アルファ0なのに表示されちゃう!

![2014-09-03_17h44_19.png](https://qiita-image-store.s3.amazonaws.com/0/22327/112352f5-51f7-2a9f-0146-5166f0c0223e.png)

画像の紫の部分が透明になって欲しい部分です。

つまり3D描画は背景のみ透明で表示とかできないっぽいです。
というわけで考えたのがFlashの昔ながらのSpriteに3Dを転写して表示する方法です。

Context3DのdrawToBitmapDataというメソッドを使うと、Bitmapクラスに描画することができるのでそれを使います。
BitmapクラスならいつものようにStageにaddChildで追加して表示できます。




### 1.Windowの大きさのBitmapクラスをaddChildします。
    var bitmap:Bitmap = new Bitmap(new BitmapData(stage.stageWidth, stage.stageHeight, true));
    addChild(bitmap);


### 2.Stage3Dを不可視にします。
初期化とかは通常通りでいいと思います。
描画前にvisibleをfalseにします。

    stage3D.visible = false;


### 3.画面を0でクリアします
    context3D.clear(0, 0, 0, 0)


### 4.Bitmapに3Dを描画します。
    context3D.drawToBitmapData(bitmap.bitmapData);

これで完了です。


一番苦労したのは3番です。
r:0、g:0、b:0、a:0だと描画されないのですが(つまり黒にはならない)、r:1、g:0、b:0、a:0とかにすると赤色になってしまうのです。(アルファ0なのに!) 
ちょっと仕様として信用してよいのか微妙ですが、とりあえずこれでWin7,8、Macでは背景透明に出来ました!

![2014-09-03_18h02_04.png](https://qiita-image-store.s3.amazonaws.com/0/22327/f4a8a30c-caf5-d86b-1678-cb74fb1fbfa7.png)

サンプルは下記URLとかで手に入るらしいですよ(ステマ)
__Live2D SDK マニュアル 「Flashでデスクトップマスコットを作ろう」__
https://sites.google.com/a/cybernoids.jp/cubism2/simple-app/desctopmascot
Google Spreadsheet で複数行（列）まとめて移動する方法

![pokemon.gif](https://qiita-image-store.s3.amazonaws.com/0/25194/22278756-6ea6-9567-d3cc-62341695c44c.gif)

こんな感じで、複数行を選択してから掴んで移動できます。
列も同じように操作できます。

これはExcelより便利！
Javascript RemoteActionを使ったExt JSアプリを試してみる(Apex編)


Salesforceのクライアント側をカスタマイズする際にjQuery, Angular, Backbone…を使った例は沢山見かけるようになったけど、そろそろExt JSを使った例も出て良いかな？ということで、色々試してみたことを記録していきます。

- - -

#### Apexの実装について

クライアント側とのデータ通信では、`REST API` or `Javascript RemoteAction`(以下、`RemoteAction`)のどちらかを使うことになると思います。
ただ、フロント側を`Visualforce Page`で実装する場合、APIコール数消費によるエラーを回避する、という点では、`RemoteAction`を使う方が良いでしょう。

そんなわけで、ここでは`RemoteAction`を使う前提にします。

- - -

##### 1. `RemoteAction`のパラメータについて

Apex上で`RemoteAction`を実装する際には、（当然ながら）パラメータを指定する必要がありますが、クライアントサイドからどんなパラメータが渡ってくるか、事前に決めておくのもなかなか億劫な気もします。（苦笑）

というわけで、クライアントサイドからはMapを引数として受け取って、処理するようにしてみました。

```apex
// Sample
@RemoteAction
global static Response hogehoge(Map<String, String> param){
	Id objectId = param.containsKey('objectId')
		? param.get('objectId')
		: null;
	...
}
```

引数として```Map<String, String>```を受け取ります。
このMapにどんなキーで値をセットするかは予め決めておく必要がありますが、こうすることで、他の`RemoteAction`も引数は同じように定義できます。

※1 クライアントサイドでは、Ext Directを使用する際のConfigを変更すればMapとしてパラメータを渡せます。

※2 もちろん、引数の順番、型を予め指定しておいて、クライアント側から送ることもできるようですので、事前にちゃんと決めておくのも良いかと思います。

##### 2. `RemoteAction`のレスポンスについて

[先人の知恵](https://developer.salesforce.com/page/Developing_Mobile_Applications_With_Force.com_And_Sencha_Touch_Part_2)をお借りして、レスポンス用のクラスを用意します。

```apex
public class Response {
	public Boolean success;
	public String errorMessage;
	public List<SObject> records;
	public Integer total;

	public Response(){
		records = new List<SObject>();
		success = true;
		total = 0;
		errorMessage = '';
	}
}
```

ちなみに、上記の例では`records`として`List<SObject>`を定義してますが、`List<Object>`とすることもできます。こうしておくと、ユーザー定義型のオブジェクトを返すこともできるので、便利な場合もあります。
（例えば、隣接リスト形式でデータを返したい..など)

##### 3. `RemoteAction`の実装

後は、Apex側で処理したいことを実装するのみです。
シンプルな例として、検索条件を受け取って、取引先を検索する`RemoteAction`を考えてみましょう。

```apex
public with sharing class AccountRemoteActionController {
	public AccountRemoteActionController(){}

	@RemoteAction
	public static Response doSearch(Map<String, String> param){
		Response res = new Response();
		try{
			String accName = param.get('Name');
			String accNo = param.get('AccountNumber');

			List<Account> accs = [Select Name,AccountNumber
					From Account
					Where Name = :accName and AccountNumber = :accNo
					Order By Name];

			res.total = accs.size();
			res.records = accs;

		}catch(Exception ex){
			res.errorMessage = ex.getMessage();
			res.success = false;
		}
		return res;
	}
}
```

【補足】

クライアント側からは、

```
{
	Name: 'AAA',
	AccountNumber: 'BBB'
}
```

といったパラメータを受け取ります。
※キーに`Name`と`AccountNumber`を指定する、というのを決まり事にしています。

上のようなパラメータを受け取って、Apex側で分解します。

```apex
String accName = param.get('Name');
String accNo = param.get('AccountNumber');
```

これを検索条件として、取引先を取得するためのSOQLを発行します。

```apex
List<Account> accs = [Select Name,AccountNumber
	From Account
	Where Name = :accName and AccountNumber = :accNo
	Order By Name];
```

最後に、取得した結果をレスポンス用のオブジェクトにセットして返します。

```apex
res.total = accs.size();
res.records = accs;
```

##### 4. この後

多分、クライアント側..すなわちExt JSによる実装編に続く予定です。
quiltの使い方

## 概要
quiltを使った，patchの生成，適応，管理等の説明．

## quiltとは
わかりやすく言うとpatchのバージョン管理のようなもの．
quiltを使ってpatchを生成，削除すると，seriesというファイルでpatchファイルと当てる順番を自動で管理してくる．
diffと違って，quiltでは編集モードで対象ファイルに差分を加え，モードを抜けることで自動的にpatchが生成される．
それと同時にseriesファイルに管理情報が自動で追加される．

## 用語
quiltではpatchをあてることをpush，はずすことをpopという用語で表現する．

## チートシート
|command|概要|
|---|---|
|push|seriesファイルに書かれた順に従ってpatchを1つあてる|
|pop|seriesファイルに書かれた順に従ってpatchを1つはずす|
|new|新しいpatchを生成|
|add|編集するファイルを追加|
|refresh|編集した差分をnewで生成したpatchファイルに反映|
|diff|現在までの差分を表示|
|edit|addしたファイルを指定して編集(＄EDITORで指定されているeditorが起動)|
|push -a|seriesで管理されているpatchをすべてあてる|
|pop -a|あてたパッチを全てはずす|

## 使用例
```
$ mkdir patches           # seriesファイルの管理場所を作成
$ quilt new hoge.patch # 新しいpatchを生成(生成時点では空)
$ quilt add old.txt         # 編集したいファイルを追加
$ quilt edit old.txt         # 編集
$ quilt refresh               # hoge.patchに差分を反映
$ quilt pop                    # hoge.patchが当たる前(編集前)の状態に戻す
GitHub に登録している SSH 認証鍵を使って CoreOS サーバにログインする


cloud-config の users パラメータにて `coreos-ssh-import-github` を使う

```yaml
#cloud-config

users:
  - name: <ログインユーザ名>
    coreos-ssh-import-github: <GitHub ユーザ名>
    groups:
      - docker
```

例

```yaml
#cloud-config

users:
  - name: seigo
    coreos-ssh-import-github: spesnova
    groups:
      - docker
```

この部分の設定を cloud-config に追加して CoreOS を provisioning すれば、GitHub に登録した SSH 認証鍵を使ってログインできるようになる

```bash
$ ssh -i ~/.ssh/github_private_key seigo@core-01
```

## GitHub Enterprise

```yaml
#cloud-config

users:
  - name: seigo
    coreos-ssh-import-url: https://github-enterprise.example.com/api/v3/users/spesnova/keys?access_token=<TOKEN>
```

## メモと感想

* 開発チームが本番/ステージング問わずサーバに SSH ログインする機会は少なからずあり、鍵の管理をどうするかって問題がある

鍵を管理するサーバを用意すればいいんだけど、既に利用してる GitHub がそれを担えるならそれ有効活用すればいいじゃんって思った次第。 10 人くらいの開発チームだと鍵サーバの面倒まで見るの大変だから [GitHub の Public Keys API](https://developer.github.com/v3/users/keys/) 本当にありがたい。で、さらに公開鍵を外部から取得しておくってのが 1 行で済む CoreOS ありがたやという話。

GitHub API の Organizations API を使ってチームメンバーのユーザ名一覧を取得してきて、それを元に cloud-config の `users` パラメータを動的に設定すればメンバーが増えたとき楽できそう。（そのとき既存サーバはどう更新しよう...）

`coreos-ssh-import-url` フィールドを使えば、好きな URL から公開鍵を取得して配置させることができるから、flynn 作者の [progrium](https://github.com/progrium) が作ってる [progrium/keychain.io](https://github.com/progrium/keychain.io) で自前で鍵サーバ用意するとかも簡単にできるのかもしれない。

## REF

* [Using Cloud-Config #Users - CoreOS Documentation](https://coreos.com/docs/cluster-management/setup/cloudinit-cloud-config/#users)
MC内のレイヤー全てを配分し空白レイヤーを削除する

*MC内にレイヤー1とかレイヤー2とかの連番が並んでいるのを見るのが嫌なので制作しました。*
右クリックメニュー「レイヤーに配分」を使うと配置されているMC名やファイルネームが
レイヤーネームになり配置されるのでこちらを利用。配分後のレイヤーが残ってしまうので
空白レイヤーを削除。もともと空のレイヤーも削除されるのでスッキリします。

空白レイヤーの定義を、レイヤーのフレーム1になにも置かれていない事としているので
場合によって変更の必要があるかと思われます。

```JavaScript:jsfl

//
// MC内のレイヤー全てを配分し空白レイヤーを削除する
//

var layers = fl.getDocumentDOM().getTimeline().layers;
//全ての非表示とロックを外す　ガイドレイヤーは何もしない
for (var i = 0; i < layers.length; i++) {
	if(layers[i].layerType != "guide"){
		layers[i].locked = false;
		layers[i].visible = true;
	}
}

// すべて選択
fl.getDocumentDOM().selectAll();
// レイヤーに配分
fl.getDocumentDOM().distributeToLayers();

var afterLayers =fl.getDocumentDOM().getTimeline().layers;
var len=afterLayers.length-1;
//空白レイヤーを削除
for (var i=len; i>=0 ; i--) 
{
	//最初のフレームに何も配置されていないならレイヤーを削除する
	if(!afterLayers[i].frames[0].elements[0]){
		fl.trace("DeleteLayer = "+fl.getDocumentDOM().getTimeline().layers[i].name);
		fl.getDocumentDOM().getTimeline().deleteLayer(i);
	}
}
```
golang で string を []byte にキャストするとメモリコピーが走ります

いまはもっと賢くなってる。最適化ﾊﾞﾝｻﾞｲ
https://medium.com/a-journey-with-go/go-string-conversion-optimization-767b019b75ef


# 概要

string を byte スライスにしたり，またその逆だったりをおこなうのに，

```go:string2byteslice
vec := []byte("hello")
```

なんてコードをよく書きます．string は読み込み専用のスライスみたいな物だという認識だったので，キャストしても，ポインタがコピーされるだけで，必要になったらコピーされるだろうぐらいに思ってたんですが，調べてみたらメモリがまるっとコピーされるのでパフォーマンスに影響しそうなときは要注意です．

# 詳細

string を byte スライスにキャストするプログラムを書いて，アセンブリコードを吐かせてみました．

```go:キャストするだけのプログラム
1  package main
2
3  import "fmt"
4
5  func main() {
6          str := "hello, world!"
7          vec := []byte(str)
8          fmt.Println(vec)
9  }
```
7行目でキャストしてます．下記の要領でアセンブリを吐き出します．

```
% go tool 8g -S stringbytes.go
```

なかみをのぞいてみると，7行目でキャストしているコードに対応するところで
`runtime.stringtoslicebyte()` というのが呼ばれています．

```
0x0039 00057 (stringbytes.go:7) CALL    ,runtime.stringtoslicebyte(SB)
```
探してみたところ，こいつは，src/pkg/runtime/string.goc にいました．

```go:src/pkg/runtime/string.goc
func stringtoslicebyte(s String) (b Slice) {
        uintptr cap;

        cap = runtime·roundupsize(s.len);
        b.array = runtime·mallocgc(cap, 0, FlagNoScan|FlagNoZero);
        b.len = s.len;
        b.cap = cap;
        runtime·memmove(b.array, s.str, s.len);
        if(cap != b.len)
                runtime·memclr(b.array+b.len, cap-b.len);
}
```

どうやらメモリを確保してコピーしているようです．なるほど・・・．

# 感想

`strings` パッケージの `ReadByte()` とか使ったり，そもそも byte スライスで扱うように見直してみたりすることで，むやみにメモリコピー＆GCが走るのを抑制できそうです．string をキャストする際には一呼吸置いて考える必要がありそうです．

# 追記：byte スライスから string へのキャスト

byte スライスから string へのキャストだと，もしかしたらメモリコピーしなくてもすむんじゃないかと思って調べてみた．

```go:src/pkg/runtime/string.goc
func slicebytetostring(b Slice) (s String) {
        void *pc;

        if(raceenabled) {
                pc = runtime·getcallerpc(&b);
                runtime·racereadrangepc(b.array, b.len, pc, runtime·slicebytetostring);
        }
        s = gostringsize(b.len);
        runtime·memmove(s.str, b.array, s.len);
}

func slicebytetostringtmp(b Slice) (s String) {
        void *pc;

        if(raceenabled) {
                pc = runtime·getcallerpc(&b);
                runtime·racereadrangepc(b.array, b.len, pc, runtime·slicebytetostringtmp);
        }

        // Return a "string" referring to the actual []byte bytes.
        // This is only for use by internal compiler optimizations
        // that know that the string form will be discarded before
        // the calling goroutine could possibly modify the original
        // slice or synchronize with another goroutine.
        // Today, the only such case is a m[string(k)] lookup where
        // m is a string-keyed map and k is a []byte.
        s.str = b.array;
        s.len = b.len;
}
```

やっぱりコピーされるが，コンパイラの最適化でなんかやりたい雰囲気は見られた．
いまのところ，map のキーでキャストしているようなのにしかこの最適化は適用されないっぽい．
Laravel 4でREST APIのテストを書いて$this->callに嵌る

## 便利な $this->call
Laravel ではユニットテストの中で `$this->call` を呼び出すことで、簡単に HTTP リクエストを送った結果をテストすることが出来ます。
内部では `Symfony\Component\HttpKernel\Client` が使われています。

[ドキュメント](http://laravel.com/docs/testing#calling-routes-from-tests) にはこう書かれています。

> You may easily call one of your routes for a test using the call method:

> ```
 $response = $this->call('GET', 'user/profile');
> 
 $response = $this->call($method, $uri, $parameters, $files, $server, $content);
```

$uri は相対パスで書ける！便利！！　と思いますよね。
実は、ここにはちょっとした罠がありました。

## 試す
まずは、普通に試してみます。
適当なルートを用意して、単純なテストを書きます。

```routes.php
<?php

Route::get('test/create', function () {
	return Response::make('ok');
});
```

```APITest.php
<?php

class APITest extends TestCase {

	public function testGetTest()
	{
		$response = $this->call('GET', 'test/create');
		$this->assertTrue($response->isOk());
	}
}
```

走り切りましたね。
テストは通りました。

では、 `APITest.php` の方に手を加えて、 2 回リクエストを送ってみます。

実際にこんなテストは書きませんが、何か副作用のある API を叩いた後に適用されているかチェックする意味で、 1 つのテストケースの中で 2 回以上リクエストを送りたいことがあると思います。

```APITest.php
<?php

class APITest extends TestCase {

	public function testGetTest()
	{
		$response = $this->call('GET', 'test/create');
		$this->assertTrue($response->isOk());

		$response = $this->call('GET', 'test/create');
		$this->assertTrue($response->isOk());
	}
}
```

このテストコードを走らせると、必ず 2 回目のリクエストで `Symfony\Component\HttpKernel\Exception\NotFoundHttpException` が発生します。

1 回目でリクエストが通っていて、何も副作用のあることしていないのに…どうして NotFound ！？　と困惑します。

## 結論

`$uri` は `/` から書く。

つまり

```
$response = $this->call('GET', '/test/create');
```

こう書けば、何度でも呼び出せます。

`$this->call` に `$uri` を相対 URI で渡すと、前回リクエストした URI からの相対 URI になるようで、それは NotFound になるのも納得できます。

ちなみに、 `$this->call` の HTTPS 版である `$this->callSecure` ではこのような嵌まり方はしません。

```Illuminate/Foundation/Testing/TestCase.php
	public function callSecure()
	{
		$parameters = func_get_args();

		$parameters[1] = 'https://localhost/'.ltrim($parameters[1], '/');

		return call_user_func_array(array($this, 'call'), $parameters);
	}
```

`https://localhost/` 決め打ちな所がカジュアルですね。

## 備考
[Laravel のフォーラム](http://laravel.io/forum/03-07-2014-testcase-tests-unable-to-make-multiple-call) にはこんなことが書いてありました。

> Doing a $this->refreshApplication() fixes it, just ensure that you set up the test again.

`$this->call` 呼んだ後に毎回 `$this->refreshApplication` を呼ばないといけないなんて、そんな非効率なことある訳ないですね。

`$this->refreshApplication` を呼ぶと直るのは、 `Client` インスタンスが新しく生成される為です。 

## 参考
* [テスト | Symfony2日本語ドキュメント](http://docs.symfony.gr.jp/symfony2/book/testing.html)
* [TestCase::call()](https://github.com/laravel/framework/blob/4.1/src/Illuminate/Foundation/Testing/TestCase.php#L72)
* [Symfony\Component\HttpKernel\Client](https://github.com/symfony/symfony/blob/2.5/src/Symfony/Component/HttpKernel/Client.php)
* [Symfony\Component\BrowserKit\Client getAbsoluteUri()](https://github.com/symfony/symfony/blob/2.5/src/Symfony/Component/BrowserKit/Client.php#L547)

## 最後に
<blockquote class="twitter-tweet" lang="en"><p>ドキュメントに書いてないのなら、コードを読むまでだ…</p>&mdash; たけ@日常 (@ww24) <a href="https://twitter.com/ww24/status/506376921664352256">September 1, 2014</a></blockquote>

コードを追う前に Qiita やフォーラムを参照しましょう。
Yeoman の webapp ジェネレータに Haml を導入する


# 前提となる環境

- OS： `Mac OS X 10.9.4 (Mavericks)`
- Yeoman と Yeoman公式 の [webapp](https://github.com/yeoman/generator-webapp) ジェネレータを使います。
	- もしまだ入ってなければ、次のようにセットアップしてください。

		```shell:
		$ npm install -g yo grunt-cli bower
		$ npm install -g generator-webapp
		```

	- npm がはいってなければ、Homebrew で Node.js をインストールしてください。

		```shell:
		$ brew install node
		```

	- Homebrew自体が入ってなければ、Homebrewの[公式ページ](http://brew.sh/index_ja.html)どおり、次のようにインストールします。

		```shell:
		$ ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
		```

		※ 執筆時とコマンド内容が変わってるかもしれないので、公式ページを確認ください。
		※ 事前に [Xcode](https://developer.apple.com/xcode/downloads/) のコマンドラインツールが必要かも。

- Hamlコマンドもあらかじめ必要です。なければ次のようにインストール。

	```
	$ gem install haml
	```

# 手順

### ① webapp ジェネレータを起動し、雛型を生成します。

```shell:
$ yo webapp --coffee
```

### ② このプロジェクトへ [grunt-haml](https://github.com/concordusapps/grunt-haml) を導入します。

```shell:
$ npm install grunt-haml
```

※ プロジェクトだけにインストールしたいので `-g` オプションはつけません。

### ③ Grunt のタスクを修正します。

`.haml` ファイルの変更を検知した場合、また `$ grunt serve` や `$ grunt build` で `.haml`ファイル を `.html`ファイルへコンパイルするようにします。

```diff:Gruntfile.js

〜

module.exports = function (grunt) {

    // Load grunt tasks automatically
    require('load-grunt-tasks')(grunt);

    // Time how long tasks take. Can help when optimizing build times
    require('time-grunt')(grunt);

+    grunt.loadNpmTasks('grunt-haml');

    // Configurable paths
    var config = {
        app: 'app',
        dist: 'dist'
    };

    // Define the configuration for all the tasks
    grunt.initConfig({

        // Project settings
        config: config,

        // Watches files for changes and runs tasks based on the changed files
        watch: {

〜

+            haml: {
+                files: ['<%= config.app %>/{,*/}*.haml'],
+                tasks: ['haml']
+            },

〜

        },

〜

+        haml: {
+            two: {
+                files: grunt.file.expandMapping(['app/*.haml','app/views/*.haml'], './',{
+                    rename: function(base, path) {
+                        return base + path.replace(/\.haml$/, '.html');
+                    }
+                }),
+                options: {
+                    language: 'ruby'
+                }
+            }
+        },

〜

        concurrent: {
            server: [
                'coffee:dist',
+                'haml',
                'copy:styles'
            ],
            test: [
                'coffee',
+                'haml',
                'copy:styles'
            ],
            dist: [
                'coffee',
+                'haml',
                'copy:styles',
                'imagemin',
                'svgmin'
            ]
        }
    });

〜

```

以上！

# 補足

一応、上記の感じでも使えるのですが、課題として、

- 動的なファイル変更の検知＆ブラウザのリロードが出来ていない..
- `.haml` と同じフォルダに `.html` が生成されてしまう..
	- CoffeeScript や SASS のように `.tmp` に格納したい。
IE7で float: left; を指定しているのに2行になってしまう問題


例えば、以下の様なhtmlがあったとき

```
<div class="wrapper">
	<div class="leftColumn"></div>
	<div class="rightColumn"></div>
</div>
```

親であるwrapperのwidth幅ぴったりになるように、floatを使って設計したとします。

```
.wrapper{
	width: 300px;
	overflow: hidden; // clearfix
}

.leftColumn{
	float: left;
	width: 100px;
}

.rightColumn{
	float: left;
	width: 200px;
}
```

このやりかたで、モダンブラウザではもちろん問題なくwidth幅ぴったりに表示されるのですが、
IE7以下だと2段になってしまいます。

これは、IE7以下のfloatの仕様が、

**子要素の横幅の和が親DOMと同じか、それ以上になると改行してしまう**

からです。

つまり、改行になる条件が 

子要素の横幅合計 > 親DOM

ではなく、

子要素の横幅合計 >= 親DOM

だということです。

知らないとハマってしまいがちなので気をつけたい。
Swiftのoptionalについて


optionalについて簡潔にまとめてあるものが少なかったのでまとめてみた。

### どういう場合に必要になるか
* 変数に`nil`を代入したい場合
* 引数に`nil`を受け取る場合

通常宣言された変数には`nil`を代入することはできないが、変数をoptional宣言（ラップ）することで`nil`を代入することができるようになる。  

### 使い方

型アノテーションの末尾に`?`を付けて宣言する。初期値は`nil`になる。

```swift
var optionalString: String?
optionalString  = "Hello"
```

ただ、optional変数は`nil`が含まれる可能性があるため、optionalでない変数として扱うことはできない。  

```swift
func printString(string: String) {
    println("\(string)")
}

var optionalString: String? = "Hello"
// ビルドエラー
printString(optionalString)
```

この場合は、`!`を使用（アンラップ）してoptional変数が`nil`ではないことを明示的にしなければならない。

```swift
printString(optionalString!)
```

ただ、`!`を使用した際に変数の中身が`nil`だと実行時に処理が落ちてしまうので都度確認する必要がある。

```swift
// 初期値はnil
var optionalString: String?

// 中身がnilなので実行時エラー
printString(optionalString!)

if optionalString != nil {
    // !を付けてnilでないことを明示的に（アンラップ）する
    printString(optionalString!)
}
```

あるいは`if`を使ってoptional変数の中身を取り出すことができ、こちらのほうが便利で一般的。

```swift
var optionalString: String? = "Hello"

// 	nilではないことを証明
if let string = optionalString {
    // stringはnilではないことが確約（アンラップ）されている
    printString(string)
}
```

ちなみに以下の記述は落ちる。

```swift
// 初期値はnil
var optionalString: String!

// 実行時エラー
printString(optionalString)
```

ちなみに以下の記述は通る。

```swift
// 初期値はnil
var optionalString: String!

// nilは許容される
func printString(string: String!) {
    println("\(string)")
}

// nilでも大丈夫
printString(optionalString)
```

### まとめ

* 変数に`nil`が入る可能性が無いなら、宣言時に何も付けない
* 変数に`nil`が入る可能性があるなら、宣言時に`!`か`?`をつける
* `!`はoptional変数が`nil`ではないと思われる際につける
* `?`はoptional変数が`nil`でも構わない時につける
COBOLでウェッブアプリケーションを書く


COBOLいじってて、Webフレームワークとかあんのかなーと思って調べてたらあった。
[COBOL on Wheelchair](http://azac.pl/cobol-on-wheelchair/)
> COBOL on Wheelchair is a minimal webframework\^H\^H\^H\^H\^H\^H just a proof of concept. 

## 準備
AWS上のUbuntu 14.04で試した。

```
$ sudo apt-get install git apache2 open-cobol
$ git clone https://github.com/azac/cobol-on-wheelchair /var/www/cobol-app
```

ソースをコンパイルする。

```
/var/www/cobol-app $ ./downhill.sh
/var/www/cobol-app $ ./the.cow
content-type: text/html

<html>
        <head>
...
/var/www/cobol-app $ 
```

CGIとして動かせるようにApacheを設定する。

```/etc/apache2/apache2.conf
ScriptAlias /cgi-bin/ "/var/www/cobol-app/"
<Directory /var/www/cobol-app/>
     AddHandler cgi-script .cow
     Options +ExecCGI
     AddHandler image/png .png
</Directory>
```

mod_cgiを有効にして再起動する。

```
$ sudo a2enmod cgi
$ sudo /etc/init.d/apache2 restart
```

http://[IPアドレス]/cgi-bin/the.cow にブラウザでアクセスできるはず。車椅子に乗った変な恐竜が出てきて渋い。
![スクリーンショット 2014-09-03 00.13.03.png](https://qiita-image-store.s3.amazonaws.com/0/7325/9e3f75df-9994-9822-306d-1707019a29db.png "スクリーンショット 2014-09-03 00.13.03.png")


(routing機能のとこがうまく動かなかった・・)

公開されないままストップしているけど、こういうのもあるらしい
[COBOL ON COGS](http://www.coboloncogs.org/STARTED.HTM)
> WE ARE CURRENTLY IN#THE LAST PHASES@OF@BETA TESTING.
GenymotionにAndroidChromeの旧バージョンを入れる

Genymotion

https://cloud.genymotion.com/page/launchpad/download/

そのままではapkを入れられないのでARM-Translationを入れる。
起動している状態の仮想デバイスにzipをドラッグ・アンド・ドロップした後、仮想デバイスを再起動すればよい。

ARM-Translation

http://filetrip.net/dl?4SUOrdcMRv

ここでDLしたAndroidChrome旧バージョンのapkを仮想デバイスにドラッグ・アンド・ドロップすればインストール出来る。
インストール済みのバージョンより下のバージョンをインストールするダウングレードは出来ないが、
設定からアンインストールした後で、インストールすれば可能。

http://chrome-beta.jp.uptodown.com/android/old

余談だがPCのChromeからリモートデバッグ可能なのはバージョン32以降。
cron実行時のカレントディレクトリは、実行ユーザのホームディレクトリ


環境等によって違いがある可能性はありますんで、可能なら

```bash:crontab
* * * * * date > temp.txt
```
みたいなことをして、 `temp.txt` が吐き出される場所を確認したら良いかなと思います。



## 現象
プログラムと設定ファイルが同一ディレクトリにある前提で実装していたのだが、そのプログラムをcronから実行した途端動作しなくなった。

## 解決方法
答えはタイトルの通りなので、 `~/` に設定ファイルなりを置くとOK。
でもちょっと気持ち悪いよね、ということで、

* プログラム内でフルパス(もしくは環境変数等から割り出せるディレクトリ）を指定
* `crontab` で以下のようディレクトリ移動する。

```:crontab
* * * * * cd DIR ; ./PROGRAM
```

その他、まぁこの __「ホームディレクトリで実行される」__ ということが分かっていれば好きに対策を講じることができるので安心です。
写経でプログラミングが上達するか

ここで言う写経というのは、プログラミング言語を習得するときに、サンプルコードやチュートリアルを自分の手で打ち込む行為を指します。

写経、やっている人結構多いと思います。
私もやります。

[プログラミング言語は「黙って写経」──カーネルハッカー・小崎資広（4）](http://cybozushiki.cybozu.co.jp/articles/m000319.html)

これまでにも、例えばブログ界隈なんかで「写経いいよ」という話が出て、Twitter なんかで「じゃあ俺も写経やってみよう」なんて盛り上がる、という流れは何度となくあったと思います。

(以下、上記記事からの引用、敬称略)

>(小崎)黙って写経は意外とね、勉強の方法としてはかなり上位でいい感じ。
>(西尾)指先しか動いてないですけど。
>(小崎)でも意味あるんだよ、それでも。
>(西尾)確かに、ただ読んでると眠くなってしまったり、自分は読んでるつもりでページをめくっているけれども実は頭には入らずに全部素通りしていたりしますよね。指を動かして打っているとそういうことにならない。そういう意味では写経ってすごく意味があるんですね。
>(小崎)意味があるんです。

確かになるほどな、と思わされます。
カーネルハッカーがそう言うのであればなおさらです。

# ただ写経すればいいか

だけど、実際やってみると、「そうでもないかな」と思うことがあります。
無意識的に書籍の見開き 1 ページ分ぐらい打ち込み終えてしまった後とか。

プログラミングに限らず、スポーツでも楽器でもなんでもそうですが、同じ訓練を積んでも上達する人・しない人はいます。
生まれ持ったセンスや才能によるところもあるでしょう。

本当にトップクラスに行けるかどうかであれば、才能はかなり重要かもしれません。
ですがここでは、平均的な人から「この人はちょっとすごいな」と思われるかどうか、ぐらいのレベルを問題にしましょう。

そのぐらいのレベルで考えると、問題になるのは *「練習をしながら何を考えているか」* ではないでしょうか。

# 考えながらやらなくては意味がない

先にも書いた通り、写経は意外と無意識的にできます。
私は英語の勉強として、英文を書き写すことがありますが、あれも同じ。
スポーツや楽器でいうと、基礎的なトレーニングをボーっとやっちゃう感じでしょうか。

基礎的なトレーニングというのは、本来明確な目的があってやるものです。
ギターのクロマティックスケールを使った練習 (半音ずつ、1 弦ずつ上昇・下降しながら弾く) であれば、各指の独立性を高めようとか、きれいに音が出るようにフレットの近くをきちんと押さえようとか、それを無駄な力を使わずにやろうとか。

それと同じで、写経のときにも、目的意識を持ちながら行う必要があるでしょう。

誰に言われるでもなく写経にたどり着いた人は、ほぼ必然的に目的があってそこにいると思うので、問題ないと思います。
誰かの影響で「そうか、写経いいのか」となった人は、何を目的にそれをやるのか明確にするところから始めないと、危ないかもしれません。

# 写経から何を得るか

## 基礎的な文法

最もわかりやすいところではやはりこれでしょう。
「この言語では文末にセミコロンはいらないんだな」とか、「エラー処理が面倒な言語だな」とか。
特に、自分が既に知っている言語との差異を意識しながらやることが多いです。

個人的には、意味の分からない構文があっても、とりあえず気にせず書き進めて、終わったら特に気になったものをいくつか調べるのがいいと思ってます。

## 言語固有の文化

文法とも似ていますが、文法的には既に知っている言語とそんなに大きな差はなくても、変数や関数の命名など、違っているかもしれません。
実際に何かを作るときのために、意識に刷り込むようにしておくといいでしょう。

## 設計に関する洞察...?

これが得られるかどうかは意見が分かれるところかもしれません。
私個人としては、「写経が設計の理解を助けてくれることはある」と思ってます。
これなんかは特に、考えてやらないと何も得られずに終わると思います。

コードを眺めるだけでもいいんだけど、無意識的に飛ばして読んだりできないように写経する、という感じでしょうか。
コードを一度頭に入れるために必要な作業であって、そこから洞察を得るには自分の頭でよく考えることが必要でしょう。

## 自分で実際に書いて、実行したことがある、という自信

これは結構大きいんじゃないでしょうか。
一度も書いたことのない言語を書き始めるのは、なかなか億劫ですが、「書いて、実行したことがある」という自信があればかなり違うでしょう。
ちゃんと脳内に刷り込むように写経していれば、やりたいことからコードへの変換も速いはずです。

単純に、一度実行したことがある、ということは手元に実行環境ができているので、何か作り出すときの障壁が少ない、というのもあるかもしれません。
(これは意識関係ない)

# まとめ

ひとことでいえば「手段と目的をはき違えるな」で済むところを長々と書いてしまい申し訳ございません。

「何が得られるか」「そのために何を考えるか」についてはいろんな意見があると思うので、ぜひともコメントください。
mediaQueryを書く際の or 文


カンマで区切ることで、条件の「OR」を満たすことができます。

```
@media only screen and (max-width: 480px), (max-device-width: 480px){
	///
}
```

userAgentを使わずに、mediaQueryだけでPCではレスポンシブ、SPではSPレイアウトを表示させたいときは上記のように
書くのが最適解なのではないかと思っています。
caistrano3 db:seedのタスクを追加する

deploy.rbのnamespace :depoy do; end中に以下を追加しました。

```rb
namespace :deploy do
  desc 'db_seed'
  task :db_seed do
    on roles(:db) do |host|
      with rails_env: fetch(:rails_env) do
        within current_path do
          execute :bundle, :exec, :rake, 'db:seed'
        end
      end
    end
  end
end
```

実行時

```bash
bundle exec cap production deploy:db_seed
```

自分の設定([ここ参照](http://qiita.com/hmu29/items/d8edd5bb252711684b99)）では、上記を足したところ動作しました。

-----
参考
[Capistrano3 で bundle exec rake db:seed のタスクを実行](http://easyramble.com/capistrano3-rake-db-seed.html)
Githubにあるレポジトリに対するpushやプルリクエストなどをHipchatに通知させる方法

#Github側の設定
特に不要！！通知対象にしたいレポジトリがあればよい。

#Hipchat側の設定

##Roomの作成
Hipchatのクライアントアプリから新規にルーム作成（これWEB上で出来ない？）

##Roomの選択
HipchatのWEBコンソールにログインし
Group admin > Rooms と辿って、作成済みのルームを選択する

![sk_スクリーンショット_2014-09-03_14_38_21.png](https://qiita-image-store.s3.amazonaws.com/0/47881/f1eb84ec-ee32-6733-2dd1-0a64537ef675.png)

##Githubプラグインのインストール

Roomの設定ページで、左メニューの「Integrations」を選択して、プラグイン一覧から「Github for HipChat」を探してインストール。

![スクリーンショット 2014-09-03 14.39.17.png](https://qiita-image-store.s3.amazonaws.com/0/47881/6d9ade10-c717-2854-b513-72afa906f0cc.png)
プラグインの一覧


![スクリーンショット 2014-09-03 14.39.45.png](https://qiita-image-store.s3.amazonaws.com/0/47881/b73e2ff9-a7a4-e88c-6aee-d42e8ce8c781.png)
*Github for HipChat*プラグイン


![スクリーンショット 2014-09-03 14.35.28.png](https://qiita-image-store.s3.amazonaws.com/0/47881/0660a962-30dc-ec68-0318-266ec46f2b78.png)
Githubとの認証確認

##Githubプラグインの設定

Roomの設定ページにいくと、Integrations > ManageタブにGithubプラグインが表示されているので、右端のConfigureボタンを押して設定ページにいく。

![スクリーンショット 2014-09-03 14.37.10.png](https://qiita-image-store.s3.amazonaws.com/0/47881/97b3b6e8-6125-b197-9aea-dccfcf0572bb.png)


ここで、通知対象としたいレポジトリを右上のボックスに入力し、＋ボタンで追加する。

![sk_スクリーンショット_2014-09-03_14_35_54.png](https://qiita-image-store.s3.amazonaws.com/0/47881/ee2c3876-b522-fb7f-de2c-6c97b4bf11ef.png)

追加されたレポジトリに対して右端の鉛筆ボタンで設定画面を開き、通知対象のアクションを選ぶ。
この際、右下の「Notify members of room」にチェックを入れる事でHipchatのクライアントアプリがピョコンって跳ねるようなプッシュ通知を行ってくれるようになる。
![sk_スクリーンショット_2014-09-03_14_37_41.png](https://qiita-image-store.s3.amazonaws.com/0/47881/ef7546da-55fd-b7bb-0b43-8804ecf5d717.png)




#連携の確認

##Githubのレポジトリの確認

対象レポジトリの　setting > Webhooks & Services ページにHipchatのプラグインが表示されているはず。

![sk_スクリーンショット_2014-09-03_14_40_24.png](https://qiita-image-store.s3.amazonaws.com/0/47881/2c377222-7192-2864-91a2-ee2cdfc668d1.png)

##通知の確認
実際に対象のレポジトリで通知対象のアクションを行うと、クライアント側のHipchatアプリにプッシュ通知されるはず。
![sk-スクリーンショット_2014-09-03_15_25_35.png](https://qiita-image-store.s3.amazonaws.com/0/47881/9252265a-2ea3-5350-b284-d0ddcd7a1ce6.png)
boot2docker で mongo が起動しない

```shell-session
$ boot2docker up
$ docker run mongo
```

すると、「容量が足りね」とエラーになって起動しない。
docker run にパラメータを足して

```shell-session
$ docker run -v /var/data:/data mongo mongod --noprealloc --smallfiles
```
って、docker hub でコメントに書いてあった
RubyMine で正規表現を確認する


以下のような確認ができて、たまに便利です。

![rubymine_regexp.gif](https://qiita-image-store.s3.amazonaws.com/0/4393/f81544ca-a85e-8cd7-517e-223e7b9380e3.gif "rubymine_regexp.gif")


## 試したバージョン

- `rubymine` - 6.3.3

## やり方

1. 正規表現リテラルにフォーカスした状態（※今回だと`/\A\d{5}\z/`）で`Intention Actions`を表示して`Check RegExp`を選択する

	![check.png](https://qiita-image-store.s3.amazonaws.com/0/4393/43db3e09-98c7-c2f6-5b8e-96d05eafda8e.png "check.png")

2. `RegExp`に正規表現リテラルが入力された状態になっているので`Sample:`に確認したい文字を入力する

	![ss 2014-09-03 14.46.17.png](https://qiita-image-store.s3.amazonaws.com/0/4393/c2226d0e-5e17-ce40-b730-27d251305d6b.png "ss 2014-09-03 14.46.17.png")


3. `RegExp`にマッチした場合

	![ss 2014-09-03 14.27.59.png](https://qiita-image-store.s3.amazonaws.com/0/4393/2ebe1670-9b1d-5664-e0a4-2be6bc2c2abe.png "ss 2014-09-03 14.27.59.png")

4. `RegExp`にマッチしない場合

	![ss 2014-09-03 14.27.42.png](https://qiita-image-store.s3.amazonaws.com/0/4393/b63bdc9e-9faa-2fe8-4d45-eb3250336b98.png "ss 2014-09-03 14.27.42.png")

## Intention Actionsのショートカット

Keymapで検索するとわかります。

もし何も設定されていない場合は設定すればよいです。

![Preferences 2.png](https://qiita-image-store.s3.amazonaws.com/0/4393/182861c3-7ba5-c61f-31e3-d94165bdc756.png "Preferences 2.png")


以上
Knockout.jsで複数のViewModelを扱う


結論：ネームスペースが別れるので、ViewModelはガンガン分割できる。

# ViewModelを定義する

### LTEとWiMAXの契約状態を表すモデルを作成

```coffeescript
class LteViewModel
  constructor: ->
    @plan = ko.observable("")
    @status = ko.observable("")
```

```coffeescript
class WimaxViewModel
  constructor: ->
    @plan = ko.obserbable("")
    @status = ko.obserbable("")
```

# バインドする

```coffeescript
$ ->
  lte_vm = new LteViewModel()
  wimax_vm = new WimaxViewModel()

  ko.applyBindings({
    lte: lte_vm,
    wimax: wimax_vm
  })

  # この後ajaxなりなんなりで各モデルのプロパティを操作する
```

applyBindingsでハッシュ的に複数のVMをバインド出来る

# html側からのバインド

```haml
%div{data: {bind: "with: lte"}}
  %h3 LTEに関する契約情報
  %p{data: {bind: "text: plan"}}
  %p{data: {bind: "text: status"}}

%div{data: {bind: "with: wimax"}}
  %h3 WiMAXに関する契約情報
  %p{data: {bind: "text: plan"}}
  %p{data: {bind: "text: status"}}
```

# 結論
* bind: withで名前空間が切れるので、プロパティ名はその内部で自由に設定できる。便利！

# knockout.jsを使う意外なメリット
これはknockout.js以外のAngular等でも一緒なんですが、data-bind: ほげほげっていう記述を使うとXPATH指定で一意に特定できるので、TurnipなどのE2Eテストが書きやすくなります。
Androidアプリの開発用にCordova 3.5のインストール


参考にしたのはこのサイト
http://shared-blog.kddi-web.com/activity/227

上記ページに書いてあるbrewでのインストールが上手くいかなかったので、

	$ brew update

して、/usr/local の権限がrootに変わっていたため、

	$ sudo chown -R $USER /usr/local

を実行（$USERは自分のユーザ名です）。

そしてやってみる。

まずは、Xcodeインストール
http://developer.apple.com/xcode/
ですが、これは普段iOS/Macの開発してるのでスキップしました。

次、Node.jsインストール
http://nodejs.org

（インストールの確認）

	$ node -v
    v0.10.31
	$ npm -V
	1.4.23

次、Cordovaのインストール

	$ sudo npm install cordova -g

（インストールの確認）

	$ cordova -v
	3.5.0-0.2.7

次、iOSシミュレータのインストール

	$ sudo npm install -g ios-sim

次、antのインストール

	$ brew install ant

以上です。
次にアプリケーションを作ってみます。

	$ cordova create hello com.example.hello HelloWorld -d

で、ディレクトリを移動し

	$ cd hello

androidプロジェクトを追加

	$ cordova platform add android

いざ実行

	$ cordova emulate android -d

ecripseでのビルドじゃないので、別途調査。
Rspecで特定のテストを実行しない

Rspec実行時、タグの前に~を付けると、そのタグのついたテストはスキップされる。

```bash:コマンド
$ bundle exec rspec -fd spec --tag ~js 
```

```rb:実行されない
    it "steps through the full story life cycle", :js => true do
      visit project_path(project)

      # 中略

      find('.story-title').should have_content('New story')
    end
```
chocolatey 0.9.9.8使ってみた

## 参考

* [Windows - chocolatey小メモ - Qiita](http://qiita.com/tsuyoshi_cho/items/56348cf684412774c8e3)
* [windowsの開発環境は一瞬で整うwith chocolatey - Qiita](http://qiita.com/himinato/items/11f4dc9a23afebbc242c)

# chocolateyのインストール

* powershell、dotnet2.0、dotnet4.0が必要。

```ps1:コマンドプロンプトにて実行
@powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%systemdrive%\chocolatey\ProgramData\bin;
```

## パッケージの検索

```bash:
clist ssh
```

## 一括インストール

```xml:packages.config
<?xml version="1.0"?>
<packages>
    <package id="ChocolateyGUI" />
    <package id="Sudo" />
    <package id="ChocolateyPackageUpdater" />
</packages>
```

```bash:
cinst -y packages.config
```

```diff:packages.config(xp対応)
+   <package id="MobaXTerm" />
+   <package id="git" />
+   <package id="putty-d2ddw" />
+   <package id="wizmouse" />
+   <package id="googlechrome" />
```

```bash:インストール済みパッケージ一覧
clist -lo
```

```bash:全パッケージ更新
cup all
```

* [Chocolateyを使った環境構築の時のメモ - Qiita](http://qiita.com/konta220/items/95b40b4647a737cb51aa)

```bash:バージョン指定
cinst -y パッケージ名 -version 2.2.0.1
```

```bash:アンインストール
cuninst パッケージ名
```
MacでRackhubをローカルにマウントする


SSHであればRackhubに限らないのですが。

Rackhubはインフラにさくらを使用しているということで、国内からのアクセスが早いということなので、マウントでの利用にも耐えうるかな？と期待。

Rackhubでの登録、Rack作成作業は割愛。

###SSHキーペアの準備
- ペアの生成

```bash
ssh-keygen -t rsa
```

- 公開鍵をRackhubに登録

###OSXFUSEとSSHFSのインストール

http://osxfuse.github.io/


###マウントするローカルディレクトリの作成

```bash
mkdir ~/Documents/Remote/rackhub
```

###ログイン時のマウント設定
- 下記内容を起動スクリプトとして適当な場所に保存する
例）/usr/local/etc/login.command

※rackbox.netのサブドメイン部分は作成したRackによって変更すること

```bash
sshfs -o idmap=user rackhuber@xxxx.rackbox.net:[remote_path] ~/Documents/Remote/rackhub -p 50105 -o IdentityFile=[private_key_path]
```

- 起動スクリプトのパーミッション設定

```bash
chmod oug+x /usr/local/etc/login.command
```

- 起動時実行設定

システム環境設定アプリから、[ユーザとグループ]→[ログイン項目]を開き、先ほど作成した起動スクリプトを追加する

###SSH接続設定のショートカット作成

ターミナルでSSH接続を行いたい時用

- 設定の保存

~/.ssh/configに下記内容を保存

```
Host rackhub
	HostName		xxxx.rackbox.net
	Port			50105
	User			rackhuber
	IdentityFile	[private_key_path] 
```

- パーミッション設定

```bash
chmod 600 ~/.ssh/config
```

以上で、

```bash
ssh rackhub
```

とコマンドをたたくだけで、Rackhubに接続できる
GoogleChartsのGeochartで都道府県分布マップを簡単作成

[GoogleChart](https://developers.google.com/chart/?hl=ja)便利ですね。
下記のような分布マップを簡単に作成できます。

![スクリーンショット 2014-09-03 12.45.44.png](https://qiita-image-store.s3.amazonaws.com/0/8463/ca007938-fb4a-66b7-0be9-b61c01bd7c0c.png "スクリーンショット 2014-09-03 12.45.44.png")


```
<script src="https://www.google.com/jsapi"></script>
<script>
google.load('visualization', '1', {packages:['geochart']});
google.setOnLoadCallback(graphChart);

function graphChart() {
  var data = google.visualization.arrayToDataTable([
    ["都道府県", "データ"], 
    ["北海道", 20], 
    ["青森", 3], 
    ...
  ]);

  var option = {
    region: 'JP',
    resolution: 'provinces'
  };

  var chart = new google.visualization.GeoChart(document.getElementById('chart'));
  chart.draw(data, option);
}
</script>

<div id="chart"></div>
```

都道府県のデータを入れてるところで適切にデータを入れれば簡単に分布マップを作成してくれます。
「青森県」じゃなくて「青森」にしないとうまく動作しないので要注意です。
URLが自動改行してくれない問題


長いURLをDOMの中に流し込むと、DOMにwidth指定しているにも関わらず、
そのwidth幅以上にDOMが広がってしまうことがあります。
URLは自動改行してくれない場合があるためです。

そんなとき、単語の途中であっても強制的に改行してくれるようにするcssプロパティが、

```
word-break: break-all;
```


となります。
git stashした内容を見たり削除したりする

# 一覧を見る
<pre>git stash list
stash@{0}: WIP on develop: ...
stash@{1}: WIP on develop: ...
stash@{2}: WIP on feature/...
stash@{3}: WIP on develop: ...
stash@{4}: WIP on refactor/...</pre>

# 比較する
<pre>git diff HEAD..stash@{n}</pre>

# 削除する
<pre>git stash drop stash@{n}</pre>
GoでNewなんとかのような関数を不必要に提供しないほうが良い理由

構造体を定義して、それに対してメソッドを定義して、最後にその構造体をアロケートして初期化するNewなんとかという関数を用意する、というのを何の疑問も持たずに行っているならちょっと考えものだ。途中まではよいが、Newなんとかみたいなのは別に必須ではない。

## メソッドとゼロ値

Goでは新しい値は「ゼロ値」で自動的に初期化される。ゼロ値は型ごとに違うが、数値なら0、文字列なら空文字列、ポインタやインターフェイスならnil、といった具合の値だ。構造体ならそれぞれのフィールドがゼロ値で初期化される。

メソッドはそのレシーバーの値のゼロ値に対して問題なく動くように書くほうがよい。構造体Tを割り当てて初期化する関数としてNewTみたいな関数を用意するのは、本当に初期化が必要なとき以外はやらないほうがよい。

なぜか、というといくつか理由がある。

1. NewTの代わりにnew(T)を使うようにすると、エクスポートされる関数が一つ減る。APIがそのぶん多少簡単になる。
1. var x Tや&T{}のような書き方でも値を割り当てられるようになる。
1. Tを別の構造体Uのフィールドとして使った時に、Tがゼロ値で動くなら、Uも単純にnew(U)などで割り当てられるようになる。NewTが必須だとしたら、Tではなく*Tをフィールドとして使わないといけなくなるし、NewTを内部で呼ぶNewUも用意しないといけなくなる。アロケーションが2回になってしまう。

Newを必要としない型の好例の一つはsync.Mutexで、そのゼロ値はロックされていないミューテックスとして正当な値ということになっているので、他の構造体のフィールドにするのが簡単になっている。

bytes.Bufferも初期化を必要としない。bytes.NewBufferという関数も用意されているけど、これはバッファの長さの初期値を与えたうえで初期化するというオプショナルな機能で、使うのは必須ではない。

## どうやって初期化を不要にするのか

大体の値はゼロ値がそれなりに適切なデフォルト値になっていると思う。その時には別になにもしなくてよい。

そうでない場合はメソッドの中で最初に値が初期化されているか調べて、初期化されていなければ初期化するというやり方がある。たとえばポインタがnilかどうか調べて、nilならポインタを初期化するというやり方である。

構造体のフィールドに代入するためのconstをいくつか定義しているなら、0がデフォルトになるように定数を定義するとよい。そうすると構造体がゼロ値で動くようになる。
Railsで表示中のページのパスを判定する方法


以下のように、`current_page?`メソッドを用いることによって、表示中のページのパスを判定できる。
これは`UrlHelper`として実装されているため、ビューの中から呼び出すことができる。

```ruby
# root_path かどうか
current_page?(root_path)

# /users/:id が current_user かどうか
current_page?(current_user)

# 任意のコントローラ/アクションかどうか
current_page?(controller: 'foo', action: 'bar')
```

## 参考

- http://apidock.com/rails/ActionView/Helpers/UrlHelper/current_page%3F
- http://stackoverflow.com/questions/1924620/how-to-detect-if-rails-is-at-the-root-url
Facebookのポストをしたときに、1349118 invalid parameterのエラーが出る


以下の3つで指定されているURLのみポストできる。
* Canvas URL
* Website URL
* App domainのサブドメイン

```
One or more of the given URLs is not allowed by the Stream post URL security app setting. It must match the Website URL or Canvas URL, or the domain must be a subdomain of one of the App's domains. Read more about Login Security to learn more about app settings related to security.
```

### 参考
* https://developers.facebook.com/docs/reference/ads-api/error-reference
コマンドプロンプトで該当フォルダ以下のファイル一覧を取得

`cd`コマンドで取得したいフォルダに移動後、以下のコマンドを実行すると、
フォルダ以下のファイル一覧を取得できる。

```
dir /b /a-d /s
```

`dir` でファイル・フォルダー名の一覧を取得
`/b` オプションでファイル・フォルダ名だけに絞り込み
`/a-d` オプションでフォルダを除外
`/s` オプションで下層フォルダも含めて取得

で、取得したファイル名一覧をテキスト保存する場合には、先ほどのコマンドの最後でリダイレクトコマンド（`>`）を使ってファイル出力にしてあげると、今いるフォルダに指定したファイル名で保存される。

```
dir /b /a-d /s > file_list.txt
```

今いるフォルダではなく、指定フォルダ以下で取得したい場合には、そのフォルダのパスを渡してあげると取得できる。

```
dir C:\Users\hoge\Desktop /b /a-d /s > file_list.txt
```

こうすると、「C:\Users\hoge\Desktop」にあるファイル一覧を今いるフォルダに保存できる。
cpanm OAuth::Lite::Consumerがinstallできない。



```build.log
Random.xs:5:26: error: openssl/rand.h: そのようなファイルやディレクトリはありません
```

と出ていた。

OAuth::Lite::Consumerが依存する。
Crypt::OpenSSL::Randomを入れようとすると、openssl/rand.hがないと言われているということ(だよね?)

だので…

```
yum install openssl-devel
```

してあげる。
Vagrantの保存パスを変える

## 概要
Vagrantで仮想マシンを作るまでの一連のファイルはデフォルトでCドライブに溜まる。
が、容量の少ないSSD＋HDDの構成のPCなどで考えなしにVMを増やすとディスクがすぐなくなる。
ので、ディレクトリを変更する為の小ネタ。


### デフォルトだと
Vagrantのファイルは C:/Users/fktan5/.vagrant.d/ のように置かれる。
追加したBoxイメージなどはここに保存されている。

VirtualBoxのファイルは C:/Users/fktan5/VirtualBox VMs/ に置かれる。マシンのファイル・ディスクファイルなどを保存している。

### 方法
Windowsで実施。

* VAGRANT_HOMEを環境変数として登録する。

* Virtualboxの環境設定から一般→デフォルトの仮想マシンフォルダーでディレクトリを変更する。

* 試しにVMをVagrantで作り、ファイルが指定したパスで作られているか見る。

* この際、想定のパスにファイルが保存されなかった場合、コントロールパネル→プログラムと機能→Vagrantから右メニューで修復を選ぶ。

GenymotionもVirtualBoxVMなので、設定を確認しておいたほうがいいかも
VPC 内の EC2 上で CoreOS を動かす


VPC は既に用意してあるとして書く。

## セキュリティグループの作成
CoreOS 用セキュリティグループを作る

![VPC_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/20833/04d04ca8-c854-1672-0118-98f92206becf.png "VPC_Management_Console.png")


etcd で利用するので 4001 と 7001 は同一グループからのアクセスを許可しておく

![VPC_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/20833/76120d6d-a416-3fc2-da14-9a867fad8da8.png "VPC_Management_Console.png")

## インスタンスの起動
[ここから](https://coreos.com/docs/running-coreos/cloud-providers/ec2/) Channel を選択すると、AWS Management Console が開く

![Amazon_EC2.png](https://qiita-image-store.s3.amazonaws.com/0/20833/2d455589-14d9-336b-c2f5-21add5588702.png "Amazon_EC2.png")


### cloud-config 

Step 3: Configure Instace Details のところで、Advanced Details にて cloud config の設定をする

![EC2_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/20833/56e9791d-7ca7-d13c-ae89-f695650eb80d.png "EC2_Management_Console.png")


`curl -s https://discovery.etcd.io/new` して  etcd の token を取得する

```yaml
#cloud-config

coreos:
  etcd:
    # generate a new token for each unique cluster from https://discovery.etcd.io/new
    discovery: https://discovery.etcd.io/<token>
    # multi-region and multi-cloud deployments need to use $public_ipv4
    addr: $private_ipv4:4001
    peer-addr: $private_ipv4:7001
  units:
    - name: etcd.service
      command: start
    - name: fleet.service
      command: start
```

docker の image がストレージ使うので多めにしておくと良い

```bash
ssh -i <key> core@XXX.XXX.XXX.XXX
```

## REF

* [Running CoreOS on EC2](https://coreos.com/docs/running-coreos/cloud-providers/ec2/)
boot2dockerでvagrant share使ってみた

参考: 

* [Create a version of boot2docker that works as Vagrant "base box" · Issue #29 · boot2docker/boot2docker](https://github.com/boot2docker/boot2docker/issues/29)
* [boot2dockerのデータ永続化まとめ - Qiita](http://qiita.com/tukiyo3/items/07f1eb77b5ffd9031e30)

![スクリーンショット 2014-09-03 9.44.49.png](https://qiita-image-store.s3.amazonaws.com/0/25728/c179a7bf-523b-f8f9-0d6e-7c52f1c3ca3a.png)

# 準備

* Vagrant, Virtualboxをインストールしておく。
* Virtualbox guest additionsが含まれているVagrant Cloudイメージを使う。

```bash:
git clone https://github.com/dduportal/boot2docker-vagrant-box.git
cd boot2docker-vagrant-box
```

gitをインストールしていない場合は[zip](https://github.com/dduportal/boot2docker-vagrant-box/archive/master.zip)をダウンロード

```diff:Vagrantfile
+ config.vm.synced_folder ENV['HOME'], "/vagrant_data"
+ config.vm.network :forwarded_port, guest: 80, host: 8080
```

```bash:boot2dockerに接続し適当なhttpdを用意
vagrant up
vagrant ssh
docker run \
  --name=wordpress4 \
  -it -d \
  -p 80:80 \
  -v /vagrant_data:/root \
  tukiyo3/ubuntu-debootstrap-ja:14.04-wordpress4 \
  /bin/bash
```

* /vagrant_data/ を /root/にマウントする場合の例。

# vagrant share用設定

* [vagrant cloud](https://vagrantcloud.com)へユーザ登録を済ませておく。

```text:vagrant&nbsp;login
$ vagrant login
In a moment we'll ask for your username and password to Vagrant Cloud.
After authenticating, we will store an access token locally. Your
login details will be transmitted over a secure connection, and are
never stored on disk locally.

If you don't have a Vagrant Cloud account, sign up at vagrantcloud.com

Username or Email: tukiyo3
Password (will be hidden):
You're now logged in!
```

```text:vagrant&nbsp;share
$ vagrant share --http=8080
==> default: Detecting network information for machine...
    default: Local machine address: 127.0.0.1
    default:
    default: Note: With the local address (127.0.0.1), Vagrant Share can only
    default: share any ports you have forwarded. Assign an IP or address to your
    default: machine to expose all TCP ports. Consult the documentation
    default: for your provider ('virtualbox') for more information.
    default:
    default: Local HTTP port: 8080
    default: Local HTTPS port: disabled
    default: Port: 2201
    default: Port: 2200
    default: Port: 8080
==> default: Checking authentication and authorization...
==> default: Creating Vagrant Share session...
    default: Share will be at: fantastic-crow-4926
==> default: Your Vagrant Share is running! Name: fantastic-crow-4926
==> default: URL: http://fantastic-crow-4926.vagrantshare.com
==> default:
==> default: You're sharing your Vagrant machine in "restricted" mode. This
==> default: means that only the ports listed above will be accessible by
==> default: other users (either via the web URL or using `vagrant connect`).
```

* http://fantastic-crow-4926.vagrantshare.com に接続してもらうと画面が見れる。

(このURLはvagrant shareを実行するたびに変更される。)