OmniAICreator/Qiita-1.07M huggingface dataset:
DATADOGでログのArchivesとRehydrateをやってみる


# 概要
弊社はシステムのログの保存や閲覧にDATADOGを利用しています。
長期保存する必要のあるログについてはArchives機能、過去にさかのぼったログの閲覧にはRehydrate From Archivesを使って復元します。

# 前提
ログアーカイブ用の領域（S3,GCSなど）は予め作成をしておいてください。

# 課金体系
公式
https://www.datadoghq.com/ja/pricing/?product=%E3%83%AD%E3%82%B0%E7%AE%A1%E7%90%86#%E3%83%AD%E3%82%B0%E7%AE%A1%E7%90%86

Archivesについては取り込み
Rehydrate From Archives　については保持または復元　
に課金されます。復元は若干高いので、Rehydrate From ArchivesのQueryで絞り込んで復元したほうが良さそうです。

![スクリーンショット 2021-06-28 13.12.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1545164/815e3ce9-e22b-1fa9-ddd9-dc2c0b132c3d.png)


# Archives
DATADOGからS3等にログ転送し保存します。
New Archivesをクリックします。
![スクリーンショット 2021-06-28 12.39.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1545164/fab2515d-e97f-a98f-4a40-fc420d587601.png)


①Define which data to store
Filterに対象のログのタグを入力します。
この例はEnv:prdのタグが入ったものだけS3に保存しています。

②Select Archive Type
Amazon S3、Google Cloud Storage、Azure Storage等が保存先に選択できます。

③Configure Bucket
AWS Account　（対象のAWSアカウント）
S3 Bucket　（ログのアーカイブ先のバケット）
Path (s3のバケット配下のPath オプションなので必要であれば)
にそれぞれ情報を入れます。

④Name this Archive
アーカイブ名をつけます。

![スクリーンショット 2021-06-28 12.40.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1545164/cb4cc71a-e4df-993b-8595-b9bacdcff50e.png)


入力後にSaveをクリックします。
これでArchivesの設定は完了です。

# Rehydrate From Archives
図のように新規作成をクリックします。

![スクリーンショット 2021-06-28 12.45.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1545164/477be2af-c528-6f19-2896-7c2a53a9ada1.png)


①Set Query
Select Time Periodのプルダウンをクリックし、復元期間を選択します。
Queryで復元対象のログを絞り込みます。

②Set Rehydration Flow
Source Archiveで対象のArchiveを選択します。

Destination Historical View
Name Historical Index
復元するログ名です。わかりやすい名前をつけます。

Stop Rehydration if Volume Exceeds
復元するログの量に制限をかけます。デフォルトは300millionになっています。

Retain Logs for
復元したログの保存期間です。デフォルトは15日になっています。

③Notify Team on Rehydration Completion
復元が完了の通知先です。

問題なければRehydrate From Archive　をクリックします。

![スクリーンショット 2021-06-28 12.49.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1545164/56386a1b-4477-9f20-6f9d-8cc30017973a.png)


以下の画面になります。
復元の所要時間が表示されます。

![スクリーンショット 2021-06-28 13.41.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1545164/eb1a6fa3-fe2f-1880-0e23-8aa1957f1fde.png)

以下のようにACTIVEになれば復元完了です。Viewをクリックして閲覧できます。

![スクリーンショット 2021-06-28 13.51.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1545164/a9a29320-2180-1491-3110-06fa83c9870d.png)
Sequal Aceの基本情報

Sequal Aceの使い方をまとめた記事です。
##アジェンダ
1. Sequal Aceとは
2. Sequal Aceの使い方
3. Sequal Aceのインストール

#1. Sequal Aceとは
<details><summary>Sequal Aceの説明</summary> MacOS用のMySQL(MariaDB)クライアント。
  MySQLへの操作をGUI操作可能。Sequel Proの後継に当たる。
<公式リファレンス>
  ○Appストア
  https://apps.apple.com/us/app/sequel-ace/id1518036000?mt=12
  ○公式HP
   https://sequel-ace.com/
![SequalAce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/e0380d92-3661-e62a-0ccc-799d1a8c8d90.png)
</details>

#2. Sequal Aceの使い方
<details><summary>2-1. ログインの仕方</summary> 
![スクリーンショット 2021-06-28 14.53.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/0df8ce17-fdad-11f2-522a-0b778d02ca1e.png)
○パラメータの説明
 ・Name:接続先名称(名称はなんでもOK！サーバ名をつけておくと使いやすい)
 ・UserName：MySQL/MariaDBのログインユーザ(例ではrootです)
 ・Password：MySQL/MariaDBのログインユーザのPW(例では、rootのPWを入力しています。)
 ・Database：初回ログイン時のDBを設定できます。
 ・Port：MySQL/MariaDBのポート番号(デフォルトでは3306)
 ・Time Zone:ログイン時のタイムゾーン(デフォルト設定でOK。特段変更する事はないです。)
「AddtoFavorite」ボタンを押すと、お気に入り登録できます。
</details>

<details><summary>2-2. DBのスキーマ設定</summary> 
![dbの設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/02b5c6eb-cb05-5327-8c58-5e3e32530359.png)
接続先のDB(スキーマ)を選択。画像ではtestdbを設定。
モザイク箇所に作成したスキーマが表示されます。
</details>

<details><summary>2-3. TBL構造</summary> 
![TBL構造.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/cbee987f-c457-7d52-b6cc-a30089d5eea2.png)
○SQLの代替(DESC TBL名)
</details>

<details><summary>2-4. TBLデータ</summary> 
![TBLデータ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/e15be56d-525a-f2bd-adb2-51bf47200866.png)
○SQLの代替(select * from TBL名)
</details>

<details><summary>2-5. TBLリレーションシップ</summary> 
![TBLリレーションシップ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/37c367cb-aac6-9ef6-49bb-ae706633226e.png)
</details>

<details><summary>2-6. TBL情報</summary> 
![TBL情報.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/48163e67-2099-c3bd-9de1-dd51cbca7181.png)
</details>

<details><summary>2-7. TBLクエリ</summary> 
![TBLクエリ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/ba6cc071-1da2-74d6-8cef-60e4448debb7.png)
※SQLを実行可能です。
</details>

#3. Sequal Aceのインストール
<details><summary> 3-1. AppStoreからのインストール</summary> 
 ダウンロード方法は2通りありますが、AppStoreからのインストールが簡単でしょう！！
 1. AppStoreからのダウンロード
  https://apps.apple.com/us/app/sequel-ace/id1518036000?mt=12
</details>
<details><summary> 3-2. ターミナルからのインストール</summary> 

```
~/develop $ brew install --cask sequel-ace
==> Downloading https://github.com/Sequel-Ace/Sequel-Ace/releases/download/production/3.3.3-3034/Sequel-Ace-3.3.3.zip
==> Downloading from https://github-releases.githubusercontent.com/271553915/8fd32480-c86a-11eb-9b28-cb3b272168ac?X-Amz-Algorithm=AWS4
######################################################################## 100.0%
==> Installing Cask sequel-ace
==> Moving App 'Sequel Ace.app' to '/Applications/Sequel Ace.app'
🍺  sequel-ace was successfully installed!
```
</details>
【AWS認定試験】DOP-C01取得しました

# はじめに
先日、DOP-C01に合格した為、やったことを残します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/c39d993c-48e3-0685-634e-d435018fb272.png)


## これまでのAWS認定受験歴
|年月|試験|点数(合格点)|合否|
|---|---|---|---|
|2020/08|[AWS認定クラウドプラクティショナー(CLF)][link-2]|809/1000(700)|〇|
|2020/11|[AWS認定ソリューションアーキテクトアソシエイト(SAA)][link-3]|753/1000(720)|〇|
|2021/01|[AWS認定デベロッパーアソシエイト(DVA)][link-4]|862/1000(720)|〇|
|2021/02|[AWS認定SysOpsアドミニストレータアソシエイト(SOA)(C01)][link-5]|731/1000(720)|〇|
|2021/04|[AWS認定ソリューションアーキテクトプロフェッショナル(SAP)][link-6]|698/1000(750)|×|
|2021/06|[AWS認定ソリューションアーキテクトプロフェッショナル(SAP)][link-6]|832/1000(750)|〇|

## 試験対策
### 学習時間
約2週間(約30~40H)

### やったこと
以下のUdemyの問題集をメインでやりました。

1~3をゆっくり周回しました。1~3すべてで85%以上取れるようになり、4を初見で70%取れたため、受験しました。
(余談ですが、下記問題集は問題自体の質は良いのですが、日本語がおかしな部分があるように見受けられました。そのため、問題の内容が頭に入ってこないことがありました。)

2000円くらいかかる公式の模擬試験は受験していません。

https://www.udemy.com/course/aws-devops-dop-c01-2020/

模擬問題でわからないサービスがあった場合、[BlackBelt][link-9]を見返しました。
OpsWorkなどは見てよかったなと思います。

[公式ページ][link-7]にあるDOPサンプル問題を参考に、出題されるサービス(Code系(CodeCommit、CodeBuild、CodeDeploy、CodePipeline)等)のハンズオンとかやると良いかもしれません。
一度試してみると、できる・できないを判断する際に役立ちます。
## 試験
ピアソンVUEを用い、在宅受験を行いました。
SAPから2週間で受験したので受かるか不安でしたが、[今なら落ちても再受験無料][link-8]なので、エイヤで受けました。

### 試験中に感じたこと
- 結構いける感じがする

SAPよりは簡単に感じました。解いている途中も4割ほどは自信をもって回答することができました。少なくともSAPを受験していた時の絶望感は全くなかったです。

- 試験がツラい

DOPもSAPと同様に75問180分です。寝不足や疲れがあると試験中にいろいろとツラくなります。前日はしっかりと睡眠をとりましょう。私は前日あまり寝ていなかったので、20問くらいで集中力がなくなってきました。残問題数を見ると精神的なしんどさがありました。


# 感想・まとめ
関係ないですが、予約するときに以前より日程埋まっていた気がしました。在宅受験で落ちても無料なので需要がちょっと高まっているんですかね。お気に入りの時間が埋まっててショックでした。。。




<!-- link -->

[link-1]:https://qiita.com/t_tsuchida/items/3b3e4393c31c97fd4423
[link-2]:https://aws.amazon.com/jp/certification/certified-cloud-practitioner/
[link-3]:https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/
[link-4]:https://aws.amazon.com/jp/certification/certified-developer-associate/
[link-5]:https://aws.amazon.com/jp/certification/certified-sysops-admin-associate/
[link-6]:https://aws.amazon.com/jp/certification/certified-solutions-architect-professional/
[link-7]:https://aws.amazon.com/jp/certification/certification-prep/
[link-8]:https://pages.awscloud.com/Global_TrainCert_Japan_Online_Proctoringja.html
[link-9]:https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/
【Google Cloud Day'21】「最新 Google Cloud ネットワークアーキテクチャ設計のコツ (2021年版)」を視聴して

https://cloud.google.com/blog/ja/topics/events/google-cloud-summit-2021

https://cloudonair.withgoogle.com/events/google-cloud-day-digital-21/watch?talk=d3-infra-03
最新 Google Cloud ネットワークアーキテクチャ設計のコツ (2021年版)
Google Cloud では新しいサービスや機能がどんどん出てきていますが、そのような最新のサービスや機能を使うことで、より効率的に、より安全にインフラストラクチャの設計をおこなっていただけるようになっています。本セッションでは、そのような最新のサービスや機能をご紹介しつつ、それを活用した最新のインフラストラクチャ設計のコツをご案内します。

<table>
	<tr>
		<th>質問</th>
		<th>内容</th>
	</tr>
	<tr>
		<th>階層型ファイアウォールポリシーで、プロジェクトごとのファイアウォールルールと組織で決めたファイアウォールルールは通常通り優先度を設定して優先度を決めるように見えましたが、組織で決めたファイアウォールルールを強制することもできますか。</th>
		<td>こちらのページ https://cloud.google.com/vpc/docs/firewall-policies#rule-evaluation の図にあります通り、階層型ファイアウォールのルール(= 組織で決めたルール)が優先されるます。</td>
	</tr>
	<tr>
		<th></th>
		<td>逆に VPC ファイアウォールを階層型ファイアウォールに対して優先させることはできません</td>
	</tr>
	<tr>
		<th>Private Service Connect でAPIサービスへのアクセスできるようになったのは分かったのですが、既存の方法との使い分けとかはあるのでしょうか？</th>
		<td>すでにこれまでの方法で設定・運用されている場合はすぐに変更する必要はないですが、これから設計される場合は Privatre Service Connect による接続をオススメいたします。</td>
	</tr>
	<tr>
		<th>省略された仮想アプライアンスの冗長化に関して、参考になるページはありますか？</th>
		<td>次のページで内部ロードバランサーと組み合わせて、仮想アプライアンス等を冗長化する方法をご案内しています。 https://cloud.google.com/load-balancing/docs/internal/ilb-next-hop-overview</td>
	</tr>
	<tr>
		<th>ネットワークのガバナンスを効かせる場合、共有VPCを利用するのと、階層化FWを利用するの、どちらがおすすめでしょうか？</th>
		<td>共有VPCではネットワークの管理をインフラチームが一括することで、アプリ/システム開発チームがインフラの管理を意識しないで済むという責任分担が実現できます。</td>
	</tr>
	<tr>
		<th></th>
		<td>一方、階層化FWでは、インフラチームが複数あった場合に、組織(会社)全体としてのネットワークアクセスポリシーの一元化を実現可能になります。このように、共有VPC、階層化FWを組み合わせて、全体としてのガバナンスを実現いただけるものと思います。</td>
	</tr>
	<tr>
		<th>UserAgentが偽装されててもAdaptiveProtection可能ですか</th>
		<td>偽装された User Agent を含むトラフィックが有意に通常のトラフィックと異なっており、Adaptive Protection によって攻撃と判断された場合は、当該 User Agent を含むトラフィックをブロックするようなルールが提示される可能性が高くなります。</td>
	</tr>
	<tr>
		<th>Cloud Armor は OWASP のルールセットが使われている認識ですが、Adaptive Protection はそのルールセットをオーバーラップする感じでしょうか？</th>
		<td>Cloud Armor の Adaptive Protection は、攻撃と判断したトラフィックをブロックするためのルールを提示し、ユーザーがそのルールを実際に適用する、という運用になります。一方、OWASP 由来の攻撃を防ぐのも同じくルールになります。</td>
	</tr>
	<tr>
		<th></th>
		<td> ルールは優先度を持っており、優先度が高いルールから適用されますので、OWASP 由来のルールと、Adaptive Protection が生成したルールと、どちらの優先度を高くするかによって、どちらのルールが適用されるかが決まります。</td>
	</tr>
	<tr>
		<th></th>
		<td>Cloud Armor のルールの優先度についてはこちらのページをご参照ください https://cloud.google.com/armor/docs/security-policy-overview#eval-order</td>
	</tr>
</table>


<table>
	<tr>
		<th>切り口</th>
		<th>内容</th>
	</tr>
	<tr>
		<th>private service connect</th>
		<td></td>
	</tr>
	<tr>
		<th>階層型FWポリシー</th>
		<td></td>
	</tr>
	<tr>
		<th>ネットワーク仮想アプライアンス</th>
		<td>httpの中にこういう記載があったらだめ、というところも設定できる。</td>
	</tr>
	<tr>
		<th>共有VPC</th>
		<td>VPCをたくさん作る必要がなくなる</td>
	</tr>
	<tr>
		<th>ネットワーク仮想アプライアンスと共有VPCの組み合わせ</th>
		<td></td>
	</tr>
	<tr>
		<th>CloudArmor</th>
		<td>自分たちでDDOS対策の設定をしないといけなかったが、不審な挙動を分析して提案してくれるようになった。</td>
	</tr>
</table>
【Google Cloud Day'21】「セブンイレブン事例で解説する SoI を実現する具体的な IT システム」を視聴して

https://cloudonair.withgoogle.com/events/google-cloud-day-digital-21/watch?talk=d2-pl-23
セブンイレブン事例で解説する SoI を実現する具体的な IT システム
 DX が求めるシステムの要件と実現方法は意外とシンプルです。データ ドリブンを目指す基幹システムに関わる全ての人へ、常識となった SoI ( Systems of Insight ) の意味とそれを実現するためのベスト プラクティス、アーキテクチャとグランドデザインの具体的なイメージ、BigQuery や Apigee などのプロダクトの重要性について、セブン-イレブン・ジャパン様の事例を元に解説します。 

<table>
	<tr>
		<th>切り口</th>
		<th>内容</th>
	</tr>
	<tr>
		<th>DXとSoxの関係</th>
		<td></td>
	</tr>
	<tr>
		<th>SOIについて</th>
		<td></td>
	</tr>
	<tr>
		<th>セブンイレブン案件の内容</th>
		<td>データ分析基盤をセブンセントラルと呼んでいる</td>
	</tr>
	<tr>
		<th>課題と将来像</th>
		<td></td>
	</tr>
	<tr>
		<th>アーキテクチャ</th>
		<td></td>
	</tr>
	<tr>
		<th>ポイント</th>
		<td>今後店舗が増えてもシステムがおかしくならないようにした。</td>
	</tr>
	<tr>
		<th>成功の秘訣</th>
		<td>シンプルであれば、規模が大きくても開発コストがかかわなくなってきた。規模よりも複雑さがポイントになる。</td>
	</tr>
	<tr>
		<th>BQのメリット</th>
		<td></td>
	</tr>
	<tr>
		<th>Dataflowのメリット</th>
		<td>2万店舗のデータが1分くらいで収集できた。リアルタイムでパイプライン上でデータ確保ができるのがよかった。</td>
	</tr>
	<tr>
		<th></th>
		<td>大量のリクエストもスケーリングして対応する。開発者がポータルで簡単に試せる。</td>
	</tr>
</table>
App Tracking Transparencyでリジェクトされないメッセージを検討する

# 概要

iOS 14より始まった、ユーザーからトラッキングの許可をもらうための機能 App Tracking Transparencyですが、許可をリクエストするためにOSからダイアログが表示される場合があります。
そのダイアログを表示する前に、許可をしてもらうためにメッセージを表示することがあるかと思いますが、そのメッセージの内容によってはリジェクトとなりますので、リジェクトされないためのメッセージを検討します。

# ガイドライン
ひと昔は、ダイアログ表示前のメッセージにはガイドラインは無く、各社凝ったメッセージを出して、なるべく許可をしてもらうための工夫がとられていましたが、現在は正式にHuman Interface Guidelinesに [Accessing User Data and Resources](https://developer.apple.com/design/human-interface-guidelines/ios/app-architecture/accessing-user-data/) としてガイドラインが設けられました。

これに沿わないメッセージを表示したりするとレビュー時にリジェクトされる可能性があるため、どのようなメッセージがガイドライン違反になるか見ていきます。

## 許可にインセンティブを与えない

> Don’t offer incentives for granting the request. You can’t offer people compensation for granting their permission, and you can’t withhold functionality or content or make your app unusable until people allow you to track them.

許可をすることにインセンティブを与えるような説明をしてはいけません。
また許可によって機能がアンロックされるようなこともしてはいけません。

## タイトルに「許可」などの文言を使わない

> Don’t display a custom message that mirrors the functionality of the system alert. In particular, don’t create a button title that uses "Allow" or similar terms, because people don’t allow anything in a pre-alert screen.

カスタムメッセージ部分では許可の機能を与えることはできないため、「許可」などのタイトルを使ってはいけません。

## 標準のダイアログを表示したり、カスタムしたりしない

> Don’t show an image of the standard alert and modify it in any way.

OSのダイアログをキャプチャして表示してはいけません。
ガイドラインでは、ダイアログキャプチャ画像に**許可**部分を円で囲って強調していますが、そのようなこともしてはいけません。

## システムダイアログのデザインを装飾するようなことをしてはいけない

> Don’t draw a visual cue that draws people’s attention to the system alert’s Allow button.

表示されるダイアログを想定して、注意を引くような視覚的な装飾をしてはいけません。

そもそもダイアログはユーザーの設定によってサイズが可変になるので、場合によっては「**Appにトラッキングしないように要求**」に対して装飾が当たってしまう恐れがあります。

|さらに大きな文字（標準）|さらに大きな文字（最大）|
| --- | --- |
|<img width="247" alt="さらに大きな文字（標準）だと、許可に矢印が当たる" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687960/6dd89820-9869-8f4c-b649-4b4568084b19.png">|<img width="247" alt="さらに大きな文字（最大）だと、Appにトラッキングしないように要求に矢印が当たる" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687960/9c15f3f7-7e23-ad8e-d976-a6e5105276c9.png">|

# まとめ
ダイアログを表示する前のメッセージで許可を強調したりするとリジェクトされることになります。
[Accessing User Data and Resources](https://developer.apple.com/design/human-interface-guidelines/ios/app-architecture/accessing-user-data/) のDisplaying Custom Messaging Before the Alertの項目に、リジェクトされない一例が載っているので、そちらを参考にすればリジェクトはなさそうです。
日記；回すだけ①TwinCATの準備

###動かしたいものは
　模型の車を作ろうと思った。それも、荒れ地で動く用途。そのため、速度は不要だが、トルクは欲しい。
　そういう用途にはギアード・モータが使われる。モータはある程度の回転数があって、ギアで低速にすることでトルクが生まれる。でも、ギアで失われるエネルギーは少なくない。
　そこでブラシレスDCモータ（BLDC）だ。ここ数年、模型の世界でもものすごい勢いで普及している。ドローン用のように、ほとんどが高速回転用だ。
　工作機械や工場のラインでは、位置決めモータの多くはステッピング・モータが使われるが、サーボ・モータも多い。
###利用するモータ
　STマイクロのキットについていたmaxonの約100Wのモータを使う。もともとSTマイクロのデモ用基板についてきたのだが、とても安く入手でき、1024cptのエンコーダもついている。[EC-i 40](https://www.st.com/en/ecosystems/ec-i-40-motor-with-encoder.html#overview)と思われる。

<img width="400" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/07e5719b-8127-17e7-1b18-e8b2736fbf31.png">

　このクラスのモータは、新品では3,4万円、中古だと1,2万円で入手できる。
　STマイクロのキットが出た後に、汎用BLDC基板が出たので、入手しようとした。ソース・リストなどの入手は許可が必要だと書かれていたので、メールした。あなたには許可ができないといわれたので、STマイクロのコントローラはあきらめた。
###利用するコントローラ
　maxonの新しめのEPOS4 Compact 24/1.5（小さいモータ用）を注文した。今の時期、半導体不足で納期が2か月以上と出ていたが、実際は6日後に入荷した。このボードには、CAN用とEtheCATの2種類がある。EtheCATは初めて使うけど、安易な気持ちで使いはじめたので、この記事は長くなってしまうことになる。
　写真で見えているのは、コネクタが載っている基板で、この下の制御ボードがある。
　2020年6月の注文では、税込み68,530円だった。写真はDINレールに取り付けるアダプタ（別途入手）の上に載っている。

<img width="450" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/305f911d-c7a5-4511-e7c0-d3be312b81cc.png">

　純正のケーブルは用意されているが、とても高価で、長い。ハードウェア・マニュアル[EPOS4 Module/Compact 24/1.5 Hardware Reference](https://maxonjapan.com/wp-content/uploads/manual/epos4/EPOS4_24_1_5-Hardware-Reference-Jp.pdf)にしたがい、

- X3b/X4bモータ & ホール・センサのコネクタはRSコンポーネント（7378505　8W CRIMP HOUSING、7378561　CRIMP CONTACT）
- X5エンコーダのコネクタはDigi-key（マルツ【D89110-0101HK-3365/10-S-6】SINGLE ENDED CABLE ASSEMBLY 10 P）

で注文し、組み立てた。

<img width="400" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/a151b2b5-41d8-4416-1ace-ecbeee18e94e.png">



　電源コネクタは、メス側が付属している。イーサネット・ケーブルとUSBケーブルは汎用品が使える。
　ディジタル入出力、アナログ・コネクタは、当初使わない。リミッタ・スイッチなどの配線に使える。
###PCの用意
　EtherCATを運用する方法はいくつかあるようです。Windows10で動くTwinCAT3を導入することにしました。GUIなので、というのが理由ですが、簡単ではありませんでした。無償のライセンスが発行されますが、有効なのは7日です。しかし、すぐに再発行されるので、開発用途では無料ツールだといえます。実際のライセンス代は知らないのですが、CPUコア数で価格が異なり、開発元以外のPCだと最大コア数の金額になるようです。

　TwinCAT3はインテルのNICが必要で、試したところ、マザーボードに搭載されたインテグレード版やデュアル・タイプは全滅しました。

　　ギガビット デスクトップPCI-e 10/100/1000 Mbps自動ネゴシエーションネットワークアダプタ（インテル **82574L** / EXPI9301CT チップセット）NIC、シングル銅RJ45ポート(短縮版)

をアマゾンで入手したのが使えました。

　Buffaloの1Gbpsハブにつないだところ、LOOPランプがついたので、PC本体のLANはこの1Gbpsハブにつなぎ、EtherCATは別の100Mbpsハブにつなぎました。


![etherCAT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/904c02dc-8cab-c2e9-8e59-137c15fb73eb.png)

**PCのおもなスペック**

- CPU　Intel Core i5-9400 2.90GHz
- メモリ　8GB
- Windows 10 21H1
- 内蔵NIC　Intel Ethernet Connection I219-V
売却されていないページに遷移されない‥

こんにちは！

最終課題でメルカリみたいなwebアプリケーションを
実装しています。
エラーが発生したので記事にしました。

# NoMethodError

商品詳細ページにおいて売却済みなら画面に
sold out!!と表示されるように実装していました。

```show.html.erb
<%if @item.id == @item.order.item_id %>
        <div class="sold-out">
          <span>Sold Out!!</span>
        </div>
      <% end %>
```


この記述で売却済みの商品詳細ページに遷移すると、
以下のように表示されホッとしてました。

[![Image from Gyazo](https://i.gyazo.com/0841cd1c32dcda32ee2a0d81f9e50437.jpg)](https://gyazo.com/0841cd1c32dcda32ee2a0d81f9e50437)



しかし、売却されていない商品詳細ページへ
遷移しようとするとエラーが‥

![スクリーンショット 2021-06-28 14.53.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1435543/4299428b-35b3-f2f1-33fa-2e42a00581df.png)

このエラーで３時間泣きました。


# エラーの原因

if文を使っているのになんでfalseの処理をしてくれへんねん！！
と泣きながら叫んでました。

そもそもshow.html.erbで記述した条件式だと、
odersテーブルにitem_idが存在している前提で
話を進めちゃってるのでエラーが出て怒られちゃったみたいです。
エラー文のちっちゃいところに

```
undefined method `item_id' for nil:NilClass
```
ってitem_idがないやんけアホンダラア！！！！って書いてますね。


# エラーの解消

条件式の内容を見直しました。
ordersテーブルのitem_idとitemテーブルのidが等しいか等しくないかとか
ネチネチ細かく記述しないで
もうordersテーブルがあるかないかで条件式を組みました。

```
<% unless @item.order == nil %>
        <div class="sold-out">
          <span>Sold Out!!</span>
        </div>
      <% end %>
```

大胆にいけば売却されてないページもうまくいきました。
[CSS] flex-direction, justify-content, align-items僕はあなたたちを誤解してました。

##はじめに
CSSをいじっていたら、flex-direction, justify-content, align-itemsの落とし穴にハマったので、ここに記したいと思います。
flex-directionを「ふれっくすでぃれくしょん」という名詞としか捉えていなかったというのが問題だったかなと。

よろしくお願いします。

##flex-directionの落とし穴
flex-directionはdisplay:flexをかけた親要素に併用して使います。

落とし穴というのは、「flex-directionをかけたら、直下の子要素の並び順を変えることができる」という認識です。

なので必ず「flex-directionをかけたら、直下の**子要素の主軸方向**を変えることができる」と覚えてください。

##並び順を変えるという勘違いする認識

*※ 注意！　ここからは間違った認識をした説明を書いています*



例えば↓のような構造の親要素と子要素があったとします。display:flex;により三つの子要素が横並びになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1552346/6259f335-b2d0-08b5-9a0a-b292342fed88.png)




この親要素（グレーの範囲)に**flex-direction: row-reverse;**をかけると子要素を右から左並び（逆並び）に変更することができます。↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1552346/79ae59b1-30d1-16cf-d988-4d3f6282d684.png)





また、**flex-direction: column**をかけると上から下に並べます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1552346/c9d84102-848a-ef68-beec-df9a74f54027.png)



*ここまでがちょっとまずい説明です。*

結果的には「◯◯順に並べる」という表現通りの動きを見せているので問題ないのですが、もし上記の例のflex-directon: columnをかけている状態から、さらにこれらを真ん中に移動させたいとします。

↓期待している形
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1552346/8715cb6a-b108-198d-cbc1-120c1be312b3.png)

これを実現させるために**justify-content: center;**を使った大馬鹿ものが私です。はい。
justify-content: centerでは期待通りの動きはしてくれません。
これを改善するためのポイントは**主軸**です。

##主軸を意識する
大事なポイント①
justify-contentプロパティはdisplay: flex;を付与した親要素の直下の子要素を横に移動できるという認識を持っていましたが、厳密にいうと**主軸の上での配置を決める**ということです。

大事なポイント②
そしてflex-directionの真の効果は**主軸の方向（direction)を変える**ということです。


私はflex-directionというプロパティが単に「順番を並び替える」という効果があるものだという認識と、justify-contentは横に位置を移動させられるという間違った認識で、↓のGIFのように変化するものだと誤解していたのです。

![flex-direction.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1552346/8021fe41-4b8e-216e-e40f-b03d39e0fbd2.gif)

つまり私の中の主軸は無意識に常にずっと↓の画像のようでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1552346/719e01fc-1253-526f-b6e3-81623ea85d8e.png)

しかし実はこう↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1552346/65aaf1ac-5aba-d209-8b05-08ee2bd047bc.png)

なので、flex-directon: columnを付与している状態では、justify-contentで配置を縦方向に動かしていたことになります。
さらに子要素が親要素の縦パンパンに入っていたので、縦に動かしていても、全く動いているように見えず、「justify-contentが反映されていない」と勘違いしていたのも気付くのに時間がかかった要因の一つでした。

中心に持っていきたいのであれば、主軸に対して交差軸に配置を調整できる**align-items**プロパティを使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1552346/68296b5d-47d9-c27b-bd23-4ab137c93e74.png)

align-items: center;で期待通りの位置へ変更できました！

##最後に
flex-directionは主軸の方向を変化させるということをしっかり認識していないと、columnを指定したときに、他のプロパティの挙動の変化に困惑する事態になります。



justify-contentは横に動かす！align-itemsは縦に動かす！という感覚を持っていると、まんまとこの落とし穴にハマってしまいます。

反省し主軸を意識して組み立てていきたいと思います！
自作PCにwsl2で開発環境を整える～mongo/node導入編～

# Abstract
いろいろな前提条件は昔の記事を見てください。
今回は、nodenvからnodeを導入したうえで、mongodbの導入をし、mongoを使用するnodeアプリケーションを動かせるような環境を整えます。

WSL2でUbuntu20.04を動かしています。

---

# node導入
## nodenvを入れる
```sh
anyenv install nodenv
```

### シェルの再起動
```sh
exec $SHELL -l
```

### 確認
```sh
nodenv -v
```

## nodeを入れる
```sh
nodenv install <VERSION>
nodenv local <VERSION>
```

### 確認
```sh
node -v
```

# mongo導入
基本的には[公式サイト](https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/)を参考にしましょう。

## gnupg
が入っていないと導入ができない（keyの追加ができない）ので、まだ入れてなければ入れます。

```sh
sudo apt-get install gnupg
```

## keyの追加
以下のコマンドでkeyを追加します。

```sh
wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
```

## listの作成
Ubuntuのバージョンによって変わります。

### Ubuntu20.04（Focal）の場合
```sh
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
```

### Ubuntu18.04（Bionic）の場合
```sh
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
```

### Ubuntu16.04（Xenial）の場合
```sh
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
```

## リロードします
```sh
sudo apt-get update
```

## mongoをインストール
```sh
sudo apt-get install -y mongodb-org
```

## パーミッションの変更
以下2つのファイルのパーミッションを変更しておかないとroot以外のユーザーでMongoDBは起動できません。

```sh
sudo chmod 777 /var/lib/mongodb
sudo chmod 777 /var/log/mongodb
```

## mongodbの起動
```sh
sudo mongod --fork --config /etc/mongod.conf
```

`--fork`オプションは、バックグラウンドでの稼働をする場合には付けます。
ちなみに、Ubuntuの提供しているmongoではなく、mongodb-orgをインストールすると、`service`コマンドで起動できないそうです。

公式ドキュメント通りにやると以下のようになります。

```shell
user@host:~$ sudo service mongod start
mongod: unrecognized service
```

## mongoに接続
```sh
mongo
```

何か出てきたらたぶん成功です。

### 何か実行してみる
```sql
show dbs
```

## 終了
バックグラウンド稼働しているmongoを停止する場合には、プロセス自体を終了する必要があるので、まずpsでPIDを引いてきて、killします。

### PIDを調べる
```sh
ps aux | grep -E '(%MEM|mongod)' | grep -v grep
```

### kill
```sh
sudo kill <PID>
```

# 次回予告とバックナンバー
[初回：WSL導入編](https://qiita.com/SatoshiNonomura/items/1b23107b2ab9c28b5f2a)
[前回：Rails導入編](https://qiita.com/SatoshiNonomura/items/2b0bf78be2df1fe298b3)
[次回：未定]()

# 参考
[Install MongoDB Community Edition on Ubuntu](https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/)
[Windows Subsystem for Linux(Ubuntu)にMongoDBをインストール @akabei ](https://qiita.com/akabei/items/765c02e8f7754b5b569a)
[WSL (Ubuntu 16.04 TLS) に MongoDB をインストールする](https://laboradian.com/install-mongodb-in-wsl-ubuntu/)
[serviceコマンドにてサービスを起動しようとすると「unrecognized service」(認識されていないサービスです)というエラーが出る](https://l-w-i.net/t/fedora/service_100.txt)
dragEventのfilesの扱い：openFrameworks

ハマったのでメモ
dragInfo.filesは配列として書く

```c++:ofApp.cpp
void ofApp::dragEvent(ofDragInfo dragInfo){ 
	for (int i = 0; i < dragInfo.files.size(); i++) {
		img.load(dragInfo.files[i]);//配列として書く
	}
}
```

filesの定義を確認したらvectorだった↓

```c++:ofEvents.h
class ofDragInfo{
	public:
		std::vector <std::string> files;//ここ
		glm::vec2 position;
};
```
#### 参考にさせていただいた記事

[[OF] dragEvent ファイルのパスを取得](https://qiita.com/iwax10/items/26dc55b69f472e111778)
Azure Synapse Analytics Spark Poolにて他のノートブックを参照させたい場合には%runで可能

## 概要
Azure Synapase Analytics Spark Poolにて、他のノートブックを参照する%runが利用可能であることを共有します。

2021年6月28日時点、日本語版ドキュメントでは%RUNをSynapseパイプラインから実行できないとの旨の記載があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/7f2bfe3d-4863-dde9-bc40-652adb7be021.png)
引用元：[Synapse ノートブックの使用方法 - Azure Synapse Analytics | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/synapse-analytics/spark/apache-spark-development-using-notebooks?tabs=preview#run-notebooks)


ただし、英語版のドキュメントにはSynapseパイプラインからの実行も可能であるとの記載がありました。

> Notebook reference works in both interactive mode and Synapse pipeline.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/2281f8de-28f3-19b7-c793-67277ec6ed52.png)
引用元：[How to use Synapse notebooks - Azure Synapse Analytics | Microsoft Docs](https://docs.microsoft.com/en-us/azure/synapse-analytics/spark/apache-spark-development-using-notebooks?tabs=preview#run-notebooks)

どちらかが正しいかを確認するために、ちょっとした検証したところ、%runをSynapseパイプラインから利用できました。
この記事では、検証手順を紹介します。

## 検証
### 1. sqlというフォルダというフォルダ配下に、%runにより実行されるノートブックを作成

```python
%%sql
select 1
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/cb1a4e8c-a7fd-197e-c683-5f5a8b2e6a0f.png)


### 2. %runを実行するノートブックを作成

```python
%run /sql/select
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/66caf150-d034-7c93-167b-e49b5606d4e0.png)

### 3. 2で作成したノートブックを実行するパイプラインを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/42e236bd-87e1-0d8f-3814-a661b976ebce.png)

### 4. "すべて発行"を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/728cb4a1-fe46-ab7b-ba83-946f590a2402.png)

### 5. 3で作成したパイプラインにて、"今すぐトリガー"によりパイプラインを実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/78e626c7-bda4-7972-f4e8-8e023ab30b2f.png)

### 6. %runが適切に動作していることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d1ac7e41-33a1-95bf-c510-7e93a9386055.png)
AWSの勉強してるときよく見る単語集その③

##　はじめに
　[その②](https://qiita.com/pankata79/items/35eb4bdf552e69718263)の続きになります。
　今回もざっくりとした説明です。

よろしくお願いします(｡･ω･)ﾉﾞ
##　スロットリング
　一定時間内に受信可能なリクエスト数を制限し、制限を上回るリクエストがなされた際には受信を拒否しエラーコードを返却すること。
　時間経過により再び受信可能となる仕組み。リクエスト数を制限することでシステムにかかる負担を抑えたり、スパムメールの送信を防止するのに利用される。
　**リクエストを送信できる頻度を制限する**

##　エクスポネンシャルバックオフ
　リクエスト処理が失敗した後のリトライの際、現実的に成功しそうな程度のリトライを許容可能な範囲で徐々に減らしつつ継続するアルゴリズム。
　具体的には、再試行するたびに、1秒後・2秒後・4秒後と指数関数的に待ち時間を加えていきます。

　[こちら](https://yoshidashingo.hatenablog.com/entry/2014/08/17/135017)のサイトが分かりやすく説明してるのでオススメ！

##　ハンドラ
　コンピュータープログラムやその一部分で、何らかの処理欲求が発生した時に起動されるものを指すことが多い。対応付けられた事象の種類により「例外ハンドラ」「イベントハンドラ」「割り込みハンドラ」のように呼ばれる。
　ハンドラは特定の事象の発生や外部からの処理依頼などを受けて受動的に実行され、プログラム中では関数やサブルーチン、メソッドなどの形で実装される。そのハンドラが対応すべき処理要求が発生するとプログラムの流れを中断してハンドラが呼び出され、要求された処理を実行する。
　
##　コンテキスト
　**プログラムの実行に必要な各種情報のこと。**
　コンテキストは、コンテキストメニューやコンテキストスイッチなど、複合語として使用されることが多い。コンテキストメニューとは、操作の場面に応じてメニューを表示することである。また、コンテキストスイッチとは、CPUのレジスタの情報をコンテキストとして保持して、プログラムの実行に応じてコンテキストを切り替えることである。

##　ロギング
　**何らかの履歴（ログ）をどこかに記録すること**
　コンピュータシステムの場合には、利用者による操作や、機器や装置、ソフトウェアなどの稼働状況、通信機能による外部との通信などの記録を残すことをロギングということが多い。いつ、誰が（何が）、何を試み、結果がどうであったかをファイルやデータベースに時系列に記録する。装置やプログラムが発したメッセージや応答コードなどがある場合はこれらを併記することもある。

##　プレフィックスとサフィックス
　◆プレフィックスとは
　**その単語なり何なりの前にくっつく文字のこと。接頭辞**
　例えば変数名のプレフィックスは「hoge」にしたとします。その場合変数の名前に「hoge_a」「hoge_b」とつけることになります。こんな感じにその単語なりの目にくっつける文字のことをプレフィックスと呼びます。

　◆サフィックスとは
　**その単語なり何なりの後ろにくっつく文字のこと**。プレフィックスの逆ですね。

##　バージョニング
　**データを作成・更新などする際に変更履歴を保存し、後からそのデータの任意の時点のデータを参照できるよにする仕組み。**コンピュータプログラムの開発・修正を円滑に進めるためによく利用される手法で、文書管理など他の分野でも利用されている。

　既存のデータを修正・更新する際に元のデータを直接上書きしてしまうと、後で誤りに気づいても以前の状態に戻すことができない。データ更新に際してバージョン管理を行なっていれば、このような場合でも過去の任意の時点の状態に戻して修正し直すことができる。また、ある版と別の時点の版を比較してどこが修正されたか調べたり、複数人で共同作業する際に他の人の更新内容を上書きして消してしまうのを防いだりすることもできる。

##　エイリアス
　**ある対象や実体を複数の異なるシンボルや識別子で同じように参照できる仕組みを指す。別名**

##　プロビジョニング
　**必要に応じてネットワークやコンピューターの設備などのリソースを提供できるように予測し、準備しておくこと**
　供給や設備等の意味を持つプロビジョンという単語が元となって派生した単語。

　分散システムや記憶装置等のリソースを仮想化技術によって一つのリソースとみなし、必要な時に必要な分だけオンデマンドでリソースを割り当てます。

プロビジョニングの種類としては、サーバープロビジョニング、サービスプロビジョニング、ユーザープロビジョニングがあります。

従来、プロビジョニングという言葉は通信の分野で用いられており、ネットワークを迅速に提供するため、顧客の需要を予測して設備を事前に準備することを意味していましたが、最近ではネットワークの分野だけでなく、様々なIT分野でも使われるようになりました。
例えば、プロビジョングプロファイル、プロビジョニングファイル、プロビジョニングシステム等があります。

##　おわり
　最近はアウトプットというより自分用のメモになってきましたね笑
明日からもお仕事頑張っていきましょう！！！！！！！！！

(｡･ω･)ﾉﾞバイバイ
Swift SDKを使ってNCMBのデータストアにある値を取得する方法

ニフクラ mobile backendでは各種言語向けにSDKを提供しています。その中で最も新しいSwift SDKについて、その使い方を紹介します。

mBaaSで提供しているデータストアは柔軟に型定義してデータを入れられます。利用できる型は次の通りです。

- 文字列
- 数字
- 真偽値
- 日付
- 位置情報（NCMBGeoPointという専用のオブジェクト）
- Dictionary/配列

Swiftではきちんと型を定義しないといけないので、キャストをうまく使う必要があります。ここではその使い方を紹介します。

## 元データについて

今回は次のようなデータが入っていることとします。

| フィールド名 | 型 | 値 |
|-------------|-------------|-------------|
| numbers |数字の配列 | [1, 2, 3] |
| object | JSON | [1, "string", [1, 2, 3], {"a": "b"} |
| string | 文字列 | 文字列です  |
| number | 数字 | 100 |
| bool   | 真偽値 | true |
| date    | 日付 | 2021-06-06T01:51:03.606Z |
| geo | 位置情報 | 緯度: 33.857619, 経度: 122.378986 |

## データの取得

データの取得は次のようなコードになります。

```swift
let obj = NCMBObject(className: "TestClass")
obj.objectId = "0UjRUrPe3SPM0Mfh" // データのユニークID
obj.fetchInBackground(callback: { result in
    switch result {
    case .success(_):
      // この中で処理を書く
    case .failure(_):
        print("Error")
    }
})    
```

## 文字列の場合

文字列や数字、真偽値、日付の場合、基本的にOptionalとして取得します。

```swift
// 文字列の場合
let str: String? = obj["string"]
print(str!) // 文字列です
```

## 数字の場合

```swift
// 数字の場合
let number: Int? = obj["number"]
print(number!) // 100
```

## 真偽値の場合

```swift
// 真偽値の場合
let bool: Bool? = obj["bool"]
print(bool!) // true
```

## 日付の場合

日付の場合、GMTで取得されるようです。

```swift
// 日付の場合
let date: Date? = obj["date"]
print(date!) // 2021-06-06 01:51:03 +0000
```

## 配列の場合

配列の場合は配列内のデータ型を定義してください。

```swift
// 数字の配列の場合
let numbers: [Int]? = obj["numbers"]
print(numbers![1]) // 2
```
## JSONの場合

JSONのような形の場合、まずAnyでデータを取り出した上で、さらに型変換を行ってください。

```swift
// オブジェクトの場合
let object: [Any]? = obj["object"]
// オブジェクトから数字取り出し
let num2: Int? = object![0] as? Int
print(num2!) // 1
```

文字列を取り出す場合も同様です。

```swift
// オブジェクトから文字列取り出し
let str2: String? = object![1] as? String
print(str2!) // string
```

さらに配列を取得する場合は次のようになるでしょう。

```swift
// オブジェクトから数字の配列取り出し
let numbers2: [Int]? = object![2] as? [Int]
print(numbers2!) // [1, 2, 3]
```

Dictionaryを定義して取得もできます。この場合、デフォルト値の指定が必要になります。

```swift
// 配列からDictionary取り出し
let obj2: [String: String] = object![3] as? [String: String] ?? ["":""]
print(obj2["a"]!) // b
```

## 位置情報

最後に位置情報です。これはSwiftデフォルトの型ではなく、NCMBGeoPointというクラスになります。

```swift
// 位置情報
let geo: NCMBGeoPoint? = obj["geo"]
print(geo!) // NCMBGeoPoint(latitude: 33.857619, longitude: 122.378986)
```

## まとめ

データストアはデータを柔軟に入れられる一方、その取得は工夫が必要です。Dictionaryで複雑なデータも入れられますが、取得が複雑になるのでお勧めしません。ぜひこの使い方で、データストアを使いこなしてください。

[ドキュメント : 開発者向けドキュメント | ニフクラ mobile backend](https://mbaas.nifcloud.com/doc/current/#/Swift)
【BINLOG】クエリログ出力

###### ★binログ出力先を確認

```
# less /etc/my.cnf

[mysqld]
port = 3306
socket=/var/lib/mysql/mysql.sock
datadir=/var/lib/mysql
...
```

###### ★binログ出力ファイルを確認
```
# cd /var/lib/mysql
# ll
-rw-rw---- 1 mysql mysql      67307  9月 21 21:01 2016 mysql-bin.000168
...
```

###### ★日付抽出でのファイル出力方法
```
mysqlbinlog mysql-bin.000168
 --start-datetime="2020-10-16 10:10:00"
 --stop-datetime="2020-10-16 10:20:00"
 > /tmp/mysql-bin.000168.txt
```

###### ★TBL名【hogehoge】を含んだ文の前３行、後ろ３行を抽出してファイルにはく方法
```
mysqlbinlog mysql-bin.000168| grep -i -B3 -A3 'hogehoge' >> ./sample.txt
```
遠隔でJetsonの管理を実現する方法－コマンドの送信

#はじめに
[前回の記事](https://qiita.com/Koharu1993/items/f1186fec96730bc82b2c)ではデバイスログ収集機能をご紹介しましたが、
今回はコマンド送信機能を皆様にご紹介していきたいと思います！
ぜひ最後まで見て頂けたら嬉しいです！


#Allxon DMSについて
Allxon Device Management Solutions (Allxon DMS) は、
多数のデバイスを容易に一元管理できるサービスです。
SIer企業及びサービスプロバイダ企業に対して、
シンプルにナビゲートしやすいデバイス管理サービスを提供します。
事業部をまたぐ多用なデバイス管理すらもひとつのAllxonアカウントから実行できるため、
デバイス上の問題解決のみならず、人件費と運用コストの大幅削減にも実現可能です。

#コマンド送信機能について
デバイスログ機能と同じく、現場にあるデバイスの状態を知りたいだけで、
すぐに人員をオンサイトするには少しコストがかかりませんか？
こういう時に遠隔で簡単にデバイスへコマンド送信の機能があれば、
とても便利ではないでしょうか！


#コマンド送信の設定手順
①Allxonのポータルにある左タブのデバイスを選んで頂き、
右上のコマンド送信をクリックしてください。
![未命名.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1509678/624fe668-e444-84c9-e298-ff85b964ef46.png)

②そうしますと、コマンド入力画面が出てきます。
この時に入力したいコマンドを書いて頂き、送信ボタンをクリックしてください。
試しにコマンド”ifconfig”を入力します。
![擷取.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1509678/7299c6df-1203-b878-ece8-8dfd0dc3b0f8.png)


③コマンド送信しましたら、コマンドの有効可否や実行結果がわかるようになります。
更に詳細確認ボタンをクリックすると、実行の詳細結果が見れるようになります。
![擷取05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1509678/52cdc2dd-be00-10b2-5631-d732b71a0aa4.png)

④実行の詳細結果
![擷取03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1509678/0dd1ddb6-4d69-1102-8dbe-f3beb1fdeb0a.png)


#終わりに
いかがでしょうか！とても簡単で便利ですよね！
また、すでにAllxon DMSをダウンロードした方に是非こちらの”[マニュアル](https://app.hubspot.com/documents/7375543/summary/3800002)”をご覧になって、
操作してみて頂ければと思います。
さて、次回はアラート通知の詳細設定をご紹介します。お楽しみにしてください。
毎週火曜日に記事を更新致しますので、
ご意見または感想がございましたら、ぜひコメント欄に書いて頂けると嬉しいです！
セキュリティー用語、最初から分かる人0人説


まじで分からん。
ということで聞いたり調べたりしたことの忘備録。
間違っていたらご指摘ください。

あと、他にもよく使うけど最初は？？？ってなる用語がありましたら、教えて頂きたいです。喜びながら追記します。

# 脆弱性

脆弱性はシステムの不具合、設計上のミス、バグなどの中で、セキュリティ上危ないんじゃないか？とされるもの

参考

https://www.soumu.go.jp/main_sosiki/joho_tsusin/security/basic/risk/11.html

# 脆弱性診断とペネトレーションテスト

脆弱性診断は問題点を発見するもの。
「'と入力したらSQLのエラーが出た為、SQLインジェクションで攻撃される恐れのある問題点があります！」
みたいな？

ペネトレーションテストは攻撃者のつもりで攻撃してどこまで被害が出るか確認するもの。
「SQLインジェクションの問題点があって、○○と○○のデータが取得でき、そこから○○という攻撃が可能で･･･」みたいな？

参考（図が分かりやすい）

https://www.lac.co.jp/lacwatch/service/20201112_002314.html

# フォレンジック

法的な証拠を復元したりするための調査。

参考

https://www.fss.jp/about-digital/

# RCE

攻撃者が起こしたプログラムを被害者が実行してしまうようなもの。リモートコード実行。

参考

https://xtech.nikkei.com/it/atcl/column/17/090100359/090100001/

# LPE

ローカル権限昇格のこと(?)rootユーザとかadminユーザの権限を不正に持ち、悪用する。

参考

https://japan.zdnet.com/article/35083589/

https://blogs.mcafee.jp/43-cc7b

# PoC

外部からの攻撃に脆弱性が無いか見るときに使うコード。
(外部サイトを模したものを作って攻撃サイトのように使い脆弱性が無いか検証するというイメージが近いかなあ？)

https://yamory.io/blog/about-proof-of-concept-code/

# ルートキット

攻撃者が攻撃しやすくするための支援ツールのパッケージ。

>OSの奥深くに入り込み、自らを発見出来ないように巧妙に隠蔽･･･

1匹いれば100匹いるぜ！みたいな恐ろしさを感じます(´・ω・｀)

参考

https://japan.norton.com/rootkit-7863
日本語原稿の git コミット間の編集距離を調べる

#本記事の対象
日本語原稿を git で管理し、各コミットの文字数で進捗を評価しているが、推敲した回は字数が増えないので、サボったみたいで気に入らない人。

#やること

git のコミット間の編集距離（レーベンシュタイン距離）を比較する Python3 スクリプトを書く。

#git コマンドでの比較
まず以下のような原稿がある。

```plaintext:HEAD^
　むかしむかし、あるところにおじいさんとおばあさんが住んでいました。
　おじいさんは山へ芝刈りに、おばあさんは川へ選択に行きました。
```

2行目に誤字があるのでこれを修正（芝→柴、選択→洗濯）し、再度コミットする。

```plaintext:HEAD
　むかしむかし、あるところにおじいさんとおばあさんが住んでいました。
　おじいさんは山へ柴刈りに、おばあさんは川へ洗濯に行きました。
```

変更箇所を知りたい場合は `git diff` を使う。

```
$ git diff HEAD^ HEAD momotaro.txt
...
 　むかしむかし、あるところにおじいさんとおばあさんが住んでいました。
-　おじいさんは山へ芝刈りに、おばあさんは川へ選択に行きました。
+　おじいさんは山へ柴刈りに、おばあさんは川へ洗濯に行きました。
```

編集した行数を知りたいときは `git diff` に `--numstat` オプションをつければわかる。1行追加し1行削減している。

```
$ git diff --numstat HEAD^ HEAD
1       1       momotaro.txt
```

だが現実的に言って、日本語原稿で1行単位は大雑把すぎる。文字単位での diff をとりたい場合は `--word-diff-regex` オプションをつける。

```
$ git diff --word-diff-regex='.' HEAD^ HEAD momotaro.txt
...
　むかしむかし、あるところにおじいさんとおばあさんが住んでいました。
　おじいさんは山へ[-芝-]{+柴+}刈りに、おばあさんは川へ[-選択-]{+洗濯+}に行きました。
```

なお一部環境ではこの結果が文字化けするので、その場合はオプションを以下のように修正する。（手元の Debian 環境ではうまくいくが macOS では修正が必要）

```
$ git diff --word-diff-regex=$'[^\x80-\xbf][\x80-\xbf]*' HEAD^ HEAD momotaro.txt
```

ただこの `--word-diff-regex` と `--numstat` を併用する方法が見当たらなかった（行単位の変化が出てしまう）ので、仕方なく Python で編集距離を測るスクリプトを作ることにした。

# Python で編集距離を比較する

使うのは Levenshtein というモジュール。まずこれを入れる。

```
$ pip install python-Levenshtein
```

これ自体の使用方法はきわめて簡単。

```python3:levenshtein.py
#!/usr/bin/env python3

import sys
import Levenshtein

print(Levenshtein.distance(sys.argv[1], sys.argv[2]))
```

```
$ ./levenshtein.py 三島由紀夫 三波春夫
3
```

次に Python スクリプト内で git コマンドを実行する。GitPython というライブラリがあるらしいけど、内部で subprocess を走らせてるだけらしいので、直接 subprocess でいいや。

```python3:gitleven.py
#!/usr/bin/env python3

import sys
import subprocess
from subprocess import PIPE
import Levenshtein

commit1 = sys.argv[1]
commit2 = sys.argv[2]

# 3個目の引数があればそのファイルを、なければ編集した全ファイルを比較
try:
	filenames = [ sys.argv[3] ]
except IndexError:
	proc0 = subprocess.run(["git", "diff", "--name-only", commit1, commit2], stdout=PIPE, stderr=PIPE, text=True)
	filenames = proc0.stdout.split()

print("{}\t{}\tdiff\tLeven".format(commit1, commit2))

total1 = 0
total2 = 0
total_leven = 0

for filename in filenames:
	proc1 = subprocess.run(["git", "show", "{}:{}".format(commit1, filename)], stdout=PIPE, stderr=PIPE, text=True)
	text1 = proc1.stdout
	proc2 = subprocess.run(["git", "show", "{}:{}".format(commit2, filename)], stdout=PIPE, stderr=PIPE, text=True)
	text2 = proc2.stdout

	leven = Levenshtein.distance(text1, text2)
	l_text1 = len(text1)
	l_text2 = len(text2)

	total1 += l_text1
	total2 += l_text2
	total_leven += leven

	print("{}\t{}\t{}\t{}\t{}".format(l_text1, l_text2, l_text2-l_text1, leven, filename))

print("{}\t{}\t{}\t{}\t{}".format(total1, total2, total2-total1, total_leven, "TOTAL"))
```

```
$ ./gitleven.py HEAD^ HEAD
HEAD^   HEAD    diff    Leven
66      66      0       3       momotaro.txt
66      66      0       3       TOTAL
```

これで総字数の変化がなくても3文字の進捗があったことがわかり、桃太郎も後顧の憂いなく鬼退治に集中できる。

# 参考資料

こちらの記事を参考に、Perl がわからんので Python で書いた。
https://stackoverflow.com/questions/23974443/how-to-get-an-edit-distance-between-two-commits
ECS deploy通知

# 概要
ECSのdeployの開始と終了を通知する仕組み。
Amazon ECS のイベント内にデプロイ完了通知があるのでこちらを拾って通知する。
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs_cwe_events.html
通知の流れ
EventBridge→Lambda→slack（webhook）の流れ。
# 前提
予め通知したいslackのwenhookURLの取得をしておく。
# Lambda
まず、Lambda関数の作成。以下で作成する。
ラインタイム：Python3.8
タイムアウト値：1分
メモリ128M
以下code

```python
#!/usr/bin/python
# -*- coding: utf-8 -*-
import boto3
import urllib.request,urllib.parse
import json
def lambda_handler(event, context):
    msgdata = event['detail']['eventName']
    resources = event['resources'][0]
    reason = event['detail']['reason']
    client = boto3.client('ecs')
    fields = []

    fields.append({
        'title': resources,
        'value': msgdata,
        'short': True,
    })
    data = {
        'attachments': [{
            'pretext': reason,
            'color': 'good',
            'fields': fields,
        }]
    }
    # Slack通知
    url = 'https://hooks.slack.com/xxxxxxx'
    req = urllib.request.Request(url, json.dumps(data).encode(), {'Content-Type': 'application/json'})
    res = urllib.request.urlopen(req)
    res.read()
    res.close
```

urlにはslackのwebhookを指定。
続いてEventBridgeを作成する。
# EventBridge

全ての通知から、 ECS 関連の JSON のみをフィルターして抜き出す。
eventNameにデプロイステータスが入ってくる
ステータスは以下2つ

開始
SERVICE_DEPLOYMENT_IN_PROGRESS
完了
SERVICE_DEPLOYMENT_COMPLETED

パターンの定義で以下のルールを作成
カスタムパターンを選ぶ。
以下の例はdeploy完了のステータスを定義。ステータスごとにルールを作成する。

```json
{
 "source": [
 "aws.ecs"
 ],
 "detail-type": [
 "ECS Deployment State Change"
 ],
 "resources": [
 "arn:aws:ecs:ap-northeast-1:xxxxxxxxxxxxxx:service/clustername/hoge-service",
 "arn:aws:ecs:ap-northeast-1:xxxxxxxxxxxxxx:service/clustername/hoge01-service",
 "arn:aws:ecs:ap-northeast-1:xxxxxxxxxxxxxx:service/clustername/hgoe02-service",
 "arn:aws:ecs:ap-northeast-1:xxxxxxxxxxxxxx:service/clustername/hoge03-service"
 ],
 "detail": {
 "eventName": ["SERVICE_DEPLOYMENT_COMPLETED"]
 }
}
```
ターゲットを選択で上記で作成したLambda関数を選択する。
slackに通知するlambdaを指定する。
以下のように通知される。
![スクリーンショット 2021-06-21 11.11.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1545164/204bed05-545f-aa15-aeb5-1de7880ed78a.png)
マイグレーションファイルの内容を間違えて作って、rails db:migrateもしてしまったがどうしたらよいか

## 方法１

下記のコマンドでマイグレーションファイルの状態を確認します。

```rb
$ rails db:migrate:status
````

upの状態はDBに反映されている状態→修正不可
downの状態はDBに反映されていない状態→修正可能

downの状態にするとマイグレーションファイルを修正することができます。
下記のコマンドでdownにします。

```rb
$ rails db:rollback
```

もう一度

```rb
$ rails db:migrate:status
```

を行い、状態を確認次第マイグレーションファイルを修正しましょう。

修正が終了したらいつもどおり、

```rb
$ rails db:migarte
```

をしてあげましょう。

## 方法２

下記のコマンドを実行すると、全てのマイグレーションファイルをリセットして、一から全てマイグレーションします。
＊DBのデータが全てリセットされることをご注意ください。

```rb
$ rails db:migrate:reset
```

`rails db:migrate:reset`を実行しましょう。以上です。
非常に簡単ですので、**開発中でDBに特に重要なデータがない場合**は、こちらがおすすめです。


## 方法3

マイグレーションファイルを削除して、新しくマイグレーションファイルを作成する。
削除する場合方法1のように状態をdownにする必要があります。
downするので方法1のやり方がいいかと思われます。
Scala:Diff(java-diff-utils )

# 概要

scala でdiffりたい。変更分（更新、削除、新規）のデータだけを処理したい。

- 例：dynamoDBに反映させるためのデータセットを取得したい。

# ツール
- Googleのjava-diff-utils を使用する。

```build.sbt
  "com.googlecode.java-diff-utils" % "diffutils" % "1.3.0"
```

```scala
import difflib._
import scala.collection.JavaConverters._
```

# 例

- 今回の例では、Listの1番目の値がDB上の主キーであるため、処理したい主キーの集合（Set）を取得することが目的です。
    - List("a","1")　の場合、"a"がDB上の主キーです。
- difflibのメソッドで①削除/更新箇所、②追加/更新箇所の２つの集合を取得し、①と②を使用し、③削除箇所のみを取得します。

### オジリナルデータ

- 以下を変更前のオリジナルデータとする。

```scala
val original:List[List[String]]=List(
List("a","1"),
List("b","1"),  
List("c","1"),
List("d","1")
)
```
### 最新データ

- 以下を変更後の最新データとする。

```scala
val revised:List[List[String]]=List(
List("a","1"), 
List("c","2"),
List("e","1"),  
List("f","1")  
)

/*変更点*/
# List("b","1"),  を削除
# c の値を2に変更
# List("d","1")  を削除
# eを追加
# fを追加
```

### ①削除/更新箇所を抽出

getOriginalメソッド を使用し、削除/更新箇所

```scala
val deleteOrUpdate:Set[String]=DiffUtils
.diff(original.asJava,revised.asJava)
.getDeltas
.asScala
.toList
.map(_.getOriginal().getLines().asScala.toList)
.flatten
.map(n=>(n(0)))
.toSet

scala> println(deleteOrUpdate)
Set(b, c, d)

```


### ②追加/更新箇所を抽出

getRevisedメソッドを使用し、追加/更新箇所

```scala
val updateOrCreate:Set[String]=DiffUtils
.diff(original.asJava,revised.asJava)
.getDeltas
.asScala
.toList
.map(_.getRevised().getLines().asScala.toList)
.flatten
.map(n=>(n(0)))
.toSet

scala> println(updateOrCreate)
Set(c, e, f)
```

### ③ 削除箇所のみ

```scala
val deleted:Set[String]=deleteOrUpdate &~ updateOrCreate

scala> println(deleted)
Set(b,d)
```


# 参考

https://www.ne.jp/asahi/hishidama/home/tech/java/google/java-diff-utils.html
LPICレベル1を勉強しているあなたへ - systemdの動作するシステムにおいて、サーバとして動作させるのに適切な起動時のターゲット -

runlevel3.target
もしくは
multi-user.target

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1600293/19690cd0-b6ff-7e40-3ca3-88885126136b.png)

※ランレベル5でも必要なサービスを起動させることは可能ですが、
グラフィカルログインやデスクトップを
制御するプロセスも起動させるため、
サーバとして稼働するには無駄なリソースを使用してしまいます。

引用元
https://mondai.ping-t.com/question_subjects/31/question_sessions/4065605/progressing_questions/62440871?result=true
【IQ Bot】カスタムロジック：Splitの根拠になる項目が変動する場合（備忘メモ）

解説なしで、本当に備忘メモだけのページです。

#Splitの根拠になる項目が変動する場合のカスタムロジック（フィールド項目）

```python:Splitの根拠になる項目が変動する場合

def func_split(value, splitter, index):

    x = value

    if splitter in value:
        y = x.split(splitter)

        if (len(x) + 1) >= index:
            x = y[index]

    return x

### このspListの内容を、splitの根拠になる文字に変える ############
spList = ("splitの根拠になる文字1","splitの根拠になる文字2",...) 
##############################################################

for i in spList:
  x = func_split(field_value,i,1)
  if x != field_value:
    field_value = x
    break

```

テーブルにする場合は…… spListを回すループのところをさらに関数にして返してあげるイメージになると思います。（必要なタイミングが来たらロジック書きます）
Premium Genesis Gloc Pads

Find the premium Hyundai Genesis Gloc Pads only at Race Brake Shop. We offer superior quality gloc pads which are specifically designed for your Hyundai Genesis. The GS-1 compound in our brake pads has been unmatched in the industry for its rotor friendliness as well as its longevity. To know more, visit us at  https://racebrakeshop.com/hyundai


![race brake mustang gloc pads.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489447/45a5cc15-159a-ad87-93c9-bce8b33db166.jpeg)
さくらセキュアモバイルコネクトにおけるIoT装置のデータ転送量

IoT機器からのデータアップロードは単純にデータ量だけでなく、ヘッダー部分の転送量も含まれるために、実際はどれくらいの転送量になっているか調べてみました。

計測期間 : 21日　11時 ～ 28日　11時
転送方式 : http GET によるデータポスト
ディバイスID、温度、湿度、CO2の4つのデータを次の形式で転送
id=xxxxxxxxxxxxxxx&co2=xxx.xx&temp=xx.xx&hum=xx.xx
(データ分部　40バイト)

転送間隔 : 5分(1日288回)

期間中(7日間)のデータ転送量
up   1.325MB
down 0.854MB

1日あたりのデータ転送量
up   0.189MB
down 0.122MB

30日間のデータ転送量(計算値)
5.67MB
3.66MB

データ分部だけの転送だと1日のUPデータは 11.52kB ですが
実際の通信ではヘッダー部分のデータも含まれるので、このような結果になりました。

IoT用のSIMの選択の参考にしてください。
例えばこの頻度とデータ量であれば
MEEQの 定額10MBプラン 月額130円 でもギリギリ容量オーバーしないことになります。

次回は MQTT通信での転送量を測定してみます。
ネスト外のresources



![スクリーンショット 2021-06-28 13.17.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1286751/a1604f22-4169-12f1-ebe1-3c265017a038.png)

＜修正前＞

```routes.rb
constraints host: config[:admin][:host] do
    namespace :admin, path: config[:admin][:path] do
      root "top#index"
      get "login" => "sessions#new", as: :login
      resource :session,only:[:create,:destroy]
      resources :staff_members do
        resources :staff_events, only: [ :index ]
      end
      
    end
  end
```

:admin_staff_eventsのprefixが生成されていないことを疑いました。モデル等を調べても問題なさそう。
ルーティングにおいてネストされたresources以外にも:staff_eventsが必要だと判明。


＜修正後＞


```routes.rb
 constraints host: config[:admin][:host] do
    namespace :admin, path: config[:admin][:path] do
      root "top#index"
      get "login" => "sessions#new", as: :login
      resource :session,only:[:create,:destroy]
      resources :staff_members do
        resources :staff_events, only: [ :index ]
      end
      resources :staff_events, only: [ :index]    #<=ここを追記
    end
  end
```


無事に表示されました。

![スクリーンショット 2021-06-28 13.29.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1286751/51407302-f9c4-f6cb-2d3d-75d0cc1afa4f.png)
GCP で環境構築するときにやること【初心者向け】

アカウント先作成
プロジェクト作成
Cloud Shell開く(shell script、右上あたりのボタン)
VMインスタンスを開く
リージョンの設定(リージョンは地域のこと,region)

# コマンド

gcloud compute ssh インスタンス名
SSH 認証鍵の設定
ssh-keygen -t rsa -f ~/.ssh/my-ssh-key -C ユーザー名
 chmod 400 ~/.ssh/my-ssh-key

cat ~/.ssh/my-ssh-key.pub
結果をコピー
cat /var/log/auth.log | grep sshd
ポート番号変更
sudo cp -p /etc/ssh/sshd_config /etc/ssh/sshd_config.org
sudo sed -i -e "s/#Port 22/Port 24/g" /etc/ssh/sshd_config[B
sudo timedatectl set-timezone Asia/Tokyo
cat ~/.ssh/my-ssh-key.pub
CentOS7で静的ルーティング設定を入れる

# はじめに
静的ルーティング設定をいれるにあたって
ドハマリしたのでいろいろと調べた結果を整理する

# やったこと
・ルーティング追加/削除（ip route add/del）
・ルーティング追加/削除（route-enp0s8）

# ルーティング追加/削除（ip route add/del）
一時的なルーティング追加であればこのやりかたが一番簡単
https://www.steponboard.net/centos-7/1098/
より

```bash:お手本
# 追加するとき
ip route add 192.168.1.0/24 via 172.16.1.254 dev eth1
# 削除するとき
ip route del 192.168.1.0/24
```

```bash:実際のコマンド
# 追加するとき
ip route add 192.168.33.10/32 via 192.168.33.11 dev enp0s8
# 削除するとき
ip route del 192.168.33.10/32
```

ルーティングの結果の確認は

```bash
ip route show
```

結果がこちら。
192.168.33.10 via 192.168.33.11 dev enp0s8　が追加されていることがわかる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/11a349d9-630d-c8a3-cf85-2552fa93f5f4.png)

では、ルーティング削除する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/c8849643-d66d-f0c4-7c95-0f56667b3b38.png)

## ルーティング追加/削除（route-enp0s8）
恒久的に追加する方法がコチラ。

1. インターフェース毎ルーティング設定ファイルを作成して、ルーティング設定を追加する
1. ネットワークを再起動する

インターフェース毎の設定ファイル置き場は
/etc/sysconfig/network-scripts
のroute-[インタフェース名]になる。
↓↓の例の場合だと、enp0s8なので、、、route-enp0s8になる
初期状態だと、route-…はないので新規で作ってやる必要がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/a238632a-c2bc-d5f9-d342-4e20acd31fd9.png)

で、以下の要領で設定する

```:route-enp0s8
192.168.33.10 via 192.168.33.11 dev enp0s8
```

作った後のファイルの様子はこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/c0c12202-5ee7-4ebb-4e7a-d244d81f7cdf.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/8e4611a7-170c-0a93-1ea6-395b56b16ec7.png)


仕上げにネットワークの再起動。

```bash
systemctl restart network
```

でOK。ただし、、、ここでroute-enp0s8の内容が文法エラーもしくはルーティング設定エラーがおきてる場合、
network.serviceの起動に失敗するので気を付けて！！

ちなみに、↑↑の設定で失敗した場合、enp0s3は↑↑の設定と関係なかったので無事だったけど
enp0s8は設定にかかわっていたので接続が切れてしまった。。。

設定が成功するとこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/6592b638-b02f-92ee-717b-1c34239099cf.png)

ルーティングの削除方法はもっと簡単。
route-enp0s8のルーティング設定を#でコメントアウトすればOK。
結果がコチラ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/34ce0ea5-27f4-b437-f635-ef9885d8f267.png)

## おわりに
インタフェースに対してのIP追加であれば
nmcli down enp0s8;nmcli up enp0s8
でいいけど、ルーティングの場合はネットワーク設定全体に影響するので
ネットワークサービス自体は再起動してやるのでちょっとやり方が変わってくることがよくわかりました。

～おしまい～