OmniAICreator/Qiita-1.07M huggingface dataset:
pythonで小さい浮動小数値を扱う


#はじめに
自分用メモです。
python3でシミュレーションをしていて問題に当たりました。問題が起きた部分を、簡単にすると以下のコードのようになります。

```py

def f(a):
    return 1 - (1 - a)**0.5

f(0.00000000001)
# 5.000000413701855e-12
f(0.000000000001)
# 5.000444502911705e-13
f(0.0000000000001)
# 5.007105841059456e-14
f(0.00000000000001)
# 4.9960036108132044e-15
f(0.000000000000001)
# 5.551115123125783e-16
f(0.0000000000000001)
# 0.0
f(0.00000000000000001)
# 0.0
```

数学的に言えば、関数fは引数aの値が0に向かって小さくなるにつれて、返り値が0に近くはずですが、aが0でない限り、結果は0にならないはずです。数値計算の限界として、ある程度aが小さくなった時に返り値が0になるのは仕方がないとして、aの値がたかだがe-17程度で結果が0になってしまっています。もうちょっと頑張ってもらえないか、というのが今回のテーマです。

##decimalモジュールを使う
[公式ドキュメント](https://docs.python.org/ja/3.7/library/decimal.html)を見て解決しました。decimal モジュールを使えば良いようです。

decimalモジュールをimportした上で、有効桁数を指定します。

```py
from decimal import *
getcontext().prec = 100
```

数値をDecimalオブジェクトに変換してから計算します。Decimalオブジェクトは、足し算引き算にもちいることはできますが、0.5乗とかはできず、0.5をDecimalオブジェクトに変換してから計算する必要があるようです。

```py
def g(a):
    return 1 - (1 - Decimal(a))**Decimal('0.5')

#実行
g(0.00000000000000000000000000000000001)
#Decimal('5.0000000000000000392877259729119015321129309725540314195553793115E-36')

```
ここで返り値はDicimalクラスのオブジェクトです。
Decimalからfloatに戻すには、float()に渡します。

```py
def h(a):
    x = 1 - (1 - Decimal(a))**Decimal('0.5')
    return float(x)

h(0.0000000000000001)
#5e-17
h(0.000000000000000000000000000000000000001)
#5e-40
```
これで計算できるようになりました。

さっき設定したgetcontext().precはなんでしょうか？

```py
getcontext()
#Context(prec=100, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[Inexact, FloatOperation, Rounded], traps=[InvalidOperation, DivisionByZero, Overflow])

#タイプを調べます。
type(getcontext())
#<class 'decimal.Context'>

```
prec以外の設定もここから変えられるようです。

意識していませんでしたが、浮動小数値を扱う時に、仮数部が長いと丸められてしまいます。

```py
#ぎりぎりアウト
a = 0.99999999999999999
print(a)
#1.0


#ぎりぎりセーフ
b = 0.9999999999999999
print(b)
# 0.9999999999999999

```

Decimalに渡すときには注意が必要のようです。文字列で渡してあげないと、丸められたものが渡されてしまうようです。

```py
Decimal(0.9999999999999999999999999)
#Decimal('1')

Decimal('0.9999999999999999999999999')
#Decimal('0.9999999999999999999999999')

```

#終わりに
Decimalは奥が深そうですが、一応計算できるようになったと思われますのでこの記事はこれで終わりにしたいと思います。
自宅に Samba サーバを構築する

# 自宅に Samba サーバを構築する

デスクトップPCを最近使っていないので、デジカメなどで撮った写真データなどを入れておくスペースがなくなっていました。
ノートPCは紛失・故障する可能性が高いので、長期保存データを入れておきたくないのです。

そのため、以前購入していた Stick PC と２TB HDD を使って共有データサーバを構築します。

最終的には、
- Samba サーバ
- Next Cloud を使ったファイル同期
までできるようになればいいなと思ってます。
とりあえずは Samba サーバにします。

## 現状

Stick PC には2年前にセットアップした Lbuntu がインストールされています。
Wifi で自宅ネットワークには接続できました。SSHサーバでログインすることはできます。

１TBのポータブル外付けHDDが余っているので、それをディスクスペースにします．

こんな感じでコンパクトな仕上がりの予定。
![IMG_20200809_134703.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104970/e9bcc78b-caad-708a-6c2c-b4197d6ddf86.jpeg)


ネットワーク機器が入っている100均ケースの中に押し込みます。
![IMG_20200809_134800.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104970/82bda65f-cc1a-3a51-d532-5e1cac829006.jpeg)




## HDDの取り付け、自動マウント

```bash
sudo nano /etc/fstab
```
を編集して、HDDを自動的にマウントするよう設定します。

```
# 1TB portable hdd
UUID=[UUID] /mnt/disk1      ext4    defaults,nofail 0       1
```
UUIDは `sudo blkid` で調べられます。ここでは、/mnt/disk1 にマウントすることにします。

## Samba serverのセットアップ

Samba をインストールして
```bash
sudo apt install samba
```

設定ファイルの最後に以下を加えます
```bash
sudo nano /etc/samba/smb.conf
```

```bash
[share]
    comment = Samba at fujii-home
    path = /mnt/disk1/Pictures
    read only = no
    browsable = yes
    security = share
    guest ok = yes
    guest only = yes
```


smbd を再起動して、
```bash
sudo systemctl restart smbd
sudo systemctl restart nmbd
```

ufw の例外に加えます。
```bash
sudo ufw allow samba
```

別のPCからアクセスしてみて、読み出せることを確認して完成です。
【Rails】summernote 本番環境で画像保存ができない時の解決方法

# はじめに
某スクールの学習過程ポートフォリオ作成の際に、**Gem 'summernote'**を用いて
リッチテキストエディタを実装しました。

開発環境上では画像を含めたテキストの投稿が可能でしたが、
デプロイ後の本番環境にて画像を投稿しようとすると下記エラーが発生し、投稿保存がされませんでした。

```ターミナル
(0.5ms)  ROLLBACK
Completed 500 Internal Server Error in 46ms (ActiveRecord: 12.9ms)
ActiveRecord::ValueTooLong (Mysql2::Error: Data too long for column 'article_content' at row 1: 
INSERT INTO `articles` (`admin_id`, `article_title`, `article_content`, `article_image_id`, `created_at`, `updated_at`) VALUES (1, '観葉植物の置き場所はどこがいいか', '<p><img src=\"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAASABIAAD/4QB+RXhpZgAATU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAABJADAAIAAAAUAAAAUJKGAAcAAAASAAAAZKACAAQAAAABAAA...(以下長すぎるので省略します)
```
##解決方法
【前提】
・テーブル名はArticleとしてます。(Article=記事の意)。この部分は任意の名前にしてください。
###①エラー文の解釈
まず、ターミナルに表示されていたActiveRecord::ValueTooLong (Mysql2::Error: Data too long for column...)このエラー文が解決への糸口になります。

簡潔にいうと、「データが長すぎ」と言われています。
投稿文を保存するarticle_contentのデータ型をtextにしていましたが、これでもまだ足りないと言われているわけです。
代表的なデータ型として短文(1〜255文字)はstring型、長文()はtext型を使うという程度の知識でした。

###②変更すべき点
上記内容で、**「データが長すぎて保存できない」**という問題点がわかりました。
そうしたら収まるように**大容量用のデータ型に変更**してあげればいいだけです！
下記記述が修正を加えたマイグレーションファイルになります。

```ruby:(date)_change_column_to_article.rb
class ChangeColumnToArticle < ActiveRecord::Migration[5.2]
  def up
    change_column :articles, :article_content, :text, null: false, limit: 4294967295
  end

  def down
    change_column :articles, :article_content, :text, null: false
  end
end
```

※以下、修正内容についての詳細です。

デプロイの際にMySQL
MySQLにあるデータ型は以下の通りです。

| データ型          |                    解説|
|:-----------------|----------------------:|
| CHAR             |   255Bまでの固定長文字列 |
| VARCHAR          |   64KBまでの可変長文字列 |
| TINYTE           |   255Bまでの可変長文字列 |
| TEXT             |   64KBまでの可変長文字列 |
| MEDIUMTEXT       |  1.6MBまでの可変長文字列 |
| LONGTEX          |  4.3GBまでの可変長文字列 |

この中の**LONGTEXT**を使用する事にしました。(最大にしておけば足りなくなることはまずないだろうという考え)
ただし前述した通り、Railsの学習をした際にstringとtextくらいしか学習した記憶がなかったため設定方法がわかりませんでした。

調べた結果、結構簡単でリミットをつけるだけでした。
まずカラムに変更を加えるため、以下のようにします。

```:ターミナル
$ rails g migration ChangeColumnToArticle
```
すると、以下の内容でマイグレーションファイルが作成されます。

```ruby:日付_change_column_to_Article.rb
class ChangeColumnToArticle < ActiveRecord::Migration[5.2]
  def change
  end
```

そして、変更前の記載と変更後の記載を加えます。
ここの記述は冒頭に記載したものと同じになります。

```ruby:日付_change_column_to_article.rb
class ChangeColumnToArticle < ActiveRecord::Migration[5.2]
※変更を加えた記述
　def up
    change_column :articles, :article_content, :text, null: false, limit: 4294967295
  end
  
※変更前の記述
  def down
    change_column :articles, :article_content, :text, null: false
  end
end
```
リミットを書き加えることで、LONGTEXT型にします。
なお、4294967295と言う数字は4294967295バイト（4.3GB）でLONGTEXT型の上限です。
limitの範囲を16777216 ~ 4294967285にするとLONGTEXT型になるそうです。

```:ターミナル
$ rails db:migrate
```
変更を反映させて終了です。

##そもそも、なぜ開発環境では使えて、本番環境でエラーが出たのか
本番環境ではMySQLを使用していて、MySQLのtext型には最大長が設定されており、半角で65,535文字を超える文字列は扱えません。単純なことでこれが開発環境と本番環境での違いによるエラーの発生の理由でした。(現在の知識・語彙力ではこれが限界です。いずれもっと詳しく解説を加えられたらと思います！)
JupyterLabでコード補完（jupyterlab-lsp）

# JupyterLabとは
- Jupyter notebookの後継で、いろいろな機能が追加されている
- 参考：https://qiita.com/kirikei/items/a1639954ce5ccaf7ac3c

# JupyterLabの課題
- デフォルトではTabを押さないとコード補完（autocomplete）されない
- そのため、いくつかコード補完のextentionが提案されている
- ここでは、jupyterlab-lspについて紹介する

# jupyterlab-lspとは
- 開発元のGithub：https://github.com/krassowski/jupyterlab-lsp
- コード補完として、．(ドット)をタイプすると、配下の要素が可視化されるようになる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630200/65b09c0f-60cc-7eb9-f2c1-5656b10064a6.png)
- なお、jupyterlab-kiteなら、完全自動でコード補完が可能！（こちらの方がおすすめ）
    - https://qiita.com/fugaga/items/87fb69d88abea70f67c6


# jupyterlab-lspのインストール方法
## 概要
- 基本的に、開発元のGithubに従ってインストールすれば動作する
    - https://github.com/krassowski/jupyterlab-lsp#installation
- ただし、以下をやらないと動作しないので注意（ハマった）
    - "Note on pyls (python-language-server) issues: pyls is known to require specific versions of some dependencies such as ujson <= 1.35, jedi == 0.15.2 and parso == 0.5.2. If you experience any issues with LSP functions in Python, please check if you have the right version using pip freeze command."
    - つまり、「ujson」「jedi」「parso」のバージョンを上記にしなければならない。
    - バージョンが異なると以下のエラーメッセージが出る。
        - ERROR - pyls_jsonrpc.endpoint ...

## 検証環境
- ubuntu (Windows10 WSL)
- anaconda
- python(3.8)
- jupyterlab(2.1) ※jupyterlab-lspの最新のv1.1.2では、jupyterlab2.2は未対応らしい
- https://github.com/krassowski/jupyterlab-lsp/releases/tag/v1.1.2

## インストール方法
### conda環境の準備

```
conda create -n jupyter_test python=3
conda activate jupyter_test
```

### jupyterlab,jupyter-lspのインストール

```
conda install -c conda-forge jupyterlab=2.1 ujson=1.35 jedi=0.15.2 parso=0.5.2
pip install jupyter-lsp
conda install -c conda-forge nodejs
jupyter labextension install @krassowski/jupyterlab-lsp
conda install -c conda-forge python-language-server r-languageserver
```

### jupyterlabの起動

```
jupyter lab
```
レスポンシブデザイン入門

#レスポンシブデザインとは
レスポンシブデザインとは、様々なデバイスや画面サイズに合わせて、コンテンツのレイアウトを調整するためのものです。

例えば、全体要素の幅を固定したサイトを作成した場合、それより画面幅が狭くなると、コンテンツの一部が隠れてしまいます。
ここにレスポンシブデザインを適用することで、画面のサイズに合わせて最適なレイアウトを組めるようになります。

#メディアクエリの利用

##メディアクエリ（Media Queries）とは
メディアクエリとは、ブラウザの画面サイズに応じてCSSのスタイルを設定できる手法です。

##利用方法

###viewportの設定
レスポンシブデザインを適用する準備として、`<head>`タグ内に`viewport`を設定しましょう。
`viewport`を設定しないと、スマートフォンやタブレットでの閲覧時にメディアクエリが正しく機能しません。

```index.html
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
<head>
```

###記述方法
メディアクエリは、`@media (条件) { .... }`という様に記述します。
指定された条件が当てはまるときにのみ`{ }`内のCSSが適用されます。

```style.css
@media(max-width: 1000px) {
  /* 画面幅が1000px以下のときに適用するCSSを記載する */
}
```

メディアクエリの条件には、`max-width`(最大幅)、または`min-width`(最小幅)を指定できます。
`max-width: ◯◯px`と指定すると、画面幅が◯◯px以下の時にCSSを適用できます。`min-width`はその反対となります。

`max-width: ◯◯px`（または`min-width: ◯◯px`）のようにメディアクエリの条件を指定するとき、`◯◯px`の部分を`ブレイクポイント`と呼びます。
今回はスマートフォンの画面幅は670px以下、タブレットの画面幅は670px ~ 1000pxと想定して、ブレイクポイントを設定しましょう。

```style.css
/* タブレット */
@media (max-width: 1000px) {
  h1 {
    color: blue;
  }
}

/* スマホ */
@media (max-width: 670px) {
  h1 {
    color: green;
  }
}
```

#レイアウト崩れの回避
要素の`width`が`25%`などの割合で指定されている場合、左右の`padding`などがあると要素の幅の合計が100%を超えてしまい、レイアウトが崩れてしまうことがあります。
このようなレイアウト崩れは、`box-sizing: border-box;`を用いることで防ぐことができます。

##`box-sizing: border-box;`
`box-sizing`を`border-box`に指定すると、要素の幅(`width`)の合計に`padding`と`border`が含まれるようになります。そのため、`padding`や`border`を追加した時に生じるレイアウト崩れを未然に防ぐことができます。
※ただし、`margin`は`border-box`での合計値に含まれないので注意

`box-sizing: border-box;`を指定するときは、`*`(アスタリスク)に対して指定することが推奨されています。
`*`はすべての要素に対してCSSを適用したい場合に用います。
`border-box`をすべての要素に対して適用することで、レイアウトを管理しやすくなります。

```style.css
* {
  box-sizing: border-box;
}
```
Friction Joint2Dの解説

今回はFriction Joint2Dの解説をしていきます。

#Friction Joint2Dとは
Friction Jointの**Friction**とは、**「摩擦」**という意味です。
しかし、オブジェクトの摩擦係数を操作するというものではなく、イメージ的には動きや回転の**抵抗**を操作するといった感じです。

#Friction Joint2Dの各パラメータ
![FrictionJoint2D_param.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685029/a57c40d5-fbd4-7fdd-448d-91cae33caed5.png)
全部これまでに出たパラメータですので、今回は重要だと思うところをいくつかピックアップして解説していきます。

###・Auto Configure Connected Anchor
Connected Rigid Bodyが**None**の場合は`チェックを外さなくても問題ありません`。
しかし、**そうでない場合**はこのジョイントでは`チェックを外し、Connected Anchorの座標を(0,0)にする`ことをオススメします。その方がより自然な挙動をすると思います。

###・Max Force
Connected Rigid Bodyが**None**のときにここの値を**大きく**すると、`オブジェクトが空中に固定`されたような感じになります。
イメージとしては、ホワイトボードにくっつけられた磁石のような感じです。力が加わればその方向に動きます。

#使い道
このジョイントの最大の特徴は「`動かしにくいけど、動かしても元の位置に戻らない`」ところにあると私は思います。
なので、`重い扉`や、`乗ると徐々に下がる床`などを作るときに使えると思います。

#・おわりに
今回は少し味気ない感じになってしまいました。自分なりに思考を凝らしたつもりだったんですが。
これから少しずつそういうスキルも上げていこうと思います。
ジョイントについてある程度の理解はしたので、次回はジョイントに共通するパラメータのまとめを記事にしようと思います。
Mac(Catalina)でgdbを動かす方法

macでgdbを動かそうとしたらうまく行かなかったので試行錯誤した記録です。

実行環境　macOS Catalina ver-10.15.6

homebrewを使ってgdbをインストールし、githubから拡張のpedaもインストールしました。
いざ動かそうと思ったら

```:gdb
Unable to find Mach task port for process-id 923: (os/kern) failure (0x5).
(please check gdb is codesigned - see taskgated(8))
```
という文字が。
gdbにコード署名をしないと使えないようです。

コード署名をする　　　(参考ページhttps://sira.dev/2019/09/17/macos-gdb-codesign.html )

まず参考ページにある通りに自己署名証明書を作りました。
「最後に，作成した証明書を選択し，”When using this certificate” を “Always Trust” に変更する．」という部分がわからなかったのですが、(https://www.ssk.or.jp/seikyushiharai/rezept/iryokikan/download/index.files/tejunsyo_m.pdf )に書いてありました。

次にコード署名ですが

```:zsh
$ sudo codesign -fs gdb-cert $(which gdb)
```
で簡単にできました。

実はこれだけでは

```:gdb
 During startup program terminated with signal ?, Unknown signal
```
と出て正常に動作しません。

そこで.gdbinitにset startup-with-shell offと書き込みます。

```:zsh
 $ echo "set startup-with-shell off" >> ~/.gdbinit
```
.gdbinitはgdbの初期化スクリプトファイルで起動時に定型コマンドを自動で実行できるとのこと。
pedaをインストールすれば勝手にできていますし、なければホームディレクトリに作ればよいです。
これで、gdbが動くようになりました。(頭にsudoをつけないとコード署名されてない判定になって動きません。)

pedaを入れている場合はノーマルなgdbを起動するときに

```:zsh
 $ sudo gdb --nx
```

と打つことになると思いますが、これは.gdbinitを無視することでpedaに切り替えないようにしています。
そのためgdbを起動したのち、

```:gdb
 set startup-with-shell off
```

と打ち込まないと正常に動作しません。

まとめ
参考ページにはCatalinaではgdbは正常に動かない問題があるとのことでしたが、ちゃんと動きました。
結果的に解決しましたが、面倒臭かったので、ubuntuを使うのをお勧めします。
【ubuntu20.04serverで仮想化基盤構築】bridge interface作成

# 最終目的
ubuntu20.04server上にkvmを使って仮想化基盤を構築する．

ホスト側にGUI環境はなく，ネットワーク設定や仮想化構築はCUIで進める．
デスクトップ環境を使わず（導入せず）CUIで構築する理由は特にありません．ただコマンドでいろいろ構築したかったから．

# おことわり
説明するために必ずしも合っているとは限らない例や状態，状況を使う場合があることを先に記しておきます．
これは自分が理解する際に正しい説明がされている記事を読んでいてもいまいちピンと来なかった時，理解するために考えた例を使うためです．
一応参考にした別記事は都度都度リンクを貼っていくつもりなので詳しくは，正しくはそちらを参照してください．

あと，パラメータ(ipアドレスとか)も必ずしも現実であり得る値をとっているとは限りません．あくまでも例としてみてください．（正しさを都度都度確認していると記事が進まなかったので．．．）

# 初期状態
- ubuntu20.04 serverインストール済みサーバ
- remote pc(mac)からsshでubuntuにログイン

# ネットワーク設定
これから作成するVMを外からログインできるようにするためにネットワーク設定を行います．（今言ってる「外」は仮想ネットワークの外部，ローカルネットワーク内の他pcとかです．外だからと言って必ずしもこれを行ってインターネット側からログインが可能になるわけではない．別に設定とかが必要になる場合有）

## netplanを使ってブリッジ作成
netplanでネットワーク設定をいじっていきます．いくつか記事をみてみるとNetwork-Manager(nmcli)を使う記事が多いですが，ubuntu20.04serverだとaptなどでインストールしないと入ってなかったので　netplanでいきます．

### 設定ファイル新規作成
自分の場合は最初から`/etc/netplan/00-installer-config.yaml`が存在しますが， [この記事](https://qiita.com/zen3/items/757f96cbe522a9ad397d)（あるいはその記事の参考）で触れられているように触らない方が良いみたいなので`/etc/netplan/99_config.yaml`を作成してそこに設定を書きます．

```shell_session
user@ubuntu:~$ sudo touch /etc/netplan/99_config.yaml
```

### 設定変更
設定することは
* bridge"br0"作成
* ethernet"enp3s0"のdhcp無効化
* bridge"br0"のipアドレス固定化(ipアドレス: 192.168.100.28)
* bridge"br0"とethernet"enp3s0"を接続
です．
"br0"のipアドレスは必ずしもstaticにしなくても良いと思います．

```yaml:/etc/netplan/99_config.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    enp3s0:
      dhcp4: no
  bridges:
    br0:
      dhcp4: no
      addresses:
        - 192.168.100.28/24
      interfaces:
        - enp3s0
      gateway4: 192.168.100.1
      nameservers:
        addresses: [192.168.100.1,8.8.8.8]
      parameters:
        forward-delay: 0
        stp: false
      optional: true
```

### 設定の適用

```shell-session
user@ubuntu:~$ sudo netplan apply
```

### 確認
"enp3s0"から'inet'の記述がなくなって"br0"が表示されていることは確認でます．
自分の場合はdhcpのときに"enp3s0"に割り当てられていたipアドレスをそのまま"br0"のipアドレスにしたのでリモートからの状態でも接続断することなく設定適用できました．（もしもを考えてそのまま変更適用しない方がよかったかもしれませんが...）

```shell-session
user@ubuntu:~$ ip addr
...
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
    link/ether 24:be:05:14:44:a4 brd ff:ff:ff:ff:ff:ff
...
4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 24:be:05:14:44:a4 brd ff:ff:ff:ff:ff:ff
    inet 192.168.150.32/24 brd 192.168.150.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 2405:6580:97e0:2e00:26be:5ff:fe14:44a4/64 scope global dynamic mngtmpaddr noprefixroute
       valid_lft 2591851sec preferred_lft 604651sec
    inet6 fe80::26be:5ff:fe14:44a4/64 scope link
       valid_lft forever preferred_lft forever
```

## 参考
* https://www.checksite.jp/kvm-br-conf/
* [Ubuntu 20.04 LTSで固定IPアドレスの設定](https://qiita.com/zen3/items/757f96cbe522a9ad397d)
* https://ubuntu.com/server/docs/network-configuration
* [KVMでゲストOSをブリッジ接続する](https://qiita.com/yoshiyasu1111/items/8d07a4fd55116fba07f7)
* [KVMの仮想ネットワークをブリッジモードにして、VMを物理ネットワークセグメントに参加させてみた](https://qiita.com/homines22/items/7ded1fdaf49aec337e2c)

# 次回
kvm周りを導入する予定
TYpescript のsetter , getter 。初心者の私が躓いたところ。

プログラマーとして働き始めて早3か月近くがたつ。
自分の実力がなかなか、向上する兆しがみえないので、ここでアウトプットしていくことにした。

【参考にさせていただいたQiitaの記事など】
1) https://qiita.com/ringtail003/items/7ccf992f18b768e0e633

2) https://qiita.com/suin/items/7d6837a0342b36891099

今日はまず、setter とgetter の使い方について、
言わずモノが、情報をセットして、セットしたところから情報を取り出すというイメージ。
【setter,getter】


```Typescript
class Person {
    firstName!: string
    lastName!: string

    set fullName(name:string){
        let names = name.split(' ');
        this.firstName = names[1];
        this.lastName = names[0];
    }
    get fullName():string{
        return this.lastName +this.firstName;
    }
}
let p:Person;
p = new Person();
p.fullName='田中　太郎';
console.log(p.fullName);//田中太郎

```

ここで私がハマったところだが、
”田中太郎undefined”とコンソール上に表示されてしまった。なんで！！
splitメソッドの''のスペースが全角スペースではなく、半角スペースだったのだ。
初心者なので、仕方がない(笑)

今日の勉強はここまで★
【初心者でもわかる】要素の順番をPCとスマホで変える方法（レスポンシブ）

# どうも7noteです。レスポンシブサイトを作る時、PCとスマホで要素の順番を入れ替える方法。

どうも7noteです。
この記事は以下へ引っ越しました。
私のプログラミングスキル向上方法（3ステップ）

プログラミングスキルを向上させるための3ステップです。
私自身が実践していることであり、向上を実感している方法です。

# 写経
本をベースに写経します。
写し書きをして動いたらOKではなく、以下のような問いかけを常に頭に置きながら行います。

- なぜこの書き方で動くのか？
- 本当にこの書き方が良いのか？

写経しても構築した環境の違いでエラーが発生したりするので、
最初は動くようにすることを最優先します。

次に、上記の問いを確かめるべく公式ドキュメントを見て確かめたり、
自分で少し書き方を変えてみて、同じ動作が保証されるかを確認したりしてみます。

# 改良
写経はすぐに飽きます。
簡単なものが多く、真似すれば大抵動いてしまうからです。
なので次にやることは、写経して学んだことを応用して、自分で何かを作ります。

例えば、for文を学んだのであれば、for文を使った事例を自分で何個か作って
実際に動かしてみます。

Javaで例を挙げるなら、String、Integerの配列で回してみる。
ArrayList、HashMap、HashSetで作ったオブジェクトでfor文を回してみる。
ArrayList、HashMap、HashSetをラップした独自オブジェクトで回してみる。
など。

**一つ何かを覚えたら、他の応用方法が無いか探し、
どのように応用できるかを追求してみます。**

# 教える
人に教えることでより深い理解を得ることができます。
教えるとき、自分の知識にあいまいな部分があると、「あれ？どうするんだっけ？」となります。

そのとき、自分で詳しく調べなおしたり、
相手がわかるように更に詳細化してあげたりすることで理解が深まります。

私はJava研修の担当者を経験したことがあります。
元々はPHPerで、Javaは独学で数か月学んだだけで実務経験が無い状態でした。
なので**基本的なことでも調べながら教えていましたが、結果的に私自身がより詳しくなりました。**

# まとめ
- 写経は、スキルを身に着けるきっかけ。<br>
  ただし、**「なぜ？」という問いは持ち続けること**が大事です。
- 改良は、応用力を身に着けるよい方法です。<br>
  **自分で調べてより良いコードを書く習慣を持つこと**が成長につながります。
- 教えるのは、より理解を深めるきっかけ。<br>
  **教えることで自らがより学ぶことにつながります。**
WSL2上のSSHにLAN内別マシンからつなぐ

netsh.exeを使ったやり方が広まっていますが、ncatを使った方がIPアドレスなどで面倒がなくていいです。windows上で

```cmd
ncat -lkp SOME_PORT -e "ncat localhost 22"
```

でつながります。Firewallでncatが新しいinbound packetを受け取るのを許可してあげてください。ncatはnmapのページからダウンロードできます。
【javascript】書籍のアウトプット

こちらの記事は以下の書籍を参考にアウトプットとして執筆しました。

[入門JavaScriptプログラミング (日本語) 単行本](https://www.amazon.co.jp/dp/479815864X?tag=shoeishacom-22)

#文字の検索
最初の文字が$かどうかの判断はこう書く

```javascript
if(price[0]=='$'){
  
}
```
>出典:[入門JavaScriptプログラミング (日本語) 単行本](https://www.amazon.co.jp/dp/479815864X?tag=shoeishacom-22)

最初の3文字の場合はこうかもしれない

```javascript
if(phone.substr(0,3)===user.areaCode){
  
}
```
##substr
```javascript
str.substr(start[, length])
```
|引数|説明|
|---|---|
|start|最初の文字の位置|
|length|取り出す数|

返り値は、指定された部分が入った新しい文字列
>出典：https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/substr

先のコードはphoneの最初の文字から3文字を抜き出している。

ここまでの2つのコードは何をしているのかわかりにくい
*そこで*自己文書化**が使える

文字列の検索では以下の3つのメソッドが使えるようになった

|新しいメソッド|説明|
|---|---|
|includes|その文字が含まれているか|
|startsWith|その文字で始まっているか|
|endsWith|その文字で終わっているか|
戻り値はbool値
これらは**大文字小文字を区別する**

これらは第2引数に検索し始める位置を指定できる(インデックス)
第2引数にindexOfメソッドを使えば効率よく使える
indexOfは検索してマッチした文字の位置を返り値としている

#文字列のパディング
特定の文字で特定の長さだけ埋めるというもの
例えば以下は10進数のIPアドレスを2進数へ変換する関数のコード

```javascript
function binaryIP(decimalIPStr){
  return decimalIPStr.split('.').map(function(octet){
    return Number(octet).toString(2)
  }).join('.')
}
```
>出典：[入門JavaScriptプログラミング (日本語) 単行本](https://www.amazon.co.jp/dp/479815864X?tag=shoeishacom-22)

## Array.prototype.map()
条件に合う新しい配列を生成する

```javascript:構文
var new_array = arr.map(function callback(currentValue[, index[, array]]) {
    // 新しい配列の要素を返す
}[, thisArg])
```

|コールバック引数|説明|
|---|---|
|currentValue|現在処理中の値|
|index|現在処理中の要素の配列内のインデックス|
|array|mapが実行されている配列|
|thisArg|callbackを実行するときにthisとして使う値|




このコードでは以下のようなことをしている

- `.split('.')`でIPアドレスを4つの配列に分割
- map(function(octed)により新しいい配列を生成
    - octedは現在処理中の値
- toString()で引数に入る進数に変換する

以上のコードでは0梅がされないなどうまく行かない
そこでrepeatを使う

```javascript
function binaryIP(decimalIPStr){
  return decimalIPStr.split('.').map(function(octet){
    let bin= Number(octet).toString(2)
    return '0'.repeat(8-bin.length)+bin
  }).join('.')
}
```
>出典：[入門JavaScriptプログラミング (日本語) 単行本](https://www.amazon.co.jp/dp/479815864X?tag=shoeishacom-22)

##repeat
repeatが呼び出した文字列を繰り返す

```javascript
'0'.repeat(4);//'0000'
```
0が4回繰り返される
犬猫スイッチ

以下の画像のようなものをイメージに作ります．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634450/143f58d8-2cf4-62e5-628a-0f970f53471e.png)


#STEP1　ボタンの作成
App.jsとapp.cssを用意し，その中に以下のプログラムを入力し，ボタンを作成する

###App.js
~~~jsx
import React, {Component} from 'react';
import './app.css';

class App extends Component{
  render(){
    return(
      <div>
        <h1>犬</h1>
        <div className='buttons'>
          <button>犬</button>
          <button>猫</button>
        </div>
      </div>
    );
  }
}
export default App

~~~

###app.css

~~~css
h1{
  text-align: center;
}

.buttons {
  margin-top: 40px;
  padding: 0;
  font-family: sans-serif;
  text-align: center;
}

button {
  display: inline-block;
  font-size: 16px;
  width: 200px;
  height: 48px;
  border-radius: 48px;
  margin-right: 24px;
  margin-left: 24px;
  color: #fff;
  background-color: #66ccff;
  border: none;
  outline: none;
  box-shadow: 4px 4px #d8d8d8;
  cursor: pointer;
}

button:active {
  position: relative;
  top: 4px;
  left: 4px;
  box-shadow: none;
}
~~~
すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634450/ba65ab57-0461-8a58-37ed-32ac9c76829d.png)

ができました．

#STEP2　犬と猫の表示切り替え
犬と猫のボタンを押すことでStateを更新して表示させます．

###初期状態の定義
constructorとsuperで構成される定番の形の中でstateを定義します．
そしてstateを表示させるために`<h1>犬</h1>`を`<h1>{}</h1>`

~~~js
class App extends Component{
  constructor(){
    super();
    this.state={name: '犬or猫'}
  }
  render(){
    return(
      <div>
        <h1>{this.state.name}犬</h1>
  省略
}
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634450/6339d98b-a953-4b00-a25a-ccb405d756f1.png)


###ボタンの実装

`handleClick=()=>{処理}`をベースにボタンを以下のように実装しました．

~~~js
handleDogClick=()=>{
    this.setState({name:'犬'});
  }
  handleCatClick=()=>{
    this.setState({name:'猫'});
  }

省略

   <button onClick={this.handleDogClick}>犬</button>
   <button onClick={this.handleCatClick}>猫</button>
~~~

#　完成

~~~js
import React, {Component} from 'react';
import './app.css';

class App extends Component{
  constructor(){
    super();
    this.state={name: '犬or猫'}
  }
  
  handleDogClick=()=>{
    this.setState({name:'犬'});
  }
  handleCatClick=()=>{
    this.setState({name:'猫'});
  }


  render(){
    return(
      <div>
        <h1>{this.state.name}</h1>
        <div className='buttons'>
          <button onClick={this.handleDogClick}>犬</button>
          <button onClick={this.handleCatClick}>猫</button>
        </div>
      </div>
    );
  }
}
export default App
~~~
WSL1 → WSL2 移行で X サーバ (VcXsrv) の ACL を残しつつアクセスできるようにする

# tl;dr
- wsl2 はネットワーク経由で win 側にアクセスするようになった
  - 今までの DISPLAY=localhost:0.0 が効かなくなる
- X サーバのディスカバリは /etc/resolve.conf から IP 取れば OK
- VcXsrv のアクセスコントロールは wsl 側で IP 取得して cmd.exe 経由で xhost.exe を実行すれば OK

# 背景
今さらながら wsl2 に更新してみたら, 
wsl2 では wsl1 の時と違って vNIC 経由で win 側にアクセスするようで,
win 側の X サーバ (VcXsrv) にアクセスできなくなった.

# 対策
X サーバのディスカバリどうしようかなと思ったら
resolve.conf から取れるっぽいので以下を rc に書いて wsl 側は解決.

```
export DISPLAY=$(grep -Po '(?<=nameserver )[\.\d]+' /etc/resolv.conf):0.0
```

このままだと VcXsrv のアクセスコントロール (IP 制限) にひっかかる.
-ac でアクセスコントロールを無効化する記事も見かけたけど,
(外部公開してないとはいえ) X サーバに ACL 無いのはちょっと...って感じなので,
wsl 側の IP を許可する適当なワンライナーを profile に追記.

```
cmd.exe /c set DISPLAY=127.0.0.1:0.0\& "C:\Program Files\VcXsrv\xhost.exe" +$(ifconfig | grep -Po '(?<=inet )172\.[\d\.]+')
```

これで wsl 側の rc/profile だけで X サーバへの接続設定ができる.
cmd をかませてるのは, wsl 側から直接実行すると
`xhost.exe:  must be on local machine to add or remove hosts.`
になるため.
Pythonでビーチボール(=地震の発震機構)を書く!

#はじめに
本当はQGISのプラグインの作り方にしようと思っていたけど、思っていたより不便で残念な出来だったのでガラッと変えました。
発震機構をQGISに落とし込もうとする人はいないのかもしれませんが、別の研究・調査に彩りを添えるのにいかがですか？？
GMTでいいじゃん、、、って話ですが、QGISにさえ落とし込めればコマンドをいちいち打ったりしなくて良くなるのがGOODポイント。特にプレート境界とかの広い領域の話のときは拡大・縮小ができて移動もシームレスなのがよい点です。


###バージョンなど
・python3 == 3.7.6
・QGIS3 == 3.14.1

ビーチボール作成には[obspy](https://docs.obspy.org/) を使います

#データのダウンロード
どこからでも良いですが、無難に気象庁からCMT解をzipファイルでダウンロードします
http://www.data.jma.go.jp/svd/eqev/data/bulletin/cmt.html


#プログラムの方針
データを整形し、QGISに読み込ませるデータを絞る。データ内にsvgファイル名を入れておく
機構をそれぞれsvgファイルに出力し、QGISではデータ内のファイル名と対応するsvgファイルを描画させるようにする。

##プログラム

ファイルフォーマットも書かれているので、必要なデータだけを整形します。
最低限必要なものとしては
発震年月日時刻・lon・lat・深さ・マグニチュード・走向・傾斜・すべり角
でしょうか。
QGISに読み込む際に必要になるので"id"として通し番号を振っておきます。
また、QGISに読み込ませやすい形式で出力しておきます。今回はcsvファイルで保存しています。

svgファイルの出力先はどこか一つのフォルダにまとめておきます。
実際のsvgファイルの作成は以下のように行っています。

```python

from obspy.imaging.beachball import beachball

#seikeiはリスト['id','date','N','E','Depth', 'Magnitude', '走向', '傾斜角', 'すべり角']のリスト

def focal_maker():
    for i in range(len(csvseikei)):
        np = [float(seikei[i][6]),float(seikei[i][7]),float(seikei[i][8])]  #strike,dip,rake
        file_name = str(csvseikei[i][0])+'.svg'
        dp = csvseikei[i][4]  #depth
        if dp == 0:  #depthによって色を変えている
            cl=[192,192,192]
        elif 0<dp<=30:
            cl=[255,0,0]
        elif 30<dp<=100:
            cl=[255,255,0]
        elif 100<dp<=200:
            cl=[0,255,0]
        else:
            cl=[0,0,255]
        cl = list(map(lambda x: x/255, cl))  #RGBを0.0～1.0で指定する必要がある
        beachball(np, facecolor=cl, outfile='./SVG_output/'+file_name)

if __name__ == '__main__':
    focal_maker()
```

#QGISでの読み取り
いつもと同じようにid・発震年月日時刻・lon・lat・深さ・マグニチュード・走向・傾斜・すべり角が入ったcsvファイルを読み込みます。(別記事参照)
読み込んだレイヤのレイヤプロパティを開きます。シンポロジをクリック、右上のシンプルマーカーをクリックするとこのような画面になります。
![コメント 2020-08-09 125706.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486481/155f7a85-f475-38bd-4ba4-b7f3a1f7f465.png)

「シンボルレイヤタイプ」のドロップダウンリストからSVGマーカーを選択します。
![コメント 2020-08-09 130426.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486481/ec97a67d-f63b-30f9-3b3a-93439b9ccd1c.png)

下の方にテキストボックスがあります(図だと"circle"と入力されている場所)。
右側のデータを格納できそうなボタン("データによって定義された上書き")をクリック＞編集をクリック
すると式タブが開きます。
```concat('svgファイルが入ったフォルダの絶対パス',"id",'.svg')```
を打ち込み
![コメント 2020-08-09 131454.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486481/fe8d5d05-a82e-a488-dd5f-0fd80953fca7.png)

OKをクリック
すると発震機構がプロットされるはずです。
あとはシンボルの大きさをマグニチュードに合わせて変化させたりすれば完成です。

![コメント 2020-08-09 132108.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486481/3b04a328-3c3c-59ee-4e52-b720f5029c84.png)


QGIS バージョン3.14から時間によってシンボルの描画をコントロールできるようになりました。これまでデータを分けていたケース(例えば東北地方太平洋沖地震前後)でも一つのデータセットをQGISにぶち込めば良くなりそうなので結構便利だと思っています。


----------
他人のプラグインとかを見ながらプラグイン作成はゆっくり進行中です
研究の進捗が芳しくないのでしばらく休憩します。

何かご意見等ございましたら
分からないことも一緒に悩むぐらいはできます。
twitterまでお気軽にご連絡ください[@ohcelot](https://twitter.com/ohcelot)
2020/08/09新規作成
Conoha で web サーバーと db サーバーをプライベートネットワークに構築する（DBサーバーは使わない）

Conoha の　DB サーバーは utf8mb4 に対応していません。
そのため、VPS を２つ用いて web サーバーと db サーバーの分離を行いたいと思います。

# サーバーの作成

Ubuntu 18.04 で作ります

# プライベートネットワークの作成

[公式の使い方](https://support.conoha.jp/v/privatenetwork/)を参考に作成

コンソール画面からはネットワークインターフェイスの追加のみが行われるため、追加の設定は ssh してサーバー内で行う必要があります。

# ネットワークの設定

```
$ cd /etc/netplan
$ vim 11-localnetwork.yaml # ファイル名はなんでもいいが、*.yaml でないといけないという噂を聞いた
```

そして以下のようにします。

```11-localnetwork.yaml
network:
    version: 2
    renderer: networkd
    ethernets:
        eth1:
            addresses: [192.168.0.1/24] # Conohaコンソールのプライベートネットワーク画面で表示されているIP
            dhcp4: true
            dhcp6: false
            accept-ra: false
            optional: true
```

`$ ip a` を叩いて、eth1にIPが振られていたら設定完了です。

これを web サーバーと db サーバーの両方で行います。

それが完了したらお互いの local ip に向けて ping が通るはず。

# mysql のインストール


```
# db サーバー
$ apt install mysql-server mysql-client

# web サーバー
$ apt install mysql-client
```

## mysql のユーザー作成

```db.server
mysql > GRANT ALL ON *.* TO remote@[web サーバーのIP] identified by 'pass';
```

## 設定変更

アクセスできる IP を指定します。
`0.0.0.0` だと全てのホストからの接続を許可してしまうのですが、これは Firewall との組み合わせで絞り込んでいこうと思います。

```
$ vim /etc/mysql/mysql.conf.d/mysqld.cnf
```

```mysqld.cnf
...
#bind-address            = 127.0.0.1
bind-address            = 0.0.0.0
...
```

`$ systemctl restart mysql` mysql の再起動

# Firewall 設定
こんな感じになるように設定していきます。

```
$ ufw status
Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere
3306                       ALLOW       192.168.0.0/24
22/tcp (v6)                ALLOW       Anywhere (v6)
```

```
$ ufw default deny
$ ufw allow ssh
$ ufw allow from 192.168.0.1/24 to any port 3306
$ ufw reload
```

以上で web サーバー側から以下のように接続することができるようになります。

```
$  mysql -uremote -h192.168.0.2 -ppass
```
[Swift]クラスについて

##クラスとは
プロパティやメソッドを定義できる型のことをクラスといいます。
もう少し、わかりやすくすると
様々な機能を持たせた設計図のことです
設計図の中に自分の使いたい機能や変数を入れておくことで後から簡単に呼び出して使うことができます

クラスは作った後にインスタンス化を行い使えるようにします
-インスタンス化とは
　作った設計図であるクラスを実体にしてあげることでプログラムの中で使うことができるようになります。
　なので、クラスは作った後にインスタンス化（実体化）させてあげる必要があります。





##クラスの使い方
クラスの定義

 `class クラス名{
        クラスに持たせたい機能のコード
   }`


クラスのインスタンス化

`let 定数名 = クラス名()`


例：Dogという名前のクラスを作り、nameという変数に「ポチ」を入れたものをクラスに持たせた場合
   dogという定数を使いDogクラスをインスタンス化させる
`class Dog{
  var name = "ポチ"
}`

`let dog = Dog()`
arduino.h: No such file or directory

ESP32 用のスケッチを送ってもらって、手元で検証したらエラーでコンパイルできませんでした。


```

・
・
・
epdif.h:4:10: error: arduino.h: No such file or directory
 #include <arduino.h>
          ^~~~~~~~~~~
compilation terminated.
次のフォルダのライブラリSPIバージョン1.0を使用中：/home/nanbuwks/Downloads/ardublock/arduino/linux64/AKBONE/AKBONE2019/linux/arduino-1.8.10_AKBONE/hardware/arduino/avr/libraries/SPI 
exit status 1
arduino.h: No such file or directory

```
該当箇所はとあるヘッダファイルの下記。

```

#include <arduino.h>
```


なんだようごかねーなー検証してないんじゃねーの？ と思って相手先で動作状況のビデオを見せてもらったらちゃんと動いている。

疑ってすまんかったそれじゃこちらのESP32の環境構築に変な設定が入ったかな？ と思っていろいろ調べたが問題は無い。

あれれーと思っていたら・・・

```

#include <Arduino.h>
```

にしたら動きました。
ファイル名大文字小文字に無頓着に作ったライブラリが戦犯。
MS-Windows のみで動作確認していたのでしょう。
やれやれ。
AutoHotkeyで3キー同時押しをトリガーにショートカットを設定

#初めに
 AutoHotkey、色々奥の深さは感じていたものの、深くリファレンスを読みこむ気力もなく検討していなかったのですが今回無変換キーが邪魔だったのでトライしてみました。
 ググったり試行錯誤した上でようやくやりたいことが実現できたのですが、ネット上に掲題の内容についてサクッと解説してあるものがなかったので、個人的メモ含め記録として記載します。
 ちなみに自分はプログラミングなど全く無関係な専攻と業界で生きており、趣味程度でプログラミングやってるものなので「これくらい分かれよ」というツッコミはぐっと押さえて温かい目で見ていただけると助かります。


#実現したかったこと
 使用しているMicrosoft SCULPT ERGONOMIC DESKTOP L5V-0では無変換キーが非常に大きいのに対し、使い道が少ない。
またノートパソコンのようにFnキー+Right、Leftの形で{Home}もしくは{End}を入力したい(=行末や行始点に移動したい)ため、
・無変換+Right→End
・無変換+left→Home
となるよう設定を試みた。

また、
・無変換+Shift+Right→ Shift+End(行末まで選択)
・無変換+Shift+left→ SHift+Home(行始点まで選択)
も併せて試みた


#結論
当初設定していたスクリプトは以下だがエラーが出た

```sample.ahk
vk1D & Right::Send {Home}
vk1D & +Right::Send +{Home} ;エラーとなる

```
というわけで
・無変換+Right→End
・無変換+left→Home
は可能だが、shiftが入る(入力キーが3つになる？)と上手く行かないようだった。

色々ググるとそもそも3つのキー同時入力は受け付けない？ようであった。
(詳しく調べてないので詳しい人教えて下さい)
よって、まず2つのキーが押下された瞬間、3つ目のキーが押下されているかIf文にて判別する方法があり、それを試したら上手く行った

```sample2.ahk
vk1D & Right::
If GetKeyState("Shift", "P") {
	　　　　　　	Send {Blind}{shift}
　　　　　　　　　Send {Blind}{End}
              }else{
          　　　 Send {End}
               }
Return
```
無変換+右キーが押された時GetKeyState("Shift", "P")でShiftキーが押されているときはShiftをsendしてからEndをsendし、それ以外はEndをsendするようにするに、という文である

{Blind}に関しては
>修飾キーの自動復元
Sendコマンドが始まるとき、仮想的に修飾キーを離した状態になる。
コマンド終了時に、再びもとの状態に戻される。
この動作は、Keysの最初に {Blind}をつけることで無効化できる。

とのことなのでここではあったほうが良さそうである。

#参考

キーバインドをカスタムして全能感を手に入れる【AutoHotKey, ChangeKey】
http://may46onez.hatenablog.com/entry/2019/04/21/001226

AutoHotkeyにおけるラベルの優先度と3キー同時押しの定義
http://did2.blog64.fc2.com/blog-entry-371.html

Autohotkeyでの同時押しショートカットキー実装方法 完全版
https://yuis-programming.com/?p=2135

ではまた。
*1 error LNK 2019: 未解決の外部シンボル __imp_GetFileAttributesExW が関数 _waccess_s で参照されました。

## はじめに

```cpp
system("pause");
```

などという文が入っていませんか？

## 背景

まず Windows でコンソールアプリケーションを開発し、それを RTX に移植するような場合で、プログラム中に上記のような文があると表題のエラーが発生します。

## 発生したエラーと原因

```bat
*1 error LNK 2019: 未解決の外部シンボル __imp_GetFileAttributesExW が関数 _waccess_s で参照されました。
```

リンカのエラーで、具体的にどの箇所がエラー原因なのかわかりません。またメッセージから推測することもできません。ネットで調べても、これといった情報には当たりません。そもそも RTX の開発自体が少ないのかもしれません。Windows 開発と RTX 開発とを並行して行うことも少ないのかもしれません。あるいは開発ノウハウを共有するという文化も希薄なのかもしれません。

```cpp
system("pause");
```

Windows のシステムコールを RTX でやろうとしているのでエラーになるのは当然ですが、リンカエラーなので、原因までたどり着くのは困難です。とにかく情報がなかったので、ここに記します。原因は上記のような関数コールでした。

以上です。
【超初心者的】Railsアプリ作成 Part.3 ビューの設定（リンク編）

ページ内にリンクを追加して、もう少しアプリっぽくしていきます。

##詳細ページへのリンク

一覧ページの商品名をリンクにして、クリックすると商品詳細ページが表示されるようにします。
`<td><%= menu.name %></td>`を書き換えます。

```rhtml:app/views/menus/index.html.erb
<td><%= link_to menu.name, menu %></td>
```

http://localhost:3000/menus にアクセスしてみてください。商品名がリンクになっていると思います。また、クリックするとその商品の詳細（show）ページに遷移します。

##リンクの仕組み

リンクの書式は下記のとおりです。

`link_to 表示される文字, リンク先`

「表示される文字」には文字を書いても構いませんが、データベースに登録されたデータがたくさんある場合、いちいち手入力するのは現実的ではありません。そのため「menu.name」でデータベースから商品名を読み込んでいます。

なお、前のPartで作成したindexビューでは、繰り返し処理を利用しています。下記に注目してください。

```rhtml:app/views/menus/index.html.erb
    <% @menus.each do |menu| %>
      <tr>
        <td><%= link_to menu.name, menu %></td>
        <td><%= menu.price %></td>
        <td><%= menu.description %></td>
      </tr>
    <% end %>
```

`<% @menus.each do |menu| %>`と`<%end>`で囲まれた部分が、繰り返し処理されます。この処理のおかげで、データが10件あっても100件あっても少ないコード量ですべてのデータを表示させることが出来ます。

また、リンク先についてですが、ここでルーティングについて思い出してください。

```terminal:ターミナル
    Prefix Verb     URI Pattern                 Controller#Action
     menus GET      /menus(.:format)            menus#index
           POST     /menus(.:format)            menus#create
  new_menu GET      /menus/new(.:format)        menus#new
 edit_menu GET      /menus/:id/edit(.:format)   menus#edit
      menu GET      /menus/:id(.:format)        menus#show
           PATCH    /menus/:id(.:format)        menus#update
           PUT      /menus/:id(.:format)        menus#update
           DELETE   /menus/:id(.:format)        menus#destroy
```

リンク先の指定には、Prefixのキーワードが指定出来ます。先述のリンク設定では「menu」を指定しているので、商品IDが「1」の商品であれば、「menus/1」へのリンクになります。おかげで商品名をクリックするとその商品の詳細ページに遷移することが出来ます。わざわざIDを調べる必要もありません。めちゃくちゃ簡単ですね。


##編集ページへのリンク

詳細ページに編集ボタンを作成します。こちらもルーティングのPrefixで指定しますが「_path」をつけるのを忘れないように注意してください。

```rhtml:app/app/views/menus/show.html.erb
<%= link_to "編集", edit_menu_path %>
```

詳細ページに追加されたリンクをクリックすると編集ページに遷移します。内容を変更して更新ボタンを押すと、ふたたび詳細ページに遷移します。変更した内容で表示されます。
ちなみに、編集ページの更新ボタンを押した際は、ルーティングの「PATCH」が呼び出されます。


##新規作成ページへのリンク

一覧ページに新規登録ページへのリンクを作成します。やはりこちらもルーティングのPrefixで指定します。

```rhtml:app/views/menus/index.html.erb
<%= link_to "新規作成", new_menu_path %>
```

これでブラウザからデータベースにデータを新規登録出来るようになりました。


##削除ボタン（リンク）

詳細ページに削除用のリンクを作成します。こちらは書き方が少し特殊です。
「method: :delete」と書くことで、ルーティングの「DELETE」を呼び出すことが出来ます。

```rhtml:app/views/menus/index.html.erb
<%= link_to "削除", @menu, method: :delete, data: { confirm: "本当に削除しますか？" } %>
```

これでブラウザからデータベースのデータを新規削除出来るようになりました。


ここまでの設定でページ間のつながりが出来て、アプリっぽくなったのではないでしょうか。
Heroku 使い方

#基本的なデプロイまでの流れ
node.jsのアプリ作成
git hubでリポジトリを作成→作ったアプリをpushする
push方法は別途こちらに記載あり
https://kirikko-scondcube.hatenablog.com/entry/2020/06/29/134515



```
heroku login
```
をターミナルで入力→herokuにログイン（対象のアプリのディレクトリに入っておく。もしかしたらここはディレクトリグローバルでもいいかも）

ログイン後

```
heroku create
```
でアプリ作成

```
git remote -v
```

herokuのcreateが実行されるとこのコマンドで

```
heroku  https://git.heroku.com/protected-garden-62703.git (fetch)
heroku  https://git.heroku.com/protected-garden-62703.git (push)
origin  https://github.com/Toshihisa-Handa/herokuTest1.git (fetch)
origin  https://github.com/Toshihisa-Handa/herokuTest1.git (push)
```
このように４行の記載が表示される。
heroku createをする前はoriginの二行のみが表示されるだけだが、実施後herokuの行が2つ追加される。

これを確認できたら

```
git push heroku master
```

でpushをし、

```
heroku open
```
で表示が可能

###注意点
上記の方法での実施は以下サイトの流れで確認をした。
https://developer.salesforce.com/events/webinars/nodejs_heroku_0525/

この参考サイトのファイルではheroku openに成功したが、自身で作成したnodeアプリでは同様の方法でgit push heroku masterするところまでは成功したものの
heroku open をするとエラーになり以下の画面が表示された。
![スクリーンショット 2020-08-09 12.37.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670884/f54fe4ac-a32d-d81b-7184-105a41a5f998.png)

複数ファイルを取り扱ったアプリではローカルで動いていても、上記以外の方法をさらにする or コードの記述を修正するといったことが必要かもしれない
（つづく）


##アプリの作成（補足）
参考：https://qiita.com/shti_f/items/b4b5d830672d908eff4e

アプリの作成コマンド

```
heroku create
```

ちなみにcreateの後に任意でアプリ名を当てることも可能（名前を入れないとランダムでアプリ名が作成される）
任意で当てる場合は既存のアプリと名前がかぶらないようにする必要がある。

作成が終わるとヘロクのマイページに以下の画像のようにプロジェクトが作成される。


<img width="1297" alt="スクリーンショット 2020-08-09 10.41.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670884/c839cc8a-81d4-5bb3-63c0-a45db3fc5b9a.png">



##作成したアプリの削除

```
heroku apps:destroy --app アプリ名
```

入力すると

```
  WARNING: This will delete ⬢ アプリ名 including all add-ons.
 ▸    To proceed, type アプリ名 or re-run this command with --confirm
 ▸    アプリ名
```

と聞かれるので、削除して問題なければアプリ名を入力してエンター
これでヘロクのマイページからもアプリが削除される。
ディジタルフォレンジックス　収集、検査、分析、報告

平成31年春期 午前問題39

ディジタルフォレンジックスの手順を収集，検査，分析，報告に分けたとき，そのいずれかに該当するものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/02df8bd2-97e3-2b6b-8fab-e42effff2054.png)


１、ディジタルフォレンジックスは、
不正アクセスや情報漏えいなどのセキュリティインシデントの発生時に、原因究明や法的証拠に必要となる電子的記録を収集・解析することをいいます。
**フォレンジックス(forensics)**には、「科学捜査」や「法医学の ～」という意味があるため、直訳すれば「電子科学捜査」となります。フォレンジックスのプロセスは、収集→検査→分析→報告の基本的なフェーズで構成されます。

２、ディジタルフォレンジックス手順：
①データの収集：データの完全性を保護する手続に従いながら、関連するデータを識別し、ラベルづけし、記録し、ハードディスクなどの媒体から取得する。

②検査：データの完全性を保護しながら収集したデータを自動的手法及び手動的手法の組合せを使ってデジタル・フォレンジックとして処理することにより、特に注目するデータを見定めて抽出する。この段階で必要があれば収集したデータから暗号化されたデータを復号したり消去されたデータを復元したりする。検査の代わりに復元という言葉を使う場合もある。

③分析：法的に正当とみられる手法および技法を使用して検査結果を分析することにより、収集と検査を行う契機となった疑問を解決するのに役立つ情報を導き出す。

④報告：分析結果をまとめ依頼者に報告する。この結果は、将来裁判などで用いられる可能性がある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/a6c35904-c1c3-1949-9630-aaee9bf42280.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/60b2d811-b855-de84-8f59-06b924b15f7f.png)


３、
IPAが公表している「インシデント対応へのフォレンジック技法の統合に関するガイド」によれば、フォレンジックプロセスは、収集・検査・分析・報告の4つのフェーズから成ります。
・収集
　データの潜在的なソースを識別し、それらのソースからデータを取得する
・検査
　収集したデータから関連する情報を評価して抽出する
・分析
　複数のソースのデータを相互に関連付けるなどして、結論を導き出すためにデータの調査と分析を行う
・報告
　分析フェーズによって得られた情報を準備して提示する


・SIEM
SIEM（シームと読む）は「SIM」（Security Information Management）と「SEM」（Security Event Management）を組み合わせた言葉（ガートナーによる）だ。

　SIMはいわゆる「統合ログ管理」のうちセキュリティ領域のログを対象とした仕組みのことをいい、さまざまなネットワーク機器やホストシステムが出力するセキュリティイベントログおよびシステムユーザーの利用ログなどを蓄積し、さまざまな視点から検索、分析を行う。

　SEMは、同様にさまざまな機器からのログを収集、蓄積することは同じだが、分析をリアルタイムに行う点が異なる。

・メールの暗号化あるいは添付ファイルの暗号化
電子メールを安全に送受信するために、メールの本文や添付ファイルを暗号化することができます。
メール本文および添付ファイルを暗号化するには、暗号化のための専用ソフト
(PGP＊３など)や環境（暗号鍵）が必要となります。お手軽な方法として、添付ファイ
ルのみをファイル暗号化ソフトやドキュメント作成ソフトに付属した暗号化機能、あ
るいは圧縮･解凍ソフトの暗号化機能によって暗号化する（パスワード保護する）こ
とも効果的です。
*3) PGP（Pretty Good Privacy）とは、アメリカの Philip R. Zimmermann を中心とした開発チームによって作られた暗号化ソフトで、世界的に標準化されているものです。




参照：
https://www.itpassportsiken.com/kakomon/30_haru/q97.html

デジタル・フォレンジックスの手順
https://legalex.co.jp/2020/04/18/11-df-process/

SIEM
https://www.keyman.or.jp/kn/articles/1504/13/news158.html

メールの暗号化あるいは添付ファイルの暗号化
https://www.ipa.go.jp/security/antivirus/documents/07_mail.pdf
パスワードクラック手法　レインボー攻撃、パスワードリスト攻撃、類推攻撃、総当たり攻撃(ブルートフォースアタック)、

平成31年春期 午前問題38

パスワードクラック手法の一種である，レインボー攻撃に該当するものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/5b992ad2-dbd6-6ea9-6925-75de08a5864d.png)

１、レインボー攻撃は、
レインボーテーブルと呼ばれる、ハッシュ値からパスワードを特定するための逆引き表を用いて、パスワードを高速に解読する手法です。レインボーテーブルは、使用される文字種と文字数の組合せごとに作成されます。

解読対象のハッシュ値を入手したら、チェーンの各位置からチェーン化で行ったのと同様の計算を施し、チェーンの最後のハッシュ値を計算します。これがレインボーテーブルに格納されているハッシュ値のいずれかと一致すれば、対応するパスワードが存在するチェーンがわかる仕組みになっています。


２、パスワードリスト攻撃
何らかの方法で事前に利用者IDと平文のパスワードのリストを入手しておき，複数のシステム間で使い回されている利用者IDとパスワードの組みを狙って，ログインを試行する。


３、総当たり攻撃(ブルートフォースアタック)
パスワードに成り得る文字列の全てを用いて，総当たりでログインを試行する。

４、類推攻撃
利用者の誕生日や電話番号などの個人情報を言葉巧みに聞き出して，パスワードを類推する。


参照：

https://www.ap-siken.com/kakomon/31_haru/q38.html

４枚の図解でわかるレインボーテーブル攻撃
https://persol-tech-s.co.jp/corporate/security/article.html?id=57
タブレットで「:hover」を解除する

## やりたいこと
画面サイズでレスポンシブ対応しているケースが多いけど、iPadの12.9インチ画面サイズだとPCの画面サイズにかぶってしまう。
タブレットの:hoverは一回効いてしまうと外れない。
タブレットの:hoverは無効にしたいけど、PCは有効にしたい。
ついでにIE11の対応も入れたい。。。

## で、やったこと
「Interaction Media Features」を使用した。

Edgeまで対応している。
https://caniuse.com/#feat=css-media-interaction
hoverのStyleを以下のようにする。

```
/* :hoverを使える場合 */
@media (hover: hover){
  a:hover{
    opacity: 0.7;
  }
}

/* :hoverを使えない場合 */
@media (hover: none) {
  a:hover{
    opacity: 1;
  }
}
```

けど。。。IE11で確認すると:hoverのStyleが効かない。。。

その場合は「-ms-high-contrast」を入れてあげる。

https://developer.mozilla.org/en-US/docs/Web/CSS/@media/-ms-high-contrast

```
/* IEも考慮したよ */
@media (hover: hover), (-ms-high-contrast:none){
  a:hover{
    opacity: 0.7;
  }
}

```

これで、大丈夫!!
リスクベース認証の特徴、二要素認証、マトリクスコード認証

平成31年春期 午前問題37

リスクベース認証の特徴はどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/9b14eae9-5dfb-2bdc-c771-6c8143a64d5f.png)


１、リスクベース認証は、
通常とは異なる環境(例えば、普段とは異なるIPアドレスやISP及びOSやWebブラウザ等)からの認証要求があった場合に、通常の認証に追加する形で別の認証を実施する方式です。不正ログインの可能性のあるアクセスに対してだけ追加の本人認証を行うため、一定の利便性を保ちつつ、異なる環境からの不正アクセスに対してセキュリティを高めることができます。

２、RADIUS認証
いかなる環境からの認証の要求においても認証方法を変更せずに，同一の手順によって普段どおりにシステムが利用できる。

RADIUS（ラディウス、ラディアス、Remote Authentication Dial In User Service）は、ネットワーク資源の利用の可否の判断（認証）と、利用の事実の記録（アカウンティング）を、ネットワーク上のサーバコンピュータに一元化することを目的とした、IP上のプロトコルである。

３、二要素認証
ハードウェアトークンとパスワードを併用させるなど，認証要求元の環境によらず常に二つの認証方式を併用することによって，安全性を高める。

４、パスワードリマインダ
利用者が認証情報を忘れ，かつ，Webブラウザに保存しているパスワード情報も使用できない場合でも，救済することによって，利用者は普段どおりにシステムを利用できる。

５、マトリクスコード認証
インターネットバンキングでの連続する取引において，取引の都度，乱数表の指定したマス目にある英数字を入力させて認証する。



参照：

https://www.ap-siken.com/kakomon/31_haru/q37.html

RADIUS
https://ja.wikipedia.org/wiki/RADIUS#:~:text=RADIUS%EF%BC%88%E3%83%A9%E3%83%87%E3%82%A3%E3%82%A6%E3%82%B9%E3%80%81%E3%83%A9%E3%83%87%E3%82%A3%E3%82%A2%E3%82%B9%E3%80%81Remote,%E4%B8%8A%E3%81%AE%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82
Automation Anywhere A2019のOCRアクションを試してみる

Automation Anywhere A2019のOCRアクションを試してみました。

**環境**

* Automation Anywhere Community Edition A2019.14 (ビルド5322)


# OCRアクションの利用
A2019では、以下の4つのアクションを利用できます。これらは無料のCommunity Editionでも利用できます！ 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/d585e891-dd05-6401-b461-edd9a4288ffe.png)

この中で「パスで画像をキャプチャ」アクションを利用しました。利用した画像は、国税庁のページにあった以下のバナーです。左側に人の画像が、右側にいくつかのサイズで文字が書かれています。画像サイズは1141x477でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/22655e16-7bf4-5c8a-7475-387c369a6bf7.png)

Botのアクションリストは以下の通り、OCRアクションで認識した文字列をメッセージボックスで表示するシンプルなものです。今回は、あらかじめ画像ファイルをControl Roomにアップしましたが、デスクトップに置いていてもよいですし、変数指定でループ等を回すことも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/2ad2bd57-9d7c-2a1e-8414-f81c5a3b7469.png)
「ロケールを選択」では、英語、日本語、ロシア語を選択できます。ここでは「日本語」を選びます。OCRエンジンは今のところABBYY一択のようです。

実行してみると、初回実行は結構時間がかかりました。650MBくらいのモジュールをロードしてきます。(2回目以降は時間はかかりません)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/fa7a221b-6a25-a6b4-f68c-f5f4665ddef5.png)

出力結果ですが、画像はうまくよけて文字列だけ正しく認識できていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/7d675749-0ec5-6a56-2f0f-f61041cd13b3.png)

# v11との比較
v11.3.2以降は日本語でOCRが可能でした。OCRエンジンはいくつか選択可能 (ABBYY、MODI、TESSERACT、TOCR) でしたが既定の状態で使えるのはABBYYかTESSERACTの2択でした。(ABBYYには初期設定が必要⇒『[Automation Anywhere で日本語OCRエンジンが動作しないときに確認する項目](https://qiita.com/RPAbot/items/1b279afcf2710721f73c)』)

v11はクライアントソフトだったので、オプションダイアログボックスで画像や結果のプレビューができたのは便利でした。
手元にあるv11.3.3で試したところ、ABBYYの場合、文字列は正しく認識できましたが、人の画像の一部を文字として認識してしまっているのか、2か所にゴミが入っています(<font color="Red">赤枠</font>)。そういう意味では、A2019の方がトリミングの精度は向上しているようです。

**ABBYY**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/a8eac2e0-636b-9d87-4244-2eee023688ee.png)

OSSのTESSERACTの場合は、人の画像の部分を読み込んでしまいゴミの部分が多くなっているのと、画数が多い漢字2字 (「響」⇒「璽」、「電」⇒「雷」)が間違っているのと、センターの長音記号が数字の「一」になってしまっており、コンテキストによる修正が効いていないようです。

**TESSERACT**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/ae467ad5-98b4-bd64-0b0a-fb1e4a8f3462.png)

ちなみに、OCRに読み込ませる画像の解像度は200 DPI程度以上が必要です。パソコンの画面の解像度は通常96DPI程度なので、パソコンに表示される文字は2倍以上に拡大した状態でないとうまく認識されません。このバナーくらいの文字の大きさが必要ということになります。
小ネタ：乱数あれこれ｜Power Query

以前に[テスト用データ](https://qiita.com/tanuki_phoenix/items/5bccb05e2f1983249453)を作ったことがありました。今回は乱数に焦点を当てて、各方法の挙動、利用法をまとめてみました。

## 方法一覧
既定では関数が3つ用意されてます。

- [Number.Random関数](https://docs.microsoft.com/ja-jp/powerquery-m/number-random)
- [Number.RandomBetween関数](https://docs.microsoft.com/ja-jp/powerquery-m/number-random)
- [List.Random関数](https://docs.microsoft.com/ja-jp/powerquery-m/number-random)

※sharedもreferenceも同じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/9f966e2d-097a-6362-9d88-1bd2bc3c4f87.png)



## Number.Random関数は、ただ単に乱数を作る。
ワークシートのRAND関数と同様で、0から1の範囲で乱数を作ります。
カスタム列の追加で使うと、行ごとにちゃんと違う乱数が入ります。クエリ更新により、乱数はさし変わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/1e9ec144-0139-9591-9313-447a86af2522.png)
ちなみに乱数を全部同じにしたい、なんて場合は、列追加処理の前のステップで、関数の実行結果を値（下図では`RandomNum`と名前を付けている）に入れてやればいいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/8ee159bd-2545-b818-a853-61b1b3cda535.png)



## Number.RandomBetween関数は、乱数の範囲を絞って作れる。
その名の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/89738c75-b1a5-4633-6bee-38161e2d8473.png)

上の画像の通り、整数に限定されません。ここがワークシートの[RANDBETWEEN関数](https://support.microsoft.com/ja-jp/office/randbetween-%E9%96%A2%E6%95%B0-4cc7f0d1-87dc-4eb7-987f-a469ab381685)と違うところです。
整数にしたいときは自分で丸めましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/56cfcd3c-20b6-e029-b035-67354ed299d4.png)


## List.Random関数は、変更されない乱数を作れる。
この関数の特徴は、`seed`引数を設定することで、乱数を固定できるところです。
ただし、Listを返す関数ですから、上の2つの関数と同じ使い方はできません。
以下、`seed`引数を0で固定して、使い方を書いてみます。乱数の値が変わっていないことに注意してください。

```pq:List.Random関数の仕様
List.Random(count as number, optional seed as nullable number) as list
```

### 単純に使う
空のクエリに関数を入力後、テーブルに変換すればいいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/5960ea34-5872-c638-7ab6-087c31083700.png)

### 既存のリストと組み合わせて使う
少し実践的です。[Table.FromColumns関数](https://docs.microsoft.com/ja-jp/powerquery-m/table-fromcolumns)で、リストをテーブルに組み上げます。
各リストの要素数が揃わない場合は`null`値が入ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/e7985bb0-c509-c653-f2d2-8e242fac86aa.png)



### 列追加的に使う
実用的にはこちらの方が多いかもしれません。
先ほどはリストからテーブルへの組み上げを行いました。これと逆に、テーブルをばらす関数――[Table.ToColumns関数](https://docs.microsoft.com/ja-jp/powerquery-m/table-tocolumns)――も用意されています。これを使うと、テーブルをリストのリスト（リストの入れ子）に変換できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/96cb9c18-a21d-6ad3-d6ad-087617033190.png)


ちなみに、Listの結合はこんな具合で動作します。

```
{1,2,3} & {4,5,6}　//{1,2,3,4,5,6}
{{1,2,3},{4,5,6}} & {7}　//{{1,2,3},{4,5,6},7}
{{1,2,3},{4,5,6}} & {{7}}　//{{1,2,3},{4,5,6},{7}}
List.Combine({{1,2,3},{4,5,6}}) //{1,2,3,4,5,6}
```
情報セキュリティにおけるエクスプロイトコード(Exploit Code)

平成31年春期 午前問題36

情報セキュリティにおけるエクスプロイトコードに該当するものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/13b96c30-d52e-0526-4936-ba6bf55c7dd6.png)


１、エクスプロイトコード(Exploit Code)とは、ソフトウェアの脆弱性を悪用した不正な動作を再現するために作成されたスクリプトやプログラムを指す言葉です。
様々な脆弱性に対して攻撃が成功するように、複数のエクスプロイトコードをまとめたエクスプロイトキットというツールも存在し、攻撃に利用されています。

エクスプロイトコードは、多くの場合、悪意を持ったマルウェアのことを指しますが、セキュリティ向上目的での研究材料や脆弱性検査のために作成された実証用コードという意味でも用いられます。

２、データ移行プログラム
同じセキュリティ機能の製品に乗り換える場合に，CSVなど他の製品が取り込める形式でファイルを出力するプログラム


３、ファイル管理ツール
コンピュータに接続されたハードディスクなどの外部記憶装置や，その中に保存されている暗号化されたファイルなどを閲覧，管理するソフトウェア

４、プロトタイプモデル
セキュリティ製品を設計する際の早い段階から実際に動作する試作品を作成し，それに対する利用者の反応を見ながら徐々に完成に近づける開発手法


参照：
https://www.sc-siken.com/kakomon/28_haru/am2_6.html#:~:text=%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%97%E3%83%AD%E3%82%A4%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E3%80%81%E5%A4%9A%E3%81%8F%E3%81%AE,%E6%84%8F%E5%91%B3%E3%81%A7%E3%82%82%E7%94%A8%E3%81%84%E3%82%89%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82

https://www.sg-siken.com/word/%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%97%E3%83%AD%E3%82%A4%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89.html