OmniAICreator/Qiita-1.07M huggingface dataset:
CakePHPでCollection使ってますか？

# CakePHPでCollection使ってますか？


`CollectionはCakePHP公式`のGinqのような配列操作の為のライブラリです。  
CakePHP3にはデフォルトで組み込まれているのですが、CakePHP3に依存しない形で実装されていますので、`CakePHP2にも導入が可能` です。  

詳細は以下のマニュアルやリポジトリを見てください。  

http://book.cakephp.org/3.0/en/core-libraries/collections.html  
https://github.com/cakephp/collection  


## とりあえずインストールしたい！

```
"require" : {
    "cakephp/collection": "~3.0"
}
```


## とりあえず動かしたい！
他にも機能はたくさんあります。  
便利ー

```
$items = ['a' => 1, 'b' => 2, 'c' => 3];
$collection = new Collection($items);

// 値が1より大きいものを取り出す
$overOne = $collection->filter(function ($value, $key, $iterator) {
    return $value > 1;
});
```
iOS向けアプリのSplashImage設定(20150916)

iOS向けアプリのSplashImage設定(20150916)

|                                 | height | width |
|---------------------------------|-------:|------:|
| iPhone Portrait iOS7,8 2x       | 960    | 640   |
| iPhone Portrait iOS7,8 Retina4  | 1136   | 640   |
| iPad Portrait iOS7,8 1x         | 1024   | 768   |
| iPad Portrait iOS7,8 2x         | 2048   | 1536  |
| iPad Landscape iOS7,8 1x        | 768    | 1024  |
| iPad Landscape iOS7,8 2x        | 1536   | 2048  |
| iPhone Portrait iOS5,6 1x       | 480    | 320   |
| iPhone Portrait iOS5,6 2x       | 960    | 640   |
| iPhone Portrait iOS5,6 Retina4  | 1136   | 640   |
| iPad Portrait Without Status Bar iOS5,6 1x  | 1004   | 768   |
| iPad Portrait Without Status Bar iOS5,6 2x  | 2008   | 1536  |
| iPad Landscape Without Status Bar iOS5,6 1x  | 748   | 1024  |
| iPad Landscape Without Status Bar iOS5,6 2x  | 1496   | 2048  |
複数ファイルから文字列で一括◯◯する方法

- ありますよね。僕の場合はassessmentをassesmentとしたまま巨大なブランチを作って、マージしてリリース！の直前の夜に気づいた事案が悪夢のように思い出されます。

## 複数ファイルから文字列を一括検索

 ```bash
 find ./path/to/file -type f -print | xargs grep 'hoge'
 ```

- これを行うとhogeを./path/to/fileから検索して、 ターミナル上に表示してくれます。
- しかし正直ag検索があれば、そっちのが早いし、不要かもしれない

## 複数ファイルから文字列を一括置換

 ```bash
find ./path/to/file -type f | xargs sed -i "s/hoge/hage/g"
 ```
- これを行うとhogeを./path/to/fileから検索して全てhageに置換してくれます（不可逆、破壊的）。くれぐれもpathを安易に指定しないように。app/*.rb とかで指定すればいいが、 .(カレントディレクトリすべて) とかで指定すると意図しない変更が適用されてしまう。僕は以前これでgitが破壊されてどうしようもなくなりました。
- sed というのがLinuxの置換コマンドで"s/hoge/hage/g"の部分がvimの置換っぽいな〜（初級者並みの感想）

随時追加していきたいと思います。
ResultSet からの値取得を Scala っぽく書くには

`Iterator` で `ResultSet` を回して Tuple にするなり case class にするなりが一番素直なのかなぁと。

```scala
val rs:java.sql.ResultSet = ???
Iterator.continually{ rs }.takeWhile{ _.next() }.map{ rs =>
  (rs.getInt(1), rs.getString(2), ...)
}
```
Parseでハマったこと

Parseのクイックスタートで僕がハマったことを共有したいと思います。

ちなみにxcodeのバージョンは6.4、Parseの導入にはcocoapodsを使用しています。

# Parseがインポートできない
parseのSDKを導入した後、クイックスタートの画面の指示通りにViewController.swiftに

```lang:swift
import Parse
```
を書き加えて、インポートしようとしたところ
No such module 'Parse'
と言うエラーが出てしまいました。

# 解決方法
いろいろ試行錯誤してもエラーが消えなかったので、terateilで質問してみたところ
**Podfileに'use_frameworks!'を記述して、Swiftのライブラリとして使用すればいいよ。**
という回答が

早速Podfileに'use_frameworks!'を記述して、
ターミナルで

```$ pod update```

を実行してみるとエラーが消えました。



参考URL：https://teratail.com/questions/16269

# 'PFObject' does not have a member named 'subscript'

やっとParseがインポートできたので次の指示通りに

```lang:swift
let testObject = PFObject(className: "TestObject")
testObject["foo"] = "bar"
testObject.saveInBackgroundWithBlock { (success: Bool, error: NSError?) -> Void in
  println("Object has been saved.")
}
```
をViewController.swiftに記述して実行してみると

```testObject["foo"] = "bar"```

の部分で'PFObject' does not have a member named 'subscript'というエラーが出てきました。

# 解決方法
調べてみたところstack overflowに
PFObject.hファイルの

```- (PF_NULLABLE_S id)objectForKeyedSubscript:(NSString *)key;```

を

```-(id) objectForKeyedSubscript:(NSString *)key;```

に書き換えたらいいよ

と書いてあったので、その通りに書き換えて実行してみるとエラーが出ることなく、実行できました。




参考UPL：http://stackoverflow.com/questions/28953306/pfobject-does-not-have-a-member-named-subscript?rq=1
[AndroidStudioとGitHubの連携]クローンの作り方

##GitHub側
クローンを作りたいrepositryのページの右側にある
HTTPS clone URL
をコピー
![cap1.PNG](https://qiita-image-store.s3.amazonaws.com/0/83382/9b921a1c-545f-8600-dbaa-74e158483ea0.png)


##AndroidStudio側
プロジェクトを開いていたらcloseProjectで最初の画面を出す
![cap2.PNG](https://qiita-image-store.s3.amazonaws.com/0/83382/d05b10e1-fd2c-c9f7-4de3-8da86ca0251a.png)

Checkout Project from VersionControl
->Git
->URLを貼り付け

##注意
- SDKがないと言われたら、SDK ManagerでAPIとSDKをインストールする
- その他環境の違いで上手くいかない場合もある、その場合は2つのBuildGradleを修正すると上手くいくかも

##感想
初めて画像入りの記事を書いてみました。
記事を書くのは少し慣れてきましたが、そっけない感じが出てるかもしれません。
そんな状況を改善していければと思います。
ログ(単位時間当たり)簡易集計スクリプト

postfix のログ等において
単位時間当たりの特定のメッセージを集計するスクリプト例

　"status=sent" 　postfix が送信/転送したメール数/秒を集計した例


----------------------------------------------------------------------


```bash:count.sh
#!/bin/bash
count=0
before=""
keyword="status=sent"

tail -f /var/log/maillog | grep --line-buffered "$keyword"|
while read line;do
  now=$(echo $line|cut -f2 -d' ')
  if [ "$before" = "$now" ];then
    count=$[count+1]
    echo -ne "$now $count\r"
  else
    if [ "$before" ] ;then
      echo -ne "$before $count\n"
    fi
    echo -ne "$now 1\r"
    count=1
    before=$now
  fi
done
```

----------------------------------------------------------------------
以下のように　件数/秒　での集計できる。

[user@hogehoge ~]$ sh ./count.sh
16:40:37 1
16:40:37 1
16:41:19 1
16:41:20 2
16:41:21 2
16:41:22 2
16:41:23 2
16:41:24 1
16:41:25 2
16:41:26 2
16:41:27 2
16:41:28 1
16:41:29 2
Dynamoでテーブルをtruncateする

DynamoはUIからはテーブルのデータを全て削除することが出来ません。
そのためCLIを使ってAPI経由で全削除する必要があります。

今回はこちらのシェルを参考にすることにしました。
https://gist.github.com/k3karthic/4bc929885eef40dbe010

CLIのインストール手順はこちら
http://qiita.com/tcsh/items/1f999b36382a81462347

CLIの認証設定方法はこちら
http://www.task-notes.com/entry/20141026/1414322858

デフォルトは東京リージョンになるので、開発用は別リージョンを利用している場合は注意してください。
【質問です】jQueryで処理を指定の順序で行う

試行錯誤の結果、思うような効果を実装出来そうですので
後ほど記録としてまとめたいと思います。


---------------------------
HTMLとCSSでレイアウトされた文字（各文字はabsoluteで絶対配置）に
以下のような処理を順番にさせたいと考えています。

処理① 任意の秒数後に非表示
↓
処理② 配置と文字サイズを変えて表示→任意の秒数後に非表示
↓
処理③ 配置と文字サイズを変えて表示→任意の秒数後に非表示
　:
　:

処理①→②や、処理①→③など、処理が二つだけの場合は
処理①が終わってから次の処理が実行されるのですが、
処理①→②→③とすると、真ん中の②が飛ばされ、処理①→③となります.....

console log();で確認すると、
処理①の後に②③が同時に開始してしまっています。

上記の後は処理④⑤と続く予定で、その間ごとに処理③を呼び出したいため
管理のし易さからコールバックで入れ子にしていくのではなく
各処理を関数として順番に呼び出すような方法を探していて
.defferdや.whenに辿り着きました。

簡単なjQueryしか書いたことがなく、知識不足でお恥ずかしいですが、
私の望む処理を行う場合にこれらは適切ではないでしょうか。
ご指摘やアドバイス頂けましたら幸いです。

defferdの使い方はこちらのサイトを参考にさせていただきました。
【jQuery.Deferredでわかりやすく順番にアニメーションする方法】
　http://goo.gl/lS2WUw




```html:HTML
<ul class="today_word">
 <li class="word_1">あ</li>
 <li class="word_2">い</li>
    :
    :
</ul>
```


```js:jQuery
kanaShort()
 .then(word_1)
 .then(kanaLong);

 // 処理① 文字を非表示
 function kanaShort() {
   var d = new $.Deferred;
   $('.today_word').delay(500).fadeOut(700);
   d.resolve();
   return d.promise();
 }

 //  処理② 1文字目を大きく他を小さく
 function word_1() {
   var d = new $.Deferred;
   $.when(
      $('.word_1').css({
         top: '245px',
         left: '135px',
         fontSize: '8em'
     }),
      $('.word_2').css({
         top: '348px',
         left: '320px',
         fontSize: '3em'
      }),
      $('.today_word').delay(500).fadeIn(200)
    ).done(function() {
      $('.today_word').delay(1500).fadeOut(300);
      d.resolve();
   });
   return d.promise();
 }

 // 処理③ 文字の大きさを戻し並べる
 function kanaLong() {
   var d = new $.Deferred;
   $.when(
      $('.word_1').css({
         top: '155px',
         left: '105px',
         fontSize: '5em'
      }),
      $('.word_2').css({
         top: '155px',
         left: '190px',
         fontSize: '5em'
      }),
      $('.today_word').delay(500).fadeIn(200)
   ).done(function() {
      $('.today_word').delay(2000).fadeOut(300);
      d.resolve();
   });
   return d.promise();
 }
```
VBおじさんあるあるにほげほげするメモ

#はじめに
いまどきのクラスに値を持たせる実装で、
VB6おじさんが組んだレガシーなコードあるある

#なにこれ
Qiitaへの初投稿テスト的な記事

#どんなの
要件
　・HTTPのGETリクエストパラメータをhogeRequestに持たせる。
　・hogeRequestをクエリパラメータに変換する

hogeRequestの定義はこんな感じ

```vb.net:hogeRequest
    Public Class hogeRequest
        Private value1Field As String
        Private value2Field As String

        Public Sub New()
            Me.value1Field = Nothing
        End Sub

        Public Property value1() As String
            Get
                Return Me.value1Field
            End Get
            Set(value As String)
                Me.value1Field = value
            End Set
        End Property

        Public Property value2() As String
            Get
                Return Me.value2Field
            End Get
            Set(value As String)
                Me.value2Field = value
            End Set
        End Property
    End Class
```
ここまでは割とふつう

が、肝心のクエリパラメータ作成ロジックがこんなんなってたりする

```vb.net:foo
    Private Sub foo()
        Dim x As New hogeRequest
        x.value1 = "hogehoge"
        x.value2 = Nothing

        Dim s As String = ""

        s &= "value1=" & x.value1

        If Not IsNothing(x.value2) Then
            s &= "&value2=" & x.value2
        End If

        Debug.Print(s)
    End Sub
```
これだと、プロパティが増える度にメンテしないとダメだし、なんというか、うん。
（職業プログラマおじさんは動けば問題ない。メンテする奴なんか知らんと言う）


#なので
それリフレクション使ったらすっきりするよ！

まずこんな感じのコードを書きます。

```vb.net:convertUtil
Imports System.Reflection
    Public Class convertUtil
        ''' <summary>
        ''' 任意の型のプロパティをHTTP GETパラメータに変換
        ''' </summary>
        ''' <typeparam name="T"></typeparam>
        ''' <param name="model"></param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Private Function toQueryString(Of T)(model As T) As String
            Dim reqParm As String = ""

            Try
                Dim typ As Type = model.GetType
                Dim members() As MemberInfo = typ.GetMembers(BindingFlags.Public Or
                                                            BindingFlags.Instance Or
                                                            BindingFlags.DeclaredOnly)
                'リクエストパラメータ作成
                For Each m As MemberInfo In members
                    If m.MemberType <> MemberTypes.Property Then Continue For

                    Dim pr As PropertyInfo = typ.GetProperty(m.Name)
                    Dim ores As Object = pr.GetValue(model, Nothing)

                    If IsNothing(ores) Then Continue For

                    reqParm &= IIf(reqParm.Length = 0, "", "&")
                    reqParm &= m.Name & "=" & ores.ToString
                Next m
            Catch ex As Exception
                Throw ex
            End Try
            Return reqParm
        End Function
    End Class
```
※パラメータ多いときはStringBuilder使ったほうがたぶんしあわせになれる

で、呼び出しはこんな感じ。シンプル。

```VB.net:bar
    Private Sub bar()
        Dim x As New hogeRequest
        x.value1 = "hogehoge"
        x.value2 = Nothing

        Dim s As String = convertUtil.toQueryString(x)
        Debug.Print(s)
    End Sub
```

これだとクエリパラメータ作成ロジックをいちいち修正しなくていいから楽だよねって話でした。

#最後に
この物語はフィクションです。たぶん。

おわれ。
[memo] git の vi 関連 error

`git commit -v` で `not an editor command` という error が出る。
http://d.hatena.ne.jp/penkoba/20130907/1378568338　
を参考に、 error を出す文を
```
if 1
```
と
```
endif
```
で挟んだら解決できた。

しかし自分の system では vi は vim の alias だ。
```
which vi
```
は
```
vi=vim
```
を返す。どうやって git が vi を呼んでいるのか謎。
Ubuntu14.04 + GUI を vagrantを使って弄りたい


# 事始め
友人がUbuntuを使って、色々したいと言っていたのでお手伝い。ついでに壊しても大丈夫なように、vagrantを使ってみようと言うわけで。メモですが。

# 構築環境
 - ホストOS : OSX yosemite 10.10.5
 - ゲストOS : Ubuntu 14.04 (Boxを使用)
 - virtual box : ver.5.0.4
 - vagrant : ver.1.7.4

# 構築したいもの
 - Ubuntu14.04
 - GUI (ubuntu desktop)

# 手順
※今回はプロキシ環境下でやっているので、色々と面倒。ですが、その辺りも対応していこうかと。
全てはTerminalで行います。

## 下準備
最初に、[Virtual Box](https://www.virtualbox.org) と [vagrant](https://www.vagrantup.com) をダウンロードする。それぞれ公式ページからダウンロード可能 & インストールもGUIでできるので省略。

### プロキシ対応
プロキシに対応するために、次のコマンドを入力する。
この後に行う `box install` で必要

```bash
$ export http_proxy="http://your.proxy:port_num"
$ export https_proxy="https://your.proxy:port_num"
```

## vagrant を使っていく
次のコマンドを打ち込む。ちなみに、Vagrant box に関しては、[vagrantbox.es](http://www.vagrantbox.es)にたくさんの物があるので、他のOSが使いたければ、好きなモノを選んで大丈夫です。
今回はUbuntuなので、Ubuntuを選択しました。

```bash
$ vagrant box add ubuntu https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-i386-vagrant-disk1.box
```

これで、Ubuntu14.04のvagrant boxが入手出来ました。

次は、vagrantの初期化をします。

```bash
$ cd お好きなディレクトリ
$ vagrant init ubuntu
```

後は、立ち上げれば、環境的にはセット完了です。

```bash
$ vagrant up
```

## チューニング
### プロキシ対策
このままだと、プロキシが邪魔して外部ネットワークに接続できない可能性があるので、対応します。
vagrantのプラグインを入れると色々と便利。

```bash
$ vagrant plugin install vagrant-proxyconf
```
※もしかしたら、このインストールはproxy環境外でやる必要がある。

インストール後、`vagrant init`をしたディレクトリにある、`Vagrantfile`に、
次のものを追記する。

```Vagrantfile
Vagrant.configure("2") do |config|
 # ↓yes proxy statement
  config.proxy.http     = "http://your.proxy:port_num"
  config.proxy.https    = "https://your.proxy:port_num"
end
```

追記後、`vagrant reload`すれば、プロキシが適応された状態になる。

### GUIの表示。
一番のメイン。
`Vagrantfile`に記述されている、次の文章のコメントアウトを外すと、VirtualBoxの窓が出てくる。

```Vagrantfile
  config.vm.provider "virtualbox" do |vb|
    # Display the VirtualBox GUI when booting the machine
    vb.gui = true
  
    # Customize the amount of memory on the VM:
    vb.memory = "1024"
  end
```

これも、`vagrant reload`すれば、ウィンドウが出てくる。
ちなみに、ログインするには
- user : vagrant
- password : vagrant

で、ログインが可能

#### ubuntu desktopのインストール
最後に、ubuntuのデスクトップ環境をインストールする。便利になったもんです。

```bash
$ sudo apt-get install ubuntu-desktop
(インストール後)
$ startx
```

`$ sudo reboot`をすると、次回起動時にいつものデスクトップが出てきます。

これで完了。後はお好きな様に。

---
おまけ

gistに今回使用のVagrantfileを上げました。
`vagrant up` する前に、proxyの欄を自分のプロキシ環境に書きかえ (もしくは、設定を消すかし)て、ご活用ください。
おまけで、初回実行時に、ubuntu-desktopが入るようにしました。

https://gist.github.com/kayo-tozaki/04b2586c1ec274d378f9
google spread sheetで1日足す方法


Google Spread Sheetにおいて、2015-09-15に1日足して、2015-09-16を得たいと思います。

```TO_DATE```を使えばできるみたいです。

## TO_DATE()をつかって、1日足す

| A | B | C |
|:-----------:|:------------:|:------------:|
| 日付形式の文字列 | fomula | 結果 |
|2015-09-15|=TO_DATE()+1| 2015/09/16|


結果が```-```つなぎから、```/```つなぎになっているのは、結果はdate型になっているからです。

## TODAY()を使ってn日後を得る
| A | B | C |
|:-----------:|:------------:|:------------:|
| Today | fomula | 5日後 |
|2015/09/15|=TODAY()+5| 2015/09/20|
IE8以下でaddEventListenerが使えないので

禁jQueryで修行してたら標題の件で困りました
attachEvent()でいけました。

```
var $hoge = document.getElementById('hogeId');

if($hoge.addEventListener){
  $hoge.addEventListener('click', aaa, false);
}
else if($hoge.attachEvent){
  $hoge.attachEvent('onclick', aaa);
}
```


http://uhyohyo.net/javascript/3_2.html
より抜粋

attachEventというメソッドが使われています。
これが、IEでイベントリスナを登録するメソッドです。
1つめの引数はイベントの種類で、2つめはイベントリスナです。
3つめの引数がありませんが、これはfalseを指定したのと同等です。

addEventListenerではイベント名に「on」を付けないのに、attachEventではつけていますね。


jQueryってすごいな
Atomで便利なところをメモ

## 標準でmarkdown preview
かなり嬉しい

## 動作速度
sublime text 2だと開きっぱなしにしておくと極端に重くなることがあった
(macbookairなのにvagrantで仮想環境動かしてるとか、セキュリティソフト入れらてるとかが主な原因)
でもatomサクサク。
ただし起動は遅い。
atom自体のファイルもでかい。

## 入れたplugin
+ file-icons
    + 左メニューのiconをいい感じに
+ sublime-style-column-selection
    + `cmd + option + ドラッグ`で矩形選択できるようにする
+ pigments
    + color codeのテキストの背景色を、そのcolor codeの色にする
    + cssとか色がわかるから便利
+ project-manager
    + 閉じたprojectとか開けるらしい
+ highlight-selected
    + ダブルクリックで選択した単語と同名のものに枠を出す
    + sublime text 2と同じにする
+ word-jumper
    + カーソル移動に、単語より細かい移動を追加
    + `asdfAsdf`だと大文字の`A`の前で一回止まる
    + sublime text 2と同じにする

## ショートカット
### sublime text 2と同じもの
+ `cmd + d`: 選択部分で文字列検索＆同時選択
+ `cmd + t`: ファイル検索
+ `cmd + w`: ファイル閉じる
+ `cmd + n`: 新しいファイル開く
+ `cmd + q`: アプリ自体を閉じる
+ `ctrl + tab`: 右のファイルへ移動
+ `ctrl + shift + tab`: 左のファイルへ移動
+ ~~`option + shift + →`: 単語単位で移動+選択~~
+ ~~`option + shift + ←`: 単語単位で移動+選択~~
    + ~~`ctrl + shift + → or ←`でやりたいときは以下~~

**追記**
単語移動なので、sublime text 2とは違いました。。。
あれ、なんか違うってのに気づいたので修正します。
全く同じにするには、`word-jumper`というプラグインを入れてkeymapに以下を追加。

```
setting -> keybinding -> your keymap fileをクリック

'atom-text-editor':
  'ctrl-shift-left': 'word-jumper:select-left'
  'ctrl-shift-right': 'word-jumper:select-right'
```

### 使えるショートカット
+ `cmd + b`: 開いているファイルから検索
+ `cmd + ,`: settingを開く

## まとめ
sublime卒業します。
baserCMSの管理画面にログインできない＠vagrant環境


なんか3時間くらい悩んでしまったのでメモ

# 現象
* CentOS 6.6
* Apache 2
* PHP 5.5
* MySQL 5.6

上記環境のvagrant上で、[baserCMS公式のインストール方法](http://basercms.net/manuals/2/introductions/4.html "baserCMSのインストール")に従ってインストール
管理ログイン画面で正しいログイン情報を入力してsubmitしても、ログイン画面にリダイレクトされてしまう


# 調査
baserCMS内のCakePHPのログを見ると何か吐いてる

```text:DOCUMENT_ROOT/app/tmp/logs/error.log
2015-XX-XX XX:XX:XX Warning: Warning (2): Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/var/www/htdocs/app/tmp/sessions) in [Unknown, line ??]
```

セッションが書き込めてないようです


# 原因と対応
## 原因
モジュールをvagrantのsynced_folderで共有させており
所有者はデフォルト設定してたので[vagrant]ユーザでした
なので、apacheからセッション書き込めなかったみたい

## 対応
Vagrantファイルのsynced_folderで所有者、パーミッションを明示的に[apache]ユーザに指定して解決しました

```text:Vagrant
synced_folder "htdocs", "/var/www/htdocs", :owner => "apache", :group => "apache", mount_options: ['dmode=775','fmode=775']
```

# 参考サイト
* [vagrant共有フォルダのパーミッションでハマった話](http://blog.buddying.jp/tips/2015-06-03/184/ "Buddying Blog")
* [#baserCMS で管理者ページにログインできないときの対応メモ](http://www.5cho-me.com/archives/173786 "５丁目通信（仮称）")
reduxを試してみた(4日目) - redux-react-routerを試す


React.jsと組み合わせるfluxのライブラリreduxを試してみた。 **このページは作業ログです。やったことをつらつら書くだけなのでまとめません。あしからず。**

## 対象読者

- 主に自分

## 今日のゴール

- [redux-react-router](https://github.com/acdlite/redux-react-router)を使ってページ切り替えを実現する

## redux-react-routerとは？

Reactのラウター(ルーターではない)ライブラリとしてよく[react-router](https://github.com/rackt/react-router)が使われる。react-routerの機能は十分だが、現在表示しているページという"状態"がアプリケーションに登場する。これもできればstoreに押し込めたい。ということで登場したライブラリ。react-routerをベースにしたライブラリなので、まずreact-routerから見ていく。

## react-routerの特徴

ドキュメントの構造とURLの構造をマッピングするライブラリ。最初ドキュメントを読んだ時理解できなかったけどこんなことらしい。端的に言えば、画面上のコンポーネントをURLによって切り替えたい部分毎に`<Route>`を用意し、対応するcomponentを下記のように定義しておくと、URLがマッチする時にコンポーネントを切り替えてくれる。Routeの定義は下記のようになるだろう。

```jsx
<Route path="/" component="App">
  <IndexRoute component="Home">
  <Route path="home" component="Home"/>
  <Route path="profile" component="Profile"/>
</Route>
```

`<IndexRoute>`とは、親のコンポーネントに指定したURLにアクセスしたらレンダリングしたいデフォルトのコンポーネントを指定するためのタグである。上記の例では`/`にアクセスすると`App`と`Home`がレンダリングされる。それぞれのコンポーネントが下記のように定義されていたとしよう。

```App.js
import {Component} from 'react';
import {TopMenu} from '../components/TopMenu';

class App extends Component {
  render() {
    return (
      <div>
        <TopMenu />
        {this.props.children}
      </div>
    );
  }
}
```

```Home.js
import {Component} from 'react';

class Home extends Component {
  render() {
    return (
      <div>
        <H2>Home</H2>
        <section>ここはHomeだよ。</section>
        {this.props.children}
      </div>
    );
  }
}
```

```Profile.js
import {Component} from 'react';

class Profile extends Component {
  render() {
    return (
      <div>
        <H2>Profile</H2>
        <section>ここはProfileだよ。</section>
        {this.props.children}
      </div>
    );
  }
}
```


`/`もしくは`/home`にアクセスすると、Routeの指定により、下記の構造でレンダリングされる。

```jsx
<App>
  <Home />
</App>
```

`/profile`にアクセスしたとすると、下記のように切り替わる。

```jsx
<App>
  <Profile />
</App>
```

切り替えを行うリンクを作成するのは、`<Link>`である。下記のように利用する。

```js
import {Link} from 'react-router';

...
<Link to='/home'>Home</Link>
```

## 例題:現在開いているURLをページ上に出す

画面が遷移できるようになってきたので、試しにURLの変更をUI上に出してみる。下記のように、`@connect()`でstateの変更を拾えばOK。

```Root.js
 @connect(state => ({ routerState: state.router,
   currentLocation : state.router.location.pathname
 }))
 class Root extends Component {
   render() {
     const {currentLocation,children} = this.props;
     return (
       <div>
         <TopMenu/>
         <div className="page-header">
           <h1>{currentLocation}</h1>
         </div>
         {children}
         </div>
       </div>
     );
   }
 }
```

下記の3行がデータバインディング的な箇所。

```javascript
 @connect(state => ({ routerState: state.router,
   currentLocation : state.router.location.pathname
 }))
```

`redux-devtools`を入れておくと、現在のstateの構造がわかるから、それを見て必要そうな状態を拾い上げる。

## 参考URL

- [React初心者のためのreact-routerの使い方](http://beck23.hatenablog.com/entry/2015/02/20/054900) 注: react-routerのバージョンアップにより、`handler`ではなく`component`を指定するようになってきた模様
Dockerで独自レポジトリからgo getするお

Dockerでbuildしたときにプライベートレポジトリからgo getしたい。

やらなければならないことは3つあります。

* .gitconfigの変更
* 秘密鍵の配置
* .ssh/configの変更

これだけです。
## .gitconfigの変更
GithubのプライベートレポジトリやGithubEnterprise等との通信でhttpを使っていると`go get`した時に毎回パスワードを聞かれてしまい、Docker内では失敗してしまいます。
そこでsslの通信に変更します。

変更は.gitconfigで指定します。下記が例です。

``` shell:.gitconfig
[url "git@ghe.example.org:"]
  insteadOf = https://ghe.example.org/
```

これでssl通信でアクセスするよう変更されます。

## 秘密鍵の配置
パスワード無しでアクセスするためにsslの通信で使う秘密鍵を配置します。
具体的には`/root/.ssh`の中に`id_rsa`ファイルを配置し、700の権限を付与します。

秘密鍵の作り方は[github](https://help.github.com/articles/generating-ssh-keys/)などを見て下さい。

## .ssh/configの変更
sshで初めて接続する場合、未知のホストからの接続という警告が出てしまいます。
それを回避するためにオプションを設定します。

``` shell:.ssh/config
StrictHostKeyChecking no
```

これで警告がでなくなります。

## Dockerファイルにすると
これらをDockerファイルにすると

``` haskell:Dockerfile
FROM golang:1.5

RUN mkdir -p /root/.ssh
ADD id_rsa /root/.ssh/id_rsa
RUN chmod 700 /root/.ssh/id_rsa
RUN echo "Host ghe.example.org\n\tStrictHostKeyChecking no\n" >> /root/.ssh/config

RUN echo "[url \"git@ghe.example.org:\"]\n  insteadOf = https://ghe.example.org/" >> ~/.gitconfig

RUN go get ghe.example.org/oreno/library/...

```

もちろん`go get`だけでなくgoのライブラリの[gb](http://getgb.io/)でも使えました。
ActiveAdminでchartkickを使う



Charkickは、Rubyでグラフを書くライブラリ

WebSite:
http://chartkick.com/

Github:
https://github.com/ankane/chartkick

# インストール

```Gemfile
gem "chartkick"
```

```
$ bundle install
```

# 設定

config/initializers/active_admin.rb

googleの場合

```active_admin.rb
ActiveAdmin.setup do |config|
  config.register_javascript "http://www.google.com/jsapi"
  config.register_javascript "chartkick.js"
end
```

highchartsの場合

```active_admin.rb
ActiveAdmin.setup do |config|
  config.register_javascript "http://code.highcharts.com/highcharts.js"
  config.register_javascript "chartkick.js"
end
```

# プリコンパイル

```
$ ./bin/rake assets:precompile
```


# サンプル

```index.erb
pie_chart Model.group(:status).count
```
[memo]serverspecことはじめ

```test_recipe.rb
require 'spec_helper'

describe package('httpd') do
  it { should be_installed }
end

describe service('httpd') do
  it { should be_enabled }
  it { should be_running }
end

describe port(80) do
  it { should be_listening }
end

describe file('/var/www/html/phpinfo.php') do
  it { should be_file }
  it { should be_owned_by 'root' }
  it { should be_grouped_into 'www' }
end

describe file('/var/www/html/phpinfo.php') do
  it { should be_owned_by 'root' }
end

describe file('/var/www/html') do
  it { should be_grouped_into 'www' }
end

describe user('vagrant') do
  it { should exist }
end

%w(httpd tree git dstat php php-devel php-mbstring php-gd).each do |pkg|
  describe package(pkg) do
    it { should be_installed }
  end
end

describe command('date') do
  its(:stdout) { should match /JST/ }
end
```
Mac+Tmux+Powerlineでステータスラインが増え続けるのをどうにかする

## どうなるの

tmuxがステータスラインの情報を更新するたび、ステータスラインが増えていく。
https://github.com/erikw/tmux-powerline/issues/125

これは[tmux-powerline](https://github.com/erikw/tmux-powerline/)のissuesだけど、[powerline](https://github.com/powerline/powerline)でも同じっぽい。

## なにしたの

* シェルで`LAGN=ja_JP.UTF-8`とか設定する

しかし何も起こらなかった。

* iTerm2なら「Treat ambigous-width characters as double width」のチェックを外す
* ターミナルなら「Unicode East Asian Ambiguous character are wide」のチェックを外す

VimとかEmacsで☆とか※とか使うと悲惨。

## どうしたの
tmuxにパッチ当てる。
https://gist.github.com/waltarix/1399751

パッチの当て方はこちらの記事で詳しく解説されているのでお任せする。
http://qiita.com/macoshita/items/2ee3c15f362103d1e373

## なにがダメだったの
**Ambiguous characters**
とてもいい加減に言うと、時と場合によって全角だったり半角だったりする文字。らしい。
全角半角どっちでもいけちゃう曖昧な文字だからAmbiguous characters。
上記ターミナルの設定は、そういう文字列は全部「全角」として扱いますよっていうオプション。


# まとめ
日本語つらい。
node.jsでプロキシ設定を削除する

プロキシ環境下から使用しない環境に移った時にプロキシ設定が邪魔になりました。
軽くググッても情報出なかったので、軽い気持ちで空文字をセットしたらWARNが出るように……。

```
npm WARN invalid config proxy=""
npm WARN invalid config Must be a full url with 'http://'
npm WARN invalid config proxy=""
npm WARN invalid config Must be a full url with 'http://'
```

Stack Over Flowで漁って見たら下記が有効でした。
http://stackoverflow.com/questions/21228995/how-to-clear-https-proxy-setting-of-npm

```
npm config rm proxy
npm config rm https-proxy
```

なるほどなるほど。
<image src="">というタグでもブラウザは画像を表示してくれるらしい

凄いどうでもいい小ネタです。Facebookに上がっていた話題を検証してみました。

HTMLのリファレンスを見て回っても多分出会うことは無いであろう、`<image>`というタグが何故か実装されていたのだけど、画像は問題なく表示されているという物。

HTMLを触ったこと無い人はわからないと思うので一応説明すると、本来HTMLで画像を呼び出す際には下記のように記述します。

```html
<img src="ファイルURL">
```

まぁたしかに、imgはimageの略だから、あながち間違ってはいないとは思うんだけど、先程も言ったように参考書やリファレンスでも見ないので、検索しても見かけることはまず無い代物です。

知ってる人はきっとこんなの知ってるんだけど、僕は出会ったことがないので、本当かどうか疑わしい物である。

ということで・・・

# \<image src="">は本当に表示されるのか？

とは言え、実際表示されるのかは自分でやってみないとわからないので検証してみることに！

## 1. HTMLファイルを適当に作る

![スクリーンショット_2015_09_16_12_31.png](https://qiita-image-store.s3.amazonaws.com/0/52470/a3ff650f-e0a2-ca77-10dc-8d40a51ee498.png)

## 2. とりあえず\<image src="">を記述してみる

面倒なので、\<html>とか\<body>とかは書かず、とりあえずこれだけ。

![_Users_daichiono_Desktop_trial_html__temporary__—_Brackets.png](https://qiita-image-store.s3.amazonaws.com/0/52470/4ddcaa33-91fd-ce9d-60c1-706f56a5b5d1.png)

## 3. さてどうなる！？

本当に表示されるのか！？

![trial_html.png](https://qiita-image-store.s3.amazonaws.com/0/52470/7f4a7ed4-cf18-5e5f-b38b-758a89a183c8.png)

普通に表示されてるうううううううううううう！

## 4. インスペクタではどうなっているのか！？

どうやら`<img>`タグに変換してくれてるらしい！ブラウザ賢いな！

![trial_html 2.png](https://qiita-image-store.s3.amazonaws.com/0/52470/25c97d80-bf2d-08d5-b39b-716cd62ce7a1.png)

# 結果

```html:
<image src="">
```

とりあえずGoogle Chromeでは問題なく表示されました！（Firefox・safari・Operaなどでも問題なく表示されました。）

最近のブラウザなんだかよくわからないけど賢い！こんなことまで想定しているなんて！という結果になりました。

## 余談

```html:
<images src="">
```
じゃあ案外、他のオリジナルタグでもいけるのでは？と上記の記述などを試しましたが、`<image>`以外はさすがにダメでしたね。

~~とりあえず使えた事だし、これからは気が向いたら`<image>`タグを使ってみるのもいいかもしれませんね、僕が、もしレビュー中に発見したら多分怒ると思いますが。~~

## \<image>は使ってはいけないらしい！

情報提供があったので、追記です！`<image>`タグはどうやら実験的に用いられたタグのようです。下記の記事を見るに使ってはいけないということなので、気が向こうが向きまいが`<img>`タグで書きましょうね。

> This feature is non-standard and is not on a standards track. Do not use it on production sites facing the Web
[<image> - HTML | MDN](https://developer.mozilla.org/ja/docs/Web/HTML/Element/Image)
さぁAPKつくるか！keystore....( ﾟдﾟ)ﾊｯ?


# 目的
新規アプリをいくつ作っても、最初のAPKを生成する際につまってしまうあなたへ・・・。
朗報です。嘘です。

メモ書きを残すことにしました（他所でも誰かが書いてんじゃん(ﾟДﾟ)ｺﾞﾙｧ!!

# 実践

## ターミナル起動
僕はMacしか使っていないので、[iTerm](https://www.iterm2.com/)を起動しました。

## 魔力を行使し、赤魔法を使う
ターミナルで下記呪文の詠唱を行う
`$ keytool -genkey -v -keystore ./hoge.keystore -alias hoge -validity 10000`



## 魔力を行使すると、対象の悪魔との対話が始まる
* `キーストアのパスワードを入力してください：`
お好みのパスワードを入力しちゃいなよ

* `新規パスワードを再入力してください`
上記のパスワードと同じものを入力しちゃいなよ

* `姓名を入力してください。`
おなまえは？

* `組織単位名を入力してください。`
部署名とかでもいいよ、個人ならそれと分かる内容で

* `組織名を入力してください。`
会社名とかでもいいよ、個人ならそれと分かる内容で

* `都市名または地域名を入力してください。`
どこに住んでんだよ

* `都道府県名を入力してください。`
どこに住んでんだよ

* `この単位に該当する2文字の国コードを入力してください。`
どこに住んでんだよ

* `CN=hoge, OU=hoge, O=fuga, L=foo, ST=wara, C=hhhでよろしいですか。`
okだと思ったら `y` を入力する

* `<hoge>の鍵パスワードを入力してください（キーストアのパスワードと同じ場合はRETURNを押してください）:`
キーストアと同じものを使用する場合は、returnでok

## 魔法の効果...
`-keystore` で指定した場所に悪魔が降臨します
c++ builder XE4, 10.2 Tokyo > TGroupBox > コードでColorを設定しても変更されない > .dfmにColorの初期値が設定されていない

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/26)
```

Unit1.dfmなどで以下のような Color の設定がない時。

```
Color = clBtnFace
```

コードで以下のようにしてもGB_test(TGroupBox)のColorを変更できない。

```
GB_test.Color = clRed;
```

フォームデザインで一度デフォルトの色(clBtnFaceなど)を設定すればColor変更のコードが有効になるようだ。
grapeで「あるパラメータが特定の値の場合のみ、別のパラメータをチェックする」バリデーションを実行する方法


Railsと[grape](https://github.com/ruby-grape/grape)を使用してWebAPIを作成する。
grapeでは入力パラメータのバリデーションが事細かく用意されているが、なぜか「あるパラメータが __特定の値__ の場合のみ、別のパラメータをチェックする」機能がない。そんなにレアケースだろうか？

ちなみに、「あるパラメータが __存在する__ 場合のみ、別のパラメータをチェックする」機能はある。（`given`ブロック）

バージョンはRuby(2.2), Rails(4.2), grape(0.13.0)で確認した。

例として、次のようなAPIがあったとする。`dish`が`"nigiri"`の場合のみ`amount_of_wasabi`をチェックしたい。
与えられる正しい入力は`{ "dish": "nigiri", "amount_of_wasabi": "M" }`か`{ "dish": "chirashi" }`のような形を想定する。

考え方としては、特定の場合のみvalidatorを追加するのは面倒なので逆に特定の場合のみ外すようにする。

```ruby:my_api.rb
class MyAPI < Grape::API
  resource :sushi_menus do
    params do
      requires :dish, type: String, allow_blank: false, values: ["nigiri", "chirashi"]
      requires :amount_of_wasabi, type: String, allow_blank: false, values: ["w/o", "S", "M", "L"]
    end

    before_validation do
      # HACK: dishが"nigiri"以外の場合はamount_of_wasabiのvalidatorを外す
      @rejected_validators = []
      unless params[:dish] == "nigiri"
        @rejected_validators = route_setting(:saved_validations).select { |v| v.attrs.include?(:amount_of_wasabi) }
        route_setting(:saved_validations).reject! { |v| v.attrs.include?(:amount_of_wasabi) }
      end
    end
    
    after_validation do
      # HACK: 外したvalidatorを戻す
      route_setting(:saved_validations).concat(@rejected_validators)
    end		
    
    post do
      # ...省略
    end
  end
end
```

これでできることはできるが、あまりにも醜悪なのでAPI設計の方を変えてしまうという手もある。

### 別解としての設計変更
入力を`{ "dish": { "nigiri": { "amount_of_wasabi": "M" } } }`か`{ "dish": { "chirashi": true } }`のような形に変更する。

```ruby:my_api.rb
class MyAPI < Grape::API
  resource :sushi_menus do
    params do
	  requires :dish, type: Hash, allow_blank: false do
        optional :nigiri, type: Hash do 
          requires :amount_of_wasabi, type: String, allow_blank: false, values: ["w/o", "S", "M", "L"]
        end
        
        optional :chirashi, type: Boolean, values: [true]
        
        exactly_one_of :nigiri, :chirashi
      end
    end
    
    post do
      # ...省略
    end
  end
end
```
watchOS用CマクロとSwift API Availability

# はじめに
Xcode 7（iOS 9.0 / OS X 10.11 / watchOS 2.0, Apple LLVM version 7.0.0 / Apple Swift version 2.0 / clang-700.0.72 / swiftlang-700.0.59）から、追加されたwatchOS用CマクロとSwift API Availabilityを紹介する。

# watchOS用Cマクロ

## TARGET_OS_WATCH

`TargetConditionals.h`

```c
#define TARGET_OS_IPHONE 1 
#define TARGET_OS_IOS    0
#define TARGET_OS_WATCH  1
```

Apple Watchで実行するコードを生成するときに定義される（`TARGET_OS_IPHONE`も1）。
なお、iOSの場合は以下のように定義される。

```c
#define TARGET_OS_IPHONE 1 
#define TARGET_OS_IOS    1
#define TARGET_OS_WATCH  0
```

## \_\_WATCHOS_1_0, \_\_WATCHOS_2_0

`Availability.h`

```c
#define __WATCHOS_1_0    10000
#define __WATCHOS_2_0    20000
```

watchOSのバージョン番号を定義する。

## \_\_WATCHOS_UNAVAILABLE, \_\_WATCHOS_PROHIBITED

`Availability.h`

```c
#define __WATCHOS_UNAVAILABLE __OS_AVAILABILITY(watchos,unavailable)
#define __WATCHOS_PROHIBITED  __OS_AVAILABILITY(watchos,unavailable)
```

両者ともwatchOSで利用不可を定義する。

## \_\_WATCHOS_AVAILABLE

`Availability.h`

```c
#define __WATCHOS_AVAILABLE(_vers) __OS_AVAILABILITY(watchos,introduced=_vers)
```

指定したバージョンのwatchOSから利用であることを定義する。

## \_\_WATCHOS_DEPRECATED(_start, _dep, _msg)

`Availability.h`

```c
#define __WATCHOS_DEPRECATED(_start, _dep, _msg) __WATCHOS_AVAILABLE(_start) __OS_AVAILABILITY_MSG(watchos,deprecated=_dep,_msg)
```

`_start`で指定したバージョンのwatchOSから利用可能で、`_dep`で指定したバージョンのwatchOSから非推奨であることを定義する。`_msg`で代案を指示するメッセージを指定する。

## \_\_WATCH_OS_VERSION_MIN_REQUIRED, \_\_WATCH_OS_VERSION_MAX_ALLOWED

`AvailabilityInternal.h`

```c
#ifndef __WATCH_OS_VERSION_MIN_REQUIRED
    #ifdef __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__
        /* compiler sets __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ when -mwatchos-version-min is used */
        #define __WATCH_OS_VERSION_MIN_REQUIRED __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__
        #define __WATCH_OS_VERSION_MAX_ALLOWED 20000
        /* for compatibility with existing code.  New code should use platform specific checks */
        #define __IPHONE_OS_VERSION_MIN_REQUIRED 90000
    #endif
#endif
```

アプリケーションによってサポートされる最小／最大のwatchOSのバージョンを定義する。
`-mwatchos-version-min`を指定すると、コンパイラがその値を`__WATCH_OS_VERSION_MIN_REQUIRED`に設定する。

# Swift API Availability
`#available`のプラットフォーム名に`watchOS`を指定する。

```swift
if #available(watchOS 2.1, ..., *) {
    ...
```
Xcode6.4 環境移動で Processing Symbol Files 終わらないんです


##Xcode の環境移動で　Processing Symbol Filesが終わらなかった事

移動先環境
　Xcode 6.4
　Mac Book Pro

MacBookにMacからXcode環境をコピーしました。
過去に一度、経験した事があったので経験を活かす事に
・コピー先にXcodeインストール
・コピー先にAPPをコピーする
・(⭐️重要)Googleさんに聞く（この辺が経験です）
・iphone Development　と　iphone Distributionが必要とおっしゃる
・元MachineでXcode起動
・画面ステータス Xcode>Preferences...選択
・Accounts選択後ViewDetailsをポチっと

![a.jpg](https://qiita-image-store.s3.amazonaws.com/0/75082/e0e64435-1f26-c763-028a-3c97a9cbd7d5.jpeg)

・iphone Development　と　iphone Distributionがない
・Platform　iOSは、iOS Development　と　iOS Distributionしかないから
　名前が変わったんだと思って作成する事に
・iOS Development選択(　(2)ってなに？）して、歯車でExport...ポチ
 (revokeは、取り消しの意味らしい怖くてお試しできなかった)
![a.jpg](https://qiita-image-store.s3.amazonaws.com/0/75082/3fd2be18-7dce-e587-c76c-59b1ec5b9e6d.jpeg)



・名前とPassword(コピー先で使用する）とVerify(password確認)入力で作成
・同様にiOS Distributionも同様に作成
・コピー先でこれらをダブルクリックしてキーチェインに追加
・Xcode起動
・実機選択,再生マークポチっと

　・・・・・・・・・・・・・・・・・・・・・・・・・・
　Xcodeは、Processing Symbol Files中で、iphone我慢できずに寝る

とまぁ経緯はこんなんで、電源切ろうが、再起動しようが 私的最強Googleさんでもにきいても現象はかわらなかったんです。

翌朝、よーく考えると以前と違ったよなと思う部分に気付いたんです。
（記憶はあいまいなんですが）コピー元証明が以前２つしかなかったような。


![a.jpg](https://qiita-image-store.s3.amazonaws.com/0/75082/5923c1e3-63ed-1551-6621-a35e5c24b37b.jpeg)

怪しいのはこの２つで、PlatformはMacとおっしゃるけど、名前が怪しい 怪し過ぎるじゃないですか

Developer ID Application
Developer ID Installer
をExportしてキーチェインに追加したら
スパっと動きました。

私的経験値　二階級特進

追加）

iPodさんをios9.3にしたら、Xcodeが実機でダウンロードできなかった。
ios9.3は、Xcode を7.3にしないといけないらしい。
準備完了いざダウンロードしたら、同じ問題が、Xcode7.3 でも発生した。
今度は、証明関連でないようである。ios7やios6で問題ないのだ。
しかし、iMacのHDDが派手にうるさくコリコリいってるのでそのままでほっといた。
HDDが　しずかになってから再度実行するとOKであった。
Goのforとgoroutineでやりがちなミスとたった一つの冴えたgo vetと

分かっていたつもりなのにまたやってしまったので、自戒を込めて書いておきます。

forループ内でgoroutineを使う場合の注意点
========================================

for内でgoroutineを実行する際にやりがちなミスがあります。

以下のコードを見てください。

```go
package main

import (
	"fmt"
	"time"
)

func main() {
	values := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

	for _, val := range values {
		go func() {
			fmt.Println(val)
		}()
	}

	// goroutineが終了するまで待つ。
	// コード簡素化のためにsleepしているだけだが、
	// 本来はsync.WaitGroupとかchannel使うなど適切な処理をすべき。
	time.Sleep(1 * time.Second)
}
```

0から9までの値をループして、goroutine内で表示するだけです。
当然0から9まで表示される気がします。
問題なくコンパイルもされるので、実行してみましょう。

```
$ go run main.go
9
9
9
9
9
9
9
9
9
9
```

あれ？
なんと9しか表示ません！！！（表示内容は実行環境によって異なる場合があるかも）

なんでこうなるかというと、

```go
for _, val := range values {
	go func() {
		fmt.Println(val) // <-ここ！！
	}()
}
```

ここでgoroutineに渡している`val`という値は、ループされる度に作られる変数ではなく、
ループ全体で使われる変数だからです。
そしてgoroutineを開始しても直ちにスイッチされるわけではなく、

1. 先にループ処理が終了する
2. valの値は最後の値（ここでは9）になる
3. goroutineにスイッチされ実際に実行される
4. 各goroutineは最後の値になったvalを使って処理を行う。

というフローになるため、上記のような結果になるわけです。

ところで、先に実行環境によっては結果が変わるかもと書きましたが、
もしforループが完了する前まにgoroutineにスイッチされるような場合があれば、
その時点でのvalの値が表示されるはずだからです。
ただ現実にはそんな事はほとんど無さそうです。


対処方法
========================================

以下の2つ（と一つの亜種）が主な対処方法になるかと思います。

## ループ内で閉じた変数に束縛する

goroutine開始前に各ループ内で閉じた変数を宣言し、それに値をコピーして使います。

```go
func main() {
	values := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

	for _, val := range values {
		i := val // 別の変数にコピーする
		go func() {
			fmt.Println(i) // 実際の処理ではコピーされた変数を使う
		}()
	}

	time.Sleep(1 * time.Second)
}
```

もっともシンプルです。
ただ、値をコピーするだけの変数があるのがなんとなくカッコ悪い気がします（個人の感想です）。


## 無名関数で引数を宣言し、実行時に値を渡す

```go
func main() {
	values := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

	for _, val := range values {
		go func(i int) { // 引数を追加
			fmt.Println(i)
		}(val) // 関数実行時に現在の値を渡す
	}

	time.Sleep(1 * time.Second)
}
```

こうしておけばgoroutine内で使われる値を意図したものに束縛することができます。
引数宣言が面倒で見た目にゴチャついていますが、なんとなくカッコいい気がします（個人の感想です）。

## 実行関数を別に宣言する。

```go
func main() {
	values := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

	// 実行関数を別に用意
	f := func(i int) {
		fmt.Println(i)
	}

	for _, val := range values {
		go f(val) // 先に用意した関数を実行
	}

	time.Sleep(1 * time.Second)
}
```

やってる事は先と同じですが、見た目のゴチャつき感が緩和されている気がします。


対処後
========================================

いずれの対処方法でも、実行後は以下のような結果で意図通りの動作となります。

```
$ go run main.go
0
6
7
5
8
3
9
4
1
2
```

でも気づかないよ？
========================================

対処方法は分かりましたが、このミスの根本的に問題なところは、
コンパイルも通るし、実行時エラーにもならなかったりするところです。
そしてよく分からない実行結果に戸惑うわけです。
ただ気をつけるしかないのでしょうか？

そんな事はありません。Goらしく、toolingで解決可能です。


そして go vet
========================================

[go vet](https://golang.org/cmd/vet/)はgoに最初から入っているコマンドで、
怪しげなコードを探してきて"なんかこれエラーっぽいよ？"と指摘してくれるツールです。

とりあえず最初の問題があるコードで試してみましょう。

```
$ go vet main.go
main.go:13: range variable val captured by func literal
exit status 1
```

「range変数のvalが関数リテラル内で使われてるよ」みたいな感じでしょうか。
これで何か問題ありそうと気づくことができるので、先の「気づかない」という最大の問題に対処可能です。

ただ、毎度コマンドを実行するのも面倒なので、エディタで自動的にチェックするようにしておきましょう。
例えばEmacsならflycheckを使えば勝手にgo vetでのチェックも行ってくれます。

（自分は最近までflymakeを使っていたのでチェックされてなかった・・・）

こんな感じです。

![222ad348baa59941f7eb77861fd58cc1.png](https://qiita-image-store.s3.amazonaws.com/0/40255/8cedf0d9-280c-c928-7355-51cb134815a5.png)

以上です！
Vagrantで複数の仮想マシンを立ち上げる　マルチマシン(Malti-Machine)設定

一つのBOXから複数の仮想マシンを立ち上げる。

[前回の投稿](http://qiita.com/i-zum-i/items/cfe164ca983b1ff3f0a7)でAtomicHostのBaseBoxを作成したので、これを利用して3台の仮想マシンを起動します。

イメージとしては、Dockerでオーケストレーションを行う事を想定し、その準備という感じです。
（仮想マシンは3台立ち上げで、1台を[Kubernetes](http://kubernetes.io/)などでコンテナホストを管理、2台がコンテナホストと言う構成）


## 準備

[前回](http://qiita.com/i-zum-i/items/cfe164ca983b1ff3f0a7)の最後の方で書きましたが、AtomicHostのBaseBoxをVagrantに登録します。

```
# vagrant box add AtomicHost atomichost-base.box
# vagrant init AtomicHost
# vagrant up
```

`# vagrant init`
でVagrantfileが生成されます。


一番シンプルな状態です。

```lang:Vagrantfile（シングル）

Vagrant.configure(2) do |config|
  config.vm.box = "AtomicHost"
end
```

## マルチマシンのVagrantfile
このVagrantfileに対してマルチマシンの設定を記載していきます。
3台起動にすると下記のようになります。


```lang:Vagrantfile（マルチ）
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|
  config.vm.box = "atomic-original"

  # 1台目管理マシン（マシン名：master）
  config.vm.define "master" do |atomic|
     atomic.vm.hostname = "master.atomichost"
     atomic.vm.synced_folder ".", "/vagrant", disabled: true
     atomic.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2222
     atomic.vm.network "private_network", ip: "192.168.33.10", virtualbox__intnet: "intra"
  end
  # 2台目 コンテナホスト（マシン名：node01）
  config.vm.define "node01" do |atomic|
     atomic.vm.hostname = "node01.atomichost"
     atomic.vm.synced_folder ".", "/vagrant", disabled: true
     atomic.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2223
     atomic.vm.network "private_network", ip: "192.168.33.101", virtualbox__intnet: "intra"
  end
  # 3台目 コンテナホスト（マシン名：node02）
  config.vm.define "node02" do |atomic|
     atomic.vm.hostname = "node02.atomichost"
     atomic.vm.synced_folder ".", "/vagrant", disabled: true
     atomic.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2224
     atomic.vm.network "private_network", ip: "192.168.33.102", virtualbox__intnet: "intra"
  end
end
```

**※内部ネットワークの指定、複数起動時のSSHポートフォワーディングの指定がもれていたので修正しました。**

上記で３台の仮想マシンを設定し、仮想マシン間のLANを設定しています。

## 起動
上記のVagrantfileのあるディレクトリで、以下を実行

```
# vagrant up
```

これで３台の仮想マシンが起動し、それぞれが通信可能な状態となりました。

各マシンへsshでログインする場合はパラメータにマシン名を指定します。

```
# vagrant ssh master
```

また、個別に立ち上げたい場合も同じくマシン名を指定します。

```
# vagrant up master
```

複数の仮想マシンを立ち上げる場合、ホストマシンのリソース、各仮想マシンの用途によって、メモリー、CPUの設定を個別に変えたいと思うことが多々あるかと思います。
その場合は、下記のように。

```
  # 2台目 コンテナホスト（マシン名：node01）
  config.vm.define "node01" do |atomic|
     atomic.vm.hostname = "node01.atomichost"
     atomic.vm.network "private_network", ip: "192.168.33.101"
     atomic.vm.provider "virtualbox" do |v| 
        v.customize ["modifyvm", :id, "--memory", 512] 
        v.name = "node01" 
    end
  end

```

各マシン設定の中でproviderとしてネストして設定します。

****
さて、こんな感じでAtomicHostを複数立ち上げる事が出来ましたので、次は複数ホストによるDockerのオーケストレーションの準備が出来てきた感じです。

****
参考
https://docs.vagrantup.com/v2/vagrantfile/
postfixのmynetworksとsmtp-auth


### <概要>
/etc/postfix/main.cfのmynetworks  
にリレーを許可するネットワークの記載有無とsmtp-authの有無の動作を確認してみた。

### <結果>

|NO |mynetworksに<br>送信元IPの記載有無|認証(smtp-auth)<br>の有無|結果|
|:--:|:--:|:--:|:--|:--:|
|1   | 有り|-       |送信可能|
|2   | 有り|有り  |送信可能|
|3   | 有り|有り(誤ったpass)|送信NG|
|4   | -     |-       |送信NG|
|5   | -     |有り  |送信可能|

注目はNo3。たとえmynetworkで記載があっても認証が失敗だと、
送信できないようです。
逆にNo1のように認証をなくしてしまえば送信できる。

### <備考>
smtpd_recipient_restrictionsは以下のような設定です。
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
[memo]itamaeこと始め

## 用意したレシピはこちら
- test_recipe.rb
- package_recipe.rb
- service_recipe.rb
- command_recipce.rb


## test_recipe.rb
```test_recipe.rb
include_recipe "package_recipe.rb"
include_recipe "service_recipe.rb"
include_recipe "command_recipce.rb"
```

## package_recipe.rb
```package_recipe.rb
# ひとつひとつ指定する場合
# package 'httpd'

# 複数まとめて指定する場合
%w(httpd vim tree git dstat php php-devel php-mbstring php-gd).each do |pkg|
	package pkg
end
```

## service_recipe.rb
```service_recipe.rb
service 'httpd' do
  action [:enable, :start]
end
```

## command_recipce.rb
```command_recipce.rb
execute "yum update all package" do
  command "yum update -y"
  user "root"
end

execute "create group 'www'" do
  command "groupadd www"
  user "root"
end

execute "add group user 'vagrant' to 'wwww' " do
  command "usermod -a -G www vagrant"
  user "root"
end

execute "change ower 'vagrant' for /var/www" do
  command "chown -R root:www /var/www"
  user "root"
end

execute "change permision /var/www" do
  command "chmod 2775 /var/www"
  user "root"
end

execute "setting group permision" do
  command "find /var/www -type d -exec sudo chmod 2775 {} +"
  user "root"
end

execute "setting file permision" do
  command "find /var/www -type f -exec sudo chmod 0664 {} +"
end

execute "update timezone UTC->JST" do
  command "cp /usr/share/zoneinfo/Japan /etc/localtime"
  user "root"
end
```

## dry-run
```
itamae ssh --vagrant -h itamae-web test_recipe.rb -n
```

## 実行
```
itamae ssh --vagrant -h itamae-web test_recipe.rb
```
JSのパフォーマンスをお手軽に解析する方法

# TL;DR
Chromeで `console.profile()` と `console.profileEnd()` を使うと超簡単にJSの実行パフォーマンスを解析できる、という事実を今日知ったのでシェアさせていただきます。

# やりたいこと
JSの任意の関数の実行プロファイル (コールスタックごとの所要時間) を見たい。

# やりかた
Google Chromeのデバッグコンソールで以下のようなスクリプトを入力して実行 (見やすくするため改行入れてますが実際には一行で)

```js:console
console.profile();
xxxxx(); // 解析したい処理
console.profileEnd()
```

実行されると以下のようにログが出力されます。

```js:output
Profile 'Profile 1' started.
Profile 'Profile 1' finished.
```

んで、Profileタブを開くと、実行プロファイルが出力されいます。

![image](https://qiita-image-store.s3.amazonaws.com/0/30585/075e2c64-1b7b-3959-1d1d-cee87f72ae24.png)

コールスタックごとの処理時間が分かって超便利 ＼(^o^)／

# 参照
* [Google Chrome Console API Reference](https://developer.chrome.com/devtools/docs/console-api#consoleprofilelabel)

以上です。
Railsのvalidate周りのi18n対応でハマったこと


Model.errorsを view で表示する際にハマったので同じ気持の人が減ることを祈って
調べたことをまとめます。

## 今回やろうとしたこと。

Itemモデルの登録formでのvalid結果をviewに表示。
表示の際にエラーメッセージはi18nを用いて日本語化する。

ItemモデルはDraftという名前空間に定義している。

## ハマったこと
変換されない。（結論から言うと勘違いです。）

## 結論
```view
<% @item.errors.full_messages.each do |msg| %>
  <ul class="list">
    <li><%= msg %></i>
  </ul>
<% end %>
```

```ja.yml
ja:
  activerecord:
    attributes:
      draft/item:
        item_name: 商品名
```

上記のように設定し、Model.errors.full_messageを使用すると、
i18nで変換されたカラム名（attribute）が取得できる。

名前空間を指定する場合は
`draft/item:`のように、スラッシュ区切りで指定する。

## 調べられた事。
途中色々とつまずいた為、
足りない箇所については指摘していただけると幸いです。

### 勘違い
まず、Model.errors.full_messages ではなく、
Model.errors.messagesを使用していました。

messages には以下のようにハッシュが入っています。

`@messages={:item_name=>["を入力してください"]}`

このハッシュのkeyである、item_name が変換されないと困っていました。（アホ）

### どのように変換されるのか。
変換される箇所、メソッドは以下です。

[activemodeのtranslation.rb](https://github.com/rails/rails/blob/master/activemodel/lib/active_model/translation.rb)

```
def human_attribute_name(attribute, options = {})
 略
end
```

上記メソッドが、full_messagesメソッドから辿ると呼ばれています。

[activemodelのerrors.rb](https://github.com/rails/rails/blob/master/activemodel/lib/active_model/errors.rb)

```
def full_messages
      map { |attribute, message| full_message(attribute, message) }
end

def full_message(attribute, message)
      return message if attribute == :base
      attr_name = attribute.to_s.tr('.', '_').humanize
      attr_name = @base.class.human_attribute_name(attribute, default: attr_name)
      I18n.t(:"errors.format", {
        default:  "%{attribute} %{message}",
        attribute: attr_name,
        message:   message
      })
end
```

これにより、full_messagesメソッドによって返却されるエラーメッセージは、
i18nで変換した結果が取得されます。

## うまく思い通りに変換されない場合の対処法
yamlの記述の仕方がわからない等（今回でいうと名前空間に定義したモデルだとyamlの書き方が変わる）
場合に、どのように記述すればよいか調べる。

今回の場合では、`human_attribute_name`メソッドで、
i18nで取得しようとしているパスと優先順位がわかるため、デバッグすることで確認します。

`:"#{attributes_scope}.#{klass.model_name.i18n_key}/#{namespace}.#{attribute}"`

上記のように文字列連結で、i18nで取得するパスを作成しているので、
作成された結果をデバッグで見れば確認することが出来ます。

今回は以下のようになっていました。

```
[:"activerecord.attributes.draft/item.item_name", :"attributes.item_name", "Item name"]
```

優先順位が高い順番で格納されています。
このようにyamlで記述すればいいことがわかります。

他に変換がうまく行かないものも、
このように、パスを設定している箇所を特定しデバッグすることで確認できます。
その設定している箇所を特定するいい方法はわかりません・・・。
ご存知の方がいましたらアドバイスをお願い致します・・。
grapeの入力パラメータでActiveSupport::TimeWithZoneを使用する方法


Railsと[grape](https://github.com/ruby-grape/grape)を使用してWebAPIを作成する。
grapeでは入力パラメータのバリデーションと型変換（文字列からRubyのなんらかのクラスのインスタンス）のために`params`のブロックの中に`type`を指定することができる。しかし、標準的なものしかサポートされていない。

日付・時刻型は`Date`, `DateTime`, `Time`が指定できるが、Railsでは`ActiveSupport::TimeWithZone`を使用することが多いだろう。これを指定できるようにする。

バージョンはRuby(2.2), Rails(4.2), grape(0.13.0)で確認した。


例として、次のようなAPIがあったとする。`will_publish_at`を`TimeWithZone`として扱いたい。

```ruby:my_api.rb
class MyAPI < Grape::API
	resource :posts do
		params do
			requires :title, type: String, allow_blank: false
			requires :body, type: String, allow_blank: false
			optional :will_publish_at, type: ActiveSupport::TimeWithZone
		end
		
		post do
			declared_params = declared(params)
			# declared_params.will_publish_at が ActiveSupport::TimeWithZoneになっている
			# ...省略
		end
	end
end
```

そのままだとエラーになるが、次のようにするとよい。なお、`will_publish_at`はISO8601形式を想定している。

```ruby:lib/ext/active_support/time_with_zone.rb
module ActiveSupport
  class TimeWithZone
    def self.parse(value)
    	# ここでインスタンスを作成できればなんでもいい
       Time.iso8601(value).in_time_zone if value.present?
    end
  end
end

```

あとは、これを適切な場所でrequireする。

`ActiveSupport::TimeWithZone`にかかわらず、`self.parse`を実装すれば型変換ができる。
pythonでflattenを簡潔に書く裏技

# python2系なら `sum` でスマートに書ける!

微妙なやり方しかないなーと思っていたらスマートに書けることに気がついた。

python ではリスト同士の加算がサポートされていて、

```
[1,2,3] + [4,5,6] => [1,2,3,4,5,6]
```

sum関数が第二引数に初期値を指定できることを利用して、


```
data = [[1,2,3], [4,5,6], [7,8,9]]

sum(data, [])
```

こう書けるのである。

とはいえ、あくまでリストでなければダメでタプルやジェネレータはサポートされないのがちょっと融通効かないんだけど。

# 補足1

python3系では sum が型チェックしてるみたいでこの方法は使えない。無念。

# 補足2
これを利用すると、`__add__` を実装したインスタンスであればまとめて sum で処理できるということに・・・なるかと思って調べてみた。


```
>>> a = [1,2,3]
>>> data = [a, [4,5,6], [7,8,9]]
>>> sum(data,[])
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a
[1, 2, 3]
>>> empty = []
>>> sum(data,empty)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> empty
[]
>>>
```

内部ではあくまでも加算の結果で処理していることが予想される。

そこで、以下のように `__add__` を持ったクラスを渡してやると、

```
>>> class A:
...   def __add__(self, target):
...     self.target = target
...     return 100
...
>>> a = A()
>>> sum([5,10,15,20],a)
145
>>> a.target
5
```

・・・まあ、`__add__` を破壊的な実装にするなということなのは理解しているつもりである。
zipコマンドでディレクトリを圧縮する/passwordを設定する

最近よく使うようになりましたが、すぐ忘れるので

### ディレクトリを圧縮
```
> zip -r 圧縮後の名前.zip 圧縮したいディレクトリ名
```

### パスワードも設定する `-e`
```
> zip -e -r 圧縮後の名前.zip 圧縮したいディレクトリ名
```

　
　
　
　
・・・gitで納品できたら管理も楽なのに :(
attr_writer / _reader / _accessorメモ



# 特徴

* 全てモジュールクラス
* 全てprivateメソッド
* クラスやモジュールにインスタンス変数を読み書きするためのアクセサメソッド

# attr_writer

簡単に言うと、インスタンス変数の値を書き換える時に短いコードで書けるようになるメソッド。

## attr_writerなし

```ruby
class B
  def initialize(name)
    @name = name
  end
  
  # このメソッドに注目
  def name=(name)
  	@name = name
  end
end


b = B.new('リーダブルコード')
p b
# #<B:0x007f8a1c88f768 @title="リーダブルコード">

b.name = 'メタプログラミング'
p b 
# #<B:0x007f8a1c88f768 @title="メタプログラミング">
```

## attr_writerあり

```ruby
class B
  # 追加した。
  attr_writer :name
	
  def initialize(name)
    @name = name
  end
  
  # このメソッドに注目
  # def name=(name)
  #   @name = name
  # end
end



b = B.new('リーダブルコード')
p b
# #<B:0x007f8a1c88f768 @title="リーダブルコード">
b.name = 'メタプログラミング'
p b 
# #<B:0x007f8a1c88f768 @title="メタプログラミング">
```


もちろん、上のコードでattr_writerなしだと、

```
undefined method `name=' for #<B:0x007fe5a89339e8 @name="リーダブルコード"> (NoMethodError)
```

というエラーが出る。



# attr_reader

簡単に言うと、インスタンス変数の値を読み取る時に短いコードで書けるようになるメソッド。

## attr_readerなし

```ruby
class B
	
  def initialize(name)
    @name = name
  end
  
  # このメソッドに注目
  def name
  　 @name
  end
end



b = B.new('リーダブルコード')
p b.name
# 'リーダブルコード'
```

## attr_readerあり

```ruby
class B
  # 追加した。
  attr_reader :name
	
  def initialize(name)
    @name = name
  end
  
  # このメソッドに注目
  # def name
  #   @name
  # end
end



b = B.new('リーダブルコード')
p b.name
# 'リーダブルコード'
```


もちろん、上のコードでattr_readerなしだと、

```
undefined method `name' for #<B:0x007fe5a89339e8 @name="リーダブルコード"> (NoMethodError)
```

というエラーが出る。




# attr_accessor

attr_writer + attr_reader = attr_accessor


つまり、読み書き可能にする万能メソッド。　


## attr_accessorあり

```ruby
class B
  attr_accessor :name
	
  def initialize(name)
    @name = name
  end
  
  # このメソッドに注目
  # def name=(name)
  #   @name = name
  # end
  
  
  # def name
  #   @name
  # end
end




b = B.new('リーダブルコード')
p b.name
# "リーダブルコード"

b.name = 'メタプログラミング'
p b.name
# "メタプログラミング"
```

となる。