OmniAICreator/Qiita-1.07M huggingface dataset:
Handlebars の each 内の コンテキスト


#Handlebars と Assemble

###Handlebars 
いわずもがな js テンプレート, これ自体をあんましチョイスすることはあるのだろうか

## Assemble
Handle bars を使用した 静的テンプレートエンジン。 
grunt で動く。 gulp はまだ開発段階。
middleman とは使い勝手も違うが、node 製なので 軽く動く。
やりたいことさえ明確なら、assemble の方が嬉しいこともあるかもしれない。

#each とそのコンテキスト

Handlebars には each という機能がある。
`hoge.json` とかに対して、ブン回す。よくある機能だね。

例えばのファイルを定義しておこう

```hoge.json
{
	"list":[
		{
			"val1": "a",
			"val2": "b",
		},
		{
			"val1": "a",
			"val2": "b",
		},
		{
			"val1": "a",
			"val2": "b",
		},
		...
		
	]  
}
```
hobe.josn

## each 中のコンテキスト
これは、 `hoge.json` に対して向いている。
このとき、this を用いることができる。


``` 
{{#each hoge.json}}

	{{this.val1}}

{{/each}}
```

とか書けば。

```
a
a
a
...
```
と出力される。まぁ正しい。

# コンテキストって何
ここでいうコンテキストっていうのはなんだろうか？
ここまでコンテキストといってなんだが、実際は `Path` のことである。

# コンテキスト = path であることを理解しておくと何が重要か

さて先ほどのeach 実行中に別のファイル hoge2.jsonを参照したくなった。

hoge2.json を定義しよう。

```hoge2.json
{
	"val1": "hogehoge"
}
```

ここで 以下を実行する

``` 
{{#each hoge.json}}

	{{this.val1}}

	{{hoge2.val1}}

{{/each}}
```

さて実行結果は

```
a
a
a
...
```

となる。 
`hogehoge` はでてこず(ちなみにエラーがでない！なんてっこった。。。)
ちなみに私の実行環境は assemble 内であるあしからず。

#### なぜ `hogehoge` がでないかといえば、現在の コンテキストが、hoge.json を向いているからである。

へー。。。じゃあどうすればいいんだい？
handlebarsはキモいことに 相対的なパスを用いて、コンテキストの解決ができる。

``` 
{{#each hoge.json}}

	{{this.val1}}

	{{../hoge2.val1}}

{{/each}}
```
こうすることで期待している

```
a
hogehoge
a
hogehoge
a
hogehoge
...
```

が得られるわけである。
こんなのは、公式のリファレンスを読めば解決するのだが、なんだってー感が強かったので、
忘れないために文章化した。
AdWords Scripts - 全体・任意のキャンペーン（またはラベル）に対して入札調整比を毎時自動適用するScript

**ボトルネック(作成の背景)**
- - -

* addAdScheduleメソッドでは新規での設定追加登録はできるが、更新は適用出来ない
* 更新はsetBidModifierメソッドを使うが、引数が単価調整比のみで曜日と時間は修正出来ない

**エンハンストな入札調整比との違い**
- - -
 
* モバイルなどの場合、あくまでキャンペーンに対する入札単価調整比のため、本来曜日・時間の概念は存在せず、変更する設定が１つで完結する。

**逃げ道的解決策**
- - -

* 上記を踏まえ、毎時設定を削除・新規作成を繰り返すスクリプトを適用する

```js
var iter = selector.get();
while (iter.hasNext()) {
    var camp = iter.next();
    var camp_iter = camp.targeting().adSchedules().get();
    Logger.log(camp);
    if (camp_iter.hasNext()) {
        var camp_adSchedule = camp_iter.next();
        camp_adSchedule.remove();
    }
    camp.addAdSchedule({
        dayOfWeek: dow,
        startHour: 0,
        startMinute: 0,
        endHour: 24,
        endMinute: 0,
        bidModifier: modifierValue
    });
}
GitHub のリポジトリに置いた tweet.yml の内容をランダムにツイートする Heroku アプリケーションを作った

## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
GitHub のリポジトリに置いた tweet.yml の内容をランダムにツイートする Heroku アプリケーションを作りました

<i class="fa fa-external-link" style="font-size:1em;"></i> [random_tweet_from_github_bot](https://github.com/tbpgr/random_tweet_from_github_bot)

## <i class="fa fa-flag-checkered" style="font-size:1em;"></i> 目的
ブログの記事、 Qiita の記事、プロダクト、誰かの名言など定期的にツイートしたいものがあるとします。
そういったものをランダムにツイートするボットを Heroku の無料枠で手軽に動かすアプリケーションです。

## <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
* ツイート内容を保存したリポジトリ [tbpgr/qiita_favorite_articles](https://github.com/tbpgr/qiita_favorite_articles)
* ツイート用アカウント: [tbpgr_bot](https://twitter.com/tbpgr_bot)

![sample1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/3c938732-ccaa-a7a8-2285-cdcbe4d1e021.png)

## :memo: 補足
* tweet.yml を保存するリポジトリに対する定期更新バッチアプリケーションを作成する構想あり
    * 例えば、 Qiita の API で一定ストック数以上の記事のタイトルのみを tweet.yml に反映する処理を作って定期的に更新したり
    * 例えば、 Hatena の API で一定 Bookmark 数以上の記事のタイトルのみを tweet.yml に反映する処理を作って定期的に更新したり
    * 例えば、 GitHub の API で一定 Star 数以上の記事のリポジトリのみを tweet.yml に反映する処理を作って定期的に更新したり
* tweet.yml のリポジトリは配信する情報に合わせて分割する予定
* 今のところ、 tweet.yml を更新したら `heroku restart` をする必要がある

## <i class="fa fa-user" style="font-size:1em;"></i> 使ってみたい方は
* GitHub にツイート内容を保存するリポジトリを作成する
* tweet.yml にツイート内容を文字列配列で設定する
* Heroku のアカウントを取得する
* Heroku コマンドをインストールする（詳細は Heroku の公式ドキュメント参照）
* Twitter でボット用のアカウントを取得する
* ボット用アカウントの API 関連の情報を取得する
    * TWITTER_CONSUMER_KEY
    * TWITTER_CONSUMER_SECRET
    * TWITTER_ACCESS_TOKEN
    * TWITTER_ACCESS_TOKEN_SECRET
* [random_tweet_from_github_bot](https://github.com/tbpgr/random_tweet_from_github_bot) を Fork する
* デプロイボタンを押すと新規アプリケーション作成画面へ
* 任意のアプリケーション名、Twitter API 関連情報、ツイート対象リポジトリ、ツイート確率、ボット名を入力する
* Deploy for FREE ボタンを押してアプリケーションを作成する
* 作成が完了したことを確認
* デプロイ後に heroku コマンドで Dyno を 1 に設定してください

~~~
heroku ps:scale bot=1
~~~

* ツイートしてボットの動作を確認する
UniRxで3個のスライダ(R,G,B)の動きに連動して画像の色を変更する



この投稿ではUnityにおいて、3個のスライダ(R,G,B)の動きに連動して画像の色を変更するコードを、UniRxで簡潔に記述する方法とそのポイントを紹介します。

# コード

```csharp:ColorChange.cs
using UnityEngine;
using UnityEngine.UI;
using UniRx;

public class ColorChange : MonoBehaviour
{
    [SerializeField]
    private Slider redSlider;
    [SerializeField]
    private Slider greenSlider;
    [SerializeField]
    private Slider blueSlider;
    [SerializeField]
    private Image image;

    void Awake ()
    {
        Observable
            .CombineLatest(
                redSlider.OnValueChangedAsObservable(),
                greenSlider.OnValueChangedAsObservable(),
                blueSlider.OnValueChangedAsObservable()
            )
            .Select(colorList => new Color(colorList[0], colorList[1], colorList[2]))
            .Subscribe(color => image.color = color);
    }
}
```

# ポイント1

```csharp:
redSlider.onValueChanged.AsObservable()
```

でなくて、

```csharp:
redSlider.OnValueChangedAsObservable()
```

を使う。

もし前者を使ってしまった場合、R、G、B、3個のスライダを少なくとも1回は動かさないと画像の色が変更されない。

# ポイント2

CombineLatest([CombineLatestのコード(github)](https://github.com/neuecc/UniRx/blob/master/Assets/UniRx/Scripts/Observable.Concatenate.cs#L509))を使って、3個のストリームの最新の値を合成する。

このメソッドは可変長引数をとるので、何個もIObservable\<T\>を引数をとれる。
UniRxでトグルのオン・オフの変更に連動し、ボタンの有効・無効を変化させる

この投稿ではUnityにおいて、トグルのオン・オフの変更に連動し、ボタンの有効・無効を変化させるコードをUniRxで簡潔に記述する方法とそのポイントを紹介します。

# コード

```csharp:ButtonEnabling.cs
using UnityEngine;
using UnityEngine.UI;
using UniRx;

public class ButtonEnabling : MonoBehaviour
{
    [SerializeField]
    private Toggle toggle;

    [SerializeField]
    private Button button;

    void Awake()
    {
        toggle.OnValueChangedAsObservable().SubscribeToInteractable(button);
    }
}
```

# ポイント1

```csharp:
onValueChanged.AsObservable()
```

でなくて、


```csharp:
OnValueChangedAsObservable()
```

を使う。

`onValueChanged.AsObservable()`を使って、もし初期値が

* トグルがオフだけど、ボタンが有効
* トグルがオンだけど、ボタンが無効

のどちらかであった場合(言い換えると初期の論理状態が正しくない場合)、一度トグルを押すまで正しい状態にならない。

# ポイント2

`SubscribeToInteractable`を使う。([SubscribeToInteractableメソッド(github)](https://github.com/neuecc/UniRx/blob/master/Assets/UniRx/Scripts/UnityEngineBridge/UnityUIComponentExtensions.cs#L27))

```csharp:
toggle.OnValueChangedAsObservable().Subscribe(isInteractable => button.interactable = isInteractable);
```

は、

```csharp:
toggle.OnValueChangedAsObservable().SubscribeToInteractable(button);
```

って短くかける。


# Unityエディタ上でノーコーディングでもできる

UnityEvent+Unityのエディタ拡張の機能により、コードなしでも設定できます。
AngularJSのng-optionsでデフォルト値をセットする方法


AngularJSのviewの中でselect要素のoption要素で```selected=selected```状態になるデフォルト値をセットする方法。

##Controllerの設定
viewに表示するためのデータをcontroller内で次のような連想配列を定義するとします。

```js:controller.js
$scope.choices = [
  {value: 0, label: "大吉"},
  {value: 1, label: "中吉"},
  {value: 2, label: "吉"},　// ここをデフォルト値としてセットしたい
  {value: 3, label: "凶"},
  {value: 4, label: "大凶},
];
```

##Viewの定義
単純に上記のchoicesを下記のようなHTMLに表示するにはいくつか方法がありますが、今回はng-optionsを使うものとします。

```html
<select>
  <option value="0">大吉</option>
  <option value="1">中吉</option>
  <option value="2">吉</option>　　// ここをselectedにしたい
  <option value="3">凶</option>
  <option value="4">大凶</option>
</select>
```

このhtmlを生成するためにはhtmlで次のようなng-optionsを定義します

```html:view.html
<select ng-options="choice.value as c.label for choice in choices">
</select>
```

ただし、このままだと空白の選択値がセットされ、次のようなhtmlが生成されてしまいます。

```html
<select>
  <option value="?"></option> // どこからやってきた？
  <option value="0">大吉</option>
  <option value="1">中吉</option>
  <option value="2">吉</option>　　// ここをselectedにしたい
  <option value="3">凶</option>
  <option value="4">大凶</option>
</select>
```

## ng-optionsでデフォルト値をセット

何故か前述のng-optionsではchoice.valueがPOST時に渡されません。
（まだ調べきれていません。）

なので、まずcontrollerに一行追加します。

```js:controller.js
$scope.choices = [
  {value: 0, label: "大吉"},
  {value: 1, label: "中吉"},
  {value: 2, label: "吉"},　// ここをデフォルト値としてセットしたい
  {value: 3, label: "凶"},
  {value: 4, label: "大凶"},
];

$scope.choice = $scope.choices[2];  // ここを追加
```

次にhtml内のselect要素を次のように変えます。

```html
<select ng-model="choice" ng-options="choice as c.label for choice in choices">
</select>
```

これでデフォルト値がセットされます。

## 補足
ただし、このままでは連想配列のオブジェクトがcontrollerに渡されてしまうので、mongooseにString型のためのデータを渡すためにcontrollerでは次のように定義しておくといいです。


```js:controller.js
var choicedData = new Choice{
  choice: this.choice.value
};
```

モデルはこんな感じです。

```js:model.js
var Choice = new Schema({
  choice: {
    type  : String,
    defult: '',
    trim  : false
  }
});
```
Python(Bottle,Intellij)で Debug ステップ実行


ステップ実行するまで手間取ったのでメモ

* Intellij 12
* Python
* Botltle (Bottle でなくてもよいが今回は例として利用)

```
# bottle install
pip install bottle
```

* python プロジェクト作成
* project structure -> SDKs で ClassPath に pycharm-debug.egg を追加（自分の環境だと ~/Library/Application Support/IntelliJIdea12/python/pycharm-debug.egg にありました。）
* Debug の Edit Configuration から Python Remote Debug を追加し hostname と port を指定する
* index.py 作成
* views/index.tpl 作成
* intellij のデバッグ実行
* python index.py 実行
* http://localhost:8080/index にアクセス

```index.py
# debug 設定に合わせた hostname と port を指定
import pydevd
pydevd.settrace('localhost', port=8080, stdoutToServer=True, stderrToServer=True)

from bottle import Bottle, run, template

apps = Bottle()

@apps.get('/index')  # or @route('/login')
def login():
    print 'Hello!' # プレークポイント置いてみる
    return template("index")

run(app=apps, host='localhost', port=8080)
```

```views/index.tpl
World!
```
swiftでcocoaPods使ってObjective-Cのライブラリを入れる


## 使用バージョン

Xcode Version 6.2 (6C131e)

% pod --version 
0.36.1

## 手順
1. サイトを参考にインストール[cocoaPods](http://cocoapods.org "cocoaPods")
2. Xcodeのプロジェクトを作成(ここでは、XcodeProject)
3. Podfileを作成
4. pod installコマンド
5. XcodeProject.xcworkspaceを起動
6. 使用するファイルにimport

## Podfile

例えばこんな感じ。

```ruby:[作成したディレクトリ]/XcodeProject/Podfile
# この1行がswiftのライブラリを入れるとき必須
use_frameworks!

# Objective-Cのライブラリ
pod 'MagicalRecord'

# swiftのライブラリ
pod 'Alamofire'
```

## pod install

% cd [作成したディレクトリ]/XcodeProject
% pod install

ライブラリのDLなど、行われます。

作成されるファイル
Podfile.lock
/Pods
XcodeProject.xcworkspace

## import文

```swift:XcodeProject/XcodeProject/ViewController.swift
import Alamofire
import MagicalRecord
```

## Bridging-Header.hはいらない

あれ、XcodeProject-Bridging-Header.hは？ swiftで、Objective-Cを使うならないといけないんじゃ？　と思うでしょう。僕も書いてました。だって、みんな書いてるし。
でも、cocoaPodsだといらないぽいです。

ちゃんと見れてないのでわからないですが、cocoaPodsではPodsプロジェクトでビルドしたものを、プロジェクト(XcodeProject)では使うだけなので、swiftだろうがObjective-Cだろうが、関係ないという解釈でやってます。
つまり、Objective-Cのファイルを直接見ているわけではないと。

違ったらつっこみお願いします。
macのzshでjava7/8を簡単に切り替える

以下のコードを`~/.zshenv`に追記し`source`して`java7`もしくは`java8`すれば切り替えられます
Yosemiteとかで確認（雑

```
alias java7='setjdk 1.7'
alias java8='setjdk 1.8'
function setjdk() {
  if [ $# -ne 0 ]; then
    removeFromPath '/System/Library/Frameworks/JavaVM.framework/Home/bin'
    if [ -n "${JAVA_HOME+x}" ]; then
    removeFromPath $JAVA_HOME
    fi
    export JAVA_HOME=`/usr/libexec/java_home -v $@`
    export PATH=$JAVA_HOME/bin:$PATH
  fi
}
function removeFromPath() {
  export PATH=$(echo $PATH | sed -E -e "s;:$1;;" -e "s;$1:?;;")
}
setjdk 1.8
```

これで
> `java7`のサポートもうすぐ切れるしイケてないから普段は`java8`だけど、`java7`でしか動かないsbtプロジェクトとかあって時には`java7`が必要で、とは言え互換があるからといってデフォルトで`java7`を使いたくないけど必要なときに`java8`から簡単に`java7`に切り替えたい

という人の要求を満たせますね。
PHPのcompact記法が便利

LaravelやCakePHPでは多用されているようなのですが、知らなかったのでメモ。

```php
$array = ["apple" => "apple", "orange" => "orange", "lemon" => "lemon" ];
```

という配列を作りたいときは、

```php
$apple = "apple";
$orange = "orange";
$lemon = "lemon";

$array = compact("apple", "orange", "lemon");
```

でいけるみたいです。便利！
herokuのClearDBからダンプファイルを抽出する方法

ClearDBのバックアップをローカルに保存したかったけど、どうやらブラウザから直接のダウンロードはできない模様。ローカルから`mysqldump`コマンドでリモートから直接落としました。

使用したコマンドは下記の通りです。

    $ mysqldump -h [hostname] [DBname] -u [Username] -p > dump.sql
    Enter password:

DBnameはClearDB管理画面にある「heroku_xxxxxxxxxx」のような文字列です。Username、Passwordも同様ClearDB管理画面内に表示されています。

hostnameだけが探すのにちょっと苦労したのですが、herokuの環境変数`CLEARDB_DATABASE_URL`に設定されている値を使用すればOKです。ただこの変数内には余計なパラメータなども含まれているので、ホスト名だけを抽出して使う必要がありました。

最終的にはこんな感じのコマンドになります。

    $ mysqldump -h us-cdbr-iron-east-01.cleardb.net heroku_xxxxxxxxxx -u usernameaaaaa -p > dump.sql
vagrant ssh で TeraTerm を起動する

> 実はすでに@tiibunさんがイケているプラグインを公開されていました。
> * [Vagrant Teraterm pluginを作ってみた](http://qiita.com/tiibun/items/b1f1d47040660892067d) - Qiita
> 本稿の小細工的なやり方よりもこちらの使用をお勧めます。

Vagrant マシンに入るには``` vagrant ssh ```コマンド一発で OK なはずだが、Windows ホスト環境では ssh コマンドがないというエラーになる。

使える ssh がないわけでもないのだが、ここは使い慣れた TeraTerm でログインしたい。SSH 接続情報は ```vagrant ssh-config``` で取得できる。しかしそれをログイン時に毎回入力するのはダルすぎるというもの。

楽をするため、ログイン情報を埋め込んだショートカットを作ったり、[VagrantにTeratermマクロで接続する](
http://qiita.com/tiibun/items/61c64c6b261887d455ee)方法がある。しかし仮想マシンを複数立ち上げるようになると、仮想マシンの起動順序によってポート番号が変わってくるので、もう決め打ちではいかない。

ここはやはり Vagrant に TeraTerm を起動させたい。

要は vagrant から ssh がキックできればいいのだから ```ssh.bat``` あるいは ```ssh.cmd``` という名前でバッチファイルを作成しておき、中で TeraTerm にパラメータを引き渡してやればイケるはずだ。

必要最小限のパラメータを拾うだけなら、以下のようなバッチスクリプトになるだろう。

```bat:ssh.bat
@rem %*
@echo off
setlocal

if "%1"=="" exit

set TT_HOME=C:\Program Files (x86)\teraterm
set TT_OPTS=/KR=UTF8 /KT=UTF8 /DS

set userhost=%1
shift
:loop
  if "%~1"=="-p" set port=%2
  if "%~1"=="-i" set keyfile=%2
  shift
if not "%~1"=="" goto loop

start "" "%TT_HOME%\ttermpro.exe" %userhost%:%port% /ssh2 /auth=publickey /keyfile=%keyfile% %TT_OPTS%
```

TT_HOME は自分の環境に合わせて修正してほしい。

PATH の通ったディレクトリにこのバッチを ```ssh.bat``` という名前で保存し、おもむろに ```vagrant ssh``` と叩けば、仮想マシンにログイン済みの状態で　TeraTerm が開くはず。

おそらく他のターミナルソフト用にも同様のバッチが書けるだろう。

>RLogin でもできたようです
* [vagrant ssh で RLogin を起動する](http://qiita.com/ngyuki/items/8953837384251f4b3c08) - Qiita

~~なぜか筆者の環境では、ログイン済みとは別に新規接続ウィンドウも余分に開いてしまう。
生成したコマンド行を単体で実行すれば問題ないのだが... Windowsに詳しくて原因がわかる方がいたら教えてほしい。とりあえず閉じればいいだけなので今は後回しとする。TT_OPTS に /DS を追加すれば、「新しい接続」ダイアログを表示させない分、閉じる手間が少し減らせる。~~
＜ttdodaさんのご指摘によりスッキリ解消した。謝謝！

さて、このバッチファイルは置き場所に困る。こんな紛らわしい名前のバッチファイルをシステムにほっといたらいつか痛い目にあうことは目に見えている。

どうしたものか。

Vagrant でしか使わないということで、各 Vagrant ディレクトリ直下に置いておけばいいよう気がするが、vagrant はお行儀のいいことに Windows 環境でもカレントディレクトリを実行パスに含めない。

それなら ```Vagrantfile``` でカレントディレクトリを PATH に追加すればよい。

```ruby:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure(2) do |config|
  config.vm.box = "front01"
    # ...
end

ENV['PATH'] += ";" + Dir.pwd
```

これなら vagrant コマンド作業以外に影響しない。しかし、プロジェクトの Vagrantfile を開発環境の都合で汚すのもいかがなものかと。

それならホームの ```.vagrant.d``` 直下に移動し ```ssh.bat``` とその PATH を追加するだけの ```Vagrantfile``` を置くというのが次善策だ。

```ruby:.vagrant.d/Vagrantfile
ENV['PATH'] += ";" + File.expand_path(File.dirname(__FILE__))
```

これでどの Vagrant マシンに対しても対応できる環境になる一方、```ssh.bat``` の存在自体を忘れてしまう可能性も高い。

## 参考

* Tera Term Pro コマンドライン 
  http://ttssh2.sourceforge.jp/manual/ja/commandline/teraterm.html

* TTSSH command line 
  http://ttssh2.sourceforge.jp/manual/ja/commandline/ttssh.html

* [Windows - VagrantにTeratermマクロで接続する - Qiita](http://qiita.com/tiibun/items/61c64c6b261887d455ee)
Rubyの知っておきたい文法メモ

# 初めに
春からRubyのプロジェクトをやるということで簡単な文法をメモった
基礎的な部分のみだが、自分用のメモ :rage3: 

## 環境
* ruby 2.2.1p85 (2015-02-26 revision 49769) [x86_64-darwin14]
* irb 0.9.6(09/06/30)
* Mac OS Yosemite 10.10.2

## 試しに
簡単なスクリプト書いてみた
信頼性を計算してくれるモジュールです。まったく使いドコロがない
[信頼性計算モジュール](https://github.com/pollseed/script_summary/blob/master/tools/relability.rb)

###使い方

```.rb
require "../tools/relability"

# HOW TO USE
r = Relability::Measure.new(31, 40, 4)
p r.mtbf
=> 176.0
p r.mttr
=> 10
p r.capacity_rate
=> 0.946236559139785
```

# 四則演算
ざっと

```.rb
# 足す
70 + 80
=> 150

# 引く
apple = 40 - 40
apple.zero?
=> true

# 掛ける
banana = 3 * 2
banana.nonzero?
=> 6

# 割る
100 / 3
=> 33

# 余り
100 % 3
=> 1

# 乗算
10 ** 3
=> 1000
```

# 日付
いろんな言語での悩みの種ですねえ :hurtrealbad: 

```.rb
# 簡単に現時刻をとれる
now = Time.now

# 指定して取る
now.strftime("%Y-%m-%d-%^A")
=> "2015-03-28-SATURDAY"

# 年月日もとれる
now.year
now.month
now.day
now.to_a # 配列にしても要素を抜ける

# 曜日の判定もできる
now.wednesday?
now.sunday?

※本日を取る場合は以下で取れます
require 'date'
today = Date.today
```

# 変換
たまに

```.rb
# 文字列
1.to_s
=> "1"

# 進数とか
10.to_s 2
=> "1010"
10.to_s 8
=> "12"
10.to_s 16
=> "a"

# 末尾の１文字を消す
"hoger".chop
=> "hoge"

# 重複文字を消す
"hoooooge".squeeze
=> "hoge"

# 大文字小文字
"hoge".upcase
=> "HOGE"
"HOGE".downcase
=> "hoge"
"hoge".capitalize
=> "Hoge"

# 置換
"hogehogefugahoge".gsub /hoge[fuga]+/, "りんご"
=> "hogeりんごhoge"

# 配列系
"たかし|けんじ|すすむ|まさお".split '|'
=> ["たかし", "けんじ", "すすむ", "まさお"]
```

# チェック
少し

```.rb
# 文字あるかチェック
"hoge".empty?
=> false

"hoge".include? "ho"
=> true

# ケータイ、固定電話番号チェック
/^(\d{2}-\d{4}|\d{3}-\d{3}|\d{3}-\d{4})-\d{4}$/ === "090-090-0909"
=> true
```

# Enumerable
列挙系から抜き出す時のメモ

```.rb
# 列挙の中の偶数を足す
["けんじ", 99, "まさお", 52, "しろう", 40, "たかし", 80].grep(Integer).select { |v| v.even? }.inject :+
=> 172

# たかしとかいらない時
["けんじ", 100, "まさお", 50, "しろう", 40, "たかし", 80].grep(Integer)
=> [100, 50, 40, 80]
```

# 配列
便利ゆえに破壊的メソッドもあるので注意して使いたい

```.rb
array = [10,20,30,40,50]
array.push 60
=> [10, 20, 30, 40, 50, 60]
array.pop 2
=> [50, 60]
array.delete 10
=> 10
array.join "たかし"
=> "20たかし30たかし40"
```

# ループ
よく使います

```.rb
# インデックスもつけたい
%w(たかし けんじ まさお しろう).each_with_index do |name, i|
  p "#{i}: #{name}"
end
"0: たかし"
"1: けんじ"
"2: まさお"
"3: しろう"
=> ["たかし", "けんじ", "まさお", "しろう"]

# 回数指定
5.times do |n|
  p n
end
0
1
2
3
4
=> 5
```

# 宇宙船演算子
<=>のことっす

```.rb
# 右辺がでかい
100 <=> 500
=> -1

# 左右辺同じ
100 <=> 100
=> 0

# 左辺がでかい
500 <=> 100
=> 1
```

# hash
なんでもかんでもhashにするのはよくないので
Effective-Rubyにもあるように、Structを使うのも検討してみるといいと思います

```.rb
hoge = {test: "たかし", fuga: "けんじ"}
=> {:test=>"たかし", :fuga=>"けんじ"}

# キー
hoge[:test]
=> "たかし"

# キー全部
hoge.keys
=> [:test, :fuga]

# 値
hoge.values
=> ["たかし", "けんじ"]

# 配列
hoge.to_a
=> [[:test, "たかし"], [:fuga, "けんじ"]]

# ループして出力
hoge.each_with_index {|v, i| p "#{i}: #{v}" }
"0: [:test, \"たかし\"]"
"1: [:fuga, \"けんじ\"]"
=> {:test=>"たかし", :fuga=>"けんじ"}
```
# 終わりに
よく使うもの、というよりは基礎的なものを抜き出してまとめた
調べて使うよりは自分のところにメモって行った方が早いということもあり、何かあればこれに追記していく
[NeoBundle] My First Neobundle

# NeoBundle is ...

read [this](https://github.com/Shougo/neobundle.vim).

# Install

```vim
$ mkdir -p ~/.vim/bundle
$ git clone https://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim
```

# Setup

write configuration at ~/.vimrc for NeoBundle

```vim
"---------------------------
" Neobundle Settings
"---------------------------
" set directory path to manage bundle
set runtimepath+=~/.vim/bundle/neobundle.vim/
 
" Required:
call neobundle#begin(expand('~/.vim/bundle/'))
 
" manage neobundle by neobundle
NeoBundleFetch 'Shougo/neobundle.vim'
 
" HERE!! WRITE PLUGINGS!!
 
call neobundle#end()
 
" Required:
filetype plugin indent on
 
" uninstallede plungins checker
NeoBundleCheck
 
"-------------------------
" End: Neobundle Settings.
"-------------------------
```

# reflect

```vim
$ source ~/.vimrc
```

# Add plugins

```vim
" HERE!! WRITE PLUGINGS!!

" NERDTree
NeoBundle 'scrooloose/nerdtree
 
call neobundle#end()
```

```vim
$ vim
```

![Screen Shot 2015-03-26 at 19.06.22.png](https://qiita-image-store.s3.amazonaws.com/0/18705/f8bbcde4-522f-af03-b214-13dfe60f842d.png)

type y, start installing

# some other plugins

```vim
NeoBundle 'Townk/vim-autoclose'
NeoBundle 'mattn/emmet-vim'
NeoBundle 'thinca/vim-quickrun'
NeoBundle 'grep.vim'
NeoBundle 'scrooloose/syntastic'
```

```vim
$ vim
```

```vim:~/.vimrc
let g:syntastic_javascript_checker = "jshint"
let g:syntastic_check_on_open = 0 "never check at opening file
let g:syntastic_check_on_save = 1 "check at saving file
```

```vim
$ source ~/.vimrc
```
pbpasteで時間をファイル名にしたメモを残す

# pbpasteで時間をファイル名にしたメモを残す

## 用途

- pbpasteは便利、でも、ファイル名の指定は面倒
    - 時間を元にファイル名を自動でつける関数を作れば ﾋﾟｺｰﾝ(゜∀゜)！

```bash
function pbmemo () {
    if [ ! -d "$HOME/memo" ] ; then
        mkdir "$HOME/memo"
    fi
    memo_file_name="$HOME/memo/$(date +'%Y%m%d_%H%M%S')"
    pbpaste > "${memo_file_name}"
    echo "output file: ${memo_file_name}"
}
```
laravelでトレイリングスラッシュを有効にする方法

この記事は移行しました！[最新の内容はこちら](https://naoqoo2.github.io/blog/laravel%E3%81%A7%E3%83%88%E3%83%AC%E3%82%A4%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%B9%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)をご覧ください😀

Laravelはデフォルトだとトレイリングスラッシュ（URL末尾のスラッシュ）を消しちゃいます。

でもサービスによっては常にスラッシュを付与したい時ありますよね。
そんな時は.htaccessを下記のように編集しましょう。
※コメント解説付き
    
    

```text:public/.htaccess（変更前。laravelデフォルト）
# Redirect Trailing Slashes...     【解説】URLに/があれば削除してリダイレクト　←ココが問題
RewriteRule ^(.*)/$ /$1 [L,R=301]

# Handle Front Controller...　　　 【解説】ファイルやディレクトリが存在しなければindex.phpへ
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
```

　↓　トレイリングスラッシュを有効にしたい

```text:public/.htaccess（変更後）
# ファイルやディレクトリが存在すれば表示　【解説】スラッシュ付与後だと判定できないので最初にチェック
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]

# add Trailing Slash　　　　　　　【解説】URLの末尾に/がなければ付与してリダイレクト　←これで解決
RewriteRule ^(.+[^/])$ /$1/ [R=301,L]

# Handle Front Controller...
RewriteRule ^ index.php [L]
```

これで常に末尾にスラッシュが付きます。
あとはよしなに。
内部実装から追うReact Native

書いた人間はCとC++からの類推解釈でObjective-C読めるけれど、iOSのAPIはちゃんと理解していない。Sampleはすでに動かした前提で書く。

## TL;DR

`document`に依存しないVirtualDOM (= React.js)だけであれば、iOSでもJavaScriptCore上で実行可能なので、React.jsをそのまま投げ込める。

## index.ios.bundle

`AppDelegate.m`に`index.ios.bundle`へのURLが定義されている。エミュレータで起動した際、同時にhttpサーバが立ち上がっているのは`index.ios.js`をbundleしたものをこのURLとして返すためにある。

ところで、React.jsを使う大原則として、React ElementをrenderするコンテナにはReact.jsが管理しているDOM以外のDOM（htmlで書いたものとか）を配置することができない。この大原則はReact Nativeでも生きていて、`RCTRootView`の中にはReact Native以外の方法でUIを配置することはできない。

一方で、`RCTRootView`の中に配置されている要素がすべてReact Nativeの管理下にあるならば、bundleしたJavaScriptを読み込み直して`RCTRootView`の中身を空にすることで、アプリ自体を再ビルドすることなくUIのリロードが可能になる。エミュレータ実行時に`Cmd + R`でJavaScriptの変更が反映できるのはこのような仕組みが働いていることにある。

## JavaScriptCore

URL指定されたJavaScriptコードは読み込みの過程を経てここで実行される。`RCTJavaScriptExecutor`自体は`@protocol`として宣言されているが、デフォルト扱いで実装されている`RCTContextExecutor`を見る。

```objc:React/Executors/RCTContextExecutor.m#235
- (void)executeApplicationScript:(NSString *)script
                       sourceURL:(NSURL *)url
                      onComplete:(RCTJavaScriptCompleteBlock)onComplete
{
  RCTAssert(url != nil, @"url should not be nil");
  RCTAssert(onComplete != nil, @"onComplete block should not be nil");
  [self executeBlockOnJavaScriptQueue:^{
    JSValueRef jsError = NULL;
    JSStringRef execJSString = JSStringCreateWithCFString((__bridge CFStringRef)script);
    JSStringRef sourceURL = JSStringCreateWithCFString((__bridge CFStringRef)url.absoluteString);
    JSValueRef result = JSEvaluateScript(_context, execJSString, NULL, sourceURL, 0, &jsError);
    JSStringRelease(sourceURL);
    JSStringRelease(execJSString);

    NSError *error;
    if (!result) {
      error = RCTNSErrorFromJSError(_context, jsError);
    }

    onComplete(error);
  }];
}

- (void)executeBlockOnJavaScriptQueue:(dispatch_block_t)block
{
  if ([NSThread currentThread] != _javaScriptThread) {
    [self performSelector:@selector(executeBlockOnJavaScriptQueue:)
                 onThread:_javaScriptThread withObject:block waitUntilDone:NO];
  } else {
    block();
  }
}
```

ざっくり言えば、別スレッドでJavaScriptCoreを使って読み込んだJavaScriptコードを実行している。JavaScriptCoreはブラウザやDOMに依存する`document`を扱うことはできないが、React.js含むVirtualDOMは実際にレンダリングするまでは単なるオブジェクトの操作なので、`document`やDOMを使わず読み込みが可能。`document`に依存しないiOSネイティブなUIを代わりに呼び出せば、React.jsからiOSのUIも呼び出しができるということである。

## まとめ

React Nativeは、コンセプトにあるとおりiOSのUIをReact.jsと同じ方式で組み立てることに主眼が置かれている。

* React.jsの作法をiOSのUI設計に適用できる
* React.jsの作法に従うことでスマートUIのようなバッドパターンをある程度避けられる
* 当然React Nativeで管理しているUIをReact.js以外で触ることはご法度
* フロントエンドでこれまで使用していたツールセットが利用できる

React.jsをパターンとして捉えることで、上記のような特徴を得られる。APIのほとんどが2014年頃のJavaScriptスタンダードを逸脱していないので、Titanium Mobileのような「あのAPI何だっけかな」的なフレームワークそのものへのロックインを避けることはできる。

代わりにTitanium MobileのようなObjective-CとiOS APIを抽象化してJavaScriptで扱えるような仕組み自体はないので、「JavaScriptだけでアプリが作れる」風便利フレームワークではない。
Yosemite で MAMP PRO の Postfix がうまく動作しなかった時の解決法


## 実行環境

|バージョン|&nbsp;|
|:--|:--|
|MacOS|10.10.2|
|MAMP PRO|3.0.7.3|


PHP などからメールを送るためには、Postfix の設定ファイルを書き換えてあげて、パスワードファイルの作成などを行う必要があります。

MAMP の 有料版である MAMP PRO では、 直接書き換えなくても、GUI上でスマートホストの設定を簡単に行うことができるようになっています。

![MAMPPRO の Postfix の設定画面](http://i.gyazo.com/9dfbc0cd195eb3b02ffcd992a4d4dbe2.png)

## 送れなかった

設定画面から必要な情報を入力して、『このデータを使用』を押したあと、メールの送信テストを行ってみたのですが、送信できていないようでした。

## mail.log を確認する

裏で何が起こっていたのかを知るためにログをたどってみます。
ログは以下の場所にいます。

```
/private/var/log/mail.log
```

ファイルをテキストエディタなどで開くと自分の場合は以下のようなエラーが表示されていました。

```
Mar 28 12:24:32 xxx.local postfix/master[32150]: fatal: bind fe80::1 port 25: Can't assign requested address
```

リクエストされたアドレスは割り当てられませんよとのこと。

同様のエラーが出ている例がないか探してみました。

[(Postfix not working on MacOS Yosemite [closed])](http://serverfault.com/questions/646284/postfix-not-working-on-macos-yosemite)

main.cf の `inet_interfaces` の値を `127.0.0.1` に変更したら動いたよ！
とのことでしたので、 main.cf を書き換えてみます。

## main.cf を書き換える

main.cf は以下の場所にあります。

```
/etc/postfix/main.cf
```

637行目あたりにある `inet_interfaces` の値を設定している箇所を探します。

```
inet_interfaces = localhost
```

これを以下のように書き換えます。

```
inet_interfaces = 127.0.0.1
```

Postfix を再起動します。

```
sudo launchctl stop org.postfix.master
sudo launchctl start org.postfix.master
```

自分の場合はこれで無事メールが送れるようになりました。

ただ、これ以降に再び MAMP PRO 上で Postfix の設定を変更すると、`main.cf` も書き換わってしまい、先ほど設定した `inet_interfaces` の値も元に戻ってしまうようなので、再び `main.cf` を書き換えて上げる必要があるようです。
【UniRx】SubscribeのDisposeをGameObjectに紐付ける

**UniRxについての記事のまとめは[こちら](http://qiita.com/toRisouP/items/48b9fa25df64d3c6a392)**

---
#SubscribeとDispose

RxではObservableを購読してメッセージの待受けを行うことをSubscribeと呼び、その購読を中止することをDisposeと呼びます。
このSubscribeは気をつける点があり、Observableが破棄されたタイミングでちゃんとDisposeする必要があります。
Observableが破棄される際にOnCompletedが発行されれば自動的にDisposeされるのですが、ストリームによってはOnCompletedが発行されない場合もあります。

#Observableの寿命を考慮せずに使った場合

まずは以下のコードとその実行結果を見てください。

```csharp
using UnityEngine;
using UniRx;
using System;

public class ObservableLifeTime : ObservableMonoBehaviour
{
    public override void Start()
    {
        base.Start();

        //1秒ごとにメッセージを発信するObservable
        Observable.Timer(TimeSpan.FromSeconds(0), TimeSpan.FromSeconds(1))
            .Subscribe(x => Debug.Log(x));

        //3秒後にGameObjectを削除する
        Invoke("DestroyGameObject", 3);
    }

    /// <summary>
    /// ログを吐いて削除する
    /// </summary>
    private void DestroyGameObject()
    {
        Debug.Log("Destroy");
        Destroy(this.gameObject);
    }
}
```

**実行結果**

![ObservableLifeTime](https://qiita-image-store.s3.amazonaws.com/0/47146/6efbed80-d400-4237-0eab-f38d28be652e.png)

DestroyでGameObjectが破棄されたにも関わらず、Observable.Timerで作ったストリームが稼働し続けてしまっています。
これはObservable.Timerで作ったObservableがstaticとして生成されてしまい、GameObjectとは関係なく独立して動作してしまっているためです。

#AddToでSubscribeとGameObjectを紐付ける

**AddToメソッド**を使うとこの問題を簡単に解決することができます。

```csharp
using UnityEngine;
using UniRx;
using System;

public class ObservableLifeTime : ObservableMonoBehaviour
{
    public override void Start()
    {
        base.Start();

        //1秒ごとにメッセージを発信するObservable
        Observable.Timer(TimeSpan.FromSeconds(0), TimeSpan.FromSeconds(1))
            .Subscribe(x => Debug.Log(x))
            .AddTo(this.gameObject); //指定GameObjectの寿命に紐付ける

        //3秒後にGameObjectを削除する
        Invoke("DestroyGameObject", 3);
    }

    /// <summary>
    /// ログを吐いて削除する
    /// </summary>
    private void DestroyGameObject()
    {
        Debug.Log("Destroy");
        Destroy(this.gameObject);
    }
}
```

**実行結果**
![ObservableLifeTimeDisposed](https://qiita-image-store.s3.amazonaws.com/0/47146/9439e3a4-bb30-010c-935e-2055534ff777.png)

AddToを使うことで、SubscribeのDisposeを指定したGameObjectの寿命に紐付け、**GameObjectのDestroy時に勝手にDisposeしてくれるようになりました**。
これでDisposeの管理を気にせずにファクトリメソッドが使えるようになりました！

ただし、OnCompletedが飛ぶ訳ではないのでその点は気をつけましょう。
Unity Spriteを一括でSceneに登録してアニメーションを作る

SpriteをSliceして、Sliceしたものにアニメーションをつけます。

やり方はとっても簡単で、
まず、SpriteをSliceします。
以下に、Sliceまでの手順を載せましたので、画像を参照ください。

![01.png](https://qiita-image-store.s3.amazonaws.com/0/64588/a668970b-d8d5-7814-08d0-f835e84324a5.png)

![02.png](https://qiita-image-store.s3.amazonaws.com/0/64588/03f29643-9ab1-3bca-d147-b37330e9919a.png)

![03.png](https://qiita-image-store.s3.amazonaws.com/0/64588/d73c8e4c-c6ee-f870-26ee-b3b335db7644.png)

![04.png](https://qiita-image-store.s3.amazonaws.com/0/64588/39d779af-0b36-44a2-a170-0db98f356762.png)

![05.png](https://qiita-image-store.s3.amazonaws.com/0/64588/16311b9d-a4d8-711e-6aab-fc7524f03351.png)

![06.png](https://qiita-image-store.s3.amazonaws.com/0/64588/c134b14b-dd7c-ef46-d6ca-6002e2fde2c0.png)

これで、sliceが完了しました。
次に、SliceされたSpriteをSceneにドラッグアンドドロップで設置します。


![07.png](https://qiita-image-store.s3.amazonaws.com/0/64588/565a844d-4eb5-6615-28c5-4e63ce643587.png)

Animationを保存する際のダイアログが出るので、適当に名前を決めて保存。

これで再生をすると

![test.gif](https://qiita-image-store.s3.amazonaws.com/0/64588/e0cae638-2ff7-be0d-9bdd-30109bb8e670.gif)


アニメーションができていました。
以前は、私が知らなかっただけかもですが、１つずつAnimation Windowでキーフレームを設置していたので、非常に便利ですね。
Google Compute Engine とローカル間でファイルのコピー

# gcloudコマンド

```
$ gcloud -v
Google Cloud SDK 0.9.46

bq 2.0.18
bq-nix 2.0.18
compute 2015.01.22
core 2015.02.05
core-nix 2014.10.20
dns 2015.01.15
gcutil 1.16.5
gcutil-nix 1.16.5
gsutil 4.8
gsutil-nix 4.6
sql 2015.01.31

$ gcloud compute copy-files -h
Usage: gcloud compute copy-files  [[USER@]INSTANCE:]SRC [[[USER@]INSTANCE:]SRC ...]  [[USER@]INSTANCE:]DEST [optional flags]

Copy files to and from Google Compute Engine virtual machines.

optional flags:
  --dry-run              If provided, prints the command that would be run to
                         standard out instead of executing it.
  --format FORMAT        Format for printed output.
  --help                 Display detailed help.
  --plain                Suppresses the automatic addition of ssh/scp flags.
  --project PROJECT_ID   Google Cloud Platform project ID to use for this
                         invocation.
  --quiet, -q            Disable all interactive prompts.
  --ssh-key-file SSH_KEY_FILE
                         The path to the SSH key file.
  --trace-token TRACE_TOKEN
                         Token used to route traces of service requests for
                         investigation of issues.
  --zone ZONE            The zone of the instance to copy files to/from.
  -h                     Print a summary help and exit.

positional arguments:
   [[USER@]INSTANCE:]SRC [[[USER@]INSTANCE:]SRC ...]
                         Specifies a source file.
   [[USER@]INSTANCE:]DEST
                         Specifies a destination for the source files.
```

# GCEからローカルへファイルコピー
```
gcloud compute --project "プロジェクトID" copy-files --zone "ゾーン名" GCEインスタンス名:ファイルパス ローカルのコピー先パス
```

# ローカルからGCEへファイルコピー
```
gcloud compute --project "プロジェクトID" copy-files --zone "ゾーン名" ローカルのファイルパス GCEインスタンス名:コピー先パス
```

# Tips
ゾーンを指定しないでコマンド実行した場合、対話式のゾーン選択となります。

```
For the following instances:
 - [GCEインスタンス名]
choose a zone:
 [1] asia-east1-a
 [2] asia-east1-c
 [3] asia-east1-b
 [4] europe-west1-d
 [5] europe-west1-a (DEPRECATED)
 [6] europe-west1-b
 [7] europe-west1-c
 [8] us-central1-f
 [9] us-central1-a
 [10] us-central1-c
 [11] us-central1-b
Please enter your numeric choice:
```
最近思いついたRubyのObject.itselfの使用方法

`Object.itself`はRuby 2.2で公開されたメソッド、名前のとおりオブジエクト自身を返すいわゆるIdentity Functionです。

何でこんなものが必要かというと、例えば`group_by`を使って文を文字ごとに分けたいときとか：

```ruby
"hello world".chars.group_by(&:itself) 
=> {"h"=>["h"], "e"=>["e"], "l"=>["l", "l", "l"], "o"=>["o", "o"], " "=>[" "], "w"=>["w"], "r"=>["r"], "d"=>["d"]}
"hello world".chars.group_by(&:itself).map{|k,v| [k,v.count]}.to_h
=> {"h"=>1, "e"=>1, "l"=>3, "o"=>2, " "=>1, "w"=>1, "r"=>1, "d"=>1}
```
等が出来ます。

意味は無いですが`Array.flatten`の代わりにこんなこととか：

```ruby
[[1,2], [3,4]].flat_map(&:itself)
=> [1, 2, 3, 4]
```

遊んでみると結構面白いメソッドですね。
条件文を使用しないFizzBuzz

条件文を使用しない＊FizzBuzzです、加えて状態(state)が一切ありません。

```ruby
applicators = {3 => "fizz", 5 => "buzz"}
fizzbuzz =
  (1..100).map do |n|
    fb = applicators.
             select{|a| n % a == 0}.
             values.join
    [n.to_s, fb].max # "1" > "" and "fizz" > "100000" since "1" < "a"
  end
puts fizzbuzz
```

例えばFizzBuzzの亜種にはFizzBuzzWoofと言うのがありますが、こういうアプローチだと`applicators`に`"woof" => 7`と記入するだけで動作を拡大。もしくは`applicators`ごとデータベースに移せます。こうすることによってコードはデータを変更する最低限のロジックを実装し、簡単に新しいケースを処理できます＊。

＊一応Rubyの場合`select`はCコードレベルでは条件文がありますが理論上`select`,`filter`等は条件を必要としません。例えばHaskellではパターンマッチングを使って実装されています。

＊条件文のある基本的なFizzBuzzだと新しいケースごとにコード自体を書き換えなければいけません。
DockerとCentOS7のハマりどころ

ハマりこんだので
http://qiita.com/yunano/items/9637ee21a71eba197345
に詳しい情報があるのでまずは見て欲しい。

Dockerは1.5。
以前はCentOS6.5で利用していたので困った。

# コンテナイメージにCentOS7を使う場合
## systemdの代わりにfakesystemdが
なのでsystemdを使いたければまずは排除する必要がある。
普通にDockerfileでyum使ってfakesystemdを消してsystemdを使えば問題ない。

## /sbin/initを使ってsystemdを起動するとattachコマンドは使えない
docker attachコマンドは使えませんねはい。
nsenterコマンドで入る必要がある。

## /sbin/initを使ってsystemdを起動すると環境変数は渡せない。
そうなんですね。-eオプションはタダの飾りです。
http://qiita.com/hnakamur/items/f4b270b535d0b8ec3029
にもある
/sbin/init systemd.setenv=NAME=VALUE
を実施するが効果はなかった。
したがって、他のプロダクションを使用しない場合はコンテナ起動後に何らかの処理をかまさないとコンテナ自身に情報を渡せない。辛い。

### 力技での解決策。
docker inspect で見れる情報をdockerの中から見る！
http://qiita.com/gongo/items/0ca1e58019e4cbd8cc77
これを試したが、-vオプションで見るボリュームは
root:rootでないと見えなくなっている模様。
/var/run/docker.sockはroot:dockerなのでコンテナ内からは見えなくなってます。
ただ、ホスト側は当然見えるのでncとjqでホスト名さえわかればdockerAPIを外部に公開しなくても/var/run/docker.sockから見える。

### おまけ
serfをsystemdで起動する
http://pocketstudio.jp/log3/2013/11/06/howto_run_serf_with_systemd/
serfなどを使ってその後の処理を何とかするしかないように思う。

# ホストがCentOS7の場合
## 特権で起動しないとSystemdが使えない。
ホストがSELinuxの状態に寄ってdocker runのオプションを追加する必要がある。

* 有効の場合  --privilegedtoka
* 無効の場合  --cap-add=SYS_ADMIN

apparmorの場合はまだ確認できていない。

## firewalldを殺してiptablesに切り替えないとポートフォワードが使えない
気がつくまでガッツリfirewalldの設定をしてしまった。
Docker側が対応してない模様。Dockerのチェーンが消えてしまう。


# 違う世界
多分、Docker側が想定している使い方から逸脱しいるように思われる。
フルスタックのサービス起動は実の所どうでもよく（よくないサービスもあるだろうが）、systemdは一切利用せずにdocker runで指定するコマンド（シェル）で解決する、其れもシンプルにが基本に思われる。
(基本nohup等を使えばデーモン起動は可能なので其れで対処するなど。)

もちろん依存関係が絡みあうと目も当てられないのでディストリビューションの作法に従っていたりはするが、ps auxでコンテナ内で見えるプロセスを見えると非常に少ないため気にする必要はあるのかは疑問は残る。

ただ、VMの召喚が存分にできるクラウドとの融通を考えると悩ましい。
お金の自由が効くならVMに絞ったほうが早いと思っている。
PythonからGoogle Sheetsを更新する方法

OAuthを使ってGoogle Sheetsを編集する方法のメモ。

## 事前準備

### Credentialsの作成

+ https://console.developers.google.com/project/ でプロジェクト作成
+ [APIs & auth] > [Credentials] を選択してOAuthの [Create new ClientID] をクリック
+ [Service account] を選択して [Create ClientID] をクリック
+ JSONファイルが自動的にダウンロードされるけど [Generate new P12 key] をクリックしてキーの作成 

ここで必要なのは
- コンソール上に表示されているEmail address (xxxxxx@developer.gserviceaccount.comなど)
- 上でダウンロードしたP12 keyファイル

### Pythonのモジュールのインストール

以下をpipインストール

+ gspread
+ oauth2client

※ oauth2cientをインストールする際にはpyopensslが必要

## コード

```python
import gspread
from oauth2client.client import SignedJwtAssertionCredentials

# 認証
f = file('/path/to/p12keyfile', 'rb')
key = f.read()
f.close()
credentials = SignedJwtAssertionCredentials(
                  'xxxxxx@developer.gserviceaccount.com', # Email address
                  key,
                  scope='https://spreadsheets.google.com/feeds https://docs.google.com/feeds',
                  token_uri='https://accounts.google.com/o/oauth2/token'
               )
gs = gspread.authorize(credentials)


doc = gs.open('Worksheet名')

# Sheet追加
sheet = doc.add_worksheet('Sheet名', row=100, col=20)

# Sheetの選択
sheet = doc.worksheet("Sheet名")

# 値の取得

val = sheet.acell('B1').value # ラベル指定の場合のメソッド名はacell
val = sheet.cell(1,2).value   # 座標指定の場合は (行,列)

# 値の設定・変更

sheet.update_acell('B1', 'hoge') # ラベル指定の場合のメソッド名はupdate_acell
sheet.update_cell(1, 2, 'hoge')  # 座標指定の場合は (行,列)

# 変更量が多い時
cell_list = sheet.range('A1:C4')
'''
cell_list[0] : A1
cell_list[1] : B1
cell_list[2] : C1
cell_list[3] : A2
cell_list[4] : B2
 :
'''
for cell in cell_list:
    cell.value = 'fuga'
sheet.update_cells(cell_list)

```

## OAuthを使わない方法

パスワード書くのを躊躇わない方は。

```python

import gspread
doc = spread.login('xxxx@gmail.com', 'password')

sheet = doc.add_worksheet('Sheet名', row=100, col=10)
```
個人的にAndroidStudioでよく使うショートカット(Windows編)

# 個人的によく使うショートカット

「参考URL見ろ、以上」なんですが個人的によく使うものをまとめてみます。

AndroidStudio 1.2 Preview 4 です。

## よく使うショートカット

&nbsp;                                  | Android Studio  | 備考
----------------------------------------|-----------------|-----------------
__SearchEverywhere__                    | Shift + Shift | 作業始めるときはここから。
__Code Completion__                   | Ctrl + Space     | コード補完
__Parameter Info__                   | Ctrl + P     | メソッドのパラメータ情報の表示
__Show Intention Actions__            | Alt + Enter      | 何かエラーがあったときはとりあえずコレ。
__Refactor Rename__                   | Shift + F6       | 変数のリネーム。ファイル名変更も。
__定義箇所へ移動（Go to declaration）__ | Ctrl + B         | 
__戻る__                                | Ctrl + Alt + ←  | 
__進む__                                | Ctrl + Alt + →  | 
__Find Usages__                         | Alt + F7        | 利用箇所検索。レイアウトXMLのidとかでも使えるので大変便利
__プロジェクト内文字検索__              | Ctrl + Shift + F | 
__Run__                               | Ctrl + F10       | 実行
__Make Project__                      | Ctrl + F9        | コンパイルだけ行ってエラー箇所をあぶり出すときとかによく使う
__Introduce Variable__                | Ctrl + Alt + V   | これに慣れると右辺を先に書いて左辺を自動記入するスタイルになる。もちろん普通のコード内の選択範囲から変数抽出にもよく使う。
__Settings__                          | Ctrl + Alt + S   | 設定画面
__Project Structure__                 | Ctrl + Alt + Shift + S | プロジェクト設定
__Structure__                         | Alt + 7          | Structureウィンドウをアクティブにする
__Previous Method__                   | Alt + ↑ | メソッドジャンプ(↑)
__Next Method__                       | Alt + ↓ | メソッドジャンプ(↓)
__Select Previous Tab__ | Alt + ← | タブ移動 *1
__Select Next Tab__ | Alt + → | タブ移動 *1

*1 普段はWindows標準のCtrl+PageUp/Downを割り当てて使ってるんですがPageUp/Downが押しづらいSurface Pro 3で使うときは Alt + 左右キーでタブ移動できるのが便利ですね。

## あまり使ってない
&nbsp;                                  | Android Studio  | 備考
----------------------------------------|-----------------|-----------------
__コードフォーマット__                  | Ctrl + Alt + L   | 
__オブジェクト検索（Find type)__        | Ctrl + O         | 
__参照先検索（Caller）__                | Ctrl + F7        | 
__ファイル構造（File structure）__    | Ctrl + F12       | ファイル内のクラスやメソッド一覧が見れます
__ファイル検索 (Find resource)__        | Ctrl + Shift + O | 



# 参考
- [Eclipse、Android Studio、Xcodeで良く使うショートカット対応表（Mac編） - Qiita](http://qiita.com/chocomelon/items/03b3786f30466142c311)
- [Android Studioのよく使うショートカットまとめ | 明日の鍵](http://blog.tomorrowkey.jp/2014-01-09/the-shortcuts-of-android-studio/)
- [Android Studioでよく使うショートカット « こものAndroidメモ](http://android-blog.smartphone-app.net/archives/237)
- [よく使うAndroidStudioショートカットまとめ(随時更新予定) - くらげになりたい。](http://wannabe-jellyfish.hatenablog.com/entry/2015/01/04/171121)
更新が多い運用でも使いやすいSolrのランダムソートプラグインを作りました


Solr同梱のRandomSortFieldは乱数シードが同じでもインデックス更新でソート順がリセットされることはこちらの記事で書きました。

[SolrのRandomSortFieldはシード値変更以外でも順番が変わる - Qiita](http://qiita.com/deltam/items/d92db1afcd86795916fd)

このままだと頻繁にインデックス更新が走るような運用では使いにくいので、インデックス更新に影響されないランダムソートプラグインを作りました。またこれを実際に使っているサービスでは一定期間ごとにソート順を更新しているので、その仕様もSolr側で吸収すべくシード値を変更しなくても指定した時間にソート順をリセットする仕組みも作りました。

# PeriodicalRandomSortField

このPeriodicalRandomSortFieldを使えば、クライアント側でソート順更新のタイミングを管理できます。またクライアント側でプログラムを書かなくても、一定時間が経ったら自動的にソート順を更新してくれます。

[GitHub - deltam/PeriodicalRandomSortField](https://github.com/deltam/PeriodicalRandomSortField)

# インストール

jdk >= 1.6
solr >= 4.0.0

[README.md](https://github.com/deltam/PeriodicalRandomSortField/blob/master/README.md)の繰り返しになっちゃうので書きません。基本的に以下のReleaseからJARを持ってきて`solrconfig.xml`にロードの設定を追加してコアをRELOADすればOKです。

[Releases · deltam/PeriodicalRandomSortField](https://github.com/deltam/PeriodicalRandomSortField/releases)

# 使い方

`schema.xml`に次の2行を付け足しときます。

```schema.xml
    <fieldType name="prandom" class="com.bengo4.solr.schema.PeriodicalRandomSortField" indexed="true" />

    <dynamicField name="prandom_*" type="prandom" />
```

## インデックス更新に影響されないランダムソートとして使う

ソート条件を`prandom_1234 asc`として検索してみます。

http://localhost:8983/solr/core0/select?q=*:*&prandom_1234%20asc

この使い方だと常に同じランダムソート順が使われます。シード値の`1234`を変えない限り同じソート順になります。（Solr同梱のRandomSortFieldだとインデックス更新でソート順が変わります。）


## 定期更新機能と合わせて使う

たとえば検索するときにソート条件を`prandom_1234_10h,15h asc`と設定します。

http://localhost:8983/solr/core0/select?q=*:*&prandom_1234_10h,15h%20asc

この場合は、

* `1234`を乱数シードとして
* 今日の0時から10時間後と15時間後にソート順を更新する

ランダムソートとして機能します。（10時と15時以外はインデックス更新をしてもランダムソート順は変わりません）


時間単位ではなく分単位も指定できます。`sort=prandom_1234_30m,1h,90m asc`は0時30分、1時ちょうど、1時30分にランダムソートが更新されます。



時間と分を混ぜる`10h30m`みたいな書き方はまだできません（需要があったら作るかも）。

## 定期更新の開始時刻も指定する

何も指定しないと本日午前0時0分を開始時刻として使いますが、UNIXTIMEでその時刻を指定できます。（これは例えば1日単位ではなく1週間単位で更新時刻をバラバラに指定したい場合などに使えると思います。）

`prandom_1234_10h,15h_1427493600 asc`と書くと（1427493600=2015年3月28日午前7時0分）、ソート順更新は17時と22時にずれ込みます。



# 実際に使うときの注意点

* queryResultCache

PeriodicalRandomSortFieldではソート順が更新される時刻になっても、見た目上クエリ文字列が変わらないのでキャッシュが効いたままになり、新しいソート順にならないことがあります。だからといってキャッシュを切るのも現実的でないので、次のような工夫をしています。

`sort=prandom_1234_10h,15h asc, prandom_1427508000 asc`

どういうことかというと、2番めのprandomのシード値は1時間毎のUNIXTIMEです。これはクライアント側でクエリを投げるときにその時刻の分を切り捨てて付け足しています。

もし時刻更新のタイミングが時間単位なら2番めのprandomのクエリ文字列が変わるタイミングでソート順も更新されるので、queryResultCacheの影響を受けずにソート順が更新されます。

…どうみても **バッドノウハウ** です。ほんとうにありがとうございました。

PeriodicalRandomSortFieldの内部からはキャッシュの仕組みに手が出せないので、こうなっちゃうんですよね。何かいいHackを知っている方がおりましたら教えて下さい！！


# まとめ

* 頻繁に更新が走る運用のSolrでも安定して使えるランダムソートプラグインを作りました
* 時刻を指定して更新する機能もついてます。
* 実際に使うには少しだけバッドノウハウが必要でさーせん。


おわり。
.\hoge.go:7: initialization loop

```hoge.go
package main

import "fmt"

var funcList = map[string]func(){
	"listing": listing,
}

func listing() {
	for key, _ := range funcList {
		fmt.Println(key)
	}
}

func main() {
	funcList["listing"]()
}
```

```
$ go run hoge.go
# command-line-arguments
.\hoge.go:7: initialization loop:
        C:\Users\…\GoSrc\tmp\hoge.go:7 funcList refers to
        C:\Users\…\GoSrc\tmp\hoge.go:9 listing refers to
        C:\Users\…\GoSrc\tmp\hoge.go:7 funcList
```

お、おう…

理由は分かる。宣言と定義を分けなくていいというのは楽なんだけど、こういう制限が発生するから、結局、利便性とのトレードオフだなぁ。
StartSSL証明書の指定方法

##StartSSLで証明書取得

参考
http://qiita.com/k-shogo/items/870b6d3939dd08da2de4

##ルート証明書、中間証明書取得
```
$ cd /etc/pki/tls/certs/
$ wget https://www.startssl.com/certs/ca.pem
$ wget https://www.startssl.com/certs/sub.class1.server.ca.pem
```

##Postfix
```
$ sudo vi /etc/postfix/main.cf
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/pki/tls/certs/startssl.crt
smtpd_tls_key_file = /etc/pki/tls/certs/server.key
smtpd_tls_CAfile = /etc/pki/tls/certs/ca.pem
```
startssl.crt、server.keyの名前は作成する際に任意につけたファイル名。

##dovecot
```
$ sudo vi /etc/dovecot/conf.d/10-ssl.conf
ssl = yes
ssl_cert = </etc/pki/tls/certs/startssl.crt
ssl_key = </etc/pki/tls/certs/server.key
ssl_ca = </etc/pki/tls/certs/ca.pem
```

##nginx
```
$ sudo cat startssl.crt sub.class1.server.ca.pem > /etc/nginx/conf/startssl_nginx.crt

$ sudo vi default.conf
server{

    ssl on;
    listen 443;
    ssl_certificate /etc/pki/tls/certs/startssl_nginx.crt;
    ssl_certificate_key /etc/pki/tls/certs/server.key;

}
```
startssl_nginx.crtの名前は作成する際に任意につけたファイル名。

参考
https://www.startssl.com/?app=42

##証明書更新
参考
http://yanmoo.blogspot.jp/2013/04/startssl.html
導関数の計算が面倒な場合の数値近似法

最急降下法やLevenberg-Marquardt法で求めたい式の導関数をイチイチ計算したり実装するのが面倒な場合に数値計算で近似する方法です。
以下の3種類くらいがよく使われるらしく、計算量と精度のバランスを考えて決めればよいようです。

* 2点近似
* 3点近似（中心差分）
* 5点近似

# 近似法

## 2点近似

一番簡単な近似で計算も一番早い。
その分精度はそこそこ。
数式で表すと

```math
f'(x_0) \approx \frac{f(x_0+h)-f(x_0)}{h}
```

ただし$h$は十分小さい値です。
C言語で実装すると、

```c
#include <float.h>

extern double f( double x );

double df( double x )
{
    const double h = FLT_EPSILON;
    double y1 = f( x + h );
    double y2 = f( x );

    return ( y1 - y2 ) / h;
}
```

$h$は正でも負でも計算はできるようですが結果が変わります。

## FLT_EPSILONについて
`FLT_EPSILON`は`float.h`に定義されている値です。
微小な値で、機械イプシロンという「1より大きい最小の数」と1との差の値として定義されてます。
`FLT_EPSILON`自体は`float`用の機械イプシロンですが`x`の値が小さい場合丸め誤差が発生しそうなので`double`用ではなくとりあえずこちらを使用してます。

定義としては`double`用もあり`DBL_EPSILON`が同じ`float.h`に定義されてます。

## 3点近似（中心差分）

2点近似だと導関数の値がゼロになる点$x_0$でもゼロになりにくいのでもう少し改良して点$x_0$の前後の点を使う方法です。
計算量は2点近似よりちょっと増える分精度は向上。

数式で表すと

```math
f'(x_0) \approx \frac{f(x_0+h)-f(x_0-h)}{2h}
```

C言語で実装すると、

```c
#include <float.h>

extern double f( double x );

double df( double x )
{
    const double h = FLT_EPSILON;
    double y1 = f( x + h );
    double y2 = f( x - h );

    return ( y1 - y2 ) / ( 2 * h );
}
```

3点近似といいながら計算では2点しか出てこないんですね。
平均値の定理を考えるとこちらの方が`x`の本当の値に近い可能性が高そうです。

$h$は正負どちらでも結果は一緒になります。

## 5点近似

```math
f'(x_0) \approx \frac{f(x_0-2h)-8f(x_0-h)+8f(x_0+h)-f(x_0+2h)}{12h}
```

一気にわけわからない式になりました。
Taylor展開とかLagrange補間多項式とかそんなのを駆使して導くようです。

C言語で実装すると、

```c
#include <float.h>

extern double f( double x );

double df( double x )
{
    const double h = FLT_EPSILON;
    double y1 = f( x + h );
    double y2 = f( x - h );
    double y3 = f( x + 2 * h );
    double y4 = f( x - 2 * h );

    return ( y4 - 8 * y2 + 8 * y1 - y3 ) / ( 12 * h );
}
```

もはやなにがなんだかわからないので、こうすれば計算できることだけ覚えておいてありがたく使わせてもらうことにします。

# 偏微分

複数の変数でできた関数だと偏微分することになりますが、やることは同じです。
2点近似で$f(x,y,z)$の$y$を偏微分するなら

```math
f_y(x_0,y_0,z_0) \approx \frac{f(x_0,y_0+h,z_0)-f(x_0,y_0,z_0)}{h}
```

これを実装することになります。
注意：Ansible 1.9で追加されたwin_updatesモジュールはまだ使用できない

**2016-02-27追記：** Ansible 2.0ではこのページの最後に書いた方法で実装され、win_updatesが使用できるようになった。PSWindowsUpdateはもはや使用されていないためインストールする必要はない。

# win_updatesモジュールの使用準備

Ansible 1.9にてExtras Moduleとしてwin_updatesモジュールが追加された。
これはWindows(Microsoft) Updateを実施してくれるモジュールである。

使用するためにはまずWindows側にPSWindowsUpdateがインストールされている必要がある。
PSWindowsUpdateはwin_updatesモジュールと同様にAnsible 1.9で追加されたwin_chocolateyモジュールを使ってインストールすることができる。

```
# ansible windows -i hosts -m win_chocolatey -a 'name=PSWindowsUpdate'
```

win_updatesモジュールの実行は以下で可能である。

```
# ansible windows -i hosts -m win_updates
```

# しかし実際は

で、実行したところ、出力からは更新がインストールされ、実行が成功しているように見える。
（日本語は文字化けするが）

```
10.0.2.192 | success >> {
    "changed": true,
    "updates_already_present": [
        "2919442",
        "3005628"
    ],
    "updates_category": "critical",
    "updates_installed": [
        "2939087",
        "2967917",
        "2994290",
        "3012199",
        "3008242",
        "3000850"
    ],
    "updates_installed_KB2939087": "Windows 8.1 for x64-Based Systems ???????? (KB2939087)",
    "updates_installed_KB2967917": "Windows 8.1 for x64-Based Systems ???????? (KB2967917)",
    "updates_installed_KB2994290": "Windows 8.1 for x64-Based Systems ???????? (KB2994290)",
    "updates_installed_KB3000850": "Windows 8.1 for x64-Based Systems ???????? (KB3000850)",
    "updates_installed_KB3008242": "Windows 8.1 for x64-Based Systems ???????? (KB3008242)",
    "updates_installed_KB3012199": "Windows 8.1 for x64-Based Systems ???????? (KB3012199)",
    "updates_installed_afterwards": [
        "2919442",
        "3005628"
    ],
    "updates_installed_count": 6,
    "updates_reboot_needed": true,
    "updates_success": "true"
}
```

しかしWindows機上で確認してみると何もインストールされていないことがわかる。

これはPSWindowsUpdateはCOMオブジェクトにアクセスして更新のインストールを行うが、COMオブジェクトはWinRM経由のリモートからはアクセスできないようになっているのが原因のようだ。
（出力上成功しているように見えるのは、もちろんエラーハンドリングがおかしいからだが）

次がこの件について記述されたものである。

https://github.com/ansible/ansible-modules-extras/issues/275
https://github.com/ansible/ansible-modules-extras/issues/287

タスクスケジューラに一時的に登録して実行させる、というアプローチで解決を目指す模様。
ローカルサーバーにURLでアクセスする

同じローカルネット内にあるサーバーにアクセスする際、名前解決ができない。
hostsファイルに設定すると、DNSサーバを立てなくても設定できる。

ubuntuの場合

```bash:/etc/hosts
[サーバーIP] [URL]
```
OpenCLランタイム > 32bit linuxにはインストールできないようだ

動作環境

    CentOS 6.5 (32bit)

使おうとしていた数値計算ソフトがOpenCLを必要としていたため、CentOSにインストールしようとした。

OpenCLのインストールは下記を参考にした。
http://kawa0810.hateblo.jp/entry/2014/09/25/015122

Intel SDKはCode Builderとかに変わっていて、linux用はこちら
https://software.intel.com/en-us/articles/intel-code-builder-for-opencl-api

Drivers and Runtimeはこちら
https://software.intel.com/en-us/articles/opencl-drivers

引っかかったのは、Runtimeがlinuxに関しては64bit用しかなく、64bit用を32bit環境にインストールしようとすると以下のように言われてしまう。

```
The package does not support the platform it being run on.
Please check to be sure the correct architecture of package has been downloaded.

Quitting!
```

CentOS 6.5(64bit)環境を作らないといけなさそう。うーん、どうしよう。
と思っていたら、ポケットにCentOS 6.5(64bit)が入っていた。

<hr>
CentOS 6.5(64bit)でのインストール時、以下をしておくこと。

    $ yum install numactl*
    $ yum install redhat-lsb-core

インストール時は"Unsupported OS"とか言われるけど気にしない。
「型システム入門」と「ソフトウェアの基礎」の対応

「型システム入門」（TaPL）と「ソフトウェアの基礎」（SF）の進行性と保存性の説明の対応
--------

# 型なし算術式
TaPL 型なし算術式 p.28
SF   SmallStep    (strong_progress) 数値
SF   SmallStep    (strong_progress) Bool、if-then-else

# 型付き算術式
TaPL 型付き算術式 p.72 (8.3.3、8.3.2)、Bool、if-then-else、数値
SF   Types        Bool、if-then-else、数値

# 型付きラムダ式
TaPL 型付きラムダ式     p.80 (9.3.5、9.3.9)、Bool、if-then-else
SF   Stlc         Bool、if-then-else、(練習問題：数値、if0）

SF   MoreStlc     List、直積、直和、数値、if0、fix、let

SF   Records      レコード

# 参照
TaPL 参照         p.129 (13.5.7、13.5.3)、参照
SF   References   数値、if0、参照

# 例外
TaPL 例外         p.134 (14.1.2 Progress)

# 部分型付け
SF   Subtyping    Bool、if-then-else、（練習問題：直積）
TaPL 部分型付け   p.149 (15.3.7、15.3.5)、レコード

SF   RecordSub    レコード

# それ以外
TaPL FJ          p.204 (19.5.4、19.5.1)
TaPL 全称型       p.277 (23.5.2、23.5.1)
TaPL 有界量化     p.317 (26.4.15、26.4.13)
TaPL 高階多相     p.361 (30.3.16、30.3.14)