OmniAICreator/Qiita-1.07M huggingface dataset:
さくらレンタルサーバーとSourceTreeでGit環境構築

GitでPrivateなリモートリポジトリを作ってプロジェクトのバックアップ&バージョン管理をしたい！
でもなるべくコストはかけたくない！

ということで以前から借りていたさくらレンタルサーバーにリモートリポジトリを作成し、GitクライアントのSourceTreeを使ったバージョン管理環境を作成しました。

# まず準備
[さくらレンタルサーバー](http://www.sakura.ne.jp)のスタンダード(月額515円)以上のプランを契約します。
ライトだとsshが使えないのでダメです。

[SourceTree](https://ja.atlassian.com/software/sourcetree)もダウンロードしておきます。

# SourceTreeでローカルリポジトリ作成

ポチポチっとディレクトリを指定するだけで簡単です。
![git3.png](https://qiita-image-store.s3.amazonaws.com/0/142643/51452c3e-053e-e806-478e-5a5c302107cf.png)
空のディレクトリを作って始めても良いし、作成済みプロジェクトのディレクトリを指定してもOKです。
![git2.png](https://qiita-image-store.s3.amazonaws.com/0/142643/a3c86a11-fa75-9c23-f4b1-492d30ff6132.png)
これでgit_testという名前のローカルリポジトリが作成できました。
![git4.png](https://qiita-image-store.s3.amazonaws.com/0/142643/74dc92b3-bebc-5826-aa96-475715624004.png)

ローカルでのバージョン管理であればこれだけでOKですが、リモートへのプッシュはまだできません。
![git11.png](https://qiita-image-store.s3.amazonaws.com/0/142643/83e65b21-6215-3211-c1c3-09c0f551b0cb.png)



# レンタルサーバーにリモートリポジトリを作成
ターミナルなどを使い、sshでレンタルサーバーに接続します。
[アカウント名]の部分はレンタルサーバーのアカウント名になります。

```
$ ssh アカウント名@アカウント名.sakura.ne.jp
```
今後増えるであろうリポジトリを格納するディレクリを作成しておきます。

```
$ mkdir /home/アカウント名/git
```

Gitはデフォルトでインストールされていたので、リポジトリ作成コマンドでgit_testという名前のリポジトリを作成します。

```
$ git init --bare /home/アカウント名/git/git_test.git
```

これでリモートリポジトリも準備OKです。

# SourceTreeからリモートリポジトリに接続

リポジトリ > リモートを追加
![git6.png](https://qiita-image-store.s3.amazonaws.com/0/142643/64ea13c6-11a7-fd6c-2d84-e8c0da127608.png)

URL/パスに
**ssh://アカウント名@アカウント名.sakura.ne.jp/home/アカウント名/git/git_test.git**
と入力してOK。
![git7.png](https://qiita-image-store.s3.amazonaws.com/0/142643/a7ed2a30-8dd7-f524-b5d6-0391e9a3007a.png)

これで、ローカルでのコミットをリモートにもプッシュできるようになりました。
![git10.png](https://qiita-image-store.s3.amazonaws.com/0/142643/a4bcf16c-4fc8-5dea-0f53-c0ed51c863fb.png)

# 最後に
今回はたまたま暇そうにしているレンタルサーバーが居たので活用してみましたが、個人で安くPrivateなリモートリポジトリが欲しいだけであれば、[Bitbucket](https://bitbucket.org)を使ったほうが良いんじゃないかなと思います。
LINE Notify 簡単なシェルスクリプトで試してみた

# LINE Notify 簡単なシェルスクリプトで試してみた
## Summary
LINE Engineers' Blog [コマンドラインから LINE にメッセージを送れる LINE Notify](http://developers.linecorp.com/blog/ja/?p=3784)を参考にトークンとメッセージを引数で渡す簡単なシェルスクリプトで試してみました。

LINE Notifyはシンプルなので、色々と使えそうです。

## Usage
```
sh ./line_notify.sh ACCESS_TOKEN "foobar"
```

## Shell Script
``` line_notify.sh 
#!/bin/sh

ACCESS_TOKEN=$1
MSG=$2

curl -X POST -H "Authorization: Bearer $ACCESS_TOKEN" -F "message=$MSG" https://notify-api.line.me/api/notify
```
CentOS 7でRedisを複数立ち上げる

# 目的

開発でRedisのレプリケーションや複数のRedisへの接続を試す環境を作成するためにCentOS 7上で複数のインスタンスを立ち上げる方法を紹介します。

# Redisのインストール

```sh
yum install redis
```

# 初回のみ実施すること

pidファイルとログ用のディレクトリを作成。

```sh
mkdir /var/run/redis/ && chown redis: /var/run/redis/
mkdir /var/log/redis/ && chown redis: /var/log/redis/
```

# ポートごとの設定

データディレクトリ、設定ファイル、systemctlのユニットファイルの準備。
実行時はredisユーザーとなるので、ファイルオーナーとグループの設定に気をつけて下さい。

```sh
cp -uvp /etc/redis.conf /etc/redis_6379.conf
mkdir /var/lib/redis_6379 && chown redis: /var/lib/redis_6379
cp -upv /usr/lib/systemd/system/redis.service /usr/lib/systemd/system/redis_6379.service
```

systemctlのユニットファイルを以下のように書き換え。

```sh:/usr/lib/systemd/system/redis_6379.service
[Unit]
Description=Redis persistent key-value database
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/redis-server /etc/redis_6379.conf --daemonize no
ExecStop=/usr/bin/redis-cli -p 6379 shutdown
User=redis
Group=redis

[Install]
WantedBy=multi-user.target
```

configファイルの書き換え。

```conf:/etc/redis/6379.conf
# ポート番号の指定
port 6379

# pidファイルのパスを指定
pidfile /var/run/redis/redis_6379.pid

# ログファイルのパスを指定
logfile /var/log/redis/redis_6379.log

# データディレクトリを指定
dir /var/lib/redis_6379/
```

自動起動設定。

```sh
systemctl stop redis.service # 既存のRedisを停止
systemctl disable redis.service # 既存のRedisを削除
systemctl start redis_6379.service
systemctl enable redis_6379.service
```

# ポート6380の設定を追加する

上記の6479を6380に読み替えて設定してください。

# 参考

- configファイル（レプリケーション設定あり）
 - https://github.com/tomgoodsun/centos7_lamp_configs/tree/master/config/etc
- systemctlユニットファイル
 - https://github.com/tomgoodsun/centos7_lamp_configs/tree/master/config/usr/lib/systemd/system
suできなくてもsuする

# お前は何を言っているんだ。

と言いたくなりますが、例えば`apache`ユーザー等はログインシェルに`/sbin/nologin`が指定されているので、普通に`su`しようとするとスイッチ出来ません。

```
# cat /etc/passwd | grep apache
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

# su - apache
This account is currently not available.
```

上記の通り怒られます。ので、下記のようにします。

```
su -s /bin/bash apache
```

`-s`オプション用いることでログインシェルを指定することが出来ます。（ここでは`/bin/bash`を指定）
結果`apache`ユーザーへもログインすることが出来ます。

また`-`付きで`su`すると、現在の環境変数を解除した上でそのユーザーにスイッチすることが出来ます。

```
su -s /bin/bash - apache
```
Scrapyの非同期DBパイプライン

この辺の情報がなさそうだったので。

http://shop.oreilly.com/product/9781784399788.do
唯一のScrapy本の「Learning Scrapy」本によると、
DBパイプラインは以下のような感じにするのがよいらしい。

通常の同期的に書くとブロッキングされるので、非同期で書く。
twistedにDBプーリングの仕組みが提供されているので、それを使う(DBAPI2インタフェースならどのDBでもよい）

```py
import logging
from twisted.enterprise import adbapi
from twisted.internet import reactor, defer

class DatabaseWriterPipeline(object):
    @classmethod
    def from_crawler(cls, crawler):
        settings = crawler.settings
        return cls(
            settings.get('PIPELINE_DATABASE_ENGINE'),
            settings.get('PIPELINE_DATABASE_HOST'),
            settings.getint('PIPELINE_DATABASE_PORT'),
            settings.get('PIPELINE_DATABASE_USER'),
            settings.get('PIPELINE_DATABASE_PASS'),
            settings.get('PIPELINE_DATABASE_DB'),
        )

    def __init__(self, driver, host, port, user, passwd, db):
        self.dbpool = adbapi.ConnectionPool(driver,
            charset='utf8',
            use_unicode=True,
            connect_timeout=60,
            host=host,
            port=port,
            user=user,
            passwd=passwd,
            db=db,
            cp_min=3,
            cp_max=10,
            cp_reconnect=True,
        )
        self.logger = logging.getLogger(__name__)

    def close_spider(self, spider):
        self.dbpool.close()

    @defer.inlineCallbacks
    def process_item(self, item, spider):
        yield self.dbpool.runInteraction(self.do_replace, item)
        defer.returnValue(item)

    @staticmethod
    def do_replace(tx, item):
        # お好きなitemの設計とテーブルに合わせて
        sql = "INSERT INTO text_data (url, title, content) VALUE (%s, %s, %s)"
        args = (
            item["url"][:2048],
            item["title"][:512],
            item["content"][:65535],
        )
        tx.execute(sql, args)

```

書き込むテーブルは作っておいて、settings.pyにこんな感じで書く。

```py
DATABASE_ENGINE = 'MySQLdb'
DATABASE_HOST = 'localhost'
DATABASE_PORT = 3306
DATABASE_DB = 'crawl'
DATABASE_USER = 'root'
DATABASE_PASS = ''

ITEM_PIPELINES = {
    'extensions.pipelines.DatabaseWriterPipeline': 100, # 上記のクラスを指定する
}
```

DBが詰まることなく高速に動く（もともとクロール側の負荷に比べてDBの負荷ははるかに少ない）
CentOS 7でMemcachedを複数立ち上げる

# 概要

ポート番号を分けて複数のMemcachedを起動できるようにする。

# セットアップ

## インストール

```shell-session
yum install memcached
```

## 環境設定ファイルの用意

環境設定ファイルをコピー。

```shell-session
cp -upv /etc/sysconfig/memcached /etc/sysconfig/memcached_11212
```

ポート番号を変更。

```conf:/etc/sysconfig/memcached_11212
PORT="11212"
```

## systemctlのユニットファイルを用意

既存のユニットファイルをコピー。

```shell-session
cp -upv /usr/lib/systemd/system/memcached.service /usr/lib/systemd/system/memcached_11212.service
```

読み込む環境設定を先程変更したものに変更。

```conf:/etc/sysconfig/memcached_11212
EnvironmentFile=-/etc/sysconfig/memcached_11212
```

## 起動と自動起動設定

```shell-session
[root@localhost ~]# systemctl start memcached_11212.service
[root@localhost ~]# ps aux | grep memcache
memcach+   854  0.0  0.1 333848  1216 ?        Ssl  01:26   0:00 /usr/bin/memcached -u memcached -p 11211 -m 64 -c 1024
memcach+  2717  0.0  0.1 333848  1212 ?        Ssl  02:00   0:00 /usr/bin/memcached -u memcached -p 11212 -m 64 -c 1024
root      2725  0.0  0.0   9040   668 pts/0    R+   02:00   0:00 grep --color=auto memcache
[root@localhost ~]# systemctl enable memcached_11212.service
```

# 参考サイト

- [How to run multiple memcached processes in CentOS 7](https://www.subhosting.net/kb/how-to-run-multiple-memcached-processes-in-centos-7/)
大量のドメインに対してクロールするならScrapy-Redisがオススメ

## Scrapy-Redis

https://github.com/rolando/scrapy-redis

`pip install scrapy_redis`

して基本settings.pyを置き換えるだけ

## 導入するメリット

- scrapyのスケジューラ、start_urlsのキュー、パイプラインにredisを使える（別々の拡張設定）
  - 外部連携や多重化が容易
- スケジューラのキューが永続化されるので、途中でクローラーを止めても再開が可能
- 同じSpiderをマルチプロセスやマルチサーバで複数起動して、同時に並列でクローリングできるようになる
- pipelineで出力をredisに設定することで、後続の処理を別のワーカプロセスで処理できる
 - DBにバルクで書き込む
 - トークナイズする
 - 機械学習のストリームに流す
- spiderのstart_urlsもredisにできるので、外部サービスから開始URLのキューにプッシュできる。

Scrapyはチューニング次第で1コアで1000ページ/分程度いけるから(CPU 100%食いきれる)、
Scrapy-Redisを使うことで、コア数 * 1000ページ/分クロールできるようになる。
Swift Color LiteralはGitでどう表現されるか

##はじめに
Xcode 8でSwift Color Literalが本格的に導入されました。Xcode 7.1のplaygroundですでに採用されていましたが、それ以外でも利用できるようになりました。
Color Literalは、直感的に色(iOS系のUIColorとmacOS系のNSColor)を指定できる記法です。(CGColorの場合は、[色].CGColorのような形で指定します。)

##入力方法
<img width="472" alt="XcodeScreenSnapz001.png" src="https://qiita-image-store.s3.amazonaws.com/0/84185/8a20394e-5063-7646-d534-2f59801e5898.png">

Edit > Format > Show Colorsと選択すると、上のスクリーンショットのようにColorsパレットが表示されます。色をコード上にドラッグドロップすると、色をColor Literalとして入力できます。

Color Literalをダブルクリックすると、再編集できます。

##Git上でどう表現されるか
文字列化されると、こういう形になります。RGBとアルファをdouble型の0〜1の実数で表現しています。

```swift
view.backgroundColor = #colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)
```

##関連リンク
[UIColorをColor Literalで定義する](http://qiita.com/okuderap/items/f980dde37e3f44fd9d01)
[Literals in Playgrounds](https://developer.apple.com/swift/blog/?id=33)
[UIColorの定義はすべて#colorLiteral使ってみることにしてみた](https://medium.com/swift-column/color-literal-6223850f7e2c#.q5wjk5z3y)
コードの実例 https://github.com/hsylife/HowToDisplayPopover/blob/master/HowToDisplayPopover/ContentViewController.swift
Scrivenerの出力ファイルを縦書きにして最強の小説エディタ化させるgulpfile

最強の小説エディタとの呼び声高い[Scrivener](https://www.literatureandlatte.com/scrivener.php)。
しかしながらたった一点だけ。ほんとうにたった一点だけ、とても残念な仕様があります。
それは、 **いつまで待っても日本語縦書き対応してくれないこと** 。

縦書きさえ対応してくれれば！入力はまだ我慢するとしてもせめて出力を！とか願うわけですが、無いなら無いで自分でなんとかすればいい。というわけでgulpでさくっと作ってみました。
![スクリーンショット 2016-10-14 1.12.30.png](https://qiita-image-store.s3.amazonaws.com/0/3707/a8a2acc0-d834-eee0-c7aa-bb846f622bfa.png)
Scrivenerからはこんな感じでHTMLとしてコンパイル。
![スクリーンショット 2016-10-14 1.11.10.png](https://qiita-image-store.s3.amazonaws.com/0/3707/274f9c82-b07c-fa84-b3b7-84cfd59f5f93.png)

```javascript:package.json
{
  "scripts": {
    "gulp": "gulp",
    "replace": "gulp replace"
  },
  "devDependencies": {
    "gulp": "^3.9.1",
    "gulp-replace": "^0.5.4"
  }
}
```

```javascript:gulpfile.js
var gulp = require('gulp'),
replace = require('gulp-replace');

const css = `
body{
  font-family: "HiraMinProN-W3", "@ＭＳ 明朝", serif, sans-serif;
  writing-mode: vertical-rl;
  -webkit-writing-mode: vertical-rl;
  -epub-writing-mode: vertical-rl;
  line-height: 1.75em;
  text-align: justify;
  margin:0;
  padding:0;
  font-size:1em;
}
body.vertical {
  writing-mode: vertical-rl;
  -webkit-writing-mode: vertical-rl;
  -epub-writing-mode: vertical-rl;
}
body.horizontal{
  writing-mode:horizontal-tb;
  -epub-writing-mode:horizontal-tb;
  -webkit-writing-mode:horizontal-tb;
}
/*
縦中横
縦書きに混じる!?や平成25年、ABCなどの半角英数字や記号などを正立
*/
.tcy {
    font-size:0.9em;
    letter-spacing:-0.1ex;
    text-combine: horizontal;
    -webkit-text-combine: horizontal;
    -epub-text-combine: horizontal;
}
/*
傍点
*/
span.sesami {
  text-emphasis-style : sesame;
  text-emphasis-color : #000;
  -epub-text-emphasis-style : sesame;
  -epub-text-emphasis-color : #000;
  -webkit-text-emphasis-style : sesame;
  -webkit-text-emphasis-color : #000;
}
/*
かぎかっこ開始行で字下げを行わない場合
*/
p.escape{
  text-indent:0;
}
`;

const styleTag = `<style>${css}</style>`;

gulp.task('replace', () =>{
  return gulp
  .src('*.html')
  .pipe(replace('</head>', `${styleTag}</head>`))
  .pipe(replace('《《', '<span class="sesami">')).pipe(replace('》》', '</span>'))
  .pipe(replace(/｜?([々?一-龠]+)《(.+?)》/g, '<ruby>$1<rt>$2</rt></ruby>'))
  .pipe(replace(/<p class="(.+?)">「/g, '<p class="$1 escape">「'))
  .pipe(gulp.dest('./convert'));
});


gulp.task('watch', ()=>{
  return gulp
  .watch('*.html', ['replace']);
});

gulp.task('default', ['watch']);
```

あとはgulpでこんな感じで書いておけば、作業ディレクトリでコマンドから

```bash
npm run replace
```

を実行すればconvertディレクトリに縦書きのHTMLファイルを出力してくれる。

現時点ではさらに

+ 傍点対応
    + 《《foo》》（全角二重やまかっこふたつ）で囲んだ文字に傍点を追加
+ ルビ対応
    + 漢字の直後に《baa》（全角二重やまかっこひとつ）で囲んだ文字をルビに変換
    + ｜漢字《baa》（全角縦棒と任意の漢字に続く全角二重やまかっこひとつ）で囲んだ文字をルビに変換

までを自動でやるようにしている。
そのうち気が向いたら縦中横も対応できるようにしよう。

ちなみにコマンドを

```bash
npm run gulp
```

にしておけば、執筆中はコンパイルを自動で監視して変更があれば勝手に縦書きにコンバートしてくれたりもする。

私の環境ではこのあとはPythonで形態素解析にかけて校正ツールや人工無脳タイトルジェネレーターなんかを自前で作っているが、精度はお察しなので今後このままgulpでepub出力までやってみるつもり。乞うご期待。

いっぽうロシアはInDesignを使った。

### 追記

+ 2016/10/14 かぎかっこから始まる行の字下げを行わないようにしました。
メモ : コンパイルとビルドについて

自分用メモ。
もし間違っている部分があれば、コメントで教えてください。
参考：[コンパイルとビルドって何が違うの](http://itpro.nikkeibp.co.jp/members/NBY/techsquare/20021008/1/?ST=develop&rt=nocnt)

#前提
コンピューター(OS)はプログラム言語(c、C++、C#、Java、Python、
Perl、PHP、Ruby、JavaScript 他)をそのままの状態で理解することができない。
そのため、コンピューター(OS)が理解できる「機械語」に翻訳する必要がある。

#コンパイルとは
>「プログラム言語」で書かれたソースコードを
コンピュータが理解できる「機械語」に**翻訳**すること。
翻訳するプログラムのことをコンパイラと呼ぶ。


→コンパイルはソースコードを機械語に**翻訳**し、オブジェクトコードを生成する。
　生成したオブジェクトコードから実行可能なプログラムの生成(リンク)は**行わない**。

【オブジェクトコード】
人間の書いたソースコードを、コンピュータが理解できる機械語に変換したコードのこと。
それ自体が直ちに実行可能なわけではない。

#ビルドとは
>全てのファイルのソースコードのコンパイルやライブラリのリンクなどを行い、
最終的な実行可能ファイルを作成すること。

→ コンパイルして更にライブラリとの**リンク**も行う。
　アプリケーション全体を作り上げる操作。

【リンク】
複数のファイルをまとめて、一つの**実行可能な形態**にまとめあげる作業のこと。
関連付け。
Gibbs samplingのコードを書いてみた

ほぼ同等の内容（そして説明も簡潔！）を記載している[【M-H法】Python で MCMC を書いてみた【Gibbs-Sampler】](http://www.fisproject.jp/2015/12/mcmc-in-python/)があるにも関わらず、Gibbs samplingのサンプルコードを書いてみました。
（限りなく、車輪の再発明感満載ですけども（涙））

## 何故公開？
冒頭に公開されているpythonコードがありますが、何故公開？
兎にも角にも話がややこしいMCMCなので、初学者向けに「取り敢えず動くコード」があると考えの足しになるかなー、と恩着せがましい思ったことがキッカケです。

ですので、「書いてみました」というよりかは、自分で書いたコードの量が意外に短く済んだので、「何だかよく分からんが、結局何なんだ！」というフラストレーションをお持ちの方の少しでも足しになれば、、、

## MCMCとは？
こちらも先人の[MCMCについて整理してみた。](http://qiita.com/shogiai/items/bab2b915df2b8dd6f6f2)からどうぞ。

## 今回生成する分布
2次元正規分布ですねー：
$$
p(x,y)=\frac{1}{Z}\exp\big(-\frac{x^2-2bxy+y^2}{2}\big),
Z=\frac{2\pi}{\sqrt{1-b^2}}
$$
下記の`python`コード内で使用する変数に合わせました。$Z$は正規化定数。

## pythonコード
```py
## 準備
import seaborn as sns
import numpy as np
from scipy.stats import norm

## 2次元正規分布の相関を決める定数
b = 0.8
## サンプルサイズの決定
N = 10000

## sampling出来たものを入れとくリスト
x = []
y = []

## 初期点はこんな感じ
x_init = 3.0
y_init = 9.0

## 2次元正規分布に従う乱数発生。
## for文のelse以降が、俗に言う「カクカク」動くところ
for i in range(N):
    if i==0:
        x.append(x_init) ##初期点(x座標)
        y.append(y_init) ##初期点(y座標)
    else:
        x.append(norm(loc=y[i-1]*b, scale=1.0).rvs(size=1.0)[0]) #y座標を固定し、x座標をN(中心点=固定したy座標,1)から選択
        y.append(norm(loc=x[i]*b, scale=1.0).rvs(size=1.0)[0]) #x座標を固定し、x座標をN(中心点=固定したx座標,1)から選択

%matplotlib inline ##Jupyter Notebookで描画したい場合はこのオマジナイ！
sns.jointplot(np.array(x),np.array(y))
```
![Unknown.png](https://qiita-image-store.s3.amazonaws.com/0/80539/44814a87-079e-8e6a-a11d-8d4f4a780faf.png)


### 初期値関連でひとこと
初期値を変えても、そのうち定常分布になるよー、という文脈なので、「定常分布」だけ欲しい場合は初期値周辺の少し経った辺りのサンプリングを切ってしまうことも考慮ポイントですが、
今回は「兎も角、シンプルなコードを！」をモットーにしましたw

## Reference
- [MCMC講義（伊庭幸人） 難易度★★](https://www.youtube.com/watch?v=-H28H1unn0M)：MCMCを本当に平易なところから解説されている動画です。
- [【統計学】マルコフ連鎖モンテカルロ法(MCMC)によるサンプリングをアニメーションで解説してみる。](http://qiita.com/kenmatsu4/items/55e78cc7a5ae2756f9da):同じ分布を丁寧にアニメーションまで付加してらっしゃいます。
pandasの基本操作

# pandasについて
pandasはnumpyを基にしたデータ操作なので，numpyの操作がそのまま使えるので便利．ただ，馴れるまで行・列の取り出した方法が分かりにくい．まだまだ不馴れなので，記しておく．

# DataFrameとSeries
pandasにはDataFrameとSeriesの2種類のデータ形式がある．前者は二次元データ，後者は一次元データである．基本的に，Seriesは使うことがあまり無いので，DataFrameを中心に説明する．DataFrameから一つのcolumnを指定して取り出した場合，それはSeries型となる．

```python
# DataFrame
   foo  bar
a    0    1
b    2    3
c    4    5

# Series
a    0
b    2
c    4
```

# DataFrameの操作
## indexとcolumn
DataFrameには，要素の位置情報として，n行目m列目といったnumpyのような要素番号と，indexとcolumnによるユーザー定義の要素指定が可能である．
特に指定しなければ，番号が割り当てられるが，そのような使い方ではnumpyと変わらないので，実用上は使われないような．個人的には，indexは番号で良いかという気もする．

## indexとcolumnsの指定
indexとcolumnsを指定する場合は以下のようにすればよい．

```python
df.columns = ['foo', 'bar']
df.index = ['a', 'b', 'c']
```

また，DataFrameのindexやcolumns名を確認する場合は以下のように．

```python
df.columns
df.index
df.info() # columns, index, memory usage
```

## 最もシンプルな列の抽出
DataFrameでは，```__getitem__```の取り方での指定は，columnsの指定である．また，列番号でも取り出せるが，その場合は単一でもリスト型で指定する必要がある．ただ，この方法ではindexの行番号(index)の指定は出来ない．
Seriesの場合は，```__getitem__```でindex指定となる．columnsが一つしかないから自然だが．

```python
df['foo'] or df[[0]]  # designate single column
df[['foo', 'bar']] or df[[0, 1]] # designate multi columns
```

## より詳細な抽出(ix, iloc, loc)
DataFrame上の要素の位置情報として，行列の要素番号とユーザー定義の名前があると上述した．どちらで取り出しているのかを明示するために，ix，iloc，locの3種類がある．
ilocは番号の指定のみに対応，locは名前のみ，ixは両方で指定可能である．上の例を取れると，[0,0]を取りたい場合は，以下のように書ける．

```python
df.ix[[0], [0]]
df.ix[[0], ['foo']]
df.ix[['a'], ['foo']]
df.ix[['a'], [0]]
df.iloc[[0], [0]]
df.loc[['a'], ['foo']]
```
因みに，複数のインデックスを指定する場合は以下のようにすれば良い．

```python
df.ix[:, [0]]   # 全て
df.ix[1:5, [0]] # 範囲指定
df.ix[:]        # indexのみの指定
```
## 指定条件からの行・列の抽出
### 行の抽出
指定列の中からある条件を満たす行を抽出する方法。その列のすべての列が出力される。

``` python
print foo.loc[foo['bar'] == condition]
```

### 列の抽出
間接的な方法で、条件を満たさない要素をNaNにして、続いてNaNを含む列を削除する。

``` python
foo = foo[foo == 1] # 条件を満たさない要素はすべてNaNになる。
foo = foo.dropna(axis=1)
```

## イテレータ
pd.DataFrameの各列に対してイテレートする場合。

```python
for index, rows in df.iterrows():
    print index, rows # rows: pd.DataFrameとなっている。
```

## pd.DataFrameを作成・編集する．

```python
# 器だけ作成する場合
foo = pd.DataFrame(columns=['bar', 'baz'])

foo = pd.DataFrame({'bar': [0, 1, 2],
                    'baz': [3, 4, 5]}
                    index=['a', 'b', 'c'])
# foo
    bar  baz
a    0    3
b    1    4
c    2    5
```
## 列を追加する
列を新たに追加する方が行を追加するよりも簡単．

``` python
foo['qux'] = [6, 7, 8]
# foo
    bar  baz  qux
a    0    3    6
b    1    4    7
c    2    5    8
```

## 行を追加する

``` python
foo = foo.append(pd.DataFrame({'bar': [6, 7], 'baz': [8, 9]}, index=['d', 'e']))
# foo
# indexを修正したければ自分で指定する必要がある。
    bar  baz
a    0    3
b    1    4
c    2    5
d    6    7
e    8    9
```

## 行および列を削除する。

``` python
foo.drop('e')
foo.drop('bar', axis=1) # 列を削除する。
del foo['bar'] # 列を削除する。(pythonのdelを利用している。)
```


参考URL
http://stackoverflow.com/questions/17071871/select-rows-from-a-dataframe-based-on-values-in-a-column-in-pandas


referenced URL:
http://sinhrks.hatenablog.com/entry/2014/11/12/233216
【Python】OpenCVでWebカメラのフレームサイズ、FPS設定

必要になるたび調べなおしているシリーズの一つ。
OpenCVを用いてWebカメラを扱う際に、フレームサイズとかFPSを設定する方法です。
※Windows向けの場合「cv2.CAP_MSMF」を指定してVideoCapture()を初期化しないと60fpsにならない

```py
cap = cv2.VideoCapture(0, cv2.CAP_MSMF)
cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
cap.set(cv2.CAP_PROP_FPS, 60)           # カメラFPSを60FPSに設定
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) # カメラ画像の横幅を1280に設定
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720) # カメラ画像の縦幅を720に設定

print cap.get(cv2.CAP_PROP_FPS)
print cap.get(cv2.CAP_PROP_FRAME_WIDTH)
print cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
```

なぜまた調べたかというと、USB2.0系Webカメラ界のエース c920rの後継機
ロジクールのc922を買ってしまったからです。
[ロジクール C922](https://www.amazon.co.jp/Logicool-%E3%83%AD%E3%82%B8%E3%82%AF%E3%83%BC%E3%83%AB-C922-%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%9F%E3%83%B3%E3%82%B0-%E3%82%A6%E3%82%A7%E3%83%96%E3%82%AB%E3%83%A0/dp/B01LYTKPDT "ロジクール C922")


ぶっちゃけ、c920rとほぼほぼ性能に差はありませんが、
720p(60fps)と言う表記に惹かれ購入。
USB3.0系の産業用カメラならまだしも、市販機で60fpsを謳っているWebカメラは珍しい。

以上。
配列要素数の宣言　Javaの問題をTypeScriptにしてみる　4-3

次の配列の型宣言の中からコンパイルエラーにならないものを選びなさい

A.int[3] a;
B.int b[2];
C.int[2] c[];
D.int d[3][];
E.A〜Dまで、全てコンパイルエラー
F.A〜Dまで、全てコンパイルエラーにならない

答えは、E
型宣言では要素数は指定できないためエラーになります。
これを書くのであれば、
A. int[] a = new int[3];
B.int b[] = new int[2];
C.int[] c[] = new int[2][];
D.int d[][] = new int [3][];
このように書くということになります。

この問題をTypeScriptで書くと

A.var a:number[3];
B.var b:number[2];
C.var c:number[2][];
D.var d:number[3][];
E.A〜Dまで、全てコンパイルエラー
F.A〜Dまで、全てコンパイルエラーにならない

こちらもEで全てコンパイルエラーです。
TypeScript以前にJavaScriptでは、配列は全てListになり可変です。
逆を言うと配列の要素数を明示的に決めることはできません。
golang + Docker + BigQuery の例

BigQuery のサービスを golang から扱うコードを書き、それを docker　で実行することを試してみました。

https://github.com/katoy/golang-docker-bigquery

実行例：
![docker.gif](https://qiita-image-store.s3.amazonaws.com/0/14958/8de90439-acc3-7e5e-60f5-0c38e2b4e322.gif)

ここでは、２つのことを行っています。
1. BigQiuery の publicdata:samples にあるテーブルの一覧を表示する。
2. publicdata:samples.shakespeare へ query を１つ発行して、result を表示する。
Google Fonts


## Google Fonts

https://fonts.google.com/

[Google Fontsの日本語フォント「Noto Fonts」の使い方](http://oxynotes.com/?p=10293)
↑この記事で基本的には事足りる

デモ：http://codepen.io/mo4_9/pen/KgZEoO

```css:style.scss
@import url(http://fonts.googleapis.com/earlyaccess/notosansjp.css);

$list: 100, 300, 400, 500, 700, 900;

@each $i in $list{
  .font-jp#{$i}{
    font-family: 'Noto Sans JP', sans-serif;
    font-weight: $i;
  }
}
```

こんな感じで設定してあげると、`.font-jp100`という具合にスタイルを当てられる

> 参考
[商用利用可能！高品質なオススメ日本語Webフォント8選（無料フォント多数）](https://ics.media/entry/13498)


## サブセット

サブセットつくらないとならない時は以下を参照。

https://developer.mozilla.org/ja/docs/Web/CSS/@font-face
[日本語Webフォントの流行の最適化「NotoSans」「サブセット化」](http://qiita.com/tomonari-t/items/aa962786469640df415d)

[Webfont Generator](https://www.fontsquirrel.com/tools/webfont-generator)

ひらがな、カタカナ、英字
http://tagnoheya.com/charlist/charlist2.html
こちらを全部コピペでいいかも
http://2dgames.jp/wp-content/uploads/2013/09/moji_list.txt


[デザイン性とSEO効果を兼ね備えたWebフォントを使ってみた【基本知識と使い方まとめ】](http://migo-media.com/web-font/)
processingで音に反応して図形を描画してみる


音の大きさによって図形を描画してみる


##minimのインポート

```
import ddf.minim.*;
Minim minim;
```



##初期値のセットと図形描画部分
```
AudioInput in;
float volumeIn;
float d = 0;
float sa;
float easing = 0.1;
float center_x = 0;
float center_y = 0;

float color_r = 50;
float color_g = random(255);
float color_b = 255;

void setup() {
  fullScreen();
  minim = new Minim(this);
  in = minim.getLineIn(Minim.MONO, 512);
  
  center_x = random(width);
  center_y = random(height);
}

float[] ds = new float[1024];
float[] cxs = new float[1024];
float[] cys = new float[1024];
float[] rs = new float[1024];
float[] gs = new float[1024];
float[] bs = new float[1024];
int ds_length = 0;

float dd = 0;
float pre_d = 0;
float pre_dd = 0;

boolean isChangable = false;
int defaultLeapCount = 50;
int leapCount = defaultLeapCount;

void draw() {
  background(#000000);
  volumeIn = map(in.left.level(), 0, 0.05, 0, width);
  sa = volumeIn - d;
  if(abs(sa) > 0.5){
    d = d + sa * easing; 
  }
  
  dd = d - pre_d;
  
  if (dd * pre_dd < 0) {
    ds[ds_length] = d;
    cxs[ds_length] = center_x;
    cys[ds_length] = center_y;
    rs[ds_length] = color_r;
    gs[ds_length] = color_g;
    bs[ds_length] = color_b;
    ds_length += 1;
  }
  
  pre_d = d;
  pre_dd = dd;
  
  for(int i = 0; i < ds_length; i++) {
    noFill();
    stroke(rs[i], gs[i], bs[i]);
    strokeWeight(5);
    ellipse(cxs[i], cys[i], ds[i], ds[i]);
  }
  
  noFill();
  stroke(color_r, color_g, color_b);
  strokeWeight(5);
  ellipse(center_x, center_y, d, d);
  
  if (d < 200) {
    leapCount--;
    if (isChangable || leapCount < 0) {
      center_x = random(width);
      center_y = random(height);
      color_r = 25;
      color_g = random(255);
      color_b = 255;
      isChangable = false;
      leapCount = defaultLeapCount;
    }
  } else {
    isChangable = true;
  }
}
```


下記リンクにソースがあるのでよければ何かのベースに使ってください

> *File DL:* \[github]\(https://github.com/shgakdhd/sound-visualizer)
オブジェクトを戻り値で返す関数のコンパイル結果について

# コンパイル結果からの推測

* `X a()`は`void a(X* x)`と扱われる
* `X x = a();`のように関数の戻り値でオブジェクトを初期化する場合，`x`のコンストラクターは`a()`内で呼び出される

ただし

* 多分，常にこうなるわけではない
* 多分，最適化オプションにも依存するだろう

C言語でも同様の変換が行われるようです（構造体のサイズなどにも依存するようです）．長い間使っていましたが，まだまだ知らないことはありそうです．

2016-10-15追記：[オブジェクトを戻り値で返す関数のコストとClang/GCCの-fno-elide-constructorsの効果について](http://qiita.com/MasayukiNagamachi/items/604bb296b24f7ce5cdab)

# 詳細

以下のようなコードを

```cpp:test.cc
#ifdef LOGGING
#include <iostream>
#define LOG(str) (std::cout << (str) << std::endl)
#else
#define LOG(str) ((void)0)
#endif

namespace {

class X {
public:
  X() {
    LOG("X()");
  }

  X(const X& x) {
    LOG("X(x)");
  }

  ~X() {
    LOG("~X()");
  }

  X& operator=(const X& x) {
    LOG("=");
    return *this;
  }
};

X a() {
  return X();
}

}

int main() {
  X x = a();
  return 0;
}
```

コンパイルし，実行すると

```shell-session
$ clang++ -o test -D LOGGING test.cc
$ ./test
```

以下のようなテキストがコンソールに出力されます．

```shell-session
X()
~X()
```

素直に考えて，

```shell-session
X()   # a()内で呼び出されるコンストラクター
X(x)  # 変数xに対するコピーコンストラクター
~X()  # a()の戻り値に対するデストラクター
~X()  # 変数xに対するデストラクター
```

と出力されと思われるかもしませんが，実際はそうではありません．

本当ならC++の仕様書を確認すべきところですが，私は仕様書を持っていないため（無料で読める過去のドラフト版のようなものが存在することは知っていますが），LLVM IRを確認することにします．

```shell-session
$ clang++ -S -emit-llvm test.cc  # 最適化オプションは付けないように
```

以下はtest.llからの抜粋．

```llvm:test.ll
; Function Attrs: norecurse uwtable
define i32 @main() #0 {
  %1 = alloca i32, align 4
  %x = alloca %"class.(anonymous namespace)::X", align 1
  store i32 0, i32* %1, align 4
  call void @_ZN12_GLOBAL__N_11aEv(%"class.(anonymous namespace)::X"* sret %x)
  store i32 0, i32* %1, align 4
  call void @_ZN12_GLOBAL__N_11XD2Ev(%"class.(anonymous namespace)::X"* %x)
  %2 = load i32, i32* %1, align 4
  ret i32 %2
}

; Function Attrs: uwtable
define internal void @_ZN12_GLOBAL__N_11aEv(%"class.(anonymous namespace)::X"* noalias sret %agg.result) #1 {
  call void @_ZN12_GLOBAL__N_11XC2Ev(%"class.(anonymous namespace)::X"* %agg.result)
  ret void
}
```

どうやら，`void a(X* x)`となるようです．そして，この書き換えられた`a()`にてコンストラクターが呼び出されるようです．

GCCでコンパイルしても同じ出力結果になることや，main()を以下のように書き換えても

```cpp
int main() {
  X x;
  x = a();
  return 0;
}
```

`void a(X* x)`としてLLVM IRが出力されることから，オブジェクトを戻り値で返す関数のコンパイル結果に関して，C++仕様書に何らかの記述があるのかもしれません．

# オブジェクトのポインターを引数で受け取るより，オブジェクトを戻り値で返すほうが効率がよい？

上記の結果から考えて，以下のようなコードを書くよりは，

```cpp
void a(X* x) {
  x = X();
}

int main() {
  X x;
  a(&x);
  return 0;
}
```

最初の例のように，関数の戻り値でオブジェクトを返すほうが効率のよいコードが生成されるようです．実際に実行結果とLLVM IRも確認しましたが，この推測は正しいようです．

ただ，とても簡単なコードで確認しただけなので，複雑なコードや最適化オプションによっては，違った結論になる可能性は十分にあると思われます．
Javaで日付・時間をintで取得する

Javaで日付・時間をintで取得する機会があるたびに何だっけ？となるので簡単なことですが、まとめておきます。

        int second = Calendar.getInstance().get(Calendar.SECOND);//秒
        int minute = Calendar.getInstance().get(Calendar.MINUTE);//分
        int hour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);//時
        int day = Calendar.getInstance().get(Calendar.DAY_OF_MONTH);//日
        int month = Calendar.getInstance().get(Calendar.MONTH)+1;//月
        int year = Calendar.getInstance().get(Calendar.YEAR);//年

月に１を足しているのは、なぜか月は０から始まるからです。
また、Java８が使える環境なら何やらもっといい方法が追加されたらしい、前にそっちも一度使ったけど忘れた上に、現場か8に対応していることがまだ少ないのでこっち使ってます。
Docker を使って Swagger の編集環境を構築する


API ドキュメントを作成するには [Swagger](http://swagger.io/) が便利です。
RAML や API Blueprint もありますが、周辺ツールの充実度が Swagger を使う利点だと思います。
ざっくり３つのツールがあります。

- Swagger UI : API ドキュメント表示。サンプルリクエストも発行できる。
- Swagger Editor : API 定義ファイル編集。プレビューできる。
- Swagger Codegen : 複数のプログラミング言語の実装を生成。クライアントとサーバーの両方ある。

UI と Editor はオンライン版で十分かもしれませんが、オフライン状態で集中的にドキュメントを書きたいこともあるかもしれません。
そんな時のために、UI と Editor の環境を Docker Compose を使って構築します。

localhost に対して、以下の３つのパスでアクセスできるようにします。

| パス | 内容 |
|-----|------|
| */* | Swagger Editor |
| */swagger-ui* | Swagger UI |
| */swagger.yml* | API定義ファイル |

## 流れ

1. Swagger UI の HTML が入ったアーカイブを取得する
2. Docker Compose の設定ファイルを書く
3. Nginx の設定ファイルを書く
4. 起動して API 定義ファイルを編集する

ドキュメント関係のフォルダとして、 *docs* の中に全部入れる想定とします。

## 1. Swagger UI のアーカイブ取得

まず、アーカイブをダウンロードします。ZIP を展開すると、中に *dist/* フォルダがあります。
これはそのままホスティング可能なビューアーになります。
`index.html` を開くとすぐに使えますが、CORS の都合で読み取れるファイルの制限があります。

```bash
$ curl -LO https://github.com/swagger-api/swagger-ui/archive/v2.2.5.zip
$ unzip swagger-ui-2.2.5.zip
$ cp -r swagger-ui-2.2.5/dist docs/swagger-ui
$ rm -fr swagger-ui-2.2.5*
```

## 2. Docker Compose の設定ファイル

以下のような設定ファイル (`docker-compose.yml`) を用意します。

```yml:docker-compose.yml
version: '2'
services:
  web:
    image: nginx:latest
    ports:
      - "8000:80"
    links:
      - swagger_editor:swagger_editor
    depends_on:
      - swagger_editor
    volumes:
      - ./docs/swagger-editor.conf:/etc/nginx/conf.d/default.conf:ro
      - ./docs/swagger.yml:/usr/share/nginx/html/swagger.yml:ro
      - ./docs/swagger-ui:/usr/share/nginx/html/swagger-ui:ro
  swagger_editor:
    image: swaggerapi/swagger-editor:latest
```

Swagger Editor は Docker イメージがありますので、 [swaggerapi/swagger-editor](https://hub.docker.com/r/swaggerapi/swagger-editor/)を使います。
それにリンクするように Nginx のコンテナを立ち上げて、必要なファイルをマウントさせます。

ここでは 8000 番ポートでアクセスできるように設定しています。
環境に応じてポート番号は調整しましょう。

## 3. Nginx の設定ファイル

Nginx の設定ファイルを `swagger-editor.conf` として用意します。
パスは以下の３つとします。

| パス | 内容 |
|-----|------|
| */* | Swagger Editor |
| */swagger-ui* | Swagger UI |
| */swagger.yml* | API定義ファイル |


```conf:swagger-editor.conf
server {
    listen       80;
    server_name  localhost;

    location / {
        proxy_pass    http://swagger_editor:8080;
    }

    location /swagger.yml {
        root   /usr/share/nginx/html;
        add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Allow-Methods "GET, POST, PUT, PATCH, DELETE, OPTIONS";
        add_header Access-Control-Allow-Headers "Content-Type, Origin, Authorization, Accept";
        add_header Access-Control-Allow-Credentials true;
    }

    location /swagger-ui {
        root   /usr/share/nginx/html;
    }
}
```

内部的なことは Docker Compose の設定と合わせましょう。
ここでは、Swagger Editor のホスト名は、Docker のコンテナ名になります。

また、 YAML は CORS に対応させておくと、違う何かに使いたい時も便利でしょう。

## 4. 起動

`docker-compose` コマンドで起動します。
`swagger.yml` がないと起動できませんので、編集すべきものを配置してから実行します。

```bash
$ docker-compose up -d web
```

ホストマシンに開放したポート番号でアクセスすると、エディタが表示されるはずです。
メニューから URL を指定して localhost の API 定義ファイルを指定します。
ビューアーを表示する場合は手動で URL を変更します。
何かが変、あるいは何も表示されない場合は `docker-compose` の `logs` コマンドで確認しましょう。

なお、エディタから URL を指定して編集を開始しても元ファイル自体が編集されるわけではありません。
ダウンロードして元ファイルを上書きしてください。（ここがちょっと不便）
laravel 5.3 パスワードリセットメールをカスタマイズする

# Laravel5.3で自動生成されるメールをカスタマイズする

## 目的

* artisan make:authで生成されるメールは英語になる
* パスワードリセット時に送信されるパスワードを自前で用意したい

## 手順

* vendor/laravel/framework/src/Illuminate/Notifications/resources/views/email.blade.phpを修正する

## 問題

* 手順的には上記だけで問題ないのですが、vendor以下はデフォルトだとgitignoreで無視されているのでデプロイ時に大変困る。(commitできない
    * vendorもcommitするのはphp artisan install時に困りそう
    * いろいろ継承なりoverrideするなりでカスタムするのかなと思ったけど依存関係が激しくてかなり追っていかないといけない

## 結論

* vendor以下のファイルを修正したい場合は直接編集せず、artisan:publishコマンドを実行してテンプレートファイルをコピーする

```bash
$ php artisan vendor:publish
```

すると resources/views/vendor 以下にテンプレートファイルがコピーされる

* パスワードリセットメールの場合
    * resources/views/vendor/notifications/email.blade.php を修正すれば反映される


多分常識なんだろうけどlaravel触ることは当分ないので備忘録
VisualBasic .net 15 の新機能

#環境
> VisualStudio 2017.1
  Visual Basic Compiler 2.1.0.61520
  Windows 10 Creators Update

#Binary Literals （バイナリ表記のリテラル）
1と0(2進数)を用いて値が表せるになりました．

```vbnet
Dim i As Integer = &B1101
Console.WriteLine(i) ' → 13
```

#Digit Separators　（桁区切り）
'`_`' をもちいて桁区切りができるようになりました．

```vbnet
Dim d As Integer = &B11___0_1
Console.WriteLine(i)
```

#Tuples（タプルの言語サポート強化）
この機能は，`System.Tuple`ではなくて，`System.ValueTuple`のみに使えるものです．
ターゲットフレームワークが.Net 4.7であれば，何も作業する必要はありませんが，それ以前のバージョンでは，Nugetから System.ValueTuple を導入する必要があります．

![クリップボード01.jpg](https://qiita-image-store.s3.amazonaws.com/0/56125/b38a4f13-dcec-99b3-6b62-3b215f045eec.jpeg)
 
具体的には，以下のように書けます.

```vbnet
Module Module1
    Sub Main()
        Dim point As (x As Integer, y As Integer) = GetPoint()
        Console.WriteLine(point.x)
        Console.WriteLine(point.Item1) '旧来のメンバ名でもおｋ
    End Sub
    Function GetPoint() As (x As Integer, y As Integer)
        Return (12, 20)
    End Function
End Module
```
【初心者必見】Mavenまとめ

参考サイト：http://www.techscore.com/tech/Java/ApacheJakarta/Maven/index/

## Mavenとは
`Maven`はプロジェクト管理ツールです。プロジェクトに関する色々な情報を`POM`に集約し、`POM`の情報に基づきプロジェクト全体を管理します。
`Maven`を使用すると、プロジェクトのライフサイクルに含まれるコンパイルやテストなどの各作業をコマンド一つで行うことができます。

![maven.png](https://qiita-image-store.s3.amazonaws.com/0/136533/4782fbba-4b97-c382-92d5-8e6eb3e66a87.png "maven.png")

* リモートリポジトリとローカルリポジトリは、どちらもプラグインやライブラリが置かれる場所です。
* `Maven`は必要なプラグインやライブラリをリモートリポジトリからダウンロードし、それをローカルリポジトリに保存します。
* 各プロジェクトはローカルリポジトリに保存されているライブラリを参照します。
* ローカル環境にある全てのプロジェクトの間でライブラリを共有することができます。
* リモートリポジトリは独自のものを用意することもできます。  
例えば、社内用のリポジトリを用意して、社内で作成したプロジェクトはそこに公開するという使い方ができます。

## POMについて
`pom.xml`はプロジェクトに関する情報を持つファイルです。 
#### project 要素以下の各要素が持つ意味

|要素| 内容|
|:---|:---|
| modelVersion | POMのバージョン|
| groupId | プロジェクトを一意に識別する名前。プロジェクトのルートパッケージ名を指定するのが一般的です。|
| artifactId | プロジェクトの成果物の名前。 作成する JAR や WAR, EAR ファイルなどの名前に使用されます。|
| packaging | 作成する成果物のパッケージング・タイプ。 jar (デフォルト), war, ear などがあります。|
| version | プロジェクトのバージョン。|
| name | プロジェクトの表示名。 ドキュメントを作成するときなどに使用されます。|
| url | プロジェクトのサイトの URL。 ドキュメントを作成するときなどに使用されます。|
| dependencies | プロジェクトが依存するライブラリの情報。|

## コンパイル
```
mvn compile
```
`src/main/java/`配下のソースファイルのコンパイルが行われます。
コンパイルにより作成されたクラスファイルは`target/classes`ディレクトリに出力されます。

## テスト
```
mvn test
```

デフォルトでは、以下のパターンにマッチするファイルがテストとして実行されます。

* `**/Test*.java`
* `**/*Test.java`
* `**/*TestCase.java`

 
また、以下のファイルはデフォルトで除外されます

* `**/Abstract*Test.java`
* `**/Abstract*TestCase.java`
* `**/*$*`

## パッケージング
```
mvn package
```
成功すると`target`ディレクトリに`**.jar`のようなファイルが作成されます。
作成されるファイルの名前は、`pom.xml`に記述されている `artifactId`と`version`から決定されます。
拡張子は,`pom.xml`に記述されている`packaging`から決定されます。

## ローカルリポジトリへのインストール
```
mvn install
```
作成したパッケージングファイルはローカルリポジトリにインストールすることで、ローカルにある他のプロジェクトから参照することができるようになります。

## リモートリポジトリへのデプロイ
リモートリポジトリに配備するには、事前にリモートリポジトリの情報を pom.xml に記述しておく必要があります。
リモートリポジトリの情報は、`distributionManagement` 要素の入れ子として`repository`要素を追加します。 `repository`の子要素には`id (リポジトリの識別子)`, `name (リポジトリの名前)`, `url (リポジトリの場所を示す URL)`などが指定可能です。

#### 設定例
```
<distributionManagement>
    <repository>
      <id>deploy-repository</id>
      <name>repository-name</name>
      <url>http://hoge/deployRepository</url>
    </repository>
</distributionManagement>
```
作成したパッケージングファイルをリモートリポジトリに配備するには、次のコマンドを実行します

```
mvn deploy
```
素人の言語処理100本ノック:22


[言語処理100本ノック 2015](http://www.cl.ecei.tohoku.ac.jp/nlp100/)の挑戦記録です。環境はUbuntu 16.04 LTS ＋ Python 3.5.2 \:\: Anaconda 4.1.1 (64-bit)です。過去のノックの一覧は[こちら](http://qiita.com/segavvy/items/fb50ba8097d59475f760)からどうぞ。

## 第3章: 正規表現
>Wikipediaの記事を以下のフォーマットで書き出したファイルjawiki-country.json.gzがある．
>・1行に1記事の情報がJSON形式で格納される
>・各行には記事名が"title"キーに，記事本文が"text"キーの辞書オブジェクトに格納され，そのオブジェクトがJSON形式で書き出される
>・ファイル全体はgzipで圧縮される
>以下の処理を行うプログラムを作成せよ．

###22. カテゴリ名の抽出
>記事のカテゴリ名を（行単位ではなく名前で）抽出せよ．

####出来上がったコード：

```python:main.py
# coding: utf-8
import gzip
import json
import re
fname = 'jawiki-country.json.gz'


def extract_UK():
	'''イギリスに関する記事本文を取得

	戻り値：
	イギリスの記事本文
	'''

	with gzip.open(fname, 'rt') as data_file:
		for line in data_file:
			data_json = json.loads(line)
			if data_json['title'] == 'イギリス':
				return data_json['text']

	raise ValueError('イギリスの記事が見つからない')


# 正規表現のコンパイル
pattern = re.compile(r'''
	^		# 行頭
	.*		# 任意の文字0文字以上
	\[\[Category:
	(		# キャプチャ対象のグループ開始
	.*?		# 任意の文字0文字以上、非貪欲マッチ（貪欲にすると後半の'|'で始まる装飾を巻き込んでしまう）
	)		# グループ終了
	(?:		# キャプチャ対象外のグループ開始
	\|.*	# '|'に続く0文字以上
	)?		# グループ終了、0か1回の出現
	\]\]
	.*		# 任意の文字0文字以上
	$		# 行末
	''', re.MULTILINE + re.VERBOSE)

# 抽出
result = pattern.findall(extract_UK())

# 結果表示
for line in result:
	print(line)
```

####実行結果：

```console:端末
イギリス
英連邦王国
G8加盟国
欧州連合加盟国
海洋国家
君主国
島国
1801年に設立された州・地域
```

###貪欲マッチ
今回苦労したのは、`[[Category:イギリス|*]]`の`|*`の部分や、`[[Category:島国|くれいとふりてん]]`の`|くれいとふりてん`をどうやって取り除くかでした。最初は前半のキャプチャしたい部分を`(.*)`という形の貪欲（どんよく）マッチにしていましたが、うまくいきません。

取り除きたい部分は`(\|.*)`で良さそうなのですが、この`|`で始まる部分は存在しないこともあるので、このブロックには0回か1回を示す`?`を付けて`(\|.*)?`としました。しかしこれだと、前半の`(.*)`の方に`|`で始まる部分も該当するため、前半が全部持って行ってしまいます。そこでこの前半の部分を非貪欲マッチ`(.*?)`にすることで、解決しました。

###キャプチャ対象外のグループ
取り除きたい部分はキャプチャする必要がないので、`(...)`ではなく`(?:...)`としています。

###もう１つ考えたコード
`[[Category:...]]`を抽出してから`|`で始まる部分を取り除くという考え方ではなく、初めから`]]`か`|`が出てくるまでをキャプチャする、という形も考えました。

```python:正規表現コンパイル部分その2(main2.py)
# 正規表現のコンパイル その2
pattern = re.compile(r'''
	^		# 行頭
	.*		# 任意の文字0文字以上
	\[\[Category:
	(.*?)	# キャプチャ対象、任意の文字0文字以上、非貪欲マッチ
	(?:\]\]|\|)	# キャプチャ対象外、']]'または'|'
	.*		# 任意の文字0文字以上
	$		# 行末
	''', re.MULTILINE + re.VERBOSE)
```

こちらでも同じ結果になります。
ただ、どちらのコードも何かイマイチ。もう少しスマートに書く方法がありそうな気はします。

　
23本目のノックは以上です。誤りなどありましたら、ご指摘いただけますと幸いです。
<hr>

*実行結果には、[100本ノックで用いるコーパス・データ](http://www.cl.ecei.tohoku.ac.jp/nlp100/#data)で配布されているデータの一部が含まれます。この第3章で用いているデータのライセンスは[クリエイティブ・コモンズ 表示-継承 3.0 非移植](https://creativecommons.org/licenses/by-sa/3.0/legalcode)（[日本語訳](https://creativecommons.org/licenses/by-sa/3.0/deed.ja)）です。*
Windows上でmrubyをビルドし動かしてみる

会社の知り合いの人から「mrubyどうよ？」と訊かれたので、以下のサイトを参考にWindows上でmrubyを使えるようにしてみました。
[Windows にいろんな Ruby をインストール(MatzRuby, IronRuby, JRuby, Topaz, mruby)](http://yohshiy.blog.fc2.com/blog-entry-239.html)

最新のツールを利用したため、一部手順が異なる箇所があったので補足しながら手順を残します。

#Visual Studioのインストール

ビルド環境としてVisual Studioを利用するため、インストールします。

* 公式サイトより、Visual Studio 2015をダウンロードします。
https://www.visualstudio.com/ja/downloads/
有償版でもよいですし、無償利用可能な **Community 2015/Express 2015 for Desktop** でもOKです。
　

* インストーラーを実行し、適宜セットアップしてください。
インストール後、スタートメニューに「開発者コマンドプロンプト for VS2015」があることを確認してください。
![mruby001.png](https://qiita-image-store.s3.amazonaws.com/0/49240/8a00ede8-24b9-89e7-15ed-309dbe528011.png)

#Rubyのインストール

Windows用のRuby環境(RubyInstaller for Windows)をインストールします。

* 公式サイトより、最新版のRubyInstallerをダウンロードします。
http://rubyinstaller.org/downloads/
![mruby002.png](https://qiita-image-store.s3.amazonaws.com/0/49240/4843eb42-e6f6-16a0-b84c-25ba79ea8a91.png)
　

* インストーラーを実行し、セットアップを行います。
インストールオプションで「Ruby の実行ファイルへ環境変数 PATH を設定する」にチェックをしておくと、環境変数 **PATH** へ追加してくれます。

#Bisonのインストール

パーサー(parser)生成プログラムであるBisonをインストールします。

* 公式サイトより、「Complete package, except sources」をダウンロードします。
http://gnuwin32.sourceforge.net/packages/bison.htm
![mruby003.png](https://qiita-image-store.s3.amazonaws.com/0/49240/6469382c-778d-bbc5-7008-bf8cf0edbe41.png)
　

* インストーラーを実行し、セットアップを行います。
インストールパスにスペースが含まれると良くないとのことですので、インストール先を修正しておきます。（今回はCドライブ直下にインストール）
![mruby004.png](https://qiita-image-store.s3.amazonaws.com/0/49240/3c85c5b7-2ee7-201c-a159-53b8f1d19dc4.png)
　

* binまでのパスを、環境変数 **PATH** へ通します。
![mruby005.png](https://qiita-image-store.s3.amazonaws.com/0/49240/d6ab70ad-1931-4a8a-8f2c-dc9026896d0c.png)


#mrubyのビルド

* GitHubからmrubyの最新ソースコードをダウンロードします。
https://github.com/mruby/mruby
![mruby006.png](https://qiita-image-store.s3.amazonaws.com/0/49240/27989270-6eef-22d2-9731-21bcf7545740.png)
　

* ダウンロードしたZIPを解凍し、適宜配置します。
（今回は C:\src\mruby-master へ配置）
![mruby007.png](https://qiita-image-store.s3.amazonaws.com/0/49240/710bc726-2242-a47e-d911-9033f710d1d0.png)
　
* スタートメニューから「開発者コマンドプロンプト for VS2015」を選択して起動します。
![mruby008.png](https://qiita-image-store.s3.amazonaws.com/0/49240/10b159a9-a351-32e6-587d-fbdb49bc2848.png)
　
* カレントディレクトリをソースコード配置先へ切り替え、以下のコマンドを実行します。

```bat
C:\src\mruby-master>ruby .\minirake
```

* 問題なく終わったら、バージョン情報を確認します。

```bat
C:\src\mruby-master>.\bin\mruby.exe --version
mruby 1.2.0 (2015-11-17)

C:\src\mruby-master>
```

#Hello, mruby world!

ついでなので、できたてほやほやのmruby.exeを動かしてみたいと思います。

```ruby:hello.rb
print "Hello, mruby world!\r\n"
```


実行結果

```bat
C:\src\mruby-master>.\bin\mruby.exe C:\src\hello.rb
Hello, mruby world!

C:\src\mruby-master>
```
Xcode8でワイルドカードのプロビジョニングを使って実機実行する

__追記__
Xcode 8.1 では「In-App Purchase」が有効でもワイルドカードが使用できました。

---

Xcode8 でワイルドカードのプロビジョニングを使用して実機実行を行おうとすると下記の様なエラーが。

```
Provisioning profile "XXX" doesn't support the In-App Purchase capability.
```

どうやらワイルドカードのプロビジョニングだと「In-App Purchase」などが使えない為、
上記の様なエラーが発生するみたいです。

仕事の関係上、ワイルドカードが使えないと困るのでどうにかして使える様にします。


## 環境
* macOS Sierra 10.12
* Xcode 8.0


## 対応
1. `TARGET` -> `Build Phases` -> `Link Binary With Libraries` から `StoreKit.framework` を除外。
2. `TARGET` -> `Capabilities` の `In-App Purchase` を `OFF` にする。
3. `TARGET` -> `Build Settings` -> `Other Linker Flags` に `-framework StoreKit` を追加。


## 参考
https://forums.developer.apple.com/thread/63172
【Swift】storyboardを利用しないテンプレート（UITableView、UITableViewCell）

# 概要
PureLayoutのサンプル（UITableView、UITableViewCell） 第2弾です。
[Yahooオークションの検索API](http://developer.yahoo.co.jp/webapi/auctions/auction/v2/search.html)の結果をTableViewに表示しています。
次回はもう少し複雑な画面にチャレンジしてみます。

# 目的
[storyboardを利用しない必要最低限のテンプレート（Swift）](http://qiita.com/menomoto/items/3140ec04b509e4726615) を参照ください。

# メリット （PureLayout vs Storyboard）
[[Swift] storyboardを利用しないテンプレート（基本的なView）](http://qiita.com/menomoto/items/0031c4b430a05f9554f6) を参照ください。

# 対象View
* UITableView
* UITableViewCell

# 結果
![サンプル](http://i.imgur.com/6WWDlLR.png "サンプル")

# github
* https://github.com/menomoto/Sample_PureLayout/tree/master/pureLayoutSample02
* xcode8, swift2.3
* iPhone5,6,6s UI確認OK
Windowsではじめる、あんま怖くないNim①　それっぽいhello world。

#序
PythonとCで書かれた多量のコードを読む必要に迫られ、Pythonっぽい文法に慣れておこう思う今日このごろ。
せっかくなので、Cに近しいPython風シンタックスのNim言語に入門してみようと思った。

Nimって何、という人には、pythonな人が書かれた、以下がお勧めかな。
http://h-miyako.hatenablog.com/entry/2015/01/13/201846

#Windowsで、Nimしてみる。
コンパイル言語の中できわめて簡潔なシンタックスを持つNim、マイナー言語の例にもれず、webではギークな方々が黙々と試している系の記事が目につく。せっかく、"Nim in Action"の出版が(英語だけど)迫り、バージョン1.0も近づいているのに、ガチ勢以外お断りな雰囲気が漂っているのはどうかと思い、ベタな入門記録をwindowsベースで書いてみようとおもった次第。hello worldまで10分ちょっとでたどりつけたよ。

#インストーラには注意。
Nimのダウンロードページに行ってみるとトップにWindows向けバイナリの紹介がある。
http://nim-lang.org/download.html

おっ、と思い、ダウンロードして実行してみると、おなじみのセットアップ画面が立ち上がる。
![nimuinst.PNG](https://qiita-image-store.s3.amazonaws.com/0/16455/72d7088c-de54-3af2-3dca-3cf1bcfae68f.png)

が，このインストーラーにはいくつかはまりどころがあり、無駄な時間を過ごす事になってしまった。回避法を以下に記す。

##①インストールオプションはとりあえず、全部チェック。

Nimは、C言語(等)にコンパイルされる言語。Nimが吐き出すCコードを正しく解釈できるコンパイラを既にインストール済でない限り、Nimコードを実行するためには、Cコンパイラも同時にインストールする必要がある。とりあえずNimをお試ししたい場合には、インストールオプションはすべてチェックしておこう。

![nimcheck.PNG](https://qiita-image-store.s3.amazonaws.com/0/16455/01c389b9-6eb5-dade-a642-012128c7500c.png)
...Aporiaはnim向けエディタ。入門の際にはついでに入れておいてもいいだろう。

##②インストール先を自ら指定する。

おいおい、と突っ込みたくなったところ。
少なくとも日本語版windowsでは、元々の指定パスでは正しくインストールされない模様。
(日本語環境では)インストール先を末尾に"¥"をつけずにインストールしよう。

設定例。
![nim222.PNG](https://qiita-image-store.s3.amazonaws.com/0/16455/28d8ab02-071e-af2a-5c74-648f1b981221.png)


#コンパイルと実行。なかなか良い。

さて、実行してみよう。.nimの拡張子をつけたコードを書いてコンパイルする。
注意点としては、コンパイル先の言語を指定する必要がある事。すなわち、XXX.nimをC言語経由でコンパイルする場合には、"nim c XXX.nim"と書く。

こんな感じ。
![hellonim.PNG](https://qiita-image-store.s3.amazonaws.com/0/16455/78f8387f-87b6-35c2-1cbd-4c0e58197906.png)

コードはこんな感じ。

```nim

import strutils

type Person = object
  name: string
  age: int

proc greet(p: Person) =
  echo "Hi, I'm ", p.name, "," , p.age, " years old."
  echo "私の名前は$1、$2歳です。" % [p.name, (p.age).intToStr]
  
let p = Person(name:"太郎", age:18)
p.greet() # or greet(p)
```

ミニマムの型有り言語といった風の記述がC並みの実行速度を持つ.exeなバイナリに変換される。intToStrでなく、toStringだったらいいのにな、的な小市民的な感想はいったんさておいて、python風な簡潔シンタックス、やはりなかなか良いではないか。


#続く(不定期連載)。

Cも入ってなきゃいけない理由については、"Nim in Action"の第一章の以下の図がわかりやすいね。
![nim-py.PNG](https://qiita-image-store.s3.amazonaws.com/0/16455/2594c51f-5739-866c-16bf-cec3af3d8bf6.png)


Nimのエディタ対応の方も着々と進みつつあるらしく、visual studio codeがいちオシだったりする模様。本格的なマクロ対応など、ガチ勢も興味津々であろうnim言語、バージョン1.0に向け、だんだん怖くなくなっていくはずなので、お試し続けてみようと思う次第。

あとは、Pythonガチな兄貴のどなたかに、python -c-nim的なエコシステム構築に挑んでいただきたいと思う次第。
WindowsでPlayFramework2.5.9をNetBeansでデバッグする

#デバッグできるようになるまで
NetBeans、jdkはインストールされている前提
（Windows8、NetBeans 8.0、jdk1.8.0_05の環境で行いました。）

NetBeansにplaynbというプラグインをインストール。

このプラグインをインストールすると、Play Frameworkのプロジェクトが作成できるようになります。
（他にもplugins.sbtにnbsbt-pluginを追加してやる方法もあるようです。）

Cドライブ直下にtestというプロジェクトを作ったとする。
C:\test

NetBeansにて、メニューの「デバッグ」のから「デバッガのアタッチ」を開き、ホストを「localhost」、ポートに「9999」を入力します。

コマンドプロンプトでtestのフォルダまで移動し、
activator -jvm-debug 9999
続いて
run -Dhttp.port=9999

これでブレークポイントで止まるようになります。
mysqlの中身について調べてみたお話

#背景
以前、アプリのパフォーマンスチューニングを行った際、ふと「あれ、mysqlの内部構造ってどんなんやっけ？」「なんでインデックス貼ると検索が早くなるんやっけ？」と思ったのでさくっと調べてみました。
（大学で習ったようが気がしなくもないですが、まあいいでしょう。

#ストレージエンジンについて
ストレージエンジンとは、データストアに対し実際にデータの読み書きを行う部品です。mysqlでは様々なストレージエンジンを利用することができます。これらはテーブルごとに違うストレージエンジンを割り当てることが可能なため、テーブルの特徴似合わせて適切なストレージエンジンを選択することで効率よく運用していくことができます。

以前のデフォルトストレージエンジンはMyISAMでしたが、MySQL5.5以降ではデフォルトでinnoDBが採用されているようです。

なお、ストレージエンジンはmy.cnfから設定可能です

```
default_storage_engine = InnoDB
```

##MyISAMとinnoDBの違い






###ロックの対象
データの更新の際、MyISAMでは更新対象のテーブル全体をロックします。つまり、次に控えているクエリが同テーブルに対する更新リクエストである時、ロックが解除されるまでクエリは実行されません。一方innoDBでは、更新対象のレコードに対してロックがかかります。故に、次に控えているクエリが同テーブルに対する更新リクエストであっても、違うレコードに対する更新であれば、並列に実行することができます。



###トランザクション
トランザクションはデータ不整合が起きないように、ある処理をひとまとまりとして実行します。よくある例では銀行のATMの話ですね。10万入ってる口座に対し、同時に1万円の引き出しと預け入れを行った時、引き出しの処理中に預け入れの処理が上書きされ、1万引き出したにもかかわらず口座の中は11万になってる！！！みたいなのを防ぐやつです。

MyISAMはこのトランザクションをサポートしていません。なのでロールバックとかコミットとかそういうのは使えません。クエリが実行された時が実際のデータの読み書きのタイミングとなります。一方でinnoDBではトランザクションをサポートしています。安心感ありますね。


###どちらを使えばいいのか
ここまで見た感じだとMyISAMはSELECT文の実行などに向いている感じがしますね。実際MyISAMはシンプル故、実行は高速であるそうです（現在はinnoDBも負けずに高速になってきているようですが）。

しかし、公式でもデフォルトストレージエンジンをMyISAMからinnoDBに移行したこともあり、デファクトスタンダードになってきているのはinnoDBなのでしょうか。
公式でもそのような記述が見られますね。


>ストレージエンジンの使用傾向は、より拡張可能な InnoDB の方へシフトしています。したがって、MySQL 5.5 は、InnoDBをデフォルトのストレージエンジンにするための論理遷移リリースでした。


#ファイル構成
##データ格納場所
my.cnfの中にデータディレクトリのパスが記述されています。

```
[mysqld]
datadir=/var/lib/mysql
```

このディレクトリを見に行くと、データベース毎にディレクトリが作成されています。


##innoDBのファイル構成
###ibdata1
実際のテーブルに保存されるデータやインデックスなどの情報が格納されています。なおこのファイルは容量が足りなくなれば自動で容量を増やしていきます。気をつけるべきこととしては、テーブルやDBを削除しても、このファイルの容量は減らないということ。故にディスク容量を圧迫する恐れがあるので、適宜最適化していく必要があります。

```
mysql> show variables like 'innodb_data_file_path';
+-----------------------+------------------------+
| Variable_name         | Value                  |
+-----------------------+------------------------+
| innodb_data_file_path | ibdata1:1M:autoextend |
+-----------------------+------------------------+
```

###*.frm
そのテーブルのテーブル定義が格納されています。


###ib_logfile
テーブルへのデータの書き込み、トランザクションの情報を保存します。


#インデックスについて
インデックスを貼ると検索が速くなる！とよく聞きます。なぜインデックスを貼ると高速化するのでしょうか。


- インデックスを張らない場合

たとえばuser_idが5のユーザの所持しているアイテムを取得するとします。

```
SELECT * FROM items WHERE user_id = 5;
```

このクエリが実行されると、itemsテーブルの全レコードを読み込み、その中からuser_idが5と一致するレコードを取得します。一度テーブルのすべてのデータを読み込むため、検索の速度はそのテーブルの中のレコード数によって増加していきます。計算量としてはオーダーnですね。


- インデックスを貼る場合

itemsテーブルのuser_idに対しインデックスを貼ります。

```
CREATE TABLE items (
    id INT NOT NULL,
    user_id INT NOT NULL, 
    item ...
    UNIQUE INDEX (user_id)
);
```

インデックスはいわゆる索引的な働きをします。インデックスを貼った要素を元に多分木を作成し、その木構造を用いてデータ検索を行うため、全レコードをわざわざ読む必要がなくなります。インデックスの実装アルゴリズムはB-treeが用いられており、計算量はオーダーlognとなります。

B-treeは節が最大m個（m>=2）の子を持つことができる木構造で、いわゆる二分木を一般化したデータ構造です。根からすべての葉までの経路の長さが等しい、という性質を持っているため、その計算量をオーダーlognに収めることが可能です。

このあたりの詳しい話はまた次回に持ち越したいと思います。


#最後に
というわけで簡単にではありますが、mysqlについて、その使い方だけじゃなくてもう少し踏み込んだところまで調べてみました。次回はインデックスのアルゴリズム的なところをまとめてみたいと思います。

#参考
http://shindolog.hatenablog.com/entry/2015/04/01/185703
http://tech.lexues.co.jp/archives/1405
http://www.dbonline.jp/mysql/storage/index3.html
http://blog.flatlabs.net/20100430_072738/
【大枠】Homebrewのわかりやすい解説

##はじめに
この記事では、Homebrewについて出来る限りわかりやすく説明します。
Homebrewはよく「brew」と略されることがあるので覚えておきましょう。
##Homebrewとは？
[wikipedia](https://ja.wikipedia.org/wiki/Homebrew_(%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0))では
「Homebrew（ホームブルー）は、Mac OS Xオペレーティングシステム上でソフトウェアの導入を単純化するパッケージ管理システムのひとつ。」と定義されています。

パッケージとは、様々な機能をまとめた物のことでこの場合は、「導入したいソフトウェア」のことを指しています。
つまり、Appleが初めから用意してくれているソフトウェア以外に、新しいソフトウェア（パッケージ）を導入したい時に、便利な管理システムが「Homebrew」です。
##どう便利なのか？
OSに新しいソフトウェア（パッケージ）を導入するためには、インストーラーが必要になります。インストーラーはソフトウェアごとに異なるので、ソフトAを導入したい場合は、ソフトA用のインストーラーが、ソフトBを導入したい場合は、ソフトB用のインストーラーが必要になります。
しかし、導入するソフトウェアごとに専用のインストーラーを使わなければならないのは非常に面倒です。

Homebrewを使うと、ソフトウェアごとにインストーラーを用意する必要がなくなり簡単に導入することができます。また、導入したソフトウェアは、brewコマンドを入力するだけでバージョンアップさせることができるので非常に便利です。
Swift3 + Alamofire4 + SwiftyJSONでJSONレスポンスをパースするサンプル

# 背景
最近自作アプリをSwift3.0対応したときに、Alamofireも4にアップデートされ、JSONレスポンスをパースするのに少し困ったのでメモとして残します。原始的な方法とSwiftyJSONの2つでパースしています。

# Alamofire4の使い方（あまりきれいじゃない原始的な感じ）
あるAPIに、パラメータをdate=20161013でGETリクエストを投げて、下記の様なJSONレスポンスが返ってくるとします。

```json
{
    "info": [
        {
            "type": "foo",
            "url": "url~~"
        },
        {
            "type": "bar",
            "url": "url~~"
        }
    ]
}
```

AlamofireでのGETリクエストはこんな感じ。デフォルトだとGETになるみたいです。POSTとか他の詳しいこと知りたい人は[公式Github](https://github.com/Alamofire/Alamofire)読んでください。

```swift
Alamofire.request("https://~~~", parameters: ["date": "20161013"]).responseJSON{ response in
    if let dict = response.result.value as? Dictionary<String, AnyObject> {
        if let datas = dict["info"] as? [[String:Any]] {
            for data in datas {
                if let type = data["type"] as? String {
                    print(type) // foo or bar
                }
            }
        }       
    }
}
```

型がAnyになっちゃうので全部オプショナルにしてアンラップしていくとこんな気持ち悪いif文の連鎖になっちゃいました。もっとスマートなやり方あると思うんですけどね〜とりあえずこれで取り出せたのでOKかな。今回の場合は、自作APIだったので、infoがなければエラーとして扱う仕様にしていたので1つ目のアンラップ時にelseでエラー処理とか実際にはしてます。

# Alamofire4の使い方 with SwiftyJSON
   
```swift
Alamofire.request("https://~~~", parameters: ["date": "20161013"]).responseJSON{ response in
    let json = JSON(response.result.value)
    json["info"].forEach{(_, data) in
        let type = data["type"].string!
        print(type) // foo or bar
    }
}
```

SwiftyJSONを使うと圧倒的にきれいにかけますね〜。


おわり