OmniAICreator/Qiita-1.07M huggingface dataset:
AAC NavigationでToolbarに `←` ボタンを付けたい/付けたくない時

### 簡単な説明

個人的備忘録メモです。
NavigationはToolbarの設定をサポートしており、NavGraghに設定したラベルを自動的に読んでタイトルに設定することができます。

NavigationでToolbarを設定した際、いわゆる戻る(`←`)ボタンは基本的に初めに表示するFragment(StartDestination)では表示されず、それ以外のDestinationでのみ表示されるようになります。
アプリ全体の統一感や、仕様として戻らせたくない場合のためにはそこをいじる必要性が出てくることもあります。
その解決として簡単な方法は、StartDestinationと判定するFragmentのリストをAppBarConfigurationに設定して渡してやることです。

#### 最初のFragmentから `←` をToolbarに出したい時

```kotlin

binding.toolbar.setupWithNavController(
    navController = findNavController(R.id.nav_host_fragment),
    configuration = AppBarConfiguration.Builder(setOf<Int>())
        .setFallbackOnNavigateUpListener { consume { onBackPressed() } }
        .build()
)
```
StartDestinationのSetを空Setで渡しています。ボタンを押した際の挙動も渡してやります。

#### 全てのFragmentで `←` をToolbarに出したくない時

```kotlin

val navController = findNavController(R.id.nav_host_fragment)
val idSet = setOf<Int>()
navController.graph.iterator().forEach { idSet.add(it.id) }
binding.toolbar.setupWithNavController(
    navController = navController,
    configuration = AppBarConfiguration.Builder(idSet)
        .build()
)
```
NavGraghに設定されてるFragmentのidを全てSetに入れて渡し、リスナーのセットは行いません。
何かしらの理由で前のFragmentに戻させたくないときはこうすると仕様を満たせます。
もっと良いやり方見つけたらまた別記事で書くかも…
【RPA】Automation Anywhere システム変数AAApplicationPath

#ファイルパスには必須、AAApplicationPath
今回はファイルパスを記述する際に必須なシステム変数、AAApplicationPathを取り上げます。



ファイルを呼び出す、ファイルに出力する時には必ずパスを指定します。
ただ、ファイルまでのパスはPCごとで違うことが多いです。



Automation AnywhereのMy DocsやMy Tasksにファイルやタスクを置いていても
そこまでのパスはPCごとで違います。



でも、開発PCと実際に運用するPCは違うのでどのPCでも通るパスを指定しなければなりません。







**そこで使うのがシステム変数AAApplicationPathです！**







AAApplicationPathは「C:\Users\ユーザー名\Automation Anywhere Files\～～～」のユーザー名を実行するPC応じて変えてくれます。




例としては、もしMy Docs内にsampleというエクセルファイルを置いているをします。

するとパスは
「C:\Users\ユーザー名\Documents\Automation Anywhere Files\Automation Anywhere\My Docs\sample.xlsx」
となります。


これをC:からAutomation Anywhere Filesまで削除し、F2キーでAAApplicationPathを呼び出し
「AAApplicationPath\Automation Anywhere\My Docs\sample.xlsx」
と指定します。

これで他のPCにもMy Docs内にファイルがあれば同じように呼び出せます。


今回は簡単な紹介で申し訳ないのですが以上です。最後まで読んでいただきありがとうございました！
AWS関連の参考URL

個人用のメモです。
僕が初学者なので、初学者の人が読んでわかるリンクを載せています。
日々更新します。
世の中に発信してくれている人達のおかげで僕もコツコツ作品作れます。
ありがとうございます。

- *【AWS】cliでEC2からRDSに接続する【postgresql】*

[https://qiita.com/fkana/items/a4b3c4d5d8ca27cd20ec](https://qiita.com/fkana/items/a4b3c4d5d8ca27cd20ec)

- *Amazon LinuxからPostgreSQL(RDS)へ接続する*

[https://qiita.com/panasan/items/634ad5ad895f0c9e5bd0](https://qiita.com/panasan/items/634ad5ad895f0c9e5bd0)

- *RDSにpingが通らない。*

公式HPにICMPは許可していないと記載がありました。
[https://aws.amazon.com/jp/premiumsupport/knowledge-center/rds-cannot-connect/](https://aws.amazon.com/jp/premiumsupport/knowledge-center/rds-cannot-connect/)

- *SCPを使ってローカルからAWS EC2サーバーへファイルをアップロードするメモ*

[https://qiita.com/Buddychen/items/51c23b105497f48e3da5](https://qiita.com/Buddychen/items/51c23b105497f48e3da5)

- windowsからEC2インスタンスにファイルをアップロード

[https://torutsume.net/aws-ec2_fileupload/](https://torutsume.net/aws-ec2_fileupload/)
Raspberry Piカメラモジュールで動画撮影・PCで見られるようにmp4に変換する方法

# Raspberry Piカメラモジュールで動画撮影
　この記事は[変デジ開発室の記事](http://hendigi.karaage.xyz/2016/11/auto-boot/)から移行したものです。

　Raspberry Piのカメラモジュールで動画撮影するには、以下のようなコマンドを入力します。`-t`の後の数字が動画の撮影時間で単位は`ms`です。以下だと10秒撮影します。

```sh
$ raspivid -o test.h264 -t 10000
```

 動画をRaspberry Pi上で再生したい場合は、以下コマンドで再生できます。

```sh
$ omxplayer test.h264 
```


## h264形式をmp4形式に動画変換
　h264形式の動画は、他のPCで見るには都合が悪いので、mp4に変換してやるのがよいです。Raspberry Piで変換してやるには、まず以下のコマンドででソフをトダウンロードしましょう。

```sh
$ sudo apt update
$ sudo apt install -y gpac
```

　インストールしたら、下記のコマンドで変換できます。

```sh
$ MP4Box -fps 30 -add test.h264 test.mp4
```

## 画像から動画ファイルを生成
　静止画像から動画を作ることもできます。一定時間間隔で撮影した連続写真を動画にするタイムラプス撮影に便利です。以下記事でタイムラプス動画作成していますので興味ある方は参照下さい。

[Raspberry Piで自動撮影してタイムスタンプ入りタイムラプス動画を生成する方法](http://karaage.hatenadiary.jp/entry/2016/05/17/073000)

## 参考サイト
- http://blog.livedoor.jp/victory7com/archives/28289703.html

## 関連記事
[Raspberry Piで作ったもの・やったことまとめ](https://karaage.hatenadiary.jp/entry/2015/09/10/073000)

## 変更履歴
- 2020/12/16 微修正
Canvasの面積が広すぎてiPhoneのSafariだけ表示できなかった


# iPhoneのSafariだけ `canvas` が表示できなかった
開発中のWebサイトをiPhoneのSafariで確認したところ、 `canvas` の部分が正常に表示されていませんでした。

WindowsやMacのブラウザでは正常に表示されます。

実機デバッグで確認したところ、コンソールに以下のエラーが表示されていました。

<img width="413" alt="スクリーンショット 2019-09-25 14.48.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/e3995e8b-e070-ff1b-bc7a-7e32e70ce031.png">

```
Canvas area exceeds the maximum limit (width * height > 16777216).
```

Canvasの面積が最大限度を超えているようです。

ちなみに、MacとiPhoneを接続すれば、iPhoneのSafariのコンソールを見ることができます。
詳細は以下の記事にまとめました。
[iPhoneのSafariで表示しているページをMacのSafariでデバッグする](https://qiita.com/segur/items/b43dd11bfea97d4d1b63)



# `canvas` の面積が広すぎて表示できなかった。

PCのブラウザで `canvas` の面積を計算したところ、

- width: 9,931
- height: 1,760

であり、 width * height = 17,478,560‬ となり、見事に 16,777,216 をオーバーしていましたw

スクロールする前提で、広い `canvas` を用意していたのですが、そういった使い方はダメだったようです。

width, heightの値を小さくしたところ、ちゃんとiPhoneのSafariでも表示されました。



# さいごに
何事にも限度というものがありますね！
Deep Learning用 自作PC

Deep Learningや機械学習用に自作PCを組み立ててみました。それなりの性能を出せる前提とし、できる限りコストを抑え、12万円前後で組み立てられました。
初期不良もなく、４ヶ月ほど問題なく稼働しています。もう一台組み立てたいと思い購入部品だけメモとして残してみました。

- ディスプレイ、キーボード、マウス、OSのコストは含まれていないです。
- Ubuntu 16.04 LTS、Windows10 動作確認済みです。

|  |  |金額  |
|---|---|---|
|CPU  |[Intel CPU Core i7-8700 3.2GHz](https://www.amazon.co.jp/%E3%82%A4%E3%83%B3%E3%83%86%E3%83%AB-i7-8700-12M%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5-LGA1151-BX80684I78700/dp/B07598HLB4)  |42,000  |
|  |[CPUグリース 絶縁タイプ](https://www.amazon.co.jp/CPU%E3%82%B0%E3%83%AA%E3%83%BC%E3%82%B9-MX-4-%E7%86%B1%E4%BC%9D%E5%B0%8E%E6%80%A7%E3%81%AB%E5%84%AA%E3%82%8C%E3%81%9F%E3%82%B7%E3%83%AA%E3%82%B3%E3%83%B3%E3%82%B0%E3%83%AA%E3%82%B9-%E7%B5%B6%E7%B8%81%E3%82%BF%E3%82%A4%E3%83%97-%E6%8C%87%E3%82%B5%E3%83%83%E3%82%AF%E4%BB%98%E3%81%8D/dp/B01M7VD449/ref=sr_1_1_sspa?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=9LQS0G0HQ139&keywords=cpu+%E3%82%B0%E3%83%AA%E3%82%B9&qid=1569421766&s=computers&sprefix=cpu+%2Ccomputers%2C268&sr=1-1-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUFRR0JWVVowNkFaN08mZW5jcnlwdGVkSWQ9QTA0NDUwMTczUFVTUjNOWFBBV1MyJmVuY3J5cHRlZEFkSWQ9QTExNEVPTEVGQlZSN0wmd2lkZ2V0TmFtZT1zcF9hdGYmYWN0aW9uPWNsaWNrUmVkaXJlY3QmZG9Ob3RMb2dDbGljaz10cnVl) |1,000  |
|  |[トップフロータイプCPUクーラー 超天 ](https://www.amazon.co.jp/サイズ-オリジナル設計-トップフロータイプCPUクーラー-CHOTEN-虎徹のトップフロー版コンセプト/dp/B07BGTC77R)  |3,500  |
|GPU |[玄人志向 NVIDIA GeForce GTX 1660 6GB ](https://www.amazon.co.jp/%E7%8E%84%E4%BA%BA%E5%BF%97%E5%90%91-%E3%83%87%E3%83%A5%E3%82%A2%E3%83%AB%E3%83%95%E3%82%A1%E3%83%B3%E3%83%A2%E3%83%87%E3%83%AB-GF-GTX1660-E6GB-OC-DF/dp/B07PM52WPH)  |30,000  |
|マザーボード  |[ASUS Intel H370 マザーボード LGA1151対応](https://www.amazon.co.jp/H370%E6%90%AD%E8%BC%89-LGA1151%E5%AF%BE%E5%BF%9C-TUF-H370-PRO-WI-FI/dp/B07BP9QHF1)  |13,000  |
|メモリ(16GB)  |[デスクトップPC用 メモリ DDR4-2666 16GB](https://www.amazon.co.jp/%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97PC%E7%94%A8-PC4-21300-DDR4-2666-16GB%C3%971%E6%9E%9A-D4U2666PS-16GC19/dp/B07JJ5FZM2)  |8,500  |
|SSD(256GB)  |[Intel SSD 760p M.2 PCIEx4 256GB](https://www.amazon.co.jp/Intel-760p-PCIEx4-256GB%E3%83%A2%E3%83%87%E3%83%AB-SSDPEKKW256G8XT/dp/B078VBL3T9)  |6,000  |
|電源  |[玄人志向 電源 KRPW-BKシリーズ 750W](https://www.amazon.co.jp/%E7%8E%84%E4%BA%BA%E5%BF%97%E5%90%91-KRPW-BK%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-80PLUS-KRPW-BK750W-85/dp/B078HFLJ4C)  |7,000  |
|PCケース  |[Versa H26 ミドルタワー型PCケース](https://www.amazon.co.jp/Thermaltake-casefan-%E3%83%9F%E3%83%89%E3%83%AB%E3%82%BF%E3%83%AF%E3%83%BC%E5%9E%8BPC%E3%82%B1%E3%83%BC%E3%82%B9-%E3%83%96%E3%83%A9%E3%83%83%E3%82%AF%E3%83%A2%E3%83%87%E3%83%AB-CA-1J5-00M1WN-01/dp/B076H2CHN3)  |5,000  |

GPUも2台接続できる構成です。電力が心配です。。。。
UE4でキャラクターがマウスポインタの方を向く機能を作る

#初めに
今回初めて株式会社ヒストリア様主催の「[第12回UE4ぷちコン](http://historia.co.jp/ue4petitcon12)」にゲームを応募しました。
残念ながらUnrealFestでの展示にはなりませんでしたが、その中からタイトルにもある通りキャラクターがマウスポインタの方を向く機能(マインクラフトのインベントリとか？)について紹介したいと思います。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">タイトル画面が完成！<br>寝てるグレイちゃんを起こして戯れる機能をなんとなく実装したけど、これが思いのほか楽しいw<a href="https://twitter.com/hashtag/UE4?src=hash&amp;ref_src=twsrc%5Etfw">#UE4</a> <a href="https://t.co/iG83uVzCjz">pic.twitter.com/iG83uVzCjz</a></p>&mdash; Naotsun@C++&amp;UE4勉強中 (@Naotsun_UE) <a href="https://twitter.com/Naotsun_UE/status/1166024066546814976?ref_src=twsrc%5Etfw">August 26, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#どんな機能を使うのか
まず、この機能を作るのに大まかに２つのUE4の機能を使います。
１つ目はアニメーションブループリントの「Look At」ノードです。こちらについてはalweiさんが詳しく解説されているのでこちらの記事を見て頂ければと思います。
>[UE4 LookAt機能を使ってGrayちゃんに見つめてもらってみる](http://unrealengine.hatenablog.com/entry/2017/06/05/220000)

2つ目はPlayerControllerクラスの「ConvertMouseLocationToWorldSpace」関数です。
この記事ではこの関数についてとそれを用いた実装について紹介します。

#ConvertMouseLocationToWorldSpace関数について
>[公式ドキュメント(英語)](https://docs.unrealengine.com/en-US/BlueprintAPI/Game/Player/ConvertMouseLocationToWorldSpace/index.html)

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325493/f61f8634-f859-809b-13aa-fb6259c76e93.png)
この関数はマウスの座標(ScreenPosition)からWorldSpaceの座標を取得する関数です。また、PlayerControllerクラスのメンバ関数なので当然引数にPlayerControllerクラスが必要です。
それではそれぞれの戻り値について見ていきます。World LocationとWorld Directionについては公式のドキュメントに何も書いていなかったので私調べになります。

- World Location (Vector)  : 現在有効になっているカメラのワールド座標
- World Direction (Vector) : 現在有効になっているカメラの前方の向き
- Return Value (Bool)      : 正常に変換が行えたかの真偽値 (おそらく画面外にマウスポインタが居たりするとfalseになったりするのかも...？)

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325493/671dffb7-c8ce-8610-1aaa-0cdba165ab12.png)
ライントレースで調べてみるとスクリーンからまっすぐ伸びるわけではなくコーン状に広がっていくのでWorld Directionは画面の真ん中が真正面で端に行くほど傾くようになっているのだと思います。

ざっくりまとめると現在有効なカメラの位置とForwardVectorが取得できると考えてもいいのではないでしょうか。

#作ってみる
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325493/bbc3b468-75bc-b654-95c9-a9fe929abf4b.png)
簡略化するために今回はアニメーションブループリントに実装します。キャラクターのクラスのTickイベントでも問題ありません。
LookAtLocation変数(Vector)にカメラの位置から正面に300cm進んだ点の座標を格納しています。今回は300にしましたが、カメラとキャラクターの位置で丁度いい値がことなるので調整してみてください。ライントレースなどと同じ要領です。
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325493/e9faa0a2-ef8f-db39-e990-2045c281739e.png)
見る方向は求められたので、あとはLookAtノードの引数に渡すだけです。

#おまけ
初めにの参考動画ではグレイちゃんをクリックで起こして、その後マウスポインタを見るようになっています。WorldSpaceに配置されたアクタをマウスでクリックしたか判定する関数もありましたのであわせてご紹介しておきます。
![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325493/b4727093-eb42-3dbb-bc16-20c59eeec171.png)
またまたPlayerControllerクラスの「GetHitResultUnderCursorForObjects」関数を使います。
こちらはLineTraceForObject関数などと同じで判定するObjectTypeを配列で指定してトレースし、HitResultのHitActorで当たったオブジェクトを取得できます。

#最後に
今回ご紹介した「ConvertMouseLocationToWorldSpace」関数と「GetHitResultUnderCursorForObjects」関数は見つけた時にこんな関数もあるのか～と驚かされましたw
また、おまけで紹介した「GetHitResultUnderCursorForObjects」関数がライントレースなどと同じような処理をしてる場合どのくらい遠くまでトレースしてるのかが気になりました。内部実装を確認していないので違う方法で実装されているかもしれませんが...
【Vim】todo.txtをはじめて使ってみた。

## フォーマット

```plaintext:todo.txt
1 2-- 3--add---- 4-complate 5-----------
x (a) YYYY-MM-DD YYYY-MM-DD TODO DESCRIPTION
o (e) YYYY-MM-DD YYYY-MM-DD TODO DESCRIPTION
```

## 使い方
todo.txtというテキストファイルを作ります。
上記のフォーマットでタスクを管理するだけ！

## 説明
・私はVimを使っていて相性が良いと思います（起動の速さ、dd→pでのタスク移動...）
・本来のフォーマットではaddとかcomplateという文字は書いていない。

```
1・・・完了済かどうか。完了済みなら小文字のx。未完なら小文字のo。
2・・・優先度。アルファベットの順番が若い方が優先度が高い。
3・・・追加日。予定を追加した日ですね。
4・・・完了予定日です。
5・・・タスクの名称。
```

## タスクを可視化する過程でも使える。
とりあえず大きなタスクでタスクを書いてしまう。
分解が必要なら分解する。
ということ使い方をすると、ハードル低く書き出せて、
タスクの明確化にも一躍買ってくれるので、非常に気に入っています。
複数のRaspberry Pi同士でファイルを送受信する方法

# Raspberry Pi同士でファイルの送受信
　この記事は[変デジ開発室の記事](http://hendigi.karaage.xyz/2016/11/auto-boot/)から移行したものです。

　複数のRaspberry Pi同士でファイルを送受信したくなるようなプログラムを作りたくなるときありますよね？そんなとき1からソフトをつくると大変ですが、Raspberry PiはLinuxなのでLinuxで使われている仕組みを使えば簡単にソフトをやりとりすることができます。

　今回は、簡単な例として2台のRaspberry Piでファイルの送受信を行う方法について説明します。これを応用すればRaspberry PiとPC、3台以上のRaspberry Piでのファイル送受信もできるようになります。

## セットアップ
　2台のRaspberry Piを同一ネットワーク上に配置します。Raspberry Piに関しては、以下などを参考に基本的なセットアップはすましておきましょう。

[Raspberry Pi 3にRaspbian Stretch/Jessieをセットアップする方法](https://karaage.hatenadiary.jp/entry/2016/04/03/080000)


　ここでは仮にそれぞれのhostnameを `karaage00` `karaage01`という名前にしたとして説明します。同一ネットワーク上にいるPCから接続確認しましょう。例えばLinuxかMacだったら、以下コマンドで確認できます。

```sh
$ ping karaage00.local
$ ping karaage01.local
```

## vsftpdセットアップ
　ファイルのやりとりはftpという仕組みを使用します。まずは1台のRaspberry Piに`vsftpd`というソフトを以下コマンドでインストールします。

```sh
$ sudo apt-get install -y vsftpd
```

　ただ、このままではファイルをvsftpdが入ったRaspberry Piからダウンロードはできるのですが、アップロードできないので、以下コマンドで`/etc/vsftpd.conf`を編集します。

```sh
$ sudo vim /etc/vsftpd.conf
```

　以下のように変更します。

```
#write_enable=YES
を以下に変更
write_enable=YES
```
　設定を有効にするためにvsftpdを以下コマンドで再起動します。

```sh
$ sudo systemctl restart vsftpd.service
```

　ここでは`vsftpd`がインストールされたRaspberry Piを`karaage00`、もう一台を`karaage01`とします。

## ファイル送受信確認
### ダウンロード
　あらかじめ`karaage00`の ホームディレクトリ直下(/home/pi)に`test.jpg`というファイルを置いておきます。

　`karaage01`の方に`download.sh`というファイルを以下コマンドで作成します。

```sh
$ vim download.sh
```

 `download.sh`の中身は以下をコピペしてください。

```sh
#!/bin/bash

ftp -n karaage00.local << _EOD
user pi raspberry
passive
binary
get test.jpg
bye
_EOD
```

　あとは、以下で実行権限を設定します。

```sh
$ chmod 755 download.sh
```

　以下コマンドを実行すると、`karaage00`の`test.jpg`が`karaage01`にコピーされます。

```sh
./download.sh
```

### アップロード
　逆に`karaage00`にファイルを送信したい場合は、`karaage01`のホームディレクトリ直下にテスト用の`test2.jpg`というファイルを用意して、`download.sh`というファイルの代わりに以下のような`upload.sh`というファイルを用意して、同じ要領で送信してやればOKです。

```sh
#!/bin/bash

ftp -n karaage01.local << _EOD
user pi raspberry
passive
binary
put test2.jpg
bye
_EOD
```

　簡単ですね。

# 関連記事
[Raspberry Piで作ったもの・やったことまとめ](https://karaage.hatenadiary.jp/entry/2015/09/10/073000)

[Raspberry PiとArduino間でUSB経由のシリアル通信](https://karaage.hatenadiary.jp/entry/2015/06/10/080000)
apacheのログに変な攻撃がありました。

#今日のエピソード

最近Raspberry　PI環境で作ってたものをFlat環境に移行中ですが、
なぜかApacheのログに変なIPからURLをアクセスする
履歴が多かったので、ここに記載したいと思います。

>Apacheのログを確認

下記のパスに移動してログファイルの一覧を確認です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/6675c49c-e335-fe43-0bf4-32fcbc6bef70.png)

次はerror.logから中身を見てみます。
ランダムでURLをアクセスを試しているようですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/e8216d64-34b0-a781-4d95-dc75fdb17e76.png)

>IPアドレスの接続先を調べる

今回は「219.85.145.106」このIPについて調べてみます。
まず下記のURLにアクセスします。

■IP情報確認
https://www.cman.jp/network/support/ip.html

下記の画面通りに入力してから検索ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/653eacb6-da6f-02eb-243e-f9142c528084.png)

IPアドレス情報が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/82d63356-6932-8e24-bb9c-00c4b08dc316.png)

次はIPアドレスの管理している機関の情報ですかね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/bfc205dc-875d-35c4-1fe5-cfc6de40a690.png)

＞IPアドレスの住所を調べる

■IPアドレスから住所に変換を確認
http://keiromichi.com/index.php

下記の通りにIPアドレスを入れて検索すると住所は左側にグーグルマップの表示は右側に表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/7d4293fe-49e2-e919-0f8a-bf6b0e50a3ef.png)

>緯度と経度で住所を調べる

■緯度と経度で住所検索
https://www.wellhat.co.jp/tools/googlemap.html

下記の通りに緯度と経度を入力してから検索すると住所が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/f6a4dd38-b900-644c-aba1-2fb7c5867992.png)

下記は該当する住所をグーグルマップに表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/d1d6a722-8912-a7be-dc0c-9c7e8c35076e.png)

>結論

外部からサーバにアクセスしたログも確認する必要もあるかと思います。
可能であれば外部に８０ポート以外は公開しない方がいいでしょう。
以前外部からアクセスしたログに”Not Found"の文字列があるIPアドレスを拒否するPythonロジックも作ったことがありましたが、
たくさんのIPを拒否するとサーバが遅くなった思いがありましたので、やめました。
今日はIPアドレスから住所を調べたり、緯度と経度で住所を調べる方法もわかるようになりましたね。W
Java基礎学習内容4（繰り返し）

# while(do while)
条件式がtrueの場合処理を繰り返す。

```java:while
// while
while(flag){
  // 処理
}

// do while
do {
  // 処理
} while(flag);

```

# for
初期化、繰り返し条件、カウンタ変数の更新を設定して繰り返し処理を行う。

```java:for
for(int counter = 0;counter < 5;counter++){
  // 処理
}
```

また、Collectionの各要素に対して繰り返し処理を行う拡張for文もある。

```java:拡張for
for(String str : strList){
  // 処理
}
```

# break
breakを用いることで繰り返し処理から抜けることが出来る。
また、ラベルを併用することで入れ子の繰り返し処理から抜けることも可能。

```java:break
while(true){
  ...
  break;
}

label:
while(true){
  while(true){
    ...
    break label;
  }
}
```

# continue
continueを用いることで繰り返し処理内の後続処理をスキップし、次の要素から処理を行うことが出来る。

```java:continue
while(true){
  ...
  continue;
  ... // 後続処理がスキップされる

}
```
AWS上で将棋ソフトを動かしてみた

# はじめに
AWSで何かやろうと思い、自分にとって身近なところで将棋ソフトをAWS上で実行して、棋譜解析なんかに使ってみようと思い、ちょっとやってみました。

# 手順
言いつつ、やり方はこちらの記事がすごく丁寧だったので、基本的にはそのまま実行してできました。

[将棋ソフトをAWSで動かす方法を解説！！ノートPCでも毎秒2000万局面の検討が可能に！！](https://www.mikunimaru.com/entry/ShogiAWS)

※直近でソフトのエンジンも更新されていたので、AMIイメージはこちらを採用
https://www.mikunimaru.com/entry/AWSUpdate
＞computer-shogi-2019-06-09-Kristallweizen_Suishou-kai – ami-0e1358d31fbda75c8

ただ、「記事の通り手順を実行しました」ではあまりにもあんまりなので、インスタンスのテンプレートを作り、AWS CLIからコマンド一つでインスタンスの作成から起動までできるようにしました。
（諸々の手順はリンク先の方を見てもらうとして、以下は自分でやったテンプレート作成と起動について記載）

# テンプレート作成手順
1.AWSマネジメントコンソールから、「サービス」＞「EC2」を選択
2.左側の「起動テンプレート」を選択し、「起動テンプレート作成」を押下

今回指定した項目は下記の通り。
（基本的には、記事の中で手作業で作成したインスタンス通りに設定）

|項目名|記載内容|
|:--|:--|
|起動テンプレート名|任意の（わかりやすい）名前|
|テンプレートバージョンの説明|任意で記載|
|AMI ID|提供されている将棋AMI *1|
|インスタンスタイプ|c5.2xlarge *2|
|キーペア名|事前に作成済みのキーを指定 *3|
|起動テンプレートのセキュリティグループ|SSHでのインバウンド接続が許可されたグループを指定|

■高度な設定（購入のオプション）

|項目名|記載内容|
|:--|:--|
|スポットインスタンスのリクエスト|チェックを入れる|
|スポットパラメータのカスタマイズ|最高価格を指定(任意)|

*1 IDは検索から選択
*2 c5系から任意で選択。スペックを気にしなければ未指定でも
*3 自端末からSSHで接続するので、作成済みのキーを使う方が諸々のセットアップが楽

# テンプレートからインスタンスを起動
別にコンソールからやっても良かったのですが、せっかくなのでコマンドでできるように。

    aws ec2 run-instances --launch-template LaunchTemplateId=<Template_ID>

最後に「,version=xx」を付けると任意のテンプレートバージョンを指定できますが、省略するとデフォルト（最新）で起動してくるようです。

※参考
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-launch-templates.html
その他まとめ

## 色々

* [OWASP ZAPの初期導入手順（ルート証明書の追加手順もあるよ）](https://qiita.com/k_hoso/items/20eba04c6ef8085de4f3)
* [Luhnアルゴリズム（ルーンアルゴリズム）のチェックディジットの部分を算出する](https://qiita.com/k_hoso/items/07b4dae1c694e739aefa)
[Dockerfileを作る]alpine3.7をベースにtomcatコンテナの作成

# Dockerfileサンプル
## alpine3.7をベースにtomcatを乗せたコンテナ
JDBCドライバはお好みで。
TomcatバージョンはENVで変更可能

```dockerfile
FROM alpine:3.7

ENV TOMCAT_MAJOR=9 \
    TOMCAT_VERSION=9.0.24 \
    TOMCAT_HOME=/opt/tomcat \
    CATALINA_HOME=/opt/tomcat \
    CATALINA_OUT=/dev/null 
 #   MYSQL_JDBC_VERSION=5.1.39 \
 #   POSTGRESQL_JDBC_VERSION=9.4.1207

RUN mkdir -p /opt && \
    apk update  --update-cache && \
    apk upgrade --update-cache && \
    apk add --update openjdk8-jre curl && \
    curl -jksSL -o /tmp/apache-tomcat.tar.gz http://archive.apache.org/dist/tomcat/tomcat-${TOMCAT_MAJOR}/v${TOMCAT_VERSION}/bin/apache-tomcat-${TOMCAT_VERSION}.tar.gz && \
    tar -C /opt -xvzf /tmp/apache-tomcat.tar.gz && \
    ln -s /opt/apache-tomcat-${TOMCAT_VERSION} ${TOMCAT_HOME} && \
    rm -rf ${TOMCAT_HOME}/webapps/* && \
 #   curl -jksSL -o /tmp/mysql-connector-java.tar.gz http://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-${MYSQL_JDBC_VERSION}.tar.gz && \
 #   tar -C /tmp -xvzf /tmp/mysql-connector-java.tar.gz && \
 #   cp /tmp/mysql-connector-java-${MYSQL_JDBC_VERSION}/mysql-connector-java-${MYSQL_JDBC_VERSION}-bin.jar /opt/tomcat/lib/ && \
 #   curl -jksSL -o /opt/tomcat/lib/postgresql-${POSTGRESQL_JDBC_VERSION}.jar http://jdbc.postgresql.org/download/postgresql-${POSTGRESQL_JDBC_VERSION}.jar && \
    apk del curl && \
    rm -rf /tmp/* /var/cache/apk/*



EXPOSE 8080
ENTRYPOINT [ "/opt/tomcat/bin/catalina.sh", "run" ]
```
初心者によるプログラミング学習ログ 110日目

#100日チャレンジの110日目

Twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

110日目は、

* 試したいことがあって、あまりプログラミングできず。
* UdemyでWebデザインを実施しました。
* 架空のwebサイトのサイドバー作成。



##Webデザインで架空サイト作成中

Udemyの教材みながらなのですが、少しずつphotoshopの操作を覚えてきたような感じです。

自分的に課題としては、photoshopのショートカットキーをもう少し使いこなしたいです。
とりあえず、最近よく使っているのが、

* ズームツール・・・Zキー
* 移動ツール・・・Vキー
* 保存・・・Ctrl+Sキー
* レイヤーをグループ化・・・Ctrl+Gキー
* コピー・・・Ctrl+Cキー
* ペースト・・・Ctrl+Vキー


このあたり。
Ctrlとシフトをよく間違えるし、まだまだショートカットキーは多いので操作しながら覚えていきます。
Luhnアルゴリズム（ルーンアルゴリズム）のチェックディジットの部分を算出する

## 概要

Luhnアルゴリズム（ルーンアルゴリズム）のチェックディジットの部分を算出する。
※確認したのは15桁の数値に対してのみ。

15桁の数字が、
`846087729128569` の場合、`7` がチェックディジットになる。
`545762389823411` の場合、`3` がチェックディジットになる。

## 実装

パワープレイしてるところあるけど気にしない方向で。。
色んな言語に移植しやすいはず、逆にね、、

```php:php
/*
 * 15桁の数値に対して、チェックディジットとして付与するべき数字を算出する。
 * ※15桁じゃなくても多分大丈夫だけど、15桁以外は試してない
 */
function gen_checkdigit($num)
{

    // ルーン・アルゴリズムの参考サイト
    // https://www.gizmodo.jp/2013/07/post_12829.html
    // https://qiita.com/yossyyossy/items/41369a37ba05dccf53a9

    // チェックディジットを計算するために15桁を16桁に上げる
    // ※1桁目が0になるようにする（1桁目をxにする）ために10を掛ける
    // ※感覚としては、15桁の数字が 846087729128569　の場合、 846087729128569X という状態にする。
    $num = $num * 10;

    // 数値を文字配列へ変換する。
    // 数値が 8460877291285690 の場合、
    // 先頭（8）が$num_array[0]で、最後（0）が$num_array[15]
    $num_array = str_split($num);

    $kisu = 0;
    // 奇数桁の計算。奇数桁の和を求める。
    // この時点では1桁目（チェックディジット）は必ず0で、処理の最後にチェックディジットとして正しい数値を出す。
    for ($idx = 1; $idx < sizeof($num_array); $idx += 2) {
        $kisu += $num_array[$idx];
    }

    $gusu = 0;
    // 偶数桁の計算。
    // 偶数桁は2倍にする。ただし、2倍して2桁になる数字は1桁目と2桁目の和を使う。
    for ($idx = 0; $idx < sizeof($num_array); $idx += 2) {

        // 5*2 は 10 なので 1(1+0) を足す
        // 6*2 は 12 なので 3(1+2) を足す
        // 7*2 は 14 なので 5(1+4) を足す
        // 8*2 は 16 なので 7(1+6) を足す
        // 9*2 は 18 なので 9(1+8) を足す
        // 2倍にして2桁にならない数は2倍した数値を足す
        if ($num_array[$idx] == 5) {
            $gusu += 1;
        } else if ($num_array[$idx] == 6) {
            $gusu += 3;
        } else if ($num_array[$idx] == 7) {
            $gusu += 5;
        } else if ($num_array[$idx] == 8) {
            $gusu += 7;
        } else if ($num_array[$idx] == 9) {
            $gusu += 9;
        } else {
            $gusu += $num_array[$idx] * 2;
        }
    }

    // 上でやっている (奇数桁の和＋偶数桁の和) % 10 が 0 となる場合、正しい番号となる。
    // ※この時点では1桁目が 0 で固定なので、ほぼ正しくない番号
    // (奇数桁の和＋偶数桁の和)+ X(1桁目)) % 10 が 0 となる X を求めると、
    // X がチェックディジットとして、1桁目に付与する数値となる。
    $_ = $kisu + $gusu;
    $digit = 0;
    while (true) {
        // 10で割り切れた時、breakする
        if (($_ + $digit) % 10 == 0) {
            break;
        } else {
            // 10で割り切れるまで、カウントアップし続ける
            $digit++;
        }
    }

    return $digit;
}
```

## 参考サイト


* [クレジットカード番号ってどうやって決まるの？](https://www.gizmodo.jp/2013/07/post_12829.html)
* [クレジットカードのチェックディジットをrubyで作る](https://qiita.com/yossyyossy/items/41369a37ba05dccf53a9)
初めて使う Mac にとりあえず Haskell を動かせる環境を構築してみた

# この記事の目的
- とりあえず、Mac はあまり使ったことがないしターミナルのコマンドもよくわからん、でもとりあえず Haskell 書いてみたい、でもでも入門以前に環境構築でつまづきそう、という、いるのかいないのかわからない読者層をターゲッティングしながら、いずれにしてもあまり難しく考えずやりたいことを短時間でやれるようにこの記事を書きました。（自分の備忘でもあります）
- この記事は「[参考ページ](#参考ページ)」に示した超有用な記事を超絶大幅に参考にさせていただいております（むしろ、これらの記事を見ながら行った作業の実施記録と言っても過言ではありません）。

# 背景
- 今までは Windows で ghci を使っていた
- 会社から Mac が支給されたので、とりあえず Mac でも Haskell を書いてみたい
- なにもわからない

# 環境
- OS: macOS Mojave バージョン10.14.5
- MacBook Pro (Retina, 15-inch, Mid 2015)

# Stack というもの
- Haskell を書くのに便利な Stack というツールがあるらしい
- とりあえずインストールしてみる

### インストール
```bash
$ curl -sSL https://get.haskellstack.org/ | sh
```
### パスを通す
```bash
$ export PATH=~/.local/bin:$PATH
$ echo 'export PATH=~/.local/bin:$PATH' >> ~/.bashrc
```
- 参考にしたサイトに書いてあるとおり、ここで $ stack update をしておく。  
 
```bash
$ stack update
```
```bash
$ stack --version
Version 2.1.3, Git revision 0fa51b9925decd937e4a993ad90cb686f88fa282 (7739 commits) x86_64 hpack-0.31.2
```
- インストール完了！（これでうまくいってるのか、次に Hello World するまでは半信半疑だった。。）

# Hello World してみる

### プロジェクトを作ってみる

```bash
stack new my-project
cd my-project
stack setup
stack build
```
- ふーんという感じ。よくわからないが進めていく。
- app/Main.hs を見てみると

```haskell:app/Main.hs
module Main where

import Lib

main :: IO ()
main = someFunc
```

- someFunc ってなんだ？
- つづいて src/Lib.hs を見てみる。

```haskell:src/Lib.hs
module Lib
    ( someFunc
    ) where

someFunc :: IO ()
someFunc = putStrLn "someFunc"
```

- これがメインの処理らしい。
- "someFunc" を書き換えてみれば Hello world できそう。

```haskell:src/Lib.hs（書き換え後）
module Lib
    ( someFunc
    ) where

someFunc :: IO ()
someFunc = putStrLn "Hello Haskell World!"
```

### 実行してみる

```bash:my-projectディレクトリ内にて
$ stack runghc app/Main.hs
```

## エラー発生
```bash
app/Main.hs:3:1: error:
    Ambiguous module name ‘Lib’:
      it was found in multiple packages:
      libiserv-8.6.3 my-project-0.1.0.0
  |
3 | import Lib
  | ^^^^^^^^^^
```
<font color='red'>エラー発生！！</font>
Lib というモジュールが複数のパッケージにあるらしい。

## 解決策
- 調べたところ、 `runghc` するときに `--isrc`オプションを付ければいいらしい。

```bash:my-project内で
stack runghc -- -isrc app/Main.hs
```

## 結果
```bash
Hello Haskell World!
```

# 参考ページ
以下の超有用ページたちが超ヘルプフルでしたので、詳細は以下をご覧ください。
- [本気で Haskell したい人向けの Stack チュートリアル](https://qiita.com/waddlaw/items/49874f4cf9b680e4b015)
- [Stack を使って Haskell の Hello World をやってみる](https://ku00.hatenablog.com/entry/2016/09/15/141151)
- [How to import adjacent module when running .hs file as script](https://stackoverflow.com/questions/56105510/how-to-import-adjacent-module-when-running-hs-file-as-script)
iOS13のCoreNFCを使ってみた。

##CoreNFCって？
iOS11とiPhone7以降の端末でNFCタグを読み込むことはできるようになりました。でも、扱えたのはシールなんかでよくあるNFCタグの読み取りだけで、みんなが使いたいICカードはダメだったんですね。
しかし2019年のiOS13では（まだ一部の制限はあるとはいえ）ICカードも読み書きできるようになったんです。その機能をアプリ開発者に公開しているインターフェイスがCoreNFCです。
iOS13とXcode11の正式版が公開されたので、ちょっと使ってみました。
##開発環境
そしてその機能使うには
・iPhoneとしてはiPhone7以降
・開発環境としてはXcode11
が必要になります。
もちろん、シミュレータでは動作しません。
##準備
Xcode11のプロジェクト設定の「Signing & Capabilities」->「＋Capability」ボタンを押します。（グレーっぽい色なのでDisable状態かと思いきや押せます。）
![Screen Shot 2019-09-25 at 18.22.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369600/34019fa2-adc5-40a6-c665-a4a96fde7cc1.png)


そして「Near Field Communication Tag Reading」をダブルクリックして追加します。
![Screen Shot 2019-09-25 at 18.23.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369600/0fca9856-efe3-4c51-afed-23c68b69e713.png)

##実装
まずはライブラリを読み込みます。

```swift
import CoreNFC
```

実装するクラスにCoreNFCのリード用デリゲート`NFCTagReaderSessionDelegate`を追加します。
メソッドは３つですので、全て実装しましょう。

```swift
func tagReaderSessionDidBecomeActive(_ session: NFCTagReaderSession) {
}
func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) {
}
func tagReaderSession(_ session: NFCTagReaderSession, didInvalidateWithError error: Error) {
}
```

次にNFCを読み込むセッションのオブジェクトを生成します。
この時、読み込むNFCカードがType A/BかType Fかで引数が変わります。とは言え、ヘッダに情報が記載されているので迷うことはないですね。
Type A/B
 
```swift
let session = NFCTagReaderSession(pollingOption: .iso14443, delegate: self)
```
Type F

```swift
let session = NFCTagReaderSession(pollingOption: .iso18092, delegate: self)
```
オブジェクトを生成したらもう実行するだけです。
メッセージも追加しておきます。

```swift
session.alertMessage = "スキャン中"
session.begin()
```
終了処理も追加しておきましょう。例ってことで、読み込みが成功した時に呼ぶようにしてみます。

```swift
func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) {
	session.invalidate()
}
```
##NFC
これでNFCが使えるようになっていればすごく楽にアプリが作れるんですが、ここからちょっとした手間がかかります。
プロジェクトの設定で「info」タブを開きます。
Type A/Bを扱いたいときは「ISO7816 application identifiers for NFC Tag Reader Session」
Type Fを扱いたいときは「ISO18092 system codes for NFC Tag Reader Session」
を追加します。
そして、追加したものにさらにItemを追加します。
ここが一番つまずいたところなんですが、Type A/BならAID、Type FならSystem Codeを設定する必要があります。
しかもその値はカードの仕様によって違うので結構大変です。
最も簡単にこの値を知りたかったらAndroidアプリで調べちゃうのがオススメです。
Type Fなら`0003`と`FE00`を入れておけば大体いけるみたいです。
##実行
ちょっと面倒なこともありましたが、実行するとこんな画面が表示され、iPhone本体裏面ちょっと上あたりにカードを当てると読み取ることができます。
![scan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369600/ca29a345-75d4-b6b5-e3af-b201b536c3c5.png)

##まとめ
CoreNFC自体はとっても簡単に扱えることがわかりました。
でも、実際にICカードを読むにはカード自体の仕様を知る必要がありますし、まだまだこれからですね。
express



- install

```javascript

$ npm install express

```


- 初期化

```

var express = require('express'),

app = express();

```

- get

```javascript

app.get('/home', function(req,res){
   res.send("home")  
})
  

# 起動

app.listen(3000)

```


- get parameterあり

```javascript


app.get('/items/:id', function(req,res){
  if( req.params.id){
    res.send("items" + req.params.id)
  }else{
     res.send("helllo")  
  }

})


// console.log(req.params)
// ➜  react-express node app.js
// { name: 'akifumi' }

```
##  要所取得

```
var express = require('express'),



app = express();





app.get('/todo/:id', function(req,res){

  const todos = ["aa","dd","aa"]
  debugger
 res.send("hello" + todos[req.params.id])    
})


app.listen(3000)



// console.log(req.params)
// ➜  react-express node app.js
// { name: 'akifumi' }
```


#ファイルの読み込み

```ruby

階層構造作成
app.use(express.static("public"));

ファイルの読み込み
res.sendFile('/public/hello.txt')

```

# ejs　テンプレートエンジン

```
- 初期設定

app.set('view engine', 'ejs');



app.get('/hello', function(req,res){
    res.render("./index")
})

パラメーターも
https://qiita.com/kamihork/items/1b13d2157979d1837849
res.render("index", {message: message})
```

# ミドルウェアの使い方

```
console.log(req.params)
➜  react-express node app.js
{ name: 'akifumi' }

```


# crud の初期　（updateはまだ）

- 設定

```ruby

var express = require('express')
var app = express();

app.set('view engine', 'ejs');　#viewテンプレート
app.listen(3000)

```

- index

```
/views/index.ejs

app.get('/',function(req,res){
  res.render("index")
})

```


- new

```ruby

<html>
<form method="post" action="/create">
<input type="text" name="name">
<input type="submit" value="create!">
</form>
</html>
```

- create

```
# 設定

var bodyParser = require('body-parser')

var app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));



app.post('/create', function(req, res) {
  res.send(req.body.name);
});

```





基本的なルーティング
https://expressjs.com/ja/starter/basic-routing.html


useメソッド　ミドルウェア利用
https://expressjs.com/ja/guide/using-middleware.html

use app.use(path, callback)
https://expressjs.com/ja/4x/api.html#app.use
jquery学習

### jQuery.add()
elementを指定して情報を追加する。
<font color="red">**要素の追加はできない。**</font>

```javascript:add.js
$("div")
    .css("border", "2px solid red")
    .add("p")
    .css("background", "yellow");
```

### jQuery.addClass()
クラスを追加する。

```javascript:addClass
$("p:last").addClass("selected");
```
毎回favicon.icoが無くてエラーが出てくるのが辛かったので一瞬でfavicon.icoを生成する


@yushimatenjinです。先日PlayCanvas運営事務局としてQiitaのOrganizationに登録していただきました。今日はいつもなんとなく見過ごしていたけれど少し気を取られていた`favicon`が無い & 設定するのが少し手間という問題を解決したので共有をします。

### faviconを入れていないときに出てくる console.errorの表示が気になる。

毎回から`HTML`ファイルを作成したときに出てくるエラーに気を取られる...

<img width="1204" alt="favi" src="https://user-images.githubusercontent.com/39250588/65606007-9982fe80-df99-11e9-9a6b-ad19b096568a.png">


## 何を作ったか
faviconを一瞬で生成してくれるコマンドを作っただけです。今回はそれだけですが、少しだけ価値がありそうだなと思い投稿をさせていただきました。

こんな感じで一瞬で`favicon.ico`を作ってくれるものです。  
![output](https://user-images.githubusercontent.com/39250588/65608833-524b3c80-df9e-11e9-856a-925fa514a583.gif)


### faviconとはなにか
favicon.icoの定義があまり深くわかっていなかったので、faviconについても調べてみました

[w3.org -How to Add a Favicon to your Site
](https://www.w3.org/2005/10/howto-favicon)によるとFaviconの形式は
- `8ビット`または`24ビット`
- サイズは`16x16`または`32x32`ピクセル
- 画像の形式は`png`, `gif`, `ico`のうちのどれか

だそうです。2005年の情報なのでも新しくなっているのだろうか後方の互換はあるだろうと思いこの仕様に則って作りました。

## faviconを自動生成する

`npm`の動く環境で。`favi`という今回作成したライブラリを使用することで`カレントディレクトリ`に`favicon.ico`をfaviconを自動生成します。

主な動かし方は2つあります。

#### npxを使用する

1. npxを使用し実行  

```
npx favi
```

#### インストールをして使う

1.グローバルにインストール

```
npm install -g favi
```

2.実行

```
favi
```

#### 実行結果
![output](https://user-images.githubusercontent.com/39250588/65608833-524b3c80-df9e-11e9-856a-925fa514a583.gif)
カレントディレクトリに`favicon.ico`が追加されます。

### 中身
作成したライブラリはGitHubで公開をしています。
[yushimatenjin/favi](https://github.com/yushimatenjin/favi)

### canvas-node
使用した外部のライブラリとして[canvas](https://github.com/Automattic/node-canvas) ★6000↑ というライブラリを使用しました。

GitHubのスター数が6000を超えており、Node.jsでCanvasのような操作をすることができるライブラリ。
[WebのCanvas API](https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API)を多くサポートしており、作成した画像のエクスポートもすることができる。


このライブラリを使うことで`Node.js`でもブラウザ上から`canvas`を操作するような書き方で画像を作ることができます。

```favi.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const fs = require("fs");
const canvas_1 = require("canvas");

const CANVAS_SIZE = 32;
const OUTPUT = "./favicon.ico";
const canvas = canvas_1.createCanvas(CANVAS_SIZE, CANVAS_SIZE);
const ctx = canvas.getContext("2d");
ctx.fillStyle = "rgb(255, 255, 255)";
ctx.fillRect(0, 0, CANVAS_SIZE, CANVAS_SIZE);
ctx.fill();
ctx.fillStyle = "rgba(255,98,89,1);";
ctx.font = "40px sans-serif";
ctx.fillText("●", 5.0, CANVAS_SIZE - 4);
ctx.fill();

const out = fs.createWriteStream(OUTPUT);
const stream = canvas.createPNGStream();

stream.pipe(out);
out.on("finish", () => console.log("The favicon was created."));
```

このソースコードから生成されるファビコンがこれです。
<div align="center">
<img src="https://user-images.githubusercontent.com/39250588/65609475-59bf1580-df9f-11e9-80c4-1e37435574d6.png" />
</div>


#### 念の為Mac標準のプレビュー機能で確認してみる
<div align="center">
<img src="https://user-images.githubusercontent.com/39250588/65610663-3006ee00-dfa1-11e9-9c3a-81fcf66403e5.jpg" />
</div>


- 32x32ピクセル
- 色空間: RGB



これで、毎回プロジェクトを作成するたびに、適当な`favicon`を用意をするに少し時間を取られていたことが解消されました。

ps.画像コピーで良かった感。
CentOS8 に VirtualBox Guest Additions をインストールする

CentOS8 (1905) を最小限インストールした状態で VirtualBox Guest Additions をインストールする手順を調べた。

##前提

* `yum update kernel` 実行後リブートする。
* `VBoxGuestAdditions.iso` をマウント (今回は `/mnt` )

##エラー

VirtualBox Guest Additions をインストールするとこんなエラーが出る

```bash

# /mnt/VBoxLinuxAdditions.run
Verifying archive integrity... All good.
Uncompressing VirtualBox 6.0.12 Guest Additions for Linux.Extraction failed.
Signal caught, cleaning up
```

##対策

次のパッケージをインストールする

* bzip2
* elfutils-libelf-devel
* gcc
* gcc-c++
* kernel-devel
* kernel-headers
* make
* perl
* tar

```bash

# yum -y install bzip2 elfutils-libelf-devel gcc gcc-c++ kernel-devel kernel-headers make perl tar
メタデータの期限切れの最終確認: 0:09:15 時間前の 2019年09月25日 23時00分25秒 に 実施しました。
依存関係が解決しました。
================================================================================
 パッケージ                    アーキテクチャー
                                       バージョン              リポジトリ サイズ
================================================================================
Installing:
 gcc                           x86_64  8.2.1-3.5.el8           AppStream   23 M
 gcc-c++                       x86_64  8.2.1-3.5.el8           AppStream   12 M
 perl                          x86_64  4:5.26.3-416.el8        AppStream   72 k
 bzip2                         x86_64  1.0.6-26.el8            BaseOS      60 k
 elfutils-libelf-devel         x86_64  0.174-6.el8             BaseOS      53 k
 kernel-devel                  x86_64  4.18.0-80.7.1.el8_0     BaseOS      12 M
 kernel-headers                x86_64  4.18.0-80.7.1.el8_0     BaseOS     1.6 M
 make                          x86_64  1:4.2.1-9.el8           BaseOS     498 k
 tar                           x86_64  2:1.30-4.el8            BaseOS     838 k
依存関係をインストール中:
（略）
```


## VBox Guest Additions をインストール

```bash

# /mnt/VBoxLinuxAdditions.run
Verifying archive integrity... All good.
Uncompressing VirtualBox 6.0.12 Guest Additions for Linux........
VirtualBox Guest Additions installer
Copying additional installer modules ...
Installing additional modules ...
VirtualBox Guest Additions: Starting.
VirtualBox Guest Additions: Building the VirtualBox Guest Additions kernel
modules.  This may take a while.
VirtualBox Guest Additions: To build modules for other installed kernels, run
VirtualBox Guest Additions:   /sbin/rcvboxadd quicksetup <version>
VirtualBox Guest Additions: or
VirtualBox Guest Additions:   /sbin/rcvboxadd quicksetup all
VirtualBox Guest Additions: Building the modules for kernel
4.18.0-80.7.1.el8_0.x86_64.
```
NSPersistentContainerで、CoreDataをオンメモリで使う

いっつも忘れちゃうのでメモ。
iOS 10からNSPersistentContainerでCoreDataを使うのがデファクトスタンダードになってますが、
その時に、CoreDataの機能そのままオンメモリでデータベースファイルとして保存せず使いたい場合がありますよね。

その時は、NSPersistentContainerの`persistentStoreDescriptions`に対して
NSInMemoryStoreTypeのtypeを持った`NSPersistentStoreDescription`を与えればよいです。
何も設定しない場合、SQLiteファイルに保存する形でCoreDataを扱います。

```swift
        let container = NSPersistentContainer(name: "appname")
        let persistentStoreDescription = NSPersistentStoreDescription()
        persistentStoreDescription.type = NSInMemoryStoreType
        container.persistentStoreDescriptions = [
            persistentStoreDescription
        ]
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
```

 # 追記 
URLに`URL(fileURLWithPath: "/dev/null")` を設定することでもメモリ上での利用が可能みたいです

参考 https://developer.apple.com/videos/play/wwdc2018/224/?time=1838

```swift
        container.persistentStoreDescriptions[0].url = URL(fileURLWithPath: "/dev/null")

```
[Golang]HTTPTESTレスポンスのCookieの値を取得する

# 概要
Goのハンドラなどに対するHTTPのテストを行う際に、レスポンスのCookieの値を取り出す方法メモです。

# 事前知識
参考にした主な記事など

- Go HTTPサーバについて
[Go言語のHTTPサーバのテスト事始め - Qiita](https://qiita.com/theoden9014/items/ac8763381758148e8ce5)

- HTTPリクエスト/レスポンスについて
[HTTPリクエスト/レスポンスの構成要素を初心者にも分かるように解説してみた - Qiita](https://qiita.com/koheiyamaguchi0203/items/5777c4653a01ae4c7b06)

- ハンドラについて
[Go 言語の http パッケージにある Handle とか Handler とか HandleFunc とか HandlerFunc とかよくわからないままとりあえずイディオムとして使ってたのでちゃんと理解したメモ - Qiita](https://qiita.com/nirasan/items/2160be0a1d1c7ccb5e65)

- Go テスト
[Go 言語 testing チートシート - Qiita](https://qiita.com/nirasan/items/b357f0ad9172ab9fa19b#nethttp-%E3%81%AE%E3%83%8F%E3%83%B3%E3%83%89%E3%83%A9%E3%83%BC%E3%82%92%E3%83%86%E3%82%B9%E3%83%88%E3%81%99%E3%82%8B)

# 内容
Cookieを返すだけの`HogeHandler`関数に対して、Cookieの値を取得して表示するテストを書きます。

```main.go
package main

import (
	"net/http"
)

func HogeHandler(w http.ResponseWriter, r *http.Request) error {
	http.SetCookie(w, &http.Cookie{
		Name:  "hoge",
		Value: "hogevalue",
	})
	return nil
}
```

```main_test.go
package main

import (
	"net/http"
	"net/http/httptest"
	"testing"
)

func TestHogeHandler(t *testing.T) {
	req := httptest.NewRequest("GET", "/", nil)
	resp := httptest.NewRecorder()
	HogeHandler(resp, req)

	// ここでCookieをパースする
	parser := &http.Request{Header: http.Header{"Cookie": resp.Header()["Set-Cookie"]}}
	hogeCookie, _ := parser.Cookie("hoge")

	t.Log(hogeCookie.Value)
}
```

Cookie取得部分では、[http.Request](https://golang.org/pkg/net/http/#Request)を経由して[Cookie関数](https://golang.org/pkg/net/http/#Request.Cookie)を利用することで、Cookieをパースして取得することができます。
本音を言うと[httptest.ResponseRecorder](https://golang.org/pkg/net/http/httptest/#ResponseRecorder)にCookie関数があってほしい...笑
ちなみにパースする必要がないなら`resp.Header()["Set-Cookie"]`で取得できます。
※ `HeaderMap`関数は[非推奨](https://qiita.com/hgsgtk/items/cad73af543b903e08cc9)になったらしいです。

# 実行&出力

### テスト実行

```bash
$ go test -v path/to/dir
```

### 出力結果

```
=== RUN   TestHogeHandler
--- PASS: TestHogeHandler (0.00s)
    main_test.go:17: hogevalue
PASS
```

# 参考
[Jonny Reeves – Testing Setting HTTP Cookies in Go](https://jonnyreeves.co.uk/2016/testing-setting-http-cookies-in-go/)
[http - The Go Programming Language](https://golang.org/pkg/net/http/)
[httptest - The Go Programming Language](https://golang.org/pkg/net/http/httptest/)
[testing - The Go Programming Language](https://golang.org/pkg/testing/)

# 最後に
記事に間違いや不明な点があれば遠慮なくご指摘ください。
IPアドレスを２進数に直してみる

#IPアドレスを２進数に変換してみよう
入力されたIPアドレスを、1と0の２進数に直してくれと言われました。
私は２進数の計算が苦手なので、pythonに頼ることにしました。

入力
`192.168.1.1`
出力
`11000000.10101000.00000001.00000001`

##コード例

```py
IP = input()
IPlist = IP.split(".")
time = 0

for i in IPlist:
    i = int(i)
    x = "{:08b}".format(i)
    IPlist[time] = x
    time += 1

IPbin = ".".join(IPlist)
print (IPbin)
```



#解釈
`IP = input()`
ここでIPアドレスを入力します。
仮に、192.168.1.1としましょう。


`IPlist = IP.split(".")`
ここで、「.」を区切り文字とし、オクテット毎にリスト化します。
`>> ['192', '168', '1', '1']`
printするとこんな風になっていると思います。


`for i in IPlist:`
オクテット毎に、数値を２進数に繰り返し変換していきます。

`x = "{:08b}".format(i)`
数値を２進数に変換する、format関数です。
for関数の1週目は、IPの192の部分が、11000000に変換されます。

`IPbin = ".".join(IPlist)`
リスト型から数値を抽出し、join関数で結合しています。

#最後に
同じようにIPv6も、`x = "{:08b}".format(i)`のところを、
`x = "{:08x}".format(i)`に変更するとできと思います。試していませんが。。。
Spring(運用)

・環境ごとの設定情報
   環境ごとに変わるもの(DBへの接続など)は1ファイルにまためることも可能(spring profile)

・運用性の向上
a.移植性
   実行可能jar(tomcatも内包しているため、サーバーを立てる必要がない)

b.信頼性、可用性
・Spring boot actuatorにより、httpで資源の状態をモニタリングできる
・例: heap dump ヒープファイルの監視
     Thread Dump, Metrics

・curlで実行
・カスタマイズ(つまりインターフェイスを実装すらことで独自の監視も実装可能)

・可視化や異常検知などより本格的な運用をさるには、prometheus
  ・paas,iaasの機能を自前でつくるイメージ、
   ・サーバのオペレーションを行う操作パネルなども用意されている)
   ・アラート通知(skackなど)もある

・リクエストのトレース
　　・処理が複数の階層に分かれている場合、どの層に問題があるかトレースする
　　必要がある→nginx
　　・ユーザーのリクエストをトレースできる
　　・レイテンシ分析（ボトルネックの特定）
　　　　→Spring Club Sleuth
　　・見える化
　　　　→Zipkin

・コンテナーオーケストレーションツール
   ・コンテナの統合管理
　　・Dockerとの併用
　　　https://ubiteku.oinker.me/2017/02/21/docker-and-kubernetes-intro/#what-is-kubernetes
　　・Springにおける利用
　　　　・development.yml
       ・Kubernetes ConfigMap
           汎用的な部分（設定ファイル、cmd引数、環境変数）などを複数のコンテナで共通して使える
[漏洞预警]CVE-2019-16759/vBulletin 5.x 前台远程代码执行漏洞

### 漏洞描述
vBulletin是一个收费低廉但强大的建站BBS(论坛)CMS.该CMS国外大量论坛使用,中国国内少许网站使用.近日,vBulletin 5.x爆出一个前台远程代码执行漏洞,无需登录即可触发.POC已经在网络上广为流传
### CVE编号
CVE-2019-16759
### 漏洞威胁等级
高危
### 影响范围
5.0.0 <= vBulletin <= 5.5.4
### 漏洞验证
使用payload执行任意OS命令进行回显

![payload](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/c4db9d3f-b326-9c67-0d3d-158be240b23e.png)




### 修复建议
目前暂无补丁修复,建议资产管理员临时终止CMS运行,等待官方修复
### Reference
https://seclists.org/fulldisclosure/2019/Sep/31
https://xz.aliyun.com/t/6419
https://nvd.nist.gov/vuln/detail/CVE-2019-16759
d3のforcesimulationを使って無向グラフを描いてみる

# はじめに
`d3.js`に`forcesimulation`つまり力学シミュレーションがあることを知ったので試してみました

# バージョン
- d3.js - v5

# デモ
https://syakoo.github.io/Test_ForceSimulation/

# コード
```javascript
const nodes = [
  { id: 0, depth: 0 },
  { id: 1, depth: 1 },
  { id: 2, depth: 0 },
  { id: 3, depth: 2 },
  { id: 4, depth: 3 },
  { id: 5, depth: 3 },
  { id: 6, depth: 4 }
];

const edges = [
  { source: 0, target: 1 },
  { source: 1, target: 3 },
  { source: 2, target: 3 },
  { source: 3, target: 4 },
  { source: 3, target: 5 },
  { source: 4, target: 3 },
  { source: 4, target: 6 }
];

// --------------------------------------------------------------------
// ここから

// svgの作成(キャンバスみたいなもの)
const svgSize = { width: 1000, height: 600 };
const d3Svg = d3
  .select("#graph")
  .append("svg")
  .attr("width", svgSize.width)
  .attr("height", svgSize.height);

// エッジ(linkと呼ぶらしい)の設定。
const d3Links = d3Svg
  .selectAll("line")
  .data(edges)
  .enter()
  .append("line")
  .attr("stroke", "black");

// ノード(点)の設定。
const d3Nodes = d3Svg
  .selectAll("circle")
  .data(nodes)
  .enter()
  .append("circle")
  .attr("r", 10)
  .attr("fill", "#213964")
  .call(
    d3
      .drag()
      .on("start", dragstarted)
      .on("drag", dragged)
      .on("end", dragended)
  );

// 描画とシミュレーションの設定。
const simulation = d3
  .forceSimulation()
  .nodes(nodes)
  .on("tick", ticked)
  .force("link", d3.forceLink(edges).distance(50))
  .force("charge", d3.forceManyBody().strength(-50))  // 斥力。負にすることで反発力が働く
  .force("center", d3.forceCenter(svgSize.width / 2, svgSize.height / 2))
  .force("x", d3.forceX())
  .force("y", d3.forceY());

// 配置の初期設定。データのdepthに合わせてyを決める
simulation.nodes().forEach(d => {
  d.fy = d.depth * 30 + svgSize.height / 2;
});

// ドラッグイベント------------------------------------------------------
// (f軸は固定したいため、今回はコメントアウト)
function dragstarted(d) {
  if (!d3.event.active) simulation.alphaTarget(0.9).restart();
  d.fx = d.x;
  // d.fy = d.y;
}

function dragged(d) {
  d.fx = d3.event.x;
  // d.fy = d3.event.y;
}

function dragended(d) {
  if (!d3.event.active) simulation.alphaTarget(0);
  d.fx = null;
  // d.fy = null;
}

// 状態の更新。シミュレーションで計算、こっちで更新という流れ。
function ticked() {
  d3Nodes.attr("cx", d => d.x).attr("cy", d => d.y);

  d3Links
    .attr("x1", d => d.source.x)
    .attr("y1", d => d.source.y)
    .attr("x2", d => d.target.x)
    .attr("y2", d => d.target.y);
}

```
# ちょっと解説
仕組みとしては、

1. 普段通りグラフを描く
2. シミュレーションの設定をする
3. tickでシミュレーションの結果をグラフに反映

って感じかと思います。

注意するところはこんな感じです。

- ノードとエッジは`Object`であること
- エッジはsourceとtargetというパラメータが必要

# おわりに
もちろん、エッジが有向なので有向グラフで描くことも可能ですが、↗をどう描くかが問題になりそうです。

# 参考
[みどりからすのお話: D3.jsのforce Graphでノードを左から右へ配置するお話](https://ochanjanai.net/it/development/273)
[KNOWHOW,NOHOW: 【JavaScript】D3.jsのforcesimulationを詳しく解説！【node編】](https://keymaso.com/programemory/javascript/d3-forcesimulation2/)
Project Euler 027を解いてみる。「二次式素数」

# Project Euler 027
[027](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2027)
>オイラーは以下の二次式を考案している:

```math
n^2 + n + 41.
```
>この式は, n を0から39までの連続する整数としたときに40個の素数を生成する.
しかし, n = 40 のとき 40<sup>2</sup> + 40 + 41 = 40(40 + 1) + 41 となり41で割り切れる.
また, n = 41 のときは 41<sup>2</sup> + 41 + 41 であり明らかに41で割り切れる.
計算機を用いて, 二次式 

```math
n^2 - 79n + 1601
```
 という式が発見できた.
>これは n = 0 から 79 の連続する整数で80個の素数を生成する. 係数の積は, -79 × 1601 で -126479である.
さて, |a| < 1000, |b| ≤ 1000 として以下の二次式を考える (ここで |a| は絶対値): 例えば |11| = 11 |-4| = 4である.

```math
n^2 + an + b
```
>n = 0 から始めて連続する整数で素数を生成したときに最長の長さとなる上の二次式の, 係数 a, b の積を答えよ.


->[次の問題](https://qiita.com/radiol/items/439c131f8ec1931f66aa)

## 考え方
今回も総当りで解いていきました。
a,bそれぞれの探索範囲ですが、
n=0の時、n<sup>2</sup>+an+b=bなので、`bの探索範囲は1000未満の素数`となります。
次に、n=1の時、1+a+bが素数、つまり最低限1+a+b≧2となるので、`aの探索範囲は1-b以上1000未満`とします。
毎回素数判定を行うと時間がかかるので、必要な素数の集合は先に作ってしまい、素数判定はその中に含まれるか否かで行います。
n=bの時、与式はbで割り切れるのでnはb未満、そしてbは1000未満の素数ということで997以下となります。
よって、生成されうる素数は最大でも(997<sup>2</sup> * 2 + 997)未満なのでここまでの素数のリストを使用します。
あとはforでループをぶん回します。

###　追記
b=2とするとn=2のときに必ず2で割れてしまうので、bは奇数
bが奇数かつnが奇数の時、aが偶数だと奇数+偶数+奇数=偶数で2で割れてしまうのでaは奇数となります。
aの探索範囲は奇数のみでいいのでもっと減らせますね。

## コード
```Python:euler027.py
import numpy as np
from math import ceil


def main():
    limit = 1000
    # n = 0のとき素数となるのでbは素数
    b_arr = get_prime_arr(limit)
    # 生成されうる素数は b **2 + b **2 + b より小さいはず、先に素数の集合を作っておく
    prime_set = set(get_prime_arr(b_arr[-1] ** 2 * 2 + b_arr[-1]))
    # 答え用の変数
    max_a, max_b, max_n = 0, 0, 0
    for b in b_arr:
        # n = 1のとき、1+a+b>=2なので探索範囲はa>= -b+1となる奇数
        for a in range(-b, limit, 2):
            # n = bのとき、bで割り切れるのでnの範囲は0以上b未満
            for n in range(b):
                if n ** 2 + n * a + b not in prime_set:
                    break
            if n > max_n:
                max_n = n
                max_a = a
                max_b = b
    print(f'a={max_a},b={max_b}のとき、最長で{max_n}の素数を生成')
    print('Answer:', max_a * max_b)
    
    
def get_prime_arr(n: int) -> np.ndarray:
    """自然数n未満の素数を配列で返す関数
    Args:
        n: 返す素数の最大値を規定、最大値はn-1
    Returns:
        numpy.ndarray: n未満の素数の配列

    """
    boolean_arr = np.ones((n,), dtype=np.bool)  # n個の要素をもつのboolean配列(0~n-1に対応)を生成、全てTrueとする
    boolean_arr[0:2] = False  # [0,1]をFalseとする
    boolean_arr[4::2] = False  # 2以外の偶数をFalseとする
    boolean_arr[6::3] = False  # 3以外の3の倍数をFalseとする
    for i in range(5, ceil(n ** 0.5), 6):  # iは初項5、公差6の等差数列とする
        if boolean_arr[i]:  # 6k-1に対応。iに一致する要素がTrue=素数のとき
            boolean_arr[i * 2::i] = False  # iの倍数の要素(非素数)をFalseとする
        if boolean_arr[i + 2]:  # 6k+1に対応。
            boolean_arr[(i + 2) * 2::(i + 2)] = False
    return np.arange(n)[boolean_arr]  # boolean配列を整数の配列に変換して返す



if __name__ == '__main__':
    from time import time as t
    st = t()
    main()
    print(t() - st, 'sec')
```
[paiza](https://paiza.io/projects/new)にて実行
`結果
a=-61,b=971のとき、最長で71の素数を生成
answer= -59231
0.2921280860900879
`
はじめはprime_setのところをnumpy.ndarrayをそのまま使っており、45秒ほどかかってしまっていました。単に含まれるか否かの判定であればsetが格段に早いですね。

ちなみにlimit=50000までやってみましたが、
a=-79,b=1601のとき、最長で80の素数を生成がMaxでした。あまり大きい値では条件に合うa,bは見つかりませんでした(さらに大きくしたらどうなるかはわかりません)。
Spring(チーム開発)

・Spock
  基本テストはjunitだが、junitのテストコードを以下の点で改善する
   ・可読性 (条件、結果などを整理)
   ・データ駆動テスト(テストコードそのものがテストパターン表となる)

・Sphinx
   ・Html対応のドキュメント生成ツール
   ・既存のexcelないしはソースから生成するしくみはないようだが、一から作る分には良い
    (エクセルだとダウンロードの手間などもあり、細かな作業ロスが出るので)

・ソースジェネレーター
   a. 画面など作りが同じものはソースジェネレーターにより量産
   b. ソースだけだなく、各種リソース(画像、定数定義など)もまとめてできる
   c. Gradleで配布可能
Word2Vecで単語の分散表現を獲得する

TravelBlogのテキスト情報から，Word2Vecのモデルを生成しました．

##下準備
```
> print(corpus)
[['This', 'is', 'a', 'pen', '.'], ['His', 'name', 'is', 'Bob', '.'],...]
```

のような二重リストを作る．

##学習
```
from gensim.models import word2vec
model = word2vec.Word2Vec(corpus, size=300, min_count=20, window=10)
model.save("TravelBlog2Vec.model")
```

##確認
king - man + woman = ?

```confirm.py
from gensim.models import word2vec
model = word2vec.Word2Vec.load(“TravelBlog2Vec.model”)
similar_words = model.wv.most_similar(positive=[“king”, “woman”], negative=[“man”], topn=9)
print(similar_words)
```

```
$python3 confirm.py
[(‘queen’, 0.6165680885314941), (‘emperor’, 0.6151667833328247), (‘King’, 0.6119736433029175), (‘Pharaoh’, 0.5968493223190308), (‘kings’, 0.5776773691177368), (‘Emperor’, 0.576242983341217), (‘monarch’, 0.5675389766693115), (‘princess’, 0.5627557039260864), (‘pharaoh’, 0.5518648624420166)]
```
##関連のある投稿
<a href = https://qiita.com/Naoki-Shibata-LS/items/0eee3ca587822a1a6855>fastTextで単語の分散表現を獲得する</a>

##参考ページ
https://qiita.com/kenta1984/items/93b64768494f971edf86
Rubyの attr_accessorメソッドに関するメモ

# attr_accessorメソッドとは
ゲッター、セッターを簡単に定義できるメソッドである。
# 定義の仕方　（例
```ruby:sample.rb
class Dog
  attr_accessor :name, :type, :age
end
```
これは、sample2.rbで記述した定義と同様に評価される。

```ruby:sample2.rb
class Dog
  def name
    @name
  end

  def name=(name)
    @name = name
  end

  def type
   @type
  end

  def type=(type)
    @type = type
  end

  def age
    @age
  end

  def age=(age)
    @age = age
  end
end
```
# まとめ
attr_accessorメソッドを使うのと使わないとでは
これだけの行数の削減ができるので積極的に使おう。