OmniAICreator/Qiita-1.07M huggingface dataset:
MNCTF2019 建屋制御Ⅰ

#問題

http://mnctf.info/mnctf2019/tasks.php

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/91725406-a89c-e4e1-30be-25443b89f325.png)

#解いてみた

制御系よくわかりませんが、ひとまず「設定シート」と「PCAP」をダウンロードします。
設定シートを見てみます。

![point.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/db4c63bf-9b6e-cf36-9076-74c33a58225d.png)

ここで知りたいのは「工場の空調コントローラの「location」名」です。
工場の空調コントローラというのは設定シートの1F工場室温モニタと1F工場運転モードにアクセスしているのでしょうか？

よくわからないのでpcapを見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/7e52b498-bf84-b2bc-44bf-747ffb4f5f83.png)

さっぱりわかりません。
適当に見てみましたが、全くわかりません。

location名を答える問題なので「location」で検索してみれば何かヒットするのか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/0ebe2a73-7ad0-334a-2ab2-cabfdeecd1d1.png)

locationのプロパティっぽいのを見つけたものの特にnameのようなものを見つけられず。
他のパケットも似たような感じ。

と思ったら、「location: UTF-8 '2F_meeting_room'」と書かれているパケットがあった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/f1c5a57d-30df-3b8a-23a9-015f0d9f320e.png)

どうやら1回目に見たパケットはリクエストパケットで2回目に見たパケットがレスポンスパケットっぽい。
工場は1Fにあるのでレスポンスのlocationが1Fになってるものを探してみる。1Fは1F同士という確証はないものの、とりあえずよくわからないのでやってみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/26976afa-eaed-1d6e-93d4-1ffa9b27afa7.png)

ありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/90abb9e0-797a-adbc-46f7-03a24f16d8fe.png)

キャプチャ取得失敗してしまいました。
Docker for Mac+ROSでturtlersimを動かす

# 目的
MACのDocker上でROSのturtlesimを動かした際の備忘録です

# 準備
下記を参考にさせて頂きます
>[Docker for MacでROSの亀さんと戯れた](https://qiita.com/ryo_21/items/4e0006adcb300173acda)

# テスト

```
turtlesim_node起動
$ rosrun turtlesim turtlesim_node
turtle_teleop_key node起動
$ rosrun turtlesim turtle_teleop_key
```
turtlesim実行できればOK

<img width="240" alt="スクリーンショット 2019-06-29 13.21.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/8ce5f7fd-111e-4477-a47d-f7c99df7a4ba.png">


# FAQ

```
$ xhost + $ip
-bash: xhost: command not found
```

xhostコマンドの実行パスが通ってないと思うので直接実行します

```
例
$ /usr/X11/bin/xhost + $ip
```

```
$ /usr/X11/bin/xhost + $ip
/usr/X11/bin/xhost:  unable to open display ""
```

DISPLAY環境変数をexportします
(ホスト名):(ディスプレイ番号).(スクリーン番号)

```
設定例
$ export DISPLAY=localhost:0.0
```




# 参考
[Docker for MacでROSの亀さんと戯れた](https://qiita.com/ryo_21/items/4e0006adcb300173acda)
[Mac DockerでGUIを使いたい（XQuartz版）]
(http://www.ep.sci.hokudai.ac.jp/~inex/y2007/0125/x.html)
[Mac で ROS の環境構築](http://yura2.hateblo.jp/entry/2016/11/09/Mac_%E3%81%A7_ROS_%E)
Visual Studio2017 良く使うショートカットキー一覧

Visual Studio2017で開発しているC#プログラマーです。
私が開発現場でよく使うショートカットキーをご紹介します。

【ソースコードの整形】
<b> Ctrl+K, D 
(Controlキーを押しながら「K」,「D」キーを押下)</b>

【ソースコードの展開】
<b>Ctrl+M, L</b>

【コメントアウト】
<b>Ctrl+K, C</b>

【アンコメント】
<b>Ctrl+K, U</b>

【指定行への移動】
<b>Ctrl+G</b>

【選択範囲を大文字にする】
Shift + Ctrl + U

公式VisualStudio ショートカット一覧
https://docs.microsoft.com/ja-jp/visualstudio/ide/default-keyboard-shortcuts-in-visual-studio?view=vs-2019

随時アップデートしていきたいと思います。
AWSのサーバーにDataDogをAnsibleで導入する


# 環境

- Ansible 2.7.10
- Amazon Linux 2 AMI (HVM), SSD Volume Type, ami-0c3fd0f5d33134a76

# Playbook

```yaml:datadog/tasks/main.yml
---
- name: enable datadog repo
  copy: src=../files/datadog.repo dest=/etc/yum.repos.d/datadog.repo
  become: yes

- name: install datadog
  yum:
    name: datadog-agent
    update_cache: yes
    state: present
  become: yes

- name: copy datadog config
  copy:
    src: /etc/datadog-agent/datadog.yaml.example
    dest: /etc/datadog-agent/datadog.yaml
    remote_src: yes
  become: yes

- name: update datadog config
  lineinfile:
    path: /etc/datadog-agent/datadog.yaml
    regexp: '^api_key:.*'
    line: "api_key: (API KEY)"
    remote_src: yes
  become: yes

- name: restart datadog
  systemd:
    name: datadog-agent.service
    state: restarted
  become: yes
```

```ini:datadog/files/datadog.repo
[datadog]
name = Datadog, Inc.
baseurl = https://yum.datadoghq.com/stable/6/x86_64/
enabled=1
gpgcheck=1
gpgkey=https://yum.datadoghq.com/DATADOG_RPM_KEY.public
```

# 参考

- [Setup | Datadog](https://app.datadoghq.com/account/settings#agent/aws)

# 追記

頑張って書かなくてもAnsible Galaxyあった。

- [Setup | Datadog](https://app.datadoghq.com/account/settings#agent/ansible)
Ubuntu16.04にTigの最新版をインストールする

# 問題: tigのCPU使用率が100%に張り付くバグ

稀にtig自体が、CPU使用率が100%に張り付いている状態になっており、htopで発見して都度killしていた。

vimとtigを相互で行き来するのに、[tig-explorer.vim](https://github.com/iberianpig/tig-explorer.vim) を利用していたため、そちらのバグと勘繰ったが、同じような作りの[ranger-explorer.vim](https://github.com/iberianpig/ranger-explorer.vim)ではそのような現象は起こっていなかった。

そのため、tig本体にバグがあるのではとtigのGitHub Issueを漁ってみると、モロに該当する問題があり、2.3.3で対応済となっていることがわかった。(ref: https://github.com/jonas/tig/issues/164)

しかし、Ubuntu 16.04のaptでインストールされるのは`tig/bionic 2.3.0-1 amd64`と若干古く、この修正が含まれていなかった。


# tigをソースからコンパイルしてインストールする
Ubuntu16.04ベースのaptからインストールされる`tig`のv2.3.0をアンインストールし、tig最新版をソースを落としてきてコンパイルしてインストールする。

ただし、ソース落としてきてそのままmakeすると日本語が文字化けしてしまうので、マルチバイト対応のncurseswの開発者向けのライブラリ`libncursesw5-dev`が必要となることに注意。


# apt版のtigのアンインストール

まず、インストールされているtigをアンインストールする

```shell
$ sudo apt remove tig
```

# tigの最新版をgit cloneする

```shell
$ git clone https://github.com/jonas/tig
```

# 依存ライブラリのインストール

libncursesw5-devが必要。マルチバイト文字が文字化けしないようにするため。

```shell
$ sudo apt install libncursesw5-dev
```

# tigのインストール

```shell
$ ./autogen.sh
```

```
$ ./configure
```
```
$ make
```

```
$ sudo make install
```


# versionの確認

```
$ tig --version
tig version 2.4.1-60-gfaf1b86
ncursesw version 6.1.20180127
readline version 7.0
```

2019/07/06の最新版のv2.4.1がインストールされたことを確認。
Debianベースのコンテナで日本語入力ができなかった時の話

# 概要
DockerやPHPの勉強にと作成したLaravelプロジェクトにて、
MySQLをコマンドラインで操作しようとした際に日本語を入力できなかったので入力できるようにしました。

# 事象
テストデータを入れようとした時のこと、
テストデータ作成にちょうど良さそうなスプレッドシートがあったのでそのセルをコピーし
MySQLを起動しペーストしてみたところ、日本語部分のみ消えてしまいました。

### (イメージ)
<img width="552" alt="screenshot 2019-07-06 15.28.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46053/3464760f-c0e6-004d-1a7e-ad829f172813.png">


```
ペースト！(この時すでに日本語が消えている)
mysql> Insert into hoge (title, created_at, updated_at) values ('hoge', NOW(), NOW());

mysql> select * from hoge;
+-----+-----------------+---------------------+---------------------+
| id  | title           | created_at          | updated_at          |
+-----+-----------------+---------------------+---------------------+
| 1   | hoge            | 2019-07-06 05:51:22 | 2019-07-06 05:51:22 |
+-----+-----------------+---------------------+---------------------+
1 row in set (0.00 sec)
```

# 対応

MySQL内については、ちゃんと文字コード指定してあるし
Googleログイン機能を導入した際に(https://qiita.com/enuswi/items/0a24b09ed6e961c3beab)
日本語が登録されることは確認済みでしたので少し困惑したのですが、
調べてみるとどうやらDebian側で設定が必要とのことでしたので
Dockerfileを書き換えてみました。

フォルダ構成

```
.
├── mysql
│   ├── Dockerfile
│   ├── my.cnf
│   └── etc
│       └── locale.gen (新規に追加)
├── nginx
│   └── default.conf
├── php
│   └── Dockerfile
├── docker-compose.yml
└── src (laravel project)
```

Dockerfileの追加項目
* vim、locales、locales-allパッケージの追加
* 「ja_JP.UTF-8 UTF-8」の行のみ有効にしたlocale.genをetc以下に配置
* ロケールの生成・設定の更新

```
FROM mysql:5.7

# 追加ここから
RUN apt-get update \
    && apt-get install -y \
    vim \
    locales \
    locales-all

ADD ./etc/locale.gen /etc/locale.gen

RUN locale-gen \
    update-locale
# 追加ここまで

ADD ./my.cnf /etc/mysql/conf.d/my.cnf

CMD ["mysqld"]

```

```locale.gen
# (略)
# iu_CA UTF-8
# ja_JP.EUC-JP EUC-JP
ja_JP.UTF-8 UTF-8
# ka_GE GEORGIAN-PS
# ka_GE.UTF-8 UTF-8
# (略)
```

以上修正したら、
ビルドし直してコンテナに入り直すとコマンドラインで日本語が使えるようになりました。
元々の状態だとMySQLに限らずコンテナ自体で日本語が使えてなかったのですが上記の修正にて使用できるようになりました。



<img width="552" alt="screenshot 2019-07-06 15.28.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46053/3464760f-c0e6-004d-1a7e-ad829f172813.png">


```
ペースト！
mysql> Insert into hoge (title, created_at, updated_at) values ('hogeについて', NOW(), NOW());

mysql> select * from hoge;
+-----+-----------------+---------------------+---------------------+
| id  | title           | created_at          | updated_at          |
+-----+-----------------+---------------------+---------------------+
| 1   | hogeについて      | 2019-07-06 05:51:22 | 2019-07-06 05:51:22 |
+-----+-----------------+---------------------+---------------------+
1 row in set (0.00 sec)
```

# 最後に

今回は、mysql用のコンテナで対応しましたが、
本来は作業用のコンテナを作ってそこで対応するべきなんだろうなと思います。
(laradocのworkspaceコンテナみたいな)

### 参考
https://qiita.com/Sa2Knight/items/02cf69acfa5dd673ca36
ShellコマンドでGitHubへソースコードの反映

Atomから直接GitHubへリポジトリの反映を試みましたが
うまくいかずよくわからなかったので
ターミナルからShellで反映させる方法をまとめました。
環境：macOS

---

##目次
1. GitHubにリポジトリを作る
2. GitHubからソースコードをDLする
3. Gitディレクトリへ移動
4. Gitへ反映させるFileの移動など
  - おまけ:gitディレクトリ内の整理
5. GitHubにあげてみる
6. GitHubに反映させる
  - おまけ:ステータスの確認
  - おまけ:logの確認

---
##1. GitHubにリポジトリを作る

作成したリポジトリ画面からSSHのURLをコピーする。
![スクリーンショット 2019-07-06 14.32.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449552/30c0101f-84b5-c7d3-7cb2-c47b2378a4a9.png)
![スクリーンショット 2019-07-06 13.34.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449552/52325ad3-5258-b240-463b-ff86f12a4cd3.png)

##２. GitHubからソースコードをDLする

```
$ git clone "[URL]"
```
例えば画像のURLを例にすると、実際にはこうなる。

```
$ git clone "git@github.com:suwa3/suwa3-home.git"
```
<br>
念のためlsでディレクトリを確認します。

```
$ ls
```
![スクリーンショット 2019-07-06 13.41.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449552/3d08d15c-48fe-f572-a366-ba83d3c20fff.png)

##3. gitディレクトリへ移動

```
$ cd suwa3-home/
```
-a(allという意味)で表示させる。

```
$ ls -a
```
![スクリーンショット 2019-07-06 15.09.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449552/0d65ca0b-4ba9-cf71-858b-16e1c0588bc7.png)

Gitディレクトリ内の.(ドット)カレントを開きます。

```
$ open .
```
##4. Gitへ反映させるFileの移動など

Finderを開き、GitHubにUPしたいFileをコピペなり移動しておくなりする。
![スクリーンショット 2019-07-06 13.54.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449552/3a08bf43-cb4f-5ff0-b39a-652703ff2bf2.png)

今回はAtomを使用しているので
Fileがどこにあるのかわからない場合は、Projectから場所を確認。
![スクリーンショット 2019-07-06 14.42.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449552/f7fd772d-d1b9-a7f0-1c95-0649009afb47.png)

```:おまけ（gitディレクトリ内の整理）
必要に応じてgitのディレクトリ内を整理する。
今回はMyPortfolioの下階層にHTMLやCSSファイルがあったため、それらを上の階層に移動させました。
$ mv MyPortfolio/[File名] .

一つずつ移動させる例
$ mv MyPortfolio/index.html .

今回のように、複数ファイルがある場合
$ mv MyPortfolio/* .
```
##5. GitHubにあげてみる

ステージングエリアに上げ、登録対象にする。

```
$ git add [ファイルパス]
```

```:例
＄　git add MyPortfolio/index.html
```

<br>
ローカルのリポジトリに登録する。

```
$ git commit
```
vimでコミットメッセージを編集する。
どういった内容か、概要を書く。

```
$ git commit -m 'メッセージ内容'
```
これで短縮も可能

##6. GitHubに反映させる

```
$ git push
```

GitHubでリポジトリ内に反映されているかを確認。
![スクリーンショット 2019-07-06 14.31.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449552/95856ad3-54eb-faf7-e26b-984647ef3bac.png)
わーい:smiley::clap:
<br>

```shell:おまけ(ステータスの確認)
$ git status
```
add以降であれば確認可能。
![スクリーンショット 2019-07-06 14.16.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449552/45e51e32-3e24-c639-2ae7-57852e262981.png)

```shell:おまけ（logの確認）
$ git log
```
コミットできたかlogで確認。
commit以降であれば確認可能。
![スクリーンショット 2019-07-06 14.26.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449552/13a3a52b-9c98-e350-085e-721a037e1771.png)
Fortran 90/95 で コメントアウトをする & ループ処理で足し算

# はじめに

環境は macOS Mojave (10.14.5) で Homebrew の `gcc (gfortran)` を使っています。
他のOSでも大きな問題はないはずです。

Fortranが初めての方は、以下の記事が役に立つと思います。

前回の記事（初回）：[Fortran 90/95 で "Hello, world!"][1]


# Fortranにおけるコメントアウト

Fortranでコメントアウトをするには `!` を使います。

例えば、[前回][1]の "Hello, world!" プログラムにコメントを追加しようと思うと...

```fortran:hello_world.f90
program hello_world               ! プログラムの名称
    write(*,*) 'Hello, world!'    ! "Hello, world!"を出力
end program hello_world           ! プログラムの終わり
```

となります。


# Fortranでループ処理 ： 1から100までの整数の足し算

Fortranでループ処理を行うには `do` を使います。

では、例えば1から100まで整数の足し算を行うプログラムを作るとしましょう。

数式では

```math
1+2+3+ \cdots +100 = 5050
```

ですね。

「loop.f90」というプログラムを作ります。
`.f90` は Fortran90/95 の拡張子です。

```fortran:loop.f90
program loop
    implicit none               ! おまじない
    integer i, sum              ! 整数型変数の宣言

    sum = 0                     ! ゼロを代入

    do i = 1, 100               ! do ループを使用
        sum = sum + i
    end do                      ! ループの終わり

    write(*,*) 'sum = ', sum    ! 出力
end program loop
```

となります。

コンパイルをします。

```Terminal:Terminal.app
$ gfortran loop.f90 -o loop.out
```

`-o <file>` オプションをつけることで、「a.out」ではなく、自分の好きな名前の実行ファイルを作成できます。

実行すると

```Terminal:Terminal.app
$ ./loop.out
 sum =         5050
```

となるはずです。

# おわりに

お疲れ様でした。
次回は、おまじない `implicit none` についての解説をしようかなぁと考えています。

間違いなどありましたら、コメントで教えていただけるとありがたいです！

__2019年7月13日(土)追記__→次回はこちら：[Fortran 90/95 のきまりごと【implicit none って何？】][3]
[3]:https://qiita.com/TakuroKoike/items/fe886c14a44d9d4c3bbe



## おまけ ： 「1から100までの整数の足し算」について

今回は、`do`ループを使いたいという教育的な理由から、数字を1個ずつ足しあげるプログラムを作成しました。
しかし、もし数列の和の公式

```math:
\sum_{i=1}^{n} k = \frac{1}{ \ 2 \ } \ n \ (n+1)
```

を知っていれば

```math
\begin{align}
1+2+3+ \cdots +100 &= \sum_{i=1}^{100} k \\
&= \frac{1}{ \ 2 \ } \ 100 \times (100+1) \\
&= 5050
\end{align}
```

という計算ができます。

[1]:https://qiita.com/TakuroKoike/items/954a49ff21479e1379fe
【サマーウォーズのアレ】モジュロ演算知らなくても夏希先輩の生まれた曜日がわかっちゃうってよ!!

#はじめに
エンジニアにとって夏と言えば...そう、映画「__サマーウォーズ__」です。
知らない人は、ぜひ2019年7月19日の金曜ロードショーか、DVDで見よう!!
映画の冒頭、"数学が得意な主人公の健二は、ヒロイン夏希の生年月日(1992年7月19日)から、その日が日曜日であることを秒殺で求める"というシーンがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370312/62ceacd9-d8dd-71e1-f02c-71e67fb66ef5.png)
これを見たエンジニアはこう思うだろう"健二くんスゲー!!しゃべりながら一瞬で曜日を求めるとか頭にGPU入ってんのか!?"と。
頭にGPUが入ってない人でも、曜日を簡単に求める方法を見つけちゃいました。
#準備物
- 今年(yyyy年)のカレンダー
- 紙
- 筆記用具
- すごろくのコマ(シャーペンのキャップなど) 
- 調べたい年月日(YYYY年㎜月dd日)

# 方法概要
1. カレンダーで今年の調べたい日付の曜日を確認
2. うるう年を無視して曜日を計算
3. うるう年を加味して計算結果を修正

#具体的な方法
###1.カレンダーで今年の調べたい日付の曜日を確認
 以下のような表を書く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370312/37db1ea1-841b-957a-b311-a4c6b719903d.png)


調べたい日付の今年の曜日にコマを置く
ex.
調べたい日付が1992年7月19日、
   今年が2019年なら
金曜日(2019年7月19日は金曜日)にコマを置く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370312/bf35a6ca-ea53-7282-26d1-a00602e1b068.png)
###2．うるう年を無視して曜日を計算
(今年(yyyy) - 調べたい年(YYYY)) % 7
("%"は割り算の余りを求めるという意味)
の分、コマを__左に__進める(もし日曜日まで行ったら、次は土曜日に進める)
ex.先の例の場合
(2019 - 1992) % 7 = 6
より以下のようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370312/f2f99bd6-005f-d5bd-4f39-f2a11ad99e84.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370312/62ff21c6-62fb-d829-478a-0c46de19eb4a.png)

###3. うるう年を加味して計算結果を修正
YYYY以上の値の内、最も値が小さい値のうるう年(YYYY’)を求める。
ex.
YYYY = 1992 なら、YYYY' = 1992
YYYY = 1994 なら、YYYY' = 1996

さらに、以下の計算を行う
1月1日≦mm月dd日≦2月28日の時、
((yyyy - YYYY') / 4) % 7 +1

3月1日≦mm月dd日≦12月31日の時、
((yyyy - YYYY') / 4) % 7
("/"は割り算の商を求めるという意味)
求めた値の分、__左に__コマを進める

ex.先の例の場合
((2019 - 1992) / 4) % 7 = 6

よって
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370312/bf051702-add3-113a-d092-d0fb80b370e9.png)
となる。
最後にコマのある位置が求めたい曜日になるので、夏希先輩の生まれた日は日曜日であることが分かる。
ちなみに2月29日の曜日を求める場合、2月28日を求めて最後に右に1つコマを進めればできます。
#結論
モジュロ演算を知らなくても"簡単に"曜日を求められる。
会話しながら求めるにはやはり、頭の中にGPUが必要。
#最後に
サマーウォーズ10周年イベントを楽しみましょう!!
#参考文献

[サマーにウォーズをするための一歩を踏み出す](https://qiita.com/wadaaaan/items/b5939c3dbde2e45670eb)
[サマーウォーズ公式サイト](http://s-wars.jp)
[Guide Map サマーウォーズロケ地ガイド](
http://www.ueda-cb.gr.jp/s-wars/guidemap.html)
C#学習　-ポリモーフィズム-

#ポリモーフィズム
ポリモーフィズム：多態性、多様性
類似したクラスに対するメッセージの送り方を共通にする仕組み。(相手が具体的にどのクラスのインスタンスであるか意識せずにメッセージを送れる)

コード例

```C#
    // 基底クラス
    class Character
    {
        public double Hp;
        public double Mp;
        public double Atk;

        public Character()
        {
            this.Hp = 100;
            this.Mp = 100;
            this.Atk = 100;
        }

        // ステータスを取得(ダミー)
        public virtual string GetStatus()
        {
            return string.Empty;
        }
    }

    // 派生クラス(剣士)
    class Soldier : Character
    {
        // 剣士のステータスを取得
        public override string GetStatus()
        {
            this.Hp = this.Hp * 1.5;
            this.Mp = this.Mp * 0.5;
            this.Atk = this.Atk * 2;

            return $"剣士のステータスはHP:{this.Hp},MP:{this.Mp},ATK:{this.Atk}です";
        }
    }

    // 派生クラス(魔法使い)
    class Wizard : Character
    {
        // 魔法使いのステータスを取得
        public override string GetStatus()
        {
            this.Hp = this.Hp * 1.3;
            this.Mp = this.Mp * 2;
            this.Atk = this.Atk * 0.5;

            return $"魔法使いのステータスはHP:{this.Hp},MP:{this.Mp},ATK:{this.Atk}です";
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Character sol = new Soldier();
            Character wiz = new Wizard();

            PrintStatus(sol);
            PrintStatus(wiz);
        }

        // キャラのステータス表示メソッド
        static void PrintStatus(Character c)
        {
            Console.WriteLine(c.GetStatus());
        }
    }
```

```
剣士のステータスはHP:150,MP:50,ATK:200です
魔法使いのステータスはHP:130,MP:200,ATK:50です
```

GetStatusという同じ名前のメソッドを複数のクラスで利用できるようにして異なる挙動をさせる。
PrintStatusメソッドの引数の型はCharacterになっている。
これにより、対象が剣士や魔法使いなど何が来ても対応できる。
(異なる機能(実装)を同じ名前で呼び出せるため、保守に優れている)

#抽象クラス
派生クラスにオーバーライドすることを強制することができる。
抽象メソッドを含んだクラスを抽象クラスと呼び、継承したクラスはすべての抽象メソッドをオーバーライドしなければならない。
抽象メソッドはabstract修飾子を付与して定義する。

コード例

```C#
   abstract class Character
    {
        public double Hp;
        public double Mp;
        public double Atk;

        public Character()
        {
            this.Hp = 100;
            this.Mp = 100;
            this.Atk = 100;
        }

        // 抽象メソッド
        public abstract string GetStatus();
    }
```

抽象クラスを継承したクラスからGetStatus()を削除するとエラーとなる。
抽象クラスはインスタンス化することはできない。
抽象メソッドは中身を持つことはできない。

#インターフェース
抽象クラスでは多重継承ができない。実現したい機能(メソッド)を1つの抽象クラスにまとめる必要があるため、派生クラスでその機能を必要としない場合にも、機能をオーバーライドしなければいけなくなる。
インターフェースは多重継承することができる。目的に応じて異なるインターフェースをに振り分けることで、派生クラス側も必要に応じてインターフェースを選択できるようになる。
インターフェースはinterface命令を利用する。

コード例

```C#
    // インターフェース
    interface ICharacter
    {
        string GetStatus();
    }

    class Archer : ICharacter
    {
        public double Hp;
        public double Mp;
        public double Atk;

        public string GetStatus()
        {
            this.Hp = this.Hp * 1.1;
            this.Mp = this.Mp * 1.7;
            this.Atk = this.Atk * 1.7;

            return $"弓使いのステータスはHP:{this.Hp},MP:{this.Mp},ATK:{this.Atk}です";
        }
    }
```

インターフェース名は大文字Iで始めること。
インターフェース配下の抽象メンバーにabstaractは不要。

抽象クラスとインターフェースのどちらを利用するか迷ったら、インターフェースを優先して利用する。

#参考した本
独習C#

おわり。
行列の数式とnumpyでの計算

#numpy と行列式の関係がわからなくなったので，メモ

`numpy`がベクトルの縦横を気にしないので，訳が分からなくなるので，整理のためメモ。
例えば，下記のような数式がある場合，

```math
\begin{align}
  \boldsymbol A &= \left(
    \begin{array}{c}
      1 \\
      2
    \end{array}
  \right) \\
  \\

  \boldsymbol B &= \left(
    \begin{array}{c}
      b_1 & b_2 & b_3 \\
    \end{array}
  \right) = \left(
    \begin{array}{c}
      3 & 5 & 7 \\
      0 & 3 & 5 \\
    \end{array}
  \right) \\
  \\

  \boldsymbol A^T \boldsymbol B & = \left(
    \begin{array}{c}
      1 & 2
    \end{array}
  \right)

  \left(
    \begin{array}{c}
      3 & 5 & 7 \\
      0 & 3 & 5 \\
    \end{array}
  \right) 
  = 
  \left(
    \begin{array}{c}
      3 & 11 & 17 \\
    \end{array}
  \right) \\
\end{align}  
```
よく行列を$b_1, b_2, b_3$のように縦ベクトルで表現される場合があるけど，
`numpy`の場合，横で定義されるので，意識していないと混乱する。
それと，ベクトルの定義も明示的に縦ベクトルで定義しないと勝手に解釈されるので，
便利だけど何が起きているかわかっていないときはやばいね。

```
>>> import numpy as np
>>> A = np.array([1, 2])
>>> B = np.array([[3, 5, 7], [0, 3, 5]])
>>> A @ B
array([ 3, 11, 17])
>>> A.T @ B
array([ 3, 11, 17])
```

そのくせ，縦ベクトルできっちり定義すると，縦横違うとエラーとなる。
知っていればなるほどだけど，知らないうちは？？？になりかねない。要注意。

```
>>> A = np.c_[np.array([1, 2])]
>>> B = np.array([[3, 5, 7], [0, 3, 5]])
>>> A.T @ B
array([[ 3, 11, 17]])
>>> A @ B
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: shapes (2,1) and (2,3) not aligned: 1 (dim 1) != 2 (dim 0)
```
環境構築

python(Django)準備

# 1 Apache準備
<details><summary>折りたたみ</summary><div>

>## 1-1 python3インストール
<details><summary>折りたたみ</summary><div>

```shell
apt install puthon3
```
</div></details>

## 1-2 必要に応じてpythonをリンク
<details><summary>折りたたみ</summary><div>

```shell
unlinl /usr/bin/python
ln -s /usr/bin/python3 /usr/bin/python
```
</div></details>

## 1-3 pipからDjangoインストール
<details><summary>折りたたみ</summary><div>

```shell
pip install django
```
</div></details>

## 1-4 install apache2 
<details><summary>折りたたみ</summary><div>

```shell
apt install apache2 apache2-dev
apt-get install mysql-server

# 必要であれば
apt install apache2-utils ssl-cert
pip install mysqlclient
apt install build-essential libssl-dev libffi-dev python-dev
```
</div></details>


## 1-5 mod_wsgi適用
<details><summary>折りたたみ</summary><div>

```shell
pip install mod-wsgi
## 必要に応じて
sudo apt-get install libapache2-mod-wsgi
sudo apt-get install libapache2-mod-wsgi-py3
```
</div></details>

## 1-6 wsgi設定、動作確認
<details><summary>折りたたみ</summary><div>
### テスト用ファイル用意

```python
def application(environ,start_response):
    status = '200 OK'
    html = '<html>\n' \
           '<body>\n' \
           ' Hooray, mod_wsgi is working\n' \
           '</body>\n' \
           '</html>\n'
    response_header = [('Content-type','text/html')]
    start_response(status,response_header)
    return [html]
```

### wsgi関連の設定
apache設定を追加

```shell
python3 -c "import sys; print(sys.path)"
mod_wsgi-express module-config
# 上の情報を参考に
LoadModule wsgi_module [wsgiまでのpath]/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so
WSGIScriptAlias /neko /var/www/html/neko.py
```
</div></details>

</div></details>

# 2 Django準備
<details><summary>折りたたみ</summary><div>
>
## 2-1 プロジェクト構築 
<details><summary>折りたたみ</summary><div>
アプリケーションディレクトリをつくって、startproject、startapp。

```
mkdir project/
cd project/
django-admin.py startproject config .
python manage.py startapp web
```
</div></details>

## 2-2 Django起動確認
<details><summary>折りたたみ</summary><div>
Apache設定変更

```
WSGIScriptAlias / [アプリまでのpath]/config/wsgi.py
```

NotFoundError: No module named 'config'が出たらとりあえず。

```wsgi.py
import sys
sys.path.append('[アプリまでのpath]')
```
</div></details>

## 2-3 Web表示設定
<details><summary>折りたたみ</summary><div>
適宜修正
- config/urls.py
- web/urls.py
- web/viwe.py
</div></details>

</div></details>
AWS Certificate Managerを使って無料でSSL証明書を発行する

とある案件で EC2のサーバをSSLで公開したく、[AWS Certificate Manager](https://aws.amazon.com/jp/certificate-manager/) でSSL証明書を取得したときのメモ。

今回は

- ドメインを持っている(example1.xyz としました)
- そのドメインは、AWS Route 53(DNS)で管理している
- EC2サーバの前におくELB(Elastic Load Balancer) でSSLのリクエストを受ける

という前提で書いてます。またDNSは、自分で操作できるサーバであればRoute 53である必要はないのですが今回はそれ前提で。


## やってみる

[マネジメントコンソール](https://console.aws.amazon.com/console/home)で、Certificate Manager を表示。「今すぐ始める」を選択。
![a001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/82904025-4a26-4515-33ef-c3c3d26c07e6.png)

「証明書のリクエスト」を選択。
![a002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/8743f4fc-87ed-4538-ff42-b1ed83ed97d1.png)

ドメイン名に「*.example1.xyz」を入力して「次へ」をクリック。
![a003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/c48aae60-96ea-f071-9e8a-6f179d43648d.png)

このドメインの所有者であることを確認するために

- 「DNSを操作できること(CNAMEを追加出来る)」
- 「特定のアドレスでメールを受信できる」

いずれかが必要なんですが、今回はRoute 53でこのドメインを管理している想定なので「DNSの検証」を選択し「確認」をクリック。
![a004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/b958eeab-9657-57ba-923f-9807285b12d4.png)

確認画面です。「確認とリクエスト」をクリック。
![a005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/79b87b5a-60c6-5db9-9f22-bf48bc9130f9.png)

以上、こちらがDNS操作を行うのを待っている状態になりました。下記の画面で先頭の三角をクリックして開いてみると、、、
![a006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/29509457-f41a-96b0-2a2f-b64c00a014fe.png)

このCNAMEレコードを追加してくださいと出ます。外部のDNSサーバを使ってるなら適宜設定すればよいですし、このアカウントのRoute 53でホストしてるなら、ワンタッチで設定出来るボタンがあるので今回は「Route 53でのレコードの作成」をクリックします。
![a007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/ce14683a-bc82-ba08-503c-dcb8662998a5.png)

内容を確認し「作成」をクリック。
![a008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/1b544e2c-6222-8872-5770-b56c1e15ff13.png)

成功、とでました。「続行」で元画面に戻ってみると
![a009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/c7eec095-c464-36c5-0f1b-b4dad96ac32b.png)

初めは「検証保留中」となっていたのが、30分程度で、、、
![a010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/7af5cef3-e8e9-870f-276c-ad32a473491e.png)

発行済みとなりました！
![a011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/7900619d-7b55-d6bf-8a45-bdb63f05a3e6.png)


ちなみにRoute 53の画面で見てみても、たしかにCNAMEレコードが追加されています。
ちなみにこのCNAMEレコードは、検証が完了したら削除してよいかと思います。

**-- 2020/07/05追記 --**
コメントでご指摘をいただきましたが、 **CNAMEレコードを削除すると証明書を自動更新してくれなくなるので、検証を完了してもCNAMEレコードは削除しちゃダメ**でした。
自動更新を止めたい場合は削除して、などなどがユーザガイドに書いてありますね。
https://docs.aws.amazon.com/ja_jp/acm/latest/userguide/gs-acm-validate-dns.html#dns-delete-cname
ご指摘ありがとうございました。
**-- 2020/07/05追記 以上 --**

![a012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/17ce979e-16c9-70c9-2a91-dee7a45619e6.png)

作成した証明書は、ELBの作成ウィザードの途中で指定することで、使用することができます。
![b001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/31a09a6a-f9dd-045a-0165-f4e8a044ab77.png)

ELBを構築するところについては、またあらためて記事にしようと思います。

おつかれさまでした。
javascriptで任意の文字列をクリップボードにコピーしたいとき

自分用のメモ。

## code

```.javascript:copy.js
function copyCode(targetEl) {
  if (document.queryCommandSupported('copy')) {  // ①
    const range = document.createRange();
    range.selectNodeContents(targetEl);
    window.getSelection().empty();    // ②
    window.addRange(range);
    document.execCommand("copy");
  }
  else {
    alert('un supported');
  }
}

const btn = document.querySelector(".btn");
btn.addEventListener("click", () => copyCode(el));
```

## point
①：サポートしているかどうかで、処理を分ける。クリップボードへのアクセス・コピー処理は比較的新しい機能のようなので、レガシー対応している場合は必要。なお、 `queryCommandSupported` は全ブラウザバージョン対応しているとのこと（参照：https://caniuse.com/#search=queryCommandSupported）

②: `.empty` は基本必要ないと思われる。なぜ書いているかというと、 `button` や `a` など、クリックされることを前提としている要素以外にclickイベントを登録した場合に、 `.empty` を書かないとコピーできない。理由は分かっていないので、詳しい人がいたら教えてください。m(_ _)m


**supoprt**
pc
> IE9~

mobile
> ios 10.0~ 
> androind 4.2~
> https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand
docker環境を初期化し隊（全部ぶっ壊しコマンド）

`docker system prune`だと停止されてるやつしか消えないので、
先に`docker stop $(docker ps -q)`で動いてる全てのコンテナ停止してあげる


## docker全部ぶっ壊しコマンド
```
docker stop $(docker ps -q) && docker rm $(docker ps -q -a) && docker rmi $(docker images -q) && docker network prune
```

これより:frowning2:

```
docker stop $(docker ps -q) && docker system prune -a
```
の方が短い気がしてきた:relaxed:
Surface bookでUbuntuをデュアルブートしてみた。

こんにちは！
プログラミング勉強中の文系大学生です。
今回はSurface bookにUbuntuをデュアルブートしたので、その過程について簡単にご紹介します。

##Ubuntuのための場所を確保
まず、Ubuntuを入れるための場所を確保しなければいけません。
そのために「ディスク管理」とパソコン内で検索していただくと
<img width="400" height=alt="スクリーンショット (46).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348284/a2c2c053-f9eb-e029-2538-25874e4f7014.png">
「ハードディスク　パーティション～」と出てくると思うのでこれをクリックしてください。
すると下のような画面が出てくるはずです。
![スクリーンショット (48).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348284/4cd8fe50-085a-952b-9645-7e15a2b6482c.png)
これの「Local Disk(C:)」と書いてあるところを右クリックすると（画像は違うところを選択していますが）「ボリュームの縮小」と出てきます。
それをクリックするとUbuntuを入れるための場所を確保することができます。
僕は35GB確保しましたが、多いに越したことはないのでできるだけ多く確保しましょう。








##USBを準備する
UbuntuをインストールするためにはUSBにそのUbuntuのファイルを入れなければなりません。
そこで[Rufus](https://rufus.ie/)を利用していわゆる`ライブUSB`にします。
ライブUSBにするまでの手順は

[「Linuxをインストールできる「ライブUSBメモリ」をWindowsで作成する方法【スクリーンショットつき解説】 | Linux Fan」](https://linuxfan.info/make-linux-install-usb-on-windows)

で解説してくれています。
しかし、僕のインターン先の人(Surfaceを使用している人)はUbuntuをインストールするとキーボードが効かなくなってしまいました。
ただ、成功した例もあるので今回はそれを紹介します。

[【Ubuntu】SurfaceにUbuntuは入れられるのか？！ デュアルブートを試してみる【Windows】](https://www.milkmemo.com/entry/surface_ubuntu_install)

上記の記事は成功例です。
僕も上記のように`16.04 LTSバージョンのISOイメージ`を利用しました。
これをUSBに入れます。

[16.04 LTSバージョンはこちらから](https://www.ubuntulinux.jp/News/ubuntu1604-ja-remix)


##Ubuntuをインストール
そして、USBに入ったUbuntuをインストールするために

`1. 設定`
`2. 更新とセキュリティ`
`3. 回復`
`4. PCの再起動をカスタマイズするの今すぐ再起動する`
`5.再起動`したら`デバイスの使用`をクリックして、`USBstorage`をクリックします。

1~5をやっていくと真っ黒の画面が出てくると思います。
その画面の一番上の選択肢に***installing ubuntu***という選択肢が出てくるのと思うのでそれをクリックです。
すると、どういう方法でインストールするかの選択肢が出てくると思います。
その中の「***UbuntuをWindows Boot Managerとは別にインストール***」を選択してください。
ここで間違うと、元あったOSが吹き飛んでしまうので、絶対これを選択するようにしてください！！
そして、諸々の設定をしてインストール完了です。

##キーボードがきかねぇ、、、
ここら辺で問題が発生します。
それは***キーボードが全く効かなくなります***。
なので外付けのキーボードやマウスを用意しておかないと詰みます(笑)
僕の場合はタッチパッドが機能したので、マウスはいりませんでしたが、キーボードが効かなくなりました。
なので、パスワードなどの設定を入力できなくなります。
こうならないためにも絶対キーボードとマウスを準備しておきましょう！！

##新しい物にアップデート
「このままキーボードは使えないままなの？」
いえ、そんなことはありません！
最新のバージョンにアップデートを行うことで僕の場合はキーボードが効くようになりました。
この手順で僕はインストールに成功したので、Surfaceユーザーの方は試してみてください！！
最後まで読んでいただきありがとうございます。

##参考文献
[【Ubuntu】SurfaceにUbuntuは入れられるのか？！ デュアルブートを試してみる【Windows】](https://www.milkmemo.com/entry/surface_ubuntu_install)
[WindowsにUbuntuをインストールするのは気持ち良いゾイ!!~導入編~](https://qiita.com/Takumi_Kaibara/items/4132e552a615a050a841)
CCNAってなんだ？

# はじめに
この記事は、CCNAを受験しようと思ったとき、なんか複雑でよくわかんないなあと思ったので、自分なりにまとめてみました。
CCNA受験しよう、と思った方いらっしゃいましたら参考にしていただきたいと思います。

# CCNAとは
>ネットワーク技術についての基礎的な知識が問われるCCNAは、ネットワークエンジニアやインフラエンジニアにとって登竜門となる資格です。そのため、ネットワークエンジニアやインフラエンジニアとして活躍していきたいと考えている人は取得しておくべきです。また、CCNAは世界共通基準の資格のため、海外でエンジニアとして活躍したい人にもおすすめです。
CCNAは、ネットワークエンジニア・インフラエンジニアとしてスキルアップ、キャリアアップを目指す人にもおすすめの資格です。自分自身のスキルや知識を見直すためにCCNAを活用してみましょう。
[EARTH LAB](https://earthlab.tech-earth.net/ccna-information-study/)より引用


# 難易度は？
CCNAの難易度はアソシエイトレベルとなっており、基礎レベル位置らしいです。（けど難しいと思う。）

# 種類は2つ

- ICND1
>ICND1とはCCENT資格と同義となっており、ICND1に合格すればCCNT合格に値するもので、その後ICDN2という試験に合格した場合はCCNAに認定されることになっている。つまり、CCNA（Cisco Certified Network Associate）資格の前段階に位置している新しい資格のことを指し、いずれもシスコ技術者認定試験のことである。
近年CCNA資格の難易度が上がっていることがあり、ネットワークエンジニアになろうとする人の門戸を広げるために登場し、CCNA資格取得を目指す人々のステップアップ資格という意味合いで受験する人が増えてきている。
CCENTと同義ではあるが呼称としてはCCENTの方が主流となっており、CCENTの試験区分としてICND1という基礎的なネットワークや、スイッチなどの小規模ネットワークの知識、トラブルシューティングが行える知識と技能などが出題される。
[KENスクール](https://www.kenschool.jp/dictionary/network/icnd1.php)から引用

- ICND2
>ICND2とは、正式にはInterconnecting Cisco Networking Devices part2という。
CCNA（Cisco Certified Network Associate)を取得する際に、ICND1とICND2の2科目合格して、CCNA合格となる。
そのため、ICND1を合格してからICND2を受けるのが一般的である。
初心者向けの資格であったが、現在では、内容のレベルが上がり初心者向けと言わなくなってきている。
ネットワークを学びたい人におすすめする資格である。
CCNAよりCCENT（Cisco Certified Entry Networking Technician)のほうが初心者向けと言える。
ICND2を取得することで、ネットワークエンジニアの視野が広まるため、ステップアップ資格という意味合いからも近年受験生が増加してきている。
[KENスクール](https://www.kenschool.jp/dictionary/network/icnd2.php)から引用

## ICNDとは
>ICNDとはシスコ社で実施されているCisco Certified Network Association認定資格を得るための試験であり、Interconnecting Cisco Networking Devicesの略である。この認定資格を得るためには、ICND1とICND2の2科目に合格する必要がある。
現在Ver3が実施されており、ICND1の試験時間は90分で問題数は40問から50問、ICND2の試験時間は75分、問題数は40問から50問である。試験は参考書などの持ち込みは不可とされており、参考資料の使用も認められていないが、試験範囲についてはシスコ社の公式サイトにて公開されている。また参考書や問題集などの一般書籍も発売されている。
[KENスクール](https://www.kenschool.jp/dictionary/network/icnd.php)から引用


# CCNAを取るためには
ICND1(100-105J)とICND2(200-105J)の両方に合格するか、CCNA(200-125J)に合格するかの2通り。

- ICND1(100-105J)とICND2(200-105J)の両方に合格
    - CCENTとCCNAの両方認定。

- CCNA(200-125J)に合格
    - CCNAのみ認定

- ICND1のみ合格
    - CCENT認定

# 料金

| 項目              |料金         |
|:-----------------|:------------|
| ICNA1            |19,800 + tax |
| ICNA2            |19,800 + tax |
| CCNA             |13,000 + tax |


安くはないですね。一発で受かりたいです。


# まとめ
よく調べました。複雑な仕組みになっていて、CCNA受けよう！て思ったときに、ICNA1とICNA2？？て感じでよくわかんなかったので、書きました。
まだどういう方法でCCNAを受験するか決めていませんが、時間もあまりないので、効率よく取れる方法を模索していきます。
以上です。
【リリース】Nextcloud のバージョン 16.0.2、15.0.9、14.0.13 がリリースされました

2019年7月5日に Nextcloud の最新バージョンとして、16.0.2、15.0.9、14.0.13がリリースされました。
16.0.2 では50個程度の変更、15.0.9 では 30個程度の変更、14.0.13 では 10個程度の変更となっております。

変更としては小さいですが、マイナーバージョンアップでは信頼性、セキュリティ、安定性の向上を目指しています。
特に今回の内容には、セキュリティ関連で権限昇格の可能性がある事に対する修正も含まれておりますので、利用されている方はアップデートを強くお勧めします。
リリースにあたっては RC版を提供して広範囲なテストを行っておりますので、より信頼できるものが提供されております。Nextcloud 社ではセキュリティを重要視しており、[Nextcloud 社の公式 Blog](https://nextcloud.com/blog/nextcloud-16.0.2-15.0.9-and-14.0.13-available-now/) では `"Running web facing software without regular updates is risky and quite frankly, irresponsible." (Web ソフトウェアを定期的に更新しないで利用し続けることは危険であり、率直に言って無責任だ。)` と書かれるほど、アップデートを強く薦めております。
Nextcloud の更新スピードはとても早いので、更新を前提とした運用をしていくことが薦められます。

**14系の公式サポートは間もなく(=2019年9月)終了となります。16系もしくは15系へのアップグレードの検討／適用を強くお勧めします。**

### 主な改善点

- グループフォルダの全文検索の修正
- LDAP に関する修正
- クォータが0に設定された時に新しいファイルメニューを隠す
- Redis クラスタのパスワード設定する機能追加
- その他セキュリティ関連の修正

今回のリリースのうち、 16系のアップデートでは以下の既知の問題がありますが、いすれも表面的なもので運用上は問題ないことから、Nextcloud 社では今回の更新を行うことを薦めております。

* ほとんどのユーザーにて、完全な更新が行われるまで、アプリとユーザーの概要は白く表示される（Shiftキーを押しながらブラウザの更新ボタンを押す）
* `/apps/viewer` ディレクトリ内の `cypress.json` ファイルと `cypress` ディレクトリを削除することで解決できるファイルの整合性に関する警告が存在する

**★この記事は、[スタイルズ社のNextcloudサイト](https://nextcloud.stylez.co.jp/) の [Nextcloudブログ](https://nextcloud.stylez.co.jp/nextcloudblog)にも公開しております！**
『ディープラーニングと物理学』に出てくるキーワード集（第Ⅰ部　物理から見るディープラーニングの原理）＃随時更新

# 【第I部 物理から見るディープラーニングの原理】
[こちら](https://qiita.com/Nimimal/items/4ceec8e46dea54258555)の続き。

```
書式は、『キーワード(出現ページ)　参考リンク』です。
```

## 第2章 機械学習の一般論
- MNIST(p22) https://weblabo.oscasierra.net/python/ai-mnist-data-detail.html
- CIFAR-10(p22) http://starpentagon.net/analytics/cifar-10_dataset/
- データ生成確率(p26) http://www.ms.k.u-tokyo.ac.jp/2015/IPSJ-math-jp.pdf
  - also, https://i101330.hatenablog.com/entry/2016/10/05/000720
- 汎化誤差(p28) https://qiita.com/kaityo256/items/136f43fe8c2055155d9e
- 経験誤差(p28) 別名：標本誤差 http://ibisforest.org/index.php?%E6%A8%99%E6%9C%AC%E8%AA%A4%E5%B7%AE
- VC次元(p30) https://mathwords.net/vcjigen
- ディラックのデルタ関数(p30) http://zellij.hatenablog.com/entry/20120613/p1
- オッカムの剃刀(p31) https://matome.naver.jp/odai/2144214153990125501
- 赤池情報量基準(p31) 別名：AIC https://tomsekiguchi.hatenablog.com/entry/20190103/1546497459
- (確率的)勾配降下法(p32) 別名：SGD https://qiita.com/kenmatsu4/items/d282054ddedbd68fecb0
- バッチ学習、オンライン学習(p34) https://dev.classmethod.jp/machine-learning/online-batch-learning/
- 誤差逆伝播法(p35) https://www.yukisako.xyz/entry/backpropagation
- ベイズの定理(p38) https://bellcurve.jp/statistics/course/6444.html
- モンティホール問題(p38) https://www.krsk-phs.com/entry/montyhall
- ガウス分布（正規分布）(p43) https://mathtrain.jp/gaussdistribution
- ＡdS時空（反ド・ジッター時空）p45 http://quattro.phys.sci.kobe-u.ac.jp/dmrg/Kyoto2011/Proc/Nakamura.pdf
    - also, https://www.ipmu.jp/sites/default/files/imce/news/43J_Feature.pdf

------
# [以下、更新予定]

## 第3章 ニューラルネットワークの基礎

## 第4章 発展的なニューラルネットワーク

## 第5章 サンプリングの必要性と原理

## 第6章 教師なし深層学習
MySQL8.0のSQLの新機能について調べたこと

MySQL8.0 リリース記念3部作の執筆時に調べたことのまとめ(後日談)です。

MySQL8.0のWindow関数のサンプル集
[https://codezine.jp/article/detail/2678](https://codezine.jp/article/detail/2678)

MySQL8.0の再帰With句のサンプル集
[https://codezine.jp/article/detail/2679](https://codezine.jp/article/detail/2679)

MySQL8.0で『SQLパズル』の問題を解く
[https://codezine.jp/article/detail/2680](https://codezine.jp/article/detail/2680)

#メモ01 DML文のOrderBy句でのWindow関数は使用不可
```sql
Delete from テーブル order by dense_rank() over(order by ソートキー)
limit 1;
```

みたいなDMLは文法エラーになりました。

余談ですが、Oracle12cだと

```sql
select * from テーブル
order by dense_rank() over(partition by PID order by ソートキー)
limit 1 with ties;
```

なんてSQLが動いたりします。いつか使いたい :smiley:

#メモ02 再帰With句の再帰項のSelect句でのWindow関数
OracleとPostgreSQLでは、使用できるが
MySQL8.0.15では文法エラー

```sql
-- Oracle18cでは動作します
with rec(Val,NodeCnt) as(
select 1,1 from dual
union all
select 1,NodeCnt + count(*) over()
  from rec
 where NodeCnt <= 5)
select * from rec;
```

MySQL 8.0.19からは、
Limit句を使って探索ノード数を制限可能になったようです。

A new, simple way to figure out why your recursive CTE is running away
[https://mysqlserverteam.com/a-new-simple-way-to-figure-out-why-your-recursive-cte-is-running-away/](https://mysqlserverteam.com/a-new-simple-way-to-figure-out-why-your-recursive-cte-is-running-away/)

#メモ03 PostgreSQLのマニュアルにある、Limit句を使った非公式な枝切り
[https://www.postgresql.jp/document/9.0/html/index.html](https://www.postgresql.jp/document/9.0/html/index.html)
は、MySQL8.0で使用できず(無限ループしました)

```sql
-- PostgreSQL8.4では動作します
WITH RECURSIVE t(n) AS (
    SELECT 1
  UNION ALL
    SELECT n+1 FROM t
)
SELECT n FROM t LIMIT 100;
```

#メモ04 MySQLの再帰With句でズンドコキヨシ
```sql
with recursive rec(LV,ZunDokoStr) as(
select 0,Cast('' as Char(4000))
union all
select LV+1,concat(ZunDokoStr,if(RAND() > 0.5 ,'ズン！','ドコ！'))
  from rec
 where LV = 0 or ZunDokoStr Not Like '%ズン！ズン！ズン！ズン！ドコ！')
select concat(ZunDokoStr,'キ・ヨ・シ！') as "ズンドコキヨシ"
  from rec order by LV desc Limit 1;

ズンドコキヨシ
------------------------------------------------
ドコ！ズン！ズン！ズン！ズン！ドコ！キ・ヨ・シ！
```

#メモ05 SQLパズル56 ホテルの部屋番号
MySQLには、OracleのRowIDや、PostgreSQLのctidのようなものはない。

MySQLでは、Update文のCurrent Ofは使用不可
[https://dev.mysql.com/doc/refman/5.6/ja/cursor-restrictions.html](https://dev.mysql.com/doc/refman/5.6/ja/cursor-restrictions.html)
>UPDATE WHERE CURRENT OF および DELETE WHERE CURRENT OF は、
>更新可能なカーソルがサポートされていないため実装されません。

なので、alter tableで主キーでも付けないと無理ということで
alter tableでオートインクリメントな主キーを追加し、
[https://bugs.mysql.com/bug.php?id=88397](https://bugs.mysql.com/bug.php?id=88397)
のGuilhem BichotさんのUpdate文を、Using構文を使ったJoinに変更したものを解としました。
.emacsファイルの編集について


emacsのコピーした時に保存される領域、Kill ringをmacのクリップボードと連携する必要があったので、
適当にググって見つけた下のコードを.emacsファイルに書き込んだ。

```lisp
(defun copy-from-osx ()
 (shell-command-to-string "pbpaste"))

(defun paste-to-osx (text &optional push)
 (let ((process-connection-type nil))
     (let ((proc (start-process "pbcopy" "*Messages*" "pbcopy")))
       (process-send-string proc text)
       (process-send-eof proc))))

(setq interprogram-cut-function 'paste-to-osx)
(setq interprogram-paste-function 'copy-from-osx)

```

しかし、.emacsファイルでsource .emacsとすると、
```
.emacs:4: bad pattern: (text
.emacs:4: command not found: optional
.emacs:8: parse error near `)'
```
こうなる。

しかし、なぜか、emacsからクリップボードにコピーすることはできるようになっていた。
Sourcetree に SSHで接続する mac

パソコンを買い換えるたびに、SSHの設定ができなくて困っている自分のためにw

#SSH認証の公開鍵と秘密鍵を作成する
1. Terminalを開いて以下のコマンドを入力

```
$ ssh-keygen
```
* 鍵の保存場所など聞かれるが、問題ないので「Enter」をクリックし続ける
* パスワードを2回入力する
* 鍵が生成される（id_rsa: 秘密鍵, id_rsa.pub: 公開鍵）

以下のコマンドを叩いて、鍵が生成されているか確認する

```
$ cd ~/.ssh 
$ ls
id_rsa		id_rsa.pub
```
上記のように鍵が生成されたら終了。

※ SSHでアクセスした際にパスワード聞かれないようにするを追記する

#BitbucketにSSH鍵を登録する

Terminalを開いて以下のコマンドを叩いて、鍵をクリップボードにコピーします

```
$ pbcopy < ~/.ssh/id_rsa.pub
```

[Bitbucket](https://bitbucket.org/dashboard/overview)にブラウザにアクセスします
次にページ下にある「Bitbucket Setting」をクリックします
<img width="304" alt="スクリーンショット 2019-07-06 15.02.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82942/def1cc97-af5b-981b-313b-ced6c1e43654.png">

1. セキュリティ > SSH鍵 をクリックしページに移動
2. ページにある「SSH 鍵を追加」をクリックします
3. 「Lable」には鍵の名前を入力「Key」に先程クリップボードに保存した鍵を貼り付けます<img width="800" alt="スクリーンショット 2019-07-06 15.07.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82942/09485e6e-7b08-b534-2f97-d7453df3f5e2.png">
4. 「鍵を追加」をクリックして鍵を保存して終了

##githubのSSH鍵の保存場所
<img width="999" alt="スクリーンショット 2019-07-06 15.15.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82942/f4df0987-f355-b189-ffc1-a801eb7559de.png">
tldjsでurlからdomainを取り出す方法 


# tldjsでできます

振り返るとこんな感じで悩んでいました。

### 今回実現したいこと
URLからdomainをぬきだすには
トップレベルドメインとかルートドメインとか調べました。
zoneで取れないかとdnsやurlも試して色々無理ななか、
やりたいことはこれでした

```
https://aaaaa.google.co.jp/1234/455/　をこうしたい　→　google.co.jp
http://bbbb.google.com/?q=domain　　　 をこうしたい　→　google.com
https://ccccc.saitama.co.jp?　　　　　　をこうしたい　→　saitama.co.jp
https://www.meti.go.jp/　　　　　　　　　をこうしたい　→　meti.go.jp
```

すぐ思いつく可能性でlocationからとることはできないことも、次のスクショから明白でした。
<img width="673" alt="スクリーンショット 2019-07-06 14.46.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1088/33920a52-bdf9-cb7a-93bf-0437dc14f858.png">


ならこうしようとしました

```
トップレベルドメインを列挙して、それが出てくる場所を探して、そこからみつからる最初の　ピリオド「.」を探して・・・
```

でもむりっしょ？


# だからtldjsを使おうって話
https://www.npmjs.com/package/tldjs


## tldjsをつかうと、このように分解してくれます。
tldjsはurlからdomainを取り出し
おそらく先に挙げたアタックのようなこともやってる。
試しに600サイト確認したけどエラーも起きなかった。


### 使い方はとっても簡単


このようなjsをかいておくと、

```js
const tldjs = require('tldjs');
tldjs.parse('https://www.enecho.meti.go.jp/about/special/johoteikyo/interview14ushikubo02.html');

```

実行結果がこうなります

```js
{ hostname: 'www.enecho.meti.go.jp',
  isValid: true,
  isIp: false,
  tldExists: true,
  publicSuffix: 'go.jp',
  domain: 'meti.go.jp',
  subdomain: 'www.enecho' }
```


### 一連のコードにするとこんん感じ

```js

const tldjs = require('tldjs');
const result = tldjs.parse('https://www.enecho.meti.go.jp/about/special.html');
console.log(result.domain); 

```

結果はもくてきどおりとなりました

```
 =>　meti.go.jp
```

  
  

今では、これを使って大量のサイトからトップレベルドメインにあるはずの、特定情報取り込んでいます。

`他にparse-domainでもできるよ`
`自前でも作ることができるよ`
いろんなやりかたあるけど、ltdjsは便利でした
ウィナー・ホッフ方程式をPythonで解いてみた，その3

#ウィナーフィルタを最急降下法(NLMS[^3])で解く
[^3]: normalized-least-mean-square

[^1]: 詳細は[音のアレイ信号処理](https://www.amazon.co.jp/dp/4339011169)

数式[^1]は

```math

\min_{\boldsymbol w_k} \|\boldsymbol w_k - \boldsymbol w_{k-1}\|^2 \\
\text{subject to } \boldsymbol w_k^H \boldsymbol u_k  = d_k
```
を解いてこう。

```math

\begin{align}
  \xi_k &= d_k - \boldsymbol w^H_{k-1} \boldsymbol u_k \\
  \Delta \boldsymbol w &=  \frac{1}{ \| \boldsymbol u_k \|^2} \boldsymbol u_k \xi^*_k\\

  \boldsymbol w_k &= \boldsymbol w_{k-1} + \Delta \boldsymbol w  \\
      &= \boldsymbol w_{k-1} + \mu \frac{1}{ \| \boldsymbol u_k \|^2} \boldsymbol u_k \xi^*_k \\

\end{align}

```

ただし，$\| \boldsymbol u_k \|^2$が非常に小さいと不安定になるため，下記のようにする。

```math

\begin{align}
  \boldsymbol w_k &= \boldsymbol w_{k-1} + \mu \frac{1}{\alpha + \| \boldsymbol u_k \|^2} \boldsymbol u_k \xi^*_k \\

\end{align}

```

Python で書くとこう。

```python
# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt
import scipy.signal as sg
from mpl_toolkits.mplot3d import Axes3D


z  = np.arange(0, 512)
h0 = 1 / (1 + np.exp(0.0001 * (z - 128) ** 2))
#h0=1/(1+np.exp(0.03*z))

Wref  = h0 / np.sum(h0) * 2
plt.plot(Wref)
plt.title("$w_{ref}$")
plt.show()

#x  = np.linspace(0, 1, 4096)
x  = np.linspace(0, 2, 8192)
#y1 = np.sin(2 * np.pi * x) + 0.2 * np.sin(np.pi * 20 * (x + 0.1))
y1 = np.sin(2 * np.pi * x) + 0.2*np.sin(np.pi * 20 * x + 0.1 * np.pi)
y2 = sg.lfilter(Wref, [1], y1)

plt.plot(x, y1)
plt.plot(x, y2)
plt.legend(["$y1$", "$y2=y1 * w_{ref}$"])
plt.show()


μ = 0.5
α = 0.00001

N  = np.arange(0, len(x))
yk = np.zeros(len(N))

K  = 512
wk = np.zeros((len(N), K))
ξk = np.zeros(len(N))

for n in N[1:]:
    uk = np.array([ y1[n - k] if n >= k else 0 for k in range(0, K) ])
    dk = y2[n]
    ξk[n] = dk - wk[n-1].T @ uk
    #wk[n] = wk[n-1] + μ * uk * np.conj(ξk[n])
    wk[n] = wk[n-1] + μ * uk * np.conj(ξk[n]) / (α + (np.linalg.norm(uk) ** 2))
    yk[n] = uk.T @ wk[n]


plt.plot(ξk)
plt.legend(["$ξ_k$"])
plt.show()

plt.plot(y2)
plt.plot(yk)
plt.legend(["$y2$", "$yk$"])
plt.show()


err = diff_lm = np.sum(np.abs(wk - np.ones((wk.shape[0],1)) * Wref), axis=1) / np.sum(np.abs(Wref))
plt.plot(err)
plt.legend(['$\\frac{ \| w_k-w_{ref} \| }{ \| w_{ref} \| }$'])
plt.show()


XX, YY = np.meshgrid(np.arange(wk.shape[1]), np.arange(wk.shape[0]))
plt.figure().add_subplot(111, projection='3d').plot_wireframe(XX, YY, wk)
plt.title("$wk$")
plt.show()
```

ただ，これで推定すると，$w_k$が$w_{ref}$にならない。でも，$\xi_k$は小さい。この$w_k$も正しい解なのだろうか。。。
XPS 8930にUbuntu 18.04.2インストールしてみた話

## 構成

### もともとあったもの

- XPS 8930
- CPU i7 9700
- GPU RTX 2060
- SSD M.2 NVMe PCIe *4 512GB
- HDD 2TB
- メモリ DDR4 16GB

### 追加で用意したもの

- SATA 2.5 inch 256GB (Ubuntuを入れる)
- USBメモリ 16GB (OSイメージを焼くため)

## インストールの際画面がちらついてLive Sessionさえも起動できなかった

### Live Sessionで起こったこと

- RTX 2060のドライバーがデフォルトで入っているカーネルのグラフィックドライバと相性が悪いらしい
- GRUB2の起動後OSを選択した時点で画面がちらついたり、いろいろなデバイスが読み込めなくなったりと散々な状況

### 解決方法

- GRUB画面でコマンドを入力して800 * 600くらいの解像度で出力した結果問題は解消（インストール画面の描画に成功）下記参考リンクです
- [nVidiaのGPU搭載PCにUbuntuを入れようとしてハマった - Qiita](https://qiita.com/bohemian916/items/8c7f0c4b3d3ea0958559)

```c
linux	/boot/vmlinuz-4.18.0-25-generic root=UUID=ea81cff2-7b03-406c-850a-8ff2ad9ca6ae ro  quiet splash $vt_handoff
```

- 要約するとGRUBの画面でe を入力して`quiet splash`を`nomodeset`にすることで解決します
- **とりあえずLive Sessionが起動するようになります**
- ドライバが適用されないため散々な画面の縦横比に対して解像度の縦横比があっていない上に極端に解像度が低いです
- その画面で適当に256GB のディスクにインストール(好きなデバイスでOK)
- 次の起動の際(Live SessionではなくインストールされたOSを起動するとき)も上記の作業します(`quiet splash`を`nomodeset`に)！

### 余談(読み飛ばしてOK )

- Ubuntu 19.04の場合デフォルトでGRUBにグラフィックドライバ使わないみたいなオプションがありました→それを選ぶだけで良い
- インストール後は結局起動しないので`quiet splash`を`nomodeset`にする
  - 検証していません
- Zorinの場合は18.04ベースですが、GRUBに上記のオプションありました(Nvidiaのグラフィックドライバ使うオプションもありました)
  - Nvidiaのグラフィックドライバ使うオプションを選択した場合起動しませんでした

## インストール後にグラフィックドライバを入れる

### まともに動くグラフィックドライバを入れる

- 先程の部分でインストールが終わりインストール後に起動できたとします
- グラフィックドライバ読み込まず起動しているためCUDA入れてグラフィックドライバ入れてそれを使うようにします

[CUDA Toolkit 10.1 Update 1 Download | NVIDIA Developer](https://developer.nvidia.com/cuda-downloads)


![CUDA Toolkit 10.1 .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455506/8afa74b7-8b7e-1ec3-1a83-e2b8a37a1ac9.png)

- 上記サイトから必要なコマンドが書かれたbashのコードを実行

```bash
sudo dpkg -i cuda-repo-ubuntu1804_10.1.168-1_amd64.deb
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
sudo apt-get update
sudo apt-get install cuda
```

- 18.04くらいからリポジトリを追加した際自動で `apt update	`のコマンドを実行してくれるため、`sudo apt-get update`は不要かも
- なんとはなしにやっていますがこれが正しいかどうか保証はありません

### Secure bootでも起動させるときの設定

- [UEFI のセキュアブート機にNVIDIAのドライバを入れる話 - Qiita](https://qiita.com/arc279/items/99f08b549c95881007b9)
  - 上記参考にしました
- (署名なしのドライバ？モジュール？はbootの際弾かれます)
- 今回はSecure bootはEnabledのままでやりました (~~OFFにしろって記事が多すぎ！~~)
- 任意のパスワードを作成します (次にbootする際BIOS側で入力します)
- CUDAインストール再起動します `reboot`
- 結果: Secure bootは不用意にDisabledにしなくてもできました

## NVMeのSSDが表示されない

### 起こった事象

- 何気なくインストールの流れについて書いていますが、NVMeのSSDは一連の作業でUbuntu側で一切見えていませんでした
  - インストールの際、別のドライブにインストール(SATA接続 2.5 inch  SSDを別途用意)
- M.2 のNVMeのSSDは初期のBIOSの設定だと表示されない

### 解決方法

- BIOSの設定を開き'RAID on'を'AHCI'に変更
- Windows が起動しなくなります。え？
dump1090の地図を国土地理院に変更してみた

[ADS-Bの受信プログラムのdump1090](https://qiita.com/yamori813/items/87ec7cc7f2de5c421c3c)がgoogle mapのjavascriptで表示していたのが、google mapが無料で使えなくなったので、別の方法を探したところ、とても良い記事がありました。

https://ktgis.net/service/leafletlearn/index.html

この記事を参考にdump1090の地図を[国土地理院の地図](https://maps.gsi.go.jp/development/ichiran.html)に変更してました。

サンプルに元々のjsonを読んでいるコードを追加してマーカを表示するようにしてみました。jsonのデータの処理のロジックはそのまま実装しました。

LeafletというJavaScriptのライブラリを使うことができるようですが、このライブラリにはマーカーに付加情報を表示する機能としてポップアップとツールチップというものがありました。ポップアップはクリックすると出てきてツールチップはマウスオーバーで出てきます。

今回はツールチップを使ってjsonに入っているflightを表示するようにしました。最初に受け取ったjsonにはflightが入っていないこともあるので、再読み込みした時に再設定するようにしました。

![スクリーンショット 2019-07-06 23.05.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/5f69f674-9443-c331-7002-94265fc36942.png)

ADB-Sのパケットは常にICAOの24ビットのアドレスが含まれていますが、それ以外は別々のようでflight名は時々しか送られてこないようです。

jsonには飛行機の方向が入っていて、元の地図では三角の頂点がその方向を向いていました。

Leafletで同じようにするためにまずcssで三角を描いてそれを回転させる方法を考えました。回転は以下のライブラリを使うと簡単にできました。

https://github.com/bbecquet/Leaflet.RotatedMarker

三角はちょっと味気ないのでアイコンを使う方を調べてみたところsvgというものがあることを知りました。昔からページ系の技術にはまったく疎い私です。

でsvgのフリーのアイコンを探したところペンタラボさんがフリーの素材を提供していて、それを使うことにしました。

svnの書き方はいろいろ検索してhtmlで書く方法を見つけました。他に良い方法があるのかもしれませんが。

https://github.com/yamori813/dump1090_js/blob/master/gmap.html

gmap.htmlがあるディレクトでdump1090に--netオプションを付けて起動すると読み込まれます。

アイコンはマーカーの位置が左上になるようなのiconAnchorでセンターに表示されるように調整しました。

当初「標準地図」をつかっていました、「淡色地図」の方が見やすいようです。

L.control()を使ってツールチップのマウスオーバーで地上高と速度を表示するようにしてみました。また日時とスケールを表示するようにしました。

![スクリーンショット 2019-07-09 8.32.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/f1dbaa88-8f08-709c-1b9a-d46c895fa242.png)

最終的に[このサンプル](https://leafletjs.com/examples/choropleth/)を参考にしたのですが、当初全く分からずたどり着くまで、結構いろいろ検索しました。flightradar24のような左に表示領域を作る方法も調べたのですが、わからなかったのと、地図の表示領域を狭くするのは得策ではないので、この方法でよかった気がします。

気を良くして1mの塩ビパイプを近所のホームセンターで買ってきてコリニアアンテナを入れて、室外に設置したところすごく感度がよくなりました。

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3130343036362f34613063656165392d376266392d323864662d643738662d3765646437373361363763382e6a706567.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/72ecc3b0-9067-8e9d-7840-3b0e83b8fc52.jpeg)

この写真では結束バンドで固定してますが、嵐で吹き飛ばされました。そのため針金で固定するようにしました。

10Km先を3.5Km(11483ft)の高さを飛行している場合19度くらいになり、結構低い角度になるので、地形にかなり左右されるような気がします。

![airplan-tan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/ec71ad6c-e339-a3bd-5eab-921e448322c4.png)


dump1090はオリジナルを使っています。forkしたものではすでにOpenStreetMapに変更されているようですが、ZRouterでビルド設定を作るのが面倒なので、依存が少ないオリジナルを使っています。

動画をYoutubeに上げてみました。

https://youtu.be/34_EQ7BMjb0

2025.6 orglat,orglonからの距離を海里(nautical mile)で表示するようにしてみました。都庁の緯度経度を入れてあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/f03dc069-c33a-4633-9ade-30e1bfd8273a.png)