OmniAICreator/Qiita-1.07M huggingface dataset:
node × TeamCity インテグレーション 〜TeamCity上でnode, npm を使用できるようにする〜

TeamCity ではデフォルトでnode のコマンドをサポートしていません。
そのためTeamCity のプラグインを導入しなければなりません。

ここではそのプラグインの紹介と簡単な使い方を紹介します。
プラグインの導入方法については解説しませんので、ご注意を。

## プラグイン
https://github.com/jonnyzzz/TeamCity.Node

Node 関連のコマンドを扱うプラグインです。
実行できるようになるコマンドは以下になります。

* [node.js](https://nodejs.org/en/)
* [npm](https://www.npmjs.com/):パッケージマネージャ
* [nvm](https://github.com/creationix/nvm)：Node バージョン変更
* [Phantom.js](http://phantomjs.org/)：仮想ブラウザ
* [Grunt](http://gruntjs.com/)：タスクランナー
* [Gulp](http://gulpjs.com/)：タスクランナー

### プラグインを使うために追加でインストールすべきもの
プラグインを導入しただけでは、TeamCity 上でコマンドを実行した時にエラーとなってしまいます。
そのため、以下のものについては、TeamCity が起動しているサーバに追加インストールする必要があります。

**必須**

* [nvm](https://github.com/creationix/nvm)

**任意**

* [Phantom.js](http://phantomjs.org/)
* [Grunt](http://gruntjs.com/)
* [Gulp](http://gulpjs.com/)

任意とした理由は、もしTeamCity を複数プロジェクトで使用している場合は、プロジェクトごとに異なるバージョンを使用することがあるため、プロジェクト側のビルドプロセスで任意パッケージをインストールしたほうが良いからです。
１プロジェクトであればTeamCity にインストールしておいて問題ありません。

もちろん使用しないのであれば、すべてインストールする必要ありませんが。

## TeamCity ビルド
ここでは、npm, gulp を使用したビルドを紹介します。
この例では、各プロジェクトごとに各パッケージのバージョンが異なる前提で作成しています。

全体のタスクは以下のようになります。

<img width="969" alt="all.png" src="https://qiita-image-store.s3.amazonaws.com/0/110216/860862da-9f25-8eeb-3938-a615d9e73383.png">
<br>
1. Node のバージョンを NVM インストーラで指定します。
<img width="788" alt="first.png" src="https://qiita-image-store.s3.amazonaws.com/0/110216/3ae8ab7f-085c-fe61-3beb-ac3f71522a9d.png">
<br>
2. Node をインストールしたときに付属してくるnpm をバージョン指定します。ここでは最新版にしています。
<img width="832" alt="second.png" src="https://qiita-image-store.s3.amazonaws.com/0/110216/7bbf29b5-9719-f036-c802-5237fc1ca9d0.png">
<br>
3. gulp をバージョン指定してインストールします。ここでは最新版にしています。
<img width="853" alt="third.png" src="https://qiita-image-store.s3.amazonaws.com/0/110216/b8931f6d-ee2b-f209-01d9-86853c5fcb02.png">
<br>
4. リポジトリから取得したプロジェクトを`npm install`します。これでnpm_modules がTeamCity 上にインストールされます。
<img width="809" alt="forth.png" src="https://qiita-image-store.s3.amazonaws.com/0/110216/52a7eb5f-af16-1dea-018d-84f086dc9bba.png">
<br>
5. リポジトリから取得したプロジェクトの各タスクを実行します。ここでは`npm run`しています。
<img width="841" alt="fifth.png" src="https://qiita-image-store.s3.amazonaws.com/0/110216/7821d96a-411e-9bb4-843c-19c381d90875.png">


ポイントは各パッケージをプロジェクトのビルドプロセスでインストールしていることです。
AppleScriptでArgumentParserを書いてみた

https://github.com/nariakiiwatani/argParser

# これは何？
AppleScriptで動くArgumentParser。
`--key value --key2 value2`みたいな引数リストを渡すと連想配列にparseして返してくれる。

# なぜ書いたか
ターミナルから引数付きでスクリプトを呼ぶときに、引数の順番に関係なく動いてほしかった。

# できること
- longName指定  
`--hoge fuga`　=> `{hoge:"fuga"}`
- shortName指定  
`setShortNames({i:"ignore"})` then `-i piyo` => `{ignore:"piyo"}`  
- デフォルト値設定  
`setDefaultValues({host:"127.0.0.1"})`
Pythonで素数列挙と素数判定

たまに自分で使うので、Qiitaに投稿しておきます(´・ω・`)

`primes(x)`は`x`未満の素数をリストに格納するメソッドです。アルゴリズムとしては定番の「エラトステネスのふるい」を利用しています。`filter`等を利用していない点が工夫といえると思います。

次に`is_prime(x)`は整数`x`が素数かどうかを判定するメソッドです。アルゴリズムはやはり定番の「ためし割り」。ただし疑似素数(2でも3でも5でも割り切れない数字)を利用することで、効率化を図っています。

```py3

import math

# 0以上整数x「未満」の素数をリストに格納して返す
def primes(x):
    if x < 2: return []

    primes = [i for i in range(x)]
    primes[1] = 0 # 1は素数ではない

    # エラトステネスのふるい
    for prime in primes:
        if prime > math.sqrt(x): break
        if prime == 0: continue
        for non_prime in range(2 * prime, x, prime): primes[non_prime] = 0
    
    return [prime for prime in primes if prime != 0]


# 整数xが素数かどうかを判定する
def is_prime(x):
    if x < 2: return False # 2未満に素数はない
    if x == 2 or x == 3 or x == 5: return True # 2,3,5は素数
    if x % 2 == 0 or x % 3 == 0 or x % 5 == 0: return False # 2,3,5の倍数は合成数

    # ためし割り: 疑似素数(2でも3でも5でも割り切れない数字)で次々に割っていく
    prime = 7
    step = 4
    while prime <= math.sqrt(x):
        if x % prime == 0: return False

        prime += step
        step = 6 - step
    
    return True


if __name__ == '__main__':
    print(primes(30)) #=> [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

    ls = [x for x in range(30) if is_prime(x)]
    print(ls) #=> [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

```
Atom用Ansible Playbook自動補完プラグイン作ってみた

Playbookを書く度に毎回公式ドキュメントを開くのが苦痛になってきたので、いい感じのヘルパーが欲しくなったのだけれど、AnsibleのPython APIを叩いて動的に情報取ってくるようなものはなかったので自分で作ってみました。
完全に自分用に作っただけだったんですが、割と便利だったので公開してみます。

## 公開URL
https://atom.io/packages/autocomplete-ansible
https://github.com/h-hirokawa/atom-autocomplete-ansible

## 必要環境
* Ansible 2.0 以上がインストール済み
* [autocomplete-plus](https://atom.io/packages/autocomplete-plus)が有効化されたAtomエディタ（デフォルト状態のはず）

## インストール方法
```bash
$ apm install autocomplete-ansible
```

もしくは、Atom GUI上の *Install Packages* からどうぞ。

### HomebrewでAnsibleをインストールしている時の注意点
OS XでHomebrewからインストールしている場合、そのままではPythonからAnsibleを参照できないため、以下のように 環境変数`PYTHONPATH` を設定してからAtomを起動してください。

```bash
$ export PYTHONPATH="/usr/local/Cellar/ansible/2.1.0.0/libexec/lib/python2.7/site-packages:/usr/local/Cellar/ansible/2.1.0.0/libexec/vendor/lib/python2.7/site-packages:$PYTHONPATH"
$ atom
```

`2.1.0.0`の部分はインストールされているAnsibleのバージョンによって変わります。
なお、`/usr/local/bin/ansible` 内にも実際にAnsible起動時に設定されている`PYTHONPATH` の値が書いてあります。

ちなみに、次回アップデートでは `PYTHONPATH` をプラグイン設定から追加できるようにする予定です。

## 機能
* 各種ディレクティブ名、モジュール名の自動補完
    * モジュール名の補完候補表示には公式ドキュメントへのリンク付き
    * `with_` と打つとループ用のLookupプラグイン名も補完される
* モジュールの引数を補完するスニペット
    * モジュール名 + `r`: 必須引数だけを展開
    * モジュール名 + `o`: オプション含めて全ての引数を展開

**以上!!**
オプション設定項目とかは（今の所）何もありません。

## やっていること
Ansibleのモジュール・ドキュメントとかディレクティブ情報を取ってきてJSONで出力する簡単な[Pythonスクリプト](https://github.com/h-hirokawa/atom-autocomplete-ansible/blob/master/lib/parse_ansible.py)をAtomから実行して、文字列マッチとかの処理は autocomplete-plus の[Provider API](https://github.com/atom/autocomplete-plus/wiki/Provider-API)を使ってゴニョゴニョしてます。

## こだわり
* ディレクティブの補完はYAMLのキーを入力している時のみ有効
* モジュール名の補完が有効になるのは、上記に加えてキーが `action`/`local_action` の時
* モジュール名がキーの時も `action`/`local_action` がキーの時もスニペットがいい感じに動く
    * `action`/`local_action` 時は、引数を `args:` ブロック内に展開する
* `command`モジュールなどの名前なし引数も正しく扱える

ちなみにモジュール引数は `=` 繋ぎ文字列ではなく、全て辞書形式で展開されるようにしてあります。

## ToDo
* PythonインタープリタのパスとPYTHONPATHの設定くらいはできるようにする
* テスト書く
* モジュール・ブロック内で個別にモジュール引数を自動補完できるようにする
* そのうち変数の補完も対応したい

バグ報告やご意見・ご要望は[githubのissues](https://github.com/h-hirokawa/atom-autocomplete-ansible/issues)までお願いします！
Python Windows で mod_wsgi を Apache に組み込む方法

# mod_wsgiのダウンロード
まず、[Unofficial Windows Binaries for Python Extension Packages](http://www.lfd.uci.edu/~gohlke/pythonlibs/#mod_wsgi)から、Pythonのアーカイブ形式の一つであるホイールファイル(.whl)をダウンロードする

数種類のファイルが存在するが、ダウンロードしてくるのは

```
mod_wsgi-[mod_wsgiのバージョン]+ap[apacheのバージョン]vc[Visual Studio compiler のバージョン]-cp[Pythonのバージョン]-cp[Pythonのバージョン]m-win[OSのビット数].whl
```

と一致するファイル
例えば、以下の様な環境でインストールしようとする場合、

* Windows 64bit
* Apache 2.4.x
* Python 3.5.x

```
mod_wsgi-4.4.23+ap24vc14-cp35-cp35m-win_amd64.whl
```

をダウンロードしてくる

# mod_wsgiのインストール
mod_wsgiをpipを使ってインストールする

```
pip install mod_wsgi-4.4.23+ap24vc14-cp35-cp35m-win_amd64.wh
```

成功すると、Pythonがインストールされているフォルダ配下に、mod_wsgi.soができる

```
C:/Program Files/Python35/mod_wsgi.so
```

# mod_wsgiをApacheに組み込む
できたmod_wsgi.soをApacheがインストールされているフォルダのmodules配下に置く

```
C:/Programs/Apache24/modules/mod_wsgi.so
```

httpd.confに追記する

```:C：/Programs/Apache24/conf/httpd.conf
// 181行目あたり
LoadModule wsgi_module modules/mod_wsgi.so
```
さらに、以下のコードを任意の場所に追記する

```:httpd.conf
WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
WSGIPythonPath /path/to/mysite.com

<Directory /path/to/mysite.com/mysite>
   <Files wsgi.py>
      Order deny,allow
      Allow from all
   </Files>
</Directory>
```

virtualenv の中にプロジェクトが依存する Python モジュールをインストールしているなら、 virtualenv の site-packages ディレクトリも Python パスに追加する必要がある
そのためには、 Apache の設定にもう一行追加

```:httpd.conf
// X.XはPythonのバージョン
WSGIPythonPath /path/to/your/venv/lib/pythonX.X/site-packages
```

Apacheを再起動する

# プロジェクトを作成する
wsgi_modを使うには、プロジェクト内にwsgi.pyが必要
以下のコマンドを実行することで、wsgi.pyが含まれるプロジェクトを生成できる

```
django-admin startproject [プロジェクト名]
```

ちなみに、wsgi.pyの中身は以下

```py3:wsgi.py
"""
WSGI config for helloworld project.

It exposes the WSGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/1.9/howto/deployment/wsgi/
"""

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "[プロジェクト名].settings")

application = get_wsgi_application()
```

# おまけ
これでApache + mod_wsgiの環境をWindowsに構築できたが、この構成ではコードの変更が即時反映されない
これを解決する方法として、MaxRequestsPerChildをあえて小さい数にして、Apacheが再起動しやすい環境を作るという手がある
詳しくは、[modwsgi - ReloadingSourceCode.wiki](https://code.google.com/archive/p/modwsgi/wikis/ReloadingSourceCode.wiki)を参照されたし

```httpd.conf
MaxRequestsPerChild 3
```
Tensor Flowを初心者なりに導入してみた

#はじめに
[Download and Setup](https://www.tensorflow.org/versions/r0.9/get_started/os_setup.html)を元に導入いたします。

+ OS X EX Capitan 10.11.5（15F34）
+ メモがてら書いているので、間違いがあるかもしれません。

#インストール
## pip
```
$ sudo easy_install pip
$ sudo easy_install --upgrade six
```

## python3へ移行
以下の２つを参照させていただきました。

* 大まかな流れとして
[Mac環境へのPython3系インストール](http://qiita.com/spyc/items/73d1295f8b3dde3b49ca)
* update対応
[Mac(El Captain)にpython3系インストール](http://qiita.com/32mashamasha/items/632433748c57426d8970)


```
# OSのversionアップに伴う環境設定
$ xcode-select --install
xcode-select: note: install requested for command line developer tools


# python3.5.1のインストール
$ brew install pyenv
$ export PYENV_ROOT="$HOME/.pyenv"
$ export PATH="$PYENV_ROOT/bin:$PATH"
$ eval "$(pyenv init -)"
$ pyenv install 3.5.1


# 現状のpythonのバージョンを確認
$ pyenv versions
* system (set by /Users/harakenta/.pyenv/version)
  3.5.1

$ python --version
Python 2.7.10


# python3.5.1に切り替え
$ pyenv global 3.5.1
$ pyenv rehash

# 切り替えができているか確認
$ pyenv versions
  system
* 3.5.1 (set by /Users/harakenta/.pyenv/version)

$ python --version
```

#TensorFlowのインストール
```
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/tensorflow-0.9.0-py3-none-any.whl
$ sudo pip3 install --upgrade $TF_BINARY_URL
```

#Test programで実行確認
[TensorFlow:test the tensor flow installation](https://www.tensorflow.org/versions/r0.9/get_started/os_setup.html#test-the-tensorflow-installation)
を実行してみて、実行できるか確認

```
$ python
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
b.Hello, TensorFlow!
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print(sess.run(a + b))
42
>>>
```

#demoModelの実行

```
#python->tensorflow参照先のチェック
$ python -c 'import os; import inspect; import tensorflow; print(os.path.dirname(inspect.getfile(tensorflow)))'
/Users/*****/.pyenv/versions/3.5.1/lib/python3.5/site-packages/tensorflow

#参照先直下に移動
$ cd /Users/*****/.pyenv/versions/3.5.1/lib/python3.5/site-packages/

#demoModelの実行
$ python -m tensorflow.models.image.mnist.convolutional
Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.
Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.
Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.
Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.
Extracting data/train-images-idx3-ubyte.gz
Extracting data/train-labels-idx1-ubyte.gz
Extracting data/t10k-images-idx3-ubyte.gz
Extracting data/t10k-labels-idx1-ubyte.gz
...学習しよる、しよる...
```

#まとめ
とりあえず導入できたので、次はTutorialsをやりつつ、学習データを決定していきます！

#迷走タイムメモ（個人反省メモ）
1. r0.9試すとpython3.0が必要
2. python3を導入がめんどくさいから0.6.0で試そうとする
3. 元から入っているpython2のディレクトリが悪くInstallできない
4. 仕方ないからpython3.0を導入するか。。。
5. よくよく見るとr0.9もpython2対応してるやんｗ python2でとぅるっとやるか！
6. version上がったからといって、ディレクトリの問題は解決してなかった。。。
7. r0.9 x python3で頑張ってみる
8. え、まさかの `zipimport.ZipImportError: can't decompress data; zlib not available`
9. バージョン上げた弊害だったので、対応をしてpython3再インスコ
Pythonのリストで参照渡しでないコピーを作成する話

なんということもない話なのですが、
これで困ったことがなかったので改めて勉強しなおしたという話です。
今更ではありますが、pythonでは何かを代入すると値ではなく参照が渡されます。

```
a = 1
b = a
print(id(a))
print(id(b))

>1928654608
>1928654608
```

整数型の場合、bに別の値を代入するとbのみ新しいアドレスに参照先が切り替わります。
元のaについては変更を行いません。

```
b = 334
print(a)
print(b)

>1
>334
```

しかし、リストの場合は勝手が違っています。

```
a = [1, 2, 3, 4]
b = a
print(a)
print(b)

>[1, 2, 3, 4]
>[1, 2, 3, 4]

b.pop(1)
print(a)
print(b)

>[1, 3, 4]
>[1, 3, 4]
```

bにリストaを代入し、popでbから要素を削除すると直接変更していないaの内容も変わっています。
参照先もそのままです。

```
print(id(a))
print(id(b))

>2277581359240
>2277581359240
```

「aの元の情報を保持したままbに破壊的な操作を加えたい」みたいな場合には以下のように、
スライスを使ってコピーを生成するのが手軽です。

```
a_ =[1, 2, 3, 4]
c = a_[:]
c.pop(1)
print(a_)
print(c)

>[1, 2, 3, 4]
>[1, 3, 4]
```

（2016/7/27追記）list()とかcopyモジュールを使ってもできるという意見をもらったので試しました。

```
a = [1, 2, 3, 4]
b = list(a)
b.pop(1)
print(a)
print(b)

>[1, 2, 3, 4]
>[1, 3, 4]

import copy
a = [1, 2, 3, 4]
c = copy.copy(a)
c.pop(1)
print(a)
print(c)

>[1, 2, 3, 4]
>[1, 3, 4]
```

やったぜ。
React Native で process.env.NODE_ENV をカスタマイズ

# 背景

React Native (0.30.0) では、
`(node_modules/react-native/)Libraries/JavaScriptAppEngine/InitializeJavaScriptAppEngine.js`
に

```js
function setUpProcess(): void {
  global.process = global.process || {};
  global.process.env = global.process.env || {};
  if (!global.process.env.NODE_ENV) {
    global.process.env.NODE_ENV = __DEV__ ? 'development' : 'production';
  }
}
```

という実装がされているが、`local-cli/cliEntry.js` の中を追っていくと ReactNative側（クライアント側）には `process` は渡されていないため、 `process` はここで必ず初期化が行われていることが分かる。

そのため、

```
$ NODE_ENV=staging react-native start
```

などとしても、 例えば `index.ios.js`で 


```
console.log(process.env.NODE_ENV)  //=> development
```

になってしまう。


# 手法

これを望む挙動にするには、プロジェクトのルートに `.babelrc` を作成し、

```
{
  "presets": ["react-native"],
  "plugins": [
    "babel-remove-process-env-assignment",
    "babel-plugin-transform-inline-environment-variables"
  ]
}
```

として、

```
$ npm i -D babel-remove-process-env-assignment
$ npm i -D babel-plugin-transform-inline-environment-variables
```

で依存関係をインストールしておく。
（ちなみに、 [npmのページ](https://www.npmjs.com/package/babel-remove-process-env-assignment)にも、`Babel plugin to remove assignments to process.env, to work around a long-standing react-native bug`と書かれている。）


すると、`NODE_ENV=staging react-native start` によって、きちんと `staging` が得られることが確認できる。

※ ここで、 `react-native`コマンドは、 `node node_modules/local-cli/cli.js`へのエイリアスなので、

```
$ NODE_ENV=staging node node_modules/local-cli/cli.js start
```

と記述してもよい。

ただし、ここから `NODE_ENV` を変えてもう一度 start したい場合は、cacheをクリアする必要があるので、


```
$ NODE_ENV=development node node_modules/local-cli/cli.js start --reset-cache
```

と、 `--reset-cache` オプションを付けなくてはならない。


この辺の処理を例えば

```script/development.sh
#!/bin/sh
NODE_ENV=development node node_modules/react-native/local-cli/cli.js start "$@"
```

```script/staging.sh
#!/bin/sh
NODE_ENV=staging node node_modules/react-native/local-cli/cli.js start "$@"
```

```package.json
  "scripts": {
    "start": "./script/development.sh",
    "start:dev": "./script/development.sh",
    "start:dev:reset":  "./script/development.sh --reset-cache",
    "stat:staging:reset":  "./script/staging.sh --reset-cache",
  }
```

などとまとめておけば、

```
$ npm run start:dev
```

とすることで、いつでも正しい `NODE_ENV` の値を得ることができる。
React Native  エラー　Can’t find ‘node’ binary to build React Native bundle

# React Nativeで実機ビルドしたエラーが出だした
そしたら

```
Can't find 'node' binary to build React Native bundle
```

というエラーが出た。

[こちらの記事](http://qiita.com/kztka/items/eca26d441461985d8397)のおかげでnodeのパス直せばいいことがわかった。自分の場合はパスが違ったため、どのようにしたかを書いていきます。

# パスの調べ方
普段使わないPCでいろいろやっては失敗して今に至るためnode本体がどこにあるかわからなかった。そこで、

```
export -p
```

とbashで実行させていろんなパスを出させてみた。
すると自分の場合はこんな環境変数が出てきた。

```
declare -x PATH="/Users/YutamaKotaro/.nodebrew/current/bin:
/Users/YutamaKotaro/.nodebrew/current/bin:
/Users/YutamaKotaro/.nodebrew/current/bin:
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin"
```

どうやらnodebrewを使っているらしい。

後は先ほどの記事に従って
Project ファイル　＞　TARGETS > APP Name > Build Phases > Bundel React Native code and image
を開いて

```
export NODE_BINARY=node
../node_modules/react-native/packager/react-native-xcode.sh
```

となっているところを

```
export NODE_BINARY=$HOME/.nodebrew/current/bin/node
../node_modules/react-native/packager/react-native-xcode.sh
```

と直した！

これでうまくいきました！！
ご不明点、誤りなどありましたらご指摘頂けますと幸いです。
mixinが見つからないとおもったら

cssでflexを使っていたら
「flexは@includeを使ってください」

と言われたので、何のことかとおもったら
Sassというcss便利ツールのことっぽい
簡単に言うと、
@mixin
でよく使うcssのプロパティを定義
@includeで呼び出す。

。。。
なのですが

「どこ探してもないやん！」


聞いたら
「gemにあるよ」
とのこと

。。。gemにある。。？
ありました。

http://bourbon.io/

ちなみに似たようなもので
compass(http://compass-style.org/)　もある...

cssとかscssについては「えいやっ」で割と書いていたので、ちょっと調べてみる。
（今日もflexboxで苦闘していた。。。つらげ）

##Sassとは
結論：cssをいけてるように書ける
- どういけてるのか？
１）セレクタの入れ子ができる
２）変数が使える（$base-color:#FFFFF みたいな）
３）セレクタの継承ができる（@extend使う）
４）Mixinが使える

１）２）はまぁなるほど。みたいな感じです。
３）４）が若干怪しい。

３）の継承は特定のセレクタを「そのまま」使える。なので
```
p1 {color: red;}
p2 { @extend .p1;
     border: solid;
   }
```
=>
```
p1 {color: red;}
p2 { color: red;
     border: solid;
   }
```
こうなりますね。

では4)のmixinはどないやと。これはいくつかパターンがあります。

```
引数なし
@mixin round-btn{
    border: 1px solid #b8b8b8;
    border-radius: 5px;
    background-color: #c9c9c9;
}
引数あり
@mixin auto-color($color){
    color:$color;
}
デフォルト引数つき
@mixin auto-color($color: #FFFFFF){
    color:$color;
}
.hoge {
 @include auto-color(#EEEEEE)
}
＝＞展開後
@mixin auto-color($color: #FFFFFF){
    color:$color;
}
.hoge {
    color:#EEEEEE;
}

```
引数付きが便利ですねぇ。


では本題に。
というかそもそもcompassとburbonってどう違うんや。
＝＞多分大体一緒。使えるmixinが違ったりするっぽい。

なんで好みで〜という記事が多かった。

うちのプロジェクトはbourbonさんを使ってる。
@import　で読み込んで、固有のmixinを使ってるんですね。
今回使ってたのが
```
@include display(flex);
@include flex-wrap(wrap);
```
こういう感じやったので、
http://bourbon.io/docs/#flexbox

ここら辺の内容を使ってる。
https://github.com/thoughtbot/bourbon/blob/v4-stable/app/assets/stylesheets/css3/_flex-box.scss

主にベンダープレフィックスとかを記載してるんですね。display:flexとかはもちろんのこと

勉強になりました。
Spring bootでSSL（HTTPS）を有効にする～マイ・ベストプラクティス～

## はじめに
Spring-bootでSSL（HTTPS）を有効にするために色々と試行錯誤してきましたが、ひとつ区切りを作ったのでまとめておきます。結論を言うと、Spring-boot単体でSSL（HTTPS）を有効にするよりも、Spring-bootは通常起動してTomcatやNginxでSSL（HTTPS）を有効にするほうがセキュアです。

## ケース１：Spring-boot単体でSSL（HTTPS）を有効にする
こちらの記事が参考になります。
[Spring bootでSSL（HTTPS）を有効にする](http://qiita.com/keigohtr/items/001b84838fefcc170ea2)
[Spring bootでSSL（HTTPS）を有効にする～Let's Encrypt編～](http://qiita.com/keigohtr/items/faa1bd0c647df54d6594)

自己証明でやるなら上の記事、Let's Encrypt使うなら両方を参照してください。Let's Encryptは無料なのでわざわざセキュリティ的に穴がある自己証明を使うメリットはあまりない気がします。そしてLet's EncryptではNginxを使うことを公式に推奨しているので、次に説明するケース２の方が良いと個人的には思います。

## ケース２：Spring-bootとNginxを組み合わせてSSL（HTTPS）を有効にする
こちらの記事が参考になります。
[Spring bootでSSL（HTTPS）を有効にするならnginxを使え](http://qiita.com/keigohtr/items/5b2b423fe0e9da027db6)
[Spring-bootでSSL（HTTPS）有効にするならnginxを使え～完結編～](http://blog.apitore.com/2016/07/25/spring-boot-ssl-nginx/)

上の記事でNginxの導入ができます。下の記事は発展です。下の記事では、「httpからhttpsへのリダイレクト」「『www.example.com』と『example.com』の共存」「稼働中のSpring-bootで『X-Forwarded-For』が『127.0.0.1』になるのを防ぐ」「DDoS攻撃対策、rate limitingの導入」を説明しています。

## おわりに
これでSpring-bootにおけるSSL（HTTPS）の有効方法やセキュアなサーバーの作り方についての一通りの設定ができたと思います。４ヶ月ほどサーバーを稼働していますが、今のところ問題はひとつも起きていません。続報があればまた記事を上げます。
recon_trace の使い方

# recon_trace の使い方

## このドキュメントは
http://ferd.github.io/recon/recon_trace.html の基礎的な部分を自分がわかるようにまとめたもの．

## recon_trace とは
単一 Erlang Node 内でトレース (関数呼び出し) を行うモジュール．
安全?らしい．安全ってなによ．

## 基本的な使い方

    recon_trace:calls({queue, new, '_'}, 1).

queue:new(...) の呼び出しを 1 回だけトレースして出力する．

    recon_trace:calls({queue, in, 2}, {10, 100}).

queue:in/2 の呼び出しを 10回 / 100ms までだけトレースして出力する．
一度でもこのレートを飛び出すと `Recon tracer rate limit tripped.` が返されトレースは終了してしまう．

    recon_trace:calls({queue, in, Fun}, 1).

queue:in(...) の呼び出しのうち arity が Fun と同じものを 1 回だけトレースして Fun を実行する．正確には， Fun の arity は 1 で，トレース対象の関数の引数のリストを受け取る．
つまり，queue:in/2 のみトレースしたいならこう．

    recon_trace:calls({queue, in, fun([_,_]) -> ok end}, 1).

Fun にガード式をつけて特定の場合のみトレースすることも可能．

上記例では，呼び出された関数の MFA しか出力されず，その関数がどんな値を返したかが取得できない．
欲しいよね．できます．

    recon_trace:calls({queue, in, fun(_) -> return_trace() end}, 1).

Fun の部分で return_trace() を呼ぶと出力される．呼べばいいだけなので， `fun(_) -> return_trace(), ok end` としても出力される．

途中でトレースをやめたい場合．

    recon_trace:clear().
uwsgi-geventモードでuwsgiサーバーを動かす

http://uwsgi-docs.readthedocs.io/en/latest/Gevent.html?highlight=gevent
を見つつ、uwsgiをgeventモードで動かしてみます。

## 環境
nginx: 1.10.1
python: 2.7.10
uwsgi: 2.0.13.1
ローカル構築なのでnginx-uwsgiはUnixドメインソケットで通信します。

## uwsgi設定
geventパラメータを追加

```uwsgi.ini
[uwsgi]
...
gevent = 40
```
ここの値はgeventのworker数ですが、最適な値はわかりません。
(誰か教えてほしい)

## MySQLモジュール
MySQLコネクタはMySQLPythonだとgeventが対応していないらしいです。
PyMySQLを使います。
また、Djangoを使う場合はPyMySQLをそのまま使うとバックエンドの実装とかみ合わないので起動時に、

```
import pymysql
pymysql.install_as_MySQLdb()
```
を実行する必要があります。


## モンキーパッチ
uwsgiの起動モジュールの先頭で、

```
import gevent.monkey
gevent.monkey.patch_all()
```
でモンキーパッチを当てる。
(他のインポートの前に実行されるように)
uwsgi.ini内で、gevent-monkey-patch = true でもいけるらしいですが、
手元の環境ではMySQL周りでエラーが出てしまいダメでした。
おそらく内部のインポートの順序の関係かと。

## 実行
通常通りuwsgi実行して、

```
*** running gevent loop engine [addr:0x10e228440] ***
```
のようなメッセージが表示されればgeventモードで起動成功です。
あとはHTTPリクエストしてみてエラーが出なければOK。

## 起動してみて
geventなしとイマイチ違いが実感しにくい(ローカルだからか)です。
パラメータの値も最適値がまだまだわからないので色々試して検証します。
Kdan Mobile Software Ltd.

A vicar in creating content for the digital domain, we bring new techniques to the realm of digitalization and technology. Kdan Mobile nurtures new tricks that can ease the processes of the users for moving with the fast life and making the best time of what they have. Working on the latest platforms, we have made some of the [finest innovations like write-on video](http://www.kdanmobile.com/en/writeon-video/), PDF Markup, Pocket Scanner, Animation Desk and NoteLedge are a few from that basket. Our team at Kdan Mobile makes each product a perfect app for people to innovate and enhance their creativity by sticking glued to their mobile phones. Our success rate and the growing figures literally have impressed the users which have eventually attracted a lot of users from the new crowd. Pioneering in a number of tools, we have created miracles in blending technology with creativity. Breaking the thin line that is drawn from years together for the desktop applications to be controlled and accessed with similar effectiveness through mobiles, Kdan Mobile has achieved tremendous success.
![fBg44PdB_bigger.jpg](https://qiita-image-store.s3.amazonaws.com/0/134877/e815065c-4836-07ab-b28b-eed75c9d0e5b.jpeg)


![writeon_bg-2c0a8c4de4293efa00ff78708f815a08.png](https://qiita-image-store.s3.amazonaws.com/0/134877/15fe7ecc-1cb1-926a-c729-aacc83a666d3.png)
gitで差分ファイルを抽出する

HEADから一つ前のコミットの差分を抽出する場合はこんな感じ。(ファイル名「archive.zip」で保存)

```bash:
git archive HEAD `git diff --name-only HEAD HEAD~1` -o archive.zip
```

余談ですが、zip形式やtar形式の中身チェックは下記コマンドでできるみたい。

```bash:
zipinfo archive.zip
```
```bash:
tar tvf archive.tar
```

■参考サイト
http://rfs.jp/server/git/gite-lab/git-archive.html
ascii_traitsつくった

テンプレート関数内で文字や文字列を打ちたいときとかにつかう。どの文字コードも大体0～127はasciiに準じているのでこの範囲では汎用性は狭くないはず。
文字列の扱いももう少しうまいやり方がありそうだけど思いつかなかった。

```cpp
template<class Char, class Traits>
std::basic_ostream<Char, Traits>& operator<<(
    std::basic_ostream<Char, Traits>& os, my_manip)
{
  // return os << "manip";
  return os
    << ascii_traits<Char>::m << ascii_traits<Char>::a
    << ascii_traits<Char>::n << ascii_traits<Char>::i
    << ascii_traits<Char>::p;
}
```

頑張って転写した美しさのかけらもない実装。スペルミスがあったらごめんなさい。
記号について自分でつけたい名前があればこのクラスを継承すると楽に作れる。

```cpp
template<class Char>
struct ascii_traits
{
public:
  using char_type = Char;
  using int_type = typename std::char_traits<char_type>::int_type;
  static constexpr char_type
    // ascii control characters
    // small
    nul = 0, soh = 1, stx = 2, etx = 3,
    eot = 4, enq = 5, ack = 6, bel = 7,
    bs = 8, ht = 9, lf = 10, vt = 11,
    ff = 12, ct = 13, so = 14, si = 15,
    dle = 16, dc1 = 17, dc2 = 18, dc3 = 19,
    dc4 = 20, nak = 21, syn = 22, etb = 23,
    can = 24, em = 25, sub = 26, esc = 27,
    fs = 28, gs = 29, rs = 30, us = 31,

    // captal
    NUL = 0, SOH = 1, STX = 2, ETX = 3,
    EOT = 4, ENQ = 5, ACK = 6, BEL = 7,
    BS = 8, HT = 9, LF = 10, VT = 11,
    FF = 12, CT = 13, SO = 14, SI = 15,
    DLE = 16, DC1 = 17, DC2 = 18, DC3 = 19,
    DC4 = 20, NAK = 21, SYN = 22, ETB = 23,
    CAN = 24, EM = 25, SUB = 26, ESC = 27,
    FS = 28, GS = 29, RS = 30, US = 31,

    // ascii printable characters
    space = 32, exclamation_mark = 33, double_quotes = 34, number = 35,
    dollar = 36, procenttecken = 37, ampersand = 38, single_quote = 39,
    open_bracket = 40, open_parenthesis = open_bracket,
    close_bracket = 41, close_parenthesis = close_bracket,
    asterick = 42, plus = 43, comma = 44, hyphen = 45,
    period = 46, dot = period, full_stop = period,
    slash = 47, divide = slash,
    zero = 48, one = 49, two = 50, three = 51,
    four = 52, five = 53, six = 54, seven = 55,
    eight = 56, nine = 57, colon = 58, semicolon = 59,
    less_than = 60, open_angled_bracket = less_than, equals = 61,
    greater_than = 62, close_angled_bracket = greater_than,
    question_mark = 63, at_symbol = 64,
    A = 65, B = 66, C = 67, D = 68,
    E = 69, F = 70, G = 71, H = 72,
    I = 73, J = 74, K = 75, L = 76,
    M = 77, N = 78, O = 79, P = 80,
    Q = 81, R = 82, S = 83, T = 84,
    U = 85, V = 86, W = 87, X = 88, Y = 89, Z = 90,
    opening_bracket = 91, backslash = 92, closing_bracket = 93,
    caret = 94, circumflex = caret, underscore = 95, grave_accent = 96,
    a = 97, b = 98, c = 99, d = 100,
    e = 101, f = 102, g = 103, h = 104,
    i = 105, j = 106, k = 107, l = 108,
    m = 109, n = 110, o = 111, p = 112,
    q = 113, r = 114, s = 115, t = 116,
    u = 117, v = 118, w = 119, x = 120, y = 121, z = 122,
    opening_brace = 123, virtical_bar = 124, closing_brace = 125,
    equivalency_sign = 126, tilde = equivalency_sign,
    _delete = 127;
};
```
新しくリリースされたemacs-25.1とemacs-24.5を共存させる

# はじめに
emacs25.1のRC版が[昨日(7/24)](http://lists.gnu.org/archive/html/info-gnu-emacs/2016-07/msg00000.html)リリースされたようです。
まだRC版なので、どの程度動作するか分かりませんが、とりあえず使ってみます。
今回は、何かあったときに環境をすぐに戻せるよう、evmを使ってemacsのバージョンを管理します。

- 環境 : MacOSX ElCaptain 10.11.5

# バージョン25の変更点
emacs-25の[NEWS](https://github.com/emacs-mirror/emacs/blob/emacs-25/etc/NEWS)を見れば変更点がわかります。



# 1.evmのインストール
[evm](https://github.com/rejeep/evm)はemacsをバージョン管理するパッケージです。
まだevmにversion25.1のバージョンが登録されていないため、ソースコードから持ってきて、ソースをいじります。

※ 2016/8/18追記
ビルドにはXcode Command Line Toolが必要です。
`xcode-select --install`を実行すると、Command Line Toolのインストールダイアログが出るので、インストールしましょう。

また、evmを利用するには、[rbenv](https://github.com/rbenv/rbenv)のインストールも必要なので、事前にインストールしておきます。

今回、evm経由でインストールしたプログラムは、/usr/local/evm内に置くものとしています。

```
$ git clone https://github.com/rejeep/evm.git ~/.evm
$ export PATH="$HOME/.evm/bin:$PATH"
$ sudo mkdir /usr/local/evm
$ sudo chown $USER:admin /usr/local/evm


$ evm list # 動作確認
rbenv: version `2.2.0' is not installed (set by /Users/amachi/.evm/.ruby-version)
$ rbenv install 2.2.0
$ rbenv global 2.2.0
$ evm list
emacs-23.4-bin
...<中略>...
emacs-24.5
emacs-25-pre-travis
emacs-git-snapshot-travis
emacs-git-snapshot
```

# 2. evmに25.1用のパッケージを追加
.evm/recipesに25.1用のパッケージを追加します。

```.evm/recipes/emacs-25.1.rb
recipe 'emacs-25.1' do
  tar_xz 'http://alpha.gnu.org/gnu/emacs/pretest/emacs-25.1-rc1.tar.xz'

  osx do
    option '--with-ns'
    option '--without-x'
    option '--without-dbus'
  end

  linux do
    option '--prefix', installation_path
    option '--without-gif'
  end

  install do
    configure
    make 'install'

    osx do
      copy File.join(build_path, 'nextstep', 'Emacs.app'), installation_path
    end
  end
end

```

パッケージが追加されたか確認。

```
$ evm list
...<中略>...
emacs-25-pre-travis
emacs-25-pre
emacs-25.1 ← 追加
```


# 3. emacs-25.1をインストールし、起動
問題なくすすめば、以下の手順で起動できます。

```
$ evm install emacs-25.1
...<中略>...
$ evm list
emacs-24.5-bin
emacs-24.5-travis
emacs-24.5 [I]  # installしたものには[I]が表示される
emacs-25-pre-travis
emacs-25-pre
emacs-25.1 [I]

$ evm use emacs-25.1 # 25.1を利用する
$ evm list
...<中略>...
* emacs-25.1 [I] # 使用中のものには * が表示される

$ which Emacs
/Users/amachi/.evm/bin/Emacs
$ Emacs # emacsを起動
```

# 試してみる
起動したemacsで、ためしにバージョン25で新しく追加された`comment-line`を試します。
起動されたemacsで適当なファイルを開き、`C-x C-;`を打つと、
そのポインタがあった行がすべてコメントアウトされます。
地味に便利そうです。

バージョン25以前だと、`C-x C-; is undefined`になります。
すでに他のキーバインドにしている人は、`M-x comment-line`で試してみてください。

# 試してみた雑感
まだほとんど動かしてないのですが、とりあえずv24.5で動作していたものは、すべて動作しているようです。
とりあえず、明日以降はv25.1を使って開発をしていきます。
Himotokiで定義したModelをObjective-Cから使う

SwiftとObjective-C混在のプロジェクトでも何とかして[Himotoki](https://github.com/ikesyo/Himotoki)を使いたい！
Swiftで[Mantle](https://github.com/Mantle/Mantle)を使うのはもう嫌だ！

そんな思いからこの記事は生まれました。

結論から言えば、NSObjectを継承したclassをDecodable Protocolに準拠させ、parse用のwrapperメソッドを実装することでObjective-Cからも使用することができます。

以下のコードはSwift 2.2、Himotoki 2.1.1の環境を想定しています。

Model(Swift）

```swift
@objc final class User: NSObject {
    let name: String
    
    init(name: String) {
        self.name = name
        super.init()
    }
    
    // Objective-Cから使うために作ったメソッド
    static func parse(JSON: AnyObject) -> User? {
        return try? decodeValue(JSON)
    }
}

extension User: Decodable {
    static func decode(e: Extractor) throws -> Self {
        return try self.init(name: e <| "name")
    }
}
```

呼び出し側（Objective-C）

```objc
user = [User parse:response];
```

このようにして、少しずつ呼び出し側もSwiftに置き換えていきましょう。
Laravel5で、ダウンロードさせた直後にファイルを削除する


子ネタも良いとこなんですがドキュメントになかったのでメモ。

Laravel5でユーザにファイルをダウンロードさせたい場合は、コントローラで以下のように記述します。

```
return response()->download($pathToFile, $name);
```

参考:https://laravel.com/docs/5.2/responses#file-downloads

上記でreturnされるのはSymfony\Component\HttpFoundation\BinaryFileResponseオブジェクトですが、こいつは[deleteFileAfterSend()](http://api.symfony.com/3.1/Symfony/Component/HttpFoundation/BinaryFileResponse.html#method_deleteFileAfterSend)という、リクエストが送信された後にファイルを削除してくれる便利なメソッドを持っています。

というわけで、ダウンロードさせた直後にファイルを削除するには、コントローラで

```
return response()->download($pathToFile, $name)->deleteFileAfterSend(true);
```

と返してやるだけでOKです。
Windowsでmysql5.7をzipインストールする

自分メモです。僕は、前職と家ではlinux mintで開発していたのですが、会社ではwindows(32bit)とmacが配られました。

windows機はメモリが足らず、仮想環境が入らない。
appleとは反りが合わない。

仕方なくwindows使っていたのですが、インストーラからインストールしたmysqlがmy.iniを読み込まず、苦戦したのでzipでインストールし直しました。という話です。
（クエリーログが見たかっただけなのですが。。。）

また、会社のコンフルに書いていたメモ的なのを、qiitaに書いていくことにしたので、最初の投稿です。（コンフルってマークダウン使えないので、書く気が無くなるんですよね。。。）

# 参考資料
[WindowsにzipファイルのMySQLをインストールする方法](http://kenpg.bitbucket.org/blog/201509/29.html)

ほぼこれじゃねぇか！！というツッコミもあるかと思います。はい。

# 手順

* [ここ](http://dev.mysql.com/downloads/mysql/)から落とす（32bitとか気をつけて。）
* 解凍してフォルダ名をmysqlという名前にして、C直下に置く
 * お好みでパスを通しても良いが、この手順は全部フルパスでやる
* c:/mysql直下にdataとlogsとtempのディレクトリを作成
* c:/mysql直下にあるmy-default.iniをコピーして、my.iniを作成

# iniファイルに追記

```ini
[mysqld]

# dirs
basedir="C:/mysql"
datadir="C:/mysql/data"
tmpdir = "C:/mysql/temp"

# logging
log_output=TABLE,FILE
log_error_verbosity=3
log_error="C:/mysql/logs/mysqld_error.log"
general_log=1
general_log_file="C:/mysql/logs/general_query_all.log"
log-slow-admin-statements=1
log-queries-not-using-indexes=1
slow_query_log=1
long_query_time=1
slow_query_log_file="C:/mysql/logs/slow_query.log"
log_syslog=0
log_timestamps=SYSTEM

[mysql]
default_character_set=utf8
default-time-zone="+9:00"
```

本当はdataフォルダは別のディレクトリで作成して、mysqlのバージョンが変わっても、同じDBを見れる的なのをやると良いらしいですが、面倒なので入れたところに作りました。あと、このiniの設定で、ログをtableとファイルに書き込む設定を入れているのですが、ログファイルには出るけど、なぜかtableには、書き込まれないのですよね。

# 初期化＆起動＆ログイン

```bat
rem path設定はこの手順では必要ないですが、やるとしたらこんな感じです。
rem SET PATH=%PATH%;C:\mysql\bin 

rem 初期化（失敗してやり直すときは、dataフォルダを消したほうがよい。）
C:\mysql\bin\mysqld --initialize-insecure --user=mysql

rem 起動
C:\mysql\bin\mysqld --defaults-file="C:\mysql\my.ini" --console

rem 中に入る。（パスワードは無し。後で、設定したほうが良いかと）
c:\mysql\bin\mysql -u root -p

```


```bat
rem シャットダウン
Ctrl + C
```


# sql_mode

[ルーク！MySQLではkamipo TRADITIONALを使え！](http://www.songmu.jp/riji/entry/2015-07-08-kamipo-traditional.html)

という話なので、設定しておいたほうが良いかと。
本当はSET SESSIONで設定するのが良いらしいですが。。。

# windows立ち上げ時に起動させる

* batファイルを作っておいて、ダブルクリックとかどうですか？
* batファイルをスタートアップに置いておく（セキュリティとか言われる？）
* windowsのサービスに登録（面倒ですよね。。。）

# まとめ

システム系は、下手にオートマチックにすると痛い目みること多いなぁという事例だったと思います。あと、設定を色々と端折っているので、しっかりと動かしたい方はDBエンジニアと相談してくださいm(_ _)m

あ、あと、mysqlのGUIツールは、下記が使いやすいです。勧めてみました。[HeidiSQL(mysqlなどのGUIツール)](http://www.heidisql.com/)
Vagrantのインストール

#OS別インストール方法

- [Windows編](http://qiita.com/shimitei/items/d5910d196b90d2be576d)  
  Windows版関連のトラブルシューティングもこちらに記載しています。
- [macOS編](http://qiita.com/shimitei/items/11c072383195e5830b6e)  
  macOS版関連のトラブルシューティングもこちらに記載しています。


#トラブルシューティング

##Vagrant 1.8.5

`vagrant up` すると「Warning: Authentication failure. Retrying...」が繰り返し表示されてしまいます。 
これはVagrant 1.8.5の不具合です。（[Vagrant 1.8.5 Not Work the SSH Auth. But Vagrant 1.8.4 is Work.](https://github.com/mitchellh/vagrant/issues/7631)）
解決方法は以下の通りです。何れかを行ってください。

* Vagrant 1.8.6にアップデートします。 
* [Vagrant v1.8.5 以降で、vagrant ユーザのprivate keyのパーミッションがおかしいために、rsyncでファイルの同期ができないバグ](http://qiita.com/ndxbn/items/7707f996d93610aac76c)  
  Vagrantのファイルに`chmod 0600 ~/.ssh/authorized_keys`のパッチをあてることで不具合を解消します。
* authorized_keysのパーミッションを修正します  
  `vagrant up` で「Warning: Authentication failure. Retrying...」が繰り返し表示されたら、Ctrl + Cで抜けます。  
  次に `vagrant ssh` でログインします。  
  `chmod 600 ~/.ssh/authorized_keys` を実行します。  
  `exit` 後に `vagrant reload` するとその仮想マシンでは問題が発生しなくなります。 


##Vagrant 1.8.4

Vagrant 1.8.4はVirtualBox 5.1に対応していません。 
`vagrant up` に失敗してしまいます。 
解決方法は以下の通りです。何れかひとつを行ってください。

* VirtualBox 5.0.xにダウングレードします。  
  VirtualBox 5.1.xをアンインストールし、VirtualBox 5.0.xをインストールします。
* Vagrant 1.8.6にアップデートします。  
* [Vagrant1.8.4でVirtualBox5.1を利用する](http://qiita.com/unchemist/items/3a971b5539adffdd338e)  
  Vagrantのファイルを書き換えることでVirtualBox5.1に対応することができます。
[OSX]Apache Sparkをインストール後にspark-shellでエラーが出た場合の対処

MacにApache Sparkを以下記事を参考にインストール。
http://qiita.com/HirofumiYashima/items/e6d2a40abc71110a7b72

インストール後に`spark-shell`を実行すると以下のようなエラーが発生する。

```
$ spark-shell
/usr/local/Cellar/apache-spark/1.6.1/bin/load-spark-env.sh: line 2: /usr/local/Cellar/apache-spark/1.6.1/libexec/bin/load-spark-env.sh: Permission denied
/usr/local/Cellar/apache-spark/1.6.1/bin/load-spark-env.sh: line 2: exec: /usr/local/Cellar/apache-spark/1.6.1/libexec/bin/load-spark-env.sh: cannot execute: Undefined error: 0
```


この場合は`unset SPARK_HOME && spark-submit`すると良いらしい。
http://stackoverflow.com/questions/34624821/apache-spark-upgrade-from-1-5-2-to-1-6-0-using-homebrew-leading-to-permission-de

無事`spark-shell`が立ち上がるようになりました

```
$ spark-shell
log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Using Spark's repl log4j profile: org/apache/spark/log4j-defaults-repl.properties
To adjust logging level use sc.setLogLevel("INFO")
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 1.6.1
      /_/

...
```
ブレイン・ストーミングで使えるアイデア出しツール

# どのように ブレイン・ストーミング を実施していますか？

次の開発製品、次にリリースする機能、いまある資産や経験を別のプロダクトにしたい、KPTで改善項目をあげる、、、などなど。何かにつけてブレイン・ストーミングしていると思いますが、どのようにブレイン・ストーミングを実施していますでしょうか？

ブレイン・ストーミングの四原則はご存知のとおりです。

* 批判をするな：他人の意見を批判してはいけない。批判があると良いアイディアが出にくくなる。
* 自由奔放：こんなことを言ったら笑われはしないか、などと考えず、思いついた考えをどんどん言う。「上品は」ジョーク歓迎。
* 質より量：できるだけ多くのアイディアを出せ。
* 連想と結合：他人の意見を聞いてそれに触発され、連想を働かせ、あるいは他人の意見に自分のアイディアを加えて新しい意見として述べるというのが一つやり方。

でも、ブレイン・ストーミングに呼ばれて付箋紙とペンを渡されても、いきなりアイデアが湧いてくるはずもありません。そこはブレイン・ストーミングの中で使うツールがちゃんとあるのです。

# オジー・オズボーン じゃないよ

ここで、ブレイン・ストーミングは アレックス・F・オズボーン という方が考案された集団発想法です。そして、ブレイン・ストーミングの話しはちゃんと書籍で出版されていたりもします。

「創造力を生かす―アイディアを得る38の方法」
https://www.amazon.co.jp/dp/4422100432

ブレイン・ストーミングを実施しようとして、なかなか出来ない場合は、これらの書籍やWebの情報を探したりしたことが無い人でしょう。そこには「オズボーンのチェックリスト」というのがあって、アイデアを発想するための質問が用意されているんです。知ってました？

# オズボーンのチェックリスト とは

「オズボーンのチェックリスト」には、9つの質問が用意されています。進行役の人が参加者に対して順に質問していき、それぞれ付箋に書き出していくと良いでしょう。

* Put to other uses／転用
他に用途はないか?、改善・改良して使い道があるか?

* Adapt／適合
他にこのようなものがあるか? 過去に匹敵したものは何か?

* Modify／変更
色、音、匂い、意味、動き、形など、新しいアングルはないか？

* Magnify／拡大
大きさ、時間、頻度、高さ、長さ、強さを拡大できるか？

* Minify／縮小
より小さくできるか？携帯化できるか？短くできるか？省略できるか？軽くできるか？

* Substitute／代用
他の材料、 他の過程、他の場所、他のアプローチ、 他の声の調子、他の誰か、異なった成分など、他の何かに代用できないか？

* Rearrange／再配列
要素、成分、部品、パターン、配列、レイアウト、位置、ペース、スケジュールを変えられないか？原因と結果を替えられないか？

* Reverse／逆転
逆にできないか? 正反対にできないか? 後方に移せないか? 役割を逆にできないか？ターンできないか？反対側を向けられないか？マイナスをプラスにできないか？

* Combine／結合
目的や考えを結合できないか?一単位を複数にできないか？組み合せられないか?


# SCAMPER法 とは

「オズボーンのチェックリスト」でも十分ですが、ボブ・イバールという方がさらに改善した SCAMPER法 というのもあります。
七つの質問リストによるアイデア発想法で、頭文字をとって SCAMPER法 です。


|分類|質問|
|:-----------------|:------------------|
|Substitute（代える、代用する）|代用可能な部分はどれか|
||何を代わりに使うことができるか|
||ほかに誰を含めることができるか|
||ほかにどんなグループを含めることができるか|
||代わりにどんなプロセスを使うことができるか|
||代わりにどんなマテリアル（モノ）を使うことができるか|
|Combine（組み合わせる）|何を組み合わせることができるか|
||ブレンドする（混ぜ合わせる）ことはできるか|
||どんな種類のアンサンブル（取り合わせ）を使うことできるか、創ることができるか|
||部分同士を、どのように組み合わせることができるか|
||目的同士を、どのように組み合わせることができるか|
||アプリケーション（応用方法）同士を、どのように組み合せることができるか|
||マテリアル（モノ）同士を、どのように組み合せることができるか|
|Adapt（適応させる）|これは、ほかのどのような考えを思い付かせるか|
||何かほかに、これに似たものはないか|
||過去に似た状況はないか|
|Modify（修正する）|さらにTwist（ひねり、コトの意外な曲折）を加えることができないか|
||その意味あいを、どのくらい変えることができるか|
||色や外形を、どのくらい変えることができるか|
||サウンド（音、騒音、音声）を、どのくらい変えることができるか|
||何を加えることができるか|
||高さ・高度をどれくらい増やせるか|
||重さをどれくらい増やせるか|
||強度をどれくらい増やせるか|
||頻度をどれくらい増やせるか|
||価値をどれくらい増やせるか|
||何を減らすことができるか|
||何を縮小することができか|
||何を簡素化することができるか|
||控えめに言うことができるのは、どんな部分か|
||サイズをどれくらい小さくできるか|
||重さをどれくらい軽くできるか|
|Put to other uses（ほかの使いみち）|そのままで、何かほかへ使えないか|
||もし一部を変えたら、新たに生まれるほかの用途は何か|
||ほかにどんなマーケットが受け入れるか|
|Eliminate（省略する、除去する）|何を、取り除くことができるか、省略することができるか|
||ある部分がない時、どうやって実行するか|
||何を犠牲にできるか|
||あげてしまえるものは、何か|
|Rearrange（再調整する）|ほかに、どんなパターンが使えるか。|
||ほかに、どんな配置が使えるか|
||ほかに、どんなレイアウトが使えるか|
||何を交換できるか|
||何を置換できるか。言い換えられるか。|
||何を、再結合できるか|
||逆にしたらどうなるか|
||上下逆さまにしたらどうなるか|
||内外を裏返したらどうなるか|

# 付箋紙のめくり方

ところで、みなさん付箋紙を勢い良くめくっていて、くるくるって丸まったり、張った時に浮いたりしていませんか？
のりの部分が上にあるとして、下から上にめくるのではなく、「横からめくる」のですよ。
安物の付箋紙だと、それでも剥れやすいですけど。。。
【動画】HandBrakeでDVD・ISO形式などの動画を編集してmp4またはm4vに変換する

[HandBrake](https://handbrake.fr/downloads.php) からダウンロードしてインストールします。

マルチプラットフォーム対応です。

基本的には、「Source」から変換したい動画を選択して「Browse」から保存先を指定して、「Start」を選択すれば、mp4形式に変換されて保存されます。

動画の一部のみを変換したいときは、①を「Seconds」に変更し、②に開始時間を、③に終了時間を指定して、「Start」すれば、変換されます。

![hb.jpg](https://qiita-image-store.s3.amazonaws.com/0/42231/91aa6670-3cb4-6747-8e3c-4cd8480e8843.jpeg)

ちなみに、<ins>HandBrakeには日本語版もありますが、バージョンが低く時間指定での変換機能がありません。</ins>

そのときは、最新版（英語）を利用してください。

mp4またはm4vをflvに変換する必要があるときは、[Any Video Converter](http://jp.any-video-converter.com/any-video-converter-free.php) というフリーソフトを使うと可能です。

Webページに動画を貼り付けたい場合、HTML5ならvideoタグを使えば、そのまま再生されると思います。
OpenCV で opencv_traincascade.exe を使って学習させてみた時にハマったのでメモ


# 概要
OpenCVで画像を検出させるためのカスケードファイルを自分で作ろうと思いOpenCVに同梱されているopencv_traincascade.exeを使って検出器を作ろうとしたときにハマったことについてメモ。

# 環境
Windows OpenCV
OpenCV ver 2.4.13

# 今回のハマり部分
Windows のコマンドプロンプトから、opencv\build\x64\vc12\bin\に移動してopencv_traincascade.exeを実行する。下記のようなコマンドを実行した。
```
opencv_traincascade.exe -data ./cas/test -vec ./vec/test.vec -bg ./neg/nglist.txt -numPos 50 -numNeg 20
```

すると以下のようなエラーメッセージが出た。

```
cascadeDirName: cas/test
vecFileName: vec/test.vec
bgFileName: neg/nglist.txt
numPos: 50
numNeg: 20
numStages: 20
precalcValBufSize[Mb] : 1024
precalcIdxBufSize[Mb] : 1024
stageType: BOOST
featureType: HAAR
sampleWidth: 24
sampleHeight: 24
boostType: GAB
minHitRate: 0.995
maxFalseAlarmRate: 0.5
weightTrimRate: 0.95
maxDepth: 1
maxWeakCount: 100

===== TRAINING 0-stage =====
<BEGIN
POS count : consumed   50 : 50
Train dataset for temp stage can not be filled. Branch training terminated.
Cascade classifier can't be trained. Check the used training parameters.
```

**エラーメッセージ**
*Train dataset for temp stage can not filled. Branch training terminated. 
Cascade Classifier can't be trained. check the used training parameters*

ググって色々と調べてみたが私の場合はあまり参考にならなかった。
いちおう参考までに調べたエラーの結果は以下の通り。

- [x] 改行コードが違う
http://villager5.blog.163.com/blog/static/8273636201462452037527/


- [x] WindowSizeの指定が違う
-w 24 -h 24にしないとダメっぽい？

などだったが、私の場合はどちらも当てはまらなかった。
# 解決
結局、調べてわからなかったので、初心に返ってインストールのところから読み直してなんとなくわかった。

**OpenCVをインストールする際に、C:\　以下のフォルダーを選んでおけばよかっただけだった。**


＞私の場合、デスクトップで展開してました。

※インストールする際、管理者権限で実行しないと、C:\　以下に「opencv」のフォルダーが見当たらなくなるので要注意。

# 追記
これで難なくopencv_traincascade.exeを起動させ無事に先ほどのエラーもなく実行することはできたが、新たなエラーメッセージが出た。

```
===== TRAINING 0-stage =====
<BEGIN
POS count : consumed   50 : 50
NEG count : acceptanceRatio    20 : 1
Precalculation time: 3
+----+---------+---------+
|  N |    HR   |    FA   |
+----+---------+---------+
|   1|        1|        1|
+----+---------+---------+
|   2|        1|        1|
+----+---------+---------+
|   3|        1|        1|
+----+---------+---------+
|   4|        1|        1|
+----+---------+---------+
|   5|        1|        1|
+----+---------+---------+
|   6|   0.9955|    0.391|
+----+---------+---------+
END>
Parameters can not be written, because file cas/test/params.xml can not be opened.
```

**エラーメッセージ**
*Parameters can not be written, because file cas/test/params.xml can not be opened.*

このメッセージは、「cas/test/フォルダーに書き込む権限がありません」という意味なので、

①casフォルダーを右クリック
②プロパティからセキュリティーを選択
③「追加」からeveryoneを追加して権限を付与

以上でエラーメッセージが出ることなく進めることができた。


# 検出器を作成するにあたり参考にさせていただいた記事
http://www.pro-s.co.jp/engineerblog/opencv/post_6202.html
https://github.com/opencv/opencv/blob/master/apps/traincascade/cascadeclassifier.cpp
http://qiita.com/shu223/items/ffd2202eaf92d342f83d
TreasureDataをSparkのSourceにしたいんだが


最初は一旦Listに展開してから```sc.parallelize```しようとしてたけど、masterのメモリに乗りそうにないし
どうやらJdbcRDDとかいうのがあるらしいのでそれをつかう

早速実装

```
  val props = new Properties() {
    setProperty("apikey", conf.getString("apikey"))
    setProperty("useSSL", conf.getString("useSSL"))
    setProperty("type", conf.getString("jobType"))
  }

  val connection = DriverManager.getConnection(conf.getString("url"), props)

  val query = """
      select *
      from ad_impressions ai
      where TD_TIME_RANGE(ai.time, ?, ?, 'UTC')
      order by time asc
  """
  
  val treasuredataLogs: JdbcRDD[ArticleImpression] = new JdbcRDD(
    sc, // SparkContext
    () => TreasureData.getConnection(), // Jdbc Connection
    query, // Query String
        from.map(_.toDateTime(DateTimeZone.UTC).getMillis / 1000) | Long.MinValue, // the minimum value of the first placeholder
      to.map(_.toDateTime(DateTimeZone.UTC).getMillis / 1000) | Long.MaxValue, // the maximum value of the second placeholder
    10, // num partition 1~20
    rs => ArticleImpressionDxo.fromEntity(rs) // data exchange function
  )

```


JdbcRddのソースを見た感じ、勝手にcloseしてくれるっぽいネ(´ω｀*)

```
  override def compute(thePart: Partition, context: TaskContext): Iterator[T] = new NextIterator[T]
    {
      context.addTaskCompletionListener{ context => closeIfNeeded() }
  
```


で、動いたけどなんかおっそいな。。。
なんでやろ



どうやら、クエリが何回も実行されてるっぽい？
TreasureDataのジョブ履歴を見たら１０回クエリが実行されている。

```
 * @param numPartitions the number of partitions.
 *   Given a lowerBound of 1, an upperBound of 20, and a numPartitions of 2,
 *   the query would be executed twice, once with (1, 10) and once with (11, 20)
```

lower と upper に timeの範囲を入れて、クエリにプレースホルダを２つ設定する。
もしnum partitionの数で範囲を分割して実行してくれるって感じかな

今回は10で指定したので１０クエリに分けてくれたっぽいネ
実際ジョブの履歴見たら、rangeを１０個に分割してくれてた

```
select * from ad_impressions ai where TD_TIME_RANGE(ai.time, 1468998720, 1469016000) order by time asc
select * from ad_impressions ai where TD_TIME_RANGE(ai.time, 1468981440, 1468998719) order by time asc
select * from ad_impressions ai where TD_TIME_RANGE(ai.time, 1468964160, 1468981439) order by time asc
select * from ad_impressions ai where TD_TIME_RANGE(ai.time, 1468946880, 1468964159) order by time asc
select * from ad_impressions ai where TD_TIME_RANGE(ai.time, 1468929600, 1468946879) order by time asc
select * from ad_impressions ai where TD_TIME_RANGE(ai.time, 1468912320, 1468929599) order by time asc
select * from ad_impressions ai where TD_TIME_RANGE(ai.time, 1468895040, 1468912319) order by time asc
select * from ad_impressions ai where TD_TIME_RANGE(ai.time, 1468877760, 1468895039) order by time asc
select * from ad_impressions ai where TD_TIME_RANGE(ai.time, 1468860480, 1468877759) order by time asc
select * from ad_impressions ai where TD_TIME_RANGE(ai.time, 1468843200, 1468860479) order by time asc
```

ありがとうJdbcRDD
AttributeError に備えてデフォルト値を設定するコード

# Python でコードを書くときはAttributeErrorが発生することを注意する必要がある

以下のコードでは、Testクラスにname属性が設定されていないため、AttributeErrorになる。

```python:test_code.py
class Test:
     def __init__(self, cd):
            self.cd = cd


test = Test("c001")
print(test.cd) #c001
print(test.name) # AttributeError
```

属性が存在しないことを見越したコードを書く際は、以下のように getattrを使うと良い。

https://docs.python.org/3.5/library/functions.html#getattr

```python:test_code2.py
class Test:
     def __init__(self, cd):
            self.cd = cd


test = Test("c001")
print(test.cd) #c001
print(getattr(test, "name", "default value")) # 属性nameがないので、default value が表示される 
```
[Jenkins] Windows7にJenkinsをインストールする方法まとめ

Windows7にJenkins 2.x (このドキュメントは 2.7.1) をインストールする方法のまとめになります。
2.xでのその他の環境での手順は確認していませんがインストーラの使用以降は共通かと思います。

# 1. 公式ページから msi をダウンロード
以下の公式ページより、Windows向けのインストーラをダウンロード
[Jenkins](https://jenkins.io/)

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/37721/6bdca57f-fb54-53c5-9cfd-80981f824284.png)

`zip` を解凍すれば `msi` が得られるはずです。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/37721/3add7555-d6e1-c419-a413-6fedebb9137e.png)

ウィザードからインストールを進めて下さい。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/37721/8fdb786f-de04-cf21-6cf2-d279191fe00a.png)

# 2. Jenkinsの初期設定

インストールが正常に終了していれば `http://localhost:8080/` にてJenkinsが自動で立ちあがります。

最初にAdministratorの初期パスワードを求められますので、画面中段に記載してあるPATHのファイルを参照して、
パスワードを入力してください。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/37721/6a0cd093-a1f0-34f9-8df3-d93d282d3e1f.png)

ネットワークの環境によっては、次にプロキシの設定を行って下さい。
設定内容は各環境によって違いますので、自分の使用しているネットワーク環境に合わせて入力して下さい。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/37721/70449d52-f0be-f94f-a468-9905adf769b5.png)

次にプラグインの設定画面がでますが、特にこだわりがなければ推奨のプラグインをインストールを選択すればよいと思います。

後は、Adminのユーザーを作成して完了です。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/37721/125e1466-261d-9442-2553-1863e3dd2fe8.png)


インストールに関しては以上です。Jobの設定等は別資料を参照して下さい。

# 関連

[[Jenkins] ビルドトリガ（定期的に実行）設定についてのまとめ - Qiita](http://qiita.com/koara-local/items/79cb9c08e77ac9d94b1d?utm_source=chrome-extention&utm_medium=browser-extention&utm_content=notifications)
[[Jenkins][Ubuntu] UbuntuにJenkinsをインストール - Qiita](http://qiita.com/koara-local/items/268dab580346fcef59b5)

# 参考
[Jenkinsをインストールして使ってみよう［Mac／Linux／Windows］ - Build Insider](http://www.buildinsider.net/enterprise/jenkins/001#forwindows)
さくっとMacでC++環境構築

#0.まえおき

この記事はある種メモ書きなので、あーこうやるんだー程度に…


#1.手順

手順は以下のとおり

##0.前提
brewとXcodeが入っていること。

##1.gcc-6のインストール

```bash
$brew install gcc
```

##2.CMakeインストール

https://cmake.org/download/

##3.CMakeをCommandLineで使えるようにする

```bash
sudo "/Applications/CMake.app/Contents/bin/cmake-gui" --install
```

##4.IDEを取ってくる

30日はただ
https://www.jetbrains.com/clion/

##5.実際に実行してみる

```bash
$ cd {C++プロジェクトの適当なフォルダ}
$ cmake .
$ make
$ ./{app_name}
```
Clojure 1.9で追加されたネームスペース付きマップ記法のリファレンスの和訳

最近Clojureの公式リファレンスの翻訳作業を行っていて、
タイムリーなものを訳したのでQiitaで成果物のリンクをシェアする。

https://japan-clojurians.github.io/clojure-site-ja/reference/reader#_maps_%E3%83%9E%E3%83%83%E3%83%97

プロジェクトのサイトはこちら。
https://github.com/japan-clojurians/clojure-site-ja
WindowsでDHCPリースを更新する

## 概要

Windowsで、DHCPリースを手動で更新する方法。

## コマンド

```dos
> ipconfig /release
> ipconfig /renew
```

## 参考
* [Windows - Displaying, Releasing and Renewing a DHCP Lease](https://kb.wisc.edu/page.php?id=562)
ターミナルから画像を見たい

Homebrew で `libcaca` をインストールする。
http://caca.zoy.org/wiki/libcaca

```bash
brew install libcaca --with-imlib2
```

`--with-imlib2` をつけないと、BMP形式の画像しか見られない。

---

以下のように怒られた場合は

```
libcaca: XQuartz is required to install this formula.X11Requirement unsatisfied!
```

```bash
brew cask install xquartz
```

`xquartz` を先にインストールする。

---

`libcaca` インストール後は

```bash
cacaview image.jpg
```

のような感じで画像を閲覧できる。

---

ちなみに `brew install` に利用できるオプション一覧は

```bash
brew options libcaca
```

のように確認できる。
Bash | 拡張正規表現で条件分岐する

# 失敗

右辺をクオートするとダメ。

```bash
[[ 'AAA' =~ '^A{3}$' ]] && echo 'found' || echo 'not found'

# => not found
```

右辺をスラッシュで囲ってもダメ。

```bash
[[ 'AAA' =~ /^A{3}$/ ]] && echo 'found' || echo 'not found'

# => not found
```

# 成功

右辺を直書きすると動く。

```bash
[[ 'AAA' =~ ^A{3}$ ]] && echo 'found' || echo 'not found'

# => found
```

# 環境

- bash 3.2

# 参考

- http://stackoverflow.com/questions/12614267/bash-extended-regex-operators








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
jQuery Validation Plugin でちょっとはまった話。


なぜかvalidationしてくれないフォームがあり、少し悩んでしまった。以下のようにnameがないとvalidateしてくれないようだ。

```
<form id="aform">
最小値 <input type="number" id="min_length" data-rule-required="true" data-rule-number="true" data-rule-range="1,255" >
最大値 <input type="number" id="max_length" data-rule-required="true" data-rule-number="true" data-rule-range="1,255" >
...
</form>
<script>
	$('#aform').validate();
</script>
```

nameを追加したら無事動作した。

```
最小値 <input type="number" name="min" id="min_length" data-rule-required="true" data-rule-number="true" data-rule-range="1,255" >
最大値 <input type="number" name="max" id="max_length" data-rule-required="true" data-rule-number="true" data-rule-range="1,255" >
```