OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonのいろいろな処理

## 自分への備忘録
Pythonを用いてコーディングしていく中で、「あれ、この処理はどうやってやるんだろう」となって検索したものを自分への備忘録としてこの投稿に残していきます。随時更新予定。

# 辞書型データの操作(dict：操作対象の辞書型データ)
### キーだけのリスト、バリューだけのリスト
```
dict.keys()
dict.values()
```
ちなみにキーとバリュー両方を含むリストは

```
dict.items()
```
### 新しいキーとバリューを追加
```
dict[新しいキー] = バリュー
```
### キーに対応するバリューの変更
```
dict[キー] = バリュー
dict[キー] += 1
```
### キーを指定して辞書の要素を削除する
```
del dict[キー]
```
# リスト型データ(list：操作対象のリスト型データ)
### ある要素を持っているかどうか判定(TrueかFalseを返す)
```
ある要素 in list
```
### リスト内のある要素のインデックスを得る
```
list.index(ある要素)
```
### リストにある要素を追加、挿入
```
list.append(ある要素) # リストの末尾にある要素を追加
list.insert(0, ある要素) # リストの先頭にある要素を追加（0を変更すれば対応する位置にある要素を挿入）
```
### 文字列を分解してリストへ(文字列はstrとします)
```
list = str.split(' ') # これはstrを空白で分解してそれぞれをリストの要素としてリストを作成している
```
### 要素数nで全要素が0のリスト
```
list = [0] * n
```
### リストを逆順にする
```
list.reverse()
```
### 文字列を要素に持つリストを連結して文字列にする
```
"".join(list) # ""の中に特定の記号を入れるとその文字を間に入れて連結する
```
### intを要素に持つリストの要素それぞれを文字列に変換したリストを得る
```
map(str, list)
```
### リストの要素を削除、切り取り
```
del(list[index]) # 要素を削除
list.pop(index) # こちらは切り取りなので、
list1.append(list2.pop()) # list2の末尾要素をlist1の末尾に追加、ができる
# ちなみにpop()に引数を指定しないと末尾の要素を対象にとる
```
### 0から9までの数字を要素に持つリスト（リスト内包表記）
```
list = [i for i in range(10)]
list = [i for i in range(10) if i % 2 == 0] # さらにif文も内包表記可能
```
### リスト内の要素で被りがないか調べてキーがリスト内の要素、バリューがそのキーが出現する回数となる辞書を返す
```
import collections
list = ['a', 'b', 'c', 'b', 'd', 'a']
counter = collections.Counter(list) # -> {'a':2, 'b':2, 'c':1, 'd':1}
```
#　ソート
### 昇順にソート
```
sorted(list) # リスト内の要素を昇順にソート
sorted(dict.keys()) # 辞書をキーの昇順にソート
sorted(dict.items(), key=lambda x:x[1]) # 辞書をバリューの昇順にソート
```
### 降順にソート
```
sorted(list, reverse=True) # reverse引数にTrueを代入すればよい
```
# 変数のスコープ
### グローバル変数
```
count = 0
def add_count():
    global count    # 関数外で定義された変数にアクセスし、
                    # その変更を関数外へも適用するにはglobalをつける
    count += 1
```
SwiftのString.CharacterViewとそれをArray化したものの違い

[[swift] String.CharacterViewが使いづらいと思う、そんなあなたにArray<Character>のおすすめ - Qiita](http://qiita.com/ysn551/items/08d1dc38d69a8e270746)を拝読して気になることがあったので調べてみました。

```Swift
let w = "\u{65}\u{301}"                 // "é" == e + アクセントマーク
let wcv = w.characters
let wcv_endIndex = wcv.endIndex         // 2

let wcv_a = Array(wcv)                  // ["é"]
let wcv_a_endIndex = wcv_a.endIndex     // 1

let wcv_c0 = wcv[wcv.index(wcv.startIndex, offsetBy: 0)]    // "é"
let wcv_c1 = wcv[wcv.index(wcv.startIndex, offsetBy: 1)]    // fatal error: Can't form a Character from an empty String
```

"é"のcharactersのendIndexは2ですがArrayにしたら1になりました。しかし文字を取得しようとするとfatal errorになりました。
\u{301}のような特殊文字の扱いが問題になるのでCharacterView.IndexはStrideableにできないということでしょうか？
詳しい方に解説をお願いしたいところです。
邦訳 A Story of 'Magic'

先日、米国出身のエンジニアから、ハッカーは 「more magic」 って単語にピンと来る、という話を聞きました。初耳だったので出典を聞いてみると、[The Jargon File][1] の [A Story About 'Magic'][2] が出典だそう。
[1]: http://catb.org/esr/jargon/html/index.html
[2]: http://catb.org/esr/jargon/html/magic-story.html

内容はまさにエンジニアあるある小話なのですが、自分の学生時代（国内で情報系ですが）もまだ70〜80年代のムードが色濃く残っていた場所だったので、ずいぶんと懐かしい気持になってしまいました。ググっても日本語訳がないようだったので、せっかくなので訳しておきます。

# 「魔法」のお話
- 原題: [A Story of 'Magic' ][2]

![250px-PDP-10_1090.jpg](https://qiita-image-store.s3.amazonaws.com/0/43781/bd32971e-2ca1-77c4-a491-af93873c9b0d.jpeg)

何年か前、私 ([GLS](https://ja.wikipedia.org/wiki/%E3%82%AC%E3%82%A4%E3%83%BB%E3%82%B9%E3%83%86%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%BB%E3%82%B8%E3%83%A5%E3%83%8B%E3%82%A2)) は MIT AI ラボの [PDP-10](https://ja.wikipedia.org/wiki/PDP-10) のキャビネットのあたりを覗き込んでいて、あるキャビネットのフレームに小さなスイッチが接着されているのに気がついた。それは明らかに自家製の代物で、ラボ内のハードウェアハッカー（誰なのかは誰も知らない）が追加したものだった。

コンピューターに付けられたスイッチを、何をするものなのか分からないのに、触ってはいけない。コンピューターをクラッシュさせてしまう。スイッチには非常に不親切な方法でラベルが付いていた。スイッチは２極（オンオフ切り替え式）で、金属製の本体に鉛筆で「魔法」「もっと魔法」[^magic]と走り書きされていた。スイッチは「もっと魔法」側に切り替えられていた。

[^magic]: 原文は 'magic' / 'more magic'。

私は、ちょっとこれを見てくれと、他のハッカーを呼び出した。彼もこのスイッチを見たことがなかった。よく調べてみると、スイッチには配線が1本だけしか接続されていないことが明らかになった！配線の反対側の端はコンピューター内の配線の迷路の中に消えていた。しかし、これは電気の基本原理であるが、2本の配線がつながっていなければ、スイッチは何の機能も果たさない。このスイッチは片側だけ配線されていて、反対には何もつながっていなかった。

このスイッチが誰かのばかばかしいジョークであることは明らかであった。我々の推理は、このスイッチは機能していない、という確信に至った。我々はスイッチを切り替えた。コンピューターは即座にクラッシュした。

我々のひどい狼狽ぶりを想像してもらいたい。我々はこれを偶然として片付けたが、それでもコンピューターを復旧させる前に、スイッチを「もっと魔法」側に戻したのだった。

1年後、私はこの話をまた別のハッカーに話した。[David Moon](https://en.wikipedia.org/wiki/David_Moon) だったと思う。彼は明らかに、私の正気を疑ったか、私がスイッチのパワーの超常性を信じていると思ったか、もしかすると私が架空の物語で彼をからかっているかと思ったかもしれない。私は証明のため、彼にまさにそのスイッチ、筐体のフレームに接着されていて、配線が1本しかつながっていなくて、まだ「もっと魔法」側になっているスイッチを、見せたのだった。我々はスイッチを徹底的にしらべ、接続的に孤立していることと、配線の反対の端はコンピューターの配線につながっていて、グランド端子につながっていることを見極めた。これは明らかにスイッチが二重の意味で無効であることを示していた。電気的に無意味なだけではなく、何の影響も与えない場所に接続されている。そこで、我々はスイッチを切り替えた。

コンピューターは瞬時にクラッシュした。

今回、我々は、手近に居た古参の MIT ハッカー、 [Rechard Greenblatt](https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%81%E3%83%A3%E3%83%BC%E3%83%89%E3%83%BB%E3%82%B0%E3%83%AA%E3%83%BC%E3%83%B3%E3%83%96%E3%83%A9%E3%83%83%E3%83%88) の元へと走った。彼もそのスイッチの存在にこれまで気づいていなかった。彼はスイッチを調べると、無用なものだと結論し、ニッパーを持って来て取り外し[^dike]た。かくして我々はコンピューターを復旧させ、それからはずっと正常に動作している。

[^dike]: 原文では diked it out と表現されている。ニッパー ([Diagonal Cutter](https://en.wikipedia.org/wiki/Diagonal_pliers)) に由来するジャーゴン → [The Jargon File による dike の説明](http://catb.org/jargon/html/D/dike.html) 

我々は未だにスイッチがどのようにマシンをクラッシュさせたのか知らない。こういう理屈は考えられる。グランド端子近くに何らかの回路がギリギリに近接していたが、スイッチを切り替えたことで、静電容量が変化し、何百万分の1秒かのパルスとして回路を狂わせるのに十分な量に達した。しかし、それが正しいのかは分からない。我々が実際に言えることはそのスイッチが魔法だったということである。

私はまだ自宅の地下室にそのスイッチを持っている。バカだからかもしれないが、いつも「もっと魔法」側を保つようにしている。

1994年: このストーリーに、新しい説明がもたらされた。スイッチの本体が金属だったことに注意したい。スイッチの配線されていなかった側は、スイッチの本体に接続されていたとしよう（通常、本体は別のアース端子に接続されるが、例外はある）。この本体はコンピューターのケース、おそらくグランド、につながっている。ここでマシン内の回路のグランドがケースのグランドと同じ電位である必然性はなく、スイッチを切り替えると、回路のグランドとケースのグランドが接続され、電位の下降/ジャンプがマシンのリセットを引き起こす。これを発見した人物は、おそらく２点に電位の差があることを”体験”し、ジョークとしてスイッチを配線したのだろう。
Xcode8でSwiftのビルド時間を短縮できるかもしれないUser-Defined Macro

最近似たようなタイトルの記事が投稿されていますが、それとはまた別のお話ということで。
Xcode8になってからなんとなくswiftのビルドが遅い...なんとかならないかということで探していたら、
こちらの[stackoverflow](http://stackoverflow.com/questions/39547197/xcode-8-0-swift-3-0-slow-indexing-and-building/39949491#39949491)に行き着きました。

どうやら、`User-Defined` マクロに `SWIFT_WHOLE_MODULE_OPTIMIZATION=YES`を追加してあげると良いよということで試してみました。

---

<img width="551" alt="スクリーンショット 2016-11-15 18.48.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/27802/7102e1bf-26fd-ff29-5f72-f8671ac2e351.png">

---

↓

---

<img width="701" alt="スクリーンショット 2016-11-15 18.47.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/27802/99e6d0c8-8485-2884-ea5e-82c2dbe113ea.png">

---


試した結果、 **普段の約半分** くらいでビルドが終わるようになりました。
(自分のProjectだと、370秒ほどかかっていたのが、174秒まで縮まりました。)

ただ、普段は差分ビルドが働く分困っていなかったので、今はCI環境の開発版の書き出しで有効にして試運転しています。
まだしっかり確認はしていないですが、ちょっとコードに変更があったときに早いけど同じだけ時間かかりそうな感じはあったので。。

開発版のみ有効にする等はSchemeやConfigurationによって分けられると思うので、お好みで設定してください。

## 注意

ただ、[この回答](http://stackoverflow.com/questions/39547197/xcode-8-0-swift-3-0-slow-indexing-and-building/39949491#39949491)でも言及されていますが、

> I can only assume this is some kind of bug in Xcode 8.0

とあるので、もしかしたら今後同様に動かなくなる可能性もあり得るのでXcodeのバージョンアップ時は注意を払いたいですね。
また、環境によってはうまく動かない?とかもあるので気をつけつつ、ですね。
こちらの[stackoverflow](http://stackoverflow.com/a/40290084/5647997)では、Xcode8.0だと動かないかも?とも書かれていますね。

一応僕の環境(Xcode8.1)では問題なく作用してビルド時間はかなり短くなりました。  


  

人によっては恩恵あるかもしれないので、もしお困りでしたらお試し下さい。

## 参考
http://stackoverflow.com/questions/39547197/xcode-8-0-swift-3-0-slow-indexing-and-building/39949491#39949491
http://stackoverflow.com/questions/39737374/swift-3-compile-time-incredibly-slow/40290084#40290084

## 余談
そういえば `SWIFT_WHOLE_MODULE_OPTIMIZATION`ってどこかで見たような...と思ったら、Swift1.2とかその頃の時代で使われていたことがあったようですね。詳しい背景は分かっていないので一旦割愛します。
(ちないにRealm-cocoaでもこれが未だに使われているようだけどどうなんだろうか...?)
mySQL : Create Triggerで、set文等のストアド・プロシージャを使う場合の注意事項

MySQLでCreate Triggerを発行した際にシンタックスエラーで詰まったのでここに記載しておきます。
シチュエーションとしてはCreate Triggerに限らずストアドを実行する場合全てに当てはまりそうなので、mySQL触り始めだとみんなひっかかりそうだなーと思いまとめました。

よそに書いてあることのまとめみたいになっちゃってるんだけど、エラーで引っかかる人向けってことで。

### 構文例：

```

create trigger TriggerName
before update on TableName
for each row
begin
	set NEW.ColmnName = current_timestamp;
end

```

### 構文エラー：

```

You have an error in your SQL syntax; 
check the manual that corresponds to 
your MySQL server version 
for the right syntax to use near '' at line 5

```

結論として、本来mySQLのクエリではセミコロン[;]が終了文字として指定されているため、セミコロン記述の時点でクエリ発行が終了する。
ところが、set文等のストアドはセミコロン記載後もそのまま構文が継続するパターンがあるため（例のように）、セミコロン以外を一時的に終了文字（デリミタ）に置き換えてあげる必要がありました、という話。

### 修正例：

```
delimiter $$

create trigger TriggerName
before update on TableName
for each row
begin
	set NEW.Date = current_timestamp;
end$$ delimiter ;

```

修正例ではデリミタを$$に置き換えて実施してますが他の文字でももちろんOKです。
実行後、デリミタをセミコロンに戻しておきましょう。

以上



## 参考：

http://www.dbonline.jp/mysql/trigger/index1.html
http://youkosodododo.blog54.fc2.com/blog-entry-12.html
Python3の学習に便利なPDFファイルとサイト

## 公式サイトは日本語がおかしい
Pythonを学習するに当たって、環境構築を行なったあとは[Python公式サイトのチュートリアル](http://docs.python.jp/3/tutorial/index.html)を用いて学習を進めていこうと考えていました。
ですが、公式サイトのチュートリアルは英語から翻訳されたものなので、ところどころに違和感のある日本語が使用されており、とても読みにくく感じました。
そこで公式サイトで学習を進めるのはとりあえずやめにして、他にいい方法がないかと探しました。

## http://biosciencedbc.jp/gadget/human/20150728_hattori.pdf
まず、ネット上に転がっていたPythonについて書かれたPDFファイルを拾ってきて、学習を進めました。
Perlというプログラミング言語と比較しながらPythonの良さが説明されています。
しかし僕自身Perlはわからないのですが、Perlを知らない人でも十分に理解しやすい内容になっています。
基本的な演算から制御構文、ファイルの入出力まで、Pythonの基本的な書き方をクイズ形式で学べるものとなっています。
非常に基本的な内容しか書いていないので、Pythonのフレームワークdjangoなどを用いてWebアプリを作ったりするには他にも学習しなければいけないことはたくさんあると思います。
クラスやモジュールについての説明も少ないです。

## [paizaラーニング](https://paiza.jp/works)
[ドットインストール](http://dotinstall.com/)のように1本3分ほどの動画を見ながらPythonを学習できるサイトです。
2系の動画しか置いてなかったドットインストールに最近3系の動画が追加されましたが、すべての動画を視聴するには有料会員に登録する必要があります。
このpaizaラーニングはすべて無料でPythonが学べるようになっています。
内容は前述したPDFファイルとあまり変わらない基本的な内容でしたが、動画で解説されているぶん分かりやすかったと思います。
動画で話しているのは女性なのですが、声優感がすごい話し方なので、人を選ぶと思います。
僕はあまり好きではありませんでした。

## [paizaコーディングスキルチェック](https://paiza.jp/challenges)
上記で紹介したpaizaのスキルチェックのページです。
基本的な書き方を学んだあとは実際に演習問題を使って自分でコーディングして練習していくのが一番だと思うので、このような問題がたくさん載っているサイトで練習していくと良いと思います。
ここにはS,A,B,C,Dとランク付けされた問題を自分の得意な言語で解くことができます。
ブラウザ上でコーディングし、ブラウザ上で動作確認も行うことができ、自分が納得のいくコードが書けたら提出し、採点してもらうことができます。
動画学習の中にも[プログラミング練習問題](https://paiza.jp/learning/page/problems)が用意されており、こちらはもっとゆるい条件で練習問題に取り組むことができるのでこちらから先にチャレンジしました。

## 一通り終えてみて
まだ最後に紹介したpaizaコーディングスキルチェックの問題はすべて解いていませんが、最初の2つでPythonの基本的な書き方を学び、スキルチェック問題を解くとだいぶPythonでコードを書くことに慣れることができると思います。

Pythonでのコーディングに慣れたあとは、djangoなどのフレームワークやTkinterなどのモジュールなどを使って具体的なWebアプリやデスクトップアプリなどを作れるように学習を進めて行きたいと思います。
インターネットVPNって何？

##VPNとは
Wikiによると
>Virtual Private Network（バーチャル プライベート ネットワーク、VPN）または仮想プライベートネットワーク（かそうプライベートネットワーク）とは、本来は公衆網であるインターネットを跨って、イントラネットを拡張する技術である。
>
> 引用元：[Wikipedia](https://ja.wikipedia.org/wiki/Virtual_Private_Network)

とのことです。もう少し深堀りしてみます。

VPNのVはVirtual、仮想という意味で、仮想接続を利用しているためそう名付けられています。
仮想接続とはインターネット上の様々なコンピュータ、またはネットワーク間で必要なときにだけ構築される一時的な接続を意味します。

VPNのVPとはPrivateNetwork = プライベートネットワーク とは一つの企業（あるいは組織）が所有するコンピュータ群から構成されます。
企業が所有する情報、例えばpdf,excel,ppt,textなどのファイルや顧客情報,取引情報などのデータベースはそれらのコンピュータの間でのみ共有されます。（※ここから先「情報」とは上記のような情報資源を指します。どうかご容赦ください。）
プライベートネットワークの中で共有される情報は内部の人間にしか見えないようになっています。

支社が地理的に離れた場所にある場合、本社のプライベートネットワークと支社のプライベートネットワークとを相互に接続する要望がでてきます。
そのようなときに、VPNは各プライベートネットワーク間を接続し、大きなプライベートネットワークを構築します。

つまり、2つのネットワーク（またはコンピュータ）の間に構築される、仮想接続がVPNです。

##VPNが生まれた背景
かつて企業は、支社を隔絶した離れ小島として扱っていました。
顧客情報や売り上げ情報などの情報資源は各支社がそれぞれ管理し、月に何度か書面で本社に送り届けていました。

企業のIT化が進むにつれて、情報をコンピュータで管理するようになりました。
元々書類で管理していた情報を一斉にコンピュータに取り込み、顧客情報や売り上げ情報をデータベースで管理するようになりました。
企業は各拠点ごとにネットワークを構築し、情報共有による業務効率向上のため、各拠点ネットワークの間を相互に接続するニーズが生まれました。

そして次のようなソリューションがでてきました。

###専用線接続
拠点間を結ぶための伝統的な方法です。拠点と拠点を専用のケーブル（主に光ファイバーケーブル）で直接接続します。
専用線内では他社が介入できないため、プライベートな接続を常に利用できます。

非常に安全な通信ができます、しかしその反面、コストが高くなってしまう欠点があります。
コストは拠点間の距離に比例します。2つの拠点が23区内にありましたら1Gbps回線で1本だいたい月額15～20万円程度、
東京と大阪の間でしたら月額で1本数十万円します。大企業ともなると、全国に100を超す拠点を持つ企業もあります。そのコストは計り知れません。

また専用線を使ったプライベートネットワークでは、営業や出張販売員などの外回りのユーザに対応するのが難しいという欠点もあります。

###閉域網サービス
通信事業者の保有するプライベートネットワークを利用するサービスです。拠点間の通信は、通信事業者のプライベートネットワークを経由して接続します。
専用線を借りて拠点間を接続する方法よりも低コストで利用できるが、回線は複数のユーザで共有するため通信帯域の保証はないことが多い。

代表的なサービスに以下のものがあります。
・IP-VPN
・広域イーサネット
・エントリーVPN

###インターネットVPN
インターネットを使ったVPN接続です。拠点間を安全に接続するために専用のソフトウェアやアプライアンス機器を使い、インターネットを通じて接続します。
皆さんご存じの通り、大手キャリアの回線を使った無線接続が普及しているので、今やどこからでもインターネットに接続することができます。
インターネットを利用できる環境があれば、自社のプライベートネットワークに接続できるので外回りのユーザにも対応しています。
VPNの実装方式によっては、スマートフォンでも利用できるようになってきています。
インターネットをWANとして利用することで専用線によるコストを大幅に削減できますので、小規模な企業でも手が届くようになります。

インターネットVPNは専用線の利用費用 + 閉域網サービスによる利用費用をカットし、安全な接続を行うソリューションを提供します。

####ただし課題もあります
インターネット接続の回線強度は環境に依存するため安定性に不安があります。
またパケットに対し暗号化の処置がとられていますが、インターネットを物理的に通過するということも忘れてはいけません。

##インターネットVPNのセキュリティリスク
インターネットに関連したリスクについては、新聞やニュースで目にすることも増えてきていると思いますので、その危険性についてはここでは触れないでおきます。
インターネットはパブリックネットワークなので、接続するシステムについては不正アクセスの危険性が常に付きまといます。
言ってしまえば世界中のあらゆる場所からクラッカーが侵入してくる可能性があります。また、インターネットを経由するパケットをクラッカーに見られてしまうリスクがあります。

幸いなことにVPNではセキュリティリスクを軽減するため、下記のソリューションを利用できます。
・ファイアーウォール
・認証
・暗号化
・トンネリング　など

セキュリティ管理の甘さは深刻な意味を持ちます。
VPN構築の際には、クラッカーに対し十分な対策を講じるべきと言われています。

##最後に
一概にインターネットVPNが一番優れているということではありませんでした。
コストより安全性を重視するということであれば専用線ですし、閉域網をすでに使ってるということであれば、閉域網への接続方法を検討した方が早い場合もあると思います。

利用ケースによって使い分けていくのがよろしいのではないでしょうか。
次回はIPsec/L2TPでインターネットVPNを実装していこうと思います。
Windows Server2012r2にChef-solo環境構築から実行までの備忘録

##前提
- EC2インスタンス
 - 東京リージョン
 - タイプ：m4.xlarge
(Windows_Server-2012-R2_RTM-Japanese-64Bit-Base-2016.08.11 (ami-0f19db6e))
- Chef Development Kit 0.19.6
- chef-solo 12.15.19


##構築の流れ

###◆Chef Development Kitをインストールする
ここから
https://downloads.chef.io/chef-dk/windows/

インストールしたChef Development Kitを開くとpowershellが起動


###◆knife-soloをインストール

```
> gem install knife-solo 
Thanks for installing knife-solo!
.....
Successfully installed knife-solo-0.6.0
Parsing documentation for knife-solo-0.6.0
Installing ri documentation for knife-solo-0.6.0
Done installing documentation for knife-solo after 1 seconds
1 gem installed                ←完了
```

###◆リポジトリ(キッチン)の作成

```
> knife solo init chef-repo
作成したリポジトリはgitで管理
(gitが使えなかったらインストールする:https://git-scm.com/download/win)

> cd chef-repo
> git init
> git add .
> git commit -m 'first commit'
```
デフォルトだと多分デスクトップに出来てしまうと思うので
その通りにパスを通すように気をつけるか、パスの通しやすい場所に置く。

###◆cookbookの作成
helloってcookbookを作ります。

```
> knife cookbook create hello -o chef-repo/site-cookbooks
(ここでsite-cookbooksを作成するからパスがややこしくなるだけだが・・・)
```

###◆default.rbってファイルを作成する
chef-repo/site-cookbooks/hello/recipes/default.rb
最後列に以下を追記する
```
log "Hello"
```

###◆chef.jsonってファイルを作成する
nodesの配下に作成
中身を編集(メモ帳で)
helloというレシピを実行するための書き方(recipesじゃなくてrecipeね！)
```
{
  "run_list": [
    "recipe[hello]"
  ]
}
```

###◆solo.rbってファイルを作成
chef-repo直下に
中身はhelloまでのパスを指定
※windowsの場合は、パスは\(円マーク)じゃなくてLinuxみたいに/**←ここ本当に注意**
```
cookbook_path ["C:/Users/Administrator/Desktop/chef-repo/chef-repo/site-cookbooks"]
```
パスもあってるのになんで実行できない！？ってなったら上の※を確認する


###◆実行！！

helloファイルの場所によってコマンドが変わるので注意
また、ここは/でも\でも大丈夫
現在のディレクトリはchef-repo

```
> chef-solo -c solo.rb -j nodes/chef.json

Starting Chef Client, version 12.15.19
resolving cookbooks for run list: ["hello"]
Synchronizing Cookbooks:
  - hello (0.1.0)
Installing Cookbook Gems:
Compiling Cookbooks...
Converging 1 resources
Recipe: hello::default
  * log[Hello] action write


Running handlers:
Running handlers complete
Chef Client finished, 1/1 resources updated in 07 seconds
```

無事成功！
やったー！

###◆実行文の意味
```
本来だったらこんな感じらしい
> chef-solo -c chef-repo/solo.rb -j chef-repo/nodes/chef.json

でも今回はこの文章で実行した
> chef-solo -c solo.rb -j nodes/chef.json
```
「solo.rb」というファイルがデスクトップのchef-repo直下にあったため、
solo.rbの前のchef-repo/が不要。
「chef.json」というファイルがデスクトップのchef-repoの下のchef-repoの下の
nodesの下にあったのでnodesの前のchef-repoが不要。らしい。
ちなみにchef-repoをデスクトップに置かなければ上段の実行コマンドで実行できた。


###◆まとめ

Windows server環境でのChef-solo実行に関する記事を見ながらやったけど
なかなか上手くいかなくて今回やっと成功したので備忘録として。。。
Emacsのレジスタ機能を使いこなす

書いておかないと忘れてしまいそうなので、メモしておきます。

# 覚えること

`C-x r s [キー]` => レジスタに保存
`C-x r i [キー]` => レジスタの内容を貼り付け

# 解説

何度も同じ文字列をコピペする場合、途中で`M-d`や`C-k`をすると、`kill-ring`の順番が変わってしまいます。

そのため何度も`browse-kill-ring`などで`kill-ring`を遡って貼り付けするというダサいことをやっていました。

Emacs標準のレジスタ機能を使えば、`kill-ring`以外のレジスタに保存でき、うっかり`kill-ring`が変更されても即座に貼り付けできます。

しかも、Emacs25だからなのか、貼り付ける内容をプレビュー表示してくれます。気が利く。

![Screenshot_2016-11-15_18-27-41.png](https://qiita-image-store.s3.amazonaws.com/0/103885/ce4d5eb0-4e04-9e66-f9e9-5b6c85af5cf5.png)

・・・何度も同じ文字列をコピペする状況自体が良くない、という指摘はごもっともです。

# 参考

http://dev.ariel-networks.com/articles/emacs/part4/
環境変えたらシェルスクリプトがエラーになった

# 状況
今まで使っていたシェルスクリプトを環境を変えて使おうと思ったらなんでも無さそうな所でエラー発生。

```shell-session
Syntax error: redirection unexpected
```

# 原因
エラーメッセージでぐぐったらどうやら`bash`じゃなく`dash`で動いていたせいらしい。
そのせいで、dashでは利用ができない`<<<` を利用している所でエラーが発生した模様。

```bash
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Nov 15 08:09 /bin/sh -> dash*
```


# 解決策
`/bin/sh` の紐付けを`bash` に切り替えてあげましょう。

```bash
$ sudo dpkg-reconfigure dash
# NOを選択する
```
*dashの設定ウィザードをやり直し、デフォルトシェルにdashを使わなくする*
![](https://gyazo.com/00a2baa645b87f93731777a3f30a3c13.png)

# Ref
*  [/bin/sh が dashにリンクされててびびった](http://wadap.hatenablog.com/entry/20090110/1231553066)
Xephyrコマンドの使い方

## はじめに
X11の機能の一つである「Xephyr」を使うと、すでに起動しているXサーバに新たなXサーバをネストできるみたいです。使い方などをここにメモしときます。

## コマンドの使い方
#### Xephyr起動前の準備
まずはXephyrのインストールが必要です。お使いのディストリビューションに合った方法でインストールしてください。

Xephyrコマンドを使う前に、__環境変数DISPLAYを現在起動しているXサーバに設定しておきましょう__。起動中のXサーバにネストするのですから、それが指定されていないとダメなわけです。

```bash
# 0番Xサーバが起動している場合
$ export DISPLAY=:0
```

#### コマンドの使い方
Xephyrコマンドは次のようにして使います。

```bash
$ Xephyr <ディスプレイ番号> <オプション1> <オプション2> … -screen <横>x<縦> …　&

```

(例)

```bash
$ Xephyr :1 -ac -br -screen 300x600 -screen 400x500 &
```

詳しい使い方は以下で説明していきます。

##### ディスプレイ番号
Xephyrで起動するXサーバのディスプレイ番号を指定します。__現在起動中のXサーバが使っている番号は使えないので、それ以外を使ってください。__
例えば0番Xサーバが起動中なら、:0以外(:1や:2)が使えます。

##### オプション
Xephyrで使えるオプションをいくつか紹介します。かなり細かく制御できるみたいです。もっと知りたい方はmanページなどをご覧ください。
###### -ac (アクセス制御の停止)
初めから`xhost +`を実行してアクセス制御を停止させたような状態でXサーバを起動します。

###### -resizeable (ウィンドウサイズ変更可能)
生成するウィンドウのサイズを可変にします。これによってマウスでウィンドウのサイズを変えられるようになります。しかし、マウスでサイズを変更するとウィンドウが不安定になるようです…。

###### -wr (ウィンドウの背景色を白に変更)
デフォルトではウィンドウの背景は黒になりますが、このオプションをつけると白になります。

##### スクリーン設定
起動したいスクリーンの数だけ、-screenオプションを付け足します。各スクリーンの縦と横の長さは<横>x<縦>として設定できます。(xは小文字のXです)
例えば横300で縦600のスクリーンと横400で縦500のスクリーンを起動するなら、`-screen 300x600 -screen 400x500`というオプションをつけます。

また、-fullscreenオプションを使う事で1個のウィンドウをフルスクリーンで立ち上げる事も可能です。この場合は`-fullscreen`とすればOKです。(<横>x<縦>は不要です)

##### バックグラウンド実行
XephyrでXサーバを起動するとターミナルの操作ができなくなるので、&をつけてバックグラウンド実行することをお勧めします。

#### Xephyrのスクリーンの使い方
上のコマンドでXephyrを実行すると、下の写真のような真っ黒なウィンドウが出て来ます。このウィンドウがディスプレイの役割をしてくれます。
(下の写真では例として:2.0と:2.1の2枚のウィンドウを出してみました)
![Screenshot from 2016-11-15 18-11-31.png](https://qiita-image-store.s3.amazonaws.com/0/146361/3c8eba1c-aa1d-9888-36e5-d6e1d6c25bfa.png)

各ウィンドウを利用したいときは、それに対応したディスプレイ番号とスクリーン番号を環境変数DISPLAYにセットしてあげればOKです。`-display`オプションを使う事もできます。それぞれで`xhost`なども使えるようになってます。
(各ディスプレイのアクセス権限の設定しておかないとウィンドウに映せない場合があります。-acオプションやxhostコマンドを利用して設定しておきましょう。)

```bash
# :2.0にfirefoxを表示
$ export DISPLAY=:2.0
$ firefox
# :2.1にxeyesを表示
$ xeyes -display :2.1
```

上のコマンドを実行すると、各ウィンドウにfirefoxやxeyesが表示されます。
![Screenshot from 2016-11-15 18-13-51.png](https://qiita-image-store.s3.amazonaws.com/0/146361/4e688f16-17ea-7e8d-59ad-757807883e50.png)

:2.0のfirefoxをフルスクリーンモードにすると、:2.0の画面内でフルスクリーンにできます。これは:2.0のウィンドウが1個のディスプレイという認識がされているからです。

#### Xephyrの終了
ウィンドウのxボタンを押せばウィンドウが消えます。ターミナルでCtrl+Cを押しても消せます。

## Xnest
同じようにXサーバをネストするコマンドとして「Xnest」というものがあります。これはXephyrが登場する以前からあった古いコマンドです。
Xephyrが登場したことで用済みとなったためか、Xnestは将来的に廃止することが検討されているそうなので、XサーバをネストしたいときはなるべくXephyrを使うようにしたほうが良いと思われます。

## おわりに
実はXephyrの正しい読み方が分かってません。とりあえず「ゼフィール」って読んでますが、「ゼファー」じゃないか？って気もしてます。
正しい読み方をご存知の方、教えていただけると助かります。
ejsでテンプレートをインクルードした時にリンクを相対パスで設定する方法

#ejsでテンプレートをインクルードした時にリンクを相対パスで設定する方法
ejsで\<head>\</head>の部分をテンプレート化してインクルードするとします。
headの中にはcssのリンクがあると思います。

```html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>タイトル</title>
<link rel="stylesheet" href="css/style.css">
</head>
```

この時、
/ルート
|\_ index.html
|\__folder
　|\__hoge.html
のようにディレクトリがなっていると、hoge.htmlでcssが読み込めないです。
hoge.htmlでは正しいcssリンクは

```html
<link href="../css/style.css">
```

だからです。

##そんな'../'を自動で付与したい時のメモ
develop
　|\_ index.html
　|\__folder
　　|\__index.html
　|\__css
  　　|\__style.css
　|\__ejs
　　|\__template
　　　|\__ _head.ejs
　　|\__index.ejs
　　|\__folder
　　　|\__index.ejs
のようなディレクトリ構成とします。
前提：gulpの処理でfolder/index.ejsはdevelop/folder/index.htmlに吐き出されるものとする。

```html
htmlになるejsファイル

filenameはそのままfilenameでokです。
filenameにそのファイルの、絶対パスが入っています。
<%- include('template/_head',{absPath:filename}) %>
```


```html
head.ejs
絶対パスを[develop]からのパスに分割して、[develop]からの距離分../を返してます。


<%
 pathSet = function(absPath){
	var rootPath = absPath.split('develop/ejs')[1];
	if(rootPath.split('/').length - 2 > 0){
		return '../'.repeat(rootPath.split('/').length - 2);
	}else{
		return '';
	}
 };
%>
<link rel="stylesheet" href="<%= pathSet(absPath) %>css/style.css">
```

これで、../が自動で付与されます。

pathSet関数は別ファイルに分けるのをお勧めします。
自分んはejsフォルダの中にutilフォルダを作ってその中に書いてます。
そのファイルをインクルードすれば、関数も使用できます。
Electron環境構築

## Node.jsをインストール

**ダウンロード**
https://nodejs.org/en/download/

**インストール確認**

```bash
node --version
npm -v
```

## プロジェクトの作成

```bash
git clone [repository_name]
cd [project_name]
npm init -y
vim package.json
npm install
npm run electron .
./node_modules/.bin/electron-packager . Windy --platform=darwin,win32 --arch=x64 --version=1.4.6
```

```json:package.json
{
  "name": "windy",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "electron": "electron",
    "electron-packager": "electron-packager"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "electron": "^1.4.6",
    "electron-packager": "^8.2.0"
  }
}
```
rubyの置換を一回で全部したかった

rubyのgsubで検索ワードの該当した文字を強調表現にしたかったのですが、その時につまづいたのでメモ。

検索ワードが「a b c」だったときに
 bluebird という要素に対して
該当する文字を強調したかった。

んでコード

searchKeywords = {"a","b","c"}
elementKeyword = "bluebird"
searchKeywords.each{|keyword|
  elementKeyword.gsub!(/keyword/,"b" + keyword + "/b")
}
puts elementKeyword

としたのですが上手いこと変換してくれなくて
bタグが漏れてる...。

理由は一度"a"で変換した時に
bタグが追加されてしまって
それがまた変換してしまうのが原因でした。

なので一度のgsubで全て置換したいと
思いました。

まずgsubは
第一引数でパターンを
第二引数で置換文字列を送れるのですが
リファレンスをよく見ると
この第一引数にパターンの配列を
この第二引数に置換文字列のハッシュを渡す事が出来るらしいので
これを実現しようと思いました。
Jenkins install

## 環境
OS : linux

## Jenkinsインストール
`$ sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo`
`$ sudo rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key`
`$ yum install jenkins`

## Jenkins 起動
`$ sudo service jenkins start/stop/restart`

## 自動起動設定
`$ sudo chkconfig jenkins on`

## 起動ポートを変更(例:8081)
`$ /etc/sysconfig/jenkins`
JENKINS_PORT="8081"

## ファイアーウォール設定
`$ vi /etc/sysconfig/iptables`
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8081 -j ACCEPT

## ファイアーウォール設定反映
`$ service iptables restart`

## アクセス確認
http://{IP_ADDRESS}:8081/

ログ
/var/log/jenkins/jenkins.log

起動スクリプト
/etc/init.d/jenkins

# 参考リンク
[Jenkins本家](https://jenkins.io/)
connection reset by peer エラー

環境
---
VirtualBox 5.0.28
vagrant 1.8.1

現象
---
RubyからのSSH接続で、`connection reset by peer`エラー発生。
VirtualBox　を 5.0.28 にバージョンアップすると発生するようになった。

対応
---
VirtualBox 5.0.26 にダウングレードした。
VirtualBox 5.1.6 でも大丈夫だった。
VirtualBox 5.1.8 はダメ
cygwinでansibleを使う

自分用の備忘録．
CygwinでAnsibleをインストールする手順．

# 必要パッケージの導入
`libffi-devel`, `openssl-devel`, `python-crypto`が必要となる．ここでは `apt-cyg` コマンドでインストールする． `setup.exe` でも良い．

```sh
apt-cyg install libffi-devel openssl-devel python-crypto
```

`python-crypto` は `pip` で入れてもいいが，ビルドが大変なので，Cygwinのパッケージを使う方が楽．

# Ansibleの導入
```shell-session
pip install ansible
```

以上．
参考にしたいイベントや学会（随時追記）

ネットワーク・コンピューティング性能・Linuxを中心に、参考にしたいイベントや学会をメモ。


* The International Conference for High Performance Computing, Networking, Storage and Analysis
    * http://www.supercomp.org/
    * Conference History: http://www.supercomp.org/history.php
    * SC16: http://sc16.supercomputing.org/full-program/
* INDIS: Innovating the Network for Data-Intensive Science
    * SCinet Workshop part of SCxx.
    * https://scinet.supercomputing.org/workshop/
スマホで触れている間だけhoverする

新たにしっかり書きましたので、長いですが下記記事を御覧ください。
[スマホでhoverの動きをSassで矯正させるmixin](https://qiita.com/RinoTsuka/items/5cdce19ebf037bc77efa)

CSSに`hover`を与えたとき、スマホではタップして指（指とは限らない）が離れるときに発火します。
感覚的にはタップした瞬間から離れるときまでの間が`hover`であって欲しい。

ググるとjQueryのタッチイベントで、触れた瞬間から離れるまでの間にクラスを与えるという方法で回避しているようです。hoverを指定したものはPCではhover、スマホではタッチイベントになります。
個人的な考えですが、CSSで解決出来るものはCSSで解決したいです。

スマホに擬似クラス`hover`を与えてはいけません。
指が離れてから発火してしまうので、スマホはtouchイベント、PCは`:hover`なコードを書きます。

# コード
```js:jQuery
$('a, input[type="button"], input[type="submit"], button, .touch-hover')
  .on('touchstart', function(){
    $(this).addClass('hover');
}).on('touchend', function(){
    $(this).removeClass('hover');
});
```
`hover`で変化がありそうな要素を入れてあります。
加えて`hover`が必要になるものに`.touch-hover`を与えます。
これでタッチしている間だけ`.hover`が付きます。

```html:html
<div class="touch-hover test">テスト</div>
<a href="#" class="test">テスト</a>
```
今回は`.test`をホバーしたときに文字色を変更します。


## SCSS
```scss:mixin
$grid-breakpoints: (
  xs: 0,
  sm: 576px,
  md: 768px,
  lg: 992px,
  xl: 1200px
) !default;


@mixin hover($tap-highlight:false) {
  @if $tap-highlight == false {
    &.hover {
      -webkit-tap-highlight-color: transparent;
      @content;
    }
  } @else {
    &.hover {
      @content;
    }
  }
  @media screen and (min-width: map-get($grid-breakpoints, lg)) {
    &:hover {
      @content;
    }
  }
}
```

コチラのコードがmixin。ブレークポイントはBootstrap4の値です。
（ブレイクポイントでPCかスマホか判別してますが、ユーザーエージェントのほうが確実）
リンクなどをタッチした際に背景がグレーになる`-webkit-tap-highlight-color`用に分岐してます。


```scss:scss
.test {
  @include hover() {
    color: red;
  }
}
```

`include`でmixinを呼び出し、文字色を赤にします。

```scss:scss
.test {
  @include hover(true) {
    color: red;
  }
}
```
`-webkit-tap-highlight-color`を活かしたいなら括弧の中に何か入れて下さい。



## css
```css:css
.test.hover {
  -webkit-tap-highlight-color: transparent;
  color: red;
}

@media screen and (min-width: 992px) {
  .test:hover {
    color: red;
  }
}
```

SCSSが吐き出したCSSです。
CSSに直接書くなら上記のコード。

# 終わり
疑似クラス`active`はPCだけに与えましょう。今回のコードとぶつかります。

今回Bootstrap4のブレークポイントが変更されていてびっくりしました。
Bootstrapを使うならSCSSの値を拾ったほうが安全ですね。
Linux Network Performance Tuning / Testing（随時追記）

Linux Network Stack の性能チューニングおよびテスト（測定）方法のメモ。
随時追記していく予定。


## 性能測定ツール

List of Tools

* nuttcp: about 10% faster on LAN tests, has lots of cool options. 
* iperf3: has nice retransmit/congestion window report, supports FQ pacing, and JSON output option is great for producing plots
* Iperf2: multi-threaded, and better for parallel stream testing

Tools Selection

* Installation  instructions  at: http://fasterdata.es.net/performancetesting/network-troubleshooting-tools/
* All (nuttcp, iperf3, iperf2) are part  of  the "perfsonar-tools" package.


## チューニング

## 参考情報
* Recent Linux TCP Updates, and how to tune your 100G host
    * PDF: https://scinet.supercomputing.org/workshop/sites/default/files/100G-Tuning-INDIS.tierney.pdf
    * SC16 INDIS Workshop November 13, 2016
    * Brian Tierney and Nate Hanford, ESnet | bltierney@es.net | http://fasterdata.es.net
    * 内容：
        * Fair Queuing Scheduler (FQ) を有効にしたときの性能・安定性向上
        * TCP Buffer Tuning
        * List of Tools and comparison.
        *
一番簡単にPHPで金額などを３桁づつカンマ区切りする関数

数字を千位毎にグループ化してフォーマットする

`number_format(１００００);`
だと
`10,000`
に変換される。

LaravelでBlade上で使ってみるとこんな感じ
`<td>¥{{ number_format($value->amount) }}</td>`
`¥1,000`

楽、簡単
Redisで複数のキーを一気に削除するコマンド

`redis-cli`では`keys`に対して`*（ワイルドカード）`が使えるので、削除する場合も同様に良い感じにできるできるだろうと思って、ドキュメントを眺めたところなかったので調べてみた。

## 環境

* Redis 3.2.0

## コマンド

```
$ redis-cli KEYS "*" | xargs redis-cli DEL
```

`"*"`の部分を一致するパターンに変更することで、パターンに一致するキーのみ削除することが可能になる。

## 参考資料

[How to atomically delete keys matching a pattern using Redis - Stack Overflow](http://stackoverflow.com/questions/4006324/how-to-atomically-delete-keys-matching-a-pattern-using-redis)
CentOS7にPostgreSQL9.6とJava8とNginx1.10をインストール

#はじめに
仕事の現場で「本番環境の構築どうしますか？」と聞くと
「本番環境構築しといて」と言われることよくありますよね。
（言い出しっぺがやらされる法則）
そういう人のために構築手順まとめました。

#PostgreSQLのインストール
最新版をインストールしたいので、PostgreSQLのyumリポジトリを追加
`sudo yum localinstall https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/pgdg-centos96-9.6-3.noarch.rpm`

インストール
`sudo yum install postgresql96-server postgresql96-contrib postgresql96-devel`

インストールするパッケージの説明

```
postgresql-server    サーバ本体(postgresql、libsもインストールされる)
postgresql           クライアント
postgresql-libs      libpqなどのPostgreSQLのライブラリ群
postgresql-devel     開発用モジュール(役立つかもしれないので入れておく)
postgresql-contrib   contribモジュール(役立つかもしれないので入れておく)
```
バージョン確認コマンド
`psql --version`

データベースクラスタ（保存領域みたいなもの）を作成
※postgresユーザー（自動で作成されている）になってから実行
`sudo su - postgres`
`/usr/pgsql-9.6/bin/initdb --no-locale --encoding=UTF8`

※--no-localeをつけないと、サーバーのロケールが設定されてしまうので注意
(ロケールが設定されるとソート順が変わってしまう)
※initdbをやり直したい場合は「/var/lib/pgsql/9.6/data」の中をすべて削除し再度実行

initdbの実行の仕方はいろいろあるようでどうやるのが正しいかわかりません。
「/usr/pgsql-9.6/bin/postgresql96-setup initdb --no-locale --encoding=UTF8」
他のサイトを見ると上記コマンドをrootで実行してたりするのですが、--no-localeオプションがうまく渡りません。またPostgreSQLのドキュメントには以下の記載があります。
https://www.postgresql.jp/document/9.4/html/app-initdb.html
>initdbは、サーバプロセスの所有者となるユーザによって実行されなければなりません。 initdbによって作成されるファイルやディレクトリにサーバがアクセスできる必要があるからです。 サーバをrootとして実行することはできませんので、rootでinitdbを実行してはいけません （実際には、実行しようとしても拒否されます）。

とりあえず、postgresユーザーになってinitdbコマンドを直接叩けば実行できましたが、どうするのが正しいのか分かる人がいたら教えてください。

自動起動確認(Loadedのserviceの箇所を確認 disabledまたはenabled)
`systemctl status postgresql-9.6`

またはサービス一覧でも確認可能
enabled(自動起動する) disabled(自動起動しない) static(他のサービスに依存)
`systemctl list-unit-files -t service`

自動起動設定
`sudo systemctl enable postgresql-9.6`

起動
`sudo systemctl start postgresql-9.6`

#PostgreSQLの動作確認
PostgreSQLクライアント起動
`sudo -u postgres psql`

ロケール確認（settingがCになっていればロケールなし）
`SELECT name, setting, context FROM pg_settings WHERE name LIKE 'lc%';`

データベース作成
`create database データベース名;`

データベース一覧表示(エンコードはUTF8)
`\l`

終了
`\q`

#Javaのインストール
以下参照
[Javaのビルドサーバ（Ant）構築手順](http://qiita.com/nyao/items/dec0769a1b03acae1522)

#Nginxのインストール
最新版をインストールしたいので、Nginxのyumリポジトリを追加
`sudo yum install http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm`

インストール
`sudo yum install nginx`

自動起動確認
`systemctl status nginx`

自動起動設定
`sudo systemctl enable nginx`

起動
`sudo systemctl start nginx`

※AWSのEC2インスタンスで繋がらない場合はセキュリティグループを確認
SELinuxが有効でも繋がりました。

#tomcatのインストール
構築手順作成しました。
以下参照
[CentOS7にTomcat8をインストールして自動起動設定](http://qiita.com/nyao/items/8ad51a56638e646b2ec1)



#さいごに
言い出しっぺにやらせるとだれも言い出さなくなると思います。
そこで、今後は言い出しっぺ以外にやらせるというルールにしたらどうでしょう？
とりあえず、今後は「本番環境の構築どうしますか？」と言い出さないようにしようと思います。
privateメソッドのテスト

# privateメソッドのテストがしたい
## 概要
privateメソッドのテストは必要ないというような見解もありますが（[コチラ](http://tech.voyagegroup.com/archives/7400148.html)）、
時と場合によっては書きたい時もあるかと思います。

今回は、
* 対象クラスのtestコードが今まで無かった
* １つのpublicクラスで全privateメソッドを呼んでいるという仕様
* 全部書く時間は無いのでとりあえず今回触る１privateメソッドのみtestコードを記載したい

というような状況だったため、privateメソッドを書くこととしました。

## 環境
* ruby 2.1.8
* Test::Unit を使用

## 解決策
`sendメソッド` の利用

```rb
test 'sample_test' do
    expected = 'expected result'
    @model = TestModel.new
    actual = @model.send(:sample_private_method)
    assert_equal expected, actual
end
```

## その他回答
| how | detail | example |
| ---- | ------ | --------- |
| send | レシーバの持つメソッドを呼び出すことができる。 | `1.send(:+, 2) # 1 + 2 => 3` |
| `__send__` | sendの別名。sendメソッドを上書きして別の機能に当てたクラスでも、このメソッドで呼び出せる。 | `1.__send__(:+, 2)` |
| instance_eval | 渡されたブロックをレシーバのインスタンスの元で実行できる。関数定義、値設定、関数実行なんでもござれ。 | `cat.instance_eval{def test(val); p val;end;}` <br> `cat.instance_eval{test "sample"}` |

## Ref
* [instance method BasicObject#instance_eval (Ruby 2.3.0)](https://docs.ruby-lang.org/ja/2.3.0/method/BasicObject/i/instance_eval.html)
* [instance method Object#__send__ (Ruby 2.3.0)](https://docs.ruby-lang.org/ja/2.3.0/method/Object/i/__send__.html)

# privateメソッドをスタブ化したい
このようなシチュエーションもある。
この場合は下記のように、allow_any_instance_ofを使えば実現可能

```
allow_any_instance_of(TargetClass).to receive(:private_method) { return_value }
```
Laravelで独自で設定したタイムスタンプのときに->format('Y-m-d');が使えなかった時

##Laravelで日付のフォーマットがCall to a member function format() on stringで動かない
`echo $value->traded_day->format('Y-m-d');`
だとか
`{{$value->traded_day->format('Y-m-d');}}`
が動かない時。


```モデル名.php
class モデル名 extends Model
{
    use SoftDeletes;

    protected $dates = [
        'traded_day', //追加する。
        'created_at',
        'updated_at',
        'deleted_at'
    ];
```

作成したModelでdatesにカラム名を追加すれば動く。
英語のフレーズ覚書

# Flashcard

| English | Japanese | Example |
|:------- |:-------- |:------- |
| predictable | 予測可能な | [Redux is a **predictable** state container for JavaScript apps.](http://redux.js.org/) |


# Useful English Phrases

## Commit message

#### Bump VERSION to 7.2.0
```
バージョンを7.2.0に上げる
```
[source](https://github.com/gitlabhq/gitlabhq/commit/da5d33e13ec51006edfffd9e286b0f33781a4c12)


#### Split, Apply, Combine
```
Split（分ける）, Apply（適用する）, Combine（まとめる）
```

#### WordPress 4.3 *compatibility*
```
Wordpress 4.3 対応
```

## Conversations

#### Works like a charm
```
見事にうまくいった
（対策などが）見事にきいた
```

[source](https://github.com/naokazuterada/MarkdownTOC/issues/81#issuecomment-269331336)

#### I urge you to *give it a shot* anyway
```
どちらにしろ、試してみることを強くおすすめします。
```
*give it a shot* = 試してみる

[source](http://michelletilley.net/2014/02/24/creating-chrome-extensions-with-react.html)
[解説](http://eigodaisukine.blog14.fc2.com/blog-entry-42.html)

#### *In the future*, please only ask one question per question. 
```
今後は、質問は一度に１つにして下さいね
```
`In the future`は、おそらく`今後は`というニュアンスなのだろう。

[source](http://stackoverflow.com/questions/23444125/how-to-change-position-of-output-panel-in-sublime-text)



#### TypeError: Can't convert 'int' object to str *implicitly*
```
object型はstr型に暗示的に変換できません。
```

| | |
|:----|:-----|
| implicit | それとなく示された・暗黙の |
| explicit | 明確な, 明白な |

#### *Would it be possible* to reschedule the meeting ?

```
ミーティングを変更することは可能でしょうか？
```

`would it be possible`でかなり丁寧な言い回しになる。

[source](https://www.youtube.com/watch?v=fv__Anx4uvw)

#### Sorry to fill up your inbox.

```
度々すみません。
```

連絡事項が漏れていて、連続でメールを送らなければならなくなった時など

[source](https://www.youtube.com/watch?v=6671oF3Mr5g)

#### Thanks for this feature request. I see this as something you can do outside of XXXX, either with ..., or with ...

OSSプロダクトに追加リクエストが来たんだけど、内部に取り込まないほうがよい内容だった場合。

[source](https://github.com/metafizzy/flickity/issues/108#issuecomment-91845713)

## links

- [Prepositions after Adjectives](http://lingohelp.me/) （形容詞の後の前置詞について、まとめてある）
VirtualBox-5.1.8 で問題あり？

以下の環境で Laravel(+PHPUnit) を勉強中の者です。

- Windows 10(Host) + Vagrant-1.8.6 + VirtualBox-5.1.8
- CentOS 7.2(Guest) + Ansible-2.2.0.0
- nginx-1.10.1 + php-7.0.13 + php-fpm ...

ここ数日、composer によるインストールがうまくいかなくなりました。

```bash
$ composer global require "laravel/installer"
Changed current directory to /home/vagrant/.config/composer
Using version ^1.3 for laravel/installer
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Failed to decode response: zlib_decode(): data error
Retrying with degraded mode, check https://getcomposer.org/doc/articles/troubleshooting.md#degraded-mode for more info

Installation failed, deleting ./composer.json.


  [ErrorException]
  zlib_decode(): data error
```

今月から自分の作業場所が一つ増えたので、当初はその組織内の proxy/FW 
あたりを疑っていました。ところが本日、別の作業場所（NATのみで出れる）
でも再現したので、どうもネットワークの問題ではなさそう。

https://github.com/composer/composer/issues/5814
https://forums.virtualbox.org/viewtopic.php?f=3&t=80396

で話題になっていました。

結局 VirtualBox-5.1.8 / 5.0.28 の問題のようで、自分のところでも 5.1.6 
に戻して正常に動作することを確認しました。なんだかんだで、解決まで
２週間ほどかかったみたいです。関係者の皆様おつかれさまでしたm(_ _)m
ElectronのWebviewにexecuteJavaScriptを利用した場合のコールバックについて

[Electron](http://electron.atom.io/)でのアプリケーションの開発中、特定のWebページを表示する必要が出てきたので`<webview>`タグを利用した。

その時に、`<webview>`側からElectron側のウィンドウへデータを受け渡す必要が出てきたため、`executeJavaScript`をを利用したものの、うまくコールバックが発火せず、データの受け渡しに苦戦したのでメモ。


## 問題のコード

`<webview>`側のページから特定のセレクタに付与されているCSSを取得したいというニーズだったのでそのまま掲載。

```js:electron.js
const $ = e=>document.querySelector(e);
const webview = $("webview");
webview.addEventListener("did-stop-loading", ()=>{
      webview.executeJavaScript(
        `return $("#col_channels_bg").css("backgroundColor")`,
        false,
        function(color){
            console.log(color);
        }
      );
});
```

この場合、一件問題なくWebview側で読み込まれていたjQueryを利用して背景色を取得できているようにみえるが、コールバック関数のcolorが何故かundefinedであった

## 問題の原因

```js
webview.openDevTools();
```

と入力することでwebview側のデベロッパーコンソールを開くことができるため、こちらで値を確認してみることに。
すると、以下のようなエラーが発生していた。

```
Uncaught SyntaxError: Illegal return statement
```

どうやら送った文字列をそのまま`eval()`かなにかでwebview上でベタに走らせているようで、グローバルでreturnした場合と同じエラーが発生している様子。

## 解決方法

結論としては、returnせずにそのままJSオブジェクトとして吐かせると、うまくコールバックが動作した。

```js:electron-fix.js
const $ = e=>document.querySelector(e);
const webview = $("webview");
webview.addEventListener("did-stop-loading", ()=>{
      webview.executeJavaScript(
        `color:{$("#col_channels_bg").css("backgroundColor")}`,
        false,
        function(color){
            console.log(color); // rgb(100, 100, 100);
            // 決してcolor.colorではなく、colorでアクセスすることになるので注意
        }
      );
});
```

## まとめ

* Electronのwebview.executeJavaScript()で実行されるコードはそれ自体にスコープを持っていない
* そのため、returnをするとグローバルでのreturnと同様とみなされエラーが発生する
* これを防ぎつつコールバック側にデータを渡すには、それ自体をJSオブジェクトの形式としてコードを記述すると良い
Docker ONBUILD を使ってクロスビルド環境を構築する

# はじめに
主にやりたいことは、以下 2点です。

- Gitlab CI で クロスビルドをするための Docker イメージを構築する
- ONBUILD で ツールチェインを取り込む

ツールチェインは [Yocto](https://www.yoctoproject.org) で生成しているため、割愛します。

## Docker ONBUILD とは
ONBUILD で指定された処理 (ADD/RUN/etc...) は、次のイメージ作成時に行われる。

今回は、ツールチェインとなるバイナリの取り込みをONBUILDする。


# 手順
以下のような形になります。
1. ベースとなるイメージを作成 (ONBUILDを使ったDockerfileから作成)
2. クロスビルド環境のイメージを作成 (ベースイメージを指定したDockerfileから生成)


## 1. ベースとなるイメージを作成
```bash:Dockerfile
FROM ubuntu:14.04
MAINTAINER yuu

ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
    bzip2
ENV DEBIAN_FRONTEND dialog

RUN ln -s /usr/bin/python3 /usr/bin/python

ONBUILD ADD toolchain.sh /
ONBUILD RUN chmod +x toolchain.sh && /toolchain.sh -y && rm /toolchain.sh
ONBUILD RUN /toolchain.sh -y

RUN ln -fs /bin/bash /bin/sh
```

Docker Hub を見ていると大体イメージ名に `-onbuild` を付与していますね。

```bash:docker-onbuild
$ docker build -t crossbuild-onbuild:0.0.1 .
```


## 2. クロスビルド環境のイメージを作成   

```bash:Dockerfile
FROM crossbuild-onbuild:0.0.1
MAINTAINER yuu

CMD source /opt/fsl-imx-fb/3.14.52-1.1.0/environment-setup-cortexa9hf-vfp-neon-poky-linux-gnueabi && \
    source /opt/fsl-imx-fb/3.14.52-1.1.0/sysroots/x86_64-pokysdk-linux/environment-setup.d/qt5.sh && \
    bash
```

`toolchain.sh` を同じディレクトリに配置 (シンボリックリンクでも可)

```bash:docker-build
$ docker build -t crossbuild:0.0.1 .
```

今回の docker build で `Dockerfile`に記述していない処理(ONBUILD処理)が走るのが確認できると思います。


## まとめ

- ONBUILDを使うことで、フレキシブルなベースイメージを作れる


## 注意事項
クロスビルドの確認まで起こっていません。
そのため足りないパッケージ(cmake,autotools,...)が発生する可能性があります。
mongodbのセキュリティ設定(yaml)


** /etc/mongod.conf のyaml版の設定が少なかったので

```/etc/mongod.conf
# IP制限解除
net:
  port: 27017
  # bindIp: 127.0.0.1  # Listen to local interface only, comment to listen on all interfaces.
  bindIp: 0.0.0.0  # Listen to local interface only, comment to listen on all interfaces.
  
# パスワード必須にする  
security:
  authorization: "enabled"
```


** 管理者を作る

```
use admin;
db.createUser(
  {
    user:"admin",
    pwd:"hogehoge",
    roles:[
       {
           "role" : "root",
            "db" : "admin"
       }
    ]
  }
);
```


** DBオーナーを作る

```
use hoge-db;
db.createUser(
  {
    user:"hoge",
    pwd:"hogehoge",
    roles:[
       {
           "role" : "dbOwner",
            "db" : "hoge-db"
       }
    ]
  }
);
```
targetViewController(forAction:sender:)の使い方を考えてみた

targetViewController(forAction:sender:)を利用する方法を考えてみました。


以下のアクションを実行できるViewControllerに委譲したいと考えます。

```swift
@objc protocol SomeProtocol:NSObjectProtocol {
    @objc func someAction(sender:Any?)
}
```

親のViewControllerが子としてUINavigationViewControllerとSomeProtocolを実装したViewControllerを持っているとします。

その時、targetViewController(forAction:sender:)を使えば階層をたどって実行できるViewControllerを手に入れることができます。

```swift

// 子のViewController
class ServiceViewController : UIViewController {
    
    @IBAction func pushed(sender:Any?) {
        
        // ViewController階層の先祖でアクションを実装している人にアクションができる人を探す。
        let t = self.targetViewController(forAction: #selector(SomeProtocol.someAction(sender:)), sender: sender)
        
        // アクションを委譲する。
        t?.perform(#selector(SomeProtocol.someAction(sender:)), with: sender)
    }
}
```

SomeProtocolを実装しているViewControllerは

```swift
class DetailViewController:UIViewController, SomeProtocol {
    
    @IBOutlet weak var label: UILabel!
    
    func someAction(sender: Any?) {
        label.text = "someAction done"
    }
}
```

　親のViewControllerはtargetViewController(forAction:sender:)を実装し、SomeProtocolを実装しているViewControllerを見つけて渡します。

```swift
// 複数のServiceViewControllerが入っているUINavigationViewControllerと
// DetailViewControllerをchildViewControllersにもつとする。
class ModalServiceParentController: UIViewController {
    
    // 特定のアクションを拾う
    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        if action == #selector(SomeProtocol.someAction(sender:)) {
            return true
        }
        
        return super.canPerformAction(action, withSender: sender)
    }
    
    // そのアクションを実行するViewControllerを渡す。
    override func targetViewController(forAction action: Selector, sender: Any?) -> UIViewController? {
        if action == #selector(SomeProtocol.someAction(sender:)) {
            let vc = self.childViewControllers.first {vc in vc is SomeProtocol}
            return vc
        }
        return super.targetViewController(forAction: action, sender: sender)
    }
}
```
開発環境から外部へテストメールが飛ばないようにする

OSX/Linux の開発環境などからメール送信のテストをしたい場合などに、
rails なら [letter_opener](https://rubygems.org/gems/letter_opener) とか [post_office](rubygems.org/gems/post_office) が有名ですが、 gem が使えない環境(rails プロジェクト以外など)で、
どうしてもテストでメール送信せざるおえない場合に、 postfix の設定を書き換えて外部へのメールをすべてテスト用メールアカウントに送信する方法です。

例) hoge@example.co.jp 宛のメールを全て test@example.com 宛として送信する

## 前提条件

Postfix 2.2 以上
example.com と example.co.jp は、実際に使ってるドメインに変更する。

## Postfix の設定

@example.com 以外のメアドをすべて `test@example.com` に置換して送信する

`sudo vim /etc/postfix/allmails_to_example.txt`

```
!/.*@example.com$/ test@example.com
```

↑の正規表現で、@example.com 以外のメアドを、 test@example.com に送るルールになる

`sudo vim /etc/postfix/main.cf`

mail.cf に下記を追記する

```
local_header_rewrite_clients = static:all
# envelope_recipient: 実際に使用される送信先
# header_recipient: 見た目の送信先(送信先に使用されるわけではない)
canonical_classes = envelope_recipient, header_recipient
# メール表示上の宛先(header_recipient)だけは、置換しないで偽装する場合
#canonical_classes = envelope_recipient
canonical_maps = regexp:/etc/postfix/allmails_to_example.txt
```

## 再起動

```
sudo postfix stop
sudo postfix start
```

## 送信テスト

sendmail でローカルから hoge@example.co.jp 宛に送信してみる。

````
$ sendmail hoge@example.co.jp
From: info@example.co.jp
To: hoge@example.co.jp
Subject: test

test
.
```

hoge@example.co.jp -> test@example.com に置換されて届いているか確認する。
届いて居なかったら /var/log/mail.log あたりに、fail が出ていないか確認する。
NanoPi NEO で 不思議なLTEドングル PIX-MT100 を使う


PIX-MT100 はLTEモバイルルータがUSBドングル型の筐体に収められ、USBの部分はUSB Ethernetになってます。
不思議な製品ですが、小ロットの組込製品を開発する際に、ボード側のネットワークの構成を簡略化できるのでかなり便利です。

NanoPi NEOで使う場合も基本的にRaspberryPiと同じ。
数台試した結果、`usb0`で認識されていれば`usb0`のDHCPさえ設定すれば使えますが、`usb0`でされない個体もありました。
そういう場合はifconfigで見ると enx1e497b810cxx みたいな名前で認識されてたりします。

以下のような行を`/etc/network/interfaces`に追加します。

```
# /etc/network/interfaces
allow-hotplug enx1e497b810c07
iface enx1e497b810c07 inet dhcp
```

その後、ネットワークを再起動。

```sh
systemctl restart networking
```

あるいは、システム自体リブートしてもok。

```sh
reboot
```


PIX-MT100自体がSSIDをもっているので、複数台同時にデバッグするときもどれがどれだかわからなくなるみたいなことがなくてかなり便利。
puma & puma-dev にRails開発環境をより良く。pow代替＆簡単・安全・安定

---
※2017/12/13追記。
Chrome(ブラウザ)がVer.63系になると、.devにはHTTPSが必須となります。しかも強制アップデートで。
HSTS (HTTP Strict Transport Security) ってやつ。簡単に言うとHTTPS必須にするよーの話。
この強制的にHTTPSにするよの対象に「.dev」ドメインが巻き込まれましたので、Powなどで.devにしてると色々問題出るよという。
例えばHTTPSで来たものを強制的にHTTPへとかroutesなどでやってると、永遠にループして帰ってこないｗ
※pumaを入れ直そう => [puma & puma-dev で利用中の.devを.testなどに変更する] (https://qiita.com/cyborg__ninja/items/46f6e4d3674ef572d6bd)

---

# Pow がいうこと聞かない

Sierraにアップデートしたらpowがまた死んだので、またどうしようと悩む羽目に。

[Pow(powder) + Ruby on Rails の環境でPC再起動したら .devが開かなくて詰んだ件(解決済み)](http://qiita.com/cyborg__ninja/items/c86766382e525495f053)
でも書いていた、再インストールや再起動してもダメでした。

# puma-devというpow代替

エンジニア仲間から教えてもらったpuma-dev。

ちょっとググったら「[時代はRails5だし、開発用サーバをPowからPuma-devへ乗り換えた](http://yatmsu.hatenablog.com/entry/Puma-dev)」を見つけて、こちらのブログサイトのほぼ受け売りのエントリとなります。

## puma-devのインストール手順

まず、既存のpowを消します。
[Pow User's Manual](http://pow.cx/manual.html)の **1.2 Uninstalling Pow** を参考。

```
$ curl get.pow.cx/uninstall.sh | sh
```

で、インストール。
[puma-dev](https://github.com/puma/puma-dev)に書いてある通りですが、先に紹介したブログにまとまってるんでこれをそのまま。

```
$ brew install puma/puma/puma-dev
$ sudo puma-dev -setup
$ puma-dev -install -d test
```

インストは以上。
2個めのコマンドにsudoが付いているがsudoじゃないとpermitが！と言われて動かないのでここは素直にsudoでOK。
※どっかから持ってきたコマンドにsudoついてたら疑ったほうがいいよ？
※20180214追記 `puma-dev -install` => `puma-dev -install -d test`

## 設定

基本的にはpowと同じでln -sで、がんがんシンボリックリンクを作っていく。
シンボリックリンクを張りたいディレクトリに移動してpuma-dev linkで作成する。

```
$ cd PATH/APPLICATION_NAME
$ puma-dev link -n APPLICATION_NAME
```
```
ex)
$ cd ~/Sites/favy
$ puma-dev link -n favy
$ cd ~/Sites/test_app
$ puma-dev link -n test_app
```

もしくは、~/.puma-dev内に、ln -sで作っても良いよ。

```
$ cd ~/.puma-dev/
$ ln -s PATH/APPLICATION_NAME APPLICATION_NAME
```
```
ex)
$ cd ~/.puma-dev/
$ ln -s ~/Sites/favy favy
$ ln -s ~/Sites/test_app test_app
```

こんな感じで。
複数アプリを一気に登録したい場合はln -sで作ってしまうと良いかも。

## 設定が終わったら

```
touch tmp/restart.txt
```

で、必ずpowリセットと同じことしましょう！

## トラブルシューティング：unexpected exit

何かしらのエラー。原因は多数あるパターン。
・bundleしてない
・db:migrateしてない
・ln -s のつける先間違えてる
などなどがよくあるパターン。

```
tail -f ~/Library/Logs/puma-dev.log
```
などからログを見て何のエラーが起こっているのか確認しましょう。

# ※ 注意点

非常に重要なこと。
Railsアプリだったら、Gemfileに

```
group :development do
  + gem 'puma'
  - gem 'unicorn'
end
```
と、入れてbundleしておきましょう。快適になる。unicornは要らない子。

# そもそもpumaってなんなの？山ライオンなの？

MACのOSにあったアレとは関係がない。
[最近の Rack サーバ事情について](http://blog.willnet.in/entry/2015/02/24/155006)というサイトに掲載があって、unicorn VS pumaみたいなそんな感じ。

詳しいことは誰かすごい人がカバーしてくれるでしょう。

# powに対する愚痴

powは本当にOSのアップデートをするたびに僕の言うことを聞かない。嫌いだ。あんなやつ。
puma-devはそういうじゃじゃ馬感ゼロで素直ないい子。よしよし。
ddでテスト用の30MBのファイルを作りたい



またもなんとなくQiita。

    $ dd if=/dev/zero of=test001 bs=1M count=30
    30+0 レコード入力
    30+0 レコード出力
    31457280 バイト (31 MB) コピーされました、 0.018012 秒、 1.7 GB/秒
    $ ls -l
    合計 30720
    -rw-rw-r-- 1 ec2-user ec2-user 31457280 11月 15 06:44 test001


1000個作りたかったらシェルスクリプトで。

    $ for i in `seq 1 1000` ; do  dd if=/dev/zero of=test$(printf %05d  $i) bs=1M count=30  ; done
RailsでActiveAdminインストール時にraise_no_devise_method_error!が出る

既にAdminというモデルが存在しdeviseも利用していた。
ActiveAdminを導入しようとしたらraise_no_devise_method_error!が発生した。

```bash
$  bundle exec rails g active_admin:install --skip-users      
/Users/kenjikinukawa/bp/epf-backend/vendor/bundle/ruby/2.3.0/gems/devise-4.2.0/lib/devise/rails/routes.rb:508:in `raise_no_devise_method_error!': Admin does not respond to 'devise' method. This usually means you haven't loaded your ORM file or it's being loaded too late. To fix it, be sure to require 'devise/orm/YOUR_ORM' inside 'config/initializers/devise.rb' or before your application definition in 'config/application.rb' (RuntimeError)
	from /Users/kenjikinukawa/bp/epf-backend/vendor/bundle/ruby/2.3.0/gems/devise-4.2.0/lib/devise/rails/routes.rb:244:in `block in devise_for'
	from /Users/kenjikinukawa/bp/epf-backend/vendor/bundle/ruby/2.3.0/gems/devise-4.2.0/lib/devise/rails/routes.rb:240:in `each'
	from /Users/kenjikinukawa/bp/epf-backend/vendor/bundle/ruby/2.3.0/gems/devise-4.2.0/lib/devise/rails/routes.rb:240:in `devise_for'
	from /Users/kenjikinukawa/bp/epf-backend/config/routes.rb:3:in `block in <top (required)>'
....

```

config/initializers/devise.rbにrequire 'devise/orm/YOUR_ORM'したら？と言われているが、既に記述されている。
どうやら、Adminモデルが既に存在していると、default_namespaceの設定でコケるらしい。
そこで、default_namespaceを少し変更してやる。

```rb:config/initializers/devise.rb
# config.default_namespace = :admin
config.default_namespace = :admin_page
```

その後、

```bash
$ bundle exec rails g active_admin:install --skip-users
```

してやるとコンフリクトしているから上書きするか？と聞かれるのでnをすればgenerate active_admin:assetsが通る。