OmniAICreator/Qiita-1.07M huggingface dataset:
example.metadataを使って、テストごとにDatabaseCleaner.strategyを切り替える

`DatabaseCleaner.strategy = :transaction`でレコードを削除していると、ROLLBACKとSAVEPOINTを使ってレコードの作成、削除を行う。
その際に作成されるレコードはindexが作成されないため、FULLTEXT searchでの検索に引っかからないなどによってテストが通らない。
そのため、`DatabaseCleaner.strategy = :truncation`に設定する必要があるのだが、:truncation`を使うと実際にレコードを登録してしまうため`:trusaction`に比べると実行時間が長くなってしまう。

そこで、必要な箇所だけ`metadata`で経由で`:truncation`と`:transaction`を制御するようにしました。

## metadataでDatabaseCleaner.strategyを切り替える
``` rb:spec_helper.rb

RSpec.configure do |config|

  ## 各種設定

  config.use_transactional_fixtures = false

  config.before(:each) do |example|

    DatabaseCleaner.strategy = example.metadata[:cleaner] || :transaction
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end
end

```

あとはテスト側で、下記のように`cleaner`の種類を指定することで一部分のみ`:trucation`に設定することができます。

```rb
  describe 'search hoge', cleaner: :truncation do

  end
```

## 参考記事
* [database_cleaner transactionの設定 ](http://qiita.com/yoshitsugu/items/3470dbcadfdd677be543)
Library not loaded: libmysqlclient.18.dylib (LoadError) の対処

# 結論

MySQL のバージョンが 5.7 になったのが原因。
MySQL 5.7 には `libmysqlclient.20.dylib`, MySQL 5.6 には `libmysqlclient.18.dylib` がついてくるので、MySQL 5.6 にダウングレードすることで対処する。

```
brew uninstall mysql
brew install mysql@5.6
```

# 環境

- Homebrew 0.9.9
- OS X El Capitan 10.11.4
- MySQL 5.7.11 (installed with Homebrew)
- Ruby 1.9.3-p591
- Rails 3.1.12

# エラーの内容

rails を起動させようとすると下記のエラーになる。長いので途中に改行を入れている。

```
/xxxxx/.bundle/ruby/1.9.1/gems/activesupport-3.1.12/lib/active_support/dependencies.rb:240:in `require':
    dlopen(/xxxxx/.bundle/ruby/1.9.1/gems/mysql2-0.3.16/lib/mysql2/mysql2.bundle, 9):
        Library not loaded: /usr/local/opt/mysql/lib/libmysqlclient.18.dylib (LoadError)
  Referenced from: /xxxxx/.bundle/ruby/1.9.1/gems/mysql2-0.3.16/lib/mysql2/mysql2.bundle
  Reason: image not found - /xxxxx/.bundle/ruby/1.9.1/gems/mysql2-0.3.16/lib/mysql2/mysql2.bundle
```

要は `/usr/local/opt/mysql/lib/libmysqlclient.18.dylib` が読み込めないと。

試しに `find /usr -name libmysqlclient.18.dylib` なんてしてみたけど、そもそも `libmysqlclient.18.dylib` がなかった。

# 先行記事を読んでみる

## [MacにてRailsでMysqlを使おうとすると『 9): Library not loaded: libmysqlclient.18.dylib (LoadError) 』が発生する場合の対策](http://qiita.com/w7tree/items/656b5d3e6a6f0a0b475e)

`sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib` で解決したとのことだが、今回は手元に `libmysqlclient.18.dylib` がない。

## [アップデートした El Capitan で Library not loaded: libmysqlclient.18.dylib (LoadError) と出る](http://qiita.com/puzzel/items/8768324d6c60417f4d6c)

`sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/lib/libmysqlclient.18.dylib` で解決したとのことだが、今回は手元に `libmysqlclient.18.dylib` がない。

## [Library not loaded: /usr/local/lib/libmysqlclient.18.dylibのエラーの解決](http://qiita.com/kozap0824/items/cccb9656964783fad634)

`libmysqlclient.18.dylib` がないという同様の状況だが、たまたま保有していた `libmysqlclient.18.dylib` のバイナリを使うことで解決している。今回は（ｒｙ

## [mysql - Create a symlink for the libmysqlclient.18.dylib library - Stack Overflow](http://stackoverflow.com/questions/33655943/create-a-symlink-for-the-libmysqlclient-18-dylib-library)
1 位の回答が MySQL の 5.7 から 5.6 へのダウングレードを薦めている。これはいけそう。

# 結論

```
brew uninstall mysql
brew install mysql@5.6
```
で MySQL をダウングレードする。

MySQL 5.6 が入ると自動で `/usr/local/lib/libmysqlclient.18.dylib` が置かれるので、エラーが解消する。
必要に応じて `bundle install` し直すといいかもしれない。
proxy環境下でDocker for Macのpullを通す(問題点ありのワークアラウンド)

環境
Mac OS X: 10.11.4
Docker for Mac: 1.11.1-beta10 (build: 6662)

proxy環境下でDocker for Macでpullを実行すると以下のようなエラーが出る

```
$ docker pull busybox
Using default tag: latest
Pulling repository docker.io/library/busybox
Error while pulling image: Get https://index.docker.io/v1/repositories/library/busybox/images: dial tcp: lookup index.docker.io on 192.168.65.1:53: server misbehaving
```

フォーラムの[この投稿](https://forums.docker.com/t/need-to-specify-proxy-settings/8650/17)を参考にDocker for Macの裏側で動いているalpineにプロキシを設定する

## 1.screenコマンドでaplineにログイン(ユーザ名はroot、パスワードはなし)

```
$ screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty
Welcome to Moby alpha
Kernel 4.4.6-moby on an x86_64 (/dev/ttyS0)

                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/

docker login: root
```

## 2. /etc/init.d/docker を編集してhttp_proxy, https_proxyなどを追記する

```
# vi /etc/init.d/docker

#!/sbin/openrc-run

export http_proxy=http://proxyのURL:PORT/
export https_proxy=http://proxyのURL:PORT/

depend()
{
        after transfused
        before chronyd
}

start()
〜省略〜
```

## 3. alpine上でdockerを再起動

```
# service docker restart
```


## 4. Mac側でpullすると成功する

```
$ docker pull busybox
Using default tag: latest
385e281300cc: Pull complete
a3ed95caeb02: Pull complete
Digest: sha256:4a887a2326ec9e0fa90cce7b4764b0e627b5d6afcb81a3f73c85dc29cea00048
Status: Downloaded newer image for busybox:latest
```

# 問題点
Mac側でDocker for Macを再起動するとその度にalpineが初期化されるようで、
/etc/init.d/dockerに追記した設定や、その他の手動で作成したファイルがクリアされてしまう・・・
Google App Engine / Ruby のapp.yamlの生成

# TL;DR
- GAE/Rubyを動かすためのapp.yaml を生成する

# command


```zsh

-> % gcloud preview app gen-config

This looks like a Ruby application. Please confirm the command to run
as the entrypoint: [bundle exec rackup -p $PORT]:
Writing [app.yaml] to [/Users/TakumiKanzaki/Sites/gae.sample.com].
All config files already exist, not generating anything.
```

- current directoryのソースを適当に判断してくれて生成してくれる
- entrypoint のところにapp を起動するコマンドを書けば基本的にはok

# app.yaml

```zsh

-> % cat app.yaml
api_version: 1
entrypoint: bundle exec rackup -p $PORT
runtime: ruby
vm: true
```

- 最低限の設定だけ生成されるので、他に必要な設定は自分で書く

# Ref
- https://cloud.google.com/sdk/gcloud/reference/preview/app/gen-config
- https://cloud.google.com/appengine/docs/flexible/ruby/configuring-your-app-with-app-yaml
pacman -Syuでハマった点(2016/5/9) virt-install

以下に遭遇

* [[solved] [virt-install] Conflicting files with virt-manager / Pacman & Package Upgrade Issues / Arch Linux Forums](https://bbs.archlinux.org/viewtopic.php?id=210539)

virt-installとvirt-managerパッケージを両方インストールしている状態で
`pacman -Syu`したら以下のようなメッセージが大量に出力された。

> virt-install: /usr/share/virt-manager/virtinst/devicefilesystem.pyc exists in filesystem

## 対処

* そもそもvirt-installとvirt-managerを使っていなかったため消した。

```
pacman -R virt-install
pacman -R virt-manager
```

* その後は`pacman -Syu`問題なし。

## 対処2

* やっぱりvirt-manager欲しいので入れることにした

```bash:
pacman -Sy virt-manager
```

> virt-install: /usr/share/virt-manager/virtinst/xmlbuilder.pyc がファイルシステムに存在しています

さっきと同じエラー。

```bash:
pacman -Sy virt-manager --force
```

これで解決。
JNIからJavaの配列を操作する

JNIメソッドから複数の戻り値を受け取りたい場合、ネイティブの構造体を直接Javaに受け渡すことはできないため、JNIでJavaオブジェクトを作成するか配列を使用して受け渡すことになります。

JNIでJavaオブジェクトを作成する方法は割と複雑でパフォーマンスを上げるためにキャッシュ処理をしたりしないといけないので面倒です。ベクトルや行列を扱う場合は配列を使うのが簡単なのでこの方法を紹介します。

次のようなJava APIを使って、ネイティブコードでJava配列に値を設定することを考える。

```java:Java
package com.mycompany;

public class MyClass {
    private static native void putElements(float[] arr);
}
```

各要素を操作するには次のようにします。`Get***ArrayElements`でポインタを取得して値を取得・代入して最後に`Release***ArrayElements`でポインタを開放します。`***`の部分はデータ型によって使い分けます。

```cpp:JNI
JNIEXPORT void JNICALL
Java_com_mycompany_MyClass_putElements(JNIEnv * env, jclass clazz, jfloatArray arr) {
    jfloat *body = env->GetFloatArrayElements(arr, 0);
    body[0] = 1.23f;
    body[1] = 4.56f;
    body[2] = 7.89f;
    env->ReleaseFloatArrayElements(arr, body, 0);
}
```

Javaから渡された配列に入っている値をループで参照したい場合は、次のようにします。

```cpp:JNI
JNIEXPORT void JNICALL
Java_com_mycompany_MyClass_iterateElements(JNIEnv * env, jclass clazz, jfloatArray arr) {
    jsize len = env->GetArrayLength(arr);
    jfloat *elements = env->GetFloatArrayElements(arr, 0);

    for (int i = 0; i < len; ++i) {
        float f = elements[i]; // 取得
        elements[i] = 3.1415f; // 設定
    }

    env->ReleaseFloatArrayElements(arr, elements, 0);
}
```
macがちょっと便利になったショートカット


ちょっとした小ネタです。
僕自身の備忘録的なものですが、マウスを使う機会がへりました。
<hr>
####【メニューに移動】
control+F2

####【Dockの一番上のアプリを選択状態にする（選択後、上下キーで移動可能）】
control+F3

####【Finder時にゴミ箱を空にする】
command+shift+delete

####【Spotlightを使う】
control+space
<hr>
######関連記事
[Mac のショートカットキーについて](http://qiita.com/tak74/items/d1ecb73ebee1ad2cbcae)
McAfee 2.2.0 をアンインストール


OS X 10.11 El Capitan に McAfee Endpoint Protection for Mac 2.2.0 をインストールしたら、10.11 非対応の上に起動はおろか、アップデートもアンインストールも動かなくなったので手動で削除しました。

# /Library/McAfee

ターミナルを開いて

```
$ sudo /Library/McAfee/sem/uninstall.sh
```

を実行。実は 2.2.0 でのインストールなのか判別つかなかったので、もしあれば実行。


# アプリの削除

[AppCleaner](https://freemacsoft.net/appcleaner/)を使うと便利。
/Applications/McAfee.app と関連ファイルを削除。


その他に、「このMacについて」→「システムレポート...」→「ソフトウェア／アプリケーション」から McAfee* を探して、 AppCleaner で削除していきます。(2つ)


# launchd

launchd がデーモンを起動しようとし続けるのでこれを削除します。


```
$ launchctrl list | grep -i mcafee
```

```
$ sudo launchctl remove com.mcafee.ssm.Eupdate
$ sudo launchctl remove com.mcafee.ssm.ScanManager
$ sudo launchctl remove com.mcafee.virusscan.fmpd
$ sudo launchctl remove com.mcafee.virusscan.ssm.ScanFactory
```

このへんはちょっと不確か。


# 2.3.0

McAfee Endpoint Protection for Mac は 2.3.0 以上から [Mac OS X 10.11 に対応している](https://community.mcafee.com/message/393995)そうです。
Active Directory 追加ドメインコントローラで認証ができないトラブルの対応

#トラブル内容
Linux AD参加で冗長化されたドメインコントローラを1台シャットダウンし、認証テストをしたところ上手く認証できなかった。

#環境情報
・OS
Windows Server 2012 R2 Standard

・フォレスト機能レベル
2012

・ドメイン機能レベル
2012

・ドメインコントローラ
サーバA(FSMO)とBの2台構成

・ドメイン名
exsample.com

サーバAをシャットダウンすると、認証が上手くいかない感じです

#トラブルチェック

##①DNSの確認（問題なし）
・ドメイン名を名前解決できるか
 `nslookup exsample.com`

・サーバ名を名前解決できるか

```
 nslookup A
 nslookup A.exsample.com
 nslookup B
 nslookup B.exsample.com
```

##②簡易ファイアウォール確認（問題なし）

イベントログ等の画面で「別のコンピュータ」へ接続を実施する。

・A→B
・B→A

##③共有の確認（NG）
ドメインコントローラとして「SYSVOL」と「Netlogon」が共有されている必要があるので、チェックをしてみる。

`net share`

・サーバA：OK
・サーバB：NG

どうやらここがダメっぽい

##④ドメインの状態チェック（NG）

`dcdiag`

・サーバA：OK
・サーバB：NG
　AdvertisingとかいうものとNetlogonでエラー

やっぱりNetlogonが異常になっていそう

##⑤イベントログ確認（NG）
サーバA（FSMO）側で以下のイベントログが出力していた

ソース：DFSR
イベントID：4012

説明の中に「MaxOfflineTimeInDaysパラメータで許可される時間（60）よりも長いXXX日間、他のパートナーから切断されています。DFSRレプリケーションはこのフォルダーのデータが執行したと判断し、このサーバーは このエラーが修正されるまでフォルダーをレプリケートしません。」とあった。

サーバAのレプリ相手が居らずDFSRが止まってしまっていて、追加のドメインコントローラに諸々がレプリケートできなかったようです。どうりで追加ドメインコントローラのSYSVOLやNetlogonフォルダの中身が空な訳だ・・・

#対応

色々調べて実行したが上手くいかず、「MaxOfflineTimeInDays」を延長してみることに。

・コマンドプロンプト（管理者）で以下を実行
`wmic.exe /namespace:\\root\microsoftdfs path DfsrMachineConfig set MaxOfflineTimeInDays=365`

・管理ツールの「サービス」で「DFS Replication」を再起動

上記で上手く行き、サーバB側でもSYSVOLやNetlogonが共有されました！！

#上手く行かなかった手順メモ
以下は上手く行かなかった手順です（笑）

・コマンドプロンプトで以下を実行
`wmic /namespace:\\root\microsoftdfs path dfsrReplicatedFolderInfo get replicatedFolderName,State`
　※結果が「2」の場合のみ以降を実施
　今回の結果は「2」だった

・「管理ツール」⇒「ADSIエディター」を選択

・「ADSIエディター」を右クリックし、「接続」を選択。「OK」をクリックする。

・左ペインを展開していき、「OU=DomainControllers」→「CN=A」→「CN=DFSR-LocalSettings」→「CN=Domain System Volume」 をクリック

・右ペインに表示された 「CN=SYSVOL Subscription」 を右クリックしてプロパティを表示

・msDFSR-Options 属性の値を 「1」 に変更してエディタを閉じる

・1号機のコマンドラインで dfsrdiag pollad を実行
　⇒コマンドが無いと言われた。機能の追加がなされていないとエラーになる

・役割と機能の追加
　機能の追加で以下をインストール
　[リモートサーバー管理ツール]-[役割管理ツール]-[ファイルサービスツール]-[DFS 管理ツール]

・コマンドプロンプトから以下を実行
`dfsrdiag pollad`
　「成功した操作」というのが表示される
左右対称デザインが変えるスマホサイトの操作性

近年、スマートフォンのディスプレイの大型化が目立ってきました。
それに伴って、両手でスマートフォンを操作することも増えたかもしれません。
しかしながら、片手で操作するシーンというのは電車の中や街中など少なからずあるはずです。

つまり…
**「 片手でスマートフォンが操作出来た方がいい！ 」**
そういうことになりますよね！

しかし、実際のところはどうでしょうか？
世の中に溢れているスマートフォンサイトは右上にハンバーガーメニューボタンを設置している場合がほとんどです。
これでは右手でスマートフォンを操作するなら片手で操作出来ると思いますが、左手で操作する人の場合は非常に難しいですよね。
**ユーザー体験の向上のために、この問題を解決しましょう。**

##左右対称のデザインにすれば利き手関係なく片手で使える？
実際に左右対称のデザインで作成してみました。
[【 左右対称デザインサンプル 】 GLOBAL WINE CIRCLE](http://asamone.com/wine)（[GitHubはこちら](https://github.com/ASAMOTO/SymmetricalDesign)）
JavaScriptなどの動きの部分は怪しいところがありますが…
今回見ていただきたいのは左右対称デザインにすれば本当に片手で操作が出来るかどうかというところです。
iPhone6s(4.7インチ)でも、Galaxy S5(5.1インチ)でも問題なく操作することが出来ました。
他にも多数のスマートフォンで、かつ自分以外の人にも操作してもらいましたが、片手で操作してもらうことが可能でした。
（スクエア型のスマートフォンなどではなく、通常の形状のスマートフォンに限定しています。）

##左右対称デザイン導入にあたって考えることは…？
####1.コンテンツ量は多くないか。
コンテンツ量が多いウェブサイトの場合は左右対称にすることで、1画面あたりのボタン量が減ってしまいます。
そうした時にユーザー体験が悪化しないか検討することが必要です。
焦らずに一度考えてから設計に移りましょう。

####2.左右対称になっているか。
左右対称になっていなければそもそも「左右対称デザイン」を名乗ることはできません。
必ずカンプ作成後（もしくはコーディング後）にもう一度、左右対称になっているか確認しましょう。

####3.横空間を使えなくても、ボタンの高さや余白を減らさない。
これをしてしまうと本末転倒です。
この左右対称デザインにする目的は**ユーザー体験の向上**です。
それにも関わらずボタンの高さを小さくしたり余白を減らしてしまうと**誤操作**や**見辛さ**に繋がってしまうので、
縦に伸びるのが困る場合は左右対称デザインはやめましょう。

####4.ボタンの横幅に気をつける。
[サンプル](http://asamone.com/wine)を参考に適度な余白をあける。画面幅MAXでボタンを作成すると**誤操作**に繋がります。
また、小さすぎると片手で操作が出来なくなるので画面幅をwidth100%とした場合、ボタン幅はwidth80%〜90%あたりが適切です。

####5.コンテンツの横スクロールについても検討が必要。
両手操作の場合に比べて、片手操作の場合はコンテンツの横スクロールで誤操作を起こす場合が多いです。
どうしても必要で無いならば、別の設計も考えてみる方が良いです。


##もっとユーザー体験向上を目指しましょう。
同じような形式に陥りがちなスマートフォン向けWebサイトですが、本当にそれがユーザーにとって**「使いやすい」**のか。もう一度考えてみましょう。
もちろん、どのWebサイトも似たような形というのは**「慣れ」**というユーザー体験を与えることに繋がるので、悪いことではありません。
私たちWeb制作者は**「左右対称デザイン」**に限らず、もっと使いやすくなる設計を**常に考える癖**を付けられるといいですね！
rails console が立ち上がらない時


```
rails c
```

を打つも、何も反応がない。

Ctrl+cでキャンセルすると

```
^C/usr/local/var/rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/spring-1.3.6/lib/spring/client/run.rb:98:in `gets': Interrupt
	from /usr/local/var/rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/spring-1.3.6/lib/spring/client/run.rb:98:in `verify_server_version'
	from /usr/local/var/rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/spring-1.3.6/lib/spring/client/run.rb:56:in `run'
	from /usr/local/var/rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/spring-1.3.6/lib/spring/client/run.rb:37:in `warm_run'
	from /usr/local/var/rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/spring-1.3.6/lib/spring/client/run.rb:26:in `call'
	from /usr/local/var/rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/spring-1.3.6/lib/spring/client/command.rb:7:in `call'
	from /usr/local/var/rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/spring-1.3.6/lib/spring/client/rails.rb:24:in `call'
	from /usr/local/var/rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/spring-1.3.6/lib/spring/client/command.rb:7:in `call'
	from /usr/local/var/rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/spring-1.3.6/lib/spring/client.rb:26:in `run'
	from /usr/local/var/rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/spring-1.3.6/bin/spring:48:in `<top (required)>'
	from /usr/local/var/rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/spring-1.3.6/lib/spring/binstub.rb:11:in `load'
	from /usr/local/var/rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/spring-1.3.6/lib/spring/binstub.rb:11:in `<top (required)>'
	from /usr/local/var/rbenv/versions/2.2.0/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
	from /usr/local/var/rbenv/versions/2.2.0/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
```







http://cobachie.hatenablog.com/entry/2015/06/30/154736

という記事を見つけたので、

```
bundle exec spring stop
```

すると、動くようになりました。
Bitrise上でfastlaneを使用しテストを実行したの時のデバイス選択

# 概要
Bitriseでfastlaneを実行していたのですが、fastlaneのscanがうまく動きませんでした。
なんとか動くとこまでしたのでメモ


# 原因
scanのオプションのdeviceの指定ミス。

# 解決
scanのdeviceでiPhone5sを指定する場合は、"iPhone 5s"ではなく"iPhone5s"とする
ローカル上のfastlaneでは、"iPhone 5s"で動く。
find + sed で正規表現を使ったファイル名の一括変換

よく使うのだが、よく忘れるのでメモ。

`__keyword__`に変換前の文字列を、`__replace_keyword__`には、変換後の文字列を入力する。

```bash
find . -name "*__keyword__*" | sed 'p;s/__keyword__/__replace_keyword__/g' | xargs -n2 mv
```

実行する前に`mv`を`echo`とかに変えて、`mv`に渡される引数を事前に確認しておくといいかも。
WebminのURLを変更して運用する方法


## 事象

* proxy経由などで標準ではない形式のURLでアクセスしてwebminを操作すると、以下の様なメッセージが出る場合がある。

	```
	セキュリティ警告 	
	警告 Webmin はプログラム http://your.domain.fqdn/right.cgi が Webmin サーバの外側にあると思われる URL http://your.domain.fqdn/ からリンクされたことを検出しました。これは、サーバに危険なコマンドを実行させようとしている可能性があります。
	
	If this is a legitimate link, you can allow links from this URL as follows :
	
	    Login to Webmin normally.
	    Go to the Webmin Configuration module.
	    Click on the Trusted Referrers icon.
	    Enter the hostname your.domain.fqdn into the Trusted websites field, and click Save.
	
	Alternately, you can configure Webmin to allow this link from the command line by :
	
	    Login as root, and edit the /etc/webmin/config file.
	    Add the line referers=your.domain.fqdn at the end, or if a referers line already exists add your.domain.fqdn to it.
	    Save the file.
	
	```

## 対応
* 操作を実行するスクリプトのリファラーが、標準のhttps:/ipaddress:10000ではない場合に出るようだ。
* 上記に書いてあるとおり。/etc/webmin/configファイルのrefferer設定に、FQDNを追記or書き換えておく。
	
	```
	(追記の場合)
	echo "referers=your.domain.fqdn" >> /etc/webmin/config
	service webmin restart
	```
Django で 生SQL を使う前に検討したい Model.objects.extra


Django 生クエリの発行を検討することがあった。

例えば SELECT や WHERE でカラム指定じゃなくて、カラムを元に計算した結果とかを使いたい、みたいな場合。

こんな感じで困った。

- クエリビルダがない！ 
- プラグインにはあるっぽい！
- でもサポートしているのは PostgreSQL？ → 使っているのは MySQL！

あ、ORM オブジェクトに raw メソッドがある…えーと、

```py3
entities = Entity.objects.raw("SELECT concat_ws(',', id, name) AS mystr FROM entities WHERE name IN %s", params=(list(names),))
```

でいいの？ でも IN に指定しているリストが通らない。うーん、

https://docs.djangoproject.com/ja/1.9/ref/models/expressions/#raw-sql-expressions

でもうまくいかない…

で、もう少し探すとこういうのがあった。

https://docs.djangoproject.com/ja/1.9/ref/models/querysets/#django.db.models.query.QuerySet.extra

これを使うと、こんな

```py3
entities = Entity.objects.extra(
    select={'mystr': "concat_ws(',', id, name)"},
    where=['name IN %s'],
    params=[list(names)]
)
```

感じで、生よりもうちょっとマシに書けるっぽい。

ただし…！

> **Use this method as a last resort**
>
> This is an old API that we aim to deprecate at some point in the future. Use it only if you cannot express your query using other queryset methods.

とあるので、使わない方がよいのかも…

https://docs.djangoproject.com/ja/1.9/ref/models/expressions/#raw-sql-expressions

を使うほうがよさそう
【快適開発】快適プログラミング生活を送るために私が実践している4つの事

#手がベタベタする問題
##お湯で手を洗う
いつも開発中にキーボードがベタベタして気になてってしまう人はお湯で手を洗う事をお勧めします！
アンドロイドやiOSユーザーもゲームをする前に手を洗うとサラサラになります

しかし手がサラサラになる利点があるのですが
ネットで検索したところ肌荒れの原因にもなるので注意が必要そうです
http://www.skincare-univ.com/daily/column/001392/

##ベビーパウダーを使う
確かにとても手に優しく，手がサラサラになるのですが
キーボードが白くなるため利用量に注意が必要です．

#水を飲んで定期的に動く
行き詰まる事が多い私は，プログラミング中は常に水を飲むようにしています．

1.リフレッシュ効果
定期的に水を取りに行く時やお手洗いに行く事でリフレッシュできます

2.相談効果
その時にすれ違った人と少しお話をするだけで以外と問題が解決する事があります．

3.健康効果
これは諸説あると思うので様々なサイトを参考にしてみてください，
ここに関しては私はあまり意識してないですが，
レッドブルポカリよりかは遥かに健康的であるという事は断言できると思います！
http://gigazine.net/news/20100301_drinking_water_is_good/

#コーヒーを飲みすぎない
プログラミングをする際にコーヒは確かに定番だと思い
ネットでメリットだけを調べてコーヒーを1日8杯飲んでいたのですが
適量でないとデメリットも多かったため，水にシフトしました．

**1日のコーヒーの適量【4杯以内】**
##適量摂取＝＞**メリット**
1．カフェインの脂肪分解促進によるダイエット効果と眠気冷まし
2．美肌効果
3．二日酔いに効く
4．うつ病の予防
5．消化促進
6．糖尿病予防（ブラックに限る）
7．アンチエイジング
8．脳の活性化


##飲みすぎ＝＞**デメリット**
1．頭痛や疲れにつながる
2．利尿作用によりカルシウムが流出
3．貧血症状
4．カフェイン依存症による焦り，不安，不眠，胃痛など
5．口臭や睡眠の質の悪化

#最後に，眠い時は寝る
これは会社だとそういうわけにも行かないと思いますが，10分寝るだけで効率は格段に上がると思います．

#PCの環境設定
PC内部の環境設定は他の記事であげているので，快適にプログラミングしたい方は是非こちらも参照ください！
<a href="http://qiita.com/rorensu2236/items/e3bea2a808bf7cdb3ece">
私が使うMacの便利アプリと便利設定

![image](https://qiita-image-store.s3.amazonaws.com/0/69647/711e595e-c368-143a-befa-edb7229ab8d5.png)
</a>
MySQLにて、DBの最大コネクション数と現在のコネクション数を確認する

以下のSQL文を発行することで、DBの最大コネクション数を確認することが可能です。
`SHOW GLOBAL VARIABLES like 'max_connections';`


以下のSQL文では、現在のコネクション数を確認することが可能です。
`SHOW STATUS like 'Threads_connected';`

以下のSQL文で、現在のDBへの接続を全て表示することが可能です。
`SHOW processlist`
楽天GoldへのFTP接続

awsのec2でOS：centos7でサーバを作成しました。
firewallサービスは起動していません。
セキュリティーグループの設定はデフォルト状態になります。
ruby(バージョン:2.2.3)でFTP接続を試みたところ、以下のエラーとなりました。

rubyのコード
require 'net/ftp'
class Test
　ftp = Net::FTP.new
　ftp.connect('ftp.rakuten.ne.jp', 16910)
　ftp.close
end

エラー内容
/usr/local/rbenv/versions/2.2.3/lib/ruby/2.2.0/net/ftp.rb:1112:in `readline': end of file reached (EOFError)
        from /usr/local/rbenv/versions/2.2.3/lib/ruby/2.2.0/net/ftp.rb:291:in `getline'
        from /usr/local/rbenv/versions/2.2.3/lib/ruby/2.2.0/net/ftp.rb:302:in `getmultiline'
        from /usr/local/rbenv/versions/2.2.3/lib/ruby/2.2.0/net/ftp.rb:320:in `getresp'
        from /usr/local/rbenv/versions/2.2.3/lib/ruby/2.2.0/net/ftp.rb:341:in `voidresp'
        from /usr/local/rbenv/versions/2.2.3/lib/ruby/2.2.0/net/ftp.rb:250:in `block in connect'
        from /usr/local/rbenv/versions/2.2.3/lib/ruby/2.2.0/monitor.rb:211:in `mon_synchronize'
        from /usr/local/rbenv/versions/2.2.3/lib/ruby/2.2.0/net/ftp.rb:248:in `connect'
        from test.rb:6:in `<class:Test>'
        from test.rb:3:in `<main>'

原因についてご教授いただけませんでしょうか
よろしくお願いいたします。
東京23区の　selectタグ

## テキストリスト

```
千代田区
中央区
港区
新宿区
文京区
台東区
墨田区
江東区
品川区
目黒区
大田区
世田谷区
渋谷区
中野区
杉並区
豊島区
北区
荒川区
板橋区
練馬区
足立区
葛飾区
江戸川区
```

## selectタグ

```
<select name="area">
    <option value="千代田区">千代田区</option>
    <option value="中央区">中央区</option>
    <option value="港区">港区</option>
    <option value="新宿区">新宿区</option>
    <option value="文京区">文京区</option>
    <option value="台東区">台東区</option>
    <option value="墨田区">墨田区</option>
    <option value="江東区">江東区</option>
    <option value="品川区">品川区</option>
    <option value="目黒区">目黒区</option>
    <option value="大田区">大田区</option>
    <option value="世田谷区">世田谷区</option>
    <option value="渋谷区">渋谷区</option>
    <option value="中野区">中野区</option>
    <option value="杉並区">杉並区</option>
    <option value="豊島区">豊島区</option>
    <option value="北区">北区</option>
    <option value="荒川区">荒川区</option>
    <option value="板橋区">板橋区</option>
    <option value="練馬区">練馬区</option>
    <option value="足立区">足立区</option>
    <option value="葛飾区">葛飾区</option>
    <option value="江戸川区">江戸川区</option>
</select>
```
treeコマンドのインストール

treeコマンドが欲しいのにない。
嘘やろ……なんで……なんで……
という自分のためのメモ。

# バージョンを確認する

[ftp://mama.indstate.edu/linux/tree/](ftp://mama.indstate.edu/linux/tree/)
にて、最新バージョンを確認する。
現状は1.7が最新ぽいです。

# ダウンロード

```
cd /usr/local/src/
wget ftp://mama.indstate.edu/linux/tree/tree-1.7.0.tgz
tar zxvf tree-1.7.0.tgz
cd tree-1.7.0/
make
make install

```

あんまりwget使ったことないけど、今まではずっとインストールしたフォルダ先でいろいろやらないとコマンドとしてめちゃくちゃ使いにくかったけど、treeは勝手にコマンドとして登録してくれるっぽい？
なので普通に`tree`と打つと表示されるようになる。
最近はJavaScriptにJavaが書けるらしい（JavaPoly.js）

JavaScriptをJavaで書けてjarファイルのライブラリも読み込める、JavaPoly.jsというのがあったので、試してみました。
基本公式の写経です。

# 公式サイト

https://www.javapoly.com/

# 試してみる

とりあえず一旦公式に乗っかってHelloWorldしてみます。

htmlファイルはこんな感じになります。

```test.html
<!-- Include the Polyfill -->
<script src="https://www.javapoly.com/javapoly.js"></script>

<!-- Write your Java code -->
<script type="text/java">
  package com.demo;
  import com.javapoly.dom.Window;

  public class HelloWorld
  {
    public static void sayHello()
    {
      Window.alert("Hello World, from Java!");
    }
  }
</script>

<!-- Invoke your Java code from Javascript -->
<script type="text/javascript">
  com.demo.HelloWorld.sayHello();
</script>
```

javapoly.jsを読み込んで、あとは、scripttypeをtext/javaにするぐらいでいいみたいです。
packageも設定できる様子。

# 実行

コンパイルとかちょっと時間かかるっぽいですが、
上記のファイルを実際にブラウザで起動すると、こんな感じでアラートがちゃんと表示されました！


![スクリーンショット 2016-05-09 9.58.05.png](https://qiita-image-store.s3.amazonaws.com/0/105934/79f2a362-007e-4891-f4a7-9dd3b40ecc5d.png)
オレオレSSL証明書


テスト用でSSLを使いたいときや SSLサイトのモックを作るときなどにつかいます。

## 証明書作成

```
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr
openssl x509 -days 3650 -req -signkey server.key -in server.csr -out server.crt
```

server.key サーバ秘密鍵
server.crt サーバ証明書

## apacheの設定

```conf/extra/httpd-ssl.conf
SSLCertificateFile  "/path/to/ssl/server.ssl"
SSLCertificateKeyFile "/path/to/ssl/server.key"
```

再起動

```
# apachectl graceful
```

## 確認

```
$ curl https://localhost
curl: (60) Peer's certificate issuer has been marked as not trusted by the user.
More details here: http://curl.haxx.se/docs/sslcerts.html

$ curl -k https://localhost
```

## オレオレCA

CentOS 6 で作る例。

CAコマンドで使いやすいようにしちゃう

```
sudo /etc/pki/tls/misc/CA -newca
cp server.csr newreq.pem
sudo /etc/pki/tls/misc/CA -sign
cp newcert.pem server.crt
```
Haskell servant 0.4 のドキュメントを和訳した

# Haskell servant 0.4 日本語訳を作った

## 概要

自分自身の理解を進めるために servant 0.4 の日本語訳を作ってみました。
主にチュートリアルページを訳してあります。
http://algas.github.io/haskell-servant.github.io/tutorial/
誤訳や誤植などを発見された方はいつでも Pull Request を送っていただけるとうれしいです。
https://github.com/algas/haskell-servant.github.io

## 訳文の目次

### チュートリアル

0. [型として扱うWeb API (A web API as a type)](http://algas.github.io/haskell-servant.github.io/tutorial/0.4/api-type.html)
0. [APIをサーバとして動かす (Serving an API)](http://algas.github.io/haskell-servant.github.io/tutorial/0.4/server.html)
0. [APIにクエリを投げるHaskellの関数を作る (Deriving Haskell functions to query an API)](http://algas.github.io/haskell-servant.github.io/tutorial/0.4/client.html)
0. [APIにクエリを投げるjavascript関数を生成する (Generating javascript functions to query an API)](http://algas.github.io/haskell-servant.github.io/tutorial/0.4/javascript.html)
0. [APIのドキュメントを生成する (Generating documentation for APIs)](http://algas.github.io/haskell-servant.github.io/tutorial/0.4/docs.html)

### Tips

0. [servantを拡張する (Extending servant)](http://algas.github.io/haskell-servant.github.io/extending.html)
0. [5分でHackage APIへクエリを投げる関数を書く (Derive functions to query Hackage’s API in 5 minutes)](http://algas.github.io/haskell-servant.github.io/client-in-5-minutes.html)

## 注意

- オリジナルのドキュメントは Creative Commons 4.0 ライセンスで配布されています。
- servant 0.5 以上のドキュメント(オリジナル)は別に管理されています。ドキュメントのソースは servant repository に同梱されています。  
http://haskell-servant.readthedocs.org/
艦これ支援ツールの航海日誌をMacで効率よく起動する小技

艦これ支援ツールの航海日誌が便利なので使っていますが、起動用のシェルスクリプトをダブルクリックするとXcodeが上がってしまい不便なのでAutomaterで改善してみました。

参考：[MacのAutomatorでシェルスクリプトを.appアイコン化してダブルクリック実行](http://easyramble.com/mac-automator-shell-script.html)

# Automatorの起動
[アプリケーション] の直下。
![Automater-1.png](https://qiita-image-store.s3.amazonaws.com/0/122012/f8a4aa58-c2de-7e40-0a92-2635051ac572.png)

# 定義の作成
[新規書類] を選択。
![Automater-2.png](https://qiita-image-store.s3.amazonaws.com/0/122012/7684b347-d72d-8e25-6278-7781c3011675.png)
[アプリケーション] を選択。
![Automater-3.png](https://qiita-image-store.s3.amazonaws.com/0/122012/645377f6-ece9-838f-5c93-7d1eadf254e3.png)
[シェルスクリプトを実行] を選び [ワークフローを作成するには、ここにアクションまたはファイルをドラッグしてください。] にドラッグする。
![Automater-4.png](https://qiita-image-store.s3.amazonaws.com/0/122012/d4007ceb-5872-e10f-a8c0-f396fd48688b.png)
航海日誌同梱のlogbook.shをテキストエディットで開き、内容をコピー。Automaterのシェルの部分に貼り付ける。
![Automater-5.png](https://qiita-image-store.s3.amazonaws.com/0/122012/63ab4401-9fd0-f554-0743-395f015a26ac.png)
![Automater-6.png](https://qiita-image-store.s3.amazonaws.com/0/122012/06a1ebd2-6b13-a17d-8978-cc5c345ffd23.png)
1行目は削除、2行目のcdの右側に航海日誌を展開したディレクトリを指定する。
![Automater-7.png](https://qiita-image-store.s3.amazonaws.com/0/122012/172d9739-242c-0333-d83f-ea613f580aa4.png)
好きな名前で保存する。

# 起動方法
作成したアプリケーションをダブルクリックするだけ。
【メモ】宅配便の配達状況APIを調査

# 英語

* http://www.trackingmore.com/china-ems-tracking.html
* https://www.easypost.com/docs/api



# 日本の宅配便の配達状況API
* http://thira.plavox.info/transport/api/

# 中国の宅配便の配達状況API
### 異論
* https://www.zhihu.com/question/19624971

### api

* http://www.kdniao.com/
* http://www.ickd.cn/api/
* http://www.kuaidiapi.cn/
* http://www.kuaidiwo.cn/api/index.php
* http://www.aikuaidi.cn/api/
* http://www.kuaidi100.com/openapi/
Sassのエラー時にgulpのタスクを終了させない

## 現状と課題

* gulpを使ってsassをコンパイルしてる
* `gulp.watch` で監視してる
* sassの構文エラーがあるとgulpのタスクが終わる
* cssが更新されない事に気づかない

→ sassでエラーがあってもコンパイルを続けたい！

## 解決策

[gulp-plumber](https://www.npmjs.org/package/gulp-plumber)を使う。

#### インストール

```
npm install --save-dev gulp-plumber
```

#### gulpfile.jsを修正

```js
'use strict'
var gulp = require('gulp');
var sass = require('gulp-sass');
var cssnext = require('gulp-cssnext');
var plumber = require('gulp-plumber');　 // < gulp-plumberを使います

var paths = {
  'scss': './src/sass/',
  'css': './../public_html/css/'
}

gulp.task('sass', function() {
  return gulp.src(paths.scss + '/*.scss')
    .pipe(plumber()) // < ここに追加！！
    .pipe(sass())
    .on('error', function(err) {
      console.log(err.message);
    })
    .pipe(cssnext())
    .pipe(gulp.dest(paths.css))
});

gulp.task('sass:watch', function() {
  gulp.watch('./src/sass/*.scss', ['sass']);
});
```

### まとめ

楽になった。
msys2で(強引に)pecoを使う


**DEPRECATED**
msys2ではpecoを諦めfzyを使うと幸せになりました。
http://qiita.com/ubnt_intrepid/items/ea6df730e69a0f402cca#_reference-bde7680190061d3dc07b



## tldr

すごく無理やりだが以下の方法によりmsys2でpecoを使えるようになる

```bash
function peco_ls() ｛
    ls > /tmp/ls.txt
    script -qc "winpty peco /tmp/ls.txt" /tmp/typescript
    local target="$(col -bx < /tmp/typescript | tail -2 | head -1 | sed s/0K$// | sed s/^0m// )"
    echo "$target"
}
```

動作イメージ
![Animation.gif](https://qiita-image-store.s3.amazonaws.com/0/33349/db705457-1855-02e2-a61c-c0bab888412c.gif)

概要

- pecoにinputをファイルから与える
- pecoで選択したものを標準出力する(デフォルトの挙動)
- scriptコマンドで標準出力の内容を保存して取得する

## what

- pecoはinputを、標準入力かファイルから与えることができる
- msys2で対話的プログラムを実行する場合winptyを挟む必要がある
- しかしwinptyは入出力にパイプを使えないっぽい(input is not a ttyなどのエラーが出る)
- pecoにinputをファイルから与える

## 応用（ラッパー関数作って使いやすくする）

```bash
  function _pecowrap_exec() {
    eval "$@" > /tmp/cmd.log
    script -e -qc "winpty peco /tmp/cmd.log" /tmp/script.log
  }

  function _pecowrap_result() {
    local result="$(col -bx < /tmp/script.log | tr -d '\n' | sed 's/.*0m\(.*\)0K.*$/\1/g' | sed 's/0K//g')" # TODO 強引。特に"0K"が含まれると削除しちゃう
    echo "${result}"
  }

  function c() {
    _pecowrap_exec "find $1 -maxdepth 1 -type d | sort" || return
    cd $(_pecowrap_result)
  }

  function v() {
    _pecowrap_exec "find $1 -maxdepth 1 -type f | sort" || return
    vi $(_pecowrap_result)
  }
```

## 試行錯誤メモ

以下を試したが全てうまくいかなかった

- peco以外のツールを試す
    - fzf
    - etc.
- mintty以外のterminalを試す

## 雑感

- Windows Subsystem for Linuxが来たら、msys2不要にできるかもなので、今はworkaroundで乗り切ろう
Visual Studio Code のユーザーインターフェースの言語を変更する

# 方法

- `locale.json` を書いて Visual Studio Code を再起動。
    - Windows: `%APPDATA%/Code/User/locale.json`
    - *nix: `$HOME/.config/Code/User/locale.json`

```json
{
  "locale" : "en-US"
}
```

# Reference

- http://stackoverflow.com/questions/36868322/how-to-change-ui-language-in-visual-studio-code

# memo

- いつの version からか、やや余計なお世話と感じるほど良く日本語化されすぎてしまい不便に感じていたので調査し設定するに至った。
- ロケール `"C"` は不正な値として Visual Studio Code に認識される値なのでコメントでご指摘を頂いたように正常値となる "en-US" など明示的に設定すべきのようだ（本文は C から en-US へ修正済み）。
「トヨタ生産方式―脱規模の経営をめざして」を読んで

# 脱規模の経営をめざして
ものづくりに携わる人に限らずこの本は本当に読むべきだと思いました。トヨタ生産方式を確立した大野耐一氏の人生の集大成とも言える本で、ある意味で究極のダイエット本です。より言えば、全身の細胞を活性化させ鍛えつつ最適な体型に保ち、どんな環境でも生き抜く身体と精神を磨くための本です。

でもその本質は繰り返し述べられているように「必要なものを必要な時に必要なだけ作る（提供する）」という事だと思います。
今まで知りながらちゃんと向き合って読んでいなかったのが悔やまれるくらい。サブタイトルの「脱規模の経営をめざして」というところに全てが込められています。つまりこれは単なる生産方式の本ではありません。これを掲げてものづくりの改革が徹底されたトヨタが日本最大規模の会社になっているのは面白いところです。
しかしその理由は読めばわかります。

# 「自動化ではなく自働化」の意味
この本でようやく「自動化ではなく自働化」の意味が腹落ちしました。どんな装置も動くだけでは意味がない、価値を生む=働く必要がある、価値を生み続ける仕組みを作るのが「自働化」であるという事です。その意味で必ずしもロボットなどの自動機を入れるのには意味がなく、そもそもその作業が必要なのか考えるところから始まるという話に続きます。
逆に言うとカンバン方式などを表面的に取り入れる事自体が問題を作りかねません。手法にとらわれるとリバウンドや不調をもたらす諸刃の刃なのはダイエットと同じかもしれません。この本でも「生兵法は大怪我のもと」と戒めています。

# 低成長時代を生き抜く
この本はオイルショック直後に書かれていますが、直近でも様々な経済的ショックを経験している現代の人は特に第5章「低成長時代を生き抜く」から読むとこれは読まねばと思えると思います。
スナップショット的な状況把握に基づく短期的な生産・経営改革ではなく、日々の生産活動、経済活動の流れの中でどう本質的なニーズに沿ってシステムを構築すべきかが書かれています。
その対比になる規模を追うようなフォード生産方式もきちんとヘンリ・フォード１世の自著を引用しながら本来は同じビジョンを見ていた事を見出しており、深いリスペクトを感じます。結局は後進の人々がその真なるビジョンを受け継ぎながら中身を時代や状況に合わせて更新し続けられていないことが後々の課題を生むというのはいつの時代も変わっていません。

# 今再び読むべき名著
40年前の本ですが、全く古さを感じさせないどころか今またハードウェアが再び新たな価値を生む可能性が出てきた今だからこそ心新たにじっくり読むべき本だと深く感じました。単なる一ものづくり方式の説明本ではない名著と呼ばれるだけの時代に左右されないインサイトが盛りだくさんです。
人生をかけて本質的なものづくりに取り組まれた大野耐一さんに本当に心から敬意を表したいです。

[トヨタ生産方式―脱規模の経営をめざして -大野 耐一 (著)](http://www.amazon.co.jp/%E3%83%88%E3%83%A8%E3%82%BF%E7%94%9F%E7%94%A3%E6%96%B9%E5%BC%8F%E2%80%95%E8%84%B1%E8%A6%8F%E6%A8%A1%E3%81%AE%E7%B5%8C%E5%96%B6%E3%82%92%E3%82%81%E3%81%96%E3%81%97%E3%81%A6-%E5%A4%A7%E9%87%8E-%E8%80%90%E4%B8%80/dp/4478460019?ie=UTF8&ref_=cm_sw_r_cp_api_Wm5lxbZKZR0EJ)

![13178589_1076556922409672_2242776665213076801_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/33040/26187997-f0ee-9a91-02a5-d983c8d18658.jpeg)
初めてのGreasemonkey

Greasmonkeyについて知らなかったので調査と適当にスクリプトを作ってみたのでその時のメモ

# 参考

+ [Greasemonkey用スクリプト作成方法](http://www.entereal.co.jp/blog/entry_how-to-make-Greasemonkey-scripts.html)
+ [Firebugで作るGreasemonkeyスクリプト～入門と実践(From Kanasan.JS)](http://blog.37to.net/2009/03/firebuggreasemonkeyf/)

# Greasmonkeyとは?

+ FirefoxやGoogleChromeなどのブラウザのアドオン
+ インストールすることで各種Webサイトで任意のJavaScriptを実行することができる
+ 上記によってHTML要素や機能、CSSの変更などができる
+ 実行するJavaScriptはユーザースクリプトと言い、自分で作成する事ができる

# 準備

まず、FirefoxにGreasmonekyのアドンオンをインストールします。

[Add-ons Greasmonkey](https://addons.mozilla.org/ja/firefox/addon/greasemonkey/)

インストールして再起動後、アドオンの表示欄に猿のアイコンが表示されればOKです。

# ユーザースクリプトを作成してみる

ユーザースクリプトを作成してみましょう。

Firefoxを開いて、猿アイコン右の矢印を選択後、「ユーザースクリプト新規作成」を選択します。

その後画面が表示され、スクリプト名やスクリプト名を実行するサイトのURLや実行しないURLなどを記入します。

今回はGoogleトップページのみで実行できるように以下のようにします。

![Screen Shot 2016-05-08 at 12.46.09 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/faab7800-6889-a144-19f2-7510104f89d1.png "Screen Shot 2016-05-08 at 12.46.09 PM.png")

OKを選択後、エディタが開くので以下のように追記します。

```hello.user.sjs
// ==UserScript==
// @name        Hello
// @namespace   SampleScript
// @description helloworld
// @include     https://www.google.co.jp/*
// @version     1
// @grant       none
// ==/UserScript==
(function () {
  alert('Hello, monkey!');
})();

```

追記後、Ctrl+Sで保存し、Googleトップページを開いてみます。

うまくできている場合、「Hello, monkey!」というアラートが表示されます。

# もう少し何か書いてみる

以下を参考にGoogle検索時のページに更新日時によるフィルターリンクを追加してみました。（はみ出てますが。。。)

[Firebugで作るGreasemonkeyスクリプト～入門と実践(From Kanasan.JS)](http://blog.37to.net/2009/03/firebuggreasemonkeyf/)

![Screen Shot 2016-05-09 at 5.41.42 AM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/bef866be-97e9-8b26-7384-98281bd6de76.png "Screen Shot 2016-05-09 at 5.41.42 AM.png")


```hello.user.js
// ==UserScript==
// @name        Hello
// @namespace   SampleScript
// @description helloworld
// @include     https://www.google.co.jp/#q=*
// @version     1
// @grant       none
// ==/UserScript==

function createMyLi(href, text) {
  var li = document.createElement('li');
  var a = document.createElement('a');
  
  var textNode = document.createTextNode(text); 
  a.setAttribute('href', href);
  a.appendChild(textNode);
  li.appendChild(a);
  
  return li;
}

function createMyDiv() {
  var div = document.createElement('div');
  var ul = document.createElement('ul');
  // 現在のURLを取得
  var url = window.location.href;
  console.log(url);
  // 既にパラメーターが設定されている場合には削除
  url = url.replace(/&tbs=qdr:[hdmwmy]/, '');
  var QUERY='&tbs=qdr:'
  
  ul.appendChild(createMyLi(url+QUERY+'h', '1時間以内'));
  ul.appendChild(createMyLi(url+QUERY+'d', '24時間以内'));
  ul.appendChild(createMyLi(url+QUERY+'w', '1週間以内'));
  ul.appendChild(createMyLi(url+QUERY+'m', '1ヶ月以内'));
  ul.appendChild(createMyLi(url+QUERY+'y', '1年以内'));
  div.appendChild(ul);
  
  return div;
}

(function () {
  console.log('start!');
    
  var div = createMyDiv();
  var searchButton = document.getElementById('sblsbb');
  console.log(searchButton);
  searchButton.appendChild(div);
  
})();
```

これによって本来は2クリック必要な遷移が1クリックでできるようになりました。

次、時間あれば以下などを確認して、良さげな開発環境作りたいです。

[vimで最強のgreasemonkey開発環境を作ってみた](http://d.hatena.ne.jp/kasei_san/20090531/p1)
複数のバーチャルホストでSSL設定

apache2のhttpd-vhosts.conf、httpd-ssl.confにおける複数ドメインに対応したSSL設定例を紹介してみます。
/usr/local/apache2/conf/extra/httpd-vhosts.confの設定例
<VirtualHost *:80>
    DocumentRoot /usr/local/apache2/htdocs/vhost1
    ServerName www.vhost1.com
    ServerAlias www.vhost1.com
    ErrorLog logs/wwww.vhost1.com-error_log
    CustomLog logs/www.vhost1.com-access_log common
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot /usr/local/apache2/htdocs/vhost2
    ServerName www.vhost2.com
    ServerAlias www.vhost2.com
    ErrorLog logs/wwww.vhost2.com-error_log
    CustomLog logs/www.vhost2.com-access_log common
</VirtualHost>
/usr/local/apache2/conf/extra/httpd-ssl.confの設定例

NameVirtualHost *:443//この行の記述が必要

<VirtualHost *:443>
DocumentRoot "/usr/local/apache2/htdocs/vhost1"
ServerName www.vhost1.com
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile /usr/local/apache2/conf/server1.crt
SSLCertificateKeyFile /usr/local/apache2/conf/server1.key
</VirtualHost>

<VirtualHost *:443>
DocumentRoot "/usr/local/apache2/htdocs/vhost2"
ServerName www.vhost2.com
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile /usr/local/apache2/conf/server2.crt
SSLCertificateKeyFile /usr/local/apache2/conf/server2.key
</VirtualHost>
上記の様に１組のserver.crt、server.keyで複数のドメインでSSLの証明を可能に出来るようです。
下記サイトを参考にしました
https://centossrv.com/apache-ssl.shtml
http://d.hatena.ne.jp/eth0jp/20090920/1253394739
http://cmshikaku.com/feature/?p=1429
Springで例外ハンドリング

# 環境

Spring-Boot 1.3.3
Spring-WebMVC 4.2.5

# 例外ハンドリング

Springでは、Controller個別で例外をハンドリングする方法と、Controllerを横断して例外をハンドリングする方法の2通りのハンドリング方法が存在する。ここでは、RestControllerでのハンドリングを例にしてやってみる。

# Controller個別で例外をハンドリングする

Controller個別で例外をハンドリングする場合、Controllerクラス内にハンドリング用のメソッドを作成する。このメソッドには@ExceptionHandlerアノテーションを付与する。そうすることでそのControllerクラス内で発生した例外に対する設定を行うことができる。

```CustomerRestController.java
@RestController
@RequestMapping("api/customers")
public class CustomerRestController {

	@Autowired
	CustomerService customerService;

	@RequestMapping(method = RequestMethod.GET)
	Page<Customer> getCustomers(@PageableDefault Pageable pageable) {
		Page<Customer> customers = customerService.findAll(pageable);
		return customers;
	}

	@ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
	@ExceptionHandler({ HttpRequestMethodNotSupportedException.class })
	@ResponseBody
	public Map<String, Object> handleError() {
		Map<String, Object> errorMap = new HashMap<String, Object>();
		errorMap.put("message", "許可されていないメソッド");
		errorMap.put("status", HttpStatus.METHOD_NOT_ALLOWED);
		return errorMap;
	}
}
```


* @ExceptionHandler({ HttpRequestMethodNotSupportedException.class })
    * このController内でHttpRequestMethodNotSupportedExceptionが発生した場合は、handleErrorメソッドでハンドリングを行う。
* @ResponseStatus(HttpStatus.BAD_REQUEST)
    * クライアントにレスポンスを返す際のステータスコード。ここでは400を返す設定。
* @ResponseBody
    * レスポンスにJSONを返却する際に利用するアノテーション。
 
# Controllerを横断して例外をハンドリングする

Controllerを横断して例外をハンドリングする場合、まずは例外ハンドリング用のクラスを作成する。このクラスには@ControllerAdviceアノテーションを付与する。そうすることで全てのControllerクラスで発生した例外に対する共通の設定を行うことができる。
例えば以下の例では、TrendRestControllerとCustomerRestControllerでHttpRequestMethodNotSupportedExceptionが発生した場合、ExceptionHandlerクラスのhandleErrorメソッドで例外がハンドリングされる。

```TrendRestController.java
@RestController
@RequestMapping("api/trends")
public class TrendRestController {

	@RequestMapping(method = RequestMethod.GET)
	String getTrends() {
		return "Something Trends";
	}
}
```

```CustomerRestController.java
@RestController
@RequestMapping("api/customers")
public class CustomerRestController {

	@Autowired
	CustomerService customerService;

	@RequestMapping(method = RequestMethod.GET)
	Page<Customer> getCustomers(@PageableDefault Pageable pageable) {
		Page<Customer> customers = customerService.findAll(pageable);
		return customers;
	}
}
```

```ExceptionHandler.java
@ControllerAdvice
public class ExceptionHandler {

	@ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
	@org.springframework.web.bind.annotation.ExceptionHandler({ HttpRequestMethodNotSupportedException.class })
	@ResponseBody
	public Map<String, Object> handleError() {
		Map<String, Object> errorMap = new HashMap<String, Object>();
		errorMap.put("message", "許可されていないメソッド");
		errorMap.put("status", HttpStatus.METHOD_NOT_ALLOWED);
		return errorMap;
	}
}
```

# その他
Controllerを横断して例外をハンドリングする場合の例外ハンドリング用のクラスと、Controller個別で例外をハンドリングする場合のControllerクラスの双方で同じハンドリング処理があった場合、Controller個別で例外をハンドリングをする方が優先される。

# 参考
http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-error-handling
http://m12i.hatenablog.com/entry/2014/10/29/010801
独自の例外クラスを複数作る理由

弊社の新入社員の子たちにJavaを教えていた後輩から、こういった質問がありましたって聞いた気がしたので自分もアウトプットしておきます。
実際に業務のソースコードを見ると、複数の独自例外クラスを定義している場合が多々あります。例えば、以下の例ではMyException1、MyException2、MyException3がそれにあたります。なぜ独自例外クラスを複数定義するのか？(複数じゃない場合もありますが)
それは、(以下のコメントにもある通り)発生した例外の種類によって処理を分けたいからです。
あまりイメージがわかないかもしれませんが、実際の業務では、発生した例外の種類によって処理を分けたいといったケースが多々あります。そういった理由から独自の例外クラスを複数作っています。

```
try {

	// ～
	// 何らかの処理
	// ～

} catch (MyException1 e) {
	// MyException1が発生した時の処理
} catch (MyException2 e) {
	// MyException2が発生した時の処理
} catch (MyException3 e) {
	// MyException3が発生した時の処理
} catch (Exception e) {
	// 上記の例外以外が発生したけど何らかのハンドリングをしたい時は必要
}
```
FreeBSD+mrubyでサウンドプログラミング

[I2Cで制御できるSCC+互換チップ](http://qiita.com/toyoshim/items/8590bbc2d456cbafacdd) が面白そうだったので[FreeBSD+mruby](http://qiita.com/yamori813/items/1d1c40ce69fe6e60ce1c)で試してみました。

たしかLunaにもなにか音源が入っていたような気がします。

LPC810の書き込みはflashmagicのMac版をやっとの事でダウンロードできたのですが、動きがあやしくあきらめて、昔使った事があるlpc21ispで[書き込みました](https://gist.github.com/yamori813/22a39648f06e8cb812e88f2432c85d28)。

実は以前試したAR2315のGPIOのコードを壊してしまっていて、認識できるまで半日ちかくかかりました。(AR2313系のサポートを入れた時にコピペミスしてました。。。)

```
# i2c -s
Scanning I2C devices on /dev/iic0: 50 51 
```

![IMGP0639.JPG](https://qiita-image-store.s3.amazonaws.com/0/104066/7d41bf40-794e-140b-6dd2-6da15c3f578c.jpeg)

![WN-G54-GPIO.png](https://qiita-image-store.s3.amazonaws.com/0/104066/597a122b-f554-a387-2fb7-30d378267165.png)


とりあえず音が出ました。

```ruby
t = BsdIic.new(0)
num = 0
while num < 100 do
  t.write(0x50,0x00,0xa7)
  t.write(0x50,0x01,0x02)
  t.write(0x50,0x07,0xfe)
  t.write(0x50,0x08,0x0f)
  Sleep::usleep(400000)
  t.write(0x50,0x00,0x3b)
  t.write(0x50,0x01,0x02)
  Sleep::usleep(400000)
  t.write(0x50,0x00,0xfd)
  t.write(0x50,0x01,0x01)
  Sleep::usleep(400000)
  num = num + 1
end
```

音の止め方がわかりません。。。

ユニバーサル基板に実装してケースの中に入れてみました。

<a data-flickr-embed="true"  href="https://www.flickr.com/photos/14000636@N03/26905455055/in/dateposted-public/" title="IMGP0645"><img src="https://farm8.staticflickr.com/7400/26905455055_02be77e775.jpg" width="500" height="375" alt="IMGP0645"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>

なぜこのルータでFreeBSD Current+mrubyが動くかはないしょです。:)

MML再生コード書いてみました。
https://github.com/yamori813/mmlplay
Jenkinsにsudoを許可する方法


```
(2016/06/12追記)

$ sudo /usr/sbin/visudoの内容を読んでいたところ、

## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d

との記述を最終行に見つけ、/etc/sudoers.d 配下にファイルを配置すれば自動的に読み込んでくれることを知りました。
これに従い、当ポストも内容を更新しました。
```

* 以下のコマンドで設定ファイルを配置
	
	``` console
	$ cat << EOS > /etc/sudoers.d/jenkins
	Defaults:jenkins !requiretty
	jenkins ALL=(ALL) NOPASSWD:ALL
	EOS
	```


#  以前に掲載していた方法

* 以下のコマンドで設定ファイルを編集。
	
	```console
	$ sudo /usr/sbin/visudo
	```

* 「Defaults requiretty」の行につづいて、以下の2行を追加。

	```
	Defaults:jenkins !requiretty
	jenkins ALL=(ALL) NOPASSWD:ALL
	```
新規ファイルにテンプレ挿入する(めんどくさくない版)


Emacsには標準で`auto-insert`ってしくみがあります。

日本語資料もいろいろある。


- [Emacs の auto-insert 用のテンプレートを作って楽をしよう - Higepon’s blog](http://d.hatena.ne.jp/higepon/20080731/1217491155)
- [autoinsert mode - Yasuto Takenaka 's](https://sites.google.com/site/ytakenaka/ja/emacs/autoinsert)

## もっと簡単に

ちゃうねん、僕は別にスマートにやりたいわけじゃなかった。

具体的にはPHPファイルを新規作成するときに`<?php`って挿入できれれば、それでだけいい。

なので、かんたんに。

```el
(defun my/php-mode-hook ()
  ;; バッファの中身がからっぽのときに <?php って入れる
  (when (eq 0 (buffer-size))
    (insert "<?php\n\n"))
  )

(add-hook 'php-mode-hook 'my/php-mode-hook)
```

`php-mode`が起動するときにファイルがからっぽだったら`<?php`と改行を入れるだけ。本体は二行なんで、自分用のhookが設定済みだったらそこに追加しちゃえばいいです。[私の変更ログはこちら](https://github.com/zonuexe/dotfiles/commit/b59a327b8d982ba8ead899130c9905c02f737ba5)。

この設定を追加した単純な動機としては、`<?php`って入力したいだけなのにAuto Completeが誤爆して`<?phpinfo`になっていらっとしたから。

-----

あと、EmacsでPHPを書くなら[php-mode](https://github.com/ejmr/php-mode)の最新版を入れるのと入れないのとでは大違ひなので、使ってないとか数年前にインストールして放置してるってひとは、ぜひ最新版に更新してほしい。

こちらからは以上です。
openFrameworksを使うためのXcodeの環境設定メモ

openframeworksをXcodeで使う時の環境設定をいい感じにしたいと思って、以下をやりました。あんまり調べられてないので、いい方法があったら教えて頂けると嬉しいです。特にXcode7のコード補完が死ぬほど遅い気がしているのでなんとかしたいです。

# Xcodeプラグイン
- Alcatraz : プラグインのパッケージマネージャー。これを入れたら以下のプラグインはみつけられる。絶対いれた方がいいレベルのプラグイン。
- ACCodeSnippetRepository : スニペットのパッケージマネージャ。便利そうだとおもったけど、[このissue](https://github.com/acoomans/ACCodeSnippetRepositoryPlugin/issues/28)に書かれてる通りXcode 7系で動かないぽい。
- oFXcodeMenu : oFのaddonを簡単にいれるようにしてくれる君
- ClangFormat : 改行やインデントを自動でフォーマットしてくれる。Google、Webkitとか、いくつかモードを選べる。きだは個人的にWebKitが一番相性がいいでした。
- XToDo : `TODO:`などの特殊タグを一覧化できる。
- FuzzyAutocomplete  :  あいまいにコード補完がでるようにしてくれる君

# 覚えておきたいショートカット
- Cmd+g : Ctrl+fの検索状態で使うと、次の一致ワードを選択できる。
- Cmd+Shift+g : 上記の逆。前のワードを選択できる。
- Cmd+d : これは"Edit All in Scope"という選択した変数名を一気に編集する機能を使うために、自分で独自に設定した。
- ⌥(option) + Space : `esc`で設定されているとは別に`Show Completions`というメニューが`Control + Space`がデフォルトで設定されていたが、これを押すと自分の環境ではSpotlight Searchが起動するようになっているので、`option + Space`に変更してみた。
- Cmd + Shift + o : シンボルサーチができる。（oF_slackでsatoruhigaさんに教えていただきました。）
- ショートカットの設定は[rettuceさんのこのブログ](http://blog.rettuce.com/technical/xcode_custom-key-binds/)がとても参考になりました。


# Xcode その他
- Xcodeのコードスニペット : わりと簡単につくれる。<#文字列#>で引数部分を作れる。coutとか主要なやつはこれで作ってしまった。いいスニペットがあれば知りたい。。
- Monokai Revisited : 一番気に入ったカラーテーマ。カラーテーマもAlcatrazで入れられる。
- 矩形選択 : optionを押しながらマウス選択。SublimeTextのように矩形を選択しながら一気に文字を書くとかはできなさそうで悲しい。
- ファイルテンプレート : [ここ](https://app.box.com/s/cogczkew2zl31uf7hwojoydy84paxmt0)からダウンロードできるテンプレートを`~/Library/Developer/Xcode/Templates`に突っ込むと、'New File'したときに'File Templates'メニュー欄にOpenFrameworks Fileというのができてる。詳しくは[oF Forumのこの記事](p-files/20853/5)。上記のテンプレをベースに、いちおすごく簡単に[自分用のテンプレ](https://github.com/kidapu/OpenFrameWorks.xctemplate)をつくってみた。
Chainerでの画風を変換するアルゴリズム実装をカジュアルに試す

PFNが公開してくれている下記の画風の変換、とても面白いけど、サンプルを試すだけではどこまでチャンピオンデータなのかよくわからないので試してみた。

[画風を変換するアルゴリズム | Preferred Research](https://research.preferred.jp/2015/09/chainer-gogh/)

## 結論
- 画風をスタイルから抽出して、対象に適用することが本当に出来ていることが実感できた。
- 特定のデータだけで再現しているわけではないことを確認できた。
- 使うモデル、スタイルの元画像によって結果が大きく変わった。チャンピオンな結果となるかどうかはこの辺りの依存度が大きいようだった。

再現は難しくなく、Deep Learningの高い能力を実感できてしまいました…
画風の特徴量抽出をマニュアルで行うのは困難だと思われるので、他のやり方でこのアルゴリズム以上の結果を出すのは相当難しいのでは、と思いました。

## 確認結果

著作権フリーの画像を入力し、画風が適用されていることを主観評価した。スタイルを適用する画像には、最近のポップな画像が欲しかったが、著作権フリーだと中々見つからない…そこで、Evernote/iPadを使ってあのキャラクターに似せようとした画像を手書きした。orz
※ VGG 16-layerのCNNモデルで生成。

### ケース1 〜 カンディンスキーのスタイル適用例
| スタイルの元画像 | 適用対象 |
|:------:|:-----:|
|  [カンディンスキー 　≪ コンポジション　Ⅷ　 ≫　1923](http://art.pro.tok2.com/K/Kandinsky/z002.htm)<br> ![Kandinsky_compositionVIII_right.jpg](https://qiita-image-store.s3.amazonaws.com/0/99911/99569407-5293-f3d3-b311-d8e41c9e73d9.jpeg "Kandinsky_compositionVIII_right.jpg") <br>※右側を切り出し | 残念な落書きキャラクター orz<br> ![damn_cat.png](https://qiita-image-store.s3.amazonaws.com/0/99911/fda632e4-8291-c9e6-1ec8-cc468f1ccbff.png "damn_cat.png") |

#### 結果
![im_04950.png](https://qiita-image-store.s3.amazonaws.com/0/99911/be79da2b-c3d0-6ab7-5a15-cad175b40452.png "im_04950.png")

色使いはもちろん、背景の細かいテクスチャや線の太さの使い方がかなり似たように見える。

### ケース2 〜 ドガのスタイル適用例
| スタイルの元画像 | 適用対象 |
|:------:|:-----:|
|  [ドガ　【 スター 】　1878](http://art.pro.tok2.com/D/Degas/Degas.htm)<br> ![Degas_dancers.jpg](https://qiita-image-store.s3.amazonaws.com/0/99911/1b277575-5f63-5ee9-71f5-8033277600da.jpeg "Degas_dancers.jpg") | 残念な落書きキャラクター orz<br> ![damn_cat.png](https://qiita-image-store.s3.amazonaws.com/0/99911/fda632e4-8291-c9e6-1ec8-cc468f1ccbff.png "damn_cat.png") |

#### 結果
5,000回の繰り返しの結果、上のケースと違って途中経過のほうがそれらしい結果が出ていた。
画像の上半分、人物背景の特徴が反映されている様子があるような…。

| 2,500回時点 | 4,000回時点 | 最終画像 |
|:------:|:-----:|:-----:|
| ![im_02500.png](https://qiita-image-store.s3.amazonaws.com/0/99911/fff8708c-0dcb-4d55-61c2-19013406e5cc.png "im_02500.png") | ![im_04000.png](https://qiita-image-store.s3.amazonaws.com/0/99911/751155d1-5540-3c19-7a61-212027779304.png "im_04000.png") | ![im_04950.png](https://qiita-image-store.s3.amazonaws.com/0/99911/3ad73185-535e-6360-f62b-c551ab4c5705.png "im_04950.png") |

#### 派生実験 〜 モデルにNINを使ったとき
![im_04000.png](https://qiita-image-store.s3.amazonaws.com/0/99911/d2f0fa58-23b5-fadf-5b77-e42534a5fd0e.png "im_04000.png")

4,000回時点の画像はこの通りで、このように使うモデルで結果がかなり違いました。

最後になりますが、成果を公開していただいたPreferred Research様に感謝致します。
意外と知られていないGradleを用いたSupportLibrary導入の落とし穴

DroidKaigi2016の[yarakiさんの講演](http://yaraki.github.io/slides/droidkaigi2016/index.html)が目から鱗の内容だったのですが、未だに浸透していない感じがするので拡散の意味も込めて投稿します。

## SupportLibraryのバージョンは合わせる必要がある
GradleでSupportLibraryを導入するサンプルを見ると、利用するバージョン番号がリテラルで記載されている例が多く見られます。

```
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.2.0'
    compile 'com.android.support:design:23.2.0'
}
```

この記述でも問題なく動作するのですが、
実は<b>SupportLibraryは異なるバージョンを組み合わせた利用を想定していない</b>という仕様らしいです。
※ソースは上記講演でしたがスライドには記載されていないようです。。。

そのため、バージョンアップのタイミングなどで修正漏れなどでバージョン番号のズレが発生すると正しく動作しない場合があるようです。

## SupportLibraryのバージョンを統一する
SupportLibraryのバージョンがズレないようにするためにはSupportLibraryのバージョン番号を変数で一元化することで解決できます。

```
ext {
    SupportLibVersion = '23.2.0'
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:${SupportLibVersion}'
    compile 'com.android.support:design:${SupportLibVersion}'
}
```

リテラルによる管理は無駄なコストとなるので皆さんもこの機会にSupportLibraryのバージョン番号を一元管理してみてはいかがでしょうか？


【参考】DroidKaigi 2016 DAY2 基調講演 第1部「Support Libraryノススメ」#12
http://yaraki.github.io/slides/droidkaigi2016/index.html#12