OmniAICreator/Qiita-1.07M huggingface dataset:
IBM Bluemix で IoT (2) - Raspberry PiでIoT Lチカ

[前回](http://qiita.com/f_nishio/items/0b5161207a110f7bbef4)でpythonからのpublish/subscribeができたので、Raspberry PiでIoT版Lチカをやってみる。プロトタイプのコードは github [fnishio/mqtt-sample](https://github.com/fnishio/mqtt-sample)を参照。

IoT版Lチカ
============
Android Phoneでボタンを押すと、IoT FoundationにつながっているRaspberry PiのLEDが点灯/消灯する。

- RasbperriPi側
  - MQTT で toggle コマンドを受け取るたびに、LEDのoff/onを切り替
- コントローラ側
  -  [Do Button](https://ifttt.com/products/do/button)を使ってWeb APIにアクセスする。
- サービス側
  - Web APIを叩かれるたびに、APIで指定されたIDの機器に対してtoggleコマンドをpublishする。


Raspberry Pi側
----------------

### 接続機器の登録 ###
IoT Foundationのdashboardを開いて接続する機器を登録する。
登録後に表示される認証用のAuthentication TokenはMQTT Broker接続時の認証パスワードとして使う。
![device_reg.png](https://qiita-image-store.s3.amazonaws.com/0/88598/be5320b3-fa7e-a05b-d43c-af09dd2ccf59.png)

### MQTT Brokerにつなぐ

```python:device2.py
client_id = "d:{org_id}:{type_id}:{device_id}"
endpoint = "{org_id}.messaging.internetofthings.ibmcloud.com"
client = mqtt.Client(client_id)
client.username_pw_set("use-token-auth", PASSWORD)
client.on_connect = on_connect
client.on_message = on_message
client.connect(endpoint, 1883)
```
``org_id, type_id, device_id, PASSWORD``はIoT Foundationへの登録情報を元に適切に設定する。


### Command Subscribe
- Brokerに接続したら`iot-2/cmd/led/fmt/json`をsubscribe
- `toggle`コマンドが来たらGPIO PINの状態を変える

```python:device2.py
def on_connect(client, userdata, flags, rc):
    client.subscribe("iot-2/cmd/led/fmt/json")

def on_message(client, userdata, msg):
    payload = json.loads(msg.payload.decode())
    if payload['cmd'] == "toggle":
       # control GPIO
       global on_off
       on_off = ~on_off
       GPIO.output(LED_PIN, on_off)
```

サービス側
------------

サービス側のアプリはNode-REDで以下のフローを実装。
![control_app_flow.png](https://qiita-image-store.s3.amazonaws.com/0/88598/eb30fcb4-f21d-30af-2be7-85b3b8e8bfdc.png)

### Web API
POSTで操作対象となる機器のdeviceIdを受け取る Web API。
![control_app_api.png](https://qiita-image-store.s3.amazonaws.com/0/88598/9980956f-f4f2-6632-ac3d-2f1d88fe933f.png)

| Method | URL    |
|--------|---------------|
| POST   | led/v1/toggle |

| Type | Params | Valuse | Description |
|------|--------|--------|------|
| json | deviceId | string | 操作対象のdevice ID |


### Command payload
toggle操作を行うcommand payloadを組み立てる。
![control_app_toggle.png](https://qiita-image-store.s3.amazonaws.com/0/88598/5b1bb881-8322-45b2-c4e6-a07c269a462b.png)

### Command publish
`deviceId` の機器に対して、トピック`iot-2/cmd/led/fmt/json`にコマンドをpublishする。
![control_app_out.png](https://qiita-image-store.s3.amazonaws.com/0/88598/74b9fa54-e3f8-5fde-0cfd-0e28940a9937.png)

Controller側
-------------
Do Buttonで`/led/v1/toggle`のWebAPIに、制御対象となる機器のdeviceIdをPOSTする。

### Recipe
Do ButtonにRecipeを設定。
![controller_recipe.png](https://qiita-image-store.s3.amazonaws.com/0/88598/f784f3c5-617e-4ebe-dd38-2fa7e38ca000.png)

実行
----------
[![実行の様子](http://img.youtube.com/vi/86hy7KFcd88/0.jpg)](http://www.youtube.com/watch?v=86hy7KFcd88)
LDAP 構築メモ

#オブジェクトクラス
inetOrgPerson：RFC2798 で 定 義 さ れ る、組織に所属する人々を表すためのオブジェ クトクラス
posixAccount：RFC2307 で 定 義 さ れ る、Network Information Service(NIS)で表されるユーザアカウントのオブジェクト

#OpenLDAP にデフォルトで用意されているスキーマ
collective: 集合属性を作成するためのスキーマ(RFC3671)
corba: CORBA オブジェクトを扱うためのスキーマ(RFC2714)
core: LDAPv3 サーバとして必須のオブジェクトを定義するスキーマRFC2252/2256)
cosine: X.500 と COSINE で定義されるスキーマ(RFC1274)
duaconf: DUA 用のスキーマ
dyngroup: dyngroup オーバーレイ用のスキーマ
inetorgperson: 組織内の人物を示すスキーマ(RFC2798)
java: Java オブジェクト用のスキーマ(RFC2713)
misc 実験中の機能用のスキーマ
nis NIS オブジェクト用のスキーマ(RFC2307)
openldap: サーバ情報を投入するためのスキーマ
pmi: X.509 用のスキーマ
policy: ppolicy オーバーレイ用のスキーマ
Nexus 9 に Android M Developer Preview を入れる


執筆時点で「Android M Developer Preview」が公開されていますが、Nexus 9 ではイメージファイル同梱の `flash-all.sh` を実行するとエラーが出てインストールすることができません。

```sh
archive does not contain 'boot.sig'
archive does not contain 'recovery.sig'
fastboot(2741,0xa0bba1d4) malloc: *** mach_vm_map(size=1896779776) failed (error code=3)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
failed to allocate 1894884608 bytes
error: update package missing system.img
```

このため、ちょっとした作業が必要ですが、ハマったので備考のためにも記録します。他のスマートな方法もあるかもしれません。

なお、環境は OS X Yosemite で、adbが使える状態にあることが前提です。

また、今回が初投稿なので多めに見ていただけると助かります。

# 準備段階

## 端末のアップデート（5.1.1）

必要ないかもしれませんが、文鎮化した例が報告されているので、念のためにアップデートしてください。
私はこれが原因かどうかはわかりませんが、5.0.1 から M にアップデートしようとして一度失敗したため、5.1.1 を入れ直しました。

## adb のアップデート

これも念のために。

## イメージのダウンロードと解凍

[ダウンロード | Android Developers](http://developer.android.com/intl/ja/preview/download.html) からダウンロードできます。執筆時点では `volantis-MPZ79M-preview-9f305342.tgz` に該当します。

任意の場所に解凍した後そのディレクトリに移動し、`image-volantis-XXXXXX,zip`（執筆時点では`image-volantis-MPZ79M.zip`）を解凍し、`flash-all.sh`と同じディレクトリに展開してください。

# 本作業

Mac と Nexus 9 を接続してください。

## ブートローダーの起動とアンロック

電源ボタンとボリュームキー下（マイナス）を同時長押しするか、`adb reboot bootloader` でブートローダーを起動してください。

なお、HTC製のNexus 9は通常のブートローダーの他に、 **HBOOT** という独自のブートローダーがありますが、前者を選択してください（画面に **FASTBOOT USB** と赤背景の白文字で出ていれば通常のブートローダーで、かつ接続されています）。

ここで、アンロックしていない場合は `fastboot oem unlock` でアンロックしてください。Nexus 9側でYes/Noが求められるので、ボリュームキー上でYesを選択します。

## イメージを焼く

ターミナルから以下の順序に実行します。systemなどは終わるまでに時間がかかります。あと、 *Nexus 6のイメージとは一部コマンドやファイル名が違っています* （これでハマりました……）。

1. `./flash-base.sh`
2. `fastboot flash recovery recovery.img`
3. `fastboot flash boot boot.img`
4. `fastboot flash system system.img`
5. `fastboot flash vendor vendor.img`
6. `fastboot flash cache cache.img`

あとは `fastboot reboot` で再起動してください。お疲れさまでした。

# 参考

* [How To Install Android M On Nexus Devices](http://www.digitaltrends.com/mobile/how-to-install-the-android-m-developer-preview-on-your-nexus-device/6/#flash)
* [「Android M Developer Preview」公開 -インストール方法解説(Nexus 9)- | Remote TestKit - スマホアプリ・サイト・デザインの実機検証と自動テスト](https://appkitbox.com/testkit/column/android-m-developer-preview-nexus9)
pythonでコマンド待ち受けツールを作ってみる

## はじめに

pythonには[`cmd`](http://docs.python.jp/2/library/cmd.html)という非常に便利なクラスがある。これは簡単に言うと、オリジナルなコマンド待ち受けが作れてしまう。特に自分が気にっているのはアクションの補完機能が勝手に付加されるところ。

何かシンプルなツールを作る時、それは何かのファイルをパースしたり、簡単なデータを送ったり、もちろん普通にスクリプトで書いてもいいと思う。もし、シェルスクリプトなどで作るのが飽きたならば、気分転換でpythonの`cmd`クラスを使ってみてもいいかもしれない。

## 実装

ここではシンプルな実装にする。

``` python
from cmd import Cmd

class testCmd(Cmd):
	prompt = "hoge) "
    def __init__(self):
        Cmd.__init__(self)

	def do_exe(self, arg):
		print "do anything"

	def help_exe(self):
		print "help : exe"

if __name__ == '__main__':
	testCmd().cmdloop()
```
by [gist](https://gist.github.com/caad1229/d4c807daa2d0484e4663)

### 簡単な説明

- `prompt` : 待ち受けプロンプトの文字列。設定しなければ`(Cmd)`になる。
- `do_xxxx` : プロンプトで`xxx`と入力するとコール。
- `help_xxxx` : プロンプトで`help xxx`と入力するとコールされる。

## 実行

実行すると以下のような待ち受けプロンプトになる。

```bash
hoge)
```

定義したアクションおよび、ヘルプを呼び出してみる

```bash
hoge) exe
	do anything
hoge) help exe
	help : exe
```

`tab`キーを押すと補完機能が味わえる

```bash
hoge)
	exe   help
```

## おしまい

その他、unknownコマンド(`default`)や空白入力時(`emptyline`)などをオーバーライドすればよりユーザビリティが高いスクリプトになると思います。詳しくは[公式ドキュメント](http://docs.python.jp/2/library/cmd.html)で。

こういった簡単に便利なツールが作れるのはpythonのいいところですね。
Laravel5.1 を docker で動かすメモ


docker toolkit ってのが出来て、Mac上でも `docker rmi` とかコマンドが使えるようになったので、それついでに docker-compose で Laravel5.1 を docker上で動かしてみるテスト。

参考: http://qiita.com/tkyk@github/items/2f3ec0bb1ebe398af75f

## ハマッタ点

1. laravel/storage 以下のパーミッションを、dockerの apache とパーミッションを合わすのが面倒だったので、 777 にしておく。

## 必要だなぁと思う点

sqlファイルが有れば読み込み、なければ migration をするような処理があればいいなぁ？




github: https://github.com/a-yasui/docker-compose-laravel
連想配列を見たまま文字列の状態でコンソールに書き出す

#何がしたいのか

例えば下記の様なオブジェクトがあります。

```js
var testObj = {
  top:{
    a: 1,
    b: {
      ba:1,
      bb:"bbtext"
    },
    c:{
      ca:1,
      cb:[1,2,3],
      cc:3,
      cd:{
        cda:1,
        cdb:2
      }
    }
  }
}
console.log(testObj);
```

この結果をブラウザの開発ツールで見ると、いい感じに表示してくれてしまいます。
chromeだとこんな感じ。

![log.png](https://qiita-image-store.s3.amazonaws.com/0/39655/c2316947-a589-5ba9-00e8-f058b93335fb.png)

普段は見やすく使いやすく有り難いのですが、そのままコピペ出来る見たままの文字列が欲しくなる時が有ります。
処理の結果として返ってきたオブジェクトをブログやドキュメントに貼付けておきたい場合などです。
最近Qiitaを初めたばかりなのですが、既に何回か出くわしました。

あと、APIの仕様でjsonを文字列として投げたい時。
今出くわして、自分の記事にたどり着きました。


# 書いた
consoleの中にそんな機能は無さそうだったので、書いてみたんですが、
コメントで簡単な方法を教えて頂きました。

```js
console.log(JSON.stringify(testObj,null,'\t'));
```
圧倒的に楽です。
`JSON.parse()` の逆向きですね。
確かに有りそうな関数なのに調べるにも至りませんでした。。

で、こっちが自分が書いたもの。車輪の再発明。
今や大して意味は無いですが一応。

```js
/**
連想配列を文字列に整形してコンソールに表示
* @method console.hash
* @param {hash} obj 処理対象のオブジェクト
* @method format 連想配列を文字列に整形
* @property {number} length オブジェクト全体の数
* @property {number} count 整形処理をの終わったオブジェクト数
* @property {string} outText コンソールに書き出すテキスト
*/
console.hash = function(obj) {
  this.length = Object.keys(obj).length;
  this.count = 0;
  this.outText = "{\n";
  /**
  * @param {hash} obj 処理対象のオブジェクト
  * @param {number} times 処理中オブジェクトの階層
  */
  this.format = function(obj,times){
    var i = 0;
    var _objlength = Object.keys(obj).length;
    for(key in obj){
      i++;
      //階層分のタブを追加
      var tabs = "";
      for(var j = 0; j < times+1; j++){
        tabs += "\t";
      }
      this.outText += tabs + key + ":";
      if(typeof obj[key] == "object"){
        this.outText += "{" + "\n";
        //下層のオブジェクト数を足す
        this.length += Object.keys(obj[key]).length;
        //再帰処理
        this.format(obj[key],times+1);
        if(i == _objlength){
          this.outText += tabs.replace(/(\t?).$/,'$1') + "}\n";
        }
        this.count++;
      }else{
        this.outText += obj[key];
        if(i != _objlength){
          this.outText += ",\n";
        }else{
          this.outText += "\n" + tabs.replace(/(\t?).$/,'$1') + "}\n";
        }
        this.count++;
      }
    }
    if(this.length == this.count){
      console.log(this.outText);
    }
  }
  this.format(obj,0);
}
console.hash(testObj);
```

下層も配列の場合には再帰的に処理を繰り返し、全ての処理が終わった段階で`console.log`で結果を書き出しています。
また下層まで全てのオブジェクトの総数を一発で求める事が出来ず、処理の中で都度`this.length`に足していっています。

結果はこちら。

```js
{
	top:{
		a:1,
		b:{
			ba:1,
			bb:bbtext
		}
		c:{
			ca:1,
			cb:{
				0:1,
				1:2,
				2:3
			}
			cc:3,
			cd:{
				cda:1,
				cdb:2
			}
		}
	}
}
```

このコピペがしたかった事です。小さな事だけど便利。
オブジェクトの中身に関数とかクラスが入っていると上手く表示されないと思います。

---

テストやドキュメント製作の為にconsoleクラスを拡張するライブラリとかあればいいなと思いました。
皆様オレオレconsoleクラスを持っていたりするんだろうか。

あと再帰処理は書いていて楽しい。
【svn】基本コマンド


## svnの情報表示

```
svn info
```

__ディレクトリ指定__

```
svn info {dir}
```


## ステータス表示

```
svn st
```

__ディレクトリ指定__

```
svn st
```

|記号|意味|
|:-----------|:------------|
|' '|変更なし|
|A|追加されたファイル|
|D|削除されたファイル|
|M|修正されたファイル|
|C|競合しているファイル|
|I|無視されているファイル|
|?|管理下にないファイル|
|!|失われたファイル|
|+|コミット準備完了のファイル|



## チェックアウト

```
svn co {url}
```

__ディレクトリ指定__

```
svn co {url} {dir}
```



## ログ

```
svn log
```

__ファイル、ディレクトリ指定__

```
svn log {url/dir,file}
```

__リビジョン指定__

```
// r999から最新まで
svn log -r 999:HEAD
```


__最新10件表示__

```
svn log -l 10
```

__変更のあったファイルも表示する__

```
svn log -v
```

__差分も表示する__

```
svn log --diff	
```



## 差分

```
svn diff 
```

__リビジョン間の差分__

```
svn diff -r r999:r1000
```

__特定パスのリビジョン間の差分__

```
svn diff -r r999:r1000 {dir/file}
```

__差分のファイル名表示__

```
svn diff --summarize -r r999:r1000
```

__改行コードを無視__

```
svn diff -x --ignore-eol-style {file}
```



## ファイル一覧表示

```
svn ls
```

__詳細に表示__

```
svn ls -v
```

__ディレクトリ指定__

```
svn ls {dir}
```



## ファイルの登録

```
svn add {dir,file}
```

__取り消し__

```
svn revert {dir,file}
```


## ファイルの削除

```
svn del {dir,file}
```



## 更新を取り込む

```
svn up
```

__ディレクトリ指定__


```
svn up {dir}
```



## コミット
※ アップデートしないと、ログに反映されない

```
svn ci && svn up
```

__メッセージを指定__

```
svn ci -m 'message' && svn up
```



## 編集の取り消し

```
svn revert {file}
```



## ブランチの作成

```
svn copy {url}/branches/hoge -m 'message'
```



## タグを切る

```
svn tag {url}/tags/hoge -m 'message'
```



## 作業ディレクトリの切り替え

```
svn sw {url}/branches/hoge
```



## マージ


現在の作業ディレクトリがtrunk
ブランチをtrunkにマージする場合

```
svn merge -r 999:HEAD {url}/branches/hoge
svn ci -m 'merge message'
```

__merge内容を確認__

実際にmergeは行われず、mergeした場合の内容が表示される
基本的には`--dry-run`を走らせてから、mergeを行う

```
svn merge --dry-run {url}
```

__特定ファイルを特定リビジョンに戻す__

```
svn merge -r[現在のリビジョン]:[戻したいリビジョン] {file_path}
```

__merge時のコマンド__

|コマンド|内容|
|:----|:----|
|(p) postpone|競合を後で解決|
|(df) diff-full|マージしたファイルに加えたすべての変更を表示|
|(e) edit|マージされたファイルをエディターで解決する|
|(mc) mine-conflict|作業側の内容を正として競合を解決する (branchからtrunkをmergeした場合はbranch側を正)|
|(tc) theirs-conflict|相手側を正として競合を解決する (branchからtrunkをmergeした場合はtrunk側を正)|
|(r) resolved|競合の解決|


## 競合の解決
`svn merge`時にpostpone(競合を後で解決)をし、後で解決した場合以下のコマンドで競合を解決できる

```
svn resolved {file}
```


## zsh設定
個人的なzshの設定

```
# for svn
alias svn="colorsvn"
alias sst='svn st'
alias sad='svn add'
alias sup='svn up'
alias sci='svn ci'
alias sco='svn co'
alias sin='svn info'
alias sme='svn merge'
alias sre='svn revert'
alias sdl='svn del'

# svn log limit
sl(){
	svn log -l $1 -v
}

# svn diff
sdi(){
	svn diff -x --ignore-eol-style $1 | vim -R -
}
```

# その他のコマンド
使う時があったら更新していく予定。。

blame (praise, annotate, ann)
cat
changelist (cl)
cleanup
export
import
lock
mergeinfo
mkdir
move (mv, rename, ren)
patch
propdel (pdel, pd)
propedit (pedit, pe)
propget (pget, pg)
proplist (plist, pl)
propset (pset, ps)
relocate
resolve
unlock
upgrade
Laravel5.1でgmail経由でメール送信


##やりたいこと

Laravelでメール送信する際のSMTPにgamilを利用したい。

##やり方

###アプリ固有のパスワードを取得

最近のGmailは、アプリ等でSMTPを利用する際は、[「アプリ固有のパスワード」](https://support.google.com/mail/answer/1173270?hl=ja)を取得する必要がある。

>パスワードはGoogleで発行されるものなので、忘れたら一度消して再発行すればよい。

###.envの設定

設定自体は.envに記述する。

```bash
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=xxxxxx@gmail.com
MAIL_PASSWORD=xxxxxxxxxxxxxxx
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=from@emai.com
MAIL_FROM_NAME=Hoge Foo
```

###config/mail.php

設定の本体はconfi/mail.phpとなる。

必要な要素をきちんと記述する。
MAIL_FROM_ADDREDSSがnullになっているが、設定しないといけないようなので、env('MAIL_FROM_ADDRESS', null)が代入されるようにする。NAMEは必須ではないよう。

mail.php


```php
<?php

return [


    'driver' => env('MAIL_DRIVER', 'smtp'),


    'host' => env('MAIL_HOST', 'smtp.mailgun.org'),


    'port' => env('MAIL_PORT', 587),


    'from' => [
        //ここの設定を追加
        'address' => env('MAIL_FROM_ADDRESS', null),
        'name' => env('MAIL_FROM_NAME', null)
    ],


    'encryption' => env('MAIL_ENCRYPTION', 'tls'),


    'username' => env('MAIL_USERNAME'),


    'password' => env('MAIL_PASSWORD'),


    'sendmail' => '/usr/sbin/sendmail -bs',

];

```

###送信テスト

thinkerで送信テストができる。

```bash
php artisan tinker
```

```bash
>>> Mail::raw('test mail',function($message) {$message->to('to@mai.com')->subject('test');});
=> 1
```

=>1が返ってくればOK。

.envをいじったら一度tinkerコンソールを抜けないと反映されない。
SwiftでEvernoteアプリ 環境構築手順

Evernoteのアプリを作りたいと思って、まずは構築しようとしたけど、
いくつかハマったので自分用の構築手順を紹介する。

参考にさせていただいた記事は以下のとおり。
ありがとうございました。

*1 [SwiftからEvernote APIを使うのが予想外に面倒だったのでまとめました](http://yuumi3.hatenablog.com/entry/2014/12/16/153229)
*2 [Using the Evernote API from Swift](http://damianblog.com/2014/11/02/calling-evernote-api-from-swift/)
*3 [【iOS】BridgingHeaderの使い方と設定方法](http://tech.admax.ninja/2014/09/26/about-bridging-header/)


# 手順
## 1. Evernote Cloud SDK for iOSの追加
GithubからEvernote SDKをサブモジュールでダウンロードしてくる。
以下を実行するディレクトリはどこでも可。
ファイルが欲しいだけなので。
```
$ git submodule add https://github.com/evernote/evernote-cloud-sdk-ios.git
$ git submodule
```
*1の手順通り。zipでダウンロードしただけだと、後述のENSDKResources.bundleが落ちてこない。

## 2. ダウンロードしたファイルをプロジェクトへ追加する
以下の２つをプロジェクトに追加する。

* evernote-sdk-ios
* ENSDKResources.bundle

![screenshot1.png](https://qiita-image-store.s3.amazonaws.com/0/23504/0a9875ec-ac53-50b9-5274-745420ae3ba0.png)

## 3. 依存ライブラリの追加
以下の２つのフレームワーク・ライブラリを追加する。

 * MobileCoreServices.framework
 * libxml2.dylib

![screenshot2.png](https://qiita-image-store.s3.amazonaws.com/0/23504/28c227ef-bbc0-47f2-6241-211298022dfe.png)

あとで出てくるがTestsにも追加する。
Unit Testできるように。

## 4. BridgingHeaderファイルを追加
*3を参考にしてBridgingHeaderを追加する。
自動生成はせず、自分でiOSのhファイルを追加した。

![screenshot3.png](https://qiita-image-store.s3.amazonaws.com/0/23504/6e8c0b97-bfd5-2016-6890-1d9588fa0134.png)

これを追加。
```#import <ENSDK/ENSDK.h>```

## 5. Bridging Headerの設定追加
Objective-C Bridging Headerの設定を追加する。

![screenshot4.png](https://qiita-image-store.s3.amazonaws.com/0/23504/705ee83e-6463-ae0e-80fb-5efc6f3e2ba5.png)

EvernoteSwiftAssociate/EvernoteSwiftAssociate-Bridging-Header.h

プロジェクトがカレントディレクトリらしい。
パスを設定する。

## 6. Header Search Pathsの設定追加
Header Search Pathsの設定を追加する。

![screenshot5.png](https://qiita-image-store.s3.amazonaws.com/0/23504/16777292-a446-f9d2-113e-0af20b465107.png)

/usr/include/libxml2
${PROJECT_DIR}/EvernoteSwiftAssociate/evernote-sdk-ios

${PROJECT_DIR}で指定しているのは、
プロジェクトまでのパス。

## 7. Prefix Headerの設定追加
Prefix Headerの設定を追加する。

![screenshot6.png](https://qiita-image-store.s3.amazonaws.com/0/23504/96433f95-0f56-f2e7-87a9-9ae660f4700a.png)

${PROJECT_DIR}/EvernoteSwiftAssociate/evernote-sdk-ios/evernote-sdk-ios-Prefix.pch

6.と同じ。

## 8. Testsをターゲットにして設定追加
この状態でビルドするとこのようなエラーが表示される。

![screenshot7.png](https://qiita-image-store.s3.amazonaws.com/0/23504/5ae4a646-3db3-d5f2-2ca9-04a9875e91f5.png)

どうやらターゲットTestsでも同様に設定を追加する必要があるらしい。
というわけで、6.7.8の手順でTestsに対しても同様に設定する。

![screenshot8.png](https://qiita-image-store.s3.amazonaws.com/0/23504/92108027-c25c-b189-2776-c7bb13dfdddc.png)

ビルドするとエラーはなくなった模様。警告でてるけど、ひとまず気にしないとく。

## 9. 正常動作の確認
*1のサンプルコードを入れると、正常に動くことを確認できました。

![screenshot9.png](https://qiita-image-store.s3.amazonaws.com/0/23504/1c0323f0-d9dc-653d-5506-fe7753a9153e.png)

# まとめ
構築はできて、ノートをアプリから作ることはできた。
今後は、ノートの編集、削除、読み込みなどをやっていく。
余裕があれば情報を共有していきたい。

サンプルはGithubに挙げておきます。
[EvernoteSwiftAssociate](https://github.com/masakid/EvernoteSwiftAssociate)

それでは。
clang-format とコンパイルエラーが衝突した話

## コンパイルエラー

```cpp
#include <vector>
...
std::vector<std::vector<int>> hoge;
```

これを書くと

```
error: '>>' should be '> >' within a nested template argument list
```

こんなコンパイルエラーが出る。`>>` と `> >`は違うって意味ですね。

## clang-format

じゃあ、スペースを入れようとするとどうなるかというと、clang-formatによってスペースが消されます。clang-formatを掛けなければ良い話ではあるのですが、私はC++のコードを書くときはclang-formatを保存時に自動で動かすようにしているのでわざわざそれをするのは嫌です。

## 解決策

clang-formatの`-style`オプションに`{SpacesInAngles: true}`を指定すれば良い。すると、

```cpp
#include <vector>
...
std::vector< std::vector< int > > hoge;
```

こうなる。
解決！
Android Mのビルド設定で注意すること


Googleの予定では今月中にAndroid Mがリリースされますね。
そこでさっそく試してみたのですが、ビルドの設定ではまったので問題と対策を書いておきます。

# 問題

Android M対応にあたってbuild.gradleを以下のように設定すると思います。

```groovy:build.gradle
android {
    compileSdkVersion "android-MNC"
    buildToolsVersion "22.0.1"

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 22
    }
    
    ...
}
```

しかし、この設定でビルドをして、Android Mより前のOS端末にインストールすると、
次のエラーが出てインストールができません。minSdkVersionに14を指定しているのでAndroid 4.0.3以上の端末にインストールできるはずなのですが...

```
Failure [INSTALL_FAILED_OLDER_SDK]
```

そこで、APKの中にあるAndoridManifest.xmlを見ると、minSdkVersionとtargetSdkVersionがMNC(Android Mのコードネーム)に置き替えられてしまっていました。

```xml:AndroidManifest.xml
<uses-sdk
	android:minSdkVersion="MNC"
	android:targetSdkVersion="MNC">
```

これではAndroid MNCより前のOS端末にはインストールできません。
調べるとAndroidのissueに上がっていました。

- https://code.google.com/p/android/issues/detail?id=177382


# 解決策

解決策としては、先ほどのissueにも書いてあるのですが、コンパイル後のAndroidManifest.xmlの中身を書き替えることで対応します。

次の例ではminSdkVersionとtargetSdkVersionをそれぞれ置き替えています。


```groovy:build.gradle
android {

    ...
    
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            output.processManifest.doLast {
                def manifestOutFile = output.processManifest.manifestOutputFile
                def newFileContents = manifestOutFile.getText('UTF-8').replace("minSdkVersion=\"MNC\"", "minSdkVersion=\"14\"").replace("targetSdkVersion=\"MNC\"", "targetSdkVersion=\"22\"")
                manifestOutFile.write(newFileContents, 'UTF-8')
            }
        }
    }
}
```

こうすることでAndroid Mに対応しながら、それより前のOS端末にもインストールすることができます。これはあくまでこの問題が解決するまでの一時的な対応のため修正されることを期待しています！

まだまだAndroid Mについての実際にやってみた情報は少ないので他にも注意が必要そうです。
BluemixでAnalytics 〜dashDBをRから使ってみる


[前回](http://qiita.com/saboten10/items/bf9c2b342ea6dc5cdfb9)は、dashDBの管理画面を利用してSQLを発行する方法を試してみました。Web画面を利用しているのでなんだかまどろっこしいですが、まぁ、普通に利用できます。本格的に利用するのであれば外部から接続した方がいいかとは思いますが、クラウドの特徴を活かす意味ではWebブラウザだけで操作できると、世界中のどこからでも同じ操作ができるというメリットはあります。自分のPCを使う必要もないので出張とか楽になるかも。
今回は、いよいよdashDBに接続できるようにセットアップされたRを利用して作成したデータを利用できるようにしてみます。

##R Scripts
Web画面を利用してRを利用できる機能が準備されています。
管理画面のメニューを **Analytics->R Script**とたどります。

![スクリーンショット_2015-08-13_11_56_19.png](https://qiita-image-store.s3.amazonaws.com/0/89268/ca9639dd-11c7-c9a8-90ba-01cc1f0ca041.png "スクリーンショット_2015-08-13_11_56_19.png")

このR画面はあらかじめdashDBへ接続させるためのライブラリなども組み込まれているようで特に難しい設定なしにテーブルデータを利用できるようになっています。
メニューにはサンプルデータベースからデータを取得してグラフを表示するようなものが並んでいます。どういうことができるのか試してみてください。

###自分でRスクリプトを作ってみる
画面に表示されているプラスマークをクリックすると、データソースの選択用のウィンドウが開きます。このウィンドウでソーステーブルを指定します。ソーステーブルのカラムも選ぶことができます。
![スクリーンショット_2015-08-13_11_57_24.png](https://qiita-image-store.s3.amazonaws.com/0/89268/e4646ca5-6c0e-20da-3bfa-c9b35fa9db4b.png "スクリーンショット_2015-08-13_11_57_24.png")



選択し終えると、ソーステーブルからデータを取得して、Rのデータフレームへセットするところまでが自動的に記入されます。

サンプルでこんなスクリプトを書いてみました。

```
library(ibmdbR)
mycon <- idaConnect("BLUDB", "", "")
idaInit(mycon)

df1439441638046 <- as.data.frame(ida.data.frame('"DASH102187"."APPL_LOG"')[ ,c('DATE_STRING', 'ERAPSED_TIME', 'SERVER_NAME', 'SQL_ID', 'TIME_STRING')])
# この上の行までは自動生成されました。
# データフレームをファクターに分類
f<-factor(df1439441638046$SQL_ID)
# サマリーを表示
summary(f)
# グラフ化してみます
plot(f,main="call count by SQL_ID",xlab="SQL_ID",ylab="count")

```
実行してみます…
あれ？Plot結果が表示されません。同時に作成されていたPDFファイルのアイコンをクリックするとグラフがPDFファイル化されてダウンロードできます。
![スクリーンショット_2015-08-13_15_43_42.png](https://qiita-image-store.s3.amazonaws.com/0/89268/7667a27b-796e-262d-a39d-1073a30a870a.png "スクリーンショット_2015-08-13_15_43_42.png")


<p><img src="https://qiita-image-store.s3.amazonaws.com/0/89268/8ae5b69f-4ec7-b3d1-6b46-b9abe14cbc67.png"スクリーンショット_2015-08-13_15_46_18.png" alt="スクリーンショット_2015-08-13_15_46_18.png" width="600" /></p>


ちょっと変ですが、中に含まれるSQLごとの度数をヒストグラムにしています。
この画面をちょっと触ってみましたが、スクリプトを頭から実行しなくてはいけないので試行しながらスクリプトを作るときには不便。まぁ、出来上がっているスクリプトを実行するのであればファイルも保存できるし、読み出しもできるのでいいのかもしれません。

##R Studio
Rの統合環境であるR Studioが利用できます。画面の **R Studio**ボタンを押します。
あらためてログオン画面が表示され、ユーザー、パスワードを聞かれます。ログオンするためのユーザー、パスワードはmenuのConnectに書かれているユーザーとパスワードを利用します。それを利用してログオンしてください。（ちょっとしたトラップです。自分はBluemixのユーザーID,パスワードを何度も入力していました。）
Rスクリプトを利用するのであれば、Web管理画面ではなく、こちらの方がオススメです。

##次回
R Studioを使ってログデータを分析し、グラフを作成してみます。

***
シリーズ一覧
1.[BluemixでAnalytics 〜dashDBを作って見る](http://qiita.com/saboten10/items/75dce524abe42779e368)
2.[BluemixでAnalytics 〜dashDBにデータをロードしてみる](http://qiita.com/saboten10/items/74f4c2bd2b65c59df41c)
3.[BluemixでAnalytics 〜dashDBをSQLで操作してみる](http://qiita.com/saboten10/items/bf9c2b342ea6dc5cdfb9)
4.[BluemixでAnalytics 〜dashDBをRから使ってみる](http://qiita.com/saboten10/items/57c3ebb882656a9c5c35)
5.[BluemixでAnalytics 〜dashDBにR Studioから接続してみる](http://qiita.com/saboten10/items/ad537283fb1269ecb3fa)
僕の求めるキーボードが無い

# 用途
用途はプログラミングも含んでいるのでUSキーボード。
かつ自分は方向キー(矢印キー)を利用したショートカットをよく使う。

## ショートカット使用例
`cmd + (← or → or ↑ or ↓)`
カーソル移動(行頭行末移動)

`cmd + shift + (← or → or ↑ or ↓)`
カーソル移動と選択

`option + (← or → or ↑ or ↓)`
単語でカーソル移動

`option + shift + (← or → or ↑ or ↓)`
カーソル移動と選択

`R shift + (← or → or ↑ or ↓)`
片手で範囲選択

そのため、方向キーが無いHHKBとか省スペースタイプの高級キーボードがダメ。
方向キーはあるけど、右shiftキーの下に無いやつもダメ。
フルサイズのキーボードだと、でかすぎて横にマウスとかおきづらいからダメ。
できれば無線。
できればメカニカル(青軸)か静電容量無接点。

ほとんどの要求が満たされるのはmac純正のキーボード(パンタグラフ)か、HHKB lite2(メンブレン)。
いろいろ買いあさったけどmac純正のキーボードに落ち着くってのが悲しい。

# マウスは
MX-Revolution最強。
不満はあるけど、今はMX-Masterに落ち着いてる。
macのトラックパッドは優秀なので無くても良いけど。
unity > 自作 > FileDirSelector (v0.3.2)

http://qiita.com/7of9/items/e738333c4874d387bd08
をアップデートしてDirectory選択機能も追加した。

~~[github (v0.3)](https://github.com/yasokada/unity-150813-fileSelector/tree/Main_v0.3)~~

##使い方
Scene１の２つのボタンで使用している。
- File Select
- Dir Select

InputFieldにはサーチするDirectoryを指定する。
カレントディレクトリなら"."でいい。

![Scene1_unity_-_150813-fileSelector_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/520f00a7-1b88-32bd-04ae-17898dbdcb6f.jpeg)

Dir Selectを選択すると以下のディレクトリ選択画面になる。

![Scene1_unity_-_150813-fileSelector_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/77201351-5cec-4ddf-e92e-a761ce179b26.jpeg)

ディレクトリを選択すると、以下のようになる。

![Scene1_unity_-_150813-fileSelector_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/0083463a-9501-b2f0-82ba-53517111cbd6.jpeg)

さらにDir Selectを押すと"./Library"以下をサーチできる。


##v0.3.1
~~[github(v0.3.1)](https://github.com/yasokada/unity-150813-fileSelector/tree/Main_v0.3.1)~~

InputFieldの文字列を上のフォルダに変更するボタンを追加した。

![Scene1_unity_-_150813-fileSelector_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/b0685e67-671a-5ad7-0553-b949978dbb45.jpeg)


##v0.3.2
[github(v0.3.2)](https://github.com/yasokada/unity-150813-fileSelector/tree/Main_v0.3.2)

選択画面にCancelボタンを追加した。

![Scene1_unity_-_150813-fileSelector_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/ed93f0a3-1374-cc0d-5189-ef65c63653ed.jpeg)
AngularJS のディレクティブのコントローラでインジェクトするサービスを動的に決めるには

AngularJS のディレクティブコントローラでインジェクトするサービスをディレクティブの属性で指定して決めるのに、link で 該当タグの HTML 属性からインジェクトしたいサービスの文字列を取得し、 $injector.get を呼び出すコントローラのメソッドを実行しました。以下のコードは Angular v1.4.1, ES6 です。

```.html
<my-hoge filter="AaaFilter"></my-hoge>
```

```.javascript
class HogeDirectiveController {
  constructor($injector) {
    this.$injector = $injector;
  }
  setFilter(filter) {
    this.filter = this.$injector.get(filter);
  }
}

HogeDirectiveController.$inject = ['$injector'];


function HogeDirective($parse) {
  return {
    restrict: 'E',
    controller: HogeDirectiveController,
    controllerAs: 'dctrl',
    scope: {},
    link: function (scope, element, attrs, controller) {
      scope.dctrl.setFilter(attrs.filter);
    },
    template: `
  <input ng-model="dctrl.filter.piyopiyo">
`
  };
}

angular.module('MyAdmin').directive('myHoge', HogeDirective)
export default HogeDirective;
```
UITabBarのアイコンを選択時・未選択時で切り替える

## 概要
UITabBarControllerを使う場合、アイコン画像を1種類セットしておけば、システムが自動的に未選択・選択時の色を変えてくれて便利です。
しかし、選択時にアイコンの白抜きを埋めたり、画像自体を切り替えたい場合、素直に実装できなかったので、今回行ったことを記します。

## 実装方法
他の方法もあるかもしれませんが、今回はAppDelegate内で実装しました。
アプリ起動時に画像をセットするような処理になっています。

```objc:AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    // TabBarController取得
    UITabBarController *tabBarController = (UITabBarController *) self.window.rootViewController;
    
    UITabBarItem *firstTabBar = [tabBarController.tabBar.items objectAtIndex:0];
    // タブ未選択時の画像をセット
    firstTabBar.image = [[UIImage imageNamed:@"tab_first_unselected"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    // タブ選択時の画像をセット
    firstTabBar.selectedImage = [[UIImage imageNamed:@"tab_first_selected"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

    UITabBarItem *secondTabBar = [tabBarController.tabBar.items objectAtIndex:1];
    secondTabBar.image = [[UIImage imageNamed:@"tab_second_unselected"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    secondTabBar.selectedImage = [UIImage imageNamed:@"tab_second_selected"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

    return YES;
}
```

#### こんな感じ
![1439523391.jpg](https://qiita-image-store.s3.amazonaws.com/0/57610/def1dc63-0315-7a56-4409-17d129f5f8a5.jpeg)
swiftで関数作成時の引数の外部名とショートハンドについて

基本ショートハンド使っとけばよいかな

# 外部名なし
## 定義
    func writeData(searchWordText:String) {
        let appDel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        let searchWordContext:NSManagedObjectContext  = appDel.managedObjectContext!
        let searchWordEntity: NSEntityDescription! = NSEntityDescription.entityForName("SearchWord", inManagedObjectContext: searchWordContext)
        let searchWord: RecentSearch.SearchWord = NSEntityDescription.insertNewObjectForEntityForName("SearchWord", inManagedObjectContext: searchWordContext) as! SearchWord
        searchWord.search_word = searchWordText
        searchWord.update_date = NSDate()
    }

## 呼び出し

    writeData("testtest")

# 外部名
## 定義
    func writeData(searchWordText word:String) {
        let appDel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        let searchWordContext:NSManagedObjectContext  = appDel.managedObjectContext!
        let searchWordEntity: NSEntityDescription! = NSEntityDescription.entityForName("SearchWord", inManagedObjectContext: searchWordContext)
        let searchWord: RecentSearch.SearchWord = NSEntityDescription.insertNewObjectForEntityForName("SearchWord", inManagedObjectContext: searchWordContext) as! SearchWord
        searchWord.search_word = word
        searchWord.update_date = NSDate()
    }

## 呼び出し

    writeData(searchWordText:"testtest")


# ショートハンド

# 定義

    func writeData(#searchWordText:String) {
        let appDel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        let searchWordContext:NSManagedObjectContext  = appDel.managedObjectContext!
        let searchWordEntity: NSEntityDescription! = NSEntityDescription.entityForName("SearchWord", inManagedObjectContext: searchWordContext)
        let searchWord: RecentSearch.SearchWord = NSEntityDescription.insertNewObjectForEntityForName("SearchWord", inManagedObjectContext: searchWordContext) as! SearchWord
        searchWord.search_word = searchWordText
        searchWord.update_date = NSDate()
    }

## 呼び出し

    writeData(searchWordText:"testtest")
IBでUILabelのテキストを上寄せにする


[CafeSnap](https://itunes.apple.com/jp/app/cafesnap/id910848942)の下記の画面で、UILabelのテキストを上寄せにし、1行でも複数行でもテキストの開始位置を揃えようとしたときに、ちょっとハマったので設定項目を書いておきます。

![スクリーンショット 2015-08-14 12.11.26.png](https://qiita-image-store.s3.amazonaws.com/0/10532/0a3abda8-0dec-2890-f58f-8bcd01dcbaa8.png "スクリーンショット 2015-08-14 12.11.26.png")
![スクリーンショット 2015-08-14 12.39.17.png](https://qiita-image-store.s3.amazonaws.com/0/10532/db21662f-b118-f11f-0f5a-31e988965c0f.png "スクリーンショット 2015-08-14 12.39.17.png")


## 対処法
### 下記項目を設定
これらに加えて、constraintのheight指定は解除します。
![スクリーンショット 2015-08-14 12.16.44.png](https://qiita-image-store.s3.amazonaws.com/0/10532/a83b72bf-0ba6-31ec-70b9-3707d7a8363f.png "スクリーンショット 2015-08-14 12.16.44.png")

### Preferred Widthの設定を変更する
Preferred Widthに元々はlabelのwidthと同じ138が設定されていたのですが、下記のように0を設定します。   
![スクリーンショット 2015-08-14 12.29.48.png](https://qiita-image-store.s3.amazonaws.com/0/10532/1d99b954-7e5b-2706-7060-c8df0e5ae979.png "スクリーンショット 2015-08-14 12.29.48.png")

結果、想定通りの表示になりました！
![スクリーンショット 2015-08-14 12.32.02.png](https://qiita-image-store.s3.amazonaws.com/0/10532/844ccae2-0fbe-c262-c5d6-11564fa8ed82.png "スクリーンショット 2015-08-14 12.32.02.png")
![スクリーンショット 2015-08-14 12.37.01.png](https://qiita-image-store.s3.amazonaws.com/0/10532/c492b236-2056-b65d-7dd4-a2093a00c986.png "スクリーンショット 2015-08-14 12.37.01.png")


## 参考リンク
[UILabel#preferredMaxLayoutWidthはなぜ必要か](http://blogios.stack3.net/archives/2484)
homebrewでjruby-9.0.0.0をインストールできなかった

# <未解決です>

ruby-buildを更新

~~~sh
$ brew update && brew upgrade ruby-build
~~~

jruby-9.0.0.0をインストール => Java 7がインストールされてないので失敗

~~~sh
$ rbenv install jruby-9.0.0.0
ERROR: Java 7 required. Please install a 1.7-compatible JRE.

BUILD FAILED (OS X 10.10.4 using ruby-build 20150803)
~~~

java 7をインストール

~~~sh
# install homebrew-cask
$ brew install brew-cask

# can treat another Java versions
$ brew tap caskroom/versions

# search another java version
$ brew cask search java
==> Exact match
java
==> Partial matches
charles-applejava	charles-beta-applejava	eclipse-java		java6			java7			javafx-scene-builder	yourkit-java-profiler

# install Java7
$ brew cask install java7

# confirm java version
$ java -version
java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)
~~~

java 7を使用するように.bash_profileを修正

~~~
$ vim ~/.bash_profile

# 以下を追加
export JAVA_HOME=`/usr/libexec/java_home -v 1.7`

$ source ~/.bash_profile
~~~

Javaのバージョン確認

~~~
$ java -version
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)
~~~

再度jruby-9.0.0.0をインストール => ERROR: This Java instance does not support a 32-bit JVM.

~~~
$ rbenv install jruby-9.0.0.0

Downloading jruby-bin-9.0.0.0.tar.gz...
-> https://dqw8nmjcqpjn7.cloudfront.net/655665db3a1dc0462cba99d45532ab57d8416b5f168d8a0081bde9b7a93a394e
Installing jruby-9.0.0.0...

BUILD FAILED (OS X 10.10.4 using ruby-build 20150803)

Inspect or clean up the working tree at /var/folders/ls/jqskk4xd47j3tc0b6fh_0ccr0000gn/T/ruby-build.20150814121054.9567
Results logged to /var/folders/ls/jqskk4xd47j3tc0b6fh_0ccr0000gn/T/ruby-build.20150814121054.9567.log

Last 10 log lines:
ETag: "fe9036ea69bf23dc3b69cfc94adb5404"
Accept-Ranges: bytes
Server: AmazonS3
X-Cache: Miss from cloudfront
Via: 1.1 d39b0bd97aaaa81c1f2a5744ce31d1fe.cloudfront.net (CloudFront)
X-Amz-Cf-Id: OwS7WFT0-j06pWyxik5LZdHBVN--d3abcXFdpYzwwvzph1QkXqDbHQ==

/var/folders/ls/jqskk4xd47j3tc0b6fh_0ccr0000gn/T/ruby-build.20150814121054.9567/jruby-9.0.0.0 /var/folders/ls/jqskk4xd47j3tc0b6fh_0ccr0000gn/T/ruby-build.20150814121054.9567 ~
Error: This Java instance does not support a 32-bit JVM.
Please install the desired version.
~~~

エラー..


# 参考

* [Mac に brew で Oracle Java のバージョンを指定してインストールする方法](http://qiita.com/yu-iskw/items/79d9bddb77efaf2ca255)
CaboChaのインストールで躓いたところまとめ

## CaboChaとは？
日本語係り受け解析器。自然言語処理に使う。

## 基本的なinstall方法
[公式サイト](http://taku910.github.io/cabocha/)にあるとおり、基本的にはソースをダウンロードしてきて以下のコマンドで入るはず（だった）。事前にCRF++やMecabのinstallも必要。

```
./configure
make
make check
sudo make install
```

pythonで使いたい方はさらにpythonフォルダで以下をする事になります。

```
python setup.py install
```

## つまづきそうな部分

### ソースのURL
公式のダウンロードリンクはGoogleDriveの公開フォルダに飛んでるので、CentOSとかに入れるときにwgetに指定するURLをどうすればいいのか一瞬わかりませんでした。
とりあえず私は以下でdownloadできました。(CRF++だけgooglecodeに認証かかってた...)

| - | url |
|:--:|:--:|
| Mecab | http://cabocha.googlecode.com/files/cabocha-0.996.tar.bz2 |
| CRF++ | https://googledrive.com/host/0B4y35FiV1wh7fngteFhHQUN2Y1B5eUJBNHZUemJYQV9VWlBUb3JlX0xBdWVZTWtSbVBneU0/CRF++-0.58.tar.gz | 
| Cabocha | http://cabocha.googlecode.com/files/cabocha-0.996.tar.bz2 |

### iconv conversion failed. skip this entry....
makeしたときに以下のようなwarning(?)がずらずらと出てくるかと思います。

```
iconv conversion failed. skip this entry....
```

encodeの問題らしいです。./configure のときに オプションに以下をします。

```
./configure --with-charset=utf8 --enable-utf8-only
```
### ライブラリの読み込みエラー
makeの時にこんなかんじのエラーが出る

```
error while loading shared libraries: libcrfpp.so.0: cannot open shared object file: No such file or directory
```

環境にもよると思いますが、依存関係情報を追加すれば大丈夫です。

```
echo "/usr/local/lib" >> /etc/ld.so.conf.d/lib.conf
ldconfig
```

### （python3） setup.pyがエラー
`string.split (cmd1(str))`がなんとかって怒られると思います。
cabochaのコードがpython3に対応してないために起こるエラーです。
[親切な方がpatchファイルを書いてくださっている](http://nosada.hatenablog.com/entry/2014/03/14/002954)ので、そちらに合わせてソースを修正してください。

とりあえずこんな感じで。また何かあったら付け足すかも。
retryable gemで、「retryがすべて失敗した」ときの処理を書く

#Retryable
https://github.com/nfedyashev/retryable

```rb
retry_count = 0;
tries = 3;
begin
  do_something
rescue => e
  retry_count += 1;
  raise e if retry > tries;
  sleep 1
  retry
end
```

これが、

```rb
Retryable.retry(:tries => 3) { do_something }
```

と書ける

##n回失敗したらログを書いて終了

```rb
retry_count = 0;
tries = 3;
begin
  do_something
rescue => e
  retry_count += 1;
  if retry > tries
    log("die")
    exit 1
  end
  sleep 1
  retry
end
```
Retryableのオプションには、rescue節の中の処理を書く`exception_cb`コールバックと、ensure節の処理を書く`ensure`コールバックがある。このうち`ensure`コールバックを使う。

```rb
Retryable.retry(:tries => n, :ensure => Proc.new {|tries| ...}) {...}
```

引数だけではn回目に成功した場合とn回失敗した場合の区別がつかない。が、$!に例外が設定されているかどうかで区別できる

```
ensure_cb = Proc.new do |tries|
  if $!
    log("die")
    exit 1
  end
end
```

ただし、コールバックの実行が終わったら例外が発生するので、exitする場合でないと使えない。

##別案
```rb
#案1
#一回多く実行させてそれを拾う。:tries => n + 1に注意
Retryable.retry(:tries => n + 1) do |tries, exception|
  if(:tries >= n)
    log("die")
    exit
  end
  do_something
end

#案2
#最終回失敗したら例外が出るのでbeginで拾う
begin
  Retryable.retry(:tries => n) { do_something }
rescue
  log("die")
  exit
end
```

どれもいまいちすっきりしない。

[最終回の試行が失敗した後に呼ばれる`finally`コールバックと、例外を送出しないオプションを追加するPR](https://github.com/nfedyashev/retryable/pull/7)を出してる人はいるのだけどマージされていない。
場面に応じてdatabaseを切り替える

## 前提

* masterの取り込みとかでstructure.sqlがしょっちゅうコンフリクトするよ!
* マイグレーションだけを行うデータベースを作って、そこでrake db:migrateすれば
きれいに解消されるよ!
* だけど毎回database.ymlを書き換えるのだるいよ!


## なので
以下みたいに記述し切り替えできるようにした

```yml:database.yml
development:
  adapter: postgresql
  encoding: utf8
  database: <%=
    if ENV['M']
      'migration' # コンフリクトの解消の為のDB
    else
      'development'
    end.tapp { |db| "connecting #{db}" } # どこに接続してるかを出力
  %> 
  pool: 5
  username: username
  password:
```


## structure.sqlのコンフリクト解消は以下で

```bash
$ M=1 bundle exec rake db:migrate
```

## ちなみに、まっさらなDBの状態から始めたい場合は以下で

```bash
$ M=1 bundle exec rake db:migrate:reset
```
neologd使って形態素解析したい。できれば依存関係とかは丸投げで。

####neologdって？
https://github.com/neologd/mecab-ipadic-neologd/blob/master/README.ja.md
要するに新語に対応しているipa辞書の拡張版

これをjavaで利用しようと思うと

1. ビルドする環境構築
2. 頑張ってmecab-ipadic-neologdをビルド
3. java側からネイティブのmecabをバインディングしたりして呼び出し

みたいなことをしないといけない・・・
しかもネイティブビルドしたmecabを利用するので環境への依存関係が高く
さくっとサーバーにデプロイして利用みたいなことは難しい・・・

んじゃneologdの辞書だけpure javaの[kuromoji](http://www.atilika.org/)で使えないかなと思って調べた。
http://d.hatena.ne.jp/Kazuhira/20150316/1426520209
あーめんどそう・・・

####つーわけでさらに検索した結果
http://mocobeta-backup.tumblr.com/post/114318023832/neologd-kuromoji-lucene-4-10-4-branch
おー作って公開してくれてる。
でも自分でビルドするのか・・・
と思って下まで読んだら
> Elasticsearch ユーザー向けには、以下でプラグインを公開してくださっているので、こちらをどうぞ。
> https://github.com/codelibs/elasticsearch-analysis-kuromoji-neologd

やりたいことは形態素解析だけなんでluceneでもelasticsearchでもどっちでもいいのでこれを利用してみよう

####依存関係処理
ここがめんどいのでいろいろ調べたわけです。
さくっとmavenつかってpom.xmlに以下を追加するだけ :+1: 

```xml:pom.xml
<dependency>
    <groupId>org.codelibs</groupId>
    <artifactId>elasticsearch-analysis-kuromoji-neologd</artifactId>
    <version>1.6.0</version>
</dependency>
```
超簡単、調べてよかった・・・
#####以下テストコード

```java:KuromojiTest.java
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;

import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.codelibs.neologd.ipadic.lucene.analysis.ja.JapaneseTokenizer;


public class KuromojiTest {

	/**
	 * 分かち書きした文章をリストにして返す。
	 * 
	 * @param src
	 * @return
	 */
	private List<String> kuromojineologd(String src){
		List<String> ret = new ArrayList<>();
		try(JapaneseTokenizer jt = 
				// JapaneseTokenizerの引数は(ユーザー辞書, 記号を無視するか, モード)
				new JapaneseTokenizer(null, false, JapaneseTokenizer.Mode.NORMAL)){
			CharTermAttribute ct = jt.addAttribute(CharTermAttribute.class);
			jt.setReader(new StringReader(src));
			jt.reset();
			while(jt.incrementToken()){
				ret.add(ct.toString());
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return ret;
	}
	
	/**
	 * main
	 * 自分をnewしてexecuteメソッド呼ぶだけ。
	 * こうすることで他メソッドを作成するときに無駄にstatic化しなくてすむ
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		new KuromojiTest().execute();
	}
	
	/**
	 * 事実上のmain
	 */
	public void execute(){
		System.out.println(kuromojineologd("東京スカイツリーできゃりーぱみゅぱみゅとDAIGOがロケしてた。"));
		System.out.println(kuromojineologd("ヨツンヴァインになれよ。あくしろよ。"));
	}
}
```

```text:出力
[東京スカイツリー, で, きゃりーぱみゅぱみゅ, と, DAIGO, が, ロケ, し, て, た, 。]
[ヨツンヴァイン, に, なれ, よ, 。, あくしろよ, 。]
```
ネットスラングまで分かち書きできるとはたまげたなぁ(すっとぼけ
centos　時刻設定（日本語）

#/etc/localtimeの設定
/etc/localtime：CentOSのタイムゾーンを設定しているファイル
/usr/share/zoneinfo/Japan：日本のタイムゾーンを設定しているファイル
$ sudo cp -p /usr/share/zoneinfo/Japan /etc/localtime
/etc/localtimeファイルの設定をしておかないと、日本標準時刻が設定されない。

もしくは･･･
$ sudo mv /etc/localtime /etc/localtime.org 
$ sudo  ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

#NTPサーバーのインストール
NTP（Network Time Protocol）とは、ネットワーク内の時刻を同期させるのに利用する通信プロトコルで、NTPを使用するすべてのホストの時刻をUTC（Coordinated Universal Time、協定世界時）に合わせるために利用している。

$ sudo yum -y install ntp
Retinaディスプレイは0.5pxを表示できるか

もらったPSDのborderに1.5pxが指定されていることがあり、
もしかしたらRetinaディスプレイなら表示できるんじゃないかと思い試してみました。

0.5px、1px、1.5pxのborderを作ってみる

```css:css
div {
  width: 10px;
  height: 10px;
  border: #F00 solid;
}

#point-five {
  border-width: 0.5px;
}

#one {
  border-width: 1px;
}

#one-point-five {
  border-width: 1.5px;
}
```

```html:html
<p>0.5px</p>
<div id="point-five"></div>

<p>1px</p>
<div id="one"></div>

<p>1.5px</p>
<div id="one-point-five"></div>
```

結果はこんな感じに

![Artboard 1.png](https://qiita-image-store.s3.amazonaws.com/0/7132/8a634448-e916-bf3f-0e1a-129a71d10ea8.png)

やっぱりRetinaディスプレイだと0.5px単位で表示することができました。
逆にmacのchromeだと小数点以下を切り捨てているようです。

ピクセルは1px単位で指定しなさいと教わりましたが、もうそれは古いのかもしれません。
WordPressのWarningエラーを表示されないように消しました。


WordPressを起動したところ管理画面に大量のエラーが出ていて困りました。

```
( ! ) Warning: An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href="https://wordpress.org/support/">support forums</a>. (WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.) in /var/www/wordpress/wp-includes/update.php on line 295
```
管理画面にエラーが多すぎてなにもできません。

# WP_DEBUGをfalseにする
`wp-config.php`にある定数を変更します。

```php:
define( 'WP_DEBUG', false );
```
`true`になっていたので`false`に変更しました。

# エラーが全部消えました
管理画面にアクセスしたらエラーが消えていました(☝ ՞ਊ ՞)
Visual Studioが立ち上がらなくなったときの対処方法

> 制約
ContractName
Microsoft.VisualStudio.Utilities.IContentTypeRegistryService
RequiredTypeIdentity
Microsoft.VisualStudio.Utilities.IContentTypeRegistryService に一致するエクスポートが見つかりませんでした


このメッセージが表示されたら

以下のファイルを削除
> C:\Users{Username}\AppData\Local\Microsoft\VisualStudio\12.0\ComponentModelCache
Microsoft.VisualStudio.Default.cache

そんだけです。
UnityをVisual Studio連携しているんだけど突然開けなくなったので対応したところうまくいきました。
jQueryだけで$.getJSONを使ったシステムをMVC風な仕組みに構築してみる


1画面で動くWebシステムをド短期で作らなければいけなくて、
backbone.jsなど覚えている時間がなかったので、
jQueryだけを使ってMVC風な設計をしてみました。

今のところ動いていますが、破綻したら教えてください。

###利用しているもの
・jQuery 2.1.3
・jQuery-template（https://github.com/codepb/jquery-template）
 jQuery-templateの使い方はこちらをご覧ください。
 http://qiita.com/kumechang/items/c8df04287ed641bcdeb0
　
##ディレクトリ構造
ディレクトリはこんな構造にしてみました。

```bash:
js
 - controllers // コントローラー的なものを入れます
 - models // モデル的なものを入れます
 - views // templateファイルとControllerを中継ぎするViewファイルを入れます。
 - templates // jQuery-template用のテンプレートファイルを入れます。
```
　　　　
##HTMLファイルへの記載
HTMLファイルには次のものを書きます。
・scriptタグで各Javascriptをインクルード
・ルーティング

HTMLとルーティングはこんな感じ。

```html:html
<!-- 例えばhogeの詳細を見るボタン -->
<a class="btn btn-primary btn_hoge_detail" data-hogeid="5">ほげの詳細</a>
<div class="area_hoge_detail"><!-- ここに出る --></div>
```

```javascript:javascript
// ボタンと関数をbindしてルーティングを作る
var routing = function(){

  // hogeの詳細取得
  $(document).on('click',".btn_hoge_detail",function(){
    hogeController.show($(this).data('hogeid'));
  });


  // hogeの編集画面表示
  $(document).on('click',".btn_hoge_edit",function(){
    hogeController.edit($(this).data('hogeid'));
  });

```

詳細を見るaタグ（buttonでもよい）がクリックされたら、data-hogeidに記載されているID番号を元に、Controllerのshowメソッドを呼び出しています。


##コントローラー
コントローラーはこんな感じで記載します。

```javascript:hogeController

var hogeController = {

  // 詳細表示メソッド
  show : function(id){
    hogeModel.get(id,function(hoge){
      hogeView.setDetailTemplate(hoge);
    });

  },

  // 編集画面表示メソッド
  edit : function(id){
    hogeModel.get(id,function(hoge){
      hogeView.setEditTemplate(hoge);
    });

  }
}

```
例えばshowメソッドならば、hogeModelのgetメソッド（この中に$.getJSONが入っている）というものを呼びに行き、返却された結果をViewクラスに渡すようにしています。


##モデル
モデルはこんな感じで記載します。

```javascript:hogeModel
var hogeModel = {

  base_url : 'http://hoge.com/', // 外部からも変えられるように変数にする

  get : function(id,callback){
    $.getJSON(
      this.base_url + 'api/hoge/'+id,
      function(json){
        callback(json.data.hoge);
      });
  }
}
```
$.getJSONを行い、サーバから結果が返却されたら、引数としてもらっているCallback関数を実行します。

##ビュー
Viewはこんな感じで記載します。

```
var hogeView = {

  setDetailTemplate : function(hoge){
      $(".area_hoge_detail").loadTemplate("js/templates/hogedetail.html",{
        "hogeName" : hoge.name,
        "hogeDetail" : hoge.detail
      },
      {append:false});
  }
}
```
ここはjQuery-temlateを呼び出して、該当の箇所に埋め込みます。
クラス、もしくはID指定なのがちょっと悔しい。


##テンプレート

```
	<h3 data-content="hogeName"></h3>
	<p data-content="hogeDetail"></p>
```

まぁ、テンプレートはただのHTMLですね。


以上です。
ちゃんとフレームワークを覚えなきゃなーと思いつつ、ついついこうやって済ましてしまうのが悪い癖ですね。
docker-machineのDriverにGoogleがとてもよかった


Azureとかもいいかもしれない。AWSに比べてGCEを使うのがとてもよかった。課金単位が短いのもありますが、VPCを指定しなかったりしないといけなくて少し面倒でした。Amazon LinuxのイメージはAWSでないと使えないので、amazonec2ドライバもちょいちょい使っていく予定だ。

### 解説

docker-machineを使うとDocker Hostが簡単に作れる。Dockerをインストールして、証明書発行して、ローカルのdockerクライアントから接続する情報を簡単に取得できる。
作成して準備をする流れは

* docker-machine create -d [DRIVER] [NAME]
* eval "$(docker-machine env [NAME])"

となる。そうするとdockerコマンドが使えるようになり、作成したところでDockerがうごく。
boot2dockerの外部ホスト用みたいな感じだ。

DRIVERには利用す環境を指定する。使えるドライバは

* amazonec2
* azure
* digitalocean
* exoscale
* generic
* google
* none
* openstack
* rackspace
* softlayer
* virtualbox
* vmwarefusion
* vmwarevcloudair
* vmwarevsphere

おやすくつけっぱなしにしたいならdigitaloceanが良さそうだ。
sshがつかえれば、sshした先に設定することも可能みたいだ。
またDRIVERを使わずURL指定でリストに加えることもできるようだ。
他の人と共有するならこれが使えそうだ。

`-d`ドライバーを指定するがNAMEを指定しなければ、使えるオプションだけに絞りこめる。しってるとオプションがみやすい。

-d google を指定した場合のインスタンスの設定はオプションで指定できる。

```
--google-auth-token GCE oAuth token [$GOOGLE_AUTH_TOKEN]
--google-disk-size "10" GCE Instance Disk Size (in GB) [$GOOGLE_DISK_SIZE]
--google-disk-type "pd-standard" GCE Instance Disk type [$GOOGLE_DISK_TYPE]
--google-machine-type "f1-micro" GCE Machine Type [$GOOGLE_MACHINE_TYPE]
--google-project GCE Project [$GOOGLE_PROJECT] 
--google-scopes "https://www.googleapis.com/auth/devstorage.read_only,https://www.googleapis.com/auth/logging.write" GCE Scopes (comma-separated if multiple scopes) [$GOOGLE_SCOPES]
   -
```

`$GOOGLE_DISK_SIZE`などとあるように環境変数に指定しておけばオプションを自動的に指定できる。direnvなどをつかて必要な情報セットしておくと便利だ。

### 参考文献

https://docs.docker.com/machine/
ATOMエディタのproxy設定 (1.0系版)

## 概要

+ proxy 環境下でもATOM を使いたい

## 基本設定

+ [この人を信じ](http://qiita.com/tsukamoto/items/cef0f2d7e2b33a26a9e5)れば基本的には問題ない

## これによる弊害

+ ATOM 1.0系だとインストール出来ない

```
gyp info it worked if it ends with ok
gyp info using node-gyp@1.0.2
gyp info using node@0.10.35 | darwin | x64
gyp http GET https://atom.io/download/atom-shell/v0.22.0/node-v0.22.0.tar.gz
gyp WARN install got an error, rolling back install
gyp ERR! install error
gyp ERR! stack Error: tunneling socket could not be established, cause=Parse Error
gyp ERR! stack     at ClientRequest.onError (/Applications/Atom.app/Contents/Resources/app/apm/node_modules/npm/node_modules/request/node_modules/tunnel-agent/index.js:168:17)
gyp ERR! stack     at ClientRequest.g (events.js:180:16)
gyp ERR! stack     at ClientRequest.emit (events.js:95:17)
gyp ERR! stack     at Socket.socketOnData (http.js:1593:9)
gyp ERR! stack     at TCP.onread (net.js:528:27)
gyp ERR! System Darwin 14.5.0
gyp ERR! command "/Applications/Atom.app/Contents/Resources/app/apm/bin/node" "/Applications/Atom.app/Contents/Resources/app/apm/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "install" "--target=0.22.0" "--dist-url=https://atom.io/download/atom-shell" "--arch=x64" "--ensure" "--proxy=http://proxy.url:0129"
gyp ERR! cwd /Users/gessy0129
gyp ERR! node -v v0.10.35
gyp ERR! node-gyp -v v1.0.2
gyp ERR! not ok
```

## 対応方法

+ [issueを信じる](https://github.com/atom/apm/issues/322#issuecomment-96430856)
+ 自分の環境では以下を設定に追加
  + `export ATOM_NODE_URL=http://gh-contractor-zcbenz.s3.amazonaws.com/atom-shell/dist`

## 環境のメモ

+ MacBookPro OS X 10.10.5

+ ```$ apm --version```

```lang:sh
apm  1.0.1
npm  2.5.1
node 0.10.35
python 2.7.10
git 2.3.2
```

+ ```$ apm config ls```

```lang:sh
; cli configs
globalconfig = "/Users/gessy0129/.atom/.apm/.apmrc"
user-agent = "npm/2.5.1 node/v0.10.35 darwin x64"
userconfig = "/Users/gessy0129/.atom/.apmrc"

; userconfig /Users/gessy0129/.atom/.apmrc
http-proxy = "http://proxy.url:0129"
https-proxy = "http://proxy.url:0129/"
proxy = "http://proxy.url:0129/"
strict-ssl = false

; globalconfig /Users/gessy0129/.atom/.apm/.apmrc
cache = "/Users/gessy0129/.atom/.apm"

; node bin location = /Applications/Atom.app/Contents/Resources/app/apm/bin/node
; cwd = /Users/gessy0129
; HOME = /Users/gessy0129/.atom/.node-gyp
; 'npm config ls -l' to show all defaults.
```

## 補足

+ proxy のURL とport は適当なので修正してくださいね
i2c デバイスとプルアップ抵抗


電子工作初心者です。

i2c にいろいろデバイス繋いでいたら、8x2 LCD の AQM0802 への書き込みが時々エラーになるようになってしまった。よくわかってないので適当に baudrate を低速にしてもダメで、何でだろうと思ったら SCL / SDA のプルアップ抵抗が他のデバイスを繋いだことで増えていたためだった。

秋月電子の [AQM0802 完成品](http://akizukidenshi.com/catalog/g/gM-09109/) は最初からプルアップ抵抗のジャンパがショートされてるので、ショートを外して適切なプルアップ抵抗値になるようにしたら問題なく書き込みできるようになった。

追記 識者の方に抵抗値が増えたのでは無く、バスに流れ込む電流が増えたから、とのことです。なるほど〜。

> 複数プルアップ = 抵抗の並列接続なので、バスに流れこむ電流がふえた
> 10kΩを2箇所でプルアップすると、5kΩでプルアップしたのと同じことになります
> 増えたぶんの電流をgndに落とす能力がデバイスにないと、中途半端な電圧になって誤動作してしまう
ctrlPを早くするためのignore設定


めっちゃ早くなった

↓余計なファイルの拡張子を除外

```bash
set wildignore+=*/tmp/*,*.so,*.swp,*.zip,*.jpg,*.png
```


余計なディレクトリを正規表現で除外

```bash
let g:ctrlp_custom_ignore = '\v[\/](node_modules|build)$'¬
```

node_modulesマジでなんとかならんのかな。