OmniAICreator/Qiita-1.07M huggingface dataset:
Swift基礎構文のメモ（初心者向け）

#【経緯】
社内もくもく会にてSwiftが始まったので復習がてら。

#【Swiftとは？】
Objective-Cの後を継ぐAppleのiOSで利用できるプログラミング言語。
世間の評判を見ると批判が多いObjective-Cくんですが、個人的にC言語ベースだしObjective-C++があるので言うほど嫌いじゃないです。
（メモリ管理出来る言語が好きなだけ感はある）
初めての言語としてC++とObjective-Cを並行して学んだせいで学生時代はトラウマでしたが！
Swiftは今流行りの言語よりなので、型推論があったり表記がObjective-Cより取っつきやすいイメージです。

#【基礎構文】
___■定数宣言___

~~~Swift:
let name : String = "Qiita"
let age : Int = 10
~~~

___■変数宣言___

~~~Swift:
var name : String = "Qiita"
var age : Int = 10
~~~

___■演算___

~~~Swift:
var x = 10
x = x + 10
/* もしくは */
x += 10

var x = 10
x = x - 10
/* もしくは */
x -= 10

var x = 10
x = x * 10
/* もしくは */
x *= 10

var x = 10
x = x / 10
/* もしくは */
x /= 10

var x = 10
x = x % 10
/* もしくは */
x %= 10
~~~

___■文字列の連結___

~~~Swift:
let swift : String = "Swift"
let level : String = "入門"
print(swift + level)
~~~

~~~:出力
Swift入門
~~~

___■変数展開___

~~~Swift:
let swift : String = "Swift"
print("こんにちは、\(swift)さん")
~~~

~~~:出力
こんにちは、Swiftさん
~~~

___■キャスト___

パターンとして「① コンバージョンする、② descriptionをつかう、③ asを使う」の三つあるらしい。

___① コンバージョンする___
String(),Int(),Double()みたいな記載で変換する。
ただしString()はDouble型などの浮動小数点値と文字列の相互変換が無いため期待通りにはならない。

~~~Swift:
let age : Int = 15
print(String(age) + "歳です")
~~~

~~~:出力
15歳です
~~~

___② descriptionを使う___
数値→String変換に使うらしい。
でも[Appleでは推奨してない](https://developer.apple.com/documentation/swift/customstringconvertible/1539130-description)っぽい……？
直接参照するのではなく、String(describing:)を使えとのこと。

~~~Swift:
let age : Double = -15.23
print(age.description)
print(String(describing: age))
~~~

~~~:出力
-15.23
-15.23
~~~

___③ asを使う___
インスタンスをキャストする場合に使うもの。
as / as ! / as?で使用用途が変わってくる。

|記載方法|内容|
|---------------------|---------------------|
|as|アップキャストなどキャストが成功すると保証される場合|
|as!|強制ダウンキャスト|
|as?|ダウンキャストが成功するか分からない場合（失敗するとnil）|

~~~Swift:
class Animal {}
class Cat : Animal {}
 
let cat : Animal = Cat()
let type1 = cat as Animal  // OK
let type2 = cat as? Cat    // OK (Optional(Cat))
let type3 = cat as! Cat    // OK

print(type1)
print(type2)
print(type3)
~~~

~~~:出力
Main.Cat
Optional(Main.Cat)
Main.Cat
~~~

___■条件分岐___

~~~Swift:
let showLogPrint : Int = 2
if showLogPrint == 0 {
	print("showLogPrint:0")
} else if showLogPrint == 1 {
	print("showLogPrint:1")
} else {
	print("showLogPrint:2")
}

~~~

~~~:出力
showLogPrint:2
~~~

# 【所感】
前にアプリ一本作ったことはあるし、PythonやらKotlinやらで流行りの言語を多少書いていたおかげか、久しぶりに触っても特に抵抗感が無かったことに安心。やっかいなのは言語仕様よりiOSの仕様かと思います。

# 【参考】
・https://qiita.com/nitaking/items/3f0a7b8e7f7223a1c62a
・https://qiita.com/hiroo0529/items/27ec2c24327a692aa0dd
・https://qiita.com/MashMorgan/items/771f8143470b80bd9996
・https://qiita.com/aki/items/50fbab1a4c0df3f3d23f
Mojaveで拡張されたスクリーンショットのショートカットキーを無効にする方法

macOS Mojaveではスクリーンショットの機能が拡張され、「command-shift-5」という新しいショートカットキーが追加されました。

しかし、このショートカットキーはスクリーンショットの編集でおなじみのSkitchのショートカットキーとかぶっています。

新しく追加されたショートカットキーを無効にするには『システム環境設定 → キーボード → ショートカット → スクリーンショット』と選択し、該当のショートカットキーのチェックを外せばOKです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140792/0797c095-ec5d-8a0b-eedb-6b42548e5ad7.png)
Docker for Macでコンテナとのボリュームマウントに苦労した話


##【事象】
私用のMacでDockerコンテナをいじっていた時、Tomcatのコンテナのログをホスト側に吐かせたくなり、
ホストとコンテナ間で共有ディレクトリを設定しようとしたら、めっちゃ怒られて辛かったというお話。

■激おこメッセージ


```
$ sudo docker run -d -p 18080:8080 -v /work/tomcat-container/logs:/share/logs --name tomcat1 tomcat:latest /sbin/init
04d63c0ab435ddf746fd239e162d48d55055cba9378a0d6e247580de19039028
docker: Error response from daemon: Mounts denied: 
The path /work/tomcat-container/logs
is not shared from OS X and is not known to Docker.
You can configure shared paths from Docker -> Preferences... -> File Sharing.
See https://docs.docker.com/docker-for-mac/osxfs/#namespaces for more info.
```


【やりたきこと】
ホスト側のボリューム /work/tomcat-container/log にログが流れるようにしてあげたい。
あわよくば、お叱り頂いた理由等も知りたく...。

【Let's 解析】
- [x] docker run時のファイルパスはどちらも間違っていない
- [x] ディレクトリ権限でも問題ない
- [ ] メッセージを見ると、dockerのアプリがそもそもダメって言っていた。
　
##■ありがたきメッセージ
メッセージをもう一度読むともう答えが書かれていました。
なんとDockerアプリから環境設定で設定が必要なご様子です。

```
You can configure shared paths from Docker -> Preferences... -> File Sharing.
See https://docs.docker.com/docker-for-mac/osxfs/#namespaces for more info.
```
【詳細】
メッセージに従い一度きっちりドキュメントを拝見させて頂くと...?
https://docs.docker.com/docker-for-mac/osxfs/#namespaces 
> The user’s ~/Desktop/ directory is now visible in the container as a directory under /.

コンテナ側から見えてなかった理由がわかりましたね。
僕の作ったボリューム (/work/tomcat-container/logs) は、「/」始まりでした。
そりゃコンテナ側からは見れなくて当然な訳で御座います。

Docker for macのアプリで許可してあげたら無事、共有ディレクトリを設定できました〜。
[タブ：File Sharing]で、共有ディレクトリを設定可能
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35382f39396266623338362d396462632d326361622d343335612d3365643039323935313861362e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/168731/80231cf8-3de5-132d-4545-1ab82a7ec857.png)

#【小ネタ】
Docker for Macのアプリに、許可するファイルパスを指定してあげれば余裕でOKな話でしたが、
僕は端末を汚したく無くて、terminalでいつも /work に色々sandboxを作って操作していました。

事件が起きたのは今回、/work のPATHを許可設定する時でした。
「/work って、Macでのファイルパスってどこなんだろう...？」
「選択できる対象にホストが...ない！？」

**工ｴｴｴｴｴｴｪｪｪｪｪｪ(ﾟДﾟ)ｪｪｪｪｪｪｴｴｴｴｴｴ工工工**

terminalにてhostnameをポチポチ...。
　→Docker for Macのアプリを再度見る。
　　選択できる対象にホストは無いまま。

　　　　　　**お通夜モード**


「 /workは /work だったァーーーーー!!!!」

**工ｴｴｴｴｴｴｪｪｪｪｪｪ(ﾟДﾟ)ｪｪｪｪｪｪｴｴｴｴｴｴ工工工**
![nukesaku.jpg](https://qiita-image-store.s3.amazonaws.com/0/168731/98a753af-9473-9f1d-5f87-5ccc6de3b304.jpeg)

普段、仕事の端末(Windows)上のマシンで作業していたからこそ起きた悲劇...。

https://www.docker.com/get-started
1章　C言語　基本構文

#1.0 あいさつ
こんにちは！
この記事では、か～な～り導入部分を書いていきます。
間違いに気付いたらお教えください。

#1.1 C言語プログラミング言語の基礎知識
まずはじめに、開発していくうえで大事な<font color="red">フロー</font>（流れ）を説明しておきます。
端的に言うと、以下の<font color="blue">ステップ</font>（段階）によってプログラムの開発をしていきます。

``手順1:ソースコードの作成``
いわゆる「~.c」ってやつですね。
ざっくりいうと__人間が理解できる状態のもの__です。
基本的にはこれを編集します。

``手順2:コンパイル``
↑で言うソースコードを__マシンが理解できる状態のもの__に変換することです。
コンパイラを使って変換します。
これにより「~.exe」という実行ファイルが生成されます。

``手順3:実行``
あとは__実行__です。

#1.2 C言語プログラムの基本構造
次に、構造（骨格）についてお話しします。

１．プログラムの骨格
簡単にですが、下記ソースコードをご覧ください。

```c:test.c
#include <stdio.h>
int main(void)
{
    printf("hello world!");
    return 0;
}
```
これが基本的な構造です。ソースコード内にある' { } (波カッコ)'を<font color="red">ブロック</font>って言います。
ここに指示や命令を記述します（要するにこの中に色々書けばいいです）。
<font color="red">※重要</font>ブロックを作る際に'{(カッコはじめ)'をつけたら'}(カッコ終わり)'を必ず付けましょう。思わないエラーに繋がります。

２．インデント
↑上記ソースコードもそうですが、基本的に｛ ｝をつけたら、次の行はスペース4つ分(タブ1つ分)あけてください。その心遣いがソースの見やすさ読みやすさに変わります。←<font color="red">これ重要</font>

３．コメント文
その名の通りコメントです。
ソースコードにコメント（主にメモですけど）を残すためにあります（実は他にもあります）。
``単数行``
<dd>//コメント</dd>
``複数行``
<dd>/*
コメント1
コメント2
*/</dd>
↓例

```c:test.c
#include <stdio.h>
//こちらはサンプルプログラムです。

int main(void)
{
    /*
        だいたいこの複数行のやつは、
　　　　ソースコードをいっぺんに封印したい場合に使います。
    */
    printf("hello world!");
    return 0;
}
```

４．main関数
実行させたいものを<font color="red">上から順に</font>書いていきます。
↓に色々書いてありますが詳しくは今後の章でふれて~~いきます~~いくつもりです。

```c:test.c
#include <stdio.h>
int main(void)
{
    // 変数宣言の文
    int nogizaka;

    // 計算・そして代入の文
    nogizaka = 46;

    // 命令実行の文
    printf("乃木坂.%d",nogizaka);
    return 0;
}
```

以上。
NLPのタスクを紹介するだけの簡単なページ(2) ~CoLA編~

# CoLA ってなんぞ？
　**CoLA** とは **The Corpus of Linguistic Acceptability** の略で、簡潔に言えば、**文章の自然さ** を評価するためのタスクです。

　最近話題の **BERT** もこのタスクに取り組んでおり、2018年11月でSOTAの地位を手に入れています。
# このタスクの特徴は？
　このタスクは **自然さ** を評価するという機械にはかなり難しいタスクであり、もっと言えば人間にも難しいタスクであると言えるでしょう。
　
# 具体的なデータは？
　データは 0/1 の 2値なラベル付けされた文章の集合となっています。(正確には引用元やラベル付の方法などの情報が含まれていますが、簡単のため今回は説明を省きます。)
　
　0 は自然な文章でないことを示しています。
　1 は自然なそれであることを示しています。

　以下が具体例になります。

```text:具体例
1    猫です、よろしくお願いします。
0    願いです、よろしく猫します。
1    パトラッシュ、僕はもう疲れたよ。
1    にゃーん
```
　
　また実際にCoLAに含まれるテキストを以下に紹介します。

```text:実際の例
gj04	1		The professor talked us into a stupor. (教授は我々に愚痴った。)
gj04	0	*	The professor talked us. (教授は我々に話した。)
gj04	1		We yelled ourselves hoarse. (我々は叫んだ。)

```

# どう活用できる？
　例えば Transformer(Attention is All You Need) や Seq2Seq から出力される文章が自然な文章であるかを評価して、自然でない文章をエラーとしてハンドルすることができるかもしれません。(例えば不自然ならば、「上手く答えられません」と言うなど)

# 参考文献
BERT https://arxiv.org/abs/1810.04805
CoLA https://nyu-mll.github.io/CoLA/
Neural Network Acceptability Judgments https://arxiv.org/abs/1805.12471

# 他ページヘのリンク
[NLPのタスクを紹介するだけの簡単なページ(0)](https://qiita.com/MeguruMokke/items/1201b5fa05ad6ec5efb9)
[NLPのタスクを紹介するだけの簡単なページ(1) ~SQuAD編~]
(https://qiita.com/MeguruMokke/items/962a76a3b6c9e4c99315)
[NLPのタスクを紹介するだけの簡単なページ(2) ~CoLA編~](https://qiita.com/MeguruMokke/items/44a97158dd446d913c97)
[NLPのタスクを紹介するだけの簡単なページ(3) ~QQP編~](https://qiita.com/MeguruMokke/items/8b6ecd3c65755bda7cc0)
[NLPのタスクを紹介するだけの簡単なページ(4) ~STS編~](https://qiita.com/MeguruMokke/items/4248fcf51a5510a27b48)
[NLPのタスクを紹介するだけの簡単なページ(5) ~MRPC編~]
(https://qiita.com/MeguruMokke/items/962a76a3b6c9e4c99315)
【rails】オリジナルアプリをレスポンシブデザインにしてみました。（画像がはみでる、heroku上で画像が表示されない）


オリジナルアプリをheroku上で公開したところ、スマホで見るとブラウザで見るのと同じような形になっていたのでレスポンシブデザインにしてみました。

[Rails4 レスポンシブデザインについて](https://teratail.com/questions/9557)を参考にし、

以下を　application.html.erb　に記述しました。

```rb

（略）
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport" />
（略）
```

レスポンシブになったけど、画像が収まっていない…

<img width="320" alt="IMG_3961.png" src="https://qiita-image-store.s3.amazonaws.com/0/256858/dac2aef0-1808-c3ef-11bf-076a1593680e.png">

これはレスポンシブ対応になっているようです。
<img width="320" alt="IMG_3958.png" src="https://qiita-image-store.s3.amazonaws.com/0/256858/8cef68c2-1668-5b78-b111-96f97737f7c4.png">








##解決方法
(参考)
こちらの質問→[Railsで表示画面（ブラウザ）の大きさに合わせて表示画像の大きさをコントロールする方法を教えてください。](https://teratail.com/questions/93649)
にあった、こちらのサイトに解決方法がありました。[CSS でイメージをデバイスの幅に合わせて表示する](https://www.united-bears.co.jp/blog/archives/1123)

最初、home.html.erbにこのように記載をしておりましたが、

```rb
<!-- First Container -->
<div class="container-fluid bg-1 text-center">
  <%= image_tag 'catchcopy2.png' %>
  <br></br>
  <%= image_tag 'IMG_3573.png',:size => '300x260' %>
  <br></br>
  <%= image_tag 'logo.png'%>
</div>
```



↓以下のようにCSSに対応できるように修正しました。


```rb
<!-- First Container -->
<div class="container-fluid bg-1 text-center">
  <img src='/assets/catchcopy2.png' />
  <br></br>
  <img src='/assets/IMG_3573.png', width="300",height="260" />
  <br></br>
  <img src='/assets/logo.png' />
</div>
```

そしてCSSに以下を追加。

```css
img {
	max-width: 100%;
	height: auto;
}
```

ブラウザで見ると画像が表示されていますが、スマホで見ると…
おや（　＾ω＾）・・・レスポンシブにはなってそうですが、なぜか画像が表示されない・・・

<img width="320" alt="IMG_3962.png" src="https://qiita-image-store.s3.amazonaws.com/0/256858/b9c3f0d2-bac3-bbbc-535e-fbca838d0d91.png">


解決方法については、まずはこちら：[【Rails開発】assets/images以下の画像がHerokuで読み込まれないときの対処法](http://freesworder.net/rails-heroku-images/)
のサイトから引用

>	
```rb
bundle exec rake assets:precompile
```
という謎のコマンド。

>本番環境（production）環境では，これらスタイルファイル（css.scss）を結合して1つの application.css として読み込まれる様に，次のようなコマンドで，事前にコンパイルしておくのです．
この結果，public/assets/ にその結果の application.css が作成されますので，Railsはそこを読み込むようになりますだそうです。


>本番環境でも開発環境のassets以下の更新内容を読み込むためには、上のコマンドを実行してコンパイルする必要があるみたいです。

 


コマンドを実行。herokuへpush!
しかし画像はまだ表示されません…



こちらのサイトに書いてありました！
[Herokuに（ちゃんと）デプロイしてみた。](http://wolfmasa.hatenadiary.com/entry/2015/08/13/010347)

>ということで、config/environments/production.rbに設定を追加。

```rb
config.assets.compile = true
```
>これで、一応動くようになりました。



結果、表示されました！

今日はただ単にコードを書き写しただけなので、アセットパイプライン等についてのまとめは次のメモで整理しようと思います。
今日のエラーは以上です。
havingを使ってデータ数を抽出するシンプルな方法とは？


現在phpでwebサービスを開発している際にmysqlのDB関連で躓いたのでアウトプットさせていただきます。

データベース関連でSELECTしたデータ数を数えたいときにはcountで取得してくると思うがうまくいかないパターンが2種類ありました。

1.GROUP BY でデータをまとめたとき
2.GROUP BY でデータをまとめ、かつHAVINGで制限したとき

1の場合についてはcount関数を使うとGROUP BYでデータをまとめたものの数をとってきてしまうためcount(distinct カラム名)を使うことでうまくいきました。（これについてはリファレンスを参照してください）

問題は2の場合についてです。

##$dbh->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
GROUP BY を使ってHAVINGを用いた際はcount(distinct カラム名)ではうまく取得できませんでした。
そこで$dbh->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true)と$count = $stmt->rowCount();を使う
先に言うと私も詳しくはわかっていませんのでご了承ください！
イメージでは一度BUFFEREDにデータをためておいてrowCount関数で引っ張ってくるというイメージです
コードをご紹介します
![1542028135997.jpg](https://qiita-image-store.s3.amazonaws.com/0/315102/f3fc7a4c-b3fd-d966-8c28-f40ce2bc6b95.jpeg)

関数名等は気にしないでください。
またhaving等は使っていない簡単な例を挙げています。

コードのように5行目のコードを書きexecuteした後にrowCountを使うことでデータ数を取得することができます。

もしcountでどうしてもデータ数が取得できないときは試してみてください！

一つ注意点としては、ページング処理等を行う関係でlimitを使ってデータ数をSELECTしてくるときは全データ数をとってくることはできません
その際は、1.データをとってくる関数と、2.データ数をとってくる関数を二つ呼び出す必要が出てくると思います

以上です。
少しでもお役に立てれば幸いです。

何か間違っている部分等御座いましたら、ご意見よろしくお願いします！
JavaScriptのデバックの方法

#目的：JSの効果が出て欲しいinputタグで効果が出ず、意図していないinputタグで効果が表れてしまった。入力した値がどのinputタグに入っているのか調査をするため。
##①キーボードでF12を押す
##②Sourceタブをクリック
##③該当のJSファイルを開く
##④入力した値が入ってると予想されるソースがある行の左にある数字を押す
##⑤ブラウザで値を入力する
##⑥JSファイルの右の方にある「↓」の下に●がついてるボタンを押す
##⑦そうすると下の方にあるLocalフォルダ直下に、入力した値が出てきます
##⑧そうするとどのinputタグで入力した値が分かります
##⑨ああ..やっぱり@csrfにinputタグが含まれてinputタグの数がおかしくなってたのか..

#まとめ
##jsのデバックのやり方が分かった。この世にある大体のものはデバックできるので早くやり方を調べればよかった..
コンビニで買った育てるサラダをrasPiで撮ってKinesisに流してゴニョゴニョする 前編

<img src="https://qiita-image-store.s3.amazonaws.com/0/308709/a67b7b45-065c-f710-3092-54ad639fbd69.jpeg" width=40%>

**ばばーん。**

<img src="https://qiita-image-store.s3.amazonaws.com/0/308709/77ae7a4d-15c4-428c-e6d4-c15088f15638.jpeg" width=40%>

今回はこれです。
コンビニ行ってなんの気なしにひょいっと買ってしまった育てるサラダ。100円くらいかなと思ってレジに持ってたら500円くらいしてちょービビった。出来てるの買ったほうが安いやん。
でもってさっそく育てようと思ったら日光必要とかでちょーめんどい。
・・そんなわけでしばらく放置しておりました。

そして後日、室内で育てるために保温ライトやら水槽やらを揃えた・・わけではなく、実はリクガメを迎える準備だったりします。まだ不在なので試しにサラダでも育ててみましょうかね、というわけでこんなんなってます。

で、もう一つ前置き。
リクガメ育てるのはいいけど、嫁と二人暮らしでけっこう外出しがち。ネットワークカメラとかあったらいいよね、とamazon見てたりはしたんだけどそこそこのお値段したりして、ホンマにいるのかなぁと。
そこで思いついたのがもうなかった事になっていたRasPiさん。たぶんRasPi2です。買ったはいいがすぐにarduinoの方に浮気しちゃって放置してた。ならこれ使ってみましょうか。変なカメラも一応あるし。

## そして早速、構成を考える

一番シンプルなのは

+ rasPiで映像を撮りつつ、http経由で配信。我が家のルーターに穴を開ける

なんだけど、穴を開けるってのはあんまりやりたくない。なんか今っぽくないし。

じゃあ今っぽいのはなんだ？と考えると

[kinesis video stream](https://aws.amazon.com/jp/kinesis/video-streams/)じゃね？

となりました。いいよね、疎結合。
とりあえずkinesisに流しておけばその後の流れもなんとかなるでしょ。なのでとりあえず流すとこまでやる事にします。

## サンプルアプリ

awsといえばクラスメソッドさん。というわけであっさり答えが落ちてました。まずはこの通りやってみよう。

[Amazon Kinesis Video Streamsを使ってストリーム映像をAWS上に流してみる【Raspberry Pi】}(https://dev.classmethod.jp/server-side/serverless/amazon-kinesis-video-streams-raspberry-pi/)

### SSH

とりあえず、rasPiにいろいろ繋いで起動してみて、なんとなくSSH繋いでみたら普通につながった。もう忘れたけど以前にやってたのかな。

<img src="https://qiita-image-store.s3.amazonaws.com/0/308709/e6615256-7b6e-363e-b5f6-a5006ede3907.jpeg" width=50%>
ごちゃごちゃしてて見苦しくてすんません。

<img src="https://qiita-image-store.s3.amazonaws.com/0/308709/c97f1537-4e97-7dbd-aa1c-0a6a92174679.jpeg" width=50%>
SSHつながった

``` versionとか
$ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 8.0 (jessie)
Release:        8.0
Codename:       jessie
pi@raspberrypi:~ $ uname -a
Linux raspberrypi 4.1.13-v7+ #826 SMP PREEMPT Fri Nov 13 20:19:03 GMT 2015 armv7l GNU/Linux
pi@raspberrypi:~ $
```

古いすね。

![2018-11-12.png](https://qiita-image-store.s3.amazonaws.com/0/308709/34a9a880-7a26-69bd-33dc-315634cb1f76.png)

```RaspiStreamturtle``` というなんのひねりもない適当なネーミングで進めます。

サクサクいきますよ

```
$ git clone https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp
$ sudo apt-get update
$ sudo apt-get install autoconf cmake bison automake libtool gcc flex
$ cd amazon-kinesis-video-streams-producer-sdk-cpp/kinesis-video-native-build
$ sudo rpi-update
$ export JAVA_HOME=/usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt/
```

空きメモリとか

```
 $ free -h
             total       used       free     shared    buffers     cached
Mem:          925M       400M       524M       7.4M        27M       279M
-/+ buffers/cache:        93M       832M
Swap:          99M         0B        99M
```

256MBにしとこう。

``` ../kinesis-video-producer/tst/ProducerTestFixture.h
-#define TEST_STORAGE_SIZE_IN_BYTES                          1024 * 1024 * 1024ull
+#define TEST_STORAGE_SIZE_IN_BYTES                          256 * 1024 * 1024ull
```

・・ここまではめっちゃスムーズ。ラズパイのupdateが少し時間がかかったくらい。
正直、どっかでつまづくやろって思ってた。

```
$ ./install-script
```

でもこのビルド・・・
>3-4時間ほどかかります。。。

って話なので一旦終わります。
一晩待とう。続きは後日。
ANACONDA NAVIGATORでJupyterLabのNotebookを試してみる

pythonを勉強しはじめたので色々なエディタを試してみたところ表題の件を知ったので起動してみる。

【全体の流れ】
①起動画面
②起動
③printでテスト
④保存
⑤終了

①起動画面
<img width="1680" alt="スクリーンショット 2018-11-12 21.45.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/303243/34a8dfe8-3dc3-adfa-cb33-8d7e3ffa5b99.png">


②Launchボタンをおして起動
<img width="252" alt="スクリーンショット 2018-11-12 21.46.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/303243/2c2d9599-a87f-16c5-36be-107dfea67814.png">


アイコンリストが出るのでNotebookを選択
<img width="427" alt="スクリーンショット 2018-11-12 21.46.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/303243/b49dde27-18b5-8473-c188-6b34d06f48fe.png">　


するとフォームが登場するので・・・
<img width="882" alt="スクリーンショット 2018-11-12 21.47.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/303243/6528b47f-d2aa-ef54-3006-df091b1f0845.png">

③printで「こんにちは」→[shift]＋[return]すると表示される
<img width="883" alt="スクリーンショット 2018-11-12 21.47.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/303243/d0af311d-956c-c20d-3773-65f9ff39bd48.png">


④保存をして・・・
<img width="465" alt="スクリーンショット 2018-11-12 21.47.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/303243/06d5ef8a-540f-f29b-8203-b11119c1e0f6.png">


⑤無事終了です。
<img width="608" alt="スクリーンショット 2018-11-12 21.49.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/303243/5dcac62c-e14a-66b5-45be-da2edad27492.png">

お粗末様でした。ブラウザで確認できるのはすごくありがたい気がします。
laravel helper を共通関数を自作しよう

グローバル関数をまとめちゃえ。

[ 参考 ]
https://qiita.com/ryokurosu/items/5365e6a3c354d4731a3b

一度作って json もやりゃ、helper.phpを変更しただけで動く。


```helper.php

<?php

function pd($var) {
    $array = debug_backtrace();
    echo "<div align='left'><pre style='font-size:14px;background-color: black;color: #fff;'>";
    echo '<b style="font-weight:bold;">'.$array[0]['file']." (line ".$array[0]['line'].")".'</b><br />';
    print_r($var);
    echo "</pre></div>";
}


?>


```

これで適当なコントローラーで pd(); やればデバッグ情報が、わかりやすく表示される。
NLPのタスクを紹介するだけの簡単なページ(1) ~SQuAD編~

# SQuAD ってなんぞ？
　**SQuAD** とは **The Stanford Question Answering Dataset** の略で、簡潔に言えば、**質問応答技術** を研究するためのタスクです。 

　最近話題の **BERT** もこのタスクに取り組んでおり、2018年11月でSOTA(State of The Art) の地位 (要するに一番精度が良いって意味) を手にしています。
# このタスクの特徴は？
　このタスクは **質問応答** の中でも、**読解力** を特に重要視したタスクになります。これはただテキストを読んでアレコレするだけではなく、普遍的な「これはこうだからこう」という常識が必要になり、機械の苦手な分野の一つになります。
　
# 具体的なデータは？
　データは主に、 **テキスト** と **質問文** **正解** の3つになります。

　まず **テキスト** ですが、これはWikipediaから来る記事になります。
　**質問文** は この テキスト に関する質問が該当します。質問に対する解答は テキスト の中にあり、これを抜き出すのがメインな目標になります。
　**正解** は幾つかのパターンが考えられますが、趣旨を外していなければ良いということになっています。
　更に **SQuAD ver2.0** から追加されたタスクとして、**回答できない質問には回答できないことを示さなければならなくなりました**。

　例えば皆さんに身近な例を出すと、小学校の頃に出たであろう、以下のような国語の問題を挙げることが出来ます。

```text:テキスト
山田くんは身長165センチで体重52キロの男の子です。
最近はマイクラというゲームをすることにハマっています。
好きな人は隣の席の田中さんです。
カレーが好きな食べ物です。
最近VTuberにハマっています。
```
```text:質問文
山田くんの好きなゲームはなんですか？
```

```text:正解の要素
マイクラ
```

　念の為、実際のSQuADに含まれるであろうテキストとその質問を紹介しておきましょう。

```text:テキスト
In meteorology, 
precipitation is any product of 
the condensation of atmospheric water　
vapor that falls under gravity.
(気象学では、降水は重力によって大気中の水蒸気が凝縮したものが降ることです。)
```

```text:質問文
What causes precipitation to fall?
(降水の原因は何？)
```

```text:正解の要素
gravity
(重力)
```

# どう活用できる？
　例えばあるプログラムのマニュアルを保存しておいて、お客様窓口に何らかの問い合わせが来たときにその解答を導き出すことを考えることが出来ます。

# 参考文献
SQuAD https://rajpurkar.github.io/SQuAD-explorer/
The Stanford Question Answering Dataset https://rajpurkar.github.io/mlx/qa-and-squad/
BERT https://arxiv.org/abs/1810.04805
SQuAD 2.0 https://arxiv.org/abs/1806.03822
# 他ページヘのリンク
[NLPのタスクを紹介するだけの簡単なページ(0)](https://qiita.com/MeguruMokke/items/1201b5fa05ad6ec5efb9)
[NLPのタスクを紹介するだけの簡単なページ(1) ~SQuAD編~]
(https://qiita.com/MeguruMokke/items/44720220d4fe9de3f804#_reference-9b0a4d29b890b992a30c)
[NLPのタスクを紹介するだけの簡単なページ(2) ~CoLA編~](https://qiita.com/MeguruMokke/items/44a97158dd446d913c97)
[NLPのタスクを紹介するだけの簡単なページ(3) ~QQP編~](https://qiita.com/MeguruMokke/items/8b6ecd3c65755bda7cc0)
[NLPのタスクを紹介するだけの簡単なページ(4) ~STS編~](https://qiita.com/MeguruMokke/items/4248fcf51a5510a27b48)
[NLPのタスクを紹介するだけの簡単なページ(5) ~MRPC編~]
(https://qiita.com/MeguruMokke/items/962a76a3b6c9e4c99315)
How to Install Laravel on Ubuntu

We install and run Laravel 5.7 on Ubuntu 18.04. 

First, we install PHP extension-packages needed to install Laravel.
`sudo apt install php-mbstring php-xml php-json`

We manage packages of Laravel by Composer, a package manager. Please run commands below to download and install it.
`curl https://getcomposer.org/installer | php`
`sudo mv composer.phar /usr/local/bin/composer`

Please move from the current directory to a directory you use for a Laravel project and run a command below to create a Laravel project. You write your project name instead of PROJECT_NAME.
`composer create-project --prefer-dist laravel/laravel PROJECT_NAME`

Please move from the current directory to the directory PROJECT_NAME and run the server by Artisan, the command interface of Laravel.  
`cd PROJECT_NAME`
`php artisan serve`

Please go to http://localhost:8000/ 
It is successful if you see 'Laravel' on the page!
matplotlibでマーカーを任意の画像にしてプロット

#概要
matplotlibのグラフにマーカーとして画像を使う方法。AnnotationBboxを使いました。
#コード
```python:import
import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib.offsetbox import OffsetImage, AnnotationBbox 
```
つかうものをimport

```python:anotation_picture
def imscatter(x, y, image, ax=None, zoom=1): 
    if ax is None: 
        ax = plt.gca() 
    try: 
        image = plt.imread(image) 
    except:
        pass 
    im = OffsetImage(image, zoom=zoom) 
    artists = [] 
    for x0, y0 in zip(x, y): 
        ab = AnnotationBbox(im, (x0, y0), xycoords='data', frameon=False) 
        artists.append(ax.add_artist(ab)) 
    return artists 
```
1. axが設定されてないときは現在のグラフをaxに設定
2. `plt.imread()`で画像の読み込み
3. annotationにいれるために`OffsetImage()`に画像ファイルを入れる。
4. 空のartistsをつくって、x,yの各データに`AnnotationBbox`でdataの位置に図を挿入。
    1. xycoodsはannotationを表示する位置の設定で、'data'でdataと同じスケールで位置の設定ができる。他には、左下を(0,0)右上を(1,1)とする'axes fraction'などがある。
    2. frameonは画像の枠線の設定でFalseで非表示。
5. `artists.append(ax.add_artist(ab))`でabをaxに追加して、それをartistsに追加する。

```python:plot
x,y =np.random.rand(2, 20)#データ生成
image_path = 'cactus.png' 
fig, ax = plt.subplots() 
imscatter(x, y, image_path, ax=ax,  zoom=.25) 
ax.plot(x, y, 'ko',alpha=0) 
ax.autoscale() 
plt.show() 
```
1. image_pathはファイルのpath,今回のファイルは[こちら](http://icooon-mono.com/13211-%E3%82%B5%E3%83%9C%E3%83%86%E3%83%B3%E3%81%AE%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%885/)でダウンロード。
2. imscatterで画像をプロット、zoomで拡大縮小の設定ができる。
3. alpha=0で透明にしてプロット,こうしないとautoscaleが効かない。

![cactus_plot.png](https://qiita-image-store.s3.amazonaws.com/0/305461/a74ac7d5-0a96-38ea-f05f-54d22746bcbc.png)

#参考
- [Matplotlib：ポイントの代わりに画像をプロットするには？](https://stackoverrun.com/ja/q/6174885)
.bashrcの変更が保存されない時,そもそも.bashrcがない時

#本記事の対象となる人

* 新しいmacにして.bashrcファイルが存在しない人
* .bashrcファイルはあるけど毎回毎回```source ~/.bashrc```コマンドを行わないといけない人

# .bashrcファイルを作成
* ターミナルで```cd```コマンドでホームディレクトリに移動します。<img width="730" alt="スクリーンショット 2018-11-12 21.37.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/278650/ac3e183a-8dbb-4ccf-43c1-1de9a46554a0.png">

* ホームディレクトリでvscodeユーザーは```code .``` atomユーザーは```atom ./```でテキストエディターを開いてください。

<img width="709" alt="スクリーンショット 2018-11-12 21.40.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/278650/d4ab12db-f3f6-bbe9-8f84-a35a2f461c6b.png">

* エディターを開いたその場所で```.bashrc```ファイルを作成してください。

<img width="278" alt="スクリーンショット 2018-11-12 21.43.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/278650/3d3ee257-63f5-c27f-f270-4b6970531ecf.png">

#.bashrcファイルの内容を起動時に内容を読み込む

* ***.bash_profile***ファイルに

```
if [ -f ~/.bashrc ] ; then
    . ~/.bashrc
fi
```
と書くことで毎回起動時に.bashrcファイルに書かれている内容を読み込むことができます。
mac でgolangのインストール方法について

# インストール

go 公式サイトからApple Mac OSを選択して、ダウンロードして完了。
https://golang.org/dl/

### コマンドライン
インストール後、goプログラムを作ってコマンドラインで実行する。

```shell
go run hoge.go
```

#チュートリアル
最低限の文法を学ぶことが可能。
https://go-tour-jp.appspot.com/welcome/
VC++2017でのexeアイコンの設定

よく忘れるのでメモ

# 準備
 - VisualStudio2017
 - .icoファイル

# やり方
1. ソリューションエクスプローラーで次の場所を右クリック
    - ソリューション/プロジェクト/Resource Files
1. Addをクリック
1. Resourcesをクリック(Existing itemではない！)
1. Iconを選択してImportをクリック
2. アイコンにする.icoファイルを選択
3. ビルド
Vue.jsでbackground-imageを指定するときにハマったのと対処法

#やりたかったこと

VueのComponentの中に背景画像を指定したstyleを作成しておき、そのスタイルを適用させたかった。

#しかし

```css
background-image : url("./image/dog.jpg")
```
をするために

```javascript
styleItem = {
     'backgroundImage' : 'url(' + "./image/dog.jpg" + ')'
}
```
としたが結果はうまくいかず....
GoogleChromeの検証結果を確認したところトランスパイル後のstyleの指定がurlのままで相対パスから変化してくれてなかった。なぜだ。issueが出てて読んでみたけどいい感じのものは無し。

#解決法
vue-loaderのドキュメントを読んだところ、トランスパイル時にrequire()で絶対パスに直しているそうなので

```javascript
styleItem = {
     'backgroundImage' : 'url(' + require("./image/dog.jpg") + ')'
}
```

としたところ、うまくいった。よかった。これでリアクティブに背景画像が変えられる！！！
もっとうまい書き方あったら誰か教えてください〜！
WindowsおじさんのMac移行記 

## 背景
どうも、私がWindowsおじさんです。 
職場でマシンをWindowsからMacへ全面移行することになり、生まれて初めて本格的にMacを使うことになりました。 
自分へのメモを兼ねて、おじさんがMacを扱うための試行錯誤を記録します。

## 前提
### Macのスペック
* MacBook Pro 13-inch
* macOS High Sierra 10.13.6
* Core i7 2.5GHz
* memory 8G

### おじさんのスペック
* Windows歴20年弱
* Win10Pro
* エディタはVSCode
* ターミナルはTera Term
* Macに対するリテラシー
  * 触れたことは過去に数回
  * 「使った」ことはない

## おじさんの試行錯誤
### キー配置がWindowsとめっちゃ違う
おじさんの解決策 

* Windows用の日本語109キーボードを繋げる

### トラックパッドが器用に操作できない
おじさんの解決策

* Windows用マウスを繋げる

### マウスのスクロールの方向がWindowsと逆
おじさんの解決策

* ナチュラルじゃなくする  
「システム環境設定」「マウス」で「スクロールの方向: ナチュラル」のチェックを外す

### ファンクションキーが`Fn`押してる時みたいな動きをする
おじさんの解決策

* 標準のファンクションキーとして使う設定にする  
「システム環境設定」「キーボード」「キーボード」で「F1、F2などのキーを標準のファンクションキーとして使用」をチェックする

### IMEの挙動がWindowsとめっちゃ違う
おじさんの解決策

* Windows風の操作なるものに切り替える  
「システム環境設定」「キーボード」「入力ソース」で「Windows風のキー操作」をチェックする

### ショートカットがWindowsとめっちゃ違うし、そもそもキーが違う(物理)
おじさんの解決策

* キーバインドを変更してWindows風にしてしまう

* 具体的には [karabiner-Elements](https://pqrs.org/osx/karabiner/) というアプリを導入する 
  これは強力で、かなりWindows風の操作に寄せることができます。

おじさんのキーバインド変更例(Simple Modifications)

* `caps_lock`を`left_control`にする
* `PCキーボードの無変換キー`を`英数キー`にする
* `PCキーボードの変換キー`を`かなキー`にする
* `left_control`を`left_command`にする
* `right_control`を`right_command`にする

そのほか、`karabiner`には [あらかじめ用意された設定](https://pqrs.org/osx/karabiner/complex_modifications/) をインポートする便利な機能がついているので、これを利用します。 
以下はおじさんが導入した設定

* 5ボタンマウスの「戻る」「進む」を使えるようにする  
`Change button4,5 to back,forward (rev 1)`
* HomeキーとEndキーを使えるようにする  
`PC-Style Home/End`
* Winキー + Lでスクリーンロック出来るようにする  
`PC-Style Lock Screen`
* F5キーでリロード出来るようにする  
`PC-Style Reload(F5, Ctrl+R)`
* PrintScreenキーを使えるようにする(いくつかパターンがあります)  
`PC-Style Screenshot to File (PrintScreen to select)` 
* Altキー + F4キーでアプリケーションを終了できるようにする   
`PC-Style Quit Application (Alt+F4 to Command+Q)`

### 標準のターミナルだと`Home`と`End`が効かない、それになんか見難い。。
おじさんの解決策

* 別途、ターミナルを入れる  
 おじさんは定番とされる [iTerm2](https://iterm2.com/) を入れたらキーが効くようになった  
`brew cask install iterm2`

### ショートカットはどうやって作るの？
`option + command` を押しながら対象のファイル/フォルダをDrag&Drop

### `Alt + Tab` みたいなのはどうやるの？
`command + tab + ←/→`

### `Ctrl + PageUp/PageDown` みたいなのはどうやるの？
`command + option + ←/→`

### 参考記事
[Macの操作をWindowsっぽくする](https://qiita.com/konightich/items/649085fe1f438a73e7a3)

## 所感
Windows風のキー操作を設定してしまえば、おじさんでもそう違和感なくMacを使うことができました。 
エディタにVSCodeを使っていたことも地味に有益でした。`Settings Sync`で設定を共有できますし、使用感もほとんど変わらない点が非常に助かります。
現場入場に向けて

<h1>現場入りに向けて</h1>
 
<strong>1.知識面で必要なこと</strong>

PostgreSQL,Linux環境でのshellを使った開発の前知識
Bat処理について、結合テスト・単体テストで重視する部分
案件に関する知識、自身がどういった案件に関わっているのかを調べる
　
<strong>2.意識面で必要なこと</strong>

バグチェック、エラーでのチェック項目を要確認
当日に行った業務の報告・棚卸しをエンジニアらしく他人から見て分かりやすくする

<strong>3.勉強面で必要なこと</strong>

Javaに関する資格勉強、基本情報処理技術者に向けての勉強
SQL言語での学習

--------------------------------------------------------------------------------
のちに更新予定...
Windows10で突然リモートデスクトップ接続ができなくなった話

# この記事について
Windows10にアップグレードしてからちょっと経った頃、リモートデスクトップを使って接続しようとしたところ入れませんでした。
今回はその現象が治った方法について書いていこうともいます。

# 治った方法
再起動
※調子がおかしくなったら再起動は最初に試しましょう

# 詳しい現象
PCは二台、一台はデスクトップPCでもう一台はノートPCです。

PC1：デスクトップPC（最近Windows10にした）
PC2：ノートPC（結構前からWindows10）
###事象１
最初にPC2からPC1に対してPCに入っている**【リモートデスクトップ接続】**を使用しました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/296240/258b3e7d-4c98-118b-ff84-e271db5f52d0.png)
しかし、この接続ははじかれてしまいます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/296240/086dc9a9-9974-bb9a-716c-b5448d1188d1.png)

###事象２
仕方がないのでPC2からPC1に対してPINGを飛ばしてみることにしました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/296240/f9959e9b-842d-c2aa-0589-8eaf25a65d85.png)
同じ社内の有線上に存在していたのでさすがに通るだろうと思いましが通りませんでした。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/296240/9a942d8f-98e7-252c-ce1a-8a786cbd3142.png)

###事象３
どうなってるんだ？と思いつつ今度は逆方向で試してみます。
つまりPC1からPC2に対してPINGを飛ばしてみました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/296240/44ca381b-87d1-ebb1-026f-b5be7c0a3698.png)
どうせ通らないだろうと思ったら通りました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/296240/6f0d155d-6c79-fd05-5001-83beedb80060.png)

###事象４
じゃあ今度は**【リモートデスクトップ接続】**をしてみようという事になりました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/296240/6273584e-dd71-ba5b-e5a9-cb39a7ccc1f9.png)
通りました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/296240/5add249d-e43d-5430-28c6-71979a9fb2d1.png)

###確認事項
これは明らかにPC1が拒否しているのだろうと考えて、各種設定をチェックします。

- 設定→システム→リモートデスクトップ→リモートデスクトップを有効にする：**オンになっていました。**
- リモート接続できるユーザ登録：**登録されていました。**
- FireWall：**全部オフにしてみましたがつながりませんでした。**

#最終手段
というわけで社内システム部様に問い合わせました。
「上みたいなことが起きてるんですけど、その対処方法知りませんか？」
**「とりあえず再起動してみてください」**
なおった。

#理由を考えてみた
予測ですが、私は今まで**【完全なシャットダウン】**をしていなかったようです。
Windows10は起動が高速ですが、その理由が**【簡易なシャットダウン】**が理由らしく、**【完全なシャットダウン】**とは別物らしいのです。
今回の事象が起こった理由としては、アップデートが走った際に私はよく就業後に行っていたため**【再起動】**ではなく**【シャットダウン】**をしていました。
そのせいで正しくシャットダウンが行われていなかったために設定がどこかおかしくなってしまっていたのではないかというのが私の予想です。
因みに再起動では**【完全なシャットダウン】**を経由しているそうなので、こういったことは起こらないと思われます。

以上、私がバカだったお話でした！
Laravelでパスワードを使用せずにログイン機能を使用する

#概要
タイトルそのままです。
Emailだけでログインしてみます。

## 環境
Laravel5.5
`php artisan make:auth` `php artisan migrate`で認証機能を構築済

## 方法
```php
public function hogeAction(Request $request)
{
    $user = User::where('email', $request->input('email'))->first();

    Auth::loginUsingId($user->id);
}

```

以上。

## 参考

[Using Auth::attempt() without password](https://laracasts.com/discuss/channels/laravel/using-authattempt-without-password)
[日本語ドキュメント](https://readouble.com/laravel/5.5/ja/authentication.html)
NLPのタスクを紹介するだけの簡単なページ(0)

# NLPってなんぞ？
　**Natural Language Processing** とは日本語では主に **自然言語処理** と呼ばれる研究分野を指します。
　その名の通り自然言語、例えば英語だったり日本語だったりを対象としてこれを解析するのが目的になります。最近は主に機械学習 (深層学習に限らないことに注意して下さい) を解析するためのツールとして用いています。

　たとえば "林檎" と "アップル" , "禁断の果実" はほとんど同じ意味を指しますが、これをコンピュータに学習させるなどが有名な研究として挙げることが出来ます。
　これをNLPっぽく言うと、**単語の分散表現を得る** 、と言い、最近の有名な手法としては FastTextなどを挙げることが出来ます。
　
　勿論日系大企業ならば適当な人間をボランティアで8万人くらい拾ってきて手打ちなりさせれば割と簡単にこれを得ることが出来ますが、これを機械学習等を用いることで余計な人死にを出さずに解決することができるのです。
　
# タスクってなんぞ？
　機械学習等の問題を解く際には、それぞれのシステムに最適なアルゴリズムを作る方が良いということは想像に難くないと思いますが、これには幾つか問題が生まれます。
　
　その最たるものに、研究が進まないということが上げられます。
　具体的に言うと、A,B,Cという似通った問題それぞれを別の問題として扱うと、それぞれの問題を解いた際に得られる知見が共有できないということです。またそれぞれの問題の解法がどのくらい有効なのかを比較できないということも挙げられるでしょう。
　
　また主に機械学習に限った話をすると、データが手に入りにくい、ということも挙げられます。機械学習は主にはデータが多い方が良い精度が出ることが言われており、(~~ただゴミを集めればええやろ派がいるので、個人的にこの考え方はあんまり好きではないです…~~) 

　このため、研究者間である程度一般的な問題を設定して、その問題を解いてその精度を競うことでより良い研究成果を作っていきます。

　この問題を **タスク** と呼びます。

# このページを作るモチベーション
　最近 **BERT** や **FastText** などがめざましい成果を得ていますが、特に **BERT** はどんな **タスク** を解いているのか不明瞭な点が多いです。
　これらを解説して、日本でもこれらの知見を生かし、より日本でNLPの研究が進んでいくことを期待しています。
　~~あと日本語のデータセットもっと増えないかなぁチラッチラッ~~

# 参考文献
BERT https://arxiv.org/abs/1810.04805
FastText https://fasttext.cc/
汎用言語表現モデルBERTを日本語で動かす(PyTorch) https://qiita.com/Kosuke-Szk/items/4b74b5cce84f423b7125
# 他ページヘのリンク
[NLPのタスクを紹介するだけの簡単なページ(0)](https://qiita.com/MeguruMokke/items/1201b5fa05ad6ec5efb9)
[NLPのタスクを紹介するだけの簡単なページ(1) ~SQuAD編~]
(https://qiita.com/MeguruMokke/items/44720220d4fe9de3f804#_reference-9b0a4d29b890b992a30c)
[NLPのタスクを紹介するだけの簡単なページ(2) ~CoLA編~](https://qiita.com/MeguruMokke/items/44a97158dd446d913c97)
[NLPのタスクを紹介するだけの簡単なページ(3) ~QQP編~](https://qiita.com/MeguruMokke/items/8b6ecd3c65755bda7cc0)
[NLPのタスクを紹介するだけの簡単なページ(4) ~STS編~](https://qiita.com/MeguruMokke/items/4248fcf51a5510a27b48)
[NLPのタスクを紹介するだけの簡単なページ(5) ~MRPC編~]
(https://qiita.com/MeguruMokke/items/962a76a3b6c9e4c99315)
Google Play Billing Libraryの課金後のメソッドについてメモ(queryPurchases()とqueryPurchaseHistoryAsync())

以下のQiitaで課金するまでの流れはなんとなくわかりましたが、その後に使うこれらのメソッドが良くわからないので、少し調べました。
[簡単なGoogle Play Billing Libraryの課金の流れ](https://qiita.com/takahirom/items/4d597b00f500efb3dc7f)

queryPurchases()とqueryPurchaseHistoryAsync()などは[BillingClientクラス](https://developer.android.com/reference/com/android/billingclient/api/BillingClient)のメソッドです。
**これらを使うと課金したもの(Purchase)についての情報を課金後に取得する事ができます。**
ちょっとドキュメント読んでもピンとこなかったので調べてみました。

課金でトラブルがあっても責任はおえないため、自分で検証して確認してください :bow: 
何かこうしたほうが良いなど、コメントあればください :pray: 


こんな感じのアプリを作って、検証してみました
![image.png](https://qiita-image-store.s3.amazonaws.com/0/27388/4e7cc4b9-d52e-d7e2-48e8-d686e83065f0.png)


# それぞれの特徴

| メソッド | 同期、非同期 | 未消費のPurchaseが"ない"とき | 未消費のPurchaseが"ある"とき | 同じアカウントの他の端末での変更 |
|---|---|---|---|---|
| `queryPurchases(sku) : Purchase` | 同期 | **何も取得できない** | 消費していないPurchaseを取得できる | 反映されない |
| `queryPurchaseHistoryAsync(skuType) : List<Purchase>` | 非同期 | Sku毎に最後に消費したPurchaseが取得できる | 消費していないPurchaseも含め、Sku毎にPurchaseを取得できる | 反映される |

課金したもの(Purchase)は消費(consume)することができます。課金後にconsumeAsync()を呼ぶことで、Purchaseを消費することができます。
消費していない間、PurchaseをGoogle Playが保持してくれていて、自社サービスのサーバーにちゃんと課金の反映できるまで消費しないということができます。

# 取得できるPurchaseの情報の違い

launchBillingFlow後のonPurchasesUpdated()で取得できるPurchase(危なそうなものは..で省略しています)

> Purchase. Json: {"orderId":"GPA.33..46","packageName":"com.github.takahirom.hogehoge","productId":"item1","purchaseTime":1542021978243,"purchaseState":0,"purchaseToken":"gd..Ze"}


queryPurchases()で取得できるPurchase (**"launchBillingFlow後のonPurchasesUpdated()で取得できるPurchase"と全く同じ**)

> Purchase. Json: {"orderId":"GPA.33..46","packageName":"com.github.takahirom.hogehoge","productId":"item1","purchaseTime":1542021978243,"purchaseState":0,"purchaseToken":"gd..Ze"}

queryPurchaseHistoryAsync()で取得できるPurchase

**取得できている情報がぜんぜん違う**。`orderId`や`packageName`がない代わりに、`productId`(SKU)や`developerPayload`がある。purchaseTokenはあるので、それは使える。

> Purchase. Json: {"productId":"item1","purchaseToken":"gd..Ze","purchaseTime":1542021978243,"developerPayload":null}


# データ削除して起動した時の挙動した時

未消費のPurchaseが**ない**とき かつ アプリのデータ削除した時も、未消費のPurchaseが**ある**とき かつ アプリのデータ削除した時も、同じように取得可能。


# まとめ

`queryPurchases()`はカジュアルに未消費のPurchaseがあるかどうかを確認するのに使って消費を行い、
端末を変えたり、データ削除後の履歴を辿りたい時に`queryPurchaseHistoryAsync()`を使うと良さそうです。
kubernetesで登場する概念的なやつの個人的メモ

# これは何？
私の技術メモです。
これから触るにあたって、overviewだけはふわーっと知っておきたいなと思った。

# 以下メモ
自分で調べてみて基本的な用語や概念など、理解したことを書いてみる。
「kubernetesってそもそも何するやつ？」はここには書いてない。
リソースやコンポーネントについてはとりあえず並べてみただけなので、もう少し学びが進んだら読み直してアップデートしていくかも。

## k8sクラスタ
* k8sそのものとなるサーバ群
* 1台以上のmaster、1台以上のnodeで構成
  * master : api-serverの提供やコンテナのスケーリングなど
  * node : 基本的にはdockerホストに相当
     * masterとnodeは同じサーバが役割を担ってることもあるかも
* dockerホストのクラスタ構成≒k8sのクラスタ構成　と思っている。

## kubeadm
* k8sクラスタの構築ツール。
* kubeadmの基本的なコマンド。
  * kubeadm init : masterノードで実行。クラスタを初期化する。
  * kubeadm join : クラスタにノードを追加する。

## kubectl
* k8sクラスタ管理のためのCLI。masterノード上で動作。
* ~/.kube/config : kubecetlの接続情報を書く。yaml形式。
* kubeconfigの構成
  * clusters : 接続先クラスタ
  * users : 認証情報
  * contexts : clusters+users+namespaceの組み合わせ情報。これを切り替えながらkubectlを発行することで、どのクラスタに向けて発行するか決まるんだと思う。
* kubectlの基本的なコマンド。
  * まだ。

## マニフェストファイル
* yaml形式の設定ファイル。
* 後述する「リソース」を記述する。
* マニフェストファイルの操作
  * 一括操作系：kubectl create/delete/apply
  * 特定リソース操作系：kubectl set/replace/edit
  * 情報取得系：kubectl get/describe/logs
  * ほか：kubectl exec/kubectl port-forward
* 事実上のIaC化ということだと理解。

## k8sの「リソース」
* マニフェストファイルでmasterにリソースを登録する。
* 主な登場人物を書いてみる。
  * workloads : クラスタ上にコンテナを起動するリソース。
     * deployment：replicaSetを管理。コンテナイメージが変更したりした場合、podを新しくしていってくれる。
     * replicaSet：podを管理。指定数のpodの稼働を保証する。
     * pod：複数コンテナからなる。IPアドレスがpod単位で紐づけられる。
     * daemonSet
     * statefulSet
  * desicovery&LB : 外部からアクセスするエンドポイントなど公開・アクセスに関する。
     * service
     * ingress
  * config&storage : その名の通り設定やボリュームなど。
     * secret
     * configMap
     * persistentVolumeClaim
  * cluster : 
     * namespace
         * 一つのk8sクラスタを仮想的に分離させて複数のチームで利用したりできる。
         * デフォルトではdefault/kube-system/kube-publicの三つが存在。
     * node
  * metadata : 
     * horizontalPodAutoscaler

## k8sのコンポーネント
* 主な登場人物を書いてみる。
  * etcd
     * クラスタに関わる情報すべて。冗長化するのが基本。
  * kubelet
     * 実際にコンテナランタイム(docker等)と連携し、コンテナの起動/停止を行う。
  * kube-proxy
  * kube-scheduler
     * podとnodeの紐づけをする。
  * kube-apiserver
     * k8sのAPIを提供する、中心となるコンポーネント。
  * kube-dns
  * kube-controller-manager



## Liveness Probe/Readiness Probe
 * リソース(=マニフェストファイル)のPod内のcontainersで設定するコンテナのヘルスチェック。肝要そうなので別枠とした。
   * liveness : コンテナが起動しているか
   * readiness : コンテナがリクエストを受け付けられるか
 * livenessとreadinessの使い分けの考え方は諸説あるようだ。
 * k8sが取り扱う単位の最小は基本的にpodだが、これはコンテナを参照することになるようだ。

## CNI(ContainerNetworkInterface)
 * コンテナ間の通信を可能にするネットワークインターフェース。
 * 現在の代表はflannel。
 * dockerホストの異なるpodは基本的に通信できないが、CNIにより通信が可能となる。
 * kube-proxyが仲介役をしているようだ。

## その他
 * kubeletはSELinuxを無効にする必要あり。
 * クラスタ構築時は、kubeadm initの出力をもとにkubeadm joinしよう！
 * minikube : ローカルでk8sを試せる。冗長構成無し。virtualBox必要。



# ひとまずの感想
kubernetesの世界は広大だ。
Windows 10のバックアップディスクを作成する

#なぜバックアップディスクを作成するか？
(※今回は購入したPCに予めインストールされているOSがwindows10であることが前提)
購入したPCにインストールされているOS（windows10）から別のOS（Ubuntu）へ変更する場合、バックアップをとらずにインストールされているwindows10を削除してしまうと、元に戻すことができなくなってしまう。
ここでは、削除したwindows10を元に戻すことができるよう、インストールされているwindows10のバックアップディスクを作成する手順を記載する。

#1. バックアップディスクを保存する媒体を決める
USBメモリ、またはCD-R/DVD-Rが扱いやすい。ここではDVD-Rを使うことにする。

#2.システム修復ディスクの作成
１．コントロールパネル→「バックアップと復元 (Windows 7)」をクリック
２．左側のメニューから「システム修復ディスクの作成」をクリック
３．マルチドライブに用意したDVD-Rを差し込み「ディスクの作成」ボタンをクリック
４．「システム 修復ディスクが完成しました」と表示されたら、〔OK〕ボタンをクリック

以上
【Redux初心者向け】Redux、挫折しないで！

# はじめに
Reactがある程度分かっていたら、次に触れるのはReduxではないでしょうか。
Githubとかのサンプルプロジェクトを見てもReduxなしのReactはほとんどありません。

しかし、Reduxは難しい！！
その上、メリットはよく分からなかったので、挫折しそうになった時はありました。

なんとか乗り越えた(??)のでこれからReduxを勉強しようとする人に役に立てるかと思い、自分のためのメモにもなりますので、この記事を書きました。

Redux、挫折しないで！！

# 対象
Reactが一通り分かって、これからReduxを勉強しようとする人

# そもそもReduxって何？
とりあえず、データを管理するためのものだと、考えれば良いかと思います。

# なぜReduxは要るのか？
Reduxの公式サイトとか、参考資料とか見たら、色々メリットが書いてありますが、正直よく分からないし、Redux初心者だと、実感できるはずもありません。

難しい、しかも学ぶ意味があるのか分かりません。だから、挫折しやすいです。
が、Reactが一通り分かる段階でも、実感できるReduxの恩恵はあります。
それはコンポーネント間のデータやりとりです。

## Reduxなしの場合
ご存知の通り、Reactで唯一のデータの通信方法は親から子に渡すpropsです。
子から親に情報を送りたい場合、無理やり親から子にcallbackをprops経由で渡す、しかないです。

同じレベルのコンポーネントでデータを送る手段は、ありません。

例を見ましょう。

```javascript:fromParentToChildren

class Parent extends React.Component {
  constructor(props){
    this.state = {
      parentData : 1
    }
  }
  render() {
    return (
      <Children childrenData={this.state.parentData} >
    );
  }
}

class Children extends React.Component {
  render() {
    return (
      <div>{this.props.childrenData}</div>
    );
  }
}
```

```javascript:fromChildrenToParent

class Parent extends React.Component {
  constructor(props){
    this.state = {
      parentData : 1
    }
  }
  render() {
    return (
      <Children updateData={(data) => {this.setState({ parenData : data })}}/>
    );
  }
}

class Children extends React.Component {
  render() {
    return (
      <button onClick={() => this.props.updateData(3)}>Click to update data</button>
    );
  }
}
```

こんな感じでやり取りはできますが、想像してみてください。親子関係が複雑なアプリでしたら、どうなるのか。

例えば、C -> B -> A <- D <- E というコンポーネントツリーの場合、EからCにデータを送るために、E => D => A => B => Cという回り道になります。

話にならん！

# Reduxを使ったらどうなる？
Reduxを導入することによって、共通のStateがあり、やり取りしたいデータをそこに入れれば良いです。

例えば、C -> B -> A <- D <- E のコンポーネントツリーで、EからCにデータを送りたい場合、こんな感じでできます。
(Reduxとの接続は省略します)

```javascript:EComponent
class E extends React.Component {
  increment(){
    // 共有StateのcommonDataを操作
  }
  render() {
    return (
      <button onClick={this.increment}>Click to increment</button>
    );
  }
}
```

```javascript:CComponent
class C extends React.Component {
  render() {
    return (
      <div>{this.props.commonData}</div>
    );
  }
}
```

Eで操作したcommonDataと、Cに表示するcommonDataとは、同じものです。ということは、EからCに簡単にデータやり取りはできてしまうのです。

Redux、役に立っているでしょう(笑)。

システムが大きくなると、Reduxの有り難みをもっと実感できるはずです。

# 終わりに
Redux、役に立ちます。
難しいかもしれませんが、挫折はしないでください(笑)。
「Linux shell for iOS」iPhoneで動かすシェルが予想以上に面白かった

![linux.min_.png](https://qiita-image-store.s3.amazonaws.com/0/258841/e96abfdf-6964-3518-f2c1-c2b0a6920e24.png)

# 背景

iPadのターミナル用アプリを探していたらサーバへ接続しなくてもローカルで遊べるシェルをたまたま見つけました。(OSS)

実装自体はまだまだこれからだと思いますがとても期待です。
ディストリビューションはAlpine Linuxのようです。

もちろん実装はC言語

GitHubのURLは下記です。2017年ごろから開始しているプロジェクト
[tbodt/ish](https://github.com/tbodt/ish)

ちなみに個人的にターミナルアプリは下記が好き。

__Terminal for iOS___
[louisdh/openterm](https://github.com/louisdh/openterm)

# 必要なもの

* iOSが動く機器(iPhone6SとiPad Air2でやってみました)
* [TestFlight](https://developer.apple.com/testflight/)
* CLIのちょっとした知識

# 導入手順

* iPhoneにTestflightをインストール(AppStoreから出来ます)
* インストール後にiOS端末から下記URLへアクセス

https://testflight.apple.com/join/97i7KM8O

導入後は下記画面になるのでopenを選択すれば自動的にSHELLが起動します。

<img width="375" alt="B1E47F9B-0F76-47E5-A9B4-8A4DABADD9AC.png" src="https://qiita-image-store.s3.amazonaws.com/0/258841/822f9335-3352-852b-3dee-ba981018cae1.png">


# 実行

![81F09582-EF4E-4DD8-8275-8868E337E121.png](https://qiita-image-store.s3.amazonaws.com/0/258841/35351fba-c184-e1fa-d20d-954ef0e1fd64.png)


基本的なコマンドは一通りそろっているイメージ。もちろん`apk`でバリバリインストールできちゃいます。

```sh
iPhone:~# apk add vim 
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/...
...
```

# まとめ/感想

lsはもちろんvi等でドキュメント修正が出来ます。
Linuxの学習やちょっとした話題作り程度に面白そうでした。
alpineについての学習にもいいかもしれませんね。
RubyのHashをindex=1からeachしながらkey/valueに簡単にアクセスしたい

# Request
`Hash`をLoopさせるために`each`を使いたい
数のカウントをしたいので，`1`からIndexをカウントしたい
`key`, `value`に簡単にアクセスしたい

# Solution

```ruby:irb
hash = {
    "hoge" => "HOGE",
    "fuga" => "FUGA",
    "piyo" => "piyo",
}

hash.each.with_index(1) { |(key, value), index|
  puts "## key=#{key}, value=#{value}, index=#{index}"
}
```

```plaintext:output
## key=hoge, value=HOGE, index=1
## key=fuga, value=FUGA, index=2
## key=piyo, value=piyo, index=3
```

---///
【Angular7】Guard の返り値に UrlTree を指定する

# この記事は何？

Angular 7.1 から Guard の 返り値として UrlTree が指定できるようになりました。
このアップデートにより、Guard 内の記述が直感的になったので紹介したいと思います。

現在の最新版は `7.1.0-beta.2` ですが、自分が試す限りは不具合等なく快適に使用できるので時間がある方は是非リファクタしてみてください ( ´ ▽ ` )

# Before

サンプルコードは、ほとんどのアプリで使われていそうなログイン状態確認用 Guard にしたいと思います。
`/mypage` 的なパスへ設定して、ログインしていない場合はログインページへ遷移させる典型的なパターンで使います。

`canActivate` の返り値は `Observable<boolean> | Promise<boolean> | boolean` ですが、記述が冗長で読みづらいため使っている型のみ指定しています。

```typescript:auth.guard.ts
@Injectable()
export class AuthGUard implements CanActivate {
    constructor(private authService: AuthService, private router: Router) {}

    public canActivate(
        next: ActivatedRouteSnapshot,
        state: RouterStateSnapshot,
    ): boolean {
        if (this.authService.isSignIn()) {
            // 認証後専用ページへ遷移
            return true;
        }

        // ログインページへ遷移
        this.router.navigate(['auth/sign-in']);

        // ルーティング中止
        return false;
    }
}

```

なんというか、ルーティングの流れを一旦止めてるのに別軸で新たな流れを生み出して無理やり遷移している感じがちょっと気持ち悪いなぁと感じていました。

# After


```diff:auth.guard.ts
@Injectable()
export class AuthGUard implements CanActivate {
    constructor(private authService: AuthService, private router: Router) {}

    public canActivate(
        next: ActivatedRouteSnapshot,
        state: RouterStateSnapshot,
    ): boolean | UrlTree {
        if (this.authService.isSignIn()) {
　　　　　　　　　　　　　　　　　　　　　　　　// 認証後専用ページへ遷移
            return true;
        }

-        // ログインページへ遷移
-        this.router.navigate(['auth/sign-in']);
-
-        // ルーティング中止
-        return false;
+        // 現在のルーティングを中止し、ログインページへ遷移
+        return this.router.parseUrl('auth/sign-in');
    }
}

```

これぞ求めていたもの！って感じです。
非常に明快なコードになりました。

もちろん `Observable` や `Promise` 型でも OK なので、場合によって使い分けてください。

```typescript:can-activate.d.ts
export interface CanActivate {
    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree;
}
```

# おまけ

`skipLocationChange` 等のオプションを指定している場合は `createUrlTree` をご利用ください。
（というか、使う or 使わない の判断しなくて良いので全部こっちでいいかも、、、

```typescript
return this.router.createUrlTree(['auth', 'sign-in'], {
    skipLocationChange: true,
    queryParams: {
        [ReturnUrlParamName]: state.url,
    },
});
```
[Java 8]コーディングテストで使える標準入力をリストまたは配列に変換するまで


変換方法を早く知りたい方は、ページ最後の結論にどうぞ。

# 背景

前回の続きで、またコーディングテストネタです。
[[Java 8]コーディングテストで使えるアルファベット順、文字列長順のソート方法 - Qiita](https://qiita.com/riekure/items/79df368a4cbc6be1dda2)

当たり前ですが、コーディングテストでは「標準入力による値の取得」→「自分が処理しやすいように変換」→「なにかしらの計算処理」という流れが大半です。
「なにかしらの計算処理」に少しでも時間をかけるために、「標準入力による値の取得」と「自分が処理しやすいように変換」には時間をかけたくないものです。

今回は、タイトルの通り、標準入力をリストまたは配列に変換するまでの方法についてまとめます。

# 動作環境

- java 1.8.0_191

# 問題でよくある標準入力

問題でよくある標準入力は、下のようなイメージです。

```
1,あいうえお,かきくけこ
```

カンマ(,)区切りで文字を取得して、最初に入力された数字分だけ、後ろの文字を出力する的な問題だったとします。
上の例だと、最初の数字は1なので、出力は、

```
あいうえお
```

となるのが正解とします。

```
2,あいうえお,かきくけこ,さしすせそ
```

が標準入力の場合は、

```
あいうえお
かきくけこ
```

と出力されるのが正解とします。

このような場合、まず最初に文字列を読み込み、カンマ区切りでリストに格納したいと自分は思います。

# 標準入力の取得からListに変換するまで

まず、標準入力は下記のように取得します。


```java
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine();
```

Scannerによる取得方法をあるようのですが、自分はjava.io.BufferedReaderとjava.io.InputStreamReaderを使用するパターンを使用しています。
lineには、1行分の文字列が格納されています。

次に本題のカンマ(,)区切りでListに格納する処理をやってみます。

```java
List<String> list = Arrays.asList(line.split(","));
```

簡単ですが、これだけです。

splitは、文字列を指定された正規表現に一致する位置で分割するものです。
これの返り値は、String[]です。文字列型の配列です。
正規表現で分割するため、カンマ(,)以外でも分割することができます。
次に、配列をリストに変換するjava.util.Arrays.asListメソッドを使用するという処理になります。


下記のようにメソッドとして独立させるのもありかもしれません。

```java
/**
 * String→Listに変換
 * @param str 変換対象のString
 * @return 変換したList
 */
private static List<String> stringToList(String line) {
  return Arrays.asList(line.split(","));
}
```

## 問題でよくある標準入力の答え

自分が雑に考えた問題を解答すると、下のようなソースコードになります。
~~Listじゃなくて配列でいいじゃねーか！！とか
Listに変換する必要ないじゃねーか！！というツッコミはなしでお願いします………~~

```java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.List;


public class Main {
	public static void main(String[] args) throws IOException {
    try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
			String line = br.readLine();
			List<String> list = Arrays.asList(line.split(","));
			int cnt = Integer.parseInt(list.get(0));
			for (int i = 1; i <= cnt; i++) {
				System.out.println(list.get(i));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
```


# 結論

Listならば、

```java
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine();
List<String> list = Arrays.asList(line.split(","));
```

配列ならば、

```java
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine();
String[] strArray = line.split(",");
```
stateful firewall/stateless firewall

statefulではLAN側のfirewallに許可されてアクセスしたIPからの返信は、WAN側のfirewallにdenyされる設定でも通す。
WAN側の設定

```
1. 
FROM 127.x.x.x
TO *
PORT *
STATUS Allow

2.
FROM *
TO *
PORT *
STATUS Deny
```
弊ラボではPORT1194への外部からのアクセスのみVPN用に開けている。

firewallの設定は1.が最優先となり,2.,3.が次に続く。

googleだけアクセスしてはいけない場合のLAN設定

```
1. 
FROM 172.x.x.x
TO google.com
PORT *
STATUS Deny

2.
FROM 172.x.x.x
TO *
PORT *
STATUS Allow
```

key:　ホワイトリスト方式

OpenVPNには、
・ L2(tap)方式-> Bridge
ブリッジもインターフェースの一つなのでそこにIPを割り当てる。
そこからはLANインターフェースの口に繋ぐかOVPNインターフェースの口に繋ぐかなので一緒のネットワークに見える。
   
・ L3(tunnel)方式-> NAT
変換処理にはcpu使うので通信速度が遅め。

ルールを決めるのはルータに入っているOSでpfsenseはその一つ。
ルータはNICが二つ(WAN/LAN)があればいいのでPCにルータOSを組み込めばルータになる。