OmniAICreator/Qiita-1.07M huggingface dataset:
Raspberry Pi で日本語入力

Raspberry Piの一通りの初期設定をして、
リモートデスクトップで入れるようにはできたものの、
日本語入力だけはどうしてもうまくいかなかった。
最初によくわからず、GUIでibus coreだけインストールしたからかなぁと思うけど…。

anthyというものやmozcというものをインストールしてみたけれど、やっぱりだめ。
日本語入力の状態になっているふうに見えるのに、実際打つと半角英数。。。

で、結局、ibusをアンインストールして、mozcを再度インストールしました。

**アンインストール**
`sudo apt-get autoremove ibus`
**インストール**
`sudo apt-get install ibus-mozc`

ようやく日本語入力できた！達成感。
![20160505.png](https://qiita-image-store.s3.amazonaws.com/0/118890/4d7a6c96-bf04-61c4-4cff-4eb05f5c80d3.png)
AWS認定ソリューションアーキテクト – アソシエイトに合格してきた

4月半ばに受けて合格してきました。
その時やったことなどを残しておく。

![Solutions-Architect-Associate.png](https://qiita-image-store.s3.amazonaws.com/0/122141/a7b1caad-5f49-013f-3958-12826cfdee98.png)


#試験について

試験の概要はこちら
https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/

点数は8割くらいは行ったかな
セキュリティとトラブルシューティングが得意なようで、これらはほとんど正解だった。

内容としては基礎の問題が多く、複数選択問題もあったが基本的に捻った問題は少なかった印象。
S3なんかは似たようなことを聞いている問題が複数あった気もするし。

#受験経緯
ここはSysOpsと同様で、
会社では仮想化やクラウドに携わる部署にいたので、AWSについても使いこなせるようになる必要があるということで、AWSの研修に参加させてもらえた。

研修は以下の4種類のコースを受講。

Amazon Web Services 実践入門1 (1日間)
Amazon Web Services 実践入門2 (1日間)
Architecting on AWS (3日間)
ソリューションアーキテクト – アソシエイトワークショップ (1日間)

各コースの説明はクラスとワークショップコースの説明ページで紹介されている。
https://aws.amazon.com/jp/training/course-descriptions/

会社のバウチャーを利用することができ、通常だと数10万円もかかる研修にタダで行くことができた。
…すごい

受講し始めたのは11月くらいからで、少しずつ勉強していったという感じ。
手厚い指導と実習がたくさんできたのでかなり理解ができたと思う。


#やったこと
勉強方法としてはAWS クラウドサービス活用資料集。これの理解が最重要。
https://aws.amazon.com/jp/aws-jp-introduction/

この資料でサービスの使い方がわかればほとんど大丈夫だと思う。

それとサンプル試験と模擬試験は100%理解した。

後はWebで他の方の体験記事を空いている時間に探して読んだなー

ソリューションアーキテクトを受ける前にSysOpsの研修と試験を受けたことも大きかったと思う。
この2つの試験はとても近い部分があるので、時間があるならば勉強しておいて損はない。
というか同じ問題も何問か出題された。

SysOpsについての記事はこちら。
http://qiita.com/hisash1/items/43b95f4c767c43aaa516

#終わりに
受験が後手後手になったのはマズイと思っていたが結果として合格できたので良かった。
CSS の :not() の使いかた

CSS でスタイルを適用したいけど、ここだけは適用したくない！ っていうときがたまにあります。

そういうときは、:not() を使うと簡単に実装できます。

# p タグだけ除外
```lang:style.css
:not(p) {
  /* something */
}
```

# id="foo" だけ除外
```lang:style.css
:not(#foo) {
  /* something */
}
```

# href 属性がある要素だけ除外
```lang:style.css
:not([href]) {
  /* something */
}
```


# type="text" だけ除外
```lang:style.css
:not([type="text"]) {
  /* something */
}
```

# container 要素の子要素 h1 だけを除外
```lang:index.html
<div id="container">
  <h1>タイトル</h1>
  <p>説明説明説明</p>
  <p>説明説明説明</p>
</div>
```

```lang:style.css
#container :not(h1) {
  /* something */
  /* p タグには適用され、 h1 タグには適用されない */
}
```

⚠️ container 要素の子孫セレクタ h1 を :not() で否定するので、`#container` と `:not(h1)` の間には子孫セレクタの書き方と同じように**スペース**を入れてください。

```
#container :not(h1) /* OK */
#container:not(h1)  /* NG */
```

# container 要素の子要素 img に適用させたいけど、emoji クラスがある img は除外
```lang:index.html
<div id="container">
  <img src="something.jpg">
  <img src="something.png">
  <img src="something.gif" class="emoji">
</div>
```

```lang:style.css
#container img:not(.emoji) {
  /* something */
  /* something.jpg と something.png には適用され、something.gif には適用されない */
}
```

⚠️ さきほどとは逆で、`img`と`:not()`の間にはスペースを**入れないで**ください
carrierwaveが出力するパスにホスト名を含める



carrierwaveが標準で出力するパスはこんな感じなのですが

```
Post.image.url  #=> /uploads/post/image...

```

APIなどを作っているとドメインまで含めたパスを出力したくなります。

そういうときは
/config/initializers/にcarrierwave.rbを作って

```
CarrierWave.configure do |config|
  config.asset_host = "http://localhost:3000"
end
```

と書いておけばOK




ちなみに今回はURLを定数にしておきたかったので

/config/initializers/に constants.rbを作って

```

module Constants
  if Rails.env == "production"
    URL = "https://production.com/"
  else
    URL = "http://localhost:3000/"
  end
end
```


こうしてみました。

```
require_relative "constants"
CarrierWave.configure do |config|
  config.asset_host = Constants::URL
end
```
AWS認定システムオペレーション(SysOps) アドミニストレーター – アソシエイトに合格してきた

2月に受けて合格してきました。
その時やったことなどを残しておく。

![SysOps-Administrator-Associate (1).png](https://qiita-image-store.s3.amazonaws.com/0/122141/11abd569-41ec-6e33-ce30-5577946e30ed.png)


#試験について

試験の概要はこちら
https://aws.amazon.com/jp/certification/certified-sysops-admin-associate/

点数はそこそこ、内容はソリューションアーキテクトより少し詳しく問われたという感じ。

あとはセキュリティやデータ管理など、運用をするためにどのようにデプロイするのが最適か、のような質問が多かった気がする。

#受験経緯
会社では仮想化やクラウドに携わる部署にいたので、AWSについても使いこなせるようになる必要があるということで、AWSの研修に参加させてもらえた。

2月の上旬に3日間の研修を受講。
ここではサービスの自動化と再利用性を考慮したシステムのデプロイ、管理、モニタリングの方法などを
実習を行いながら学ぶことができた。
以前にソリューションアーキテクトの研修を受けたときよりも進みがゆったりで説明をしっかりしてもらえたと感じた。

#やったこと
AWS クラウドサービス活用資料集はよく読んだ。
https://aws.amazon.com/jp/aws-jp-introduction/

ここからよくわからない用語とか使い方をWebで調べた感じ。

後は他の体験記事を書いている人の意見と同様にサンプル試験と模擬試験は受けておいたほうがいい。

私はSysOpsの後にソリューションアーキテクトを受けたが、ソリューションアーキテクトの内容をきちんと理解していれば解けると思った。

#終わりに
はじめにSysOpsから受けたのは不安だったが受かってよかった。
4月から異動になりクラウドとは異なる部署に行ってしまったので他の認定試験は受けないかもなー
為になるメモではないけどこの辺で終わりにする。
ST3 日本語環境向けプラグイン ConvertFullHalfWidth の解説

# ConvertFullHalfWidth とは？
Sublime Text 3 向けのカタカナ・アルファベット・数字を全角半角文字に変換するプラグインです。
[github:SublimeConvertFullHalfWidth](https://github.com/naoyukik/SublimeConvertFullHalfWidth)
※ 以前はConvertZenHanという名称で公開していましたが、同じような名前のプラグインがすでに公開されていたので変更しました。

なお、変換にはPyPIで公開されている [jaconv](https://pypi.python.org/pypi/jaconv/) を使用しています。

# どうやってるの？
選択文字列とどの文字を変換対象にするかのフラグをプラグインのコマンドに渡し、フラグに従ってjacnonvに文字列を渡すだけ！

# 今後の追加予定
jaconvにはひらがな→カタカナ、カタカナ→ひらがなの変換もあるのでこの変換も出来るように実装予定。


/** 「もう仕事としてはガラケー特化のサイトなんて作らないよねー」っと思ってたらドンピシャでスマホサイトをガラケー向けに作り変えるお仕事来てプラグイン大勝利で震えたのはいい思い出。 */

以上。
jQueryでクラス名から部分文字列を抜き出す

jQueryを使ってクラス名から部分文字列を抜き出す方法です。

例えば、テーブルのセル(td)にxxxxx_1〜xxxxx_N(Nは自然数）のようなクラス指定がされている場合にこのNを抜き取りたいという場合などに使います。

```
// jQueryオブジェクトがobjで取れているとして
var N = obj[0].className.split(" ")[0].replace(/^xxxxx_/, '');
```

簡単な解説。

- obj[0]でjQueryオブジェクトをDOMに変換します。
- ```className.splut(" ")[0]```で最初に指定されているクラス名を取り出します。２番目のクラスをターゲットにしたいなら添字を[1]にします。
- replace関数でxxxxx_を取り除いて（置換して）N部分だけ抜き出します。
ICML2016読みたい論文


* Learning Simple Algorithms from Examples
* Community Recovery in Graphs with Locality
* Online Learning with Feedback Graphs Without the Graphs
* Fast k-means with accurate bounds
* Compressive Spectral Clustering
* Estimating Accuracy from Unlabeled Data: A Bayesian Approach
* The Sum-Product Theorem: A Foundation for Learning Tractable Models
* Complex Embeddings for Simple Link Prediction
* Cross-graph Learning of Multi-relational Associations
* Conditional Bernoulli Mixtures for Multi-label Classification
* Discriminative Embeddings of Latent Variable Models for Structured Data
ConoHa API Documantation 一覧を一括でPostmanにImportする方法

公式ドキュメント
[ConoHa API Documantation](https://www.conoha.jp/docs/)

ConoHaのAPIドキュメント一覧を簡単に叩くことが出来る
Postmanのデータを作成しました。

Githubのリポジトリはこちらになります。
[ConoHa-API repository](https://github.com/tacyan/ConoHa-API)

<a href="https://www.getpostman.com/"><img src="https://raw.githubusercontent.com/postmanlabs/postmanlabs.github.io/develop/global-artefacts/postman-logo%2Btext-320x132.png" /></a><br />

全てのAPIを作成する予定でしたが、ConoHaのAPIが多すぎて、
途中で力尽きました。 (pull request 受け付けていますw)

ConoHaに限らず、今後PostmanのAPI一覧を、
公式で配るような時代になってくれると嬉しいなぁ。

## 使い方

ConoHaにログインします。
ログイン後にAPIの項目を選択してください。

![API.png](https://qiita-image-store.s3.amazonaws.com/0/55556/cdf5cca9-2481-1ac3-1c25-388fc04effb6.png)

必要な情報は、テナントID、ユーザー名、パスワードの3点になります。
(登録直後には、パスワードは設定されていないので、パスワードを設定してください。)

※補足
*_URLの部分はデフォルトでは、東京リュージョンのURLになっています。
URL部分の変数を変更して頂くと、シンガポール、アメリカにも対応することができます。

控えることが出来たら、Postmanの画面の
Manage Environmentsの項目からConohaを選択して下さい。

![environments.png](https://qiita-image-store.s3.amazonaws.com/0/55556/5e5c523d-9751-c5bb-71cb-3f5a4f7b875c.png)


選択することが出来たら、先ほど控えた
テナントID、ユーザー名、パスワードの情報を編集して、
Updateボタンを押してください。

これで準備は完了です。

![manage_environments.png](https://qiita-image-store.s3.amazonaws.com/0/55556/a7dffedf-96bc-1758-e9d8-0d6525cec336.png)


では実際にAPIを叩いてみましょう。

Identityフォルダから、POST {{url}}/v2.0/tokensを選択して、
Sendボタンを押してください。

![identity.png](https://qiita-image-store.s3.amazonaws.com/0/55556/b494ea0d-09c5-9e1d-7f09-bad53ec955a5.png)


成功すれば、Manage EnvironmentsのTokenに
データがセットされます。

データがセットされると、後は他の全てのAPIも叩くことが出来るようになります。

![token.png](https://qiita-image-store.s3.amazonaws.com/0/55556/b87dced8-a357-d73b-e2c1-df006c0e80c4.png)

## Postmanの使い方

### Tokenをセットしている部分。

```js
var jsonData = JSON.parse(responseBody);
postman.setEnvironmentVariable("token", jsonData.access.token.id);
```
postmanはjavascriptが使えるので、自由に編集してください。
postman.setEnvironmentVariableでtokenをセットしています。

### ResponseCodeをチェックしている部分。

response codeが`200`で返ってくることを確認しています。

```js
tests["Status code is 200"] = responseCode.code === 200;
```

Postmanは簡単なインテグレーションテストも行うことが出来るので、
おススメです。

AccountのTest結果

![account_test.png](https://qiita-image-store.s3.amazonaws.com/0/55556/0aca0471-9fa9-bcb3-14d7-ed0b009671ef.png)

※今回のテストはレスポンスコードしかチェックしていません。

もう一つPOSTMANのおススメ機能

Genarate codeというボタンをクリックすると、さまざまな言語のCodeを出力してくれます。
Codeを書く際に役立つ機能だと思います。

出力されたGoのsample code

![generate_code.png](https://qiita-image-store.s3.amazonaws.com/0/55556/c08dddfb-55d7-c033-2d8d-5c383e030232.png)

POSTMANの詳しい使い方は、POSTMANの公式ドキュメントを参考にして使ってみて下さい。

[Postman testing_examples](https://www.getpostman.com/docs/testing_examples)

### Postman collections対応状況

○のServiceはほとんどのAPIを追加しています。
△のServiceは基本的なAPIだけになります。
後はカスタマイズして使って下さい。

|Service一覧|対応状況|
|:--:|:--:|
|Identity|○|
|Account|○|
|Compute |○|
|Block Storage|○|
|Image |△|
|Network |△|
|ObjectStorage |△|
|Database |△|
|DNS |△|
|Mail |△|

ConoHaのAPIはほとんどOpenStackと同じ構成になっているので、
このPostmanのCollectionを使って、OpenStackのAPIも叩けます。
（誰かOpenStackのAPI一覧を一括でimportするPostmanのデータを作ってくれないかなぁ。）

[OpenStack Document](http://developer.openstack.org/api-ref.html)

是非POSTMANの色々な機能を使ってみて下さい。
関数を変数に格納する（Erlang）

関数型言語において、以下のサンプルで関数を変数に格納してみます。関数型言語といえば、書籍によってはオブジェクト指向言語との対比として「登場人物がすべて関数でできている」と書いてあったりして、意味不明でした。（Javaでいうと、プリミティブ型をラップしたオブジェクト型に変わるようなものなのかという印象でした）

**例1**
関数を変数に格納する

```erlang:sample.erl
-module(sample).
-export([one/0, two/0, add/2]).
%% func
one () -> 1.
two () -> 2.
add (X, Y) -> X() + Y().
```

**例1実行**

```erl:sample_exe
1> c(sample).
{ok,sample}

2> sample:add(one, two).
** exception error: bad function one
     in function  sample:add/2 (sample.erl, line 8)

3> sample:add(1, 2).    
** exception error: bad function 1
     in function  sample:add/2 (sample.erl, line 8)

4> sample:add(fun sample:one/0, fun sample:two/0).
3
```

3回add関数を実行して、1,2回目は実行時例外が発生して、4回目に正常終了しています。1回目は、oneとtwoを引数に当てていますが、モジュール名が付いておらずone、twoというアトム（Erlangにおける機能のひとつ）と解釈されて実行され、アトムは関数になれないため、実行時例外となっています。2回目は、静的な数字を当てていますが、1回目と同様の理由で関数にはなれないため、実行時例外となっています。3回目は関数を変数に格納する記述によって、add関数の中で引数の関数を実行しています。


**例2**
クロージャを利用する。

```erlang:closure.erl
-module(closure).
-export([a/1]).
%% func a
a(Aaa) ->
  io:format("set argument is ~s.~n",[Aaa]),
  fun() -> io:format("inner fun closs over access ~s~n",[Aaa]) end
.
```

**例2実行**

```erl:closure_exe
1> c(closure).
{ok,closure}
2> Value = closure:a("TIA!!").
set argument is TIA!!.
#Fun<closure.0.2302288>
3> Value().
inner fun closs over access TIA!!
```

Erlangにおいてfun()は、無名関数にあたります。関数の中に無名関数を作成でき、関数の外で定義された変数も、参照することができます。Erlangでもrubyなどと同じように、関数の末尾に書けば、Javaでいう「return　〜」になるんですね。
EC-CUBE と WordPress の連携

**[こちらにもっと詳細な記事を書きました。ぜひご覧ください！](https://qiita.com/nanasess/items/9260f0de30332d65db85)**

EC-CUBE の CMS 機能は貧弱なので、WordPress と連携できたら、とても便利だと思います。
これを実現するために、いくつかプラグインがでています。

 - [WordPressとの連携プラグイン](http://www.ec-cube.net/products/detail.php?product_id=276)
 - [WpPostPlus](http://gizmo.co.jp/plugins/wppostplus/)
 - [InfoTownLinkWp (EC-CUBE3版)](http://www.ec-cube.net/products/detail.php?product_id=1028)

しかし、これらは API を使用しなければならなかったり、 記事の URL に柔軟性がなかったり、カスタム投稿タイプは連携できない場合があったりと、手軽な反面、小々不便なところがありました。

wp-load.php を使う
---------------------

`wp-load.php` を EC-CUBE で require することによって、 EC-CUBE 内で、 WordPress のすべての関数を使用することができます。

### 設定方法

1. EC-CUBE をインストール(MySQLを使用した方が良いかも)
2. WordPress を **EC-CUBE の html ディレクトリ内にインストール**
3. EC-CUBE の html/require.php に以下を追記(EC-CUBE2系の場合)

```php
require_once __DIR__.'/wp-load.php';
```

これで、EC-CUBE 内の PHP で WordPress の関数を利用可能になります。


- `define` が重複するため、 EC-CUBE と WordPress を同じ DB にインストールしないとうまく動きません
- *WordPress や、プラグインの脆弱性を攻撃されて EC-CUBE のデータまで漏洩する危険がありますので自己責任で*
- *サンプルコードなど随時追記します*

参考
------

Smarty の `<!--{php}-->` タグを使うのはお手軽ですが、プラグインと干渉したり、保守しにくくなるので、できれば避けたいですね。

- [EC-CUBEにWordPressの機能をよびだす
](http://www.omnioo.com/record/ec-cube/ec-cubeにwordpressの機能をよびだす/)
- [EC-CUBE内にWPの記事を出力させる](http://magnets.jp/web_design/4558/)
- [Feedを使わずにWordPressの記事をブロックに表示](http://blog.re-fine.jp/?p=37)
railsでbundle installする時にインストールパスを指定


###bundlerでフツーにインストールすると

```ruby:console
$bundle install
```
=>システムのrubyにインストールされる模様。
私の環境ではrbenvを使っていたので、
`$HOME/.rbenv/versions/<current version>/lib/ruby/gems/<target version>/gems`
に入ってました。


###インストールパスを指定しよう

```ruby:console
$bundle install --path vendor/bundle
```

これでProjectディレクトリ配下のvendor/bundleディレクトリ内にgemがインストールされるようになります。

###このオプションを追加することで何が変わる？

Projectディレクトリ配下にある.bundleディレクトリ内のconfigファイルに設定が追記される。

```Project/.bundle/config
---
BUNDLE_PATH: vendor/bundle
BUNDLE_DISABLE_SHARED_GEMS: '1'
```

なので、次回以降はオプションを指定する必要がない。

```ruby:console
$bundle install
```
でok。
Docker で Jenkins 2.0 を動かすときのディスク権限、バックアップ/リストアに関するTips

Jenkins 2.0を動かすときのボリューム周りのTips を自分用のメモとして書いておきます。

![13148437_1166694753370341_915271346_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/3470/0bd84d85-6300-84d5-3331-07068c140025.jpeg)


課題
===
[Jenkins](https://hub.docker.com/_/jenkins/)のDockerイメージ、もしくはそれを継承したイメージを作成した場合、課題になるのが、ディスクの実行権限です。このイメージは、Dockerイメージの中で定義された、Jenkinsユーザ(uid 1000) で実行されるようになっています。

　Dockerコンテナは、通常だとコンテナの内部にボリュームを持っていて、コンテナを削除すると、ボリュームは消えてしまいます。設定内容を保存したいケースでは、`-v`オプションを使って、保存したいディスク領域を、ホストOSのディスク領域にマウントする必要があります。

ただ、その場合、マウントした、ホストOS側のディスク領域が、Docker内のJenkinsユーザからアクセスできる必要があります。

参考[Jenkins 2.0 container](https://hub.docker.com/_/jenkins/)

方式1. ホストOSに、Jenkinsユーザを作成する
===
単純な解決策としては、uid 1000を持ったJenkinsユーザをホストOS側に作ってしまえばOK
です。重要なのはuidなので、ホストOS側のユーザ名は違っていても問題ありません。
しかし、それだと、既にuid 1000が使われていたりする場合もありますし、ホストOS側をコンテナの中身に合わせるのは、ホストOSがコンテナに依存することになり気持ち悪いです。

```
$ docker run -p 8080:8080 -p 50000:50000 -v /your/home:/var/jenkins_home jenkins
```

方式2. docker volume を使う
===
私は上記の理由で、docker 1.9から導入された、`docker volume`を使うことにしました。これは、docker が使えるvolumeで、`docker run`を実行するときに通常の`-v`オプションで、マウント可能になります。

Volumeの作成は次の通り。デフォルトだと、localドライバが採用されます。もっと複雑なドライバを使いたい場合は、`-d`オプションがあります。詳しくはこちらまで。
[Mount a shared-storage volume as a data volume]
(https://docs.docker.com/engine/userguide/containers/dockervolumes/)

```
$ docker volume create --name jenkins-volume
$ docker volume ls  
```

volumeを作成したら、次のコマンドでJenkins 2.0 のボリュームをマウントしながら実行します。

```
$ docker run -p 8080:8080 -p 50000:50000 -v jenkins-volume:/var/jenkins_home jenkins
```

バックアップ
---

バックアップは`--volumes-from` オプションを使って、実行中のコンテナから次のようの実施することができました。

参考: [Backup, restore, or migrate data volumes](https://docs.docker.com/engine/userguide/containers/dockervolumes/)

```
$ docker run --rm --volumes-from <Container Name> -v $(pwd):/backup ubuntu tar cvf /backup/jenkins_home.tar /var/jenkins_home
```

リストア
---

リストアは試していませんが、次のようなコマンドでできると思います。

```
$ docker run -v jenkins-volue:/var/jenkins_home --name jenkins-restore ubuntu /bin/bash
$ docker run --rm --volumes from jenkins-restore -v $(pwd):/backup ubuntu bash -c "cd /var/jenkins_home && tar xvf /backup/jenkins_home.tar --strip 1"
```

では、よい Jenkins 2.0 ライフを。
laravel/lumen キュー操作 の仕組み 


Laravel/Lumenにはキューを処理するための仕組みが入っていて、

タスクの非同期処理などを簡単に実行出来るようになっている。

## Usage

1. キューの設定を行う。
2. タスククラスを作成する
3. タスククラスのオブジェクトをキューのバスにぶち込む
4. キューのリスナーを回す。

詳しくは
https://laravel.com/docs/5.2/queues

## キューの設定

config/queue.php にキュー設定を入れます。

複数のストレージタイプに対応しているものの、どのストレージタイプを使うかはグローバルの模様。

DB の場合、

````
'database' => [
    'driver' => 'database',
    'table'  => 'jobs',
    'queue'  => 'default',
    'expire' => 60,
],
````

SQSの場合、

````
'sqs' => [
    'driver' => 'sqs',
    'key'    => '{{AWS_CREDENTIAL_KEY}}',
    'secret' => '{{AWS_YOUR_SECRET}}',
    'queue'  => '{{https:// から始まるキューのURL}}',
    'region' => '{{AWS_RESION}}',
],

````

ストレージの中でもqueueという項目があって、ランタイムで格納先をスイッチすることが可能なよう。

DBの場合、テーブルが必要。コレは`php artisan queue:table`コマンドで作れるが、lumeでは何故か入ってない。

Command自体は入っているのでServiceProvider経由で登録してあげればartisan 経由でも使えるように。

````
<?php
use Illuminate\Support\ServiceProvider;
use Illuminate\Queue\Console\TableCommand;

class HogeServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->commands([
            TableCommand::class
        ]);
    }
}
````

生成サれたmigrationファイルではFacade必須なので注意。
(artisan ファイル内で withFacade 呼ぶだけでもOK)

## タスククラスの作成

````
<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class MyJob implements ShouldQueue
{
    use InteractsWithQueue, Queueable, SerializesModels;
    
    
    public function handle(){
        
    }
    
}

````

`handle`メソドにタスクの処理を入れておく。

必要なデータ等があればコンストラクタで突っ込めるようにしておくと良いっぽい。


## キューのバスに登録

`dispatch`関数というのがあるのでコレにjobを渡せばOKみたい。

````
$job = new MyJob();
dispatch($job);
````

中身はこんな感じ

````
function dispatch($job)
{
    return app(Dispatcher::class)->dispatch($job);
}
````

登録時にキュー指定用の文字列を渡して、キューの切り替えが可能

````
$job = new MyJob();
dispatch($job)->onQueue('emails');
````

delay で キューの登録を遅延させることが可能。

````
$job = new MyJob();
dispatch($job)->delay(60 * 5);
````

指定は秒。設定可能秒数はキューストレージの設定に依存し、SQSだと最大15分程度

## キューのリスナー

キューのリスナーを起動するにはartisan　コマンドを使います。

````
php artisan queue:listen
````

リスナーは標準では、configに記載されたqueueのプールを利用するので、

`onQueue`などでプールの切り分けをする場合には、`--queue` オプションを付けて、別のプロセスを起動する必要がある。 

````
$ php artisan queue:listen --queue={queueのURL}
````

`queue:listen`は、queueの監視を延々と続けるが、`queue:work`はタスクを１つづづ処理してくれる。

````
php artisan queue:work
````

## 設計上のポイント

queueのコンポーネントが解決してくれる点は以下のあたり。

- タスク処理に関する並列処理とかそんなん。
- キューに追加したタスクの呼び出し。
- キューテーブルに対するCRUD全般

逆に自分で設定したほうが良さそうなのは以下の点

- プールの振り分けをどのような形で実装するか。
- ログの出力だったりとかイベント。

基本的には永続性の無い一次キューストレージへの出し入れ、って所のハンドリングが主な機能なので、
ログを取りたかったり進捗見たかったり等、高度な(通常必要とサれるような)追跡が必要なケースでは、別の仕組みが必要。
Androidアプリのパッケージ名変更手順

Androidアプリのパッケージ名変更を行いたい場合は次の手順で行います。

# build.gradle (Module: app)のapplicationIdの変更

appレベルのbuild.gradleを開いて、defaultConfigブロックのapplicationIdのパッケージ名を変更します。

```
    defaultConfig {
        applicationId "パッケージ名を指定"
        :
    }
```

# AndroidManifest.xmlの変更

AndroidManifest.xmlを開いて、manifestタグのpackage属性の値を変更します。

```
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="パッケージ名を指定"
```

# 全ソースファイルのpackage文を変更

全javaファイルのpackage文に指定しているパッケージ名を変更します。
シェルなどを使って一括置換するのが良いでしょう。

```
package パッケージ名を指定;
```

# ソースファイルを配備しているディレクトリ名をパッケージ名に合わせて変更。

仮に、aaa.bbb.cccというパッケージ名をddd.bbb.cccに変更する場合、
[アプリのルートディレクトリ]/app/src/main/java/aaaディレクトリを
[アプリのルートディレクトリ]/app/src/main/java/dddディレクトリに名前変更します。

# 「Sync Project with Gradle Files」を実行する

メニューから[Tools] -> [Android] -> [Sync Project with Gradle Files]を実行する（直接ツールバー上の「Sync Project with Gradle Files」ボタンを押してもOK）。

問題なければ同期処理が走ってパッケージ名変更が完了します。
ビルドして動作確認をしましょう。
OpsWorks 自動修復機能

##Opsworks自動修復機能
Opsworksサービスには自動修復機能がある。
Opsworksサービスで構築されたインスタンスにはOpsworksエージェントがインストールされている。
このエージェントが定期的にAWSと通信をして、通信の遮断が確認されると、インスタンスに再起動処理が走る。

すべてのインスタンスには、サービスと定期的に通信する AWS OpsWorks エージェントがあります。AWS OpsWorks では、インスタンスの状態のモニタリングにこの通信が使用されます。エージェントとサービスとの通信が約 5 分以上途絶えると、AWS OpsWorks インスタンスは失敗したと見なされます。

https://docs.aws.amazon.com/ja_jp/opsworks/latest/userguide/common-issues-troubleshoot.html
railstutorial 第6章まとめ


#モデルを作る

##生成

###前準備

```ruby:Console
$rails g model User name:string email:string
```

これで必要なファイルが自動生成。

<strong>追記：</strong>
Rails3.2以降は属性の規定値がstringとなるため、省略可能となるようです。

```ruby:console
$rails g model User name email
```


###実際に作ってみる

```ruby
user = User.new
user = User.new(name:"Sample", email:"example@test.com")
```

model生成直後はこんな感じで作れる。
でも実際は名前とか必須じゃないと困る。
ので、validation機構を追加。

###Validation

```ruby:User.rb
class User < ActiveRecord::Base
  validates :name, presence: true
  validates :email, presence: true, uniqueness: {case_sensitive: false }
end
```

このvalidation機構を追加すると、Userを作るときに名前の正当性、emailの一意性(大文字小文字を区別しない)の検証が可能となる。

```ruby:Rails-console
user = User.new()
user.valid?
=>false
user.save
=>false
User.Create()
=>false
```

###どころでValidationって何がいいの？

=>ActiveRecord経由でDBに保存や変更をしようとした時、vlaidationに失敗すると変更をキャンセルするようになっている。

###いろんなvalidation

他にも存在性だけでなく、正規表現を使ったemailの正しい書式や、文字数のvalidationとかも行える。

```ruby:user.rb
validates :email, presence: true, length: { maximum: 250 }, format: { with: /<regular expression>/ }
```


##モデルのマイグレーション

```ruby:Console
$rails g migration add_index_to_users_email
```

インデックスを追加してみる。

```ruby:[timestamp]_add_index_to_users_email.rb
class AddIndexToUsersEmail < ActiveRecord::Migration
	def change
		add_index :users, :email, unique: true
	end
end
```

changeメソッドの中に何をするか書けば良い。
add_indexはインデックスを追加するメソッド。

```ruby:console
$bundle exec rake db:migrate
```

マイグレーションを実行。

※マイグレーション:DBに保存されているデータを保持したまま、テーブルの作成やカラムの変更を行うこと。

##テストあれこれ


###普通のテスト

RailsのテストフレームワークはRSpecとかいろいろあるけど、とりあえず一番シンプルなやつを。

```ruby:testfile.rb
test "should be valid" do
	@user = User.new(name:"Example User", email:"example@test.com")
	assert @user.valid?
end
```

ちなみにコントローラやモデルのテストは自動生成されている。
インテグレーションテストを作る場合には、railsコマンドを使用する。

```ruby:console
$rails g integration_test <テスト名>
```

###実行

```ruby:console
$bundle exec rake test
```

##コールバック

例えば、emailは保存前に小文字に変換しておきたいとする。

```ruby:user.rb
before_save: { self.email = email.downcase }
```

と書くことで、user.saveをする前にemailを小文字に変換することができる。
この機構はコールバックを使っていて、無名関数を直書きししてもいいし、別のメソッドを割り当てても構わない。

```ruby:user.rb
before_save :downcase_email

def downcase_email
	self.email = email.downcase
end
```

##パスワード

###下準備

bcryptのgemを追加。

```ruby:Gemfile
gem 'bcrypt', '~>3.1.7'
```

```ruby:console
$bundle install
```


あとは、modelに`password_digest:string`という属性を追加した後に、`has_secure_password`というメソッドを追加するだけで良い。

###まずはマイグレーション
```ruby:console
$rails g migration add_password_digest_to_users password_digest:string
$bundle exec rake db:migrate
```

###パスワードの実装
```ruby:user.rb
class User < ActiveRecord::Base
	...
	has_secure_password
end
```

こうすると、ハッシュ化されたパスワードをDB内の`password_digest`という属性に保存できるようになる。

さらに、Userモデルに対して`password`と`password_confirmation`が使えるようになる。

###パスワードのテストとvalidation

この`password`と`password_confirmation`属性は強制的にvalidation機構が追加されているので、
初めて追加した時はテストには軒並み失敗するようになっている。

ので、テストのデータにはちゃんとpassword/confirmationを追加する。

```ruby:user_test.rb
def setup
	@user = User.new(name:"example user",email:"example@test.com",
					 password:"foobar",password_confirmation:"foobar")
end	
	
```

さらにpasswordにはバリデーションも簡単に追加できる。

```ruby:user.rb
validates :password, presence: true, length: { minimum: 6 }
```
Ubuntu 16.04 LTSでMongoDBが起動できないとき

少しハマってしまったのでメモ。

今回からubuntuでもSysVinitの代わりにsystemdが正式採用されるようになったのですが、おそらくこれが原因でいくつかのサービスが起動できないという問題が発生しているようです。

##症状
適当にインストールしたMongoDBを起動しようとすると
`# sudo systemctl start mongod
Failed to start mongod.service: Unit mongod.service not found.`
あろうことかこのようなエラーが出てしまいました。

確かに、エラー文の通りに/etc/init.dや/lib/systemd/systemの中をみてもそれらしきファイルが見つかりません

##解決策
[こちら](http://stackoverflow.com/questions/37014186/running-mongodb-on-ubuntu-16-04-lts)によると、自分でmongod.serviceを作ってしまえということです。

`sudo vim /lib/systemd/system/mongod.service`

```:/lib/systemd/system/mongod.service
[Unit]
Description=MongoDB Database Service
Wants=network.target
After=network.target

[Service]
ExecStart=/usr/bin/mongod --config /etc/mongod.conf
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
User=mongodb
Group=mongodb
StandardOutput=syslog
StandardError=syslog

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

としてmongod.serviceを作成して
`sudo systemctl start mongod`
としたところ、うまく起動してくれました



##おわりに
MongoDB以外にも似たような問題が起きているケースがあるんじゃないかと思います。16.04LTSはまだ出たばかりなので、各種パッケージ側もそのうち対応してくれるんじゃないかと思います
AmazonRDS レプリケーション機能

RDSの同期、非同期レプリケーション機能いついて。
このように表現する伝わりづらいが、MultiAZ、リードレプリカのことである。

##同期レプリケーション
Multi-AZ機能。AWSでRDSエンドポイントのDNSレコードを切り替えてくれる。

DB インスタンスの計画的な機能停止または計画外の機能停止が発生すると、マルチ AZ を有効にした場合は、Amazon RDS により別のアベイラビリティゾーン内のスタンバイレプリカに自動的に切り替えられます。フェイルオーバーが完了するまでにかかる時間は、データベースアクティビティや、プライマリ DB インスタンスが使用できなくなった時点の他の条件によって異なります。フェイルオーバー時間は通常 60 ～ 120 秒です。

##非同期レプリケーション
リードレプリカ機能。
特に自動切り替えをしてくれるわけではない。
ソースデータベースに何かあった際は、手動でアプリケーションの向き先を切り替え、
対処する必要がある。


ソースデータベースのデータに変更が加えられるたびに、Amazon RDS によりソースリージョンからリードレプリカリージョンにデータが転送されます。
ROC曲線とPR曲線の違いについての考察 - 続き

# はじめに
[前回の記事](http://qiita.com/skyshk/items/016cd1820650ea78d101) ではROC曲線とPR曲線の違いに着目して，実験的に性質の違いをあぶり出してみました．ただ原理的な納得度はまだイマイチですよね．
今度は， __ROC曲線を等価な別の曲線と置き換えることで，よりPR曲線と比較しやすく__ してみたいと思います．

# ROC曲線と等価な曲線
ROC曲線とPR曲線の比較しにくさは，

* ROC曲線は横軸が「小さいほうが嬉しい軸」，縦軸が「大きい方が嬉しい軸」
* PR曲線は縦軸も横軸も「大きい方が嬉しい軸」

となっていることに由来するのではと考えました．
PR曲線の縦軸Precisionと横軸Recallは，どちらも大きい方が嬉しいけど，互いにトレードオフになっていて両得は難しい，という極めて現実的に解釈しやすい軸担っていると思っています．そこで，ROC曲線の方も，縦軸と横軸が両方「大きい方が嬉しい軸」に変換してやれないでしょうか．

ROC曲線の横軸FPR=False Positive Rate は，TNRと __FPR+TNR=1__ の関係にあります．
ですので，ROC曲線の横軸をFPRから __TNR=1-FPR__ に置き換えてやることでちょうどROC曲線とは左右を反転させたような曲線を得ることができます．

![AUCについての考察.001.jpeg](https://qiita-image-store.s3.amazonaws.com/0/51256/07130a5d-76fc-25c4-0330-7825c1f206e5.jpeg)

さらに縦軸と横軸を入れ替えてやると，ROC曲線と等価で，かつPrecision-Recall曲線と軸の意味合いがよく似たTNR-TPR曲線を得ることができます．これでROC曲線を直接考えるよりも比べやすくなったのではないでしょうか．

![AUCについての考察.002.jpeg](https://qiita-image-store.s3.amazonaws.com/0/51256/4b3119aa-14f9-4a09-5a98-7e2572a61905.jpeg)

# （ROC曲線と等価な）TNR-TPR曲線の形状と，負例の割合の関係

さて，各所でよく言及されているように

> TNの値が大きくなりやすい場合にROC曲線よりPR曲線が一般的に適している

とは一体どういうことでしょうか．

超定性的に言うと，（ROC曲線と等価な）TNR-TPR曲線は，正例に対して負例の割合が極端に大きくなるような予測問題に対しては，表現力がガクンと落ちてしまいます．

![AUCについての考察.003.jpeg](https://qiita-image-store.s3.amazonaws.com/0/51256/77e5f58a-33ee-5390-c27c-5382766a9bfb.jpeg)

このイメージ図にあるように，正例と負例との割合があまり変わらなければば，TNR-TPR曲線は，横軸TPRの広い領域にわたって予測精度を表現できます．

一方で，正例に対して負例が極端に多いときは，予測ランキングの上位付近ではほぼほぼTN>>FPとなってしまい，TPRがそれなりに大きくなるまでは，TNRはほぼ1から張り付いて動きません．
したがってTPRがまだ小さいような予測ランキング上位付近でどれだけ良い精度が出せたところで，それはAUCの向上としては顕著には現れてこず，逆に予測ランキング下位付近で多少良い精度が出せれば，AUCは大きく動く，ということになります．
これは[前回の記事の実験結果](http://qiita.com/skyshk/items/016cd1820650ea78d101#実験的検証)とも整合しています．

# 結論
以上が，「TNの値が大きくなりやすい場合にROC曲線が適していない」と言われる所以なのだと思います．まだまだ納得度は微妙ですが，ROC曲線はTNR-TPR曲線に置き換えることでPR曲線と比較しやすくできる，というのは嬉しい発見でした．
もしまだ考察を深めたい方がいらっしゃれば，ぜひこのTNR-TPR曲線を利用してみてください．
Elixirらしい書き方へのリファクタ


Elixir製のライブラリのソースを読んでいると、
`if`はほぼなく、ファンクションのパターンマッチと`case`で分岐が作成されています。
それらを参考にして、自分のコードを書きなおしてみようと思います。

今回直したコードの[PR](https://github.com/tamai/sloth/pull/3/files)

case文の例

下記のコードでは、`Regex.run`の戻り値を`match`に受け、
`if match`で`match`をチェックし、その後の処理に進んでいます。

これを`if`を使わず、`case`を使用するようにします。

```修正前
  def handle_cast({:handle_incoming, type = "message", send_data}, state) do
    Logger.debug "#{type} -> #{inspect send_data}"
    PlugManager.get_all
    |> Enum.each(fn({module, functions}) ->
      Enum.each(functions, fn({regex, func}) ->
        match = Regex.run(regex, send_data["text"])
        if match do
          [_text | captures] = match
          GenServer.cast(module, {:call_plugin, func, [send_data, captures]})
        end
      end)
    end)
    {:noreply, state}
  end
```

`Regex.run`をそのまま`case`の対象として使用し、
`[_text | captures] = match`の部分を`case`のマッチに持ってきました。
また以前は、matchがtrueだったパターンしかありませんでしたが、
nil時の処理も記述しました。

今回の主旨とは異なりますが、`send_data["text"]`の記述も面倒なので、
ファンクションのパターンマッチで`text`変数に入れました。

```修正後
  def handle_cast({:handle_incoming, type = "message",
      %{ "text" => text } = send_data}, state) do
    Logger.debug "#{type} -> #{inspect send_data}"
    PlugManager.get_all
    |> Enum.each(fn({module, functions}) ->
      Enum.each(functions, fn({regex, func}) ->
        case Regex.run(regex, text) do
          [_text | captures] ->
            GenServer.cast(module, {:call_plugin, func, [send_data, captures]})
          nil ->
            Logger.debug "nothing match #{text}"
        end
      end)
    end)
    {:noreply, state}
  end
```

当初の目的は達成していますが、このコードはネストが深いことと、
1つのファンクションにロジックを書きすぎているので、それもリファクタしたいと思います。

以下が、直した結果です。

- `PlugManager.get_all`も`case`の対象にしてみました。
- 1ファンクション、1ロジックに収めるようにしてみました。

コード量が多くないりましたが、関数単位でテストを書くため、
こちらのほうがテストが書きやすくなったのではないかと思います。

```修正後
  def handle_cast({:handle_incoming, type = "message", send_data}, state) do
    Logger.debug "#{type} -> #{inspect send_data}"
    case PlugManager.get_all do
      map when map == %{} ->
        Logger.debug "Plugin not set"
      map ->
        each_module(map, send_data)
    end
    {:noreply, state}
  end

  defp each_module(module_map, send_data) when is_map(module_map) do
    Enum.each(module_map, fn({module, functions}) ->
      each_functions(module, functions, send_data)
    end)
  end

  defp each_functions(module, functions, send_data) when is_list(functions) do
    Enum.each(functions, fn({regex, func}) ->
      match_function(module, regex, func, send_data)
    end)
  end

  defp match_function(module, regex, func, %{ "text" => text } = send_data) do
    case Regex.run(regex, text) do
      [_text | captures] ->
        GenServer.cast(module, {:call_plugin, func, [send_data, captures]})
      nil ->
        Logger.debug "nothing match #{text}"
    end
  end
```

おわりです。

もっといい書き方あるよ！とかあったら、編集リクエストください:innocent:
buildを使って複数のアクティブレコードのオブジェクトを作成する。

環境はRails 4.2.2

buildを使って複数のアクティブレコードのオブジェクトを作成する。

テーブルの関係はuserとtagsが1:n。
Modelは下記のような感じで関連付け(アソシエーション)を指定する。


```user.rb
class User < ActiveRecord::Base
  has_many :tags
end
```


```tag.rb
class tag < ActiveRecord::Base
  belongs_to :user
end
```

あとは下記のようにbuildメソッドに配列を渡してやれば、Userに紐付けたTagモデルのActive Record配列が取得できる。
 
```
@user = User.first
@tags = @user.tags.build([{ name: "Ruby"}, { name: "Haskell"},{ name: "Lisp"}])
# => [#<Tag id: nil, user_id: 1, name: "Ruby", created_at: nil, updated_at: nil>, #<Tag id: nil, user_id: 1, name: "Haskell", created_at: nil, updated_at: nil>, #<Tag id: nil, user_id: 1, name: "Lisp", created_at: nil, updated_at: nil>]
```
Direct connect, 署名付きURL

## Direct correct

###
ステップ 1: Amazon Web Services にサインアップする
ステップ 2: AWS Direct Connect 接続リクエストを提出する
ステップ 3: クロスコネクトを完了させる
ステップ 4: （オプション）AWS Direct Connect との冗長接続を設定する
ステップ 5: 仮想インターフェイスを作成する
ステップ 6: ルーター設定をダウンロードする
ステップ 7: 作成した仮想インターフェイスを検証する

###クロスコネクト？
コロケーションプロバイダに連絡してクロスネットワーク接続をリクエストします。この接続は、クロスコネクトとも呼ばれます
→つまりイクイニクスにヒアリングシートを提出すること

## 署名付きURL
S３とCloudfrontに利用可能

####S3
ファイル名、バケット名、期限、アクション（PUT,GET）で制限をした、
指定したアクションのみ実施可能なURLを発行できる。
署名付きURLを払い出す際は、実施許可するアクションを実行できるIAMUserから払い出す。
ナイーブベイズ（多クラス分類）

## ナイーブベイズとは
多クラス分類用。スパムメールの分類とかに使われているのが有名。

### ベイズの定理を使ったクラスに属する確率算出

yを目的変数、x($x_{1}$〜$x_{n}$)を説明変数とすると、[ベイズの定理](http://qiita.com/yshi12/items/1a31a7cb8d0e0a18484b)を使うと、与えられたサンプルがどのクラスに属するかの確率を以下で計算できる。

```math
P(y | x_{1},・・・x_{n}) = \frac{P(y) * P(x_{1},・・・x_{n} | y)} {P(x_{1},・・・x_{n})}
```

ちなみに、「ナイーブ」とは説明変数が互いに独立であるという仮定をすることから来てる。説明変数が互いに独立とは以下を意味する。

```math
P(x_{i} | y, x_{1},・・・,x_{i+1},・・・,x_{n}) = P(x_{i} | y)
```

「yが起きた時の$x_{i}$は、他のxの状態に影響されませんよ」ってこと。
なんでこんなことをするかというと、ベイズの定義の右辺の分子の式が簡単になるから。

独立性を仮定することで、$P(x_{1},・・・x_{n} | y) = \prod_{i=1}^n (x_{i} | y)$と書けるので、

最終的なベイズの定理の式が以下となる。

```math
P(y | x_{1},・・・x_{n}) = \frac{P(y) * \prod_{i=1}^n (x_{i} | y)} {P(x_{1},・・・x_{n})}
```

この時の分母の$P(x_{1},・・・x_{n})$は固定値になるので、クラスに属する確率の算出には考えなくてもOKなので無視しちゃえる。

```math
P(y | x_{1},・・・x_{n}) \propto P(y) * \prod_{i=1}^n (x_{i} | y) \\
```
（$\propto$は比例するって意味の記号です。）

これで、各クラスに分類される確率が出るので、それが一番高い確率だったクラスと判別すればクラスの推定が可能。

```math
\hat{y} = {\arg \max}_{y} P(y) * \prod_{i=1}^n (x_{i} | y)
```

### Gaussian Naive Bayes(ガウシアンナイーブベイズ)
説明変数が連続値の場合、これが正規分布に従うと仮定する手法を、特にGaussian Naive Bayesと呼ぶ。

その時のクラスに属する確率は、以下で表せる。

```math
p(x = v | c) = \frac{1}{\sqrt{2 * \pi * \sigma_c^{2}}} * \mathrm{e}^{-\frac{(v - \mu_{c})^{2}}{2 * \sigma_c^{2}}}
```

## やってみる（sklearn）
irisのデータセットを使って、ガウシアンナイーブベイズをやってみる。

```{do_gaussian_naive_bayes.py}
from sklearn import datasets                           # データロード用
from sklearn.cross_validation import train_test_split  # 学習/テストデータ作成用
from sklearn import metrics                            # 精度評価用
from sklearn.naive_bayes import GaussianNB             # ガウシアンナイーブベイズ実行用

# データ用意
iris = datasets.load_iris()
X = iris.data
Y = iris.target
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, random_state=0)

# ガウシアンナイーブベイズ実行
model = GaussianNB()              # インスタンス生成
model.fit(X_train, Y_train)       # モデル作成実行

# 予測実行
predicted = model.predict(X_test) # 予測実行
metrics.accuracy_score(Y_test, predicted) # 精度計算
> 1.0
```

精度100%だった。
carrierwaveでフォームを使わずにファイルを保存する

Seedデータなど入れる際にpublicフォルダなどにサンプル画像を用意して、そこからからデータを引っ張ってきたい場合はよくあると思います。


こんな感じでシンプルに書くことができました。

```
post = Post.new
image = "ファイルの絶対パス"
post.image = File.open(image)
post.save
```


もしファイルが別のモデルに保存されてる場合は

```
original_image = Image.find(1)
image = original_image.image.current_path
```
こんな感じ
safariの上下のバーでＷＥＢが隠れる

スマホ対応のWEBを作成しています。

CSSでbodyの,width/height:100%として
画面全体(画面スクロール：なし）に表示させるようなものを作っています。

実機で確認したところ
androidの各ブラウザ(標準のブラウザ/clome/firefox)は問題ありません。


しかし、iphone5s(ios:9.2.1)のsafariで確認すると
縦向きのときは問題ないのですが
横向きに回転させると、上のURLバー？下のステータスバー？が表示されて
WEBの一部が隠れてしまいます。

上のURLバー？下のステータスバー？が表示されても
WEBが隠れないようにしたいのですがいい方法はないでしょうか？
ConEmuからDocker Toolbox起動をする

# ようやく
boot2docker をインスコしようと思っていたら [DockerToolbox](https://www.docker.com/products/docker-toolbox) がリリースされてた。どんだけ躍進的なんだ Docker ！！　ということでインスコ。そして ConEmu から起動したいと思ったら、またはまるｗ

# 答えが！
[Docker on Conemu](http://superuser.com/questions/1027790/docker-on-conemu) にのってましたｗ

![image](https://qiita-image-store.s3.amazonaws.com/0/44540/24aadfc9-cd0d-d68a-9821-32ab0483a1e8.png)

task parameters:

```
/dir "C:\Program Files\Docker Toolbox"
```

Command:

```
"C:\Program Files\Git\bin\bash.exe" --login -i -new_console:C:"C:\Program Files\Docker Toolbox\docker-quickstart-terminal.ico" "C:\Program Files\Docker Toolbox\start.sh"
```

快適！！

と思ったら、docker.exe のパスがとおってなかった

![image](https://qiita-image-store.s3.amazonaws.com/0/44540/88eac9bd-fc9f-64a4-4399-5108ad3c5690.png)

これで安心！！
CentOS7 パッケージ管理（インストール済みRPMの最新化）



# 概要
OSインストール直後はパッケージが古いため、一括でパッケージを最新化する。


# GPGキーのインポート

事前にGPGキーをインストールする。
なおGPGキーは「GnuPG」（GNU Privacy Guard）という暗号化ソフトで生成される公開鍵。apt-getコマンドやyumコマンドを使ってインターネットから入手できるパッケージが正しい配布先のものかどうかのチェックなどに利用する。
事前にインストールすることは必須ではないが、インストールしておくとyumコマンド実行時に警告がでないので事前に入れた方が気持ち良い。


```bash:CentOS7の公式レポジトリのGPGキーをインポート
sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
```

```bash:GPGキーのインポート結果の確認
rpm -qa gpg-pubkey*

<出力結果>
gpg-pubkey-f4a80eb5-53a7ff4b
```


# パッケージの更新

kernelのバージョンアップがある場合に、GRUB2の設定が書き換わるので念のためにバックアップを取得する。（別に取得しなくても問題ない。）

```bash:grub.cfgのバックアップ
sudo cp -piv /boot/grub2/grub.cfg /boot/grub2/grub.cfg.`date "+%Y%m%d"`

<出力結果>
`/boot/grub2/grub.cfg' -> `/boot/grub2/grub.cfg.YYYYMMDD'
```

以下のコマンドで、インストール済みのRPMパッケージを更新する。

```bash:RPMパッケージの更新
sudo yum -y update

<出力結果>
（省略）
```


# インストール結果の確認
以下のコマンドでインストールしたパッケージの情報を確認する。

```bash:yumのログ確認
journalctl -l /usr/bin/yum

<出力結果>
（省略）
```


# OSの再起動
パッケージ更新後は、念のためOSを再起動して挙動を確認する。

```bash:OS再起動
sudo shutdown -r now
```


# 次の手順
[CentOS7 ログ管理（systemd-journald.service）の設定](http://qiita.com/mattsun/items/4701e9260300e8e10edf)

以上
sanitize.cssを使っているとChromeでinputに入力時に文字が消える

OSX + Chromeでinputエリアで入力して変換しようとするとこんなんなる。

![スクリーンショット 2016-05-05 15.26.23.png](https://qiita-image-store.s3.amazonaws.com/0/16060/9dba37e0-08ba-6a09-4142-bbd9238d8763.png)

どうも::selection要素が悪さをしているらしい。

::selectionって何よって、調べてみたら非標準な疑似要素らしい。
https://developer.mozilla.org/ja/docs/Web/CSS/::selection

該当するCSSを削除するかcolorを#000000にすると解消する。（適当）

```css:sanitize.css
/* specify the background color, font color, and drop shadow of text selections */

::-moz-selection {
	background-color: #b3d4fc; /* required when declaring ::selection */
	color: #ffffff;
	text-shadow: none;
}

::selection {
	background-color: #b3d4fc; /* required when declaring ::selection */
	color: #ffffff;
	text-shadow: none;
}
```
JSP/サーブレット ファイルアップロードの実装

JSP/サーブレット(3.0以降)でのファイルアップロードの実装方法です。

# JSP
JSP側ではformタグにて"<b>enctype=multipart/form-data</b>"と設定することで、フォームからファイルデータを送信できるようになります。

```jsp:upload.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>ファイルアップロード</title>
</head>
<body>
<form method="POST" enctype="multipart/form-data" action="../UploadServlet">
<input type="file" name="file"/><br />
<input type="submit" value="アップロード" />
</form>
</body>
</html>
```

# サーブレット
サーブレット側の実装のポイントは以下のとおりです。

* @MultipartConfigアノテーションで、サーブレットがmultipart/form-data形式のリクエストに対応
* HttpServletRequest#getPartにて、リクエストからjavax.servlet.http.Partを取得
* Part#writeにて、サーバの指定のファイルパスへファイルを保存

```java:UploadServlet.java
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

@WebServlet("/UploadServlet")
@MultipartConfig(location="/tmp", maxFileSize=1048576)
public class UploadServlet extends HttpServlet {
    @Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		Part part = request.getPart("file");
    	String name = this.getFileName(part);
    	part.write(getServletContext().getRealPath("/WEB-INF/uploaded") + "/" + name);
    	response.sendRedirect("jsp/upload.jsp");
	}
    
    private String getFileName(Part part) {
    	String name = null;
    	for (String dispotion : part.getHeader("Content-Disposition").split(";")) {
    		if (dispotion.trim().startsWith("filename")) {
    			name = dispotion.substring(dispotion.indexOf("=") + 1).replace("\"", "").trim();
    			name = name.substring(name.lastIndexOf("\\") + 1);
    			break;
    		}
    	}
    	return name;
    }
}
```

# MultipartConfig
各設定値は以下のとおりです。

| 変数名 | 説明 |
|:-----------|:------------|
| location | アップロードファイルを一時的に保存するフォルダパス |
| maxFileSize | アップロードファイルの最大サイズ(バイト) |
| maxRequestSize | リクエストデータの最大サイズ(バイト) |
| fileSizeThreshold | 一時保存するファイルサイズの閾値(バイト) |
~/Library/LaunchAgents/homebrew.mxcl.mongodb.plist: Operation not permitted



mongoが起動してないので、tmux上で再起動しようとしたら、以下のエラーが出た。

```
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mongodb.plist
#=> ~/Library/LaunchAgents/homebrew.mxcl.mongodb.plist: Operation not permitted
```

## 解決方法

tmuxではlunchctlはエラーになるらしい。tmuxでないconsoleで以下のコマンドを打つ

 ```
 brew services restart mongodb
 ```

`brew info` で確認すると、tmuxではlaunchctlがうまく動かないよって言われてる。。。

 ```
 brew info mongodb
 #=> WARNING: launchctl will fail when run under tmux.
 ```

## 解決に至った経緯

1. プロセスを確認 => なかった

 ```
 ps aux | grep mongo
 #=> なし
 ```

1. brewのserviceを確認 => あった

 ```
 brew services list
 #=> mongodb started root /Library/LaunchDaemons/homebrew.mxcl.mongodb.plist
 ```
1. brew serviceで再起動 => 失敗

 ```
 brew services restart mongodb
 #=> Failure while executing: /bin/launchctl unload -w /Users/vankobe/Library/LaunchAgents/homebrew.mxcl.mongodb.plist
 ```

1. brew infoでmongodbの起動方法など再確認 => tmuxに関するwarningを発見

 ```
 brew info mongodb
 #=> WARNING: launchctl will fail when run under tmux.
 ```
ベイズの定理

## ベイズの定理とは

以下の式で表す、Bが起こった条件のもとでAが起こる確率が計算できるというもの。
$P(A|B) = \frac{P(B|A) P(A)} {P(B)}$

真髄は、等号の左右で$P(A|B)と$P(B|A)が入れ替わっているところ。

## 例
### クッキー問題
ボールが二つあり、それぞれクッキーが40個ずつ入っている。
ボール１には、バニラクッキーが30個、チョコレートクッキーが10個。
ボール２には、バニラクッキーが20個、チョコレートクッキーが20個。
目を閉じて、クッキーを１個とる。そのクッキーがバニラだったら、ボール１から取った確率は？？　を解く。

ベイズの式【$P(A|B) = \frac{P(B|A) P(A)} {P(B)}$】を、BをV(バニラを選ぶ)、AをB1(ボール1を選ぶ)とすると、以下になる。
$P(B_{1}|V) = \frac{P(V|B_{1}) P(B_{1})} {P(V)}$

左辺は、バニラクッキーを選んだ時にボール１の確率なので、これを求めるため右辺を一つ一つ計算していく。

$P(V|B_{1})$
ボール1を選んだ時に、バニラクッキーである確率。
= $\frac{30} {40}$

P(B_{1})
ボール１を選ぶ確率。
= $\frac{1} {2}$

{P(V)}
バニラクッキーを選ぶ確率
= $\frac{50} {80}$

よって、以下と計算できる。

```math
P(B_{1}|V) = \frac{P(V|B_{1}) P(B_{1})} {P(V)} \\
P(B_{1}|V) = \frac{(\frac{30} {40}) * (\frac{1} {2})} {\frac{50} {80}} \\
P(B_{1}|V) = \frac{3} {5}
```

選んだボールは不明だけど、クッキーがバニラだったという事実から、選んだボールの確率が求められちゃうというところがベイズの定理のすごいところ。
Jenkins2をMacにインストール


Jenkins2.0が出たので、Macにインストール。
起動方法やホームディレクトリが分からなかったので ＿φ(￣ー￣ )

## 環境
- Mac OS X EL Capitan 10.11.5 Beta
- Jenkins 2.1


## Installation
pkgファイルを使ってインストール。 

1. [Jenkins](https://jenkins.io)から、pkgファイルをDL
2. pkgファイルでインストール

## How to use

以下のコマンドで、Jenkinsを起動、停止できる。
インストールすると、Mac起動時にJenkinsが自動起動になる模様。  

```bash
# start
sudo launchctl load /Library/LaunchDaemons/org.jenkins-ci.plist
# stop
sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
```


## その他
### ホームディレクトリ
初期だと、以下。
```/Users/Shared/Jenkins/Home```


### LTS （Long Term Support）
Jenkins 2.xの最初のLTSは、「1st week in July, 2016」とのこと。
（Jenkins Online Meetupで話があったが、間違っていたらごめんなさい。）

### ログインできなくなって困ったら
/Users/Shared/Jenkins/Home/config.xmlで、"false"に設定。

```xml
...
<useSecurity>true</useSecurity>
...
```


## 参考
- [Thanks for using OSX Installer](https://wiki.jenkins-ci.org/display/JENKINS/Thanks+for+using+OSX+Installer)
- [Jenkins Online Meetup](http://www.meetup.com/ja-JP/Jenkins-online-meetup/events/230154841/?eventId=230154841)
git grep + pecoで選択したファイルをエディタで開く

git grep便利ですよね。
git管理下にあるファイルに絞ってgrepしてくれます。
その結果をpecoを使ってさらに絞り込んで、選択した行をエディタで開くコマンドを書いてみました。

## デモ

pecoとgitがインストールされている必要があります。

```sh
$ git-grep-edit word
```

![git-grep-edit.gif](https://qiita-image-store.s3.amazonaws.com/0/15319/e3ff0303-8e8f-f1f4-aad7-8c5822ae373f.gif)



## コード

コマンド自体は数行ですが、pecoとgitがインストールされている必要があります。

```bash
#!/bin/bash

P=$(git grep -n $1 | peco | awk -F: '{print "+"$2" "$1}')
if [ ${#P} -ne 0 ]; then
	$EDITOR $P;
fi
```

## インストール
pathが通ったところに配置すれば使えますが、npmからインストールするのが手軽です。
nodeがインストールされている必要があります。

```sh
$ npm install -g git-grep-edit
```
iOSアプリでバッヂを表示させるOSS、3選

#はじめに#
iOSアプリ内にバッヂをつけるためのOSSを3つ紹介します。

#UIView+MGBadgeView#
件数の表示用です。UIViewのカテゴリなので使いやすいです。

<img width="397" alt="687474703a2f2f6935372e74696e797069632e636f6d2f317a62716b6e6c2e706e67.png" src="https://qiita-image-store.s3.amazonaws.com/0/84185/5392f6c0-64c8-80c8-2005-878d6fea6a39.png">
##条件##
Objective-Cベース。MITライセンス。iOS6.0+。Matteo Gobbi氏による。
https://github.com/matteogobbi/UIView-MGBadgeView
##カスタマイズできるもの##
badgeValue: NSInteger　バッヂの内容。整数のみ。文字列はセットできない。何かの件数を表示するとき用に特化している。
outlineWidth: float 円の外枠の幅
badgeColor: UIColor バッヂの色
textColor: UIColor　テキストの色
position: ボタンに対してどの角にバッヂを出すか。MGBadgePositionTopRightなどの定数が用意されている。
displayIfZero: Bool 0件のときに表示したい場合はtrueを指定。

その他、MGBadgeViewはUIViewのサブクラスなので、userInteractionEnabledを指定することなども可能。
##インストール##
cocoapods 'UIView+MGBadgeView'
`@import UIView_MGBadgeView;` としてModulesとしてインポートできる。
##使った感想##
* UIViewのカテゴリなので、**UIView由来のクラスなら既存コードをそのままにしたままバッヂを追加できる。とても使いやすい。**
* 最終コミットが現時点では1年前。安定しているので良いとも言えます。
* Objective-Cベースなので、Swiftとのハイブリットなプロジェクトでも安心して使える。
* バッヂの位置が標準のposition指定だとずれてしまうことがあった。すなわち、ボタンのレイアウトによっては間が空いた位置にバッヂが配置されてしまうことがある。この点については、.centerで直接badgeViewの位置を指定して調整した。
* バッヂの上をタップするとボタンが反応しないので、userInteractionEnabled = falseをしてタップを透過させて使った。

#MLPAccessoryBadge#
文字列を指定できるバッチです。
![badgeDemo.png](https://qiita-image-store.s3.amazonaws.com/0/84185/ca7dd69a-ef74-359c-f015-2a9e7b1cfe85.png)

##条件##
Objective-Cベース。MITライセンス。iOS5.0+。Eddy Borja氏による。
https://github.com/EddyBorja/MLPAccessoryBadge
##カスタマイズできるもの##
* バッヂの形状。種類ごとにクラスが用意されている。UIViewベースのMLPAccessoryBadgeと、それを継承したMLPAccessoryBadgeArrow、MLPAccessoryBadgeChevron(バッヂと>アイコン)、MLPAccessoryBadgeEmboss。デモがあるので、わかりやすいです。
* バッヂの内容は、文字列、数値(NSNumberとIntの2パターンあり)を指定できる。
* バッヂのテキストカラー(setTextColor)
* バッヂの最小サイズ(badgeMinimumSize)
* バッヂを非表示にする(badgeHidden)
など。

##インストール##
cocoapods 'MLPAccessoryBadge'
Swiftでは、import MLPAccessoryBadgeでインポートできます。
##使った感想##
* UITableViewCellのAccessoryViewにセットすると、右側にバッヂを出せる。**Newなどのバッヂを出すときに向く。** ちなみに、非表示にしたいときはbadgeHiddenを使うのではなく、AccessoryViewにnilをセットするほうをおすすめします。Disclosureアイコンなどを表示する管理が楽になるからです。
* ソースは2,3年前の更新が最終で、安定していて良いとも言えます。
* Objective-Cベースなので、Swiftとのハイブリットなプロジェクトでも安心して使える。

#UIBarButtonItem-Badge#
UIButtonにバッチをつけることができます。

<img width="375" alt="screenshot2.png" src="https://qiita-image-store.s3.amazonaws.com/0/84185/9ddc81f1-cd5f-f02a-8e70-44ac369e82c6.png">

もちろん、名前の通り、UIBarButtonItemにバッチをつけることもできます。

<img width="320" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/84185/ccee3826-6787-cd41-9d6d-a53b5bddb7ae.png">


##条件##
Objective-Cベース。MITライセンス。iOS6.0+。mikeMTOL氏による。
https://github.com/mikeMTOL/UIBarButtonItem-Badge
##カスタマイズできるもの##
badgeValue: NSString 文字列なので、数値を文字列化してセットする。
badgeBGColor、badgeTextColorで色指定できるほか、badgeFontでフォント指定もできる。badgeOriginX,Yが用意されている。
shouldHideBadgeAtZeroをfalseにすると、0件と表示させることができる。

##感想##
* スターが多い(今554件)。ソースの最終更新は3ヶ月前。メンテナンスに安心感がある。
* UIButtonのカテゴリなので、ボタン以外にもつけたい場合に工夫が必要。その点を考えると、**前掲のUIView+MGBadgeViewを使うほうが使いやすいと思います。**ボタン以外につける予定が全くない場合、スター数やソースの更新を基準に、こちらのOSSのほうが良いかもしれません。
* Objective-Cベースなので、Swiftとのハイブリットなプロジェクトでも安心して使える。
SVM（多クラス分類）

## SVMとは

Support Vector Machineの略。
学習データを用いて複数のクラスを分類する線を得て(学習モデル作成)、未知のデータ属する分類を推定する方法。

### SVMでの分類の概要
元の次元から1つ低い平面を超平面と呼び、最適な超平面(分離面)を探す。

例えば下図だと、黒丸と白丸を分離する線(H1やH2)を引くことを実施する。
(この図は、X1とX2の二次元のデータを表しているが、H1やH2は直線で1次元。
もし三次元のデータがインプットなら、2次元で分類できる平面を探すことになる。)

<img width="484" alt="スクリーンショット 2016-05-05 13.31.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/40159/b4c5208a-a3b4-d5fb-6336-b192a7ad17a1.png">


最適な分離面の探し方は、マージンが最大になる分離面を探索する。
マージンとは、図でいう灰色の線で、各クラスの点から分離面への垂線の距離。

例えば、H1もH2も黒丸と白丸を分類する分離面と言えるが、マージンが大きいH2の方が分類力が高い。（H3は分類すらできてないので全然ダメ。）

### カーネルトリック（カーネル法）
上の例は綺麗に分類できそうだけど、そうでない場合がほとんど。
そういう時に分離面を探す方法をカーネルトリックという。

例えば、下図だと、直線で赤丸と青丸を分離するのは困難。

<img width="484" alt="スクリーンショット 2016-05-05 13.46.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/40159/2e1db86c-d0f6-88b3-ed59-68740ab9c84c.png">

そこで綺麗に分離できるように、サンプルを別の空間[特徴空間]に写像(一定のルールで点を移動させる)して、その空間で分離面を探す。

<img width="852" alt="スクリーンショット 2016-05-05 13.45.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/40159/21e2a0a8-5f0c-2a5a-b685-a7a34488582d.png">

こうしてマージン最大となる分離面を得られたら、未知のデータが入力されたら、写像した時のルールに沿って特徴空間に写像し、特徴空間上で分離面のどこに属するかでクラス判別する。

これがとても分かりやすい。→[カーネルトリック参考動画](https://www.youtube.com/watch?v=3liCbRZPrZA&feature=youtu.be)

## データ用意
irisのデータを利用。[ここ](http://qiita.com/yshi12/items/26771139672d40a0be32)と一緒。

### データの概要
```{describe_iris.py}
iris.head()
```

<img width="460" alt="スクリーンショット 2016-05-04 3.45.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/40159/4965a3b9-2dc9-5f5f-10e1-4caacec4360d.png">

<img width="238" alt="スクリーンショット 2016-05-04 3.50.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/40159/9b3baf2d-17ff-20de-8e67-d96262f14d94.png">　の長さと幅のデータ

## やってみる
```{svm.py}
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn import datasets
from sklearn.cross_validation import train_test_split # クロスバリデーション用

# データ用意
iris = datasets.load_iris()    # データロード
X = iris.data                  # 説明変数セット
Y = iris.target                # 目的変数セット
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, random_state=0) # random_stateはseed値。

# SVM実行
from sklearn.svm import SVC # SVM用
model = SVC()               # インスタンス生成
model.fit(X_train, Y_train) # SVM実行

# 予測実行
from sklearn import metrics       # 精度検証用
predicted = model.predict(X_test) # テストデーテへの予測実行
metrics.accuracy_score(Y_test, predicted)
> 0.97368421052631582
```

精度97.4%。高い。
Better Touch Toolの設定を晒す

# はじめに

主に自分用のメモ。最近、OS再インストールをした時に設定が消えてしまったのでバックアップ代わりにメモを残す。
Macの時に欠かせないツールであるBetter Touch Toolの自分用の設定を書き留める。Better Touch Toolは既に有料化してしまったが、まだ代替と呼べるツールがない。　　
また、主にMacBookAirでの使用なため、使っている機能はTrackpadsとWindow Snappingのみ。

# Trackpads

## Global
### 5 Finger Click => Enter Fullscreen (If Supported)
(Ctrl + Cmd + F)
画面最大化
5本指は意識しないと押さないので、特殊な操作を押し付けるのに便利な設定

### 5 Finger Swipe Up => Sleep Display
(Opt + Cmd + Eject)
画面スリープ
EjectがMacBookAirにないので、離席時などに使う

### 3 Finger Swipe Down => Close Window Below Cursor (Works in Mission Control)
ミッションコントロール中のアプリケーション終了
後述の設定と同様、3 Finger Swipe Downには閉じる関係のコマンドを入れる

### TipTap Left (1 Finger Fix) => Open Finder
Finderを立ち上げる
使用頻度は多くないが、ターミナルやFinderのショートカットを入れておくと便利だと思われる

## Finder
### 3 Finger Swipe Left => 3F Swipe Left (Page Back)

Page Back
2本指はスクロール関係、3本指はタブなどの操作に割り当てる

### 3 Finger Swipe Right => 3F Swipe Right (Page Forward)

Page Forward
上述と同様

## Google Chrome
### 3 Finger Click => Cmd + Opt + F

検索のショートカット
使用頻度は少ない

### 3 Finger Swipe Down => Cmd + W

タブの終了
3本指はタブなどの操作に割り当てる思想で閉じる動作に入れる

### 3 Finger Swipe Left => Cmd + Opt + →

右タブへの切り替え

### 3 Finger Swipe Right => Cmd + Opt + ←

左タブへの切り替え

### 3 Finger Swipe Up => Cmd + T

新しいタブの立ち上げ
タブの終了の逆動作

### 3 Finger Tap => Cmd + Click

新しいタブでのリンクを開く
Cmd + Clickと違って片手で操作がしやすい

# その他

Better Touch Toolの設定などと競合すると困るものなども設定変更する

## システム環境設定 => トラックパッド

### ポイントとクリック

「調べる＆データ検出」をOFF
便利かもしれないが、使わない(ChromeのCmd+Clickと操作が被るため、3本指でなければ使えるかも)

「タップでクリック」をON
クリック操作は疲れるのでこの設定が前提 

### スクロールとズーム

「スクロール方向」をナチュラル

### その他ジェスチャ

「フルスクリーンアプリケーション間をスワイプ」を4本指で左右にスワイプ
「Mission Control」を4本指で上にスワイプ
「アプリケーションExpose」を4本指で下にスワイプ
3本指のスワイプ関連を4本指に変更する

# 編集履歴
* 2016/5/5 初稿