OmniAICreator/Qiita-1.07M huggingface dataset:
Vintage SOC

もうすぐ[12.0がリリース](https://www.freebsd.org/releases/12.0R/schedule.html)されますが、今回始めてリリースに入る自分が作った二つのSOCサポートの事を書きます。

# RT1310(arm)

2015年のFreeBSD Advent Calendarに書いたサポートなのですが、その後レビューに入れてheadに入れてもらいました。当初から開発はZRouterでのビルドでおこなっていました。後から気がついたのですが、ZRouterはgcc強制のオプションで動いていて、自分が始めた当時、既にarmのビルドのデフォルトはclangに変更されていたのですが、gccで開発できた事が幸いしました。というのはその後はclangに変更したのですが、clangのフルビルドはgccの10倍近く時間がかかり、新規に開発はかなり厳しい物があるからです。

このサポートをやったのは、armってどんな物なのか知るためと、RT1310がアーキテクチャがシンプルだったからです。

RT1310は古いarmv5tと古いアーキテクチャでもう消されてしまったsys/arm/lpcをベースに作りました。armのサポートが入ってからevent timerやfdtやintrngが入って、古いSOCのコードにはこれらが入っていなかったりしたのですが、RT1310は全て入れて作ってあります。

armのfdtサポートはよくできててmachindepにほとんどコードが必要なくなっています。ただdevmapはdtsから拾ってるのではなくて直値でデバイスがある範囲のアドレスを指定していて、ちょっといけてないです。

12リリース直前になってimpさんがいろいろ古いコードを消し始めて、危うく消されそうになりましたが、ちゃんと動いていて消される筋合いはなく、どうにかリリースにたどり着けました。

コードのありかはsys/arm/ralinkです。

RalinkはMediatek買収されてなくなってしまいましたが、RT1310には後継チップがなくこれっきりだったのと、5VTechnologiesのOEMだったのですが、オリジナルは入手できなかったので、ralinkとしました。

メモリ16MのFlashが4MのBUFFALOのWZR2-G300Nがリファレンス機種です。WIFIのサポートはやってません。

ifが2つあるので自宅でbridgeにしてして使っていますが、結構安定して動いてます。

以下の二つのファイルはReleaseに入っていないので私のzrouterのブランチにあるファイルを使っています。これがないとrootfsがマウントできません。

```
        modified:   sys/dts/arm/wzr2-g300n.dts
        modified:   sys/geom/geom_flashmap.c
```

# AR531x(mips)

このチップはFONの古いモジュールで使われてて、NetBSDではサポートされていたのですが、FreeBSDにはサポートがなかったので作りました。

作り込みは既存のAR7系のコードをNetBSDのAR5系のサポートとガッチャンコして、作りました。FreeBSDのソースを書く時はGPL汚染しないようにBSDなコードをベースにする事にしています。

ネットワークコードは既に消されているsys/mips/idtのkrというドライバーコードをベースにしています。krそのままでは動作がおかしく、いろいろ試した結果、キャッシュの処理を一カ所いじりました。また負荷をかけると落ちるのでいろいろリングバッファの処理を試行錯誤しました。このコードを元にRT1310のネットワークドライバコードは作りましが、DMAの挙動が微妙に違い、違う処理の部分があります。

この世代のチップは前半のCFIなFlashを使った物と後半のSPIのFlashを使った物があり両方のサポートが入っています。

AR7系同様にhintsベースの実装ですが、AR7系ではINTRNGになっていませんが、このサポートは対応してあります。

このチップのサポートを入れたかった一つの理由にこのSOCはEthernet Switchが外付けになっていて、いろいろなEthernet Switchが付いた物があったので、そのドライバーも書きたかったからです。sys/dev/etherswitchにもいくつかコードを入れてもらいました。

コードのありかはsys/mips/atheros/ar531xです。

メモリ16MのFlashが8MのFON2201がリファレンス機種です。WIFIのサポートはやってません。

二つのSOCのサポートで一番時間を使ったのはネットワークドライバーでした。DECのTulip由来のアーキテクチャなのですが、それぞれ微妙に動作が違っていて、トライ＆エラーに時間を使いました。

二つとも安定していて、ネットワークも使えるので、十分有益なポートだと思っています。

この二つのポートが出来たのはZRouterがあったからだと思っています。ZRouterを始めたrayには感謝しています。

追記：12.0-Rが出たばかりなのに、AR531xはもうimpさんが消すレビューを出しています。おそらくRT1310も時期消されてしますでしょう。12Rに入ったのでstable12では使い続けられると思うのでそれで良しとします。
xonshでdirenvを使う

2019/02/09追記
xontribが本家のリストに追加されました。`xontrib list`で表示されます。
https://xon.sh/xontribs.html#direnv

2019/01/09追記
xontrib にしました → https://github.com/74th/xonsh-direnv/

注意: xonsh/0.8.1 の時点での動作を確認した

direnv という .envrc というファイルに export を書いておくと、そのディレクトリでのみ環境変数を有効にしてくれる便利なツールがある。

bashでは、`eval "$(direnv hook bash)"`を.bashrcに書いておくことで有効になるが、xonshでは使うことができない。

これをxonshで有効にするには以下のよう.xonshrcにセットする。

```python
import jaon
@events.on_chdir
def direnv(olddir, newdir, **kw):
    r = !(direnv export json)
    r.end()
    if len(r.output) > 0:
        lines = json.loads(r.output)
        for k,v in lines.items():
            if v is None:
                del(__xonsh__.env[k])
            else:
                __xonsh__.env[k] = v
```

direnvのbashでの動作は、プロンプトに`direnv export json`のコマンドを仕込み、ディレクトリを移動するタイミングで、export及びunsetで目的の環境変数の設定を行う。

これをxonshのディレクトリ移動のイベント（`@events.on_chdir`）で実行し、exportとunsetを環境変数の辞書である`__xonsh__.env`に対して実行すれば良い。

なお、`!(command)`はCommandPipeline型が返り、`end()`をよぶとコマンドの終了まで待ち、`output`、`errors`に標準出力、エラー出力が入る。`$(command)`だと標準エラーが出力されないので、こちらを使っている。

この手の挙動もPythonで楽々組めるxonshは便利です。
micro:bitでテープLED(WS2812B)を楽しむ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/71746/955a2437-d08b-f64a-5a29-03cabc2845a8.png)
※この画像では拡張ボードを利用していますが必須ではありません

#内容
micro:bitでテープLED(WS2812B)を使ってみましょう
拡張機能でモジュールを追加するだけで簡単に利用することができます

#必要なもの
micro:bit
転送＆電源供給用ケーブル
テープLED(WS2812B) [一例@Amazon](https://www.amazon.co.jp/ALITOVE-LED%E3%82%A4%E3%83%AB%E3%83%9F%E3%83%8D%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-WS2812B-LED%E3%83%86%E3%83%BC%E3%83%97%E3%83%A9%E3%82%A4%E3%83%885050-150%E5%80%8B%E3%83%94%E3%82%AF%E3%82%BB%E3%83%AB%E5%A4%A2%E8%89%B2-%E9%98%B2%E6%B0%B4IP67%E3%83%9B%E3%83%AF%E3%82%A4%E3%83%88PCB/dp/B01N2NKK83/ref=sr_1_1_sspa?ie=UTF8&qid=1543622170&sr=8-1-spons&keywords=WS2812B%E3%80%805V&psc=1)
※WS2812B、5V、端子が3つものもを選んでください。


#利用方法

-MakeCodeサイトにアクセスする
https://makecode.microbit.org/#editor

-高度なブロックをクリックする
![koudo.JPG](https://qiita-image-store.s3.amazonaws.com/0/71746/97d18fb6-1076-efff-797a-ed61a18ab2dd.jpeg)

-拡張機能ブロックをクリックする
![kakucho.JPG](https://qiita-image-store.s3.amazonaws.com/0/71746/f245600f-81f4-c363-7f06-138b14599dcd.jpeg)

-検索ダイアログで"neopixel"を検索し、該当画像をクリックし拡張機能を追加
![neo.JPG](https://qiita-image-store.s3.amazonaws.com/0/71746/249d3077-f30b-207e-862a-b367e5af8efd.jpeg)

-下記がテープLED(WS2812B)に関する基本ブロックとなります
![neomenu.JPG](https://qiita-image-store.s3.amazonaws.com/0/71746/438d76ef-153f-afd0-80bf-4837af7d8a6f.jpeg)

#ハードウェアの接続
GND -->　テープLEDのGNDへ
3V　-->　テープLEDの+5Vへ
P0　-->　テープLEDのDIN1へ
※注意！テープLEDは両端とも同じGND/3V/P0がありますが接続するのは矢印がある側からです！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/71746/cedf203a-8caf-1b1f-8afc-02b75dc7c7a9.png)


#サンプルコード
3パターンに色が変わり続けます。Aボタン、Bボタンで輝度が変わります(デフォルトはまぶしすぎます)
![code.JPG](https://qiita-image-store.s3.amazonaws.com/0/71746/81be60f7-721a-188e-7917-2676391895be.jpeg)

#シミュレーターの画像
![emu.JPG](https://qiita-image-store.s3.amazonaws.com/0/71746/a5ff1197-f4f7-4347-f6fd-9dc09653c7e2.jpeg)
FBSnapshotTestCaseでUIImageのテストを行う。

# はじめに

FBSnapshotTestCaseはUIViewのレイアウトをテストするライブラリですが、以下のカテゴリーメソッドを追加する事によってUIImageのテストも行う事ができます!

```

extension FBSnapshotTestCase {
    
    func FBSnapshotVerifyImage(_ image: UIImage, identifier: String = "", suffixes: NSOrderedSet = FBSnapshotTestCaseDefaultSuffixes(), tolerance: CGFloat = 0, file: StaticString = #file, line: UInt = #line) {
        FBSnapshotVerifyView(UIImageView(image: image), identifier: identifier, suffixes: suffixes, tolerance: tolerance, file: file, line: line)
    }
 
}

```

実際の呼び出し例は以下の通りです。

```
   var image: UIImage!

　　UIImageの生成処理

   ...(テストコード)

　　FBSnapshotVerifyImage(image)

```
時計、あってますか

インターネットが無くなっても、自律して時間を刻めるようにおうちの内にntpサーバーを設置する事にしました。

なぜ正確な時間が必要かというと、Mac mini G4で動かしている「[猫のお留守番](http://hp.vector.co.jp/authors/VA009278/cat/)」という自作アプリでFMラジオのエアーチェックをしているからです。

40年ほど前にタイマーでカセットテープにエアーチェックしていた頃は、1分くらい前に始めて1分くらい余計に録音するようにしていましたが、正確な時間のおかげで猫のお留守番はジャストで開始と停止をしても問題なくエアーチェックできます。

ntpdはネット経由での時間同期も出来ますが、GPSなどのリファレンスクロックをソースにして時間同期する事も出来るように作られています。

GPSをリファレンスクロックに使う場合は時間情報のシリアル信号(NMEA)とは別に1秒毎のPPSという信号を使い、その信号をFreeBSDのカーネルに入れて時間同期をしています。JJYの方は時間情報のシリアル信号を元に時間同期します。

秋月電子でみちびき対応のモジュールが発売されて、当時PPSの出力があるモジュールで最安値だったので購入して壱台目のサーバーを構築しました。GPSアンテナの下に鉄板を敷くとよいということなので、モルトウイスキーの箱をぶった切って、おまじないを作ってみました。

![IMGP0144.JPG](https://qiita-image-store.s3.amazonaws.com/0/104066/b4b2aaeb-7456-f041-7e15-ae61df6b0e52.jpeg)

AitendoでJJYモジュールが39円のセールになったときにこれを購入し弐台目のサーバーを構築しました。 デコーダーは[AVRで自作](https://github.com/yamori813/JJYS)しました。

![IMGP0143.JPG](https://qiita-image-store.s3.amazonaws.com/0/104066/67d8adb0-4577-a414-b3ce-4bece1840292.jpeg)


Amazonで安いu-bloxのGPSモジュールを購入して三台目のサーバーを構築しました。このモジュールはPPSの端子はありませんが、LEDにPPSが出ているのでそこから拾っています。

ハムフェアでジャンクのドイツのDCF用の電波時計が手に入りそのままでは使えないので、改造してJJY用にして四台目のサーバを構築しました。

![OUCHI-JIKAN.png](https://qiita-image-store.s3.amazonaws.com/0/104066/d1068ba5-201c-9819-8aa6-fe02fc12ee00.png)

リファレンスクロックがstratum0(st0)と呼ばれ、それが接続されたサーバがst1となります。st1にネットワークでつながるサーバがst2となります。

あまりちゃんと理解していませんが、富士通さんが書かれたNTPの資料にst1は4台あることが望ましいというような事が書かれていました。

st2は一つのst1に対し同期するのですが、st1を選択するアルゴリズムは謎が深いです。

当初不安定でいろいろいじったところ最近では結構安定していて、安定するといじる必要がなくなり、ちょっとつまらなかったりもします。

今年は夏に落雷で15分くらいの停電がありました。そのときは全て停止してしまいました。また復帰はリアルタイムクロックがなく、起動後は1970年になってそのままntpdを上げると落ちるので、手動で上げる必要がありました。

すべてRT3050というMIPSのSOC上のFreeBSDで動かしています。一つあたり5V 300mAくらいなので、四台でも蛍光灯一本にも満たないと思います。

[JJY](http://jjy.nict.go.jp/)はNICTさんが管理していて、電波の送信所は福島の40KHzと九州の60Khzがあります。60KHzも受信してみたいのですが受信は出来るもののリファレンスに使うにはアンテナなどの調整が必要で難易度高く、あきらめました。JJYなモジュールは50cm場所を変えただけでも数値に表れ非常にセンシティブです。パソコンなどの電子機器はノイズの発生源で、ポータブルのAMラジオでもノイズが確認できます。普通の電波時計ももちろん同じなので置き場所は十分注意した方が良いです。

GPSとJJYともに電波なので、刻々と状態が変わってきますが、平均JitterがGPSが15usでJJYが10msとほぼ1000倍くらい精度が違いがあります。JJYの二台はおおよそ同じ傾向が見受けられますが、GPSの方はスパイクの出方はバラバラです。

GPSのアンテナは秋月のモジュールは直付けなので室内にあり、u-bloxの物は伸ばして室外にあります。台風が来た時に雨戸を閉めたところ秋月のモジュールは受信できなくなっていました。

![filename(95).png](https://qiita-image-store.s3.amazonaws.com/0/104066/3078b99c-f118-89b0-c8d2-45a7ff485af2.png)
![filename(96).png](https://qiita-image-store.s3.amazonaws.com/0/104066/1e2bad54-33ee-5add-be57-0a81756f1a4b.png)
![filename(97).png](https://qiita-image-store.s3.amazonaws.com/0/104066/4e65381d-4954-97c3-c1f5-58883bcc7d24.png)
![filename(98).png](https://qiita-image-store.s3.amazonaws.com/0/104066/2ec06634-a192-9b25-59c8-add7fe7613d7.png)


「その万に一つに備えるのが俺達の仕事だろうが」by太田功
jsdoでchip8　その8

#概要

jsdoでchip8やってみた。
アセンブラ練習問題、解いてみた。
お題は、0から9まで表示。

#解答例


```
start  load  v0  6
  load  v1  0
  load  v2  0
  load  v3  5
  load  I  0
loop  disp  v0  v1  5
  scroll
  add  I  v3
  add  v2  1
  eq  v2  10
  goto  loop
  goto  start
```

#成果物

http://jsdo.it/ohisama1/wl9W/

以上。
re:Invent 2018 で発表された Amazon AI 関連のアップデート情報をマッピング


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

# はじめに
## Amazon AI とは
AWSでは世界最大のECサイトであるAmazonが培ってきた技術を素早く自社ビシネスに適用できるよう画像解析や文章認識をAIを利用するための多くのサービスが提供されています。

![2018-12-01_06h10_29.png](https://qiita-image-store.s3.amazonaws.com/0/321336/694ca1bf-92a9-aa88-5084-e41dfe4ad283.png)

## アドベントカレンダーで目指すこと
このアドベンダーではこれらのAWSから提供されるサービスをわかりやすく説明していき、「Amazon AIでどんなことが出来そうか？」「自社のビジネスではどう役に立つのか？」といったことを検討していく際の一助になることを目指します。先日行われた re:Invent2018 では多くの機械学習関連のアップデートがあり、それらの情報も検証次第記事として公開していきます。

# 本題
## re:Invent2018 での Amazon AI関連の発表
re:Invent2018 ではかつてなく機械学習関連の発表がありました。それについて公開されている情報を元に以下のようにマッピングをしてみました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/321336/7a5e42b6-9916-b017-8c00-068f7872cb3a.png)
図に起こしてみるとマネージドサービスとインフラの領域に新規サービスが提供され、プラットフォームサービスであるSageMakerが強化されたということと、AWSが内部で利用してきたパーソナライズや時系列予測などの技術がAPIベースで提供され出したということが読み取れますね。

## 各種アップデート一覧
| サービス名 | ジャンル | 内容 | 関連リンク |
|:-------------------|:------------|:------------| :------------| 
| AWS Inferentia | インフラ | AWSが開発する機械学習向けチップ | [リンク]( https://aws.amazon.com/jp/about-aws/whats-new/2018/11/announcing-amazon-inferentia-machine-learning-inference-microchip/) |
| AWS Elastic Inference | インフラ | EC2に対する最適量のGPU適用サービス | [リンク](https://aws.amazon.com/jp/about-aws/whats-new/2018/11/introducing-amazon-elastic-inference/) |
| AWS DeepRacer | ハード | SageMakerやRoboMakerと連携する自動走行デバイス | [リンク](https://aws.amazon.com/jp/deepracer/) |
| Amazon SageMaker Neo | プラットフォーム | デプロイ先を意識せずにモデルを最適化する | [リンク](https://aws.amazon.com/jp/blogs/news/amazon-sagemaker-neo-train-your-machine-learning-models-once-run-them-anywhere/)  |
| Amazon SageMaker RL | プラットフォーム | 機械学習パイプラインを強化学習に適用する | [リンク](https://aws.amazon.com/jp/blogs/news/amazon-sagemaker-rl-managed-reinforcement-learning-with-amazon-sagemaker/) |
| Amazon SageMaker Ground Truth | プラットフォーム | データへのラベル付け(アノテーション)を効率化する | [リンク](https://aws.amazon.com/jp/blogs/news/amazon-sagemaker-ground-truth/) |
| Amazon Forecast | マネージド | 時系列予測を行うサービス | [リンク](https://aws.amazon.com/jp/blogs/news/amazon-forecast-time-series-forecasting-made-easy/) |
| Amazon Personalize | マネージド | レコメンデーション及びパーソナライズをマネージドで提供 | [リンク](https://aws.amazon.com/jp/blogs/news/amazon-personalize-real-time-personalization-and-recommendation-for-everyone/) |
| Amazon Textract | マネージド | OCRでデジタル化したデータの文字認識を行う | [リンク](https://aws.amazon.com/jp/about-aws/whats-new/2018/11/introducing-amazon-textract-now-in-preview-easily-extract-text-and-data-from-virtually-any-document/) |


# まとめ
今回のre:Invent2018ではAmazonAI関連の多くの発表が行われました。基調講演の中でAmazon Forecastを利用することで「従来のサプライチェーンソフトウェアの10分の1のコストで、これまでよりも最大50％正確な予測を提供可能」と話が出たように、これらのサービスを理解し上手く使うことで従来のAI開発にかかっていたコストをかけずにAIを使いこなすことができます。

次回以降これらの検証記事をご紹介し実際にどのように使えるか、効果があるかをご紹介していきたいと思います。
お楽しみに！

関連リンク: [ナレコムAWSレシピ](https://recipe.kc-cloud.jp/)
AOJ day 8: Type-level path parameters

Typically, approaches to represent parameterized paths in the type level have required making some kind of type-level operator of kind `Type -> Type -> Type`, so that you could define routes in a manner such as `type MyRoute = Literal "hello" / Param "name"`. While this seems "explicit", it also seems at least a little bit silly: why can't we use Symbols to define these routes?

Csongor wrote about how Symbol.Cons was implemented for PureScript, with an example library for deriving variadic functions here: <http://kcsongor.github.io/purescript-safe-printf/>. He also then made a record-based formatting library here: <https://github.com/kcsongor/purescript-record-format>. Surely we can take advantage of these to make a type-level path solution?

## "Well-typed path params in PureScript 0.12"

In this post, I talked about how we can use the type-level parsing result from record-format to make a path:

<https://qiita.com/kimagure/items/3273d20c4c5ad74dbe26>

Knowing that we are going to parse URLs, we can use `/` as delimiters, where we can match literal and variable sections. In building up the variable results, we can use [Record.Builder](https://pursuit.purescript.org/packages/purescript-record/1.0.0/docs/Record.Builder) to build up a record of the parameters we have parsed into a record of strings, where the key is the name that we gave our parameter in this scheme:

```hs
url :: SProxy "/hello/{name}/{age}"
```

In the future, we'll talk about how we can add optional type annotations to this Symbol, so that we don't need to work with a record of strings being converted by key to a proper heterogeneous record.
AOJ day 7: Spacchetti

For a long while now, people have complained that managing a package set file in a giant JSON file is not very nice. While I think editing JSON is at least nice in that it's universal, I agree that overall it isn't that nice.

The other major complaint that people have had is that they don't want to fork the package sets. I think this is kind of silly, but I will at least say the next step of this is rather annoying -- maintaining separate tags if you want to have specific packages that are different between projects, if you want to not have your projects use a common master package set. While you really should consolidate your package sets if you want to have interoperability of modules and encodings between your projects, I admit that there must be *some* kind of better solution out there.

## "Managing Psc-Package sets with Dhall"

In this post, I introduced my Spacchetti project: <https://github.com/spacchetti/spacchetti>

<https://qiita.com/kimagure/items/c419ba740ac134a837a2>

This project lets you maintain package sets not as a blob of JSON, but rather as a Dhall source file, using the Dhall programming language. This then lets us use the full power of the Dhall language to build our package set, such as being able to merge a bunch of records to get our total package set, where we can merge new values into this record for new packages and override existing entries.

This also means that local overrides for packages are nothing but using a Dhall source file to import the parent package set from a remote url using Dhall's remote import feature:

```hs
    let mkPackage =
          https://raw.githubusercontent.com/spacchetti/spacchetti/140918/src/mkPackage.dhall

in  -- ...
```

There's a CLI that helps you do this without too much trouble: <https://github.com/spacchetti/spago>

Since I wrote this post, I've also written a large amount of documentation explaining how everything here works, from how Psc-Package itself works, why Dhall is used here, how to use this package set, and how to set up a project with local overrides for packages. See the guide here: <https://spacchetti.readthedocs.io/en/latest/>
JaSST'18 Hokkaidoで登壇してきました。テスト自動化の改善

<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/50efa891-4ae2-ce18-050a-339acb28d6fa.png" WIDTH=80%>

2018/10/30 雪の降る中、札幌でJaSST'18 Hokkaidoが開催されました。
もともとは9月に行われる予定でしたが、ご存知の通り、その前日に震災があり開催が中止になりました。

<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/fbe10555-cd8a-72b4-ae33-5912be0abab0.png" WIDTH=70%>
これは開催前日9/6、羽田空港でそもそも札幌に行けないときの状況です。

ただ、運営委員会のおかげでその１週間後に代替開催が決定し、あらためて準備しました。

会場の雰囲気はこんな感じです
<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/354ff448-f161-6c72-172d-003cf4c48c8d.png" WIDTH=80%>

<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/b6088a34-a12c-eb28-ac49-8c4cd1c3d77f.png" WIDTH=80%>

参加者が９０名、うち東京からの参加者は３０人くらいでした。

といったところで、以下資料が登壇資料です。
もともと９月に発表でつくったもので、今年の改善案を提示して締める予定でしたが
３か月空いちゃったんで、改善しちゃいましたを含めて発表してきました。
その場で、興味を持っていただいた方ともあいさつを交わしまして、いろいろなひとと接することができた１日でした。

<A HREF="http://image.slidesharecdn.com/jasst-hokkaido-public-181130221430/95/slide-1-1024.jpg"><IMG SRC="https://image.slidesharecdn.com/jasst-hokkaido-public-181130221430/95/slide-1-1024.jpg" WIDTH=80%></A>


最後に、次回JaSST'19 Hokkaidoの開催日も決まりましたw
<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/8bd1b7b7-0dd0-bb47-06bf-edb3f9014244.jpeg" WIDTH=80%>
また、行けるといいな。
テストターゲット上でアニメーションを切る。

### はじめに

UI部分のテストは出来るだけユニットテストで行った方が良いです。小回りが効くので。

そのUI部分のユニットテストを行う時、アニメーションを行う処理が入っているとその分処理に時間がかかります。

テスト用にアニメーションの処理を切る処理を入れれば良いのですが、その処理がプロダクションコードのあちこちに紛れ込むのはメンテナンスの観点からよくないでしょう。

幸いな事にiOSにはアプリ全体のアニメーションを切るメソッドがUIViewのクラスメソッド（setAnimationsEnabled）として用意されています!


### 実際のコード例

実際のコード例を示します。テストターゲット向けのAppDelegate内で書くとプロダクションコードに全く手を入れなくてすみます。

```swift:TestingAppDelegate.swift

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

UIView.setAnimationsEnabled(false)

```
マイコンボードを中継器にして PC に電子部品を接続し、Ruby で制御してみた（発光ダイオード編）

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

# はじめに

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

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

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

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

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

そう、なるべくお手軽な方法で PC にセンサー等電子部品を接続したいのです。
Raspberry PI とかみたいに GPIO 等を持っている、特殊な PC ではなくて、所謂デスクトップ PC だのノート PC だのよくある PC に。

PC 等から Arduino の GPIO を制御する技術として Firmata と言う技術があります。

Firmata を利用することで、PC側から Arduino のようなマイコンに対し、マイコンやマイコンに接続したセンサ等電子部品から汎用入出力の値の取得・書き込みその他の操作を行うことが可能になります。

特に Arduino のマイコンボードには、公式からマイコンボードを Firmata 対応にするためのライブラリ等が[提供](https://www.arduino.cc/en/Reference/Firmata)されています。

Java や node.js 等には、非公式ながら Firmata プロトコルを利用するためのライブラリが存在します。

Ruby では @shokai 氏が Java 版のものを移植して作成した、[Arduino Firmata on Ruby](http://shokai.org/blog/archives/6631) を公開してくださっています。

でなわけで、今回は [Arduino Uno](https://www.arduino.cc/) （ *1 ）を中継器に、手元のノート PC と 電子部品をつないでみます。

*1: と言いつつ~~バチモン~~中国製の互換品（ *2 ）ですが … 
*2: Arduino は [Open source hardware](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2) なので、無料公開されている [EAGLE ファイル](https://en.wikipedia.org/wiki/EAGLE_(program))に従って誰でも互換品を作ることが出来ます。

# Arduino Uno を Firmata 対応にする

やり方は簡単です。

Arduino の公式開発環境である [ArduinoIDE](https://www.arduino.cc/en/Main/Software) を使って、公式が提供する Firmata アプリケーションをビルドして、Arduino Uno に書き込むだけ。

そう、
 1. ArduinoIDE を立ち上げるて
 2. スケッチの例＞Firmata＞StandardFirmataを選択して
![20181121_01.png](https://qiita-image-store.s3.amazonaws.com/0/89832/db7b768b-3ef1-338f-6b92-363e881d0840.png)
 3. アプリケーションを Arduino Uno に書き込む
ただこれだけで OK です。

# 使ってみる（初回・L チカ編）

何か新しい言語を使ってプログラミングを行う時、自分はついつい "Hello World" と標準出力させる派です。

マイコンボードを使って何かをやる時も、ついつい初回は[ L チカ](https://dic.nicovideo.jp/a/l%E3%83%81%E3%82%AB)させちゃう派だったりします。

と言うわけで、以下のように "Digital 11 Pin → LED → GND" とハードウェアを結線して、
PC 上の Ruby で LED をチカチカさせてみることにします。

※ "Digital 11 Pin" 側に LED の長い側の足を、"GND" 側に LED の短い側の足を、それぞれ「エイヤつ！」っと突っ込みます。

[写真]
![image1.jpeg](https://qiita-image-store.s3.amazonaws.com/0/89832/49d78752-52c3-129e-4b83-87bbf88916cd.jpeg)

[回路図]
![回路図.png](https://qiita-image-store.s3.amazonaws.com/0/89832/4a4db64d-e5d6-d882-de59-eed5a57c0e8d.png)



Arduino Firmata on Ruby の[使い方](http://shokai.github.io/arduino_firmata/)がネット上に公開されているので、これを参考に以下のようなスクリプトを組みます。

※ スクリプト 2 行目の "/dev/tty.usb-device-name" の "usb-device-name" の部分は各自の環境に合わせて書き換える必要があります。自分の環境では "ttyUSB0" でした。 

[firmata-test-001.rb]

    require "arduino_firmata"
    arduino = ArduinoFirmata.connect "/dev/tty.usb-device-name"
    loop do
      arduino.digital_write 11, true
      sleep 1
      arduino.digital_write 11, false
      sleep 1
    end

はい、上記のスクリプトを実行すると、1 秒間隔で無事 LED がチカチカ点減しました。

次回は、温度センサ（ LM61CIZ ）と PC をつないで、センサから温度情報を取り出し、PC を簡易温度計にしてみようと思います。

では、また。
FreeBSD の ports をデバッグシンボル付きでビルドしてインストール

#ports をデバッグシンボル付きでビルドしてインストール

インストールした package/ports がなんかセグフォで落ちるとか動作がおかしいときが時々あります。大概インストールした ports より、長らく使ってた自分の環境の方がおかしくなってたりするんですが。
どちらが原因にせよ、どこで躓いてるかをまずは知りたいって時には、実行バイナリをデバッグシンボル付きでビルドして、デバッガ で backtrace を見たりステップ実行したくなるのが人情というもの。

### WITH_DEBUG変数指定でデバッグビルド指定
portsをデバッグシンボル付きでビルドしてインストールするには、portsのビルド時に

<pre>
make WITH_DEBUG=yes
</pre>
と、WITH_DEBUG変数をyes指定してあげれば OK です。コンパイル時に「-g」オプションが付加され、install時も strip されません。

### デバッグオプションを変更
WITH_DEBUG指定でのデフォルトのデバッグオプションは「-g」です。デバッガでマクロが使えるようになる「-g3」や、その他オプションを指定したい場合は、DEBUG_FLAGS変数に指定することで反映されます。

<pre>
make WITH_DEBUG=yes DEBUG_FLAGS="-g3"
</pre>
Git - Githubの基本

# Gitとは
ソースコード等、ファイルのバージョン管理を行うためのツールのこと。
このようなツールを利用することで、複数人で並行して開発を進めることができ、過去の修正履歴に戻すことも可能。
チームでの共同開発を行う場合には、バージョン管理ツールが必須。

# Githubとは
gitの仕組みを利用して、オンライン上でソースコードの共有を行えるようにしたサービスのこと。

# Gitの構成
Gitがファイルの状態を保存する場所について整理。

 - ワーキングツリー（今作業しているファイルのある場所）
 - インデックス（コミットするためのファイルを登録する場所）
 - ローカルリポジトリ（リモートリポジトリに変更内容を送信するための場所）
 - リモートリポジトリ（複数人でファイルを共有するための場所）



# バージョン管理の流れ
Gitでのバージョン管理は基本的に以下のような流れになる。

 - ローカルリポジトリの作成（git init）
 - 変更ファイルをインデックスにあげる（git add）
 - 変更履歴を保存する（git commit）

### Gitを使うための準備
```
$ git init
```
ローカルリポジトリの作成を行う


### 共有したいファイルの選択
```
$ git add ファイル名

— 省略形
$ git add .
（全ての変更ファイルが対象となる）
```
変更ファイルをインデックスに上げる

### 選択したファイルを記録する
```
$ git commt -m "メッセージ"
```
変更履歴を保存（コミット）する
※修正内容をわかりやすく記載すること！



### ローカルリポジトリにリモートリポジトリを紐付ける

```
$ git remote add origin (Githubリモート名URL)
```
ローカルに存在しているorigin とGithubに存在するリポジトリのURL とを紐付ける。


### リモートリポジトリをローカルにコピー（クローンを作成）する
```
$  git clone (Githubリモート名URL)
```
Githubに存在するリポジトリをローカルにclone(コピー)して作業を行う際に使用する。


### リモートにファイルをアップロードする
```
$  git push origin master
```
Github上のリポジトリにローカルファイルをpush(アップロード)する際に使用する。
※通常、masterではなくbranch にpush する。
（例：```$ git push origin (ブランチ名称)``` ）


### ローカルリポジトリにリモートリポジトリをコピーする
```
$ git pull origin master
```
"master"の部分には、取得したいブランチを記載する。


#Gitコマンド一覧
### 変更したファイルの把握
修正されたファイルを確認することができる
```$ git status```
・赤色：　修正ありのコード（add未完了）
・緑色：　add済みのコード


### 変更内容の確認（差分）
```$ git diff```
・赤色：　変更前のコード
・緑色：　変更後のコード


### コミットメッセージの確認方法
```$ git log```
```$ git log -p```（変更内容を確認する場合）
を実行することで特殊な表示に切り替わり確認可能。（「q」を押すことで終了）


### gitで管理できているかの確認
```$ ls -a```
「.git」 ファイルが存在していればOK

### リモートリポジトリURLの確認方法
- 方法１：
```$ git config --get remote.origin.url```
- 方法２：
```$ git remote -v```
[Javascript] Masonryのitemの小要素をimgタグにして高さを可変にする方法

hoverしてオーバーレイで何か表示したいときなど、⇣のように画像をdivでラップしたDOMの構成にしたい。

```html
<div class="masonry">
  <div class="item">
    <img src="https://placehold.it/200x200" />
  </div>
  <div class="item">
    <img src="https://placehold.it/200x200" />
  </div>
  <div class="item">
    <img src="https://placehold.it/200x200" />
  </div>
</div>
```

デフォルトの設定だと画像の高さが反映されず、レイアウトが崩れるので、
公式に従うと、imagesloaded を使えば解決できる
https://masonry.desandro.com/layout.html#imagesloaded


jQuery

```js
// init Masonry
var $grid = $('.grid').masonry({
  // options...
});
// layout Masonry after each image loads
$grid.imagesLoaded().progress( function() {
  $grid.masonry('layout');
});
```

Vanilla JS

```
// import imagesLoaded anywhere

imagesLoaded(container, function () {
  var msnry = new Masonry(container, {
    columnWidth: 200,
    itemSelector: '.item'
  });
});
```

[react-masonry-component](https://github.com/eiriklv/react-masonry-component) 


```jsx

<Masonry
    className={'my-gallery-class'}
    options={masonryOptions}
    disableImagesLoaded={false} // ここをfalseにする（デフォルト）
    updateOnEachImageLoad={true} // ここをtrueにする（デフォルトはfalse）
>
    {childElements}
</Masonry>
```
僕の考えた最強のキーバインドチートシート（VSCode）

# 僕の考えた最強のvscodeチートシート

いろんな人が書いているチートシートにこんな不満はありませんか？

- windows（またはmac）のキーしか書いてない
- あっちの人の記事にはあれが書いてあるけど、これには書いてない
- 俺キーバインド変えてるし…
- もっとマニアックなコマンド教えろ

それらを解決すべく、カスタマイズ可能なチートシートを作りました。

成果物
https://optimistic-khorana-d23568.netlify.com/

![vscode.gif](https://qiita-image-store.s3.amazonaws.com/0/90155/1aa2467c-8eeb-c027-4a15-ae3767be8b26.gif)


以下各フォームについて解説します。

## フォームの入力内容はlocalstorageに保存

各フォームの入力内容はlocalstorageに保存しているので、再アクセス時に前の入力値が保たれます。

## 自分のkeybinding.jsonでアップデートできる

このチートシートは「デフォルトjson」の部分に貼り付けたkeybinding.jsonを読み込んで、各コマンドに僕が考えたコメントを割り振ること作成されます。

フォームに何も入力されていない場合、keybinding.jsonは拡張機能を切った僕のwindowsとmacのPCのkeybinding.jsonが適用されます。ユーザーエージェントから判別してmacの場合は、macのkeybinding.jsonが。それ以外はwindowsのkeybinding.jsonが適用されます。（linuxはわからなかったのでごめんなさい）

拡張機能でコマンドが変わっている人は特に忘れずに自分のdefaultのjsonを「デフォルトjson」の欄に貼り付けてください。
また、自分でカスタマイズしたjsonの方はカスタムjsonの方に貼り付けてください。

stripJsonCommentsを使用しているので、jsonにコメントが入っていても問題ありません。

https://www.npmjs.com/package/strip-json-comments

なお自分のjsonで起こったので注意です。下記のようなコードを貼り付ける際、気をつけてください。'hogehoge'の後ろの「,」を取り除かないとJSONのパースに失敗します。（vscode上では問題なく動く模様。）

```
    command:'hogehoge',
}
```

## キーバインド置換設定

keyの項目の文字列を置換します。windoswでは「oem_〇〇」。macでは「[〇〇]」のような文字列がキーボード配列によって指すキーが違ったりしているので、自分のパソコンのキーバインドを参考にデフォルト値を決定しています。

また、alt,cmd,shift,ctrlはmacでは記号がデフォルト値に入るようにしてあります。

キーボード配列で変わるものではありませんが、escape等も別の表示ができるようにしてあります。

僕はWindowsでこんな風に変えてます。

alt→Alt
ctrl→Ctrl
escape→ESC
backspace→Back
home→Fn+right (ファンクションキーがないと押せないので)
end→Fn+left
pageup→Fn+up
pagedown→Fn+down

## commandとwhenでフィルター

このチートシートはjsonから作り出した配列に対してcommandとwhenの値にフィルターをかけて作成しています。

スペースで複数のワードをフィルターに使えます。

「hoge moge」と入力した場合「hogeかつmogeを含む」フィルターになります。(hogeまたはmogeにはならないので注意)

単語の先頭に「-」をつけることで、単語を除外できます。「hoge -moge」では「hogeを含み
、mogeを含まない」フィルターになります。

## 常に表示するコマンド
「常に表示する」欄に入力したコマンドはフィルターで除外されない他、元のキーバインドのjsonに載っていない場合、key欄とwhen欄を空にして表示させます。

## プリセット

上記のフォームに入力した値は名前をつけてプリセットとして登録できます。
プリセットはlocal storageに保存するので、再読込しても問題ありません。

## デフォルトプリセット

最初から設置してあるプリセットはカスタマイズ不可能です。
マニアックなキーバインドを把握したかったのも動機の一つなので、わざわざ書かなくていいようなマニアックな操作も載ってます。
後々もっと使いやすいデフォルトプリセットを用意して切り替えられるような仕組みにしたいです。

## 作るのに使ったもの
- vuejs
- vuetify

templateはpugで書いています。もうpugしか書きたくない。

## ソースコード

> ソースコードか？欲しけりゃくれてやるぜ・・・ 探してみろ。このサイトのすべてをそこに置いてきた！
>
> https://github.com/tempakyousuke/vscode-cheatsheet
>
> by  TEMPA・D・KYOUSUKE

※ ネタがわからない人ごめんなさい

## 課題や感想

- 割と中途半端な状態で発表した自覚があります。
- マサカリが怖い。
- デフォルトプリセットはまだまだ見直し・追加予定。
- 選んだプリセットでユーザーにキーを打ち込ませるトレーニングゲームとかできたらいいなとか思ってます。

## 追記予定
- ちょっとまだまだ修正する点が多いサイトですが、落ち着いたら製作途中で溜まったvscodeの知見書きます。
【AWS re:Invent 2018】Amazon Elastic Inferenceが発表されました

11月28日のAWS re:Invent 2018のKeynoteにてAmazon Elastic Inferenceのリリースがアナウンスされました。本記事では、Keynoteとセッション内容を踏まえて解説していきます。

##機械学習における推論コスト問題
機械学習において、学習時と推論時ではGPUインスタンス利用率はまるで違います。特に深層学習などの大規模モデルは、学習時はハイスペックなGPUインスタンスを必要としますが、一方で推論時にはGPUはそれほど必要でなく、どちらかというとモデルを乗せるアプリケーション全体のパフォーマンスを重視して、CPUやRAMなどのリソースに割り当てることを最優先にした方が良いケースがほとんどです。セッション中でも、GPUの推論時のコスト問題に関して問題提起されていました。AWSによるとDeepLearningの利用においてインスタンス費用の90%が推論で残り10%が学習にかかっているようです。
![EI_11.jpg](https://qiita-image-store.s3.amazonaws.com/0/317659/ccc2c7a8-6b0e-d235-7829-cf7d672bff7d.jpeg)
![EI_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/317659/31785630-46c6-53ca-c0e9-160711585a61.jpeg)
##Amazon Elastic Inferenceとは
上記のような状況の中で、AWSから新サービス、Amazon Elastic Inferenceがリリースされました。
Elastic InferenceとはEC2インスタンスにGPUによる推論アクセラレーションをアタッチするためのサービスで、アプリケーションに最適なCPUインスタンスタイプを選択し、適切な量のGPUアクセラレーションをアタッチすることで、無駄なリソースのコストカットを行います。
![EI_2.jpeg](https://qiita-image-store.s3.amazonaws.com/0/317659/b2838316-55e1-64d9-af59-24a890595ecb.jpeg)
###アクセラレーションサイズの種類
Elastic Inferenceには3つのサイズが利用可能で、1〜32【TFLOPS】のスループットが利用できるようです。これらのアクセラレーションはEC2インスタンスにもSageMakerインスタンスにもアタッチ可能です。
・eia1.medium
・eia1.large
・eia1.xlarge
![EI_3.jpg](https://qiita-image-store.s3.amazonaws.com/0/317659/1f0bd76c-2352-23ba-db64-e0b5e1405d30.jpeg)
###コスト面
セッションでは従来の方法とのコスト比較結果が述べられていました。例えば、C5.largeにeia1.mediumをアタッチすると、専用のNVIDIAをホストしたp2.xlargeインスタンスよりも約1/4のコストで済みます。めちゃくちゃ安いですね。。。
もちろん10%程度遅くなってしまいますが、p2.xlargeの仮想CPU数の少なさによるアプリケーションの影響とコスト面を考えると、Elastic Inferenceはかなり強力なGPUアタッチサービスと言えます。
![EI_4.jpg](https://qiita-image-store.s3.amazonaws.com/0/317659/d0022297-2d5c-9514-6c69-3361c6599724.jpeg)
###サポートフレームワーク
Elastic Inferenceは現在以下の機械学習フレームワークをサポートしています。PyTorchなどの他のフレームワークにも今後対応予定とのこと。
・TensorFlow
・MXNet
・ONNX（MXNet経由）
###EC2へのアタッチ
アクセラレータはAWS PrivateLinkエンドポイントサービスを使用してネットワーク経由で接続します。
自動スケーリングインスタンスを設定するには、アクセラレータタイプとともにインスタンス設定で起動テンプレートを指定します。
![EI_5.jpg](https://qiita-image-store.s3.amazonaws.com/0/317659/74f6cb28-b9a1-08be-2b73-1ca8da1c50a1.jpeg)
###SageMakerとの組み合わせ
ローカルCPUリソースとアクセラレータが接続されたリソース間で計算を分散することができます。
この機能はSageMaker経由のS3上のDeepLearning AMIで利用できるので、自身のコンテナに組み込むことも可能です。
![EI_6.jpg](https://qiita-image-store.s3.amazonaws.com/0/317659/6003bfe2-440a-c253-79b7-aa8a058a6688.jpeg)
##終わりに
AIブームの最中、コスト面に問題を抱えている方は非常に多いと思います。
今回登場したElastic Inferenceの推論コスト最適化によって今後のアプリケーション開発がどう変化していくのか楽しみです。
スマートフォンの非接触式ICとsuicaカードの干渉を正しく物理的に抑える

スマートフォン（スマフォ）のIC機能を使わず、カバーにsuicaカードを仕込み、
使用する際に干渉しないようにするための物理的対策に関して記載。

![IMG_20181201_014207.jpg](https://qiita-image-store.s3.amazonaws.com/0/247563/f67b6327-aca0-3789-8c41-22493fea8845.jpeg)

# 結論
スマフォ側の確実にICの上に、磁気エラー防止シートを設置し干渉を無くす。
スマフォのICサイズが分からない場合は、磁気エラー防止シートを二枚にして確実に防ぐ。
それでも誤作動する場合は、斜めにタッチし、suicaカードのみ磁気が届くようにする。

- 初めに
    - 非接触型ICの仕組み
    - 磁気エラー防止シートの効果
- 細かい対応


# 初めに
シェア自転車を使用するようになり、suicaカードで開けることができるため、カードの使用頻度が高くなり、財布から携帯に移動したところエラーを起こし、使用することが出来なかったことから調べ始めた。

・検証機器
xpreia xz
suicaカード
磁気カード
スマフォカバー
セロテープ

最初は単純にスマフォとカバーの間にsuicaカードを挟み使用し、駅の改札口では安定して使用できるが、シェア自転車の読み取り機は精度が悪くほぼ反応はしなかった。
原因として、スマフォのexpriaに搭載されているfelicaとsuicaカードが磁気の干渉を起こしていると調べ分かり、干渉を抑えるため磁気エラー防止シートを購入して使用した。
ここで、非接触型IC、磁気エラー防止シートの仕組みに関して軽く触れる。

・非接触型IC
非接触型のため、icだけでなく配線によるアンテナコイルが繋がっており、このコイルにより、データと電力供給を行っている。
![DSC_1802.JPG](https://qiita-image-store.s3.amazonaws.com/0/247563/20fa3575-fcfa-bcf1-7212-585dd5a4c049.jpeg)



図付き参考ページ
http://www.sanwa-newtec.co.jp/products/t_card_step1.html




・磁気エラー防止シート
非接触で磁気でic同士のやり取りをするため、これを遮断するため金属類を挟む必要がある。単純にアルミホイルと樹脂カードででやっている人がいて行ってみたが、エラーが起きてしまった。渦電流が発生しないように、市販品の磁気エラー防止シートは磁気類が入っているのかもしれない。しかし材料には単純に金属、樹脂しか書いていないので、不確かである。アマゾンでも売っており、挟んでもエラーがでるというお客様が多いが、主な原因として、防止カードがずれて磁気がまわりこんでしまって余計なカードまで反応してしまっていると考えられる。位置ずれしないようスマフォと防止カードをセロテープで固定や防止カードを2枚で磁気で回り込みをなくす事が効果的である。
現在は100均で売っている物を使用。


図付き参考ページ（TDK）
https://www.tdk.co.jp/techmag/ferrite02/201009/index.htm


#細かい対応
実際に使用したが、エラーが出てしまった。下の対応でエラーがほぼ消えた。
携帯によって、ic位置が異なるので分解写真を検索し、
防止シートがスマフォのic位置からずれないようにセロテープなどで固定する。
他のnfc等の非接触icがスマフォの端などについている場合があるので、位置が重ならいよう気を付ける。
それでも誤作動する場合は、斜めにタッチし、suicaカードのみ磁気が届くようにする。敢えてsuicaカードの位置をずらし、斜めタッチでカードのみ反応しやすくするのも手である。
さくっと始める nuxt.js on Windows + Vagrant + VirtualBox + CentOS + docker

# tl;dr

```
# 最初に一回やればOK
docker pull node:alpine
docker run -it --rm --name nuxt -v "$PWD":/usr/src/app -w /usr/src/app node:alpine npx create-nuxt-app my-project
cd my-project

# 運用時
docker run -it --rm --name nuxt -v "$PWD":/usr/src/app -w /usr/src/app -p 3000:3000 node:alpine yarn run dev --host 0.0.0.0
```

# 省略

* [はじめに - Nuxt.js](https://ja.nuxtjs.org/guide)
* [library/node - Docker Hub](https://hub.docker.com/_/node/)
* Windows 10 home 以下（proなら大人しくdocker for windowsが楽でしょ）
* [Vagrant by HashiCorp](https://www.vagrantup.com/)
* [Oracle VM VirtualBox](https://www.virtualbox.org/)
* [Discover Vagrant Boxes - Vagrant Cloud](https://app.vagrantup.com/boxes/search)
* [Enterprise Container Platform | Docker](https://www.docker.com/)

# なぜ書いたか

* 先日勉強会に参加して動かしてみようと思った
* ちょっと雑にぐぐるとDockerfileを書いてDocker-composeを書いて、みたいな感じになっていて無駄だと思った
    * 動作させるのに必要最低限なことだけ整理したかった
* コマンドだけで片付くならリポジトリもクリーンに保たれるはず？
* 検索方法が悪かったのか、誰も言及しないのか、この構成（W+V+V+C+D）の時にホストWindowsからブラウザで接続するには、0.0.0.0で受けないとサーバがレスを返さないってゆうね。もうね。
* [ホストとポート番号 - Nuxt.js](https://ja.nuxtjs.org/faq/host-port/)このページを見つけるのが遅かっただけともいう
* これから始める人ができるだけ楽できるように記事に残した

# 雑に注意

* node:alpine 現時点だと v11.3.0 が入る。気になるなら他のタグでどうぞ
* port と host は好きに変えたらいいんじゃないですかね
* 運用時のコマンドが長い、とか思うなら alias 張ればいいんじゃないですかね
* ローカルにnode_moduleを置くと、複数プロジェクトでバージョン違い、には便利だけど、同じバージョンの複数プロジェクトの場合にはディスク容量が無駄にはなる。かもしれない。ただ中長期で見たら対応できるバージョンや更新頻度の差によってどのみちずれる。
* 動かして終わりじゃダメだからな＞自分

# おまけ

* [Netlify を使ったデプロイ - Nuxt.js](https://ja.nuxtjs.org/faq/netlify-deployment)
    * 簡単便利ですごすぎた
仮想環境構築後に設定しておきたいこと -メモ-

Ruby on rails用に、仮想環境構築後、個人的にしている設定、herokuのインストールなど、様々な記事を見たけれど、今一どう書いたらいいか分からん！みたいになっていたので、後々また仮想環境作ったときに、同じようにあれこれ検索するのが面倒なので、メモとして、やっとけばいいことだけ書いていこうと思います。

仮想環境
・ドットインストールのやつ

- .bash_profileの設定
    - ターミナルのプロンプト設定
    - herokuをインストールする為のPATHの設定
- sudoの設定
- herokuのインストール


## .bash_profileの設定
### ターミナルのプロンプトの設定
まず、ターミナルの設定は.bashrcか.bash_profileに

```bashrc_or_.bash_profile
export PS1='\[\e[0;31m\][\h@\w]\$\[\e[0;0m\] '
```

を追加する。
CUI操作の場合は

```
$ echo>> 'export PS1='\[\e[0;31m\][\h@\w]\$\[\e[0;0m\] '' ~/.bash_profile
```

もしくは、

```
$ echo>> 'export PS1='\[\e[0;31m\][\h@\w]\$\[\e[0;0m\] '' ~/.bashrc
```

で、直接追加できる、筈…（GUIでしかやってないからコマンドが正確じゃないかもしれないが、echoの使い方調べればいいと思う。）
詳しい設定などは下記のURLを参考にする。
https://qiita.com/griffin3104/items/0d610ad1a57fa6ad6a09

### herokuをインストールする為のPATHの設定
heerokuは、インストールする際に、

```terminal
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
105  1892  105  1892    0     0   2732      0 --:--:-- --:--:-- --:--:--  7112
Your path is missing /usr/local/bin, you need to add this to use this installer.
```

このように、/user/local/binのPATHを求めてくるので、事前に.bash_profileに設定を追加しておきます。
GUIの場合

```.bash_profile
export PATH=$PATH:/usr/local/bin
```

CUIの場合

```
$ echo 'export PATH=$PATH:/usr/local/bin' >> ~/.bush_profile
```

下記のコードで.bash_profileを更新します。

```
$ source ~/.bash_profile
```
.bash_profileの設定はこれで完了。
## sudoの設定
先ほど追加したPATHの設定ですが、sudoに設定が引き継がれていない為（私は引き継がれなかったので）、このままherokuをインストールしようとしてもまたPATHを要求されてしまいます。
なので、sudoを設定します。

```
$ sudo visudo
```

viエディターが立ち上がるので

```
Defaults    env_keep +=  "PATH"
```
を追加し、コード内の

```
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
```
をコメントアウトします。

参考にしたURLこちらの方が親切です。
https://qiita.com/ogwmtnr/items/3ec2fab50d069a3cf335

viエディターは、扱い方が他のテキストエディターと違い特殊なので、初めて使う方は少し調べてからの方がいいと思います。
適切な終了の仕方さえ知っていれば問題ないので、終了の仕方のURLは貼っておきます。
https://blog.apar.jp/linux/7900/

随分中途半端ではありますが、私がよく忘れるので、終了の仕方だけ調べました。


これで、sudoの設定も終わりました。
### herokuのインストール
はじめに

```
$ sudo -s
```
次に、herokuのインストールコマンドを叩きます

```
# curl https://cli-assets.heroku.com/install.sh | sudo sh
```
最後に

```
# heroku -v
```
で、バージョンの確認ができれば無事終了です。


最初は、.bash_profileの設定をメモるつもりで書いていたけれど、まとめてみると、ほぼherokuのインストール手順でした。
サーバにあるプログラムをsshで接続してローカルのVSCodeで編集する


## まえがき

リモートサーバに置いてあるプログラムをローカルのPCから編集する必要があり、これまでsshを通じてJupyter Notebookで編集してきました。

しかし、これでは補完機能が使えなくさすがに嫌になってきたので、sshの接続先のファイルをローカルのエディタから書き換えられる手段が欲しいと思い、色々調べたので、自分がやってきたことを細かくメモします。

## 環境

Ubuntu 16.04 LTS

## ローカル側でやること

### 公開鍵認証を設定する

すでに設定済みの人はいいですが、公開鍵認証をローカル側で設定する必要があります。  
  
公開鍵と秘密鍵を生成しましょう。

```bash
$ ssh-keygen
```

```Enter file in which to save the key```と聞かれるので、特に鍵の名前をつける必要がなければ何もせずエンターを押します。
すると```Enter passphrase (empty for no passphrase```と聞かれるので、任意のパスワードをいれます。(いれなくても大丈夫です)

ここまでくると、 ```~/.ssh/```の中に```id_rsa.pub```と```id_rsa```の２つが生成されます。これが、公開鍵と秘密鍵です。
    
まず、秘密鍵の設定をします。
秘密鍵は、ローカル上のどこに置いてもいいですが、セキュリティの観点からパーミッションを600にする必要があります(ファイルの変更権限を所有者のみにするため)。

```bash
$ chmod 600 id_rsa
```
  
  
次に公開鍵についてです。リモート側の```.ssh/```に移動する必要があるので移動しましょう。(ローカル側の共通鍵は削除しても構いません)

移動したら、```id_rsa```の名前を```authorized_keys```に変更します。この際、先人のファイルがあれば、下の行に追加して上書きしましょう。

```bash
$ mv id_rsa.pub authorized_keys # まだない場合
$ cat id_rsa.pub >> authorized_keys # すでにある場合
```
  
### SSHポートフォワーディングを設定する

sshでファイルをリモートサーバに転送するために設定します。

```.ssh/config
HOST myserver(好きな名前で)
  Hostname リモートのホスト名
  User リモートのユーザ名
  IdentityFile 秘密鍵のパス(上で作った人は ~/.ssh/id_rsa)
  IdentitiesOnly yes
  ForwardAgent yes
  RemoteForward 52698 127.0.0.1:52698
```

### VSCodeに拡張機能《Remote VSCode》を追加する  
  
VSCodeで接続先のファイルを編集するために必要なものです。
<img width="764" alt="スクリーンショット 2018-12-01 2.07.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/234316/d41ecb11-dd69-2691-0f95-0d1036269d7b.png">

インストールして、アクティブにしましょう。


### VSCodeを接続可能状態にする  

F1を押してコマンドパレットを開き、Remote: Start Server を選択しましょう。
<img width="562" alt="スクリーンショット 2018-12-01 2.45.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/234316/71eb11ca-e471-9381-942b-1abedc360ba6.png">
VSCodeの右下に電波を受信していそうなマークが出ていれば大丈夫です。

VSCodeを起動すると同時にONにしたい場合は、File > Preferences > Settings を開き、remoteと検索した後、Remote VSCodeを選択してからLaunch the server on start up. にチェックを入れましょう。


## リモート側でやること

### rmateのインストール

rmateを動かすのにRubyが必要なので、なければダウンロードしてください。

rmateをインストールします。

```bash
$ curl -o /usr/local/bin/rmate https://raw.githubusercontent.com/aurora/rmate/master/rmate
$ sudo chmod +x /usr/local/bin/rmate
```

## 動作確認
VSCodeのterminalを操作してプログラムを開きましょう

```bash
$ ssh myserver
$ rmate hoge.py
```
  
  
  
参考資料

[多段SSHでも(Atom|VSCode)が使いたい！](https://qiita.com/kyamuise/items/5c09eaa8d255f8f8fea0)
[ssh公開鍵認証を実装する
](https://qiita.com/HamaTech/items/21bb9761f326c4d4aa65)
機械学習(分類)のためのデータセットの準備(CSVファイル編)

##はじめに

画像分類のためのデータセットの準備方法に触れている記事は多いが、csvファイルのデータセットの準備に触れている記事は少なくないか？と思い記事を書きました。
(実際datasetにするのに検索しまくり、とても時間がかかった…)

自分の備忘録も兼ねています。
また初心者のため、このやり方の方が効率的などのご意見、感想等ありましたらコメント頂けますと幸いです。

2018/12/05 一部編集しました。

##なぜCSV形式？
CSV(Comma Separated Value)は文字列や数字をカンマ(，)のみで区切ったファイルです。
拡張子を「.csv」にすることでCSVファイルとして保存することができます。

データセットが数字のみの場合は、txtファイルよりもCSVファイルで保存した方が簡単にデータセットを作れます。
numpyを使うときにCSVファイルの方が扱いやすいからです。
またpandasなどもCSVファイルの方が扱いやすいと思います。

##入力したいデータ

ここでは、data1.csv、data2.csvいう2つのファイルを扱うことを考えます。
1行が入力したい1データで、1つのデータは5つの要素から成り立っています。
data1は「前半」、data2は「後半」と分類したいとして話を進めます。

```CSV:data1.csv
100, 101, 102, 103, 104
110, 111, 112, 113, 114
120, 121, 122, 123, 124
130, 131, 132, 133, 134
140, 141, 142, 143, 144
```
```CSV:data2.csv
105, 106, 107, 108, 109
115, 116, 117, 118, 119
125, 126, 127, 128, 129
135, 136, 137, 138, 139
145, 146, 147, 148, 149
```

##numpyで二次元配列にする
numpyを用いると簡単にCSVファイルを配列(リスト)に変換することができます。

```
import numpy as np

#データの読み込み及び配列に変換
f = np.loadtxt('data1.csv', delimiter=',', dtype='int32')
g = np.loadtxt('data2.csv', delimiter=',', dtype='int32')

#配列の保存
np.save('data1.npy', f)
np.save('data2.npy', g)
```
`loadtxt`でcsvファイルの読み込みが行えます。
`delimiter`でカンマ(，)で区切った配列を作ることができます。　
また`np.save`で保存したファイルは次回からは`np.load('data1.npy')`で呼び出すことができます。

```CSV:data1.npy
array([[100, 101, 102, 103, 104],
       [110, 111, 112, 113, 114],
       [120, 121, 122, 123, 124],
       [130, 131, 132, 133, 134],
       [140, 141, 142, 143, 144]])
```
```CSV:data2.npy
array([[105, 106, 107, 108, 109],
       [115, 116, 117, 118, 119],
       [125, 126, 127, 128, 129],
       [135, 136, 137, 138, 139],
       [145, 146, 147, 148, 149]])
```

##dataとlabelを紐づける
data1には「前半」、data2には「後半」というラベルをつけたいです。
そこで、0＝「前半」、1＝「後半」とし、配列の6行目に0または1を付けることでラベルと紐づけることにします。

```
#0または1の配列の作成
a = np.full((6, 1), 0, dtype='int32')
b = np.full((6, 1), 1, dtype='int32')

#作成した配列とdataの配列を結合させる(0または1の配列を6行目に追加させる)
data1 = np.hstack((f, a))
data2 = np.hstack((g, b))

#data1とdata2を一つのdatasetにまとめる
dataset = data1
dataset = np.append(dataset, data2, axis=0)

#datasetをランダムに並び替える
np.random.shuffle(dataset)

#trainとtestに分割(train data=7, test data=3)
train = dataset[:7]
test = dataset[7:]

#dataとlabelに分割
train_data, train_label = np.split(train, [-1], axis=1)
test_data, test_label = np.split(test, [-1], axis=1)

#datasetの保存
x = (train_data, train_label, test_data, test_label)
np.save('dataset.npy', x)

#次回呼び出し
train_data, train_label, test_data, test_label = np.load('dataset.npy')
```

`np.full`で任意の値、形の配列を作成することができます。
`np.hstack`で横方向に配列を結合することができます。
dataとlabelを結合してからシャッフルすることで、dataとlabelを対応させつつ、ランダムな配列にすることができます。
その後、`np.split`でdataとlabelに分けることでデータセットとして活用できます。

以上でデータセットの準備を行うことができました。
後は、labelをone-hot表現に変更したり、正規化を行うことで機械学習を行うことができます。

##まとめ
この方法を調べるのに時間がかかり進捗が遅いと怒られたのですが、意外と簡単にデータセットにすることができました。
numpyに感謝です。
WebAssemblyの紹介（2018年冬版）

[WebAssembly Advent Calendar 2018](https://adventar.org/calendars/2970)の1日目です。

## WebAssembly：バイナリフォーマット

WebAssemblyとはソフトウェアパッケージを記述するためのバイナリフォーマットの1種です。[WebAssemblyコミュニティグループ](https://webassembly.org/)で機能が議論され、[W3C](https://www.w3.org/wasm/)でその仕様が定められています。

その特徴は以下の4点です。

* 安全
* ポータブル
* 高速
* Webのエコシステムに組み込める

Webブラウザの上で高速にプログラムを動かすには、サイズを小さくできるバイナリフォーマットが必要で、しかも効率良いネイティブコードへ変換を助ける情報が必要、という2つの要求を満たすために議論が始まったという経緯のため、Webブラウザの上で動くために必要な上記の特徴を持っている点が興味深いフォーマットとなっています。

## 利用できる環境

Apple, Google, Microsoft, Mozillaのモダンなブラウザベンダが初期から議論に参加しているため、[現行のほとんどのモダンブラウザの上で利用できます](https://caniuse.com/#feat=wasm)。

* Chrome
* Safari
* Edge
* Firefox

上記のブラウザは、モバイル版も含め動作します。

Chromeの場合、そのJavaScript処理系であるV8の一部としてWebAssemblyの処理系を実装しています。そのため、V8を利用しているnode.jsでもWebAssemblyが動作します。

## 利用例

利用例は上記の4点のどれを重要視するかによってカテゴリー分けできます。安全であることは、大前提であることもあるので、利用目的は次の3つに大別できます。

* ブラウザ上の動かすプログラムの高速化
* 既存ソフトウェア資産を利用したWebコンテンツの作成
* ユニバーサルバイナリとして利用

それぞれの例は、別の記事で参照することにします。

## 開発に使える言語

開発の方法は2つあります。

1つはWebAssemblyをターゲットとしたコンパイルを行う方法で、C / C++ / Rust / Go などが利用できます。

もう1つはWebAssemblyに出力されたインタプリタを使って、他の言語で書かれたプログラムを動かす方法です。[Perl](https://webperl.zero-g.net/using.html)や[LUA](https://daurnimator.github.io/lua.vm.js/lua.vm.js.html)などが代表例です。

## まとめ

JS以外の言語で書かれたプログラムをWebの世界にもちこめるのがWebAssemblyの成果です。その特徴のどれを生かすかによって、面白い使い方が見えてくるかと思います。
[Minecraft Forge] Eclipseで編集してEclipse上から実行すると反映されないのはGradleとの兼ね合いでbinフォルダに古いゴミが残っているから説

# 状況

- forgeSrc-1.12.2-14.23.5.2768.jar

Minecraft ForgeのModding環境をEclipseのGradleプラグイン（Buildship）で編集している。Eclipse上から通常の実行またはデバッグとして起動できるようになっているので、ここから実行する。これだとGradleでコンパイルすることなくEclipseのコンパイラでコンパイルして実行できる。早いしデバッグモードで起動すると起動中の編集内容が即反映されて楽だ。

だがたまに次のような謎挙動に遭遇する。

- (1) Eclipse上で編集してEclipse上で実行しても編集内容が反映されない
- (2) 編集中のMODが重複していると表示される

# 原因

Eclipseでコンパイルしたclassファイルが入るフォルダ（bin）の中にゴミが入っていたのが(2)の原因だった。また、ゴミの方だけを見て本物を見ない状態になっていると(1)が発生する。

大抵のアプリケーションではゴミが入っていても無視されるため実害がないが、ForgeがMODを検索する際には検索対象の中に存在するすべてのファイルを見るのでゴミがあると悪影響が起こってしまう。

# 解法

ここで「ソース・フォルダーごとに（ｒｙ」をOFFにして「デフォルト出力フォルダー」をbinとかにしてクリーンしたら治った。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/280627/f4f14529-e681-358e-80b7-f345fbfc921f.png)
Julia の print の丸め処理がおかしい？

#Float 結合則不成立
浮動小数点数では一般に結合則は成り立ちません。つまり、
(a + b) + c /= a + (b + c) 
となります。

IEEE754 の倍精度では仮数部が 53bit 分の情報をもつので、2^53 を超えると浮動小数点数では数直線の刻み幅が 2 になって、1 足しただけでは増えなくなります。

```
i = 2^53
9007199254740992

x = 1.0 * i
9.007199254740992e15

i + 1 + 1
9007199254740994

Int(x + 1 + 1)
9007199254740992

Int((x + 1) + 1)
9007199254740992

Int(x + (1 + 1))
9007199254740994
```

当然 3 を足しても段を上がれないのかと思うかもしれませんが、IEEE754 の場合偶数丸めがあるので、奇数１個飛び毎に段を上がれたり上がれなかったりします。

```
for k = 0:10
    println(k, " ", Int(x + k))c
end

0 9007199254740992
1 9007199254740992
2 9007199254740994
3 9007199254740996
4 9007199254740996
5 9007199254740996
6 9007199254740998
7 9007199254741000
8 9007199254741000
9 9007199254741000
10 9007199254741002
```

generic 関数の場合、同じ関数に整数と浮動小数点数を引数に与えると結果が違ってくるので、ぱっと見変にみえます。

```
function f(x)
    Int(x + 1 + 1)
end

f(i + 0)
9007199254740994

f(i + 0.)
9007199254740992
```
Julia では 1 + 1 の定数部分を最適化して 2 にせずに、式の通りに真面目に計算しているようです。

個人的に浮動小数点数では generic は色々無理がありすぎるだろうと思うのですが、次々期 Fortran で入りそうな勢いです。 

##デフォルトの print の丸めがおかしい
2^54 からは、数直線上の刻み幅が 4 になります。以下では Float64 の 2^54 に 4.0 を足していってますが、print/println で正しく丸められていないように見えます。もしくは謎な仕様になっています。整数化するとちゃんと表示されていますので、表示の print/println 関数内部の問題だと思われます。

```
v = 2^54 + 4 + 0.
for k = 0:10
    println(Int(v), "  ", v)
    v = v + 4
end

18014398509481988  1.8014398509481988e16
18014398509481992  1.801439850948199e16
18014398509481996  1.8014398509481996e16
18014398509482000  1.8014398509482e16
18014398509482004  1.8014398509482004e16
18014398509482008  1.801439850948201e16
18014398509482012  1.8014398509482012e16
18014398509482016  1.8014398509482016e16
18014398509482020  1.801439850948202e16
18014398509482024  1.8014398509482024e16
18014398509482028  1.8014398509482028e16
```
nuroモバイルのデータ使用量を取得する

毎回ログインしてWebページ上で確認するのは面倒くさいのでデータ使用量を取得するコードを書いた。
定期的にデータを集めてSlack投稿したりメトリクス作ったりするつもり。

```js

var client = require("cheerio-httpcli");

const PHONE_NUMBER = process.env.PHONE_NUMBER;
const PASSWORD = process.env.PASSWORD;

const nuroSite = "https://mobile.nuro.jp/mobile_contract/u/login/";

client.fetch(nuroSite, (err, $) => {
  $("#simNumber").val(PHONE_NUMBER);
  $("#simPassword").val(PASSWORD);

  $("#simSubmit").click((err, $) => {
    const result = {};
    const zyokyoBlock = $(".zyokyoBlock");
    result[zyokyoBlock.find("li > ul > li > p.title").text()] = parseInt(
      zyokyoBlock
        .find("li > ul > li > p.data > .yen")
        .text()
        .replace(",", "")
    );
    zyokyoBlock.find(".kanou").each(function(idx) {
      result[
        $(this)
          .find("p.title")
          .text()
          .replace(",", "")
      ] = parseInt(
        $(this)
          .find("p.data > .yen")
          .text()
          .replace(",", "")
      );
    });

    zyokyoBlock.find(".siyou").each(function(idx) {
      result[
        $(this)
          .find("p.title")
          .text()
          .replace(",", "")
      ] = parseInt(
        $(this)
          .find("p.data > .yen")
          .text()
          .replace(",", "")
      );
    });

    // Slack通知なり何でもかんでもする
    console.log(result);
  });
});

```
vimでESCキーが遠いと感じたら

`Ctrl+[` で代替できる。

[第44回　［最終回］vimキーバインドを提供するIdeaVIMについて：Android Studio最速入門～効率的にコーディングするための使い方｜gihyo\.jp … 技術評論社](https://gihyo.jp/dev/serial/01/android_studio/0044?page=2)
>Ctrl-[による編集モードへの復帰
Vimに慣れた人の中にはNormalモードへの復帰にESCキーではなく，Ctrl-[ にクセをつけてしまった人たちが居ます。

[vimindex \- Vim日本語ドキュメント](https://vim-jp.org/vimdoc-ja/vimindex.html)
>i_CTRL-[      CTRL-[          <Esc> と同じ。
Visual Studio CodeでPHPのステップ実行



## はじめに

以前の記事で、Docker + PHP Storm でステップ実行する方法を紹介しました。
https://qiita.com/yKanazawa/items/363ba93f8a376c5b9e75
今回は、そのVisual Studio Code版になります。

無償のエディタでPHPのステップ実行ができる環境が作れますので、会社でも積極的に導入できるかと思います。
個人的には、PHP Stormと比較しても遜色ない（長所もあれば短所もある）デバッグ環境だと思いました。

以下、Visual Studio Code + XDebug でデバッグ・ステップ実行する方法を解説します。 

## 検証環境

- Windows 10 Professional
- Docker for Windows
  - nginx
  - PHP-FPM
  - XDebug
- Visual Studio Code
 
## PHP-FPMの設定

Dockerコンテナ内の`/etc/php.d/xdebug.ini`を以下のように設定します。

```
[xdebug]
zend_extension="/usr/lib64/php/modules/xdebug.so"
xdebug.remote_enable = On
xdebug.remote_port = 9000
xdebug.remote_autostart = On
xdebug.remote_host = host.docker.internal
xdebug.profiler_output_dir = "/tmp"
xdebug.max_nesting_level= 1000
```

## Visual Studio Codeの設定

拡張機能の PHP Debug をインストールします。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/38162/7ba01235-ab31-a383-3ef2-c40bd4ee6146.png)

Debug → Add Configuration → PHP を選択します。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/38162/63792e96-f9f6-69ac-aabd-e76db330a197.png)

Listen for XDebug を以下のように設定します。

```
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for XDebug",
            "type": "php",
            "request": "launch",
            "port": 9000,
            "stopOnEntry": true,
            "pathMappings": {
                "/var/www/test": "${workspaceRoot}"
            }
        },
        {
            "name": "Launch currently open script",
            "type": "php",
            "request": "launch",
            "program": "${file}",
            "cwd": "${fileDirname}",
            "port": 9000
        }
    ]
}
```

※うまく動かないときは`${workspaceRoot}`をフルパスでベタ書きすると良いかも。

```
     "/var/www/test": "${workspaceRoot}"
↓
     "/var/www/test": "c:/Users/kanazawa/www/test"
```

## ステップ実行の開始

「Listen For XDebug」を選択した状態で、横の再生ボタンを押下します。
![5.PNG](https://qiita-image-store.s3.amazonaws.com/0/38162/5f05d635-fdca-9986-bc03-22f4703a4dfc.png)

ブレークポイントを予め設定しておくと、その位置で停止します。
画面上部のツールバーアイコンから、ステップオーバーが可能です。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/38162/cd10e57a-51a3-a817-293f-e8c925463cf2.png)

## 最後に

Visual Studio Codeは様々なプログラミング言語をサポートしているので、PHP以外でもステップ実行できる環境として使えそうです。

今後、他のプログラミング言語についても調べていきたいと思います。