OmniAICreator/Qiita-1.07M huggingface dataset:
matlabでnohupを使うとプログラムが終了しない件

あるmatlabスクリプト`sample.m`をバックグラウンドで実行したいとき, rオプションをつけて

```bash:ダメな例
nohup matlab -r sample &
```

と書く. 
しかし, このように書いてしまうと, プログラム終了後Matlabが**永遠と**標準入力から読み取ろうとしてエラーを出し続ける. 
その結果, nohupの出力である`nohup.out`が**数十ギガ**になるような危険事態が発生する. (***気づかなければHDDを埋め尽くす***)
`sample.m`の最後に`exit`と書けばこの問題は解決されるように思えるが, プログラム中でエラーが発生したときにも, 同じ事態が発生する. 
解決策は次のようにすることである. 

```bash:良い例
nohup matlab -r sample < /dev/null &
```

`/dev/null`はLinuxでEOFを返す特殊なものである. 
こうすることで, プログラムがどのように終了しても, matlabがEOF(終了)を受け取って, 正常に終了してくれる. 

`/dev/null`に限らず, `touch null`などで空ファイル`null`を作成して, 渡してあげてもよい: `nohup matlab -r sample < null &`
[WIP]新卒エンジニアが生産性を3ヶ月で生産性を向上させるために考えてやってみたこと

# 概要

この半年、生産性を上げるために色々な施策を試して来たので、その中で効果が大きくあったもの、なかったものを自分への振り返りと自戒を込めてまとめる。
エディタのことも書こうと思っているが、そうでない部分も多々あるので、エディタのカスタマイズのみみたい方は飛ばして読むことを推奨。

# まとめ

秘伝のタレを醸成しなさいということ。

# 自分の仕事の傾向を知ること

## 1. 自分が仕事中にやりたくなっちゃったことを書く

自分の場合、仕事中に別タスクをやりたくなってしまうことが多かった。
そのため、別のことをやりたくなってしまった時に、ひとまず、書き出して、もう一回戻るということをやってみた。
以下は例である。

1. とある実装を行なっていて、エディタが使いづらいと思ってしまう。
2. カスタマイズすれば、楽しいかも・・・
3. カスタマイズを始める

こうなる前に1の時点で書き出しをやって、それは夜のお楽しみとした。

## 2. 自分の好みの仕事とそうでない仕事を書く

検証が好きな人もいれば、実装が好きな人もいると思うが、自分の場合は、
検証つくんのめんどくさ。テストの実装めんどくさ。と感じてしまう人間である。
そのため、テストはできるだけ実装するのが、めんどくさくないように考えることとした。

例) ユニットテスト: PHPUnitを前提として

1. PHPUnitGeneratorを導入
3. カバレッジはすぐに出せるようにコマンドなり、なんなりをカスタマイズ

例２) コンビネーションテスト

1. テストに必要なCSVファイルをすぐに作れるようにグーグルスプレッドシート(gasで書いたりもした)を活用する。
2. CSVファイルのアップロードをコマンドで検証できるようにスクリプトを作成

## ペアプロをしてもらう

ペアプロというのかわからないが、どのようなことをすれば、良いのかわからないケースというのが多いので、自分の仕事を先輩がやった場合、どのように仕事をしているのかというのを半日なり、一日なりもらって観察する。自分と違うなと思ったところをストップをかけてなぜそのようにしたのか探り、


# エディタをカスタマイズする

偉大な先輩方は必ず、まず一つのエディタに詳しくなれと言っているが、それをそのままの言葉で受け取ってはいけないということがわかった。どうやらエディタ博士になれということではない。言葉の真の意味としては、エディタを時と場合に応じてカスタマイズできるようになっておき、自分の生産性を担保しろ！ということらしい。

自分の場合は、利用しているエディタがAtomなので、atomのパッケージを自作したり、自分が生産性を担保する上で必要なパッケージを使いやすいようにショートカットキーをカスタマイズしたりといったことを実行することとした。

# zsh shellをカスタマイズする

要するにオレオレコマンドを作成したりなどしろということ。
よくやるコマンドの一連を一つのコマンドとしてラップしたりしておくと良い。
また、よく使われる設定ファイルなどを自動生成できるようにしておくとさらにはかどることだろう。

例) よく使うファイルの生成

1. my.cnf→これはどこにいったとしても必要な設定というのが存在する。秘伝のタレとして持っておくと良い。もちろん独自の設定が必要な場所をカスタマイズすることは必要だが、基本的にどこでもやる必要がある設定を飛ばすことができるため、はかどる。
2. apacheの設定ファイル。これも理由は同上。
3. nginxの設定ファイル。これも理由は同上。

ここでやってはいけないことはこれ自体に時間をかけすぎないこと。
偉大な先輩方がネットに上げているものをみて必要な部分をいただくこと。
もちろん理解せずにコピーしまくるとかいうことではない。
【JavaScript】Spread構文とRestパラメーターを使いこなそう

どうも、[KORPLUS](https://qiita.com/KORPLUS)です。

JavaScriptのSpread構文とRestパラメーターについて、
ユースケースを交え解説していきます。

## 対象読者
・ES2015をこれから使っていきたい人

## Spread構文とは
関数呼び出しでは 0 個以上の引数として、
Array リテラルでは 0 個以上の要素として、
オブジェクトをその場で展開してくれる構文です。

要は使う場所によって、
**都合の良い形でオブジェクトを展開してくれる**という事です(^o^)

### 使い方
展開したい要素の接頭辞に```...```

- 関数呼び出しの場合

```js

function multiplication(x, y, z) {
  return x * y * z;
}

const numbers = [1, 2, 3];
multiplication(...numbers);  //6

```

- Array リテラルの場合

```js
const addCompanies = ['google', 'apple'];
const companies = ['facebook', ...addCompanies, 'amazon'];

companies // ["facebook","google","apple","amazon"]
```

### ユースケース

- new 演算子と併用する

スプレッド演算子が登場する以前までは、
配列を引数をして指定する場合、```Function.prototype.apply```を使用する
が一般的でした。

（例）

```js
function multiplication(x, y, z) {
  return x * y * z;
}

const numbers = [1, 2, 3];
multiplication.apply(null, numbers);

```

ただ、コンストラクタをnew演算子で呼ぶ時に使えないというデメリットがありました。

スプレッド演算子を使用すれば、new演算子で使用する事ができるので、
そういった問題もなくなります(^o^)

```js
var data = [10, 20, 30];  
var object = new myObject(...data);
```

- Arrayの連結

Array の連結には Array.concat がよく使われますが、
スプレッド構文を使用する事で、以下のメリットが得られます。

・配列の順序を簡単に変えられる
・要素を簡単に追加する事ができる

```js
const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];

const arrNomal = [...arr1, ...arr2];

// 配列1と2の順番を入れ替える
const arrShuffle = [...arr2, ...arr1];

// 要素を追加する
const arrAddElement = ['hoge', ...arr2, 'hoge2', ...arr1];

```

## Restパラメーターとは
不特定多数の引数を配列として受け取る構文です。
受け取る引数の数が決まってなくても、受け取っただけ配列にいれてくれます。(^^)

### 使い方
関数の最後の名前付き引数に ```...``` の接頭辞を付ける

ユースケース

```js
function multiplication(...numbers) {
  return numbers.reduce((accumulation, current) => {
    return accumulation * current;
  });
}

// 3つ引数を渡す
multiplication(1, 2, 3); // 6

// 4つ引数を渡す
multiplication(1, 2, 3, 4); // 24

```

## まとめ
・Spread構文は、オブジェクトをその場で展開してくれる
・new 演算子と併用する、Arrayの連結に使うと便利
・Restパラメーターは、不特定多数の引数を配列として受け取る事ができる

***注意点***
ES2015以降の記法なので、
レガシーブラウザに対応させる場合は、トランスパイラ（Babel等）を使用し、
ES5記法にトランスパイルをおこなってください。
AppleWatchでできることを調べてみた

こんにちは。私です。

AppleWatch欲しいなって思いません？
ちょうどクリスマスシーズンじゃないですか。ほしいな。AppleWatch....

##持ってる人に使い心地を聞いてみた
私「使い心地いかがですか？」
人「めっちゃ便利！」
私「使いこなせてますか？」
人「うん！時間とか見れるし！」
私「他には？」
人「…定期とか…出さなくていいし…」

##使いこなせてなくね？
時間見るのは従来の時計でよくね？スマートウォッチじゃなくてよくね？？
もっとできることいっぱいあるはず！

##何ができるのか
・時間がわかる
・iphoneの通知を受け取れる
・ApplePayが使える
・音楽が聴ける
・GPS/気圧高度計/ジャイロスコープ/心拍センサー/防水機能が搭載されているためフィットネスアプリが使える(作れる)
・ヘルスケアが使える
・地図が使える
・電話をかける、応答できる
・Siriが使える
・iphoneのカメラのシャッターがきれる
(一部機能はセルラーバージョンに限ります)

##アプリ開発者として知ったこと
####iphoneアプリとの依存性
AppleWatch単体のアプリっていうのは存在せず、iphoneのアプリと依存しているということ。
iphoneのアプリありきでAppleWatchの機能もある。っていう認識を持っておくことが必要。
AppleWatchにアプリ入れるのもiphoneからダウンロードして使う。

####HealthKit
HealthKitっていうのを使うと
「身長・体重・体脂肪率・歩数・消費カロリー・心拍数・体温・栄養」が取得できたり登録できる

####機能面から運動やヘルスケアのアプリが豊富
自作するとしてもこの分野が一番多いかなと思います。
HealthKit使って情報取得して運動量測ったりするアプリが多いですよね。
自作だと自分好みの情報だけ取得するアプリとか作れるんだろうな。

##ほしいな！AppleWatch！
なんだかんだ言って欲しいしアプリ開発したい！
今更な話題でしたが、だからこそ欲しくなるAppleWatch…。
持ってない方は興味持ってください。持ってる人はもっと使いこなせればいいな。

では、皆様もよいAppleWatchライフを٩( 'ω' )و
php-master-changes 2018-12-06

今日はドキュメントの修正があった！

あと PHP 7.3.0 のリリースと 5.6 系以降の全てのバージョンについてのリリースがあった！
5.6 系以降、で分かる通り、これらにはセキュリティ修正のパッチが含まれる。

php-master-changes では、自前でパッチする以外の良い感じの回避策がスッと見つからないセキュリティ修正については、無闇に広めてもなあ、みたいな観点からリアルタイムではスルーするようにしてみてる。
[#77153](https://bugs.php.net/bug.php?id=77153) は[修正](https://github.com/php/php-src/commit/e5bfea64c81ae34816479bb05d17cdffe45adddb)入った時には exploit が [GitHub へ上がってしまっていて](https://github.com/Bo0oM/PHP_imap_open_exploit) trending にも入ってたので、早めに言及しちゃってよかった気もしたけれど。
黙ってるのとさっさと言うのと、どっちが世のため人のためなのか迷ってる。
パッチが出てリポジトリに入っていれば公知といえば公知、でもリリース出るまで大抵の人のサーバは対策できないよなー、みたいな。
なんなら公式リリースが出た今でも、各ディストリビューションのパッケージへ修正が取り込まれるまでは実質何もできない。
お行儀の良い野次馬方法についてご意見募集中。

# 2018-12-06
## cmb69: [ci skip] Fix typo
- https://github.com/php/php-src/commit/43329e85e682bed4919bb37c15acb8fb3e63175f
- [7.3~]
- UPGRADING の typo を修正
- [chr()](http://php.net/manual/ja/function.chr.php) と [ord()](http://php.net/manual/ja/function.ord.php) じゃ typo っていうか逆じゃんね！

## cmb69: scripts/dev/gen_verify_stub can also be used for stable releases
- https://github.com/php/php-src/commit/36f0d00c3fd6d3eab7a2c969db3248646e2e805b
- README.RELEASE_PROCESS の 安定版リリース時の手順についても [scripts/dev/gen_verify_stub](https://github.com/php/php-src/blob/1ad08256f349fa513157437abc4feb245cce03fc/scripts/dev/gen_verify_stub) が使えるので記述を修正
vCenter Server サービスの再起動

NSX を導入した場合など、vCenter Server Appliance (以下 vCenter) にアイコンがまだ表示されない場合は vCenter を再起動すると表示される。
※表示されない場合は別の問題として調査する。

###対象サービス
vpxd


##vCenter ログイン

vCenter へ ssh 接続し、shell を実行する。

```
VMware vCenter Server Appliance 6.5.0.15000

Type: vCenter Server with an embedded Platform Services Controller

Last login: Thu Dec  6 09:57:28 2018 from 192.168.100.77
Connected to service

    * List APIs: "help api list"
    * List Plugins: "help pi list"
    * Launch BASH: "shell"

Command> shell
Shell access is granted to root
root@vcsa [ ~ ]#
```

以下プロンプトは # で表記。


##サービスの再起動
restart は無いのでサービスを stop させて start させる。

###ステータスを確認する
Running と表示されれば実行中。

```
# service-control --status vpxd
Running:
 vpxd
```

###サービスを停止させる（時間が掛かるので焦らない）
```
# service-control --stop vpxd
Perform stop operation. vmon_profile=None, svc_names=['vpxd'], include_coreossvcs=False, include_leafossvcs=False
Successfully stopped service vpxd
```

###ステータスから停止を確認する
Stopped と表示されれば停止中。

```
# service-control --status vpxd
Stopped:
 vpxd
```

###サービスを開始させる
```
# service-control --start vpxd
Perform start operation. vmon_profile=None, svc_names=['vpxd'], include_coreossvcs=False, include_leafossvcs=False
2018-12-07T00:06:17.926Z   Service vpxd state STOPPED
Successfully started service vpxd
```

###再開を確認する

```
# service-control --status vpxd
Running:
 vpxd
```

以上。
ｃで日能研

#概要
cで日能研やってみた。

#サンプルコード

```
#include <stdio.h>
#include <math.h>

int main(void)
{
    int i,
        i5,
        i4,
        i3,
        i2;
    char ss[8];
    for (i = 123456; i < 654322; i += 6)
    {
        snprintf(ss, 12, "%d", i);
        if (strchr(ss, '1') && strchr(ss, '2') && strchr(ss, '3') && strchr(ss, '4') && strchr(ss, '5') && strchr(ss, '6'))
        {
            i5 = floor(i / 10);
            if (i5 % 5 == 0)
            {
                i4 = floor(i / 100);
                if (i4 % 4 == 0)
                {
                    i3 = floor(i / 1000);
                    if (i3 % 3 == 0)
                    {
                        i2 = floor(i / 10000);
                        if (i2 % 2 == 0)
                        {
                             puts(ss); 
                        }
                    }
                }
            }
        }
    }    
}

```

#成果物

https://paiza.io/projects/-1dAKK34CO0HCChdMCWjkg

以上。
Marketplace for machine learning 調べてみた

この記事は株式会社ナレッジコミュニケーションが運営する [Amazon AI by ナレコム Advent Calendar 2018](https://qiita.com/advent-calendar/2018/knowcom-amazonai) の7日目の記事になります。


![00.png](https://qiita-image-store.s3.amazonaws.com/0/322096/aa19325e-0f06-d2ab-ec74-29f7c938254b.png)

## Marketplace for machine learning とは？

AWSの提供する機械学習プラットフォームであるAmazon SageMakerで利用できる製品をMarketplaceから購入することが可能になりました。
製品にはアルゴリズムと学習済みのモデルの２種類があります。

SageMakerではよく使われる機械学習のアルゴリズムはプリインストールされており、また独自のアルゴリズムやモデルを持ち込むことも可能です。
その一方で世間的に解決されている問題に対する既にあるアルゴリズムやモデルを独自のものとして開発・再現するために多くの時間が必要でした。

Marketplaceから製品を購入することでSageMakerからアルゴリズム、学習済みのモデルを直接デプロイすることができます。

リージョンにより多少異なりますが、アルゴリズムの製品が59個、学習済みモデルの製品が153個提供されていました。
(※2018年12月5日現在)

## AWS Marketplaceで確認

実際に[AWS Marketplace](https://aws.amazon.com/marketplace)にアクセスし実際に製品を見てみます。

Delivery MethodsからAmazon SageMakerを選択しView resultで該当の製品を表示します。
![01.png](https://qiita-image-store.s3.amazonaws.com/0/322096/c002e2aa-6e96-7f8e-e3c2-5f3a018e6a79.png)

212個の製品が表示されました。
![02_raw.png](https://qiita-image-store.s3.amazonaws.com/0/322096/95d73ce1-9340-05fb-46d9-a384c2736f2f.png)

学習済みモデルを見てみましょう。
リージョンと学習済みモデルで絞り込んでいきます。
左ペインのフィルターで「Model Package」とリージョンを選択します。
今回リージョンはバージニア北部(US East)を選択しました。
![03.png](https://qiita-image-store.s3.amazonaws.com/0/322096/3fcb1172-cd36-3faa-dbc1-610902aa9229.png)

画像内のオブジェクトの検出や動画内の有名人の検出、病歴から心不全に陥るリスクのスコアリングなど学習済みモデルの製品がリストアップされました。
その中でも無償で提供されているもの、無料体験版と時間課金となるものがあります。
無料体験版は製品によって試用期間が異なり、試用期間を過ぎると自動的に時間課金の製品に切り替わるので注意が必要です。

![04.png](https://qiita-image-store.s3.amazonaws.com/0/322096/9edfbd6f-cb6a-9b88-48bc-a80af04800d1.png)

製品名をクリックし製品の詳細ページにて試用期間、料金が確認できます。
このモデルでは試用期間は1日でそれ以降課金が発生することが分かります。
実際にデプロイすると製品の料金に加え、インスタンスの料金が発生するのはAMIなどと同様です。

![06.png](https://qiita-image-store.s3.amazonaws.com/0/322096/386cac6f-7471-0e0f-0ebd-4cca14449b19.png)

## 製品の購入

「Continue to Subscribe」から購入に進み、購入が完了するとSageMakerのコンソールにて確認することができるようになります。
今回はAWSから無料で提供されているオブジェクト検出モデルを購入してみます。

![07.png](https://qiita-image-store.s3.amazonaws.com/0/322096/4a9bd398-0028-7807-03c4-93292d6bf713.png)

画面移行後AMIなどと同様に利用規約を読み「Accept Offer」をクリックすることで購入完了です。

![10.png](https://qiita-image-store.s3.amazonaws.com/0/322096/107fecd8-7f48-af5c-4d54-333f84e19708.png)

SageMaker側で確認してみます。
モデルパッケージから「AWS Marketplace のサブスクリプション」を選択すると購入済みのモデルが表示されます。
この画面からSagemakerで独自のモデルと同じようにモデル、エンドポイントのデプロイが可能です。

![11.png](https://qiita-image-store.s3.amazonaws.com/0/322096/a7aa1fce-f1a7-206b-3afb-778ca1569ebd.png)

アルゴリズムに関しても同様にアルゴリズムの「AWS Marketplace のサブスクリプション」を選択することで購入済みのアルゴリズムが表示され、トレーニングジョブ、チューニングジョブの作成ができます。

![15.png](https://qiita-image-store.s3.amazonaws.com/0/322096/0cc5598f-02ad-fedc-39c1-92e0cc710e20.png)

## まとめ

モデルやアルゴリズムがMarketplaceで購入しSageMakerで使えるようになりました。
学習済みモデルを利用することでアルゴリズムの知識がなくとも機械学習を取り入れることができ、トレーニングにかかるコストも大幅に削減することが可能です。
また、独自のモデルを作成する際にもMarketplace製品を用いることで複雑なアルゴリズムを自分の手で作成する必要なくトレーニング、チューニングが可能になりました。

購入できる製品が日毎増えていくとのアナウンスもあるため今後も目が離せません。
XAMPP上にLaravel 5.7をインストールする 2018年12月版

この記事は、「[【連載】初めてのWindows用Laravel 5.7開発環境構築入門](https://qiita.com/hitotch/items/a646972fe1992611e92b)」の子記事です。環境などの条件は、親記事をご覧ください。

---
今回から、あとでレンタルサーバーにアプリをアップすることを考えながら、XAMPP上にLaravel 5.7をインストールしていきます。アプリの作成時ではなくてLaravelのインストール時にこの前提を考えておかなければいけないのは、Laravelのインストールがグローバルインストールとプロジェクトローカルインストールの2種類あり、ローカルのほうがレンタルサーバーにアップするときに楽、などの事情があるためです。

前提として、[前の記事](https://qiita.com/hitotch/items/0e1751ef38f83a9f3bf4)による環境構築（PHP開発環境やMariaDB管理環境の準備）が終わっている状態にしてください。

以下のステップに分けて、孫記事にしてきます。

 - [Laravel 5.7をインストールする](https://qiita.com/hitotch/items/927337632c7ae1f1963f)
  - 依存パッケージを管理するComposerをインストールする
  - Laravel本体をインストールする
 - [XAMPPのApacheでLaravelを表示できるようにする。](https://qiita.com/hitotch/items/4f5ef016cabe040fd2a2)
 - [Laravel用にVisual Studio Codeのおすすめ拡張機能を導入する。](https://qiita.com/hitotch/items/9b5c8e28f50e0e3f7806)
チーム外の人とモブプロをすることでモブプロがもっと良いものに思えた、という話

[モブプログラミング Advent Calendar 2018](https://qiita.com/advent-calendar/2018/mobprogramming) 17日目の記事です。

社内の有志数名でモブプログラミングを行う機会がありました。
今までは、ある程度時間を共にしたチーム内でのモブプロしか経験したことがありませんでした。
今回は今まで同じチームになったことがなかったメンバーも含んでモブプロをしました。
どんな感じでやったのか、よかったことなどをまとめようと思います。

#私自身のモブプロ経験
- 所属していたチーム内ではモブプロ、ペアプロ、ソロ活動を使い分けてきた
- ペアプロは約2年ほど前から取り入れている
- モブプロは半年ほど

モブプロへの個人的な感想(今回のイベント前)

- タスクが止まらない、技術の共有ができる、などのメリットを感じている
- もっといいモブプロのやり方があるのでは？もっと「すごい！」とか「楽しい！」みたいな気持ちを感じられるのでは？という疑問はある

#当日のメンバー
3人

- みんな同じ会社
- 顔は知っているし、話したこともある
- うち2人は同じチームだったことがあり、モブプロもやったことはあったが常にモブプロをしていたわけではない
- 経験技術、年次はバラバラ

#当日やったこと

やったこと
1. t-wadaさんのTDDの動画(一部)を全員で視聴
2. JavaでFizzBuzz
3. GoでFizzBuzz
4. GroovyでFizzBuzz

環境
http://cyber-dojo.org/ を使いました

モブプロやり方

- 5分でドライバー交代
- (確か)3セットで5分休憩(あやふやです・・・)
- 全体で約2時間30分
    - 途中お昼休憩1時間

####1．t-wadaさんのTDDの動画(一部)を全員で視聴
[50 分でわかるテスト駆動開発](https://channel9.msdn.com/Events/de-code/2017/DO03) の一部を3人で視聴しました。
TDDに対する気持ちが高まります。

####2. JavaでFizzBuzz
動画を見終わった後、JavaでFizzBuzzをしました。
まずは動画で見たTDDを再現してみよう！ということで全員書いたことがあったJavaを使いました。
とはいえ、現在Javaを使っているわけではなかったので、「数値にするのどうするんだっけ？」とか、「あっ、var じゃないんだった」とか、わいわい思い出しながら進めます。

####3. GoでFizzBuzz
次はだれも使ったことがない言語を使ってみよう、ということでGoを選びました。
Goを選んだ理由はとくにないです(その場にいた3人以外のもう一人に決めてもらいました)。
「テストの実行すらできなくなった！」や「これ使えるのかな？」など、わいがや度がどんどん増します。

####4. GroovyでFizzBuzz
Goで一通り書き終えたため、Groovyでも同じことをします。
「ここはRubyっぽい」など、お互いのバックグラウンドの話がちょいちょい出ながら進みます。



#感想、気づき

####楽しかった！
とにかく楽しかったです。
みんなが知らない言語を用いてテストがグリーンになったときとかうれしいです。

####経験関係なくわいわいできる
みんなが知らない言語を使うことで経験年数等関係なくわいわいできる場面が多かったように感じます。
FizzBuzzという内容が理解しやすいものだったことも理由の一つだと思います。
また、みんなが知らない言語とはいえ、今までの経験から助言できることがあったり、教えてもらえることがあったり、という部分もあり、お互いの今までの経験を感じることができました。

####初めてモブプロしようと思っているチームでやると良さそう
知らない言語でFizzBuzzを行う、という方法は、モブプロの良さを感じられる方法の一つだと思います。
メンバーが不慣れな言語でを使うことで、会話が促進されますし、一方でFizzBuzzというわかりやすいもののため、進めることができる、という点がよいなと思いました。
ウォーミングアップ的な感じで取り組むとモブプロのやり方を学ぶことができると思います。

####目的、目指すところが一致することがやっぱり大事
今回は、FizzBuzz(解が明確なお題)、TDDのやり方を動画で見る、という部分を通して、全員が目指すところのイメージがあっていたことが、楽しかったりうまく進んだ要因ではないかと思います。
とくにt-wadaさんの動画はやり方だけではなく、どう考えたのか、という点が多く出てくるので、思考する部分のイメージも合わせられたと思います。
普段であれば、このイメージのすり合わせもモブプロの中でやっていくことになると思います。
今回、「目的、目指すところが一致することがやっぱり大事」ということを改めて感じることができたので、今後に活かしていきたいです。

####他のチームでのやり方を学ぶことができる
今回のメンバーは、各々のチームでモブプロをしたことがあったメンバーでした。
そのため他のチームでのモブプロのやり方や雰囲気に触れることができました。
もともと私が疑問に思っていた「もっといいやり方あるんじゃないかな？」や「モブプロってもっと効果あるんじゃないかな？」ということについて気づきを得られました。

#感動したこと

###止まることがない流れ
今回、「止まることがない流れ(かつちょうどよい圧)」を体験できました。
そのときそのときの場の状況によると思うので、偶然といったら偶然だったと思うのですが、いつも一緒にはいないメンバーだったからこその部分もあるかなと思います。
今まで経験してきたモブプロは、どちらかというと「時間がきた、交代」の繰り返しで、交代がくるとちょっとリセットされるような感じを覚えていました(私個人の感想です)。
今回は、本当に思考が途切れることがなく、水が流れるような雰囲気を感じられました(私個人の感想です)。
もちろん、どちらにもよさはあると思います。今回は今まで感じていなかった感覚を感じられて、とても感動しています。

#まとめ

- 新しい言語でFizzBuzz楽しい！
- チーム外のメンバーでもモブプロできた！
- (意図はなくても)チームに閉じこもってしまいがち。チーム外のメンバーとわいわいする機会大事
SQLの文字列から余分な文字を削除

集計バッチ等で生の SQL を heredoc で直接書いてコメントとかインデントとか入れて可読性を維持したいケースがあったので考えてみた.


注意としてはSQL分上の文字列リテラルでコメントとか改行に相当のものが含まれてると意図しない文字列になってしまうが、集計時はレアケースなので気にしない.

```rb
<<-SQL.gsub(%r(\-\- .*$), '').gsub(%r(/\*.+\*/), '').squish
  SELECT
    id, name -- comment
  FROM
    users
  WHERE
    users.age > 18 /* 未成年を除外 */ AND users.gender_code = 1
SQL
# => "SELECT id, name FROM users WHERE users.age > 18 AND users.gender_code = 1"
```
[`String#squish()`](http://api.rubyonrails.org/classes/String.html#method-i-squish) は Rails の ActiveSupport のメソッドです.
マイコンボードを中継器にして PC に電子部品を接続し、Ruby で制御してみた（人感センサ編）

この記事は、[富士通ソーシアルサイエンスラボラトリ Advent Calendar 2018](http://qiita.com/advent-calendar/2018/ssl)の 7 日目の記事です。

# はじめに

@GORO_Neko です。ご存知の方ご無沙汰してます。初めての方お初にお目にかかります。

えーっと、先にお断りをば一言。

自分、仕事では一切マイコンボードを利用した業務に携わったことがございません。

以下は、自分が所属する会社の意向を反映したものでもスタンスを示すものでもなく、単なる一個人の趣味の活動から産まれた記述です。

# PC に電子部品を接続したい & PC 上の Ruby で制御したい

ここ数回 Firmata アプリケーションを書き込んだ Arduino Uno を中継器に、電子部品を PC 上のRuby スクリプトで制御できるよと言う記事を書いてきました。

[前回書いた記事](https://qiita.com/GORO_Neko/items/6a703c9ecdd4ac3b4b77)までの各記事で、デジタル／アナログピンの read/write 方法およびサーボモータの制御方法をお伝えしました。

この技術に頼った電子部品の制御方法は、ほぼこれですべてなので、もうそろそろこの技術に関する解説を書くのは「打ち止め！」と思っていたのですが、リアル世界の知人から「この技術で人感センサはコントロール出来ないの？」と質問されたので、もう一回だけこのネタで記事を書かせていただきます。

# Arduino Uno を Firmata 対応にする

やり方は[こちらの記事](https://qiita.com/GORO_Neko/items/5a515114d85802e8cb8b)で説明しましたので割愛。

Arduino IDE を使って StandardFirmata アプリケーションをビルドして、 Arduino Uno に書き込んでおく。ただこれだけです（おお、何回目の記述だろう）。

# 人感センサをつないでみる。

はい、パッシブ的に赤外線を感知するアレです。

英語では Passive Infrared Ray(PIR)、日本語では焦電型赤外線センサと言うのが正式な名前のようです。

センサの感知圏内に赤外線を発するもの（たとえば生きて体温と言う赤外線発生源である人間とか）が入ってくると、それを感知できるセンサです。

いつものごとく秋葉原の電子パーツ屋やネットショップで簡単に購入可能という理由から、人感センサとして [HC-SR501](http://henrysbench.capnfatz.com/henrys-bench/arduino-sensors-and-input/arduino-hc-sr501-motion-sensor-tutorial/) を、Arduino Uno 経由で PC に接続します。

HC-SR501 と Arduino Uno の結線方法に関しては、以下の図を参照ください。

[回路図]
![無題3.png](https://qiita-image-store.s3.amazonaws.com/0/89832/4758cedf-4319-802e-a4ae-815344c53361.png)

# 制御スクリプトについて

SG90 制御用に、以下のスクリプトを作成します。
このスクリプトにより、HC-SR501 が検知圏内に赤外線を発するものがないかを探ります。
そして赤外線を発するものを検知すると、PC の画面上に「There are intruders !」と表示します。

[制御スクリプト]

```firmata-test-004.rb
# Author       : Yoshihiko Hara <goronyanko.h@gmail.com>
# last updated : 2018/12/5
# Overview     : Control Passive Infrared Ray(HC-SR501) with Ruby on the PC.
# License      : MIT License

require "arduino_firmata"

PIN_NUMBER_OF_A0 = 2
ALERT_MESSAGE    = "There are intruders !"
DELAY_TIME       = 1

# Prepare to control Arduino from PC.
arduino = ArduinoFirmata.connect "/dev/tty.usb-device-name"

while true

  # Search for something emitting infrared rays.
  if true == arduino.digital_read PIN_NUMBER_OF_A0
    puts ALERT_MESSAGE
  end

  # Stop operation for 1 S.
  sleep DELAY_TIME

end
```

HC-SR501 はセンサ正面から 110 度、最大距離 7 m （適正検知距離 3 - 7 m ）の範囲に赤外線を発するものが侵入したか否かを検知できます。

センサーを通路の天井や、出入り口の上部に設置しておけば、誰かが通過するたびにそれを検知できそうです。
ちょっとした侵入探知機代わりになってくれるかなと思っています。

※ センサについている検知距離や検知感覚をさだめる 2 つの半固定抵抗をいじったりしないとうまく反応しないかも … しかも結構（部品により？）反応するしないがピーキーだったり

では、また。
意外と忘れがち？コンテナのrootユーザのパスワードを知らなくてもrootユーザで実行する方法

# 概要

　今さら知ったのですが、OSS系のDockerイメージを起動するとワークユーザ（root以外）で実行されることあると思います。そんな時に`docker exec`でパッケージをインスコしようとすると権限がないぞ！って怒られることがありませんか？
結局rootのパスワードがわからないし、sudoも入っていなかったりするのでDockerfileからイメージをビルドするしかありません。。。

# 解決策

docker execコマンドのオプションの`-u`で**ユーザ名**もしくは**uid**を指定することで、そのユーザでコマンドを実行することができます
もっと早く知ってれば・・・

https://docs.docker.com/engine/reference/commandline/exec/

```shell
> docker exec -i -u root centos yum update -y
```
Python Tips(予約語、組込みオブジェクト、関数の説明表示、コメント、マジックコマンド)

使うけど毎回検索してしまうTipsを整理。

#Python Tips

##予約語の確認方法
__import__('keyword').kwlist

##組込みオブジェクトの確認方法
dir(__builtins__)

##jupyter notebook
###関数の説明表示方法
shift + tab
「(関数)?」を記載し実行

###コメント
コメント行選択した状態で、command + /

##マジックコマンド
Jupyter上で「%」を記載して実行できる命令文。
[公式URL]
https://ipython.readthedocs.io/en/stable/interactive/magics.html

###マジックコマンドの種類
% : 一行を対象とする
%% : セル全体を対象とする

###使えるマジックコマンド
%lsmagic　:コマンドの一覧のみ。
%quickref : その他マジックコマンドを表示。簡単な説明付き。
%time : 実行時間の測定
%timeit : 何回か試し、最速と平均時間を返す
%sql : DBへクエリを投げることができる
%matplotlib inline : jupyter内にグラフを表示
%precision : 少数の桁数を指定
TypescriptでDate()をテスト用に設定する

Unit Testを書く際、時刻をテスト用に設定するにはPythonなら[FreezeGun](https://github.com/spulec/freezegun)などのツールがあります。今回、Ionicのテストを書いていてTypeScriptならどうするのか調べてみました。

### 部品

Javascript用の[Sinon.js](https://sinonjs.org/releases/latest/)というライブラリが良さげです。TypeScriptには[@types/sinon](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/sinon)というラッパーがあります。

### インストール

```shell
npm install --save-dev sinon @types/sinon
```

### 使い方

割と直球勝負です。単純に時刻を固定化するのならこんな感じ。

```javascript
import { useFakeTimers } from 'sinon';

let clock = useFakeTimers(new Date(2018, 12, 5, 20, 20, 20).getTime());

// これで時計は2018年12月5日20時20分20秒になります

clock.restore(); // 終わったら必ず解放
```
VMWare GDB stubを利用したBitVisorのデバッグ

個人的に最近VMWare上で開発をすることが多いのですが，VMWareにはGDB stubの機能があるのでこれを試してみようと思います．

Intel CPU, Linux上のVMware workstationで実験していますがAMDやWindows, VMWare Fusionなどでも同じようなことができるんじゃないかと思います．

## 設定
以下をVMの設定ファイル(`<VMの名前>.vmx`)に記述します．

```
debugStub.listen.guest64 = "TRUE"
debugStub.hideBreakpoints = "TRUE"
debugStub.port.guest64 = "33333"
vhv.enable = "TRUE"
```
最初の行で64bitモードでのデバッグを指定，次の行でHWブレークポイントの利用を設定しています．ページテーブルがいろいろと変わるのでHWブレークポイントでないとうまく動かないと思います．
ポート番号は適当に設定してください． また最後はnested virtualization有効化の設定です．

## GDBの実行
VMを起動後[^0]，`gdb -ex "target remote localhost:33333"` のようにしてgdbをアタッチします[^1]．

[^0]: 今回はvCPU数1で実行しています．また当然ながらBitVisorは起動しておきます．
[^1]: https://github.com/cyrus-and/gdb-dashboard を利用しています．

![image1.png](https://qiita-image-store.s3.amazonaws.com/0/153099/0180a463-2860-44e9-eec5-f5ad895995b1.png)

`symbol-file`コマンドで`bitvisor.elf`を，`directory`コマンドでBitVisorのソースディレクトリを指定してあげれば，gdb上でBitVisorのシンボルが解決できるようになります．
ここではdbgshを実行した際に呼ばれる`dbgsh()`にブレークポイントを設定しています．

ゲスト上でdbgshを実行すると，ブレークポイントに引っかかってgdbに制御が移ります．

![image2.png](https://qiita-image-store.s3.amazonaws.com/0/153099/e17044e6-1ce3-926b-281c-1a72f55782ff.png)

あとは普通にgdbでデバッグします．
本当はdbgshの動作を追いかけて説明しようかと思いましたが，思いの外大変そうだったのでやめました．気になる方は追って見てください．VMMCALLのレジスタ渡しで頑張って処理しています．
`continue`すればゲスト側で1文字入力するたびにVMMCALLが数回発行されて処理されていることが分かります．

## 動作の補足
このGDB stubはどうやって動作しているでしょうか．
VMWareがL1(BitVisor)にVMENTRYするときと，L2(BitVisor上のゲスト)にVMENTRYするときでデバッグレジスタの設定を変えてVMENTRYすれば，BitVisorのみ，あるいはゲストのみをデバッグすることができそうですが，多分そんなことはしていないので，今回の場合ではゲストのLinuxが設定したブレークポイントのアドレスを利用した場合も#BPが発生すると思います．
そうするとちょっと困ってしまうわけですが，BitVisorが利用する0x40000000-0x4FFFFFFFのアドレス空間はLinuxではユーザ空間のアドレスであり，64bit環境であればそうそう衝突することはないのかなと言う気もします．

## ちなみに
終了は`detach`を使います．うっかり`q`でKILLするとVMが異常終了して最悪2度と起動しなくなるみたいな悲劇がおこることがあります．
micro:bitでカラーLCDを使う

![image.png](https://qiita-image-store.s3.amazonaws.com/0/71746/d360d216-b250-7c00-f918-243b0cbf0f2b.png)

#内容
カラーLCDに図形、テキスト、数値を表示する

#必要なもの
[AliExpressで販売している1.8インチLCD@17USD](
https://www.aliexpress.com/item/1-8inch-Colorful-Display-Module-for-BBC-Micro-bit-160x128-Pixels-65K-Colors-ST7735S-Driver-SPI/32881263424.html)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/71746/d6c1a4f7-ab77-13c5-63e6-37161794d00a.png)

#使い方
-[旧版のMakeCode](https://makecode.microbit.org/v0)を開く(新板では拡張パッケージがエラーになります)
-高度なブロック＞拡張パッケージを追加を開く
-ダイアログに直接URLを入力し、検索
https://github.com/waveshare/WSLCD1in8
-LCD1in8を選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/71746/d5c9c34d-9d2e-b3f6-1b59-2c103986148d.png)



#サンプルコード
![image.png](https://qiita-image-store.s3.amazonaws.com/0/71746/b1e9be9c-015f-8b5f-5f85-c170efeb50ec.png)
Check! enebular editor で自作ノードが使えるか検証してみる

こんにちは！ @dz こと大平かづみです。

enebular Advent Calendar 6日目の記事を書きました。（遅くなってすみませんん…！）

## Prologue - はじめに

つい先日、痒い所に手が届く enebular editor がリリースされました！

- [enebular editor Release Notes](https://docs.enebular.com/en/Releases/#enebular-editor)
- [enebular editor](https://docs.enebular.com/en/EnebularEditor/)

enebular は、オンラインのサービス上でフローを作成・管理でき、そのフローをエッジデバイスへデプロイすることができます。enebular ならログインするだけでさっと使うことができ、フローをいくつでも、プロジェクト単位で管理できるため、 Node-RED 単体で使うよりも手間を省いて開発に集中できます。

そんな enebular ですが、SaaS として提供されているため、 Raspberry Pi の GPIO などデバイスの低レイヤーにアクセスするノードが使えなかったり、自作したノードを読み込むことができないという弱点がありました。

この弱点を打開すべく（？）リリースされた enebular editor は、 Electron 製のデスクトップアプリケーションであり、インストールしたマシン上で enebular で管理しているフローを編集できたり、エッジデバイスにデプロイしたフローを直接編集できるようになりました！便利！

ということは、ローカルで動くなら、自作したノードも enebular で動かせるのではないか！？

## enebular editor で自作したノードが利用できるのか検証

まず、通常では `<ユーザーディレクトリ>\.node-red` に該当する、 Node-RED のユーザーディレクトリがどこにあるのか探りました。

私のマシンは Windows なので、インストールしたアプリケーションのデータは AppData 配下に保存されます。その中にありました。

`%LOCALAPPDATA%\Programs\enebular-editor\resources\app\node_modules\@uhuru\enebular-node-red`

（ `%LOCALAPPDATA%` には、 `<ユーザーディレクトリ>\AppData\Local` が定義されています。）

つぎに、このディレクトリに対して、自作したノードをリンクしてみます。リンクの方法はこちらを参照しました。

- [Node-RED : Packaging - Testing a node module locally](https://nodered.org/docs/creating-nodes/packaging#testing-a-node-module-locally)

enebular editor で編集したいフローを開いておいた状態（フローの npm パッケージが一式インストールされている状態）で、下記のように、自作したノードのディレクトリで `npm link` を実行したあと、Node-RED のユーザーディレクトリで `npm link <name of node module>` を実行します。

```cmd
cd <directory that includes my own node>
npm link

cd %LOCALAPPDATA%\Programs\enebular-editor\resources\app\node_modules\@uhuru\enebular-node-red
npm link <name of my own node module>
```

`npm list` で確認すると、自作ノードが含まれていることがわかりました。

そして、いざ！enebular editor のフロー編集で自作ノードを探してみる。みつからない。 View > Reload してみても見つからない…(´･ω･\`)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/3812/04f21fa4-f5c4-0228-efe3-7d5f85fc12c8.png)

よし、一度ダッシュボードに戻ってから、またフローの編集画面を開いてみる。お…？

なるほど、そういうことなのですね。

どうやら、enebular editor は、フローの編集画面を開くときにいったん npm パッケージを全消ししてから、フローで使われるパッケージを改めてインストールしているようです。ふむ、 `npm link` した自作ノードのリンクも消されてしまうのですね～。目論見失敗 (´･ω･\`)

### 結論

現時点の enebular editor (0.9.0) では、自作ノードは利用できなさそう(´･ω･\`)

今後の更新で自作ノードも使えるようになること期待します～！✨


## Epilogue - おわりに

ということで、期待叶わずという結果になってしまいましたが、enebular editor の動きを知ることができてそれはそれで面白かったです！

enebular はフローの管理やエッジデバイスへのデプロイなど、チーム開発や本番運用に近いところが良いところなので、ノードの開発・検証は Node-RED 単体で行って、自作ノードが晴れて [Node-RED Flow Library](https://flows.nodered.org/) にリリースできたら enebular で仕上げるという流れが本来なのかもしれませんね！

良い知見となりました！今後の更新も楽しみにしております！(･ω･)ﾉ
BigQueryでレインボーテーブル攻撃をしてみた

BigQueryの計算資源を利用して、ハッシュレインボーテーブルをしてみました。
BigQueryはスキャンした実テーブルのデータ量に対して課金されるため、無からデータを生成し計算をすることによって、無料で計算することができます。

今回は以下のSHA256ハッシュを平文にしてみたいと思います。

```
ECB666D778725EC97307044D642BF4D160AABB76F56C0069C71EA25B1E926825
```

とりあえず、アルファベット小文字6文字以下の範囲を総当たり的に探索してみます。
アルファベット1文字だけのテーブルである `chars` を作成し、それを `CROSS JOIN` することですべての総当たりパターンを網羅させます。
そして、それら全てに対して、sha256を計算して、目的のハッシュ値を満たすものを表示します。


```sql
#standardSQL
with chars as (
  SELECT * FROM UNNEST(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', null]) as char
)

select str from (
select 
  concat(ifnull(a.char, ''), ifnull(b.char, ''),  ifnull(c.char, ''),  ifnull(d.char, ''),  ifnull(e.char, ''),  ifnull(f.char, '')) as str 
from chars as a 
cross join chars as b 
cross join chars as c
cross join chars as d
cross join chars as e
cross join chars as f
) where sha256(str) = b'\xEC\xB6\x66\xD7\x78\x72\x5E\xC9\x73\x07\x04\x4D\x64\x2B\xF4\xD1\x60\xAA\xBB\x76\xF5\x6C\x00\x69\xC7\x1E\xA2\x5B\x1E\x92\x68\x25'
```

実際にこのクエリを実行すると、217秒かかりました。
合計 $27^6$ 個のハッシュ値を計算したため、 1秒あたり `48,204,392` 個のハッシュ値を計算していることになります。

こちらのサイトを確認すると、SHA256は 1秒あたり 約 `1,300,000` 個のハッシュ値を計算できているので、それと比較して40倍程度の高速化を行うことができました。
https://automationrhapsody.com/md5-sha-1-sha-256-sha-512-speed-performance/
自分のベースイメージを使ってコンテナ～EHW2018「MVPをコンテナ化②」

# 概要

このエントリは、「Enterprise "hello, world" 2018 Advent Calendar 2018」の12/6向けのものです。このAdvent Calendarでは、複数個のエントリにまたがる話の流れも鑑みつつ、なるべく1エントリで１つのトピックをカバーできるようにする予定です。

このエントリで記載するトピックは、自分のアプリをDockerコンテナ化することです。

# 前提

## おことわり

## 想定読者

「Enterprise "hello, world" 2018」的なネタとしては、下記のような状況を想定しています。

> 前日に自分で作ったベースイメージを使って、Day4で作ったJavaのHelloWorldを動かせるようにする

# Dockerコンテナ化

## Dockerfile

自分で作ったベースイメージ（debian-stretch:latest）に対して、OpenJDKをダウンロードしてきて展開し、第4日目で作ったHelloWorldのクラスファイルを追加しています。

アプリの起動は、シェルスクリプトを作成し、Entrypointとしてセットしています。

```
FROM debian-stretch:latest
LABEL maintainer="YOUR ADDRESS HERE"

# shuld do apt-get update in base image
RUN mkdir /usr/local/openjdk
RUN wget --no-check-certificate https://download.java.net/java/GA/jdk11/13/GPL/openjdk-11.0.1_linux-x64_bin.tar.gz
RUN tar zxvf openjdk-11.0.1_linux-x64_bin.tar.gz -C /usr/local/openjdk
RUN rm openjdk-11.0.1_linux-x64_bin.tar.gz

RUN mkdir /opt/ehw
COPY HelloWorld.class /opt/ehw
COPY ./docker-entrypoint.sh /
RUN chmod +x /docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]
```

## docker-entrypoint.sh

```bash
#!/bin/sh
cd /opt/ehw
/usr/local/openjdk/jdk-11.0.1/bin/java HelloWorld
```

## HelloWorld.class

Advent Calendar 第4日目で作ったものを使います

## Makefile

```makefile
create-image:
        sudo docker build . -t vanilla-hw
``

## コンテナをビルド

```
$ make
```

## 実行

作ったイメージでコンテナを起動してみます。

```sh
$ sudo docker run vanilla-hw
hello, world
```

無事動作しました。


# まとめ

このエントリでは、「Enterprise "hello, world" 2018 Advent Calendar 2018」(EHW2018)の6日目として、

自分のベースイメージを使い自分のアプリをコンテナ化することをトピックとして取り上げました。

EHW2018のネタとしては、このあと、このプログラムと同じような目的を持つものを現代的なツール群を用いて、なるべくめんどくさく実現していくことを考えています。
OAuth認証APIが簡単に書けた！

これは[ユアマイスター Advent Calendar 2018](https://qiita.com/advent-calendar/2018/yourmystar)の7日目の記事です。

以前、[QiitaのAPIv2を使用して自身の記事取得](https://qiita.com/tatsuo-iriyama/items/c1e56c1a197e39087b6e)の記事を書いた時にPHPの[cURL関数](http://php.net/manual/ja/ref.curl.php)を使ってAPIを作成しました。

業務の中でAPIを触る事があり、そこでCakePHPの[HttpClientクラス](https://book.cakephp.org/3.0/ja/core-libraries/httpclient.html)を使用していたのをみて、置き換えたらどうなるのか、興味本位で構築してみたら非常に簡単だったので、備忘録として記載します。

##HttpClientを使用したOAuth認証API
```php
<?php 
use Cake\Network\Http\Client;

##OAuth認証メソッド
private function httpClient($accessToken, $url)
{
    $http = new Client([
        'headers' => [
            'Authorization' => 'Bearer ' . $accessToken
        ]
    ]);

    $response = $http->get($url);
    return $response;
}
```

HttpClientクラスをインスタンス化する際に、headerオプションを使用し、Authorizationにtokenを指定。

インスタンス化したHttpClientクラスのgetメソッドに、リクエスト先URLを指定する事でデータを取得する。

参考:[https://book.cakephp.org/3.0/ja/core-libraries/httpclient.html]

これで簡単にOAuth認証ができます。
そのままコピペで使えると思うので、使用したい方は是非。

##cURLを使用したOAuth認証API
```php
private function curl($accessToken, $url)
{
    $ch = curl_init();

    $options = [
        CURLOPT_URL => $url,
        CURLOPT_HTTPHEADER => [
            'Content-Type: application/json; charser=UTF-8',
            'Authorization: Bearer ' . $accessToken
        ],
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_CUSTOMREQUEST => 'GET',
    ];

    curl_setopt_array($ch, $options);
    $response = curl_exec($ch);
    curl_close($ch);

    return $response;
}
```

`curl_init()`で初期化し、`curl_setopt`の`CURLOPT_HTTPHEADER`オプションにtokenを指定。

`CURLOPT_CUSTOMREQUEST`オプションにHTTPメソッドを指定、`CURLOPT_RETURNTRANSFER`オプションをTRUEとして文字列として値を返すよう指定。

`curl_exec`でcurlを実行。

参考：[http://php.net/manual/ja/function.curl-setopt.php]

比較対象としてcURL関数を使用した場合も記載しました。

##処理速度が早いのはどっち

PHPの[microtime](http://php.net/manual/ja/function.microtime.php)関数を使用してresponseが返ってくるまでを計測してみました。

実装コードはこちらです。

```php
$start = microtime(true);
$this->httpClient($accessToken, $url);
// or
$this->curl($accessToken, $url);
debug(floor(1000 * sprintf("%.10f", microtime(true) - $start)));
```
処理の流れとしては、
1. 計測開始位置を定義
2. APIを呼び出す
3. 計測開始位置からdebugまでを引き、[sprintf](http://php.net/manual/ja/function.sprintf.php)関数を使用して小数点以下を10桁表示。
　単位m/sで求めたい為、1000を掛ける。
　[floor](http://php.net/manual/ja/function.floor.php)関数を使用して小数点以下を切り捨て。

※debug部分は出力すれば他の関数でも良い


###実行結果
<img width="1342" alt="スクリーンショット 2018-12-06 18.20.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/267738/97e62f54-39a2-b437-2de6-184eefdc8697.png">


あまり変わりませんでした。
誤差の範囲内という感じでしょうか？


##まとめ

直感的に記述量の少なさからHttpClientクラスを使用した実装の方が良い気が…

もっとHttpClientクラスとcURLがどういうクラス、または関数か、を知れば明確な選択が出来ると思うので、深掘りしてみます。
もしHttpClientクラスの方が良い、もしくは、cURL関数が良い、があれば理由や根拠付きで是非コメント下さい！

##おまけ

Twitterやってます！外部のエンジニアの方ともどんどん繋がりたいと考えていますので、是非フォローして頂ければと思います！[@Tatsuo96](https://twitter.com/Tatsuo96)
p.s.今年の2月までは溶接職人でした。ガッツ系エンジニアとしてやらせて頂いております。
shellscriptドキュメント作成ツールのリスト [WIP]


shellscript用のドキュメント生成ツールは、pythonやJavaとは異なりスタンダードなものがない印象があります。
（そもそもドキュメント生成される機会が少ないからかもしれない）
そこで、いくつか発掘したツールたちを並べておこうと思います。
尚、筆者も独自拡張付きのツールをいつか作ります（いつか）。

---

# shocco.sh

> Literate documentation tool for shell scripts (a la Docco)

公式HP: [rtomayko.github.io/shocco](https://rtomayko.github.io/shocco/)

Coffee Script用のドキュメント生成ツール、 `Docco`のシェルスクリプト版です。
マークダウンでの表記に対応しているようです。
ただしGithubではすでにアーカイブされており、 *公式のフォローはもうない* ようです。コミュニティで運営してるかもですが。
特定の構文はなく、人間が読みやすいように書くことができます。
公式HPとしてのせたURL先の文書もshoccoで生成されたようなので、見てみるとイメージがつかめるかもしれません。

|               |                 |
|:-:            |:-:              |
| 表記スタイル  | *書式なし* Q&D  |
| 変換先        | HTML            |
| 出力          | stdout          |


# HeaderDoc

公式HP: [HeaderDoc](https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/HeaderDoc/intro/intro.html)

Appleが使用している(していた)ツールです。
今は使われていないのか、ダウンロードページが消えています。
しかしMacでCommand Line Toolsを入れている場合は自動的に入ってい流ので使用することができます。

# bashdoc

公式HP: [bashdoc](http://sourcemage.org/bashdoc)

JavaDocを基にして作られており、様々なタグをサポートしています。

# bashdoc

公式HP:[ajdiaz/bashdoc](https://github.com/ajdiaz/bashdoc)

同名の別実装です。

|               |               |
|:-:            |:-:            |
| 表記スタイル  | 独自スタイル  |
| 変換先        | HTML          |
| 出力          | stdout        |

## 表記スタイル

Githubには

> このスクリプトはJavaプロジェクトにとってのJavadocのように振舞います
> > This script works similar to javadoc for java projects

とありますが、文法は独自なようです。

| # mod: modname | モジュール名 |
| # fun: funsignature | 関数の使用方法(パラメーター等) (但し説明はここには書かない) |
| # txt:  | 前の定義(`mod`か`fun`)の説明用テキスト |
| # opt: param: ... | オプションや関数へのパラメーターの説明 |
| # env: VAR: ... | `VAR`と命名された環境変数への説明 |
| # use: ... | その関数やモジュールの使用例 |
| # api: ... | その要素に対してAPI名を指定。この名前を使って、最終的なドキュメントになんの関数やモジュールの説明を入れるか決めることができる |

# TomDoc

> Parse TomDoc'd shell scripts and generate pretty documentation from it

公式HP: [tests-always-included/tomdoc.sh](https://github.com/tests-always-included/tomdoc.sh)

Rubyのドキュメント生成ツールであるTomDocスタイルでコメントをかけるようにするツールです。

|               |                     |
|:-:            |:-:                  |
| 表記スタイル  | TomDoc              |
| 変換先        | mardown/plain text  |
| 出力          | stdout              |

# RoboDoc

公式HP: [RoboDoc](http://rfsber.home.xs4all.nl/Robo/robodoc.html)
合成数列の和を求める - Wolfram Alpha

# お題

## 【ルール】

### 入力として正の整数 N を与えたら 4 から始まる 合成数 の数列の 1 番目から N 番目までの合計を出力してください

### N は最大で 100 とします

これに、Wolfram Alpha ~~で~~が挑みます。

# 結論

コード(?)は以下です。

```
sum of composite numbers from 1 to 3
```

ここで、3と書いてあるところには任意の100までの数を入れます。

実際にやってみました。

<img width="809" alt="スクリーンショット 2018-11-02 9.50.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/94255/22059fb2-2532-d595-5147-9f908ef2d541.png">

https://www.wolframalpha.com/input/?i=sum+of+composite+numbers+from+1+to+3

1000とかでもすぐ計算してくれますね。すごい！

# 完全に出オチなんですけど、一応説明をば

Wolfram Alphaというのは、Mathematicaなどを開発しているWolfram researchの誇る、質問応答システムです。
日本語版Wikipedia:
https://ja.wikipedia.org/wiki/Wolfram_Alpha

文章で、このような質問を投げかけると、がんばって答えてくれます。えらい。
積極的に遊びましょう。
Qiitaにも、いくつかの記事があるようで、WolframAlphaというタグが既に存在していました。

# おまけ

他にこんなこともできます！

## 例その１：ベン図を書いて丁寧に答える「(X∩(Y∪Z∪W)) は (Y∪X) の部分集合か」

https://ja.wolframalpha.com/input/?i=(X%E2%88%A9(Y%E2%88%AAZ%E2%88%AAW))+%E3%81%AF+(Y%E2%88%AAX)+%E3%81%AE%E9%83%A8%E5%88%86%E9%9B%86%E5%90%88%E3%81%8B&lk=3
<img width="815" alt="スクリーンショット 2018-11-18 22.52.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/94255/350954d3-0c0d-f585-105d-eed3d53a36f4.png">

## 例その２：特定の抵抗の近似値をE系列で代替する

https://ja.wolframalpha.com/input/?i=64k%CE%A9

<img width="773" alt="スクリーンショット 2018-11-18 22.57.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/94255/9d6f0a05-6e9b-163a-b044-37fecbe02d55.png">

# おしまい

たのしめ！

なお、例その１・その２は[Qiitadon](https://qiitadon.com/)のTootが元になっています。

https://qiitadon.com/@mafumafuultu/101091678542896786
https://qiitadon.com/@sharow/101089820451539421
NanoPi Neo でFreeBSD (ビルド編)

##  NanoPi Neo とは
Raspberry Pi より ちっちゃい ARM ボードです。 
![P_20181203_000726.jpg](https://qiita-image-store.s3.amazonaws.com/0/103137/ca65edb6-a95f-a02b-8818-93d065c8cfb3.jpeg)
上が Raspberry Pi 2、下が NanoPi Neoです。

ちっちゃいですが、CPUは クアッドコア1.2Gのプロセッサ(Allwinner H3 Quad-core Cortex-A7)で、結構パワフルです。
具体的なスペックはこちら[NanoPi Neoのスペック](http://nanopi.io/nanopi-neo.html) 

RaspberryPi などと違って、HDMIなどの画面出力はありません。シリアルコンソールやネットワーク経由で操作します。

デスクトップ用途も考えられているRaspberryPiと違い、USBコネクタ(最初からついている１つとヘッダピンから自前で配線する形で２つ)や GPIO ピンなどに外部機器を繋いで、色々制御することに特化しています。小さいボードですからいろんな所に忍び込ませやすそうです。

秋月で [NAS として使うキット](http://akizukidenshi.com/catalog/g/gM-12591/) なんかも売られてます。

## FreeBSD イメージビルド
NanoPi Neoで FreeBSD を動かすには、イメージのビルドから始める必要があります。Raspberry Pi などと違って予めビルドされたイメージを FreeBSD公式で配布していないためです。

ビルドは crochet ツールを使います([crochet 公式](https://github.com/freebsd/crochet))。Raspberry Pi などのARMボードをお手軽にビルドするスクリプト群です。
crochet ツールには予めいくつかのボードの設定ファイルが入っているのですが、そこにも NanoPi Neoはありません。
ですが、同じAllwinner H3 を使用した [Orange Pi One](http://www.orangepi.org/orangepione/)の設定をちょっとだけ修正するだけで、設定ファイルはだいたいそのまま流用することが出来ます。
Orange Pi One の設定をコピーしてNanoPi Neo の設定を追加した crochet ツールのリポジトリをgithubに作りましたの( https://github.com/s-mitu/crochet )。以下はそれを使ったビルド手順です。FreeBSD amd64 環境(current r341355で確認しています)で以下の手順を実行します。

###ビルド手順

- NanoPi Neo用 u-boot のインストール
pkg/ports の sysutils/u-boot-nanopi-neo をインストールします。crochet ツールで使用します。

```
# pkg install sysutils/u-boot-nanopi-neo
```

- /usr/src に FreeBSDソースを用意

current のソースなら

<pre>
# cd /usr
# svn co svn://svn.freebsd.org/base/head src
</pre>

とりあえず r341355 でビルド成功しています。

- crochet ツールをダウンロード

```
# git clone https://github.com/s-mitu/crochet
```

- crochet 実行

```
# cd crochet
# sh crochet.sh -c config.sh.nanopineo
```

これでビルド開始です。
数時間放置すれば、work ディレクリ以下に

```
# ls work/*.img
work/FreeBSD-armv7-13.0-GENERIC-341355M-NanoPi-NEO.img
```

というような感じのイメージが出来上がるはずです。
4GB 以上のmicroSDに dd コマンドでイメージを書き込みます。

```
# dd of=/dev/(microSDディスクのデバイスノード) of=work/FreeBSD-armv7-13.0-GENERIC-341355M-NanoPi-NEO.img bs=2m
```
(microSDディスクのデバイスノード)は da? とか mmcsd? とか環境に合わせて。間違って他のディスクに書き込むと悲惨なことになるのでなるべく不要な外部ストレージは引っこ抜いておいて実行したほうが安心です。

次回は実際に書き込んだイメージでブートして、何が動いて何が動かないのか確認します。
VC#でデスクトップマスコットの制作

呉高専Advent Calendarの最初の記事(12/1)から相当時間があきましたがいかがお過ごしでしょうか．
ぞーいです，

タイトルの通り，Visual C#で美少女のデスクトップマスコットを作成したときのお話をしたいと思います．

#概要
- 動機
- ダイマの時間
- 実際にやってみる
- 感想的な何か

#動機
何か便利なデスクトップマスコット的何かがあればうれしいなあって思ったからです。
ここでwindowsの便利機能の1つである、cortanaとかカイルについて少し考えてみましょう。

**cortanaとカイルの欠点**

- かわいくない
- かわいくない
- 不要な機能が多い
- Edge
- かわいくない

ので，
![image.png](https://qiita-image-store.s3.amazonaws.com/0/221738/6bb0b3ff-80d8-b2ab-f4f5-c3016b8a11f5.png)
上の画像のようなことになってしまうわけです．

**つまり**

- かわいくて
- 必要な機能しかなくて
- かわいい

ものを作れば，作業効率も爆上がり間違いなしですね．

ここで今回私の作業効率や，のために力を貸してくれる美少女を紹介したいと思います．

「[アイドルマスターシンデレラガールズ](https://cinderella.idolmaster.jp/)」より，アイドルの十時愛梨ちゃんです．

#ダイマの時間
ここで十時愛梨ちゃんについて，どういう子なのか多少の説明をさせていただきたいと思います．

**十時愛梨**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/221738/fc40cf24-d63a-122e-9ca6-e61a85e977d8.png)

- 年齢 : 18歳
- 学年 : 大学1年生
- 身長 : 161cm
- 体重 : 46kg
- スリーサイズ : 86-58-88
- 趣味 : ケーキ作り
- 誕生日 : 12月8日
- CV : 原田ひとみさん
    - 出演 : 夜々( 機巧少女は眠らない )，姫路瑞希( バカとテストと召喚獣 ) など

第1回シンデレラガールズ総選挙( 登場アイドル全員での人気投票 )で1位を獲得するような凄い子なんです．
でも、割と天然な子で，熱くなるとすぐ服を脱ごうとしちゃったりする危ない子でもあります．
そして，この記事が公開される，12月8日がお誕生日です．非常におめでたいですね．
ということで(？)アイドル十時愛梨の事を少しでも気になってくれたら非常に嬉しいです．

#実際にやってみる
さて私の担当アイドルの紹介は置いておいて，実際にマスコットを作ってみます．
なんでC#か？という事ですが，授業でちょっとやっただけですがフォームアプリケーション関連ならかなり便利だなあというのを実感したからです．本当はこっちの方がめっちゃ楽に実装できるよみたいなのもあるかもしれないです．
とりあえずやったことを項目として挙げておきます．

- 画像の描画
- テキストボックスの描画
- テキストボックスに入力された内容に応じての出力

###画像の描画
pictureBoxで描画するだけです。割愛します。

###テキストボックスの描画
textBox.Visibleというbool型のパラメータが，テキストボックスが可視状態かどうかを決定しています．

```C#
private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
    if(e.KeyValue == 18 )  //18:Alt Key Num
    {
        textBox1.Visible = !textBox1.Visible;
    }
}
```

フォームのイベントハンドラのKeyDownを設定してからこれを実行すると，Altキーを押す度にtextBox1の可視，不可視状態を任意で切り替えることができます．
~~(まだまだ弱い私はイベントハンドラの設定し忘れで数十分間悩み続けました．)~~

###テキストボックスからの出力
テキストボックスに入力された文字列に応じて，日頃よく使用するアプリケーションやファイルなどを割り当てようとしました。
ここで使うのが

```C#
System.Diagnostics.Process.Start(@"アプリケーション、ファイルのディレクトリ","コマンドライン引数");
```
です．コマンドライン引数は別にあってもなくてもアプリケーションは起動します．

これを，テキストボックスが可視状態の時にエンターキーが入力された場合のテキストボックス内のテキストに応じて，アプリケーションなどに割り当てました．

一例がこちらです．メモ帳を起動させようとしています．

```C#
if(textBox1.Text == "memo")
{
    Process.Start(@"C:\Windows\system32\notepad.exe");
    //System.Diagnosticsはusingで定義済み
}
```

こんな感じで思うようにアプリケーションなどのショートカットが仕込めるようになりました．
実際に使ってみた様子がこちらになります．
![airi1.gif](https://qiita-image-store.s3.amazonaws.com/0/221738/3c8efddd-af0e-693c-0d80-d8ee6c6d36c4.gif)

私の指示に従ってメモ帳を起動してくれる愛梨ちゃん，とてつもなくかわいいですね．

別のウィンドウを開いていても最前面に呼び出せる機能や，ショートカットに登録してない単語を入力した場合にchromeで検索してくれる機能などもつけたかったのですが，この記事を執筆している時点ではできていません．
また後日ｶﾞﾝﾊﾞﾘﾏｽ．

#感想的な何か
C#を使ってみたかったっていう個人的な目標は満足されました．
あと十時愛梨ちゃんの誕生日に合わせてちょっとだけでもいいから何かをしたいという密かな願いも叶える事が出来ました．
ただ，定期試験などの都合上，開発に割ける日が想定より少なくなってしまい，予定していた機能を実装させることができなかったのは反省しています．
今後もちょっとはアップデートをしていきたいなという気持ちなので，今後のアップデートにこうご期待ください．
最後に季節的にもちょうど良いので，ゲーム内にて登場した，サンタクロースの衣装を着た愛梨ちゃんを貼って，お茶を濁しておこうと思います．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/221738/05ba0a67-fdec-c9eb-a4dc-2adebe35710f.png)

非常に可愛いですね．
そしてここまでこの記事を読んでくださり本当にありがとうございました．
vim マクロの使い方

# vim マクロ
vimのドットコマンドはちょっとした変更を繰り返すのに使えました。

> [vim . ドットコマンドの使い方]
(https://qiita.com/satokibi/items/a23a9bb0b68326ee526a)

しかし、もっとたくさんの変更を繰り返す場合にはドットコマンドでは足りないです。

そこで、マクロを使うことによっていくつもキーストロークを保存し、繰り返すことができます。


# 使い方

## マクロの記録
「`q`キー + 任意のアルファベット(数字も?)」 でマクロの記録を開始します。
ステータス行に「recording」(「記録中」)と表示されたら、記録が開始しています。

記録を終了するにはもう一度`q`キーを押します。

### 例

行末にセミコロン、行頭に`var `をつけるマクロを記録してみます。

|コマンド|説明|
|---|---|
|`qa`|マクロの記録を開始|
|`A;<Esc>`|行末にセミコロンを挿入|
|`Ivar <Esc>`|行頭に`var `の挿入|
|`q`|記録の終了|

![bbb.gif](https://qiita-image-store.s3.amazonaws.com/0/260131/c2754ec2-220f-f1fa-9464-29a8d76ed9e4.gif)

## 記録の確認
`:reg` で記録されているマクロの確認ができます。

`:reg a` とすると`qa` で記録したものが確認できます。 

![g.gif](https://qiita-image-store.s3.amazonaws.com/0/260131/519a877b-f78a-57da-9244-867bb23946cd.gif)

見え辛いですね、、

```
:reg a
--- レジスタ ---
"a   A;^[Ivar ^[
```

※`<Esc>`キーは`^[`で表現されています


## マクロの実行
「`@`キー + 記録したアルファベット」でマクロを実行する。
`@@` キーで直前に呼び出されたマクロを繰り返します。

### 例
行末にセミコロン、行頭に`var `をつけるマクロの実行。

|コマンド|説明|
|---|---|
|`j`|1行下に移動|
|`@a`|マクロの実行|
|`j`|1行下に移動|
|`@@`|直前に呼び出したマクロの実行|

![aaaaa.gif](https://qiita-image-store.s3.amazonaws.com/0/260131/c942d1fd-a92a-4a31-180b-71607aa811ea.gif)


## インクリメントするマクロ

|コマンド|説明|
|---|---|
|`qa`|マクロの記録を開始|
|`yy`|1行コピー|
|`P`|カーソルの下の行にペースト|
|`<Ctrl-a>`|インクリメント|
|`q`|記録の終了|
|---|---|
|`@a`|マクロの実行|
|`@@`|直前に呼び出したマクロの実行|

![aaaaaaa.gif](https://qiita-image-store.s3.amazonaws.com/0/260131/c269ae53-7eb5-e19b-03f9-7830818b9809.gif)


# まとめ
|コマンド|説明|
|---|---|
|`q{任意のアルファベット}`|マクロの記録を開始|
|`q`|記録の終了|
|`@{記録したアルファベット}`|マクロの実行|
|`@@`|直前に呼び出したマクロの実行|



# 参考

- [vim の マクロ記録、閲覧、削除](https://qiita.com/Go-zen-chu/items/5464fb6b9e6b38c958bd)
- [実践Vim 思考のスピードで編集しよう!](https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5Vim-%E6%80%9D%E8%80%83%E3%81%AE%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%81%A7%E7%B7%A8%E9%9B%86%E3%81%97%E3%82%88%E3%81%86-Drew-Neil/dp/4048916599)
ボイスワープのON/OFFを自動化してみた

[JX通信社 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/jxpress)、8日目担当のkain_jyです。

社内の業務改善で取り組んだ小ネタを。

## 背景

弊社では抱えている顧客の業務上、深夜や休日でも会社の代表電話宛に電話がかかることがあります。

そういった顧客に対応するため、業務時間外に会社の代表電話宛への架電を、会社以外からも受けられる別の電話番号へ、電話転送（ボイスワープ）するようにしています。ボイスワープのON/OFFの設定は担当者を決め、業務開始・終了時に設定するようにしていました。

ですが、担当者がボイスワープをON/OFFするのを忘れてしまったり、風邪で休んだりしたときに別の人がいちいち設定方法を調べたりと、無駄な業務が増えてしまいました。

## 方針

そこで、ボイスワープの設定を自動化できないか、試みてみました。

ボイスワープ（NTT東日本・ひかり電話）の設定方法は3通りあります。

1. 転送元の電話からの操作
2. 外出先など別の電話からの操作（リモートコントロール）
3. インターネットを利用した設定操作

仕事でTwilioを少し触ってて楽しかったため、2を試してみることにしました。

ちなみに、1は社内の電話設備的に難しいため断念。3はサイトが意外に複雑で、ブラウザの自動操作させるのが面倒なため、一旦保留。

## 実装

まずは、転送元の電話から、リモートコントロールする際に使う[暗証番号を登録](https://flets.com/hikaridenwa/use/pdf/voice.pdf)してメモっておきます。

次に、Twilioで音声が有効な国内の電話番号を取得して、電話番号とアカウントSID、AUTHTOKENをメモっておきます。

これで事前準備は完了。

弊社ではPythonを業務で使うことが多いため、今回はAWS Lambda（Python）で実装してみます。

```main.py
import os
from twilio.rest import Client as TwilioClient

SECRET = os.environ['SECRET']  # 転送元の電話で設定した暗証番号4桁

TWILIO_ACCOUNT_SID = os.environ['TWILIO_ACCOUNT_SID']  # TwilioのアカウントSID
TWILIO_AUTHTOKEN = os.environ['TWILIO_AUTHTOKEN']  # TwilioのAUTHTOKEN

TWILIO_CALLER = os.environ['TWILIO_CALLER']  # Twilioで取得した電話番号

TWILIO_EMPTY_MESSAGE = "https://twimlets.com/message"  # 空メッセージを返すTwiML
NTTEAST_VOICEWARP_TEL = "+81363044141"  # ボイスワープのリモートコントロール用アクセス番号（NTT東・ひかり電話）

twilio = TwlioClient(TWILIO_ACCOUNT_SID, TWILIO_AUTHTOKEN)

def handle(event, context):
    target = event['target']  # 転送元の電話番号
    status = event['status']  # 1:開始、0:停止

    # NTT東日本のひかり電話のボイスワープリモートコントロールでは、自動応答のあと、
    # 転送元電話番号 + 暗証番号 + 1 or 0（転送開始・停止） + 1（確認）とダイヤルします。
    # 'w'はTwilioの仕様で、'w'一文字につき0.5秒待ってから次のダイヤルを送るという意味です。
    # https://jp.twilio.com/docs/voice/twiml/number#examples-1

    send_digits = "wwwwww{}#wwwwww{}#wwwwwwwwwwwwwwwwwwww{}wwww1".format(target, SECRET, status)

    twilio.calls.create(
        url="https://twimlets.com/message",
        from_=TWILIO_CALLER,
        to=NTTEAST_VOICEWARP_TEL,
        send_digits=send_digits
    )
```

このスクリプトとtwilioのpythonライブラリを[パッケージング](https://aws.amazon.com/jp/premiumsupport/knowledge-center/build-python-lambda-deployment-package/)し、AWSのコンソール画面からアップロードして関数を作成します。

ボイスワープを開始する場合は、イベントから

```json
{
  "target": "転送元の電話番号",
  "status": 1 or 0   # 開始 or 停止
}
```

を渡してください。

さらに、この関数に要件に応じたトリガーを設定してあげれば、自動化完了です。


## まとめ

Twilio + AWS Lambdaを使って、ボイスワープ設定を自動的にON/OFFするようにした取り組みについて紹介しました。ほんのちょっとしたことですが、こういった雑務がなくなることは気持ちよく仕事するために大事なことだと思っています。

いずれGoogle Duplexのような音声チャットボットが進化して、電話の受付自体が自動化するような、そんな未来を期待したいですね。
sinatraでメモアプリ ( without DB )

ruby初学者がsinatraを使ってのwebアプリを作るまでの経緯をメモ。
制作途中のコードが残しておかなかったので、（gitも使ってなかった）最終的な制作物のコードしかない。

## 制作課題
fjordbootcampでの学習課題としてはsinatraを使ったメモアプリをつくる。
>-制作条件-
追加はPOSTメソッド、編集はPATCHメソッド、削除はDELETEメソッドで実装すること。
データはファイルに保存すること。（DBを使わないこと）

## 制作物
https://github.com/jantyran/my-memo

# 制作過程

## Step１　sinatraの学習&雛形になるアプリの作成
sinatraについて、簡単に学びながら、メモアプリの雛形として、下記サイトの簡易BBSアプリを制作

> sinatra入門
> https://qiita.com/kimioka0/items/751e460cbb59c70379c6

## step2　viewテンプレートとルーティングの作成
制作したBBSアプリからメモアプリに変えるために必要なルーティングの修正とテンプレートの作成

主なテンプレートファイル
layout.erb
index.erb --- toppage（メモの一覧）
create.erb --- 新規メモ作成ページ
memo_details.erb --- メモの詳細ページ
edit.erb --- メモ編集ページ

## step3 編集の処理を追加
先のbbsアプリではテキストの追加と削除のみしかできなかったので、メモの編集ができるようにするための処理をかく。

ここまででできれば、cssさえ整えればメモアプリ自体は完成。
ここからは、DBからjsonファイルに変更する作業へ。

## step4 データをファイル保存のためのコード修正
DBではなくデータの保存・読み取りをファイルで行わないといけないという条件
これは結構大変だった。
そもそも、ファイルへの書き込みを行うのをどうやって行うかコードのイメージがわかなかったし、どんなファイル形式にすればいいかでも悩んだ。

パッと考えて、.txt, .csv, .jsonが浮かんだ。
.txtはなんかすごく大変なことになることがわかったので、候補からまずはずし、
（配列とか、区切り等を識別させるコードを書くのがなんかめんどいことになりそうだったため。）csvはofficeソフトがなんか好きじゃないから避けて、プログラマーに一番なじまれていて、rubyでも読み取りも書き込みも簡単にできそうということでjsonファイルを選んだ。

下記サイト(他にも見たけどメモし忘れた)等を参考にしてjsonの扱い方を学習
> Rubyでハッシュの要素を更新・追加・削除する
> https://uxmilk.jp/43303
> https://uxmilk.jp/21132
>RubyでJSON形式のデータを取得し、パースした結果を表示する
>https://qiita.com/nishina555/items/48cfc3eb80a78cbe51b9

jsonファイルを先に下記のように書いた。

```
{
	"memos":[
		{"id":"10","title":"memo1","body":"test memo"},
		{"id":"11","title":"memo2","body":"test memo2"},
		{"id":"12","title":"memo 3","body":"test memo3 yeah!"}
	]
}
```

そののち、jsonファイルの読み込みから表示をまず実装し、その後、追加、変更、削除を実装（コードの書き換え）を行った。

## step4 リファクタリング
メソッド化できるものはメソッド化、グローバル変数にできるものはグローバル変数に対応といったようにコードの可読性をあげられるようにした。

## 感想
今回はDBを使わないことが一番大変に感じられた。DBを使っていた際は一行ですんだ処理もファイルへの読み書きを行うのに調べて、書いて動作を確認するという作業がなんども出てきた。
今回の課題によってrubyでのjsonの扱いを一番に学べたと思う。

また、今回はクラスを使うことをしなかったが、次の課題からはクラスを積極的に使うようにしていきたいと思う。
EQS Generatorを使用する際の注意

今回は、私がEQSで自作のGeneratorを使用する際に少し戸惑った点についてお話していければと思います。

#はじめに
Generatorはほとんどの場合、**Env Query Context**が必要なので作りましょう。
とりあえず、実験段階なので **BP_testContext**という名前の**Env Query Context**クラスを作成しました。
今回、**Env Query Context**の詳しい話はしませんので、よく知りたい方は[公式ドキュメント]( http://api.unrealengine.com/JPN/Engine/AI/EnvironmentQuerySystem/QuickStart/10/?utm_source=docs&utm_medium=twitter&utm_campaign=uesocial)をどうぞ。

#BP_testContext
**BP_testContext**でOverrideした関数は、**ProvideLocationsSet**だけです。
![ProvideLocationsSet.png](https://qiita-image-store.s3.amazonaws.com/0/150286/b94ef362-3871-172e-e5e3-966b9ed06b85.png)
こちらはVector型の配列を返すだけの基本的な関数です。


#Generatorを自作
今回はこんな感じのGeneratorを自作しました。Generatorの作り方ですが、[こちら]( http://api.unrealengine.com/JPN/Engine/AI/EnvironmentQuerySystem/UserGuide/?utm_source=docs&utm_medium=twitter&utm_campaign=uesocial)をどうぞ。
![DoItemGeneration.png](https://qiita-image-store.s3.amazonaws.com/0/150286/6e7debb2-fbe5-a6d6-1fd9-aec483cf3741.png)
こちらの **Do Item Generation**ですが、Overrideしただけです。

感のいい方ならお気づきでしょうが、引数の**Context Locations**には先ほどの、**BP_testContext**のVector型の配列が入ってきます。

#準備完了！
さっそくEQSのクラスを作成して実装していきましょう。
今回はこんなEQSクラスを作成しました。
![EQSFindCoverLocation.png](https://qiita-image-store.s3.amazonaws.com/0/150286/484fd6da-ac0c-3558-c144-30421eedf583.png)

#Behavior Treeで動かすぞ！
![RunEQSQuery.png](https://qiita-image-store.s3.amazonaws.com/0/150286/36083ea8-4722-2a03-8908-e41e36774475.png)

#いざプレイ！
あれ....動かない....。


#本題
ずばり、原因はコレ
![EQSGen.png](https://qiita-image-store.s3.amazonaws.com/0/150286/e4bfd72e-6e6b-b9c5-e021-e88ca28d4726.png)
**Generatorタブ**の**Context**と、**Generated Item Type**が**None**になってるのが問題です。
これだと、何をしようが**Behavior Tree**で動きません。(正確には失敗が返される)

#直せばイイじゃん
![EQSGenFix.png](https://qiita-image-store.s3.amazonaws.com/0/150286/479a78ad-fd47-88a0-15fb-58bb12547a9c.png)
直しました。よし、これで動くはずだな......。

#動かない......。
神に祈ろうが、お風呂に入ってサッパリしようが動きません。
すべての元凶は、**自作したGenerator**にありました。
![EQGFix.png](https://qiita-image-store.s3.amazonaws.com/0/150286/d9743a49-fffb-b5ad-0d10-334c30e1360e.png)
**Generator**も**EQS**と同様に、**Context**、**Generated Item Type**を変更しないと上手く動作しないらしいのです。

#動いた！一件落着！！
お疲れさまでした。もし同じことで悩んでいる方が私の記事を見て、少しでも助けになったのであれば幸いです。