OmniAICreator/Qiita-1.07M huggingface dataset:
expectコマンドを使ったみた


コマンド操作していて対話式でやりとりするのが面倒なので、
自動化させるためにちょっと触ってみた。

-

# 1. expectコマンドとは
コマンドの返答を識別して、次の入力を自動的に対応してくれるもの。
シェル内部に組み込むことで、いろいろ自動化できて楽になる。

expectコマンドがインストールされていない場合は、
下記のコマンドを事項してインストール必要。

````コマンド
yum install expect
````

-
# 2. 実際にどんな感じに動くかためしてみた

[対話式のコマンドをスクリプト化する方法](http://qiita.com/dogyear/items/e58ddab9a49bf82ed43f)
↑のサイトを参考に動かしてみることにします。


````サンプル
expect -c "
spawn [実行したいコマンド]
expect [コマンドの返答]
send -- [次のコマンド]
"
````

検証用に仮想マシンを作成しました。
![kobito.1451455401.948283.png](https://qiita-image-store.s3.amazonaws.com/0/33479/9ce2a296-4b2f-30db-8b28-1a8345d5ead4.png "kobito.1451455401.948283.png")


★PW変更の場合

````手動でやる場合
[root@localhost ~]# 
[root@localhost ~]# cat /etc/passwd | grep hoge
[root@localhost ~]# 
[root@localhost ~]# useradd hoge
[root@localhost ~]# 
[root@localhost ~]# cat /etc/passwd | grep hoge
hoge:x:502:502::/home/hoge:/bin/bash
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# passwd hoge
Changing password for user hoge.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@localhost ~]# 
[root@localhost ~]# 
````

````自動化でやる場合
[root@localhost ~]# cat passwd-test.sh 
#!/bin/sh

export LANG=C
pw="hom7fak8eUd2"

expect -c "
spawn passwd hoge
expect \"New password:\"
send -- \"${pw}\n\" 
expect \"Retype new password:\"
send -- \"${pw}\n\"
expect \"passwd: all authentication tokens updated successfully.\"
send -- \"exit\n\"
"
[root@localhost ~]# 
[root@localhost ~]# ./passwd-test.sh;echo $?
spawn passwd hoge
Changing password for user hoge.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.0
[root@localhost ~]# 
[root@localhost ~]# exit
logout
[user@localhost ~]$

````
パッケージ更新インストール後にコマンドが実行できない場合の対処

新規インストール時と更新インストール時でインストール先が異なる場合、更新インストール完了後にコマンドが実行できなくなることがある。
新規インストールと更新インストール時でインストール方法が異なる場合等に発生する可能性がある。

# 例: pip
`pip` を更新した後、↓のようなエラーが発生するになった。

~~~
# pip
-bash: /usr/bin/pip: そのようなファイルやディレクトリはありません
~~~

## やったこと
- 環境: `debian` 
- インストール方法:
    - 新規インストール時: `apt` で `python-pip` パッケージからインストール
    - 更新インストール時: `pip install pip --update` で pipを更新インストールした


# 原因
コマンドパスのハッシュが更新後のパスを追随できていない。

## 詳細
更新後も `pip` のファイル自体は存在する。

~~~
# type -a pip
pip は /usr/local/bin/pip です
~~~

`pip`コマンドを実行するとどこを見るようになっているかは、
`type`コマンドをオプション無しで実行すればわかる。

~~~
# type pip
pip はハッシュされています (/usr/bin/pip)
~~~

更新後には存在しない(削除してしまった)、更新前の参照先を見ている。

~~~
# ls -l /usr/bin/pip
ls: /usr/bin/pip にアクセスできません: そのようなファイルやディレクトリはありません
~~~


# 対策
コマンドパスのハッシュを更新する。
そのために、以下のコマンドを実行する。

~~~
# hash -r
# 
~~~

~~~
# pip --version
pip 7.1.2 from /usr/local/lib/python2.7/dist-packages (python 2.7)
~~~

直った。
UITextFieldのスタイルがRoundedRectの場合、背景色が変わらない(Core Animation)

# 問題
CoreAnimationを用いてUITextFieldのlayerの背景色を徐々に変えたい場合に、UITextFieldのborderStyleがRoundedRectの場合うまくいかない。

## Core Animationを用いた例
CABasicAnimationを用いて、UITextFieldの背景色を2秒かけてclearColorからblackColorにアニメーションさせている。

```swift:Swift
    func animateBackgroundColor(textField: UITextField) {
        let backgroundColorAnimation: CABasicAnimation = CABasicAnimation(keyPath: "backgroundColor")
        backgroundColorAnimation.fromValue = UIColor.clearColor().CGColor
        backgroundColorAnimation.toValue = UIColor.blackColor().CGColor
        backgroundColorAnimation.duration = 2.0
        textField.layer.addAnimation(backgroundColorAnimation, forKey: "BackgroundColor")
    }
```

```objc:Objective-C
- (void)animateBackgroundColor:(UITextField *)textField {
    CABasicAnimation *backgroundColorAnimation = [CABasicAnimation animationWithKeyPath:@"backgroundColor"];
    backgroundColorAnimation.fromValue = [UIColor clearColor];
    backgroundColorAnimation.toValue = [UIColor blackColor];
    backgroundColorAnimation.duration = 2.0f;
    [textField.layer addAnimation:backgroundColorAnimation forKey:@"BackgroundColor"];
}
```

# 解決策
```swift:Swift
     textField.backgroundColor = UIColor.clearColor()
```
```objc:Objective-C
     textField.backgroundColor = [UIColor clearColor];
```

UITextFieldのbackgroundColorを透明にすることで、背景色が変わる。
TypeScriptで関数を型にする

Typescriptの型として、  
「number」「string」「boolean」などとありますが、  
実は、関数も型にできます！

```typescript:sample.ts
var function1: (arg1: number, arg2: string) => boolean;
```

こんな感じ。  

```
(引数名:型, 引数名:型 .....) => 戻り値
```

戻り値がないときは、`void`を指定できます。

## どんなときにつかうの？
 コールバック引数を使いたい
 
```typescript:callback.ts
function progressA(callback: (msg: string) => void) {
  callback("hoge");
}

progressA(msg => {
  console.log(msg);
});
```

関数を配列とする

```typescript:array.ts
var fnArray:Array<(msg: string) => void> = [];
fnArray.push(msg => {
  alert(msg);
});
fnArray.push(msg => {
  console.log(msg);
});
fnArray.forEach(i => {
  // 関数だから呼び出せる
  i("Hello, TypeScript!");
});
```

## AddEventListenerの引数にも！
lib.d.tsを見てみると、

```typescript:lib.d.ts
addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
```

引数`listener`の型にも使われています！

TypeScript楽しい！奥深い！
中国でオンラインのビジネスを始める時に考えたこと


### サーバー環境をどうするべきか？
   選択肢としては、以下の三つを考えました。
   * 自前でサーバーを持つか
   * AWS Chinaを利用する
   * Hongtu Cloudを利用する
   
   よほどの規模の会社でない限り、自前でサーバーを持つというのはあり得ない話だと思います。
   コストもかかるし、構築した後でもサーバーをメンテナンスする人が必要になるのは、かなり辛いと思います。
   
   次にAWSです。AWS Chinaは正式リリースでは無いものの、中国で既に使われ始めています。
   ユニクロもAWS Chinaを使っているというのは有名な話だと思います。
   [こちらがその記事です。](https://fastretailing.github.io/blog/2015/09/29/AWS-ChinaBeijing-Region-Tips.html)
   ただ、それでも問題はあります。AWS Chinaはいつまでたっても正式版になりません。
   それは、つまり、いつ撤退してもおかしくないということです。
   勿論、Amazonが自ら撤退するということはないのですが、
   中国政府の圧力により撤退させられるということは十分にありえます。
   またユニクロの例も、Webの事業だけでこれから進出しようという方にはあまり参考になりません。
   というのもユニクロは実店舗を持っているので中国政府に顔がききます。そこと比較しても仕方がないでしょう。
   
   最後にニフティクラウド China。[Hongtuです](http://cloud.nifty.com/promo/hongtu/)。
   こちらはニフティクラウドと、CLARAオンラインが提携して中国で作っているサービスです。
   AWSのようにビジネスをやり過ぎるということもなく、中国政府から睨まれるということもありません。
   また、CLARAは中国のビジネス展開には慣れているので、サイトのリリース時にはコンサル料を払えば
   サポートを受けられます。そのため、私はここを選択しました。
### 中国でWebのビジネスをする流れ
    ICPの登録
    1. グローバルIPアドレスを取得
    2. DNSを登録
    3. Webサイトを仮の形でもいいので構築
    4. それを中国政府に提出して、閲覧してもらう

    Alipayの申請(決済手段)
    1. 現地で会社を設立
    2. Webサイトを仮の形でもいいので構築

    ICPライセンスの取得
    1. Webサイトが完全リリースできる状態になったら、中国政府に報告する。
    2. 数ヶ月ぐらい待つらしい。（この間にも営業はできる）

こんな感じで中国でのビジネスはかなり複雑なので、AWSを使って自分たちだけで
やるのはかなり難しいと思います。特にICPライセンスの取得というのが難易度が高いらしい。
この辺りは、AWSの人は全くサポートしてくれません。
ただ、AWSを使いながらCLARAにコンサルを依頼するというのもありだとは思います。
システム的にはAWSの方がいいので、ビジネス的なリスクを恐れない人はその選択肢もいいと思います。
### Hongtuのシステム的な特徴
   * SSLアクセラレーター、LBはhttps(443)で受けてwebにはhttp(80)というのができない
   * システム内部でLBを使えない。例えばweb→DB2台の構成にする場合はLVSサーバーを構築する必要がある
   * オートスケール機能はあるけど、あまりイケてないらしい。。。
   * ロードバランサを通すとサーバーのFWは無視される
   * ロードバランサーを通すと、httpsでは「X-Forwarded-for」を使っても送信元のIPを取得できない
   * 価格はHongtuの方がAWSよりは安いみたい

### rubyの情報
   * 決済にはAlipayが人気で[gemを使うと便利です](https://github.com/chloerei/alipay)
   * 決済にはWeChatも人気で[gemを使うと便利です](https://github.com/jasl/wx_pay)
   * 中国でのgemはこれを使う[https://ruby.taobao.org](https://ruby.taobao.org')
POP3のtelnetによる接続確認方法



めも


## telnet


```
# telnet localhost 110
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
+OK Dovecot ready.
USER user_name
+OK
PASS user_pass
+OK Logged in.
LIST
+OK 0 messages:
.
QUIT
+OK Logging out.
Connection closed by foreign host.
```


認証に失敗すると以下が表示

```
-ERR Authentication failed.
```


quitで終了



## 用語

* postfix,dovecot,mta,smtp,mail,pop,imap
SGDで教師のランダム性はどの程度必要なのか


<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">学習率が小さいときは棋譜単位で十分ランダムならシャッフル無しでもいいかもとか考え中。しかし1億局あるうちの最初の1千万局の局面をシャッフルして学習したら10%くらい回した時点でオーバーフィッティングしていて残りの9千万局の損失は下がってなかったことが結構トラウマなので悩ましい。</p>&mdash; aki. (@ak11) <a href="https://twitter.com/ak11/status/681642492807098368">2015, 12月 29</a></blockquote>

という悩みが生まれたので、実験してみた結果の備忘録。

# 前提

- 進行度の学習で実験した。
- 特徴はKとP。教師は約5万棋譜(約500万局面)。AdaGradを使用したロジスティック回帰。

特徴に対して教師の数がとても過剰に多いので、教師が多ければ解決するものであれば差は出にくい事に注意が必要。
(教師が多くても解決しない問題の方に興味があるので)

# やったこと

- 棋譜をシャッフルしたり、SFENのASCII順にしたり。
- 全局面(約500万局面)を均等にシャッフルしたり、棋譜の手順そのままにしたり、半端にシャッフル(1024分割してそれぞれをシャッフル)したり。

これらの組み合わせで16-fold cross-validationして、Mean absolute errorを算出。

# 実験結果

|棋譜|局面|MAE|
|:--:|:--:|---:|
|-|シャッフル|7.38%|
|シャッフル|棋譜の手順そのまま|7.42%|
|SFENのASCII順|棋譜の手順そのまま|7.52%|
|シャッフル|半端シャッフル|7.39%|
|SFENのASCII順|半端シャッフル|7.58%|

# 結論

- ちゃんとシャッフルしたのが最優秀。シャッフル無しはそれなりに悪い。
- しかしこの条件ではそれほど大きい差でもなかった。
- 半端なシャッフルは、棋譜がソートされているとシャッフルしないより悪い。(棋譜がランダムな場合はまだマシだけど…)

差がそれほど出なかった事はやや意外だったけど、順番的にはだいたい予想通りだったので一安心。
Ansibleのyum module:各state(present,installed,latest,absent,removed)の違い

Ansibleでyum moduleを使っていたときに少しハマったのでメモします。

[yum - Manages packages with the yum package manager &mdash; Ansible Documentation ](http://docs.ansible.com/ansible/yum_module.html)

# yum moduleとは

その名の通り、RedHat系で利用されるパッケージ管理システムを利用してプロビジョニングを行うためのモジュールです。
このmoduleを利用して、パッケージをインストールしたり削除したりします。

# 各stateの一覧と意味

公式ドキュメントの `state` 欄にも

> Whether to install (`present` or `installed`, `latest`), or remove (`absent` or `removed`) a package.

としか書かれておらず、結局それぞれの違いはなんだろうと思ったのがきっかけです。

|state      |意味|対応するyumコマンド|
|-----------|----|-----------------|
|`present`  | パッケージのインストール| `yum install` |
|`installed`|`present`のalias| `yum install` |
|`latest`   | パッケージの最新版へのアップデート| `yum update` |
|`absent`   | パッケージのアンインストール | `yum remove` |
|`removed`  |`absent`のalias| `yum remove` |

# 注意すること

このうち、 `latest` が曲者でした。ansible実行の1回目と2回目以降で、結果が変わるケースがあります。

* `name`で`[pkgname]-[version]`を指定したとしても、`state`が`latest`であれば、指定したバージョンより新しいものが(あれば)インストールされる
* しかも、新しいバージョンがインストールされるのはansible実行の**2回目**以降。1回目は指定したバージョンがインストールされる

例えば、以下のような書き方をしたとします。

```yaml:tasks/main.yml
  name: install one specific version of Apache
  yum: name=httpd-2.2.29-1.4.amzn1 state=latest
```

yumリポジトリ上に、 httpdの2.2.29と、2.2.31のパッケージが混在していたとします。

すると、以下のような動きになります。

* 初回実行時 : httpd-2.2.29がインストールされます。
* 2回目以降 : httpd-2.2.31へ更新されます。

# 何が嫌か

冪等性が崩れます。何回やっても同じ結果になるかと思いきや、初回と2回目以降で結果が変わるためです。
試したのはansible 1.9ですが、ソースコードを見る限りでは2.0系でも同じようです。

https://github.com/ansible/ansible-modules-core/blob/stable-1.9/packaging/os/yum.py
https://github.com/ansible/ansible-modules-core/blob/stable-2.0/packaging/os/yum.py

# 結局どうするべきか

**パッケージのバージョンを固定したければ、そもそも`latest`を使わずに、`present`か`installed`を使う** ということでした。

裏でどんな`yum`コマンドが実行されているかを想像した上で、`latest` っていう意味から分かるでしょと言われるとそうなのですが、何気なく書く場合は注意しましょうという話でした。
Nexus でサードパーティ製のjarを管理する


リポジトリにそのものズバリな「3rd Party」があるので、それをみてみる。

![2015061102.png](https://qiita-image-store.s3.amazonaws.com/0/59985/8e375358-1557-fa9b-805e-d964069c2e85.png)

[Artifact Upload]タブに切り替える。
oracleのjdbcドライバをアップロードしてみる。
パラメータを設定する。
「GAV Parameters」を選択。 
<pre>
groupId：com.oracle
artifactId：ojdbc7
version：12.1.0.1
Packaging：jar
</pre>

![201506124.png](https://qiita-image-store.s3.amazonaws.com/0/59985/92e82900-c569-a9d1-07cc-50a201dffd14.png)

<pre>
Filename:jarがある場所とファイル名
Classifier:
Extension:jar
</pre>

Upload Artifact(s) を押下する。
![201506125.png](https://qiita-image-store.s3.amazonaws.com/0/59985/2192ddea-1fad-8b2a-49a5-3c923453f12d.png)

「Artifact upload finished successfully」というメッセージがでればOK。

[Browse Index]にて、登録されていることを確認してみる。
![201506126.png](https://qiita-image-store.s3.amazonaws.com/0/59985/aa57b923-cd6f-38cb-ef55-0c5b941eaca8.png)

表示された！

<hr/>
同じ手順を繰り返して、サードパーティ製のjarを登録すれば完了です。
どこで拾ってきたのかわからないjarのバージョンもしっかりわかるようになります。
msgpackのベンチマーク

備忘録的メモ

統計表情報のjson（元のファイルサイズは71.234MB)
(msgpack化後のファイルサイズは42.732MB)

```coffeescript
statisticsInfoObj = fse.readJsonSync("#{process.cwd()}/data/統計表情報取得2015-12-30.json")

str = JSON.stringify(statisticsInfoObj)
# json stringify: 242.443ms

buf = Buffer(str)
#buffer: 309.105ms

JSON.parse(str)
#json parse string: 693.971ms

resJsonParseBuffer = JSON.parse(buf)
#json parse buffer: 812.726ms

mspBuf = msgpack.encode(statisticsInfoObj)
#msgpack encode buffer: 1063.519ms

resMsgPackParseBuffer = msgpack.decode(mspBuf)
#msgpack parse buffer: 1345.102ms
```
複数条件の default_scope を設定する

order_by と where を default_scope に設定しようと思って

```rb

default_scope { where(active: true), order(product_id: :desc, id: :desc} }
```

と書いたらエラーになった… 適当に書いてもダメですね orz。

[公式ドキュメント](http://apidock.com/rails/ActiveRecord/Base/default_scope/class) を見たところ、default_scope を複数記述すると merge されるとのことで、以下で意図通りになった。

```rb
default_scope { where(active: true) }
default_scope { order(product_id: :desc, id: :desc) }
```
Pythonのsubprocessで標準出力をリアルタイムに取得する


subprocessで実行したコマンドの標準出力を非同期で1行ずつ取得します。

* ``Popen.stdout.readline()`` で標準出力をポーリング
* 標準出力があれば ``yield`` で返す
* ``Popen.poll()`` でプロセスの完了を検知

```Python
import sys
import subprocess


def get_lines(cmd):
    '''
    :param cmd: str 実行するコマンド.
    :rtype: generator
    :return: 標準出力 (行毎).
    '''
    proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    
    while True:
        line = proc.stdout.readline()
        if line:
            yield line
        
        if not line and proc.poll() is not None:
            break


if __name__ == '__main__':
    for line in get_lines(cmd='du ~/'):
        sys.stdout.write(line)
```
Gulpでtsify+watchify

TypeScriptでBrowserifyが使える、   [tsify](https://www.npmjs.com/package/tsify)を知ったのですが、  
ビルドの時間が遅いし、毎回「gulp XXX」って打つのが大変なので、  
[watchify](https://www.npmjs.com/package/watchify)と一緒に使えないかな・・・と思いました。

次のようなgulpfile.jsを作りました。

```js
var gulp = require("gulp");
var watchify = require("watchify");
var browserify = require("browserify");
var tsify = require("tsify");
var source = require("vinyl-source-stream");

gulp.task("watchify-tsify", function() {
  var b = watchify(browserify({
    entries: [ "./ts/a.ts", "./ts/b.ts", /* ... */],
    cache: {},
    packageCache: {}
  }));
  
  function runBundle() {
    return b.plugin(tsify, {
      noImplicitAny: true,
      target: "es5"
    }).bundle().pipe(source("./all.js")).pipe(gulp.dest("./js/"));
  }
  
  b.on("update", runBundle);
  b.on("log", function(msg) {
    console.log(msg);
  });
  bundle();
});
```

- `gulp watchify-tsify`と実行する。
- `./ts/a.ts`、`./ts/b.ts`を監視する。
- watchifyでupdateが発生するたびに、`runBundle()`を呼び出す。
- b.pluginでtsifyを読み込み、`js/all.js`を出力する。


参考:  
[http://2inc.org/blog/2015/05/13/4818/](http://2inc.org/blog/2015/05/13/4818/)
月末の計算

NSDateから月末を取得する関数を作ってみました。

```swift
func endOfMonth(date:NSDate) -> NSDate
{
    let cal = NSCalendar.currentCalendar()
    let flags : NSCalendarUnit = [.Year, .Month, .Day]
    let comps : NSDateComponents = cal.components(flags , fromDate: date)
    
    var y = comps.year
    var m = comps.month
    m = m + 1
    if (m >= 13) {
        y = y + 1
        m = 1
    }
    
    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd";
    
    let firstOfMonth : NSDate = dateFormatter.dateFromString("\(y)-\(m)-01")!
    
    let endOfMonth : NSDate = firstOfMonth.dateByAddingTimeInterval(-60*60*24)

    return endOfMonth
}

```

使い方

```swift
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd";
let testDate = dateFormatter.dateFromString("2014-2-1")!;
let resOut = endOfMonth(testDate) // "Feb 28, 2014, 12:00 AM"
```
RPGツクールMV関連リンクいろいろ

#RPGツクールMV

##Wikipedia
[RPGツクールMV](https://ja.wikipedia.org/wiki/RPG%E3%83%84%E3%82%AF%E3%83%BC%E3%83%ABMV)

##RPGツクールMVで作られたゲーム
[ニコニコゲームマガジン　レジェンド・ツクラー作成ゲーム](http://info.nicovideo.jp/gamemaga/mvsample/)
　[↑ゲーム解説その１「全般」](http://www.4gamer.net/games/312/G031261/20151112100/)
　[↑ゲーム解説その２「Sea Pirate」](http://tm2501.hatenablog.com/entry/2015/12/28/213000)
　[↑ゲーム解説その３「FILAMENT」](http://freegamedouraku.doorblog.jp/archives/46899444.html)
　[↑ゲーム解説その４「エミールの小さな冒険」](http://ameblo.jp/bununk/entry-12095622132.html)
　[↑ゲーム解説その５「diable caprice」](http://freegamedouraku.doorblog.jp/archives/46916785.html)
　[↑ゲーム解説その６「diable caprice」](http://ameblo.jp/bununk/entry-12095228922.html)

[SIerクエスト](http://sifue.github.io/SIerQuest/)
　[↑ゲーム解説その１](http://nlab.itmedia.co.jp/nl/articles/1511/18/news084.html)
　[↑ゲーム解説その２](http://www.moongift.jp/2015/12/sier%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88-rpg%E3%83%84%E3%82%AF%E3%83%BC%E3%83%ABmv%E3%81%A7%E4%BD%9C%E3%82%89%E3%82%8C%E3%81%9F%E3%83%AA%E3%82%A2%E3%83%AB%E3%81%AA%E3%82%B2%E3%83%BC%E3%83%A0/)
[SIerクエスト2](http://sifue.github.io/SIerQuest2/)

[Freem 「RPGツクールMV」検索](http://www.freem.ne.jp/search/RPG+%E3%83%84%E3%82%AF%E3%83%BC%E3%83%AB+MV/page-1)
[Freem ツクールMV学園](http://www.freem.ne.jp/win/game/10350/)





##RPGツクールMV本家あたり
[RPGツクールMVドワンゴジェイピーストア](https://jpstore.dwango.jp/game/tkool_mv.php)

[RPGツクールMV](https://tkool.jp/mv/)

[ツクール開発部Twitter](https://twitter.com/tkool_dev)

[RPGツクールMV新機能紹介](https://tkool.jp/mv/new_function/index.html)
[RPGツクールMV新機能紹介02](https://tkool.jp/mv/new_function/02.html)
[RPGツクールMV新機能紹介03](https://tkool.jp/mv/new_function/03.html)
[RPGツクールMV新機能紹介04](https://tkool.jp/mv/new_function/04.html)

##開発いろいろ
[一見さんによる一見さんのための「RPGツクールMV」入門。](http://www.4gamer.net/games/312/G031261/20151217069/)
[RPGツクールMV新機能活用講座](https://tkool.jp/mv/course/)
[RPGツクールMVでアプリリリースを目指す開発室](http://fanblogs.jp/tabirpglab/)
[RPGツクールMV はアプリ開発に使えるのか検証してみた](http://studio.cretia.net/blog/518)

##Qiita
[Qiita「RPGツクールMV」検索　関連順](https://qiita.com/search?q=rpg%E3%83%84%E3%82%AF%E3%83%BC%E3%83%ABMV&sort=rel)

[Qiita「RPGツクール」検索　関連順](https://qiita.com/search?q=rpg%E3%83%84%E3%82%AF%E3%83%BC%E3%83%AB&sort=rel)
[Qiita「RPGツクール」検索　新着順](https://qiita.com/search?q=rpg%E3%83%84%E3%82%AF%E3%83%BC%E3%83%AB&sort=created)
[Qiita「RPGツクール」検索　ストック数順](https://qiita.com/search?q=rpg%E3%83%84%E3%82%AF%E3%83%BC%E3%83%AB&sort=stock)

[RPGツクールMV(プログラマ用) Advent Calendar 2015](http://qiita.com/advent-calendar/2015/rmmv)

[RPGツクールMV(なんでもあり) Advent Calendar 2015](http://www.adventar.org/calendars/1119)

##はてなブックマーク
[はてなブックマーク「ブクマ数 1 user」](http://b.hatena.ne.jp/search/text?safe=on&q=rpg%E3%83%84%E3%82%AF%E3%83%BC%E3%83%ABMV&users=1)
[はてなブックマーク「ブクマ数 3 users」](http://b.hatena.ne.jp/search/text?q=rpg%E3%83%84%E3%82%AF%E3%83%BC%E3%83%ABMV)
[はてなブックマーク「ブクマ数 50 users」](http://b.hatena.ne.jp/search/text?safe=on&q=rpg%E3%83%84%E3%82%AF%E3%83%BC%E3%83%ABMV&users=50)
[はてなブックマーク「ブクマ数 100 users」](http://b.hatena.ne.jp/search/text?safe=on&q=rpg%E3%83%84%E3%82%AF%E3%83%BC%E3%83%ABMV&users=100)


##
Android 5 以上で ListView の item を disable にすると境界線が消える問題を回避する

Android 5 以上で、ListView の item を disable （＝ `ListAdapter#isEnabled(position)` で `false` を返す）にすると、item の境界線が消える現象に遭遇しました。
その問題の回避方法（※ベストな策だとは思っていない）を記します。

[Disappearing divider in ListView when ArrayAdapter.isEnabled returns false](http://stackoverflow.com/questions/5375138/disappearing-divider-in-listview-when-arrayadapter-isenabled-returns-false)
も見ましたが、5系ではダメっぽいです。（←英語力の問題だったらゴメンナサイ。。。）

# 現象
* Android 5 以上で、ListView の disable な item の境界線が消える
* どうやら Disable だけではなく、**Enabled でも次の item が Disable なら消える**模様…

![Screenshot_20151231-105631.png](https://qiita-image-store.s3.amazonaws.com/0/9695/bff6d78d-8460-5a58-2aed-52388875c0d7.png)

※↓Android4 の端末での表示
![Screenshot_2015-12-31-10-56-38.png](https://qiita-image-store.s3.amazonaws.com/0/9695/88599b11-8b5c-9237-7574-df2db7bbc7a0.png)
ちゃんと表示されてますね。

# 回避対応
* Adapter のレイアウトファイルに自分で境界線を追加する
 * 境界線を付与して、今までのレイアウトファイルを include するのがオススメ↓
 * https://github.com/tatsuhama/ListViewItemBorder/blob/master/app/src/main/res/layout/list_item_with_divider.xml
 * 色を固定で書いているのは微妙な気がする…
* ListView に `setDivider(null)` を設定する


# 再現確認プログラム
https://github.com/tatsuhama/ListViewItemBorder
に置きました。
回避する改修も行っているので、併せて↑も参照下さい。
Swiftでprintfのような感じで数字をフォーマットする

```swift
print(1)
// 結果 -> 1

print(String(format: "%02d", 1))
// 結果 -> 01

```

例：

```swift
var year  = 2015
var month = 1
var day   = 31
var hour  = 1
var min   = 6
print("今の年月日日時は  \(String(format: "%04d", year))/\(String(format: "%02d", month))/\(String(format: "%02d", day))  \(String(format: "%02d", hour)):\(String(format: "%02d", min))")

// 結果 -> 今の年月日日時は  2015/01/31  01:06
```
XCodeのマウスをつかった操作

XCodeのマウスをつかった操作

選択
　shiftを押しながらで選択行追加
　altを押しながらで部分的な領域を選択

　commandを押しながらで追加で行を選択

　組み合わせて使える。

調査
　command+ワードのタップで定義へ飛ぶ
　alt+command+ワードのタップで定義を別枠で表示
　alt+command+shift+ワードのタップで定義をどの枠で表示するか指定して表示
　alt+ワードのタップでhelp

個人で文字列補完
　Code snippetに追加しcompletion shortcutに登録
Ruby On Rails 4 にmysqlを利用するプロジェクトをさらっと作成する手順

速攻でRuby On Rails + mysqlプロジェクトを作って試したい、という時の手順です。
お試し環境構築を作る手順なので本番用の堅い環境を作る場合は他を御覧ください。

# 前提
* ユーザーはroot。
* myprojectという名のプロジェクト名

## 動作環境
* CentOS 6.7
* ruby 2.2 インストール済
* Ruby On Rails 4.2 インストール済
* mysql 5.5 インストール済

# 手順

早速プロジェクト作成。-d オプションでmysqlを指定。

```
rails new myproject -d mysql
```

therubyracerを有効にする。Gemfileを開いて以下のコメントアウトをアンコメントする。

```
vi myproject/Gemfile
```

```lang:myproject/Gemfile
# gem 'therubyracer', platforms: :ruby
```

rubyracerをインストール

```
cd myproject
bundle install
```

mysqlにツナグためにID,パスワードを指定。

```
vi config/database.yml
```

```lang:config/database.yml

default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: ここにmysqlの管理者ユーザーID
  password: ここにmysqlの管理者パスワード
  socket: /var/lib/mysql/mysql.sock
```

データベース生成

```
bundle exec rake db:create
```

実行していつものWelcome aboard画面がでることを確認。

```
rails s
```

scaffold、DB更新の例

```
rails generate scaffold user username:string password:string 
rake db:migrate
```

# 文献

## Ruby on RailsでMySQLを使用する際に必要な作業手順
http://www.virment.com/rails-setup-mysql/

## Ruby on Rails 4 アプリケーションプログラミング(書籍)

http://www.amazon.co.jp/Ruby-Rails-%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E5%B1%B1%E7%94%B0-%E7%A5%A5%E5%AF%9B/dp/4774164100
jerseyの@QueryParamと@PathParamはURLデコードを自動でする

jersyでは、下記のような@QueryParamや@PathParamなどで受け取った値は、標準では自動でURLデコード処理がかけられています。

このことは[javadoc](https://jersey.java.net/apidocs/2.22/jersey/javax/ws/rs/QueryParam.html) にももちろん書かれています。

```
@GET
public Response findByName(@QueryParam("name") String name) {
　　　// このときnameという変数はURLデコード済みの状態
　　　/* 中略 */
}
```

URLデコード処理をして欲しくないときは[@Encoded](https://jersey.java.net/apidocs/2.22/jersey/javax/ws/rs/Encoded.html) のアノテーションを追加で付与すればよいです。このアノテーションはclassにもつけられ、その場合はそのクラスの全てのメソッドの全てのパラメタに適用されます。

```
@GET
public Response findByName(@QueryParam("name") @Encoded String name) {
　　　// このときnameはリクエストされたURLのままの状態
　　　/* 中略 */
}
```

暗号化されたトークンなど、そのままの状態で扱いたい場合は、上記のようにデコード処理をさせないようにするか、[URLセーフ](http://qiita.com/n_slender/items/13bb4196bab273e081c7)なものにするかです。

また、[Json Web Tokens](https://jwt.io/) でも、URLセーフなトークンを実現できます。


#　参考サイト

http://stackoverflow.com/questions/13626990/jax-rs-automatic-decode-pathparam

http://stackoverflow.com/questions/2291428/jax-rs-pathparam-how-to-pass-a-string-with-slashes-hyphens-equals-too

http://qiita.com/kaiinui/items/21ec7cc8a1130a1a103a
Sphinx ドキュメントから Electron アプリを作成


実用的かどうかはさておき、Sphinx のドキュメントからマルチプラットフォームのアプリ(ドキュメント)を作成できます。


## Sphinx の準備

``` shell
$ pip install sphinx
$ mkdir hello-sphinx-electron
$ cd hello-sphinx-electron
```

Sphinx quick start.
> Separate source and build directories (y/n) [n]: y

上記以外は全てデフォルトで作成。

``` shell
$ sphinx-quickstart
Welcome to the Sphinx 1.3.3 quickstart utility.
...
Enter the root path for documentation.
> Root path for the documentation [.]: 
...
> Separate source and build directories (y/n) [n]: y
...
> Name prefix for templates and static dir [_]: 
...
> Project name: hello sphinx electron
> Author name(s): Daigo Sakamoto
...
> Project version: 0.1
> Project release [0.1]: 
...
> Project language [en]: 
...
> Source file suffix [.rst]: 
...
> Name of your master document (without suffix) [index]: 
...
> Do you want to use the epub builder (y/n) [n]: 
...
> autodoc: automatically insert docstrings from modules (y/n) [n]: 
> doctest: automatically test code snippets in doctest blocks (y/n) [n]: 
> intersphinx: link between Sphinx documentation of different projects (y/n) [n]: 
> todo: write "todo" entries that can be shown or hidden on build (y/n) [n]: 
> coverage: checks for documentation coverage (y/n) [n]: 
> pngmath: include math, rendered as PNG images (y/n) [n]: 
> mathjax: include math, rendered in the browser by MathJax (y/n) [n]: 
> ifconfig: conditional inclusion of content based on config values (y/n) [n]: 
> viewcode: include links to the source code of documented Python objects (y/n) [n]: 
...
> Create Makefile? (y/n) [y]: 
> Create Windows command file? (y/n) [y]: 

Creating file ./source/conf.py.
Creating file ./source/index.rst.
Creating file ./Makefile.
Creating file ./make.bat.

Finished: An initial directory structure has been created.
```

source ディレクトリの index.rst を編集。

``` index.rst
Hello sphinx electron
=====================

Hello hello hello
```

## sphinx-electron を設定

[sphinx-electron](https://bitbucket.org/superdaigo/sphinx-electron) を clone して、[electron-packager](https://github.com/maxogden/electron-packager) をインストール。

``` shell
$ git clone git@bitbucket.org:superdaigo/sphinx-electron.git
$ cd sphinx-electron
$ npm install electron-packager
```


Makefile に次のコードを追加。(インデントはタブなので注意)

``` Makefile
app:
	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
	rm -rf sphinx-electron/html;cp -r $(BUILDDIR)/html sphinx-electron/html
	cd sphinx-electron; npm run release
	@echo
	@echo "Build finished. The apps are in $(BUILDDIR)/app."
```

## アプリをビルド
Electron アプリの設定はそのままで、Electron アプリをビルド。
OSX で win32 のアプリをビルドするには wine のインストールが必要です。

``` shell
$ make app
```

完成。

![](https://www.evernote.com/l/ABvSWggQn9ZBlJ5aGDxrECKnHFXRSYSHxtAB/image.png)
SecureCRT（Cisco Catalyst）コマンドTips

あまり需要はないと思うが、業務で使うのでTipsを書いていく。

## Switchのバージョン

```
sh version
```

## ステータス一覧

```
sh int status
```

## エラーがおきてないかチェック

```
term mon
```

## MAC Addressからポート検索

```
sh mac addr addr 00-21-86-FC-37-D9
show mac address-table address 00-21-86-FC-37-D9
```

## ポートの設定確認

```
sh run int g4/25
show running-config interface GigabitEthernet 4/25
```

## ポートのセッション確認

```
sh auth sess int g4/25
show authentication sessions interface GigabitEthernet 4/25
```

## デスクリプションの一覧確認

```
sh int desc
show interface description
```

## VLANを調べる。

```
show interfaces GigabitEthernet5/41 switchport | i vlan
```

## 条件追加

パイプ`|`ではさむ
例：結果から1024を含む行を抜き出す

```
sh mac addr | i 1024
```

## 条件検索
`i`での後に検索したい文字を書く
例:デスクリプション一覧からの中からtestを含む結果を抽出する。

```
sh int desc | i　test
```
今後気づいたらどんどん追加する。
9-patch image xx.9.png malformed. エラー

メモ

動作環境:Android Studio 2.0 Preview 3

#9patchを入れたらエラー
画像を入れてRunもしくはClean Projectするとエラーが出た

```
:app:mergeDebugResources
AAPT err(Facade for 804541x78) : No Delegate set : lost message:ERROR: 9-patch image /path/app/src/main/res/drawable/button_radius_left_blue_small.9.png malformed.
AAPT err(Facade for 804541x78) : No Delegate set : lost message:       Frame pixels must be either solid or transparent (not intermediate alphas).
AAPT err(Facade for 804541x78) : No Delegate set : lost message:       Found at pixel #1 along right edge.
```

端1pxが透明(transparent)じゃないですよエラー。

button_radius_left_blue_small.9.pngが該当の9patch画像。
sdk/tools/draw9patchを使って作っていればこうはならないはずだが、9patch画像って結局端っこ1pxを塗りつぶした画像だろ、と思ってphotoshopでリサイズしたりしていたらエラー出た。
結局リサイズしてから再度draw9patchで書き出したら直った
ど素人が20分でわかるBootstrapにおけるレスポンシブデザイン

下記、英語のビデオがとても良かったのでシェアします。
英語苦手な方は、コードと画面の動きだけ見ていただければと思います。
https://youtu.be/Ct7APU7t-ts

＊Bootstrapがいかにスマホ最適化(mobile first)のWebデザインに向いているか

＊Bootstrapグリッドシステム => コラムのゼロからのライブコーディング

＊Bootstrapナビゲーションバー => ゼロからのライブコーディング

この様なわかりやすいチュートリアルビデオの作成は自分の勉強にもなるので、
将来的にチャレンジしたいと思います。
ど素人が20分で理解できるレスポンシブデザインの本質

下記英語ビデオ、めっちゃわかりやすかったので共有します。
英語苦手な方でも動く画面やコードを見ればレスポンシブの本質が20分で理解できます。
https://www.youtube.com/watch?v=BIz02qY5BRA

＊レスポンシブとはそもそも何なのか？
=> 画面サイズに反応してサイトのレイアウトが自動で変わる仕組み(反応=respond)
=> divタグごとに画面サイズの条件付きCSSを設定する

＊メディアクエリの仕組み
例)
```<link rel = "stylesheet" href="css/responsive.css" media="screen and (max-width: 900px)" ``` 


＊ビューポートの仕組み

この様なチュートリアルビデオを作ると自分自身勉強になるので、
いつかトライしたいと思います。
Rubyにおけるyieldの意味

`yield`の意味がしばらくわからなかったけど、いろいろなサイトを見つけながら感覚を掴んだので、書く。

# yield とは
`yield`はあるメソッドに渡された手続きを実行するためのシンボル。

# 例えば
とあるメソッドを用意して、その中で`yield`を宣言する。

```rb
def some_method(x)
  yield x
end
```

このメソッドに対して、`{|i| puts i}`という手続きAを渡してやると、`yield`が宣言された箇所で手続きAが実行される。
こんな感じ。

```rb
some_method('hoge'){|i| puts i}
```

すると実行結果は、以下のようになる。
> => hoge

some_methodは何もやらないメソッドなのに渡した手続きが実行されて、`hoge`が出力されます。
node-redでmythingsを発火。

#概要
やっと、node-redでmythingsを発火できた。
mqttでは、できてない。
#写真
![post.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/78877a40-60d9-e771-15b3-bbccf8395c48.jpeg)

#設定
```
method: post
url: http://you /data/triggger-1 uuid
payload: {"text1": "okok"}
headers: {"meshblu_auth_uuid": "trigger-1 uuid", "meshblu_auth_token": "trigger-1 token"}
```
GMailでスパム判定されてしまう場合の対策

GMailにsmtpでメールを送信する場合、特にスパムではないのにスパム扱いを受けてしまい、下記のようにメールを送信できない場合がある。

```shell-session
Dec 31 08:28:11 localhost postfix/smtp[5071]: 027F2105D03D6: to=<hoge@gmail.com>, 
relay=aspmx.l.google.com[2404:6800:4008:c01::1a]:25, delay=1.7, delays=0.04/0/1.1/0.58, dsn=5.7.1, status=bounced (host aspmx.l.google.com[2404:6800:4008:c01::1a] said: 550-5.7.1 [2001:2e8:61a:0:2:1:0:3a      12] 
Our system has detected that this 550-5.7.1 message is likely unsolicited mail. To reduce the amount of spam sent 550-5.7.1 to Gmail, this message has been blocked. Please visit 550 5.7.1  
https://support.google.com/mail/answer/188131 for more information. m189si2947216ioe.53
```

## そんなときのためのチェックリスト

- [spf](https://support.google.com/a/answer/33786?hl=ja)レコードがきちんと設定されているか
- 文字に記号が入っていないか（※、【】など）
- 「送信専用アドレスです」というような文言が入っていないか

これらを確認し、修正したところ、無事メールを送れるようになった。
タブバーの高さと、文字の位置・大きさを変えて、文字だけのタブバーを作る


デフォルトでは、タブバーはアイコンと小さな文字で構成されます。
アイコンを用意するのは面倒だし、文字だけでタブバーを作れないものかと思い立ち、実装してみました。

アイコンを使わないだけなら、画像を設定しなければ良いだけなのですが、それだけだと小さな文字がタブバー下部に配置されてしまいますよね。
文字を大きくして、タブバーの真ん中付近に配置したいです。また、文字だけにするとなると、デフォルトのタブバーではちょっと縦長過ぎますよね。なので高さも小さくしたいです。

# 実装方法

Swift 2.1です。

## 文字の位置と大きさを変える
タブバー上の各UITabBarItemが、文字の位置と大きさを持っています。アプリケーション内で使用されるタブバーは高々1つでしょうから、以下のようにしてまとめて変更してしまって良いと思います。
一行目で好きなフォントを割り当て、二行目で座標を変更しています。


```swift
UITabBarItem.appearance().setTitleTextAttributes([NSFontAttributeName: UIFont(name: "Avenir-Medium", size: 14)!], forState: .Normal) // 好きなフォントを
UITabBarItem.appearance().titlePositionAdjustment = UIOffsetMake(0, -9)
```

これをTabBarViewControllerのviewDidLoadなり、AppDelegateのapplication:didFinishLaunchingWithOptionsなりに配置すれば良さそうです。

## タブバーの高さを変える

描画されるタブバーの高さは、UITabBarのsizeThatFitsにより決まっているようです。なのでそれをoverrideして、適当な高さを与えて返すようにすることで、高さを変えることができます。 

```swift
class TabBar: UITabBar {
    
    override func sizeThatFits(size: CGSize) -> CGSize {
        var size = super.sizeThatFits(size)
        size.height = 40
        return size
    }
    
}
```


# サンプルコード

以下の例ではタブバーのViewControllerを適当なstoryboardから取得しています。

```swift
class TabBar: UITabBar {
    
    override func sizeThatFits(size: CGSize) -> CGSize {
        var size = super.sizeThatFits(size)
        size.height = 40
        return size
    }
    
}
```

```swift
class TabBarViewController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        addTabBarItems()
        layoutTabBarItems()
    }

    func addTabBarItems() {
        addChildViewControllerWithStoryboardName("Timeline")
        childViewControllers.last?.tabBarItem = UITabBarItem(title: "Timeline", image: nil, tag: 1)
        addChildViewControllerWithStoryboardName("MyPage")
        childViewControllers.last?.tabBarItem = UITabBarItem(title: "MyPage", image: nil, tag: 2)
    }
    
    func addChildViewControllerWithStoryboardName(storyboardName: String) {
        let storyboard = UIStoryboard(name: storyboardName, bundle: nil)
        let vc = storyboard.instantiateInitialViewController()        
        addChildViewController(vc!)
    }

    func layoutTabBarItems() {
        tabBar.translucent = false
        tabBar.barTintColor = UIColor.lightOrangeColor()
        tabBar.tintColor = UIColor.deepGrayColor()
        
        UITabBarItem.appearance().setTitleTextAttributes([NSFontAttributeName: UIFont(name: "Avenir-Medium", size: 14)!], forState: .Normal)
        UITabBarItem.appearance().titlePositionAdjustment = UIOffsetMake(0, -9)
    }
    
}
```

![sample.png](https://qiita-image-store.s3.amazonaws.com/0/48755/ca6f4f30-24f9-e337-bc37-464ede899ec7.png "sample.png")
YAMLでクォート `'` をエスケープする

Railsで`i18n`する時に `en.yml`とか `ja.yml`とか使うわけですが、このYAMLファイルの中で`'`を使おうと思ってこんなふうに書くとエラーになります。

```en.yml
  do_not_do_it: 'don\'t do it.'
```

quoteのエスケープは

```en.yml
  do_not_do_it: 'don''t do it.'
```
になります。

### 参考

https://github.com/dotmaster/toYaml/issues/1
Node.jsのバージョンを管理する


バージョンアップしたい時とか、上げたら不具合出たとか、プロジェクトによって使いたいバージョンが違うなんて時はどうしましょうという時のために各OS別のメモ。

[Node.js公式サイト](https://nodejs.org/en/download/releases/)のパッケージは直接インストールせずバージョン管理ツールを利用する。


## Linux / nvm

https://github.com/creationix/nvm

デフォルトだと`~/.nvm/`にインストールされるので変更したい場合はgithubのREADME参照。

### インストール

githubで最新版を確認すること。

```
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash
```

### 使い方

利用できるnode.jsのバージョンを見てみると、全てのバージョンがズラ～っと出る。

```
$ nvm ls-remote
        v0.1.14
        v0.1.15

        .
        .
        .

         v4.2.4
         v5.0.0
         v5.1.0
         v5.1.1
         v5.2.0
         v5.3.0
```

入れたいバージョン選んでインストールする。npmも勝手に入る。

```
$ nvm install 4.2.4
Downloading https://nodejs.org/dist/v4.2.4/node-v4.2.4-linux-x64.tar.xz...
######################################################################## 100.0%
WARNING: checksums are currently disabled for node.js v4.0 and later
Now using node v4.2.4 (npm v2.14.12)
$ nvm install 5.3.0
Downloading https://nodejs.org/dist/v5.3.0/node-v5.3.0-linux-x64.tar.xz...
######################################################################## 100.0%
WARNING: checksums are currently disabled for node.js v4.0 and later
```

なんかWARNING出てる( ˙-˙ )

現在のバージョンを確認してみる。

```
$ node -v
v5.3.0
$ npm -v
3.3.12
```

インストールしたNode.jsのバージョンは`nvm ls`で見れる。

```
$nvm ls
         v4.2.4
->       v5.3.0
node -> stable (-> v5.3.0) (default)
stable -> 5.3 (-> v5.3.0) (default)
iojs -> N/A (default)
```

バージョンを指定して切り替える事ができる。npmも同時に切り替わる。

```
$ nvm use 4.2.4
Now using node v4.2.4 (npm v2.14.12)
$ node -v
v4.2.4
$ npm -v
2.14.12
```

ログインするたびにバージョン指定しないといけないのでデフォルトのバージョンを指定する。

```
$ nvm alias default 5.3.0
```

ちなみに、iojsというのはv0.12からforkして別途開発が行われていたプロジェクトで、Node.js v4で統合されました。


## Mac / nodebrew

nvmと大体同じ。

https://github.com/hokaccha/nodebrew

### インストール

既に入ってたらアンインストールしておきましょう。

brewでインストールしてたら

```
$ brew uninstall node
```

本家のNode.jsをインストールしてたら

```
$ curl -ks https://gist.github.com/nicerobot/2697848/raw/uninstall-node.sh | bash
```

nodebrewインストール

```
$ curl -L git.io/nodebrew | perl - setup
$ export PATH=$HOME/.nodebrew/current/bin:$PATH
$ source ~/.bashrc
```

### 使い方

インストール可能なバージョンを確認

```
$ nodebrew ls-remote
```

指定バージョンをダウンロード

```
$ nodebrew install-binary 4.2.4
```

ダウンロードしたバージョンを確認

```
$ nodebrew ls
```

切り替え

```
$ nodebrew use 4.2.4
```

## Windows / nodist

Windowsにもあるんですね。使い勝手は大体同じ。

https://github.com/marcelklehr/nodist

### インストール

githubにインストーラのリンクがあるので、それでインストールできる。

### 使い方

インストール可能なバージョンを確認

```
> nodist dist
```

指定バージョンをダウンロード

```
> nodist add 5.3.0
```

ダウンロードしたバージョンを確認

```
> nodist ls
```

切り替え

```
> nodist use 5.3.0
```


各ツールの詳しい使い方は本家のサイトの方を参照して下さい。
kintoneで動的かつ処理順が保証されるPromiseオブジェクトを生成したい。

# kintone.Promise使いこなしてますか？
僕はまだまだです 
Promiseを動的に生成してデータ処理したい場合の処理について簡単にまとめてみました。

##シチュエーション
- アプリAから該当データを1000件取ってきて、アプリBに追加したい
- POST APIを使いたいが仕様上100件づつまとめて処理したい
- 最初の100件追加…次の100件追加…さらに次の100件追加…と順にAPIに送って欲しい
- Promise.then()で順次処理できるのはわかるけど、データ件数は不定。
- とにかく動的にPromise-then()で処理をしていきたい！ :astonished: 

##コーディング例
あれこれ迷いながら、ようやく完成。だいたいこんな感じ。

```
    var count = 0;
    //promiseオブジェクトを返す関数を定義
    var addPromise = function() {
        return new Promise(function(resolve, reject) {         
            kintone.api(
                kintone.api.url('/k/v1/records', true),
                'POST', {
                app: アプリのID,
                "records":promiseArr[count]/* 100件単位のデータと思って下さい。これがkintoneAPIにPOSTされる */
                }
            ).then(function(resp){
                count+=1;
                resolve();
            });
        });
    };

    //ここで動的にthenをつけていく
    var doPromise = addPromise();
    for (var i = 0; i < promiseArr.length; i++) {
        doPromise = doPromise.then(addPromise);
    }

```
docker run でタイムアウト出力

docker runを実行するとタイムアウト表示が出力された。

```
$ docker run docker/whalesay cowsay boo
Unable to find image 'docker/whalesay:latest' locally
Pulling repository docker.io/docker/whalesay
Network timed out while trying to connect to https://index.docker.io/v1/repositories/docker/whalesay/images. You may want to check your internet connection or if you are behind a proxy.
```

この時は遅いネットワークに接続していたからそのせいかと思ったけど、念のため確認。  

[Network timed out while trying to connect to https://index.docker.io - Stack Overflow](http://stackoverflow.com/questions/31990757/network-timed-out-while-trying-to-connect-to-https-index-docker-io) にあるように、再起動と設定リフレッシュを実行。

```
$ docker-machine restart default
(default) Stopping VM...
(default) Starting VM...
Restarted machines may have new IP addresses. You may need to re-run the `docker-machine env` command.

$ eval $(docker-machine env default)
```

これでpullできるようになった！

```
$ docker run docker/whalesay cowsay boo
Unable to find image 'docker/whalesay:latest' locally
latest: Pulling from docker/whalesay
2880a3395ede: Pull complete
515565c29c94: Pull complete
・・・
 _____
< boo >
 -----
    \
     \
      \
                    ##        .
              ## ## ##       ==
           ## ## ## ##      ===
       /""""""""""""""""___/ ===
  ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
       \______ o          __/
        \    \        __/
          \____\______/
```
Fertile Forest Model (9/n) ノード削除

# ノードの削除

ツリー構造データにおけるノード削除には、次の 3種類があります。

> 1. 指定ノードを部分木ごと削除する
> 2. 指定ノードの子孫ノードだけ削除する
> 3. 指定ノードを削除して、その子孫ノードを繰り上げる

```
DEPTH|
     |
   0 | [A]--+-----------+
     |      |           |
   1 |     [B]--+---+  [C]--+---+
     |          |   |       |   |
   2 |         [D] [E]     [F] [G]--+---+
     |                              |   |
   3 |                             [H] [I]
-----+-------------------------------------------
     |  0   1   2   3   4   5   6   7   8   QUEUE
```

## 指定ノードを部分木ごと削除する

指定ノードを部分木ごと削除するクエリは、部分木の検索クエリの WHERE 句がそのまま使えます。以下は、[B] の部分木ノードの削除文です。

``` SQL
DELETE
  FROM ff_tables
  WHERE ff_queue >= 1
    AND ff_queue <=
      COALEPSE(
        (SELECT MIN(ff_queue) - 1
          FROM ff_tables
          WHERE ff_queue > 1 AND ff_depth <= 1
        ),
        0x7fffffff
      )
;
```

## 指定ノードの子孫ノードだけ削除する

指定ノードの子孫ノードだけ削除するのも、部分木クエリと同じく検索クエリの応用で簡単に実装できます。以下は、 [B] の子孫ノードの削除文です。

``` SQL
DELETE
  FROM ff_tables
  WHERE ff_queue > 1
    AND ff_queue <=
      COALEPSE(
        (SELECT MIN(ff_queue) - 1
          FROM ff_tables
          WHERE ff_queue > 1 AND ff_depth <= 1
        ),
        0x7fffffff
      )
;
```

## 指定ノードを削除して、その子孫ノードを繰り上げる

指定ノードを削除してその子孫ノードを繰り上げるのは少し煩雑です。指定ノードを削除する DELETE 文と子孫ノードを繰り上げるための UPDATE 文を発行する必要があります。

以下は、 [B] を削除して [B] の子孫ノードを繰り上げる手順です。

``` SQL
mysql> BEGIN;

mysql> DELETE
  FROM ff_tables
  WHERE ff_queue = 1
;

mysql> UPDATE ff_tables
  SET ff_depth = ff_depth - 1
  WHERE ff_queue > 1
    AND ff_queue <=
      COALEPSE(
        (SELECT MIN(ff_queue) - 1
          FROM ff_tables
          WHERE ff_queue > 1 AND ff_depth <= 1
        ),
        0x7fffffff
      )
;

mysql> COMMIT;
```
WordPressで外観->カスタマイズからプレビューを見ながら編集する方法

# WordPressでテンプレートもプレビューを見ながら編集しよう
**「トップの文言ちょっとだけ変えたいんだけど・・・」**
テンプレートで直書きだから面倒！入れ込み担当にサクッとやってもらえたら・・・
でも設定項目にいちいち各項目を作るのはちょっと・・・
そんなときに簡単に変えられるようにWP_Customize_Managerを使ってプレビューを見ながら編集できるようにしましょう！

![add_setting.gif](https://qiita-image-store.s3.amazonaws.com/0/64362/2ceaa853-acf8-fe84-11b4-33126e118bfa.gif "add_setting.gif")

WordPressではトップなどテンプレートに組み込んである箇所を外観->カスタマイズからプレビューを見ながら編集することができます。
その実装はWP_Customize_Manager内の各メソッドを呼ぶことによって可能です。

## 手順
- customize_registerにアクションフックを設定
- add_panelでパネルを追加
- add_sectionでセクション追加
- add_settingで設定項目追加
- add_controlでセクションと設定項目を結びつけ

順を追って見ていきましょう

まず各名称について、WordPressの管理画面、左のメニュー「外観」から「カスタマイズ」に行きます。
そのときの画面を下記の画像として説明していきます。
![スクリーンショット 2015-12-31 1.47.16.png](https://qiita-image-store.s3.amazonaws.com/0/64362/554d7c99-4b02-3a01-16bd-86e608228f18.png)

パネルというのがここでは「パネルタイトル」という項目になります。
セクションはここでは「サイトタイトルとキャッチフレーズ」と「固定フロントページ」ですね。
設定項目が「サイトのタイトル」、「キャッチフレーズ」となります。

パネルがセクションを内包し、セクションが設定項目を内包している感じですね。
例えば、パネルをクリックすればここと同じようにセクションがまた並んでいる形になっていて、そのセクションをクリックすると、設定項目が並んでいるようになっています。
ちなみにパネルを使わずに最初からセクションといったことも可能です。

## コード
では具体的にコードを見ていきます。

```php
/* 設定側 */
function theme_customize_register($wp_customize) {
	/* Panel */
	$wp_customize->add_panel( 'パネルID',
		array(
			'priority' => 30, // パネルの表示順
			'title' => __( 'パネルタイトル', 'テーマID' )
			)
		);
		
	/* Section */
	$wp_customize->add_section( 'セクションID' ,
		array(
			'title' => __( 'セクションタイトル', 'テーマID' ),
			'panel' => '親となるパネルID'
			)
		);

	/* Setting */
	$wp_customize->add_setting('設定ID',
		array(
			'default' => __('デフォルト文', 'テーマID')
			)
		);

	/* Control */
	$wp_customize->add_control( new WP_Customize_Control(
		$wp_customize,
		'紐付ける設定ID',
		array(
			'label' 	=> __('ラベル文', 'テーマID'),
			'section' 	=> '紐付けるセクションID',
			)
		)
	);
}
add_action( 'customize_register', 'theme_customize_register' );

```
上述した通り、add_panelでパネル、add_sectionでセクション、add_settingで設定項目、add_controlでセクションと設定項目の紐付けを行っています。

```php
/* 取得側 */
$test = get_theme_mod('設定ID', __('デフォルト文', 'テーマID') );
echo esc_html($test);
```
取得側ではget_theme_modを用いて取得します。
ちなみにhtmlspecialcharsなどはかかっていない状態で取得されますので正しく表示されるようesc_htmlでフィルターしてあげるといいでしょう。

これでプレビューを見ながら編集することができるはずです！
CSSなんかもこの項目に含めることができたり、JSを使うことで更にリアルタイムにプレビューすることも可能みたいです。
どこまで実装するかは実装工数、運用のときを考えて計画的に！

## 参考
http://www.webopixel.net/wordpress/586.html
https://wpdocs.osdn.jp/%E3%83%86%E3%83%BC%E3%83%9E%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA_API
https://developer.wordpress.org/themes/advanced-topics/customizer-api/
配列よりもオブジェクトを使うべき時があると知る

JavaScriptのデータ構造について１つ学びがあったのでメモします。
まずは例をご覧ください。

## ユニークではない数値の登場回数を調べる


最初に書いたコードがこちら。

```js
  var count = 0;
  var flags = [];

  for(var i = 0; i < data.length; i += 1) {
    flags.push(false);
  }
  for(var i = 0; i < data.length; i += 1) {
    if(flags[data[i]]) {
      count += 1;
    } else {
      flags[data[i]] = true;
    }
  }
  console.log(count);
```

フラグの配列を使用しています。
まず最初にfalseで埋めます。そして、登場した番号にはtrueを割り当てます。

最終的に、ユニークでない数値が何回登場したのかを出力しています。

これを改変したのが次のコード。

```js
  var count = 0;
  var flags = {};

  for(var i = 0; i < data.length; i += 1) {
    if(flags[data[i]]) {
      count += 1;
    } else {
      flags[data[i]] = true;
    }
  }
  console.log(count);
}
```
 

改良後のコードは３行短くなっています。
そうです、最初にfalseで埋める作業をスキップしたのです。

なんでこんなことができるかというと、オブジェクトを利用しているからなんですね。

例えば、３番目のフラグを用意する時。
配列ならば、１番目と２番目の要素をまずは埋めなくてはいけません。ただし、１番目と２番目が必要かどうかは不明です。
それがオブジェクトならば、{ '3' : false }とすればいいのです。１番目と２番目は必要になってから定義すればいいのです。


## 得られた知見
今までは配列をベースのコードを書いてきたのですが、オブジェクトもけっこう便利ですね（何を今さらって感じですが）

特に、順序立てが重要ではない場合は、積極的にオブジェクトを使っていくべきかもしれません。
mac os x yosemiteにv8jsをインストール

Mac OS Xの場合はbrewでは簡単にできます。公式のドキュメントでは２つの方法が載ってまして、コンパイル式とbrewです。ここで、簡単なbrewでインストールしたのでbrewの方法を紹介したいと思います。

brewを次のコマンドでv8Jsをインストールします。もしいま使っているphp56の場合はphp56-v8jsと置き換えてください。

```
brew install homebrew/php/php55-v8js
```

そして、php.iniにv8jsのphp拡張ファイルphp55-v8js.soを登録します。

ファイルの最後に次のように拡張を登録します。

```
extension=/usr/local/Cellar/php55-v8js/0.4.0/v8js.so
```

最後に、php -iで正しくv8js拡張が登録されているかを確認します。もし問題がなかったらこれで完了しますが、問題が発生したらもう少し頑張ってください。一応私が遭遇した問題とその解決方法を下に共有しておきます。

### その他のインストール問題

```
Warning: PHP Startup: Unable to load dynamic library '/usr/local/Cellar/php55-v8js/0.4.0/v8js.so'
 - dlopen(/usr/local/Cellar/php55-v8js/0.4.0/v8js.so, 9): 
Library not loaded: /usr/local/opt/v8/lib/libv8.dylib
```
この問題はbrewがフォルダの権限問題でうまくシンボリックを作ってくれなかったから、ファイルが見つからずライブラリーが起動できないと怒っています。ここで、私がln -sコマンドでbrewが作れなかったシンボリックを作ってあげたらうまく行きました。

```
ln -s /usr/local/Cellar/v8/4.7.80.25 /usr/local/opt/v8
```
變數和 block/closure 的互動，從 Objective-C 到 Swift

Swift 的 closure 即使和 Objective-C 的 block 非常的相像，但是在取得外部變數的值時，做法是不同的。

先看這兩段 code ，做的事情是一樣的：

> 1. 宣告一個整數和一個字串
> 2. 宣告一個 block
> 3. 執行這個 block
> 4. 變動整數和字串的值
> 5. 再執行這個 block

### Objective-C

``` objc
NSInteger myInt = 1;
NSMutableString *myString = [@"Hello" mutableCopy];
    
void (^myBlock)(void) = ^() {
    NSLog(@"%@, %@", @(myInt), myString);
};
    
myBlock();
    
myInt = 2;
[myString appendString:@", world"];
    
myBlock();
```

### Swift
``` swift
var myInt = 1
var myString = "Hello"

let myBlock = {
    print("\(myInt), \(myString)")
}

myBlock()

myInt = 2
myString.appendContentsOf(", world!")


myBlock()
```

## 印出結果

可以發現兩個語言在類似語句，呈現結果卻不一樣的結果：

### Objective-C

``` text
1, Hello
1, Hello, world
```

**說明：**

> `NSInteger` 是 primitive type ，變數是存「值」、`NSString` 是存「記憶體位置」

因此在 `myBlock` 宣告的時候，各自 capture 這兩個值（1 和 `myString` 的記憶體位置）
於是在 block 外變更這兩個數值之後再印出，captured 的 `1` 和 `myString` 的記憶體位置都不會變動，但是 `myString` 記憶體位置所存的內容改了，才會印出 `Hello, world`

### Swift

``` text
1, Hello
2, Hello, world!
```

**說明：**

> 在 Swift 的 closure 的情形之下， closure 會即時去 capture 執行時變數 **當下** 的數值。

在執行第一次 `myBlock()` 的時候，變數值是 `1` 和 `Hello` ，
接著執行第二次前 `myBlock()` 的時候，變數值就已經被變動成 `2` 和 `Hello, world!` ，這兩個值就會被 `myBlock()` capture 進去用

# 結語 - 注意使用

知道 Swift 的 data type 基本上都變成 struct 之後，就馬上來嘗試這段 code 的結果會不會不同，於是和預想一樣結果不同了。

兩個很類似的東西即使寫法類似，在不同的語言之下執行的結果會不相同的時候，實作上就可以注意一下執行結果會不會因為特性改變而影響。

# 參考

- [Closures - The Swift Programming Language (Swift 2.1)](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html#//apple_ref/doc/uid/TP40014097-CH11-ID94)
AppleScriptでEvernoteの子タグを取得するときのコツ


* Evernoteのタグは階層構造をとれる
	* 例：とある4つのタグが次のような構造になっているとする


> * ParentTag
> 	* ChildTag1
> 	* ChildTag2
> 	* ChildTag3


* AppleScriptからもタグの親子関係を取得可能
	* タグのparent属性を使う


> **tag** n : A tag.
> 
> 
> elements
> contained by application.
> 
> properties
> **name** (text) : The tag's name.
> **parent** (tag or missing value) : The tag's parent tag, if any.
> 
> responds to
> assign, unassign.


* **しかし子タグを取得するのがとても遅い**
	* 次の単純なAppleScriptで30秒以上もかかってしまう


```applescript:
tell application "Evernote"
	set parentTag to tag "ParentTag"
	
	set timestamp to current date --start
	
	get tags whose parent = parentTag
	--> {tag "ChildTag2", tag "ChildTag3", tag "ChildTag1"}
	
end tell
log "time: " & (current date) - timestamp & " seconds" --end
(*time: 31 seconds*)
```


* 子タグをスムーズに取得するコツ
	* フィルタの比較項目を変える
		* `get tags whose ...`の行だけ違う
		* 上のAppleScriptは **タグそのものでフィルタ** をかけていた
		* 下のAppleScriptは **タグの名前でフィルタ** をかけている
	* 動作時間は31秒から0秒に短縮
		* 一見回りくどいことをやっているけれど名前でフィルタをかけた方が高速


```applescript:
tell application "Evernote"
	set parentTag to tag "ParentTag"
	
	set timestamp to current date --start
	
	get tags whose name of parent = (name of parentTag as text)
	--> {tag "ChildTag2", tag "ChildTag3", tag "ChildTag1"}
	
end tell
log "time: " & (current date) - timestamp & " seconds" --end
(*time: 0 seconds*)
```

* おまけ：最上階層のタグのみを取得する方法
	* タグの名前でフィルタする必要はない

```applescript:
tell application "Evernote"
	get tags whose parent = missing value
end tell
```
ArduinoをNode.jsで制御する

http://www.bonno.xyz/ を作るために、Node.jsからArduinoにデータを送信する必要がありました。

MacBookでNodeのプロセスを立ち上げ、USB接続したArduinoを操作します。

ライブラリとしては [voodootikigod/node-serialport](https://github.com/voodootikigod/node-serialport) を使いました。

## 準備

`npm init`し、package.jsonが存在する前提です。

`npm install serialport --save`し、serialportをインストールします。

## Node.js側

```js:
var SerialPort = require("serialport").SerialPort;
var serialPort = new SerialPort("/dev/cu.usbmodem14221", {
  baudrate: 14221
});
serialPort.on('open', function () {
  console.log('serial open');
});
serialPort.write("1\n", function(err, results) {
  console.log('err ' + err);
  console.log('results ' + results);
});
```

`/dev/cu.usbmodem14221`の部分はArduino IDEで繋いだ時に表示されるデバイス名を設定します。
パラメータの`baudrate`はどこかからコピってきたので、何が良いのかわかってないです。とりあえず動いたから、これでいいかなーという感じです。

`serialPort.write`の第一引数がArduino側に送信されます。

## Arduino側

```
void setup() {
  Serial.begin(9600);
}

void loop() {
  int inputchar = Serial.read();
  if (inputchar != -1 ){
    Serial.print(inputchar);
    // TODO anything
  }
}
```

`Serial.begin`の引数は、どこかからコピってきたので、何が良いのかわかってないです。
`Serial.read`により、最初の1バイトが取得できます。
`-1`ではない場合、何かが送信されたとして、なにかしらの処理が実行出来ます。

## 具体的には？

http://noboru.hatenablog.jp/entry/2015/12/30/175836 ここに書いた通り、Node.js側でWebSocketのイベントを受け、シリアルポートにデータを書き込み、サーボモータを動かしました。

こんな感じで、ネット上のWebSocketサーバから物理的なモータとかを簡単に動かせるようになったので、アイディア次第でいろいろ出来そうですね。

今回は除夜の鐘ということで、年末に間に合わせるために詳しく調べてない部分が多いので、時間があったら詳しく調べないとですね。
Windows 2012 R2にSQLPlus(Oracle Instant Client)をインストールするメモ

## 方法１

http://www.oracle.com/technetwork/jp/database/enterprise-edition/downloads/112010-win32soft-098788-ja.html
でインストーラをダウンロード。


## 方法２
http://www.oracle.com/technetwork/topics/winx64soft-089540.html

で
instantclient-basic-windows.x64-12.1.0.2.0.zip 
instantclient-sqlplus-windows.x64-12.1.0.2.0.zip 
をダウンロード、同じフォルダに解凍。パスを追加。


以下、ダウンロードセンターからダウンロードしてインストール。
http://www.microsoft.com/ja-jp/download/details.aspx?id=14632


参考：
https://karuakun.wordpress.com/2015/04/03/oraops12-dll%E3%81%8C%E8%A6%8B%E3%81%A4%E3%81%8B%E3%82%89%E3%81%AA%E3%81%84%E3%81%A8%E6%80%9D%E3%81%A3%E3%81%9F%E3%82%89%E3%80%81msvcr100-dll%E3%81%8C%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F/