OmniAICreator/Qiita-1.07M huggingface dataset:
ReactアプリをGithub Pagesにデプロイ（ライブラリ不使用）

Reactアプリをgh-pages ライブラリを使わずにgithub Pagesに公開する方法をまとめました。

# 開発環境
- npm v8.19.2
- node v19.0.1
- react v18.2.0

# デプロイ方法
### アプリの作成
```
npx create-react-app my-app 
```
- my-appディレクトリ配下にReactアプリの雛形が作成されます。
コードを書いてアプリを作成してください。

### package.jsonの編集
```
"homepage": "https://(アカウント名).github.io/(リポジトリ名)",
"scripts": {
    ~ 略 ~
    
    "rm": "rm -rf docs", 
    "mv": "mv build docs",
    "deploy": "npm run rm && npm run build && npm run mv"
},
```
- package.jsonに上記を追加してください。
- rm,mvのスクリプトは、gitignoreファイルのbuildの部分をコメントアウトすれば必要ないと思います。
しかし、以下の記事を参考に今回はやってみました。専用のブランチではなく、ソースコードと同じブランチを使うのでbuildファイルをdocsに名称を変えています。

\: https://engawapg.net/software-development/2393/github-pages-branch/

### デプロイコマンドの実行
```
npm run deploy 　//docsが作成されます
```

### 

### GitHubにpush
```
git add .
git commit -m 'コミットメッセージ'
git push origin (作業ブランチまたはmain)
```

### GitHub Pages の設定
- SettingsタブからPagesを選択
- Branchとdocsディレクトリを選択して保存

![スクリーンショット 2023-11-29 16.00.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950585/43d2aebc-92f6-2e14-7d73-7acf798da9c0.png)


- デプロイ状況はActionsタブから見れます
- URLをクリックして完了です！
マーケ必須

マーケティング・SEO・ASO
JMRA マーケティングデータストレージ
デジタルマーケティングの入門書【BtoB編】
デジタルマーケティングの入門書【BtoC編】
フレームワーク20選を完全図解！マーケティング戦略や実行・分析に必要なフレームワーク
目的別38選！マーケティングのフレームワーク一覧
知っておきたい9つのマーケティングフレームワークおさらい
サイトやブログへの検索結果からの流入を0から20万に爆増させた時にやったことまとめ
プロダクトの運営に役立つ「なるほど施策」30個まとめました（2020）アプリの継続率を40％改善、価格変更で客単価が2倍など
SEOまるわかり大全集
GoogleDev　高度な手法と戦略
PPC Ad Editor とは｜競合のリスティング広告収集・分析に便利
SNSアカウントフォロワー動向
端末のネットワーク接続状態教えて？【SwiftUI】

# はじめに
端末のネットワーク接続状態に応じて処理を切り替えたいことって意外とありますよね。Wi-Fiだけ動画の品質を上げたり、ダウンロードできるようにしたり、オフラインだけ画面を切り替えたり。
接続状態の確認について調べてみたら色々と見つかったので、備忘録として置いておきます。

# 結論
**NWPathMonitorがおすすめです。**

https://developer.apple.com/documentation/network/nwpathmonitor

# 使い方
サンプルで端末のネットワーク状態を監視するオブジェクトを作成しています。
まずは、端末がオフラインかオンラインかを判定する処理を記述します。
```swift
import Network

class NetworkObserver {
  private let monitor = NWPathMonitor()
  private let queue = DispatchQueue.global(qos: .background) // 使用用途に合わせたqosを指定してください
  
  /// ネットワーク接続状態を監視
  func startMonitoring() {
    monitor.start(queue: queue)
    
    monitor.pathUpdateHandler = { path in
      if path.status == .satisfied {
        print("online")
      } else {
        print("offline")
      }
    }
  }

  /// ネットワーク接続状態の監視を終了
  func stopMonitoring() {
    monitor.cancel()
  }
}
```
次に端末の接続状態を判定する処理を追加します

```swift
import Network

class NetworkObserver {
  private let monitor = NWPathMonitor()
  private let queue = DispatchQueue.global(qos: .background) // 使用用途に合わせたqosを指定してください
  
  /// ネットワーク接続状態を監視
  func startMonitoring() {
    monitor.start(queue: queue)
    
    monitor.pathUpdateHandler = { path in
      if path.status == .satisfied {
        print("online")
      } else {
        print("offline")
      }
      
      // ここから接続状態を判定
      if path.usesInterfaceType(.wifi) {
        print("Wi-Fi networks")
      } else if path.usesInterfaceType(.cellular) {
        print("cellular networks")
      } else if path.usesInterfaceType(.wiredEthernet) {
        print("wired Ethernet networks")
      } else if path.usesInterfaceType(.loopback) {
        print("local loopback networks")
      } else if path.usesInterfaceType(.other) {
        print("virtual networks or networks of unknown types")
      }
    }
  }

  /// ネットワーク接続状態の監視を終了
  func stopMonitoring() {
    monitor.cancel()
  }
}
```

`NWPath.Status`や`NWInterface.InterfaceType`といったオブジェクトの詳細は以下の公式記事を参考にしてみてください。

https://developer.apple.com/documentation/network/nwpath/status

https://developer.apple.com/documentation/network/nwinterface/interfacetype

# 終わりに
接続状態の管理もこれでバッチリです。
msys2からgit worktree addするとVSCodeなどからgit管理下と認識されない

## 事象

git worktree使うときにVSCodeでgit管理と認識されるケースとされないケースがあって困っていた。


## 原因

msys2からgit worktreeコマンドでworktreeを切ると次のようになる。

```bash
$git worktree list
/home/yumetodo/test/foo           6bf17179b [master]
/home/yumetodo/test/foo_alpha    23b7bcf18 [alpha]
```

これをpowershellからみるとこう

```powershell
PS C:\msys64\home\yumetodo\test\foo> git worktree list
C:/msys64/home/yumetodo/test/foo           6bf17179b [master]
/home/yumetodo/test/foo_alpha           23b7bcf18 [alpha] prunable
```

つまりパス表記がわるい。

## workaround

`nano .git`してパス表記を`C:/`から始まる形式に直すと正しく認識されるようになった

## 結論

毎回`.git`を手書きで直すのはばかげているので、`git worktree add`をmsys2からやらずにpowershellなどから実行することにした。

## 追記

あるAnonymous曰く

>WSLを使っていると`/mnt/c/`～が入ってきてさらにカオスになります
LINE リッチメニューで、デフォルトのリッチメニューとタブ切り替えを組み合わせる

## はじめに
LINE公式アカウントには、リッチメニューという機能があります

https://developers.line.biz/ja/docs/messaging-api/rich-menus-overview/

LINE公式アカウントと友だちになったユーザーに、フッター固定のメニューを表示できるとても面白い機能です
LINE Official Account Managerを使ったGUIでの設定、Messaging APIを利用したAPIでの設定ができます
今回はMessaging APIを利用し、デフォルトのリッチメニューとタブ切り替えを組み合わせたリッチメニューの動きを紹介したいと思います


## リッチメニューをユーザーに表示する方法ついて
リッチメニューをユーザーに表示する方法は2つあります

- 特定のユーザーに特定のリッチメニューをリンクする
- デフォルトのリッチメニューを登録する

`特定のユーザーに特定のリッチメニューをリンクする`方法は、「男性には男性向け、女性には女性向けのメニューを出したい」など、ターゲットを決めてリッチメニューを出したい時にとても便利です

https://developers.line.biz/ja/docs/messaging-api/use-per-user-rich-menus/

対して、`デフォルトのリッチメニューを登録する`方法では、上記のターゲットを除くすべてのユーザーに見せたいリッチメニューを設定することができます

https://developers.line.biz/ja/docs/messaging-api/using-rich-menus/#set-default-rich-menu


2つを組み合わせることで、漏れなくすべてのユーザーに何かしらのリッチメニューを表示することができます

## デフォルトのリッチメニューについて
デフォルトのリッチメニューには、下記のような仕様があります
> デフォルトのリッチメニューは、LINE公式アカウントと友だちになっているユーザーのうち、個別にリッチメニューをリンクされていないすべてのユーザーに表示されます。
> すでにデフォルトのリッチメニューが設定されていた場合は、新しく指定したリッチメニューに置き換えられます。

つまり、特定のユーザーに特定のリッチメニューを表示したいわけではないのなら、デフォルトのリッチメニューを再登録しなおすだけで、こまめにリッチメニューを出し分けることができます
「特にターゲットは絞らず、日替わりの特集のタイトルを表示したリッチメニューを出したい」など、いろんなユースケースで使えそうです

## タブ切り替えについて
リッチメニュー内に別のリッチメニューへの切替アクションを設定することで、タブ切り替えを実装することもできます

https://developers.line.biz/ja/docs/messaging-api/switch-rich-menus/

APIとしては、切り替え先のリッチメニューのエイリアスを指定するだけのシンプルな機能ですが、
内部的には**特定のユーザーに特定のリッチメニューをリンクする**実装となっているようです

1. [運用側] リッチメニューB への切り替えが設定された リッチメニューA を、デフォルトのリッチメニューとして登録する
2. ユーザーにデフォルトのリッチメニュー（リッチメニューA）が表示される
3. ユーザーがタブを押してリッチメニューBに切り替える
4. **ユーザーとリッチメニューBがリンクされる**
5. ユーザーが元のメニューに戻るタブを押し、リッチメニューA に切り替える
6. **ユーザーとリッチメニューAがリンクされる**

この実装であることで、ユーザーが最後に表示したリッチメニューが保持されるので、
一度トーク画面から離れても、また同じリッチメニューを見ることができます！



## デフォルトのリッチメニューとタブ切り替えを組み合わせるとどうなるか
では、この後 リッチメニューC をデフォルトのリッチメニューとして登録したらどうなるでしょうか？

先に紹介しましたデフォルトのリッチメニューの仕様↓を知っていると、ユーザーにはリッチメニューCが表示されることを期待してしまいます
> すでにデフォルトのリッチメニューが設定されていた場合は、新しく指定したリッチメニューに置き換えられます。

しかし、ユーザーはタブ切り替え機能により特定のリッチメニューとリンクされています
そのため、デフォルトリッチメニューの表示対象から外れ、**ユーザーにはリッチメニューAが表示され続けてしまいます**

> 1. [運用側] リッチメニューB への切り替えが設定された リッチメニューA を、デフォルトリッチメニューとして登録する
> 2. ユーザーにデフォルトのリッチメニュー（リッチメニューA）が表示される
> 3. ユーザーがタブを押してリッチメニューBに切り替える
> 4. **ユーザーとリッチメニューBがリンクされる**
> 5. ユーザーが元のメニューに戻るタブを押し、リッチメニューA に切り替える
> 6. **ユーザーとリッチメニューA**がリンクされる

　7. [運用側]　リッチメニューC を、デフォルトリッチメニューとして登録する
　8. ユーザーはリッチメニューAとリンクされているので、**リッチメニューAが表示される**

### ユーザーに再びデフォルトリッチメニューを見せるには

もし、新しくデフォルトのリッチメニューを設定することになった場合は、ユーザーとリッチメニューのリンクを解除してあげる必要があります

https://developers.line.biz/ja/reference/messaging-api/#unlink-rich-menu-from-user

今回の例の場合は、タブ切り替えを実装しているので、リッチメニューA・Bどちらに紐づいているのかはユーザーによってまちまちです
そのため、リッチメニューA・Bの両方のリンクを解除してあげる必要があります


## ちなみに
> 1. [運用側] リッチメニューB への切り替えが設定された リッチメニューA を、デフォルトのリッチメニューとして登録する
> 2. ユーザーにデフォルトのリッチメニュー（リッチメニューA）が表示される

このタイミング、つまりユーザーがタブ移動をしていないタイミングであれば、ユーザーにはリッチメニューが紐づいていません
この後 リッチメニューC をデフォルトのリッチメニューとして登録したら…

　3. ユーザーにデフォルトのリッチメニュー（リッチメニューC）が表示される

という動きをします
IBM i アーキテクチャー：単一レベル記憶：シングル・レベル・ストレージ(SLS)

## IBM i (AS/400) 単一レベル記憶：シングル・レベル・ストレージ(SLS)

お待ちかね？、IBM i (AS/400)のオハコ、SLSについて説明します。
IBM i の最も特徴的なアーキテクチャーの一つだと思います。初版はS/38実装時なのでなんと1978年に出荷開始しているという相当な歴史モノでもあります。

## SLSの特徴

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/937ecd72-93c5-dde3-e339-318396399370.png)

1.一般コンピューターではメインメモリとストレージは別々なアドレス空間として管理されています（メモリ⇔ストレージ間のデータ操作時にアドレス変換が必須になる）が、IBM i では１つのアドレスでメインメモリとストレージの両方を管理しています。管理するアドレスが１つしかないから、単一レベル記憶（Single Level Storage)ですね。
アドレス変換は地味にパフォーマンスを喰う処理なのでこれが無い事のメリットは特に大量データベース処理などでは顕著に貢献していると思います。

2.SLSのS/W的な実装はIBM iの下層レイヤーであるSLICマイクロコードでなされています。SLICより上位層のIBM i OS、ユーザーアプリケーションからはすべてのデータはメインメモリー上に存在しているのと同一に扱われます。

3.と言ってもメインメモリサイズは有限です。2023年現在のIBM i システムでは32GB～数TB辺りがメジャーではないでしょうか。ではメモリ上に存在しないデータは？というとSLICマイクロコードがストレージに探しにいってメインメモリ上にコピー操作を実行します。ここは純粋にマイクロコード層だけで関係し、IBM i OS（もユーザーアプリも）関係しません。
ココもパフォーマンス向上に貢献する実装だと思います。

4.メインメモリ上のデータは基本的にはLRU（Least Recently Used）アルゴリズムでストレージに書き出しされます。（※バリエーションは色々ありますがいくつかは別記事で紹介できると思います。）

5.SLSの特徴として物理的なストレージ装置から独立して設計されている点があります。このため物理的なストレージデバイスはHDD, SSD, NVMeなどが混在しても単一のストレージ空間として利用できます。上図は模式図です。あらゆるIBM i H/W構成で上記のような混在が可能という事ではありませんのでご注意ください。

## IBM i はストレージ装置の階層管理機能をOSレイヤーで標準でもっている
IBM i SLSは一般のストレージ装置が持っているストレージ各デバイス毎の処理性能に応じてデータを階層管理する機能も標準で搭載しています。たとえば、よく使用されるホットデータはNVMeやSSDなど高速なストレージに寄せて、あまり使わないコールドデータはHDDに自動的に寄せてくれるような動作をオートマチックで実行しています。

## SLSが生まれ出た経緯は‥？
・・・SLSの発端は、「すべてのプログラム、データがメインメモリ上に存在できるコンピューター（ディスクなどの補助記憶域の無いコンピューター）を考えようや」、という事だったと聞いています（日本でも有名なフランク・そるティス博士らがいたチームですね）。
ところで、その当時（197x年頃）の商用コンピューターのメインメモリサイズは128KB〜とかだったはずなので、まあ火星旅行みたいな構想だったのかなあ・・と個人的には思います。
こういう発想をする技術者の方々をホント尊敬します‥（凡人の自分には絶対無理・・^^;)

## SLSの動作

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/fc5715dd-2e49-63f6-db68-0d2734569196.png)


つづく・・
.gitignoreと.git/info/excludeの違い

## 環境
Git 2.25
Ubuntu 20.4

## はじめに
Gitの.gitignoreの配置は、使い方によって、大きく４パターンあります。それぞれの使い方についてまとめてみました。

- .gitignore
- .git/info/exclude
- ~/.gitexclude
- /etc/gitexclude

## .gitignoreと.git/info/excludeの違い

GitHubに上げたくないファイルは、.gitignoreに記述することが多いかと思いますが、.git/info/excludeに記述することもできます。どちらに書いても同じではありますが、基本的には次のような使い分けがされます。

数名でプロジェクトの開発をしており、GitHubに上げないファイルを全員で共通化する場合は、.gitignoreに記述します。.gitignoreに追加が発生したときは、.gitignoreを全員で共有化させます。

GitHubに上げないファイルが、個人的に作成したファイルの場合、つまり、他人と共有する必要がない場合は、.git/info/excludeに記述します。.gitignoreには追加しません。他人と共有する必要がないためです。

.git/info/excludeは自分専用の、.gitignoreのような使い方をします。

個人で開発をする分には、.gitignoreを使っても、.git/info/excludeを使っても同じですが、.gitignoreを使うことが多いようです。

>参考情報
https://zenn.dev/wtkn25/articles/git-exclude-file

## .gitignoreを、--global、--systemで設定する
.gitignoreも、.git/info/excludeも、プロジェクトファイルの配下におくため、そのプロジェクトにおいてのみ有効になります。

今後、携わる全プロジェクトにおいて、共通して、GitHubに上げないファイルがある場合、毎回、.gitignore（.git/info/exclude）に記述すると煩わしくなることがあります。

そのようなときに活用するのが、~/.gitexcludeです。

このファイルはGitをインストールするとデフォルトで作成されるファイルではないため、touchコマンドで自作する必要があります。ファイルを作成したら、つぎのコマンドを実行して有効にします。
```
$git config --global core.excludesfile $HOME/.gitexclude
```

このコマンドを実行すれば、~/.gitconfigにつぎのように書き込まれます。
```~/.gitconfig
[core]
        excludesfile = /home/xxxx/.gitexclude
```

設定を取り消したい場合は、つぎのコマンドを実行します。~/.gitconfigから行が削除されます。
```
$git config --global --unset core.excludesfile
```

~/.gitexcludeに記述すると、全プロジェクトに対して有効になりますが、OSにログインしているユーザーにしか反映させません。どのユーザーでログインしても、共通で反映させたい場合は、/etc/gitexcludeに記述します（隠しファイルではないことに注意です）。
gitconfigファイルに書き込むコマンドはつぎのコマンドになります。gitconfigファイルの場所は、/etcです。~の配下ではないことに注意です。
```/etc/gitconfig
git config --system core.excludesfile /etc/gitexclude
```
pythonで、要素がn × mに満たないリストを、n × mで、そのまま2次元リストにする方法

こういうことがしたいこと、絶対また訪れると思います。
検索に全然引っかからず、地獄を見る初心者が少しでも減りますよう祈っています。

用語など知らない独学の初心者なので、おかしな言葉などあればご指摘ください
また、もっと見やすいものや別解などご教授頂ければ幸いです

:::note info
この記事では、python 3.11.5を使っています
:::

以下、自分用メモをコピペ

`n * m`の要素を持たないリストを、`n * m`で、そのまま整形する方法がわからず、phindに問いただした結果出てきた力技


## Solution
```python
# 1-8までの8つの数値を要素を持つリストを
# 3 * 3 の二次元リスト(もどき)にしてみたい
list1 = [num + 1 for num in range(8)]
# [1, 2, 3, 4, 5, 6, 7, 8]

# [
#  [1,2,3],
#  [4,5,6],
#  [7,8]
# ] にしたい
list2 = [list1[i:i + 3] for i in range(0, len(list1), 3)]
```
## 自分なりに言語化してみる
1. i にあたる`range(0, len(list1), 3)` は、`0, 3, 6`の数字が出てくる
	1. range 関数の3つ目の引数はステップ数
	2. 今回`len(list1)` = 8 だから上記の数字のみ
2. なので以下の3つのリストを内包した二次元リストを作る
	1. i = 0 のとき`list1[i:i + 3]` は、list1[0:3]のリストを作成
	2. i = 3 のとき`list1[i:i + 3]` は、list1[3:6]のリストを作成
	3. i = 6 のとき`list1[i:i + 3]` は、list1[6:9]のリストを作成
		1. 終わりのインデックス番号はオーバーしていてもエラーにならないっぽい
		2. `list1[3:]` がエラーにならないのと同じか?

## 一般化もしてみる
```python
list1 = [num +1 for num in range(k)]
# len(list1) = k
# k < n(行) * m(列)
list2 = [list1[i: i + m] for i in range(0, len(list1), m)]
```
1. nは`len(list1) // m`だと思っている
レガシーなリテールの会社でNewRelic導入してみた

この記事は[New Relic Advent Calender 2023](https://qiita.com/advent-calendar/2023/newrelic "") シリーズ2の11日目の記事になります。

# はじめに
レガシーなリテールの会社で社内SEをしています。
自社でどのようにNewRelic導入の承認を得たかという話です。技術的な要素は皆無です。
あくまで私の場合の一例ですが、こんな悩みを持つ方に少しでも参考になれば幸いです。
* 「NewRelic導入したいんだけど、社内を説得できない。」
* 「必要性を理解してもらえない。」
* 「どうやって稟議通せばいいんだろう？」

# お話の前提
## こんな会社

* 全国に店舗を持つリテール
* 東証プライム上場
* 過去は国内大手SIer様にシステム開発・運用丸投げ。ここ2年ぐらいで内製化にシフト、推進中。
* ITリテラシーはそこまで高くない。「オブザーバビリティ？？何それ？」

## こんな人
* 中堅・大手SIerで業務アプリケーションの開発・導入・保守を20年以上。
* 2年ぐらい前に中途入社。
* ITに詳しい人と思われている
* 私自身はレガシーな開発のみ。ウォーターフォール、C#・VB.net・COBOL・PL/SQL
* アジャイルとかフルスタックエンジニアとかに憧れが大きい。
ただスキル不足のため、その道に進む勇気はなく、エンジニアリングマネージャ的な仕事をしてます。


# どうやって導入したか？

## STEP1 キーワードをインプット
繰り返し、当然のように言いましょう。

* 「これからは**オブザーバビリティ**が必須です」
* 「オブザーバビリティ製品を導入していないなんて、あり得ません」
* 「**NewRelic**というサービスが良いらしいです、みんなそう言っています」
もし、ここで「みんなって誰？」と言われた成功です。時間を貰って説明しましょう。

## STEP2 具体的事象と関連させて、効果とコストを伝える
多少盛っても良いです。

* 私「あー、NewRelicを導入していれば防げた可能性高いんですけどね、この障害。年間○○○円ぐらいのツールなんですけどね～。」
（ここは、障害により発生した喪失・対応コストより少なく言いましょう。）
* Q「××（システムの稼働状況に関するなにか）って分かる？」
私「データが無いので分からないんですね～」
* Q「なんでこんなに時間かかるの？」
私「オンプレと違って、クラウドの場合、いろんな個所を確認しないといけないんですよね」
 （相手によっては、EC2だけを使ってる単純なシステムでも、こう言えばいいんです。）

## STEP3 いつでも止められる／乗り換えられることを伝える
導入したのち、本当に止められるか／他サービスに乗り換えられるか気にしない。

* 私「SaaSです。年間契約です。価値がない・要らなくなったら止めればいいんです。」
* Q「他サービスと比較検討したの？」
私「しました。これ以上は実際に使ってみないと分かりません。
　　とりあえずNewRelic使って、駄目なら来年他サービスに切り替えます。」
    （本当に他サービスへの切り替えを求められることは皆無です）

## STEP4 虎の威を借りる
説明相手にとっての権威を担ぎ出しましょう。誰・何が権威になるかリサーチしましょう。

* ガートナー
* 日経○○
* ××総研、◆◆コンサルティング
* 海外事例
* 同業他社の導入事例

## STEP5 予算編成時期を逃さない
このあたりはレガシー企業ならではかもしれませんが、一般的に会社というのは、
予算を確保しやすい時期とそうではない時期があるかと思います。予算確保しやすい時期が来たら、全力で承認を貰いに行きましょう。

# 結論
目的は **オブザーバビリティを実現する**ことだったので、**オブザーバビリティの必要性を会社の共通認識**にすることは、次のステップとして割り切ってました。

環境が恵まれていた部分も多分にありますが、
 **早くオブザーバビリティを実現しないとまずい、放置しておくとそのうち組織が回らなくなる**という考えが大事だったかなと思います。

「見えないシステム」って怖くないです？
分かりやすいコードを書こう 命名規則編 その1 

## 命名規則を知ろう
パスカル記法、キャメル記法などの命名規則がある。

## 7種類の要素に関するヒント
C# では、自分で名前を付けられるのは以下の7種類です
+ 名前空間
+ インターフェイス
+ クラス
+ メソッド
+ 列挙型
+ 引数 変数

つまり、命名に7種類のルールを用いれば、直感的にコードの要素を判別する事が出来ると言う事です。

## 実際のルールの用い方

以下は自分なりの命名規則です。
また、単語をつなげる毎に頭文字を大文字にします。

### クラス
ソースコードに役割をもたせたまとまりがクラスです。
つまり、名詞の名前を付ければクラス名だと直感的に判別できます。
ちなみに変数も名詞になりますが、クラス名は最初の文字を大文字にすることで変数と差別化を図ることができます。

クラス名を Pascal 形式で記述するのは、「実践で役立つ C# プログラミングのイディオム/定石＆パターン」で推奨されています。
他にも上記本では命名規則について色々と書かれていますので、一読をお勧めします。

### メソッド
ソースコードの処理に意味をもたせたまとまりがメソッドになります。
つまり、動詞の名前を付ければメソッド名だと直感的に判別できます。

これも上記した本で推奨されています。

### 引数
引数かフィールド、ローカル変数のどれかを知りたい事があります。

ちなみに、this.フィールド変数名 はフィールドの変数を指すのですが、ちゃんとした指導者がいなかったり、ある程度技術書を読んだりしていない人は「フィールドってなんだっけ？」となります。すると結局分かりにくくなってしまいます。

ですので、引数に apply を付けた変数名を付けると言う手があります

### 変数

最近ではローカル変数やフィールドの頭文字を小文字にするようです。
（Camel記法、これも同上）
クラス名やメソッド名の頭文字を大文字にするため、それだけで直感的に分かるからです。

メンバ変数とローカル変数では役割が違い、名前自体を差別化できることも多いです。

### インターフェイス
自分流のハンガリアン記法の衝突を避けるためインターフェイスの頭文字に "i" を使ったり、通常使われる大文字の "I" を使ったりもしています。

### 名前空間
最後に名前空間です。名前空間は、自分は少し英語が苦手な感もあって、良く分かっていないのですが、最後に s を付けたりしています。また、抽象的な短い名詞が自分は多いです。
厳密には s がいらない単語もあると思われます。

### 列挙型
自分は名前の頭に e を付けたりしています。但し、これもハンガリアン記法に通じる部分があります。

## 実際にソースコードで見てみる

```cs:Impressions
namespace Impressions       // まとまりなので、s を付ける
                            
{
    public enum eAuthor  // 列挙型の頭文字に小文字の e を付ける。
    {
        jito,
        Anyone
    }
    
    public class NamingRuleReporter  // クラス名は頭文字が大文字の名詞
        : iReporter
    {

    // 2番目以降の単語の頭文字も大文字にする。
    public eAuthor reporterName { get; private set };

        // 引数とフィールドが同じになってしまう時には引数に apply を付ける。
        public NamingRuleReporter(eAuthor applyReporterName)
        {
            reporterName = applyReporterName;
        }

        public void Report()  // メソッド名は頭文字が大文字の動詞
        {
            string reportMessage = "の命名規則の例の紹介";  // 変数は頭文字が小文字
        
            Console.Write(reporterName.ToString() + reportMessage);
        }
    }

    public interface iReporter  // インターフェイスの名前も名詞で頭文字に i を付ける。
    {
        void Report();
    }
}
```

## 最後に
全てのコードで厳格にこれを守っている訳ではありませんがここに紹介した一例で、もしこれは使えそうだ、と思った物があれば、趣味や勉強の際に試して貰えればと思います。

他にも readonly に r を付けたり、const に c を付けたりと言う事もしていますが…

自分のやり方では r, cなどがハンガリアン記法の名残で残ってしまうのが悔やまれます。

追記、引数には 'apply' を付けるとハンガリアン記法にならずにフィールドと引数の区別が出来、若干スマート？になる事を発見しました。

但し、忌避されていてもインターフェイスの I のハンガリアン記法だけはトッププロでも使っています。

もしかしたら後述する editorconfig を使うことでこれも自動化出来るかも知れません。

分かりやすさ、読みやすさが大事だと思っています。

:::note warn
変数やメソッド、クラス名などに接頭字を付けて可読性を増す記法をハンガリアン記法と言い、自分以外には読みづらい記法であることを理解した上でご利用下さい。
:::

自分は過度なハンガリアン記法でなければ、一歩目にハンガリアン記法などを使っても段階を踏んで自分なりに少しずつ分かりやすいコードを目指す事も悪いことではないと思っています。

また、フィールドに"_"を付ける方もいらっしゃると思います。

juner さんが指摘して下さった通り、editorconfig を利用すれば、VisualStudio では自動で変数の先頭に付ける事が出来るそうです。

自動化出来るのであれば大文字と小文字で区別するよりその方が効果的かも知れません。

命名規則と言うちょっと面白味に欠けるテーマかも知れませんが、命名に時間を掛けると可読性が上がると自分は思っているので、もし良かったらこれを読んでる方で考えた事が無かった方は一度考えてみると今後のプログラミングライフが少し快適になるかも知れません。

命名規則については以下の参考文献で勉強しました。
[実践で役立つ C# プログラミングのイディオム/定石&パターン(著:出井秀行)]
[リーダブルコード(著:Dutin Boswell/ Trevor Foucher)(訳:角 征典)]
【PostgreSQL】先行書き込みログ（WAL）について理解を深める

## 初めに
僕が初めて実務の中でPostgreSQLに触れたときに、WAL（Write-Ahead Logging）という単語を知りました。
調べてドキュメントを読むもいまいち理解ができません。
同じような人に理解ができるようにまとめていきます。

## この記事で得られること
この記事を読み終えることで以下のメリットがあります。
- WALについて理解が深まる
- PostgreSQLを触ってみたくなる

## 課題
WALとは何か？
データベースシステムにおける重要な概念で、データの整合性と回復性を保つためのメカニズム。と言われてもよくわかりません。でも重要ということなので理解をしておいた方がいいのは間違い無いです。

## WALとは？
ドキュメントには下記のように書かれています。
> ログ先行書き込み（WAL）はデータの一貫性を確実にするための標準的な手法です。

何を言っているのかよくわかりませんね
WALとはどういう概念？食べれるの？みたいな感じの疑問はやまないです。
WALを理解するのにはRDBMSのログについて理解を深める必要がありました。

## データベースでの「ログ」
そもそもログとは？
> 語源は「丸太」を船の船首から海に流して、船尾まで流れる時間を砂時計や初期の機械式時計で計測し、船の速さを測ったことからその記録をログと呼ぶようになった。

ログについてはわかりました。
データベースでのログはとても重要な役割を担っています。

これまで自分は以下のようなイメージで更新が行われていると考えてました。

![誤った更新イメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572072/9807cf6c-4776-f333-00a1-21c85987cc1f.png)

ただ、これだとデータベースとしての性能がガタ落ち
高速化させるためにメモリを活用していました。

![メモリ使用した更新.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572072/5bae52ba-0c3e-c66e-b765-1fd1d55bf5a3.png)

ただ、メモリ上で更新されたとしても万が一、commitした後にディスクに書き込むまでの間でトラブルがあればデータは消えるし、commitのたびにディスクへの書き込みが大量に発生すると性能も劣化します。

ここで使われるのがログ
トランザクションの開始・終了とデータの変更情報のログを先にディスクへ記録することで、ディスクへの書き込み時間を減らして高速化を図ることができます。

**トランザクションの開始・終了とデータの変更情報のログを先にディスクへ記録すること**

これがWALです。
トランザクションが開始、データの変更が行われるとWALバッファに書き込まれます。
commit（他のタイミングもあり）されるとWALバッファからWALファイルへ書き出しが行われます。
同時に実際のデータファイルも更新が反映されます。

![簡易アーキテクチャ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572072/2be56a26-d669-f3d2-5d3d-ff36786985b1.png)

## まとめ
WALについて理解できたでしょうか？
他にもWALを使った機能（ストリーミングレプリケーションなど）があるのでそれについては別途まとめていきます。
今回は前段階としてWALそのものの理解を深めました。



## 参考
http://www.osssme.com/doc/funto63.html
Python導入

**はじめに**

WEBスクレイピングの為Pythonを導入する手順をまとめていきます。

・目次
1.Pythonのインストール
2.pip（非公式パッケージ管理ツール）の更新
3.パッケージインストール
　3.1.Seleniumのインストール
　3.2.pandasのインストール
　3.3.ChromeDriverのインストール
　3.4.ChromeDriverの更新、バージョン確認
 
4.VSCodeインストール
　4.1.VSCodeの拡張機能（Python）
　4.2.VSCodeの拡張機能（Python Indent）
　4.3.VSCodeの拡張機能（Python Docstring Generator）
  
5.コマンド一覧
etc

<br>
<br>
<br>

スクレイピングの注意点

・スクレイピングを行うWebサイトの利用規約、著作権を事前に確認すること

・robots.txtを確認すること


<br>
<br>
<br>

3.パッケージインストール

https://qiita.com/BubbleBubble/items/d792505582b966bf4941


3.selenium4以降のエラーについて

https://qiita.com/BubbleBubble/items/af381b602c055140e4a0
数式の計算 (paizaランク C 相当)

https://paiza.jp/works/mondai/string_primer/advance_step9

複数桁の計算。

`eval()`を使えば一発だけど、
意図的に考えるとそうではないので、
下記のように実装
でもだめだった。
そもそも、＋と-を覚える順番が間違っていた。
最初の数値をそのままansにいれればいいのだが、
そうではなく数式も入れてしまってたので数値が代わってしまった。

```py
s = input()
ans = 0
add = True
tmp = ""
for i in range(len(s)):
    if s[i] == '+':
        add = True
        ans += int(tmp)
        tmp = ""
    elif s[i] == '-':
        add = False
        ans -= int(tmp)
        tmp = ""
    else:
    #＋でもーでもなければ数値として登録
        tmp += s[i]
        if i == len(s)-1: 
            if add == True:
                ans += int(tmp)
            else:
                ans -= int(tmp)
print(ans)
```

正しくはこう
凄くシンプル。。。。
ロジカルに考えられてないなぁ
`isdigit()`は数字かどうか確かめるやつ
そして最後のところ、.を付け足すやつはすごいなぁと思った。

```py
s = input()

s += "."
add = True
ans = 0
tmp = ""
for i in s:
    if i.isdigit():
        tmp += i
    else:
        if add:
            ans += int(tmp)
        else:
            ans -= int(tmp)
        
        if i == "+":
            add = True
        else:
            add = False
        
        tmp = ""

print(ans)
「OpenSSL::SSL::SSLError」について

### 【概要】
---
API通信中にSSL証明の認可にて、処理が弾かれてしまったので、今回fixした方法を備忘として記しておきます。

### 【環境】
---
・Rails
・Docker
・DeepL

### 【原因】
---
`DeepL`の導入後、標記の事象が発生しました。
ポイントとしては、SSL通信を行う設定にdocker側が対応していなかったことや、SSL通信するなどの事象が考えられます。

なお、通常のSSL通信では下記のようにセキュリティの情報を担保されていることを確認できるようになっております。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538926/5b6045ad-bb54-c5d2-b565-7b67b1249335.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538926/d3484b5f-a3e3-13f2-7b33-ad0c6e306fbc.png)


### 【対策①】
---

・取り急ぎAPIにて確認したい場合、SSL証明書の確認を飛ばす方法で確認することができます。

```ruby
client.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_NONE
```

ただし、上記の方法で、本番環境に上げる場合は注意が必要です。
この場合、http通信で行われるので、アプリの危険性が懸念されます。

特に、`Google Chrome`などで閲覧する場合、注意喚起される状態になるので信頼性という観点からユーザーの維持が難しくなってきます。

### 【対策②】
---
私は下記の方法で解消しました。

```ruby
client.ssl_config.clear_cert_store
client.ssl_config.set_trust_ca("/etc/ssl/certs")
```

 上記で、クライアントのSSL設定で信頼できる証明書機関（Certificate Authority、CA）を指定しており、ここでは、"/etc/ssl/certs"というパスにある証明書が信頼されるCAとして設定しました。(どうやらSSL自体は発行されていたようですが、正しく指定できていなかった？ようです)

### 【対策③】
---
SSL証明書を別で発行しておいて、その情報を紐づけるやり方になります。
ただし、著者の知識が低いために、こちらの方法については参考になりそうなサイトのみの紹介とさせていただきます。

https://qiita.com/non0311/items/a90c729a5cb95863853f

https://qiita.com/cyborg__ninja/items/876c3d648a13831523e3

https://qiita.com/usk/items/2fcf2b9e6b2e367a33d2
 
### 【引用元】
---

https://blog.wackwack.net/entry/2016/04/25/234111

https://qiita.com/usk/items/2fcf2b9e6b2e367a33d2

https://qiita.com/non0311/items/a90c729a5cb95863853f

https://qiita.com/cyborg__ninja/items/876c3d648a13831523e3
ETロボコン2023、九州地区大会優勝、全国大会6位の成績を収めました！

# ETロボコン2023、九州地区大会にて総合優勝しました！
2023年のETロボコンというソフトウェア開発の大会で、アドバンストクラスで総合優勝を果たしました！
さらに、ゴールドモデル賞、IPA賞もいただき、盾を3つもいただけました！
全国大会では総合6位、入賞ならずという結果となりましたが、チーム開発の腕を大きく上げる半年となりました！

# ETロボコンとは？
「技術教育の機会を提供する場所」と、未来の（組み込み）エンジニアの育成を視野に入れた場所みたいです。
詳細は以下のページをご覧ください。
[ETロボコン公式サイト](https://www.etrobo.jp/#)

また、正式名称は「ETソフトウェアデザインロボットコンテスト」というみたいです。~~知りませんでした。~~
普段は「ロボコン」と略してますからね。

そして、実際何をする大会なのかというと、コース上を走行体となる二輪ロボットを走らせる「競技」と、その機能を実装するまでを記した「モデル」の2つの分野で成績を決める大会です。
下の写真は、私達が実際に走らせた走行体と、 __私が大好きなホゲータのぬいぐるみです。__ 地区大会の開催地が福岡だったので、帰りにポケモンセンターに寄って買いました。かわいすぎです。

![icon.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475006/c5e3df2e-0aae-435c-c55e-8f3e46b97a53.jpeg)



# ETロボコン九州地区大会優勝！
4月から開発に着手し、約半年ほどで地区大会を迎えました。私の参加する地区は「九州北・九州南」となっており、クラスはアドバンストという上級のクラスになります。
下のリンクが結果発表のページとなります。

[ETロボコン九州地区大会結果発表ページ](https://www.etrobo.jp/%e3%80%90%e4%b9%9d%e5%b7%9e%e5%8c%97%e3%83%bb%e4%b9%9d%e5%b7%9e%e5%8d%97%e5%9c%b0%e5%8c%ba%e3%80%91%e4%b9%9d%e5%b7%9e%e5%8c%97%e3%83%bb%e4%b9%9d%e5%b7%9e%e5%8d%97%e5%9c%b0%e5%8c%ba%e5%a4%a7%e4%bc%9a/)
引用： ETロボコン公式サイト

競技部門では優勝を逃したものの、準優勝の結果を収めています！
キャリブレーションでアクシデントが起こってしまいましたが、不測の事態に対応し、再スタートをすることができたため、ボーナスポイントの地点までは到達することができました。
第二走では途中でコースアウトしてしまい、再スタートした第一走の記録を下回りました。成績が良かった第一走の結果が採用されたことが救いでしたが、もし第一走も慌ててキャリブレーションして、コースアウトしていたらと考えると……という具合です。

# チャンピオンシップ大会
総合優勝を果たしたわけですが、これで終わりではありません。
今回の結果は「地区大会」です。地区の次ということで、「全国大会」があります。
横浜にある「パシフィコ横浜」にて、アドバンストクラスの全国大会が開催されました。
結果は総合6位と振るいませんでしたが、4月から開発を始めて半年も走り続けた自分と、なにより同じチームの方々に感謝しかありません🙏
詳細なチャンピオンシップの結果は、以下のページからご覧ください。
[ETロボコンチャンピオンシップ大会結果](https://www.etrobo.jp/et2023_result/)
特に印象深かったのは、HELIOSの圧倒的な成績と、極力人手によるブレを排除したキャリブレーション、そして同じ九州地区で争い、地区大会では勝利したものの、追加でチャンピオンシップ大会に選出された Smart SPiNaCH の存在でした。(ちなみに、チーム名の発音は スマート スピニッチ といい、スピニッチは「ほうれん草」のことみたいです。)
同じ学生ということと、地区大会での優れた走行・モデル成績から、地区大会が終わったときから「あのチームは絶対チャンピオンシップに選出される」という確信がありました。全国大会に向けての一ヶ月間、このチームの存在が開発への熱をさらに高めてくれたことは間違いありません。

# 来年に向けて、次にどう活かすか
さて、今年は全国出場を果たしたものの、全国大会では入賞ならずという結果となりました。ここで大事なのは、やはり次にどう活かすかの反省だと考えています。
大会終了後、横浜駅の地下鉄で電車を待つ中、実装したシステムの改良点を模索していました。確かに悔しい気持ちはありましたが、自然とその雰囲気や流れができていたのは、今まで真剣にロボコンに向き合って開発を続けられたからこそだと思っています。

# さいごに
ここまでご覧いただきありがとうございました。本記事はここで終了とさせていただきます。
戮力協心 (りくりょくきょうしん) という言葉がありますが、まさに今回のチームに当てはまるものだと自信をもって言えます。
また来年、新チームでロボコンへ出場します。この反省を胸に。
Salesforce 認定 Platform アプリケーションビルダ試験レポート


初めまして。

私はSalesforceの開発に4年携わっています。
そんな私がこのたび、11月初めに「Salesforce 認定 Platform アプリケーションビルダ試験」を受験し無事合格出来ました。
試験勉強をしてみて、Salesforce試験の学習方法は余りまとまったノウハウがありませんでしたので、
今後受験される方向けに、この機に勉強方法などを纏めました。

【目次】
１．勉強法について
２．試験結果について
３．試験の印象ついて
４．まとめ

# １．勉強法について
私はSFDCの開発をある程度経験していたので、過去問を解くことを中心に行いました。
印象としてSFDCの開発経験が無いと、過去問をいきなり解くのは難しいと思います。
もし、SFDCの開発経験が少ない方は、TrailHeadなどで実際にSalesforceを触ることがお勧めです。
過去問は教科書(後述)の問題55問＋ネット上の想定問題およそ150問＝計200問ほどを行いました。
問題の意図と回答が理解できるまで繰り返し解きました。

①教科書について
  教科書は「Salesforce Platform App Builder Certification Guide」を利用しました。
  英語で書かれているので読むのが大変かもしれませんが、図や画面キャプチャも交えて記載されており、きれいに纏まっていると思います。
  試験問題も55問あります。
  https://www.amazon.co.jp/Salesforce-Platform-Builder-Certification-Guide/dp/1800206437
  
②ネット上の想定問題について
  ネット上の想定問題は下記を利用しました。(非公式)
  https://www.jpnshiken.com/exam/Platform-App-Builder-JPN-salesforce-certified-platform-app-builder-platform-app-builder%E6%97%A5%E6%9C%AC%E8%AA%9E%E7%89%88-11647.html
  
  正解が怪しい問題も少しありますが、おおむね合っていると思います。
  1000問近くありますが、似た問題が多いので200問くらい解けば十分だと思います。
  
③公式ウェビナーについて
  時間に余裕があれば、SFDC公式が開催しているウェビナーを受けるとよいと思います。
  
  【ウェビナーとは】
  オンライン講義で試験範囲と試験対策を講師の方が説明してくださいます。
  Salesforceはあまり聞きなれない専門用語などがあるので本を読んでも良くわからない場合があり、
  最初にウェビナーを受けると本を読むのは問題を解くのが楽になると思います。
  私は、別資格の認定アドミニストレータのウェビナーを受けたことがありますが、試験で問われる
  ことだけをピックアップして説明されるので、試験での得点UPに直結すると思いました。
  
④アプリビルダー試験ガイド（公式）
  公式の試験ガイドもありますので、こちらも利用すると良いと思います。
  公式の試験ガイドを参照して範囲を知った上で、過去問をたくさん解かないと受かるのは難しいと思います。
  https://quip.com/93hBAkbHvatd
  
２．試験結果について
 さて、試験を受けた結果ですが・・・、
 合格点63%のところ、67%だったのでギリギリでした(;^_^A
  各単元ごとの詳細結果は下記の通りです。
  (単元ごとの問題数と結果得点は公表されないため、結果は計算により求めた想定値となります)
|単元|配点(%)|問題数(想定)|得点数(想定)|
|:--|:--|:--|:--|
|SALESFORCEの基本|23|14|12|
|データモデリングおよび管理|22|13|9|
|ビジネスロジックとプロセスの自動化|28|17|11|
|ユーザインターフェース|17|10|6|
|アプリケーションのリリース|10|6|2|
|(合計)|100|60|40|

  (40/60) *100 = 0.66... *100 ≒ 67%

３．試験の印象ついて
教科書やネット上の問題と似た問題が多く出た印象です。
上記の問題をしっかりやり込めば合格できる難易度だと思います。
逆に、8割以上を取れるくらいは準備した方がよいかもしれません。
機能の特徴について直接問うような問題は少なく、
「企業で～を実現する場合、適切なものはどれか」のような問われ方がほとんどです。
そのため、各機能の特徴を理解することは前提であり、その上で適切なものを選ぶ判断が求められます。

４．終わりに
教科書とネットの問題を解く勉強法で、それらを8~9割正解するくらいの理解度でしたが、
何とか合格することができました。
過去問を事前に解いて自分の苦手な単元を知ったうえで、そこを重点的に勉強するのがよいと思いました。
試験でわからなかったところは再勉強して、実際の仕事に活かしたいと思います。
次回はSalesforce認定Platform デベロッパーの取得を目指します！！
【AppSheet】リストのインデックス番号を得る


### やりたいこと

INDEX()は番号から値を取るが、値からIndex番号が欲しい。

### コミュニティにあった（解決済み）

https://www.googlecloudcommunity.com/gc/AppSheet-Q-A/Get-the-index-number-out-of-list/m-p/251287

対象の項目群（LIST）をTEXT変換（カンマ区切りの文字列）にして、FIND()で対象の値の位置を取得、LEFTでそこ（=FIND()値）までの文字列を切り出し、SPLIT()でLIST型に戻してからCOUNTすると件数＝INDEX番号になる。

なるほど！！！！


#### 入力例
COUNT(
   SPLIT(
       LEFT(TEXT([リスト]),
                 FIND( [値] , TEXT([リスト]))
        )
     , ",")
)

#### 実際に書いた
COUNT(
   SPLIT(
       LEFT(TEXT(SELECT(files[ID], [eventID]=[_THISROW].[eventID])),
                 FIND( [ID] , TEXT(SELECT(files[ID], [eventID]=[_THISROW].[eventID])))
        )
     , ",")
)

親であるEventIDごとに子データに番号を付与することができた
![結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233298/ab8790e7-bc94-d3dd-ffbe-81448e718074.png)

先人の知恵、本当にありがとうございます…！

登録されたデータ群に対して擬似的な連番が生成可能。
※あくまで"登録された"データ群なので、登録時に発番の使い方ではない。

　Is a part of?を使って複数登録された子データ群に対してインデックス番号が欲しかったので上手くてきてよかった。
VSCodeでGitLensを使った時に現れる謎のアイコンを変える

## はじめに
VScodeで`GitLens`を使っている方は多いと思いますが、その際表示される謎のアイコンを変更する方法がなかなか見つからなかったので書き遺しておきます。

謎のアイコン↓
![スクリーンショット 2023-11-28 19.20.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2778030/494a8324-9abc-b95d-6e7d-f8cdf452aaf7.png)
![スクリーンショット 2023-11-28 19.20.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2778030/30a355d9-9e43-ad92-cb57-e35ef8aa1d48.png)


## 早めに結論
Githubに登録しているメールアドレスで、[Gravatar](https://ja.gravatar.com/)というサービスにアカウント登録することでそのアカウントに登録したアイコン画像が表示されます。

Gravatarを知らなかったので、chatGPTに聞いてみました。

chatGPT ：Gravatar（Globally Recognized Avatar）は、ウェブサイトやオンラインフォーラムなどで利用される、ユーザーを表すプロフィール画像の仕組みです。Gravatarサービスに登録したユーザーは、メールアドレスと関連付けられた画像をアップロードできます。その後、同じメールアドレスを使用して他のウェブサイトやオンラインプラットフォームに登録する際に、Gravatarをサポートしている場合、そのプラットフォームでユーザーのプロフィール画像としてGravatarが表示されます。

主な特徴と利点は以下の通りです：

1. **グローバルに利用可能**: Gravatarは世界中の多くのウェブサイトやサービスで利用されており、一度登録した画像が複数のサイトで再利用されるため、ユーザーは同じプロフィール画像を保持できます。

2. **一貫性と認識性**: 同じメールアドレスを使用すると、異なるサイトで一貫して同じプロフィール画像が表示され、ユーザーの認識が容易になります。

3. **個別設定**: Gravatarを利用するユーザーは、Gravatarのウェブサイトから自分のプロフィール画像をアップロードおよび設定できます。

4. **カスタマイズ可能なサイズ**: ウェブサイトやアプリケーションは、Gravatarから取得するプロフィール画像のサイズを指定できます。

Gravatarはオープンソースで、ユーザーのプロフィール画像を提供する際には、ユーザーのメールアドレスをハッシュ化して利用することでプライバシーを保護しています。一般的に、Gravatarを利用するには、ユーザーがGravatarのウェブサイトでアカウントを作成して、メールアドレスと画像を登録する必要があります。

ということで、とりあえず登録していても損はなさそうです。
ここまでお読みいただきありがとうございました !

## クリップ

https://github.com/gitkraken/vscode-gitlens/issues/305

https://ja.gravatar.com/
Ubuntu 22.04 の Apache PHP 8.1 を 7 系に戻す

## 概要

Ubuntu 22.04 にアップグレードすると、 Apache の mod_php も 8 系にアップグレードされてしまいます。  
すると上に乗っかっているさまざまなサービスが動かなくなる場合があるので、 7 系に戻す方法を紹介します。

:::note warn
ここで紹介するのは、筆者が手当たり次第に模索した Workaround であって、正当な解決手段ではない可能性があります。  
サービス自体を PHP 8 に対応させるなど、正当な対応が行える場合はそちらをお勧めします。
:::

## 方法

まず PHP 関連の多数のパッケージを提供するリポジトリ `ppa:ondrej/php` を add します。

```
sudo add-apt-repository -y ppa:ondrej/php
sudo apt update
```

次に PHP 7.4 をインストールします。 　
ここで 7 系の違うバージョンを指定することもできるはずです。

```
sudo apt install -y php7.4
```

最後に、 Apache で有効化している mod_php を 7.4 系に変更します。

```
sudo a2dismod php8.1
sudo a2enmod php7.4
sudo systemctl restart apache2
```

おわり。
特許用の画像変換：モノクロ2値PNGとグレースケールJPEG変換

## はじめに

特許申請では、発明の詳細を明確に伝えるために高品質な画像が不可欠です。この記事では、特許申請に適した画像変換方法と、それらの利点について詳しく説明します。

## 特許用画像の重要性

特許申請の画像（イメージファイル）は、発明の概念を視覚的に伝え、審査官に理解を促すために重要です。適切に変換された画像は、発明の特徴を際立たせ、審査過程をスムーズにします。特許用の図を美しく変換するための最適な方法

::: note info
[特許文書に使用できるのは](https://www.pcinfo.jpo.go.jp/guide/Content/Rules/ImageRules.htm)
- モノクロ2値のPNG
- グレースケールのJPEG
:::

## リンク
https://huggingface.co/spaces/tregu0458/image_converter_for_patent

## モノクロ2値変換

モノクロ2値変換は、画像を黒と白の2色に限定するプロセスです。
画像をモノクロ2色のPNGにします。
モノクロ2値でも文字が潰れないようにしました。


## グレースケール変換

グレースケール変換は、画像の色彩を灰色のトーンに変える手法です。この記事では、JPEG画像をグレースケールに変換する方法を詳しく解説します。このプロセスは、画像をグレースケールに変換する画像コンバーターを使用して行います。
具体的には、8bitのグレースケールJPEGに変換します。

## 仕様
1. 300dpi
1. モノクロ2値化はpixel数を5倍にしている。文字が潰れないために
1. pillow
1. python
1. gradio
1. huggingface spaces

## まとめとベストプラクティス

特許申請における画像変換は、発明の理解を助け、申請プロセスをスムーズに進めるために重要です。適切なツールとテクニックを使用し、画像を最適化することで、特許申請の成功率を高めることができます。
簡単に作れるgradio, 簡単にwebアプリを公開できるhuggingfaceすごい！
Rocky Linux9 SSH鍵（2048ビット）認証に失敗するようになった場合の対応方法

システムをアップデート（dnf update）したらSSHの鍵認証が失敗するようになってしまった。
この場合の対応は新しく鍵（3072ビット）を作成して更新するか、以下の手順でクリプトポリシーの設定変更を行うことにで対応する。

## 鍵の最小サイズの確認方法

以下のコマンドで確認します。

```bash
 sshd -T | grep requiredrsasize

 ＃結果
 requiredrsasize 3072

```
自分の場合、3072ビットでした。

## クリプトポリシーの確認方法

以下のコマンドで確認します。

```bash
update-crypto-policies --show
```

自分の場合は LEGACY:OSPP と表示されました。


## 設定変更手順

1. **システムワイドのクリプトポリシーをデフォルトにする:**
   `update-crypto-policies`コマンドを使用して、システムワイドのクリプトポリシーをデフォルトに戻します。

    ```bash
    sudo update-crypto-policies --set DEFAULT
    ```

2. **システム全体を再起動:**
   システムワイドのポリシーの変更を反映させるために、システムを再起動します。

    ```bash
    sudo reboot
    ```

## 再起動後の確認

```bash
sudo sshd -T | grep requiredrsasize
 ＃結果
 requiredrsasize 2048
```
これで、2048ビットのRSA鍵が利用可能となりました。
「sympyのfactor()」を調べた。

# DOC
factor() takes a polynomial and factors it into irreducible factors over the rational numbers. For example:
https://docs.sympy.org/latest/tutorials/intro-tutorial/simplification.html#factor

# sympyの Matrix.inv()のfactor()
```python
# ver0.1
from sympy import *

var('a,b,c,d',real=True)
A=Matrix([[a,b],[c,d]])
print("#",        A                )
print("#",        A.inv()          )
print("#", factor(A.inv())         ) 
# print("#",       (A.inv()).factor())  # エラーがでます。
# print("#",        A.inv() .factor())  # エラーがでます。
# Matrix([[a, b], [c, d]])
# Matrix([[d/(a*d - b*c), -b/(a*d - b*c)], [-c/(a*d - b*c), a/(a*d - b*c)]])
# Matrix([[d/(a*d - b*c), -b/(a*d - b*c)], [-c/(a*d - b*c), a/(a*d - b*c)]])
# AttributeError: 'MutableDenseMatrix' object has no attribute 'factor'
# AttributeError: 'MutableDenseMatrix' object has no attribute 'factor'
```
数式の計算（ 1 桁） Python3編

https://paiza.jp/works/mondai/string_primer/advance_step8

文字列で書かれている数式を確定させて出力させる問題
前回学んだことを活かして下記のように
はじめ、＋かーかそうでなければ数値として、答え変数に代入し、
その後、＋かーかでフラグを立てて
その次の数値をフラグ通りに計算するという方法。

```py
s = input()
ans = 0
flag = 0
for i in s:
    if i == '+':
        flag = 1
    elif i == '-':
        flag = 2        
    else:
        if flag == 0:
            ans = int(i)
        elif flag == 1:
            ans += int(i)
        elif flag == 2:
            ans -= int(i)
print(ans)

```

答えを見てみるともっと簡単になってた。
奇数が数式で、偶数の場合数値が出るので
そこで場合分けする方法だった。

```py
s = input()

ans = 0
add = True
for i in range(len(s)):
    if i % 2 == 0:
        if add:
            ans += int(s[i])
        else:
            ans -= int(s[i])
    else:
        if s[i] == "+":
            add = True
        else:
            add = False

print(ans)

```
IBM Code EngineとIBM Container RegistryをIAM (サービスID) を使って接続する方法

# はじめに
IBM Cloudでコンテナをデプロイする際に、IBM Container RegistryとIBM Code EngineをIAM (サービスID) を使って接続する方法を情報共有する。

# 概要
以下の手順で進める。

```
## IBM Cloud
0. 環境準備する
1. いい感じの権限付与してサービスID作る
2. APIキー作る

## Local
3. APIキーを使ってdocker loginする
4. docker push する

## Code Engine
5. レジストリー・アクセス・シークレットを登録する
6. コンテナー・イメージ情報を入れる
```

# 詳細
## IBM Cloud

### 0. 環境準備する
ここらを準備する。

```
IBM Code Engine # コンテナをサクッとデプロイできる
IBM Container Registry # コンテナイメージを置く場所
```

### 1. いい感じの権限付与してサービスID作る
管理→アクセス（IAM）から設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/ffb9e594-cf0f-20f4-7d2a-c253880415cf.png)

必要そうなアクセス権を選択する。
できるだけ、権限狭くなるように、リソースのところも、リソース・グループを選んで制限した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/b1b81f03-2f5a-0926-4986-25789014b40c.png)

### 2. APIキー作る

ポチポチ押して作る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/7375bd27-d464-b6a6-3d93-478c9153ea58.png)

## Local
### 3. APIキーを使ってdocker loginする
ここらを参照しながら、コマンドを打ってく。

https://cloud.ibm.com/docs/Registry?topic=Registry-getting-started&locale=ja
https://cloud.ibm.com/docs/Registry?topic=Registry-registry_access&locale=ja

ユーザー名はiamapikeyになるらしい。`registry_domain`の`us.icr.io`はリージョンによって違う。

```
ibmcloud login
docker login -u iamapikey -p {apikey} us.icr.io
```

### 4. docker push する

こんな感じで、コンテナをビルドしてプッシュする。ドメインやネームスペース等は要変更。

```bash
docker build -t hoge:latest . --platform linux/amd64
docker tag hoge us.icr.io/my_namespace/hoge:latest
docker push us.icr.io/my_namespace/hoge:latest
```

## Code Engine
### 5. レジストリー・アクセス・シークレットを登録する
Code EngineからContainer RegistryにアクセスするためにAPIキーを登録する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/f21ad09e-e682-c932-d552-9ce40e96f332.png)


### 6. コンテナー・イメージ情報を入れる
必要な情報を入れてデプロイ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/21e16101-a7f7-072c-ed99-5336446b9f20.png)


# 参考
CLIでやる方法が書かれてる
https://cloud.ibm.com/docs/Registry?topic=Registry-iam_access&locale=ja
AWS re:Invent 2023で発表されたこと(11/28時点)

# はじめに
AWSはラスベガスでAWS re:Invent 2023というテックイベントを開催しています。
そこで発表されたことをまとめました。
最新の情報は各自で調べてください。

# 一覧
+ Amazon Q
+ Amazon Bedrock
+ 次世代チップ
+ Amazon S3
+ サーバレス
+ 仮想デスクトップ
+ 手のひら認証

# Amazon Q
Amazon QとはAWS顧客向けのAI搭載チャットボットです。今回の大きな発表はAmzon Qだと思われます。
Amazon Qを使うことで「簡単にチャットしたり、コンテンツを生成したり、アクションを実行したりできる。それはすべて、システム、データ リポジトリ、運用の理解によって決まります。」(AWS CEO のアダム・セリプスキー氏)
Amazon Qは17年分のAWS知識に基づいてトレーニングされており、質問に答えるだけでなく、アプリのワークロードの微妙な違いを理解し、数秒しか実行されないアプリ向けのAWSソリューションや製品を提案するなどの機能も備えています。

👇続きはこちら

https://aws.amazon.com/jp/q/

# Amazon Bedrock
Amazon BedrockにGuardrails（ガードレール)という新機能が発表されました。
これをを使用すると、企業はモデルで使用できる言語の種類を定義および制限できます。
例えば、モデルの範囲外のトピックを定義すると、無関係な質問には答えられなくなるようです。

👇詳細はこちら

https://aws.amazon.com/jp/bedrock/guardrails/

# 次世代チップ
モデルのトレーニングと推論用の最新世代のチップを発表しました。
第1世代のTrainiumと比べて最大4倍優れたパフォーマンスと2倍優れたエネルギー効率を実現するように設計されたAWS Trainium2が発表されました。
今朝発表された2番目のチップはGraviton4と呼ばれ、推論を目的としています。

# Amazon S3
S3の新しい高パフォーマンスかつ低レイテンシー層であるAmazon S3 Express One Zoneと呼ばれるS3オブジェクトストレージサービスのメジャーアップデートを行いました。
One Zoneは、AI/MLトレーニング、財務モデリング、ハイパフォーマンス コンピューティングなどのデータ集約型アプリケーションのパフォーマンスを大幅に向上させます。

# サーバレス
Aurora、ElastiCache、Redshiftのサーバーレスサービスの管理を容易にする3つの新しいサーバーレス製品を発表しました。
Amazonによるこれらの新しいサーバーレス製品は、ハードウェア管理とリソース割り当ての責任をAmazonが担うことで、サーバーレスサービスの管理をより効率的かつユーザーフレンドリーにすることを目指しています。

# 仮想デスクトップ
企業ユーザーがインターネット経由でAmazon WorkSpacesなどの仮想デスクトップ環境にアクセスできるようにする、195ドルの新しいデバイスを発売しました。
このデバイスはFire TV Cubeのハードウェアに収容されており、ストリーミングメディアプレーヤーを製造する小売大手の部門からの既存の専門知識を活用するためにAmazonが決定したとのことです。
Amazonは、新しいハードウェアを製造する決定が、デスクトップやラップトップをより安価なハードウェアに置き換えることでIT支出を減らしたいという顧客からのフィードバックに基づいていると説明しています。

# 手のひら認証
企業が物理的な施設への入場時に人々を認証するための新しい手のひらスキャン認証サービスを発表しました。
このサービス「Amazon One Enterprise」は、2020年にデビューした同社の既存のAmazon Oneオファリングを基にしています。
Amazon Oneは、Amazon自身が運営する監視機能付きのレジなし店舗で生体認証による支払いを可能にするために導入されました。
Amazon Go店舗の訪問者は、支払いカードを自分の手のひらの印刷と関連付けることができ、手をスキャナーの上にかざすだけで店に入店し、取引を完了することができます。

講演の視聴はこちらから
https://reinvent.awsevents.com/
Solidity x ECSパターンとMUD

この記事では、Latticeが開発した「**MUD**」フレームワークを用いて、Solidityにおける**Entity Component System**（ECS）を実現する方法について探ります。

MUDは、ECSを組み込んだ革新的なSolidityフレームワークで、コントラクト設計に新たな視点を提供します。また、**Diamond Proxyパターン**（EIP2535）を知っていると、より理解が深まると思います。MUDはDiamond Proxyと似ている部分があります。

MUD: https://mud.dev/
DiamondProxy: https://eips.ethereum.org/EIPS/eip-2535

### ECSとは？

ECSはゲーム開発から派生したソフトウェアアーキテクチャのパラダイムで、「継承」よりも「構成」を重視します（Composition over inheritance）。Solidityコントラクトの継承の複雑さに対処し、個々のComponentとロジックを用いてモジュラーな設計を促進します。

- **Entity**：オブジェクトを表すID。
- **Component**：テーブルのような構造化されたデータ。
- **System**：ロジック。

この説明だけだとわかりづらいと思うので、実際の使われ方を見てみましょう。

### MUDにおけるECSの活用

MUDには多くの機能が存在しますが、Store機能を見ると、ECSがどのように活用されるかが明確になります。

1: レイアウトの設定：`mud.config`でテーブルレイアウトを定義し、EntityとComponentの構造を指定します。

```json
//Positionテーブルを定義
Position: {
  valueSchema: {
    x: "uint32",
    y: "uint32",
  },
  ...
```

2: EntityとComponentの作成：MUDのCLIツールを使用して、`mud.config`に基づきEntity IDとComponentを生成します。

```
//定義ファイルよりEntityとComponentが生成される

//Entity ID
bytes32 constant _tableId = bytes32(abi.encodePacked(bytes16(""), bytes16("Position")));
bytes32 constant PositionTableId = _tableId;

//Component
struct PositionData {
  uint32 x;
  uint32 y;
}

library Position {
  function getX() internal view returns (uint32 x) {
...
```

同時にgetter/setterが定義されたライブラリが出力されます。

3: Systemコントラクトの開発：Systemコントラクトはテーブルのデータを扱います。

```
//Systemコントラクトからテーブルのデータにアクセスする
import { PositionTable } from "../codegen/index.sol";

contract PositionSystem is System {
  function move(uint32 x, uint32 y) public {
    PositionTable.set(x, y);
  }
}
```

実際には、ユーザーはWorldコントラクトを介して取引し、Systemコントラクトとのやり取りにはdelegateCallを使用します。これによりすべてのデータはWorldコントラクトのストレージスロット内に保持されます。

![gazsbCcTfKiHK_Vm9NPBn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117960/8e622b78-5dde-f71d-1c3e-f7d0bcdc2c2c.png)
*MUDアーキテクチャ図*

上記の図より、コントラクト全体が複雑になった場合でも、多重継承ではなく、並列にコンポーネントを並べていく設計思想が読み取れると思います。

### MUDとDiamondProxyの比較

MUDとDiamondProxyパターンは、delegateCallの使用とストレージの分離という点で類似しています。

![diamondproxy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117960/0d9791a6-5339-95d5-0fde-842f86628fa8.png)
*DiamondProxyパターン*

ただ、両者は目的が異なります。DiamondProxyはファンクションの追加やアップグレードに焦点を当てているのに対し、MUDはECSを用いたコントラクトの構造化に重点を置いています。

また、MUDはDiamondProxyに比べて多くのコントラクトを含んでおり、その複雑さが特徴です。この複雑さを踏まえると、ECSを維持しつつ構造をシンプルにする新しい軽量フレームワークの開発が考えられます。このようなフレームワークは、自動生成されるComponentコントラクトとシンプルなStoreコントラクトから成る可能性があります。

### おわりに

MUDフレームワークはSolidityにおいてECSを実装するためのユニークな方法を提供しますが、その複雑さから、もっとシンプルで軽量なフレームワークが同様に効果的である可能性があります。

もしこの考えに賛同し、協力や議論をしてくれるエンジニアの方がいたら、お気軽にご連絡ください。

- Github（作成中）

https://github.com/yamapyblack/SolidityECS

- X

https://twitter.com/yamapyblack
JVMとは 〜Javaのプログラムはなぜ動くのか〜

# はじめに
今回の記事では、JVMとJavaのプログラムが実行されるまでの一連の流れをまとめました。

# JVMとは
JVM(Java Virtual Machine)とは、Java仮想マシンとも呼ばれ、Javaのプログラムを動かすために必要なソフトウェアです。JVMのおかげで、様々なOS上で簡単にJavaのプログラムを実行することができます。

# JVMを理解するために必要な知識
### コンパイラ
コンパイラは、ソースコード（.java file）をバイトコード（.class file）に変更します。そして、コンパイラはソースコードに構文エラーがないかをチェックします。エラーを発見した際には、コンパイルエラー（Compile Time Error）がスローされます。

### バイトコード
コンパイルの結果生成されたコードで、JVMによって処理されます。
特定のコンピュータやOSに依存せず、仮想マシン上で実行するために生成された中間コードで、ソースコードと機械語の間に位置するコードです。

### 機械語
コンピュータが理解できるコードで、CPUによって処理されます。機械語は0と1の2進数で表現されます。

# Javaのプログラムはなぜ動くのか
Javaのプログラムがコンパイルされると、バイトコードが生成されます。このバイトコードがJVMによって機械語に変換されます。そして、CPUがその機械語を処理することで、Javaのプログラムが実行されます。

# なぜJVMが必要なのか
JVMはどんな環境でもJavaのプログラムを実行できるようにします。

例えば、MacOS上でJavaのプログラムを実行したいときはMacOS用のJVM、Linux上で実行したいときはLinux用のJVMというように、各OS用のJVMをシステムにインストールすることで、様々なOS上で同じJavaのプログラムを実行することができます。

このように、JVMがOSの違いを吸収することで、JavaをMacOS、Linux、Windowsなど様々なOS上で実行することができます。

:::note info
一度コンパイルされたJavaのプログラム（バイトコード）は、様々なOS上で実行可能です。それは、各システム用のJVMが、そのバイトコードを各システム用の機械語に変換するからです。
:::

 # 図解してみる
 ![スクリーンショット 2023-11-29 13.02.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576475/900661b5-6284-8cd2-1378-58e093cb7515.png)

 # 参考文献
 * [Difference between Byte Code and Machine Code - GeeksforGeeks](https://www.geeksforgeeks.org/difference-between-byte-code-and-machine-code/)
 * [Java Bytecode - JavaPoint](https://www.javatpoint.com/java-bytecode)
 * [Types of Errors in Java with Examples - GeeksforGeeks](https://www.geeksforgeeks.org/types-of-errors-in-java-with-examples/)
 * [What is Java Compiler | How works it - Scientech Easy](https://www.scientecheasy.com/2021/03/java-compiler.html/)
 * [JVM vs. JRE vs. JDK: What’s the Difference? - IBM](https://www.ibm.com/blog/jvm-vs-jre-vs-jdk/)
 * [How JVM Works – JVM Architecture? - GeeksforGeeks](https://www.geeksforgeeks.org/jvm-works-jvm-architecture/)
「sympyのArray()」を調べた。

・Arrayで、diffができましたが、invができませんでした。

# sympyで
```python
from sympy import *

var('x',real=True)
M=Matrix([[2*x,3*x],[4*x,5*x]])
print("#",M       ,type(M))
print("#",M.diff())
print("#",M.inv() )
print()
A=Array ([[2*x,3*x],[4*x,5*x]])
print("#",A       ,type(A))
print("#",A.diff())
print("#",A.inv() )
# Matrix([[2*x, 3*x], [4*x, 5*x]]) <class 'sympy.matrices.dense.MutableDenseMatrix'>
# Matrix([[2, 3], [4, 5]])
# Matrix([[-5/(2*x), 3/(2*x)], [2/x, -1/x]])

# [[2*x, 3*x], [4*x, 5*x]] <class 'sympy.tensor.array.dense_ndim_array.ImmutableDenseNDimArray'>
# [[2, 3], [4, 5]]
# AttributeError: 'ImmutableDenseNDimArray' object has no attribute 'inv'
```
# DOC

https://docs.sympy.org/latest/modules/tensor/array.html

https://docs.sympy.org/latest/tutorials/intro-tutorial/matrices.html
【Swift】いつも忘れるif let

# 目次
[1.いつも忘れるif letの役割](#1-いつも忘れるifletの役割)
[2.実例](#2-実例)
[3.おわりに](#3-おわりに)

# 1. いつも忘れるif letの役割
私だけかもしれませんが、```if let ~```は何しているんだっけ？　となります。
本記事は```if let ~ ```のイメージを心に刻み込むための記事です。

# 2. 実例
 ~~~swift:if let構文
 if let people = friend {
     peaple.name()
 } else {
    print("no friends TT")
 }
 ~~~

 これを以下のように読み替えてください。
 ~~~swift: if let構文読み替え
 if peaple != nill {
     let peaple = friend!
     peaple.name()
 } else {
     print("no friends TT")
 }
 ~~~

 # 3. おわりに
 swiftにおいて「nillを許容するかどうか」の```オプショナルバインディング＋変数の定義```と考えるとわかりやすいと思います。
 今回も、本記事を最後まで読んでいただき誠にありがとうございました。
AWS ALBでリクエスト転送先に設定するターゲットグループを作成する

## 概要

ターゲットグループを作成してみる。EC2インスタンスはすでに作成済みであるものとする。
ターゲットグループの設定は基本的にALB → EC2インスタンス間の通信時のルールを決める。

## 前提

当該のEC2で提供されているWebアプリにヘルスチェックエンドポイントかヘルスチェックページ、もしくは認証不要で200が変えるURL（ログイン画面）が存在していること。
ターゲット先のEC2インスタンスが起動していること。

## 基本的な設定項目

| 項目 | 成約や選択や内容 | 備考 |
| --- | --- | --- |
| ターゲットタイプ | 「インスタンス」 or 「IPアドレス」 or 「Lambda関数」 or 「Application Load Balancer」 | 今回は「インスタンス」を選択 |
| ターゲットグループ名 | 32文字以下で日本語不可 |  |
| プロトコルポート | 複数の選択肢から選択 | 「HTTPS」の443ポートを設定<br>これはALBがバックエンドのターゲットにトラフィックを転送するときに使う<br>あくまでALB → インスタンス間の通信プロトコルを指定しているだけ |
| IPアドレスタイプ | v4とv6から選択 | これもALB → インスタンス間の通信時の話 |
| VPC | 既存VPCから選択 | 接続先が存在する場合のVPCを選択する |
| プロトコルバージョン | 「HTTP1」 or 「HTTP2」 or 「gRPC」から選択 |  |
|  |  |  |

## 方法

1. AWSのコンソールにログインしEC2の画面を開く。
1. 左サイドバーにて「ロードバランシング」の「ターゲットグループ」を選択する。
1. 「ターゲットグループの作成」をクリックする。
1. 各種設定を行い、内容を確認して「次へ」をクリックする。
1. ターゲットのインスタンスを一覧から指定して、「ターゲットタイプを作成」をクリックする。
1. エラーなくターゲットタイプが作成されたら作業完了となる。
Route53へ登録しているドメインの年次自動更新を無効化する手順メモ

# Amazon Route 53 からメッセージが届いていたことがきっかけ
![スクリーンショット 2023-11-27 17.17.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/4a16c146-e78b-e430-0a65-c736bb7938fb.png)
内容をまとめると、以下の内容でした。
- 登録したドメインは Amazon Route 53上で、2023年11月28日に自動更新される予定。
- このドメインの年次自動更新が有効の状態。
- このドメインを保持し続けたい場合は、特にアクションは必要ありませんが、このままでは2023年11月28日に、AWS アカウントに年間登録料金が請求されてしまう。 
- 更新したくない場合は、2023年11月28日までに自動更新を無効にしてください。

AWSの個人利用は一旦、廃止とする方針になっていたため、自動更新を無効化することにした

# ドメインの自動更新を無効化するための対処法
1. Route53のダッシュボードへ行き、登録しているドメインを確認する。
![スクリーンショット 2023-11-27 16.59.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/d51be833-10f5-7c5f-134d-25371f110f54.png)
1. 対象のドメインを選択する。
![スクリーンショット 2023-11-27 16.59.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/98b094dc-f8c5-485f-244c-effe8674ade4.png)
1. 自動更新が「オン」になっていることを確認し、『アクション』から『自動更新をオフにする』を選択する。
![スクリーンショット 2023-11-27 17.03.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/9d4f90e2-0752-3b12-491c-e019e0fa71c3.png)
1. 自動更新が「オフ」になっていることを確認して、対処は終了。
![スクリーンショット 2023-11-27 17.03.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/861cc040-c81c-dfd2-3c64-e8b8d19055fe.png)

# 本記事における注意事項
- 本記事は、備忘録としてまとめたものになります。
- 他の方の参考になる可能性も踏まえて、一般公開も行なっております。
- また記載内容はすべて、正しい内容が記載されているとは限りません。
- 誤った内容を見つけた場合は、ご指摘をお願いいたします。
Databricks にて Lakeview ダッシュボード公開時の資格情報の埋め込みに関する検証

## 概要

Databricks にて Lakeview ダッシュボード公開時の資格情報の埋め込みに関する検証内容を共有します。資格情報を埋め込むことでデータソースのテーブルに対して SELECT 権限がないユーザーに対してデータを表示でき、資格情報を埋め込まないことで SELECT 権限がないユーザーにデータを表示させないことができるようです。本記事ではその検証コードと結果を共有します。

lakeview ダッシュボード公開時に資格情報を埋め込み関する設定ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0bbe11ff-dd89-71ef-23bf-a0f6f7e16df6.png)

資格情報に関する設定値については、次のようにドキュメントに記載されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/45fe38f3-b87a-415a-4fbf-fd2b6c1388d6.png)

引用元：[Lakeview ダッシュボードとは - Azure Databricks | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/databricks/dashboards/lakeview#publish-a-lakeview-dashboard)

資格情報の設定有無により、データの表示可否がかわりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/043f0048-d000-b62e-500e-36fc17c67d66.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/8b5e9954-2c44-6073-86be-d7460b707049.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/1d58a0c9-f399-670f-ce0a-12b452c4b8cb.png)

## 事前準備

### データソースのテーブルを作成

```sql
CREATE CATALOG lakeview_test_01;
CREATE SCHEMA lakeview_test_01.schema_01;
CREATE TABLE lakeview_test_01.schema_01.nation
  DEEP CLONE samples.tpch.nation;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/b9f4ae58-986d-ed1b-d123-f0cdb6649409.png)

### 権限検証用ユーザーで SELECT が実施できないことを確認

```sql
SELECT
  *
  FROm
    lakeview_test_01.schema_01.nation
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/1bc2df5f-3379-6f8d-32a0-f1ab13946051.png)

### lakeview ダッシュボードを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/e739295f-6030-0b25-e45a-50862bb2a117.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/13fc410b-bd6b-7f82-a366-04ed11223dc0.png)

### 権限検証用ユーザーにlakeview ダッシュボードに対する参照権限を付与

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/dc826f08-c2e7-6725-816d-5cf3f5a17224.png)


## 資格情報の埋め込みに関する検証

### 1. `資格情報を埋め込む`設定で公開した場合の動作

権限検証用ユーザーにて、ダッシュボード上にデータを表示できることを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/191f9bfe-f45a-0867-9e88-4fcd9794b66b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/8b5e9954-2c44-6073-86be-d7460b707049.png)

### 2. `資格情報を埋め込まない`設定で公開した場合の動作

権限検証用ユーザーにて、ダッシュボード上にデータを表示できないことを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/043f0048-d000-b62e-500e-36fc17c67d66.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/1d58a0c9-f399-670f-ce0a-12b452c4b8cb.png)

> User does not have USE CATALOG on Catalog 'lakeview_test_01'.
firestoreでどうにも〜が

firebase firestoreでどうにも〜が検索出来ないのでchatGPTに聞いてみた。


「〜」が削除されない問題については、いくつかの原因が考えられます。JavaScriptにおいて、特定の文字が期待通りに置換されない場合、その文字が通常のキーボード入力で生成された文字ではない可能性があります。このような場合、Unicodeを使用して正確な文字を指定する方法が有効です。

「〜」は、異なるUnicode文字で表されることがあります。例えば、全角の波ダッシュ（U+301C）や、半角のチルダ（U+FF5E）などがあります。これらの文字を正しく識別して置換するには、Unicodeを使う方法があります。

以下のコードは、これらの異なる「〜」を対象に置換を行います：

```javascript
let product_id ="どうにも〜が検索出来ない";
product_id = product_id.replace(/\u301C|\uFF5E/g, "\u301C");
const productRef = await Firebase.firestore()
          .collection("Products")
          .doc(product_id);
const doc = await productRef.get();
if (!doc.exists) {
          alert("製品が見つかりません。再選択してください");
} else {
          this.product = doc.data();
          this.product.id = doc.id;
}
```

このコードでは、正規表現（`/\u301C|\uFF5E/g`）を使用して、全角の波ダッシュと半角のチルダの両方を空文字に置換しています。`/g`フラグは、文字列内のすべての該当する文字に対して置換を行うことを意味します。

この方法で「〜」が正しく削除されるか試してみてください。


とのことでした。

早速置換してみたらDocument IDで検索出来るようになった。

key valueでwhere文も問題ありません。

ありがとう　chatGPT