OmniAICreator/Qiita-1.07M huggingface dataset:
ZRouterの事

本記事は[ルーターハックAdvent Calendar 2018](https://adventar.org/calendars/3557) 14日目の記事です。

![index.jpg](https://qiita-image-store.s3.amazonaws.com/0/104066/f89a4b57-1adb-b9e9-3b78-db259965bc7e.jpeg)

Linux方面の方にもこんなのあるんだと言うアピールのため書きます。

FreeBSDのルーターイメージをビルドするツールにZRouterとfreebsd-wifi-buildというのがあります。

ZRouterは9年くらい前に始まったプロジェクトなのですが、私がさわりはじめたのは5年くらい前でした。

大きな違いはZRouterは独自にコンフィグレーションを作って、ビルドするのに対して、freebsd-wifi-buildはFreeBSDのbuildworld/buildkernelをラップしたようなものです。ZRouterはmakeベースでの作り込みで、freebsd-wifi-buildはshスクリプトペースの作り込みになります。

どうも元は一緒に作っていたのが喧嘩別れしてfreebsd-wifi-buildができたようです。

なぜ私がZRouterが良いと思っているかというと、freebsd上であればfreebsdのソースとZRouterがあれば追加でパッケージをインストールする必要なくビルドできるからです。加えて基本的なビルドには一切rootの権限が必要ない事があります。あと自分がいろいろいじったので、もはや移す気が起きません。

FreeBSDのmips系はAtherosかMediatek(Ralink)がお勧めです。Broadcomは作り替えてソースはあるのですが、トラブルが好きな人でなければ避けた方が良いです。

元々4M Flashではきつかったのですが、削ってどうにかOSだけであれば入るようになっています。いまのところMIPS16が使えないので8M以上の機種がお勧めです。

5年前には2Mや4Mのターゲットが結構ありましたが、最近では4MでもUSBが付いていたりするので、ほぼストレージの大きさからは解放された感があります。

MediatekはLinux同様にFDT対応されたコードになってます。dtsはLEDからのものがFreeBSDのツリーにあります。ペンギン撲滅を目指していましたが、リソースを共有しているので、仲良くした方が良いかもしれませんね。

日本で手に入るターゲットもいろいろ追加してあります。一部ブート入れ直しやFlash貼りなおししている機種もあります。

FreeBSDのFDT対応のファイルシステムの位置はdtsのpartitionに直書きになってます。このためkernelが大きくなったときにrootfsの位置がづれて起動できなくなる事があります。パッチを作ってレビューに入れてあるのですが、ロシアの友人のコミッターと意見が合わずそのままになってます。

Atherosを使ったWZR-HP-G300NHかWZR-HP-G301NHがいろいろな人に使ってもらっているので、一番再現性が高いと思います。この機種の[Ethernet Swtich対応](https://qiita.com/yamori813/items/183bd279fbdfa5b9c70f)も自分がやりました。WZR-HP-G300NHは二種類あってEtherswitchにRTL8366SRを使った前期のものとRTL8366RBを使ったものになります。ZRouterの設定ファイルはWZR-HP-G300NHがRTL8366SRでWZR-HP-G301NHがRTL8366RBとしてあるので、RTL8366RBを使ったWZR-HP-G300NHはWZR-HP-G301NHでビルドしてください。

このアドベントカレンダーの趣旨の通り無線はほとんどやってません。たまたままにあっていて、いじるのがめんどうだったからなんですが。

FreeBSDのarm系はメモリが大ききターゲットが増えて来たので、セカンドローダーを用意して使っていますが、mipsではkernelをブートローダーから直接起動するようにしています。

ブートローダー対応はu-boot,redboot,cfeに対応しています。それぞれのイメージ作成用のツールを内包しています。

u-bootについてはPlanexの先頭に空白のあるイメージにも対応させてあります。

ZRouterの売りとしては、FreeBSDのパッケージ作成環境のportsを流用した仕組みで、イメージに追加のコマンドを入れ込む事ができます。自分の必要な物しか入ってませんがmrubyやracoon(ipsec-tools)などがはいっていてちょっと変わったところでは飛行機の無線をワンセグチューナで受信するdump1080なども入っています。portsもどきと呼んでいるのですが、portsもどきではgmakeなどのパッケージが必要になるケースもあります。

ZRouterはウクライナのrayが始めたプロジェクトで、ここ最近は私がいろいろいじっていたので、motdに私の名前も入れてくれました。

FreeBSDで使えなかった蟹さんやBraodcomはBareMetalでmrubyを動かしています。

山ほど買っておいて何なのですが、ハードオフでルーターが108円や324円であまりにたくさん転がっているのは、これを作っている人も買った人も不幸な気もします。少しメーカーの人も考えるべきではないでしょうか。（某メーカーみたいにブートにパスワードかけて使えなくするのではなく。そんなことしてもu-boot焼いてちゃんと使えますから)

レンタルサーバでFreeBSDの仮想環境作ってZRouter始めてみませんか？
ジムのレッスンスケジュールをスクレイピングしてみた

# やろうと思った背景

私はジムのレッスンが好きで、週末はストレス発散もかねて、ジェクサーやコナミといったジムに行きます。

そこで、自分の空き時間に　`自分の好きなレッスンがやっているスタジオをすぐに検索したい！` と思ったことがきっかけです。

というわけで、自分が通っているスタジオ（ジェクサー、コナミ）のレッスンをスクレイピングして、自分の空き時間に行きたいレッスンを探せるようにしてみます。

# スクレピング対象

ジェクサー全店のグループエクササイズ タイムスケジュールを対象とします。
例：[ジェクサー・フィットネス＆スパ 新宿【グループエクササイズタイムスケジュール】](http://www.jexer.jp/schedule/fitness/?shop=25)

＊コナミもやりたかったのですが、時間の関係で、後日、やることにします。

# アーキテクチャ

システム的には以下の通り単純です。DBなどは特に使用せず、CSV出力してスプレッドシートで表示します。

1. **Webスクレイピングクライアント**：
    2. ジムのレッスンスケジュールページのhtmlを取得する
    3. html解析する
    4. CSV出力する
5. **マニュアル**：
    6. GoogleドライブのスプレッドシートにCSVを貼り付ける

![アーキテクチャ (1).png](https://qiita-image-store.s3.amazonaws.com/0/112294/5bf986cf-2f18-a31c-2510-4739e72e70ba.png)


### Webスクレイピングクライアントの構成
- 言語
    - Ruby 2.5.1
- ライブラリ
    - nokogiri
    - page-object
    - selenium-webdriver

# プログラム

GitHubにアップしました。
今後、徐々に拡張していきたいので、gemとして作成しました。

https://github.com/YukiFujisawa/training_gym_lesson_batch

ローカル単体で実行する場合は、以下のコマンドでいけます。

```
$ brew tap homebrew/cask
$ brew cask install chromedriver
$ rake build
$ gem install pkg/training_gym_lesson_batch-0.1.0.gem
$ ruby main.rb > lesson_list.csv
```

# スクレピング結果

Googleドライブのスプレッドシートに出力したものを貼っておきますので、興味のある方はみてください。

ジェクサー全店舗のレッスン約2800レッスンあります。
＊2018年12月のレッスンスケジュールなのでその点ご了承ください。
[ジェクサー全店舗レッスン.pdf のダウンロード](https://docs.google.com/spreadsheets/d/e/2PACX-1vQcnq4f8psp3ex5-NygRfY8ElD_XvB9DwOfHnoyhd7MxaHbFF3BIuNBYxbQj-oTTOgKLETOI6nvOyOy/pub?gid=54721693&single=true&output=pdf)

こちらはインストラクター別にレッスン数を集計してみました。
忙しいインストラクターが一目でわかります。
[ジェクサー全店舗レッスンのインストラクター別集計.pdf のダウンロード](https://docs.google.com/spreadsheets/d/e/2PACX-1vQcnq4f8psp3ex5-NygRfY8ElD_XvB9DwOfHnoyhd7MxaHbFF3BIuNBYxbQj-oTTOgKLETOI6nvOyOy/pub?gid=2032393898&single=true&output=pdf)
LIFF上でWebAssemblyが動作するか検証してみた

# 経緯

本来はLINEBot&Clova Advent Calendar 2018のために書くつもりだったのですが、期日を過ぎてしまい、予定していたところには他の方が代理で記事を投稿してくださっていました
しかし、やっと時間が取れたので検証結果を載せておくことにしました。

# LIFFとは

LINEのトーク内でWEBページを表示するための機能です。
2018年6月から使えるようになりました。

[LIFF - 概要](https://developers.line.biz/ja/docs/liff/overview/)

# WebAssemblyとは

アセンブリ言語をWEBブラウザで実行するための技術です。
C/C++言語等で記載されたソースをコンパイルし、JavaScriptで呼び出すことができます。

[WebAssembly とは何か ?](https://developer.mozilla.org/ja/docs/WebAssembly/Concepts)

# 検証

WebAssemblyはIE等一部のWEBブラウザでは利用できないとこのことなのですが、
LIFF上でちゃんとどうさするのでしょうか？

## 準備
私の環境がWindows 10なのでWindowsで環境を整えるために必要なものをインストールしていきます。

* Visual Studio Community 2015 with Update 3<br>
Visual Studio Community 2017の最新バージョンではコンパイルできませんでしたので、[こちら](https://my.visualstudio.com/Downloads?q=visual%20studio%202015&wt.mc_id=o~msft~vscom~older-downloads)からVisual Studio Community 2015 with Update 3をインストールする必要があります。
* CMake 3.13.2
* Python 2.7.13

## Emscriptenのインストール
WebAssemblyのコンパイラとしてメジャーなEmscriptenを使います。

```
# チェックアウト
git clone https://github.com/juj/emsdk.git
cd emsdk

# インストール
emsdk install --build=Release sdk-incoming-64bit binaryen-master-64bit

# アクティベート
emsdk activate --global --build=Release sdk-incoming-64bit binaryen-master-64bit

# 環境構築
emsdk_env.bat
```

## サンプルコードのコンパイル
``` hello.c
#include <stdio.h>

int main(int argc, char ** argv) {
  printf("Hello World\n");
}
```

```
# Emscriptenデコンパイル

emcc hello.c -s WASM=1 -o hello.html
```

## LIFFに設定

出力されたhello.html、hello.wasm、hello.jsをWEBサーバーにアップして、LIFFに設定します。

実際に設定したものがこちらです。
line://app/1610391881-Gmop24gK
![WebAssemblyテスト.png](https://qiita-image-store.s3.amazonaws.com/0/157083/9dd85b11-4323-0366-ed4e-a409f5e80116.png)

そしてこちらがLINEで確認したときの画面です。
![IMG_275u5d.jpg](https://qiita-image-store.s3.amazonaws.com/0/157083/dead9075-0bd0-dd5f-540d-55ded45c7f82.jpeg)

ちゃんとHello Worldと表示されました。
上記はAndroid端末で取得したスクリーンショットですが、iPhoneでも表示されることを確認しています。

## 参考
[C/C++からWebAssemblyにコンパイルする
](https://developer.mozilla.org/ja/docs/WebAssembly/C_to_wasm)
直交検波とは？


##概要：
直交検波とは、いわゆる離散フーリエ変換のことです。
ある信号に変調を加え、変調波形に対して、復調処理を施して元の波形に戻すときに使われます。
直交検波は、１つの信号に、抽出したい周波数の正弦波と、4分の1サイクルだけずらした余弦波の畳みこみを行うことで、受信信号の抽出したい周波数の振幅と位相を求めることができます
![クリップボード03.png](https://qiita-image-store.s3.amazonaws.com/0/73020/3b1a28e8-733f-f919-3253-f45534cb8ac3.png)

制御工学にて、ある波形を周波数領域へ変換することは、とても頻繁に使います。
直交検波を習得することで、簡単な演算で、ある波形の特性の周波数の振幅と位相を、高精度に、簡単に求めることができます。
もし、特定の周波数ではなく、全ての周波数の振幅と位相を求めたい場合は、高速フーリエ変換を使うことが望ましい方法です。

##演算アルゴリズム
直交検波は、以下の処理を行うことで実行することができます。
データ点数NNのデータxx[n]に対して，．
（１）x[n]とsin(ωt)波・cos(ωt)波の内積をとり，SS_sum，CC_sumとおく．
（２）位相はarctan(CC_sum/SS_sum)から求める。
（３）振幅は√(SS_sum^2+CC_sum^2)/N*2から求める。

##実装例
・Windows10+VisualC++2015でのExampleCodeです。

```
#define _USE_MATH_DEFINES

#include<iostream>
#include<vector>
#include <cmath>
using namespace std;

int main() {
	vector<double> time;
	vector<double> xx;
	double T = 20;		//周期[sec]
	double phase = 0.1;	//位相[rad]
	double AA = 2;		//振幅[%]
	double NN = 200;	//データ点数
	double dT = 0.1;	//時間刻み

       //元となる波形を生成する。
	for (int n = 0; n < NN; n++) {
		double data = sin(n*dT / T * 2 * M_PI + phase)*AA;
		time.push_back(n*dT);
		xx.push_back(data);
		cout <<n*dT <<"_"<<data << endl;
	}

　　　　//正弦波と余弦波を生成する
	vector<double> SS;
	vector<double> CC;
	for (int n = 0; n < xx.size(); n++) {
		double S = sin(n*dT / T * 2 * M_PI);
		SS.push_back(S);
		double C = cos(n*dT / T * 2 * M_PI);
		CC.push_back(C);
	}
        
        //正弦波と余弦波との内積をとる。
	double SS_sum = 0;
	double CC_sum = 0;
	for (int n = 0; n < xx.size(); n++) {
		SS_sum += SS[n] * xx[n];
		CC_sum += CC[n] * xx[n];
	}
　　　　//振幅と位相を算出する。
	double detec_phase = atan(CC_sum / SS_sum);
	double detec_AA = sqrt(SS_sum*SS_sum+CC_sum*CC_sum)/NN*2;

	cout <<"元信号の振幅"<<AA << "検出した振幅"<<detec_AA  <<  endl;
	cout <<"元信号の位相"<<phase <<"検出した位相"<<detec_phase  << endl;

	return 0;
}



```
![クリップボード01.png](https://qiita-image-store.s3.amazonaws.com/0/73020/9cf16603-688f-8052-f61a-5f8cf81a0430.png)


###注意
直交検波・離散フーリエ変換は、以下の条件を満たさないと正しい結果を得ることができません。
・波形のサンプリング周波数が、ナイキスト周波数を満たしていること。サンプリング周波数が、抽出する周波数の2倍よりも大きいこと。
・波形のサンプリング長さが、求める周期の整数倍長であること。整数倍長でない場合は、窓関数を畳掛けすることで測定精度を改善することができます。
・波形のサンプリング長さが、求める周期の１周期よりも長いこと。
・波形に、インパルスノイズ・ステップノイズ・ホワイトノイズを含まないこと。


参考資料

インタラクティブシステム論第6回
http://kaji-lab.jp/ja/index.php?plugin=attach&refer=people%2Fkaji%2Fninshiki&openfile=ninshiki-6.pdf
NI I/Qデータとは
http://www.ni.com/white-paper/4805/ja/
位相検波回路
https://www.jspacesystems.or.jp/ersdac/Others/bookseries/errata/Errata_pdf/Vol2_170.pdf
DFT（離散フーリエ変換）
http://www.nfcorp.co.jp/techinfo/dictionary/063.html
お気に入りのキーボード、マウス、コーヒー

## 概要
☆メリークリスマス☆
この記事は「[キーボードとマウスとコーヒーと Advent Calendar 2018](https://qiita.com/advent-calendar/2018/keyboard_mouse)」の25日目の投稿です。
日々、自分が使用しているガジェットたちを紹介します。
2年連続で失礼いたしますm(_ _)m

去年の投稿は「[お気に入りのキーボード、マウス、コーヒー](https://qiita.com/tmyk78/items/fb0489ee14e73f1dae9d)」をご覧ください。

## 会社編

![IMG_2656.JPG](https://qiita-image-store.s3.amazonaws.com/0/139532/097fdfed-7f52-196c-5ffc-eb750848ef91.jpeg)

### キーボード
#### 自作キーボード
今年は自作キーボードに挑戦しました。
HHKBの配列をベースにしてMac専用に作成しました。
最左列の上から3段目（Caps Lockに当たる位置）、よく見ると1Uのキーキャップになっています。
キーキャップが足りなくてこうなってしまったのですが、これはこれで味があって気に入っていますｗ
実はHHKBのProfessional BTも買って使ってたのですが約半年で交代、、（もったいない。）
言いたいことがありすぎる、、収まらないので別でいつかまとめます。

### マウス
#### Apple Magic Trackpad
旧式のトラックパッドです。
これは去年と変わっていませんー。

### コーヒー
#### セブンイレブン カフェラテ 300ml
http://www.sej.co.jp/i/item/300501210087.html?category=349&page=1
セブンブランドのカフェラテです。
甘すぎず苦すぎずで大体毎日飲んでます。
売ってないことがあるのが玉に瑕。。


## 自宅編

![IMG_2659.JPG](https://qiita-image-store.s3.amazonaws.com/0/139532/4e2019a4-5eee-a1b7-b759-480093ae25d1.jpeg)

### キーボード
#### 東プレ REALFORCE 91UBK-S
去年会社で使っていたものを今は自宅で使用しています。
ただPCゲームもするのでゲームをするときはRazer Ornataで併用しています。
ただ置き場所に困り中。。

### マウス
#### Razer DeathAdder Elite
マウスは去年と変わっていませんー。

### コーヒー
#### ネスカフェ エクセラ ボトルコーヒー 甘さひかえめ
今年も家ではずっとこれ！

## まとめ
今年は自作も含めキーボードめっちゃ買いました。
Mint60のキットも買ってあるけどまだ作れていない、、冬休みにでも作りたいと思います。
それでは Have a Happy New Year!
Ubuntu Server 18.04.1 on Raspberry Pi 3 B+

#ROS使いたい
ROSをRaspberry Pi3 B+で使いたかったので、Ubuntu ServerをRaspberry Pi3 B+に入れたかったのだが、みつかった大体の情報はRaspberry Pi2用のイメージをいじったりしなきゃいけなくてめんどくさそうで、他人のビルドはセキュリティや安定性の面で不安があった。
#Official Beta Build
実はよく探したら公式のベータ版ビルドがあった。この記事はこれを紹介してこれ突っ込目で終わりだったりする。
3用って書いてあるが、そんなに問題なく3 B+でも使えてる。
 http://cdimage.ubuntu.com/ubuntu/releases/18.04.1/beta/
JMeterメモ(作成中)

JMeter5の自分用メモ

### 日本語化
set JVM_ARGS="-Duser.language=ja"
..\bin\jmeter.bat

## ガウス乱数タイマ

10個のリクエストを行うシナリオを10回繰り返して、最大、最小、平均の結果を出す。

### テスト１
偏差(ミリ秒)：100
遅延時間オフセット定数(ミリ秒)：300

１回目
(388, 9, 256.3)
(404, 105, 294.4)
(394, 129, 290.3)
(442, 19, 294.2)
(521, 229, 353.3)
(475, 48, 307.0)
(598, 35, 321.9)
(475, 122, 308.2)
(510, 118, 329.3)
(431, 151, 321.44444444444446)

2回目
(515, 126, 295.1)
(344, 127, 223.1)
(453, 229, 356.1)
(359, 165, 277.4)
(604, 172, 328.6)
(501, 210, 340.4)
(472, 125, 300.0)
(516, 257, 342.6)
(411, 241, 309.0)
(553, 26, 260.6666666666667)

3回目
(412, 172, 274.0)
(488, 191, 313.7)
(382, 190, 268.1)
(515, 175, 330.8)
(434, 167, 319.8)
(425, 11, 285.4)
(457, 62, 226.0)
(533, 240, 337.0)
(443, 98, 248.8)
(419, 218, 296.6666666666667)

スループットは3.5/sec程。
1秒間に3.5回ということは、約300ミリ秒に1回ということであっていると思われる。

### テスト2
偏差(ミリ秒)：100
遅延時間オフセット定数(ミリ秒)：0

1回目
(252, 17, 84.3)
(110, 15, 59.8)
(166, 3, 82.0)
(179, 21, 88.9)
(158, 0, 61.6)
(141, 9, 64.4)
(216, 15, 72.9)
(243, 16, 101.6)
(153, 8, 84.8)
(197, 22, 97.66666666666667)
スループットは12.7/sec

### テスト3
偏差(ミリ秒)：2000
遅延時間オフセット定数(ミリ秒)：0

1回目
(4003, 33, 1673.3)
(3424, 388, 1730.0)
(5887, 161, 1785.5)
(5335, 329, 1746.3)
(2285, 52, 849.4)
(3541, 90, 1877.3)
(3860, 140, 1488.4)
(5903, 266, 1779.9)
(2203, 185, 797.9)
(2596, 122, 1400.888888888889)

スループットは40/minになった。
間隔は33～5903と幅が広く、平均で1.7秒程度。
スループットについて調べてみる。

## スループット
偏差(ミリ秒)：2000
遅延時間オフセット定数(ミリ秒)：0

10個のリクエストを行うシナリオ
で10スレッドで40/minだったが、1スレッドで何度か計測する。

28.4/min
44.2/min
1.1/sec
27.6/min
48.9/min

次はシナリオを修正し、リクエストの数を2つに減らす。

52.1/min
1.4/sec
12.5/min
4.1/sec
6.1/sec

# 解析用メモ
## Apache
時間をミリ秒で表示：%{msec}t

```httpd.conf
LogFormat "%h %l %u %{msec}t \"%r\" %>s %b" common
```

ポート番号を表示：%{remote}p

```httpd.conf
LogFormat "%h %{remote}p %l %u %{msec}t \"%r\" %>s %b" common
```
## Python
```py:解析用
from more_itertools import chunked

def file_readlines(file_name):
    return open(file_name, "r", encoding="utf-8").readlines()

# CSVやログファイルから特定の列を取得し、Listで返す
def lines_division_get_onecolumn(lines, colnumber, separeter = " "):
    result = []
    for line in lines:
        result.append(line.split(separeter)[colnumber])
    return result

# Listの各行の数字の差をListで返す
def diff(lines):
    result = []
    previous = int(lines[0])
    for line in lines[1:]:
        result.append(int(line) - previous)
        previous = int(line)
    return result

# Listの最大、最小、平均を求める
def analysis(lines):
    return (max(lines), min(lines),sum(lines)/len(lines))

lines = file_readlines("data.txt")

data = lines_division_get_onecolumn(lines,3)
time = diff(data)

morelist = list(chunked(time,10))
for line in morelist:
    print(analysis(line))
```

Visual Studioでpipを使ってモジュールをインストールするには
「ソリューションエクスプローラー」で"Python環境"を選択し、右クリックして、「Pythonパッケージのインストール」を選択する。
laravelを開発できるようにしよう（提案）@windows

#この記事の対象
windowsユーザー
laravelをローカルで開発したい
vscodeで開発したい
mariaDBが使えれば細かいことは言わない（要はxampp前提）

#今までに環境作ろうとしてコケてた場合（私です）
xamppをアンインストール：アンインストーラーあります。
php.exeが入っているディレクトリが他にあれば削除：結構C直下にありそう。
そのディレクトリへのpathが環境変数にあれば削除

#環境を作る
##xampp
インストーラをダウンロードしてインストール
※ユーザーアカウント制御で警告レベルを最低にしておき、インストール後に戻す
インストール先：C\xampp
phpは入っている（xampp\php\php.exe）

##composer
インストーラをダウンロードしてインストール
参照先のphpはC\xampp\php\php.exe

環境変数にC\xampp\phpを追加（無くても動くがvscodeから動かすときあったほうがよさそう。）
xamppコントロールパネルを開き、shellを起動

php -v して大体以下のように出ればOK。

```
PHP 7.3.0 (cli) (built: Dec  6 2018 02:17:00) ( ZTS MSVC15 (Visual C++ 2017) x86 )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.0-dev, Copyright (c) 1998-2018 Zend Technologies
```

#laravelが動くか試す
cd htdocs
composer create-project --prefer-dist laravel/laravel laravel

でlaravelのプロジェクトが立ち上がり、htdocs内にlaravelが展開される。

xamppコントロールパネルからApacheを起動
http://localhost/laravel/public/

いつものページが見えてhtdocs/laravel内にいつものディレクトリ構成ができていればOK。

#vscodeから使えるか試す
http://localhost/phpmyadmin/
DBのみ、データベース>新規作成>[dbname]>作成

vscodeから.configを開き、接続DBの設定を書き換える
host->localhost
db->さっき作ったdb
user->root
pass->''
port->変更しない

※便利機能
拡張機能でphp 5 snippet, Laravel blade snippet, Laravel artisanをインストール
拡張機能でMySQLをインストール
画面左下にmysqlへのログインと操作ができるパネルが出現（でもvscodeからsqlは叩けない、どうにかしたい）

vscode自体のsettings.jsonにphpのpathを追加
"php.validate.executablePath": "C:/xampp/php/php.exe",
"php.executablePath": "C:/xampp/php/php.exe",

windowsを再起動(windows側の環境変数設定は再起動しないとたいてい効いていない)

vscodeを開いてlaravelのフォルダを展開、
Shift+ctrl+Pでコマンドウィンドウを開きArtisan: make model
model名を入れてyesするとmigrationファイルが書き出される

ファイルができたらShift+ctrl+P > Artisan: migrate

phpmyadminで見て予定通りのテーブルができていればOK。


#嘆き
vscodeからsql叩けないのは嫌だな…。課題。
ShellScript 標準入力 標準出力 標準エラー出力 について

#目的

- ShellScriptを書く際に必要な入力と出力の考え方をまとめる。

#この記事のターゲット

- ShellScriptを初めて書く方
- Linuxに触れている方

#そもそも入力と出力とは(身近なATMで考えてみる)

1. 入力とは
  - 銀行に行きATMでお金をおろすときに画面にタッチして暗証番号を打つ(入力する)こと。
  - ATMの機械に情報を与えること。

1. 出力とは
  - 銀行に行ってATMに入力した情報をもとにお金が払い出されること。
  - 入力の結果が返ってくること。

#ShellScriptでの標準入力、標準出力、標準エラー出力

1. 標準入力
  - スクリプトのファイルに情報を与えてあげること。
  - 与える情報の内容に限らず、すべて入力と呼ばれる。
  - 標準入力には名前があり数字の”0”が与えられている。
  - 難しく考えないで、単純に普通の文字の入力と同じ。

1. 標準出力
  - 標準入力に対する反応
  - 電卓で計算したときの答えと一緒
  - スクリプトで正常に処理がされたときの答え
  - 標準出力にも名前があり数字の”1”が与えられている

1. 標準エラー出力
  - 標準入力に対する普通でない反応
  - スクリプトの中の処理がうまくいかなくて期待通りの反応が返ってこなかったこと
  - 入力がおかしくて処理がうまくいかなくて期待通りの反応が返ってこなかったこと
  - 変な反応、異常な反応くらいに考えておけば良い
  - 標準エラー出力にも名前があり数字の”2”が与えられている
  - スマホのロック解除で、番号を間違えると「パスコードが違います」といわれるのと同じ

#まとめ

  - プログラミング言語に触れてこなかった人(自分も)は確実に理解に苦労するであろう箇所と思う。
  - 独特な考えであるように思えるが、実は皆さんの生活の中にも各入出力は存在している。
  - あまり難しく考えるとドツボのはまるため、あまり深く考えすぎないことが重要。
年末なのでCSSの3Dとanimationであそんでみた

# :rainbow: はじめに
PCのchrome前提です
CSSの３Dを使っているので重いです

# :cupid: まずはCSSで立方体をつくった :cupid: 

<p data-height="265" data-theme-id="0" data-slug-hash="rowmYw" data-default-tab="css,result" data-user="nena3" data-pen-title="base cube" class="codepen">See the Pen <a href="https://codepen.io/nena3/pen/rowmYw/">base cube</a> by nena3 (<a href="https://codepen.io/nena3">@nena3</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

### :wrench: どうやってつくったか :wrench: 
見てもらったほうがはやいと思いますが、完結に説明すると
・親要素にperspectiveを設定
・キューブとなるdivを６枚生成し一枚ずつ角度を調整して立方体を作成する
・適当にアニメーションを設定する

# 周りからパネルがやってくるタイプ
それぞれのパネルを初期位置の−２００px周りからくるようにアニメーションしています

<p data-height="265" data-theme-id="0" data-slug-hash="jXwZPO" data-default-tab="css,result" data-user="nena3" data-pen-title="paka-" class="codepen">See the Pen <a href="https://codepen.io/nena3/pen/jXwZPO/">paka-</a> by nena3 (<a href="https://codepen.io/nena3">@nena3</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# ムニョっとさせた
scale0 -> 1
とborder-radiusを100px->0
だったかな
<p data-height="265" data-theme-id="0" data-slug-hash="ebRVmz" data-default-tab="css,result" data-user="nena3" data-pen-title="munyo" class="codepen">See the Pen <a href="https://codepen.io/nena3/pen/ebRVmz/">munyo</a> by nena3 (<a href="https://codepen.io/nena3">@nena3</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# シュワーっとさせた
scaleYを0->1だったかな
一番好き
<p data-height="265" data-theme-id="0" data-slug-hash="YdQOMY" data-default-tab="css,result" data-user="nena3" data-pen-title="shuwa" class="codepen">See the Pen <a href="https://codepen.io/nena3/pen/YdQOMY/">shuwa</a> by nena3 (<a href="https://codepen.io/nena3">@nena3</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# 調子にのっていろいろ書いたら重くなったのでここまでにしときます :cry: 
１００個くらいキューブを生成したら重かった
threejsとか無しでこれだけでゲームとか作れないだろうか？ :thinking: 
それはまたそのうち考えてみよう:santa:
Mockeryを使うとテスト書くのが楽しくなった

## 概要
テストを書く対象のロジックのなかで外部のAPI(Google OAuthとか)が呼ばれてたりするとテスト書くのが億劫になる今日この頃。
[`Mockery`](http://docs.mockery.io/en/latest/)を使うと外部APIを呼ばずに戻り値だけ設定でき、さも外部APIが呼ばれたような処理ができ、本当にテストしたい箇所のみテストを書くことができるらしい。
Laravelのドキュメントには実用例書いてなかったのでまとめとくことにしやした。

## 環境
- php7.2
- laravel5.6

## 実例

### テスト対象のコントローラ

```php:UserController.php
use UserModel;
// 外部APIにリクエスト飛ばしてユーザ情報を取得するメソッドが内包されたクラス
use App\Http\Components\ApiService;

// 外部APIから取得したユーザ情報をDBに登録する処理を書く
public function storeUserAccount()
{
    // テストの際はgetUserData()から外部APIにリクエストを飛ばしたくない
    $ApiService = new ApiService();
    $userData   = $ApiService->getUserData();

    // 指定したurlへpostした際にちゃんとuserModelにレコードができてるかテストしたい
    $attributes = [
        'name'        => $userData['name'],
        'email'       => $userData['email'],
        'picture_url' => $userData['picture'],
    ];
    $userModel = UserModel::create($attributes);

    return view('user.create.complete', [
        'user' => $userModel,
    ]);
}
```

### ルーティング
```php:www.php
Route::post('/user', 'UserController@storeUserAccount')->name('User/Store');
```

### テストコード
指定したURLへリクエストをpostした際にDBへレコードが作成されているかテストする

```php:CreateTest.php
use Mockery;
use Tests\TestCase;

class StoreTest extends TestCase
{
    /**
     * @dataProvider userData
     */
    public function testStoreUser($params)
    {
        // getUserData()が呼ばれた場合に外部APIへリクエストを飛ばさず
        // dataProviderのdummyResponseの値を返す
        $ApiServiceMock = Mockery::mock('overload:\App\Http\Components\ApiService');
        $ApiServiceMock->shouldReceive('getUserData')
                       ->once()
                       ->andReturn($params['dummyResponse']['userData']);

        $url = route('User/Store');
        $response = $this->post($url);

        $this->assertDatabaseHas('users', [
            'name'        => $params['dummyResponse']['userData']['name'],
            'email'       => $params['dummyResponse']['userData']['email'],
            'picture_url' => $params['dummyResponse']['userData']['picture'],
        ]);
    }

    public function userData()
    {
        return [
            'valid data' => [
                [
                    'dummyResponse' => [
                        'userData' => [
                            'name'    => 'nus3',
                            'email'   => 'nus3@test.com',
                            'picture' => 'https://avatars0.githubusercontent.com/u/30946750?s=400&u=79ef67ffa412d27ad46747623a677aa2b83513bd&v=4',
                        ]
                    ]
                ]
            ],
        ];
    }
}
```

## 余談
テストの正しい書き方を求めて日々奮闘中・・。
何かありましたらコメントや編集リクエストいただけるとありがたいです_:(´ཀ`」 ∠):
プロジェクトのSwiftバージョン確認方法 ＆ 自動Xcodeセレクタ

# はじめに

このプロジェクトはswiftのversionなんだっけ・・

ということが多々あると思います。

そんなときの確認方法と対応したXcodeでの起動方法

＋オマケで対応したVerのXcodeで起動してくれるShellScriptを考えてみたいと思います。(まだalpha版です)

# 概要

プロジェクトファイル内に記載があるので以下のコマンドで。

```
$ grep -r SWIFT_VERSION ./*.xcodeproj
```

# サンプル

試しにいつ作ったか忘れたアプリのルートディレクトリでgrepしてみます。


```
$ grep -r SWIFT_VERSION ./ZanPanSoldier.xcodeproj
./ZanPanSoldier.xcodeproj/project.pbxproj:				SWIFT_VERSION = 4.0;
./ZanPanSoldier.xcodeproj/project.pbxproj:				SWIFT_VERSION = 4.0;
./ZanPanSoldier.xcodeproj/project.pbxproj:				SWIFT_VERSION = 4.0;
./ZanPanSoldier.xcodeproj/project.pbxproj:				SWIFT_VERSION = 4.0;
```
意外に新しいですね (＠2018/12/21)

# ちがうやつ
たまに見かける記事で以下のコマンドがあります。

```
$ swift -version
Apple Swift version 4.2.1 (swiftlang-1000.11.42 clang-1000.11.45.1)
Target: x86_64-apple-darwin17.7.0
```
これは現在設定されているコマンドラインツールのverが表示されるだけです。

ちなみにハイフンは１個でも２個でもokです。

実際に実行されるときのPATHは、具体的には以下のような感じです。

```
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -version
```

# 各Xcodeの対応swift version表示

上記を踏まえていろいろなXcodeで実行してみます。

Xcode 10.1 (10B61)

```
$ /Applications/Xcode10.1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -version

Apple Swift version 4.2.1 (swiftlang-1000.11.42 clang-1000.11.45.1)
Target: x86_64-apple-darwin17.7.0
```
Xcode 9.4.1 (9F2000)

```
$ /Applications/Xcode9.4.1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -version

Apple Swift version 4.1.2 (swiftlang-902.0.54 clang-902.0.39.2)
Target: x86_64-apple-darwin17.7.0
```
Xcode 9.3 (9E145)

```
$ /Applications/Xcode9.3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -version

Apple Swift version 4.1 (swiftlang-902.0.48 clang-902.0.37.1)
Target: x86_64-apple-darwin17.7.0
```
Xcode 9.2 (9C40b)

```
$ /Applications/Xcode9.2.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -version

Apple Swift version 4.0.3 (swiftlang-900.0.74.1 clang-900.0.39.2)
Target: x86_64-apple-macosx10.9
```
Xcode 8.2.1 (8C1002)

```
$ /Applications/Xcode9.2.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -version

Apple Swift version 3.0.2 (swiftlang-800.0.63 clang-800.0.42.1)
Target: x86_64-apple-macosx10.9
```

# おまけ

というわけで、Ver情報を取得して以下でXcodeに投げるShellScriptを考えてみます。

基本的にはXcodeのファイル名はバージョンに合わせて
以下でXcodeを起動しています。

```
open -a /Applications/Xcode10.1.app *.xcworkspace
```

CocoaPodsを導入している場合はxcworkspaceを、導入していない場合やCarthageのときはxcodeprojを起動したいかなと。
それがselect_project_file()の箇所です。

AutoXcodeSelector
https://github.com/kanari3/AutoXcodeSelector

## 使い方

- auto_xcode_selector.shをどこかに置く
    - ex：ホーム (~/)
- プロジェクトのルートディレクトリで実行

```
~/work/ZanPanSoldier (develop *+)
$ ~/auto_xcode_selector.sh

Auto Xcode Selector🍣

Swift Version 4.0
```
これで対応してそうなXcodeでプロジェクトが起動します。

bash.rc等にエイリアスをはれば楽に呼べます。


### TODO

- 自分のインストールしているXcodeに合わせて書き換えられる人向けなので万人向けにしたい
- ver表記を比較できないので扱いを考える(0.1はok、0.0.1は)
- XcodeとSwiftの上下揃った対応表を探す
- エラー処理

こんなのがあったら便利かな？と思い、発想を軽く形にしてみました。

もし良ければforkしてみてください🍣


# おわりに

ディップAdventCalendar2018からたどってくださった方どうも有難うございます。

随時エンジニア募集中です！iOSDCにも参加しています！
いろんな情報を収集するサイトをRailsで作成した。

#初めに

本日はクリスマスですね。

アドベントカレンダーの最終日なので最近作っていたサイトを公開してみました。
![latest.png](https://qiita-image-store.s3.amazonaws.com/0/207921/9973c12b-d529-07d2-7aa9-21e1c26842da.png)

http://demo-sibakeny.info/home/top

なぜか今javascriptがうまく機能しないところがあります。

#サイトの内容

まずどういったサイトかというと様々なサイトをスクレイピングして情報を収集して情報が更新されていたらその記事のタイトルとurlを取得するといった感じです。

#このサイトを作ろう思った経緯

このサイトを作ろうと思った経緯ですが正直今いろんな情報があふれていてそれを集めるには自分でググっていかなきゃいけないと思います。
その手間を省くために例えばニュースであればいろんなニュースサイトの最新記事の情報を集めてそのサイトへのリンクを張ることでグーグルで調べる手間が省けるだろうし世の中で起きていることがわかりやすくなると思ったからです。


#こんな感じのサイト

サイト名はLaNLibです。

![latest2.png](https://qiita-image-store.s3.amazonaws.com/0/207921/37f6faf2-e98d-43e0-fd48-63b7f7cac769.png)



基本的に10分ごとにいろんなサイトを巡回して更新されていたら情報を取得しています。

また日本語だけでなく英語の記事も集めていて最終的には世界的な動向を確認できるようにもなればなと思っています。

#サイトを作るうえで工夫したこと


サイトを作るうえで工夫したことはwheneverの設定です。

とりあえずコードをどうぞ…


```ruby:schedule.rb
set :environment, "development"
set :output, { :error => "log/cron_error.log" }
set :path, "/mnt/c/users/owner/desktop/appname"


Dir.chdir('/mnt/c/users/owner/desktop/appname/lib/tasks')
Directories = Dir.glob("*")
methods = []
Directories.each do |drc|
    File.open("#{drc}") {|f|
    data = f.read
    @classname = data.to_s.match(/Tasks::(.+?)\r/)[1]
    datas = data.scan(/def self\.(.+?)\r/)
    datas.flatten!
    datas = datas.map {|d| [@classname.chomp,d.chomp]}
    methods << datas 
}
end 

methods.flatten!(1)

every 10.minutes do 
    methods.each do |method|
        eval "runner 'Tasks::#{method[0]}.#{method[1]}'"
    end
end 
```


これ何をしているのかというとlib/tasksの中にスクレイピングをするメソッドを定義していてるのですがそれをwhenever --update-crontabをするときにファイルの中身を読み込んでクラス名とメソッドを取得して自動的に反映されるようにしています。


なぜこんなことをしたかというと既に50個近くのスクレイピングのタスクがありそれをひとつずつ

```ruby
runner Tasks::CrawlData.method
```

みたいにするのは気が遠くなるからです。

これによって自動的に反映されるため楽ですしスペルミスもないです。

#evalは便利

今回アプリを作っていく中でevalがとても便利であることがわかりました。

メタプログラミングに関してはまだよくわかっていないですがこれからもっと勉強して書けるコードの幅を増やしていきたいなと思います。

#おわりに

今日はクリスマスですね。

世の中は友達をワイワイしている中で自分は家でひとりプログラミングで遊んでいました。

ですが不思議と悪くないというかプログラミングで楽しく過ごせたクリスマスでした。

おわり:snowman2:
WebブラウザだけでScalaを試してみる

Scalaの公式サイトである、scala-lang.org では、WebブラウザだけでScalaを試せるページが用意されている。
それが、Scastieです。

Scastie
https://scastie.scala-lang.org/

アクセスするとこんな感じの画面が出てきます。

![C9FC5CA3-A43A-44E8-98AB-D013181F642F.jpeg](https://qiita-image-store.s3.amazonaws.com/0/21380/acad7e52-6c65-902f-9038-fa32c94bbc2a.jpeg)

後は、コードを書いていき、上の「Run」を押すと実行できます。

デフォルトでは、Worksheetモードになっているので、結果はコードの右側に出てきます。
通常モードにしたい場合は上の「Worksheet」をクリックします。

皆さんも通勤時間や休憩中などにスマホやタブレットでバンバンScalaのコーディングしましょう!
基本的なこと１

関数とは・・・実行したい命令を入れておく箱
メソッドとは・・・オブジェクトにとっての関数。つまりオブジェクトに事項してほしい命令を入れておく箱
オブジェクト・・・そのままの意味で、オブジェクトとは和訳すると、ものという意味。例えば犬や猫みたいなもの。
良く忘れるWindows バッチファイルの記載方法まとめ

# 【経緯】
個人的にたまに*.batのバッチファイルを作成しますが、よく記載方法を忘れているので。。。
良く忘れるところや何度も検索しているところをメモ程度に記載しておきます。
※随時更新する予定です。

# 【内容】
__■変数の使い方__

~~~:
rem 宣言
set name="Name" 

rem 変数の使用
echo %name%
~~~

__■IF文__

~~~:
if 条件 (
  処理
) else (
  処理
)
~~~

~~~:
rem 存在確認
if not exist ファイル (
  処理
) else (
  処理
)
~~~

__■CドライブからDドライブへの移動__

~~~:
pushd D:\ 
~~~


__■日付の扱い方__

~~~:
set YYYY=%date:~0,4%
set MM=%date:~5,2%
set DD=%date:~8,2%

set hh=%time2:~0,2%
set mn=%time2:~3,2%
set ss=%time2:~6,2%
~~~

__■バックグラウンドでツールやバッチを動かす__

~~~:
start "タイトル" "ツール、バッチ名"
~~~

__■エコー画面のON/OFF__

~~~:
@echo on

@echo off
~~~

__■上書き確認をせずに強制的にファイルを上書きする__

~~~:
copy /y "コピー元ファイル名" "コピー後ファイル名"
~~~

__■ディレクトリとファイル一覧を出力する__

~~~:
dir /s /b > 出力ファイル名
~~~
# 【所感】
こういうので意外に簡単に効率化出来たり、作業を無くせたりするので覚えておきたいです。。
Oracleブロンズを目指して　概要編②

#SQL コマンドの分類
SQLはリレーショナルデータベースを操作するための言語です。
データの取得や削除、表の作成など行うことができます。
コマンドで行うことによって以下の４タイプに分類されます。

![図２_SQLの概要.png](https://qiita-image-store.s3.amazonaws.com/0/327332/5a1221a2-682b-73ca-63f3-5791731cd529.png)
AWS EC2 インスタンスをプログラム実行中のみ起動

[こちらのアドベントカレンダー](https://qiita.com/advent-calendar/2018/klab)の最終日の記事となります.
最後の記事がこのような記事で申し訳ないですがやっていきます.
chkconfig で処理の実行 -> シャットダウン をしようという記事です.
# そもそもなぜそんなことをするの?
機械学習で AWS を使用しようとしましたが付けっ放しにするにはあまりにも高かったためです.

> 推奨インスタンスタイプ: p2.xlarge
> 時間単価: 0.900 USD/h

`0.900 USD/h = 72,000 JPY/month`
下手すると2ヶ月でGPU積んだパソコンが買えてしまい, 半日消し忘れでも 1,200 JPY.
物忘れが激しいので, 消し忘れを防止するために今回は処理 -> シャットダウンを仕組みに組み込みます.

# 実装
`chkconfig` というランレベルに応じて設定されたプログラムを実行するサービスを使用します.
まずは設定するスクリプトを作成します.

```sh:/path/to/project/run-script
#!/bin/bash
# chkconfig 4 99 10
# description: 処理したらオサラバ
# processname: run-script
cd /path/to/project
sudo -u ec2-user git pull
./script.sh
if [[ ! -f ./blocking_file ]]; then
    shutdown 0
fi
```

2 行目の `# chkconfig 4 99 10` は chkconfig のファイルとして扱うための文言です.

 - `4` がこのスクリプトを実行するランレベル
 - `99` が起動時の優先度(小さいほど優先される)
 - `10` が終了時の優先度(今回関係なし)

です.

`sudo -u ec2-user` は ssh の設定を ec2-user のものを使用するためです.
git に使わせる鍵を ec2-user のものにしています.

`if` は設定ミスの時にシャットダウンを防止して, サーバへアクセスする手段を残すものです.
今回はリポジトリに `blocking_file` というファイルが存在した場合, シャットダウンされないようにしております.
僕は何度か失敗したのでインスタンスをいくつも潰す羽目になりました.
(後で書きます).

これに symlink を張って chkconfig に追加すれば chkconfig 側の設定は終了です.

```shell_session
$ ln -s /path/to/project/run-script /etc/init.d/
$ chkconfig --list | grep run-script
$ chkconfig --add /etc/init.d/run-script
$ chkconfig --list | grep run-script
> run-script           	0:off	1:off	2:off	3:off	4:on	5:off	6:off
```

最後に ssh の設定, git clone などを済ませて終了です.

blocking_file を追加したり, 削除したりして動作が実行されていることをご確認ください.

## 結局何を間違えたの?
主にこの2つのミスを同時にやらかし失敗しました.
 - if 文つけ忘れ
 - git pull の失敗

if 文のつけ忘れに関しては最初の段階で気をつけねば〜と思っていたのですが,
つけて再起動すればサーバのコードも更新されて済むだろと軽い気持ちで考えておりました.
しかし git pull が失敗しておりサーバのコードに更新がかからずアクセス不能になりました.

chkconfig は root ユーザで実行されます.
なので git で ec2-user の鍵を使いたい場合はユーザを変更するか, 鍵を頑張って指定するかになります.
僕は両者どちらも忘れていたため, git pull が不発に終わり作ったサーバにサヨナラバイバイする羽目になりました.
run-script が `sudo -u ec2-user git pull` になっているのはそのためです.
root で鍵作っても動くかと思います.

#参考
[chkconfig で起動順序と終了順序を指定する](https://hacknote.jp/archives/8041/)
[EC2起動時にスクリプトを実行する](http://anton0825.hatenablog.com/entry/20130515/1372116359)

# 最後に
初めて記事を書き間違いも多いかと思いますので, これ危ないよ, ここ間違ってるぞという場合は何卒ご指摘お願いいたします.
Converterを改良する

#Converterの不満点
* 変換する値をいちいちボックス化解除しなければならない。
* XAMLでResourcesに登録しないと使えない。

#改善点
* ジェネリッククラスにして、変換前と変換後の型を指定できるようにする。
* MarkupExtensionを継承して、Resourcesへの登録を不要にする。

```c#:コンバータ
using System;
using System.Globalization;
using System.Windows.Data;
using System.Windows.Markup;

namespace Sample {
    public abstract class BaseConverter<TSource, TTarget> : MarkupExtension, IValueConverter {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            => Convert((TSource)value, parameter, culture);

        public abstract TTarget Convert(TSource value, object parameter, CultureInfo culture);

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            => ConvertBack((TTarget)value, parameter, culture);

        public abstract TSource ConvertBack(TTarget value, object parameter, CultureInfo culture);

        public override object ProvideValue(IServiceProvider serviceProvider) => this;
    }
}
```

#使い方

```c#:サンプル
using System;
using System.Globalization;
using System.Windows;

namespace Sample {
    public class CustomConverter : BaseConverter<int, int> {
        public override int Convert(int value, object parameter, CultureInfo culture)
            => value + 1;

        public override int ConvertBack(int value, object parameter, CultureInfo culture)
            => value - 1;
    }
}
```

```xml:XAML
<Window x:Class="Sample.MainView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:Sample"
        Title="MainView" Height="300" Width="300">
    <Grid>
        <TextBlock Text="{Binding Value, Converter={local:CustomConverter}}"/>
    </Grid>
</Window>
```
列挙型をComboBoxにバインドする

#やりたいこと
ViewModelのプロパティを使わずに、列挙型をComboBoxのItemsSourceにバインドする。ただし、表示名はメンバー名ではなく別途指定できるようにする。

#実装
列挙型を直接バインドできないため、ソースを提供するクラスを作成する。

```c#:ソースを提供するクラス
using System;
using System.Collections;
using System.ComponentModel;
using System.Linq;
using System.Windows.Markup;

namespace Sample {
    public class EnumSourceProvider<T> : MarkupExtension {
        private static string DisplayName(T value) {
            var fileInfo = value.GetType().GetField(value.ToString());
            var descriptionAttribute = (DescriptionAttribute)fileInfo
                .GetCustomAttributes(typeof(DescriptionAttribute), false)
                .FirstOrDefault();
            return descriptionAttribute.Description;
        }

        public IEnumerable Source { get; } 
            = typeof(T).GetEnumValues()
                .Cast<T>()
                .Select(value => new { Code = value, Name = DisplayName(value) });

        public override object ProvideValue(IServiceProvider serviceProvider) => this;
    }
}
```

#使い方

```c#:列挙型
namespace Sample {
    //表示させたい文字列をDescription属性に指定する
    public enum EnumSample {
        [Description("項目1")]
        A,
        [Description("項目2")]
        B,
        [Description("項目3")]
        C,
        [Description("項目4")]
        D
    }

    public class EnumSampleSourceProvider : EnumSourceProvider<EnumSample> { }
}
```

```xml:XAML
<Window x:Class="Sample.MainView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:Sample"
        Title="MainView" Height="300" Width="300">
    <Grid>
        <ComboBox ItemsSource="{Binding Source, Source={local:EnumSampleSourceProvider}}"
                  DisplayMemberPath="Name" 
                  SelectedValuePath="Code" />
    </Grid>
</Window>
```
Nuxt.jsでユーザーエージェントを判別するプラグインの紹介

Nuxt.jsを使っていて、ユーザーエージェントによって処理を切り替えたい。
みたいな場合に便利なプラグインの紹介記事です。

この手のプラグインは [nuxt-community/awesome-nuxt](https://github.com/nuxt-community/awesome-nuxt) で探すのが基本だと思いますが、残念ながらここに書かれてないのでググって探しました。

よさそうなのが2つあったのでそれらについて記載します。

## nuxt-device-detect
[dotneet/nuxt-device-detect: This is a nuxt.js module for detecting device type.](https://github.com/dotneet/nuxt-device-detect)

動作を確認できるデモページを用意しました。
https://nuxt-playground.netlify.com/plugins-sample/nuxt-device-detect/

<img src="https://qiita-image-store.s3.amazonaws.com/0/35595/79cf3209-0948-4529-f93a-63c160be287f.png" width="300px">

シンプルにモバイルかPCかを判定したいときに使うと良さそうです。
判定処理も70行未満とシンプルなので、独自で簡易判定を書くときにも参考になりそう :bulb: 


## nuxt-user-agent
[fukuiretu/nuxt-user-agent: Nuxt.js module for handling User-Agent.](https://github.com/fukuiretu/nuxt-user-agent/)

動作を確認できるデモページを用意しました。
https://nuxt-playground.netlify.com/plugins-sample/nuxt-user-agent

<img src="https://qiita-image-store.s3.amazonaws.com/0/35595/082d71f2-ef76-7d91-10cf-44257c4ea225.png" width="300px">

こちらのほうが判定できる種類が多いです。
というのも判定処理には [woothee/woothee-js](https://github.com/woothee/woothee-js) を使っているおかげですね。
nuxt-user-agent 自体は、 woothee を Nuxt 用にラッパーしたライブラリって感じです。


## 所感
あとから細かいハンドリングが必要になるケースが多そうな気がするため、`nuxt-user-agent` を使っといたほうが無難かな、という気がします。
Dockerで古いOSをインストールして脆弱性を再現する

年末のPHP Conferenceで徳丸浩さんがデモしていたXXEの脆弱性を再現したくてDockerを探していたら、ぎりぎりDebian6が残っていたので試してみた。

https://blog.tokumaru.org/2017/12/introduction-to-xxe-for-php-programmers.html

# Debian

2018年５月にDebian6はLTSも終わっているが、Dockerhubでは7.11が今も残っている。

https://hub.docker.com/_/debian/
https://wiki.debian.org/DebianReleases

バージョン確認コマンドのレスポンスは下記の通り。

```
root@f0753e2e4a49:/# cat /etc/debian_version 
7.11

root@f0753e2e4a49:/# php --version
PHP 5.4.45-0+deb7u14 (cli) (built: May  9 2018 16:47:00) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies

root@f0753e2e4a49:/# openssl version  
OpenSSL 1.0.1t  3 May 2016

root@f0753e2e4a49:/# apt-cache show libxml2
Package: libxml2
Version: 2.8.0+dfsg1-7+wheezy12
```

こんな感じのファイルを置いて、

```php:xxe.php
<?php
$doc = new DOMDocument();
$doc->substituteEntities = true;
$doc->load($_FILES['user']['tmp_name']);
$name = $doc->getElementsByTagName('name')->item(0)->textContent;
$addr = $doc->getElementsByTagName('address')->item(0)->textContent;
?>
<body>
<form action="xxe.php" method="post" enctype="multipart/form-data">
  <input type="file" name="user" />
  <input type="submit"/>
</form>
posted<br>
name: <?php echo htmlspecialchars($name); ?><br>
addr: <?php echo htmlspecialchars($addr); ?><br>
</body>
```

PHPビルトインサーバを起動して

```
$ php -S 0.0.0.0:8000
```

こんな感じで外部エンティティを呼び出すXMLファイルをアップロードすれば、手軽にXXE脆弱性を確認できる。

```xml
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE foo [
<!ENTITY pass SYSTEM "/etc/passwd">
]>
<user>
  <address>&pass;</address>
</user>
```

libxml2が2.8なのでXXE脆弱性があるはずだが、パッチが当たってるようで、PHPで`$doc->substituteEntities = true;`を追加しなければ再現しなかった。この時点で脆弱性でも何でもないが、XXEはともかく、話題のSSRFの概念実証に使えそうかな。

#CentOS

続けてCentOSは6.6が入れられる。

https://hub.docker.com/_/centos/

こちらのバージョンは下記の通り。

```
[root@565cfd10bf9f /]# php --version
PHP 5.3.3 (cli) (built: Mar 22 2017 12:27:09) 
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

[root@565cfd10bf9f /]# openssl version
OpenSSL 1.0.1e-fips 11 Feb 2013

[root@565cfd10bf9f /]# yum list | grep libxml2
libxml2.x86_64                             2.7.6-14.el6_5.2              @CentOS/$releasever
```

PHPが5.4以前なのでビルトインサーバを立ち上げられず、動作確認のためにサーバを立てないといけないのが面倒そうだ。
[後ほど追記] Dockerで簡易版Aidemyをつくってみよう (その5) ~PythonによるRUNサーバ構築~

※ この記事は書き途中です。今年中に書きあげます！

# 概要
Aidemy アドベントカレンダー25日目担当の @km42428 です。
ついにアドベントカレンダー最終日ですね！メリークリスマス！
また今まで複数回に渡って進めてきた簡易版Aidemyですが、今回で最後となります。
この5回分を通して行なっていただければ、Dockerによる簡易版アイデミーを順を追って作成することができます！

以下に過去4回分のリンクを掲載します。
Dockerで簡易版Aidemyをつくってみよう (その1) ~全体構成とDockerのセットアップ~
https://qiita.com/km42428/items/4e4653aa0e813282986b

Dockerで簡易版Aidemyをつくってみよう (その2) ~React.jsによるフロントエンド~
https://qiita.com/km42428/items/989dac5e7450501c452d

Dockerで簡易版Aidemyをつくってみよう (その3) ~Expressによるバックエンド~
https://qiita.com/km42428/items/f5f7e8f15546b0673d95

Dockerで簡易版Aidemyをつくってみよう (その4) ~mongodbによるデータベース~
https://qiita.com/km42428/items/83d7ab3eb80f3f871ebb

# 今回の目標
今回は、提出したPythonコードを実際に実行させて、その結果を返すRUNサーバを作成します。
そして、RUNサーバを含めたフロントエンド・バックエンド・データベースをすべて `docker-compose` コマンドを用いて一斉起動させます。

# RUN API の構成

RUN API は以下のような構成を考えます。

| メソッド | パス | 内容 |
|:-----------:|:------------|:------------|
| GET | / | 生存確認 ({}を返すのみ) |
| POST | /run | リクエストされたエクササイズを実行する |

また、POSTするbodyは以下にします。

```
{
  "exerciseId": String,
  "script": String
}
```

※ 続きは後ほど記載します。興味がある方はstockお願いします！
MVVMでウィンドウのクローズをキャンセルする

#やりたいこと
WindowのClosingイベント発生時にModelViewのメソッドを実行したい。ただし、クローズをキャンセルできるようにする。

#実装

呼び出したいメソッドをインターフェイスに定義しておき、イベント発生時にView側から実行する。インターフェイスを使うことでViewがViewModelのクラスを知らずに済む。

```c#:インターフェイス
namespace Sample {
    public interface IClosing {
        bool OnClosing();
    }
}
```

```c#:ビヘイビア
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Windows;
using System.Windows.Interactivity;

namespace Sample {
    public class WindowClosingBehavior : Behavior<Window> {
        protected override void OnAttached() {
            base.OnAttached();

            AssociatedObject.Closing += Window_Closing;
        }

        protected override void OnDetaching() {
            base.OnDetaching();

            AssociatedObject.Closing -= Window_Closing;
        }

        private void Window_Closing(object sender, CancelEventArgs e) {
            var window = sender as Window;

            //ViewModelがインターフェイスを実装していたらメソッドを実行する
            if (window.DataContext is IClosing)
                e.Cancel = (window.DataContext as IClosing).OnClosing();
        }
    }
}
```

```xml:XAML
<Window x:Class="Sample.MainView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
        xmlns:local="clr-namespace:Sample"
        Title="MainView" Height="300" Width="300">
    <i:Interaction.Behaviors>
        <local:WindowClosingBehavior />
    </i:Interaction.Behaviors>
    <Grid>
        <TextBox />
    </Grid>
</Window>
```
第１回 GoogleCloudPlatformでWebアプリ事始め[MacのターミナルでSSH接続(root権限)]

あまり丁寧な記事ではないのでご注意ください。
　macOS 10.14で行います。それ以外の方はごめんなさい。

[GCPにインストールするOS] CentOS7

1. GoogleアカウントでGCPのコンソール画面？を開きます。
![0001.png](https://qiita-image-store.s3.amazonaws.com/0/216857/c668a797-99f8-fce3-773e-f10abb0b891f.png)

2. VMインスタンス → インスタンス作成
・スペックを選び、今回はCentOS7を選択。
・コンテナは使わない方向　　たぶん重いかも
・HTTP トラフィックを許可する とりあえずチェック
・HTTPS トラフィックを許可する　とりあえずチェック
→ 一番下の作成

3. Macのターミナルで開発していきたいので、SSH認証鍵を作成する
※特に必要ない肩はコンソール画面？からSSHをウィンドウで開いて準備完了

　Macのターミナルを開いてコマンドを入力する。
(SSHとかわからない方は入門してみてください。私も慣れてきました。)

 $ sudo su -
　起動時に入力するパスワードを求められます。 #rootとなればOK。

 root# mkdir .ssh
 root# cd .ssh/
 root# ssh-keygen

下記みたいなのが出てきました。
自分の場合は特にディレクトリを指定しなかったためそのままEnter。
「Generating public/private rsa key pair.
Enter file in which to save the key (/var/root/.ssh/id_rsa):」

パスプレーズを設定してEnter、
Enter passphrase (empty for no passphrase):

設定したパスフレーズを再度入力してEnter
Enter same passphrase again:

+---[RSA 2048]----+
|%Xo . E          |
|%Oo= . .         |
|B*+ o .          |
+----[SHA256]-----+
みたいなのが表示されれば鍵は作成されたはず。多分。

下記コマンドで表示できました。
 root# cat ~/.ssh/id_rsa.pub

ssh-rsa #$%&@×△#$%&@×△#$%&@×△#$%&@×△..... root@コンピュータ名.local
と長ったらしいやつがでてきました。

VMインスタンスの詳細 → 編集
下の方にある「SSH認証鍵」という項目に(↑の、長ったらしいやつ)コピペ
→ 一番下の保存

![0002.png](https://qiita-image-store.s3.amazonaws.com/0/216857/a818910e-c1b0-1497-1baf-256fd4366ce6.png)
なんか間違ってると「ssh-rsa #$%&@×△#$%&@×△#$%&@×△#$%&@×△..... root@コンピュータ名.local」みたいな形式にしてくださいと赤字で怒られる。

４. GCPで外部からの接続を許可する
GCPのコンソール画面？からSSHをウィンドウで開いて、下記コマンドを入力
 $ sudo vim /etc/ssh/sshd_config

38行目ぐらいにある
「PermitRootLogin no」をyesに書き換えて上書き保存。:wq

再起動
 $ sudo service sshd restart
GCPでの設定はこれで終わり

５. MacのターミナルからGCPにSSH接続<BR>
ターミナルで下記を入力。(外部アドレスはGCPのコンソールで表示されてあるエフェメラルとかいうやつ)<BR>
 root# ssh -i /path/to/長ったらしい鍵 -o UserKnownHostsFile=/dev/null -o CheckHostIP=no -o StrictHostKeyChecking=no root@外部IPアドレス

passphraseを問われますので、入力してenter。
→ enjoy!
私はこの手順で成功しました。ご指摘等あるかと
思いますので、お手数ですがお願いします。
root権限さえあればもはやLet'sPartyNight.
かと思いきやポート解放については別途設定が必要らしい。

続きは後日。
SECCON 2018 オンライン予選 Writeup[Boguscrypt]

このブログは、[大国魂（ITブログ） Advent Calendar 2018](https://adventar.org/calendars/3489) の25日目です。

# この記事の内容について
インフラ運用者ではあるもののセキュリティに興味があるので SECCON 2018 オンライン予選 に参加した筆者が、良質な Writeup がたくさんあるにもかかわらず自身の振り返りも兼ねて解けた問題の Writeup を書いた、というものになります。

予選終了後、便利に参照させていただいていた記事は[こちら](https://qiita.com/nicklegr/items/51cbc4ff59d245646988)になります。

今回は CTF 参加している感が高かった Crypt の Boguscrypt について振り返ります。

# Boguscrypt

## 問題文

Hey, Can you decrypt the file?

このファイルを decrypt できるかな？という問題です。

## ファイルの中身
### challenge.pcap
- その拡張子が示すとおりの pcap ファイル。Wireshark などで開いてみましょう。

### dec
- file コマンドで確認すると実行ファイルということがわかります。

```
[root]# file dec 
dec: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, not stripped
```
- 実行権限を付与して実行すると `key` という値の入力を求められるので適当な値を入れると、 gethostbyaddr~ というメッセージが表示されます。

```
[root]# ./dec 
Key?:aa
gethostbyaddr: No address associated with name
```

### flag.txt.encrypted
- file コマンドで確認すると data ファイルということがわかります。

```
[root]# file flag.txt.encrypted 
flag.txt.encrypted: data
```
- 中身をそのまま見ようとすると以下のようになり、このファイルを decrypt すれば flag.txt を得られそうです。
  - 名前的に、decrypt してくれるのはおそらく dec でしょう。

```
[root]# cat flag.txt.encrypted 
PPw-;=K<CLUUYBR
  SRG
     _
     EEg
```

# 解法
## 解き方
- dec を用いて flag.txt.encrypted を取り出す問題と推測できます。
- 前述のとおり dec を実行するとアドレスと関連づいた名前がないというようなメッセージが表示されます。
- 何らかの名前とアドレスを紐づけるものが必要で、それは残された pcap ファイルの中にありそうです。
- pcap ファイルの中にある DNS 通信より 127.0.0.2 に対して `cur10us4ndl0ngh0stn4m3` という名前が返されていることがわかります。
- これを hosts ファイルに記載したうえで dec を実行することで flag.txt を得られ、その中にフラグ `SECCON{This flag is encoded by bogus routine}` が記載されています。

## たどり着くまでの経緯
- `Dropbox LAN sync Discovery Protocol` という通信が気になって Dropbox の脆弱性で大きなものがなかったかなど調べる。
- その他の通信についてはざっと見る程度で DNS のレコードにたどり着いたところでおっとなる。
  - `Standard query response 0xaf5e PTR 2.0.0.127.in-addr.arpa PTR cur10us4ndl0ngh0stn4m3 NS localhost A 127.0.0.1 AAAA ::1`
- /etc/hosts に `127.0.0.2   cur10us4ndl0ngh0stn4m3` レコードを追記して dec を実行したところフラグがでてきました。

```
[root]# ./dec 
Key?:test
( gethostbyaddr~ が表示されていない)
[root]# ls
Boguscrypt.zip  challenge.pcap  dec  flag.txt  flag.txt.encrypted
[root]# cat flag.txt
SECCON{This flag is encoded by bogus routine}
```

# 問題について

pcap を扱う問題の基本の「き」のような問題でした。
この問題についてはフラグとは別方向に進んでしまうことなくすんなりと解けました。
通信量がそれほど多くなかったので Wireshark の解析機能を使いませんでしたが、より大きなファイルの場合は解析機能も使って効率よくヒントを探せるようにしておくとよさそうです。
ネットワークとOSの両方のレイヤの基本を抑えていれば解ける良問ではないかなと思います。

そういえば入力する key に何の意味があったのかまったく気にしていませんでした。。。

# 最後に
今回はアドベントカレンダーを書くという話と Writeup を書いてみたかったという欲望によりここ4日の投稿となりましたが、来年は予選直後ぐらいの投稿を目指して頑張ってみようと思います。

それではよいお年を！
コミュニティに参加しよう！

# まえがき

この記事は[Rails Girls Japan Advent Calendar 2018](https://qiita.com/advent-calendar/2018/railsgirlsjapan)のために書かれた記事です。よって、想定される読者の中にはコミュニティに参加したことがないような方がいます。この記事はそういった人のコミュニティへの参加を促すために書かれました。

# 注意

以下の文では「コミュニティ＝Rubyコミュニティ」を想定していますが、他の言語でも事情は同じはずです。

# コミュニティに参加する3つの意味

私が考えるコミュニティに参加する意味は以下の3つです。
いずれも実体験です。

* ブログ記事や実装にならない生の情報に触れられる
* いろんなバックグラウンドの人に話を聞いてもらえる
* 「すごい人」と同じ空気を吸える

## ブログ記事や実装にならない生の情報に触れられる

これは、「情報はブログやGitHubで手に入れられる」という主張への簡単な反論となっています。
単純な話で、ある人が100の思考をしているとき、ブログ記事としてアウトプットされるのは10とか20とかで、残りは「ウェブ上のテキストとしては」アウトプットされません。
しかし、ふとした会話の中にはそういったアウトプットされなかっただろう情報が豊富に含まれていて、そこから何らかのヒントが得られることもあります。
コミュニティによってはライブラリ作者や言語のコミッターもいたりして、私たちが触れていたあの情報はこうやって生まれていたのかあ、と思うこともしばしばです。

## いろんなバックグラウンドの人に話を聞いてもらえる

これは、「職場に強い人がすでにたくさんいるのでコミュニティに参加しなくてもよい」という主張への簡単な反論で、端的にいうと同じ職場である時点でどんなに強かろうとバイアスがかかっている、ゆえに相談相手としては必ずしも適切ではない、ということです。
コミュニティに出かけると、同じ会社から来ている人はせいぜい数人、全体の参加者が20人ほどいるとしたら10社以上から人が来ていることになります。これぐらいの多様性があると、ある技術的な課題を提示したときの反応は驚くほど異なります。
もちろん、自社と似た会社から来ている人の話を重点的に聞くもよし、あえて真逆の環境にいる人から話しを聞くもよしです。重要なことは、コミュニティは多様性に富んでおり、それは強みであるということです。

## 「すごい人」と同じ空気を吸える

これは一番曖昧なのですが、要するに人間関係から受ける影響度はその頻度に比例する、という話です。
ミメーシスという単語があります。これは「感染的模倣」と訳されたりするそうで、私の理解では「すごい人に憧れて真似をする」というぐらいの意味です（哲学はちゃんと学んでいないので、間違っていたら教えてください）。
コミュニティにはすごい人がたくさんいます。彼らは単にすごいというより、人間的に影響力があるような人であることが多いです。そんな人達と同じ場にいることで、無意識的に「感染」して自分もそうなりたいと思うようなことが起こります。
これは一応会社の中でも再現できますが、OSSの世界では1社にすごい人が集中して存在しているケースは稀で、コミュニティの場のほうが強度が高い場合が多いでしょう。
そんなコミュニティの場に「参加し続ける」ことで、最初は場違いに感じられても徐々に場に馴染んでいくでしょう。それはコミュニティの側が変わったのではなくて自分自身が変わったのであり、その原動力はコミュニティからの感染なのです。

# まとめ―コミュニティは人

東京には10近いRubyコミュニティが存在します（詳細は[拙記事](https://qiita.com/okuramasafumi/items/7b0ef10c848f0c68c16e)を参照）。
どれも個性豊かですが、それを運営している人々はもちろん、参加者なしでは存在できないのは言うまでもありません。
ぜひあちこちのコミュニティに参加してみてください。そして気に入ったコミュニティには通ってみてください。コミュニティから様々な恩恵を享受するうち、あなたもコミュニティを支える側になっていることでしょう。

# おまけ

https://speakerdeck.com/coe401_/qu-kechu-sienziniaga-komiyuniteinican-jia-suru-toiukoto
@coe401_ さんがとても良いスライドを作ってくれています。コミュニティに参加することで得られたものを説得力ある形で展開しているのでよかったらチェックしてみてください！