OmniAICreator/Qiita-1.07M huggingface dataset:
旧バージョンのVirtualBoxをMacにインストールする方法

# 概要

- 最新のVirtualBoxは7.0.2であるが、旧バージョン（6.0.8）をインストールする方法をまとめる。

# ご注意

- MacのOSによっては本説明で記載している6.0.8はインストーラーがクラッシュしてインストールできない事がある。
- MacOS 12.6（Montrey）だとVirtualBox6.1.30からインストーラークラッシュ問題が解消しているようだ。

https://www.virtualbox.org/wiki/Changelog-6.1#v30

```
macOS host: Fix multiple bugs specific to macOS Monterey in installer and startup of kernel extensions
macOS ホスト: インストーラーおよびカーネル拡張機能の起動における macOS Monterey に固有の複数のバグを修正
```

# 方法

1. 下記にアクセスする。
    - [https://www.virtualbox.org/wiki/Downloads](https://www.virtualbox.org/wiki/Downloads)
1. 「VirtualBox older builds」をクリックする。

    ![Downloads_–_Oracle_VM_VirtualBox.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/02076279-c0f4-c987-8eba-67327148570d.png)

1. 「VirtualBox 6.0」をクリックする。

    ![Download_Old_Builds_–_Oracle_VM_VirtualBox.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/7ce1e597-48c9-929b-e43c-01659ed36b5b.png)

1. 「VirtualBox 6.0.8」の「OS X hosts」をクリックする。

    ![Download_Old_Builds_6_0_–_Oracle_VM_VirtualBox.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/b052a0cc-2188-0bfa-bcbc-e4163512d5d2.png)

1. ダウンロードされた「VirtualBox-6.0.8-130520-OSX.dmg」をダブルクリックで開く。
1. 「Double click on this icon」の「VirtualBox.pkg」をダブルクリックする。
 
     ![VirtualBox.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/ecebcd72-aec4-4f18-108d-53b0d884387b.png)

1. インストーラーに沿ってインストールを進める。

    ![Oracle_VM_VirtualBoxのインストール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/faeab1ab-5f27-9e7b-1de5-d842fb1df1f2.png)
IIJのMVNOの構成とインタフェース

ワケあって、IIJのMVNO (IIJ mio)を公開情報の範囲で調べてみました。

# サマリ
4GのフルMVNOとして、ローミングに必要なEPC＋OSS/BSSが一通りありそう（DEA、P-GW、PCRF、OTA、BSS）。
5Gは構想段階だが、5Gコアに加えて、無線（RAN）のコントロール側も作ろうとしているのかな。

# 参考文献
[1]IIJ Technical Day 2018 https://eng-blog.iij.ad.jp/archives/2202
[2]GSMA IR.88 EPS Roaming Guidelines https://www.gsma.com/newsroom/wp-content/uploads/IR.88-v25.0-17.pdf
[3]3GPP TS 29.274 Evolved General Packet Radio Service (GPRS) Tunneling Protocol for Control plane (GTPv2-C); Stage 3
[4]3GPP TS 29.281 General Packet Radio System (GPRS) Tunneling Protocol User Plane (GTPv1-U) 
[5]3GPP TS 29.272 Evolved Packet System (EPS); Mobility Management Entity (MME) and Serving GPRS Support Node (SGSN) related interfaces based on Diameter protocol
[6]GSMA TS.51  OTA Testing 
[7]IIJ 5G時代のMVNOの在り方 https://www.iij.ad.jp/dev/report/iir/048/02.html
[8]むねあき 3GPP アーキテクチャ https://twitter.com/nickel0/status/1543561196447891457?s=20&t=JpBZfLLH-2PAx5v3rZ4fNQ
[9]IIJ Technical WEEK 2021 https://www.iij.ad.jp/dev/tech/tw2021/session07/
[10]Internet Infrastructure Review（IIR）Vol.51　NSA/SA商用サービス化　https://www.iij.ad.jp/dev/report/iir/051/02.html

# 装置構成(3G/4G)
## ライトMVNO(L2接続)の場合、LTEはS8インタフェースで接続。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/1242dd5b-2e3c-9507-3dd8-933c55663044.png)
図は[1]より

### S8インタフェース＝GTP
ローミング用のインタフェース。Control plane GTPv2-C, User Plane GTPv1-U

GTP-C：セッションやベアラを作ったり、削除したり。
表は[3]より
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/f158a6d3-07ee-66fd-97da-9bb6d2277b04.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/4ab6a25d-04b3-4bc3-9d93-9da550dea047.png)

GTP-U：ユーザーのパケット（T-PDU)＋GTP-Uヘッダ）
図は[4より]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/9bb241a3-106c-6566-184b-66bb6b444d16.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/a6d648de-c188-2996-f62a-2bef001ac3e2.png)

## フルMVNOは、S8(GTP- C/U) + S6a(Diameter) インタフェース
OTA：Over the air ？　eSIMを書き換える機能部？
BSS：Business support system？　契約者が増えた時にSIMのプロファイルを追加したりする？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/f142247a-0971-ebbf-4a60-514632fd601e.png)
図は[1]より

### S6aインタフェース
位置情報(端末を収容しているMME)の更新、認証等。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/ff054a36-2819-af7d-542c-2d24ccae6e67.png)

図は[5]より

# ローカル5G構成
ローカル5G向けに、
・NSA構成
　RadiusにPCCルール（帯域制御とか）を持たせて、PCRFとOCS不要化（速度規制は1日一回バッチ処理）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/3120332f-4350-9f87-8364-471fd4b4c4c3.png)

・SAは必要な機能の洗い出し？

# 将来の装置構成
紫色が、5Gコア＝4GのEPC（HSS/P-GW/PCRF/OCS相当）。POIの部分のインタフェースが気になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/d040ef56-b6b6-2f69-15d3-f70fccdd1057.png)
図は[7]より

## RRUとのPOIの部分
N1,N2,N3 インタフェースあたりか(NAS,NG, GTP)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/3baa8ac2-e3ee-12b5-5f73-6aaeaac30ffc.png)
図は[8]より


# 基盤
P-GWは仮想化している。
図は[9]より
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/b48a203c-86aa-8724-c33a-e1533a469702.png)
![uploading...0]()
Windows11で使える「ファイル名を指定して実行」Shellコマンド一覧

# はじめに
私は日頃、クライアントPCやサーバの設定(いわゆるキッティング)の作業を行っており、キッティング作業を少しでも効率化したく色々と悪戦苦闘しています。

今回は、前回の続編として「ファイル名を指定して実行」を使用し**特定のフォルダ**を開かせることが出来るShellコマンドを掲載したいと思います。
こちらも前回のコマンド同様、短時間で目的の画面に辿り着けることはもちろん、初心者の作業者でも手順書にコマンドを記載しておくだけで、迷うことなく設定対象のフォルダを開き設定を行うことができるので、工数削減につながります。

ご興味のある方は、ぜひ参考にしてみてください。

ちなみに、前回投稿した「ファイル名を指定して実行」から**特定の画面**を開くコマンドについて確認したい方は、下記ページを確認してみて下さい。

https://qiita.com/yuuki_kagura/items/d4cde0b59e80d4677273


## 環境
今回掲載するコマンドは、下記環境で動作確認したものとなります。

OS：Windows11 Pro 22H2
※Homeエディションなど、実行環境により起動しないフォルダもありますのでご注意ください。

## フォルダ別コマンド一覧
|フォルダ名|コマンド|
|---|---|
|アドレス帳|shell:Contacts|
|インターネット一時ファイル|shell:Cache|
|一時書き込みフォルダー|shell:CD Burning|
|Windows(C:\Windows)|shell:Windows|
|Windowsツール|shell:Administrative Tools|
|お気に入り|shell:Favorites|
|競合|shell:ConflictFolder|
|Quick Launch|shell:Quick Launch|
|Cookie|shell:Cookies|
|検索|shell:Searches|
|検索結果|shell:SearchHomeFolder|
|更新プログラムをアンインストールする|shell:AppUpdatesFolder|
|ごみ箱|shell:RecycleBinFolder|
|Common Files(C:\Program Files\Common Files)|shell:ProgramFilesCommon|
|最近使った項目|shell:Recent|
|System32(C:\Windows\System32)|shell:System|
|スタートメニュー|shell:Start Menu|
|スタートアップ|shell:Startup|
|すべてのコントロールパネル項目|shell:ControlPanelFolder|
|SendTo(C:\Users\ユーザー名\AppData\Roaming\Microsoft\Windows\SendTo)|shell:SendTo|
|ダウンロード|shell:Downloads|
|デスクトップ|shell:Desktop|
|Templates(C:\Users\ユーザー名\AppData\Roaming\Microsoft\Windows\Templates)|shell:Templates|
|Templates(C:\ProgramData\Microsoft\Windows\Templates)|shell:Common Templates|
|同期結果|shell:SyncResultsFolder|
|同期センター|shell:SyncCenterFolder|
|同期のセットアップ|shell:SyncSetupFolder|
|ドキュメント|shell:Personal|
|ネットワーク|shell:NetworkPlacesFolder|
|ネットワーク接続|shell:ConnectionsFolder|
|Network Shortcuts(C:\Users\ユーザー名\AppData\Roaming\Microsoft\Windows\Network Shortcuts)|shell:NetHood|
|PC|shell:MyComputerFolder|
|フォント|shell:Fonts|
|プリンター|shell:PrintersFolder|
|Printer Shortcuts|shell:PrintHood|
|Programs(C:\Users\ユーザー名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs)|shell:Programs|
|ProgramData(C:\ProgramData)|shell:Common AppData|
|プログラムと機能|shell:ChangeRemoveProgramsFolder|
|プログラムの取得|shell:AddNewProgramsFolder|
|Program Files(C:\Program Files)|shell:ProgramFiles|
|保存したゲーム|shell:SavedGames|
|マイミュージック|shell:My Music|
|マイピクチャー|shell:My Pictures|
|マイビデオ|shell:My Video|
|ユーザー(C:\Users\ユーザー名)|shell:UserProfiles|
|ユーザーフォルダー|shell:Profile|
|User Pinned(C:\Users\ユーザー名\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned)|shell:User Pinned|
|ライブラリ|shell:Libraries|
|ライブラリのドキュメント|shell:DocumentsLibrary|
|ライブラリのビデオ|shell:VideosLibrary|
|ライブラリのピクチャー|shell:PicturesLibrary|
|ライブラリのミュージック|shell:MusicLibrary|
|Resources(C:\Windows\Resources)|shell:ResourceDir|
|History(C:\Users\ユーザー名\AppData\Local\Microsoft\Windows\History)|shell:History|
|リンク(C:\Users\ユーザー名\Links)|shell:Links|
|Roaming(C:\Users\ユーザー名\AppData\Roaming)|shell:AppData|
|Local(C:\Users\ユーザー名\AppData\Local)|shell:Local AppData|

## 最後に
今回もご覧頂きありがとうございました。
今後も、Windows設定まわりで効率化になりそうなネタがありましたら、アップしていきたいと思います。
PostgreSQL、TablePlusのローカル接続

# 接続手順

### 記載しないこと
PostgreSQLの導入手順
TablePlusの導入手順

### ローカル環境
Mac M2

### 用途
個人メモとして

### １、TablePlusを起動
起動時の画面

![スクリーンショット 2022-11-24 16.22.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468139/fd3d1c9b-1c08-ece4-cee9-733894e3296b.png)

### ２、流れ
起動した画面で右クリック > New > Connection
![スクリーンショット 2022-11-24 16.23.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468139/2739ee65-8ed4-aa21-da28-1a56f5ab6193.png)

(Pg) PostgreSQLを選ぶ　> Create
![スクリーンショット 2022-11-24 16.23.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468139/2caf0543-849c-cda3-d0dc-78ebbccf5f2b.png)


### ３、Connnection画面ですること
紫で塗りつぶしているところを入力していく
Name...適宜わかり易い名前を入力
User...使用中のMacのName(database.ymlで設定箇所でも確認できます)
Database...database.ymlで設定したもの
私の場合、上記を設定しConnectで接続できました。

![スクリーンショット 2022-11-24 16.11.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468139/0cd10345-9a97-5685-9d99-067b7a81b17d.png)

database.ymlの参照箇所(TablePlusの画面ではない)
![スクリーンショット 2023-06-18 17.53.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468139/98725f6d-b7aa-1d5b-f4c9-b07f4e89e50e.png)


###　接続が成功した画像

![スクリーンショット 2022-11-24 16.52.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468139/3137af91-74f5-4779-ae26-8cb1756e17e2.png)

改めてアプリを起動した時に接続されているDBが一覧として並ぶ(私の場合だと3点の接続が分かる)
![スクリーンショット 2022-11-24 16.52.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468139/699aac8c-78c1-70d0-4aaf-5379788550d2.png)

### 終わり
「ご注文はこちらの物件ですか？」アプリを作ってみた。

こちらの記事をご覧いただきありがとうございます。
~~「ご注文はうさぎですか？」も絶対古いよな…？~~
~~ちなみに私はごちうさのアニメを全く見たことないです。~~

SUUMOの物件情報について機械学習モデルを使っていろいろ調べていました。
前回の「うわっ…理想の賃貸、相場高すぎ…？」に続いて、物件の条件を入力すると似たような物件を探してきてくれるアプリを作りました。
アプリ開発についてはまだまだ勉強中なので大したものではありませんが、ぜひ使ってみてください。

※11月28日追記
heroku有料化に伴いherokuからアプリを削除しました。
代わりにAWS EB を利用してデプロイしました。こちらが利用できます。ついでに↓のエラーも（たぶん）改善できました。~~エラー残ってたらごめんなさい。~~

※12月15日追記
AWS EBの環境を停止しました。現在は利用できませんので、ご了承ください。

※なにかのミスで、 __間取りの条件によってはエラーが出てしまいます…__ 。「Internal Server Error」の表示が出たらブラウザの戻るボタンを押して戻ってください。
~~デプロイしてから気が付きました。ちゃんとデバッグして~~

# 「ご注文はこちらの物件ですか？」アプリの概要

↓のurlから利用できます。

http://flask-env.eba-pv9ep326.ap-northeast-1.elasticbeanstalk.com/recommend

↓こんな感じの画面が出てきます。
<img width=500 alt='recommend-rent-home.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/fd2a9bd7-7105-a89f-eab6-0b9f92de3749.png'>

フォームに適当な物件の条件を入れると…
<img width=500 alt='recommend-rent-condition.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/02af0f91-d920-9c10-ed18-290a8b2348cf.png'>


似たような物件を3件おススメしてくれます。
<img width=500 alt='recommend-rent-condition.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2774344/7c45342a-bf2b-a330-40aa-8c73027d9a0e.png'>

ご覧いただいてわかると思いますが、精度はたいして良くないです。

あと、一応SUUMOで見れるようにurlを付けておきましたが、スクレイピングをしたのが11月の頭くらいなので、物件の掲載が終了していることがあります。
（体感、掲載終了している方が多い気がします）


# 仕組み

前回と同じく __flask__ で作って __heroku__ にデプロイしました。
（herokuが11月28日から有料化するので25日にアプリを削除する予定です。~~可動期間短すぎでは~~ )

これもやはり仕組みは簡単です。
* 物件の条件を入力してもらう。
* →テーブルデータに用意してあるSUUMOの物件1000件すべてと、入力された物件の条件の類似度を計算
* →類似度の高い物件上位3件を表示

類似度の計算は、コサイン類似度を使用しています。
```python:コサイン類似度
def cos_sim(v1,v2):
    dot = np.dot(v1,v2)
    norm1 = np.linalg.norm(v1)
    norm2 = np.linalg.norm(v2)
    sim = dot/(norm1*norm2)
    return sim
```

詳しくは[こちら](https://qiita.com/harperfu6/items/3238d8f78c8a8d8cf114)をご覧ください。

レコメンドシステムによくある協調フィルタリングとかは入ってません。
そういうのを期待していた方には申し訳ないです。
（ユーザの行動履歴やパーソナリティのデータを個人で集めるのはなかなか大変な気がします…）

また、こちらも仕組み作りを優先して、cssとかUI設計みたいなことはしていません。かなり簡素です。
本来レコメンドシステムを作るならそういうユーザの使い勝手の概念はとても重要なんですけどね。
（使いづらくてユーザが離れてしまうと結局意味ないから）

# 改良案

前回改良案に挙げていた
* 「専有面積」「最寄駅からの距離」とかをわかりやすい値に変える or 不要にする

は改善してみました。
「専有面積」は代わりに「間取り」を利用するように変更、「最寄駅からの距離」は「駅徒歩」の情報から分速100mで計算しています。


これらは今後勉強してうまく作れるようにしたいです。
* UIを考慮した設計（cssとか）
* 未入力項を許す
* プルダウンの連動（今回はないけど路線と駅を連動するとか）

UIの設計は専門の勉強が必要なので、ひとまずBootstrapを使えるようにすると思います。

# 終わり。

いかがでしたでしょうか。
前回改善案に条件に似たような物件をおススメしてくれる機能を取り上げたので、急造ですが作ってみました。
おかげでデバッグが不十分なんですけども…。これに反省して次の開発はちゃんとデバッグします。デバッグの勉強します。

これをちょっと試してから、レコメンドシステムにかなり興味がわいてきたので勉強しています。
実際に自分で作るには相当な勉強が必要なうえ、データ収集がなかなか困難な気がしていますが、何か作れそうなら作ってみます。

その前にherokuが使えなくなるからAWSに移植します。
多分AWSはこのくらいの規模ならお金かからないと思うんですが…
まあお金かかるにしてもいい勉強になると思うのでやってみます。




# 他のSUUMO記事

まとめ記事書いたのでぜひご覧ください。

https://qiita.com/tomyu/items/aa565490f48612e00535
Firebase Cloud Messagingのメッセージのテストコードを書く（Java）

## 方法

`ApiClientUtils.getDefaultJsonFactory()` を使用すると、MessageクラスをJSON文字列に変換できる。

```Java
// 実際値のMessageクラス
Message actual = Message.builder()
        .setNotification(Notification.builder().setBody("message_text").setTitle("").build())
        .putData("id", "data")
        .setToken("FCM_TOKEN_XXXXX")
        .build();

// 期待値のJSON文字列
String expected = """
        {
            "data": {
                "id": "data"
            },
            "notification": {
                "body": "message_text",
                "title": ""
            },
            "token": "FCM_TOKEN_XXXXX"
        }
        """.replaceAll("[\s\r\n]", "");

// MessageをJSON文字列へ
JsonFactory jsonFactory = ApiClientUtils.getDefaultJsonFactory();
assertThat(jsonFactory.toString(actual)).isEqualTo(expected);

```

## 元ネタ

公式のテストコードで使用されている `assertJsonEquals()` の実装がそうなってる。

* https://github.com/firebase/firebase-admin-java/blob/61454914dedefb847e60a218db2c9d059f2f47e5/src/test/java/com/google/firebase/messaging/MessageTest.java#L932
ビジネスシステムと公共・行政システム

# ビジネスシステム
### POS(Point Of Sales)システム
販売店の店頭で、顧客が購入した商品情報をバーコードリーダなどで収集し、```商品の仕入れや商品開発などに利用```するためのシステム

### EOS(Electronic Ordering System)
```取引先とのデータの受け渡しの自動化```や、```在庫確認・検品作業・発注業務の省力化```などを実現するシステム。POSシステムと連動させて在庫や物流の管理を行うシステムもある。

### グループウェア
社内業務支援システムの一つで、ネットワークを介して```共同作業を円滑```に行うためのソフトウェア。
電子メール/電子掲示板、スケジュール管理(共同）、ドキュメントデータベース、ワークフロー、電子会議システムなどの機能を持つ。

# 共同システムと行政システム
### スマートグリッド
発電施設や電力の消費者（事務所や家庭）に設置された制御装置が```ネットワークを介して電力情報をやり取り```し、それらを基に```発電量や電力消費量を制御```することで、効率的な電力供給を行うためのシステム。
```エネルギー消費の節減```を目的としている。

### マイナンバー
```国民一人一人が持つ１２桁の固有番号```と、```この番号を利用した行政システム```を指す。
マイナンバーの導入により、税・年金・雇用保険などの行政手続きが効率化された。

### 住民基本台帳ネットワークシステム（住基ネット）
住民基本台帳は、住民票をもとに```氏名や性別、住所や住民票コードなどを編成```したもので、市町村が管理。
住基ネットは、```住民基本台帳を全国規模のネットワークで結んだ行政システム```。住民の転出先自治体への通知、年金の給付・給付状態の確認などに利用される。

### 公共システムとデジタルディバイド
公共システムが提供する住民票のコンビニ交付など、```便利な個人向けサービスの導入は、行政側にも窓口業務の負担軽減```などのメリットをもたらした。その反面、公共のシステムでありながら、```デジタルディバイド(情報格差)によってシステム利用の可・不可や利便性の高・低に、個人間で大きな差があることが問題となっている。

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8
cu, screenコマンドを使ってstm32でデバッグするメモ

STM32でデバッグしているときにもっと早く知りたかったやつ。

デバイスを探す。

```
$ ls /dev/tty.usb*
/dev/tty.usbmodem141203
```

`screen`コマンドを使ってつなげてみる

```
$ screen /dev/tty.usbmodem141203 115200
```

ctrl + k, a で退出するのを忘れずに

`cu`コマンドを使ってつなげてみる。

```
$ sudo cu -s 115200 -l /dev/cu.usbmodem141203
```

## `resource busy`エラーが出たら

`screen`を正常に退出しないままにするとエラーが出る。
以下のように検索。

```
$ lsof | grep usb

screen    79025 username    5u      CHR                9,4    0t14663                1495 /dev/tty.usbmodem141203
```

以下のコマンドでスクリーンにアクセス。

```
screen -x 79025
# ctrl + a, k　と押すと退出できる
```
SEOについてちょっとだけ勉強してみた

# 概要

- SEOについてちょっとだけ勉強してみたので簡単にまとめてみる。

# そもそもSEOとは

- 日本語でいうと「検索エンジン最適化」、英語で短縮しないでいうと「Search Engine Optimization」であり、Googleなどの検索でそのページを如何に上位にヒットするようにリンクなどを調整することを指す。
- ようは検索で上位に表示されやすくように色々調整することを指す。

# 検索エンジンとは

- SEOについて細かく知る前に検索エンジンについても知っておく必要がありそうだったのでまとめてみる。
- Webブラウザで検索をするときに検索結果を導き出して検索結果を順番に並び替えて返してくれる仕組みのこと。
- ロボット型検索エンジン、ディレクトリ型検索エンジン、メタ検索エンジンなどの種類がある模様だが、現在はほとんどロボット型検索エンジンが主流らしい。
- ロボット型検索エンジンは下記の3個の処理に分割できる。
    - クローラ
    - インデックス
    - ランキング

# クローラとは

- インターネット上に存在するページを巡回し情報を収集する。
- キーワードごとに情報を収集しデータを蓄積する。
- 巡回したページの中にリンクがあった場合、リンク先の情報も更に収集する。（nofollowなどが指定されていないければ）

# インデックスとは

- クローラを使って蓄積した情報を検索エンジンのデータベースに登録する。

# ランキング

- クローラで収集した情報を用いてそれぞれのページを評価し順位づけをする。
- googleなどでなにか検索したら、結果が上から順番に表示されるがこれはランキングで順位づけされたものが上から表示されている。

# リンクジュース

- ページが持つ価値のこと。
- ただし、このリンクジュースの大小だけをみてランキングの順位付けをしているわけではない。あくまでランキングの順位付けの1要素

# SEOの考え方

- 「良いページ」の評価基準の一つとして「当該ページのリンクがどのくらい他のページに記載されているか」というものがある。
- これは「良い論文はたくさん引用される」という特性を用いたものであり、webがもともと論文を共有するためのツールだった頃の考え方が残っているようだ（先輩に教えていただきました。）

# 参考文献

https://www.willgate.co.jp/promonista/nofollow/

https://webtan.impress.co.jp/e/2007/12/24/2418

https://dmlab.jp/seo/in/in03.html
【Django】静的コード分析ツール flake8 の導入

# 概要
## コーディング規約って？
システム開発は通常数人のチームで開発を行うけど、人が違えばコードの書き方なんて違って当然ですよね？
<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427357/ec3b94a3-d315-8a69-7d68-4527f9ef3f0d.png">

しかし、書き方が大きく違ってしまうと、他の人が見てわからなくなったり、なんなら作った自分がわからなくなったり・・。
これは、<font color='red'>バグの修正や拡張のしにくさにつながって、メンテナンスしにくくなってしまう原因</font>となるわけです。

そこで開発者によってコードの書き方のキマリとして、**コーディング規約**というものが存在します。

## それっておいしいの？
コーディング規約を守ることで、コードの保守性や品質を高めることができると言われています。
ちなみにコードの保守性とは、主に以下のようなことかなと思います。
- 誰でも理解しやすい
- バグを発見/修正しやすい
- いつ見てもすぐコードの内容が理解できる
- 機能追加を誰でも行える

Pythonにも[PEP8](https://pep8-ja.readthedocs.io/ja/latest/)という規約があります。
まずはぜひ公式ページをザッと読んでみてください。


さて、新人コーダーでこれを全部頭に入れてコーディングできている人はどのくらいいるでしょうか・・？

<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427357/6b914804-e9cf-fcda-a6a8-715c76412f16.png">

ということで、コーディング規約をチェックするものとして**静的コード分析ツール**「**flake8**」がありますので、それを新人コーダーたちの環境に導入し、保守性や品質の向上を図ることにしました。

早速、Djangoの開発環境にflake8を導入していきます。


## flake8のインストール
#### 1. pipでflake8をインストール
```bash:コマンド
pip install flake8
```

#### 2. requirements.txtへの保存
別環境で一括インストール可能とするために、更新しておきましょう。
```bash:コマンド
pip freeze > requirements.txt
```

#### 3. Djangoプロジェクトのフォルダに``.flake8``ファイルを作成

#### 4. 作成した``.flake8``ファイルに以下の除外対象設定を記入
不要なチェックもあるので除外しています。

```bash:.flake8
[flake8]
exclude =
    .git,
    .gitignore,
    *.pot,
    *.py[co],
    __pycache__,
    venv,
    .env

ignore =
    E121,
    E126,
    E127,
    E128,
    E203,
    E225,
    E226,
    E231,
    E241,
    E251,
    E261,
    E265,
    E302,
    E303,
    E305,
    E402,
    E501,
    E741,
    W291,
    W292,
    W293,
    W391,
    W503,
    W504,
    F403,
    B007,
    B950,

max-line-length = 200
```

## flake8の使い方
#### 1. Djangoプロジェクトのフォルダに移動

#### 2. flake8の実行

**■全体をチェックする場合**
```bash:コマンド
flake8
```

**■特定のファイルをチェックする場合**
```bash:コマンド
flake8 main.py
```

**■特定のフォルダ以下のファイルをチェックする場合**
```bash:コマンド
flake8 views/
```

**【実行結果】**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427357/e7b2fed2-534b-b543-f0ef-d4d05d30c4d2.png)

NGが出たら、指摘メッセージに基づいて修正を行ってください。
下記の記事を参考にしてください。
(【Python】flake8指摘事項まとめ)[https://www.yokoyan.net/entry/2018/07/02/181500]

## おわりに
基本的には、このチェックによってNGがゼロ件になるように保ってください。
Node.js/Vue.js/Nuxt.jsとは

# はじめに
仕事でNuxt.jsを使ったのですが、その際にNode.js/Vue.js/Nuxt.jsがそれぞれ何なのかわからず、自分なりに調べたことをここにまとめておこうと思います。
情報量としてはまだまだ少ないので、メモレベルの内容になります。

# Node.jsとは
Node.jsとはJavaScriptをサーバー側で動作させる実行環境です。

特徴としては、大量の同時接続をさばけることで「ノンブロッキングI/O」方式を採用しているそうです。
(ここについては、詳しく理解できていないので参考URLを貼っておきます。)
※参考：https://www.kagoya.jp/howto/it-glossary/develop/nodejs/

また、従来はフロント側とサーバ側で言語が分かれていたのが、同じ言語で開発ができるという点でも非常に注目されています。


# Vue.jsとは
Vue.jsというのはJavascriptを用いてフロントエンドの開発を行うNode.jsのフレームワークとなります。
逆に、フロントエンドのフレームワークとしてはExpress.jsがあります。
※上記は一例で、他にもたくさんフレームワークはあります。

# Nuxt.js(ナクスト)とは
Vue.jsのフレームワークです。
Vue.jsがUI等のフロントエンド向けのフレームワークであるに対し、
Nuxt.jsはUI以外のWebアプリケーション開発に必要な機能が最初から組み込まれていて、以下はその例になります。

・SSR(サーバサイドレンダリング)
まず、Vue.jsはクライアント側でレンダリングするSPA（Single Page Application）です。
ですが、Nuxt.jsはサーバ側でレンダリングする SSR（Server Side Rendering）や、ビルド時に全コンテンツを含んだ静的ファイルを生成するSSG（Static Site Genaration）も設定することができます。

・ルーティング
まず、Vue.jsの場合ルーティング設定をするために、ソース内にコードを複数記述する必要があります。
ですが、Nuxtはそういった手間が必要ありません。
デフォルトでルートディレクトリ配下に「pages」というディレクトリができていて、そこにVueファイルを配置して、vueファイルの名前にアクセスするだけでページが表示されます。

# 参考サイト
https://qiita.com/non_cal/items/a8fee0b7ad96e67713eb
ゼロつく2でValueErrorが出た時の対処法

日本語の文章生成を試みた際、コーパスの大きさでValueErrorエラーが発生しました。

# エラー文

```
ValueError: could not broadcast input array from shape (1653,100) into shape (10000,650)
```

# 解決法
動かしているファイルは、generate_better_text.pyだが、エラーに対応する数字が変えられるのは、better_rnnlm.py。　

better_rnnlm.pyの18-19行目を見てください。
```
def __init__(self, vocab_size=10000, wordvec_size=650,
                 hidden_size=650, dropout_ratio=0.5):
```



vocab_size=10000, wordvec_size=650,hidden_size=650の部分をエラー文にある(1653,100) と同じにしましょう。

```
def __init__(self, vocab_size=1653, wordvec_size=100,
                 hidden_size=100, dropout_ratio=0.5):
```
 ※私はコーパスの語彙数が1653だったので1653にしていますが、独自のコーパスを使いたい場合は、それぞれ違う数字が出てくると思います。エラー文にある数字(今回だと(1653,100) となっている部分)に合わせてみてください。
こうすると私の場合はうまく動きました。
Git備忘録

# [rejected] master -> master (non-fast-forward)
とリジェクトされた。

今回の原因は、WEBでのGitHub上で、README.mdを編集。
それを忘れて、そのままPULLせずにローカルで続行。お粗末。

そして、PUSHしようとコマンドを打ったら、上記リジェクト発生。

# 対処方法
$ git merge --allow-unrelated-histories
というコマンドを打って、とりあえずマージさせる。

ようやくPUSH完了。

いまだにマークダウン方式というのがよくわかっておらず。。。
参照元：https://qiita.com/hiroki-it/items/1671514eb659880e5bef

でもこんな便利なツールがあるとは。。もっと早く使っておいてもよかったかな。
【CSS】displayプロパティを理解する


## display とは

CSSのプロパティの1つで、要素の種類(ブロックレベル要素、インライン要素)を変更することができるプロパティのこと。

値には、変更したい要素の種類を設定します。

```css
p {
  display: flex; /* ブロック要素を横並び */
}
```
## displayと組み合わせる値

| 値との組み合わせ      | 効果                                                            |
|----------------------|--------------------------------------------------------------- |
|display: block;       |指定された要素はブロックレベル要素として表示されます                 |
|display: inline;      |指定された要素はインライン要素として表示されます                    |
|display: inline-block;|指定された要素はインライン要素とブロックレベル要素の特性を併せ持ちます|
|display: flex;        |指定された要素の子要素は横並びになる                               |
|display: none;        |指定された要素は非表示になる                                      |

## display: inline-block;について詳しく

### インラインブロック要素の特徴

・要素の幅は中身と同じ大きさになる（インライン要素の特徴）
・要素同士が横に並ぶ（インライン要素の特徴）
・幅（width）と高さ（height）が指定できる（ブロックレベル要素の特徴）
・余白（padding・margin）が指定できる（ブロックレベル要素の特徴）
Gitのブランチを切り替えただけなのに・・・(pods利用)


iOS開発中にgitのブランチを切り替えたら、エラーでいっぱいになった。

## 解決方法

1. プロジェクトフォルダ内のファイル・フォルダ　Podfile.lock xxx.xcworkspace Pods を削除
1. xxxx.xcodeprojを開く
1. Podsファイルを削除
1. クリーン（↑ ＋　comm + K)
1. xxxx.xcodeprojを閉じる
1. コマンドラインでpod install --repo-update
1. xxxx.xcworkspaceを開く
1. クリーン（↑ ＋　comm + K)

環境とかに左右されるかもですが、podsを利用していて
ブランチを切り替えただけでビルドが通らなくなった場合は試してください。
MFC から SVG の座標変換

## 座標変換
先述しましたが、基本的に画像を描く際は左上を原点 (0, 0) としており、右下に向かい X 軸、 Y 軸の値が増加していきます。
MFC(GDI+)  では座標の変換により通常のグラフと同じ座標系に変更することができます。
しかし、 SVG では通常のグラフと同じ座標系にはできません。
SVG で可能なのはそれぞれの個別タグにて行う座標変換のみとなります。

本稿ではグラフの座標系から画像座標系への変換方法とタグ個別の座標変換について説明を行います。

## グラフ座標系から画像座標系への変換
計算方法は「MFCからSVGの基本図形」に記載してありますが、ここでは詳しく解説していきます。

通常グラフから部分的に SVG 画像へ書き出しを行うため、描画する範囲の座標が必要となります。
必要な値がグラフ座標の描画範囲に位置する左下の点 (Left, Top) と右上の点 (Right, Bottom) の値になります。こちらを m_rectAll にて保持しておきます。

```cpp:SvgImage.h
class SvgImage
{
protected:
	CString m_strFilePath;		// ファイル名
	CArray<mdSvgTag*, mdSvgTag*> m_arrayTag;	// タグ
	Rect m_rectAll;	// viewport
public:
	SvgImage();
    ~SvgImage();
}
```

グラフ上の任意の点 A (Ax, Ay) を画像の座標系に変換するとします。

X 軸はそのまま反映されるため左端を原点にすればよいですから、 Ax から m_rectAll.left の値を引き算します。

- A'x = Ax - m_rectAll.left

Y 軸はグラフの座標系から画像の座標系で上下反転する必要があります。m_rectAll.bottom を画像の座標系で Y 軸の原点にするため計算式は以下の通りとなります。

- A'y = m_rectAll.bottom - Ay

<font color="red">※グラフ系が上下反転するに伴い、回転角度も反転する必要があることに注意してください。上下が反転するため、回転の縦軸計算が反転します。</font>

## SVG タグ個別の座標系変換
タグ個別の座標系返還には transform 属性を利用します。
MFC から書き出しする場合、MFC で変換している順に合わせて transform 属性の関数呼び出しを行う必要があります。

MFC 、SVG ともに座標を指定しなければ原点を中心に回転が行われます。

MFC で回転を行いたい場合、原点を回転する中心点へ平行移動し、座標全体を回転させ描画したあと、元に戻すという方法をとることが多いかと思います。
SVG への書き出しも同様に行います。

```xml
<text x="0" y="0" font-size="20" font-family="Verdana"
      fill="blue" transform="translate(50,50)rotate(30)">
        ABC (rotate)
</text>
```

拡縮や斜め変形などは必ず平行移動や回転の後に行うようにしてください。
拡縮や斜め変形を先に宣言すると平行移動や回転角がずれを発生させてしまう恐れがあります。

なお、塗パターンなどの pattern タグの場合属性名が patternTransform になります。

## 個別タグの座標変換関数
```diff_cpp:SvgImage.h
class SvgImage
{
public:
+   void AddAttrTransform(CPoint pnTrans, int nDegree);
}
```
```cpp:SvgImage.cpp
void SvgImage::AddAttrTransform(CPoint pnTrans, int nDegree)
{
    CString strTransform;
    strTransform.Format(L"translate(%.03lf,%.03lf)rotate(%d)",
        pnTrans.x, pnTrans.y, -nDegree);
    AddAttribute(L"transform", strTransform);
}
```
[Nuxt.js]Nuxt.jsプロジェクトでバンドルサイズ削減する


Nuxt.js（2系）に、`webpack-bundle-analyzer`というバンドルサイズを可視化できるツールがデフォルトで組み込まれている。

【参考】
[Nuxt公式](https://nuxtjs.org/docs/configuration-glossary/configuration-build/#analyze)
[webpack-bundle-analyzer](https://github.com/webpack-contrib/webpack-bundle-analyzer)

これを使ってプロジェクトのバンドルサイズ削減に取り組んだことを記録します:writing_hand:



## 1. 使っている外部ライブラリの変更
`lodash`を`lodash-es`に変更。

**約60kb削減**

**[変更前]**
![lodash前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415434/ea076e9b-eeb1-16d9-f07f-a3b4d32e9e94.png)

**[変更後]**
![lodashes後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415434/46cba2ae-98f2-652e-55be-be40331644ad.png)

## 2. pluginsの登録を見直す
外部ライブラリのほとんどがpluginsとして登録されていた。
これだと全てのページで読みこまれてしまうため、必要な箇所が限定的なものは、プラグインの登録は削除し、各コンポーネントでインポートするようにした。

**約400kb削減**
(※`webpack-bundle-analyzer`のレポートは省略)

## 3. 特定のエクスポートのみをインポートする
下記のようにそのままインポートを記述すると全てのエクスポートが読み込まれてしまう。
使うオブジェクトだけをインポートするようにする。
【参考】
[MDN import](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/import)

(※何kb削減したかは記録していない)
(※`webpack-bundle-analyzer`のレポートは省略)

**[変更前]**
```js
import lodash from 'lodash-es'
```

**[変更後]**
```js
import { cloneDeep } from 'lodash-es'
```

## 4. Dynamic Import

各ページで表示するSVGの名前をpropsとして渡して使用するコンポーネントがあった。
SVGが追加される度にそのコンポーネントにSVGのインポートを追加し、全てのSVGをインポートしていた。
今回、SVGは必要なタイミングでインポートされるようにした。

SVGの量が多かったこともあり結構削減できた。

**約180kb削減**

(※`webpack-bundle-analyzer`のレポートは省略)

**[変更前]**
```vue.js
import alarm from '@/assets/img/icons/alarm.svg'
components: {
    alarm,
}
```

**[変更後]**
```vue.js
components: {
   alarm: () => import('@/assets/img/icons/alarm.svg'),
}

```


## 5. 使われていないライブラリを削除

`webpack-bundle-analyzer`で可視化することで使われてないライブラリも確認できる

(※何kb削減したかは記録していない)
(※`webpack-bundle-analyzer`のレポートは省略)


## 6. ライブラリ使用の見直し
プロダクトの仕様によっては、ライブラリの機能はリッチすぎるかもしれない。
ライブラリを使うか、自身で実装するかも検討する。

(※何kb削減したかは記録していない)
(※`webpack-bundle-analyzer`のレポートは省略)

### 後書き
まだまだ改善できることはあるかもしれません。

外部ライブラリを選定時には、ライブラリのバンドルサイズや、オプションでバンドルサイズを絞れるかどうか等も選定するときに考慮したい。

Nuxt.jsのpluginsは、外部ライブラリを使う場合に登録すると、各コンポーネントで毎度読み込まずに使用できるので便利ですが、使う場所が限定される場合は対象のコンポーネントで直接読み込むのが良さそうです。

Nuxt3ではwebpackからViteへ移行することもありそうですが、Viteでもできるようです。:relaxed:
【参考】
[Nuxt.js 公式](https://nuxt.com/docs/api/configuration/nuxt-config#analyze-1)
[rollup-plugin-visualizer](https://github.com/btd/rollup-plugin-visualizer)
Microsoft Lists のアラームが機能しない　※解消済み

# Microsoft Lists のアラームが機能しない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884114/1d43e766-aae1-4051-7b18-b4e962666258.png)

**2023年2月14日追記**
1月25日時点で**この記事で説明している不具合は解消されている**ことを確認しました。
以降は古い情報です。
***

SharePoint Lists (Microsoft Lists) の自動化→アラームを設定で、メールによる通知を受け取ることができます。
…が、どれだけ待っても通知メールは届きません。


# メールが届かない原因

このアラーム機能はPowerAutomateフローで実現されており、上記の操作を行うと自動的にPowerAutmateフローが作成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884114/0d9ff811-7717-3e57-97e0-690b0550dcaf.png)

フローの中を探ると、Notifications - Send me an email Notification (日本名：メール通知を受け取る)を使って、メールを送信しているようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884114/b7b1e61a-c304-4963-a5bc-82d3aad1d659.png)

[「PowerPlatform / PowerAutomate - Notifications コネクタ "メール通知を受け取る" アクションについて」](https://qiita.com/sasami_axis/items/9106a88fe312bdc62ea7) に投稿したように2022年11月現在、Send me an email Notification (日本名：メール通知を受け取る)は 日本語環境では機能しないためです。

PowerAutomateの言語を"English"に変更して使うか、Outlook メール送信アクション等にアクションを置き換える対処が必要になるようです。
Kali Linux をWSL2にインストールする

# Kali Linuxとは
ペネトレーションテストに特化したLinuxディストリビューションです。

# 動機
安全確保支援士の3年に一度の講習のため、どんな講座をうけようかなと思っていた時に
実際にペネトレーションテストをする講座を発見したので、そちらに申し込みました。
結果、事前準備としてKali Linuxを用意しておいてね、ということだったので、
WSL2に入れてみることにしました。

# インストール
前提として、WSL2をインストール済みであれば、Microsoft Storeから入手できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/73d7c094-c784-4e92-fd15-d51dd90ad0ec.png)

# 起動
インストールが終わったら、そのまま起動できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/d41c620e-6918-d684-176b-585376fc27ab.png)

# KaliToolのインストール
次に便利なツール群をインストールしていきます。

まずは、パッケージのアップデート

```bash
sudo apt update
```

次にKali Toolsをインストールします。

```bash
sudo apt install kali-linux-large
```

結構インストールに時間がかかります。
インストールが進むと、いくつか質問に回答していく必要があります。
参考までに、

## キーボード設定
日本語を選びました。106 キーボードなので、「Kana 86」を選択。環境に合わせて定義選択してください。

## Configuring macchanger
自動的にマックアドレスを変更するかの確認です。「Yes」を選択しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/bceb7c7d-b19e-4cf4-8109-80a45c6d1c7a.png)

## Configuring kismet-capture-common
kismetってツールの設定のようです。「Yes」を選択し、
「Users to add to the kismet group」のところに、自分のユーザ名を入れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/3e4ca5d1-2551-142e-e6ec-b749dc1583d0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/536e7e91-cd1a-87a8-41f8-903da0257a5d.png)

## Configuring wireshark-common
キャプチャを取り忘れました・・・
「Yes」を設定しました。Wiresharkをsudoしないで使うための設定のようです。

## 確認
インストールが終わったら、確認してみます。nmapコマンドを発行してみましょう。
こんな感じでUsageが出ればOK。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/d6c1c4a3-dcaf-502f-dfca-811f0bf5e928.png)

# Win-Kexのインストールと起動

Windows上でGUIを使えるようにするためのツールです。

## インストール

```bash
sudo apt install kali-win-kex
```


## 起動
以下のコマンドを実行してください。
view-only password はnでOK。
このコマンドは、Windowモードで起動するようです。
VNCウィンドウの中に、Kali Linuxのデスクトップが表示されています。

```bash
kex --win -s -m
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/cfc23827-0dd7-8e16-673f-6f54d71816b9.png)

そうすると、起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/abca0a4b-11d5-8fc4-afdf-f2035f2eb888.png)

ほかにも、Enhanced Sessionモードや、Seamlessモードがあるようですが、ここでは割愛します。

## ステータスの確認

```bash
kex status
```

## 停止

```bash
kex --kill
```

# 最後に
とりあえずこれで研修の準備は完了したと思われます。
明日、研修を受けてみて、もう少し使い方についても記載していきたいと思っています。
Salesforce World Tour Tokyoについて

今回の内容は動画でも掲載しています

https://www.youtube.com/watch?v=N1R0Qn4Mh4g

<iframe width="560" height="315" src="https://www.youtube.com/embed/N1R0Qn4Mh4g" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


Saleforce World Tour Tokyo　というイベントが2022年11月29日、30日にあります

29日は基本オンライン、30日はオンラインと会場参加が可能です

https://www.salesforce.com/jp/events/worldtour/2022/

公開されている内容を見ると、

Salesforceについてのセッションが多数ありますね

興味がある方は　Day1タブとDay２タブでそれぞれスケジュールが公開されているのでご確認ください

個人的に気になるイベントは
True to the Core
Salesforce 共同創設者パーカー・ハリスに聞く
顧客の声を製品の進化に取り入れる方法
です。

これは、
事前に募集して選ばれた質問や機能アイデアをパーカー・ハリスに聞いてみるセッションのようです
どのような質問やアイディアが出てくるのかとても楽しみですね

Salesforce World Tour Tokyoは
Dreamforceでも紹介された最先端のテクノロジーに触れられることはもちろんですが、
Salesforceに関する話だけでなく、豪華ゲストによるパフォーマンスも見れるようです。

とても面白そうなイベントなので興味がある方はぜひ申し込んでみてはいかがでしょうか


久しぶりの国内でかいじょうさんかがたのSalesforceの大きなイベントなのでとても楽しみですね。
EC2 上の docker にアクセスする方法

EC2 に接続して docker をみてみたい状況ありますよね。
EC2 のインスタンス上で docker を用いて Adminer や nginx などのコンテナを起動した時、そのコンテナのポートにローカルのブラウザからアクセスする方法をお伝えします 🐳

- [TL;DR](#tldr)
- [ローカルの docker 版](#ローカルの-docker-版)
- [EC2 インスタンスの docker 版](#ec2-インスタンスの-docker-版)
  - [EC2上から疎通確認](#ec2上から疎通確認)
  - [ローカルから疎通確認](#ローカルから疎通確認)
- [最後に](最後に)


# TL;DR

重要なのは **SG** の設定です！

## ローカルの docker 版
まずはローカルの docker でコンテナを起動した時、そこにブラウザからアクセスするためには`http://localhost:<port>`にアクセスすると思います。
この際に必要なのは **ポートフォワーディング** です。
これは簡単にいうとローカルとコンテナのポートの紐付けを行うイメージです。
例えば ローカルの ポート8080とコンテナのポート8080を紐付けると、ローカルのポート8080からコンテナのページなどにアクセスすることができるわけです。(ポート番号は同一である理由はないです。が、同じの方がわかりやすいです。)

## EC2 インスタンスの docker 版
ここまでがローカルの docker でコンテナを作成したときの話でした。
ここからは EC2 のインスタンス上の docker にアクセスしてみましょう。

ここで EC2 に SSH 接続して docker 等をインスタンスに入れる方法は巷にたくさん紹介されているのでこちらで SSH 接続 & docker のインストールまでやりましょう。また、コンテナの起動もしておいてください。

ちょっと脇道にそれるのですが、今は URL の [localhost](http://localhost) としているところは実は **自分のPCの** という意味を担っています。つまり、そこを EC2インスタンスのパブリック IP にすれば、ローカルから EC2 上で建てたコンテナにアクセスできます。

具体的には `http://x.x.x.x:8080` にアクセスすれば良いです。

しかし、aws のセキュリティグループ(以下SG)などの設定によりアクセスできないことがあります。以下でその対処法を紹介します。

netcat を使ってEC2 と docker の疎通確認を ローカル からと EC2インスタンス からの2つで行います。
<br><br>
### EC2上から疎通確認
こちらはおそらくうまくいっています。
EC2に適宜 netcat をインストールしてください。(yum などで)

netcatの使い方は

```bash
(ec2-user) $ nc -vz <IP> <Port>
```

という感じです。(ポート番号はコンテナのではなくホストのです。)

今、SSH 接続しているのでこの目線からの [localhost](http://localhost) はEC2インスタンスのことです。つまり、EC2とコンテナの疎通確認をインスタンス上で行うには

```bash
(ec2-user) $ nc -vz localhost 8080
```

`connected to hoge` が返ってきていればOK。

ここにエラーが出ていたら EC2インスタンス自体とコンテナの疎通がうまくいっていません。

Dockerfile や compose あたりのファイル自体を見返してみてください。

### ローカルから疎通確認

ここがおそらくうまくいっていません。

まずはncをインストールしてください。(mac は標準であります)

今度はローカルから nc します。

```bash
$ nc -vz x.x.x.x 8080
```

ここでエラーが出ていたら、9割 SG に原因があります。

なので aws のインスタンスのページに飛びましょう。

そしたら画面下部のセキュリティに行き、SG のページに飛んでください。

次にインバウンドルール からインバウンドルールの編集を押してください。

今は SSH 接続用の 22 だけが設定されていると思います。

**ルールを追加 → カスタムTCP → あけたいport** って感じで画像のように port を設定してください。

そしたら再び nc をしてみて connected になっていることを確認してください。

これで`http://x.x.x.x:8080`にアクセスできるはずです！

# 最後に


読んでいただきありがとうございました🙇‍♂️
PowerPlatform / PowerAutomate - Notifications コネクタ "メール通知を受け取る" アクションについて　※不具合解消済


# Notifications「メール通知を受け取る」アクション


**2023年2月14日追記**
1月25日時点で**この記事で説明している不具合は解消されている**ことを確認しました。
以降は古い情報です。
***


[Notificationsコネクタのドキュメント](https://learn.microsoft.com/ja-jp/connectors/flowpush/#%E3%83%A1%E3%83%BC%E3%83%AB%E9%80%9A%E7%9F%A5%E3%82%92%E8%87%AA%E5%88%86%E3%81%AB%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B) によると
>Microsoft Flow のサインインに使用したアカウントにメール通知を送信します。

というアクションです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884114/c6f577e4-1209-d7f1-df34-b25be957376b.png)

しかし、このアクションを使っても一向にメールが来ません。

# 対処方法

PowerAutomateの言語設定を"English"に変更すると、このアクションは機能するようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884114/f5a0dad4-926d-b1aa-e368-914be8f2bce2.png)

2022年11月現在、日本語環境における不具合とのことです。
修正されるまでは上記の回避手段をとるか、別の(Outlook等)メール送信アクションを使う必要があります。
マルチコアで共有される ARM GIC(v2) に関するまとめ

# 1つしかないものに複数人で書き込むような設計はダメだとあれほど（ｒｙ
割り込み許可(GICD_CTLRのbit0に1を書く)は1つしかない。
誰が書き込むのか。
それを考えると、

+ *GICマスタ* : GICを管理する人
+ *GICスレーブ* : 上記以外の人

という風にしようと思い立つ。GICマスタが割り込み許可を出すわけだ。
GICスレーブは、誰かが割り込み許可を出してくれるのを待つ格好になる。

# GICマスタとGICスレーブの差って？
とはいえ、GICスレーブはそれでいいのだろうか。
何らかの要因でGICマスタが立ち上がらなかったらどうするのだろう。
というか、デバッグしている最中とかだと普通にあり得る。

と考えると、GICスレーブは、誰かが割り込み許可を出してくれるのを待つが、ある程度の時間で諦めて、ダメだったらGICマスタとして動作する。のが、正解ではないか、と思い当たる。

また、各割り込み番号に対する設定は、各々のコアから、その割り込み番号を使用する段になってから行えば良い。ただし使用する割り込み番号は、ちゃんと設計して重ならないようにしてね。ここに、マスタとスレーブの差はない。

# 概要まとめ
+ GICマスタは、割り込み許可を行う。
+ GICスレーブは、ある程度の時間、割り込み許可になるのを待つが、ダメだったら割り込み許可を行う。
+ 各割り込み番号の設定は、各々のコアから、使用する段になって設定する。割り込み番号は重複しないように。

# Example(各割り込み番号の設定)
すみません。権利関係の問題で載せられません。
まさにIT土○。
代わりにレジスタ設定の概要を書きます。

1. GICD_IGROUPRnを設定する。
2. GICD_ICFGRnを設定する。
3. GICD_ITARGETSRnを設定する。
4. GICD_IPRIORITYRnを設定する。
5. GICD_ISENABLERnを設定する。

※要スピンロック。以下を参考にさせていただきます。
[Zircon のスピンロック実装（aarch64編）](https://zenn.dev/junkawa/articles/fuchsia-zircon-spinlock-arm64)

# 参考
[ARM® Generic Interrupt Controller Architecture version 2.0 Architecture Specification
ARM IHI 0048B.b (ID072613)](https://developer.arm.com/documentation/ihi0048/bb/?lang=en)
関数が苦手な人はぜほ読んでほしい【完成形じゃないのはご了承ください】

# はじめに

最初みんな関数と聞いてどんなイメージをもつだろうか？
今この記事を見てるという事は、なんか関数...難しそう...嫌い...
そんなイメージを持ってる方が多いと思います。

実は、私もそのその１人だ。
次の日には忘れてる...「私ヤバいんやない？」とか思った人が書いています。
なので、苦手意識を持つ前に、ぜひ読んでほしい。

# 関数とは

一番身近で例えやすいために料理に例えるが、
私が関数をイメージするのは、
関数とは、ただただ ”〇〇マシーン” のことだ。
”マシーン” だけでは、機能しない。
だが、〇〇マシーンをイメージできない人はいないと思う。


例えば、ミキサー、大根おろし器
何かを入れて初めて、その機能が働く
何も入れなければ、ただの箱。

そう、何かを入れて初めて機能するものだ。

例）大根おろし
　　大根を煮る
　　リンゴジュース...

材料となるもの（入力）　　何をする（機能）　　　　何がでてくる（出力）

大根を　　　　　　　　　　すりおろす　　　　　　　大根おろし
大根を　　　　　　　　　　煮る　　　　　　　　　　大根煮
リンゴを　　　　　　　　　ミキサーで混ぜる　　　　リンゴジュース

##### ※ ただ、処理をされて出てくるものは一定のものでなければ関数ではないことだけはおぼえておいてほしい。

関数とは、入力（操作）と出力（結果）だけわかれば使える機能
例）自動販売機　
　　お金を入れてジュースを選ぶ⇒ジュースが出る
[構文]
function 関数名（引数）{　　　　#引数 ⇒ 与えるデータ
          処理内容
　　　return 戻り値;　　　　　　#戻り値 ⇒ 処理した結果
   }

私が、関数を覚え始めた頃は、上記の関数名の部分に処理したい内容の名前を付けるようにしてました...
Pythonのclickを使って業務効率化するCLIを作った

# はじめに
アルバイト先で行うメールの開封データの定期的な集計を、私以外のメンバーでも簡単に触れるようにコマンドラインから実行できるようにしました！

# 動作環境
MacOS Monterey
python 3.10.6
click 8.1.3

# 実装
全体のコードはこんな感じです。

```python

import click
import time

from module.output import usual_open_ratio, usual_click_ratio

@click.group()
def cli():
    pass


@cli.command()
@click.option("--open_ratio", prompt="開封率を出力しますか？[y/N]", type=bool)
@click.option("--click_ratio", prompt="反応率を出力しますか？[y/N]", type=bool)
def usual_analyze(open_ratio, click_ratio):
    if open_ratio:
        n = click.prompt("何回分の開封率を出力しますか？", type=int)
        usual_open_ratio(n, False)
        
        print("finish!")
        
    if click_ratio:
        n = click.prompt("何回分の反応率を出力しますか？", type=int)
        usual_click_ratio(n, False)

        print("finish!")

if __name__ == "__main__":
    cli()

```

--helpをつけて実行すると、関数usual_analyze()がコマンドとして提示されていることが確認できます。

```bash
$ python main.py --help       

Usage: main.py [OPTIONS] COMMAND [ARGS]...

Options:
  --help  Show this message and exit.

Commands:
  usual-analyze
```
実際に実行してみます。

```
$ python main.py usual-analyze

開封率を出力しますか？[y/N]: y
反応率を出力しますか？[y/N]: y
何回分の開封率を出力しますか？: 10
finish!
何回分の反応率を出力しますか？: 10
finish!
```

オプションを指定しているので、インタラクティブに実行することができました！

実際のコードは[Github](https://github.com/hono0130/mail-cli)に載せています。
webpackとは

# はじめに
「そういえばwebpackってなんだ？」と思い、調べたことをメモしておこうと思います。

# webpackとは
webpack（ウェブパック）複数のJavaScriptファイルを一つのファイルにまとめて出力するモジュールバンドラー(module bundler) です。
Vue.jsやReactなんかを扱っているとイメージが付きやすいかと思いますが、各機能ごとにjs/tsファイルが分かれていると思います。
そういった複数のファイルをまとめる(bundle)するためのツールです。

# webpackの利点
利点としては、リクエストの回数を減らせることです。
リクエストが増えるとパフォーマンス（表示速度）が落ちてしまうため、機能ごとに分けたファイルを別々に読み込むことはあまりよくありません。
「開発時はファイルを分けたい/実行時はまとめたい」を実現できるツールと言えるでしょう。
[Django] gitignoreしていた環境ファイルがgit操作中にどっかいった

## なぜ発生したか。
原因はわからずです。git操作中にブランチを新しく切ったり、コミット履歴を消したりしていたので、何かのコマンドで.envファイルをぶっ飛ばしてしまった模様。

Error
```Python
raise ImproperlyConfigured("The SECRET_KEY setting must not be empty.")
```
このErrorが出たためにDB接続情報もぶっ飛びました。自分でもびっくりする悲鳴を上げたものです。

呼吸を整えろ俺。といったところで閃いたのは、新しくdjangoアプリ作って、シークレットキーを移植すればいいんじゃね？DB情報は使っているDBの大元の接続情報を見に行けば見つかるはず。

## シークレットキーを新規作成。

てことで, 新しくシークレットキーを作成します。
```Python
$ django-admin startproject <projectname>
```

下記のシークレットキーを移植する。

setting.py
```Python
SECRET_KEY = 'django-insecure...'
```

runserver
```python
$ python3 manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
November 24, 2022 - 14:05:54
Django version 4.1.3, using settings 'geopostpj.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
```

Let' Go!!やったぜ！
enjoy your coding!!
Babelとは何か

# はじめに
よく開発で目にする「Babel」ですが、
「そもそもBabelって何だ？」と思い、調べたことをここにまとめておこうかと思います。

# Babel(バベル)とは
Babelとは、JavaScriptのコードを新しい書き方から古い書き方へと変換するツールです。
また、併せて押さえておきたいものとして、ECMAScriptと呼ばれるJavaScript の基本仕様があります。

# ECMAScriptとは
元々JavaScriptはNetscape社のブラウザで使用される言語として作られました。
それを他のブラウザがJavaScriptを各々独自に拡張していき、
そのため、JavaScriptは標準化されていない言語だったとのことです。
それに対応するため、Netscape社が国際標準化団体のECMAに依頼してJavaScriptのコア部分を標準化したものがECMAScriptです。

# なぜ変換が必要か
ECMAScriptは、例えば「ECMAScript 2015/ECMAScript 2016/ECMAScript 2017/...」というようにバージョンが年々更新されています。
ですが、全ブラウザがECMAScriptの最新バージョンに対応しているとは限りません。
未対応のブラウザの場合、新しいjsのコードの書き方を使うことができないということになってしまいます。
(例えば、ES2015以上の仕様のJavaScriptでの記述は、IE11では動作しない。)

その問題に対応できるのがBabelです。
Babelは、ECMAScript 15以降のモダンなjs構文や機能を利用して書かれたコードを、
古いjsコードに変換するツールです(JavaScriptコンパイラやトランスパイラと呼ばれる)。
【AWS】冗長性のあるLAMP環境の構築（アーキテクチャ図・作業概要・参考文献）


AWS EC2を用いた冗長性のあるインフラ（LAMP環境）を構築する機会がありましたので、その時に使用したアーキテクチャ図・作業手順・参考文献を記載します。作業手順については、概要のみの記載となっております。機会があれば、作業手順の詳細を公開できたらとは思います。




# アーキテクチャ図

![20220524_AWS-LAMP-WP-Draft.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201852/f8bb7abd-8287-9a62-1de4-a5b58524ea44.png)




# 作業概要

* 0.AWSシステム構成図を作成する

* 1.VPCで仮想ネットワークを構築
  * サブネットとアベイラビリティゾーンの作成
  * インターネットゲートウェイの構築
  * NATゲートウェイの構築
  * ルートテーブルの構築
  * セキュリティグループの作成

* 2.EC2（踏み台サーバ）の構築

* 3.EC2（Webサーバ）の構築
  * LAMP環境の構築

* 4.ELB（ロードバランサー）の作成
  * ELBをいて分散処理を行う

* 5.RDB（データベースサーバ）の構築

* 6.S3（画像ストレージ）の構築

* 7.CMS（Wordpress）をインストール・環境設定

* 8.Route 53でドメインを発行・SSL証明書の発行（HTTPS化）
  * AWS Certificate Manager(ACM)でSSL証明書の発行
  * Route53でAレコードのエイリアスを作成

* 9.EC2・RDBを複製して同期（lsyncd）を行う

* 10.Apatch JMaterで負荷テスト環境を構築する




# 参考文献

### インフラ構築

・中垣健志『AWSではじめるインフラ構築入門 安全で堅牢な本番環境のつくり方』（翔泳社、2021年）

・[初心者向け]VPC作成からEC2インスタンス起動までを構成図見ながらやってみる（その1）
https://dev.classmethod.jp/articles/creation_vpc_ec2_for_beginner_1/

・[初心者向け]VPC作成からEC2インスタンス起動までを構成図見ながらやってみる（その２）
https://dev.classmethod.jp/articles/creation_vpc_ec2_for_beginner_2/

・[初心者向け]Amazon Linux 2にLAMP環境を構築してみる
https://dev.classmethod.jp/articles/install_lamp_enviroment_on_al2_for_beginner/

・lsyncdを使って2台のEC2間のファイルを双方向同期する
https://www.geekfeed.co.jp/geekblog/ec2-lsyncd/

### CMS（Wordpress）

・WordPressの画像をAmazon S3にアップロードする【AWS/WordPress】
https://m-kenomemo.com/wp-s3/

・EC2上で立てたWordPressをRDSに移行してみる
https://dev.classmethod.jp/articles/sales-ec2-wordpress-rds-migration/

・AWS EC2 / RDS でWordPressサーバーを立てる（備忘録）
https://zenn.dev/wataru_nishi731/articles/fa0e358586c721#rds%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%82%92%E7%AB%8B%E3%81%A1%E4%B8%8A%E3%81%92%E3%82%8B

### 負荷試験・パフォーマンス計測

・仲川樽八・森下健『Amazon Web Services負荷試験入門 ――クラウドの性能の引き出し方がわかる』（技術評論社、2017年）
Raspi(server)とWindows(client)をusbipで繋ぐ

##  環境情報

server

    device：raspi
    OS：ubuntu20.04
    kernel：5.15.0-1017-raspi
    
    
host

    device：laptop
    OS：windows 11
    

    



## raspi(server)側の準備

現在のubuntuでは、usbipはkernelについてくるためaptでinstallできない。また本来のubuntuではkernelに付随しているがraspi用のubuntuは軽量版なので入っていない。そのため、以下を実行してusbipを使える状態にする。

まず最新のkernelを取得するために以下を実行する。

```
sudo apt-cache search linux-images|grep raspi
```
実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985582/d7a764b7-d7a8-0a54-14d8-6a7eac0b5617.png)
raspiなので、今回の結果であれば以下で更新する。

```
suso apt install linux-image-5.15.0-1017-raspi
```

kernelをinstallしたら再起動する。kernelが更新されているか確認する

```
uname -r
```

このままでは、まだUSBIPを使うことはできない。
kernelのバージョンにあったものをinstallする必用があるため以下を実行する。

```
sudo apt-cache search linux-tools |grep raspi
```

実行すると、様々なバージョンのものがでてくる。今回は、linux-image-5.15.0-1017-raspiをinstallしているため、以下をinstallする。

```
sudo apt install linux-tools-5.15.0-1017-raspi
```

次に、USBIPを使うためのモジュールをinstallすり必要がある。これもkernelに合わせる必要があるため以下で調べる。

```
sudo apt-cache search linux-modules-extra |grep raspi
```

これもkernelに合わせて、今回は以下をinstallする。

```
sudo apt install linux-modules-extra-5.15.0-1017-raspi
```

また、hwdataが必要なのでinstallしておく。

```
sudo apt install hwdata
```

installが完了したら、usbipを使うために設定を行う。
まず、moduleを有効化するために、以下を実行していく。

```
sudo modprobe usbip-core
sudo modprobe usbip-host
sudo modprobe vhci_hcd
sudo modprobe usbip_vudc
```

次に、バックグラウンドでusbipが使えるようにするためusbipのデーモンを起動させる。

```
sudo usbip -D 
```

## raspiの操作

まず、usbデバイスのbusidを確認するする。

```
usbip list -l
```

実行すると、以下のように表示される。
![](https://i.imgur.com/XazTEFR.png)
busidは、今回だと1-1.1になる。

busidがわかったら、bindしてリモートで使用できるようにする。

```
sudo usbip bind -b <busid>
```
これで、raspi側の操作は終了である。

------------------------------

## windows(client)側の設定

まず、[ここ](https://github.com/cezanne/usbip-win/releases)からusbip-winのzipファイルをinstallする。

好きな場所に解凍して、そのファイルに移動する。
ファイル内のusbip_test.pfxをinstallする。

```
.\usbip_test.pfx
```
installする際、保存場所はローカルコンピュータを選ぶ。またpasswordはusbipとなっている。

次に、test signingを有効化する。
この際、パソコンがセキュアブートが有効化させていると実行できないため無効化しておく。biosを開いて編集することになり、僕の場合回復キーを求められてめちゃくそビビりました。

```
bcdedit.exe /set TESTSIGNING ON
```

有効化できたら、仮想デバイスをinstallする必用がある。

```
.\usbip.exe install -w
```

## windows(client)側の操作

まず、リモートでbindされているusbを確認する。

```
.\usbip.exe list -r <ipアドレス　or　VPN>
```

実行すると、raspi側でbindしたbusidと同じデバイスが表示される。
確認したbusidを利用して、

```
.\usbip.exe attach -r <ipアドレス　or　VPN> -b <busid>
```

succesfullyと表示されれば無事接続完了である。
一応確認で、以下を実行する。

```
.\usbip.exe port
```
---
Unicodeでの文字種の判別

## Unicodeでの文字種
Unicodeでは（Shift-JISなどと同じく）文字ごとにコードポイントという番号が割り当てられている。

コードポイントは、Scriptという言語による文字のグループでおおまかに分類されている。
例えば日本語だと、ひらがなが`Hiragana`、カタカナが`Katakana`、漢字が`Han`。

http://www.unicode.org/Public/UNIDATA/Scripts.txt

Scriptの中で、さらにBlockという連続した文字コードの範囲が定義されている。
例えば漢字には[CJK Unified Ideographs](https://www.unicode.org/charts/PDF/U4E00.pdf)(CJK統合漢字。中国語・日本語・韓国語で使用される漢字を統合したもの)、[CJK Unified Ideographs Extension A](https://www.unicode.org/charts/PDF/U3400.pdf)などがある。

http://www.unicode.org/Public/UCD/latest/ucd/Blocks.txt

## 文字種の判別の実装
[Hiragana](https://www.unicode.org/charts/PDF/U3040.pdf)の情報を見るとRangeは `3040–309F`であることがわかる。

Javaで一般的なひらがなを判定したい場合、イメージとしてはScriptを使用すると`"あ".matches("\\p{script=Hiragana}+")`のように、Blockを使用すると`UnicodeBlock.of('あ') == UnicodeBlock.HIRAGANA`や`"あ".matches("^[\\u3040-\\u309F]+$")`のように書くことができる。

文字の種類は正規表現でも判定でき、例えばひらがななら`[ぁ-ん]`、半角カタカナなら`[ｦ-ﾟ]`を使用する。
半角カタカナの場合`[ｧ-ﾝ]`等でない理由は[Halfwidth and Fullwidth Forms](https://www.unicode.org/charts/PDF/UFF00.pdf)(Halfwidth Katakana)を見ると分かる(コードの範囲としては`FF61-FF9F`)。
また、Halfwidth and Fullwidth Formsにはカタカナ以外も含まれるので`UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS`を使用してもカタカナかどうかの判定は上手くすることができない。

漢字についても注意が必要。
よく使用される`[一-龠々]`の正規表現はサロゲートペアなどに対応していない。
色々と落とし穴があるため、文字種の判定を行う際は詳細を調べたほうが良い。

## 便利なサイト
- https://home.unicode.org/
  - https://www.unicode.org/charts/ ScriptsやBlock別に文字の一覧を確認できる。
  - https://util.unicode.org/UnicodeJsps/character.jsp 任意の文字の詳細情報を検索できる。
- https://rakko.tools/tools/89/ (日本語サイト)
  - 文字からコードポイント・HTMLエンティティ・文字ブロックなどを検索できる。コードポイントからの検索もできる。
曖昧な単語を使って欲しくない

# はじめに
ここ数年保守を担当しており、色々な人の書いたコードを目にします。
最近以下のようなコードを目にしました。

```java
public void sample() {
    // 何かしら処理
    if (checkCommon(dto)) {
        // 何かしら処理
        if (checkDate(date)) {
            // 何かしら処理
        }
    }
}
```

(前後の処理をぼかしているのもありますが)ifの中で何をチェックしているのか、`check`の意味が広く曖昧であることによって理解できませんでした。
これを例に、なぜ曖昧な単語を使うことがよくないのか、どのように修正すればよいのか、個人的な意見を書きます。

# どのようにチェックしているのかわからない
細かい理由はいくつかありますが、個人的にはこれが大きすぎると感じています。
前述のとおり`check`の意味が広すぎて曖昧であることによって、関数の意味も曖昧になってしまいます。故にこの章のタイトルの通り**どのようにチェックしているのかわからない**状態となってしまいます。

1つ目の例は少々特殊で、`common`も意味が広くて曖昧なので**何を**チェックしたいのかすらわかりません。
ここでやりたかったことは以下でした。

:::note warn
dtoにはステータスを持っており、どのステータスの場合でも行う必須項目に値が入っていることのチェック
チェック対象はdtoのフィールド変数の内3つだけ
:::

要は全ステータスで共通の必須項目をチェック、ということみたいです。`checkCommon`からは読み取れないですね。

2つ目の例は**日付に対して何かのチェックする**ことしかわかりません。
フォーマットのチェックするのかもしれないですし、システム日付と比較をするかもしれません。
仮にスラッシュフォーマットチェックをしていたとしても、この名前からではスラッシュ有りと無しのどちらが`true`なのかわかりません。
ここでやりたかったことは以下でした。

:::note warn
dateがスラッシュ付フォーマットになっていることをチェック
:::

なんとなーく予測できていましたが処理内容を確認するまでハッキリとはしませんね。

# 改修
名前に`check`は必要でしょうか？
今回の例のようなbool値が返る場合は**処理自体が何かをチェックしたり、比較したりする性質**を持っています。そこに対してわざわざ`check`と名付けなくとも十分に意味が通じるはずです。
これを踏まえて、前章でほぼほぼ記載済みではありますが改めてチェックしたい内容を記載します。

**＜1つ目＞**

:::note
全ステータス共通で必須項目に値が入っている**こと**
チェック対象はdtoのフィールド変数の内3つだけ
:::

**＜2つ目＞**

:::note
dateがスラッシュ付フォーマットになっている**こと**
:::

これから、私としては以下のどちらかの実装をします。

```java
public void sample() {
    // 何かしら処理
    if (presentRequiredField1AndField2AndField3InAllStatus(dto)) {
        // 何かしら処理
        if (hasSlash(date)) {
            // 何かしら処理
        }
    }
}

public void sample() {
    // 何かしら処理

    // 対象はField1とField2とField3
    if (presentRequiredFieldsInAllStatus(dto)) {
        // 何かしら処理
        if (hasSlash(date)) {
            // 何かしら処理
        }
    }
}
```

`presentRequiredField1AndField2AndField3InAllStatus`と`presentRequiredFieldsInAllStatus`を使うパターンを記載しました。前者は確認項目が少なく、今後増えることがない時に定義する想定です。後者は確認項目が多い時や、今後項目が増える可能性がある時に定義する想定です。

# 類似語
`check`のみを取り上げましたが、他にも同じ性質を持った単語があります。
これらの使用は避けるようにしましょう。

:::note alert
`judge`、`compare`、`common`
:::

**※思い付き次第随時更新していきます。**

(他にご存知の方がいらっしゃいましたら教えていただきたいです！！)

# おわりに
この手の単語はそれらしい名前になるので安易に使われがちですが、他者が見ると何をやっているのかわからないことが多い印象です。私自身過去に使っていた記憶があります(この記事を書くにあたって引っ張りだそうと思ったのですが見つけられませんでした…)。今思えば目の前の作業を終わらせることでいっぱいになっていて、保守の人に流れ着くことやそのコードから自分のレベル感が評価されることまで全く考えられていませんでした。この記事を通して、少しでもそういったところまで考えてもらえたら嬉しいです。

ちょっとした内容ですが、参考になりましたら幸いです。

# 追記
コメントにて以下ご指摘をいただいたので追記します。
> 例えば論理的にチェックする、登録する、リソースを解放する、という一連の処理がある場合、物理的にもcheck()、save()、release()で表現されている方が見通しが良くなるのではないでしょうか。

仰る通りで、記事内での考慮が漏れておりました。
本記事、私の考えとしてこのような用途を否定するものではありません。