OmniAICreator/Qiita-1.07M huggingface dataset:
せっかくだから俺は各政党のホームページを解析するぜ

##目的
ネット選挙が解禁されて早一年、公職選挙法に反逆するような使い方がちらほらみられる、今日この頃いかがおすごしでしょうか。
さて、今回は、各政党のホームページを解析して、どんな単語が使われているかしらべ、似たような特徴のある政党を抽出してみようと思います。

##手順
1. 各政党のホームページをダウンロードしてくる。
2. ダウンロードしたページをMecabで形態素解析する。
3. tf-idfで各単語のスコアを求める
4. コサイン類似度による文章の距離の測定を行い、政党間の距離を求める。
5. GraphVizで、その関連を表示する。

##結果
 **2014年の各政党のホームページ解析** 
http://needtec.sakura.ne.jp/analyze_election/page/analyzehp/2014

 **ソースコード** 
https://github.com/mima3/analyze_election/tree/master/script_comp_manifesto

ソースコードをダウンロードしてきて以下のスクリプトを実行する。

```
# ホームページをダウンロードしてDBに格納
python create_parties_db.py parties_hp_2014.sqlite party_hp_json_2014.json

# 形態素解析して単語の数の集計
python create_parties_tokens.py parties_hp_2014.sqlite

# tf-idfとコサイン類似度の計算をして結果をJSONとPNGに記録する。
python create_tf_idf_report.py parties_hp_2014.sqlite party_hp_result_2014.json  party_hp_result_2014.png "ms ui gothic"
```

実行には下記のライブラリをインストールする必要があります。
・nltk
・lxml
・MeCab
・urllib2
・pydot

##解説
###tf-idfによる文章の解析
文章ｙにおいて単語ｘのtf-idfの値は以下のようになる。

tf = 文章y中に単語xが登場した数 / 文章中の単語数
idf = 1.0 + log( 文章の総数 / 単語xが登場する文章の数 )
tf-idf = tf × idf

多くのドキュメントに登場する単語は重要度が下がりスコアが低くなり、特定のドキュメントにしか登場しない単語は重要度があがりスコアが大きくなる

###コサイン類似度による文章の距離の測定
文章1が単語(A,B,C)を持っており、その単語のTF-IDFの値が(0.1,0.2,0.3)とする。
文章2が単語(C,D,E)をもっており、その単語のTF-IDFの値が(0,4,0.5,0.6)とする。

文章に存在しない単語のTF-IDFを０とするとして、全ての単語についてのTF-IDFを作成する。

文章1の(A,B,C,D,E)は(0.1,0.2,0.3,0,0)となる。
文章2の(A,B,C,D,E)は(0,0,0.4,0.5,0.6)となる

この文章1と文章２のベクトルの角度のコサインは両者の類似度を表す。
まったく同じ文章の場合は文章１と文章２の角度は0度になる。

Pythonの場合は、nltk.cluster.util.cosine_distanceで計算してくれる。
MySQL5.6にしたのに、Online DDLできない


## 結論
Online DDLできない制約にひっかかってた

> InnoDB tables created before MySQL 5.6 do not support ALTER TABLE ... ALGORITHM=INPLACE for tables that include temporal columns (DATE, DATETIME or TIMESTAMP) and have not been rebuilt using ALTER TABLE ... ALGORITHM=COPY. In this case, an ALTER TABLE ... ALGORITHM=INPLACE operation returns the following error:

> ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. 
Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.

[Ref.](http://dev.mysql.com/doc/refman/5.6/en/innodb-create-index-limitations.html)

### 意訳
- 5.6より前に作ったテーブル
  - `DATE` `DATETIME` `TIMESTAMP`カラムが存在する
  - `ALGORITHM=COPY`でrebuildされていない (5.6にしてから一度も`ALTER TABLE`していない)
- は`ALGORITHM=INPLACE`できない
- 言い換えれば、`ALGORITHM=COPY`が必須であり、書込ロックがかかる
  - `LOCK=NONE is not supported. Reason: COPY algorithm requires a lock. Try LOCK=SHARED.`

## メモ
- `ALTER TABLE table_name ... LOCK=NONE`とすれば、Online DDLできないときはエラー出るので確認に有用
- MySQL 5.5から移行した理由が、Online DDLしたかったからなのに出来ないジレンマ ＼(^o^)／
- `ALGORITHM=COPY`で`ALTER TABLE`すれば、次回からはOnline DDLできる
DATE PartitionにTO_DAYS()を使うのはやめよう


## まとめ
`PARTITION BY RANGE COLUMNS()`を使えばよい

## 悪いテーブル定義例

```sql
CREATE TABLE `presents` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(10) unsigned NOT NULL,
  `present_id` int(10) unsigned DEFAULT NULL,
  `created_at` datetime NOT NULL,
  PRIMARY KEY (`id`,`created_at`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY RANGE (TO_DAYS(created_at))
(PARTITION p201402 VALUES LESS THAN (735658) ENGINE = InnoDB,
 -- 省略
 PARTITION p201409 VALUES LESS THAN (735872) ENGINE = InnoDB,
 PARTITION p201410 VALUES LESS THAN (735903) ENGINE = InnoDB,
 PARTITION pmax VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */;
```

### クエリ
```sql
EXPLAIN PARTITIONS
SELECT  `presents`.* FROM `presents`
WHERE `presents`.`user_id` = 1067510
AND (created_at BETWEEN "2014-08-25  16:11:07" AND '2014-09-25 16:11:07')
;
```

### 刈り込み結果
```
p201402,p201408,p201409
```

- REORGANIZEするとき、 **上記クエリがロックされてしまう！！**

## 何故`p201402`が対象なのか
- http://www.mysql.gr.jp/mysqlml/mysql/msg/15573

```
MySQLのパーティショニングでは、評価式の結果がNULLになった場合、
先頭のパーティションにレコードが格納されます。
TO_DAYS()はzero date（月や日が0の日付）などを入力すると
NULLを出力するのですが、WHERE句の条件ではzero dateが含まれるかどうか
までは分かりませんので、評価式の結果がNULLとなる可能性が否定できません。
そのため、評価式の結果がNULLとなるレコードが格納されている先頭の
パーティションもSELECTの対象になるのです。
```

## 良いテーブル定義

```sql
CREATE TABLE `presents` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(10) unsigned NOT NULL,
  `present_id` int(10) unsigned DEFAULT NULL,
  `created_at` datetime NOT NULL,
  PRIMARY KEY (`id`,`created_at`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY RANGE COLUMNS(created_at)
(PARTITION p201402 VALUES LESS THAN ('2014-03-01') ENGINE = InnoDB,
 -- 省略
 PARTITION p201409 VALUES LESS THAN ('2014-10-01') ENGINE = InnoDB,
 PARTITION p201410 VALUES LESS THAN ('2014-11-01') ENGINE = InnoDB,
 PARTITION pmax VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */;
```
Linux でプロセスの優先度を指定して実行する

# はじめに
[gcc の make](http://qiita.com/soi33org/items/7833193d9a52dcf4f6ea)に非常に時間がかかるし、マシンが重くなるから、なんとかしたいなーって思ってた。
別にすぐできなくていいから、プロセスの優先度を下げれば良いのか！と思いついたので、備忘録。

# nice コマンド
とりあえずマニュアルを見る

```
$ man nice

NAME
       nice - run a program with modified scheduling priority

SYNOPSIS
       nice [OPTION] [COMMAND [ARG]...]
```

シンプルなマニュアルである。
nice -n 優先度 コマンド コマンドの引数･･･って形で打てば良さそう

優先度は、-20(優先度高)から19(優先度低)まであって、nice コマンド使わないデフォルトは、0で動くようだ。

# おわりに
同じマシンで動いている emacs の動作が遅くなってイラっとしてたのが改善されてよかった。
既に動いてるプロセスの優先度の変更には、renice というコマンドがあるみたい。

# 追記
## 起動中にプロセスの優先度の確認方法
### top コマンド
top コマンドの NI の項目が優先度。
nice で設定した優先度で動いていることが確認できる。
vhost_aliasを利用したVirtualHostの作成

### 目的
***
高いサービスレベルを求められない数百のサイトを運用していく際、サーバ統合率を上げた構築を行い、短納期を実現するために運用管理も効率的な構成にしたい。

### 環境
***
* Ubuntu 14.04.1 LTS
* apache2.4.7-1ubuntu4.1

### 使用モジュール
***
`/etc/apache2$ ls -l mods-available/ | grep vhost_alias`

```
vhost_alias.load
```

### モジュール有効化
***
`/etc/apache2/mods-enabled$ sudo a2enmod vhost_alias`
`/etc/apache2/mods-enabled$ ll`

```
vhost_alias.load -> ../mods-available/vhost_alias.load
```

### 設定ファイル作成
***
`/etc/apache2/sites-available$ sudo nano vhost_alias.conf`
documentrootに書いた*%1*がサブドメイン毎に作成したディレクトリを見る。

```bash:vhost_alias.conf
<VirtualHost *:80>
    ServerName example.com
    ServerAlias *.example.com
    VirtualDocumentRoot /var/www/sites-enabled/%1/htdocs
    LogFormat "%{%FT%T%z}t %>s %T %B \"%m http://%{Host}i%U%q\" \"%{User-Agent}i\" %h" custom
    CustomLog /var/log/apache2/virtual_alias-access.log custom
    ErrorLog /var/log/apache2/virtual_alias-error.log
    <Directory "/var/www/sites-enabled/*/htdocs">
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
```

作成した設定ファイルのシンボリックリンクを作成
`/etc/apache2/sites-available$ sudo a2ensite vhost_alias.conf`
`/etc/apache2/sites-enabled$ ll ../sites-enabled/`

```
000-default.conf -> ../sites-available/000-default.conf
vhost_alias.conf -> ../sites-available/vhost_alias.conf
```

### apache再起動
***
`$ sudo service apache2 restart`

### 公開を限定的にする
***
ドキュメントルート配下にディレクトリを作ると同時に公開されてしまうので、
シンボリックリンクを利用して公開範囲を限定的にする。
`/var/www$ sudo mkdir sites-available sites-enabled`
`/var/www/sites-enabled$ sudo ln -s ../sites-available/v-test1 v-test1`
`/var/www/sites-enabled$ sudo ln -s ../sites-available/v-test2 v-test2`
`/var/www/sites-enabled$ ll`

v-test1.example.comとv-test2.example.comのサイトのみ公開。

```
v-test1 -> ../sites-available/v-test1/
v-test2 -> ../sites-available/v-test2/
```

### 利点
***
作成したディレクトリをコピーして利用すれば、サイトの作成・削除が容易で管理しやすい。
また、サイト追加時にapacheの再起動も必要としないので、バーチャルホスト全体への影響は無い。
play scalaでjsonをjson4sで受け取る

メモ

- アプリ内はjson4sで統一してるので、playのjsonじゃなくてjson4s使いたい。
  - [play-json4s](https://github.com/tototoshi/play-json4s)があった。
- ContentTypeでbody.asTextやasJsonでとれるものが決まってしまう。
  - application.jsonならbody.asTextも空とか。
  - tolerantなBodyParserを使うと、ContentTypeを見ないでくれる。(tolerant=寛容な!)
- パース失敗したらエラーメッセージをとりたい。(error near "[") 的な
  - Exceptionのメッセージをとりたいけど、[取れないくさい](https://github.com/tototoshi/play-json4s/blob/master/core/src/main/scala/com/github/tototoshi/play2/json4s/core/PlayModule.scala#L65-L69)。

故に、tolerantTextで受け取ってjson4sのparse関数呼ぶことにした.........

ｳﾞｧー
【FileMaker】勤務表で使えるHour関数


よくExcelでも勤務表を自作したりしますよね。（しない？）
FileMakerでも同じように勤務表を作れます。
勤務表でめんどくさいのが時間の計算ですが、FileMakerの関数のHourを使えば簡単です。

Hour(Get(時刻)) + (Minute(Get(時刻))/60)

これで、「X時X分」が「X.X時間」となります。

これがわかれば、何時間働いたかも簡単に計算できます。
上の計算式の「時刻」は現時刻を求めるときに使う引数ですが、ここに「開始時刻」「終了時刻」それぞれの値を求めて減算するだけです。

やってみましょう。

テーブル定義に勤務時間の計算フィールドを作ります。
![1204_1.png](https://qiita-image-store.s3.amazonaws.com/0/60538/0d9a10d3-f023-4d6d-8e5f-05be5a3179e3.png)

勤務時間のオプションで、計算式を指定します。
![1204_2.png](https://qiita-image-store.s3.amazonaws.com/0/60538/90153da3-aab9-5232-46f1-230a9e1806d0.png)
この時、計算式で使用しているフィールドが空欄の場合に計算しない、というフィールドのチェックを外してください。
特殊な条件の時に計算することがあるかもしれないからです。
例えば、勤務中であったり徹夜とか。。。

式は次のようになります。

(Hour ( 終了時刻 ) + (Minute ( 終了時刻 )/60))  - (Hour ( 開始時刻 ) + (Minute ( 開始時刻 )/60))

レイアウトでは、勤務時間の表示を小数点第二位まで指定しています。
![1204_3.png](https://qiita-image-store.s3.amazonaws.com/0/60538/b627133e-ac93-8c3c-a80d-cd013e3e04d6.png)

その他、月合計などの総勤務時間を計算するときは、この勤務時間を集計すれば済みます。

時間の計算も実務上ではよく出てくるので、取り上げました〜。
Parallels Desctop 10 for Mac でスナップショットの作成と移動の確認


## 環境

* OS のバージョン「OS X Yosemite (10.10.1)」
* Parallels のバージョン「10.1.1 (28614)」
* 仮想マシンの OS・バージョン「Ubuntu Linux 14.10」

## スナップショットの作成

1. 仮想マシンのコンテキストメニュー(右クリックメニュー)から **「スナップショットの管理...」** を選択
2. **「新規」** ボタン押下
3. **「スナップショット名」「説明」** を入力して **「OK」** ボタン押下

## スナップショットへの移動

1. 仮想マシンのコンテキストメニュー(右クリックメニュー)から **「スナップショットの管理...」** を選択
2. 移動したいスナップショットを選択し、コンテキストメニュー **「スナップショットへ移動」** 選択か、右下の **「移動」** ボタン押下
3. 「続行しますか？」と聞かれるので **「はい」** ボタン押下

※ 現在の状態が **失われます** ので、必要であれば「現在」のスナップショットを作成してから移動する。

## 動作確認

Git のインストール前後のスナップショットを作成して確認

### スナップショット1

#### Git が未インストール状態であることを確認

```bash
$ git --version
プログラム 'git' はまだインストールされていません。 次のように入力することでインストールできます:
sudo apt-get install git
```

#### Git 未インストール状態のスナップショット作成

スナップショット名： **「Gitなし」**

### スナップショット2

#### Git のインストール・確認

```bash
$ sudo apt-get install git

$ git --version
git version 2.1.0
```

#### Git インストール済み状態のスナップショット作成

スナップショット名： **「Gitあり」**

### スナップショット1「Gitなし」へ移動

#### Git が未インストール状態であることを確認

```bash
$ git --version
プログラム 'git' はまだインストールされていません。 次のように入力することでインストールできます:
sudo apt-get install git
```
iPhoneの画面をMacで見る方法

#はじめに

今までは、[Reflector](http://www.airsquirrels.com/reflector/)などを使わなければiOS端末との画面共有をMacですることはできませんでしたが、iOS8とYosemiteの組み合わせでとても簡単に画面共有をすることができるようになりました。

##追記

iOS8以上 + Yosemite以上の組み合わせならできます。

#画面共有のやりかた

##iOS端末とMacをLightningケーブルでつなぐ

##QuickTime Playerを起動する

##File -> New Movie Recording をクリック（一番上）

![File_and_Menubar.png](https://qiita-image-store.s3.amazonaws.com/0/58141/a014df8b-0c19-fb48-df09-98dd2910014e.png)

##録画対象をiOS端末の画面にする

![Movie_Recording.png](https://qiita-image-store.s3.amazonaws.com/0/58141/b1022785-c6a9-dd25-e3a5-83ca713aeebd.png)

録画開始ボタンの右にある、矢印ボタンをクリックして、CameraとMicrophoneに画面共有したいiOS端末を設定します

プレゼンなどで、ただ画面共有したいだけの場合はこれで準備完了です

##録画開始！

画面収録したい場合は、録画開始ボタンを押して、iOS端末を操作し、操作が終わったら録画停止ボタンを押すだけです。録画が終わったら、Command+s で保存しましょう。

#Tips

| ショートカット |         動作        |
|:--------------:|:-------------------:|
|   Command + 3  | Macの画面に合わせる |
|   Command + -  |   画面を小さくする  |
|   Command + +  |   画面を大きくする  |

#No Mac?
Macコンピュータをお持ちでない場合は、AirShouやDisplay Recorderなど、iOS画面の録画や共有ができる他の多くのアプリがあります。

#参考

http://ioshacker.com/how-to/use-quicktime-record-screen-iphone-ipad-ipod-touch-running-ios-8
https://www.cydiageeks.com/best-game-recording-apps-iphone-broadcast-gameplay.html
【スマートフォンではなく】パソコンが始める Prolog 【動作確認編】

# 【スマートフォンではなく】パソコンが始める Prolog 【動作確認編】

[前回][3日目] は、あたにPrologを導入して頂きました。

## 動作確認をしてみましょう

本当にあなたに Prolog 処理系がインストールされたか、あなたはまだ疑っているのではないでしょうか。

ここでは、実際に Prologのプログラムを動作をさせて、あなたがプログラムを処理している実感を味わってみることにしましょう。

せっかくですので、 [1日目] に取り上げたソースコードを動かしてみることにします。
ただし、少しソースコードは変更しています。

下記を advent-example01.pro などとファイル名をつけ、保存しておいてください。

```prolog
% あなたとジャバ
ジャバ(あなた).

% わたしとジャバ
ジャバ(わたし).

% X とジャバならば、X は今すぐジャバをダウンロードすべきである
ジャバをダウンロード(X,今すぐ) :- ジャバ(X).
```

> :memo: Windowsにて「メモ帳」を使い保存する場合は、 「文字コード」を `「UTF-8」` で保存してください。でなければ、あとの作業でエラーがでることでしょう。
> ![2014-12-03_swi-prolog06.png](https://qiita-image-store.s3.amazonaws.com/0/42096/7ebdce43-a0ab-4629-f3b2-2bc264b91d29.png)

### あなたが Linux や Mac OS X 環境の場合

以下のようにして、読み込ませることができるでしょう。

```shell-session
$ swipl -f advent-example01.pro
```


### あなたが Windows の場合

まずは上記で紹介したように `Prolog` を起動し、メニューから `「File」⇒「Consult...」`  と選択し、ファイル `advent-example01.pro` を選ぶとよいでしょう。

![2014-12-03_swi-prolog05.png](https://qiita-image-store.s3.amazonaws.com/0/42096/74917835-578f-9224-d3b8-715e9a2d2bd0.png)


> :memo: このあたりは 『[プログラムの起動と質問の自動実行 - Prolog - Wikipedia](http://ja.wikipedia.org/wiki/Prolog#.E3.83.97.E3.83.AD.E3.82.B0.E3.83.A9.E3.83.A0.E3.81.AE.E8.B5.B7.E5.8B.95.E3.81.A8.E8.B3.AA.E5.95.8F.E3.81.AE.E8.87.AA.E5.8B.95.E5.AE.9F.E8.A1.8C)』 も参考になるかと思います。

### 対話画面が開いたら

対話画面が開いたら 以下のように入力してみましょう。下記は、 `「あなたは今すぐジャバをダウンロードすべきか？」` という趣旨の質問をしています。

```prolog
?- ジャバをダウンロード(あなた,今すぐ).
```

> :memo:  `?-` 以降の文字を入力します


`true` と出力されました。これは「あなたは今すぐジャバをダウンロードすべきである」ということを意味しています。

```prolog
?- ジャバをダウンロード(あなた,今すぐ).
true.
```

----

それでは、以下の質問を入力した場合はどうでしょうか。下記は `「今すぐジャバをダウンロードすべきは『誰』(X)か？」` という質問をしてみています。

```prolog
?- ジャバをダウンロード(X, 今すぐ).
```

まずは以下のように、出力されるでしょう。

```prolog
?- ジャバをダウンロード(X, 今すぐ).
X = あなた 
```

さて、ここからが Prolog のおもしろいところです。
 
そのまま `;` や `スペースバー` を押してみましょう。

```prolog
?- ジャバをダウンロード(X, 今すぐ).
X = あなた;
X = わたし.
```

すると、上記のように `「あなた」` 以外の `「わたし」` も現れました。

上記は、 `「今すぐジャバをダウンロードすべきは『あなた』であり『わたし』である」` ことを意味しています。

他のプログラミング言語ならば、 for や foreach などを使っていたかもしれません。
このあたりが Prolog のユニークなところの1つです。

----

さて、うまくいきましたでしょうか。

Prologのただの「動作確認」としては少々長く感じられたかもしれません。

それでも、もしあなたが物足りないならば以下の課題を試してみてください。

> :memo: もし課題に取り組まなかったとしても、そのことによって、すぐに巨大な隕石が地球に落ちてきたり、地軸が必要以上に傾いたりはしないでしょう。あなたが気が向いたときで大丈夫です。

### 課題1 : 以下のように入力した場合はどのような結果が出力されるでしょうか。

```prolog
?- ジャバをダウンロード(X, Y).
```

### 課題2 : 下記のように `forall` を利用した場合はどのような結果が出力されるでしょうか。

```prolog
?- forall(ジャバをダウンロード(X, 今すぐ), writeln(X)).
```

----


それでは、次回の Prolog Advent Calender でお会いしましょう。

[Prolog]: http://ja.wikipedia.org/wiki/Prolog
[Ideone]: http://ideone.com/ "Ideone.com - Online Compiler and IDE"
[SWI Prolog]: http://www.swi-prolog.org/
[1日目]: http://qiita.com/toby_net/items/1f4cb7c780b136ca1552
[3日目]: http://qiita.com/toby_net/items/bb6c1acc8116bb08dfb6
[iOS]緯度経度取得ライブラリINTULocationManagerを使ってみた。

「iPhoneで、現在地の緯度経度を取得したい」という要求がありまして、色々と調べていたところ、”INTULocationManager”というライブラリが良さそうな感じでした。

触りだけ使ってみたので、ご紹介します。

Github：[intuit/LocationManager](https://github.com/intuit/LocationManager)

## 特徴
Githubのreadmeによれば、以下の特徴があるとのことです。

* (iOS標準のCLLocationManagerだと難しい)、1回限りのlocation検索ができる。
* シンプルなAPI
* 精度、タイムアウト時間を設定できる
* (緯度経度が求まったらGPSをOFFにするので)バッテリーにやさしい

連続して位置情報を取得するのではなく、1回限りの位置情報取得に特化したライブラリです。カーナビアプリのように、ずっと位置情報を使うアプリには向かないようです。

## インストール
インストールは、おなじみのCocoaPodsで行います。Podfileに

```
pod 'INTULocationManager'
```

と書いて、pod install なり pod update なりを実行すればインストールできます。

## 準備
iOS 8以降で使用する場合は、Info.plistに NSLocationWhenInUseUsageDescription または NSLocationAlwaysUsageDescription の記入が必須になります。

これは、位置情報を使う場合は必ずやらなくてはいけない設定ですね...。

参考サイト：[iOS 8から位置情報を取得する方法が変わるよ - Qiita](http://qiita.com/koogawa/items/6ec24ca3201977e9642b)


## ソースコード
実際に使用するときは以下のようになります。githubのサンプルソースをSwiftで書き換えてみました。

``` Swift
        let locMgr = INTULocationManager.sharedInstance()
        locMgr.requestLocationWithDesiredAccuracy(INTULocationAccuracy.City,
            timeout: 10.0,
            block: { (currentLocation:CLLocation!, achievedAccuracy:INTULocationAccuracy, status:INTULocationStatus) -> Void in
               
                switch (status) {
                case .Success:
                    println("success")
                case .TimedOut:
                    println("timeout")
                default:
                    println("default")
                }
                println("accuracy=" + String(achievedAccuracy.rawValue))
                println("location=" + currentLocation.description)
        })
```

## 実行結果
こんな感じになります。

```
status: 0
success
accuracy=5
location=<+38.26042400,+140.88213500> +/- 5.00m (speed -1.00 mps / course -1.00) @ 12/3/14, 9:27:03 PM Japan Standard Time
```

## 感想

INTULocationManagerは「位置情報を1回だけ行いたい」用途に特化したライブラリでした。幸いにも、自分が実装したい機能にバッチリマッチしていましたので、導入してみようと思います。

以前、CLLocationManagerで1回だけ緯度経度情報を取得するコードを書いた事があるんですが、結構面倒でしたし...。

このライブラリなら、お手軽にその機能が実現できるので、良いんじゃないでしょうか！
JestでReact.jsアプリケーションのテスト

# JestでReact.jsアプリケーションのテスト

## Jestとは

![Screen Shot 2014-12-04 at 00.13.27.png](https://qiita-image-store.s3.amazonaws.com/0/3985/c0c65280-dbd5-416c-bc8f-1d9380cc8190.png)

http://facebook.github.io/jest/

[facebook](https://www.facebook.com/)がgithub.comに出している
テスティングフレームワーク。

# JestでReact.jsアプリケーションのテストを書く

...と書くとざっくりしているが、
Jestのサイトで、[tutoria/react](http://facebook.github.io/jest/docs/tutorial-react.html#content)に、React.jsアプリケーションでの
Jestを使ったサンプルが載っていた。

コードもgithub.com上に上がっている。

https://github.com/facebook/jest/tree/master/examples/react

githubリポジトリに、コードをそのまま載せてみた。

https://github.com/futoase/test-of-jest-for-react

# Jestを使うためのセットアップ

## 前提条件

- node.jsのバージョンは[2014年12月現在stableのv0.10.xxであること](https://github.com/facebook/jest/blob/master/package.json#L30)

という条件がある。

## React.addons.TestUtils

Jest単体はReact.js向けのテストフレームワークとしては書かれておらず、
VirtualDOMを使ったり、clickイベントのシミュレートをしたい場合はReact.jsの[TestUtils](http://facebook.github.io/react/docs/test-utils.html)を使っている。

## サンプルを動かしてみる

Jestのドキュメントで、React.jsを使ったサンプルがあるので、環境を構築してみる。

### jest-cliのインストール

jest-cliをインストールする。

```
> npm install jest-cli
```

### サンプルのテスト

サンプルコードのルート・ディレクトリに移動し、
jestコマンドを実行する。__tests__ディレクトリを探索し、
テストを実行する。

```
> jest
```

![Screen Shot 2014-12-04 at 12.43.18.png](https://qiita-image-store.s3.amazonaws.com/0/3985/566b4187-a4d1-ffca-2399-d4f379999f60.png)

テストが実行されている。

### サンプルテストを動かしてみて

jstransformにてjsへの変換が必要なので、
preprocessor.jsを用意する必要があるが、
componentsの構築・changeイベント後のTextComponent状態の
変更についてテストできた。

これは良いと思う。

# VirtualDOMのテストの先

facebookが敷いてるレールに乗っかることで、
新しいWebアプリケーション開発に対する刺激を受けることができている。
VirtualDOM(この場合はReactJS Componentだけど...)のテストを行えるようにして、
DOM構築の手前でのテストがサーバ側で行えるようになれば
多画面で構成されているWebアプリケーション開発はやりやすくなるのかなと思ったりもした。

Selenium Web Driverを使ったエンドユーザテストをしなければならないとしても...
Linuxでディスク容量が足りない時のアプローチ


Linuxでディスクフルの時に即対出来るようにメモ

ほとんど下記のブログの通りですが自分用に再加工
http://d.hatena.ne.jp/rx7/20130729/p1

##現状確認
だいたいアラートや周囲のざわつきでしる。。。
やばいディスクフルだ。。

```
# df -h
Filesystem            Size  Used Avail Use% マウント位置
/dev/sda1              15G   15G     0 100% /
tmpfs                 1.9G     0  1.9G   0% /dev/shm
```

##全体でどこがでかいか確認

サーバへの負荷を考慮して、niceコマンドで優先度さげて実行

```
#値が低い程優先度高い
# nice -n [-20から19]
```

```/から1階層目のディレクトリ容量一覧を表示
#rootでない場合は、sudoする
# nice -n 19 du -h --max-depth=1 /
4.0K    /cgroup
156K    /dev
16K     /lost+found
11G     /opt
44M     /boot
2.3G    /usr
0       /misc
295M    /var
8.0K    /mnt
27M     /etc
219M    /tmp
0       /net
7.5M    /bin
30M     /root
29M     /lib64
4.0K    /srv
12M     /sbin
0       /sys
238M    /lib
0       /proc
38M     /home
4.0K    /selinux
4.0K    /media
14G     /
```

##ディレクトリの目処つけたら

```findで見つけた100MB以上のファイルを1つずつlsで表示する
# nice -n 19 find /opt -size +100M -exec ls -lh {} \; 
-rw-rw-r-- 1 ikyuadm ikyuadm 225M 12月  4 11:51 2014 /opt/monaco/var/log/archive/aaa.tar.gz

```


###ちなみに、findの-execオプションについても調べてみた
普段は、findコマンドは-printコマンドが省略されてるから標準出力される
今回調査した、-execを使うとコマンドに対してfindの結果を渡せるので、下記のようなケースで便利という話。

|コマンド|意味|
|-------|---|
|-exec command{} \;|findの結果を1行ずつ処理|
|-exec command{} +|findの結果をまとめて処理|

```sample
#1行ずつ出力
$ find aaa -exec echo {} \;
aaa
aaa/aa.txt
aaa/bb.txt
#まとめて1行で出力
$ find aaa -exec echo {} +
aaa aaa/aa.txt aaa/bb.txt
```

findのオプションに関してはこれがわかりやすい
http://h50146.www5.hp.com/products/software/oe/hpux/developer/column/unixtext_app02/02.html


###あとは見つけた不要ファイルを削除なりアーカイブなりしていき終了
SoftLayerで提供されているメール配信サービス、SendGridを使ってみる

この記事は[SoftLayer Advent Calendar 2014](http://qiita.com/advent-calendar/2014/softlayer)の４日の記事になります。
4日目の担当は雪本が担当します。
普段プログラムを書いてますので、プログラムに関する記事を書いてみました。

皆さん、ご存じですか？SoftLayerにはsendGridというメール送信用のサービスが用意されていることを。sendGridというのはメールの送信サービスです。簡単にいうとメールサーバを用意しなくてもメールが配信できるんです！！
もうこれでsendmailなどわざわざ設定をしなくてもいいわけです。
しかも、月に25,000通まで無料で送信！！
そんな便利なプランが用意されています。
わざわざSendGridにアカウントを登録しないでもSoftLayerを契約すると勝手についてきます。
私もこんな便利なサービスが利用できると知った時は驚きました！

これで、アプリケーションからメールを送るのに、わざわざ自前でMail Serverなど用意する必要はありません。
この機会に、ぜひ活用してください。

ということで今日はSendGridを使ってメールを送るプログラムをご紹介します。
SendGridはAPI経由でも送信できるみたいです。したがって、今回は普通にメールを送るパターンとAPIからメールを送るパターンを実装してみたいと思います。


# sendGridを使う準備

登録の仕方については、日本情報通信株式会社の常田さんが記事にされていますので、そちらをご参考にしていただければ分かりやすいと思います。

http://niccloud.niandc.ne.jp/?p=845

# pythonからsendGridを使いメールを送信

実際に簡単なプログラムでテストメールを配信してみたいと思います。

が、ここでトラブル発生！！
ポートを指定しないとメールが配信できないみたい。。
では２５番で。。。

結局、587も送信できました。
いろいろ試した結果２５２５でも送信できました。

調べた結果、以下のポートを使うのがいいみたいです。
> TLS connections では  25, 587,  2525
> SSL encryption では 465.


```lang:python
# -*- coding: utf-8 -*-
import smtplib
from email.mime.text import MIMEText
from email.header import Header


con = smtplib.SMTP('smtp.sendgrid.net', 587)
con.esmtp_features['auth'] = 'LOGIN'
con.login('登録したアカウント', 'パスワード')
con.set_debuglevel(True)

cset = 'utf-8'

message = MIMEText(u'日本語のメール送ってみました', 'plain', cset)
message['Subject'] = Header(u'送信テスト', cset)
message['From'] = 'from@example.com'
message['To'] = 'to@example.com'　　　　#別になくてもいいかも。。

con.sendmail('from@example.com', ['yukimoto@usa-mimi.jp'], message.as_string())

con.close()
```


# APIからメールを送信する
APIリファレンスは以下のサイトで参照できますので、詳しくはそちらをご確認ください

https://sendgrid.com/docs/index.html

SendGridのAPIはリファレンスとして以下の８つに分かれています。
* SMTP API
* Web API
* Web API v3
* Webhooks
* Customer Subuser API
* Marketing Email API
* Reseller API
* Reseller Haiku API

ぜんぶ説明していると大変なのと、まだ、必要に迫られていないので、今回はメールを送信するということにフォーカスを当てて説明していきたいと思います。


## Web APIからメールを送信する
APIでメールを送信する場合は特定のURLにPOSTすると送信できます。
今回はサンプルにあるように、curlを使ってメールを送信するプログラムで書いてみました。基本的にはサンプルをそのまま使っています。curlでメールが送信できるということはshellからも簡単にメールが送信できることになるので、便利に使えそうです。

```lang:shell
$ curl -d 'to=destination@example.com&amp;toname=Destination&amp;subject=Example Subject&amp;text=testingtextbody&amp;from=info@domain.com&amp;api_user=登録したアカウント&amp;api_key=パスワード' https://api.sendgrid.com/api/mail.send.json
```

つぎに、APIで添付ファイルを送信してみます！

```lang:shell
curl https://api.sendgrid.com/api/mail.send.json \
-F to=yukimoto@usa-mimi.jp -F toname=test -F subject="Example Subject" \
-F text="testing text body" --form-string html="<strong>testing html body</strong>" \
-F from=test@yourdomain.com -F api_user=登録したアカウント -F api_key=パスワード  \
-F files[attachment.gz]=@f.php.gz https://api.sendgrid.com/api/mail.send.json
```

メールを送信して成功すると以下の様なメッセージが戻ってきます。

```lang:shell
{"message":"success"}
```
successと出れば送信完了！エラー時はそのままerrorと戻ってきます。

# まとめ
SendGridからメールを送るのは非常に簡単に送ることが出来ました。
通常のアプリで使うメールであれば25,000通に出すことはないので実質無料で使えると考えてもいいと思います。
AWSでも使えるサービスですが、SoftLayerでも使えるのは非常に嬉しいサービスです。
皆さんこの機会にぜひ使ってみてください！
【Web】動的に追加した要素をイベント起動時（ClickとかSubmitとか）に拾うJavaScript

# これは何？

※　壁にぶち当たれば当たり前だけど、ちょっと開発から離れると忘れるのでメモ

動的に追加した```<input type="text" name="hoge" />```だと、普通に

```js
$("form").submit(function(){
  var data = $("form").serializeArray();
  // 送信
});
```

にやっても、動的に追加した要素が```data```の中に入ってこない。

それを解決する方法。

# 問題点

```js

// inputの追加
$("input#hoge").click(function(){
   $("div#hoge-hoge").append("<input type='text' name='hoge-fuga'/>");
});

// form
$("form").submit(function(){
  var data = $("form").serializeArray();
  //!!! 追加した　<input type='text' name='hoge-fuga' />　が data　に入ってない！！
});

```

# 解決策

onメソッドを使用する。jqueryのバージョン1.9位では、liveメソッドだがdeprecatedになっているので、onを用いる模様。

```js

$(document).on('submit', 'form',function(){
  var data = $("form").serializeArray();
});
```

clickメソッドとかだと最初にページを読み込んだ情報しか読み込んでくれない。動的に追加したものを扱う場合は、onメソッドを用いるのがよい。

# 参考

[jQueryのbind/live/delegateの違いまとめ、と新API .on()の使い方](http://d.hatena.ne.jp/y-kawaz/20111002/1317489435)
WebPのインストール方法と簡単な使い方

WebPのインストール方法と簡単な使い方
====

存在を知っているだけで、使ったことのないWebP画像をクックパッドさんが本格導入しているっぽいので、ちょっと遊んでみました。

インストール方法（Mac）
-------------

brewでインストール出来ました。

```
$ brew install webp
```

使い方
---

cwebpコマンドでwebp形式に変換出来ます。

フォーマットは、

```
$ cwebp [options] input_file -o output_file.webp
```

で、具体的にはこんな感じです。

```
$ cwebp -q 90 omrice.jpg -o omrice.webp
```

-qオプションで画質を指定します。（デフォルトは75のようです）

効果
---

lsコマンドで確認
（結果はマシン名とか出ちゃうのでちょっと省略してます）

```
$ ls -l
1113371 12  4 11:43 omrice.jpg
598366 12  4 11:46 omrice.webp
```
1.1MBの画像が0.6MBになりました！


画像
---

変換前と変換後と比べてみました。
（Chromeブラウザで閲覧ください。）

変換前（JPEG画像）
![omrice.jpg](http://itosho.parallel.jp/laboratory/omrice.jpg)

変換後（WebP画像）
![omrice.webp](http://itosho.parallel.jp/laboratory/omrice.webp)

うまくみれない方はリンクからどうぞ。
（WebPはそのままダウンロードしちゃいます…）

http://itosho.parallel.jp/laboratory/omrice.jpg
http://itosho.parallel.jp/laboratory/omrice.webp

まとめ
---
<del>オムライス食べたい。</del>

まだまだ対応している環境は少ないですが、この圧縮率は魅力的なので積極的に使って行こうと思います。
もっとWebPを知りたい方はGoogle DevelopersサイトへGo！

参考URL
-----
WebPでモバイルアプリの通信量を劇的に削減する：
http://techlife.cookpad.com/entry/2014/12/04/090000

Google Developers：
https://developers.google.com/speed/webp/docs/cwebp
デバッグコンソールの自動起動を大人しくさせる方法


Corona SDK プロジェクトを実行して Corona シミュレーターを起動すると、ログ出力などを確認するためのデバッグコンソールが自動起動するようになっています。私は Sublime Text に、以下のプラグインを導入して開発をしています。

- [coronalabs/CoronaSDK-SublimeText](https://github.com/coronalabs/CoronaSDK-SublimeText)

上記のプラグインを導入すると、わざわざ、デバッグコンソールを起動しなくても、Sublime Text のウィンドウ内でログ出力を確認出来るようになります。つまり、Corona SDK プロジェクトを実行する度に、デバッグコンソールを自動起動する意味って全く無いんですよね。

## 大人しくしてもらおうか

しばらくは、自動起動してもすぐ閉じる、などして対応していましたけど、もう我慢の限界です。デバッグコンソールの自動起動を大人しくさせる方法について、Corona フォーラムで検索して、解決策を見つけました。

- [Corona Terminal - General Questions/Discussion - Corona Labs Forums](http://forums.coronalabs.com/topic/52995-corona-terminal/?hl=console#entry275451)

上記で述べられている通り、以下のコマンドを実行しましょう。

```bash:デバッグコンソールの自動起動を無効にする
defaults write com.coronalabs.Corona_Simulator no-console -bool true
```

これで、デバッグコンソールの自動起動を大人しくさせることが可能です。
心変わりして、自動起動させたくなった場合は、以下のコマンドを実行しましょう。

```bash:デバッグコンソールの自動起動を有効にする
defaults write com.coronalabs.Corona_Simulator no-console -bool false
```
EE Journalのケビンモリスによる「Xilinxが世界を分断する」- SDAccelへの客観的な視点

EE Journalのケビンモリスによる「Xilinxが世界を分断する」- SDAccelへの客観的な視点
by  Xilinx Employee	sleibso 12-02-2014 02:54 PM

http://forums.xilinx.com/t5/Xcell-Daily-Blog/Xilinx-Divides-the-World-writes-Kevin-Morris-at-EE-Journal-An/ba-p/550644

----
EE Journalのケビンモリスは、長い間、FPGA分野を見てきた方です。
本日、彼は、Xilinxの新しいSDAccel開発環境の最近の紹介記事を。[公開](http://www.eejournal.com/archives/articles/20141202-xilinx/)しました
それは長い記事で、全体を読むべきでしょう。ですが、ここではモリスの記事から、２，３個の要約的段落を紹介します。

「もし、FPGAが将来の計算エンジンになるなら、FPGA設計フローは、ソフトウエアエンジニア的な方向に構造的にシフトし、次のようになるに違いありません。

* デバイスは、プロセッサのようになり、実装はプログラミングするような感覚になる
* 合成、シミュレーション、レイアウトは、コンパイルとデバッグに置き替わる
* 最適化オプションの細かい制御は、スパイラル型開発や生産性が高いワークフローに置き替わる

簡単にいえば、ハードウエアエンジニア的なFPGA設計フローは、脇に置かれるようになるはずです。」

「それはまさにXilinxが今やっていることです。」

「SDx(ソフトウエアで定義されたなんちゃら)に入る - とは、様々種類のソフトウエアベースシステムエンジニアリングに対するXilinxのマーケティング手段です。
異なるアプリケーション分野において、ソフトウエア開発者は、異なる方言を持ちます。ソフトウエアネットワーキングは、検索、ビッグデータ処理、画像・信号処理とは著しく異なります。なので、Xilinxは様々なソフトウエアエンジニア種族に拡張でき、彼らにわかりやすく親しみやすいブランドを欲していました。
その最初の２つの例は、SDNet(ソフトウエア的ネットワーク向け仕様定義環境)とSDAccel(OpenCL/C/C++向け開発環境)です。」

もし、SDAccelの紹介記事を見逃しているなら、[こちら](http://qiita.com/wstone/items/0f675b6547eed72fba92)をご覧ください。

----
(訳注：ケビンの元記事から１つピックアップ）

Xilinxは、更なるSDxが登場予定であると語っており、ロジックデバイスが歴史的にサポートしてきたより多くの分野に約束する大きな戦略の１つが、SDxであることは明らかです。

この戦略が成功した場合、多数の以前には期待していなかったようなアプリケーションの中に、FPGA(もしくはFPGA風デバイス)を見始めることになるでしょう。

アプリケーションの中心的な部分は、ソフトウエアで実装されるようになるため、このような分野のほとんどで、”システムエンジニア”は、ハードウエアのスキル・専門知識よりソフトウエアのスキル・専門知識を持つ可能性が大変高くなります。

産業レベルでは、我々はまだこのトレンドの初期段階にいるに過ぎません。
確実にこのような結果になるかはまだわかりませんが、それを見届けることは興味深いことです。
baserJSで埋め込んだYouTubeを背景動画にする


コーポレートサイトにちょうどいいJavaScriptライブラリ **baserJS** の解説記事です。

Webサイトと詳しいAPIリファレンスはこちら [baserJS Webサイト](http://baserproject.github.io/baserjs/)

## デモ

デモはこちは http://codepen.io/YusukeHirao/pen/empxXV

## YouTubeを埋め込む

HTMLは[前回](http://qiita.com/YusukeHirao/items/50f95d39f8d889026fc4)と同様に`data-id`、`data-width`、`data-height`を指定するだけです。

```html
<div class="youtube" data-id="rb0zOstIiyU" data-width="1920" data-height="1080"></div>
```

ここでの`data-width`と`data-height`は縦横比（アスペクト比）の基準の幅と高さになります。1920x1080であれば、16x9としても問題ありません。

## 背景にするためCSSを調整

画面いっぱいに引き伸ばす場合は以下のようにします。`.youtube`の要素が基準になるので、デザインやレイアウトによって微調整してください。

```css
html,
body {
  width: 100%;
  height: 100%;
  margin: 0;
  padding: 0;
}

.youtube {
  position: fixed;
  top: 0;
  left: 0;
  z-index: 0;
  overflow: hidden;
  width: 100%;
  height: 100%;
}
```

## JS側で背景化するメソッドを実行

```js
$('.youtube')
	.bcYoutube()
	.bcBackground();
```

YouTube化した要素をそのままチェインで`bcBackground`メソッドを実行して背景化します。

## 背景の種類と基準位置の変更

`bcBackground`メソッドのオプションから背景の表示種類と、基準位置を変更できます。

### bcBackgroundのオプション

|プロパティ|型|初期値|説明|
|---|---|---|---|---|
|align|string|"center"|基準の横位置を `left` か `center` か `right` に変更する
|valign|string|"center"|基準の縦位置を `top` か `center` か `bottom` に変更する
|size|string|"contain"|動画の引き伸ばし方を `contain` か `cover` に変更する
|child|string|">*:first"|自分をコンテナとして、背景にする対象の要素のセレクタ

* * *

次回はYouTube動画をレスポンシブに対応させる方法です。
Gitのコミットメッセージを絵文字から始める

# Gitのコミットメッセージを絵文字から始める

この記事は[Frontrend Advent Calendar 2014 - Qiita](http://qiita.com/advent-calendar/2014/frontrend) 4日目の記事です。

## はじめに

[Atomのコントリビューティングガイドライン](https://atom.io/docs/latest/contributing)では、「[コミットメッセージを絵文字から始めることを検討してみよう](https://atom.io/docs/latest/contributing#git-commit-messages)」と説明しています。

例えば、次のようなコミットメッセージをpushした場合、

```
:construction: モックアップを作成
```

GitHub上では、

> :construction: モックアップを作成

のように絵文字が表示されます。（[Atomのコミット履歴](https://github.com/atom/atom/commits/master)）

テキストだけのコミットメッセージと比べ、一見して「あ、まだ作業中なのかな？」みたいのが汲み取りやすくて良いんじゃないかな、と思います。（ターミナルやIDEでコミットログ見ちゃう人は`:construction:`がそのまま出力されるのでアレですけど）

8割くらいは遊び心のつもりですが、ここしばらくは絵文字付きのコミットメッセージを気に入って使っています。

## チートシート

GitHubあたりが絵文字の意味付けリストを作ってくれると嬉しいんですが、今のところ無いので自分ルールで運用しています。Atomのルールをベースに拡張したものです。（[Gistにまとめたものはこちら](https://gist.github.com/pocotan001/68f96bf86891db316f20)）

- :art: コードのフォーマットや構造にテコ入れ
- :rocket: パフォーマンスを改善
- :pencil2: ドキュメントを書いた時
- :bulb: 新しいアイディア
- :construction: 作業中
- :heavy_plus_sign: 機能を追加
- :heavy_minus_sign: 機能を削除
- :speaker: ログを追加
- :mute: ログを削除
- :bug: バグフィックス
- :white_check_mark: テスト関係
- :lock: セキュリティ関係
- :arrow_up: 依存関係をアップグレード
- :arrow_down: 依存関係をダウングレード

[PDF版もあります](http://www.weed.nagoya/entry/2016/05/17/161141) by @weed 


## おまけ

絵文字を一覧したり探す時に便利なやつ。

- [Emoji cheat sheet](http://www.emoji-cheat-sheet.com/)
- [Emoji searcher](http://emoji.muan.co/)
- [1000ch/emoji-workflow](https://github.com/1000ch/emoji-workflow)

あ、あと他に面白い絵文字の意味付けを思いついた方は教えてください。
AWSでCakePHPを始める（保存版）

AWSでEC2を立ち上げたところから始めます。

$ sudo -s

EC2にPHPとMySQLをインストールします。

```
$ sudo yum -y install php php-mysql 
```
バージョンを確認。

```
$ $ php -v 
```
Cakephpをインストールする階層に移動。

```
$ cd /var/www/html 
```
cakephpの2.5.5バージョンをインストール。

```
$ wget https://codeload.github.com/cakephp/cakephp/zip/2.5.5
```
zipを解凍。cakephp-2.5.5フォルダができます。

```
$ unzip 2.5.5 
```


```
# mv cakephp-2.5.5/ cakephp/
```
rake test だと実行されないテストがあるので rake test:all を使うようにした

## 2014-12-26 追記

rails 4.2 では　`rake test:all` が DEPRECATED となり、`rake test` で test ディレクトリ以下のテストが全て実行できるようになったので、以下の記載には該当しません。安心して `rake test` を使いましょう。

## 以前の記事

`test/` 以下が以下のように構成されている時に普通に `rake test` でテストを実行してしまうと、`forms` や `services` 以下に置かれているテストが実行されない。

```sh
$ tree -L 1 -d test
test
├── controllers
├── factories
├── fixtures
├── forms
├── helpers
├── integration
├── mailers
├── models
├── services
└── workers
```

なので、CI 上では `rake test:all` を使うようにした。
ローカルでは guard でテストを回していたので気づかなかった。
ansible-galaxyでRolesを再利用する


"Ansible Galaxy"はRolesをシェアできるサービスです。uploadしたり、好みのroleを探してinstallする事ができます。ansible-galaxyはこのAnsible Galaxyを利用する為のコマンドラインツールです。
1.8のansible-galaxyではAnsible Galaxyにホストされているroleだけでなく、SCMを指定できるようになったので外部のリポジトリも扱えるようになりました。


## 使い方(SCM)

GitHubから。-pで配置するdirectoryを指定しています。
`ansible-galaxy install -p ./roles https://github.com/bennojoy/nginx`

ブランチ・タグも指定できます
`ansible-galaxy install -p ./roles https://github.com/ANXS/mysql.git,v1.0.3`


## 応用

1.8から-rで指定するファイルの拡張子を'yml'にする事で、ファイルから読み込む際も外部のリポジトリが使えるようになります。

ファイルを用意します

```requirements.yml
# from galaxy
- src: yatesr.timezone

# from github
- src: https://github.com/bennojoy/nginx

# from github with tag
- src: https://github.com/ANXS/mysql.git
  version: v1.0.3
```

実行します
`ansible-galaxy install -p ./roles -r requirements.yml`

## プライベートで使ってみる

プライベートで使っているgitlabに作成した自前のroleをansible-galaxyでinstallしてみます。

ansible-galaxy init [role名] でひな形が作成できます。オフラインで使用する際は`--offline`オプションも指定して下さい。


```
myrole
├── README.md
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── tasks
│   └── main.yml
├── templates
└── vars
    └── main.yml
```

commit, pushしたあと、ansible-galaxyでinstallしてみます。


```bash
$ ansible-galaxy install -p ./roles git+git@gitlab.example.com:orita/myrole.git
- executing: git clone git@gitlab.example.com:orita/myrole.git myrole
- executing: git archive --prefix=myrole/ --output=/var/folders/xx/xxxxxxxxxxxxxxxxxxxxxx/x/xxxxxxx.tar master
- extracting myrole to ./roles/myrole
- myrole was installed successfully
```
うまくいったようです。ssh+gitの場合はリポジトリパスの先頭に"git+"をつけるとうまくいきました。

## 注意事項

ansible-galaxyは依存しているrole(meta/main.ymlに記述する)も自動的に取得してくれるのですが、現時点ではAnsible Galaxyにあるものに限定されています。外部のリポジトリに置く場合は気をつけましょう。
>To download a role with dependencies, and automatically install those dependencies, the role must be uploaded to the Ansible Galaxy website. 
>[Ansible Galaxy — Ansible Documentation](http://docs.ansible.com/galaxy.html#advanced-control-over-role-requirements-files)

## あとがき

今まで自分で使う時はroleもろとも全部同じリポジトリに入れてしまい使い回しが厳しかったり（どっかで見たアンチパターン・・・）、gitのsubmoduleにしてみたもののどうも使い勝手が悪かったりでした。外部のリポジトリも扱えるようになってroleの使い回しが捗りそうです。Berkshelfみたいに使えて便利ですね。
人工知能のような人口無能！料理動画から物体認識と組み合わせで探る ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい

**※この記事は随時更新していく予定です。ストックしておくと更新通知を受け取ることができます。**

YouTube :tv: 最高でス。時間がどれだけあっても足りません。みなさんこんにちは。Load Average が四六時中1を超えていることは、人間に例えると何になるのか、そんなことを考えている毎日です。

さて、さて、料理が得意な人は、他人が料理している姿をみて何をつくっているのか、あらかた見当をつけることができます。私にはできませんがね。何故できるかと言えば、頭の中にレシピのストックがあるからです。

幸い YouTube 動画には「○○をつくってみた」「最高においしい○○のつくりかたと」いったメタ情報があり、何を作っているのかわかりそうです。しかし、これでは面白くも何ともありません。

私にはレシピのストックが頭の中にはありませんが、ネットの世界には比較的整ったレシピデータが存在し、それを私の記憶の代わりにすることは可能です。つまり、動画から

 - 使っている食材
 - 使っている器具=加工方法？
 - それらの順番

を認識できれば、レシピデータとマッチングさせ何の料理なのか判定できそう？

ということで、やってみましょう・・・

# :exclamation: 機械はシチューとカレーを認識できるのか？

料理とは縁遠い私でもシチューとカレーの作り方が非常に良く似ていることは知っています。噂では、最後に入れる固形ルーが違うだけだとか。機械はそれをうまく認識できるのだろうか？

# :exclamation: ラーメンとうどんの違いが理解できるのか？

ガイジンにはどちらもヌードルで違いはわからんのかもしれないが、やはりラーメンとうどんは圧倒的に違う。機械にそれがわかるのか？

以降続く
デプロイ時にWeb.configに値を設定する Parameters.xml の話

## 背景

ASP.NET で作ったサイトを [Web Deploy](http://www.iis.net/downloads/microsoft/web-deploy) パッケージを作成し、
バッチファイルによる展開をしている環境で、発行（デプロイ）時に値を設定したくなることがあると思います。

特によくあるのが次の2つのケースです

- パスワードを含むデータベース接続文字列・マシン鍵などはソースコード管理に入れたくない
- 一時的にIPアドレス制限をかけたい

この時役に立つ方法が
[Web 配置パッケージで Web 配置パラメーターを使用する](http://msdn.microsoft.com/ja-jp/library/ff398068.aspx)
です。

## 環境によって異なる値を設定する2つの方法

### ビルド時に設定する Web.*.config

VisualStudio2013で ASP.NET MVC プロジェクトを作成すると
Web.config と一緒に Web.Debug.config , Web.Release.config の2つのファイルが生成されます。
どちらも Web.config に対する値変更を指示する XSLT ファイルです。

- Web.Debug.config は Debugビルドの時にのみ適用される
- Web.Release.config は Releaseビルドの時にのみ適用される

本番環境用のデータベース接続文字列を Web.Release.config に記述すれば、
環境による違いを吸収して自動化することができます。

### デプロイ時に設定する SetParameters.xml

Web Deploy パッケージの作成をすると、5つのファイルが生成されます。

![QS_20141204-110346.png](https://qiita-image-store.s3.amazonaws.com/0/61535/e6473182-22e2-8561-218b-d2dda2037676.png)

このうち SetParameters.xml にある値がデプロイ時に上書きされます。

すなわちここにパスワードを記述すれば、
本番環境のデプロイ担当者だけが、パスワードにアクセス可能で、
ビルド環境を触る開発者やソースコードリポジトリにパスワードを曝さなくて済むようになりました。
イヤッホウ！

![aspnetParametersXml.png](https://qiita-image-store.s3.amazonaws.com/0/61535/6c9d2bcf-f95d-374c-fd65-91c096a3bd2e.png)

## Parameters.xml でデプロイ時に設定する対象を追加する

接続文字列についてはVisualStudioが自動的に判定して設定可能にしてくれますが、
それ以外の値を設定可能にするには Parameters.xml を ASP.NET プロジェクトの最上位フォルダ(Web.configの隣)に配置します。

例えば ipSecurity を Web.config に記述したとして、その allowUnlisted 属性の値を変更したいのであれば、
以下のようになります。

````Web.configの一部
<?xml version="1.0" encoding="utf-8"?>
<configuration>
......
  <system.webServer>
    <security>
      <ipSecurity allowUnlisted="false">
        <add ipAddress="127.0.0.1" allowed="true" />
      </ipSecurity>
    </security>
  </system.webServer>
......
```


````Parameters.xml
<?xml version="1.0" encoding="utf-8"?>
<parameters>
  <parameter name="/configuration/system.webServer/security/ipSecurity/allowUnlisted" description="IPアドレス制限">
    <parameterEntry kind="XmlFile"
                    defaultValue="false"
    scope="\\Web.config$"
    match="/configuration/system.webServer/security/ipSecurity/@allowUnlisted" />
  </parameter>
</parameters>
```

ここで、WebDeplay パッケージの作成をすると、 Setparameters.xml に行が増えます

![QS_20141204-113615.png](https://qiita-image-store.s3.amazonaws.com/0/61535/4e76c0a7-4364-0b5b-200f-a191dd56a731.png)

WebDeploy パッケージのバッチファイルを利用してデプロイ実行すると

![QS_20141204-113704.png](https://qiita-image-store.s3.amazonaws.com/0/61535/4b322c2b-dc3f-dab1-8757-28547ff90439.png)

IISアプリケーションとして展開された先の Web.config の値が書き換わりました!

![QS_20141204-113734.png](https://qiita-image-store.s3.amazonaws.com/0/61535/fda30405-533f-e9f6-fb7a-ceffd6fc92ea.png)

## 最後に

この機能については、日本語の記事に全く当たらず、
 pubxml ファイルに何か書けばいけるのではないか？など長らく悩んだ過去がありました。

CI、自動ビルドの結果を WebDeployパッケージの形で管理しているような環境であれば
役に立つのではないかと思います。
時間から timeConstant の値を求める

`AudioParam#setTargetAtTime` は3番目の引数に指定した [timeConstant](http://ja.wikipedia.org/wiki/%E6%99%82%E5%AE%9A%E6%95%B0) によって指数的に目標の値に漸近します。大きな値にすれば変化はゆっくりになるのですが、時には何秒程度でこの値に近づいて欲しいという感じで値を決めたいときもあります。
パラメータの値は次の式で求められますので、それを変換してやれば時間と目標値から timeConstant の値を求める関数を作ることができます。

```
v(t) = V1 + (V0 - V1) * exp(-(t - T0) / timeConstant)
```

```js
/**
 * calcTimeConstant
 * @param {number} v0  現在の値
 * @param {number} v1  目標の値
 * @param {number} dur 変化の時間(秒)
 * @param {number} precision 精度 (0.0-1.0)
 * @return {number} timeConstant
 */
function calcTimeConstant(v0, v1, dur, precision) {
  var vT = v0 + (v1 - v0) * precision;
  return -dur / Math.log((vT - v1) / (v0 - v1));
}
```

4番目の引数 "精度" は指定した時間に目標の値にどのくらい近くなるかです。1.0 に近づくにつれて早い時間で目標の値に近くなります。0.99くらいにしておけば良いです。

![param.png](https://qiita-image-store.s3.amazonaws.com/0/2568/fb8fe44c-863f-5842-86f1-d28f85c365e0.png)

1.0 から 0.1 まで 500ミリ秒 で変化させるの図。

このサイトで実際に値がどのようになるのかいろいろ試すことができます。

- [http://the.mohayonao.com/web-audio-api/audioparam/](http://the.mohayonao.com/web-audio-api/audioparam/#function%20calcTimeConstant(v0%2C%20v1%2C%20dur%2C%20precision)%20%7B%0A%20%20var%20vT%20%3D%20v0%20%2B%20(v1%20-%20v0)%20*%20precision%3B%0A%20%20return%20-dur%20%2F%20Math.log((vT%20-%20v1)%20%2F%20(v0%20-%20v1))%3B%0A%7D%0A%0Avar%20value%20%3D%200.1%3B%0Avar%20duration%20%3D%200.5%3B%0Avar%20precision%20%3D%200.99%3B%0Avar%20timeConstant%20%3D%20calcTimeConstant(param.value%2C%20value%2C%20duration%2C%20precision)%3B%0A%0Aparam.setTargetAtTime(value%2C%200%2C%20timeConstant)%3B)

参考: [Web Audio API - 4.5 AudioParamインターフェース](http://g200kg.github.io/web-audio-api-ja/#AudioParam)
Arduino Uno で音声合成LSIを利用する

こんにちは．nyagato_00です．
Arduino Unoで株式会社アクストの音声合成LSI"AquesTalk"を利用する際につまずいたので備忘録も兼ね記録を残します．

今回は，"ATP3011F1-PU"を利用しました．
これはホスト(Arduino)からシリアル通信を介してデータを送信し，任意の音声をリアルタイムで発話させることができます．

# 回路の設計
ブレップボードとArduino Unoを使って回路を組みます．
![LSIconnect.png](https://qiita-image-store.s3.amazonaws.com/0/50627/34026ae0-b083-5e85-5e50-930927792351.png)
今回はアンプを使わずに音量調整か出来るスピーカーを利用しました．
スピーカーのイヤホンジャック端子にワニ口クリップで接続しました．

# Arduinoのプログラム
[こちら](https://www.dropbox.com/s/3kn6orw93cz6340/AquesTalk.zip?dl=0)からArduino用のLibraryを取得してください．
Arduino>Libraryに設置してください．
以下にサンプルコードを示します．

```c
#include <AquesTalk.h>
#include <Wire.h>  // ライブラリ内部で使用するので定義必要
#define BUTTON_PIN 2
boolean started = false;

AquesTalk atp;  //インスタンス定義 変数名は任意

void setup()
{
  Serial.begin( 9600 );
  pinMode(BUTTON_PIN, INPUT);                       // Set button
  digitalWrite(BUTTON_PIN, HIGH);
}
void loop()
{
  if (digitalRead(BUTTON_PIN) == 0) {
    started = true;
  }

  if (started) {
    atp.Synthe("yahharoo.");  //引数に指定のテキストを発声(やっはろー)
  }
}
```

すると，スピーカーから"やっはろー"を発話してくれると思います．
発話させたい文字列はローマ字で入力します．
流暢に発話させる方法は次の記事に記載します．
FactoryGirlでユニーク制約がついたモデルとリレーション関係にあるモデルをテストする際に、Validation failed: hoge has already been takenが出た場合の対処法


##解決方法
initialize_with { find_or_create_by } を使うのじゃ。

##環境
* Ruby 2.1.3
* Rails 4.1.6
* RSpec 3.1.0
* FactoryGirl 4.5.0
* databas_cleaner 1.3.0

##現象
FactoryGirlでテスト書いてる時に詰まってしまった。
例えば下図のようなリレーションが貼られていて、videoのテストを書きたい場合。
※ここでcountriesのnameにはユニーク制約をかけているとする。
![スクリーンショット 2014-12-04 9.19.41.png](https://qiita-image-store.s3.amazonaws.com/0/3251/784279a1-86a2-5f3e-9c66-36778aa71778.png "スクリーンショット 2014-12-04 9.19.41.png")

```spec/factories/videos.rb
FactoryGirl.define do
  factory :video do
    country
    event
    name "イケてる動画"
  end
end
```

```spec/models/video_spec.rb
require 'rails_helper'

RSpec.describe Lesson, :type => :model do
  it "has a valid factory" do
    expect(FactoryGirl.build(:video)).to be_valid
  end
end
```

これを実行すると、

```bash
  1) Video has a valid factory
     Failure/Error: expect(build(:video)).to be_valid
     ActiveRecord::RecordInvalid:
       Validation failed: Name has already been taken
     # ./spec/models/video_spec.rb:5:in `block (2 levels) in <top (required)>'
     # -e:1:in `<main>'
```

というように、テスト失敗する。かなしい。

##原因
FactoryGirl.build(:video)するときに、以下のような流れでcountryを呼んでいるため。

```bash
Loading test environment (Rails 4.1.6)
[1] pry(main)> FactoryGirl.build(:video)
   (0.1ms)  BEGIN
  Country Exists (0.3ms)  SELECT  1 AS one FROM `countries`  WHERE `countries`.`name` = BINARY 'Japan' LIMIT 1
  SQL (0.2ms)  INSERT INTO `countries` (`created_at`, `name`, `updated_at`) VALUES ('2014-12-04 00:50:39', 'Japan', '2014-12-04 00:50:39')
   (0.6ms)  COMMIT
   (0.1ms)  BEGIN
  SQL (0.2ms)  INSERT INTO `events` (`country_id`, `created_at`, `name`, `updated_at`) VALUES (1, '2014-12-04 00:50:39', 'Oktoberfest', '2014-12-04 00:50:39')
   (0.2ms)  COMMIT
   (0.1ms)  BEGIN
  Country Exists (0.2ms)  SELECT  1 AS one FROM `countries`  WHERE `countries`.`name` = BINARY 'Japan' LIMIT 1
   (0.1ms)  ROLLBACK
ActiveRecord::RecordInvalid: Validation failed: Name has already been taken
from /Users/HeesungLee/.rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.1.6/lib/active_record/validations.rb:57:in `save!'
```

これはつまり、下図のような挙動になっている。

![aa.png](https://qiita-image-store.s3.amazonaws.com/0/3251/ca3f5014-63a1-d403-27d0-00ccae7b438a.png "aa.png")

①events_idを見て、eventを作りに行くも、eventで指定しているcountries_idがないため、countryをまず作る。
②countris_idを見て、countryを作る。

ここで②番目を実行する際に、ユニーク制約に引っかかる。そりゃそうだなってことで、どうすればよいか調べてみた。

##解決方法
やり方はいくつかある。
ここのサイト(http://d.hatena.ne.jp/a666666/20100402/1270134937) に書かれてるみたいに、countryのnameにシーケンス持たせたり、videoにcountryのインスタンス渡したりとか。
ただ、前者はhas_manyの関係満たせてないし、後者はめんどくさすぎる。（もっと深い構造間になると、めっちゃcreateしてインスタンス渡しまくる必要が出てくる）

何か良い方法ないかなあと考えていたら、find_or_create_byメソッド使えば良いということを知った。
具体的には下記のように使う。

```spec/factory/country.rb
FactoryGirl.define do
  factory :country do
    name "Japan"
    initialize_with { Country.find_or_create_by(name: name)}
  end
end
```

find_or_create_byはRails4.0から登場したメソッドで、検索条件を指定して、初めの1件を取得して、1件もなければ作成する。(http://railsdoc.com/references/find_or_create_by)

今回の場合は、①のときにcreateされて、②のときにfindされるので、OKという話。

分かってみるとそりゃそうや感あるけど、ちょっと詰まっていたので解決できてよかった。

便利。
[メモ] Ubuntu14.04でCaps Lockを無効にしてShift+Capsだけ有効にした

どうやらキーボードの設定変更はxkbというのを用いるそうなので、

[Happy my life | xkbでキーバインドを変更する](http://blog.cnu.jp/2014/05/12/use-xkb/)

こちらのサイトを参考にして、まずxkbの設定ファイルとかを作る。
こぴぺ

> まずベースとなる設定ファイル(mykbdファイル)を作成する。
>
> ```bash
$ mkdir -p ~/.xkb/keymap ~/.xkb/symbols
$ setxkbmap -print > ~/.xkb/keymap/mykbd
```

で、そのサイトではその後自分で設定ファイルとか作ってるんですが、よくわかりませんでした！()
けど、設定について勉強しようとおもって /usr/share/X11/xkb をみてたら /usr/share/X11/xkb/compat/japan とかいうファイルがあるんですよね。
これに「日本語環境ではCaps Lockは使わなくてEisuになってるよ」「Shift+Caps LockでCapsLockしてるよ」てきなことが書いてあって設定もしてあります。

要はこいつを読み込んじゃえばいいっぽいので、さっき作ったmykbdファイルをいじります。
mykbdファイルの中身はシステムによって異なるっぽいので、私の例です。


```:mykbd
xkb_keymap {
	xkb_keycodes  { include "evdev+aliases(qwerty)"	};
	xkb_types     { include "complete"	};
	xkb_compat    { include "complete"	};
	xkb_symbols   { include "pc+jp+us:2+inet(evdev)"	};
	xkb_geometry  { include "pc(pc104)"	};
};

```
この```xkb_compat```にjapanというファイルを追加で読み込ませます。```+japan```を追記します。

```:mykbd
xkb_keymap {
	xkb_keycodes  { include "evdev+aliases(qwerty)"	};
	xkb_types     { include "complete"	};
	xkb_compat    { include "complete+japan"	};
	xkb_symbols   { include "pc+jp+us:2+inet(evdev)"	};
	xkb_geometry  { include "pc(pc104)"	};
};

```

これでTerminal開いて

> ```bash
xkbcomp -I$HOME/.xkb ~/.xkb/keymap/mykbd $DISPLAY 2> /dev/null
```

ってやればCaps Lock効かなくなります。Fcitxの設定、英数でMozc終了にしてたんですがやっとちゃんと効くようになりましたありがたい

あとは起動時に効くように、.bashrc に上のとおなじコマンドを突っ込んでおくだけです。


##追記

これだとシステム起動後にTerminal起動しないといけないですね。
というわけで
・/etc/X11/xkb 以下に同じ構造を作る
・/etc/profile.d 以下に実行ファイルを作る(起動時に読み込み)
します。

まずは /etc/X11/xkb に ~/.xkb の中身をコピーシます

次に /etc/profile.d 下に実行ファイルを作りました。

```sh:japanese_caps.sh
#!/bin/sh
xkbcomp -I/etc/X11/xkb /etc/X11/xkb/keymap/mykbd $DISPLAY 2> /dev/null
```

/etc/X11/xkb を使っても良いかわからなかったのですが特に問題ないのかな…？一応これで起動時からCaps Lockが無効にはなりました。


##追々記

これでも何故か自動的にCaps Lockが有効になっていたりするようです。なんでや！(怒)

というわけで、GUI的に対処しました。ずるい気がするけど。

まずDashで session と検索して「自動起動するアプリケーション」を起動
右メニューの 追加 で新しい自動実行を追加。名前は好きなものにして、コマンドのところに 
```bash /etc/profile.d/japanese_caps.sh```
と記述(上でつけたファイル名)
これでログイン時にとりあえずCapsは無効化されます

次にログイン中にも有効化されるので、一定時間ごとにスクリプトを実行しましょう。

```
sudo apt-get install cron gnome-schedule
```

Dashで"Scheduled tasks"もしくは"gnome-schedule"と検索してScheduled tasksを実行
新規→「A Task That Launches Recurrently」→また同じようにコマンドのところに```bash /etc/profile.d/japanese_caps.sh```であとは自由に。
これでEvery Hourとかにしとけばいいのかな。
とりあえずこれで様子見ます。
シェルスクリプトでEXPLAINの結果がusing temporaryとfilesortのSQLを抽出する

なぜシェルスクリプトかと言いますと、一日一回感謝のシェルスクリプト中だからです。

EXPLAINしたい対象のSQLが記述してあるファイルをシェルスクリプトに指定します。
スクリプト内のmysqlコマンドにパスワードとDB名を変更します。
下記の通りシェルスクリプトを実行します。

```script:script
./analyze.sh tartget_sql.text
```

```analyze.sh
#!/bin/sh

filename=$1

cat ${filename} | while read line
do
  result=$(mysql -u root -ppassword database_name -e "EXPLAIN ${line}" | grep "filesort\|temporary")
  if [ $? -eq 0 ]; then
    echo ${line}
    echo -e "\033[0;31m${result}\033[0;39m"
    echo ""
  fi
done
```
ubuntu14.04にredmine2.4入れた手順

まずはrootになって最新に

```
sudo -s
apt-get update
```

Apacｈe2、mod_passenger for Apache2 インストール

```
apt-get install -y apache2 libapache2-mod-passenger
```

MySQLインストール

```
apt-get install -y mysql-server mysql-client
```

Redmineをインストール

```
apt-get install -y Redmine Redmine-mysql
```

途中 redmine/instances/default パスワード設定する

Redmineの各設定

```
cd /etc/apache2/sites-available
cp 000-default.conf redmine.conf
```


```linx:/etc/apache2/sites-available/redmine.conf
<VirtualHost *:80> → <VirtualHost *:8000> に変更して
        ServerAdmin （ServerAdmin）
        ServerName （ServerName）
        DocumentRoot /usr/share/redmine/public
```

```linx:/etc/apache2/ports.conf
Listen 80 → Listen 8000 に変更
```

```linx:/etc/apache2/mods-available/passenger.conf
</IfModule>の直前に
PassengerDefaultUser www-data
```

Bundlerインストール

```
gem install bundler
cd /usr/share/redmine/public
bundler install --without development test postgresql sqlite
```

画面が表示されること確認
http://(IP):8000/

テーマ「RedmineCRM」を入れる
http://redminecrm.com/pages/redminecrm-theme

```
cd /usr/share/redmine/public/themes
sudo wget http://redminecrm.com/license_manager/7647/redminecrm-0_0_2.zip
sudo unzip redminecrm-0_0_2.zip
```

redmineメニューの 「管理」 → 「設定」 →「表示タブ」でテーマに「Redminecrm」選択。

　
メールの設定
ここがつまずいたところ。
何度 configuration.ymlを変更して 再起動しても 設定画面は
”メールを送信するために必要な設定が行われていないため、メール通知は利用できません。 
/etc/redmine/<instance>/configuration.ymlでSMTPサーバの設定を行い、アプリケーションを再起動してください。”
のまま。
![00.png](https://qiita-image-store.s3.amazonaws.com/0/6568/1aa221f1-350b-ee31-20d0-eb04b1fbdc3f.png)

よく見たら、configuration.ymlは、
/usr/share/redmine/config/ ではなく /etc/redmine/default/ に設置する必要があった。


```
cp /usr/share/redmine/config/configuration.yml.example /etc/redmine/default/configuration.yml
```

で、configuration.ymlの内容変更してから
apache再起動で

```
service apache2 restart
```
![01.png](https://qiita-image-store.s3.amazonaws.com/0/6568/76fe6e0e-818f-045d-5af0-2ea34b31e3cc.png)

無事完了。とりあえず動くところまで。
zshのコマンドラインからカジュアルにMySQLにクエリを投げるの術

なんだかんだ、初めてQiitaつかいます。

MySQLをつかった開発をしているとき、ぼくはよくこんな感じのコマンドを打ちます。

```sql
SELECT * FROM myapp.user
```

恐らく、誰もが似たようなことをやっていると思います。
そして恐らく、多くの人はこのようにするでしょう。

```shell-session
% mysql -uroot -e 'SELECT * FROM myapp.user'
```

ぼくは、このようにします。

```shell-session
% SELECT * FROM myapp.user
```

どうなっているのか？
ぼくの.zshrcにはこんな具合のことが書いてあります。

```shell-session
function SELECT () {
    mysql -uroot -e "SET NAMES utf8; SELECT $*"
}


function SHOW () {
    mysql -uroot -e "SET NAMES utf8; SHOW $*"
}

alias SELECT="noglob SELECT"
alias SHOW="noglob SHOW"
```

まー、つまり、`*`は普通はglobとしてshell展開されるので、noglobを通すようにしつつ、SELECT/SHOW functionを通している。
だけです！！！！
これでカジュアルにSELECTを打てますね！！
なお、-urootとかやっているところは適宜権限を制限したユーザーに変えるとベターです。
あと、本番環境に入れるな。ダメ、絶対！

という小ネタでした！みなさんも楽しいMySQLライフを！

MySQL Casualなので、たいへんカジュアルにキメてみました。
明日は @kamipo さんです！明日もお楽しみに！！