OmniAICreator/Qiita-1.07M huggingface dataset:
プリントデバッグの行にはセミコロンをつけない

最近やっていて地味に便利なやつ。CI で lint しているのが前提です。

てっとり早くデバッグしたいときに `console.log` を仕込むことは良くあるとおもいますが、そのときにわざと行末のセミコロンを書かないようにします。

```js
// こうじゃなくて
console.log(foo);

// こう書く
console.log(foo)
```

こうしておくとデバッグ行を削除し忘れても lint したときに怒られるので、すみやかに削除できます。

```sh
$ jshint
  ->  line 4  col 17  Missing semicolon.
```
vagrantコマンドまとめ


色んなところに情報散らばるので、vagrantの基本コマンドをまとめてみた。

## 基本コマンド(起動停止等)

#### 起動前の準備
vagrantはVagrantfileを読み込んで起動するので、boxイメージを指定してinitすることでVagrantファイルを事前に作る

```
$ cd [vagrantのホームディレクトリにしたいディレクトリ]
$ vagrant init [box名]
$ ls
Vagrantfile
```


#### 起動

※ --provisonでプロビジョニングも実施

```
$ vagrant up
```

#### 停止
```
$ vagrant halt
```
#### 削除
```
$ vagrant destroy
```

#### 再読込
※ --provisonでプロビジョニングも実施

```
$ vagrant reload
```

####プロビジョンだけ実施
reloadは仮想マシンの再起動が入り時間がかかるので、ChefやShell Scriptでプロビジョン書いている場合に、設定変更反映したい時とか良く使う

```
$ vagrant provision
```

##box関連

###box追加

```
$ vagrant box add [box名] [boxの場所](実ディレクトリでもURLでも可)
```

###box追加

```
$ vagrant box remove [box名] 
```


###box一覧の表示(現在登録されているbox一覧が表示される)

```
$ vagrant box list
cent65      (virtualbox, 0)
cent65-2    (virtualbox, 0)
```

###オリジナルのbox(パッケージ)を作成
自分の作り上げた環境をboxイメージとして他に展開したい時に使う
ここで作ったboxを他環境にコピーし、box追加手順で追加すれば利用可

```
$ vagrant package --output test.box
==> Attempting graceful shutdown of VM...
==> Clearing any previously set forwarded ports...
==>Exporting VM...
==> Compressing package to: /opt/Vagrant/cent65-base/test.box
```

## その他

####vagrantホームディレクトリからのssh接続

```
$ vagrant ssh
```

####通常のsshで接続
vagrant sshはホームディレクトリからしか使えないので、他の場所からでも通常の環境の様にsshしたい時は下記実施
knife soloとか外部からつつきたい用途は結構あると思うので良く使う。

```
$ vagrant ssh-config >> ~/.ssh/config

$ cat ~/.ssh/config
Host mweb
   HostName 127.0.0.1
   User vagrant
   Port 2222
   UserKnownHostsFile /dev/null
   StrictHostKeyChecking no
   PasswordAuthentication no
   IdentityFile /Users/xxx/.vagrant.d/insecure_private_key
   IdentitiesOnly yes
   LogLevel FATAL

$ ssh mweb
繋がるー

#自分の場合は、ホスト名ではなくipで繋げたいので下記のように、ホストをipにしてssh出来るようにしている
$ sed -i -e 's/mweb/192.168.50.*/g' ~/.ssh/config

$ cat ~/.ssh/config
Host 192.168.50.*
   HostName 127.0.0.1
   User vagrant
   Port 2222
   UserKnownHostsFile /dev/null
   StrictHostKeyChecking no
   PasswordAuthentication no
   IdentityFile /Users/xxx/.vagrant.d/insecure_private_key
   IdentitiesOnly yes
   LogLevel FATAL

$ssh 192.168.50.20
繋がるー

```

####同じboxイメージで複数台のマシンを起動
Vagtanfileに書きの様に記載することで同じイメージで複数起動を実現出来る

```Vagrantfile
  config.vm.define :mweb do | mweb |
   l mweb.vm.hostname = "mweb"
    mweb.vm.network :private_network, ip:"192.168.50.20"
  end
  config.vm.define :mweb2 do | mweb2 |
    mweb2.vm.hostname = "mweb2"
    mweb2.vm.network :private_network, ip: "192.168.50.21"
  end
```

※vagrant sshでは繋がらないので、引数にホスト名をつける
upやreloadの時もホスト名指定必要で、ない場合は両方に同じコマンドが通る

```
vagrant ssh [host名]
```
カッコイイデザインのソフトメモ

# [Blackmagic Design](https://www.blackmagicdesign.com/jp) #
映像系のソフトの会社

* [DaVinci Resolve](https://www.blackmagicdesign.com/jp/products/davinciresolve)


# [adobe](http://www.adobe.com/jp/) #

* [Adobe premiere CC+After Effects](https://www.adobe.com/jp/products/aftereffects.html?promoid=KLXLW)
Swift：SwiftからObjectiveCのコードが参照できないときのチェックポイントメモ



はじめに
===========

Swiftでプログラムを書いていてもやはりObjectiveCのコードを参照する必要があるときはまだまだあります。
上手く行っているときは良いんですが、トラブルとなかなかどうしていいかわからないこともあると思います。

そういう時のチェックポイントのメモです。

※「本体側のプロジェクトを **アプリプロジェクト**」「テストプロジェクトを **テストプロジェクト**」と呼ぶことにします。

[project]-Bridging-Header.h はあるか？
==============

SwiftのコードからObjectiveCのコードを参照するには、 `[project]-Bridginge-Header.h` を用意してそこに HeaderFileのImportを書く必要があります。
[SwiftとObjective-Cの相互利用する際の注意](http://qiita.com/fmtonakai/items/d9ba99ee8c5af096dbb9) 
などが参考になると思います。

HeaderはあるのにアプリプロジェクトでBridging-Headerが見つけられない時
========

Bridging-Headerはあるのに、アプリプロジェクトで見つけられない、という場合は、
アプリプロジェクトの以下の部分がちゃんと埋まっているか確認してみてください。
たまにXcodeが自動生成してくれてなくて空っぽの時があります。

![DeepTransitionSample_xcodeproj.png](https://qiita-image-store.s3.amazonaws.com/0/11124/61158e9c-2574-1580-f12f-05869e79ae86.png "DeepTransitionSample_xcodeproj.png")



Bridging-Header内のimportファイルがテストプロジェクトからfile not foundになる
========================

**アプリ側のビルドは通っているにも関わらずテストプロジェクトのビルドに失敗する** 時があります。
以下のように `File Not Found` と言われます。

![DeepTransitionSample-Bridging-Header_h.png](https://qiita-image-store.s3.amazonaws.com/0/11124/e3e54f96-780d-86a0-5f44-0ab2221efac9.png "DeepTransitionSample-Bridging-Header_h.png")

対処法
--------

この問題は、メッセージの通り、テストプロジェクトにおいて指定されたHeaderFileが見つからないことが原因です。

### アプリプロジェクトの設定


#### 見つからないと言われたHeaderをPublic Headerにする

Xcodeのアプリプロジェクトの設定から、 `Build Phases` -> `+ボタン` -> `New Headers Phase` を選びます。

![OtherViews_と_DeepTransitionSample_xcodeproj.png](https://qiita-image-store.s3.amazonaws.com/0/11124/9d3bf84c-6292-b668-48ea-5948ea104eb4.png "OtherViews_と_DeepTransitionSample_xcodeproj.png")

すると、Headers という項目が追加されるので、そこの `Public` となっている部分に Headerを全部追加します。
これでその Headerファイルは Public になります。

![DeepTransitionSample_xcodeproj.png](https://qiita-image-store.s3.amazonaws.com/0/11124/d9abff10-0b0e-0b3f-e9e1-2156c338e154.png "DeepTransitionSample_xcodeproj.png")


#### Public Header を置く場所を変更する
デフォルトの設定だと、Build Dirのアプリプロジェクト側のDIR配下にHeaderファイルが置かれるようで、
それ故にテストプロジェクトから見つからないみたいです。

そこで `Build Settings` -> `Public Header Folder Path` の値を **`MyHeaders`** とかにします。
この **`MyHeaders` は何でも良い**です。もう少し良い名前をつけてあげてください。（単にMyHeadersと書けばよいです。その前に何も付けないでください）。
項目がやたら多いので、右上の検索バーに  `Public` とか入れると見つけやすいです。

![DeepTransitionSample_xcodeproj.png](https://qiita-image-store.s3.amazonaws.com/0/11124/31ee88f8-1c6d-6884-1a34-a41bc7d8dbbd.png "DeepTransitionSample_xcodeproj.png")


### テストプロジェクトの設定

今度はテストプロジェクトです。アプリプロジェクトで置いてもらったMyHeadersのDIRを探すようにします。

`Build Settings` -> `Header Search Paths` -> `$(CONFIGURATION_BUILD_DIR)/MyHeaders`

とします。 **テストプロジェクト側のTargetに設定する**ということを間違えないようにしましょう（下図の①）。


![DeepTransitionSample_xcodeproj.png](https://qiita-image-store.s3.amazonaws.com/0/11124/14d80612-6cd4-b65a-0093-e2e0667c35e2.png "DeepTransitionSample_xcodeproj.png")

### Clean して Build

これでOKです。
一旦、CleanしてBuildすれば今度は治っているのではないかと思います。

さいごに
=======

この手のBuild エラーほど時間の浪費はないですね。
こういうことが起こったらチェックしてみてください。
gitのhookを全リポジトリで共有する

[Customizing Git - Git Hooks](http://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks)

git hookはサーバサイドならばアクセスする全ユーザ共通にできるが、通常使うクライアントサイドのgit hookは特に共有設定などを用意することができない。
そのため、tpopeさんはctagsのタグ生成のために、[git initやgit clone時に.gitのテンプレートでhooksを配布する方法](http://tbaggery.com/2011/08/08/effortless-ctags-with-git.html)をブログに書いている。

しかしこの方法では配布したgit hookを後から共通でいじりたくなってもできない。
そこで、**.gitのテンプレートのhooksから~/.githooksにシムリンクを張る方式**を提案する。

## .gitconfigにinit.templatedirを設定

```gitconfig:~/.gitconfig
[init]
  templatedir = ~/.git_template
```

gitconfigを上記のようにしておくと、~/.git_template内にファイルがあった場合git initやgit clone時に.git内にコピーが配布される。

以下のように~/.git_templateディレクトリを作成しておく。

```bash
mkdir ~/.git_template
```

## ~/.githooksへのシムリンクを作成

名前はなんでもいいが、~/.githooksを共有のgit hook用のディレクトリとして使う。
git init時に標準で作成される.git/hooksにはgit hookのサンプルが入っているので、これを共有git hookディレクトリのテンプレートに使う。

```bash
git init
mv .git/hooks ~/.githooks
ln -s ~/.githooks ~/.git_template/hooks
```

## すでにgit cloneしているリポジトリの.git/hooksを変える

```bash
function replace-githooks() {
  if [ -e .git/hooks ]; then
    rm -rf .git/hooks
    ln -s ~/.githooks .git/hooks
  fi
}
```

という関数を作っておき、必要に応じて実行する。
いちいち実行するのは面倒なので、[ghq](https://github.com/motemen/ghq)のユーザーには以下のスクリプトの実行を推奨する。

```bash
for repo in `ghq list`; do
  pushd "${GOPATH}/src/${repo}" > /dev/null
  replace-githooks
  popd > /dev/null
done
```

## ローカルフックが必要な場合

```bash
hook_name=`basename $0`
local_hook=".git/local_hooks/${hook_name}"
if [ -e $local_hook ]; then
  source $local_hook
fi
```

というのを~/.githooks/pre-commitに書いておくと、.git/local_hooks/pre-commitにローカルフックを書いておけばこれも使用される。
使う場合は、空の~/.git_template/local_hooksディレクトリを作っておくのがよい。

## まとめ
以上の操作により~/.githooks内のgit hookを共有して使うことができる。
Hubot x milkcocoaで(twitterなどの)メッセージをslackにリアルタイムに流す


今回はTwitterでStreamiingAPiで取得した内容をmilkcocoa経由でHubotを使ってSlackに流し込んでみます。



## milkcocoaの準備
###socket.io-client
`socket.io-client@1.0.x` を使います。最新ではダメです。
hubotディレクトリ内でnpm installしておきます。

```
$ ls
Procfile		bin			hubot-scripts.json	package.json
README.md		external-scripts.json	node_modules		scripts

$ npm i --save socket.io-client@1.0.x
```

###スクリプト記述 超短いw

scriptsフォルダ内にgetTweet.jsを作成します。
`robot.messageRoom(チャンネル名, 内容); `となります。
それにしてもめちゃ短いコードになりますね笑

```
// Description:
//   Messing around with the today API.
// Commands:
//   none

var MilkCocoa = require('./lib/milkcocoa');
var milkcocoa = new MilkCocoa('https://{your-app-id}.mlkcca.com');
var ds = milkcocoa.dataStore('{your-app-datastore}');

module.exports = function(robot) {

	ds.on('push',function(res,err){
		robot.messageRoom('#channel_name', res); 
	});

};

```

この状態でhubotを再起動させましょう。(herokuの場合はデプロイ)

↓のフロント側コードの場合 slackにhogehogeと流れるはずです。

##ソケット送信側 (フロント側)
一応送信側も書いてみます。

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>milkcocoa</title>
</head>
<body>
	<script src="//cdn.mlkcca.com/v0.2.8/milkcocoa.js"></script>
	<script>
	var milkcocoa = new MilkCocoa('https://{your-app-id}.mlkcca.com');
	var ds = milkcocoa.dataStore('{your-app-datastore}');
	ds.push({mes:'hogehoge'},function(res,err){
		/*送信後処理*/
	});
	</script>
</body>
</html>
```

## 例: tweetをslackへ

![](http://i.gyazo.com/6213e17cb813fc9c0c1d6ea22206db28.gif)

StreamingAPI -> milkcocoa -> hubot -> slack という感じでリアルタイムに指定した単語のツイートをslackに流し込みます。(今回は"おなかすいた"を含むツイート)

## まとめ
milkcocoaを使うことでhubotとの連携もすんなりと出来ますね。
Twitterと連携させると思った以上に便利そうです笑
理解があいまいな !型と?型の変数を違いを比較する

swiftでの変数に ! や ?、および無印がありますが、いまいち理解があいまいだったのでPlaygroundで比較してみました。

Optional型がどうこうとか、そういう理論的な話は抜きです。
どういう場合にビルドエラーになるのか、どういう時に実行時エラーになるのかが中心です。

特に、普段使わない **!型で宣言した変数の扱い** について見ていきます。


長いので先に結論です

* ?型変数 はnilの可能性がある。末尾に ? か ! を付けて適切に処理するように。
* !型変数 はnilの可能性がある。nil だと落ちるので注意するように。
* 無印はnilの可能性がないので安全に扱える


-----

### 代入
まずは変数宣言と、単純な値の代入の実験です。

```swift
var hoge1 : String? = nil  //OK
var hoge2 : String! = nil  //OK
var hoge3 : String = nil //ビルドエラー
```

意外だったのは、 **!がnil許容**　だったことです。
ずっと !はnil非許容と勘違いしてました。


------

### 実行

次にnil許容な変数に対する何らかの操作を行った場合です。

```swift
//?
var hoge1 : String? = ...
hoge1.lowerCaseString //ビルドエラー
hoge1?.lowerCaseString  //String?型の値が返る
hoge1!.lowerCaseString  //String型が返る。nilだと実行時クラッシュ

//!
var hoge2 : String! = ...
hoge2.lowerCaseString //String型が返る。nilだと実行時クラッシュ

//無印はそもそもコンパイラの段階でnilを許容しないので省略
```

-------
### 値の受け渡し

ちょっと複雑になります。次にそれぞれの型の値の受け渡しです。

**?マークへの代入**

```swift
var h1 : String? = ...
var h2 : String! = ...
var h3 : String = ...

var value : String?
value = h1    //OK。これはそのまま
value = h1?   //OK。?を付けても付けなくても一緒
value = h1!   //nilだと実行時エラー
value = h2    //OK。nilでも左辺がString?型だから問題なし
value = h3    //OK。確実に値が入る
```


**!マーク**

```swift
var h1 : String? = ...
var h2 : String! = ...
var h3 : String = ...

var value : String!
value = h1    //OK h1がnilだとvalueもnil
value = h1?   //OK h1がnilだとvalueもnil
value = h1!   //h1がnilだと実行時エラー
value = h2    //OK。h2がnilだとh1もnil
value = h3    //OK。確実に値が入る
```

**無印**

```swift
var h1 : String? = ...
var h2 : String! = ...
var h3 : String = ...

var value : String
value = h1    //ビルドエラー
value = h1?   //ビルドエラー
value = h1!   //nilだと実行時エラー
value = h2    //nilだと実行時エラー
value = h3    //OK

```


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

### 一覧表

表にしてまとめてみます
危険 は右辺がnilの場合に実行時例外を意味します
つまり、危険のパターンはif等で事前に判定しておく必要があります。

|左辺\右辺 | ?(生) | ?(?つき) | ?(!つき) | !型 | 無印 |
|:--:|:--:|:--:|:--:|:--:|:--:|
| ?型= | OK | OK | 危険 | OK | OK |
| !型= | OK | OK | 危険 | OK | OK |
|無印=| ビルド不可 | ビルド不可 | 危険 | 危険 | OK |


-------
### 関数呼び出し
関数呼び出しについても代入と同様です。

受け取り手のメソッドの引数が、?や無印のときは問題ないと思います。
?のときは ? や ! を付ける、無印のときはnilの可能性はないのでそのまま実行してOKです。

```swift
func test1(str : String?) {
	let lower = str?.lowerCaseString //?なり!なりつけるだけ
}
func test3(str : String) {
	let lowser = str.lowerCaseString //nilの可能性がない
	//逆に if str != nil と書くとビルドエラー。nilの可能性がないと言われる
}
```

一方、!はnilの可能性があるので **ifでnilチェック** する必要があります。

```swift
func test3(str : String!) {
	let lowser = str.lowerCaseString //もしstrがnilなら落ちる
	//よってこうする必要がある
	if str != nil {
		let lower = str.lowerCaseString
	}
}
```

正直なところ、自分で作るメソッドなら引数は ! ではなく ? のほうがいいと思います。
nilの可能性がないなら無印にすべきです。(普通作らないとは思いますけど...）

ではなぜ ! があるかというと、 **Objective-C時代の遺産** が多いです。
delegate系に多く存在します。

当然ながらObj-CにOptional型なんてないので、 **nilの可能性がある引数は 基本!付きになります**
*(※このためだけに!型が用意されたとしか思えない...)*

Delegate等での!型引数の場合、基本的にnilチェックをしてください。
もしくは一旦 ?型の変数に入れてOptionalChaining にするのも手です。


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


# まとめ
再びまとめです。
・ ?型変数 はnilの可能性がある。末尾に?か!を付けて適切に処理するように。
・ !型変数 はnilの可能性がある。nilだと落ちるので注意するように。
・ 無印 はnilの可能性がないので安全に扱える

**?はどっちか分からん　!は気をつけろ　無印は安全**　と覚えると楽かもしれません。
phpbrew useした時に出たエラーとその解決


phpbrewとはこちら。

https://github.com/phpbrew/phpbrew

phpenvよりよさそうな感じがしている。


## エラーの内容



```sh
$ phpbrew use php-5.3.29
__phpbrew_set_path:export:5: not valid in this context: Studio.app/sdk/platform-tools:/Users/mapyo/.composer/vendor/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/go/bin:/Users/mapyo/.go/bin:/Applications/Android
```


## 解決方法

https://github.com/phpbrew/phpbrew/issues/236#issuecomment-47447802

このissueによると、

`~/.phpbrew/bashrc`の`__phpbrew_set_path`の関数を、
以下のように書き換えてみて。ということだった。

```sh
function __phpbrew_set_path ()
{
    [[ -n $(alias php 2>/dev/null) ]] && unalias php 2> /dev/null

    if [[ -n $PHPBREW_ROOT ]] ; then
        PATH_WITHOUT_PHPBREW=$(perl -e 'print join ":", grep { index($_,$ENV{PHPBREW_ROOT}) } split/:/,$ENV{PATH};')
    fi

    if [[ -z "$PHPBREW_PATH" ]]
    then
        PATH=$PHPBREW_BIN:$PATH_WITHOUT_PHPBREW
    else
        PATH=$PHPBREW_PATH:$PHPBREW_BIN:$PATH_WITHOUT_PHPBREW
    fi
    export PATH
    export PATH_WITHOUT_PHPBREW

    # echo "PATH => $PATH"
}


```

書き換えると、普通にでけたー

```
$ phpbrew use php-5.3.29
$ php -v
PHP 5.3.29 (cli) (built: Dec 15 2014 07:34:54)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2014 Zend Technologies

```

めでたしめでたし。
【FileMaker】ポップオーバーボタン

ポップオーバーボタン。
バージョン13で追加になった機能です。
なんだよ、それ。って思いましたが、こういうことです。

「★」印のボタンを押すと、指定したデータや画像が表示できます。
![1218_4.png](https://qiita-image-store.s3.amazonaws.com/0/60538/27df3417-9bf1-13f6-8c4b-e25a08ad9180.png)

作り方はいたって簡単です。

表示させるデータを用意。画像でも構いません。GoogleMapもいけます。
GoogleMapの場合は位置情報や場所の情報が必要なので、それをどこかで指定して計算して渡してあげる感じです。
（その辺については、[YesWeCanさんのサイト](http://ywc.com/filemaker/?p=884)での解説が詳しいです）

ここでは簡単に文字列です。メニューのオススメポイントを表示します。
![1218_1.png](https://qiita-image-store.s3.amazonaws.com/0/60538/79396c2c-a364-9973-191a-9f936ea6b4a5.png)

レイアウトモードで「挿入＞ポップオーバーボタン」を選択。
![1218_2.png](https://qiita-image-store.s3.amazonaws.com/0/60538/b2e55776-7208-e69c-99af-4f4dc0871cd3.png)

オススメのフィールドを指定して、吹き出しの形などを指定して出来上がりです。
![1218_3.png](https://qiita-image-store.s3.amazonaws.com/0/60538/bf2b816d-484c-aec2-ecef-14f26ebf9705.png)

まぁ！！
なんて簡単なの！？

簡単にオサレなポップオーバーができます。
iPadやiPhoneなどでFileMaker Goと組み合わせて開発する際には、その時使わないボタンなどが隠せるので大活躍しそうですね。
Gitのコミットオブジェクトの概念

gitを始めた当初、最初コミットの概念がよくわからず理解がはかどらなかったことを思い出したのでここにまとめます。

単にコミットと書くと「コミットする」ことと「コミットした結果できる履歴」のどちらかがわかりにくいので、便宜上後者をコミットオブジェクトと呼びます。

## 大前提：コミットオブジェクトはあるディレクトリ以下の単なるスナップショット

cvs, subversionやbazaarなどとgitが根本的に違うのは、履歴が*変更の積み重ねの記録***ではなく**単に*その瞬間瞬間の全ファイルのスナップショット*であることです。なので過去のコミットで作ったファイルなどを故意に削除などしても最新コミットオブジェクトを参照している限りは問題なく動きます（rebaseなど過去のコミットオブジェクトを参照する場合にエラーが起きそうですが）。
なぜこのような仕組みになっているかというとgitの開発者でlinuxの開発者でもあるlinusさんが「今のバージョン管理システムはmergeが遅すぎて使えない、もう自分たちで作るしかない！」といって開発し始めたことに関係があります。
これまでの差分の積み重ねベースのVCSは各コミットオブジェクトがそれより前のコミットオブジェクトに依存しており、merge操作などが非常に遅いという欠点がありました。
gitは各コミットオブジェクトの独立性を高めることでmergeなどが高速に行えるようになっています。

## あれ、でもだとしたらcherry-pickすると変更の適応ではなく全ファイルの上書きになるんじゃないの？

コミットオブジェクトが特定ディレクトリ以下のスナップショットだとすると、cherry-pickやrebaseの動作には疑問が浮かびます。
単純に特定のコミットオブジェクトを引っ張ってきて今のコミットオブジェクトのあとにつけるとリポジトリ内のすべてのファイルがcherry-pick先のコミットオブジェクトの状態に上書きされてしまうんじゃないでしょうか？

ここがgitの巧妙かつややこしいところです。
各コミットオブジェクトは実は内部に直前のコミットオブジェクトへのポインタを持っており、cherry-pickコマンドを実行した場合は実際には対象のコミットオブジェクトとその直前のコミットオブジェクトで差分を取り、その差分を今のコミットオブジェクトへ適応してるのです。擬似的にコードっぽく書くとこんなかんじでしょうか。

```scala
val cherry-pick後のコミットオブジェクト =
  今のコミットオブジェクト.apply(
    diff(cherry-pick先のコミットオブジェクト.prev, cherry-pick先のコミットオブジェクト)
  )
```

なのでcherry-pickは実際にはその指定したコミットオブジェクトを適応してるのではなく、指定したコミットオブジェクトとその直前との差分を適応してるんですね。
gitのサブコマンドの中にはこのcherry-pickのように実際にはスナップショットであるにも関わらず、コミットオブジェクトが差分に見えてしまうものがいくつもあります。

## コミットオブジェクトをスナップショットだと理解すればcherry-pickしたコミットオブジェクトのハッシュが変わるのも自然

もしコミットオブジェクトがファイルシステムへの変更の差分だとすれば、cherry-pickする先のコミットオブジェクトのハッシュ値とcherry-pickしてできたコミットオブジェクトのハッシュ値は一致してないとおかしいです（同じ変更内容ならば同じハッシュ値になるはず）。
しかし、実際にはコミットオブジェクトはスナップショットなのでその両者は違ったハッシュ値になるわけです（両者のディレクトリ以下のファイル状態が違うため、スナップショットのハッシュ値も当然違う）

## まとめ

gitのいろいろなコマンドを理解するためには以下を理解しておくといろいろはかどります

* コミットオブジェクトは実際にはgit initしたディレクトリ以下のスナップショット
* gitコマンドの中にはコミットオブジェクトを差分っぽく扱うものがあるが、実際には対象コミットオブジェクトとその直前のコミットオブジェクトの差分を見ている

## 参考文献

* [Git - Book](http://git-scm.com/book/ja/v1)
Yosemite（MacOS:10.10.X）やEl capitanでApacheを使えるようにしてみる

YosemiteやEl capitanでApache（localhost）を使えるようにする方法

#1,Apacheを起動する
ターミナルでApacheを起動します。

```lang:terminal
$ sudo apachectl start
```

このコマンドが成功すれば、 http://localhost/ にアクセスした時にお馴染みの「It works!」が表示されます。

#2,WEBサイトフォルダのパスを移動する
ここからがややこしい。理由は他サイト様で見てください。
この記事を書くのに参考にしたサイト様を最後に載せておきますので、そこがわかりやすいかと。
/etc/apache2/httpd.confファイルを編集します．

```lang:terminal
$ sudo vi /etc/apache2/httpd.conf
```

次の文字が書かれた行まで矢印ボタン（↓）で移動します。
`#LoadModule userdir_module libexec/apache2/mod_userdir.so`
「a」キーを押し、viを挿入モードへ切り替えて、「#」をdeleteキーで削除</span>し、更に下の方の以下の文字列も同様にしてください
`#Include /private/etc/apache2/extra/httpd-userdir.conf`の「#」を消す
終わったら　「escキー」　→　「:wq」　と入力


#3,ホームディレクトリに「サイト（Sites）」フォルダを作る</span>
```lang:terminal
$ mkdir ~/Sites
```


#4,ユーザ単位のファイルを作る

```lang:terminal
$ sudo vi /etc/apache2/users/ユーザ名.conf
```

次のテキストをコピーしてください

```lang:コピーしてください
<Directory "/Users/ユーザ名/Sites/">
AllowOverride All
Options Indexes MultiViews
Options +FollowSymLinks
Require all granted
</Directory>
```
「aキー」を押して挿入モードにし、右クリック→ペースト
ユーザ名の部分を自分のユーザ名に書き換えて、esc　→　:wq　をタイプ

#5,Apacheのリスタート
```lang:terminal
$ sudo apachectl restart
```

これで行けるはずです。


#403エラーが出る場合
もし、403Forbiddenエラーが出るならば、

```lang:terminal
$ sudo vi /etc/apache2/extra/httpd-userdir.conf
```

が以下のようになっているかを見てください。
なってなければ書き換えてください。

```lang:書き換えてください
UserDir enabled
UserDir Sites
Include /private/etc/apache2/users/*.conf
<IfModule bonjour_module>
       RegisterUserSite customized-users
</IfModule>
```
以上です。

参考にしたサイト様。
<a href="http://nantekottai.com/2014/10/26/os-x-10-10-sites/" target="_blank">http://nantekottai.com/2014/10/26/os-x-10-10-sites/</a>
<a href="http://qiita.com/daei/items/aaa79e9486241bac8a8b" target="_blank">http://qiita.com/daei/items/aaa79e9486241bac8a8b</a>
超小型PC Intel Edison と 超小型 ZigBeeモジュール TWE-Lite を合体させてみた！

Intel Edison自身にGPIOが多数用意されていますが、今回の記事では、Edisonをセンサーノードのハブとして利用する方法を紹介します。


**材料**

* [Intel Edison with Mini Breakout Kit](https://communities.intel.com/docs/DOC-23252?_ga=1.204961938.321657332.1412987708)
* [TOCOS TWE-Lite(SMD/ワイヤアンテナ#7（ハテナ型）)](http://tocos-wireless.com/jp/products/TWE-001Lite.html)
* [I2C ３軸加速度センサモジュール(AE-LIS3DH)](http://akizukidenshi.com/catalog/g/gK-06791/)
* コイン電池(CR2032)
* コイン電池ホルダー
* フリスクもどきの空ケース
* [エナメル線（ポリウレタン銅線）細めのもの少々](http://www.sunco35.com/blog/?cat=84)
* 半田少々

始めは、J16にOTG用ケーブル⇔USBシリアル変換([AE-FT231X](http://akizukidenshi.com/catalog/g/gK-06894/))⇔TWE-Liteというふうに接続していました。この場合、接続されたTWE-Liteは、Linux上の/dev/ttyGS0に対応します。
ただ、この方法ですとTWE-Liteなどをフリスクもどきの空ケース内に内蔵できないため、J17~J20のピンとTWE-Liteをレベル変換回路([FXMA108](http://akizukidenshi.com/catalog/g/gM-04522/))を経由してUSBを介さずに接続する方法に変更しました。この場合、接続されたTWE-Liteは、Linux上の/dev/ttyMFD0に対応します。
なお、TWE-Liteは[親機、子機、それぞれ用のファームウェア](http://tocos-wireless.com/jp/products/TWE-EH-S/sw_html/index.html)をあらかじめ書き込んでおきます。また、子機については、[センサーモードの設定も変更](http://tocos-wireless.com/jp/products/TWE-EH-S/sw_html/mode_LIS3DH.html)しておきます。

**配線**

**センサーハブ**

| Edison        |FXMA108|TWE-Lite(親機)|
|:--------------|:------|:--------|
|J19-2:1.8V OUT |VCCA   |         |
|J20-2:3.3V OUT |VCCB   |5:VCC    |
|J19-3:Ground   |GND,OE |20:GND   |
|J18-13:UART1_RX|A0     |         |
|               |B0     |8:UART-TX|
|J19-8:UART1_TX |A1     |         |
|               |B1     |9:UART-RX|



**センサーノード**

|TWE-Lite(子機)|AE-LIS3DH|電池(CR2032)|
|:------------|:--------|:-----------|
|5:VCC        |1:VDD    |(+)         |
|20:GND       |2:GND    |(-)         |
|14:I2C-SCL   |3:SCL    |            |
|17:I2C-SDA   |4:SDA    |            |
※AE-LIS3DHは、I2Cモードにするため、半田ジャンパーA,B,Cはハンダ付けする

![IMG_2238.JPG](https://qiita-image-store.s3.amazonaws.com/0/21380/6ef7717c-8572-6427-aa04-c3b728eb34dd.jpeg)
![IMG_2239.JPG](https://qiita-image-store.s3.amazonaws.com/0/21380/daa94564-6e48-67e2-5e7e-08bf6b4d405c.jpeg)
Windows7版Wunderlist3のフォントが気に入らない時の対処法

2014年12月にリリースされたWunderlist3ですが、相も変わらず環境によってはCJKフォントで表示されてしまう問題が続いておりました。まぁ読めなくはないんですが、漢字によっては日本語っぽくなくて気持ち悪い。

![cjk.jpg](https://qiita-image-store.s3.amazonaws.com/0/32292/bf30a2a9-1777-d117-cd64-b5e9633ef493.jpeg)

Windows7版のWunderlist3はjsである程度実装されているみたいなので、ちょっといじって好きなフォントに変えてみた。
※Windows8版（ストア版）は未確認です。

1. "C:\Program Files (x86)\Wunderlist\js\main.js"を編集可能な状態にするか、編集可能な場所にコピーします。念のためバックアップを取ったほうがいいでしょう。
2. 変更したいフォントの名前を調べます。当然、パソコンにインストールされているフォントの中から選んでください。今回はメイリオとヒラギノ角ゴ ProN W3に変更してみます。
1. メモ帳でいいので"main.js"ファイルを開き、"Ctrl+H"で置換ウィンドウを開きます。
2. 「font-family:"Lato","Microsoft Yahei","微软雅黑",STXihei,"华文细黑",\'ＭＳ Ｐゴシック\',\'MS PGothic\',\'メイリオ\'」を、メイリオに変更したい場合は「font-family:\'メイリオ\'」に、ヒラギノ角ゴ ProN W3に変更したい場合は「font-family:\'ヒラギノ角ゴ ProN W3\',\'メイリオ\'」に置換します。
3. 編集した"main.js"を元の場所に上書き保存します。
4. Wunderlist3を再起動します。

これで表示したいフォントに変更されたと思います。

![hira.jpg](https://qiita-image-store.s3.amazonaws.com/0/32292/e4c0d761-2cf0-b9ed-e118-e68d0bdbda59.jpeg)

アップデートごとにまたファイルが更新されてしまいますが、同じ操作を行えば今のところは大丈夫なようです。
いいからfish shellつかってみろ

# 1分〜のやつ

気がついてたら2日過ぎてました。すみません。

# fish shellつかってみろ

http://fishshell.com/

これだけが言いたい。1分かからないと思う
入力補完も聞くし、まあ凝ったことをしないならおすすめ。

![Screen Shot 2014-12-18 at 02.08.39.png](https://qiita-image-store.s3.amazonaws.com/0/3985/9c5879cc-b8c5-9755-7257-ff649617d65e.png)

# インストール

Mac OS Xなら以下。

```
> brew install fish
```

# シェルの設定

以下のコマンドを実行すると、
fish shellの設定が行えるわけなのだが、
なんとブラウザが立ち上がる

```
> fish_config
```

![Screen Shot 2014-12-18 at 02.05.42.png](https://qiita-image-store.s3.amazonaws.com/0/3985/3248b155-4745-30d1-e4bf-1a20bd02679c.png)

プロンプトの色だけではなく、
gitを使うユーザー向けの設定が行えて便利。

# oh-my-fish

https://github.com/bpinto/oh-my-fish

oh-my-fishを使うとより便利にfish shellを使うようにすることができる。
... ~/.config/fish 以下に自作functionを並べるより、
ある程度用意されたfunctionを使えるということでおすすめだったりする。

# ただし

職場の先輩から渡されたbash向けスクリプトを実行したい場合は、
常にshellを切り替えることになるので大変である。
FakeServerで一部だけ実際のサーバにリクエストさせる

Sinon.JSのFakeServerでXHRをフェイクするけど、特定のXHRだけは実際にリクエストさせるときのメモ。

---

最初にFakeServerを作る。

```js
var server = sinon.fakeServer.create();
```

この時点でXMLHttpRequestがSinonのものに置き換わっているようなので、戻したいときは`server.restore()`で。

---

autoRespondをtrueにして、FakeServerにリクエストを投げたときにわざわざ`server.respond()`しなくていいようにする。

```js
server.autoRespond = true;
```

---

ここが一番大事なところ、フィルタの指定。

```js
server.xhr.useFilters = true;
server.xhr.addFilter(function(method, url, async, username, password) {
  if (url.indexOf('/path/to/api') !== -1) {
    // フェイクしない
    return true;
  }

  // フェイクする
  return false;
});
```

`server.xhr.useFilters = true`でフィルタを使用する指定をする。

`server.xhr.addFilter`にフィルタ用の関数を渡す。

`addFilter()`はリクエストするたびに呼ばれる。渡す関数は戻り値として`true`を返すとFakeServerで処理せずに実際にリクエストを投げ、`false`を返すとFakeServerで処理されるようになる。

上記のコードの場合、リクエスト先のURLに`/path/to/api`が含まれていれば実際にリクエストを投げた上でそのレスポンスが返るが、それ以外の場合はFakeServerに処理される。

---

JSONファイルは実際にリクエストして取得して、APIはFakeServerのレスポンスを受け取りたい、という謎の使い方をしたくて調べたら簡単にできた。Sinonすごい。
vim練習帳。



この記事は Vim Advent Calendar 2014 の 18日目の記事です。
17日は<A href=http://qiita.com/simeji>simeji</A>さんの「<A href="http://qiita.com/simeji/items/527478831eb561b06c17">【Vim入門】ノーマルVimで使えると便利かもなコマンド10つ</A>」でした。結構書こうと思ってたことを書かれてしまった感ある・・・汗

さてさて、今年のVACも猛者Vimmerにまぎれて、プラギンもロクに入れない野良Vimmerであるところの私が１日もらってしまいました。
 上級者にとっては当たり前すぎて物足りないかもしれませんが、丁度良いレベルに感じてくださる方もいるはずと信じて、
 今回は「vim練習帳」と題して、私がOS管理上、vimをどのように使っているかを紹介しながら、vim力の底上げをはかっていただければと思います。

 ＊対象読者
 全vimmerです。
 Linuxの内容が多く出てきますが、別のOSでも応用可能と思っています。
 ｈｊｋｌとかは説明しないので、超初心者には辛いかも？

 ＊はじめに
 「ぷらぎん作りまくるぜぇええええ」
 「ぷらぎん入れまくるぜええええ」
 という方には少々物足りないかもしれません。プラグインの話は出てきません。
 その代わり、OSインストール直後の素VIMで使える機能ばかりであり、いうなれば、vimの基礎力がつくものと考えています。

 いきなり、客先や先輩のvimを使わないといけないかもしれません。
 そんな時、普段からプラグイン中毒になっていると（自分のvimなら・・・こんな変更一発なのに・・・っ！）と悔しい思いをするかもしれません。

 ＊能書きはいいので、まずは基本。

 題材１：httpd.conf
 まずはじめにご紹介するのはhttpd.confです。
 手元のcygwinから抜いてきましたので、なにそれって方は、<A href=http://kumack.net/d/httpd.conf target=_blank>こちら</A>からダウンロードして、vimで開いてください。
 
 さて、httpd.confの最初の方はコメントだらけです。
 有効な設定を確認するために、コメントの行はひとまずとばしてしまいたいですね。

 jjjjjjjjjjjjjjjjj

 でも、いいのですが、

 [Ctrl+f][Ctrl+f][Ctrl+f][Ctrl+f][Ctrl+f][Ctrl+f]

 でもいいのですが、
 サクッと、「先頭が＃でない」ところだけどんどん読んでしまいましょう。
ということで、私の提案はこちら。

 /^[^#]<Enter>nnnn

 さて、これの意味ですが、先頭の/は検索を開始。
 次の^は「行頭の文字が、「後に続く１文字」の時「合致」」という意味です。
 では、あとに続いている１文字は何かというと・・・

 [^#]・・・ですね。これは、#以外のすべての文字１文字、を指します。

これにより、コメントアウトされてない行がマッチするのですね。

^の意味が2種類あるのに注意してください。
/の直後にあると、行頭にマッチ、
[の直後にあると、その次の文字を除外した文字集合、です。

<HR>
続いてはある設定値を変えてみましょう。

例として、
Listen 80
を
 #Listen 80
Listen 1234
にしましょう。

カーソルは今、Lの上にあります。

私の提案は、
kylj[Shift]P
yyp
x
f8R
1234[esc]

ですかね。
1行目。一行上に移動し、1文字コピー(#をコピー)し、元の行に戻り先頭に貼り付け。
2行目。1行コピーして貼り付け。yyは[Shift]Yでもいいですが、個人的にはyyのほうが早いと思ってます。(Vimgolfでは1文字減らせるテクニック)
3行目。先頭の#を削除。
4行目。8までジャンプし、置換入力。
5行目。入力してescで終了。
通は[esc]の代わりに[Ctrl]+[です。

ポイントは、
・なるべく入力モードに入らず打つ。(今回で言うと、#)

<HR>
さらにhttpd.confをnで読み進めていくと、
行頭はTabで、その後に#、という行が出てきます。
この行もコメント行なので検索にはマッチしてほしくありません。
検索文字列を少し直しましょう。

/^\s*[^# ]

変更点は2箇所。
・^のあとに\s*を入れました。
　\sはTabやスペースにマッチする文字、*は何文字でも、という意味です。
・#のあとに半角スペースを入れました。
　#の他に、半角スペースも除外しないと、「半角スペース2文字」がマッチしてしまいます。


<HR>
ScriptAlias /cgi-bin/ "/srv/www/cgi-bin/"
を
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
に変えてみましょう。
カーソルをvarに持っていくために、いろいろな方法があると思いますが、
もちろん、自分の素直に思いつく行き方があるかたは無理にそれを変えなくていいと思います。

自分は、
fs;
cw
var[esc]
ですね。
fのあと1文字でその1文字にマッチする行内の位置に移動します。
;はfの移動を繰り返します。
明らかに2個めだ、とすぐに分かるなら2fsで一回で飛べますが、そういうケースは稀で、
おすすめは、;で目的地につくまで繰り返す。行き過ぎたら、,で戻る(逆方向に検索)を繰り返して、目的地につくのがいいと思っています。
wをつかう、f"のあとずらす、など、色々な行き方を使ってみるのがいいと思います。
カーソル移動がうまくなると、そこまでの削除、そこまでのコピーも同じようにできるようになるので。
<HR>
あとがき。

推敲時間が足りず乱文になってしまいましたが、
実際の設定ファイルを使って、vim操作を解説してみました。
時間があったら別の設定ファイルの例なども紹介したかったのですが、
思いの外長くなってしまったので、今回はこのくらいにします。
Slack始めたらとりあえずスラッシュ打ってみな


Slackにはスラッシュ```/```から始まる[コマンド](https://slack.zendesk.com/hc/en-us/articles/201259356-Using-slash-commands)っていう機能があるんですね。どんなコマンドがあるかを知りたかったら投稿フォームに```/```をタイプすだけでコマンドリストが表示されます。便利。

![スクリーンショット 2014-12-18 1.36.21.png](https://qiita-image-store.s3.amazonaws.com/0/8463/2b7a0d3e-e262-e9a2-5494-c07c0e0a5287.png "スクリーンショット 2014-12-18 1.36.21.png")

コマンド一覧見てると```/invite```で作ったチャンネルにユーザ招待できるんだーとか、```/remind```でslack bot君がリマインドしてくれたりするんだーとか```/feedback```でSlackチームにフィードバック送れるのねとかいう発見あります。

どんなコマンドがあるかは各自試してみてくださいね。

で、このコマンドの中には```/shortcut```っていうコマンドがあるんですね。Slackで使えるショートカットの一覧が表示できます。

![スクリーンショット 2014-12-18 1.44.45.png](https://qiita-image-store.s3.amazonaws.com/0/8463/d43867b5-4f7a-f8a1-e204-33c2cf27f0c9.png "スクリーンショット 2014-12-18 1.44.45.png")

Slackはショートカットを使いこなせるとだいぶ捗ります。
スラッシュから始まるコマンド、特に```/shortcut```を活用して皆さん早くSlackマスターになりましょう。
rubyのgemコマンドを使って、sass/scss を使用できる環境づくり。

# sass/scss を使えるようにしよう。
前回、rubyを使えるようになったので、次はsassを使えるようにしたい。
http://qiita.com/akifo/items/fa68bc46bc638a9b2abf

まずは、gemを最新にしておく。

````
$ gem update --system
````

さっそくインストール

````
$ gem install sass
````

あっという間に完了！

cssフォルダと、scssフォルダが見える階層に移動して、ターミナルで下記コマンドを実行すれば、ターミナルでログイン中はバックグラウンドでwatchが動いて、自動的にscssからcssに変換してくれる。

````
$ sass --style expanded --watch scss:stylesheets &
````
インフラエンジニア採用時に必ずしなければならない質問

インフラエンジニアに関わらず採用面接をすることが多々あります。

特にインフラエンジニアについて、過去の面接経験から必ず聞いておいたほうがいいと思われる質問をまとめました。
採用担当の方など、もしこの質問をしていないのであれば是非しておいたほうがいいでしょう。

答えはあえて書きません。
各組織様々な考えがあると思うからです。

### [1]パスワードを設定する時の生成方法と桁数を答えて下さい。

```
いいかげんなパスワードを作らない人が良いでしょう。
```

### [2]インターネットに公開するLinux or Windowsサーバーを構築しました。最低限行うセキュリティ設定と確認方法を答えて下さい。

```
いいかげんなLinux or Windowsサーバーを構築されると世間に迷惑がかかります。
設定ができても、自分が設定した以外の確認も行える人が理想です。
```

### [3]あなたのパスワード管理方法を教えて下さい。

```
最近クラックされたソニー・ピクチャーズのパスワード管理方法がスゴかったようですね。
```

### [4]使用しているパソコンから離れるときにすることは何ですか？

```
これが実行できている人は滅多にいません。とても残念です。
```

### [5]あなたがパスワードを発行しました。相手にどうやって渡しますか？

```
ちゃんとして答えが返ってくれば安心です。
```


昨今はセキュリティの重要度が高く、知識が乏しいエンジニアに安心してシステムを任せられません。
どんなにスキルがあってもセキュリティの基礎的な考えが残念な場合、組織に取り返しのつかない重大な事態に追い込まれてしまうことも考えるべきです。

上に挙げた質問は採用後にしても構いません。
要はインフラエンジニアに、これらの知識や意識があるのかないのかを知っておく必要があります。
なければ勉強すればいいのです。

また近年VPSの普及により、プログラマーなどのエンジニアも簡単にサーバーを構築している例をよくみますが、セキュリティ設定を適当にやってしまい、知らない間に踏み台にされていたなど笑えないケースが多々あるようです。
サーバーを構築する可能性のあるエンジニアにも身につけてもらいたい知識ではあります。
WebStormとGitHub

こんにちは、らこです。今日はWebStormのGitHubプラグインが可能にしている「そんなことまで出来るの」っていう連携機能について紹介します

# 準備
設定の[Version Control]>[GitHub]からログインしておきます。

![image](https://qiita-image-store.s3.amazonaws.com/0/20253/40ab7470-09a9-dc55-c048-7f127daf2803.png)

# GitHub上のリポジトリからプロジェクト作成
これはみなさんご存知だと思います。新規プロジェクトを作る際にGitHubからクローンできます。

![image](https://qiita-image-store.s3.amazonaws.com/0/20253/e199472c-5ec6-7619-62f6-5e5be1fff7e5.png)

クローンしたいリポジトリを選んで、ディレクトリ名を設定するだけです。

![image](https://qiita-image-store.s3.amazonaws.com/0/20253/dd23c299-1560-2223-9bb0-569cb5dc6b09.png)

# プロジェクトを元にGitHubにリポジトリを作る
さっきの逆ができます。こちらはあまり使ってる人はいないのではないでしょうか。ローカルで作り始めたプロジェクトをある程度進んだところでGitHubに公開したいときに便利です。

プロジェクトを開いた状態で、[VCS]>[Import into Version Control]>[Share Project on GitHub]です

![image](https://qiita-image-store.s3.amazonaws.com/0/20253/5a281e5b-e41d-8d0d-29b1-f50abae00e52.png)

ダイアログでリポジトリ名と説明、有料アカウントの場合はPrivateかどうかを設定してShareすると、リポジトリを作成して最初のコミットとプッシュまで完了した状態になります。

![image](https://qiita-image-store.s3.amazonaws.com/0/20253/8b02e7d4-1798-c3b3-aa79-8da3af33ef30.png)

# フォーク元の変更を取り込む
GitHubでフォークしたリポジトリをWebStormで読み込んでいる場合に有効です。フォークした自分のリポジトリではなくオリジナルのリポジトリをローカルにマージすることができます。

[VCS]>[Git]>[Rebase my GitHub fork]をクリックするとマージできます。

# プルリクエストを送る
これも自分のリポジトリがフォークであるときに便利です。
GitHubのページ上でやるのと同じようにプルリクエストが送れます。
現在編集中のブランチをダイアログで設定したリポジトリのブランチにプルリクエストを送ります。送信する前にShow Diffで変更点を確認することもできます。

![image](https://qiita-image-store.s3.amazonaws.com/0/20253/b6cbce0e-a941-f331-cca0-eb2fedb5f9a7.png)

# 編集中のコードをGistに送る
今書いてるコードをちょっと公開したいときにGistにできます。
エディター上で右クリックして[Create Gist]をクリックするだけです。選択状態のテキストがあれば選択部分だけが、なければファイル全体が公開されます。

# GitHubのIssuesをTaskとして読み込む
メニューバーの[Tools]>[Tasks & Contexts]>[Configure Servers]から、タスクのサーバーを追加します。右側の＋ボタンからGitHubを選択し、リポジトリのオーナー名と名前を設定します。

![image](https://qiita-image-store.s3.amazonaws.com/0/20253/80666843-1be1-486d-e3d5-0d3413bc86e2.png)

この状態で右の「Create API token」をクリックすると、左のAPI Tokenに発行されたトークンがセットされます。

タスク管理サーバーの設定が完了すれば、Open TaskやSwitch Taskの候補にGitHubのIssueが出てきます。

![image](https://qiita-image-store.s3.amazonaws.com/0/20253/078b2a9d-fdd0-3cff-b0db-807f2cdaf19e.png)


…が、現在は検索窓が日本語を表示できないので、Issueを日本語で書いてる場合はちょっと厳しいです。

![image](https://qiita-image-store.s3.amazonaws.com/0/20253/fd3286ce-19eb-9379-9927-d39246e5e315.png)

# まとめ
GitHub連携のお陰でOSS活動が捗ります。特にプルリクエストがめちゃくちゃ便利で、いちいちブラウザ開いて送ってたのが馬鹿らしくなります。

明日は誰も居ないので多分お休みで、土曜日にまた私が書きます。それでは。
null文字とは何なのか、オール0ビット列とはなんなのか

null は 0x00 もしくは \0 のようなnull文字とはどう違うのか。

型が違うだのなんだのとあるがイマイチ。

オール0ビット列のバイト配列が欲しいと考えた時、それはnullでは無いのか？

```scala
scala> val x = '\u0000'
x: Char = ?

scala> printf("%c", x)

scala> printf("%s", x)

scala> val y = null
y: Null = null

scala> printf("%c", y)
null

scala> printf("%s", y)
null

scala> val z: Byte = 0x00
x: Byte = 0
scala> printf("%c", z)

scala> printf("%s", z)
0
```

頭がフットーしそうだよおっっ(੭ ˃̣̣̥ ω˂̣̣̥)੭ु⁾⁾

とりあえずオール0ビット列が欲しい時にnullではだめそう。
[Xcode6/7系全てで確認済]iOS開発のビルドを爆速(超絶簡単)にするポイントまとめ


Xcodeで開発を進めていくと画像やSDKや新規のライブラリ追加やCocoaPodsなどが原因で

<b>急激にXcodeのビルドが重くなってきます。(小規模開発でさえ、30秒〜1分近くなることも。。。)</b>


おそらく、僕と同じようなiOS開発を初めて間もない方もお困りだと思い、
自分が試した中で特に効果があった２つの施策を残しておこうと思います。

# 前提条件
 - Xcode6系

![スクリーンショット 2014-12-18 0.53.18.png](https://qiita-image-store.s3.amazonaws.com/0/15812/41cf5a2c-b530-5633-d12d-4b39d439cf9f.png "スクリーンショット 2014-12-18 0.53.18.png")
*代表してXcode6.1.1のスクショ。

- OSX 10.9.5

![スクリーンショット 2014-12-18 0.54.32.png](https://qiita-image-store.s3.amazonaws.com/0/15812/475d2086-e51a-915c-3fac-c30d71af0b39.png "スクリーンショット 2014-12-18 0.54.32.png")

- Swift version 1.1 (swift-600.0.56.1)

![スクリーンショット 2014-12-18 0.57.18.png](https://qiita-image-store.s3.amazonaws.com/0/15812/1a5a9858-7540-7609-c816-a1d50267c379.png "スクリーンショット 2014-12-18 0.57.18.png")

<br>


## 並列ビルドの設定をする(IDEの場合)

Xcodeはデフォルトだとシングルタスクでビルドを行います。
そのため、以下の手順で並列ビルドの設定を行います。

### 手順１・以下のコマンドを実行する

<b>コマンド</b>

```
defaults write com.apple.dt.Xcode IDEBuildOperationMaxNumberOfConcurrentCompileTasks <並列数>

```

<b>コマンド実行例</b>

```
defaults write com.apple.dt.Xcode IDEBuildOperationMaxNumberOfConcurrentCompileTasks 5

```

### 手順２・Xcodeを再起動する


<b>注意</b>
CLIでも実行する方法があるかと思いますが、私がXcode(IDE)をメインで使うため、IDE用のコマンドを実行しています。


<br>


## CocoaPodsのコンパイルをスキップする

Xcodeはデフォルトの場合、CocoaPodsもデバッグ実行時に毎回Podsのビルドが走る仕様になっています。
Podsは頻繁に変更を行うものではないため、全くビルドを行わないのは考えものですが、通常の開発ではこのビルドをスキップしましょう。


### 手順１・Xcodeのメニューから、「Product」->「Scheme」->「Edit Scheme」でスキーマの編集画面を開く


![スクリーンショット 2014-12-18 0.46.41.png](https://qiita-image-store.s3.amazonaws.com/0/15812/e55ab79c-4c86-2a85-80e5-b94dd3d14e55.png "スクリーンショット 2014-12-18 0.46.41.png")




### 手順２・編集ダイアログ上部のSchemeを、デバッグ実行に使うSchemeに変更

![スクリーンショット 2014-12-18 0.47.43.png](https://qiita-image-store.s3.amazonaws.com/0/15812/c6ad84ce-6f63-6f98-7fd8-2c42b8934e7e.png "スクリーンショット 2014-12-18 0.47.43.png")



### 手順３・左のリストから「Build」を選択し、右画面の「Find Implicit Dependencies」のチェックを外す

![スクリーンショット 2014-12-18 0.49.46.png](https://qiita-image-store.s3.amazonaws.com/0/15812/d63d2ade-2d9c-edac-ae83-9992d5b2910a.png "スクリーンショット 2014-12-18 0.49.46.png")

![スクリーンショット 2014-12-18 0.49.53.png](https://qiita-image-store.s3.amazonaws.com/0/15812/c5f8af3d-0eda-8166-f21a-ce50b47172d1.png "スクリーンショット 2014-12-18 0.49.53.png")



<b>注意</b>

 - リリース用のSchemeで行う際はリリース前に必ず時間をとって、「Find Implicit Dependancies」にチェックをつけて、「Clean」して「Build」をしてPodのビルドを行いましょう。
 - AWSのSDKを入れてる場合、

```
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```
というエラーが表示されてしまう。
サーバの移転でドメイン切替前に新サーバを参照する方法

Windowsでの方法

Windows7
C:\Windows\System32\drivers\etc
の中にある hosts ファイルを編集。

ただしこのままでは書き込み権限がないので
一旦別の場所にコピーしてから、上書きで戻す。

一番下に以下のように記述

```
999.999.999.999 hogehoge.com
999.999.999.999 www.hogehoge.com
```

最初の 999.999.999.999 は新サーバのIPアドレス。
後ろはドメイン名

これで指定のドメインでアクセスした時に、
このパソコンからは新サーバのIPアドレスを見に行くようになる。
Salesforce Mobile SDK(iOS)でのちょっとしたTips

知っておくと便利？なちょっとしたtips集。サンプルコードはObjective-Cです。

## OAuth2の認証情報を取り出したい

SDK経由でなく、生でリクエスト呼びたいなどに

```objc
SFOAuthCredentials *cred = [SFRestAPI sharedInstance].coordinator.credentials;

NSString *instanceUrl = cred.instanceUrl.absoluteString;
NSString *accessToken = cred.accessToken;
NSString *userId = cred.userId;
```

などが取れる。他は[SFOAuthCredentialsのドキュメント](http://forcedotcom.github.io/SalesforceMobileSDK-iOS/Documentation/SalesforceOAuth/SFOAuthCredentials_h/Classes/SFOAuthCredentials/index.html#HeaderDoc_props)参照。

## ApexRestで公開しているAPIを呼びたい

デフォルトだとURLの頭に`/services/data`を付けられてしまうので、`/services/apexrest`で始まるAPIが呼べない。`endpoint`を明示的に指定する必要がある。

```objc
SFRestRequest req = [SFRestRequest new];
req.method = @"GET";
req.path = path;  // apiのパス
req.endpoint = @"/services/apexrest"; // ここが重要！
req.queryParams = @{@"queryString": @"hoge"}; // パラメータを渡したい場合NSDictionaryで 
req.parseResponse = YES;  // レスポンスがJSONな場合はYES

[[SFRestAPI sharedInstance] sendRESTRequest:req failBlock:^(NSError *e) {
    // エラー時の処理
} completeBlock:^(NSDictionary *res) {    
    // 成功時の処理 (resにはパース済みのJSONが入ってる)
}];
```


## multipart/form-data形式でAPIを呼びたい

Chatter投稿で写真添付したい場合など。multipart/form-dataでJSONと写真を送らないといけないが、SDKにそういったメソッドがない。
`AFNetworking`を使ったサンプルコード。

```objc
AFHTTPRequestSerializer *serializer = [AFHTTPRequestSerializer new];

NSMutableURLRequest *req = [serializer multipartFormRequestWithMethod:@"POST" URLString:@"フルURL" parameters:nil constructingBodyWithBlock:^(AFMultipartFormData *data) {
    // このブロック内でmultipart/form-dataに追加したいpartを必要数分追加する


    // NSData *attachData = // 添付するファイルのバイナリデータ
    [formData appendPartWithFileData:attachData name:@"feedItemFileUpload" fileName:@"photo.jpg" mimeType:@"image/jpeg"];

    // 投稿の情報はJSONで別のpartとして追加
    NSMutableDictionary *segments = @{}.mutableCopy;
    NSMutableDictionary *body = @{@"body":@{@"messageSegments":segments}}.mutableCopy;
    [segments addObject:@{
        @"type":@"Text",
        @"text":@"投稿したいテキスト"
    }];

    body[@"attachment"] = @{
        @"attachmentType":@"NewFile",
        @"title":@"Photo"
    };

    NSData *json = [NSJSONSerialization dataWithJSONObject:body options: NSJSONWritingPrettyPrinted error: nil];
    [data appendPartWithHeaders:@{@"Content-Disposition":@"form-data; name=\"json\"", @"Content-Type":@"application/json; charset=UTF-8"} body:json];
} error:nil];

// 実際の呼び出し部分
AFHTTPRequestOperationManager *http = [AFHTTPRequestOperationManager new];
http.requestSerializer = serializer;
[serializer setValue:[NSString stringWithFormat:@"Bearer %@", accessToken] forHTTPHeaderField:@"Authorization"]; // 自前でAccessTokenを指定してやる
http.responseSerializer = [AFJSONResponseSerializer new];
    
AFHTTPRequestOperation *ope = [http HTTPRequestOperationWithRequest:req success:^(AFHTTPRequestOperation *operation, id responseObject) {
    // 成功時の処理
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    // 失敗時の処理
}];

// 忘れがち。別スレッドで実行開始！
[ope start];

```
rubyのインストール方法

# centosへrubyのインストールをしたのでメモ。

gitがインストールされている事を前提に。

https://github.com/sstephenson/rbenv

このサイトを参考に以下のコマンドをうっていく。

```
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
```

```
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
```

```
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
```

ここだけ、gitのrbenvに書いてあるのと違う。

```
$ exec ${SHELL} -l
```

ここまで、やるとrbenvがインストールされているはず。

```
$ rbenv
```

とコマンド入力するとインストールされている事が分かる。

続き手、rubyをインストール。

https://github.com/sstephenson/ruby-build

このサイトを参考にインストール。

```
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

これでrubyインストールの準備は完了。

```
$ rbenv install -l
```
で、インストールできるバージョンの確認。

（opensslなんちゃらがないとうまくいかないので、以下のコマンドを実行。パスワード聞かれて入力。）

```
sudo yum -y install openssl-devel
```

最新で安定しているのは2.1.5らしいので、これにする。


```
$ rbenv install -v 2.1.5
```

欲しいバージョンを正しく入力してインストール。
-vは途中経過を見れる。
結構時間がかかる。

rbenvを使ってインストールした後には、リハッシュさせる。

```
$ rbenv rehash
```

使用するバージョンを指定する。

```
$ rbenv global 2.1.5
```

使用されているバージョンを確認する。

```
$ rbenv versions
```

*印がついているバージョンが使用中。

```
$ ruby -v
```

と打つと、rubyが使用できる事が確認できた。
doorkeepr gem の CSRF 脆弱性が修正されてた


[doorkeepr gem に CSRF 脆弱性があり、いつの間にか修正されてました。](https://github.com/doorkeeper-gem/doorkeeper/pull/516)

[version 1.4.1 および 2.0 で修正されています。](https://github.com/doorkeeper-gem/doorkeeper/blob/master/CHANGELOG.md)

詳細は Pull Request に書いてあるとおりなのですが、

> phillbaker commented 8 days ago
>
Since the Doorkeeper controllers inherit from Doorkeeper::Application (which inherits directly from ActionController::Base) and not ApplicationController, they never call protect_from_forgery, which means that non-GET methods don’t validate CSRF tokens. Thus, it’s possible for an attacker to host a form on an arbitrary URL, and if a users is logged into a site that uses Doorkeeper visits the URL, the attacker can grant access to a application on that site.

皆さんご存知の通り、普通 Rails でアプリを作成すると、以下のように ```ApplicationController``` 内で ```protect_from_forgery``` が呼ばれます。

```app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
end
```

protect_from_forgery を呼んでおくと、フォームや Ajax のリクエストに対して Rails が勝手に token をくっつけてくれて、GET 以外のリクエストの場合、この token が想定したものと一致しない限りはセッションがリセットされます。

アプリの各コントローラは ApplicationController を継承するため、通常は特に何も意識せずに CSRF 対策が行われます。

### doorkeeper の場合

doorkeeper gem では、以下のように ActionController::Base を継承した独自の ApplicationController を定義し、さらに各コントローラでこれを継承しています。

```doorkeeper/app/controllers/doorkeeper/application_controller.rb
module Doorkeeper
  class ApplicationController < ActionController::Base
    include Helpers::Controller

    helper 'doorkeeper/dashboard'
  end
end
```

よく見ると、ここで protect_from_forgery 呼んでないですね。

ということで、上記の Pull Request で以下の様な変更が入っています。

```doorkeeper/app/controllers/doorkeeper/application_controller.rb
module Doorkeeper
  class ApplicationController < ActionController::Base
    include Helpers::Controller

    if ::Rails.version.to_i < 4
      protect_from_forgery
    else
      protect_from_forgery with: :exception
    end

    helper 'doorkeeper/dashboard'
  end
end
```


というわけで、みなさん早くバージョンアップしましょー。

### protect_from_forgery 補足

protect_from_forgery のリファレンスに以下の記載があります。

> protect_from_forgery(options = {})
Turn on request forgery protection. Bear in mind that only non-GET, HTML/JavaScript requests are checked.

protect_from_forgery でチェックされるのは GET 以外の、HTML/JavaScript からのリクエストだけだよー、ということです。

みなさん基本やってないと思いますが、改めて GET に対応したアクションでリソースの更新とかやっちゃだめってことですね。
iOSメモ - xibファイルで作成したCustomViewを生成しよう


**この記事は[LiT!関西 Advent Calendar 2014](http://www.adventar.org/calendars/607) 17日目の記事です。 LiT(Life is Tech!)とは中学生、高校生のためのプログラミング・ITキャンプ／スクールのことであり、このアドベントカレンダーは、LiT所属の大学生メンターが書いています。**

# xibファイル...?

[xibと.nibの違い](http://synsize.tumblr.com/post/437678604/xib-nib)

# ファイルを追加します

![スクリーンショット 2014-12-18 0.15.15.png](https://qiita-image-store.s3.amazonaws.com/0/14262/e2800f97-8cab-f2f0-ab60-a8c7940ae2a2.png "スクリーンショット 2014-12-18 0.15.15.png")

# iOS/User InterfaceからViewを選びます、CustomViewと名づけましょう。

![スクリーンショット 2014-12-18 0.13.37.png](https://qiita-image-store.s3.amazonaws.com/0/14262/3c03a272-3338-7a83-699b-ab77c447cabd.png "スクリーンショット 2014-12-18 0.13.37.png")

# Viewは固定Sizeになっているかと思うので、SizeをFreedomにし、

![スクリーンショット 2014-12-17 23.55.17.png](https://qiita-image-store.s3.amazonaws.com/0/14262/19f24092-d4bc-887e-7be0-27e61118123f.png "スクリーンショット 2014-12-17 23.55.17.png")

# ここでは、100x100にしておきます。

![スクリーンショット 2014-12-17 23.55.35.png](https://qiita-image-store.s3.amazonaws.com/0/14262/7716089f-87c0-9723-9770-5372c4e6b1aa.png "スクリーンショット 2014-12-17 23.55.35.png")

```Objective-C:ここが重要、先ほど名付けたCustomView、typoしないように...
UIView *subview = [[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:self options:nil][0];
```

# せっかくなのでbackgroundColor変えましょう

```Objc
#import "ViewController.h"

@interface ViewController (){
    int count;
}

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

}

- (IBAction)addCustomView{
    count++;
    UIView *subview = [[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:self options:nil][0];
    subview.frame = CGRectMake(100, count * 100, 100, 100);
    
    [self setRandomColor:subview];
    [self.view addSubview:subview];
}

- (void)setRandomColor:(UIView *)subview {
    CGFloat hue = ( arc4random() % 256 / 256.0 );  //  0.0 to 1.0
    CGFloat saturation = ( arc4random() % 128 / 256.0 ) + 0.5;  //  0.5 to 1.0, away from white
    CGFloat brightness = ( arc4random() % 128 / 256.0 ) + 0.5;  //  0.5 to 1.0, away from black
    UIColor *color = [UIColor colorWithHue:hue saturation:saturation brightness:brightness alpha:1];
    subview.backgroundColor = color;
}

@end
```

# 関連付けを忘れずに、Buttonを押したら簡単に生成できます。

![スクリーンショット 2014-12-18 0.08.53.png](https://qiita-image-store.s3.amazonaws.com/0/14262/30d87183-5405-4624-0f0c-02deb405937c.png "スクリーンショット 2014-12-18 0.08.53.png")

上手く使って再利用していきたい

# *補足：CustomTableViewCell.xibも登録してCellを再利用しています。

```objc
- (void)viewDidLoad {
    [super viewDidLoad];
    UINib *nib = [UINib nibWithNibName:@"CustomTableViewCell" bundle:nil];
    [self.tableView registerNib:nib forCellReuseIdentifier:@"Cell"];
}
```
calfwの活用について

Emacsにて、niceなカレンダービューを提供する calfw.el の近況と、いくつかの活用方法についてご紹介します。

# calfw.el とは？

calfw.elは、Emacsのバッファ上で、下図のような操作可能なカレンダーを表示するプログラムです。

![calfw画面イメージ](https://cacoo.com/diagrams/OnjKgBHat0kHs0xp-9E5E0.png)

期間スケジュールの表示や祝日、月だけでなく1/2週間のビュー切り替えなど、よくあるカレンダーアプリと同様の動きが出来ます。もちろん、Emacsとして期待される、キーバインドや色などカスタマイズなども可能です。詳細は以下の紹介記事やgithubのREADMEを参照してください。

- [Emacs用カレンダー calfw v1.2 リリース](http://d.hatena.ne.jp/kiwanami/20110723/1311434175) (2011年当時の紹介記事)
- https://github.com/kiwanami/emacs-calfw

ちなみに、Vimでもitchynyさんの[すごいカレンダー](http://itchyny.hatenablog.com/entry/20140108/1389164688)があります。

# 近況

目に見える大きな機能は2011年のリリース当時からあまり変わっていません。いろいろご要望はいただくのですが、なかなか手が付けられずにいます。すみません。

昨年8月に[すごいPull-Request](https://github.com/kiwanami/emacs-calfw/commit/4ee6d371011c1a311ea7af1ea410d28d02e5cff1)を頂きまして、内部構造がかなりパワーアップしました。この修正により、スケジュールを格納するイベントオブジェクトを定義することによって、スケジュールの時刻を格納することが出来るようになり、また単発のスケジュールと期間スケジュールを統一して扱えるようになりました。すごく自然です。断然スケジュールのソースを書きやすくなりました。

```lisp
;; This structure defines calendar events.
(defstruct cfw:event
  title       ; event title [string]
  start-date  ; start date of the event [cfw:date]
  start-time  ; start time of the event (optional)
  end-date    ; end date of the event [cfw:date] (optional)
  end-time    ; end of the event (optional)
  description ; event description [string] (optional)
  location    ; location [strting] (optional)
  source      ; [internal] source of the event
  )
```

READMEでは、まだこの部分のドキュメントが反映されていませんが、興味のある方はPRのコメントを参照してください。

# 活用例

標準で Emacs 標準のdiaryとorgmode、howmとiCalendar（※繰り返しは未対応）に対応しています。Google Calendarとの連携は、sheepheadさんの[こちらの記事](http://sheephead.homelinux.org/2014/03/15/7035/)を参照してください。

その他、いくつかの活用をご紹介します。

## git log の可視化

gitの作業ログをカレンダーで見れると、自分の作業の振り返りにもなって便利です。
以下のgistのコードをインストールして、お手持ちのgitのプロジェクト上で `M-x cfw:git-open-calendar` すると、カレンダーにコミットログが表示されます。

- https://gist.github.com/kiwanami/d77d9669440f3336bb9d

![calendar for gitlog](https://gist.github.com/kiwanami/d77d9669440f3336bb9d/raw/c18eac21c619d26fb572f16e655af128e4a208de/calfw-gitlog.png)

## Web API との接続

最近はデータがWeb上にあることも多いと思いますので、よく使うAPIとつなげてカレンダーに表示することでとても生活が豊かになります。

たとえば、下のgistのように、[しょぼいカレンダー](http://cal.syoboi.jp/)から番組のデータを取って来て、Emacsに表示してみると、以下のようになります。

- https://gist.github.com/kiwanami/1fd257fc1e8907d4d92e
- `M-x syb:open-calendar-syobocal`

![calendar for syoboi](https://gist.github.com/kiwanami/1fd257fc1e8907d4d92e/raw/bbce069f09b8054e3aa366b2a8d0f8b135653586/calfw-syoboi.png)

これで、コーディング中でも、サッと見たい情報を確認できて便利ですね。

現状ではcalfwのデータソースに非同期更新用のAPIが無いため、ちょっと無理矢理感がありますが、そのうちスマートなAPIを用意するかも知れません。



他にも、日付と関連付くものなら何でも表示できますので、是非Emacsをお使いのみなさんも試してみてください。
Android WearでBluetooth接続でのADBが認証できなくなった


Android Wearを初期化したらWear側のADBを有効化＋Bluetooth経由のデバッグを有効化しても繋がらなくなる現象に悩んだのでメモ

症状
===

普段は以下のコマンドでhandheld側のアプリでホストとターゲットが接続中となる。

``` いつもの接続コマンド
$ adb forward tcp:4444 localabstract:/adb-hub
$ adb connect localhost:4444
```

しかし、Wearを初期化したらあとでは、"adb devices"で確認すると以下な感じになった。(****は環境によって違う)

``` adbで認識してるデバイスのチェック
$ adb devices
List of devices attached
***********	    device
localhost:4444	unauthorized
```

原因
====

初回接続時にはhandheld側に

「Wearのデバッグを許可しますか？」

といったタイトルのRSAキーのフィンガープリントを登録するダイアログが出ているハズなのだが、初期化前の段階で

「このパソコンからのUSBデバッグを常に許可する」

にチェックを入れてしまっていると、前の情報を覚えているようで全く許可出来る雰囲気が無い。なので、この情報を消してやる必要がある。

復活の呪文
========

自分は以下の手順で復活出来た。

1. Android WearのBluetooth経由でのデバッグをOFF
1. Android Wearの電源を切る
1. 設定→アプリ→すべて→Google Play開発者サービス→データを全て消去 
1. 念のため、handheld側のAndroid wearアプリを削除→再インストール
1. Android Wearを再起動
1. handheldとwearを再接続
1. 認証画面が来て(ﾟдﾟ)ｳﾏｰ
aura:iterationとデータ変更の検出

コンポーネントにイベントの設定をすることで、データ変更の検出ができるそうです、ドキュメントにはその例として、aura:iterationコンポーネントを参照してください、と記載がありました。試してみたいと思います。

```xml:component.cmp
<aura:component>
    <aura:attribute name="items" type="List" default="a,b,c,d,e" />
    
    <table class="numbers">
        <tr><th>#</th><th>name</th></tr>
    <aura:iteration items="{!v.items}" var="item" indexVar="index">
        <tr>
            <td>{!index}</td>
            <aura:renderIf isTrue="{!index % 2 == 1}">
                <td class="number-odd">{!item} は奇数番目</td>
                <aura:set attribute="else">
                    <td class="number-even">{!item} は偶数番目</td>
                </aura:set>
            </aura:renderIf>
        </tr>
    </aura:iteration>
    </table>
    
    <ui:button press="{!c.updateItems}" label="update" />
```
```js:controller.js
({
    updateItems: function(cmp, evt, hlp) {
        var old_items = cmp.get('v.items');
        console.log('old values=' + old_items);

        var new_items = ['e','d','c','b','a'];
        /*
        var new_items = old_items[0] == 'a' ? ['f','e','d','c','b'] 
        	: ['a','b','c','d','e'];
        */
        console.log('new values=' + new_items);
        cmp.set("v.items", new_items);
    }
})
```

ボタンを押すと、見事自動的に反対向きになりました。
…ん、indexの並びも変わりましたね。そういう仕様なのでしょうか？

![スクリーンショット 2014-12-16 21.08.10.png](https://qiita-image-store.s3.amazonaws.com/0/44645/29861c59-0416-d850-c25f-eeeba45f6817.png)

それでは、今度は、2パターンで交互に変わるようにしてみましょう。上のコードブロックのコメントアウトされている方を有効にしてみます。

![スクリーンショット 2014-12-16 21.10.52.png](https://qiita-image-store.s3.amazonaws.com/0/44645/223f0d82-c0de-585f-6da3-9087d7486654.png)

updateボタンを押すと、

![スクリーンショット 2014-12-16 21.10.42.png](https://qiita-image-store.s3.amazonaws.com/0/44645/007d677e-f635-823c-8186-bb9c8cb4df54.png)

むむむ？
もう一度押すと、

![スクリーンショット 2014-12-16 21.10.58.png](https://qiita-image-store.s3.amazonaws.com/0/44645/0702b51c-24fb-4f75-3315-bb9c50c1b36a.png)

消えた！
ついでに`Uncaught TypeError: Cannot read property 'appendChild' of null`とかエラーも出てるんですけども…。

うーん…使い方が間違っているのかもしれませんが、予期しない挙動でした。

という訳で、`aura:iteration`タグには注意した方が良さそう、ということと、イベントの実装は結構難しそう、というのが今日の結論です。