OmniAICreator/Qiita-1.07M huggingface dataset:
a-blog cms初心者の方向けの情報まとめ


[株式会社データファーム](https://datafarm.jp/)のtakenoriです。

今回は、a-blog cmsをはじめたけど、
**「情報がまとまってなくて、何から見ればいいかわからない」
「わからない事を、どこに聞けばいいのかわからない…」人のためのまとめ**がなかったので、
まとめてみます。

*(随時更新予定・編集リクエスト歓迎です!)*

## 「優しい入門サイトが知りたい！」

### ★今日から始めるa-blog cms入門

http://ascii.jp/elem/000/000/891/891051/
バージョンはちょっと古いのですが、実際にテーマをカスタマイズしていきながら、
a-blog cms入門ができる連載記事です。
個人的にはこの連載が一番わかりやすかったです。


## 「これってできる？」

### ★ablogcms.org

http://ablogcms.org/
「a-blog cms エバンジェリスト」を中心とした有志によって運営・更新されていているTips集サイトです。
**逆引きガイド**があって便利ですので、「これって、できるのかな？」と
気になる事がある方は、まずご覧になってみてはいかがでしょう。


## 「ググっても情報がなかったので質問したい」「これってバグかも？」

### ★a-blog cms公式フォーラム
https://developer.a-blogcms.jp/forum.html
公式への質問や、バグと疑わしい動作は、公式フォーラムに投稿してみましょう。
**返信の頻度も多い**ため、何日もずっと放置されるという事はないかと思います。
また、開発者の方々が直接答えてくれるため、心強いです。

ただし、カスタマイズの相談が中心の投稿は、フォーラムでのサポート外になる事が多いです。
「こういうカスタマイズってみなさん、どうしてます？」といった相談は、
**a-blog cmsの相談所**をオススメします。

## 「公式フォーラムより優しめの質問・相談場所がほしい」

### ★a-blog cmsの相談所
https://www.facebook.com/groups/607277372746888/
a-blog cmsユーザー同士のFacebookグループです。
こちらはユーザー同士ですので、気軽に質問・相談ができるかと思いますよ♪

## 「リファレンスを効率良く見たい」
### ★a-blog cms util kit
https://github.com/steelydylan/acms-util-kit/
http://horicdesign.com/js/acms-util-kit.html
「気づいたら、リファレンスでブラウザがタブだらけ...」という事を回避できる、リファレンスアプリです。
アップルップル堀さんが作成したアプリで、わざわざ公式サイトを開かなくても、

- カスタムフィールド/フィールドグループ/ユニットメーカー
- ビルドインモジュール
- タッチモジュール
- グローバル変数
- 校正オプション

を参照できます。個人的にとてもオススメです！

## 「他のユーザーさんと交流したい」「開発者の方々に直接会って相談したい」

###★a-blog cms 勉強会 / Training Camp(勉強合宿)
https://www.a-blogcms.jp/news/event/
公式が行っているイベントです。こちらもオススメです！

とくにTraining Campは、多くの常連ユーザーさんが集まっています。
**開発者の方々による初心者向け講座**もあるため、
直接、いろんな事が質問ができます！

ご興味があれば是非、参加してみてはいかがでしょうか♪


#おわりに

ざっと初心者の方に役立ちそうな情報をまとめてみました。
また良いサイトをみつけたら随時、更新していきますね！

それでは！
Pythonのsort()とreverse()について

PythonのListには、sort()やreverse()など、順序を変更する関数が用意されていますが、これらを使う場合には仕様を理解して使わないと困ったことになります。

その困ったことに先日ハマりましたので残しておきます。

# 返り値がNone
たとえば、ほかの関数と同じように、

```py3
print([1,3,8,7,4].sort())
```
と書いても、**Noneが表示されます**。

同じように、

```py3
print([1,3,8,7,4].reverse())
```

でも結果は同じです。

# Pythonのドキュメントを読む

## sort()

とりあえずPythonのドキュメントを読むと、このような記述がありました。

>このメソッドは、大きなシーケンスをソートするときの容量の節約のため、シーケンスをインプレースに変化させます。副作用としてこの演算が行われることをユーザに気づかせるために、これはソートしたシーケンスを返しません。
http://docs.python.jp/3/library/stdtypes.html#list.sort

つまり、sort()は**破壊的変更を行うだけで、ソートされたリストを返すわけではない**ということです。

ドキュメントには続けて
>新しいリストインスタンスを明示的に要求するには sorted() を使ってください

とあります。

つまり、


```py3
l = [1,3,8,7,4]
l.sort()
print(l)
```

と書くか、

```py3
print(sorted([1,3,8,7,4]))
```

と書く必要があります

## reverse()
reverse()も、ドキュメントを読んでみると、

>reverse() メソッドは、大きなシーケンスを反転するときの容量の節約のため、シーケンスをインプレースに変化させます。副作用としてこの演算が行われることをユーザに気づかせるために、これは反転したシーケンスを返しません
http://docs.python.jp/3/library/stdtypes.html#mutable-sequence-types

とあります。つまりsort()と同じように一度変数に入れて破壊的変更をした後、printする必要があります。

すると、一つ疑問が浮かんできます。

反転済みのリストを返すreversed()は無いの？と。

結論から言えば、reversed()関数自体は存在します。

しかし、ソート済みのリストを返すsorted()と違い、reversed()が返すのは与えたリストの逆順の**イテレータ**ということです。

そのため、イテレータからリストを生成する必要があるため、

```py3
print([i for i in reversed([1,3,8,7,4])])
```

と、する必要があります。

しかし、リストを反転させるだけであれば、もっと簡単に書けます。

```py3
print([1,3,8,7,4][::-1])
```

[1,3,8,7,4][::-1]の[::-1]はスライスといい、詳しいことは省略しますが、リストから一部を抽出して新しいリストを作れる機能です。

コロン区切りで3つの値を指定でき（省略することも可能）、1つ目は抽出を開始する地点、2つ目は抽出を終了する地点、3つめは抽出する間隔です。

今回は、間隔は-1なので、1ずつインクリメントして抽出(=すべて抽出)し、更にマイナスが付いているのでリストの後ろから抽出を開始します。

なので、逆順のリストが帰ってきます。

リストの反転方法の使い分けとしては、

省メモリに処理したい →　reverse()

反転したリストを作るついでに各値に何か処理を加えたい（2倍にするなど） →　reversed()

とりあえず反転させたい　→　スライス

で使い分ければいいと思います。

# まとめ

挙動がよくわからないならドキュメントを読もう。
&修飾について考えていたらProcオブジェクトとlambdaの違いにハマったメモ


## はじめに

先ほど[Enumerable#mapなどの引数に&で修飾したSymbolオブジェクトを渡せる理由メモ](http://qiita.com/from_kyushu/items/95ef5248c9de6e9c8823)というエントリを書いたが、その後色々試していたら`Proc`オブジェクトと`lambda`で動作が違う部分に躓いてしまった。
今後に活かすためにもメモを取ることにする。

## `Proc`オブジェクトと`lambda`の違い

るりまの[`Proc`](http://docs.ruby-lang.org/ja/2.3.0/class/Proc.html#I_LAMBDA--3F)にどう違うか詳しく書いてある。

> 引数の扱い
> lambda のほうがより厳密です。引数の数が違っていると（メソッドのように）エラーになります。 Proc.new は引数を多重代入に近い扱い方をします。 

他にジャンプ構文の挙動の違いもあるのだが、本エントリとは関係がないので割愛する。

## `Proc#to_proc`の返り値と`Method#to_proc`の返り値

[ブロック付きメソッド呼び出し](http://docs.ruby-lang.org/ja/2.3.0/doc/spec=2fcall.html#block)の項によると、ブロックの代わりに`Proc`オブジェクトと`Method`オブジェクトが渡せるとある。
`&`で修飾した引数は暗黙的に`to_proc`メソッドが呼ばれるからなのだが、`to_proc`と言うからにはどちらも`Proc`オブジェクトが返ってくるのだろう、と思っていたのだが、例えば以下のコードは`ArgumentError`となる。

```ruby
class TestClass
  def hello
    "hello"
  end
end

test = TestClass.new
3.times &test.method(:hello) #=> wrong number of arguments (given 1, expected 0) (ArgumentError)
```

## `Method#to_proc`が返すのは`lambda`である

[`Proc#lambda?`](http://docs.ruby-lang.org/ja/2.3.0/method/Proc/i/lambda=3f.html)の項に明記されているのだが、`Method#to_proc`で返ってくる`Proc`オブジェクトは`lambda`である。

```ruby
test.method(:hello).to_proc.lambda? #=> true
```

普通に考えてみれば`Method`オブジェクトはメソッドをオブジェクト化したものなので、引数を厳密に扱ってもらわねば困る。
なので`lambda`が返ってくるのはごく自然なことだし、`lambda`も`Proc`オブジェクトには違いないのだから`to_proc`という名前のメソッドで`lambda`が返ってきても何の不都合もない。
だが、どちらも同じ`Proc`オブジェクトなのだから同じように使えるのだろう、と安易に考えてしまったが故に変にハマってしまった。
`1.day`などを使う時は require "active_support/time"を使いましょう。

`Hash`とかだけを拡張する時は`require 'active_support/core_ext/hash'`などのように呼び出すんですが、`Date`, `Time`, `DateTime`に関しては多分クラスが複数あるためにそのように呼び出すことが出来ません。

### 対策

だから

```.rb
require 'active_support'
require 'active_support/time'
```

で呼び出しましょう。

### 参考

http://stackoverflow.com/questions/4238867/how-do-i-use-active-support-core-extensions
pickle.dumpしたオブジェクトを別のオブジェクト階層でpickle.loadすると死ぬ


```ディレクトリ階層
|--b
|  |--unpickling.py
|--lib
|  |--__init__.py
|  |--__init__.pyc
|  |--class_a.py
|  |--class_a.pyc
|--pickling.py
|--unpickling.py
|--class_a.pkl
```

```lib/class_a.py
class ClassA:
    pass
```

```pickling.py
import pickle
from lib.class_a import ClassA

a = ClassA()

with open('class_a.pkl', 'w') as f:
    pickle.dump(a,f)
```

```unpickling.py
# b/pickling.pyも同じ

import sys
import pickle

filepath = sys.argv[1]

with open(filepath, 'r') as f:
    a = pickle.load(f)
```

で、こうやると死ぬ

```
[~]> python pickling.py
[~]> cd b
[~/b]> python unpickling.py ../class_a.pkl
Traceback (most recent call last):
  File "unpickling.py", line 7, in <module>
    a = pickle.load(f)
  File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 1384, in load
    return Unpickler(file).load()
  File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 864, in load
    dispatch[key](self)
  File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 1075, in load_inst
    klass = self.find_class(module, name)
  File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 1130, in find_class
    __import__(module)
ImportError: No module named lib.class_a
```

こうやると生きる

```
[~]> python pickling.py
[~]> python unpickling.py ../class_a.pkl
```
INSTALLファイルの通りにやっても動作しないぜ

https://github.com/os-autoinst/os-autoinst/blob/master/INSTALL.asciidoc を見て、作業した。１年ぐらい前はサクッと動いた記憶があるが、環境がもうない。openSUSEプロダクトなのでopenSUSEだと動くのかなーとVMに入れてみたが、やっぱりダメであった。

```
sudo zypper in openQA
```

まず、openQAのリポジトリの登録しておかないとインストール出来ないでしょ。

```
git clone YOUR-WRITEABLE-COPY-OF/os-autoinst.git
cd os-autoinst
```

git も zypper in git しとかないとダメでしょ


```
autoreconf -f -i
./configure
make
```

makeも zypper in make しとかないとダメでしょ


```
create a minimal "vars.json" config file

cat <<EOF >vars.json
{
    "DISTRI":  "sle",
    "CASEDIR": "/space/SVN/os-autoinst-distri-opensuse/",
    "BACKEND": "s390x"
}
EOF
```

この設定例はどうなんだろう？distriもcasedirもbackendも不適切な気がするんだけど…。
GanttProjectで全タスクの進捗をリセットする


プロジェクトファイルを流用してプロジェクトを始めたい場合，入力済みの進捗をリセットしたい。
GanttProjectのganファイルはXMLファイルなので，ファイルを斜め読みしてみました。
すると，進捗はcomplete属性のようなので直接ファイルを加工してしまいます。

```html
<task id="1" name="task1" start="2016-09-06" duration="2" complete="0">
```

ということでVim等のエディタで正規表現で一括置換して完了です。

* パターン文字列: complete="[0-9]*"
* 置換後の文字列: complete="0"

ファイルフォーマットの裏はとっていませんので自己責任でおねがいします。
Outlook 2016 for MacでF7が文章校正に割り当てられカタカナ変換ができない

Microsoft Outlook 2016 for MacでF7キーを押してカタカナ変換しようとしたら、文章校正が起動してきてしまう。
これを抑制しようとしても、Outlookにはショートカットキーの設定変更メニューが見当たらない。

ググったらWordに関して同様の現象に対する対策が見つかった。
それを試してみたらOutlookにも適用された。
どうもOfficeソフト間でショートカットキーの設定は共有してるみたい。

手順は以下の通り。

1. 【Outlook】Outlookを終了する
2. 【Word】Wordを起動する
3. 【Word】メニューの[ツール]-[ショートカット キーのユーザー設定...]をクリック
「ショートカット キーの割り当て」ウインドウが開く
4. 【Word】「ショートカット キーの割り当て」ウインドウ上部「コマンド指定」左側「分類」で「ツール」をクリック
5. 【Word】「ショートカット キーの割り当て」ウインドウ上部「コマンド指定」右側「コマンド」で「ツールオプション文章校正」をクリック
6. 【Word】「ショートカット キーの割り当て」ウインドウ下部「ショートカット キーの指定」の「現在のキー」に「F7」と「command+option+L」が表示されているはず。「F7」を選択して、右の「削除」ボタンをクリック

![スクリーンショット 2016-09-06 16.16.19.png](https://qiita-image-store.s3.amazonaws.com/0/130668/03a1575a-0a2e-2362-3110-65d18fae2841.png)
7. 【Word】「OK」ボタンをクリックして「ショートカット キーの割り当て」ウインドウを閉じる
8. 【Word】Word上でF7に文章校正が割り当てられなくなったことを確認
9. 【Word】Wordを終了する
10. 【Outlook】Outlookを起動する
11. 【Outlook】Outlook上でもF7に文章校正が割り当てられなくなったことを確認

参考サイト：
* <a href="http://www.hiroshi.today/2015/10/22/f7-for-office2016-mac/">Microsoft Office Word 2016 for MacでF7に文章校正が割り当てられている件 – hiroshi.today</a>
【a-blog cms】acms.js+組み込みJSの実行後に処理が書ける隠しイベントハンドラがあった

[株式会社データファーム](https://datafarm.jp/)のtakneoriです。

a-blog cmsのテンプレートで読み込む事が、(ほぼ)必須のacms.jsですが、
実行タイミングが非同期だったり、acms.js自体のドキュメントが少なかったりと、
けっこうややこしいです。。

一番、悩ましいのが
acms.js+組み込みJSを**実行した後のタイミングに、処理を書きたい場合**です。
現在(2016/09/06)のところ、公式には詳しいドキュメントはないようです。。

#しかし、じつはあった隠しイベントハンドラ！

ところが、じつはacms.jsには、そのような処理を設定できるイベントハンドラが存在していたようです。(!?)
a-blog cmsの公式フォーラムで、
私が得た情報・みつけた情報をここにまとめておきます。


## acmsDispatchイベントハンドラ

acms.js+組み込みJSを実行した後に処理をしたい場合、
`acmsDispatch`イベントハンドラに処理を追加します。


```js
ACMS.addListener("acmsDispatch",function(){
	$("[href*=bxslider]").remove();
});
```

引用元：[組み込みJS（bxslider）のライブラリ依存CSSを読み込まないようにしたい - a-blog cms公式フォーラム](https://groups.google.com/forum/embed/?place=forum/a-blog-cms&showsearch=true&showpopout=true&showtabs=false&parenturl=https%3A%2F%2Fdeveloper.a-blogcms.jp%2Fforum.html#!searchin/a-blog-cms/bxslider/a-blog-cms/IhuQ1Vj3KUI/_pcMVwYnBwAJ)

上記例では、
acms.jsが組み込みJSのために読み込んだbxslider.cssを、
linkタグごと消去しています。



## acmsAddCustomFieldGroupイベント

カスタムフィールドグループを動的に追加した後に
処理をしたい場合は、`acmsAddCustomFieldGroup`イベントハンドラに処理を追加します。


たとえば、下記画像のような場合です。

![スクショ.jpg](https://qiita-image-store.s3.amazonaws.com/0/138612/05e0508d-8751-656f-3646-fc565dbf07bf.jpeg)

この場合、下記のソースのように、
フィールドを追加した後 `js-datepicker`をもう一度実行する事で解決ができました。

```js
ACMS.addListener("acmsAddCustomFieldGroup",function(item){
	$(".js-datepicker").removeClass("hasDatepicker");
	$(".js-datepicker").each(function(i){
		var id = $(this).attr("id");
		$(this).attr("id",id+i);
		$(this).datepicker(ACMS.Config.dpicConfig);
	});
});
```

引用元：[(ver 2.6.0.2) カスタムフィールドグループに、動的にjs-datepickerを反映させるには - a-blog cms公式フォーラム](https://groups.google.com/forum/embed/?place=forum/a-blog-cms&showsearch=true&showpopout=true&showtabs=false&parenturl=https%3A%2F%2Fdeveloper.a-blogcms.jp%2Fforum.html#!searchin/a-blog-cms/acms$20js/a-blog-cms/YHp4yybsktw/dbO9dNtGAgAJ)


#おわりに

これで、かゆい所に手が届きますね！

現在、フォーラムを見る限り2つまでイベントハンドラが見つかっていますが、
他にもあるかもしれません。

公式ドキュメントの充実も期待したいですね。
また、acms.jsについては次期バージョンで、かなりの改善がされるとの噂ですので
個人的にはそちらにも期待したいです。

それでは！

*(こちらの記事は、2016/09/06の情報です)*
組込みC > 文と式の混在 > C89:不可 / C99:可

```txt:動作環境
C89対応の組込み系 (C99非対応)
```

```c
for(int idx=0; idx<10; idx++) {
```
という実装をよくやるが、C89の環境ではint idxを別途宣言しないといけない。

以下のリンクの@blunder3さんの説明が分かりやすかった。
http://qa.atmarkit.co.jp/q/9694

> C89の規格に厳密に従った場合は、この位置に宣言を書けない（宣言と文の混在は不可だ）からです。
Elasticsearchで複数ノードへBalancing

## 背景
サーバー5台構成でclusterを運用してる
各サーバーへのBalancingはAWS ELBを利用してる
Elasticsearch接続用のGEMを利用してる
https://github.com/elastic/elasticsearch-ruby/tree/master/elasticsearch-transport

## 問題
ElasticsearchのGemがBalancing昨日を提供してるため、ELBを利用して、オーバヘッドを増やす必要がない

## TOBE
複数ホストの接続へ

IPアドレスは各サーバーのIPにする、実際はsettings.ymlへ設定する

```ruby
Elasticsearch::Model.client = Elasticsearch::Client.new host: [10.0.1.2, 10.0.1.3, 10.0.1.4, 10.0.1.5, 10.0.1.6], request_timeout: 30, log: true, retry_on_failure: true, reload_on_failure: true, randomize_hosts: true, reload_connections: true, transport_options: { request: { open_timeout: 1 } }
```

## 確認
randomize_hostsが効いてることを確認

tcpdumpで9200ポートからのリクエストを監視
送信webサーバーのIPは仮に10.0.1.150とする、各サーバーで以下のコマンド実行

```bash
sudo tcpdump host 10.0.1.2 and port 9200 | grep 10-0-1-150
sudo tcpdump host 10.0.1.3 and port 9200 | grep 10-0-1-150
sudo tcpdump host 10.0.1.4 and port 9200 | grep 10-0-1-150
sudo tcpdump host 10.0.1.5 and port 9200 | grep 10-0-1-150
sudo tcpdump host 10.0.1.6 and port 9200 | grep 10-0-1-150
```
Sympliを使ってAndroid Studio、Xcode上でデザインを正確かつお手軽に反映する


##Sympliとは
メインはSketch/Photoshopのプラグインになります。
Sympliを使えば要素のサイズ、マージン、カラー、フォントなどの情報を取得することができデザイナーはレイアウト指示書を作る必要がなくなります。
https://sympli.io/

類似サービスとしてZeplinがありますがZeplinでできることはSympliでほとんどできます。
※1プロジェクト無料。有料プランはZeplinと同価格。

##特徴
Zeplinとの大きな違いは
Android Studio、Xcodeのプラグインがあることです。
このプラグインを使えばデザインを正確かつお手軽に反映することができます。

###Android Studio
- イメージを見ながら同画面でプログラミングできる
- IDE上で画像の書き出しが可能
- color.xmlを出力してくれる

[参考動画を見る](https://vimeo.com/155799932)

###Xcode
- イメージを見ながら同画面でプログラミングできる
- IDE上で画像の書き出しが可能
- Sketchのデータ通りにUIを配置できる
- プロジェクトの更新があると通知される

[参考動画を見る](https://vimeo.com/155799932)

##注意点
- SketchでExport設定しないとIDE上で画像書き出しができない
- 画像の命名規則をSketchで定義する必要がある
- iOSのドラッグ配置はボタンなど判別はしてくれるないのでXcode上でオブジェクトを事前に用意する必要がある

##導入方法
###Sketch
プラグインをダウンロードします。
https://sympli.io/downloads/sketch
↓
パッケージをインストールします。
↓
Sketchで作成したアートボードを選択しメニューから
Plugins → Sympli → Export to Sympli (⌘+Y)でプロジェクトにアップロードします。
↓
Creat New ProjectからiOS/Androidを選択しプロジェクトを作成します。
↓
アップロードが完了するとシェアURLが発行されるのでエンジニアに教えてあげる必要があります。メールアドレスから招待も可能です。
※IDE上でプラグインを使用する際はエンジニアもユーザー登録が必須

![スクリーンショット 2016-09-06 11.56.56.png](https://qiita-image-store.s3.amazonaws.com/0/139798/8bf93186-ee42-f013-5d29-750c713b30ef.png "スクリーンショット 2016-09-06 11.56.56.png")

###Android Studio
プラグインをダウンロードします。
https://sympli.io/downloads/androidstudio
↓
Android Studioアプリを立ち上げメニューから
Android Studio → Preference → Plugins → Install plugin from diskから先ほど落としてきたsympli-androidstudio-[Version].zipを選択し「OK」を選択したください。

![スクリーンショット 2016-09-06 12.03.09.png](https://qiita-image-store.s3.amazonaws.com/0/139798/7399faf3-3662-c4ec-6c07-858332751a07.png "スクリーンショット 2016-09-06 12.03.09.png")


###Xcode
プラグインをダウンロードします。
https://sympli.io/downloads/xcode
↓
sympli-xcode-[Version].dmgを展開しパッケージをインストールします。
↓
インストールが終わったらダイアログが表示されるので「Load Bundle」を選択してください。

![iOS_sympli.png](https://qiita-image-store.s3.amazonaws.com/0/139798/9fa0e1f2-65aa-0c21-046b-26f4a0421a58.png "iOS_sympli.png")


##使ってみての感想
Xcodeのプラグインは視覚的にデザイン反映ができるので特に優れているかと思います。
書き出したパーツをアップするドライブが不要なのでそのひと手間がなくなるのもありがたいです。
開発アプリと隣の画面でZeplinを立ち上げ反映していくより1つの画面にまとまっているので断然使いやすいです。
デザイン反映が苦手なエンジニアやコードを書いてるデザイナーには最適なプラグインだと思いますので是非お試しください。


##参照リンク
[Sympli](https://sympli.io/)
CVE-2016-2188は4.5.1-1で直ってる...とおもったら、まだだったらしい。

http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=4ec0ef3a82125efc36173062a50624550a900ae0

```
diff --git a/drivers/usb/misc/iowarrior.c b/drivers/usb/misc/iowarrior.c
index c6bfd13..1950e87 100644
--- a/drivers/usb/misc/iowarrior.c
+++ b/drivers/usb/misc/iowarrior.c
@@ -787,6 +787,12 @@ static int iowarrior_probe(struct usb_interface *interface,
 	iface_desc = interface->cur_altsetting;
 	dev->product_id = le16_to_cpu(udev->descriptor.idProduct);
 
+	if (iface_desc->desc.bNumEndpoints < 1) {
+		dev_err(&interface->dev, "Invalid number of endpoints\n");
+		retval = -EINVAL;
+		goto error;
+	}
+
 	/* set up the endpoint information */
 	for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
 		endpoint = &iface_desc->endpoint[i].desc;
```

Linux kernel before 4.5.1 っていうんだから、4.5.1 含…むのか含まないのか。確認。あ、含まれてた。4.5.1-1で直ってる、ということで。

https://security-tracker.debian.org/tracker/source-package/linux は後で更新…。→した。

> From kernel-sec triaging: the above commits only handles the case where there are zero endpoints, but not the case where there are some endpoints but none of the expected type. So this is not really fixed anywhere yet.

ということでrevertされた。あらら。
CVE 2016-1575とCVE 2016-1576は4.5~rc4-1~exp1で直ってる

# CVE 2016-1575とCVE 2016-1576について。

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-1576　から
リンクを辿ってLinusのgit treeでのコミットに行き着いた。
http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=e9f57ebcba563e0cd532926cab83c92bb4d79360

ここで特徴的な変更として

```
diff --git a/include/uapi/linux/magic.h b/include/uapi/linux/magic.h
index b283d56..0de181a 100644
--- a/include/uapi/linux/magic.h
+++ b/include/uapi/linux/magic.h
@@ -31,6 +31,7 @@
 #define PSTOREFS_MAGIC		0x6165676C
 #define EFIVARFS_MAGIC		0xde5e81e4
 #define HOSTFS_SUPER_MAGIC	0x00c0ffee
+#define OVERLAYFS_SUPER_MAGIC	0x794c7630
 
 #define MINIX_SUPER_MAGIC	0x137F		/* minix v1 fs, 14 char names */
 #define MINIX_SUPER_MAGIC2	0x138F		/* minix v1 fs, 30 char names */
```

を使うことにした。

Debianコードサーチ https://codesearch.debian.net/ を使って確認。4.5.5では直ってるようだ。
http://sources.debian.net/src/linux/4.5.5-1/include/uapi/linux/magic.h/?hl=34#L34

ここにないものは http://snapshots.debian.org から取得。git blameのようにやっていく。
コミット日時からして、https://kernelnewbies.org/LinuxVersions を参考にすると4.4リリース後なので、4.5では直ってる気がする。4.4.xのどこかで直っていたりするのだろうか？

* 4.4.2では直って無かった
* 4.5.5で直ってた
* 4.5.1では直ってた
* 4.4.6でも直ってなかった
* 4.5~rc4-1~exp1 で直った。

ということで、https://security-tracker.debian.org/tracker/source-package/linux の情報は後で更新しておこうそうしよう。→した。
3Dモデルの表示


r78

## 素材

|サイト|料金|
|---|---|
|[TF3DM](http://tf3dm.com/)|無料|
|[ニコニ立体](http://3d.nicovideo.jp/)|無料|
|[amana images](http://amanaimages.com/3dmodel/)|有料|


## JSON

```javascript:JSONLoader
const loader = new THREE.JSONLoader();
loader.load('../assets/models/model.json', (geometry, mat) => {

  const faceMat = new THREE.MeshFaceMaterial(mat);
  mesh = new THREE.Mesh(geometry, faceMat);

  scene.add(mesh);

});
```

※materialが設定されていない場合は、引数はgeometryだけにする
https://teratail.com/questions/33951

### Blenderエクスポート

モデルだけ貰ってエンジニアが手を加えた上で
BlenderからJSONをエクスポートすることも多い
[three.jsでjson形式のモデルを表示してみる](http://matorel.com/archives/103)


オブジェクトをjoinしないと、欲しいモデル全てが書き出されなかったりするので、書き出す時だけ対象のモデルをjoinしておく`control + J`

また、`Face Materials`にチェックを入れないと「visibleがない」みたいなエラーが出るので、こちらのチェックも忘れずに。（チェックを入れて出力してもmaterialsの中身がなければ同じエラーが出る）


## OBJ, MTL

`OBJLoader.js`,`MTLLoader.js`を読み込む

mtlとobjのコールバックを受け取って、その中でシーンに追加する

```javascript
const mtlLoader = new THREE.MTLLoader();
mtlLoader.setPath('./data/');
mtlLoader.load('city.mtl', (materials) => {
  materials.preload();

  const objLoader = new THREE.OBJLoader();
  objLoader.setMaterials(materials);
  objLoader.setPath('./data/');
  objLoader.load('city.obj', (object) => {

    const mesh = object;
    this.scene.add(mesh);

  });
});
```


## COLLADA

`ColladaLoader.js`を読み込む

JSONよりも重い

```javascript
loader.load("../assets/models/dae/model.dae", (result) => {
  console.log(result);  // どこにあるか確認
  const mesh = result.scene.children[0].children[0].clone();
  scene.add(mesh);
});
```

テクスチャに.tgaフォーマットが使われていると読み込めない。.tgaはWebGLでサポートされていないから。pngに変更する必要がある。


> 参考
[Web上で3D表現を！WebGLのリッチな表現を短時間でお手軽に作る方法](https://liginc.co.jp/334917)
pandas indexとreindex



```python:dataframe_make
import pandas as pd
import numpy as np
df=pd.DataFrame(np.arange(9).reshape(3,3))

df
#[Out]#    0  1  2
#[Out]# 0  0  1  2
#[Out]# 1  3  4  5
#[Out]# 2  6  7  8
```





indexはindex振りなおすけど、値は追随。

reindexはindex振りなおすけど、値は追随しないのでNaN

```python:index
df.index=range(100,103)

df
#[Out]#      0  1  2
#[Out]# 100  0  1  2
#[Out]# 101  3  4  5
#[Out]# 102  6  7  8
```





```python:reindex
df.reindex(range(100,103))
#[Out]#       0   1   2
#[Out]# 100 NaN NaN NaN
#[Out]# 101 NaN NaN NaN
#[Out]# 102 NaN NaN NaN
```
OSX Vagrant 1.8.5 authorized_keys Permission 不具合 issues#7610 を patchコマンド で 解決する（メモ）

# OSX Vagrant 1.8.5 authorized_keys Permission 不具合 issues#7610 を patchコマンド で 解決する（メモ）

OSX Yosemite上で利用しているVagrantを現時点（2016/09/06）での最新版である1.8.5にバージョンアップしました。
２ヶ月くらい前からの話なので今更かもしれませんが、
噂通り？　`Vagrant up`時に認証エラーとなる
authorized_keysのPermissionに関する不具合にあたりました。

ワークアラウンドは幾つか出ており、次期バージョン（そろそろ出る？）では解決すると思いますが、
既にGithub上で[ISSUES#7610](https://github.com/mitchellh/vagrant/issues/7610)として出ており、Bugfix済みでCloseもされていますので
今回は、**Githubからパッチファイルをダウンロード**と**patchコマンド**を利用して解決してみました。
なお、自分用メモも兼ねて記事にしています。

## Githubよりパッチファイルをダウンロード
GithubではCommitのURLの拡張子を`.patch`とすると
パッチファイル（差分形式のテキスト）の形式でダウンロード可能です。

今回のCommitのURLは以下のなので
https://github.com/mitchellh/vagrant/commit/a6760dd8e7743e048cb2f38c474e05889356e8ac

このように`.pacth`を末尾に付加するとパッチファイル（差分形式のテキスト）の形式で返してくれます。
https://github.com/mitchellh/vagrant/commit/a6760dd8e7743e048cb2f38c474e05889356e8ac.patch

## patchコマンド
patchコマンドを使うとパッチファイル（差分形式のテキスト）を利用して、簡単にパッチを当てることが可能です。
今回は対象ファイルが１つなので、直接指定する形をとります。
`patch パッチ宛先ファイルのパス　<　patchファイルのパス`

なお、OSX Yosemiteでの、今回のパッチ宛先ファイルのパスは`/opt/vagrant/embedded/gems/gems/vagrant-1.8.5/plugins/guests/linux/cap/public_key.rb`となります。

## 手順
OSX上でVagrant1.8.5の[ISSUES#7610](https://github.com/mitchellh/vagrant/issues/7610)を
以下手順でパッチをあてます。

```
#　1.patch用にディレクトリを新規作成し移動します
mkdir　patch
cd　patch

#　2.Github上から該当のissues#7610のパッチファイルを取得します
wget https://github.com/mitchellh/vagrant/commit/a6760dd8e7743e048cb2f38c474e05889356e8ac.patch

#　3.patch コマンドを利用して取得したpatchを適用します
sudo patch /opt/vagrant/embedded/gems/gems/vagrant-1.8.5/plugins/guests/linux/cap/public_key.rb < a6760dd8e7743e048cb2f38c474e05889356e8ac.patch

#　4.patchが適用されていることを確認します
sed -n 57p /opt/vagrant/embedded/gems/gems/vagrant-1.8.5/plugins/guests/linux/cap/public_key.rb
```

## 参考
以下実行結果です。

```
~ $vagrant -v
Vagrant 1.8.5
~ $mkdir pacth
~ $cd patch
patch $
patch $wget https://github.com/mitchellh/vagrant/commit/a6760dd8e7743e048cb2f38c474e05889356e8ac.patch
--2016-09-06 14:55:47--  https://github.com/mitchellh/vagrant/commit/a6760dd8e7743e048cb2f38c474e05889356e8ac.patch
Resolving github.com... 192.30.253.113
Connecting to github.com|192.30.253.113|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/plain]
Saving to: 'a6760dd8e7743e048cb2f38c474e05889356e8ac.patch'

a6760dd8e7743e048cb2f38c474e05889356e     [ <=>                                                                     ]     863  --.-KB/s   in 0s     

2016-09-06 14:55:49 (31.7 MB/s) - 'a6760dd8e7743e048cb2f38c474e05889356e8ac.patch' saved [863]

patch $sudo patch /opt/vagrant/embedded/gems/gems/vagrant-1.8.5/plugins/guests/linux/cap/public_key.rb < a6760dd8e7743e048cb2f38c474e05889356e8ac.patch
Password:
patching file /opt/vagrant/embedded/gems/gems/vagrant-1.8.5/plugins/guests/linux/cap/public_key.rb
patch $sed -n 57p /opt/vagrant/embedded/gems/gems/vagrant-1.8.5/plugins/guests/linux/cap/public_key.rb
              chmod 0600 ~/.ssh/authorized_keys
patch $
```
Stretcher v0.7.0 でコマンド実行だけできるように

[Stretcher](https://github.com/fujiwara/stretcher) [v0.7.0](https://github.com/fujiwara/stretcher/releases/tag/v0.7.0) では `src` がないmanifestを処理すると単に `pre`/`post`, `success`/`failure` のコマンド実行だけを行うようになりました。

```yaml
commands:
  pre:
    - command1
    - command2
  post:
    - command3
  success:
    - notify_success_command
  failure:
    - notify_failure_command
```

pre, postとは何なのか、という感はありますが、単にpreとpostが連続して実行されるのでどちらに記述しても差異はありません。

たまに、Stretcherがインストールしてあるホストに対してコマンド実行だけ行いたいことがあるのですが(イレギュラーな再起動とか)、`consul exec`は自由すぎてちょっと…という場合や、consul agentとstretcherの実行権限を分けているのでstretcherの実行ユーザでコマンドを発行したい、などといった場合に使えるかと思います。

また、エントリを上げていませんでしたが v0.6.0 からは `sync_strategy` という設定項目が増えていて、tarを展開した後 rsync ではなく mv(相当) でデプロイ先に同期することができます。

Capistranoのように、デプロイごとにuniqueなディレクトリに配置した上でsymlinkを張り替えるようなやり方の場合に、便利かと思います。PullRequestをいただいた @udzura さん、ありがとうございました！
エミュレートではない外部ストレージのディレクトリパスを取得する

	var storageManager = (Android.OS.Storage.StorageManager)context.GetSystemService(Context.StorageService);

	var volumeList = (Java.Lang.Object[])storageManager.Class.GetDeclaredMethod("getVolumeList").Invoke(storageManager);

	var list = new List<string>();

	foreach (var storage in volumeList) {
		Java.IO.File info = (Java.IO.File)storage.Class.GetDeclaredMethod("getPathFile").Invoke(storage);

		if ((bool)storage.Class.GetDeclaredMethod("isEmulated").Invoke(storage) == false && info.TotalSpace > 0) {
			list.Add(info.Path);
		}
	}
DynamoDBMapperでテーブル名に動的にプレフィックスを付け加える

環境を開発、テスト、本番と使い分けるためにDynamoDBのテーブル名にプレフィックスを付けるケースは多いと思います。
DynamoDBMapperには、Mapperの生成時にDynamoDBMapperConfigを使って設定を書き換える機能があります。
この設定の一つに、テーブル名を差し替える機能があるのでこれを使用します。

公式のドキュメントは[こちら](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/DynamoDBMapper.OptionalConfig.html)(ただし既にコードがDeprecatedになっている)

# テーブル名にプレフィックスを付ける

TableNameOverrideを使って、テーブル名にプレフィックスを付けることができます。
サンプルです。言語はScalaで書かれています。

```scala
@DynamoDBTable(tableName="Music")
class MusicItem {
  // 省略
}

val client: AmazonDynamoDBClient = (new AmazonDynamoDBClient())
    .withEndpoint("http://localhost:8000")

// Configの生成
val mapperConfig: DynamoDBMapperConfig = new DynamoDBMapperConfig.Builder()
    .withTableNameOverride(TableNameOverride.withTableNamePrefix("Dev-"))
    .build()

// Mapper生成時にConfigを渡す
val mapper: DynamoDBMapper = new DynamoDBMapper(client, mapperConfig)
```

この場合、Mapperは`Dev-Music`テーブルに対してアクセスするようになります。
iOS端末の実機ログをgrep(フィルタリング)しながら確認する

# Xcodeでデバッグ出力を確認する場合の問題点

実機でiOSアプリのデバッグをする場合、
デバッグ出力を見る一般的な方法はXcode上で確認する方法だと思います。

もしくはXcodeのメニューバーからWindow=>Devicesと選択してデバイスを選択すると、
デバッグ実行中でなくても確認できますし、アプリ以外のログも見れますね。

ただ、この方法だと、特定のログだけを確認したい場合に結構不便です。
もちろん検索はできますが、ヒットした行以外も表示されたままだとやはり見難いです。

# ログをgrep(フィルタリング)しながら確認する

## 1. libimobiledevice

[libimobiledevice](http://www.libimobiledevice.org/) を使うと、ターミナル上で実機のログを簡単に確認することができます。
ターミナルで確認できるということはgrepし放題です。捗ります。

### How to use

Homebrewでインストールできるので、まずはこちらのページ等を参考にインストールしましょう。
[Idevicesyslog | krypted.com](http://krypted.com/tag/idevicesyslog/)

インストールが終わったら、次のようにしてログを出力できます。

```
$ idevice_id -l
58efd2e8341certef963ed39411a2ee6b7asd7c3

$ idevicesyslog -u 58efd2e8341certef963ed39411a2ee6b7asd7c3
```

grepしたいなら

```
$ idevicesyslog -u 58efd2e8341certef963ed39411a2ee6b7asd7c3 | grep "Any Word"
```

## 2. iOS Console

オープンソースなソフトウェアではないので、信頼できない場合は使用を控えた方が良いですが、こちらのアプリでも簡単に任意の文字列でフィルタリングしながらログを確認できます。

[LemonJar - iOS Console](http://lemonjar.com/iosconsole/)

右上のFilterという検索窓に任意の文字列を入れるとリアルタイムにフィルタリングしてくれます。
ただ、OR検索ができないので、OR検索したい場合はlibimobiledeviceとgrepを組み合わせた方が良さそうです。
Jenkinsのjobの一括無効化

#Jenkinsサーバの移行
Jenkinsサーバを移行することになった。ジョブが多いので、ボリュームをコピーして移行先サーバでもマウントする形を取ることにした。当然二重に走ると困るジョブもあるので、全て無効化した上で検証しつつ数件ずつ有効化していくことで行おうと思った。そこで一括で無効にする方法ないかなーとググると、なんかHTTP経由のやり方ばかり出てきてそんなバカな、と。

#どこで設定されている？
/path/to/jenkins/jobs/${JOBNAME}/config.xmlにdisabledって項目があるぞ。
しかも有効無効を切り替えるとtrue,falseが切り替わるぞと。

#なのでこうした
```
$ find /path/to/jenkins/jobs -name config.xml  -print0 | xargs -0 sed -i "s/<disabled>false/<disabled>true/"
$ sudo service jenkins restart 
```

restartしないと反映されていませんでした。
余計なもののインストールはしたくないでござる・・・
時間がかかるコマンドの完了に気づく

パッケージのダウンロードとかビルドとか、時間がかかる処理をしているとき、
ほかの作業にとりかかっていて、気づいたらビルドが終わってた。
なんてことがしょっちゅうあります。

それぞれのタスクの優先度が同じならまあいいんですが
知らない間に優先度が逆転しちゃってると生産性が落ちますよね。

コマンドが終わったことを音で知らせる方法を思いつきました！

## 言わせる

```:shell
% bundle install; say 'おわりました'
```

サイバーな感じで気に入ってますが、残念ながらlinuxでは使えません。

## システム音を鳴らす

```:shell
% bundle install; tpul bel
```

これでシステム音が鳴ります。


ターミナルでスクリプトを呼ぶたびにコマンド繋げるのが面倒であれば
スクリプト内に入れてしまうのも手です。
pythonからsubprocessでコールしてみました。

```:python
import subprocess

subprocess.call('tput bel', shell = True)
```
Excel 2013 > メニューバーがクリックできない現象 > エクスプローラのプレビューを切る

```txt:動作環境
Excel 2013 on Windows 7 pro
```

Excel 2013でファイルを開いた時、上面のメニューがクリックできない状況がある、と報告を受けた。

調べたところ以下を見つけた。
http://www.excel.studio-kazu.jp/kw/20120703132425.html
> フォルダの画面左上の「整理」→「レイアウト」→「プレビューウィンドウ」のチェックが外れてるか確認してみて。 

Excel2013の「プレビューウィンドウ」なるものを探したが見つからなかった。

http://office-qa.com/Word/wd268.htm
を見て気づいたのはOSのフォルダの設定の方だった。

手順は以下。

- 適当なフォルダを開く (エクスプローラが起動する)
- メニュー[整理]を選択
- [レイアウト]を選択
- [プレビューウィンドウ]のチェックをはずす

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/a4fb4989-7100-a6aa-518b-7e5fced0e7a6.png)
terraform で BYOL の OpenVPN の AMI をさがす


```ruby
data "aws_ami" "openvpn" {
  most_recent = true
  owners      = ["aws-marketplace"]

  filter {
    name   = "architecture"
    values = ["x86_64"]
  }

  filter {
    name   = "root-device-type"
    values = ["ebs"]
  }

  filter {
    name   = "name"
    values = ["OpenVPN Access Server*"]
  }

  filter {
    name = "product-code"
    values = ["f2ew2wrz425a1jagnifd02u5t"]
  }

  filter {
    name   = "virtualization-type"
    values = ["hvm"]
  }

}

output "ami_id" {
  value = [
    "${data.aws_ami.openvpn.id}"
  ]
}
```

`product-code` を指定しないと有料ライセンスの方になってしまいます
UniversalApplicationで空のプロジェクトを作成するとエラーが出る

UWPの開発をしようとしたら、
「vstemplateファイルで参照されているウィーザードクラス'Microsoft,VisualStudio,WinRT,TemplateWizards...(省略)'
はアセンブリ'Microsoft,VisualStudio,WinRT,TemplateWizards,Version=14.0.0.0, Culture=...(省略)'に存在しません」
と表示されてプロジェクト作成が出来なかったのでその解決法。

C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\ProjectTemplates\CSharp\Windows Root\Windows UAP\1041\BlankApplication
の中の.vstemplateファイルを管理者権限で開いて下記の部分を消すと上手くいきました。

 ```
<WizardExtension>
    <Assembly>Microsoft.VisualStudio.WinRT.TemplateWizards, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</Assembly>
    <FullClassName>Microsoft.VisualStudio.WinRT.TemplateWizards.ApplicationInsights.Wizard</FullClassName>
</WizardExtension>
```

参考：
眠るシーラカンスと水底のプログラマー
http://coelacanth.jp.net/uwp_applicationinsights_error/
リポジトリのコミット履歴を表示する sphinxcontrib-vcs を作りました

Sphinx で管理しているドキュメントの履歴や差分内容を気軽に確認できるようにするための Sphinx 拡張です。

Git と Mercurial に対応しています。Python 2/3 両対応ですが、Mercurial は Python 3 対応していないので Python 2.7 環境でしか動作しません。

以下 PyPI とそのドキュメントになります。

* https://pypi.python.org/pypi/sphinxcontrib-vcs/

  * ドキュメント: https://pythonhosted.org/sphinxcontrib-vcs/

# 経緯

類似の Sphinx 拡張として [sphinx-git](https://github.com/OddBloke/sphinx-git) があります。当初は私もこの拡張機能を使っていました。私の用途として、差分内容を表示する機能を追加したかったのと sphinx-git のメンテナンスがあまり活発ではないのもあり、新規に自分で作り直すことにしました。sphinxcontrib-vcs は sphinx-git に影響を受けています。

# インストール

```bash
$ pip install sphinxcontrib-vcs
$ vi conf.py
extensions = ['sphinxcontrib.vcs']
```

# ディレクティブとオプション

*..git::* または *..mercurial::* のディレクティブに以下のオプションを指定します。

* **:number_of_revisions**: 指定した件数のコミット履歴を表示する
* **revision: revision**: 指定したリビジョンのコミットログを表示する
* **with_ref_url**: 指定すると、コミットメッセージの下にリポジトリへのコミット URL を表示する (github/bitbucket のみ対応)
* **include_diff**: 指定すると、コミットメッセージの下に差分内容を表示する (初期状態は非表示にしており、コミットメッセージをクリックすると表示／非表示が切り替わる)

# 直近のコミット履歴を表示する

git のリポジトリだとこんな感じ。

![sphinxcontrib-vcs-sample1.png](https://qiita-image-store.s3.amazonaws.com/0/5988/537085a3-d697-d4ac-eac3-487c319168fb.png)

# 指定したリビジョンのコミットログを表示する

こんな感じ。

![sphinxcontrib-vcs-sample2.png](https://qiita-image-store.s3.amazonaws.com/0/5988/6ae83493-0786-2c79-dd4f-25369f6c1636.png)

# まとめ

Sphinx そのものは数年前から使っていましたが、Sphinx 拡張を自分で作ってみたのは今回が初めてでした。実際に作ってみて Docutils と Sphinx の両方のドキュメントやソースを見ないといけないところがやや煩雑な印象を受けました。既に優れた拡張機能がたくさんあるのでそれらのソースを参考にしながら開発を進める方が早いような気がします。

以下に私が参考にしたサイトや情報などをまとめておきます。

拡張機能の開発のドキュメント

* [The Docutils Document Tree](http://docutils.sourceforge.net/docs/ref/doctree.html)
* [Sphinx 公式ドキュメント - Sphinx拡張機能の開発](http://docs.sphinx-users.jp/extdev/index.html)
* [(7日目) Sphinx 拡張を作ってみよう (sphinxcontrib.nicovideo)](http://tk0miya.hatenablog.com/entry/20111207/p1)

Git/Mercurial のライブラリのドキュメント

* https://gitpython.readthedocs.io/en/stable/
  * よく出来ていて使いやすいものだと思います
* https://www.mercurial-scm.org/wiki/MercurialApi
  * Mercurial は API が公開されていないのでコマンドの実行結果をパースしています。いろんな環境でちゃんと動かないかも？

ソースのサンプルとして参考にした拡張機能

* https://bitbucket.org/birkenfeld/sphinx-contrib
  * ここに複数の拡張機能がまとまっているのでここから grep して参考にするのが良さそう
* https://github.com/OddBloke/sphinx-git
  * オリジナルの拡張機能、GitPython の使い方を調べました

Sphinx 拡張のテストツール

* https://github.com/sphinx-doc/sphinx-testing
  * @tk0miya さんのテストツール、こういうのあったんですね！ :snake:
onupgradeneededが呼ばれず、deleteObjectStoreができないとき

備忘。
deleteObjectStoreを行おうとしたら、「バージョン変更」を行った時のコールバック内（onupgradeneeded）でしか行えないよといわれた。
なのでDBをOpenする際に以下の様にバージョンを変えて開いたが、onupgradeneededが呼ばれない。しかしonerrorもonsuccessも呼ばれない。

```js
var dbVersion;
var db;
function deleteObjectStore(){
    console.log("オブジェクトストア削除開始");
    var indexedDB = window.indexedDB || window.mozIndexedDB || window.msIndexedDB || window.webkitIndexedDB;
    // DBのバージョンを上げる
    dbVersion++;
    var DBOpenRequest = indexedDB.open("download", dbVersion);
    DBOpenRequest.onupgradeneeded = function(event) {
        var req = event.target.result;
        // オブジェクトストアを削除
        req.deleteObjectStore("myStore");
    }
    DBOpenRequest.onerror = function(event){
        console.log("error");
    }
    DBOpenRequest.onsuccess = function(event){
        db = event.target.result;
        console.log("DBバージョン : " + db.version);
    }
}

```


なぜだと思っていたら、DBをクローズしていないからでした。
db.close()を追加します。

```js
var dbVersion;
var db;
function deleteObjectStore(){
    console.log("オブジェクトストア削除開始");
    // DBを閉じる
    db.close();
    var indexedDB = window.indexedDB || window.mozIndexedDB || window.msIndexedDB || window.webkitIndexedDB;
    // DBのバージョンを上げる
    dbVersion++;
    var DBOpenRequest = indexedDB.open("download", dbVersion);
    DBOpenRequest.onupgradeneeded = function(event) {
        var req = event.target.result;
        // オブジェクトストアを削除
        req.deleteObjectStore("myStore");
    }
    DBOpenRequest.onerror = function(event){
        console.log("error");
    }
    DBOpenRequest.onsuccess = function(event){
        db = event.target.result;
        console.log("DBバージョン : " + db.version);
    }
}

```

これで無事、指定のオブジェクトストアが削除できました。
Qiita > 複数タグによる絞込み機能できるようになっていた

以前、要望していた機能
http://qiita.com/7of9/items/a9ffbbeb38ecbf86fc6f

上記の「複数タグによる絞込み」ができるようになっていた。

tag:cppbuilder tag:stringoperation
で検索すると2つのタグによる絞込みになっている。

他に、tag:unity tag:rx
とか。

これで希望記事へたどり着きやすくなりました。

対応感謝いたします。
PHP覚書

#PHP覚書
PHP勉強中に知ったこと、覚えておきたいことをつらつら書いています。
適宜更新されます。

完全に自分が覚えときたいことだけ書いてるので、あんまり参考になりません。
悪しからず。

#switchの比較演算子
==と同じで、型変換してから比較するみたい。
以下のコードは期待通りの動作をしないのでNG
（といっても実際に書くことはなさそう・・・だけど）

```
<?php
var_dump(0 == "a"); // 0 == 0 -> true
var_dump("1" == "01"); // 1 == 1 -> true
var_dump("10" == "1e1"); // 10 == 10 -> true
var_dump(100 == "1e2"); // 100 == 100 -> true

switch ("a") {
case 0:
    echo "0";
    break;
case "a": // "a" は 0 にマッチするので、決してここにはたどりつきません
    echo "a";
    break;
}
?>
```

#file_get_contentsでhttps

※いろいろ調べたらいろいろ出てたので解決法だけの記載に変更しました。

file_get_contentsでAPIから値を取得しようとしたとき、
httpsを用いると以下のようなエラーが。
要するにどっかの検証ができていないというわけですね（検証関連素人すぎてよくわからんので勉強します）。

```
Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in [filename]
```


解決方法1(※検証を回避するので非推奨)

```
$url = '[APIアクセス用URL]';


$arrContextOption = [
	'ssl' => [
		'verify_peer' => false,
		'verify_peer_name' => false,
	],
];

$json = json_decode(file_get_contents($url, false, stream_context_create($arrContextOption)));

var_dump($json);
```

解決方法2(ネットでよく見た解決法ですが、この方法でいいのかはよくわからん)
証明書(cacert.pem)を見繕って、読み込ませる。
うまいこと証明書が見つかったら、配置した場所をphp.iniに記載してやります。

```ini:php.ini
[cURL]
curl.cainfo=C:\xampp\php\cacert.pem
openssl.cafile=C:\xampp\php\cacert.pem
```

#配列をfor文で処理
・効率の悪い書き方
第2引数でcount()してしまうと、ループのたびに配列のサイズを取得してしまうので、遅くなる。

```
<?php
$people = array(
    array('name' => 'Kalle', 'salt' => 856412),
    array('name' => 'Pierre', 'salt' => 215863)
);

for($i = 0; $i < count($people); ++$i) {
    $people[$i]['salt'] = mt_rand(000000, 999999);
}
?>
```

・効率の良い書き方
そんな時は、インデックスの宣言と一緒にサイズを変数に格納してしまう。
第1引数は、ループの最初にしか評価されないので、いちいち配列のサイズを取得しなくなる。

```
<?php
$people = array(
    array('name' => 'Kalle', 'salt' => 856412),
    array('name' => 'Pierre', 'salt' => 215863)
);

for($i = 0, $size = count($people); $i < $size; ++$i) {
    $people[$i]['salt'] = mt_rand(000000, 999999);
}
?>
```

まあ、~~連想配列なら~~foreach使えばいいんですけどね

#phpでフィボナッチ数列のコードゴルフ

多分これが一番短いと思います。(フラグ

```
<?php $i=35;$a=0;$b=1;while($i--)echo(($i%2)?($a+=$b):($b+=$a)).'<br>';
```
Adobe XD - 細かすぎて伝わらないかもしれない機能群

各所でイチ押し感ハンパないAdobe XD。

リピートグリッドやマージン調整、
複数画像の一括適用などなど至れり尽くせりの便利機能で
ワイヤーフレームやモックづくりが捗りまくるこのアプリですが、
日々の業務で使ってみて、
比較的おとなしめながらも個人的に便利と思う使い方を
3つほど並べてみちゃったり。


#svgファイル
特にアプリ系のワイヤーフレームやらモックを作っていると
個人的にお世話になる機会が多いGoogleのMaterial icons。
拡大縮小やら色替え考えると、
ベクターデータで欲しいところなので利用するケースが多いのですが、
使いたいアイコンをsvgでポチポチダウンロードして
一括ファイル選択してXDに投げ込むと即使えちゃう。
しかも綺麗に並んでくれるという心意気。同一地点に重ならないのってすばらC。
Illustrator‎からのコピペじゃないと、
ベクターデータは使えないと思い込んでいて、
svgをいちいちIllustrator‎で開いてコピペしてた昔の自分を殴ってやりたい。


#アートボードへのリンク
サンプルファイルやチュートリアルを見ていると、
どうしてもドラッグをしてつなぐ方式が目立ちますが、
実はリンク貼りたいファイルを選択した時に出る「＞」をクリックすると
ダイアログが出てきてターゲットを選択できます。
アートボード数が20を超えたあたりから、
ドラッグ式のリンク貼りが困難になる（個人の感想）ので
こちらの方法も時短にもなってオススメ。
アートボードの名前をしっかり編集しておく癖をつけるとなお良し。
「iPhone 6 – 27」とかダメ。絶対ダメ。


#プレビュー動画撮影
プレビュー時に右上に出る録画ボタンで、
操作過程をmov形式で録画できます。
録画機能自体はXD界隈（？）では常識レベルの便利機能なのですが
この作成した動画、
iPhoneで再生すると端末にバチッとフィットした
モックアッププレビューになるのです。
あまりのフィット感と軽快な動作に、もうアプリになってるかと思うレベル。
動画録画してslackに貼り付けておいてiPhoneでプレビュー！
というのが私の中のブーム。なんとなく音量上げるまである。無音だけど。
初回プレビュー時などのインパクトアップにオススメ。


#まとめ
リピートグリッドなど派手な機能に目が行きがちですが、
なにげに細かい配慮あふれるXDさん。
実際触ってみると発見が多いので、
利用機会があったらトライしてみてはいかがでしょーかー。
MySQLをバージョンアップした際にsql_modeが変更してしまう問題点の解決

# MySQLをバージョンアップしたところの不具合
5.7になり INSERT をした際に値がないカラムを挿入しようとするとエラーが帰ってきて挿入できない問題点が発生しました。

```
Error Code: 1364. Field 'modfied' doesn't have a default value
```

このようなエラーがでます。

# sql_modeの確認
sql_modeを確認したところこのような状態になっていました。

```bash
mysql -u root -p -e "SHOW VARIABLES LIKE 'sql_mode';"

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 
```
特に設定はしてないので初期状態がこのようになっています。

# sql_modeの定数について
ONLY_FULL_GROUP_BY
> GROUP BY 句で名前が指定されていない非集約カラムを、選択リスト、HAVING 条件、または (MySQL 5.6.5 以降で) ORDER リストが参照するクエリーを拒否します。

> ONLY_FULL_GROUP_BY が有効な場合、次のクエリーは無効です。1 番目は、選択リスト内の非集約の address カラムが GROUP BY 句で名前を指定されておらず、2 番目は、HAVING 句の max_age が GROUP BY 句で名前を指定されていないため、ともに無効になります。
> https://dev.mysql.com/doc/refman/5.6/ja/sql-mode.html

STRICT_TRANS_TABLES
> 値を指定したとおりにトランザクションテーブルに挿入できない場合、ステートメントを中止します。非トランザクションテーブルの場合、値が単一行ステートメントで発生するか、複数行ステートメントの先頭行で発生した場合、ステートメントを中止します。
> https://dev.mysql.com/doc/refman/5.6/ja/sql-mode.html

NO_ZERO_DATE
> 0 や '0000-00-00' を無効な日時として扱います
> http://ngyuki.hatenablog.com/entry/2013/04/29/195140

NO_ZERO_IN_DATE
> '2000-00-00' のような月や日に 0 がある日時を無効な日時として扱います
> http://ngyuki.hatenablog.com/entry/2013/04/29/195140

ERROR_FOR_DIVISION_BY_ZERO
>MySQL標準の状態ではゼロでの除算はエラーにならず NULL となる（warningも出ない）。これをエラーにするには SQL_MODE に ERROR_FOR_DIVISION_BY_ZERO を指定する。
> http://sakaik.hateblo.jp/entry/20100303/mysqlmode

NO_AUTO_CREATE_USER
> パスワード無しではユーザを作成出来なくする。 
> http://www.hirohama.biz/mysql/2007/06/22-100644.html

NO_ENGINE_SUBSTITUTION
> CREATE TABLE または ALTER TABLE などのステートメントが無効またはコンパイルされていないストレージエンジンを指定したとき、デフォルトのストレージエンジンの自動置換を制御します。

> ストレージエンジンは実行時にプラガブルであるため、利用できないエンジンも同様に扱われます。

> NO_ENGINE_SUBSTITUTION を無効にすると、CREATE TABLE については、目的のエンジンが利用できない場合にデフォルトエンジンが使用されて警告が発生します。ALTER TABLE では、警告が発生してテーブルは変更されません。

> NO_ENGINE_SUBSTITUTION を有効にすると、目的のエンジンが利用できない場合にエラーが発生し、テーブルは作成または変更されません。 
> https://dev.mysql.com/doc/refman/5.6/ja/sql-mode.html

# はずしたいsql_mode
STRICT_TRANS_TABLES をはずしたいのですが my.cnf の中には存在しませんでした。
初期設定のようで必要ないモードを外すように記述しました。

```ini:/etc/my.cnf
[mysqld]
sql_mode = ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
```

MySQLを再起動して再度確認すると

```bash
mysql -u root -p -e "SHOW VARIABLES LIKE 'sql_mode';"

ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
```

ためしに INSERT してみたところ無事行の追加が出来ました。
相対パスのリンクを絶対パスに書き換える（pushState対策）

相対パスのリンクが存在するページで `pushState` 使って異なるパスへ履歴（URL）書き換えると、元々の相対パスリンクとカレントパスの関係がずれてリンク先が 404 になる問題が起きた。

# 対応コード
とりあえずページ読み込み時に `$("a[href]")` に対して `(e)=>{e.href=e.href}` をかける感じで対応してみた。その後 `form[action]` でも同じ問題が発生することに気づいたのでそちらも同じように対応した。

```javascript:これをDOMContentLoadedのタイミングで実行する
//pushStateでカレントパスが変わると静的な相対パスが404になる問題の対処）
Array.prototype.slice.call(document.querySelectorAll('a[href]:not([href^="#"]):not([href=""])'))
  .forEach(function(e){e.href = e.href});
Array.prototype.slice.call(document.querySelectorAll('form[action]'))
  .forEach(function(e){e.action = e.action});
```

とりあえず今のところ特に問題も無くいい感じに対応できたっぽい。

# 説明
`a.href` って元の属性が相対パスで書いてあっても絶対URLが帰ってくるんだよね。だから `a.href = a.href` ってすると、一見意味なさげなコードに見えて相対パスが絶対パスになってくれる効果がある。
`form.action` も同じで相対パスが絶対パスになってくれるので上手くいく。
[メモ] Raspberry Pi ZeroをUSB COMポートデバイスとして使う

## 概要
- Raspberry Pi Zero を USB COMポート(Serial)**デバイス**にする。
- Windowsから、COMポートとしてみえる。<br>!![PiZero-Serial01.png](https://qiita-image-store.s3.amazonaws.com/0/75594/ac8735ab-13d0-4359-a09b-8d8fb42bf0ea.png)
- USBデバイスのモードでPCにつながってるので、Pi Zeroへ、USB機器は使えない。(WifiとかBluetoothとか)

## 環境
- Raspberry Pi Zero
- `2016-05-27-raspbian-jessie-lite`
- microSD 4GB
- microUSBケーブル : Pi ZeroのUSBとWindowsPCをつなぐ。ここから電源も供給される。
- Windows 7 64bit

## 手順
1. Raspbianを焼く
2. Raspberry Pi起動
3. 設定
    - `sudo systemctl enable serial-getty@ttyGS0.service`<br>`ttyGS0`で、コンソールログインできるようにする。
    - `echo 'dtoverlay=dwc2' | sudo tee -a /boot/config.txt 
dtoverlay=dwc2`<br> `/boot/config.txt`に`dtoverlay=dwc2`追加
    - `sudo vi /boot/cmdline.txt`<br>`rootwait`のうしろに`modules-load=dwc2,g_serial`追加。


    ```shell-session
pi@raspberrypi:~ $ sudo systemctl enable serial-getty@ttyGS0.service 
Created symlink from /etc/systemd/system/getty.target.wants/serial-getty@ttyGS0.service to /lib/systemd/system/serial-getty@.service.
pi@raspberrypi:~ $ echo 'dtoverlay=dwc2' | sudo tee -a /boot/config.txt 
dtoverlay=dwc2
pi@raspberrypi:~ $ cat /boot/cmdline.txt 
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait modules-load=dwc2,g_serial
pi@raspberrypi:~ $ sudo shutdown -h now
pi@raspberrypi:~ $ 
```

4. `sudo poweroff`<br>一度シャットダウンして
5. USBケーブルで、Windowsとつないで、USBバスパワーで電源オン => `PI USB to Serial`とでてくる
    ![PiZero-Serial01.png](https://qiita-image-store.s3.amazonaws.com/0/75594/ac8735ab-13d0-4359-a09b-8d8fb42bf0ea.png)
6. Tera Termとかで、接続する
    - デバイスマネージャで表示されたCOMポートをえらんで、接続<br>![PiZero-Serial02.png](https://qiita-image-store.s3.amazonaws.com/0/75594/b8771adc-2631-e62c-6186-7fd8082ab744.png)

7. `Enter`を押すと、ログイン画面が出てくるので、 いつもどおりログインすればよい.
    - ログイン画面<br>![PiZero-Serial03.png](https://qiita-image-store.s3.amazonaws.com/0/75594/cd3a0a36-8e20-e8c1-cf9a-f073ad0094a1.png)


## その他
- ほかのらずぱい(1B,2B,3Bとか)で、設定までして、そのmicroSDをPiZeroに移して使うのもよい、かと。
- ネットワークデバイスとして使うほうがラクだよね => 参考:[Raspberry Pi ZeroをUSBケーブル一本でインターネット接続](http://qiita.com/mt08/items/ce5e3911d74d7fad4563)
- SPIのEthernetを使えば、ネットにつなげる？(参考:[RaspberryPi - ENC28J60(SPI-Ethernet)設定](http://qiita.com/mt08/items/679fcca26439419fb7f1))
- ファイル転送も、めんどい...
- どんな場面で使うのがいいんだろうか。。 う～ん..
    - 制御関係とか、スタンドアローンでPiZeroを使ってるときのメンテ用?


<!-- Tweet
2016年9月7日 23:33 (UTC+9) https://twitter.com/miramba_/status/773529606645100544 -->
JavascriptでWebサイトのレスポンシブ対応

## 内容
- ウィンドウサイズに応じて `<body>` タグにクラスを追記する
- 読み込み時とリサイズ時に処理を実行

```test.html
<meta name="viewport" content="width=device-width, initial-scale=1">
↑ headerに入れる

<script type="text/javascript">
    $(window).on('load resize', function(){
        var x = $(window).width();
        if (x <= 906) {
            $(document.body).addClass('narrow');
            if (x <= 767) {
                $(document.body).addClass('for-tablet');
                if (x <= 479) {
                    $(document.body).addClass('for-mobile');
                } else {
                    $(document.body).removeClass('for-mobile');
                }
            } else {
                $(document.body).removeClass('for-tablet');
                $(document.body).removeClass('for-mobile');
            }
        } else {
            $(document.body).removeClass('narrow');
            $(document.body).removeClass('for-tablet');
            $(document.body).removeClass('for-mobile');
        }
    });
</script>
```

あとは適当にCSSへ定義していく

```style.css
.hoge{
}
#タブレット・スマートフォン向け（幅７６７ｐｘ以下の場合）
.hoge .for-tablet {
}
#スマートフォン向け（幅４７９ｐｘ以下の場合）
.hoge .for-mobile {
}
```






cssのメディアクエリ？ そんなものはなかった
Google Play Servicesのlibprojectが見つからない時　(主にEclipse)

M2Repositoryに移動になりました　とさ。

Android Studioを使ってね()　というメッセージの1つだと思う。


参考：
http://stackoverflow.com/questions/37310684/missing-sdk-extras-google-google-play-services-libproject-folder-after-updat
Google Play Servicesのフォルダに、libprojectが見あたらないよ？(rev.30以降)


追記(というより蛇足)：
API23(Android 6)以降で、org.apache.～が見つからない　などのエラーが出るのも、似たような原因。
android.jarの中身を、API22と見比べてみるとよいかと。

LogCatに表示されるエラーの例：
Warning: com.google.android.gms.internal.zzac: can't find referenced class android.net.http.AndroidHttpClient
Warning: com.google.android.gms.internal.zzt: can't find referenced class org.apache.http.Header
[PHP] 変数を用いたインスタンスの生成  ~ new $class ~

# 動的なインスタンスの作成

クラス内のメソッドを呼ぶとき、以下の例1 のように書く。
例1

```php
<?php 
class hoge
{
    function hello()
    {
        echo "hello";
    }
}

$hoge = new hoge;
$hoge->hello();
// => hello
```

例1 では、 `new hoge` と書いた。
ということで、問題。
`hoge` は変数にできるのだろうか？

正解は、できる。
つまり、例2 のようになる。

例2

```php
<?php 
class hoge
{
    function hello()
    {
        echo "hello, from hoge";
    }
}

class hogehoge
{
    function hello()
    {
        echo "hello, from hogehoge";
    }
}

$class = "hoge";
$hoge = new $class;
$hoge->hello();
// => hello, from hoge

$class2 = "hogehoge";
$hogehoge = new $class2;
$hogehoge->hello();
// => hello, from hogehoge

```

では、クラスが複数ファイルにまたがり、namespace を使った時は？

`hoge.php`  

```php
<?php 
// hoge.php
namespace App;
class hoge
{
    function hello()
    {
        echo "hello, from hoge";
    }
}
?>
```
`hogehoge.php`

```php
<?php 
// hogehoge.php
namespace App;
class hogehoge
{
    function hello()
    {
        echo "hello, from hogehoge";
    }
}
?>
```
`main.php`

```php
<?php 
namespace App;

use App\hoge;
use App\hogehoge;

include 'hoge.php';
include 'hogehoge.php';

$class = "hoge";
$hoge = new $class;
// => エラー！！！
$hoge->hello();
```

と、エラーになる。
この解決策は、
`main.php`  

```php
<?php 
namespace App;

use App\hoge;
use App\hogehoge;

include 'hoge.php';
include 'hogehoge.php';

$class = "App\hoge";
$hoge = new $class;
$hoge->hello();
```

という風に、namespace も含めた文字列を `$class` に代入することによって解決出来る。
知ってれば当たり前だろうけど、知らなかったら困る。

## 参考サイト

rryu さんより教えて頂き、参考サイトを追加しました。ご指摘いただきありがとうございます！
=> http://php.net/manual/ja/language.oop5.basic.php#language.oop5.basic.new

http://php.net/manual/ja/language.namespaces.dynamic.php
http://sousaku-memo.net/php-system/1417
http://dxd8.com/archives/110/ (古い)
JP-Secure SiteGuard Lite 2.xx→3.xxへアップグレード後にSiteGuard Liteが立ち上がらなくなった場合の対応

# はじめに

JP-Secure SiteGuard Liteを 2.xx→3.xxにアップデート（アップグレード）した際のメモです。

SiteGuard Lite2.xx→3.xxへのアップデートは、通常SiteGuard Lite 2.xxが導入済みのサーバに対して、JP-Secureが提供しているRPMパッケージより、以下のコマンドでアップデートするだけでそのまま動作します。

```
# rpm -Uvh siteguardlite-3.xx.x86_64.rpm
```

しかし、一部の環境においては、以下のような表示になりSiteGuard Liteがアップグレード後に立ち上がらなくなる場合があります。

```
# service siteguardlite_admin start
Starting siteguardlite_admin (via systemctl):  Job for siteguardlite_admin.service failed because the control process exited with error code. See "systemctl status siteguardlite_admin.service" and "journalctl -xe" for details.
```

また、上記コマンドを実行した際には、以下のログが記録されます。

```
# cat /opt/jp-secure/siteguardlite/logs/admin/catalina.out
nohup: failed to run command '/opt/jp-secure/siteguardlite/java/bin/java': No such file or directory
```

# 理由

従来のバージョン(2.10 Update3までのバージョン）では、JavaはSiteGuard Liteに含まれていましたが、現在のバージョンではJavaはSiteGuard Liteに含まれず、別途インストールされたJavaを利用するためです。


# 対応 (CentOS7 / RedHat Enterprise Linux 7の場合)

## １．Javaをインストールする(Javaがインストールされていない場合)

```
# yum install java
```

## ２．SiteGuard Liteをインストールする(SiteGuardがインストールされていない、または最新のSiteGuard Liteではない場合)

```
# rpm -Uvh siteguardlite-3.xx.x86_64.rpm
```

## ３．シンボリックリンクを張り替える

```
# cd /opt/jp-secure/siteguardlite
# rm -f java
# ln -s /bin java
```
## ４．サービスを起動する

```
# service siteguardlite_admin start
```

上記実行後、以下のように表示されれば問題ありません。

```
Starting siteguardlite_admin (via systemctl):              [  OK  ]
```
webpack-railsの導入

## はじめに

browserify-railsを使っていたが、webpackでやった方がトラブルが少なそうだったので移行した。

## 導入

[webpack-rails](https://github.com/mipearson/webpack-rails)を使用した。
Readmeの通りに進めれば簡単に導入できる。

## 移行

今まで`project_name/app/assets/javascript`にあったものを`project_name/webpack`に移動する。
cssもコンパイルできるようだが、こちらはrailsにまかせても良いと思う。

jsの読込を`javascript_include_tag 'application'`から`javascript_include_tag *webpack_asset_paths('application')`に変更が必要です。

また、ここでの`application`の意味がファイル名による規則指定から`config/webpack.config.js`内の`'application':'./webpack/application.js'`のような定義指定に変わることに注意が必要です。

加えて以下のコードを`webpack`に移動させる必要がある。

```js
//= require jquery
//= require jquery_ujs
```

少し悩んだが、以下のように対応した。

```package.json
{
  "dependencies": {
    "jquery": "*",
    "jquery-ujs": "*"
  }
}

```

```application.js
window.jQuery = require("jquery")
require("jquery-ujs")
```

最後にbabel対応しないと動かないブラウザがあると考えられるので対応する。
http://qiita.com/HayneRyo/items/74892d3a37ee96a5df60

## 本番

`rake webpack:compile`を忘れずに実行しましょう。

ローカルで本番の見栄えを確認するには`RAILS_ENV=production SECRET_KEY_BASE=SECRET_KEY_BASE RAILS_SERVE_STATIC_FILES=true rails s`のようなコマンドで確認できます。
※ DBの設定もお忘れなく

## まとめ

webpackのようなものを導入するのにはnode.jsに関する知識が少し必要になるが、最近のJavaScriptはES6が前提となってコードが書かれている事も多く、むしろ使わないとサンプルすら理解し難い。

browserify-railsのような中間ソリューションをつかった場合に起きるデメリットも若干ある。webpackを学ぶことは、少し学習コストが高いが、それでもwebpackを導入したほうがトータルでは簡単になると思われる。

webpackを単独でrailsに導入したことが無いので本当のところは分からないが、webpack-railsを使うことにより、どのようにwebpackを配置して設定すればいいかなどをサポートしてくれているように思う。