OmniAICreator/Qiita-1.07M huggingface dataset:
Db2 on IBM Cloud に Pythonからつなぐ（Select編）

## 初めに

以前の投稿で、[「IBM Cloud でDb2インスタンスを作成し、 Node.jsからアクセスしてみよう」](https://qiita.com/ac_qiita/items/d6b8c9fc3b9e87b528ba)という投稿をし、IBM Cloud のDb2を使用したと記載しましたが、今回は、Node.jsではなくPython(version3)での使用方法をご紹介します。

IBM CloudでのDb2の作成の仕方は、以前の投稿をご参照ください。

## 手順
### 1. ibm_dbモジュールのインストール
```
$ pip3 install ibm_db
```
※環境によってはpip3ではなく、pipの場合もあります。

### 2. ソースファイルの作成
ソースの中身はコメント行を参考にしてください。
```python:select_db2.py
import ibm_db;

# db2接続情報の定義（xxxxxは環境に応じて書き換えてください）
db_con_str = \
"DRIVER={DB2}" \
  + ";DATABASE=" + "xxxxx" \
  + ";HOSTNAME=" + "xxxxx" \
  + ";PORT=" + "xxxxx" \
  + ";PROTOCOL=TCPIP" \
  + ";UID=" + "xxxxx" \
  + ";PWD=" + "xxxxx" \
  + ";Security=SSL"

# 実行するselect文を定義
sql_str = "SELECT EMPLOYEEID, NAME, SYSTOOLS.BSON2JSON(PROFILE) as PROFILE FROM EMPLOYEES;"

# db2接続情報から接続オブジェクトを生成
conn = ibm_db.connect(db_con_str,"","")

# 接続オブジェクトと実行SQL文より、statementオブジェクトを作成
stmt = ibm_db.exec_immediate(conn, sql_str)

# fetch_assocによって、1行分のデータが取得される。
dictionary = ibm_db.fetch_assoc(stmt)

# 全行分取得が終わるまで、fetch_assocで、順次1行ずつ読み取って、出力する。
while dictionary != False:
    print(dictionary)
    dictionary = ibm_db.fetch_assoc(stmt)
```

### 3. ソースファイルの実行
```
$ python3 select_db2.py
{'EMPLOYEEID': 100, 'NAME': 'Tom', 'PROFILE': '{"hobby":"baseball","license":"driver"}'}
{'EMPLOYEEID': 110, 'NAME': 'Jhon', 'PROFILE': '{"hobby":"football"}'}
```
※環境によってはpython3ではなく、pythonの場合もあります。
Azure Fundamentals(AZ-900)：Azure の基礎: Azure のアーキテクチャとサービスについて説明する「Azure Functions / Azure App Service」

Microsoft Learnを用いたMicrosoft Azure Fundamentals(AZ-900)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始める方の参考になれば幸いです。

## 今回の学習内容
**◆「Azure Functions / Azure App Service」**
◇対応するMicrosoft Learn ラーニングパス
[Azure の基礎: Azure のアーキテクチャとサービスについて説明する](https://learn.microsoft.com/ja-jp/training/paths/azure-fundamentals-describe-azure-architecture-services/)
◇対応するモジュール
[Azure Functions について説明する](https://learn.microsoft.com/ja-jp/training/modules/describe-azure-compute-networking-services/6-functions)
[アプリケーション ホスティングのオプションについて説明する](https://learn.microsoft.com/ja-jp/training/modules/describe-azure-compute-networking-services/7-describe-application-hosting-options)

※前回の投稿は下記から確認できます。
[Azure Fundamentals(AZ-900)：Azure の基礎: Azure のアーキテクチャとサービスについて説明する「コンテナ(Container)」](https://qiita.com/fsd-jume/items/4b4ed7a925bb7a011259)

## Azure Functions
**Azure上でサーバを意識することなく関数(コード)を実行できるサービス**
**◇特徴**
・VMやコンテナの構築/保守を必要とせず、自動スケーリングも対応
・データの変換や転送など数秒以内にすばやく処理が完了できるマイクロサービスでの利用が多い
・イベント(REST要求など)、タイマー、別のAzureサービスからのメッセージに応答してコードを実行
・コード実行中に使用されたCPUの時間に対してのみ課金

## Azure App Service
**HTTPベースのアプリ実行環境を適用するPaaSサービス**
・任意のプログラミング言語が利用可能
・負荷分散や自動スケーリングを提供
・自動デプロイを可能にし、継続的デプロイモデルをサポート
※継続的デプロイ(CD：Continuous Deployment)
⇒開発/修正したプログラムを自動的に展開/導入する仕組み

**◆アプリサービスの種類**
**◇Webアプリ**
・任意のプログラム言語でWebアプリを構築可能
・ホストOSとしてWindowsかLinuxのいずれかを選択可能

**◇APIアプリ**
・RESTベースのWeb APIを構築可能
・APIをパッケージ化しAzure Marketplaceで公開可能
・作成されたアプリはHTTP/HTTPSベースの任意のクライアントから利用可能

**◇モバイルアプリ**
・iOSアプリやAndroidアプリのバックエンドを素早く構築可能
・SNSを利用した認証やプッシュ通知の送信を行う機能を利用可能

**◇Webjobs**
・プログラムやスクリプトをスケジュールしたりトリガーで実行可能
※Azure Functionsとはサーバの有無/料金体系/アプリの規模が異なる
・バックグラウンドタスクを実行するために使用される

## 次の学習内容
**◆Azure仮想ネットワーク(VNet)**

https://qiita.com/fsd-jume/items/4a0d14f1e415f7c2c165

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8
vbaで配列に配列(ジャグ)を入れ、且つ片方は配列ではない配列サンプル

vbaで配列に配列を入れ、且つ片方は配列ではない配列サンプルです。
下記例は　複数の値（日付・ジャグ配列）があり
それにidがついているイメージ。jsonではよく見る型。
Dim必須ならVariantで試してください。

```sample.vba
Sub Macro1()
    '****** Prop ******
    ar_id_and_jag = Array( _
        Array("id123", _
            Array("2029/12/26", "2029/12/28", "2029/12/29", "2029/12/31") _
        ), _
        Array("id456", _
            Array("2030/1/1", "2030/2/1") _
        ) _
    )
    '****** Nest ******
    For int1 = 0 To UBound(ar_id_and_jag)
        int_jag_cnt = UBound(ar_id_and_jag(int1)(1))
        For int2 = 0 To int_jag_cnt
            Debug.Print ar_id_and_jag(int1)(0) & " " & ar_id_and_jag(int1)(1)(int2)
        Next int2
    Next int1
End Sub
```


```Debug.print
id123 2029/12/26
id123 2029/12/28
id123 2029/12/29
id123 2029/12/31
id456 2030/1/1
id456 2030/2/1
```
singularity コンテナ内の venv 環境でプロンプトを便利にする

https://zenn.dev/terrari/articles/b5ffa2950e121b

venv 環境にいるとき、プロンプトの表示がよくない。
```sh
export PS1='...'
```
を venv 環境になると実行するようにする。

OmegaFold を Singularity コンテナ内でインストールするところに以下の作業を追加で行った。

```sh
vi ./init_prompt.sh
```
などとして以下のシェルスクリプトを作成した。

```sh
function virtualenv_info(){
    # Get Virtual Env
    if [[ -n "$VIRTUAL_ENV" ]]; then
        # Strip out the path and just leave the env name
        venv="${VIRTUAL_ENV##*/}"
    else
        # In case you don't have one activated
        venv=''
    fi
    [[ -n "$venv" ]] && echo "($venv) "
}
# disable the default virtualenv prompt change
export VIRTUAL_ENV_DISABLE_PROMPT=1
VENV="\$(virtualenv_info)"
export PS1="${VENV}(\s) \u@\H: \w $ ";
```
このコードを source した。
```sh
source ./init_prompt.sh
```
Git で fatal: unsafe repository (XXXXXXXXX is owned by someone else) というエラーが出たときの対処

# はじめに
Git (Source Tree) でクローン先がネットワークドライブなどだと以下のようなエラーが出るときがある。

'git log' がコード 128 で終了しました : fatal: unsafe repository ('//XXXXXXXXX/YYYYYYYYY is owned by someone else) 
To add an exception for this directory, call:

git config --global --add sefe.directory '%(prefix)///XXXXXXXXXXX/YYYYYYYYY' （Z:\ZZZZZZZZ)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304109/d4ced5e1-3dfe-cb9f-8a04-f12c1e2cbad6.png)


# 原因
Gitの脆弱性対策で、Gitリポジトリフォルダの所有者が実行ユーザーである必要があるとのこと。
https://github.blog/2022-04-12-git-security-vulnerability-announced/

Windows のネットワークドライブなどを利用すると、共有元のローカルユーザと異なるので毎回発生する。

# 対処

ポップアップ画面の通りのコマンドを実行すればいいのだが、Windows では値の指定が「"」を利用しないといけない。

```batch
git config --global --add safe.directory "%(prefix)///XXXXXXXXX\YYYYYYY"
```

global セクションに追加されたかを確認する

```batch
git config --global --list
```
スーパーノードをパラメータで制御する(SPSS Modeler データ加工逆引き9-2)

# スーパーノードをパラメータで制御する

![スクリーンショット 2022-09-30 21.36.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/961a4793-b423-5fdb-5727-19468e4aaa1f.png)

## 1.想定される利用目的

・スーパーノードによる効率的なデータ抽出


## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/supernode_parameter.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-09-30 21.40.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/92fa225b-e071-7e53-d968-48f19fefefef.png)
＊逆引き9-01Aで利用したスーパーノードを含むストリームです。


スーパーノードをダブルクリックして編集し[パラメータの定義]ボタンを押します。
![スクリーンショット 2022-09-30 21.41.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/35bce375-7d30-ba56-0107-844d0ec2aa31.png)

以下のようにパラーメーターを定義します。
![スクリーンショット 2022-09-30 21.42.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/bb629625-b562-5d88-5c06-fe00eb07e6a4.png)

[OK]ボタンを押して、[ズームイン]ボタンを押します。
![スクリーンショット 2022-09-30 21.37.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/68c0439f-8ea3-cf2e-009b-1bb3752eaa9c.png)

a.利用するデータは以下の通りです。
![スクリーンショット 2022-09-30 21.45.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/3616f259-f516-0b6b-0be9-c263e913f8ac.png)

b.[条件抽出]ノードを編集します。定義済みの年月のパラメータを以下の要領で呼び出します。
![スクリーンショット 2022-09-30 21.44.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/c649e918-f108-7511-d727-4b76cdbd0c67.png)

c.[条件抽出]ノードを編集します。定義済みのカテゴリのパラメータを以下の要領で呼び出します。
![スクリーンショット 2022-09-30 21.44.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a36a61c8-0a8c-7c44-348e-feddb8311dcc.png)

赤枠の星印アイコンを押してズームアウトします。
![スクリーンショット 2022-09-30 22.06.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/3779171c-aa92-887b-eae0-d12fd64a02ff.png)

[テーブル]を実行します。年月とカテゴリが絞り込めています。
![スクリーンショット 2022-09-30 21.46.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e620b414-0043-d5f1-fd42-f55089550272.png)

#### 注意事項

CADSなどのバッチ処理では、ストリームパラメータ（逆引き9-3）でも同じことができます。

## 4.参考情報

#### スーパーノードを解説した記事

https://www.ibm.com/blogs/solutions/jp-ja/spssmodeler-push-node-20/

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
[ネタ]フォルダ内に入れた画像でデスクトップ壁紙をコマンドラインから次々変更する[デスクトッププレゼン]

# 概要

- 特定のフォルダに格納してある".png"の拡張子の画像を矢印キーやスペースキーで次々変えるコマンド書きました。
- 何かの参考になるかもしれないので、こちらに書いておきます。
- もしかして、デスクトップ壁紙でプレゼンしてみよう、と考える人が自分以外にもいるのであれば、使えるかもしれません。

# コード

## リポジトリ

こちらに、C#のコンソールアプリケーションのVisual Studioのソリューションファイルがあります。

[https://github.com/hrkt/DesktopPresentationCLI](https://github.com/hrkt/DesktopPresentationCLI)


## 画像をデスクトップに貼るところ

こちらのサイト（[https://www.codeproject.com/Questions/1252479/How-do-I-change-the-desktop-background-using-Cshar](https://www.codeproject.com/Questions/1252479/How-do-I-change-the-desktop-background-using-Cshar)）にあったコードをそのまま拝借しました。

## キーを受け付けるところ

こんな感じで、いくつかのキーを受け付けることにしました。

```C#
while (true)
{
    var ch = Console.ReadKey(false).Key;
    switch (ch)
    {
        case ConsoleKey.Escape:
            Environment.Exit(0);
            break;
        case ConsoleKey.RightArrow:
        case ConsoleKey.Spacebar:
        case ConsoleKey.DownArrow:
            pageIndex = getNextPage(pageIndex, files);
            DisplayPicture(Path.Combine(presentationDir, files[pageIndex]));
            break;
        case ConsoleKey.LeftArrow:
        case ConsoleKey.UpArrow:
            pageIndex = getPreviousPage(pageIndex, files);
            DisplayPicture(Path.Combine(presentationDir, files[pageIndex]));
            break;
    }
}
```

## 前提

以下の環境で書きました。

- Windows 11 Pro 64bit
- Visual Studio 2022 Community Edition

試してはいませんが、Windows10でも動きそうな気がします。

## おわりに

書いて動かしてみて、以下のような所感を持ちました。

いいところ
- ターミナルからデスクトップ画像をカーソルキーで変えるのは単純に面白い

微妙なところ
- デスクトップ壁紙でプレゼンしてみようと思ったが、最前面に出ているターミナルが微妙に邪魔。いい感じでちっちゃくすることには現在は限界がある。
    - Windowsターミナルで背景色透明にするなどの工夫はできるものの
stella_vslam チュートリアル

## 概要

Ubuntu 18.04 で stella_vslam (https://github.com/stella-cv/stella_vslam) のチュートリアルを動かしたので手順を記録しておきます。

参考：https://stella-cv.readthedocs.io/en/latest/simple_tutorial.html

## ビルド

stella_vslam とそのビューア用のDockerイメージをビルドする。（docker のバージョンは 20.10.12 でした。）

```shell
git clone --recursive https://github.com/stella-cv/stella_vslam.git
cd stella_vslam
git checkout 0.3.7
docker build -t stella_vslam-socket -f Dockerfile.socket .
cd viewer
docker build -t stella_vslam-viewer .
```

## Viewer のサーバ用コンテナを起動

Viewer のサーバ用のコンテナを起動する。

```shell
docker run --rm -it --name stella_vslam-viewer --net=host stella_vslam-viewer
```

## Viewer のクライアントを起動

`http://localhost:3001` をwebブラウザで開く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472745/ea8951c3-49b8-7dd6-8e37-acb31fc3b9fb.png)

## stella_vslam 実行用のコンテナを起動

別のターミナルを開いて、stella_vslam 実行用のコンテナを起動する。

```shell
docker run --rm -it --name stella_vslam-socket --net=host stella_vslam-socket
```

## データセット等のダウンロード

起動した stella_vslam 実行用のコンテナの中にデータセット等をダウンロードする。

```shell
apt update
apt install -y python3-pip
pip3 install gdown

curl -sL "https://github.com/stella-cv/FBoW_orb_vocab/raw/main/orb_vocab.fbow" -o orb_vocab.fbow

gdown "https://drive.google.com/uc?id=1d8kADKWBptEqTF7jEVhKatBEdN7g0ikY"
gdown "https://drive.google.com/uc?id=1TVf2D2QvMZPHsFoTb7HNxbXclPoFMGLX"
unzip aist_living_lab_1.zip
unzip aist_living_lab_2.zip
```

## SLAM 実行

stella_vslam-socket のコンテナに戻って、以下を実行する。

```shell
./run_video_slam -v ./orb_vocab.fbow -m ./aist_living_lab_1/video.mp4 -c ../example/aist/equirectangular.yaml --frame-skip 3 --no-sleep --map-db-out map.msg
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472745/a936bc03-28f2-74d2-1437-29036feaa21b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472745/95dfc1ac-9f77-09b8-6fec-4f6ab9af580b.png)

Viewer の Terminate ボタンを押すと、地図を保存して run_video_slam が終了する。

## Localization 実行

保存した地図を使って自己位置推定を行う。

```shell
./run_video_slam --disable-mapping -v ./orb_vocab.fbow -m ./aist_living_lab_2/video.mp4 -c ../example/aist/equirectangular.yaml --frame-skip 3 --no-sleep --map-db-in map.msg
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472745/cc33511e-3ba5-af44-4aba-448878698c84.png)
Cosmos DB - Azure - Memo

# 概要
(自分用メモ)
CosmosDBをデプロイし、ローカルのNode.jsアプリから読み書き。
[Azureクイックスタート](https://learn.microsoft.com/ja-jp/azure/cosmos-db/mongodb/quickstart-nodejs?tabs=azure-cli%2Clinux)追試

- [総目次](https://qiita.com/shokkaa/private/7a1633dbf58ddc81f894)
- [目次: Azure Development](https://qiita.com/search?sort=&q=tag%3AAzure+tag%3Adevelopment+user%3Ashokkaa)

# 前提

https://qiita.com/shokkaa/items/e38803a481b9df33ee7a

https://qiita.com/shokkaa/items/6f83b3a107006ccc598b

# Azureクラウド上のリソース確保
```sh:IDなど設定(好きに)
resourceGroupName=gxx
location="westus"
accountName="myDatabaseId"  # 他人と被らないよう
```

```sh:Azure上にリソース確保
az group create -n $resourceGroupName --location $location
az cosmosdb create -g $resourceGroupName -n $accountName --locations regionName=$location --kind MongoDB --capacity-mode Serverless
```
Mongo API / Serverless プラン

# 依存モジュール追加
```
npm install mongodb dotenv
```

```json:package.json - 記述を確認
  "dependencies": {
    // ...中略...
    "dotenv": "^16.0.3",
    "mongodb": "^4.10.0"
  }
```

```json:tsconfig.json - ソースコードフォルダ、生成フォルダなど設定
{
  "compilerOptions": {
    // ....
+    ,"sourceMap": true
+    ,"outDir": "./build"
  },
+ ,"include": ["src/**/*"]
}
```
[tsconfig.json](https://github.com/kyoya-p/samples/blob/c63f343bf15bab82e32d0cbf5ea55af8df167a27/2022/AzureSamples/CosmosDB/tsconfig.json)

# サンプルコード
[src/index.ts](https://github.com/kyoya-p/samples/blob/c63f343bf15bab82e32d0cbf5ea55af8df167a27/2022/AzureSamples/CosmosDB/src/index.ts)

サンプルデータをクラウド上のMongoDBに登録し、idとnameで検索する。
```json:サンプルデータ
{
  "name":"Yamba Surfboard-45",
  "category":"gear-surf-surfboards",
  "quantity":12,
  "sale":false
}
```


# ビルドと実行
```sh:環境変数にPrimary接続文字列を格納
sudo apt install -y jq  # https://jqlang.github.io/jq/
x=az cosmosdb list-connection-strings --resource-group $resourceGroupName --name $accountName
export COSMOS_CONNECTION_STRING=`echo $x|jq -r '.connectionStrings[]|select(.keyKind=="Primary").connectionString'`
```

```sh:ビルドと実行
npx tsc && node build/index.js
```

Azure Portal ➜ リソースグループ gxx ➜ myacc ➜ データエクスプローラ ➜ 
 Adventureworks ➜ producs ➜ Document にドキュメントが格納されていることを確認


# 参照

https://learn.microsoft.com/ja-jp/azure/cosmos-db/mongodb/quickstart-javascript?tabs=azure-cli%2Clinux
Open3d セットアップと材料吟味(社内限定公開解除)

# 0. 作業の概要

:::note info
インフォメーション
２０２２年死蔵データの復活プロジェクトの取っ掛かりです。
:::

* リアルタイム測定描画ができる本モデルの基礎情報の過不足の確認

## 作業環境

* Ryzen5 3600 x DDR4 32GB
    * RTX3600
    * Driver 515
    * CUDA11.5,cuDNN8.4,TensorRT8.4
    * Ubuntu 22.04
    * Anaconda仮想環境(Python3.7.10)

# 1. セットアップ

* 下記制限があったが、他のモデルの仮想環境を流用した事を注記する。

:::note warn
注意点
* Tensorflow 2系にすべき
* Pytorch 1.8.x 但し、今回はデモサンプルのみの動作の為1.12で問題ない。
* TensorRT8.x CUDAのバージョンにあったマイナーバージョン選択の事。 
* Nvidia Driver、CUDA、cuDNN：それぞれ依存関係にあるので適応するバージョンで固める事。

:::

* 今回は手軽にバイナリをpipパッケージで導入

```Ubuntu:ターミナル画面

pip install open3d

```

* ライセンスはMITライセンスで利用にある程度の融通が利く。
    * また、LiDAR、RGBDカメラにも対応しているとのことであるが、
    * 機材がないためセットアップとサンプルの使用の注意点を上げておく。

:::note info
インフォメーション

* 0.15 においても python3のバージョン選択が重要
・特に2つのテンソルTensorflow、 Pytorchのバージョン依存が厳しい。
Python3.7以上では上記のパッケージの制限バージョンに合わせられない為、
3.6でセットアップすべき。

:::

## 2.サンプル動作確認

*公式にある基本的なモデルは概ね動作可能


https://youtu.be/rwANV-2pMAQ



:::note warn
注意
冒頭記載の通り、Tensorboard(Tensorflow,Pytorch使用)のサンプルは動作しなかった。

:::

```Ubuntu:実行結果

#torch:ファイル不明（入ってない）
libcufile-dev-11-7 libcurand-11-7 libcurand-dev-11-7 libcusolver-11-7 libcusolver-dev-11-7
  libcusparse-11-7 libcusparse-dev-11-7 libegl-mesa0:i386 libegl1:i386 libgbm1:i386 libgles2:i386
  libnpp-11-7 libnpp-dev-11-7 libnvjpeg-11-7 libnvjpeg-dev-11-7 libopengl0:i386 libtinfo5
  libwayland-server0:i386 libxcb-xinerama0 nsight-compute-2022.2.1 nsight-systems-2022.1.3 nvidia-modprobe
Use 'sudo apt autoremove' to remove them.


#Tensorflow torchでも出るはずだが、対応のカメラ接続されていない。
[Open3D WARNING] No RealSense devices detected.
^C

```

## 3.もしRealsenceを使用するなら(今後の課題)

***

* サンプルエラーの原因の一つにデバイスがある
    * リアルタイム3D病が処理にはLiDRカメラ、もしくはRGBDカメラが必須。
    * デバイスに必要な仮想環境を用意しておく。

# 社内で放置され、死蔵プロジェクトとなっている。
- これの考えを活かしていくなるら３Dマッピングできるソリューションと組むべき
- Realsenceでは所詮撮影範囲がみ実家すぎる。
- 今後はより広く、顧客ニーズに答えられるように新しい製品やソフトウェアを取り入れていくべき
-
Databricksのパーソナルコンピュートリソースを作成する

[Create a Personal Compute resource \| Databricks on AWS](https://docs.databricks.com/clusters/personal-compute.html) [2022/10/7時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

:::note info
**注意**
パーソナルコンピュートのデフォルトポリシーは、2022/10/10の週以降、すべてのプレミアム、エンタープライズプランのワークスペースでロールアウトされます。
:::

**パーソナルコンピュート**は、すべてのDatabricksワークスペースで利用できるDatabricks管理のデフォルト[クラスターポリシー](https://docs.databricks.com/administration-guide/clusters/policies-best-practices.html)です。このポリシーを用いることで、ユーザーは個人で利用するためのシングルマシンの計算資源を簡単に作成することができ、すぐにワークロード実行を開始し、計算資源管理のオーバーヘッドを最小化することができます。

パーソナルコンピュートのリソースは、以下のプロパティを持つall-purposeクラスター(課金は[all-purposeクラスター料金](https://www.databricks.com/jp/product/aws-pricing)に準拠します)です。

- パーソナルコンピュートのリソースは[シングルノードのクラスター](https://qiita.com/taka_yayoi/items/6e7c6cc14a5017ef6d15)です(すなわち、ワーカーを持たない「クラスター」であり、ローカルモードでSparkが動作します)。
- これらはsingle user[クラスターアクセスモード](https://docs.databricks.com/clusters/create-cluster.html#access-mode)であり、Unity Catalogとの互換性があります。
- 最新バージョンの[Databricks機械学習ランタイム](https://qiita.com/taka_yayoi/items/824b507019d3ade7eedc)を使用します。
- 標準インスタンスとGPU有効化インスタンスを使用することができます。
- [自動停止](https://qiita.com/taka_yayoi/items/991aae376c089df58504#%E8%87%AA%E5%8B%95%E5%81%9C%E6%AD%A2)は無効になっています。

:::note info
**注意**
クラスターを作成する際にパーソナルコンピュートのポリシーが表示されない場合、ポリシーへのアクセス権が付与されていません。管理者にパーソナルコンピュートのポリシーへのアクセスの付与を依頼してください。
:::

コンピュートページあるいはノートブックから直接パーソナルコンピュートクラスターを作成することができます。

# ノートブックからパーソナルコンピュートのリソースを作成する

3ステップでノートブックからパーソナルコンピュートリソースを作成することができます。

1. ノートブックの上部にある**Connect**ボタンをクリックします。
1. **Create new resource…** をクリックします。パーソナルコンピュートポリシーが選択された状態でダイアログが開きます。
1. **Create**をクリックします。


# コンピュートページからパーソナルコンピュートのリソースを作成する

**Compute**ページにはパーソナルコンピュートリソースを作成するショートカットボタンがあります。

1. サイドバーの![](https://docs.databricks.com/_images/clusters-icon.png)**Compute**をクリックします。
1. **Create Personal Compute**をクリックします。パーソナルコンピュートポリシーが選択された状態でダイアログが開きます。
1. **Create Cluster**をクリックします。

クラスターが起動すると、パーソナルコンピュートリソースを利用できる様になります。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
コントラクトのデプロイ時にunknown transaction override _hex エラー

## hardhatでコントラクトのデプロイ時に以下のエラーが出る場合

```shell
Error: unknown transaction override _hex
    at ContractFactory.getDeployTransaction (./node_modules/@ethersproject/contracts/src.ts/index.ts:1194:27)
    at ContractFactory.<anonymous> (./node_modules/@ethersproject/contracts/src.ts/index.ts:1244:53)
    at step (./node_modules/@ethersproject/contracts/lib/index.js:48:23)
    at Object.next (./node_modules/@ethersproject/contracts/lib/index.js:29:53)
    at fulfilled (./node_modules/@ethersproject/contracts/lib/index.js:20:58)
    at processTicksAndRejections (internal/process/task_queues.js:95:5)
```

`deploy()`でコントラクトに渡すコンストラクタへの引数が間違ってないか確認する。

```ts
  const Verifier = await ethers.getContractFactory("Verifier20");
  const v = await Verifier.deploy();
```
【Python】Jupyterでpandasのdf（DataFrame）の中身を全て表示する方法

## 背景
- Jupyter NotebookやJupyter Labでは、pandasのdf（DataFrame）の中身を表示されることがよくあります。
- デフォルトでは、最大表示行列数が指定されているため、dfが省略表示され中身が確認できないことがあります。
- この記事では、Jupyterでdfの中身を全て表示する設定の方法を紹介します。

## 目標
- Jupyterでpandasのdf（DataFrame）の中身を全て表示できるようになる。

## `pd.set_option`を使用し表示数の上限を変更
- dfの表示数は、pandasの設定値の一部となっています。
- 添付の画像のように、`pd.set_option`を使用することでdfの表示の上限を変更できます。

```python:dfの表示数の上限を撤廃する設定コード
#行の表示数の上限を撤廃
pd.set_option('display.max_rows', None)

#列の表示数の上限を撤廃
pd.set_option('display.max_columns', None)
```

![df_all_show.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2651220/0a8e3d7a-0eb0-8bfa-119d-4f274efa6402.png)


## 参考資料

https://kakakakakku.hatenablog.com/entry/2021/04/19/090229

## 個人ブログ

https://takuma-tech.com/2022/10/13/0028_q_0042_%e3%80%90python%e3%80%91jupyter%e3%81%a7pandas%e3%81%aedf%ef%bc%88dataframe%ef%bc%89%e3%81%ae%e4%b8%ad%e8%ba%ab%e3%82%92%e5%85%a8%e3%81%a6%e8%a1%a8%e7%a4%ba%e3%81%99%e3%82%8b%e6%96%b9/
JavaScriptとは？

JavaScript
JavaScriptはWebブラウザ上で動くプログラミング言語です。 
文章構造→HTML、装飾→CSSとともに、Webページを構築する上でとても重要な要素がJavaScripです。

例えば一例として、次のようなことが実現できます。
・ページ遷移せずに、画面の一部だけを切り替える
・HTMLの要素をアニメーションさせる
・フォームを操作する
・日付や時間を扱う
・時間に応じて背景を変化させる
・ユーザーのアクションに伴って処理を行う

JavaScriptは[JS]と訳すことがある。


『ライブラリ・フレームワーク』
JavaScriptにはさまざまなライブラリやフレームワークが存在しています。
『ライブラリ』
・汎用性の高い複数のプログラムを再利用可能な形でひとまとまりにしたもの。「こういう動きをJavascriptで作りたい」という時に、一から全て自分で書くのではなく、完成されたプログラムを使い回すイメージ。

『フレームワーク』
・「枠組み」や「骨組み」。「JavaScriptの開発を楽にするために用意された枠組み」と言えるでしょう


代表的なライブラリ（フレームワーク）
・jQuery
・React
・Angular
・Vue.js
　　　　　　...などがある。

これらの代表的なライブラリ（フレームワーク）はJavaScriptを理解できなければしっかりと使いこなすことはできない。
【Swift】文字列にNGワードが含まれているか配列で確認するコード

入力値にNGワードが含まれているか配列で確認するコード

## 前提
NGワードの文字列の配列があり、
入力値などの、とある文字列がそれらを1つ以上含んでいるか確認したい

一見`contains`を使えば良さそうにも思えるが、NGワードの配列の要素を1つづつ確認するには繰り返し処理を使わなければならない。

## 解決策

`allSatisfy`を使う

```swift
// NGワードの配列
var prohibited_words : [String] = []

// 入力値など
var value = textLabel.text

if self.prohibited_words.allSatisfy({ !value.contains($0) }){
    // NGワードが1つも含まれていなかった場合の処理
}
else{
    // NGワードが1以上含まれていた場合の処理
}
```
`allSatisfy`は配列の全ての値が条件を満たすか判定するメソッド

https://developer.apple.com/documentation/swift/array/allsatisfy(_:)

## Swiftのお役立ち情報

https://wagtechblog.com/programing/swift-iphone-application-school

https://wagtechblog.com/programing/swift-textbook.html
Webアプリのディレクトリ構成_MVC

簡単なWebアプリを元にMVCを理解する。

**ディレクトリ構成**
プロジェクト名/
│  │  │  │  │  │       ┣.gradle
 │ │ │ │ │ │           ┣idea
 │ │ │ │ │ │           ┣build
│ │ │ │ │ │            ┣gradle
│ │ │ │ │ │            ┗src/
│ │ │ │ │ │ │ │                ┣main/
│ │ │ │ │ │ │ │ │ │                     ┣java/
 │ │ │ │ │ │ │ │ │ │ │ │                         ┣pkg_name/
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │                                    ┣pkg_entity(M:データの編集・管理を行う)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ┣web/(Ｃ：コントローラーを作成) 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │  ┣ pkg_controller
│ │ │ │ │ │ │ │ │ │ │ │ ┣mainApp                                 
│ │ │ │ │ │ │ │ │ │                     ┣resources/ 
 │ │ │ │ │ │ │ │ │ │ │ ││││                          ┣static
 │ │ │ │ │ │ │ │ │ │ │ ││││  ┣templates/(V:UIとロジックを分ける)
│ │ │ │ │ │ │ │ │ │ │ ││││ │││││┣fragments/
│ │ │ │ │ │ │ │ │ │ │ ││││ ││││││││││┗layout.html
│ │ │ │ │ │ │ │ │ │ │ ││││ │││││┣title/
│ │ │ │ │ │ │ │ │ │ │ ││││ ││││││││││┗index.html
 │ │ │ │ │ │ │ │ │ │ │ ││││  ┣apprication.properties
 │ │ │ │ │ │ │ │ │ │ │ ││││  ┣data.sql
 │ │ │ │ │ │ │ │ │ │ │ ││││  ┣schema.sql
│ │ │ │ │ │ │ │                ┣test/
│ │ │ │ │ │ │ │            ─.gitignore
│ │ │ │ │ │ │ │            ─build.gradele(spring initializrで依存性を追加していく)
│ │ │ │ │ │ │ │            ─gradlew
│ │ │ │ │ │ │ │            ─gradlew.bat
│ │ │ │ │ │ │ │            ─HELP.md
│ │ │ │ │ │ │ │            ─setting.gradle


MVC
M:データの編集・管理を行う。
V:UI、リクエストを受け付ける・レスポンスデータを表示する画面。
C:コントローラーにメソッドを定義し、リクエストと紐付ける。紐付けられたメソッドでレスポンスに必要なデータを生成する。コントローラに紐付けられたメソッドをハンドラーメソッドとも呼ぶ。
EnTAP の実行と結果の解釈

[EnTAP のセットアップ](https://t.co/i8uwx73AUg) が終わったら、あとは実行するだけである。

# １．アノテーションされた遺伝子のタンパク質配列を用意する
`gffread` を使うと、ゲノムの fasta と gff ファイルから簡単に転写産物や翻訳産物の fasta を得ることができる。
インストールは `mamba install gffread` で。使い方は、
```
gffread -g GENOME.fasta -t TRANSCRIPTS.fasta -x CDS.fasta -y PROTEINS.fasta final_annotation_1.gff 
```
-g でゲノムの fasta ファイルを、オプションなしで gff ファイルを指定。-t で転写産物 (mRNA) の fasta が書き出されるファイル名を、-x でUTRを除いた CDS の配列だけの fasta が書き出されるファイル名を、-y でタンパク質の fasta が書き出されるファイル名を指定。とりあえずタンパク質の fasta だけが欲しい場合は、以下のようにすればOK。
```
gffread -g GENOME.fasta -y PROTEINS.fasta final_annotation_1.gff
```
同様に、転写産物の fasta だけを書き出させることも可能。

あと、先に `samtools faidx GENOME.fasta` をしておくと動作が速くなる。

# ２．EnTAP の実行
```
conda activate ENTAP
~/local/EnTAP/bin/EnTAP --runP -i PROTEINS.fasta \
 -d ~/local/EnTAP/bin/uniprot_sprot.dmnd \
 -d ~/local/EnTAP/bin/uniprot_tremble.dmnd \
 -d ~/local/EnTAP/bin/plants.dmnd \
 -t 16 \
 --ini ~/local/EnTAP/entap_config.ini
```
膨大な数の相同性検索が行われるわけだが、多分１日くらいで終わる。diamond という爆速ツールの恩恵を噛み締めよう。

結果は `entap_output` というディレクトリに書き出されるが、その中の `final_results` に `final_annotations_lvl0.tsv` あるいは `final_annotations_lvl1.tsv` というファイルに用がある。レベル０とか１とかいうのは Gene Ontology のレベルの話なので、余計なアノテーションを除去する今回の目的においてはどちらの tsv ファイルでもよい。コンタミがどうの的なファイルも出てくるがとりあえず無視してよい。中身についての詳しい説明もしない。Excelでも開けられるので、各自結果を眺めながら自習すること。フィルターとして重要なのは 29 列目の `EggNOG Tax Scope` という項目で、私の場合はここが `Viridiplantae` または `Eukaryotes` とされたものだけを残すことにしている。そうすると2倍体植物なら３万強の遺伝子が残るはずだ（欲張りな人はここが空欄になったものだけを捨てればよいのではないかな）。
```
cat final_annotations_lvl0.tsv | grep -e "Viridiplantae" -e "Eukaryotes" | cut -f 1 > filtered_genes_list.txt
```
これで余計にアノテーションされた遺伝子を除いた遺伝子リストができるので、final_annotations_1.gff からそれらだけを抽出する。

```
cat final_annotations_1.gff | grep -f filtered_genes_list.txt > ANNOTATIONS.gff
```

これで玄人っぽいゲノムアノテーションが得られるというわけ。

# 関連
- [ゲノムアノテーション（目次）](https://qiita.com/drk0311/items/c024888962f840e3ce3e)
- [RepeatModeler/RepeatMaskerを使ってゲノムにSoftmaskを掛ける](https://qiita.com/drk0311/items/cba7958319737a1f12c0)
- [BRAKER2のインストール](https://qiita.com/drk0311/items/a3ac648f2780cfee57b1)
- [BRAKER2を使ってタンパク質コード領域を予測する](https://qiita.com/drk0311/items/0263691a7cc4dcb0c33c/)
- [RNA-seq のノイズを除去してゲノムにマッピングする](https://qiita.com/drk0311/items/56715d46dc7893c95f78)
- [Gffcompare を使ってGeMoMaとBrakerの差分を取り、アノテーションを補完する](https://qiita.com/drk0311/items/7c9910f12a2a959c710d)
- [EnTAP の セットアップ](https://t.co/i8uwx73AUg)
"git commit"でコミットメッセージを保存する際に毎回叩く":wq"とはなんなのか。

はじめに
--
git commitを"-m"オプションをつけずに叩くと、設定したエディタが起動されてコミットメッセージを入力できる様になります。
コミットメッセージを入力し終わった際に":wq"を叩いて終了していたのですが、":wq"って何？と聞かれたらちゃんと答えられないなと思ったので調べたことを備忘録として残そうと思います。

":wq"はVimのコマンド
--
僕がgit commit時に起動されるエディタは"Vim"というものです。
":wq"は、`":w"`と`":q"`というVimの二つのコマンドを同時に実行する、という意味でした。

下記の様に書くコマンドは動作します。
":wq"は保存(:w)して終了(:q)するというとてもシンプルなコマンドだったんですね。

|コマンド|どのように動作するか|
|:--:|:--:|
|:w|保存(今回だと入力したコミットメッセージを保存)|
|:q|終了(:q!で強制終了)|
|:wq|保存して終了|

終わりに
--
おまじないのようにコマンドを毎回叩いていましたが、意味がわかってないままに使っているコマンドやメソッドを少しづつ減らしていきたいと思いました。

参考
--

https://qiita.com/pe-ta/items/0510bee10bcfd88afeee
LuaバイトコードHeader (ver. 5.1~5.3)

# 説明
この記事はLuaのバイトコードの先頭にあるHeaderブロックにどのような情報が含まれているかを、Luaのバージョンごとに集めてあります。(ver 5.4以降は記載がありませんが、以下参考文献のgithubを見ていただければ自力で探すことが可能と考えます。）

# 注意
Luaのバイトコードは仕様が明文化されてきたわけではないため、例えばマイナーバージョンごとに仕様が異なる可能性もあります（調べた範囲ではそのような言及は見られませんでしたが。）
またこれは記事を読む上での注意事項ですが、ブロックの先頭バイトをアドレス0x01ではなく0x00として記載しているため、C言語の配列のように0x01は2番目のバイトになります。

# 参考文献 (special thanks to...)
* https://nymphium.github.io/pdf/tsukubalua.pdf
* https://nymphium.github.io/pdf/tsukubapm3-luavm.pdf
* https://openpunk.com/pages/lua-bytecode-parser/
* [github:lua/ldump.cのdumpheader関数](https://github.com/lua/lua/blob/v5.4.0/ldump.c#L197) ←一番確実なソース
    * これはLua v5.4だが、他のバージョンでもDumpHeader関数を参照すればheaderの中身はわかる。
    * このファイル自体かなりバイトコードを読む上では重要で、例えばDumpFunction関数にはFunctionを格納する際にどのようなバイト列が生成されるかが書いてある。（DumpHeader関数と見比べれば読み方はわかるはず...）


# Lua ByteCode header (Lua v5.1)
最初の12バイト (0x00-0x0a) がヘッダー。
![header解釈.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581287/986f9255-d0d9-ed03-0be3-dea87ca33e9e.png)
[ソース](https://openpunk.com/pages/lua-bytecode-parser/)

# Lua ByteCode header (Lua v5.2)
最初の18バイト (0x00-0x11) がヘッダー。
例）1B 4C 75 61 52 00 01 04 08 04 08 00 19 93 0D 0A 1A 0A
* 0x0000-0x0003 (4bytes):シグネチャ（[ASCII文字](https://e-words.jp/p/r-ascii.html)で"\Lua"）
    * これによりLuaがbytecodeであると解釈する
* 0x0004 (1byte):Luaのバージョン。上記例では0x52なので5.2を表す。
* 0x0005 (1byte):フォーマットのバージョン：0x00=official。他はないはず。
* 0x0006 (1byte):エンディアンフラグ（0x00=ビッグエンディアン、0x01=リトルエンディアン）
* 0x0007 (1byte):sizeof(int)
* 0x0008 (1byte):sizeof(size_t)
* 0x0009 (1byte):sizeof(Instruction)
* 0x000a (1byte):sizeof(lua_Number)
* 0x000b (1byte):整数フラグ(0 = 整数を少数として保持（デフォルト）, 1 = 整数型として保持)
* 0x000c-0x0011 (4bytes):テスト用データ --> 0x19939D9A（LUAC_DATA）

[ソース](https://nymphium.github.io/pdf/tsukubapm3-luavm.pdf)

# Lua ByteCode header (Lua v5.3)
最初の33バイト (0x00-0x20) がヘッダー。
例）1B 4C 75 61 53 00 19 93 0D 0A 1A 0A 04 04 04 08 08 78 56 00 00 00 00 00 00 00 00 00 00 00 28 77 40
* 0x0000-0x0003 (4bytes):シグネチャ（[ASCII文字](https://e-words.jp/p/r-ascii.html)で"\Lua"）
    * これによりLuaがbytecodeであると解釈する
* 0x0004 (1byte):Luaのバージョン。上記例では0x53なので5.3を表す。
* 0x0005 (1byte):フォーマットのバージョン：0x00=official。他はないはず。
* 0x0006-0x000b (6bytes):テスト用データ。みんな同じで0x19939D9A1A0A（[LUAC_DATA](https://github.com/lua/lua/blob/v5.3/lundump.h#L16)）
* 0x000c (1byte): sizeof(int)
* 0x000d (1byte): sizeof(size_t)
* 0x000e (1byte): sizeof(Instruction)
* 0x000f (1byte): sizeof(lua_Interger)
* 0x0010 (1byte): sizeof(lua_Number)
* 0x0011-0x0018 (8bytes): 整数変換テスト用データ    --> 0x785600..00 (リトルエンディアンなので実体は[0x5678](https://github.com/lua/lua/blob/v5.3/lundump.h#L18)）
* 0x0019-0x0020 (8bytes): 少数変換テスト用データ    --> 0x00..287740（IEEE754倍精度, 実体は[370.5](https://github.com/lua/lua/blob/v5.3/lundump.h#L19)）

[ソース](https://github.com/lua/lua/blob/v5.3/ldump.c#L184)
WindTermの紹介


最近使用してみて便利でしたが
日本語でWindTermの紹介がされていないようなので紹介します。

![windterm_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41003/cd6471ba-5ec8-e44a-36a0-8fb752527f7f.png)

https://kingtoolbox.github.io/

## WindTermは何？
ターミナルソフトの一種です。
コマンドターミナルとして、cmd.exeやpowershell、bashをローカルで使用したり、
SSHやtelnet接続も可能なものです。

私自身はTeraTermやRloginを使用していたのですがより使い勝手の良いものを探していました。
ターミナルソフトで探すと[Alacritty](https://alacritty.org/ "Alacritty")や[Wezterm](https://wezfurlong.org/wezterm/ "Wezterm")や[Warp](https://www.warp.dev/ "Warp")が見つかるのですが私の要望とは少し違ってました。
これらのソフトですと、SSHはwindowsのSSHコマンドを利用することになり、SSH自体の設定をconfigファイルを作って行う必要があります。


## 気に入った点
### 機能を一画面に集約している
デフォルト画面構成でもSFTPでのファイル操作やコマンド履歴など便利機能が見て取れます。
なんかか接続先のメモリ使用量やCPU使用率まで表示されてたり。
ごちゃごちゃして嫌だという方もいるかと思いますが表示のカスタマイズは当然可能です。

![windterm_003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41003/150857c9-9e6d-256a-1cb0-9b7525873c0f.png)

### ポータブル対応
設定ファイルを実行ファイルの配下におけます。
これによってGoogle Driveで設定の同期が可能です。

![windterm_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41003/34311c6a-8c44-3d2e-9200-54df6cfb8e57.png)

### opensshのconfigを利用できる
さらにputtyの接続先も利用できますし、Windtermの設定として接続先が設定可能です。

### 早いらしい
GithubによるとSFTPの速度がFilezillaやWinSCPより早いらしい

https://github.com/kingToolbox/WindTerm

さらに画面の転送速度の速さも謳っている。
実際使用してみてもキビキビ動いています。

## 気に入らなかった点

### 日本語が機械翻訳

キャプチャを見ても分かる通り日本語は機械翻訳っぽい感じ。
リソースファイルとか見当たらなかったけど、どうやって翻訳すればよいのだろう？
やり方わかる方教えて欲しい.

### 身近に使用者がいない

私自身使い方がまだわからない部分が多い。
この記事で増えるといいな。

## まとめ

あんまり知られてなさそうなので広まって知見が集まると嬉しい。
自分も気づいたら記事を上げるようにしたい。
Google ColaboratoryでTwitter APIを動かしてみた

## 背景

Twitter APIを利用する方法を調べていると、Tweepyというライブラリで簡単に実装できたので紹介します。
Google Colaboratoryで実行し環境構築も楽なのでおすすめです。
##### 今回はAPIでユーザー名、ツイート日時、位置情報、ツイート文を取得しcsvファイルで保存します。

## 前提

TwitterDeveloperの申請を行いAPIを呼び出せる準備が整っていることを前提にします。
申請方法は他の記事をご覧ください。

## Google Colaboratoryでtweepyをインストール

    pip install tweepy

次に特定のワードを含むツイートの取得するコードが下記になります。
api_key、api_secret、access_token、access_secretはそれぞれTwitter Developer Platform上で確認できる各自のキーを入力してください。

```python:twitterAPI.py
    import tweepy
    import csv
    from collections import namedtuple
    from datetime import timedelta # 日本時間に直すために使用
    
    api_key = ''
    api_secret = ''
    access_token = ''
    access_secret = ''
    
    auth = tweepy.OAuthHandler(api_key,api_secret)
    auth.set_access_token(access_token,access_secret)
    api = tweepy.API(auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True) # ツイート取得の制限になった場合に15分中断する
    
    fetch_date = "07-01" # ツイートを取得する日を設定(例)7月1日の時 07-01
    
    word = '-bot -RT テスト　since:2022-%s_00:00:00_JST until:2022-%s_23:59:59_JST' % (fetch_date, fetch_date)
    maxid = 0
    
    f = open('twitterAPI_%s.csv' % fetch_date, 'w',encoding='UTF-8')
    tweetDataList = []
    
    while True:
        result = api.search(q=word, lang='ja', count=100, max_id=maxid)
        print(len(result))
        if len(result)==0:
            break
        for res in result:
            maxid = res.id-1
            sc_name = res.user.screen_name # @ユーザー名
            name = res.user.name # プロフィール名
            desc = res.user.description # 自己紹介文
            text = res.text.replace('\n', '') # ツイート文
            datetime = res.created_at + timedelta(hours=9) #　日本時間に変換
            location = res.place # 位置情報
    
            if 'bot' in name.lower() or 'bot' in desc.lower(): # 紹介文と名前にBOTを除く
                continue
    
            tweetDataList.append([f'{sc_name}', f'{datetime}', f'{location}', f'{text}'])
    
        print(datetime)
    
    writer = csv.writer(f,  lineterminator="\n")
    writer.writerow(["sc_name", "datetime", "location", "text"])
    writer.writerows(tweetDataList)
    
    f.close()

```

このコードでは'テスト'というキーワードを含むツイートの取得ができます。
キーワード部分を変更することで複数のワードを含むツイートの検索も可能です。
（例）
・'野菜'と'価格'の2つのキーワードを含むツイートを検索
##### 野菜 AND 価格
・'野菜'または'価格'のいずれかのキーワードを含むツイートを検索
##### 野菜 OR 価格


ツイート数が多いキーワードの場合実行に時間がかかるため、テストで行う場合はツイート数の少なそうなワードにするか、日付の部分を00:00:00　→　23:00:00等に変更すると1時間分のツイートだけ取得できます。
スコープ内外のお決まりについて（グローバル変数を添えて）

## はじめに
非常に簡単ではあるが改めてスコープの範囲についてまとめる。

## 結論
- スコープにはアクセスできる範囲とできない範囲がある。
- {} ← スコープとはコレのことである。
- スコープ外にアクセスするにはグローバル変数などにする必要がある。
## 詳細
- スコープ内の変数や定数はスコープ内でのみアクセス可能
スコープ内の定数numはスコープ内でのみアクセス可でき、print関数で出力可能。それとは逆にスコープ外でのアクセスやprint関数で出力しようとも出力は不可能である。（スコープ外だと定数numは破棄される）
```swift:Swift
for i in 1...10 {
    //スコープ内の定数
    let num = i
    print(num)
}
num //スコープ外のためnumは出力されない（numは破棄される）

```
- スコープ外の変数や定数はグローバル変数・定数と良い、どのファイルからもアクセスが可能
グローバル定数num1はスコープ外でもアクセスでき、print関数でも出力可能。
```swift:Swift
//グローバル変数
var num1 = 0
for i1 in 1...10 {
    num1 = 1
}
print(num1) //num1はグローバル変数のため出力可能

```





## おわりに
基礎が抜けていることは割とある。そのため、適度な復習はマジで大切。

## 参考記事
[Swiftにおけるスコープの基礎概念](https://qiita.com/Kenta-Okuda/items/42efbd31678a962daa27)
[scope/developer.apple.com](https://developer.apple.com/documentation/sign_in_with_apple/clientconfigi/3230955-scope)

## 開発環境
- Xcode-13.4.1
- iOS13以降
Selenideで画面全体のスクリーンショットが簡単に撮れるようになってた

# このドキュメントは？
テストの自動化のハードルが高い方々に向けて、まず最初の一歩を踏み出しやすくするためのツールを作ろうと日々少しずつ作っている中で、「あれ？」と躓いたポイントをメモしておくためのページとして[「つまずき記事」](https://qiita.com/edy_jaki/items/e943584016f4b3d19e1b)を作成したのだけど、１記事１ネタの方がいいなと思ったので[「つまずき記事」](https://qiita.com/edy_jaki/items/e943584016f4b3d19e1b)はそのままにして新しいページを作成することにした。
結果的に皆さんの開発シーンの中で同じような躓きがあったら役立つかもしれないのと、何より忘れっぽい自分のための備忘録。

## 躓き
[「つまずき記事」](https://qiita.com/edy_jaki/items/e943584016f4b3d19e1b) の通り、[aShot](https://github.com/pazone/ashot) を使って [Selenium](https://www.selenium.dev/ja/) の弱点・・・というよりは各ブラウザベンダが提供するドライバが実装するスクショ撮影機能の今見えている場所しかスクショが撮れないという弱点を補おうとしたものの、きれいに画面全体のスクリーンショットが撮れなかった。

## Selenide さんがモジュールを作ってくれていた！
同僚エンジニアさんが見つけてくれたのですが、[Selenide](https://github.com/selenide/selenide) さんが [full-screenshot](https://github.com/selenide/selenide/tree/master/modules/full-screenshot) というモジュールを作ってくれていた！ので、これを使います。

## 使い方
`pom.xml` に、`full-screenshot` を追加します。
```xml:pom.xml
    <dependency>
      <groupId>com.codeborne</groupId>
      <artifactId>selenide-full-screenshot</artifactId>
      <version>6.7.4</version>
    </dependency>
```
こんなかんじで実装するだけで、全体のスクリーンショットが撮影されます。
```java
        FullSizePhotographer photographer = new FullSizePhotographer();
        Path imagePath = Paths.get("image.png");
        try {
            Files.write(imagePath, photographer.takeScreenshot(WebDriverRunner.driver(), OutputType.BYTES).get());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
```
`Selenide`前提にはなってしまうけど、キレイに撮れるのは非常に助かりますね！
しかも、この機能を使うと[「つまずき記事」](https://qiita.com/edy_jaki/items/e943584016f4b3d19e1b#解決できてないところ)で解決できていなかった固定ヘッダがスクロールすることで途中に撮影されちゃう問題も解決されます。すごい！（高解像度問題も発生しません）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115411/f390e2c4-fc05-4ba8-ecf5-e3f1a296aceb.png" width="50%">
[vue3] computedのgetter, setterの書き方

## 結論

vue3の場合は以下の書き方でできる

```vue
<script setup>
const props = defineProps<{
  item: string
}>
const emit = defineEmits(['changeItem'])
const computedItem = computed({
  get: () => props.item.value,
  set: (value) => emit('changeItem', value)
})
</script>
```

## 参考

https://kojirooooocks.hatenablog.com/entry/2022/10/09/140443
【Java】今日勉強したこと

# JDKとは(Java Development Kit)
javaのプログラムを作ったり実行したりするもの。

# システム環境変数とは
「javaはここのフォルダにあるよー」とコンピューターに教えるもの。

# PATHとは
javaのプログラム本体が格納されているところ。
Flutter アプリに Firebase を追加した時のエラーの対処法まとめ

## 経緯
Firebase に記載されている手順を元に Flutter のモバイルアプリのプロジェクトに
Firebase を追加すると `firebase_options.dart` に以下のエラーが発生したのでその対処法をまとめます。

1. ` Target of URI doesn't exist: 'package:firebase_core/firebase_core.dart'. `
1. ` Const variables must be initialized with a constant value.`
1. `The method 'FirebaseOptions' isn't defined for the type 'DefaultFirebaseOptions'.`

## 環境
Flutter: 3.3.2
Firebase: 11.14.1

## Flutter アプリに Firebase を追加した際の手順
Firebase のプロジェクト作成後の画面で Flutter のアイコンをクリックした後の画面の手順を元に
Flutter アプリに追加しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187508/3f42a99c-d7a4-9c48-58c2-235f244a1e85.png)
右端の Flutter のアイコンクリック

Flutterのプロジェクトは既に作成していたので手順2から。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187508/65e7446d-7017-faa0-3f63-bb7fa660e83c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187508/b71c39fc-f92b-a428-d085-113a76b4bd4c.png)

手順通りに進めると経緯記載のエラーが発生していました。

## Target of URI doesn't exist: 'package:firebase_core/firebase_core.dart'. の対処
`'package:firebase_core/firebase_core.dart'.`が無いというエラーなので追加してあげます。
`flutter pub add firebase_core` のコマンドを Flutter プロジェクトディレクトリで実行します。

## 残り2つのエラーについて
firebase_core を追加してあげたら残りのエラーも無事解消されました:clap:

## 最後に
公式のドキュメントを参考に行えば解決出来ました。
Firebase の追加方法については最初から以下のページを案内するか、上記のページにも
`firebase_core` を追加する手順があれば親切かなと思いました。

https://firebase.google.com/docs/flutter/setup?authuser=0&hl=ja&platform=ios#available-plugins
【Rails】Rails実装開始の前にMVCを学ぼう【基本中の基本】

#### はじめに

Railsの実装にあたり欠かせないMVCの概念の理解。
MVCとは単純に『Model,View,Controller』のことです。
最初はいやだからそれがなんなのよって感じなのですが。
しかしこれが理解できないとうまく実装できないため、
自分なりに噛み砕いてわかりやすく説明していきたいと思います。

#### MVCをわかりやすく例えてみたい①

まずはMVCと調べるとよく目にするこの画像。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2909373/fdbf18de-5a33-9edc-39e1-56d12803d49e.png">
>https://www.javadrive.jp/rails/ini/index7.html （参照サイト）<br>

見るとわかるようなわからないような...という感じでした。最初は。
これはブラウザー（つまり今自分が触っているPC画面）から手に入れたい情報(Webサイトのページ)に
辿り着くまでの一連の流れを表しています。
つまり最終的にはこのV(View)にみんな辿り着きたいわけです。

さてこのViewを呼び起こすまでにWebサイトがどんな動きをしているのか。
難しく説明するのは苦手なので、例え話でサクッといきます！

#### MVCをわかりやすく例えてみたい②

このブラウザーが自分の脳内だとして、ふと「〇〇くんとのあのデート楽しかったなぁ」と
思い出したとします。自分の脳内はそのデートの記憶を呼び起こしたい。
そこでまずはcontrollerくんの出番です。
controllerくんはユーザーからのリクエストを受け取り、”たくさんの記憶”というデータを取り扱うModelちゃんに情報を持ってくるように指示を出します。

このModelちゃん、データを更新したり削除したり、データ取り扱い以外にもお仕事はあるのですが、（バリデーションの設定とかね） とりあえずはデータベースを扱うのが主な仕事なんだなーと覚えていただければ、あとのお仕事はアプリの実装をしているとだんだんわかってきます。
そしてModelちゃんが情報を取り出し、controllerくんが受け取り、Viewに渡します。
そしてあなたはデートの記憶をゲットできるわけです。
超シンプルに概要だけお伝えするとこんな感じです。
よかったら下記参照ください。

>https://pikawaka.com/rails/mvc
>https://railsdoc.com/routes
curlコマンドの-d のjson内で環境変数を展開するためのクオート



## 前提１


```sh
> echo '$AUTH_KEY'
$AUTH_KEY

> echo '"$AUTH_KEY"'
"$AUTH_KEY"

> echo "$AUTH_KEY"
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

> echo "'$AUTH_KEY'"
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
```

## 前提２

:pencil: jsonのキーバリューはダブルクオートで囲む必要がある。

## よって


```sh
// NG ペイロードは {"name": "$NAME"} になる
$ curl -XPOST -H "Authorization: $AUTH_KEY" -H "Content-Type: application/json"\
  -d '{"name": "$NAME"}' https://localhost:3000/test

// OK
$ curl -XPOST -H "Authorization: $AUTH_KEY" -H "Content-Type: application/json"\
  -d "{\"name\": \"$NAME\"}" https://localhost:3000/test
```


とにかくダブルクオートのみ(必要に応じてエスケープ)を使え。と覚えておく。
GitHubのSSH接続方法まとめ

SSHを用いてアップロードしようとした結果、[Permission denied(PublishKey)]という警告文にかなりの時間足止めをくらいました。
そこで、今回は公開鍵をGitHubに登録する方法を記事にしていきたいと思います。


![スクリーンショット 2022-10-13 14.49.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916966/8629a0ca-2107-f14f-57be-455bfd4e1b61.png)


### ①SSHの接続状況を確認する

```ruby:qiita.rb
ssh -T git@github.com
> Hi username! You've successfully authenticated...
```

上記は成功した時のパターン。失敗したと仮定して、本記事は次に進めみます。



### ②.SSHのフォルダを開く
```ruby:qiita.rb
cd ~/.ssh
```
隠しファイルの全てを表示するコマンドをターミナルで打つのは面倒ですが、このコマンドであれば余分な手間が省けます。
CD(change directry)に成功したら、

```ruby:qiita.rb
open .
```
こちらのコマンドでファイルを開けます。

### ③中のファイルを全て削除し、新しく生成する
中のファイルを全て削除した後に打つべきコマンドは、

```ruby:qiita.rb
ssh-keygen -o -t rsa -C "メールアドレス@gmail.com"
```

パスフレーズもパスワードも何も入力せずenterを押してもらって構いません。


### ④生成された公開鍵をgitに登録する

先ほどの要領でもう一度.SSHフォルダを開き、「id_rsa.pub」ファイルを開きます。


![スクリーンショット 2022-10-13 22.52.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916966/2e0032e2-441b-3d6f-b904-b7339370147d.png)

ファイルの中身をコピーして、gitのSSH keyに貼り付けて新規登録します。

![スクリーンショット 2022-10-13 22.58.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916966/34f584a1-e53e-9727-4f07-fda727c9a5f7.png)

上記手順でSSHのURLが使用可能となるので、従来通りの手順でリモートリポジトリにプッシュしてみましょう。
Vagrant入門①：基礎知識

# Vagrantとは？
- 仮想マシンをとても簡単シンプルに構築・操作できる
- VirtualBox, VMWareなどのフロントに立ち、代理で操作してくれる
※初期はVirtualBoxのみをサポートしていたが、現在は他の環境もサポートしている
- 複雑なコマンド操作をシンプルなコマンドに集約している
- 製品の違いを吸収してくれる
- 数行のコマンドだけで仮想環境の構築をすることができる
- 便利なプラグインがある


# Boxとは？
- Vagrantにおいて作成する仮想マシンのベースになるもの
- ゲストOSを作成するためのパッケージ的な
- 事前にvagrantコマンドでBoxを入手することができる

[Vagrantbox.es](http://www.vagrantbox.es/)


# Providerとは？
VagrantではVirtualBox, VMWare, Amazon EC2などのバックエンドとなるプラットフォームのフロントに立ち、それらを操作しているが、
そのバックエンド側のプラットフォームのことを**Provider(プロバイダー)**という。  
Vagrantインストール時に対応しているプロバイダーはVirtualBoxのみだが、プラグインを入れれば他のプロバイダーにも対応できる。

[VMWareプラグイン](https://www.vagrantup.com/docs/providers/vmware#buy-now)


# Synced Foldersとは？
- 和訳：同期済みフォルダ
- ゲストOSとホストOS間でのファイル共有機能
- デフォルトでゲストOSとホストOS間での共有フォルダが自動割り当てされる
※ホストOS：Vagrantの仮想マシン作成ディレクトリ内(``Vagrantfile``)、ゲストOS：``/vagrant``
- 共有フォルダの参照パス変更もゲストOSとホストOS側で可能 


# Provisioningとは？
- サーバー選定やOS、ソフトウェアなどのインストールを行い、サーバーがサービス提供できるようにするまでの一連の流れのこと
- Vagrantではプロビジョニングを自動化する機能を提供している
- Boxと併用することで、開発メンバー全員に同じ環境を用意することができる


# Vagrantfileとは？
- 仮想マシンの構築を記述するファイル
- 仮想マシンのスペック、プロビジョニングツールの指定などを行う


# 参照
- [Vagrant入門 / Vagrant基礎知識](https://weblabo.oscasierra.net/vagrant/)
- [[公式ドキュメントで入門] Vagrantチュートリアル (翻訳+徹底解説付き)](https://qiita.com/digitalhimiko/items/a1e38d4303cf38185acf)
名前解決（DNS）

勘違いしていたので備忘録
 
## 通信順序
下記の図の①の後にそのまま③でルーティングしてくれると思っていたが、②でIPを受け取ってからそのIPを使用してクライアントからリクエスト③を行う。
![66A5E3AB-C778-491D-A094-440BBBD353B4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522066/37461c73-0a10-0212-cb89-4274758259a1.png)

 
## 名前解決
名前解決の際に自前で用意したDNS(LAN内であればhostファイルでも可)で名前解決できない場合、ルートサーバへ問い合わせる。以降下位ドメインへの繰り返し問い合わせを実施(上記の例であればcomの宛先が返却される)。
【備忘録】Djangoでサーバー起動時にsqlite3のインポートエラーが出る


## Djangoでrunserverした時にエラーが出る

Djangoでサーバーを起動させようとすると下記エラーが出る
```
python manage.py runserver

Watching for file changes with StatReloader
Exception in thread django-main-thread:
Traceback (most recent call last):
-------
-------
-------
ImportError: DLL load failed while importing _sqlite3: 指定されたモジュールが見つかりません。
```

## 解決法（Windows10）
設定　→　詳細情報　→　システムの詳細設定　→
環境変数　→　Path　→　編集
からPathの通っている場所を確認し、下記よりDLした「sqlite3.dll」を格納する
https://www.sqlite.org/download.html

基本C:\Windows\System32とかに入れとけば大丈夫でしょ、多分
令和4年秋の応用情報技術者試験の頑張りまとめ（不合格）①

# 目的
応用情報技術者試験に落ちました。(解答速報に答え合わせ)
今までの学習内容をまとめて、
再試験するときの備忘録を作ります。

不合格者がまとめる内容なので、
自己責任でご覧ください。

# 本記事の内容
今回は試験の概要について記載します。

# 私のスキル
偏差値50程度の中堅私立大学卒です。
組み込み系2年、Web系バックエンド1年程度の業務経験があり、
設計～受入テストまで担当できるSESエンジニアです。
資格はAWS CLF、AWS SAA、Pythonデータ分析試験などが合格できる程度の学習能力です。


# 試験時間
9:30～12:00　4択問題が80問
13:00～15:30 文章問題を5つ選択。セキュリティは必須。
（詳しくはIPAの公式サイトご覧ください）


私の時間的な体感を下記に記載します。
* **午前問題**
時間的には余裕でしたが、計算問題は後回しにするなど工夫しました。
見直しをして11:30に終わりました。
試験終了30分前で受験者の半数ぐらいは途中退席してました。

* **午後問題**
文章が非常に多く、時間的に大きな余裕はありませんでした。
見直し完了時には試験終了15分前でしたが、退出者は数人でした。

# 出題内容
基本的な内容はIPA公式サイトからご確認下さい。それを踏まえた上で、以下に私の体感を記載します。

* **午前問題**
技術的な内容について、
数学的な問題に加えて、組込・業務系・インフラ・Webバックエンド・Webフロントなど、幅広い分野が問われます。　
また、マネンジメントやストラテジストなどの分野も問われます。

覚える用語や計算式が多いため、暗記が苦手だと苦労します。一方で、問題文をよく読めば答えがわかる問題もあります。
（詳細な内容は別記事でまとめる予定。）

* **午後問題**
11問から計5問の文章題を選択して解答します。セキュリティは必須です。
私は
　セキュリティ
　システムアーキテクチャ
　データベース
　情報システム開発
　監査
を受験しました。
どれも文章が長いです。過去問を繰り返すなどして長い文章に慣れて、文章の中から答えとなりうる情報を拾う能力が必要です。
（詳細な内容は別記事でまとめる予定。）

# 最後に
文章が読みにくいなど指摘事項がありましたら、遠慮なくコメントしてください🙇‍♀️
* 読者の方向け
私は過去問学習について、直近2回分の午前試験を正答率90％以上に仕上げましたが不合格でした。受験後に、午前問題の過去問を直近4回分程度は学習するべきかなと感じました。
午後問題は自分に合った設問を選択したほうがいいです。そのために、過去問を解いて自分に合う設問を整理するべきだと思います。
また、過去問をいくら頑張っても、本番で知らない問題が出てくるものです。知らない問題に動じない精神力が大事だったりします。


* 自分向け
午前問題で不合格だったのだから、過去問4～5回分を復習して正答率90％以上に仕上げましょう。大事だと思う用語や計算式ははQiitaに記事にメモして、自分用の復習記事を作りましょう。
午後問題は時間的に厳しいですが、長文に慣れて文章から答えを探る能力は仕上げておきましょう。E-R図やＳＱＬ、クラウドの料金計算などは毎年出てくる問題は直前に復習すること。
予想問題集など購入して、未知の問題への対応力を鍛えること。
Webpacker::Manifest::MissingEntryErrorの解決

# 前提
```
$ rails -v                   
Rails 6.0.3
$ ruby -v
ruby 2.6.6p146 (2020-03-31 revision 67876) [x86_64-darwin21]
```

# 起きたこと1
Webpacker::Manifest::MissingEntryError

```
$ bin/rails s
＜略＞
ActionView::Template::Error (Webpacker can't find application in /Users/kosuke/works/rails-demo/public/packs/manifest.json. Possible causes:
1. You want to set webpacker.yml value of compile to true for your environment
   unless you are using the `webpack -w` or the webpack-dev-server.
2. webpack has not yet re-run to reflect updates.
3. You have misconfigured Webpacker's config/webpacker.yml file.
4. Your webpack configuration is not creating a manifest.
Your manifest contains:
{
}
):
     6:     <%= csp_meta_tag %>
     7:
     8:     <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
     9:     <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
    10:   </head>
    11:
    12:   <body>
```

# 起きたこと2
webpacker:compile ができない。
```
$ bin/rails webpacker:compile 
Compiling...
Compilation failed:
node:internal/crypto/hash:71
  this[kHandle] = new _Hash(algorithm, xofLen);
                  ^

Error: error:0308010C:digital envelope routines::unsupported
    at new Hash (node:internal/crypto/hash:71:19)
    at Object.createHash (node:crypto:133:10)
```



# 試したこと
- webpackerのバージョンを上げる
- node　のバージョンを下げる

```Gemfile
# gem 'webpacker', '~> 4.0'
gem 'webpacker', '~> 5.0'
```

```
$ bundle
$ bin/rails webpacker:install
$ node -v
v18.7.0
$ nodenv local 14.16.1
$ node -v             
v14.16.1
$ bin/rails s
```

# 参考
https://qiita.com/vaza__ta/items/6f0476574a379f7435e9

https://qiita.com/ahuiru/items/062bbc1b351819a3eeb8

# 感想
- 手元のnodeが v18.7.0だったから webpakcerと相性が悪かった。
- webpaｃkerを、 '~> 4.0' から '~> 5.0' にすればいいらしい。
デザインパターン_FactoryMethod

## 参考
[wiki-Factory Method パターン](https://ja.wikipedia.org/wiki/Factory_Method_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)
[デザインパターン「Factory Method」](https://qiita.com/shoheiyokoyama/items/d752834a6a2e208b90ca)
[Factory Method を C++ で / デザインパターン:Factory Method](https://refactoring.guru/ja/design-patterns/factory-method/cpp/example)
[4. FactoryMethod パターン | TECHSCORE(テックスコア)](https://www.techscore.com/tech/DesignPattern/FactoryMethod)

## はじめに
この記事は静的多態(静的ポリモーフィズム)で作成したFactoryMethodのため
一般的に使われているクラス図と内容が違いデザインパターンのメリットの一つである「技術者どうしの意思疎通が容易」が無くなってしまうので複数人での作業には推奨できません。


この記事の改善点を指摘していただいた[SaitoAtsushi](https://qiita.com/SaitoAtsushi)様の記事も是非見てください.

## 処理
-抽象クラス
Creator,Product

-具象クラス
ConcreteProduct

### main
``` C++:main.cpp
#include<iostream>
#include"Creator.h"
#include"ConcreteProduct.h"

int main()
{
    //output: ConcreteProduct1
    auto product1 = Creator::factory<ConcreteProduct1>();
    Creator::use(product1);

    //output: ConcreteProduct2  
    auto product2 = Creator::factory<ConcreteProduct2>();
    Creator::use(product2);

    //必要な関数がないのでエラーになる
    //auto product3 = Creator::factory<ConcreteProduct3>();
    //Creator::use(product3);

    return 0;
}
```
### 抽象クラス
#### Product 
- conceptを決めている
``` C++:Product.h
#include<concepts>
#include <string_view>

using namespace std;

//性質を設定する
template <class T>
concept is_product = default_initializable<T>&& 
    requires(T x) {
    {x.Method()}->convertible_to<string_view>;
};
```

#### Creator 
- ConcreteProductを呼び出すクラス
``` C++:Creator.h
#include"Product.h"

struct Creator
{
    template <class T>
    static void use(const T& x) {
        std::cout << x.Method() << std::endl;
    };

    //クラス呼び出し
    template <is_product T>
    static T factory(void) {
        return T();
    };
};
```
### 具象クラス
#### ConcreteProduct
- Creatorで呼び出すクラス
- Productで設定した関数を記述

``` C++:Creator.h
struct ConcreteProduct1
{
public:
    const char* Method() const {
        return "ConcreteProduct1";
    }
};


struct ConcreteProduct2
{
public:
    const char* Method() const {
        return "ConcreteProduct2";
    }
};


struct ConcreteProduct3
{
public:
};
```

## 終わりに
C++でFactoryMethodを調べていると動的ポリモーフィズムばかりで面白くないので，静的ポリモーフィズムでの書き方を今回書きました．
おそらく解説&処理は間違っている点が多いと思いますので，その際はぜひコメントしてください.

今後の課題は，コードの言語化が下手糞でまだまだ文字に起こせていないという点です．
なので技術ブログ等でテクニックを勉強して，言語化向上に努めていきたいです．
mysql: [Warning] World-writable config file '/etc/mysql/conf.d/my.cnf' is ignored. 気になる

# mysqlの起動Warning
mysqlでログインしようとしたら、以下のようなエラーが発生した
![제목 없음.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1787164/75531d88-b065-9fc8-67fd-ae385cacd57b.png)


# 原因

/etc/mysql/conf.d/my.cnf  のパーミッションがおかしい。

# 対応
```
$ chmod 644 /etc/mysql/conf.d/my.cnf
```
これで治った！