OmniAICreator/Qiita-1.07M huggingface dataset:
Zotero+BibTeXで参考文献の出力を自動化&論文の引用で出てきた順にソートする

## はじめに 
はじめまして．
初めてQiitaに投稿させていただきます．
現在は卒論，修論時期でメンドクセって思ってる方も多いでしょう．
そこで，楽にする方法の一つとして参考文献だけでも楽にしてみましょう，という記事です．

## 問題点
参考文献を書く際に，`\begin{thebibiliograpy}`を使ってる人も多いでしょう．
確かにパッケージ依存もなくて楽だと思います．しかし，論文に出てきた順に自力でソートしなくてはなりません．これがまぁ面倒くさい．というわけで，自動的にソートできたらいいな．欲を言えば，自動的に参考文献のリストも出力したい．というわけでその願い叶えましょう．

## 必要環境
* OS:Unix系統(多分Winでもできる)
  * 筆者はmacOS Mojave 10.14にて設定
* TeXで文書を記述していること
* TeXがインストールされていること

## Zoteroのインストール
Zoteroは参考文献を管理してくれるスグレモノ．プラットフォームに関係ないから，ZoteroのIDを作ればいつどの環境でも使える(はず)．[ここ](https://www.zotero.org/)からインストール．Downloadを押して，自分にあったプラットフォームのインストーラーを選ぶだけ．Zotero Connectorもあるといいかも．ciniiとかj-stageから直接論文を拾えるスグレモノ．

## Zotero-better-bibtexのインストール
Zotero-better-bibtexとは，zoteroのプラグイン的なもの．まぁ，機能を拡張してくれる程度に認識してもらえれば大丈夫かと．

1. [ここ](https://retorque.re/zotero-better-bibtex/installation/)の最初，`the latest release`をクリックして，`zotero-better-bibtex-x.x.x.xpi`をクリック&ダウンロード．
2. Zoteroを開き，メニューの`tools -> add-ons`を選択． 
3. さっきダウンロードしたxpiファイルをドラッグ．
4. いろいろメッセージが出るけどそのまま進める．再起動等出るけどいいなりに．
5. Zoteroの`Preference->Better BibTeX->export`の`fields to omit from export`に出力する際に除外する項目を入れる．
筆者は`abstract,file,doi`と記述した．
fileは長くて邪魔だし，abstractも別にいらないので．

これでZotero側は下準備完了．
Zoteroの使い方は[ここ](https://tatsumarutimes.com/archives/2532#toc3)参照．

## Zoteroから.bibファイルの出力
Zotero内で卒論用のフォルダを作って，その中に参考文献を突っ込んでおくと良い．作ったフォルダを`右クリック->Export Collection..`をクリック．ここでポイントなのが**FormatとOptionの選択**である．Formatを`Better BibTeX`にし，Optionに`keep updated`を選択する．これでフォルダ内に変更があれば，自動的に.bibファイルに出力してくれる．

ここで筆者が詰まった点だが，TeXで引用する際に`\cite{引用キー}`で引用する．さていつもお世話になっている強化学習の本を例に出そう．

```bib:bibliography.bib
@article{sutton2000強化学習,
  title={強化学習},
  author={Sutton, Richard S},
  journal={強化学習},
  year={2000},
  publisher={森北出版株式会社}
}
```

ここで引用キーは`sutton2000強化学習`になる．
...日本語入ってるしなんかやだ!変えたい!と思う方もいるだろう．ましてZotero Connectorから論文を引っ張ってきたのなら，尚更名前がおかしいこともあるだろう．
これを変える方法がわからずに詰んでいた．この変え方として，Zoteroで変えたい文献をクリックして，画面右にあるの`Info->Extra`に`Citation Key:変えたい引用キー`を追加する．これで引用キーを変えられる．

## TeXの準備
準備と言ってもTeXをインストールしているならBibTexもあるはず．なければfinkやらbrewやら使ってインストール．ということで，論文が書いてある.texファイルの`\begin{documentclass}`の下あたりに以下の文章を記述する．

```tex:thetis.tex
\bibliographystyle{junsrt}
```

junsrtは論文に出てきた順にソートするよう命令するもの(だと思う)．アルファベット順に出力したいならjplainとか．詳細は[ここ](https://qiita.com/SUZUKI_Masaya/items/14f9727845e020f8e7e9)．junsrtの場合，`\cite{}`で引用しない文献は参考文献のページに出力されない．

参考文献を出力したい場所で以下の文章を記述．

```tex:thetis.tex
\bibliography{出力した.bibファイルの相対パス}
```

以上で.bibファイル生成の自動化&ソートが可能となった．
コンパイルに関しては，latexmkを使うと楽．使い方は[ここ](https://konn-san.com/prog/why-not-latexmk.html)参照．軽く説明すると，latexmkだと，texファイルからpdfに一気にコンパイルしてくれるコマンド．ついでにtexファイルの変更があれば自動的にコンパイルし，なおかつpdfビューアーによって，変更点を随時確認することも可能(オプション次第)．何だこいつ強い．

## 終わりに
つたない文章ですが，自分への覚書と将来，またはいま現在論文を書いてる方の参考になれば嬉しい限りです．良い論文ライフを！

## 参考にしたサイト
[BiBTeXとは](https://qiita.com/SUZUKI_Masaya/items/14f9727845e020f8e7e9)  
[Zoteroで日本語文献のまともなBibTeX作成](https://qiita.com/John_Bigyear/items/a328f91b218fa39c405e)  
[文献管理ソフト Zotero ～ 設定編～ - humosy's blog](http://humosy.hatenablog.com/entry/2017/10/01/014034)  
[【卒論・レポート対策に】文献管理ソフトZoteroが最強すぎたので使い方をまとめました。](https://tatsumarutimes.com/archives/2532#toc3)
FrontISTRでintel MKLを使う（線形直接法ソルバの高速化）

# はじめに

FrontISTRはintel Math Kernel Libraly(MKL)のPardisoソルバインターフェースを持っています。Pardisoはスレッド並列ながら非常に高速な直接法ソルバであり、こちらを用いると商用コードと遜色ない計算速度を得られます。
intelコンパイラは有償ですが、MKL自体は無償配布されていますので、使わない手はありませんね。早速使い方を見ていきましょう。

なお、ノード間並列計算を行いたい場合はcluster pardisoを使いますが、こちらは別記事で扱います。また、現状のFrontISTRのcluster pardiso対応は、接触解析で使えないなど限定的です。

# intel MKLを入手する（無償）

APTで簡単にインストールができます。素晴らしい解説Qiita記事：
「Intel MKLをAPTでインストールする」
https://qiita.com/ymzkd/items/55a9c936df60394572fc

YUMコマンドなどでもできるそうです。こちらはintel公式を参照ください：
https://software.intel.com/en-us/articles/free-ipsxe-tools-and-libraries
の「Free Intel Performance Libraries for Everyone」

以下はUbuntu & APTでインストールした場合を想定して説明します

# FrontISTRのインストール

intelのドキュメントにも説明がありますが、コンパイラはLinuxであれば「GNU Compiler Collection 4.4 and later」でOKです。
https://software.intel.com/en-us/articles/intel-math-kernel-library-intel-mkl-2019-system-requirements

環境設定スクリプトを忘れずにsourceしておきます。

```bash
source /opt/intel/mkl/bin/mklvars.sh intel64
```

など。

v4.6以前のバージョンであれば、以下記事「オープンソース大規模並列FEM非線形構造解析プログラム FrontISTR v4.6のインストール (ubuntu 16.04 LTS)」
https://qiita.com/michioga/items/b9bc6d5c04318b107714
の手順において、Makefile.confを

```
MKLDIR     = $MKLROOT
F90FLAGS       = -m64 -I${MKLROOT}/include
F90LDFLAGS     = -L${MKLROOT}/lib/intel64 -Wl,--no-as-needed
-lmkl_gf_lp64 -lmkl_gnu_thread -lmkl_core -lgomp -lpthread -lm -ldl
```

と修正し、./setup.shに「--with-mkl」オプションを追加して実行の上、makeします。

v5.0alpha以降でcmakeが使える場合は、cmake実行時に-DWITH_MKL=1を指定します（簡単！）。

# お試し実行

pardisoソルバを使うには、!SOLVERキーワードのMETHODに「DIRECTmkl」を指定します。ただし、今のところpardisoソルバは接触解析でしか使えません。接触なしで使うには、実際には接触しない接触定義を作成して無理やり使うほかありません。この辺は要改善ですね。

接触解析のチュートリアルで試してみましょう。
FrontISTR/tutorial/10_contact_2tubes

解析制御ファイル「2tubes.cnt」の!SOLVERキーワードを以下のように編集します。

```
!SOLVER,METHOD=DIRECTmkl
```

一応、スレッド並列数も設定しておきましょう。何も指定しない場合、スレッド数は使用できる最大の数となります。

```bash
export OMP_NUM_THREADS=8
export MKL_NUM_THREADS=8
```

FrontISTRのビルド時にopenmpも有効にしておけば、線形ソルバ部分以外もスレッド並列化されますよ。

tutorial/10_contact_2tubesディレクトリでfistr1コマンドを実行します。
うまく使えていれば標準出力に下記のようなメッセージが繰り返し登場するはずです。

```
  [Pardiso_MKL]: Initialization completed !
  [Pardiso_MKL]: Factorization completed !
  [Pardiso_MKL]: Solve completed ...
```


筆者のノートPC（intel Core i5-8250U CPU @ 1.60GHz）での実行時間は約13秒でした。

```
 ====================================
    TOTAL TIME (sec) :     13.67
           pre (sec) :      0.04
         solve (sec) :     13.63
 ====================================
```

4000節点で22回線形ソルバ実行した結果です。たぶん速い結果だと思うのですが、問題規模が小さくてよくわかりませんね。ぜひ、大きな問題で試してみてください。

# 参考
MKLのリンクオプション確認は下記サイトが便利です。
https://software.intel.com/en-us/articles/intel-mkl-link-line-advisor
プログラムと美しさ：終章　―コードを見るまで信用するな―

～ プログラミングって面白そうと思った方に向けた連載エッセイ ～

　プログラムに存在する美について、いくつかの側面から見てきた。プログラミング経験のない方に、プログラムというものを身近に感じてもらうのが目的だった。つまみ読みして「へえ、そうなんだ」と、ぼんやりでも感じていただけたなら嬉しい。

　実のところ、プログラミングはセンスと言ってしまえばそれまでである。どれだけ規則で縛ろうと、規則への従い方にもセンスが表れる。ラップ調にもヨーデル風にも歌えます――いかほど言を尽くされても、実際に歌を聴くまでは信用できないだろう。プログラマも同様である。つまり、こんな風に理屈をこねる人間が美しいプログラムを書く保証はまったくない。これが面白いところである。

　例に出してしまったので誤解のないように補足しておきたい。プログラミングにおいてセンスは重要だが、その性質や習得過程は歌とは大きく異なる。いきなり上手に歌い出す幼児はいても、いきなり美しいコードを書き出す幼児はいない。プログラミングのセンスは、バグで痛い目を見たり、他人のコードに感心したり、コードレビューで指摘を受けたり、思いつきや先人の知恵を形にして効果を体感したり…そういった工夫、試行錯誤の繰り返しの中で磨かれていく、意外に泥臭いものなのである。初学者がセンスのなさに失望するのはまだ早い。向上心や情熱があれば自然と身についていくだろう。そしてそれを支えるのは「楽しい」「好き」という感覚である。プログラミングに触れて楽しいと思ったら、その人はひとまずプログラミングに向いていると思ってよい。

　さらに補足しておこう。「プログラミングはセンス」というのはつまり、試験でいい点数をとるとか、気がついたらスクールカーストの上位にいたとか、俺も昔は悪かったとか、そういったほかの能力では言い表せない、独自のスキルセットだということである。世にあるすべてのプログラミング言語の文法と標準APIを隅まで記憶していたとしても、いいプログラムを書けるとは限らない。速く走れるからと言ってゴールを量産できるわけではないのと同様である。あえて言うなら、論理的思考力や文章力（表現力／構成力）との親和性が高い[^1]、そしてどちらも後天的要素が大きいとは思う。あくまで私見であり、だからと言って「実は理系より文系の方が向いている」などと粗暴に帰結させるつもりはない。そう思うのは私に理数に明るくないからで、理数に親しんだ人ならば証明が得意とか、絵画に親しんだ人ならばデッサン力が高いとか、それぞれの分野において符合する能力はあるだろう。

　何よりもやってみるのが一番である。文系だからとか中卒だからとか、そんなことはどうでもよい。私が一緒に仕事をした優秀なプログラマの中には、文系の方も理系の方も中卒の方もいた。そんな心配をするより、自分で考えたコードを一行書いてみよう。

---

[序章](https://qiita.com/CodeOne/items/01b4e49a7d5a84d48c71)
[第一章　その美の特徴](https://qiita.com/CodeOne/items/1969ec81d04529fbdb34)
[第二章　見た目と冗長性](https://qiita.com/CodeOne/items/96df6d1140301347156a)
[第三章　ロジック](https://qiita.com/CodeOne/items/3009027a2f8b892e2b6b)
[第四章　命名](https://qiita.com/CodeOne/items/dfc3ace22c46273dc22c)
[第五章　アーキテクチャ](https://qiita.com/CodeOne/items/469b9f421e5d914f1ffb)
[第六章　リファクタリング](https://qiita.com/CodeOne/items/df50fad6bb0bd2f0096f)
[第七章　デザインパターン](https://qiita.com/CodeOne/items/0ac628d6be24328ecc10)
[第八章　正規化](https://qiita.com/CodeOne/items/5df2a5e38cc4c1c90a7a)
終章

[^1]: 現代のプログラミング言語を習得する能力と自然言語の学習適性には、数学的素養などと比較して強い相関関係があるという研究結果が2020年に発表された。（https://www.nature.com/articles/s41598-020-60661-8）
Wikipediaの記事の単語をカウントしてみた

### Wikipediaの記事データの単語をカウントしよう
前回投稿した[様々な記事の単語をカウントするプログラムを作ってみた](https://qiita.com/Sak1361/items/2519f29af82ffe965652)のプログラムを用いてWikipediaの記事にどんな単語が出てきているのか集計してみました。

# Wikipediaの記事データを取得する
[Wikipedia:データベースダウンロード](https://ja.wikipedia.org/wiki/Wikipedia:%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89#%E9%80%9A%E5%B8%B8%E3%81%AE%E3%83%9A%E3%83%BC%E3%82%B8)より記事データをダウンロードできます。
`jawiki-latest-abstract.xml.gz  `が記事データになるのでこれをダウンロードします。記事作成現在の最新バージョンは2019年1月10日更新分です。
サイズは1.83GBでした（デカイなぁ）

# カウントしてみる
[様々な記事の単語をカウントするプログラムを作ってみた](https://qiita.com/Sak1361/items/2519f29af82ffe965652)のプログラムで単語をカウントしてみます。

##プログラムの使い方
このプログラムの使い方は

```
python count_word.py -i (inputするファイル) -o (結果出力ファイル)
```
みたいな感じで使えます。結果の出力はなくても動作します。
また結果の出力ファイルを指定して単語を検索することも可能です。その際は

```
python count_word.py -s (結果ファイル)
```
でいけます。

## そのままファイルぶっこむの？
**ぶっこみます**
タグだらけであってもちゃんとカウントできるように作った（はずです）

## カウントする単語の品詞の選択
今回はざっくり***名詞***のみに絞ってみました。
## カウントしてみたら
7~8分かかりました^^;
xml形式だったのでBeautifulSoupでも使ったらもちょっと早くなるかも（？

# 結果を見てみる
グラフはこんな感じになりました。
![wiki_noun.png](https://qiita-image-store.s3.amazonaws.com/0/339669/9b9f1c98-fe33-89f0-0509-34c024d8e4c4.png)
タイトルで発言したとか書いてあるのは見なかったことにしてね☆

頻出単語（名詞のみ）ベスト20です。タイトルにも書いてある通り、総単語数は三千百五十一万五千四百二十三単語で、種類は百二十四万二千七十種類でした👏

そしてグラフですが・・・「外部」とか「脚注」は記事の内容ではない単語が上位にいますね。この辺の単語を取り除いてもう一回グラフを出力してみましょう。

## 特定単語を削除する
```delword.py
delword = input("削除したい単語をスペース区切りで(skip:0)：")
if delword == '0':
    pass
else:
    delword = delword.split('  ')
    for word in delword:
        del count_dic[word]
```
こんな感じの処理を追加しました。また削除後のファイルを保存したい場合も`-s`オプションで指定可能です。

これで先ほどの結果から文書内容に関係なさそうな単語を消してみます。

```
py count_word.py -s wiki_result/wiki_count_noun
...
削除したい単語をスペース区切りで(skip:0)：外部 リンク 脚注 関連 項目 概要 参考文献 出典 その他 年月日
```

グラフはこちら
![del_word.png](https://qiita-image-store.s3.amazonaws.com/0/339669/7951ec7e-989f-8150-13e1-60157b402924.png)
まぁこんなもんかなぁくらいの結果に丸まりました。

## 結果ファイル
[ここ](https://github.com/Sak1361/word_count/tree/master/wiki_result)に置いてます。

# 終わりに
単純にカウントするだけだとこんな感じかなぁって感じの結果になりました。オチはありませんごめんなさいm(._.)m

結果を出力したファイル(カウントしたdictをjsonで出力しただけ)が38MBもあったのは驚き
ubuntuインストール後のpython3環境導入（pyenv）

## バージョン
ubuntu18.04にて動作確認済み．

## 準備

```bash
# gitをインストール
$ sudo apt-get install git
# makeをインストール
$ sudo apt-get install make
#その他諸々
$ sudo apt-get install zlib1g-dev
$ sudo apt-get install libssl-dev
$ sudo apt-get install libbz2-dev libreadline-dev libsqlite3-dev
```

## pyenvインストール
```bash
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
$ echo '#pyenv' >> ~/.bashrc
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bashrc
$ exec "$SHELL"
```

## pyenvからpython（ここでは3.6.3）をインストール


```bash
pyenv install 3.6.3
```

インストールできるバージョンは
`$ pyenv install -l`
で確認できます．


```bash
# グローバルに反映
pyenv global 3.6.3
# ローカルに反映
pyenv local 3.6.3
```
インストール済みのバージョンや現在設定されているバージョンは
`$ pyenv versions`
で確認できます．
Pythonのlogger(logging)とFlaskのloggerについて


# 概要

Flaskアプリでログを書きたいときは、`app.logger.info("hoge")`と書く。（ http://flask.pocoo.org/docs/1.0/logging/ ）

１ファイルに全てのコードを書くときはそれでいいけど（appオブジェクトがそこにあるから）、複数ファイル（モジュール）があるときはどうするの？という疑問を持った。

そういえばPythonのloggingまわりもよく知らないなーということで調べた。


# 環境

* Python 3.7
* Flask 1.0


# 結論

* `app.logger`は標準ライブラリのlogging.Loggerを取得しているので、同じようにあつかえる
* appオブジェクトを持たないファイル（モジュール）からは、`logging.getlogger('app.flask')`を実行することで、`app.logger`と同じオブジェクトを取得可能
* 標準ライブラリのloggingについては、ドキュメントにしっかり載っているので、それを読む


# ドキュメント
## Flaskのロガーについて
* http://flask.pocoo.org/docs/1.0/logging/
* http://flask.pocoo.org/docs/1.0/api/#flask.Flask.logger
* ソースコードを読むのが手っ取り早い（app.logger）

## Pythonのlogging
* https://docs.python.jp/3/howto/logging.html
* https://docs.python.jp/3/library/logging.html

# 解説（メモ）
## app.logger

Flaskのソースコードを読めばわかるが、`app.logger`は、`logging.getlogger('app.flask')`と同じ。

それに加えて、ログレベルの設定やハンドラーの設定、フォーマットの設定が行われている。


## logging.getlogger(name)

名前を指定した上で、ロガーオブジェクトを取得する。（正確にはロガーオブジェクトの参照）
場合に応じて、新規作成されるか、生成済みのオブジェクトが返される。

つまり、プログラム内で複数のモジュールから`logging.getlogger('foo')`を実行したとき、得られるオブジェクトは同一である。

`logging.basicConfig()`を始めに実行しておくことで、`getlogger()`で得られるロガーオブジェクトのデフォルトの設定が可能。（ログのフォーマットや出力先など）

## Flaskアプリとロガー

appオブジェクトがあるモジュール（おそらくルーティングが書かれているモジュール）では、`app.logger`を使い、それ以外の各モジュールでは、`logger = logging.getlogger('flask.app')`としてモジュール変数を作成すれば同じようにログは書ける。

各モジュールに"flask.app"とロガー名を書いていくのも微妙な気がするので、そういう場合は、`app.logger`を使わずに、どこかでloggerのデフォルトの設定をしておいて、`logging.getlogger('__name__')`でロガーを取得するのが良いかも。

## Pythonのlogging一般の話

* ログレベルはデフォルトで`WARN`になっているので、必要に応じて`INFO`や`DEBUG`に変える。

```python
logging.basicConfig(level=logging.INFO)
```

* デフォルトでは標準エラー出力に書き込まれるので、ファイルに書き込みたい場合などは、ハンドラーを設定する。

* `logging.info()`でもログは書けるが、`logging.getlogger(__name__)`で取得したロガーに対して、`info()`などを実行した方が保守性は高そう。ちょっとスクリプト程度ならどちらでも良いけど。

以上です。
新人Javaエンジニアはスッキリわかるシリーズを読め！

# スッキリわかるシリーズとは
スッキリわかるシリーズとは以下本のことを指します！
[スッキリわかるJava入門](https://www.amazon.co.jp/dp/B00MIM1KFC/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
[スッキリわかるJava入門 実践編](https://www.amazon.co.jp/dp/B00O0NIW30/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
[スッキリわかるサーブレット＆JSP入門](https://www.amazon.co.jp/dp/B00QPSXXZK/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
[スッキリわかるSQL入門 ドリル215問付き！](https://www.amazon.co.jp/dp/B00IRRTFNG/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)

# おすすめの勉強順
## 1.スッキリわかるJava入門
まずは、スッキリわかるJava入門を読んで基本の文法を身に付けましょう！この時点で全て完璧に理解する必要があるのではなく、こういうことができるんだなということは覚えておけばよいと思います。
## 2.スッキリわかるサーブレット＆JSP入門
次に読んでほしいのが、スッキリわかるサーブレット＆JSP入門になります。JavaでWebアプリケーションを作る際には、重要な技術になってくるので、一通り読んでほしい一冊になります。
## 3.スッキリわかるSQL入門 ドリル215入門付き！
しっかりとしたアプリケーションを作る際には、データベースの使用は必須になります。データベースの操作にはSQLというデータベース言語を使用します。
基本的な文法の、SELECT文、INSERT文、UPDATE文、DELETE文は確認しておきましょう。
## 4.スッキリわかるJava入門 実践編
1~3で紹介した本を一読したら、最後にスッキリわかるJava入門 実践編を読みましょう！
こちらは、スッキリわかるJava入門から一歩踏み込んだ実践的内容になります。前半の章では、業務でよく使用するクラスの紹介がされています。また、後半の章では、実際のプロジェクトの進める際の考え方や便利なツールについて紹介されています。(ウォーターフォール、アジャイル、Git、RedMine、Jenkinsなど)こちらも一読しておくと、業務への理解が深まるかと思います。

# おわりに
今回は、未経験からJavaの案件に入ることになった新人エンジニア向けの記事を書きました。次は、これだけ読んでおけばJava初心者から初級者へステップアップできる！といったテーマでおすすめの本を紹介したいと思います。
AWSでサーバー構築してみた

#目的
awsのサーバー構築を勉強する

#参考にしたサイト
[0から始めるAWS入門：概要](https://qiita.com/hiroshik1985/items/6433d5de97ac55fedfde)

#つまづいた点
[0から始めるAWS入門②：EC2編](https://qiita.com/hiroshik1985/items/f078a6a017d092a541cf)
nginxがインストールできない
![スクリーンショット 2019-01-11 0.08.41.png](https://qiita-image-store.s3.amazonaws.com/0/336536/7287b052-c9b4-18b0-ede0-f33010ceacaa.png)
yumからインストールできない様子。下記のコードからインストールできた。
```$ sudo amazon-linux-extras install nginx1.12
```
[参考：EC2にyumでNginxをインストールしようとしたらできなかった話]
(https://qiita.com/kazehiki03/items/7712660dd0401186ac4d)
[VSCode]markdownでplantumlを表示した時にplantuml内でスニペットを挿入できるようにする

#概要

markdownでplantumlを記述したいときがあって、その際に.puで作成した時に使用できていたスニペットが使えなかったので、
自前でスニペットを用意して代用してみた。

.pu
![2019-01-10_23h54_52.png](https://qiita-image-store.s3.amazonaws.com/0/59907/e2943dae-f0a2-012e-c5ba-9a3390f95e3b.png)

.md
![2019-01-10_23h57_27.png](https://qiita-image-store.s3.amazonaws.com/0/59907/59153df6-798e-a0d0-09f3-a34d6a691199.png)


#やること

「ファイル」→「基本設定」→「ユーザースニペット」を選択。
入力画面が出るのでjavascriptを検索してjavascript.jsonを探す。

![2019-01-11_00h06_30.png](https://qiita-image-store.s3.amazonaws.com/0/59907/cb288539-d0e0-a042-7db6-0f13f7c3b68c.png)


なんでjavascriptなのかというと、インテリセンスで表示した時にjavascriptと書いてあったので。
![2019-01-10_23h44_54.png](https://qiita-image-store.s3.amazonaws.com/0/59907/00dc0c86-e120-219b-2749-504e12201fb1.png)

javascript.jsonが出てきたら最後の行に好きなスニペットを追加する。
適当に継承のスニペットを作ってみる。

>参考
[独自のスニペットを作成](https://vscode-doc-jp.github.io/docs/userguide/userdefinedsnippets.html)

```javascript.json
{
"create Inheritance" : {
 		"prefix": "inheritance",
 		"body": [
 			"${1:base} <|-- ${2:derivation}",
 			],
 		"description": "継承"
 	},
}
```

定義したら保存し、再度mdファイルのplantumlの中でインテリセンスを出して自前で作ったスニペットが出てきたら成功。
![2019-01-10_23h58_52.png](https://qiita-image-store.s3.amazonaws.com/0/59907/cfebbe63-3799-b10f-95ae-5b7a2219c3bd.png)

![2019-01-10_23h59_09.png](https://qiita-image-store.s3.amazonaws.com/0/59907/e41c8116-41e8-6b04-52ff-cb4b6eae5e3f.png)


# 欠点

vscodeでjsファイルを編集しようとしたときにも先程作った自前のスニペットが出てしまうので、よくjavascriptを使う人は注意。
UnityでIsometricなGridの描画順序を整える

# 問題
IsometricなGridで平面を作ろうと描画しても思ったようにならない。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/162289/2c1ea553-42f0-c461-253f-4f11cf01b171.png)

# 解決方法

以下のように設定する

- Edit > ProjectSettings > Graphics

![graphics.PNG](https://qiita-image-store.s3.amazonaws.com/0/162289/6d38fa4f-9547-4cd8-0aeb-37015dcc9f79.png)

設定するとTextMesh Proプラグインを入れるウィンドウが出るので、プラグインだけ入れる。
その下に出てくるサンプルは入れなくてOK。

- TilemapRendererのInspector

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/162289/d4c02f71-61dd-ca03-6c98-f300e14960b3.png)

# 結果
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/162289/7e1dc787-c01d-29f3-4a77-9379dd14121c.png)

OK
jetson-inferenceでV4L2カメラを使う

[Jetsonの推論デモ](https://github.com/dusty-nv/jetson-inference)でV4L2カメラデバイスを使う方法。

Jetson TX1を下記のキャリアボードに乗せたが、USBカメラでjetson-inferenceのデモが動作しなかった。
[Orbitty Carrier for NVIDIA® Jetson™ TX2/TX2i/TX1](http://connecttech.com/product/orbitty-carrier-for-nvidia-jetson-tx2-tx1/)

[detectnet-camera.cpp](https://github.com/dusty-nv/jetson-inference/blob/master/detectnet-camera/detectnet-camera.cpp)等のdefineでカメラを指定する。
デフォルトは-1でオンボードカメラになっている。/dev/video0を指定したい場合は0にすれば良い。

```cpp:detectnet-camera.cpp
#define DEFAULT_CAMERA -1	// -1 for onboard camera, or change to index of /dev/video V4L2 camera (>=0)
```

再度makeして、V4L2でカメラが動作するようになった。
IDEの導入時確認事項

新しいIDEや、訳あって色々なIDEを使うようになった際のチェックリスト。
PCセットアップ時は必ずやるが、その時しかしなく忘れてしまうので。

## 必須確認
1. SDKインポート設定方法
2. エディタカラー設定方法
3. ショートカット
4. GUIデバッグ方法

## SDKインポート設定方法
たいてい使用言語のパスを設定する必要がある
関数ジャンプなど言語のソースと認識するために必要

## エディタカラー設定方法
たいていpreference的な所からできる
自分の目にあった設定をするために必要

## ショートカット
たいていのIDEは似たようなショートカットなので、試し入力すると当たったりする
以下の操作はよくするので把握しておく
- なんでも検索
- サイドバーから該当ファイル一括表示
- ファイル検索
- ファイル内検索
- 全文検索
- 一括置換
- ファイル内置換
- 関数ジャンプ
- 行ジャンプ
- ジャンプ前に戻る
- ジャンプ後に戻る
- 階層呼び出し
- クラス内のアウトライン表示
- SDK設定メニュー
- ファイルパスコピー
- 行複製
- 行移動
- UML生成
- 文字サイズ
- 1ファイルの分割表示
- 分割表示

## GUIデバッグ方法
たいてい対応言語のライブラリを入れる
通常のエディタではできないことが多く、便利だが最初しかやらないので忘れがち

## 他
ヘルプからなんとなく知りたいことの呼称を検索するとGUIでの選択する箇所を見つけられる。
そこにショートカットも書いてあることが多い。
AWS Cloud9を使って、東京リージョンで開発してみる。

# はじめに

最近プロジェクトの開発で、Cloud9を使い始めました。
ご存知の通り、Cloud9は東京リージョンにリリースされていません。
東京リージョンで開発するために、私は以下2つのことを試してみました。

1. Cloud9のコンソールを使って、AWS CLIのクレデンシャルを変えてみる。
2. Cloud9の設定で、リージョンを変えてみる。

## コンソールを使って、AWS CLIのクレデンシャルを変えてみる
1. Cloud9画面に入ったら、**F6**キーを押して、コンソール画面を開きます。
2. いつも通り、AWS CLIの設定を行います。

```
$ aws configure
AWS Access Key ID [xxxxxxxxxxx]:
AWS Secret Access Key [xxxxxxxxxx]:
Default region name [None]:
Default output format [None]:
```
アクセスキーとシークレットキーが空だと思いきや、最初から設定されているようです。
リージョンとフォーマットは空のままです。

そんなことを気にせずクレデンシャルを上書きします。

で、更新しますか的なポップアップが出てきて、しないを選択します。
※最初に試した時、更新するを選択して、クレデンシャルが元に戻りました。

```
#Codecommitからクローン
git clone https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/MyDemoRepo
Cloning into 'MyDemoRepo'...
```
できたっぽいです。
以降はいつも通り、開発すればいいです。

> P.S. キャプチャーは取ってないです。家で取りなおして更新します。:sweat_smile:

VScodeでCloud9をつなぐことができるっポイ
[VScodeでAWS Cloud9の操作](https://qiita.com/funabashi800/items/de7d33989d0d2030148c)

## 設定で、リージョンを変えてみる。

TBD
すごいswitch文に出会った

# すごいswitch文に出会った

Javaのリファクタリング案件でこんなコードに出会いました。

```java
switch ( cmd ) {
    case 0: 
        // 処理A
        // fall through
    case 1:
    case 2:
        // 処理B
        break;
    default:
        // 処理C
        break;
}
```

一見すると、 `case 0` は `処理A` のみを実行するように見えますが、よくみると、 `case 0` には `break` がないので、実は `処理B` も実行されるんです！

最初は、 `break` の書き忘れかな？と思いましたが、どうやら仕様通りの挙動でした。

# フォールスルーという技だった

このように、意図的に `break` を省略する記法を **フォールスルー(fall through)** と言うそうです。よく見たらコメントにも書いてありますね。


# `if` 文で置き換えてみた
このフォールスルーは、とても面白いテクニックですが、誤読を招きやすく、バグの温床になると思ったので、残念ですが `if` 文に置き換えることにしました。

```java
if ( cmd == 0 ) {
    // 処理A
}

if ( cmd <= 2 ) {
    // 処理B
} else {
    // 処理C
}
```

うーん、変更前の方がシンプルだったかな？微妙です。でも誤読の心配はなくなりました。

ただ、もし `cmd` が `String` 型だったら、こんな書き方はできないですね。悩みます。

もっと良い書き方があれば、どなたか教えてください。


# フォールスルーできる言語とできない言語
他の言語の事情が気になったので、軽く調べてみました。

## `switch` 文で `break` を省略すると fallthrough になる言語
- C
- C++
- JavaScript
- PHP

## `switch` 文で `break` を省略すると怒られる言語
- C#
    - `case` 文の中で何もしない場合は、 `break` を省略できる。
    - `goto` で fallthrough のようなことはできる。

## `switch` 文で明示的に fallthrough を指定する言語
- Perl ( `next` を指定)
- Swift ( `fallthrough` を指定)
- Go ( `fallthrough` を指定)

## `switch` 文に近い構文はあるが、 fallthrough はできない言語
- Ruby ( `case` 文)
- Scala ( `match` 文)
- Kotlin ( `when` 文)

## `switch` 文に相当する構文がない言語
- Python

## 条件を満たす全てのブロックが実行される言語

- PowerShell
    - fall through はできない。
    - 条件を満たす全てのブロックが実行される。
    - `break` を使えば、打ち切ることができる。

言語によって色々ですね！勉強になりました。
さくらのメールボックスを利用してLaravelで認証機能を実装してみる

#環境

Amazon Linux EC2 t2.micro
Laravel Framework 5.7.22
PHP 7.2.13
Apache 2.4.37
mysql 5.7.23

#認証機能の実装
[参考：Laravelの認証機能でログイン/ユーザ登録/パスワードリセットなどの管理画面を一撃構築する（基本＆入門編）](https://www.ritolab.com/entry/51)

~~~
#ルートに移動
$ cd /var/www/environment/test-laravel

# 必要なテーブルを作成
$ php artisan migrate

#ルート定義、ビュー、コントローラーを作成
$ php artisan make:auth
~~~

###さくらのメールボックスを使ってメール機能を実装

~~~
$ sudo vi .env

#メールに関する設定を定義
#今回はinfo@ドメイン　を利用する
MAIL_DRIVER=smtp
MAIL_HOST=[ドメイン].sakura.ne.jp
MAIL_PORT=587
MAIL_USERNAME=info@[ドメイン]
MAIL_PASSWORD=[パスワード]
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=info@[ドメイン]
~~~

###パスワードは下記の手順で確認できます。

1.さくらのメールボックスにログイン

2.メールアドレスの管理をクリック

![さくらインターネットサーバコントロールパネル 2019-01-30 23-25-06.png](https://qiita-image-store.s3.amazonaws.com/0/336536/80f63865-68eb-289c-f552-9a902d2863fe.png)

3.infoの所で変更をクリック

![さくらインターネットサーバコントロールパネル 2019-01-30 23-25-46.png](https://qiita-image-store.s3.amazonaws.com/0/336536/fc2084a7-1864-6467-3be8-f8cc3705846b.png)

4.ここで設定したパスワードを.envに記述します。

![さくらインターネットサーバコントロールパネル 2019-01-30 23-27-02.png](https://qiita-image-store.s3.amazonaws.com/0/336536/b63c243c-9fd9-e3c7-1793-6220dfc95f19.png)

#簡単に認証機能が追加されました

###ユーザー登録

![Laravel 2019-01-30 23-41-27.png](https://qiita-image-store.s3.amazonaws.com/0/336536/7a6c0a67-7c6b-8442-16be-398c8e21155f.png)

###ログイン機能

* ログイン画面

![Laravel 2019-01-30 23-33-45.png](https://qiita-image-store.s3.amazonaws.com/0/336536/4d387ffc-34f3-4726-56b0-5a67928fdaed.png)

* ログイン後

![Laravel 2019-01-30 23-36-09.png](https://qiita-image-store.s3.amazonaws.com/0/336536/f54f173a-8cd8-dc8d-7b94-6d2605aa8be0.png)

* パスワードリセットメール送信画面

![Laravel 2019-01-30 23-34-02.png](https://qiita-image-store.s3.amazonaws.com/0/336536/29692c54-7fe2-1bd3-d576-48e5a148c57e.png)

* 送信されたメール
※迷惑メールに入っていたので注意

![Reset Password 2019-01-30 23-35-15.png](https://qiita-image-store.s3.amazonaws.com/0/336536/6137b10b-0342-6349-835a-85a9668642f3.png)

* パスワードリセット画面

![Laravel 2019-01-30 23-42-59.png](https://qiita-image-store.s3.amazonaws.com/0/336536/39ea7a25-ea33-841b-e149-529d59b3985b.png)
「おい、」は萎縮するっス、先輩。

今はない記事へのアンサー記事を書きました。

!アンサー記事ですが、自分の当時の先輩は本家の優しいおじさんではありません。!

こちらは6月までの期間掲載となる予定でしたが、放置掲載します。もったいないんで。

https://qiita.com/rptrryo/items/465f9c0788e94186c5c5

__見た目大事ですね！__

先輩に話しかけていい時といけない時が
見た目で判断できないっす。一緒っす。

__報連相ですね！__

自分できてるっす。
本当は大分先の休みを伝えたい時もあるっす。
ただ先輩忘れそうだから貯めてる時もあるっす。

__不調は初期段階で対処ですね！__

体調にしろメンタルにしろ長引いたら、
それこそ損失っすもんね！
めまいと不眠があったもんっす。

当時は一日休むと内容すすんでて、
同期にも遅れをとると焦ってたっす。

__今日何しましょうか？__

朝礼いつもあったから困らなかったっす。
終礼は先輩の気分次第だったから戸惑ってたっす。
定時退社は割り切ってたっす。
怒られるまでいいかなと。
先輩も残りすぎると、ここブラック企業っすよ。

__設計書読めたり読めなかったり__

教わる立場だから、どこまで言っていいもんか
迷うっす。
自分、目の前の事で精一杯で全体が見えてない時あるんで教えてほしいっす。

また別件で先輩ごとのやりかた聞くと、
どちらを立てればいいか迷ってたっす。

__エラー読みます、ググります。__

英語だけで読むのあきらめてたっす。
聞いたほうが早いって思って。猛省っす。

先輩にチャット投げて返信ないと、
エラーより読めないっす。

__常に不安だったっす。__

いっそ何なら怒られないか知りたかったくらいっす。

そっすよね、相性あるっすもんね。
先輩に後輩を選ぶ権利があるように、
後輩も先輩を選ぶ権利あるっす。

あからさまに見下されるなら、お金払って
別のメンターに聞いたほうがマシと何回か思ったっす。

技術だけ盗んでさっさと次へ行くっす。

__おつかれさまでーす、お先失礼します。__

メールだけじゃダメすか？
先輩もつかれてるから早く帰ったほうがいいっすよ。

別件で口頭だけは自分、論外すけど。
言った言わない問題起こるから、、

先輩、早口で話の順序バラバラだとよくわかんない時
あんだよなーと思いつつ帰ります。


※上記、むかつく語尾は後輩仕様です。
 筆者も途中であきましたが、書ききりました。



__さいごに__


ひょんなことから書きました。

自分の勉強不足もありましたが研修から初案件まで、
とことん当時の先輩と噛み合わず悩みこじれ、
離職した経験があったからです。

アンサー記事ですが、自分の当時の先輩は本家記事のおじさんではありません。

同じゴールを目指すはずなのに、
先輩と後輩でこじれるのは悲しいもんです。

あと他にもバズった同じカテゴリの記事があるのに
本家の記事も残っていいのになーと思いました。

それでは通常業務に戻ります。
VMware のネットワーク設定と格闘した話

# 背景
知識ないけど勉強でWebサーバを構築したくなった。
そこで VMware を使って仮想マシンを作り、それをWebサーバにすることにした。
その仮定で仮想マシンのネットワーク設定で泣かされたので備忘録として残しておく。

# 問題
`yum update` をたたいたら失敗。console.log から調査したところ、
ネットワークに接続できていないことが原因だった。

# 環境
- ホスト情報
    - OS：Windows10 ver.1803 OSビルド 17134.523
- ゲスト情報(VMware Worksation 15 player)
    - OS：CentOS Linux release 7.6.1810 (Core)

# 解決策
1. ネットワーク接続はブリッジ接続にする
2. ホスト側のネットワーク接続方法を変更する。
3. ゲスト側のネットワークを設定する。

#### 1. ネットワーク接続はブリッジ接続にする
理由は2つ。

- Webサーバ構築がゴールなので、DHCPでIPアドレスがコロコロ変わるとやっかい。 
- ゲスト側から直接インターネット接続したい。

調べたところ、VMware でのネットワーク接続方法は3つあるご様子。

- ブリッジ接続
- NAT接続
- ホストオンリー接続

NAT接続は DHCP を制御すれば固定IPアドレスにできるっぽい？
ホストオンリー接続はホストだけとの接続になる為インターネット接続不可能っぽい。
詳しくは [こちら](https://qiita.com/pink/items/2416cd5f440bf9d6b4ca)

#### 2. ホスト側のネットワーク接続方法を変更する

やり方は [こちら](https://qiita.com/y_minowa/items/c1d857681c1d1e5fa128)

上記リンク先に加えて、一応ブリッジ接続が1つだけになっていることを確かめたほうが良い。
まず VSware を起動したら、[仮想マシン設定の編集]ボタンを押下
![001.png](https://qiita-image-store.s3.amazonaws.com/0/352052/fea0b45f-dc1e-e5f0-0da1-ae71173379c0.png)

ブリッジ接続になっていることを確認した後、[アダプタの設定]を押下
![002.png](https://qiita-image-store.s3.amazonaws.com/0/352052/5a53e9f5-2ce6-27c8-c95d-4d0b34e727da.png)

最後にブリッジ先が1つになっていることを確認できればOK
![003.png](https://qiita-image-store.s3.amazonaws.com/0/352052/160cd86c-52cb-2aa0-82f8-4eb698ef5922.png)

#### 3. ゲスト側のネットワークを設定する
まずホスト側のIPアドレスとゲートウェイを確認する

```ruby:ホスト側のcmd
# ipconfig
   IPv4 アドレス . . . . . . . . . . . .: 192.168.0.5
   デフォルト ゲートウェイ   . . . . . . : 192.168.0.1                                         
```

以上をメモって今度はゲスト側を設定する。

```ruby:ゲスト側のcl
   vi /etc/sysconfig/network
   // 下記を記載(ホスト側のゲートウェイと合わせる)
   GATEWAY=192.168.0.1
   vi /etc/sysconfig/network-scripts/ifcfg-(device名)
   // 下記を記載
   DNS1=8.8.8.8 //初期ではDNS未設定のため一緒に追加
   IPADDR=192.168.0.* //*は任意
```

# 結果
外部接続できた

```ruby:ゲスト側のcl
# ping www.google.com
64 bytes from kix05s02-in-f228.1e100.net (216.58.199.228): icmp_seq=1 ttl=54 time=11.5 ms
64 bytes from kix05s02-in-f228.1e100.net (216.58.199.228): icmp_seq=2 ttl=54 time=10.2 ms
64 bytes from kix05s02-in-f228.1e100.net (216.58.199.228): icmp_seq=3 ttl=54 time=16.8 ms
64 bytes from kix05s02-in-f228.1e100.net (216.58.199.228): icmp_seq=4 ttl=54 time=10.2 ms
```
任意のテキスト（HTML形式）をDOMオブジェクトに変換して、今のページのHTMLを丸っと差し替える

## 概要
axiosで特定のURLをGETし、GETしてきた内容をDOMオブジェクトに変換して、今のページのHTMLを丸っと差し替える。

## 実装

```javascript
function1 = () => {
    // 任意のURLを設定する
    url = "任意のURL"

    // axiosでget
    promise = axios.get(url).then((res) => {
        window.res = res
    })

    promise.then((a) => {

        // レスポンスのテキストをDOMオブジェクトにパースする
        var parser = new DOMParser();
        a = parser.parseFromString(res.data, "text/html")

        // 現在のhtmlを一旦削除
        document.removeChild(document.querySelector('html'))

        // パースされたDOMオブジェクトで丸っと差し替える
        document.append(a.firstElementChild)
    })
}
```

## 参考
* [HTML要素の追加方法いろいろ　挿入位置で分類](https://qiita.com/butakoma/items/89fa687ab90ff28d57ef)
【Swift4】日付を簡単に扱えるライブラリ SwiftMomentの使い方

日付を操作するときに**SwiftMoment**というライブラリを使ってみました。
スターはそこそこついてるのに解説系の記事が少なかったので、基本的な使い方をこちらに残しておきます。

[GitHub - akosma/SwiftMoment](https://github.com/akosma/SwiftMoment)
> A time and calendar manipulation library for iOS 9+, macOS 10.11+, tvOS 9+, watchOS 2+ written in Swift 4.

# ライブラリの導入
CocoaPodsとCarthageの両方に対応しています。今回はCocoaPodsを使います。

```
pod 'SwiftMoment'
```
使いたいファイルで`import SwiftMoment`をしておきます。

# 使い方

## 現在日時の取得
```swift
let now = moment() // 2019-01-30 22:18:43 GMT+09:00　
```

## 要素取得
```swift
let year  = now.year  // 2019
let month = now.month // 1
let day   = now.day   // 30
```

## 要素追加
```swift
let yesterday = now - 1.days // 2019-01-29 22:38:15 GMT+09:00
let tomorrow  = now + 1.days // 2019-01-31 22:38:15 GMT+09:00
```

## フォーマットの設定、Stringに変換
```swift
let dateFormatted_1 = now.format("yyyy/MM/dd")     // 2019/01/30
let dateFormatted_3 = now.format("yyyy/M/d (eee)") //2019/1/30 (Wed)
let dateFormatted_2 = now.format("yyyy年MM月dd日")  // 2019年1月3日
```

## Moment型 ↔ Date型の相互変換
```swift
// Moment型 -> Date型
let m = moment()
let dateType = m.date

// Date型 -> Moment型
let d = Date()
let momentType = moment(d)
```

# 使ってみた感想
`Calendar`や`Date`を使うよりも直感的でわかりやすいと感じました。
要素の追加などもシンプルに記述できて良いです。
頻繁に日付を操作するプロジェクトには導入を検討したいと思います:grinning:
fluentd(td-agent)をrootで起動させる方法

# はじめに

td-agentでnginxのログを収集しようと思って設定したけど、うまく動いてくれない。
/var/log/td-agent/td-agent.log に Permission denied のエラーを吐く。
td-agentの実行ユーザーは初期設定でtd-agentのため、rootしかアクセスできないnginxなどのログを収集するにはrootで起動させなければならないことに気がつく。
その時の手順をメモ。

# 環境

Ubuntu 18.04.1 LTS (Bionic Beaver)

# 手順

設定ファイルの確認

```
sudo systemctl status td-agent.service
```
Loadedのところ

```
● td-agent.service - td-agent: Fluentd based data collector for Treasure Data
   Loaded: loaded (/lib/systemd/system/td-agent.service; enabled; vendor preset:
   Active: active (running) since Wed 2019-01-30 23:05:17 JST; 7min ago
     Docs: https://docs.treasuredata.com/articles/td-agent
 Main PID: 950 (fluentd)
    Tasks: 12 (limit: 4662)
   CGroup: /system.slice/td-agent.service
           ├─950 /opt/td-agent/embedded/bin/ruby /opt/td-agent/embedded/bin/flue
           └─969 /opt/td-agent/embedded/bin/ruby -Eascii-8bit:ascii-8bit /opt/td

```

/usr/lib/systemd/system/td-agent.service が読み込まれているっぽい。
早速開いて編集。

---
変更前
[Service]
User=td-agent 
Group=td-agent

---
変更後
[Service]
User=root
Group=root

サービスを再起動

```
sudo systemctl restart td-agent.service
```

rootで起動した

```
root       950     1  0 23:05 ?        00:00:00 /opt/td-agent/embedded/bin/ruby /opt/td-agent/embedded/bin/fluentd --log /var/log/td-agent/td-agent.log --daemon /var/run/td-agent/td-agent.pid
root       969   950  0 23:05 ?        00:00:01 /opt/td-agent/embedded/bin/ruby -Eascii-8bit:ascii-8bit /opt/td-agent/embedded/bin/fluentd --log /var/log/td-agent/td-agent.log --daemon /var/run/td-agent/td-agent.pid --under-supervisor
```
IE11 > axios > POSTのつもりがうまく送れてないとき


OPTIONSで送信している事がある。

# axiosでPOST

```js

  // Send a POST request
  const params = new URLSearchParams();
  params.append("bbb", "aaa");
  params.append("xxx", "yyy");

  return axios
    .post(fullUrl, params)
    .then(response => {
      const result = response;
      return { result }; 
    })
    .catch(err => {
      return { err };
    });
}
```

## url-search-params-polyfill

URLSearchParamsはIE11でつかえないので、URLSearchParamsの polyfill を使う


```shell
yarn add url-search-params-polyfill
```

↓
[jerrybendy/url-search-params-polyfill: a simple polyfill for javascript URLSearchParams](https://github.com/jerrybendy/url-search-params-polyfill)


↓同様のpolyfillは動作しなかった
[ungap/url-search-params: The URLSearchParams polyfill](https://github.com/ungap/url-search-params)

↓はオワコン
[WebReflection/url-search-params: Simple polyfill for URLSearchParams standard](https://github.com/WebReflection/url-search-params)



# 参考

[axiosでPOSTでRequestしているつもりがOPTIONSで送信している - Qiita](https://qiita.com/hiryu/items/cdb606542d960402e592)
ラズパイのIPを固定化する

#はじめに

ラズパイのIPがコロコロと変わると嫌なので固定化します。

#環境

- Raspbian Pi Model B+
- 以下

```sh
$ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 9.6 (stretch)
Release:        9.6
Codename:       stretch
```

#dhcpcd.confを編集

`/etc/dhcpcd.conf`を編集します。

```sh
$ nano /etc/dhcpcd.conf
```

で編集開始。

以下の様な追加を行います。

```sh
# wifiの場合。LAN挿しの場合はeth0との事。
interface wlan0 
# 固定化したいIP。
# ルーターの設定を確認して自動で割り振られないモノにする。
static ip_address=192.168.10.90/24 
# ルーターのIPアドレス。 管理画面のIPです。
static routers=192.168.10.1
# ↑と同じでOK…？
static domain_name_servers=192.168.10.1
```

#再起動
```sh
sudo reboot
```

#確認

再起動したくらいに固定化したipでssh接続を行う。
又は、ラズパイを画面表示して`ip`とか`ifconfig`等で確認します。

#参考

以下を参考にさせていただきました。
ありがとうございました。

[Raspberry Pi に固定IPアドレスを割り当てる方法（Raspbian Jessie）](https://qiita.com/MarieKawasuji/items/b088ffb252a92eee8f5d)
[【Raspberry Pi 3B/3B+】スタティックなIPアドレス（固定IPアドレス）を設定する](https://qiita.com/BearcubThaw/items/cde2494556d609115fb6)

#最後に

普段仕事ではこの辺りの事を行っていないので基本的に素人です。
ツッコミどころや誤りがあると思いますので、ご教授いただけるとありがたいです。
ありがとうございました。
SQLについてまとめ[備忘録]

<h2>はじめに</h2>
転職活動で技術的な質問が来るとのことなので、復習もかねてSQL言語についてまとめます。
SQLとはリレーショナルデータベースに蓄積したデータを操作したりするプログラム言語です。
SQLもプログラミング言語の１つです。

SQLで出来ることは大量のデータが登録されたデータを取得・更新・削除・追加できます！
SQLにはMySQL、PostgreSQLなどがあります。それぞれの特徴をみていきましょう。

<h2>MySQLとは</h2>
世界で最も利用されているデータベース管理システムです。
私もスクールでMySQLを使用してオリジナルアプリを作りました。
（デプロイするときはPostgreSQLでしたが。）

メリットとして、
・容量が大きいデータでも高速で動作し実用性が高い
・オープンソースなので、費用を低く抑えることができる
・拡張性と柔軟性がある
・独自のストレートエンジンを採用しており、用途に合わせて選択できる
・SSHやSSLの安全対策が万全

<h2>PostgreSQLとは</h2>
MySQL同じく人気のあるSQL言語であり、関数や機能面が豊富だそうです。

う～ん、いまいちわかってないところもありますけど、アプリを開発するならほぼMySQLをデータベースとして採用すれば良い感じだと思います！
NURBSとは？

CADでは、自由曲線・曲面を表現するため、NURBS（Non-Uniform Rational B-spline、非一様有理Bスプライン）がよく利用されており、[Armonicos](https://www.armonicos.co.jp/) のソフトウェアでも幅広く使用しています。
今回はこのNURBSについて、簡単にご紹介します。

# B-spline曲線

$p$次（$p+1$階）のB-spline曲線の一般式は以下の通りです。


```math
\boldsymbol{C}(u)=\sum_{i=0}^{n}N_{i,p}(u)\boldsymbol{P}_{i}
```

ここで$\boldsymbol{C}(u)$はパラメータ$u$に対応する曲線上点、$\boldsymbol{P}$ は制御点（個数は$n+1$）、$p$は次数、$N_{i,p}(u)$は基底関数（混ぜ合わせ関数）といいます。

基底関数は以下のように定義されています。

```math
N_{i,0}(u)=\left\{
\begin{array}{ll}
1 & if \quad u_{i} \leq u \leq u_{i+1} \\
0 & otherwise
\end{array}
\right.
```

```math
N_{i,p}(u)=\frac{u-u_{i}}{u_{i+p}-u_{i}}N_{i,p-1}(u)+\frac{u_{i+p+1}-u}{u_{i+p+1}-u_{i+1}}N_{i+1,p-1}(u)
```
ここで$u_{i},u_{i+1}$などは、ノット（knot）といい、ノットが昇順で並んだベクトルはノットベクトル（knot vector）といいます。

任意のパラメータ位置での各基底関数の値の和は1になります。

ノットベクトル { $0,0,0,0.2,0.4,0.6,0.8,0.8,1.0,1.0,1.0$ } での2次の基底関数をプロットした画像：
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/316651/8c21ff2c-9004-aeea-f7b8-7064c157dab1.png "ノットベクトルU={0,0,0,0.2,0.4,0.6,0.8,0.8,1.0,1.0,1.0}での2次の基底関数")


# NURBS曲線

B-splineの各制御点への「影響力」を表す重み（$w$ : weight）をつけると有理（rational）になり、B-spline曲線が表現できない円錐曲線などの形状を表現できます。
$p$次（$p+1$階）のNURBS曲線の一般式は以下のようになります。

```math
\boldsymbol{C}(u)=\frac{\sum_{i=0}^{n}N_{i,p}(u)w_{i}\boldsymbol{P}_{i}}{\sum_{i=0}^{n}N_{i,p}(u)w_{i}}
```

すべての重みが1.0の場合、B-spline曲線の一般式になることがわかります。

[spScan](https://www.armonicos.co.jp/products/spscan/)でのNURBS曲線編集機能：
![image.png](https://qiita-image-store.s3.amazonaws.com/0/316651/e56772e5-9822-4c12-c860-d459bb5d7d4e.png)

# NURBS曲面

NURBSの概念を$u$, $v$ 2つの方向のパラメータへ拡張すると、NURBS曲面が得られます。

```math
\boldsymbol{S}(u,v)=\frac{\sum_{i=0}^{n}\sum_{j=0}^{m}N_{i,p}(u)N_{j,q}(v)w_{i,j}\boldsymbol{P}_{i}}{\sum_{i=0}^{n}\sum_{j=0}^{m}N_{i,p}(u)N_{j,q}(v)w_{i,j}}
```

ここで、$\boldsymbol{S}(u,v)$はパラメータu,vに対応する曲面上点、$\boldsymbol{P}$は制御点（$u$方向の個数は$n+1$、$v$方向の個数は$m+1$）、$p$は$u$方向の次数、$q$は$v$方向の次数、$N_{i,p}(u)$は$u$方向、$N_{j,q}(v)$は$v$方向の基底関数です。

[spScan](https://www.armonicos.co.jp/products/spscan/)でのNURBS曲面編集機能：
![image.png](https://qiita-image-store.s3.amazonaws.com/0/316651/f74fc29c-b544-8434-9802-5e716feda8fb.png)

# NURBSソリッド

NURBS曲面の概念へさらに1つの方向のパラメータを加えると、「厚み」を持つ曲面、すなわち、ソリッド（ボリューム）を表現できます。
IGA （Isogeometric Analysis）などの解析分野で利用されています。

NURBSソリッド（ボリューム）：
![image.png](https://qiita-image-store.s3.amazonaws.com/0/316651/881ada4e-fb56-c015-af7e-e6f60620cbb0.png)
出典：T. Martin, E. Cohen, and R.M. Kirby,“Volumetric parameterization and trivariate B-spline fitting using harmonic functions”, inComputer Aided Geometric Design, Vol. 26, No. 6, pp. 648-664, Fig. 12, (2009).

# 参考文献
数式の出典：[L. Piegl, W. Tiller,The NURBS Book, Springer, pp. 50-128, (1996).](https://www.springer.com/gp/book/9783642973857)

# 本記事のPDF版
https://www.armonicos.co.jp/hola/hola71/
LaTeXでサイコロ(6面ダイス)を表示する

#概要
LaTeXでサイコロの画像を挿入します。
TRPG関連のPDFを作成するときなんかに使えそうですね。
Windowsで動作を確認しています。

#出力結果
サイコロのデザインは以下のようになります。
![出力結果.PNG](https://qiita-image-store.s3.amazonaws.com/0/349064/5917f75e-b1c4-987a-06a7-030fe63dd62b.png)

#パッケージの準備
1. [CTANのepsdiceのページ](https://ctan.org/tex-archive/macros/latex/contrib/epsdice/)から、zipファイルをDLする。
2. zipを解凍したら、epsdice.dtx・epsdice.ins・dice.pdfを任意のフォルダに入れる。
3. コマンドプロンプトを起動、2.のフォルダに移動し、```latex epsdice.ins```を実行。
4. フォルダ内の、epsdice.cfg・epsdice.sty・dice.eps・dice.pdfを```texmf-dist\tex\latex\epsdice```に入れる(TeXLive2018利用者なら```\texlive\2018\```の下にあるはず)。
5. コマンドプロンプトを起動、```mktexlsr```を実行。

#コードの書き方
```TeX
\usepackage{epsdice}  %プリアンブルに記述

\begin{document}
\epsdice{1}           %{n}の出目の白いダイスを表示
\epsdice[black]{1}    %{n}の出目の黒いダイスを表示
\end{document}
```

#上手くいかない場合
コンパイルしたいtexファイルと同じ場所にepsdice.cfg・epsdice.styを入れておけば動きます。

#参考サイト
Colorless Green Ideas「LaTeXでサイコロを書く」
http://blog.livedoor.jp/green_idea/archives/1568129.html
HTTP Proxy 経由で Azure Storage にアクセスする (.NET Core)

# HTTP Proxy 経由で Azure Storage にアクセスする (.NET Core)

\# v12 以降は [HTTP Proxy 経由で Azure Storage にアクセスする (v12 バージョン) (.NET Core)](https://qiita.com/c-yan/items/c0ab8f6ecb6d97ca1e09) を参照.

.NET Framework の場合、System.Net.WebRequest.DefaultWebProxy を設定すれば概ね何とかなるものの、それが封じられている .NET Core の場合、対象がサポートしていないと手も足も出ない. Azure Storage Client Library の場合は手も足も出なかったわけですが、最近の版で対応が入ったのでメモ.

前提条件: Storage Client Library 9.4.1 以降であること

Storage Client Library は 9.3.x までは All in One で一つの nuget で Blob, File, Queu, Table に対応していたが、9.4.0 からは Microsoft.Azure.Storage.Blob のように4分割されたので、Update-Package WindowsAzure.Storage をどれだけしても 9.4.x にアップデートされることはないので注意.

Storage Client Library 9.4.1 のリリースノートに以下のようにある.

```
Added support for passing in a DelegatingHandler to use for HTTP calls. A chain of DelegatingHandler instances is supported, but the innermost handler must have a null InnerHandler, which will be assigned our own HttpClientHandler instance for authentication purposes. The DelegatingHandler can modify properties on the HttpClientHandler, such as Proxy. This instance will be unique to the client in that case. Not passing in a DelegatingHandler will continue to use a singleton HttpClientHandler.
```

ここでも触れられているように Proxy のプロパティが変更できる DelegatingHandler を使う. 最初にそのための DelegatingHandler の実装を作る.

```csharp:ProxyInjectionHandler.cs
using System.Net;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;

namespace Hoge
{
    public class ProxyInjectionHandler : DelegatingHandler
    {
        private readonly IWebProxy Proxy;
        private bool FirstCall = true;

        public ProxyInjectionHandler(IWebProxy proxy)
        {
            this.Proxy = proxy;
        }

        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            if (FirstCall)
            {
                var handler = (HttpClientHandler)this.InnerHandler;
                handler.Proxy = this.Proxy;
                handler.UseProxy = true;
                FirstCall = false;
            }
            return base.SendAsync(request, cancellationToken);
        }
    }
}
```

これを Client のコンストラクタに渡せば OK!

```csharp
var account = CloudStorageAccount.Parse(connectionString);
var client = new CloudBlobClient(account.BlobEndpoint, account.Credentials, new ProxyInjectionHandler(new WebProxy(new Uri(proxyUrl))));
var container = client.GetContainerReference("...");
await container.CreateIfNotExistsAsync();
```
【Rails】基本の7つのアクション

#アクションとは
ざっくり言うと、コントローラ内のメソッドのこと

###アクションを作成

```ruby:コマンド内
rails g controller コントローラ名（コントローラ名は複数形の方が良い）

#例
rails g controller samples 
# => ファイルに「app/controllers/samples_controller.rb」が作成される
```
アクションは下記コントローラ内の「def index・・・end」や「def show・・・end」部分

```ruby:samples_controller.rb

class SamplesController < ApplicationController

  def index
    #ビューに埋め込む変数を定義する（必ず「@」をつけること）
  end

  def show
    #ビューに埋め込む変数を定義する（必ず「@」をつけること）
  end

end
```

・アクションの役割：
①ブラウザに返すビューをviewsフォルダの中から見つけ出す役割
（コントローラと同名のビューフォルダから、アクションと同名のHTMLファイルを探してブラウザに返す）
②ビューに埋め込む変数を定義する

コントローラについては「[【Rails】基礎：MVCモデルについて](https://qiita.com/aiorange19/items/50dcfe4c742cc8dd624e"【Rails】基礎：MVCモデルについて")」を参照

#基本の7つのアクションの役割について
Railsには基本となる７つのアクションがある。
役割を下記の通り
（ちなみにWorksテーブル、idが１の場合を想定）

| アクション | HTTPメソッド | 役割 | URLのパス |
|:-:|:-:|:-:|:-:|
| index  |  get |  一覧表示 | /works  |
|   show|   get|  詳細表示 |  /works/1 |
|   new|   get|  新規作成 | /works/new  |
|   create|   post|  登録（新規作成して追加（保存）する） | /works/create  |
|   edit|  get |  編集 |  /works/1/edit |
|   update|   patch/put(post)| 更新  | /works/1/update  |
|   destroy|  delete(post) |  削除 | /works/1/destroy  |


###追記：CRUD
CRUDとは、C（Create）、R（Read)、U（Update）、D（Delete）。
上記の７つのアクションのHTTPメソッドは、CRUDに当てはまる。

| CRUD名 | 意味 | HTTPメソッド |
|:-:|:-:|:-:|
|  Create |  データの作成 |post/put(patch)   |
|  Read |  データの読み出し |   get|
|  Update |  データの更新 |  put(patch) |
|  Delete |  データの削除 |  delete |
M5Stackで汎用赤外線リモコンを作ってみた

# はじめに
- [赤外線リモコンデコーダ](https://qiita.com/katsumin/items/517cd9fbe66e26d72fa7)でも書いた通り、汎用リモコンの作成が目的でした。
- 本記事は、その汎用リモコン（M5Stack＋PLUSエンコーダ使用）になります。

---
# 仕様
- リモコンデータは、M5Stackに挿入されたMicroSDカード上のjsonファイル（remocon.json）に書かれている。
- 当該jsonファイルの内容をM5Stackに表示する。
- PLUSエンコーダのジョグ操作により、操作対象機器／ボタンを切り替え、ボタン押下で赤外線コードを送信。
- jsonファイルのサンプル

```json:remocon.json
{
  "regza": {
    "format": "nec",
    "custom": "bf40",
    "buttons": {
      "on": ["12ed"],
      "1": ["01fe"],
      "2": ["02fd"],
      "3": ["03fc"],
      "4": ["04fb"],
      "5": ["05fa"],
      "6": ["06f9"],
      "7": ["07f8"],
      "8": ["08f7"],
      "9": ["09f6"],
      "10": ["0af5"],
      "11": ["0bf4"],
      "12": ["0cf3"],
      "input change": ["0ff0"]
    }
  },
  "light(panasonic)": {
    "format": "aeha",
    "custom": "522c",
    "buttons": {
      "on": ["002C25"],
      "off": ["002F26"],
      "energy save": ["002D24"]
    }
  },
  "light(beamtec)": {
    "format": "nec",
    "custom": "e384",
    "buttons": {
      "on": [
        "20df"
      ],
      "off": [
        "24db"
      ],
      "favarite": [
        "2ad5"
      ]
    }
  },
  "aircon(daikin)": {
    "format": "aeha",
    "custom": "da11",
    "buttons": {
      "hot-on": [
        "0200020000",
        "0200004922"
      ],
      "hot-off": [
        "0200020000",
        "0200004822"
      ],
      "cool-on": [
        "0200020000",
        "0200003938"
      ],
      "cool-off": [
        "0200020000",
        "0200003838"
      ]
    }
  },
  "playstation(dvd)": {
    "format": "sony",
    "custom": "093a",
    "addr_bit": "13",
    "buttons": {
      "play": [
        "32"
      ],
      "stop": [
        "38"
      ]
    }
  },
  "playstation(controller)": {
    "format": "sony",
    "custom": "1b5a",
    "addr_bit": "13",
    "buttons": {
      "batsu": [
        "32"
      ]
    }
  }
}
```
---
# 完成状態
- YouTubeにアップロードしてますが、テレビ（Regza）を操作している動画になります。
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/ZudOLeslAx0/0.jpg)](http://www.youtube.com/watch?v=ZudOLeslAx0)

---
# 実装コード
- [GitHub](https://github.com/katsumin/GeneralRemocon)で公開しています。
- 開発環境は、VSCode+PlatformIOです。

---
# おわりに
- 今後の改善点
    - [赤外線リモコンデコーダ](https://qiita.com/katsumin/items/517cd9fbe66e26d72fa7)との一体化。
        - デコーダで受信した赤外線コードをjsonファイルに自動記録することで、手編集しなくてよいようにする。
    - M5Stack上でのjsonファイルのボタン名などの編集は悩ましいところ
        - ソフトウェアキーボードを実装する？
        - Webサーバ機能を持たせ、PCやスマートフォンのブラウザから入力？
Project North Start自作参考資料URL集

# Project North Starとは

自分も新米なのできちんとした説明はできませんが大雑把に言ってしまえば、
`Project North Star`とは、 Leapmotion社が製作している **OSSなARデバイス**です

**100ドル以下に抑える**ことを目標にもしており、現状そこまではいかないにせよ実際に公開されている情報をもとに作成している人たちは大体3万円強で製作しているようです。(但し`どこの家にもある3Dプリンター`を持っている前提)
Leap motion controllerだけで15,000円くらいするようなので他のパーツ意外と安い...

# 本家North Star

  **ライセンスがapache 2.0からGPLに変わりました**（参考: https://twitter.com/yamaulab/status/1091336832787218432?s=21）
  - [公式Page](https://developer.leapmotion.com/northstar/)
  - [leapmotion/ProjectNorthStar](https://github.com/leapmotion/ProjectNorthStar)
  - [github pages -- leapmotion/ProjectNorthStar](https://leapmotion.github.io/ProjectNorthStar/)
  - [Leapmotion twritter](https://twitter.com/LeapMotion)

# 簡易版 North Star

## 簡易版recipe
  - [簡易版 PROJECT NORTH STARの作り方](https://exiii.jp/2018/07/19/project_north_star_jp-2/)
  - [簡易版 PROJECT NORTH STAR VER.2の作り方](https://exiii.jp/2018/11/27/project-north-star-simplified-v2-jp/)
  - [1-10/ProjectNorthStar_1-10_custom](https://github.com/1-10/ProjectNorthStar_1-10_custom)

## 作ってみた系

  - [Leap Motion社のARヘッドセット「Project North Star」を3万円で2019年に組み立てた](https://tech.showroom.co.jp/entry/2019/01/28/175438)
  - [Project North Star 作り方まとめ](https://medium.com/@pythor/project-north-star%E4%BD%9C%E3%82%8A%E6%96%B9%E3%81%BE%E3%81%A8%E3%82%81-1b2b7d5a732f)
  - [アプリ作り、海外コミュニティ、Tips](https://drive.google.com/file/d/1CEHz1rtv-ZLiPj0NLR4OkmcnH)
  - [How to make ARHMD](https://speakerdeck.com/tesula22/how-to-make-arhmd)

## 3DoF対応

[Project North Starを3DoFにする](http://oedrum.hatenablog.com/entry/2018/12/01/162623)

## 6DoF、環境マッピング、モバイル化

日本語: https://twitter.com/supertask_jp/status/1096343037653839873

## 3Dデータ

[##簡易版recipe](##簡易版recipe)のレシピにもそれぞれ3Dデータがあります。
  - [一体印刷可能な NorthStar 外殻フレーム公開 - 月とねこ](https://ryutoai2xm.hatenablog.com/entry/2019/02/10/203918) -- update3の部品配置のまま外殻フレームワークを一体化


# その他情報

## Leap motion Controllerについて:

https://twitter.com/ikkou/status/1090210181227601920?s=20

## 部品情報

  - [ProjectNorthStar LCDパーツ - Qiita@Cj-bc](https://qiita.com/Cj-bc/items/a06fb46b309ded9c7ada)
  - [非公式(?)リフレクター販売](https://twitter.com/noazark/status/1089582371337195520?s=20)
[AWK] グループごとに連番をつける

めったにない需要でしょうが…:cold_sweat:

例えばこのようなテキストファイルがあり、

```bash:name.txt
Alice
Alice
Alice
Bob
Bob
```

名前ごとに連番をつけたいということがありました。

```bash:name_eachnumber.txt
Alice 1
Alice 2
Alice 3
Bob 1
Bob 2
```

当初はAWKでさくっとできると思っていましたが、力不足でうまくできず…
結局、下記のようにして目的の結果が得られました。

```bash
>name_eachnumber.txt     #空ファイルを作成します（必須ではない）

cat name.txt            | 
cut -f 1                | # 1列目をグループとします
sort -u                 | # AliceとBobの重複をなくします。
while read line; do     | # AliceとBobをひとつずつ回します。
grep ${line} name.txt   | # Aliceに引っかかる３行を、Bobに引っかかる２行を抽出します。
awk '{print $1,NR}' >> name_eachnumber.txt # AWKで行数を追加し、name_eachnumber.txtに挿入します。
done
```

もっと素直な書き方があると思います。
教えていただければありがたいです:pray:

=== 2019/01/31 追記 ===
@angel_p_57 さん、@jinoji さんに連想配列の使い方を教えていただきました！:bow:

```bash
cat name.txt | awk '{print $1, ++names[$1]}'
```
シンプルで素晴らしいです。感謝です。
`++names[$1]`をprintするとグループごとに番号を出力できるのですね。
もっと連想配列を勉強します…！
gem 'data-confirm-modal'でbootstrap風アラート

##準備
Bootstrapが必要なので使えるようにしておく必要があります。
##gem:data-confirm-modalをインストール
```ruby:Gemfile
gem 'data-confirm-modal'
```
```bash:bash
bundle install
```
##application.jsに追記
```ruby:application.js
//= require data-confirm-modal
```
##こんな具合に書いて
```html:index.html.erb
<%= link_to 'Destroy', user, method: :delete, data:
  { confirm: '本当に削除して良いですか?',
    cancel: 'やめる',
    commit: '削除する'}, title: '削除確認' %>
```
##railsアプリケーションを再起動する
```bash:bash
bundle exec rails s
```
##終了
これだけでdata-confirm のアラートをBootstarp風にできました。
**before**(chrome)
![alt](https://i.gyazo.com/84353903d0b0f4cf89dea10dcb51f7f4.png)
**after**
![alt](https://i.gyazo.com/29de310cbc356ede2a9a90bc3913f35b.png)

##困ったこと
chromeとEdgeでは問題ないけど、IEだとデフォルトのアラートが一緒に表示されてしまう…。
他のgemとの相互作用？

```ruby:Gemfile
ruby '2.5.3'
gem 'bootstrap', '~> 4.1.1'
gem 'jquery-rails'
gem 'data-confirm-modal'
gem 'rails', '~> 5.2.0'
```
![alt](https://i.gyazo.com/77600f77f24d12b5995b70035993dbda.png)
二分探索を使って問題のあるソースコードを絞り込む

# 二分探索とは

探索対象のデータを2つに分割しながら探索するアルゴリズムの一種です。
ソースコード上のどこでバグが発生しているのか、効率的に絞り込む方法として使えます。
アルゴリズムなどと言うとかっこよく聞こえますが、とてもシンプルで泥臭い作業です。

# 手順

<img width="629" alt="スクリーンショット 2019-01-30 22.05.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/127338/ffef9c36-9385-da4a-b96b-67f9d97504b5.png">

1. 対象のコードを半分コメントアウト
2. 実行
2. バグが出ればもう半分をさらに2分割してコメントアウト
3. 実行
4. バグがでなければコメントアウトをはずし、もう半分をコメントアウト
5. 実行
6. ...

上記を、バグを特定するまでくりかえします。

# どんな時に使うのか

- ログがない。
- 対象のコードが異常に長く、読む気になれない。
- ソースコードを実行でき、バグが再現できる。