OmniAICreator/Qiita-1.07M huggingface dataset:
配列内の特定のオブジェクトのキーでソートする

本来なら、lo-dash使いたいけど、手元の環境ですぐに利用できる環境が以下だったのでそちらで試した内容をまとめておきます

- 環境
  - node v0.12.0
  - Underscore.js 1.6.0

## 対象となるJSONのデーター構造

WebAPIから取得するJSONみたいなものを想定しています

```json
var posts = [
  {"created_at": "2015-08-10T13:28:59.000+09:00","name": "test1", "picutre": "sample1.jpg" },
  {"created_at": "2015-08-20T13:28:59.000+09:00","name": "test3", "picture": "sample3.png" },
  {"created_at": "2015-08-01T13:28:59.000+09:00","name": "test0", "picture": "sample4.png" },
  {"created_at": "2015-08-15T13:28:59.000+09:00","name": "test2", "picture": "sample2.png" }
]
```

## 特定のキーでソートする

名前順でソートするにはこんな感じ

```js
var posts,
    result_name,
    sorby_by_create_at;
_ = require('underscore');
posts = [
  {"created_at": "2015-08-10T13:28:59.000+09:00","name": "test1", "picutre": "sample1.jpg" },
  {"created_at": "2015-08-20T13:28:59.000+09:00","name": "test3", "picture": "sample3.png" },
  {"created_at": "2015-08-01T13:28:59.000+09:00","name": "test0", "picture": "sample4.png" },
  {"created_at": "2015-08-15T13:28:59.000+09:00","name": "test2", "picture": "sample2.png" }
]

result_name = _.sortBy(posts, function (post) { return post.name; });

```

日付順でソートするにはこんな感じ

```js
var posts,
    result_name,
    sorby_by_create_at;
_ = require('underscore');
posts = [
  {"created_at": "2015-08-10T13:28:59.000+09:00","name": "test1", "picutre": "sample1.jpg" },
  {"created_at": "2015-08-20T13:28:59.000+09:00","name": "test3", "picture": "sample3.png" },
  {"created_at": "2015-08-01T13:28:59.000+09:00","name": "test0", "picture": "sample4.png" },
  {"created_at": "2015-08-15T13:28:59.000+09:00","name": "test2", "picture": "sample2.png" }
]
sorby_by_created_at = _.sortBy(posts, function (post) { return post.created_at; });
```

日付を最新の順番に並べ替えるのなら、sortByした後にreverse()すればOK

```js
var posts,
    result_name,
    sorby_by_create_at;
_ = require('underscore');
posts = [
  {"created_at": "2015-08-10T13:28:59.000+09:00","name": "test1", "picutre": "sample1.jpg" },
  {"created_at": "2015-08-20T13:28:59.000+09:00","name": "test3", "picture": "sample3.png" },
  {"created_at": "2015-08-01T13:28:59.000+09:00","name": "test0", "picture": "sample4.png" },
  {"created_at": "2015-08-15T13:28:59.000+09:00","name": "test2", "picture": "sample2.png" }
]
sorby_by_created_at = _.sortBy(posts, function (post) { return post.created_at; });
sorby_by_created_at.reverse();
```
【Virtual Box】共有フォルダ作成


# 【環境】

* ホスト側OS: WIN7(64bit)
* ゲスト側OS: Ubuntu(vboxadditionインストール済)
* 仮想ソフト: VirtualBox　

# 1. ホストにて

共有フォルダを用意する。
たとえば、ディスクストップに`Ubuntu`というフォルダを作成しておく。

# 2. VirtualBoxにて

設定　→　共有フォルダ　→　`+`(フォルダ追加)
* 自動マウント　→　☑
* 永続化する　→　☑

# 3. ゲストにて

```bash
# 新規共有フォルダ
$ sudo mkdir /mnt/Ubuntu
$ sudo chmod 777 /mnt/Ubuntu
# 確認
$ ls -ld /mnt/Ubuntu
# 共有フォルダのひも付け
$ sudo mount -t vboxsf Ubuntu /mnt/Ubuntu
```
Railsで自由自在なSQLが組み上がるまで

## ActiveRecord / Arel
以下の続編としてお読みください
[Railsの複雑な検索はスコープを使おう](http://qiita.com/himinato/items/724a4a162dfa9e27754a)
RailsでSQL文をどんどん部品化していきます

今回DatabaseがRedshift(Postgresqlに似ている)です

## Arel::Nodes::NamedFunction
DB固有の関数を使う場合などはこれ

```rb
# こんな感じのテーブルがあるよ
# create table timeaxis (time_s timestamp)
time_table = Arel::Table.new('timeaxis')
time_table.project(
  Arel::Nodes::NamedFunction.new(
    'date_trunc',
    [Arel::Nodes::build_quoted('day'),
     time_table[:time_s]]
  ).as('daily')
).group(
  Arel::Nodes::NamedFunction.new(
    'date_trunc',
    [Arel::Nodes::build_quoted('day'),
     time_table[:time_s]]
  )
)

# 得られるSQL
# SELECT
#   date_trunc('day', "time_table"."time_s") AS daily
# FROM
#   "time_table"
# GROUP BY
#   date_trunc('day', "time_table"."time_s")

```

タイムスタンプを日次にする例、**scope**として宣言しておけば、`day`の部分を引数にして１時間ごと、月ごとなど変更は容易です

`NamedFunction`は第一引数を関数名として、第二引数に配列(中身はArelオブジェクト)をとりカンマ区切りでつなぐようです。第二引数の配列内には２つを超えるオブジェクトも渡せます

`build_quoted`は文字列をシングルクオートで囲むみたい

PostgresqlのCASTをスコープに設定するなら

```rb
scope :cast, lambda { |str, type|
  Arel::Nodes::NamedFunction.new(
    'CAST', [
      Arel::Nodes::As.new(
        Arel::Nodes.build_quoted(str),
        Arel::Nodes::SqlLiteral.new(type)
      )
    ]
  )
}

# cast('20.2', 'float') => CAST('20.2' AS float)
# cast('1 HOUR', 'interval') => CAST('1 HOUR' AS interval)
```

文字列と変換する型を引数として渡せば型変換してくれます

`As`は二つの引数を`AS`でつないでくれるみたい
`SqlLiteral`は渡した文字列をArelオブジェクトにしてくれる

## Arel::Nodes::InfixOperation
あまり使い道は見いだせませんが、こんなことも可能です

```rb
Arel::Nodes::NamedFunction.new(
  'SELECT',
  [Arel::Nodes::InfixOperation.new(
    '+',
    Arel::Nodes::NamedFunction.new(
      'CAST', [
        Arel::Nodes::As.new(
          Arel::Nodes.build_quoted('2015-08-01'),
          Arel::Nodes::SqlLiteral.new('TIMESTAMP')
        )
      ]
    ),
    Arel::Nodes::InfixOperation.new(
      '*',
      Arel::Nodes::NamedFunction.new(
        'GENERATE_SERIES', [0, 23]
      ),
      Arel::Nodes::NamedFunction.new(
        'CAST', [
          Arel::Nodes::As.new(
            Arel::Nodes.build_quoted('1 HOUR'),
            Arel::Nodes::SqlLiteral.new('INTERVAL')
          )
        ]
      )
    )
  )]
).as('hourly')

# 得られるSQL
# SELECT
#    (CAST('2015-08-01' AS TIMESTAMP) + GENERATE_SERIES(0, 23)
#    *
#    CAST('1 HOUR' AS INTERVAL))
# AS hourly
```

結局１時間ごとを得るのかよ...

`InfixOperation`は第一引数にオペレータをとり、第二引数と第三引数をつなぐみたい

意味は無いが、下記のようにも使える

```rb
Arel::Nodes::NamedFunction.new(
  'CAST', [
    Arel::Nodes::InfixOperation.new(
      'AS',
      Arel::Nodes.build_quoted('2015-08-01'),
      Arel::Nodes::SqlLiteral.new('TIMESTAMP')
    )
  ]
)

# CAST('2015-08-01' AS TIMESTAMP)
```

先述の通り`As`を使うのが良いと思う
なにより、Arelでは第一引数をオペレータとして扱うので不具合の原因となりそうなので非推奨

## まとめ
**Arel::Nodes**を利用すればArelで用意されていない関数なども使うことができるようになります
また本投稿では全てのモジュールを扱っておりませんので、下記を参考ください
[Module: Arel::Nodes](http://www.rubydoc.info/github/rails/arel/Arel/Nodes)
地味に便利なターミナルで使えるMacのコマンド集

# Finderで開く
今いる場所をサクッと開ける便利

```bash
$ cd ~/
$ open .
```

openコマンドはアイコンをダブルクリックしたときの挙動をします

# どこにいてもQuick Lookで開く
画像の確認したいけど、プレビュー遅くてめんどうな時に便利

```bash
$ qlmanage -p ~/test/test/test.png
```

# スクリーンショット
カーソルを画像に入れたり、音を消したり、拡張子変えたり、地味に便利
影なしとか、タイマー設定とかもできる

```bash
# クリップボードにコピー
$ screencapture -c
# 範囲選択
$ screencapture -i text.png
```

# 画像リサイズ
一括で適当にまとめてリサイズしたいとき便利

```bash
$ sips --resampleWidth 100 test.png --out new.png
```

# コピペ
出力が長いときにコピーしたいときに使える、ペーストは使ったことない。

```bash
$ ls -la | pbcopy
$ pbpaste > test.txt
```

# Macに喋らせる
発音わかんないときに喋らせてみる

```bash
$ say "hello"
```

# 音楽再生
gulpタスクの最後に音を鳴らしてたけど、watchさせたら鳴りまくるのでやめた

```
$ afplay test.mp3
```
超初心者 JavaScript エンジン 的呼ばれ方を理解してコーディングするメモ

##初めに
* プログラマ歴に比べると、超JS初心者
* メモなので、間違っている箇所、誤字脱字の可能性があります
* どんな言語でもそうですが、感覚の違いというのは誰しも有ります

##jsのデバッグ
をしているとわかることだけれど

##昔からコンテキストスイッチ
という物があり、これは、実行しているプロセスをしまっておいて、必要になった時に出してきて継続した処理を正常に動かしておくもの。

##jsで言えば
例えば、スパイダーモンキーとかV8のようなエンジンが変数などの初期化の際、その実行コンテキストのオブジェクトに変数や関数の初期化されたもの等をしまっておく。
ただ、ここで気を付けておきたいことが、変数・関数の宣言・初期化処理は行うが、関数の中に存在するローカル変数に関しては宣言に留まり、初期化までは行わないということ。当然の話だけど、理解して書いていないと思わぬ`undefined`を引き起こしてしまう可能性がある。

**サンプルコードを書いてみた。**
magicという隠し味をミックスした物を生み出すコードです。内容はどうでもいいですが

```.js
function make(val) {
  var name = name,
      magic = '∞';
  function mixin() {
    console.log(magic + name);
  }
  mixin();
}
make('ジュース');
```

**make関数にブレークポイントを置いてみると**
コードの実行が行われるまでは、make関数の中にあるname,magicのような変数は初期化されておらず`undefined`されている。mixinのスコープのクロージャとしてもまだ初期化はされておらず

![スクリーンショット 2015-08-18 13.09.13.png](https://qiita-image-store.s3.amazonaws.com/0/44698/8bafff61-b038-c28a-ec75-29e00ce740c1.png)

**その後、make関数の中にステップインすると**
name,magic変数が初期化され、それぞれの値が代入されているます。クロージャとしても値が入っている

![スクリーンショット 2015-08-18 13.12.20.png](https://qiita-image-store.s3.amazonaws.com/0/44698/4f4d0210-d178-38ef-0c89-d83da067f351.png)

この後は、引き続きVMの中に入っていってconsoleが呼ばれnameとmagicの合わさった文字が出力される

何こいつ当たり前のことを言っているんだ、てなるかもしれませんが。まあ、そう、本当に当たり前の話で。

実際に関数が呼ばれるまでは関数内にある変数は初期化されてないよ、という超初心者向けの記事なので。サーバサイド中心にやっていて、バグらない程度に一応JSの動き知っておこうって人のための記事です。
体で覚えたいtmuxコマンド

## セッション関連

|操作|コマンド|
|:--|:--|
|セッション作成|tmux|
|デタッチ（セッションを残したまま終了）|ctrl-b + d|
|セッション終了（セッション破棄）|exit|
|セッションのリスト表示|tmux ls|
|アタッチ（セッション再開）|tmux a -t [セッション名]|
|セッション削除|tmux kill-session -t [セッション名]|
|セッション全削除|tmux kill-server|

## ウィンドウ関連
|操作|コマンド|
|:--|:--|
|ウィンドウ作成|ctrl-b + c|
|ウィンドウ終了|exit|
|ウィンドウ切り替え（次）|ctrl-b + n|
|ウィンドウ切り替え（前）|ctrl-b + p|
|ウィンドウ切り替え（指定）|ctrl-b [ウィンドウ番号]|
|ウィンドウ切り替え（一覧）|ctrl-b w|

## ペイン関連

|操作|コマンド|
|:--|:--|
|ペイン分割（縦）|ctrl-b %|
|ペイン分割（横）|ctrl-b "|
|ペイン終了|exit|
|ペイン切り替え|ctrl-b + o|
|ペイン番号表示|ctrl-b + q|
|ペイン切り替え（指定）|ctrl-b + q + [ペイン番号]|


## centosへのインストール

    yum install http://dl.fedoraproject.org/pub/epel/6/x86_64/tmux-1.6-3.el6.x86_64.rpm
CocoaPodsなプロジェクトで複数ブランチを行き来する際に"sandbox is not in sync"でイライラしない方法



複数人で開発を行っていると、ライブラリの追加やアップデート等でブランチ間のPodfileに差分が生じる事がある。
コードレビュー等のためにブランチ間を行き来していると、XCodeビルドを走らせてからこのようなエラーが出て`pod install`が必要と気づく事が多い。

```
error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.
```

できればブランチを切り替えた際必要に応じて自動で`pod install`したい。

とか考えてたが、超単純にGitのpost-checkoutでPodfile.lockと${PODS_ROOT}/Manifest.lockのdiffを見ればいいだけだった。

```shell:.git/hooks/post-checkout
diff Podfile.lock Pods/Manifest.lock > /dev/null
if [[ $? != 0 ]]; then
  echo "Sandbox needs to be updated. Re-installing libraries..."
  bundle exec pod install
fi
```

これでチェックアウト先でpodsの再インストールが必要であれば`pod install`が開始される。
yosemiteにアップデートしたらコピペがとっても遅くなった

ある日macのOSをyosemiteに変更したらchrome上でのコピペがとっても遅くなってしまって以下の手順を試したら直りました。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/35451/823b5231-cc4e-6fee-3d26-f927a40f7d74.png)
![5.png](https://qiita-image-store.s3.amazonaws.com/0/35451/87aa03d3-a8f6-9399-eec6-437fe9307f44.png)
![1.png](https://qiita-image-store.s3.amazonaws.com/0/35451/988eb8b0-d0c2-4b7e-c0c3-b9fd1fe7399f.png)
![2.png](https://qiita-image-store.s3.amazonaws.com/0/35451/42b44d13-d106-8135-e760-065cdf31561b.png)
![3.png](https://qiita-image-store.s3.amazonaws.com/0/35451/9f24db01-5866-b8e4-12df-fc70cc2d9cf8.png)
特定のproductFlavor/buildTypeにだけActivityを追加する

# 1 前提条件

AndroidStudio 1.3
productFlavor、buildTypeの設定は完了していて、以下のflavorがあるものとする

develop
staging

producFlavorの設定の仕方は以下を参照。
AndroidStudio1.3でproductFlavor (外部参照jarまで差し替えるよ)
http://qiita.com/le_skamba/items/af290f53f6d5ac0a2603
# 2 最終目標

あるproductFlavor/buildTypeにだけ、Activityを追加する
（当然、該当のBuildVarientにだけそのActivityを呼び出すコードがある)

# 3 Activityを追加したいflavorのパッケージ下に追加する

例えば、flavor「staging」の「flavortest.jp.sampleflavor.gui」に「SubActivity」を追加する場合。

## (1) BuildVarientsをstagingのものにする

## (2) プロジェクトエクスプローラの「flavortest.jp.sampleflavor.gui」を右クリック

## (3) 「New」-「Activity」-「Blank Activity」（勿論作りたいActivityに合わせた物を選んで良い）をクリック

## (4) Activity名やレイアウトファイル名など任意に記入し、パッケージ名を確認してFinishをクリック

## (5) Manifestfileを確認する

上記手順で、manifests/下に、AndroidManifest.xml(stating)というのが増えているので開くと、以下のようにActivityだけ記述されている。

```xml:AndroidManifest.xml(stating)
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

	<application>
		<activity android:name="flavortest.jp.sampleflavor.gui.SubActivity"
				  android:label="@string/title_activity_sub"
			>
		</activity>
	</application>

</manifest>
```

実際のファイルは、app/src/staging/下に存在する。
手動でActivityを追加したのであれば、app/src/staging直下にmanifestファイルを作ってやって、追加したいActivityだけ書いておけば良い。

ちなみに、AndroidManifest.xml(stating)を開くと、strings.xmlの参照などで`Cannot resolve symbol`とエラー表示されている場合があるが、ビルドは通って実行も問題なく出来るので気にしなくて良い模様。

※ちなみに、Acticity名を以下のように相対パスで書くと、package名がdefaultConfigと異なる場合にActivity Not Foundになるので、絶対パスで書く必要がある模様。

```xml:相対パスはActivityNotFoundになる
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

	<application>
		<activity android:name=".gui.SubActivity"  // <--相対で書いたらNG
				  android:label="@string/title_activity_sub"
			>
		</activity>
	</application>

</manifest>
```

おそらくパッケージ名の置換がビルド時にうまく行われないようだ。
(main/Manifestfile.xmlは相対パスで書いても大丈夫なのにね)


# 4 Activity呼び出しコードを書く

サンプル。staging/MainActivityに以下のように書いた。

```java:MainActivity(staging)
Intent intent = new Intent(getApplicationContext(), SubActivity.class);
        startActivity(intent);
```

同じコードをMainActivity(develop)に書くと、SubActivityがないよとコンパイルエラーが出る。developには作成していないので、正しい。

release/debugにだけ追加したい場合も、同様の手順でOK。
デバッグ時だけ出すデバッグ情報用の画面とか、レイアウトやアイコンの確認用の画面とか、デバッグしたいメニューの階層が深いのでいきなりそこに飛べるテスト用画面とか、特にdebugで用途がありそうですね。
python のor の論理演算子でない使い方

[spotify/luigi](https://github.com/spotify/luigi) のs3 targetのコードで、またまた自分が知らない記述方法があった。

~~~
        self.fs = client or S3Client()
~~~

このorは一般的に条件式で使われる論理演算子ではないらしい。左辺が優先され、左辺がNoneの時には右辺が入る。

[Python の or は条件分岐以外にも使える](http://momijiame.tumblr.com/post/29966747567/python-%E3%81%AE-or-%E3%81%AF%E6%9D%A1%E4%BB%B6%E5%88%86%E5%B2%90%E4%BB%A5%E5%A4%96%E3%81%AB%E3%82%82%E4%BD%BF%E3%81%88%E3%82%8B)
su - (ハイフン)について

__追記__
コメントで指摘していただいてから調べた感じ
http://nurublo.blog.fc2.com/blog-entry-2.html
のようになるとのこと

---

ずっとわからなかったんだけど `-` をつけると環境変数を引き継ぐということをおしえてもらったというメモ

で調べたら
http://d.hatena.ne.jp/midori_kasugano/20100119/1263877441
とかがすぐにでてきた
STLのコンテナに対してoperator<<をオーバーロードする(C++11)

```cpp
template <class C>
std::ostream& operator<<(std::ostream& out, const C& container) {
    out << "[";
    for (auto p = container.begin(); p != container.end(); p++) {
        if (p == container.begin()) {
            out << *p;
        } else {
            out << ", " << *p;
        }
    }
    out << "]";
    return out;
}
```
普通にオーバーロードしようとすると、テンプレートの対象が広すぎて中の文字列出力のところで怒られる。

よってコンテナに対してだけオーバーロードする必要がある

```cpp
#include <type_traits>

template <class C>
auto operator<<(std::ostream& out, const C& container)
    -> typename std::conditional<true, std::ostream&, decltype(*container.begin())>::type {
    out << "[";
    for (auto p = container.begin(); p != container.end(); p++) {
        if (p == container.begin()) {
            out << *p;
        } else {
            out << ", " << *p;
        }
    }
    out << "]";
    return out;
}

```

テスト:

```cpp
    std::vector<std::list<int>> a{{1,2,3},{4,5,6}};
    std::cout << a << std::endl;

```
out:

```
[[1, 2, 3], [4, 5, 6]]
```
コンパイラ:g++ 4.9.3
【CentOS7】REMI リポジトリをインストールする

Remiとは、公式とは別のサードパーティ製のリポジトリです。
このページでは最近使われることが多くなった CentOS 7.x への Remi リポジトリのインストールについて説明します。

# Remi リポジトリのインストール手順（CentOS 7.x）
0. 任意の作業ディレクトリに移動します（ホームディレクトリなど）  
`# cd`
0. RPMパッケージをダウンロードします  
`# wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm`
0. ダウンロードしたRPMパッケージをインストールします  
`# rpm -Uvh remi-release-7.rpm`
0. これで使用可能になりました。下記は PHP 5.6 をインストールできるか確認したい場合の例です  
`# yum info --enablerepo=remi php56`

### 設定ファイルについて
設定ファイル（.repo）は下記で編集できますが、デフォルトで enabled=0 になっているので、基本的に編集不要です。
`# vi /etc/yum.repos.d/remi.repo`

###参考URL
[Remi RPM リポジトリ公式サイト](http://rpms.famillecollet.com/)
ざっくりした初めてのElectron

※社内勉強会で使った資料です。発表時は口頭で色々説明したり、コード映したりしたのでわかりづらいとこありますがご容赦ください。


## Electronとは？
- cross platformなデスクトップアプリがつくれる
- HTML, CSS, JSでつくれる
- io.js + chromium
- けっこうたくさんelectronで作られたアプリがある。[sindresorhus/awesome-electron](https://github.com/sindresorhus/awesome-electron)
 - slackはwindows版だけっぽい。Mac版はMacGapを使ってるらしい。
   - [(3) What technologies does Slack (startup) use to deliver a hybrid Mac app? - Quora](http://www.quora.com/What-technologies-does-Slack-startup-use-to-deliver-a-hybrid-Mac-app)
   - [Desktop Application Engineer | Slack](https://slack.com/jobs/69902/desktop-application-engineer)
- Electronで作ったアプリをMac App Storeに出すこともできるらしい。[Electron for the Mac App Store](http://www.saschawise.com/blog/2015/08/12/electron-for-the-mac-app-store.html)

## 開発
- メインプロセスとレンダラープロセス。
- メニュー表示できる。status barにも。
 - [JavaScript (Electron) を使ってアプリの見栄えを整える - Qiita](http://qiita.com/nyanchu/items/9a1c910bbca55e9d2f3c)
- プロセス間通信はipcとかremoteとか
 - [Electronでipcを使ってプロセス間通信を行う - Qiita](http://qiita.com/Misumi_Rize/items/dde76dbf89abee13991c)


### 最初はこのへん見るといい
- [30分で出来る、JavaScript (Electron) でデスクトップアプリを作って配布するまで - Qiita](http://qiita.com/nyanchu/items/15d514d9b9f87e5c0a29)
- [Quick Start](http://electron.atom.io/docs/v0.30.0/tutorial/quick-start/)

### その他できること
- デスクトップ通知
  - HTML5のNotification APIを使う


## デバッグ
レンダラープロセスはDevToolが普通に使える。リロードすれば変更は反映される。

メインプロセスはちょっと面倒。console.logはターミナルにでる。変更を反映するには、一旦プロセスを終了して再実行。
node-inspector使えば、DevTool使えるっぽいが、自分の環境だとうまくいかず。。。

[Debugging Main Process](http://electron.atom.io/docs/v0.30.0/tutorial/debugging-main-process/)


## アプリのパッケージング・配布
[30分で出来る、JavaScript (Electron) でデスクトップアプリを作って配布するまで - Qiita](http://qiita.com/nyanchu/items/15d514d9b9f87e5c0a29#%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%82%92%E9%85%8D%E5%B8%83%E3%81%99%E3%82%8B)

electron-packager使うといいらしい。
アイコン変えたりアプリ名変えたりできる。

## その他
### 環境を整えるのがめんどい
- coffee? typescript? ES6?
- gulp

[ぼくのかんがえたさいきょうのElectron - Qiita](http://qiita.com/Quramy/items/90d61ff37ca1b95a7f6d) を参考にするとよさそう。

### ちゃんと設計しないと大変
- react? angular?
  - kobitoはreact. Mac版置き換えるっぽい。 [Kobito for Windows をリリース + 技術的な補足, package.json... - Qiita Blog](http://blog.qiita.com/post/118842984159/kobito-for-windows-release-tech)
  - [Electron, React, Fluxを使ってアプリケーションを作った - Qiita](http://qiita.com/Misumi_Rize/items/d6a7b16d8c762546cb40)


[ぼくのかんがえたさいきょうのElectron - Qiita](http://qiita.com/Quramy/items/90d61ff37ca1b95a7f6d) によると、Angularはやめた方がよさそう。

>  AngularJSはViewと関係の無い機能も含まれた(Webブラウザを動作環境とするという意味においての)Full Stackなフレームワークです。
例えば、通信系の機能について、Ajaxをラップした$http や Promise実装である $q 等が最初から含まれています。
一方、Electronの開発では、Node.jsで出来ることは素直にNode.jsの機能を使った方が早いことも多く、ライブラリも豊富です。HTTP通信をしたければ、素直にrequire('http').requestを呼び出せば良いのです。
そんなことを考えた結果、シンプルなViewフレームワークであるReactを選択しました.
HTTPリダイレクト 301と302で迷ったら

SEO的な側面から302と301のリダイレクトは明確に使い分けが必要です。

## 301リダイレクトと302リダイレクトの違い
301 ... 永久的なリダイレクト
302 ... 一時的なリダイレクト

## 今回はどっちを使えばいいの？
**「そのページに設定したリダイレクトは、今後解除する可能性があるか？」**
答えがNOなら301、YESなら302です。

例としては、
301 ... ページ移転(URL変更)、ページ削除
302 ... メンテナンス画面、エラー画面
など。


## なぜ使い分けが必要なのか？
特に、サイト移転などの場合は注意が必要で、
301でやるべきですが、302にしちゃうとページランク等のSEO的に重要なステータスがなくなってしまう可能性があります。
Ruby で Salesforce の15桁IDを18桁IDに変換する

salesforceのIDは15桁版と18桁版が有ります。
rubyで15桁から18桁に変換するコードが見つからなかったので以下のURLからruby版を作ってみました。

http://salesforce.stackexchange.com/questions/27686/how-can-i-convert-a-15-char-id-value-into-an-18-char-id-value

```rb
# salesforce1518.rb

class Salesforce1518

  def self.cvt1518(id)
    raise ArgumentError if id.nil?
    return id if id.size == 18
    raise ArgumentError if id.size != 15

    triplet = [id[0, 5], id[5, 5], id[10, 5]]
    suffix = triplet.map do |value|
      str = value.reverse.chars.map do |char|
        /[[:upper:]]/ === char ? '1' : '0'
      end.join
      binary_id_lookup[str]
    end.join
    id + suffix
  end

  private

  def self.binary_id_lookup
    {
        '00000' => 'A',
        '00001' => 'B',
        '00010' => 'C',
        '00011' => 'D',
        '00100' => 'E',
        '00101' => 'F',
        '00110' => 'G',
        '00111' => 'H',
        '01000' => 'I',
        '01001' => 'J',
        '01010' => 'K',
        '01011' => 'L',
        '01100' => 'M',
        '01101' => 'N',
        '01110' => 'O',
        '01111' => 'P',
        '10000' => 'Q',
        '10001' => 'R',
        '10010' => 'S',
        '10011' => 'T',
        '10100' => 'U',
        '10101' => 'V',
        '10110' => 'W',
        '10111' => 'X',
        '11000' => 'Y',
        '11001' => 'Z',
        '11010' => '0',
        '11011' => '1',
        '11100' => '2',
        '11101' => '3',
        '11110' => '4',
        '11111' => '5',
    }
  end
end
```

ダイジョブぽい

```rb
# specにて
expect(Salesforce1518.cvt1518('a06O000000TL5ci')).to eq('a06O000000TL5ciIAD')
```

TODO: gem化
Atomでctrl-d, ctrl-e, ctrl-hでカーソル操作出来ない時のキーバインド変更方法

AtomでCtrl-d, Ctrl-eが動かない時のkeymap.csonの内容

```rb
# Your keymap
#
# Atom keymaps work similarly to stylesheets. Just as stylesheets use selectors
# to apply styles to elements, Atom keymaps use selectors to associate
# keystrokes with events in specific contexts.
#
# You can create a new keybinding in this file by typing "key" and then hitting
# tab.
#
# Here's an example taken from Atom's built-in keymap:
#
# 'atom-text-editor':
#   'enter': 'editor:newline'
#
# 'atom-workspace':
#   'ctrl-shift-p': 'core:move-up'
#   'ctrl-p': 'core:move-down'
#
# You can find more information about keymaps in these guides:
# * https://atom.io/docs/latest/customizing-atom#customizing-key-bindings
# * https://atom.io/docs/latest/advanced/keymaps
#
# This file uses CoffeeScript Object Notation (CSON).
# If you are unfamiliar with CSON, you can read more about it here:
# https://github.com/bevry/cson#what-is-cson
'atom-text-editor':
    'ctrl-a': 'editor:move-to-beginning-of-screen-line'

'.platform-darwin atom-text-editor:not(.mini)':
  'shift-cmd-K': 'emmet:remove-tag'
  'ctrl-d': 'unset!'
  'ctrl-h': 'unset!'

'atom-text-editor:not([mini])':
  'ctrl-e': 'editor:move-to-end-of-line'
  'alt-ctrl-e': 'emmet:expand-abbreviation'
```
Pythonのアンダーバー変数

[spotify/luigi](https://github.com/spotify/luigi) のs3 targetのコードを眺めていたら、自分が知らない記述方法があったのでメモ。

~~~
        _, key = self._path_to_bucket_and_key(path)
~~~

_を変数として使うと不要な変数になるらしい。([Python で使わないタプルの値は “_” (アンダーバー) に代入するというプラクティス](http://momijiame.tumblr.com/post/28130976849/python-%E3%81%A7%E4%BD%BF%E3%82%8F%E3%81%AA%E3%81%84%E3%82%BF%E3%83%97%E3%83%AB%E3%81%AE%E5%80%A4%E3%81%AF-%E3%82%A2%E3%83%B3%E3%83%80%E3%83%BC%E3%83%90%E3%83%BC-%E3%81%AB%E4%BB%A3%E5%85%A5%E3%81%99%E3%82%8B%E3%81%A8%E3%81%84%E3%81%86%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9))
Chainerのリファレンスを読んでみた(随時更新)


[Chainerのチュートリアル](http://chainer.readthedocs.org/en/latest/index.html)を読んだ学習メモ

#Core Functionalities


##Function
Variableを操作する関数

Parametersは学習した層の可視化に使えるとのこと

##Variable
要するに特徴量などの配列のラッパー？

```
import numpy as np
import chainer

a = np.random.rand(100, 50) * 100
→array([[ 73.79944963,  20.34729163,  17.8695034 , ...,  95.2588098 ,
         80.70607058,  72.77696887],
       [ 63.61317915,  52.34471719,   6.63279207, ...,  23.84326461,
         59.21347284,  99.79442349],
       [ 14.70947019,  73.28647468,  57.40101832, ...,   0.13991004,
          0.69580569,  35.80244434],
       ..., 
       [ 99.22098719,  50.55196297,  18.42562383, ...,  33.23917582,
         28.41971731,  95.31789821],
       [ 57.03728122,  37.14647991,  45.64473654, ...,  50.12747623,
         61.67733488,  33.88739351],
       [ 46.90448489,  89.0190541 ,  58.7650971 , ...,  71.94147691,
         88.81614863,  90.15044102]])

b = chainer.Variable(a)
→<chainer.variable.Variable object at 0x10b335e50>

#配列が得られる
b.data
→→array([[ 73.79944963,  20.34729163,  17.8695034 , ...,  95.2588098 ,
         80.70607058,  72.77696887],
       [ 63.61317915,  52.34471719,   6.63279207, ...,  23.84326461,
         59.21347284,  99.79442349],
       [ 14.70947019,  73.28647468,  57.40101832, ...,   0.13991004,
          0.69580569,  35.80244434],
       ..., 
       [ 99.22098719,  50.55196297,  18.42562383, ...,  33.23917582,
         28.41971731,  95.31789821],
       [ 57.03728122,  37.14647991,  45.64473654, ...,  50.12747623,
         61.67733488,  33.88739351],
       [ 46.90448489,  89.0190541 ,  58.7650971 , ...,  71.94147691,
         88.81614863,  90.15044102]])

#値の型などが得られる
b.label
→'(100, 50), float64'

#値の全数が得られる
b.__len__()
→5000
```

##FunctionSet

Functionのラッパークラス。GPUにまるごとFunctionを送ったり、パラメータや勾配をOptimizerクラスに渡すときに使う。


随時更新していきます。
Slackのemail integration（連携）を使って、ブラウザからEメールタブをニフラムする

## TL;DR

![image](https://qiita-image-store.s3.amazonaws.com/0/83135/af630d78-334d-2aa3-25fc-f218e334b57d.png)


- 20150813にSlack公式よりリリースされたemailとのintegrationを使って、特定のメールをslackに表示させることが可能。公式おすすめの使い方としては以下の様なものがある。

```
- コンタクトフォームの送信先として使用する
- CRMを使っている場合には新しい顧客の連絡先を特定のチャンネルで共有するようにする
- アラート情報を特定のチャンネルに送信するようにする
```

- 今回はこの応用により、**メールボックスを（ほぼ）見なくてよい環境**を構築する。
- Slackで全てのコミュニケーションを可視化し、ブラウザからEメールタブ（アプリ）をニフラムしよう！

## 手順 - Slack側での設定

- [Slack] 自分+Botだけが存在するprivate group（PG）を作成する

![image](https://qiita-image-store.s3.amazonaws.com/0/83135/049ab7b7-b76a-17b4-1bdb-2e073c3ff768.png)



- [Slack] emailをintegrationする

![image](https://qiita-image-store.s3.amazonaws.com/0/83135/c6ef8267-b9b9-8dd4-cdae-6a662c6693ba.png)
add a service integrationから

![image](https://qiita-image-store.s3.amazonaws.com/0/83135/d15febe9-71d0-0907-a395-33a5e23e9034.png)
Emailを選択

![image](https://qiita-image-store.s3.amazonaws.com/0/83135/1dd4ee0a-e706-0169-87c9-6638351e0d93.png)
Createしましょう

![image](https://qiita-image-store.s3.amazonaws.com/0/83135/bcb9a15e-4fad-a4d0-3fc0-c6d6ad023cdb.png)
先ほど作成したPGを選択

![image](https://qiita-image-store.s3.amazonaws.com/0/83135/9705e663-798d-3ecc-4671-e55541ed7e5e.png)
この固有アドレスを使って、環境を構築する。なおHide this addressにチェックを入れておくとこのアドレスは他のSlack チームメンバーには表示されないようになるので、個人用途の場合はチェックを入れておこう。

## 手順 - メーラー側での設定 ※Gmailを例に紹介

ざっくり言うと、上記で取得したアドレスへメールボックスへ来る全て or 特定のメールを転送する環境を創る。

- [Gmail] Gmailを開き、設定>フィルタと進む
- [Gmail] 新しいフィルタを作成し、Slackへ送りたいメールの条件を設定、対象メールを固有アドレスへ転送する処理を施す。

![image](https://qiita-image-store.s3.amazonaws.com/0/83135/91fc672a-6354-5b96-d64e-90131c599e5a.png)
条件を設定し、

![image](https://qiita-image-store.s3.amazonaws.com/0/83135/c9e73c2d-9987-bf56-ebf6-cb3c2c9d7575.png)
次のアドレスに転送する、へチェックを入れる。転送先アドレスを追加より、先ほどの固有アドレスへ転送するための処理を行う。

![image](https://qiita-image-store.s3.amazonaws.com/0/83135/8f4677e5-9334-e72a-7ac2-9a1ce86cde6a.png)
転送先アドレスを追加

![image](https://qiita-image-store.s3.amazonaws.com/0/83135/1824a96d-46fc-d8df-1cc7-7560d86ef368.png)
固有アドレスを入力し、進むと

![image](https://qiita-image-store.s3.amazonaws.com/0/83135/6fcbe5d8-311e-e0a0-b14f-c66953ee9dfd.png)
確認コードが送られます。このメールが先ほどのslackで設定したPGに届くので、

![image](https://qiita-image-store.s3.amazonaws.com/0/83135/175e5814-4283-d18a-7f5a-3811bd83c45d.png)
リンクを踏んで確認を済ませると完了。

以上、とても簡単に設定が終わりました。
以降メールが届くとSlackにこんな感じで表示されます。ちなみにHTMLメールも表示可能。

![image](https://qiita-image-store.s3.amazonaws.com/0/83135/559939c3-bbe4-3ce4-a9c2-61ddc1be65ca.png)

## コメント

- 今や社内コミュニケーションはほとんどがSlackに集約しており、外部やりとりのためだけにメールボックスを確認するのが面倒だった。
- しかも返信が必要なのは全受信のせいぜい10%程度。
- 上記環境を実装してからは返信が必要なときだけメールボックスを開けばいい運用になったので無駄が大きく削減された。
- 応用として、返信が必要なメールについてはslack上でpinしておくと忘れないので便利。
Informix Client SDKをInstall for Linux

LinuxからInformix Databaseのデータを見る。
その為に Informix CSDK をインストールしていろいろ設定する。

## インストール
まずは、Informix CSDKをインストールする。
下記のサイトからInformix Client SDKをダウンロードしてくる。
ダウンロードするためにはMy IBMの登録が必要です。
My IBMへの登録は無料です。

[IBM Informix Developer Tools](https://www.ibm.com/products/informix/developer-tools)
上記のサイトから [Try the Developer Edition](https://www.ibm.com/account/reg/signup?formid=urx-32091) ボタンを押す。
「Informix Developer Edition 14.10.FC10 Linux x86 64」 を探し出してダウンロードする。

僕は、vagrant で試すことが多いので、
上記のダウンロードurlをコピーして下記のように実行しています。

```bash:CSDKを取得
$ wget (上記Webサイトで取得したurl)
```

```bash:解凍
$ mkdir ifx
# 解凍
$ tar -xvf clientsdk.4.10.FC5DE.LINUX.tar -C ifx
$ cd ifx
# インストールを実行
$ sudo ./installcsdk -i console
```

GUIの環境が使えるのであれば

```bash:インストールコマンド
$ sudo ./installcsdk -i gui
```

が使える。


## 分かっていないこと
必要なライブラリー選択画面で、
どのように選択して選択を解除すればいいのかが分からない。


```bash:
Choose Product Features
-----------------------

ENTER A COMMA_SEPARATED LIST OF NUMBERS REPRESENTING THE FEATURES YOU
LIKE TO SELECT, OR DESELECT. TO VIEW A FEATURE'S DESCRIPTION, ENTER
'?<NUMBER>'.  PRESS <RETURN> WHEN YOU ARE DONE:

    1- [X] IBM Informix Client SDK
    2-  |-[X] IBM Informix Object Interface for C++
    3-     |-[X] IBM Informix Object Interface for C++ Demos
    4-  |-[X] IBM Informix ESQL/C
    5-     |-[X] IBM Informix ESQL/C Demos
    6-     |-[X] 7.2 Application Compatibility Module
    7-  |-[X] IBM Informix LIBDMI for Client Applications
    8-  |-[X] IBM Informix ODBC Driver
    9-     |-[X] IBM Informix ODBC Driver Demos
   10-  |-[X] IBM Informix Common Database Utilities
   11- [X] Global Language Support (GLS)
   12-  |-[X] West European and Americas
   13-  |-[X] East European and Cyrillic
   14-  |-[X] Chinese
   15-  |-[X] Japanese
   16-  |-[X] Korean
   17-  |-[X] Thai
   18- [X] IBM Informix OpenAdmin Tool
   19-  |-[X] IBM Informix Replication Plug-in for OpenAdmin Tool
   20-  |-[X] IBM Informix Schema Manager Plug-in for OpenAdmin Tool
   21-  |-[X] IBM Informix TimeSeries Plug-in for OpenAdmin Tool
   22-  |-[X] IBM Informix Health Advisor Plug-in for OpenAdmin Tool
   23-  |-[X] IBM Informix JSON Plug-in for OpenAdmin Tool

```

## 参考文献

*Informix Client Install Guide*
解凍したdocファイルの中のPDFファイル
インストール時のコマンドやオプションが書かれている。
UbuntuでディスプレイのDPIを調整する

MacBook Pro RetinaとかでUbuntuを動かすと文字が小さくて目がﾂﾗｲ

RetinaみたいにDPIを変更することがUbuntuでもできたのでメモ

以下をいじればそれっぽく変わる。

System Settings -> Display -> Scale for menu add title bars:

ただ、Firefoxはブラウザ部分の表示が小さいままだった。Chromiumではスケールに応じて表示もいい感じに変わったのでブラウザを乗り換えようと思う。

![Screenshot from 2015-08-18 10-07-07.png](https://qiita-image-store.s3.amazonaws.com/0/16612/ee7ecdcc-8164-b882-40e9-03b19c1d3822.png)
キーボードがどこに表示されているかを知る方法

##キーボードの表示に合わせて View の状態を変えたい
キーボードの表示に合わせて View の状態を変えたい事ってよくありますよね。
特に iPhone なんかだと画面も小さく、UITextField が画面下方にあることとかもよくあります。
こんな時、キーボードが表示されたタイミングで画面をスクロールさせて、キーボードの表示領域を避けるなどの調整をしたいわけです。

けっこうググれば直ぐに出てくる情報ですが、自分が忘れがちなのでメモ。

##キーボード表示イベントを登録する
以下のようにしてキーボード表示イベントを獲得するよう宣言します。

```objc
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self
           selector:@selector(keyboardWillChangeSize:)
               name:UIKeyboardWillChangeFrameNotification
             object:nil];
```

いちおう念のため、 ```dealloc``` 時にはイベント登録解除しておきます。

```objc
- (void)dealloc {
    NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
    [center removeObserver:self
                forKeyPath:UIKeyboardWillChangeFrameNotification];
}
```


##イベントを受けるメソッドを実装する
上記の例に挙げたように、```keyboardWillChangeSize:```メソッドを実装します。

```objc
- (void)keyboardWillChangeSize:(NSNotification *)notif {
    //キーボードの表示領域を得る
    NSValue *value = notif.userInfo[UIKeyboardFrameEndUserInfoKey];
    CGRect keyRect = value.CGRectValue;

    //
    //キーボード表示領域に合わせて View を動かすなど...
    //
}
```
filter と remove のふたつの結果を簡単に受け取る方法

なんとなく Clojure で書かれたコードを読みながら簡単だけど意外に知らないかもなーと思った便利そうなものを紹介してみようと思う(分かんない、たぶん皆知ってる)。

# 課題: 1 から 100 までの整数の列から偶数と奇数をそれぞれ集めてください

こういう課題があったときにどう書きますか?という話で、 Clojure に慣れている人ならすぐに回答出来ると思うけど慣れてない人はこんなコードを書く気がします。

```clj
(def numbers (range 1 101)) ;; (1 2 3 4 ... 97 98 99 100)

(let [even-numbers (filter even? numbers)
      odd-numbers (filter odd? numbers)]
  [even-numbers odd-numbers]) ;; [(2 4 6 8 ... 94 96 98 100) (1 3 5 7 ... 93 95 97 99)]
```

これの何が悪いのかと言われると何も悪くないと思う(強いて言えば冗長?)けど、ただ今回はもうちょっと Clojure のらしさを取り入れたコードを紹介したいので書き直しを試みてみます。

まず、 `filter` 関数が 2 回使われていますが、ここで `(filter odd? x)` は `(remove even? x)` であることに気が付きます。
これを書き換えてみます。

```clj
(let [even-numbers (filter even? numbers)
      odd-numbers (remove even? numbers)]
  [even-numbers odd-numbers]) ;; [(2 4 6 8 ... 94 96 98 100) (1 3 5 7 ... 93 95 97 99)]
```

すると偶然にも `filter` と `remove` 関数の引数が全く同一になってしまいました。こうなるとどうにかしてまとめることが出来るような気がしてきますよね。 Clojure なら簡単にできます。

```clj
(let [[even-numbers odd-numbers :as result] ((juxt filter remove) even? numbers)]
  result) ;; [(2 4 6 8 ... 94 96 98 100) (1 3 5 7 ... 93 95 97 99)]
```

出来ました。結果は同じですね。
ここで注目して欲しいのは `juxt` 関数でこいつは何をしてくれる関数かというと doc を引けば分かります。

```
clojure.core/juxt
([f] [f g] [f g h] [f g h & fs])
  Takes a set of functions and returns a fn that is the juxtaposition
  of those fns.  The returned fn takes a variable number of args, and
  returns a vector containing the result of applying each fn to the
  args (left-to-right).
  ((juxt a b c) x) => [(a x) (b x) (c x)]
```

簡単に言うと幾つかの関数を受け取って新しく関数を返し、その関数は受け取った引数をそれぞれの関数に適用した結果をベクターにして返しますよってことです。

今回の例で言えば `((juxt filter remove) even? numbers)` を `[(filter even? numbers) (remove even? numbers)]` の省略形と捉えることができます。

結果がベクターなのでそれぞれの結果を使いたい場合は上でやってるように分配束縛してしまえばいいです。

今回の例は単純な数列でしたが、特定のベクターから条件にあったものとあってないものをそれぞれ取り出したいという需要は実際のプログラムでも度々あると思うので覚えておくといい気がします。

# `juxt` の別の便利な使い方

Clojure においてキーワードは関数と同様に扱えます。 `(:name {:name "ayato_p" :age 24})` のように使いますよね。
`{:name "ayato_p" :age 24}` みたいなマップから `:name` と `:age` を両方取り出したいというときどうしますか?
勿論、分配束縛も使えますが分配束縛を使いたいシーンは `:name` と `:age` の値をそれぞれ独立して使いたいシーンです。そうじゃないとき、純粋に値のベクターを得たいというシーンがあったとしたら、次のように書けます。

```clj
((juxt :name :age) {:name "ayato_p" :age 24 :weight :secret :height :secret}) ;; ["ayato_p" 24]
```

# まとめ

`juxt` 便利なので使いましょう(乱用注意)。
react.jsでfluxを使ってみたメモ

react.jsは直接DOM操作をすることがないので、他のライブラリに比べて見通しがよいコードが書けます。
ただし、ごく簡単なアプリケーションなら十分機能しますが、コンポーネント間をまたがってイベントをハンドリングすると、急激に複雑さを増します。親階層のコンポーネントで処理を完結できる場合はいいですが、深い階層のコンポーネントをまたがるようなイベントを処理する場合は、悪夢に陥ります。

react.jsではその場合[Fluxを使え](http://qiita.com/koba04/items/b32ba449d753fdb2b597)、と言うことらしいです。それで、自分のプロジェクトをFluxを使うように書き換えました。

## Fluxのそれぞれのヒトの役割

まずは、Action。ActionはWeb APIを操作するなどの外界との接点です。ActionはAPIで操作した結果をDispatcherを介してStoreに伝えます。Dispatcherは基本はStoreのhandlerを呼び出しているだけです。Dispacherはそれ以外にもwaitForで他の処理が完了するのを待ってからstoreにイベントを発行する機能もあるようですが、現在のプロジェクトでは使っていません。基本的にはひとつのActionに対して一つのstoreのコールバックにイベントを送信する場合は、あまりdispacherの有り難みはないです。ひとつのアクションが複数のstoreのイベントハンドラーにイベントを発行するケースでは、dispacherを介したほうが良さげです。

Dispacherはstoreが登録したイベントをstoreに伝えます。storeはactionが発行したデータを保持します。ここにデータを集中管理するんですね。そして、componentにさらにイベントを伝搬させます。コンポーネントはイベントを受け取ると、storeにデータを問い合わせて、画面遷移したりstateにデータをセットします。データの流れが一方向に限定されれるので、複数のコンポーネントにまたがっても、データの不整合が発生することがありません。

それで、コンポーネントはコンポーネントないから発生するDOM関連のイベント等に対してActionを操作することと、Flux経由でやってくるデータ変更などのイベントに対して自身のstateをセットすることの2つのことをやるだけです。


## 感想と疑問

Fluxを使えばデータの流れが一方向になるので、とても見通しが良くなり、データの不整合が発生しなくなります。
でも、例えば、WebAPI経由でデータをポストした場合の画面遷移はどこでハンドリングすればいいんでしょう？特に同じイベントを複数のコンポーネントが処理する場合などです。
(初心者向け)Dockerの使い方

Dockerの覚書です。

#Dockerの基本的な使い方

##Dockerとは
ITproだったかどっかのページのリンクを張る。
Docker本家のページも良いですが、@ITの記事のほうが解りやすいと思ったのでそのリンクを載せます。
http://www.atmarkit.co.jp/ait/articles/1405/16/news032.html

Docker本家：
http://docker.com/

##用語
**イメージ**：コンテナが動作するためにベースとなるファイル群。コンテナによってイメージが変更されることはなく不変のもの。Docker Hubから取得可能。CentOSイメージが汎用的なので初心者には使いやすいと思う。
**コンテナ**：イメージから作成されたインスタンスのようなもの。コンテナが動作することで生成されたファイルは、イメージではなくコンテナに紐づいて管理される。ざっくり言うと、コンテナ＝イメージ＋差分ファイル。厳密に言えばコンテナには起動中のプロセスも含まれる。

##前提
CentOS7（どんなディストリビューションでもLXC対応のLinuxなら大丈夫かと）
Docker version 1.7.1, build 786b29d/1.7.1

##導入

```
# yum install docker
# chkconfig docker on
# service docker start
```

##イメージを取得
とりあえずはcentosさえあればいじれる。
取得可能なイメージ一覧は https://hub.docker.com/explore/ で確認可能。

```
# docker pull centos
# docker pull nginx
```

取得で来たら以下のコマンドで確認可能。

```
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
docker.io/nginx     latest              6886fb5a9b8d        3 weeks ago         132.8 MB
docker.io/centos    centos7             7322fbe74aa5        8 weeks ago         172.2 MB
```

##Hello world的なこと

イメージからコンテナを作成する方法。

```
[root@localhost ~]# docker run --name mycentos -d centos /sbin/init
0b853049f6aac8f6c9845fd4ed3009aa7ba8e48af470c587aedb8d43afa88bea
```

コンテナ内に入る方法。

```
[root@a6e5fed21411 /]# docker exec -it mycentos /bin/bash
```

docker execでコンテナに入った場合は、コンテナから出るときに `exit` を使える。
~~`exit` で出てしまうとコンテナが停止してしまうので注意。~~

docker runで入ったコンテナから出るときは `Ctrl+p Ctrl+q` を使う。

```
[root@a6e5fed21411 /]# [root@localhost ~]#
````

##基本操作

コンテナの一覧を確認する方法

```
# docker ps -a
```

イメージの一覧を確認する方法

```
# docker images
```

コンテナ（作業状況）を削除する方法

```
# docker rm
```

イメージを削除する方法

```
# docker rmi -f
```

コンテナからイメージを作成する方法

```
# docker commit container_id centos:file_created
```

##Dockerの課題
ここのページに書かれているようにセキュリティ視点での懸念があるみたいです。本番環境で使用する場合は、要求されるセキュリティ水準に気を付けるのが良さそうと感じました。

http://deeeet.com/writing/2015/02/17/docker-bad-points/

このページではDockerのライバル？であるRocketを紹介していますが、Rocketでも未解決の部分があり、LXCの根本的な対策待ち状態であると理解しています。
入力値のパーセンタイル値を出力する percentile 作った

[numstat](https://github.com/yuya-takeyama/numstat) に続く、アドホックなベンチマークを手助けする [percentile](https://github.com/yuya-takeyama/percentile) というコマンドを紹介します。

# インストール

Go をインストール済みであれば `go get` するだけです。

```
$ go get github.com/yuya-takeyama/percentile
```

もしくは [GitHub Releases](https://github.com/yuya-takeyama/percentile/releases) のページから適切なものをダウンロードしてください。

# 使い方

ここでは 1 未満の数値を 100000 個与えてそのパーセンタイル値を出力しています。

```
$ seq 100000 | awk '{ print rand() }' | percentile
50%:    0.499571
66%:    0.659243
75%:    0.749378
80%:    0.800353
90%:    0.90013
95%:    0.950081
98%:    0.980481
99%:    0.99058
100%:   0.999994
```

結構便利だと思うのでよければ使ってみてください。
入力値の簡単な統計値を出力する numstat 作った

アドホックなログでちょっとした処理のベンチマークを取ったり最適化したりするのに便利な [numstat](https://github.com/yuya-takeyama/numstat) コマンドを作ったので紹介します。

# インストール

Go をインストール済みであれば `go get` するだけです。

```
$ go get github.com/yuya-takeyama/numstat
```

もしくは [GitHub Releases](https://github.com/yuya-takeyama/numstat/releases) のページから適切なものをダウンロードしてください。

# 使い方

ここでは 1 未満の数値を 1000 個与えてその最大値・最小値・合計値・平均値を出力しています。

```
$ seq 1000 | awk '{ print rand() }' | numstat
Count:  1000
Max:    0.999994
Min:    0.00112548
Sum:    508.1254752200004
Avg:    0.5081254752200004
```

## JSON で出力する

`--json` オプションで JSON を出力することもできます。

```
$ seq 1000 | awk '{ print rand() }' | numstat --json
{"avg":0.5081254752200004,"count":1000,"max":0.999994,"min":0.00112548,"sum":508.1254752200004}
```

あとは標準偏差や中央値なんか出しても良さそうですね。
(プルリクお待ちしてます)
phpMyAdmin 2系の使い方

## ダウンロード

* https://www.phpmyadmin.net/files/ から 2系最終版の `2.11.11.3` をダウンロード

## 設定

```bash:
cp -a config.sample.inc.php config.inc.php
```

```diff:config.inc.php
+ $cfg['blowfish_secret'] = 'blowfish_secretauth!';

+ $cfg['Servers'][$i]['host'] = '192.168.11.11';
+ $cfg['Servers'][$i]['auth_type'] = 'config';
+ $cfg['Servers'][$i]['user'] = 'root';
+ $cfg['Servers'][$i]['password'] = 'password1';

+ $cfg['Lang']     = 'ja-sjis';
```

* ユーザ名、パスワードをconfig.inc.phpに記述する場合、
  * `$cfg['Servers'][$i]['auth_type'] = 'config';`を指定。

* 文字コードを指定する場合、`$cfg['Lang']`値を用いる。


## session

> PHP Warning:  session_start() [<a href='function.session-start'>function.session-start</a>]: open(/var/lib/php/session/sess_v7tlv7sat1q7dave3hcogt23r45gulhg, O_RDWR) failed: No such file or directory (2) in  /phpmyadmin/libraries/session.inc.php on line 87

```bash:/var/lib/php/session/を作成する
sudo install -o apache -g apache -m 0755 -d /var/lib/php/session/
```

## japanese-sjis.inc.php のsyntaxエラー対応

* [phpMyAdmin 2.9.0.2で、最初のページで日本語（sjis）を選択する… - 人力検索はてな](http://q.hatena.ne.jp/1160383291)

> C:\wwwroot\phpMyAdmin\lang\japanese-sjis.inc.php をメモ帳で開いて「能'」という文字列を検索し、それをすべて別の文字に置き換える
> php.iniをメモ帳で開いて「magic_quotes_gpc = ???」という項目を探し、それを「magic_quotes_gpc = Off」と設定する (その後、Webサーバを再起動する)


## 2002 - サーバが応答しません

(あるいはローカルの MySQL サーバのソケットが正しく設定されていません) 

```diff:config.inc.php
  $cfg['Servers'][$i]['socket'] = '/tmp/mysql.sock';
- $cfg['Servers'][$i]['connect_type'] = 'tcp';
+ $cfg['Servers'][$i]['connect_type'] = 'socket';
```
1kbのソースが読めなくて辛い

## ソース

* http://www.p01.org/MONOSPACE/
* [http://www.p01.org/releases/BLCK4777/BLCK4777_safe.htm](http://www.p01.org/releases/BLCK4777/BLCK4777_safe.htm)

![1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/a79a9f09-0799-0a5a-6c32-2142b6b98bf0.png)

## jsbeautifier

* [jsbeautifier](http://jsbeautifier.org/)にソースを貼り付けて読みやすくする。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/3bca2f4f-7a6e-ba3c-283c-1c8267146713.png)

### 出力結果

![3.png](https://qiita-image-store.s3.amazonaws.com/0/25728/cd43b4c7-9a5c-a4c8-5d8a-785b509a9660.png)

改行位置やスペース挿入などで少し見れるようになった。

## for文の括弧を書いて範囲を読みやすくした

![4.png](https://qiita-image-store.s3.amazonaws.com/0/25728/42c5da98-15dc-2f21-9ebf-fac9ed1dc7ab.png)

----

## 少し読んでみる

### canvasのidの取得

![5.png](https://qiita-image-store.s3.amazonaws.com/0/25728/f223f5ca-b049-b422-db3b-c97d47a8ed24.png)

b.getContext と b どこから来た？と思ったが
canvasのidは `getElementById()`使わなくても即座に b.getContext とかけるんですね。

* [<canvas>タグで図形を描く－HTML5リファレンス](http://www.htmq.com/html5/006.shtml)

> 現在のところ、getContext()メソッドでは'2d'という引数のみがサポートされています。 <canvas>で平面図形を描く際には'2d'を指定します。 

### 処理を呼び出す部分

![6.png](https://qiita-image-store.s3.amazonaws.com/0/25728/2327ff87-5f27-142f-2819-be969b018427.png)

setTimeoutで `function u()` を 1ms(千分の1秒) ごとに呼んでいる。
もしフレームレートを下げたい場合は `setTimeout(u,10)` のように値を増やせば良い。

#### requestAnimationFrame

* [jQueryで破棄されたrequestAnimationFrameとJSでのアニメーション実装で注意すること](http://0-9.sakura.ne.jp/pub/lt/modest/start.html)

> setIntervalの問題点としてそもそもアニメーション向けのmethodではないのでintervalの呼び出し単位とブラウザの描画更新単位が一致しない
> それを解決するためブラウザの描画更新単位と同じ単位で呼び出されるrequestAnimationFrameが登場した

![7.png](https://qiita-image-store.s3.amazonaws.com/0/25728/851539a9-f540-f8a7-a745-4420ee2c0f3e.png)

> 「連続で呼び出されるイベントの間引き」

* [window.requestAnimationFrame - Web API インターフェイス | MDN](https://developer.mozilla.org/ja/docs/Web/API/Window/requestAnimationFrame)

試しに requestAnimationFrame をコメントアウトして動かしてみたが、高スペックPCなのに重すぎてCPU100%。ピクリとも動かない。
逆に`setTimeout(u,0);`でも問題なく動いた。
ブラウザの描画更新単位で実行の大切さがわかった。

## Canvasに主に描画の命令を出しているとこ

![8.png](https://qiita-image-store.s3.amazonaws.com/0/25728/dc352d9c-bfee-24a1-ab5d-bdd788983cfb.png)

## 音を再生させたり、ロゴ入れたりしているとこ

![9.png](https://qiita-image-store.s3.amazonaws.com/0/25728/8918f29b-fe77-edb7-02fe-f6c65b53dd63.png)

ここから先は数学とcanvasの知識が必要。

* Math.pow : べき乗
* Math.abs : [絶対値](http://www.ajaxtower.jp/js/math_class/index2.html)
* Math.sin : [sin関数](http://www.ajaxtower.jp/js/math_class/index9.html)
* c.scale : [HTML canvas scale() Method](http://www.w3schools.com/tags/canvas_scale.asp)
* c.lineto : [HTML canvas lineTo() Method](http://www.w3schools.com/tags/canvas_lineto.asp)
* c.translate : [HTML canvas translate() Method](http://www.w3schools.com/tags/canvas_translate.asp)
* c.fillText : [HTML canvas fillText() Method](http://www.w3schools.com/tags/canvas_filltext.asp)
[Swift] XCode 6.4 の Build (Swift source file の Compile) や Indexing あたりがすごく遅くなる原因と対応 - Dictionary編

この状況に対して、この方法をとったらなんとかなりましたという備忘録です。
別の方法や見解もあるようなのでそちらも参考にしてください。

# 環境

- XCode 6.4
- Swift 1.2

# 状況

TableViewを実装していて、Realmと絡めたり、SectionやらIndexやらSearchやら色々盛り込んだりしたものを作っていたところ、ふと Build が激遅になりました。

Build 状況を確認したところ Compile Swift source files であるファイルが激遅なことが判明。

![Screen Shot 2015-08-18 at 06.19.41.png](https://qiita-image-store.s3.amazonaws.com/0/18705/59f70cf5-60eb-18be-800d-7dc2218a8c07.png)

![Screen Shot 2015-08-18 at 06.20.25.png](https://qiita-image-store.s3.amazonaws.com/0/18705/b4713776-c72a-d6c1-a719-615694bed0ba.png)

ずっとindicator がクルクル回りっぱなしで、Macのfanが奇声を上げ始め、あらゆるアプリがモサモサし始め、終いにはフリーズし、なんとそのBuildをStopさせることすらできないという状況になりました。

# 原因

コードの中でRealmからデータを取り出してDictionaryに入れて、TableViewControllerにreturnしているfunctionがありました。

そのDictionaryの作り方に問題があったようです。

```swift
func getItemDic() -> Dictionary<String, Array<Dictionary<String, Any>>> {
  // hogehoge
}
```

↑な感じの Dictionlary of Array of Dictionary を返すメソッドですが、問題は以下の部分。

```swift
for eachObject in allObjectsFromDB {
  var tmpDic: Dictionary<String, Any> = [
    "id" : eachObject.id,
    "name" : eachObject.name
　　　・
　　　・
　　　・
  ]
}
```

宣言時に値を入れ込んでいる方法だと遅くなる様です。
（とはいれ必ずしもすべてのケースで遅くなるわけではないようです。。。）

# 対応

値を入れずに空で宣言して、後から値を入れるとコンパイルがいい感じになりました。

```swift
for eachObject in allObjectsFromDB {
  var tmpDic = Dictionary<String, Any>()
  tmpDic["id"] = eachObject.id
  tmpDic["name"] = eachObject.name
}
````

また、最初の宣言で入れる値が少数だったら問題ないなどの記事も見受けられたので、なんともはっきりしたことはわかっていませんが、とりあえず備忘録でした。

# References

- [Swift XCode Index Freezing or Slow](http://stackoverflow.com/questions/26494082/swift-xcode-index-freezing-or-slow)
- [Why is Swift compile time so slow?](http://stackoverflow.com/questions/25537614/why-is-swift-compile-time-so-slow)
- [Xcode6.2でビルドが異常に遅い](http://qiita.com/osamu1203/items/270fc716883d86d8f3b7)
- [激遅Swiftのコンパイル時間が75%ほど短縮したお話](http://cocopon.me/blog/?p=5447)
pattern > Singletonパターンの乱用は避けよう

引用: ゲームプログラマのためのコーディング技術 by 大圖衛玄(Moriharu Ohzu)さん

> Singletonクラスと結合しているクラスは、デメテルの法則にも違反します。クラスの独立性がなくなるため、単体テストも難しくなります。
マルチスレッドのプログラムで使用する場合には、グローバル変数へのアクセスと同様の問題が起こります。副作用をともなうメンバ関数には、mutexクラスなどを利用した排他制御が必要です。
どこからでもアクセスできるクラスというと一見便利そうですが、グローバル変数と同様のデメリットがあることを認識した上で使用してください。

<hr>
[デメテルの法則](http://qiita.com/hirokidaichi/items/d6c473d8011bd9330e63#%E3%83%87%E3%83%A1%E3%83%86%E3%83%AB%E3%81%AE%E6%B3%95%E5%89%87)

>単純化して説明すると、オブジェクトの"メンバーのプロパティ/メソッド"を直接触らないようにするということ。

[デメテルの法則]
(http://zakio.net/blog/2009/07/22-111055.html)

> 簡単に言えば「戻り値として返されたオブジェクトのメソッドを呼び出してはいけない」という法則であり、

<hr>
pattern > observer pattern > ラムダ式でfunctionクラスを合成すると、観測者を複数人にできる > listeners_ = [=] { current(); listener(); };

引用: ゲームプログラマのためのコーディング技術 by 大圖衛玄(Moriharu Ohzu)さん

> 少し高度な実装テクニックになりますが、ラムダ式でfunctionクラスを合成すると、観測者を複数人にすることができます。

```cpp
void attachListener(std::function<void(void)> listener) {
  const auto current = listener_;
  listener_ = [=] { current(); listener();};
}
void click() {
  listener_();
}
```
pattern > observer pattern > GUIで使用するButtonクラス

引用: ゲームプログラマのためのコーディング技術 by 大圖衛玄(Moriharu Ohzu)さん

> Observerパターンは、あるオブジェクトの状態の変化を、ほかのオブジェクトに通知するパターンです。
...
イベント通知可能なGUIで使用するButtonクラスの例を紹介します。

```cpp
class ButtonClickListener {
public:
  virtual ~ButtonClickListener() {}
  virtual void onClick() = 0;
};

class Button {
public:
  void addListener(ButtonClickListener* listener) {
    listeners_.push_back(listener);
  }
  void click() {
    notify();
  }
  ...
private: 
  void notify(){
    for(auto listener: listerns_) {
      listener->onClick();
    }
  }
  std::vector<ButtonClickListener*> listeners_;
  ...
};

```

ButtonClickListenerの使用例

```cpp
class TitleScene : public ButtonClickListener {
public:
  void initialize() {
    startButton_.addListener(this);
  }
  virtual void onClick() override {
    changeScene(GamePlay);
  }
...
```

>C++11のラムダ式とSTLのfunctionクラスを利用すると、もっとシンプルな実装ができます。

```cpp
class Button {
public:
  void attachListener(std::function<void(void)> listener) {
    listener_ = listener;
  }
  void click() {
    listener_();
  }
private: 
  std::function<void(void)> listener_ = []{}; // 空のラムダ式
  ...
};
```
技術英語 > it seems intact / intact copy


ふと思い出したフレーズ。

> It seems intact.

<hr>
http://eow.alc.co.jp/search?q=intact

> 1. 損傷を受けていない、傷がない

<hr>
以下の使用例を見つけた。

http://eow.alc.co.jp/search?q=intact

> intact nature : 手付かずの自然

<hr>
https://github.com/azadkuh/sqlite-amalgamation
> The SQLite Amalgamation mirror (intact copy)

"intact copy”という使用例がgithubのcodeにて23,000件ほど見つかった。
https://github.com/search?q=%22intact+copy%22&type=Code&utf8=%E2%9C%93
どういう意味かは未調査。
[Unity] ScriptableObjectを使ってModelを作る


`ScriptableObject` なるものを最近知りました。
PrefabのようにAssetsとして保存され、自身で定義した処理を実行することができる、まさに「スクリプタブル」なオブジェクトです。

これを使うことで、いわゆるMVCパターンのモデルに相当するものが作れそうです。
利点としてはシーンをまたいでも値が保持される、という点。（起動時に値が設定される模様）
（ちなみにUnityエディタ上ではPlayボタンを押してストップしても値は保持されるみたい。つまりそれを参照しているプロセスが存在している状態なら値は生きていそう）


## ScriptableObjectを継承したクラスを作る

まずはこのオブジェクトの処理部分を定義します。そのために `ScriptableObject` を継承したクラスを作ります。

```c#
using UnityEngine;

public class SampleModel : ScriptableObject {

	public delegate void ChangePointHandler(int point);
	public event ChangePointHandler OnChangePoint;


	public int Point { get; set; }

	void OnEnable() {
		Debug.Log("////////// Initialize model //////////");
		Point = 0;
	}

	public void AddPoint(int point) {
		Point += point;
		if (OnChangePoint != null) {
			OnChangePoint(Point);
		}
	}

	public void ShowPoint() {
		Debug.Log(Point);
	}
}
```

ちなみに、初期化処理は `OnEnable` に書いておくとUnityエディタ上でも意図した状態でスタートできるのでいいと思います。
（Playボタン押下時に毎回初期化処理が呼ばれるが、シーンをロードした場合は呼ばれない）

ただ、このままではオブジェクトが生成されないので、Assetsに保存するための処理が必要になります。
毎回処理するのはめんどくさいのでEditorスクリプトを書いておくといいと思います。
[ScriptableObjectの使い方 | テラシュールブログ](http://tsubakit1.hateblo.jp/entry/20130317/1363528935)に説明と、生成するスクリプトの紹介があるので参考にするといいと思います。

また、データが更新された際にそれをイベントとして通知するため、`delegate` と `event` を定義しておきます。
引数は変化後のポイントです。


## ScriptableObjectを生成・保存する

上記で書いた通り、定義した `ScriptableObject` をAssetsに保存しないとなりません。
保存するには以下のようにします。

```c#
using UnityEngine;
using UnityEditor;

[InitializeOnLoad]
public class CreateScriptAsset {
	static CreateScriptAsset() {
		// SampleModelを生成
		SampleModel model = ScriptableObject.CreateInstance<SampleModel>();

		// ユニークなパスを生成する
		// （多分、重複する名前がある場合、自動的に(2)とかつけてくれるやつ）
		string path = AssetDatabase.GenerateUniqueAssetPath("Assets/Model/" + typeof(SampleModel) + ".asset");
		Debug.Log("Path: " + path);

		// 該当パスにオブジェクトアセットを生成
		AssetDatabase.CreateAsset(model, path);
		
		// 未保存のアセットをアセットデータベースに保存
		AssetDatabase.SaveAssets();
	}
}
```

ちなみに、上記スクリプトを何度も走らせるとその分だけAssetsにファイルが追加されるので、保存したら消すか、Editorスクリプトにして任意のタイミングで実行できるようにしておくといいでしょう。
（上のテラシュールブログで紹介されているような方法）


## ScriptableObjectを使う

最後に、上記で生成したオブジェクトを使用する方法です。

```c#
using UnityEngine;
using System.Collections;

public class ModelGetter : MonoBehaviour {

	public SampleModel model;

	void Start() {
		model.OnChangePoint += OnChange;
	}

	// Update is called once per frame
	void Update () {
		if (Input.GetMouseButtonDown(0)) {
			model.AddPoint(1);
			// model.ShowPoint();

			if (model.Point > 10) {
				model.Point = 5;
				Application.LoadLevel("Sub");
			}
		}
	}

	void OnChange(int point) {
		Debug.Log("Event was receirved: " + point);
	}
}
```

上記スクリプトをGameObjectにアタッチし、さらに `public` で宣言されている `SampleModel` 型の変数にエディタから、上記「 **ScriptableObjectを生成・保存する** 」で生成したオブジェクトを設定しておきます。

![cap.png](https://qiita-image-store.s3.amazonaws.com/0/5616/2476e27a-a027-454c-4c9a-f8f36e2ea864.png "cap.png")


このオブジェクトの変数に保持される値は、ゲーム実行中は保持され続けるので（別シーンをロードしても）、まさにモデルとして利用できるものになります。