OmniAICreator/Qiita-1.07M huggingface dataset:
Jmeterメモ：レスポンスの戻り値から値を取得して、次のリクエストのパラメータとして使う

# やりたい事

「二つのPOSTリクエストを送って、1個目の戻り値を2個目のパラメータとして送信」がしたい。使うツールは、「Apache JMeter」と決まっている。
レスポンスは、Bodyにあって、Json形式ではあるが、テスト計画は自分以外のチームメンバーも実行できる必要があるので、JMeterにプラグインを入れたりするなどの手間は最小限に抑えたい。

もう少し具体的に：
「あるデータの保存処理から戻った「保存データID」の値を別のAPIに渡して保存させる」という流れのテストがしたい。
面倒なことに、「保存データID」にはユニーク成約がかかっていて、JMeterが向いているサーバのDBは、他の箇所からも参照されいてるのでそのIDを連番にするとかDBを先に空にするとかはできないという制約もあります。
また、実際に実装されている状態に一番近いテスト計画を組みたくて、APIを順番に呼び出し、戻り値をパラメータとして渡すのは、理想でした。

## 実際のやり方

大枠を説明すると：

1個目のリクエストを投げた後、その戻り値から正規表現を使って取得したいデータを取得し、次のリクエストのパラメータとして使えるように一時的に保管させます。

## テストしたかったAPIの戻り値とパラメータサンプル

1個目のリクエストの戻り値例：

```
{"result"::{"id":130}}
```

2個目のリクエストで送りたいパラメータ例：

```
data_filer=sample&contact_master_id=130
```

2個目のcontact_master_idとして、1個目の「id」が入らないと、正しいテストができない仕様です。

## JMeterで実際にテスト計画を作る

### スレッドグループを作る

JMeterでリクエスト間でパラメータの受け渡しを行うためには、該当リクエストを「スレッドグループ」として設定するといいと思います。そうしなくても動作はできますが、一つのスレッドグループに何もかもを入れてしまうと、実行されているテストが多くなった時整理や修正が大変になります。
スレッドグループのネーミングは、日本語も使えますが、ローマ字にした方がよいです。なぜかというと、日本語にした場合、パラメータの受け渡しが正常に動作しないなど、想定外なところで困ったりするからです。
スレッドグループを設定したら先ずは1個目のリクエストをいつも通りに設定します。POSTでもGETでも、戻り値が存在している限りなんでも大丈夫です。

### レスポンスから値を取得する：bodyの内容から正規表現抽出

1個目のリクエストを設定して動作確認したら、リストのリクエスト名を右クリックして「追加」→「後処理」→「正規表現抽出」という項目を追加します。
追加したら、細かく設定をしていく必要があります。

例にあるレスポンスの場合、画像のような設定になります。

![Image 006.png](https://qiita-image-store.s3.amazonaws.com/0/155732/b3085754-71fe-91dd-0c51-c9e2adf22499.png)

まずは「参照名」として、2個目のリクエストで保管した値を呼ぶ時の変数名を設定して、取得するための正規表現を書いていきます。取得元はbodyの内容なので、「Field to check」としては「Body」を選択します。
次に、使う値を取得するための正規表現を実際に書きます。例の場合、Json形式の内容からid:に続くデータが取得したいので、例えばこういう書き方が出来ます：

```
"id":(.\d+)
```

正規表現で取得された値は一つとは限らないので、どの値を使うかなどの設定も必要です。
「テンプレート」とは、取得された値のグループ指定に使われる設定です。
取得値が保管されている変数には、取得された全ての値（アトリビュート）がグループ化され保管されています。複数のアトリビュートを取得する場合、「指定した変数名_g1」「指定した変数名_g2」という風に内部で管理されていて、どのグループを使うか「テンプレート」設定で決めます。
「$1$」→　一つ目のグループ、「$2$」二つ目のグループです。ちなみに「$0$」は、全てのグループを返す設定です。
私の例の場合は、アトリビュートがそもそも1つなので、「テンプレート」設定値は「$1$」で十分です。
「一致番号」は、使う値の番号で、1個目なら「1」です。ここで「0」は、ランダムを意味します。

最後には、値が取得出来ない場合、変数に保管されるデフォルト値が設定出来ます。右のチェックボックスにチェックをいれたら、デフォルトが空になりますが、取得がうまく出来ていないのか、適用ができてないなかなど、テスト計画の検証がややこしくなるので、該当APIなどが絶対失敗するような値をデフォルト値として設定することをおすすめします。私の場合は、integerを期待しているAPIなので、「incorrect-id-value」という文字列を設定しました。

### 取得した値を別のリクエストで使う

最後に、2個目のリクエストを通常通り設定したら、使いたいパラメータの値を以下のように設定するだけです：

```
data_filer=sample&contact_master_id=${contact_master_id}
```

※「data_master_id」は、参照名として設定した文字列です。

設定はこれで以上です。
ROS indigoのインストール・ワークスペース作成

#はじめに
この記事ではROSの

+ バージョンindigoのインストール方法
+ ワークスペース作成方法
+ パッケージ作成方法

の3点について説明します。

ROSをインストールしてプログラムを作成する前までの必須の過程です。
特にROSを利用するにあたりパッケージ作成はよく行うので覚えておきましょう。

##環境
ROS : indigo
OS  : Ubuntu 14.04
参考ページ : http://wiki.ros.org/indigo/Installation/Ubuntu

#インストール手順
packages.ros.orgからソフトウェアをインストールするための設定

```
$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu trusty main" > /etc/apt/sources.list.d/ros-latest.list'
```

鍵の設定

```
$ wget http://packages.ros.org/ros.key -O - | sudo apt-key add -
```

アップデート

```
$ sudo apt-get update
```

インストール

```
$ sudo apt-get install ros-indigo-desktop-full
```

rosdep初期化

```
$ sudo rosdep init
$ rosdep update
```

bashrcにsetup.bashを読み込むように設定しておく

```
$ echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc
$ source ~/.bashrc
```

rosinstallのインストール

```
$ sudo apt-get install python-rosinstall
```

#ワークスペース作成
ROSのワークスペースの作成を行います。
また、現在のシェル環境をsourceを使って変更してください。

```
$ mkdir ros_ws/src
$ cd ros_ws
$ source /opt/ros/indigo/setup.bash
```

ここでcatkin_makeを行います。
catkin_makeはビルドの度に使うので覚えておきましょう。
初回でcatkin_makeを行うと必要なファイルとディレクトリの作成が行われます。

```
$ cd ~/ros_ws/
$ catkin_make
```

catkin_make後のファイル階層
ros_ws
|--build
|--devel
|--src

+ build : ビルドに関する設定など
+ devel : 実行ファイルなど
+ src : ユーザがソースコードを保存する場所

これでワークスペースの作成は終了です。

#パッケージの作成
ROSでは任意の機能をつめたソフトウェアの集合をパッケージといいます。
何か新しいプロジェクトなどを作成する際には必ず行うと考えて良いでしょう。
パッケージの作成にはcatkin_create_pkgを使います。

```
$ catkin_create_pkg [パッケージ名] [depend1] [depend2] ...
```

例えばros_startというパッケージ名、依存関係を持たせるパッケージはpythonとstd_msgsだとしたらこのようになります。

```
$ cd ~/ros_ws/src
$ catkin_create_pkg ros_start std_msgs rospy
```

使用言語がC++の場合はrospyではなくroscppとなります。
最後にワークスペースでcatkin_makeを行いましょう。

```
$ cd ~/ros_ws/
$ catkin_make
```

これでROSのプログラムの作成を行うことができます。


#おわりに
次回は簡単なプログラム作成を行います。
ReactNative で Text のフォントを serif 体にする

Text フォントを serif体、日本語でいうところの明朝体にするには、fontFamily に適切なフォント名を指定する必要があります。

Android は様々な機種があるので、搭載されているフォントが機種によって異なるせいか、一般フォント名に対応しています。よって、fontFamily に、単に serif と指定すれば事たります。

iOSは、Apple が販売している端末しかないせいか、一般フォント名に対応していません。よって、fontFamilyには iOSに含まれている明朝フォント名を指定する必要があります。
iOSに含まれているフォントに関しては、[こちら](https://qiita.com/lovee/items/6048bf780558517e72e6)の記事などを参考にしてください。

最終的に、Platform モジュール使用して、次のように style を設定すればOKです。

```
<Text style={{fontFamily: Platform.select({ios:'HiraMinProN-W3', android: 'serif'})}}>Hogehoge</Text>
```
[自動制御] プログラマと自動制御

<p>卒業研究のタイトルは『拘束のある力学系の制御に関する研究（先端が限定された面上を動くマニピュレータの運動制御の基礎研究）』だったビッツの村上です。全く制御から離れたmacOS/iOSのアプリケーション・プログラマをやっているのだが、今回は、思い切った制御工学に挑戦する。</p>

<p>学生時代から言われたいたのは、制御工学は使われていない。確かにそのようだ。</p>

<p>最初の仕事は人工心肺装置の企画なのだが、病院研修で心臓外科のオペの手伝いをやっていた。心臓手術は心臓に戻ってきた血液を人工心肺装置が取り込み、それを心臓の出口に返して心臓に血液が流れない状態にして行うのだが、循環している血液を冷やすと心臓は止まり、オペ終了時に血液を温めると心臓は動き出す。この血液の温度の調整を水槽で行うのだが、これは、指定された温度になるとヒータが止まり、下がるとヒータがつく。そう、自動制御をやっている方はお分かりだと思うが発信する。これはそういうものだということで特に改善されることはなく、自動制御の出番はなかった。</p>

<p>その後に選んだ職業がプログラマ。またまた、書店で手に取った『神経回路網の数理』に興味を持ち、電子計算機の世界に飛び込んだ。</p>

<p>あるギネスにも載っている巨大なゲートウェイシステムの構築に関係した際のことだ。自分は方式Gというアーキテクトを扱うチームに配属されたのだが、そこで行なっていた流量制御はこんな感じだ。予想される処理コストを決定し、それで性能測定を行い。その値で流量を規制する。そう、ここでも自動制御は活用されていない。予想が外れると性能限界を超えてしまった。内心フィードシステムだ！と思っていたのだが、学生時代に習ったことをプログラミングで、どう表現すればいいのか分からない。</p>

<p>そんな自分にとって、これはと思ったのが、オライリー社の『エンジニアのためのフィードバック制御入門』だ。まえがきに、しっかりと書かれている。自動制御を行うためには電子計算機の力が必要だ。でも、プログラミングの現場では、自動制御が疎遠となっている。この書籍は、この問題に対しての著者からの回答で、ソフトウエアの世界の出来事を自動制御の対象として適用する例が豊富となっている。</p>

<p>また、使っているのもPythonとgnuplot。学生時代、大型計算機でFortranでリカッチ方程式を解いていたのは何だったのか？手元のMacBook Proで演算できちゃいます！</p>

<p>ちなみに、ひねくれ者の自分は、書籍の通り動かすのではなく、SwiftとAccelerate Frameworkを使って、挑戦している。</p>

関連情報
<a href="https://amazon.jp/dp/4873116848">エンジニアのためのフィードバック制御入門</a><br />
<a href="https://qiita.com/advent-calendar/2017/cocoa">Cocoa Advent Calendar 2017</a><br />
<a href="https://cocoa-kanto.connpass.com">Cocoa勉強会 BUKURO.swift (connpass)</a><br />
<a href="https://atnd.org/groups/cocoa-study">Cocoa勉強会 BUKURO.swift (ATND)</a><br />
<a href="http://cocoa-study.peatix.com">Cocoa勉強会 BUKURO.swift (Peatix)</a><br />

【Cocoa練習帳】
<a href="http://www.bitz.co.jp/weblog/">http://www.bitz.co.jp/weblog/</a><br />
<a href="http://ameblo.jp/bitz/">http://ameblo.jp/bitz/</a>（ミラー・サイト）<br />
<a href="https://t.co/6P3h2jtbRk>note</a><br />
<a href="https://qiita.com/m_yukio>Qiita</a><br />
やはりお前らのマサカリは間違っている、あるいは正しいマサカリの投げ方について

# マサカリとは

愛である。

伝わる保守しやすいコードへの愛、チームへの愛、製品への愛、そういった想いの発露としてマサカリがあります。よってマサカリの投げ方受け止め方を学ぶことは、技術者間のコミュニケーションを促進し良いものを作ることに役立ちます。

# マサカリを投げるコツ

1. マサカリは大工道具
2. ブーメランを恐れない
3. 不安なら経験者の監督下で

## マサカリは大工道具

マサカリは大工道具であるからにして、建設的議論のきっかけであるべきです。

実現不能なこと、真偽で語れないこと、データで測れないこと、ルール化されていないことを細かくつっこむのは無意味です。
俗に言う宗教論争は大工の守備範囲外と心得ましょう。いち技術者として、他の技術者に対する気遣い、永く製品を保守するためのこだわり、堅牢かつ高速に造り上げるための工夫について語りましょう。

個人・人格の攻撃は論外です。それがたとえ事実だとあなたが思っても攻撃してはいけません。
建設の道具たるマサカリは人ではなくモノそして問題に対して使うものと肝に銘じましょう。クソコードを書いた人ではなくクソコードが生まれた背景に注目し、書き手や組織が学習し再発を予防するきっかけを作りましょう。

## ブーメランを恐れない

長い人生、自分の投げたマサカリがブーメランとなって戻ってくることは多々あります。自分の保守しているコードにひそむ問題と同じものをほかのプロジェクトで見つけてしまうこともあるでしょう。

ブーメランがこわくなったら、マサカリの基礎に立ち返ってください。マサカリにおいて大切なのは理想を提示すること、具体的な改善案を出すこと、コードをより良くすることです。
自分ができているか否か、今後やらかすか否かは関係なく、提供できるものがあるなら伝えることが肝要です。自分のことを棚に上げてしまえば、ブーメラン恐るるに足らず。

## 不安なら経験者の監督下で

自分から提示できるものがあったとしても、それが正しいかどうか自信を持てず言うのを躊躇うこともあるでしょう。しかし誤りを言うことをおそれて何も言わないのは非常にもったいないと言えます。
マサカリが育むものはコードであり製品でありチームです。失敗を恐れて口を噤むことが普通になれば、これらのものが成長する機会が大きく損なわれます。

オススメは自分が間違ったら訂正してくれる経験者の監督下で投げることです。監督を依頼する相手は、周囲から尊敬されているコードレビュアーが良いでしょう。指摘の方法、説明の工夫、代案の提示など、様々な面で投げ方の改善を提案してくれるはずです。

# マサカリの受け止め方

素晴らしいスライドがあるので割愛します。

* https://www.slideshare.net/mobile/re_3_19/ss-34793007

つまり建設的意見であれば真摯に受け止め、そうでないものはスルーすれば良いのです。
マサカリは愛ですが愛情を素直に表に出せない人は一定数いるので、言葉が鋭くてもあまり気にすることはありません。
初心者エンジニアがたどり着いたテスト仕様書の書き方

## テスト仕様書？
自分がコードを書いた部分が本当に正しく動作しているかをチェックする項目のリストです。
会社に入社するまでここまでガッツリとテストをしたことがなかったので、自分メモも兼ねて公開してみます。


## テスト項目

テスト項目は「正常系」「準異常系」「異常系」でテストします。

### 正常系
想定通りの動作をすることを確認します。
例：購入ボタンを押すと、購入完了画面に遷移する


### 準異常系

準正常系とも。
ユーザが故意に想定外のアクションを起こした時に、きちんとエラーとして処理できるかを確認します。
例：登録確認画面で、フォームのhiddenパラメータをブラウザの開発者ツールで書き換えて送信してきた


### 異常系
システムのトラブル時に、システムダウンで繋がらなくなるのではなく、エラーとして処理できるかの確認
例：DBのテーブル名をわざとリネームし、エラーが起こった時にメッセージが表示されるか


## 浅い経験で作ったテスト仕様書
今のところ、次のようなエクセルファイルを作成し、テストを行っております。
意外とこれがしんどいテストをゲーム感覚でやらせてくれるのでハマっております。

![a.jpg](https://qiita-image-store.s3.amazonaws.com/0/63338/896bfbfa-01b7-06a9-1cc8-1b2ed5487e2b.jpeg)

このエクセルファイルは、ブログの方で配布させていただいておりますのでよろしければどうぞ。
https://nnahito.com/articles/14
テレビでよく見る"あの画像"生成アプリを作ってみた

# 作ったもの
テレビ(ニュース番組)でよく見る速報テロップを画像を生成できるiPhoneアプリ📱
![Icon-29@3x.png](https://qiita-image-store.s3.amazonaws.com/0/126118/0f334022-63cf-4f14-5e67-d04fe9867500.png)
[Sokuhoh Camera](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwj8_qaRkPrXAhWIpJQKHbqXD8EQFggnMAA&url=https%3A%2F%2Fitunes.apple.com%2Fjp%2Fapp%2Fsokuhoh-camera%2Fid1238181911%3Fl%3Den%26mt%3D8&usg=AOvVaw2cbs1u7G5pPPiqSwQd7P45)

# なぜ作ろうと思ったか
秋篠宮家の長女・眞子さまが大学時代の同級生である小室さんと婚約されると今年5月に報道されたのは記憶に新しいと思います。
そんな当時ニュース番組が小室さんの日常的な動向を速報ニュース化し、話題になったのを皆さん覚えていますか？

[眞子さまと婚約した小室さんの動向が一々「速報」で報道される理由が判明ｗｗｗｗｗ](http://jin115.com/archives/52177210.html)

小室さんが自宅を出たり、勤務先に到着したりするだけで速報テロップが出るのはなかなかシュールで、こんな速報テロップを好きな画像に簡単につけることができたら面白いなと思ったのが作った理由です😇

# 使い方
1. 今すぐ作成をタップ
![IMG_0027.PNG](https://qiita-image-store.s3.amazonaws.com/0/126118/579f4ce7-9ac0-0433-7b03-59f7ac777f48.png)

2. 撮影
![IMG_0035.PNG](https://qiita-image-store.s3.amazonaws.com/0/126118/7672769c-93d5-240d-085a-96ed3e0a30c5.png)

3. タイトル入力
![IMG_0038.PNG](https://qiita-image-store.s3.amazonaws.com/0/126118/13cc8a75-3fef-e308-d4e4-271f33b0d958.png)

4. That’s it.
![IMG_0037.JPG](https://qiita-image-store.s3.amazonaws.com/0/126118/e148063e-6997-e0cc-da48-c7787a6a7515.jpeg)


# 作成時間
4時間(デザイン+開発)

# まとめ
Twitterを見ているとSokuhoh Cameraを使ってる人が割といて楽しんでもらえているようでよかったです🙂
Sokuhoh Cameraは5月にリリースしたのですが、リリース後にロケットニュース24さんに取り上げていただきました笑

[【速報】簡単に「速報風画像」の加工ができるアプリ『Sokuhoh Camera』が面白い！ 何でもない画像がドラマチックになるぞ!!](https://rocketnews24.com/2017/05/25/905649/)

👆の記事からの流入は結構あったと思うので非常にありがたかったです。
よかったらアプリダウンロードしてみてください！！！
ExcelのオートフィルタをVBAでちょっと便利に

## 使い方
オートフィルターがかかっているシートで、絞り込みたい値のセルを選択し、
キーボードの[END]キーを押すと、部分一致で絞り込む
もう一度押すと解除する

![Caputure.gif](https://qiita-image-store.s3.amazonaws.com/0/164214/c6cb2426-65fb-1b4f-70d7-d297b49cce9e.gif)


##コード
```ThisWorkbook.cls
Option Explicit

Private Sub Workbook_Open()
    Application.OnKey "{END}", "ThisWorkbook.FilterOnOff"
End Sub

Sub FilterOnOff()
    Dim a As AutoFilter, c As Long, v As String
    With ActiveCell
        Set a = .Parent.AutoFilter
        If a Is Nothing Then Exit Sub
        c = .Column - a.Range.Column + 1
        If c < 1 Or a.Filters.Count < c Then Exit Sub
        v = "*" & .Value & "*"
    End With
    With a
        If .Filters(c).On Then
            .Range.AutoFilter c
        Else
            .Range.AutoFilter c, v
        End If
    End With
End Sub
打倒、方眼紙アプリ! ヒアドキュメント + sqlite でcsvの加工が捗るtips


[株式会社ビズウインド](https://qiita.com/organizations/bizwind)の@nassy20 です。

ご縁あって、[株式会社オズビジョン](http://www.oz-vision.co.jp/) 様に、アドベントカレンダーに招待頂きました。 
がんばるぞい٩(՞ਊ՞)۶

## この記事は、何の話？
皆さん、手動でcsvの加工する場面はよくあると思います。
本番データ解析のためにcsvからデータを抜き出したり、テストデータ作成だったり。
そんな時のcsv加工がちょっと楽になるかもしれないtipsのお話です。

## 何をどうやるの？
加工したいcsvをsqliteに放り込んで、
加工コマンドを叩いて、csvをアウトプットするだけなの処理ですが、
ヒアドキュメントも組み合わせると半自動化できるアイデアです。

## 具体例
下記、コマンド群は普段利用しているものです。

nkf、sqlite3をinstallした上でzshで実行しています。
また、カレントディレクトリにcsvが置いてある必要があります。

Backlog(プロジェクト管理ツール)から出力したcsvを変数に指定して実行するだけで、
指定カラムのみが記載されたcsvが出力されます。


```zsh
csv=Backlog-Issues-20171102-1943.csv

nkf -w --overwrite ${csv}
sqlite3 << EOS
.separator ,
.import ${csv} item
.headers on
.mode csv
.output 作業実績.csv
-- ↓csvに出力したい内容をselect 
SELECT キー,件名,状態,予定時間,実績時間 FROM item;
-- ↑csvに出力したい内容をselect 
.exit
EOS
```

## 推しポイント
- 定形作業でなくても、部分的に修正してterminalに流し込むだけで利用できるところ

## sqliteを使う理由

- 加工データが大量でも一瞬で処理してくれるから
- update文を流してデータ修正が出来るから
- データのつけあわせなどをしたい時にjoin句が使えるから
- エクセルなどよりも早く柔軟に加工出来るから

## ヒアドキュメントを使う理由

- sqliteへの入力内容が動的に変更出来るから

## ヒアドキュメントやsqliteについての参考URL
ヒアドキュメントやsqliteの概要を把握するのに役立った記事です。

- [今すぐSQLite入門。知っておくべきたった5つのこと。 - ギリギリギリギリジンジン ギリギリギリジンジンジン](http://d.hatena.ne.jp/grgrjnjn/20110401/1301669692)
- [bashのヒアドキュメントを活用する - Qiita](https://qiita.com/take4s5i/items/e207cee4fb04385a9952#%E8%A6%81%E7%82%B9)

明日は気高きvimmerの @oz-urabe さんからの掲載予定です。
ぜひ明日もご覧ください。
Pythonで翌日や翌月みたいな日付の計算をする

表題の通り。自分用メモ
環境はPython3系。

# 日にち単位の演算(翌日とか)
- 今日の日付取得
- 明日、昨日の計算

### 必要なモジュールのインポート

``` python
from datetime import datetime, date, timedelta
```

基本これくらいあればいい

### 今日の日付を取得する

``` python
today = datetime.today()
print(datetime.strftime(today, '%Y-%m-%d'))

# 結果
# 2017-12-08
```

#### (補足)
- datetime.strftime(変数, フォーマット)：日付型→文字列への変換
- datetime.strptime(変数, フォーマット)：文字列→日付型への変換


### 明日、昨日を計算する

``` python
tomorrow = today + timedelta(days=1)
yesterday = today - timedelta(days=1)

print("tomorrow -> " + datetime.strftime(tomorrow, '%Y-%m-%d'))
print("yesterday -> " + datetime.strftime(yesterday, '%Y-%m-%d'))

# 結果
# tomorrow -> 2017-12-09
# yesterday -> 2017-12-07
```

#### (補足)
- timedeltaオブジェクトは二つの日付や時刻間の差を表す
 - timedelta(days=1)というオブジェクトは1日分の差を表す
 - 他にはseconds, minutes, hoursみたいな引数が使える

# 月単位の演算(翌月とか)
datetimeでは計算できないのでdateutilライブラリのrelativedeltaモジュールを使用する。
上記に加えてyear, month, weekとかも使えるのでこれ使えば上記の計算も全部賄えるっぽい。


### 必要なモジュールのインポート

``` python
from dateutil.relativedelta import relativedelta
```

### 1ヶ月後、1ヶ月前を計算する

``` python
one_month_after = today + relativedelta(months=1)
one_month_ago = today - relativedelta(months=1)

print("one_month_after -> " + datetime.strftime(one_month_after, '%Y-%m-%d'))
print("one_month_ago -> " + datetime.strftime(one_month_ago, '%Y-%m-%d'))

# 結果
# one_month_after -> 2018-01-08
# one_month_ago -> 2017-11-08
```

# 応用
ココらへんを応用すれば"初日や末日"みたいなのも計算できる。

### 「今月の1日」を出す
``` python
first_day = today.replace(day=1)
print(datetime.strftime(first_day, '%Y-%m-%d'))

# 結果
# 2017-12-01
```

### 「今月の末日」を出す
``` python
last_day = (today + relativedelta(months=1)).replace(day=1) - timedelta(days=1)
print(datetime.strftime(last_day, '%Y-%m-%d'))

# 結果
# 2017-12-31
```

#### (補足)
- datetimeオブジェクトのreplace()メソッドにday=◯を指定することでその値を置き換えられる
- calenderパッケージを使えばもっと楽にできる（特に末日…）


# 参考文献
[[Python] 1ヶ月後や1年後や月初や月末を簡単に求める（python-dateutil）](http://www.yoheim.net/blog.php?q=20160409)
[Python で前月同日・前月末日を求める](http://d.hatena.ne.jp/blaue_fuchs/20110814/1313310157)
[strftimeとstrptimeの違いは何でしょうか？](http://docs.pyq.jp/help/quest/quest_help_strftime_strptime.html)
仮想環境（homestead）なlaravelでfacebookログイン

なんども挫折してきたLaravelの学習記録です。
バージョンは5.5？　違いがあるのかは知らないですけど。
以前はphpのフレームワークが真面目に意味わかんなかった（ルーティングとか）けど、WPいじって少しは理解が進んだのでいけるといいなあ。

#準備
参考にしたのはこちら。

> [【Laravel超入門】開発環境の構築（VirtualBox + Vagrant + Homestead + Composer） - Qiita](https://qiita.com/7968/items/97dd634608f37892b18a#%E3%82%A8%E3%83%A9%E3%83%BC1ip%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%81%BE%E3%81%9F%E3%81%AF-homesteadapp-%E3%81%A7%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%97%E3%81%A6%E3%82%82%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84)

感動的なくらいわかりやすかった。

根本的なところから説明されているので、この手の手順でありがちな『何かできたらしいんだけど何ができたのかわからない』とか『そもそも何をしようとしていたのかわからなくなる』ということがなかったです。

自分も資料を作るならこのレベルを目指さねば……。

やったこととしては、VagrantとVirtual　Boxで仮想環境作って、Laravelの環境作って、ってそれだけ。

##環境構築後、ブラウザでエラー。
ブラウザで表示しようとしたところ、Laravelの画面ではなくエラーメッセージが出ました。

    No input file specified.

検索したらあっさり解決。

> [homestead upした後No input file specified.と表示されました - Qiita](https://qiita.com/pugiemonn/items/0ccfd4749f276ff84ee6)

Homestead.yamlで指定した場所にindex.phpがありませんでしたので、適当に探して、そこを指定するように変更しました。


#ログイン
**さて、遅まきながらなんですが、やりたいことはFacebookでのログインの実装になります。**
Laravel関係ないという噂。

> [[ Laravel ]facebook Loginを実装する - Qiita](https://qiita.com/bohebohechan/items/421f30e0112f6b7a566b)

読んだんですがよくわからず。
わからないなりに実装を進めました。

##Facebookアプリ
ちょいちょい日進月歩で仕様が変わっているみたいで、情報が錯綜してました。
最近必要項目が増えたみたいです。

**あと、なぜか項目が全て英語表示で泣いてたんですが、Facebook側で言語を日本語（関西）にしているとDevelopersが関西できないため英語表記になるようです。**
普通の日本語にするとちゃんと日本語表記になりました。
（まあ、その日本語の文言もちょいちょい変わってて焦るんですけど……）

やったことはこんな感じです。

- アプリをFacebookログインを指定して追加。
- 設定 > ベーシック
    - アプリIDとapp secretを取得
    - アプリドメインを追加（localhostとかIPはだめなので、hostsいじって適当な名前を割りあてればOK）
        - プラットフォームで指定したドメインのみ設定可能
    - プラットフォーム（ウェブサイト）を追加
        - ついでにクイックスタートを見てみたりもした
- プロダクト > Facebookログイン > 設定
    - 有効なOAuthリダイレクトURIにcallback先のアドレスを指定する
        - これが最近追加されたらしくて、古い記事だとここなかったりする
    - ウェブOAuthログインを「はい」にする

###クイックスタート
指定されたdiv要素を、resources/viewsにあったwelcome.blade.phpに適当に埋め込んだらこんな感じになりました。不自然。

![スクリーンショット 2017-12-08 10.07.24.jpg](https://qiita-image-store.s3.amazonaws.com/0/214031/74030135-4b6c-131b-fa1a-051aba9184e1.jpeg)

###他の項目について
ネームスペース、プライバシーポリシーのURL、サービス規約のURL、アプリアイコン、カテゴリは無視して大丈夫でした。

##以降の設定
テキストの中身をいじっていきます。
似たような雰囲気の場所を探して、テキストを追加しました。

一点、

    Http/Controllers/Auth/SocialController.php

は

    app/http/Controllers/Auth/SocialController.php

でした。
場所変わったんでしたっけ？
あと、このSocialController.php（とその次のlogin.blade.phpもだったかな？）というファイルがなかったので、新規作成しました。


#コールバック
ログインはできましたが、コールバック先を作成していないので怒られます。

    Sorry, the page you are looking for could not be found.

ルーティングを見てみたところ、またパスが違ってました。

    auth/login
    auth/login/facebook
    auth/facebook/callback

これはこれでいいのか、揃えるべきなのか……どっちなんでしょう。

うーん。
ひとまず簡単な方ということで.envと、FacebookアプリのリダイレクトURLを修正したところ、ようやっと期待通りの挙動をしてくれるようになりました。

これをどうするんだろう。
DBにほうり込みつつ、ログイン後のページとかにリダイレクトすればいいんですかね。
たぶん。

ひとまず今回はここまで！！
Swift Embedded Framework の導入

Xcode6, iOS8から、"Embedded Framework" が使えるようになった。

そもそも、"Framework" は "Static Library" と比較して、コードだけではなく、画像やStoryboardなどのリソースも含める事ができるというメリットがあったが、さらに "Embedded Framework" としてプロジェクトに導入することで以下のメリットがあり、その恩恵は非常に価値が高いと思われる。

1. **コード共有**
機能を "Framework化" することの最大の目的と利点はなんといってもコレであろう。さらに、"Embedded Framework" はターゲット間でコードを共有する仕組みなので、"Apple Watch" や "Widget" に対応するために "WatchKit Extension" や "Today Extension" をプロジェクトに追加した場合に、機能の共有化が容易にできる。

2. **レイヤー分割と依存関係の強制**
"Embedded Framework" により機能がレイヤー分割され名前空間も分かれる。また、依存関係を明確にすることができるようになるので、コードが簡潔になる。

3. **ビルドパフォーマンスの向上**
上記の "レイヤー分割と依存関係の強制" により、Xcodeの差分コンパイルの適応スコープが小さくなり、ビルド時間が短縮される。

4. **テストの分割**
ターゲット毎にテストが追加されるので、ターゲット単位でテストを記述することができる。

## Embedded Framework の導入

1. Xcodeのツールバー "File" → "New" → "Target"、もしくはプロジェクト "General" から "Add a Target"。
![スクリーンショット 2017-12-08 20.38.42.png](https://qiita-image-store.s3.amazonaws.com/0/151693/b3a5ac03-a521-6e66-c582-2efe79906662.png)

2. "Cocoa Touch Framework" を選択。
![スクリーンショット 2017-12-08 20.41.50.png](https://qiita-image-store.s3.amazonaws.com/0/151693/84237af6-165e-e9d8-9fba-0507612cd039.png)

3. フレームワーク名を入力し、"Finish"。

すると、以下のようにターゲットとフォルダが追加される。(今回は "Purchase" Frameworkを作成)
新しくできたフォルダにFrameworkのコード、およびリソースを追加していく。

![スクリーンショット 2017-12-08 20.48.18.png](https://qiita-image-store.s3.amazonaws.com/0/151693/403897cb-f790-ffa1-321f-48219df86d60.png)


購入処理機能を共通化した"Purchase" Frameworkは以下のようになる。(実装は割愛)

![スクリーンショット 2017-12-08 21.58.05.png](https://qiita-image-store.s3.amazonaws.com/0/151693/4b49dda2-cdeb-8f32-ec67-c097a5261a5f.png)

"Purchase" Frameworkを使用したい場合は、対象のファイルで```import Purchase```とするだけだ。

![スクリーンショット 2017-12-08 22.03.25.png](https://qiita-image-store.s3.amazonaws.com/0/151693/9b4f833a-bf6e-a78b-f570-e0e273d43011.png)


## Embedded Framework によるレイヤー分割

以下のように、"Model", "Request" をFramework化し、レイヤー分割しておけば、依存関係の整合性を保ちやすく、不適切な参照も起きにくくなる。また、先に述べたように "WatchKit Extension" や "Today Extension" と紐付けることで、Application側と "Model", "Request" を共有することが可能となる。

![スクリーンショット 2017-12-08 22.18.09.png](https://qiita-image-store.s3.amazonaws.com/0/151693/b3f83676-7b7c-d95f-0560-82d9cb008d87.png)

## 終わりに

"Embedded Framework" の導入は、簡単かつ有用性が高いので、積極的にプロジェクトに取り入れていきたいと思っている。
本記事を読んでくださったiOSアプリエンジニアの方々にも、是非お試しいただきたい。
pythonとnumpyで行列を自由に操る!

#まずは行列を作ります！

```py3
arr= np.array([[1,2,3],
               [4,5,6],
               [7,8,9]])

print(arr)
"""
[[1 2 3]
 [4 5 6]
 [7 8 9]]
"""
```

ちなみに、tupleでリストの中にリストを作る方法だとデータ型がリストのまんまで行列にならないので注意してください！

```py3

arr= ([[1,2,3],
       [4,5,6],
       [7,8,9]])

print(type(arr)
#list

arr.dtype
#AttributeError: 'list' object has no attribute 'dtype'

arr= np.array([[1,2,3],
              [4,5,6],
              [7,8,9]])

type(arr)
#numpy.ndarray

arr.dtype
#dtype('int64')
```

#スライスを使って、2,3,5,6だけを取り出す！

```py3
arr[:2,1:]

"""
array([[2, 3],
       [5, 6]])
"""
```

検証してみましょう！

```py3
arr[:2]

"""
array([[1, 2, 3],
       [4, 5, 6]])
"""

```

これで、3番目までのリスト(1番目と2番目)を取り出せます！
この方法を使って、後は2番目から([1:]として)取り出せば良いのですね！


###ちなみに、

```py3

arr[:2][1:]
#array([[4, 5, 6]])
```

このように指定すると、最初の[:2]で3番目までのリスト(1番目と2番目)を取り出して、[1:]で2つのリストから2番目のリストを取り出すようになってしまうのでご注意ください！

#おわりに

まだまだ使いきれてないですが、便利なやり方を見つけたら随時更新してまいります！
イケてる方法等あれば、教えていただけますと幸いです！
Eigen内部の警告

今まで線形代数周りの計算は自前で行っていたのですがEigenで行うようにしてみました
ところがビルドしてみると警告が3つ

`comparing floating point with == or != is unsafe [-Wfloat-equal]`

```c++:Eigen/src/Core/arch/CUDA/Half.h
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator == (const half& a, const half& b) {
  return float(a) == float(b);
}
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator != (const half& a, const half& b) {
  return float(a) != float(b);
}
```

`Member 'x' was not initialized in this constructor`

```c++:Eigen/src/Core/arch/CUDA/Half.h
struct __half {
  EIGEN_DEVICE_FUNC __half() {} //この行
  explicit EIGEN_DEVICE_FUNC __half(unsigned short raw) : x(raw) {}
  unsigned short x;
};
```

これは...
浮動小数点の等価比較をライブラリがしてしまうのか...(困惑)

警告を無視し続けるのは嫌ですし、かといって`-Wfloat-equal`を無効にしてしまうとfloatの等価比較を乱用する人が現れてくるし...

うまい方法はないものか...

### 環境
gcc6.2.1
v-spotとNanoPiDuoでインターネットから制御可能なドットマトリクスLEDをつくる


PostItくらいのサイズがいいんじゃないかと思ったので、ちょっと大きめのLEDマトリクスを探してみる。
aitendoで60x60くらいの2色のドットマトリクスLEDがあった。これで350円、安い！

http://www.aitendo.com/product/15878

NanoPi DuoはGPIOの数が少ないので、I2CでドットマトリクスLEDを制御できたらいいな。
HT16K33というチップでできるらしい。

ブレークアウト基板: http://akizukidenshi.com/catalog/g/gM-11246/
チップ単体: http://www.aitendo.com/product/9843

続く...
GJKアルゴリズムの紹介

# はじめに
この記事はSP2LC Advent Calendar 2017 10日目の記事です．

# SP2LCとの関わり
高専1年の時から参加しており，特にこだわりはなく広く浅く勉強しながら活動しています．

# 紹介理由
最近ググりながらコツコツ2Dの物理エンジンぽいものを作成しているのですが，その際に衝突判定などに使えるアルゴリズムとして出てきたので紹介してみようと思いました．

# ミンコフスキー差とは(前提知識)
突然ミンコフスキー差と言われてもわからないと思いますが，これはGJKアルゴリズムの前提となっている考え方です．なのでまずミンコフスキー差について説明しようと思います．

ミンコフスキー差とは点の集合で表された2つの図形AとBがあった場合に図形Aを原点中心に反転させ，それを図形Bの周りを移動させた時に生じる領域のことです．言葉だとなかなかわかりにくいので下の図を見てください．
<div align="center">
<img src=https://qiita-image-store.s3.amazonaws.com/0/221665/d372682f-fd3b-6ca7-09fe-d2fe15366498.png>
</div>
黄色い図形が図形A，青い図形が図形Bと考えてください．ちなみに黄色い図形にある黒丸は原点です．
この場合に上での説明の通りに図形Aを原点中心に反転させるとだいたい下の図のようになります．
![図2.png](https://qiita-image-store.s3.amazonaws.com/0/221665/11594afc-056d-7ca7-2be2-483c25e70c7e.png)
図形Aを原点中心に反転させるところまでやりました．次は図形Aを図形Bの周りで移動させます．この時の移動というのは，図形Aの原点だった場所を図形Bの各点に合わせて平行移動させることを言います．すると下の図のようになります．
![図3.png](https://qiita-image-store.s3.amazonaws.com/0/221665/39e399f8-0250-7d86-ba2f-4276f0c16981.png)
結構アバウトに図を作っているので少しずれてたりしていますが，おおむね図のようになります．すると図形Bの周りを移動した図形Aによって領域を作ることができます．
![図4.png](https://qiita-image-store.s3.amazonaws.com/0/221665/427be0f5-dc48-ab8f-098a-bc8614cd73a0.png)
黒の線で囲った領域が図形Aが移動したことによってできた領域になります．この領域のことがミンコフスキー差といい，GJKアルゴリズムの中でとても重要なものとなっています．本当はこのミンコフスキー差を一発で表現する数式などがありますが，なんとなくしかわかってないので割愛します．



# GJKアルゴリズムとは
はい．長々と説明しましたがやっと本題です．ではミンコフスキー差を使用してどうやって衝突判定をするのかというのを説明しようと思います．
GJKアルゴリズムとはミンコフスキー差のある特性を利用して衝突しているかを判定するアルゴリズムです．それはミンコフスキー差の領域内に原点が含まれていた場合ミンコフスキー差を求めた図形Aと図形Bは重なっているという特性です．
では実際にGJKアルゴリズムの動きを説明しようと思います．

![図5.png](https://qiita-image-store.s3.amazonaws.com/0/221665/4b673d92-35a8-09a2-2d95-74b0bed77d22.png)
まず任意の点Aから原点へのベクトルV1を伸ばします．そしてそのベクトル方向で一番遠い点を求めます．一番遠い点はサポート写像を使って求めますが今回は割愛します．

![図6.png](https://qiita-image-store.s3.amazonaws.com/0/221665/60a7e696-ed05-d0c8-b6ad-d58f2974d246.png)
すると一番遠い点が点Bだということがわかります．次に起点とした点，今回でいうと点Aから点Bを通るように線分を伸ばします．この線分は線分ABとします．線分ABから原点への最短点を求め，その点から原点へのベクトルを求めます．今回はV3とします．

![図7.png](https://qiita-image-store.s3.amazonaws.com/0/221665/5c530d05-4ab0-950a-a29d-ad0ecd92795c.png)
上で求めたベクトルV3の方向で一番遠い点を求めると点Cが得られます．すると，これで得た点がA・B・Cと３点求まったのでそれぞれをつないで三角形を作成します．そしてその三角形の中に原点が含まれているかを調べます．図の図形では含まれていないため処理を続行します．1つ前に求めた点であるBから今求めた点Cの線分を作成します．そして最短点を調べますが，図ではすでに最短点と原点をつなげたベクトルを作成しその方向に一番遠い点を調べても既に調べた後です．なので処理が終了します．

# おわりに
自分でも最近なんとなくわかったかなという感じなので書いてて混乱しかけました．
今回は割愛した内容もあったりするので気になる人は調べてみるともっとわかりやすく説明している人がいるので，ぜひ調べてみてください．
pythonでスライス使いになる！

#まずはlist(arrayでも大丈夫です！)を用意します。

```py3

#my_list = [0,1,2,3,4,5,6,7,8,9]と同じ


#リスト内包表記の場合
my_list  = [i for i in range(10)]
print(my_list)

#[0,1,2,3,4,5,6,7,8,9]
```
@shiracamus さんにおしえていただいたほうがきれいに書けるので、追加します！!

```py3
my_list = list(range(10))


print(my_list)
#[0,1,2,3,4,5,6,7,8,9]
```

リスト内包表記で作ったリストを使ってご説明します！
リスト内包表記については、この記事をご参照ください(^^)
me: [ゼロから始めるデータサイエンス 1章で使うリスト内包表記のエラーについて](https://qiita.com/yossyyossy/items/b137ed5babd86523e270)

#1つ目の引数を指定する

```py3
my_list[1:]
#[1, 2, 3, 4, 5, 6, 7, 8, 9]


my_list[0:]
#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
```

第一引数では、リスト内の何番目の数から返すか指定できるのですね！
今回のリストは0から始まり9番目で終わる10個の数字なので、その点にご注意ください！

#####**引数にマイナスを取った場合**

後ろから-n個の数字をとってくることが出来ます！

```py3


my_list[-1:]
#[9]

my_list[-2:]
#[8, 9]
```


#2つ目の引数を指定する

```py3
my_list[1:10]
#[1, 2, 3, 4, 5, 6, 7, 8, 9]


my_list[1:4]
#[1,2,3]
```

第二引数はリスト内の何番目まで取り出すか指定できそうです！

ちなみに引数を指定しないと、こうなります

```py
#すべての引数を指定しない場合
my_list[:]
#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


#第一引数のみ指定しない場合
my_list[:5]
#[0, 1, 2, 3, 4]

```
#####**引数にマイナスを取った場合**

```py3

 my_list[:-8]
#[0, 1]

# my_list[:2]のときと同じ出力結果になります！
#[0, 1]
```
#3つ目の引数を指定する

```py3
#第3引数に2を指定した場合
my_list[1:10:2]
#[1, 3, 5, 7, 9]
#リスト内から２つ飛ばしで表示されます！


#第3引数に3を指定した場合
my_list[1:10:3]
#[1, 4, 7]
#リスト内から3つ飛ばしで表示されます！

```

引数を指定しないバージョンと、引数にマイナスを取った場合はこんな感じです。

```py3
#3つの引数を指定しない場合
my_list[::]
#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


#引数にマイナスを指定した場合
my_list[::-1]
#[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]


#3つめの引数のみ指定した場合
my_list[::2]
#[0, 2, 4, 6, 8]
```

参考：@ycctw1443 さん【[Pythonのスライスについて](https://qiita.com/ycctw1443/items/03f99f3f72a797fdcbf6)】
utf8mb4_unicode_ciなんて名前の文字コード知らない！！っていわれたので紗霧ちゃんにもわかるようにまとめた

# 文字コードutf8mb4_unicode_cimysqlはバージョン5.5以上〜なのでアップデートすれば解決できる


```
sudo service mysqld stop
yum update
```

こんなエラーが出たときは是非お試しを。
Unknown collation: 'utf8mb4_unicode_ci'

やった！
Crypto-jsでのbase64と16進数文字列の相互変換

Crypto-jsを使ってて忘れないようにするためのメモ

例えばAESでphraseをAESで暗号化したとき

```js
var encrypted = CryptoJS.AES.encrypt( phrase , key , options );
```
encryptedには暗号化されたデータのオブジェクトが格納されている。このデータは

```js
var encstr = String(encrypted);
```
とかしてやるとbase64でエンコードされた暗号化文字列が取得できる。

さて、このbase64を16進数に変換したい場合がある。Crypto-jsには適宜必要なデータへ変換するメソッドがいくつか用意されているらしい。

```js
//base64 >>> hex
var hex = CryptoJS.enc.Base64.parse( encstr );
//hex >>> hexObject
var hxb = CryptoJS.enc.Hex.parse( hex );
//hexObject >>> base64
var bse = CryptoJS.enc.Base64.stringify( hxb );
```
注意点として、CryptoJS.enc.Base64.stringifyには「hxb」を渡さなければならない点。「hex」を渡すと元と違うbase64文字列が帰ってくる。何故かはわからない。



参考記事
https://hibara.org/blog/2016/02/15/cryptojs/
webpackerがRails5.1でjsを読み込んでくれなくなったので俺でもわかるように記事に書いた。

#Rails5.1にアプデしたらjsがエラー吐いた

```txt:Rails5.1にバージョンアップしたらjsが読み込まれなくなった。
Can't find githubActivity.js in /myapp/public/packs/manifest.json. Is webpack still compiling?
Extracted source (around line #1):
              
= javascript_pack_tag 'githubActivity'
= javascript_pack_tag 'articleList'
```

## webpackerのReadmeに書いてありますが、これで解決できます。

https://github.com/rails/webpacker#vue

```zsh:これを実行するんだ！
./bin/rails webpacker:install
./bin/rails webpacker:install:vue
bin/webpack
```
Enumerize と inclusion validationを同時に使ってハマる

validationに**inclusion**を使っているカラムに対して、[Enumerize](https://github.com/brainspec/enumerize)を適用しようとして少しハマりました。

例えばユーザーの性別を数値型で管理している場合、こんな感じにmodelになると思います。

```ruby:app/models/user.rb
class User < ApplicationRecord
  validate :sex,
    presence: true,
    inclusion: { in: 0..2 }
end
```

0: 未設定
1: 男 (male)
2: 女 (female)


ここにEnumerizeを適用するため、以下のように追記しました。

```ruby:app/models/user.rb
class User < ApplicationRecord

...

  validate :sex,
    presence: true,
    inclusion: { in: 0..2 }
  enumerize :sex, in: { male: 1, female: 2 }

...

end
```

編集用viewは以下のような感じです。
[simple_form](https://github.com/plataformatec/simple_form)を使用しています。

```ruby:app/views/users/edit.slim.html
= simple_form_for @user do |f|

...

  .form-control
    = f.input :sex, as: :radio_buttons, checked: @user.sex

...

  .form-control
    = f.submit '登録'
```

これで `male`, `female`のラジオボタンができるのですが、一方を選択して[登録]ボタンを押すと、
`"is not included in the list"`というエラーが表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/29000/4bf82c36-f534-7021-a1f9-1d41a2c0db27.png)

この場合、実際にDBに登録される値は数値の`2`ですが、`@user.sex`の値は`"female"`になるため、もともとあった`inclusion`バリデーションに引っかかってします。

元の`inclusion`バリデーションを外してEnumerizeに任せるようにすると、正常に登録できるようになります。

```ruby:app/models/user.rb
class User < ApplicationRecord

...

  validate :sex,
    presence: true
  enumerize :sex, in: { male: 1, female: 2 }

...

end
```

よく考えると当たり前のことでしたが、解決に小一時間潰してしまいました。
pythonでNumPyを使って、行列を作ってみよう

#numpyとは

>NumPy（ナムパイまたはナンパイ）は、プログラミング言語Pythonにおいて数値計算を効率的に行うための拡張モジュールである。効率的な数値計算を行うための型付きの多次元配列（例えばベクトルや行列などを表現できる）のサポートをPythonに加えるとともに、それらを操作するための大規模な高水準の数学関数ライブラリを提供する。

参考：【[NumPy](https://ja.wikipedia.org/wiki/NumPy)】

いろんな処理を簡単にしてくれるのがnumpyです。



```py3

>>> import numpy as np
>>> list1 = [1,2,3,4]
>>> list2 = [5,6,7,8]
>>> lists = [list1,list2]
>>> arr = np.array(lists)
>>> print(arr)
[[1 2 3 4]
 [5 6 7 8]]
```

同じことは一行でも出来ます

```py

>>> new_arr = np.array([[1,2,3,4],[1,2,3,4]])
>>> new_arr
array([[1, 2, 3, 4],
       [1, 2, 3, 4]])
```

####**ポイント！**
**１：リスト同士を入れるリストを作っている!
２：リスト同士は,で区切る!
３：np.array（）を呼んでいる！**
Ag-girdのFloatingFilterデザインを変える

[Ag-grid](https://www.ag-grid.com/)は機能がリッチでいいですよね。倉庫内管理システムに[FloatingFilter](https://www.ag-grid.com/javascript-grid-floating-filter-component/#gsc.tab=0)を付けたところ、現場から”もっとデザインをかっちょよくしてほしい"と要望を貰ったので、手順をまとめます。

FloatingFilterは`<GridOptions>`に`floatingFilter: true`と付けるのみです。

<img width="710" alt="ag-grid_import2.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/77c5d76b-44df-27a6-40f8-d5967b43721f.png">


#〇スタート時点

無地で、角ばっていて、殺風景。「...」のボタンを押すと、検索条件(含むとか、等しいとか)と一緒に入力バーがまた出ちゃう

現場の要望は、
・どこに入力すればいいのか一目でわかるように薄い色を付けてほしい
・角ばった感じをなくしてほしい
・検索条件と一緒に出る入力バーを消してほしい

<img width="619" alt="3画面フィルターあり2.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/6b5e0412-819c-d083-0816-5c471b0159a1.png">
>

#〇HTMLを変更

まずHTMLでag-grid-angularでclassを指定します。 `class="ag-material-××××"`の部分ですね 

<img width="541" alt="4HTMLでクラス指定.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/0582a05d-7e34-b86b-add2-cbfce9bee103.png">

次にChrome DevToolsのElementでFloatingFilterの`input要素`を探します。

<img width="938" alt="5HTMLクラス見つける.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/a3e9367c-1262-bf9a-00da-670b156ba5b0.png">

#〇デザインを変える

CSSで先頭に.をつけて`class="ag-material-××××"`.`input要素`を書き、好みのデザインを指定します

`.ag-material-×××× .ag-floating-filter-input `の部分です。

<img width="826" alt="6デザインを変えr.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/7ce290c5-1458-a11b-97b4-3fbeb5a2474a.png">

結果として以下のようになりました。
少しまともな見た目になりましたかね！


<img width="899" alt="wa3010FloatingFilterデザイン.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/3bdc5fb7-6733-26da-422b-cb717c5ca3df.png">

ちなみに、

```
.ag-material-×××× .ag-filter-body{
  display:none;
}
```


でフィルターも非表示にできました。
ちょっとした違いで印象は変わりますもんね、多少は使いやすくなればいいのですが、以上です。
APIGatewayのGenerated SDKをSwift4に対応させる

![スクリーンショット 2017-12-08 20.55.01.png](https://qiita-image-store.s3.amazonaws.com/0/86468/6f2325aa-52db-898e-a3be-9165a1b5773d.png)

今まで普通に使えていたAPIGatewayのGenerated SDK（AWSのコンソールから生成してダウンロードするやつ）がエラーを吐くようになった。どうやらSwift4へ一時的に対応していないようだったので、いろいろ調べてどうにか対応させた。

#どんなエラーが出るようになったか

1. レスポンスをパースする時に（プロパティ名） is not a property of （モデル名）というエラー
2. 配列のレスポンスをパースしたときに「fatal error: NSArray element failed to match the Swift Array Element type」というエラー

#対処法

対処法は、各モデルを定義してるSwiftファイルで、全てのプロパティと「（プロパティ名）JSONTransformer」のクラスの先頭に「@objc」をつけること。Swift4からこれを明示的につけないとObjective-Cのコードから当該プロパティやクラスを見つけられなくなっているようでした。

```swift:APIGUser.swift
import Foundation
import AWSCore

 
public class APIGUser: AWSModel {
    
    //全てのプロパティの先頭に「@objc」
    @objc var username: String?
    @objc var devices: [APIGUser_item]?
    
   	public override static func jsonKeyPathsByPropertyKey() -> [AnyHashable : Any]!{
		var params:[AnyHashable : Any] = [:]
		params["username"] = "username"
		params["devices"] = "devices"
		
        return params
	}

     //JSONTransformerにも@Objc
	@objc class func devicesJSONTransformer() -> ValueTransformer{
		return  ValueTransformer.awsmtl_JSONArrayTransformer(withModelClass: APIGUser_devices_items.self);
	}
}
```

#参考
[Support Swift 4 for API Gateway](https://github.com/aws/aws-sdk-ios/issues/753)
メモ: ruby-jwt の署名アルゴリズム別ベンチマーク

とあるバッチ処理で繰り返し大量の署名付き JWT を生成する事になり、今まで(深く)気にしてこなかったアルゴリズム別の性能差を確認してみた時のメモ。

※ HMAC の鍵長や ECDSA の使い方(曲線の選び方?)についてよく分かっていないので、条件がおかしいかもしれない。

```ruby
require 'benchmark'
require 'jwt'
require 'digest/md5'

keys = {
  HMAC: {
    HS256: Digest::MD5.hexdigest('HS256'),
    HS384: Digest::MD5.hexdigest('HS384'),
    HS512: Digest::MD5.hexdigest('HS512'),
  },
  RSA: {
    RS256: OpenSSL::PKey::RSA.generate(2048),
    RS384: OpenSSL::PKey::RSA.generate(2048),
    RS512: OpenSSL::PKey::RSA.generate(2048),
  },
  ECDSA: {
    ES256: OpenSSL::PKey::EC.new('prime256v1').tap(&:generate_key),
    ES384: OpenSSL::PKey::EC.new('secp384r1').tap(&:generate_key),
    ES512: OpenSSL::PKey::EC.new('secp521r1').tap(&:generate_key),
  },
}

n = 10_000

Benchmark.bm(15) do |bm|
  keys.each do |group, algs|
    algs.each do |alg, key|
      bm.report("#{group} / #{alg}") do
        n.times { JWT.encode({}, key, alg.to_s) }
      end
    end
  end
end

__END__
                      user     system      total        real
HMAC / HS256      0.280000   0.000000   0.280000 (  0.289864)
HMAC / HS384      0.250000   0.000000   0.250000 (  0.254620)
HMAC / HS512      0.260000   0.000000   0.260000 (  0.255493)
RSA / RS256       6.140000   0.000000   6.140000 (  6.146817)
RSA / RS384       6.140000   0.010000   6.150000 (  6.155130)
RSA / RS512       6.140000   0.000000   6.140000 (  6.151847)
ECDSA / ES256     0.810000   0.000000   0.810000 (  0.815459)
ECDSA / ES384     7.140000   0.010000   7.150000 (  7.149290)
ECDSA / ES512     3.610000   0.010000   3.620000 (  3.627512)
```

### 備考: 実行環境など

- Ruby 2.4.2p111
- [jwt/ruby\-jwt](https://github.com/jwt/ruby-jwt) v2.1.0

### 追記: RbNaCl

[cryptosphere/rbnacl](https://github.com/cryptosphere/rbnacl) がロード可能であれば HMAC 系アルゴリズムで RbNaCl を使うという事が書かれていたので試してみたところ、若干遅くなる模様。

```
                      user     system      total        real
HMAC / HS256      0.350000   0.000000   0.350000 (  0.358537)
HMAC / HS384      0.260000   0.000000   0.260000 (  0.264705)
HMAC / HS512      0.330000   0.000000   0.330000 (  0.329434)
HMAC / HS512256   0.330000   0.000000   0.330000 (  0.331153)
```

[NaCl (Networking and Cryptography library)](http://nacl.cr.yp.to/) についてはよく分かっていません([jedisct1/libsodium](https://github.com/jedisct1/libsodium) も)。[NaCl (ネットワーク応用通信研究所; Network Applied Communication Laboratory Ltd.)](http://www.netlab.jp/)との関係もよく分かりません。
怖くない電子工作入門！初心者向けTips


この記事は[TECH PLAY女子部 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/techplaygirls) 6日目の記事です。遅刻すみません、、m(_ _)m

もともとPHPを書いているWebエンジニアだったのですが、電子工作が楽しくなってIoT系の会社に転職もしてみました。

ハードウェア難しすぎて挫折した経験やいろんな気づきを踏まえて、怖くない電子工作入門を紹介したいと思います〜。


## 電子工作って何？

マイコンボードと呼ばれる基板を使って、センサーをつけたりモーターを繋げたりするやつです。

![スクリーンショット 2017-12-08 20.58.54.png](https://qiita-image-store.s3.amazonaws.com/0/119003/6a20863c-4f93-baa7-f8d8-f8dce649b945.png "スクリーンショット 2017-12-08 20.58.54.png")

基本的には

- センサを繋げたりはんだづけしたりなどのハード側の実装
- マイコンボードに制御プログラムを書き込むソフト側の実装

があります。

![スクリーンショット 2017-12-08 20.57.13.png](https://qiita-image-store.s3.amazonaws.com/0/119003/cc243743-c669-549d-4739-75410753e217.png "スクリーンショット 2017-12-08 20.57.13.png")

有名どころのボードだと「Arduino（アルドゥイノ）」と「Raspberry Pi（通称ラズパイ）」があります。

**でも本当はもっとたくさんのボードがあります**。

## 回路とかハードウェアとかわからないんだけど？
**安心してください。簡単に回路を組める初心者向けのものが出ています。**

例えば「Grove」という規格は、ソケットに挿すだけでセンサーやモーターを接続できるようになっています。USBのようなイメージですね。
![Sn-grove.jpg](https://qiita-image-store.s3.amazonaws.com/0/119003/31295b2f-fac0-52c1-42bb-861947181d4e.jpeg "Sn-grove.jpg")

他にも「Gravity」という同様の規格や、磁石でくっつく「LittleBits」などがあります。

## 組み込みの言語なんてわからないんだけど？
**安心してください。JavaScriptでも動かせます。**

Arduinoの場合はC++ライクなArduino言語、RaspberryPiの場合はPythonなどで制御するのですが、「Johnny-Five」というフレームワークを使うとNode.jsでもハードウェアを制御できちゃうんですね〜。
![スクリーンショット 2017-12-08 21.13.24.png](https://qiita-image-store.s3.amazonaws.com/0/119003/6cefd60e-78b2-468e-e7c8-080c7b88bed0.png "スクリーンショット 2017-12-08 21.13.24.png")

JS以外にもRubyやJava、Pythonなど様々な言語に対応したボードが登場しています。

最近はブロックを使ったビジュアルプログラミングで制御できる「micro:bit」 がちょっと話題です。
![javascript-editor.png](https://qiita-image-store.s3.amazonaws.com/0/119003/918f1843-51fb-c15b-67c9-7ef0292b6faf.png "javascript-editor.png")

## データをやりとりしたり連携したりしたい！
基本の制御ができるともっとやりたくなりますよね。簡単に連携できるサービスもたくさん用意されています。

ノンプログラミングでサービス同士を連携できる「[IFTTT](https://ifttt.com)」
![スクリーンショット 2017-12-08 21.15.52.png](https://qiita-image-store.s3.amazonaws.com/0/119003/3f5df5e8-1999-be76-240c-e08b7adb6904.png "スクリーンショット 2017-12-08 21.15.52.png")

リアルタイムなデータやりとりを簡単に実装できる「[milkcocoa](https://mlkcca.com/)」
![スクリーンショット 2017-12-08 21.18.15.png](https://qiita-image-store.s3.amazonaws.com/0/119003/db046447-aedf-0c24-9f80-c03189619603.png "スクリーンショット 2017-12-08 21.18.15.png")

ハードウェアも通信やアプリ連携に特化したものがあります。

スマートフォンでWi-Fi設定できる「Wio Node」
![Wio_Node_illustrate.jpg](https://qiita-image-store.s3.amazonaws.com/0/119003/0870294b-a6c3-251c-966a-d0a428c91a9f.jpeg "Wio_Node_illustrate.jpg")

iOSアプリとの連携が簡単な「Konashi」
![fb_image.png](https://qiita-image-store.s3.amazonaws.com/0/119003/a08ed7e9-f628-5a05-6d01-f93e7da5a8f2.png "fb_image.png")

紹介しきれないほどありますので、「自分の好きな言語　マイコンボード」などで検索してみてください！

## まとめ
ハードウェアこわい、違う世界だと思っている（かつての私のような）女性に、ちょっとでも「楽しいよ！」ってことが伝わればいいなと思って書いてみました。

2018年は電子工作しましょう！
Parquet形式のデータをSQL一発で作成する

分析基盤を作るにあたり、ストレージ・ファイルフォーマット選定は非常に重要な項目である。
Parquetは、高い圧縮率と高速な分析を可能にするファイルフォーマットである。
既存の非Parquet形式のテーブルから、Parquet形式にデータ変換するには、CREATE TABLE AS SELECT(CTAS)を実行すればいい。

# 実行例

```sql
CREATE TABLE tbl_pq STORED AS PARQUET AS SELECT * FROM tbl;
```

# 注意

テーブル作成後は `COMPUTE STATS <テーブル名>` の実行を忘れずに。

# 参考

- [Clouderaドキュメント: CREATE TABLE Statement](https://www.cloudera.com/documentation/enterprise/latest/topics/impala_create_table.html)
DockerSwarmの事例と今後

この記事は[第2のドワンゴ Advent Calendar 2017](https://qiita.com/advent-calendar/2017/dwango2) 8日目の記事です。
ドワンゴで普段はニコニコ生放送（以下 生放送）周りのエンジニアをやっています、ビビるです。

先月、弊社エンジニアブロマガにて[ニコニコ生放送におけるdockerの活用事例](http://ch.nicovideo.jp/dwango-engineer/blomaga/ar1353659) を紹介させていただきましたように、生放送チームでは一部のサービスでDocker SwarmMode(以下 Swarm)を利用して運用を行っています。[^1]

何故Docker化を始めたの？とか、実際使ってみてどうだったの？という話は上記記事を見ていただくとして、今回はその記事に追加しての話をさせていただこうと思います。

[^1]: 記事にはありませんが、社内他部署ではKubernetesを利用している部署もあります。 

## サービス更新検知

開発時にローカルでSwarmでサービスを構築した後、考えたのが「このサービスはいつ更新が終わるんだ？」ということです。
特に、サービスをローリングアップデートで更新する際の分割数を増やした場合、終わったかどうかを毎回手動で確認していて、出来れば手軽に通知が飛ばせないかなと考えていました。

そこで、Dockerの[EventsAPI](https://docs.docker.com/engine/api/v1.33/#operation/SystemEvents)を購読し、その内容のうちSwarmEventsのみ検知したらSlackに投げるようにしてみました。cURLで叩いた例は以下のようになります[^2]

```sh
curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json"  "http:/v1.33/events?filters=\{%22type%22:\[%22service%22\]\}"
```

[^2]: apiのバージョンはDockerEngineのバージョンに合わせて変わるので、古いバージョンの場合など適宜読み替えて下さい。

このようにAPIから取得したデータをSlackに投げるプログラムをサービスとして建てておくことで、上手くイベント通知をSlackに集約できるようになりました。

![更新完了画面](https://qiita-image-store.s3.amazonaws.com/0/44913/1a284f7f-d0bc-c6b1-a619-6483f7edbe9f.png)

## [Kubernetes公式サポートの話](https://www.docker.com/kubernetes)
10月に行われた[DockerCon Europe](https://europe-2017.dockercon.com/) にて、K8sの公式サポートが発表されました。
これはSwarmの終焉だというわけではなく、KubernetesとSwarmは並列に運用できるようになります。具体的にはDocker EE上の1クラスタ上にK8sでもSwarmでもデプロイが行える状態になります。

例えば

```sh
docker stack ls
```

のコマンドで情報を取ってこれるSwarmのスタックがあった場合、

```sh
kubectl get stacks -o name
```

のコマンドで取得できる、といった具合のようです。

UCP (Universal Control Plane）上でも、SwarmとKubernetesのメニューが並列に並んでおり、それぞれが管理するスタック/Podを確認できる状態になっています。

Kubernetesサポートは2018年1Qにリリースされる予定ということですが、beta版は間もなく利用できるようになるとで、サインアップして正座して待っている状態です。

## 終わりに

ちょっと事情があり、記事がかけていません。後日別途記事を書いて追記したいと思います。
明日は@yyuさんです。
特定のパーティションのみ統計データを更新する


データの新規追加を行った際に `COMPUTE STATS <テーブル名>` を実行して統計データを取得するのは定石であるが、テーブルが巨大になると、COMPUTE STATS を毎回実行するだけでもかなりの時間がかかってしまう。
そこで、 `COMPUTE INCREMENTAL STATS` を使い、新規に追加したデータを含むパーティションのみ統計データを更新する。

# 実行例

```sql
COMPUTE INCREMENTAL STATS tbl PARTITION (dt='20171201');
```

# 参考

- [Clouderaドキュメント: COMPUTE STATS Statement](https://www.cloudera.com/documentation/enterprise/latest/topics/impala_compute_stats.html)
Vulcan #とは

# Vulcan #とは
どうも。[@nisshii](https://github.com/nisshii0313) です。
現在、株式会社[zens](http://www.zens.tokyo/)にてインターン生としてエンジニアの仕事をさせていただいています。
今回、[Vulcan](https://github.com/VulcanJS)というフレームワークの良さみについて書かせていただきます。
ちなみに、zensにはVulcanを作ったフランス人の方([Sacha](http://sachagreif.com/))がおり、適宜アドバイスをいただいています。
それでは本題に移ります。
____
## Vulcanの概要
Vulcanはreactベースのwebアプリケーション向けのフレームワークです。
> This is the problem I’m trying to solve with VulcanJS, a new open-source web app framework I’ve been working on: make it possible to quickly bootstrap new projects without sacrificing the features that are key to your project’s success.

とSachaが言うように、スピード感の必要な開発に向いているフレームワークです。
react、graphQL、meteor(Mongo DB使用)の3つで支えられています。

___
## 良さみ
- reactが中に入ってるのでバグを修正したり、機能を追加するのが非常に楽です。
- graphQLはreactとともに学習コストが小さいのですぐに開発に取りかかれる。
- meteorは色々アレなところがあるようですが、データベース周りのmeteorの強いところをmongo dbで活かしきるという形をとっているためスピード感のある開発環境を提供してくれます。

____
## 始め方
npmコマンドが効く前提です。
`git clone https://github.com/VulcanJS/Vulcan.git`
からの
`npm install`
して
`npm start` 
するだけで、シンプルなアプリケーション開発に取りかかることができます。
詰まったら[ここ](http://docs.vulcanjs.org/)を見るとSachaが分かりやすく書いてくれています。

____
## サンプル
もうしばらくお待ちを。（；＿；）

___
## 他のフレームワークとの比較
zensで用いられている言語はRubyです。Rubyには相性の良いあのフレームワーク、そう！！railsがあります。

### では何故、僕の関わっているプロダクトのフレームワークとしてVulcanが採用されたのか？
それにはこのプロダクトがまだMVP段階であることが理由としてあげられると思います。
必要最小限のものを最速で作れるVulcanこそMVP作りに最適だと思います。
また、機能を加える際にも先ほど述べたようにライブラリとしてreactを用いているのでスムーズにできます。

_____
## おわりに
少しでも「Vulcanって良いな」と思ったそこのあなた！！2017年最後の開発にVulcanを用いてみてはいかがですか？(笑)
Dockerでmockyを使ったスタブサーバを立ち上げる

# 背景
APIを使ったシステムを作るのに接続先APIがまだない場合に、簡単にAPIのスタブサーバを立ち上げたい。
mockyという便利なものを使わせていただく。

# mockyとは
Node.jsベースでできたモックサーバ。

okv/mocky : https://github.com/okv/mocky


# 環境
Mac
Docker
docker-compose


# 説明しないこと
Dockerやdocker-composeのインストールや操作方法
Node.js の使い方


# やりたいこと
特定のURLにアクセスされたら、特定のjsonデータを出力させる。
jsonデータは、ファイルで用意してそれを読み込んで出力させる。
リクエストデータもjson形式で、POSTで受ける。



# 手順

## 構成

```

current
 |
 +- docker-compose.yml
 |
 +- mocky
 |    |
 |    +- Dockerfile
 |
 +- stub
 |    |
 |    +- mocky.js
 |    +- user-100.json
 |    +- user-101.json
 |    +- user-102.json
 |    +- user-list.json

```

## mockyのコンテナimageを定義する

Dockerfile

```
FROM node:latest

RUN npm install mocky

```

今回はこれを docker-composeから実行して作るが、これだけ動かしてもOK

## mockyを扱いやすいように docker-composeで起動方法を定義する

```docker-compose.yml

version: '2.2'

services:
  mocksan:
    build: ./mocky
    container_name: mocksan
    volumes:
      - "./stub:/node"
    ports:
      - "3000:3000"
    entrypoint: node /node/mocky.js


```



## モックしたいURLを定義する


```mocky.js

var mocky = require('mocky');
var fs = require('fs');

mocky.createServer([
{
    // ユーザ情報
    url: '/api/v01/user/get',
    method: 'post',
    res: function(req, res, callback) {
        var params = JSON.parse(req.body); // 受け取ったjsonデータを参照する場合
        var f = '/node/user-' + params.userid + '.json';  // パラメタ別のjsonファイル
        fs.readFile(f, 'utf8', function(err, text) {
            callback(null, {
                status: 200,
                body: text
            });
        });
    }
},
  {
    // ユーザリスト
    url: '/api/v01/user/list',
    method: 'post',
    res: function(req, res, callback) {
      fs.readFile('/node/user-list.json', 'utf8', function(err, text) {
        callback(null, {
          status: 200,
          body: text
        });
      });
    }
  }
  
]).listen(3000);

```



## 起動

```
$ docker-compose up -d

```

## テスト
ホストマシンからは、`localhost` でアクセスできる。
別のDockerコンテナ内からの場合は、`mocksan` でアクセスできる。

curlコマンドで動かしてみる。

```
$ curl -X POST http://localhost:3000/api/v01/user/get -d '{"userid":"100"}'

{
    "userid": "100",
    "username": "hanako-san"
}

```


## ログ
docker のログ出力機能でmockyへのアクセスを見ることができる。
console.log などで出力した場合もここに出る。

```
$ docker logs mocksan -f

[mocksrv] [req 0] [Thu, 07 Dec 2017 06:21:30 GMT] method: POST url: /api/v01/user/list req.body: {"userid":"100"}
[mocksrv] [req 1] [Thu, 07 Dec 2017 06:21:40 GMT] method: POST url: /api/v01/user/list req.body: {"userid":"101"}
[mocksrv] [req 2] [Thu, 07 Dec 2017 06:24:49 GMT] method: POST url: /api/v01/user/list req.body: {"userid":"102"}
[mocksrv] [req 3] [Thu, 07 Dec 2017 06:24:49 GMT] method: POST url: /api/v01/user/list req.body: {"userid":"103"}

```

# 注意
mocky.js を変更した場合は、nodeまたは、コンテナの再起動が必要。

# 感想
とても便利。
続: シェルスクリプトを何万倍も遅くしないためには —— やはりパイプは速いし解りやすい

## 外部コマンドを使わなければ大丈夫？

この記事では、先日の投稿[『シェルスクリプトを何万倍も遅くしないためには —— ループせずフィルタしよう』](https://qiita.com/8x9/items/f1156503694d3683e78d)の補足として、いただいた反応の一つにお答えしたいと思います。


> 悪記事。正しくは「プロセスの起動はコストが高いのでループごとにプロセスを起動するのは避けましょう」です。外部コマンドを起動しないならシェルスクリプトで一行ごとに読み込むことは何の問題もないです。
> —— [megumin1のコメント2017/12/01 23:54](http://b.hatena.ne.jp/entry/350598359/comment/megumin1)


「プロセスの起動はコストが高いのでループごとにプロセスを起動するのは避けましょう」というのはその通りだと思います。
まさにそのことを説明しようとした記事だったのですが、私の筆力が到りませんでした。

では、「外部コマンドを起動しないならシェルスクリプトで一行ごとに読み込むことは何の問題もない」というのは正しいでしょうか。
外部コマンドの起動が遅い、という問題に対しては、2つの対応が考えられます。

* パイプ: コマンドをパイプでつなげ、それぞれの起動を**1回ずつ**に抑える
* 内部機能: 処理を全てシェルの内部機能で行ない、外部コマンドの起動を**0回**にする

先日の記事では前者のパイプを使用しましたが、「シェルスクリプトで一行ごとに読み込むことは何の問題もない」とすると後者でもよさそうです。
いやむしろ、外部コマンドの起動が**0回**ですから、こちらのほうが速いのでしょうか。

計測してみます。
まず前回の確認ですが、ループ毎に外部コマンドを起動する悪い例と、パイプを用いたものの差は数万倍でした。

![chart_01.png](https://qiita-image-store.s3.amazonaws.com/0/181958/9b219b13-042e-23f5-253b-a7fed1e84a68.png)

では、内部機能だけ用いたものは、これらをどれだけ改善するでしょうか。
内部機能バージョンは、[前回コメントいただいた、Bash拡張を利用するもの](https://qiita.com/8x9/items/f1156503694d3683e78d#comment-d26cb3c1bf8044c2e199)をそのまま使用させていただきます。

![chart_02.png](https://qiita-image-store.s3.amazonaws.com/0/181958/ad5afecc-efe1-7888-c13a-b7cdf295d32a.png)

悪い例より60倍速くなりました。
しかし、パイプに比べると400倍近く遅いです。
速いシェル、Kshで試してみます。

![chart_03.png](https://qiita-image-store.s3.amazonaws.com/0/181958/eb582782-363c-670a-e6e4-843b9d2d39d6.png)


さらに4倍ほど速くなりましたが、どうもパイプには及びません。
Bash拡張で文字列の置換などをしているのがよくないのかも知れませんね。
では、ループの中で何も行なわないことにしてみましょう。

```bash
while IFS=, read -r x target x; do
	:
done
```

（`:` は内部コマンドです）


![chart_04.png](https://qiita-image-store.s3.amazonaws.com/0/181958/043ac9e6-34f0-cbfe-9999-71e612528fc4.png)


だいぶ速くなりました。
しかし、この `read` するだけのスクリプトにしても、パイプに比べると圧倒的に遅い結果です。

> 外部コマンドを起動しないならシェルスクリプトで一行ごとに読み込むことは何の問題もない

とは言えそうにありません。


## シェルは外部コマンドを前提に作られている

使っていると、シェルはフィルタをパイプでつなげることを前提としていることが解ります。
内部機能しか使わないスクリプトをより速く実行するシェルというのも、作成することはできるでしょうが、そうするとシェル自体の起動速度も落ちるでしょうし、今のところあまり需要が無さそうです。


## フィルタの使用は最適化のための難解なテクニックではない

もちろん、数百倍であれ、数万倍であれ、遅さが問題にならないことも多いです。
そういった場合に無理にループを避ける必要はありません。
しかし、ループを使わずにフィルタをパイプでつなげることは、速度の問題さえ無ければ避けたいような難しいテクニックなのでしょうか？

```bash:フィルタをパイプでつなげるバージョン
#!/bin/sh
cut -d, -f2 |tr -dc 'aeiou' |wc -c
```

コマンドの意味を知っていれば、上のコードは左から順に理解していくことができます。

* cut（列を切り出す） -d,（`,`区切りで） -f2（2列目だけを）
* tr（置き換える） -d（無に） -c 'aeiou'（`aeiou`以外を）
* wc（数える） -c（バイト数を）

本来、こういったシェルスクリプトは「最適化のために頑張って書かなければならない難解なコード」といったものではなく、それなりに解りやすいものだと思います。
もちろん好みは様々ですし、パズルのように頭を使わなければならないこともありますが、シェルスクリプトを書く際は、他の言語の習慣にこだわらず、フィルタを多用してみてください。


## この記事のライセンス
[![クリエイティブ・コモンズ・ライセンス](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/deed.ja)
この記事は[CC BY-SA 4.0（クリエイティブ・コモンズ 表示 4.0 継承 国際 ライセンス）](http://creativecommons.org/licenses/by-sa/4.0/deed.ja)の元で公開します。