OmniAICreator/Qiita-1.07M huggingface dataset:
Teamsのメッセージ本文からURL部分のみ抽出する【Power Automate】

## はじめに
Teamsのメッセージ本文に含まれているaタグのURL部分のみを
Power Automateの**IndexOf関数とSubString関数**を用いて
抽出する方法をご紹介いたします。
※あくまで一例です、もっと良いやり方があるかもしれません…！

## 実施内容
### 変数の用意
以下の4つの変数を用意します。

・開始位置：Integer型
・終了位置：Integer型
・差：Integer型
・Aタグ：String型

### 関数の設定
用意した4つの変数のValueに関数を設定します。

```
開始位置：Integer型
add(indexOf(items('aタグ'),'href="'),6)

終了位置：Integer型
indexOf(items('aタグ'),'" rel=')

差：Integer型
sub(variables('終了位置'),variables('開始位置'))

Aタグ：String型
substring(items('aタグ'),variables('開始位置'),variables('差'))
```

### ※関数の役割の説明

メッセージ内のaタグは以下のように記載されています。
`<a href="URL" rel="noopener noreferrer">URL/表示するテキスト</a>`

そのため、
開始位置の関数で「href=" https://~ 」の6文字目の文字列、つまり**httpsのh**の位置を特定します。
次に終了位置の関数で「rel=」が書かれている箇所、つまり**アドレス部分の最後の文字**の位置を特定します。
そして差の関数を使って、終了位置 － 開始位置 でURLの長さを取得し、
Aタグの関数で開始位置からURLの長さ分、文字列を抽出します。

## さいごに
aタグが複数含まれているケースはループ文を使って処理する必要があります。
そのやり方については以下に記載しておりますので、よろしければご一読ください～。

https://qiita.com/fumiyaaaa/items/62c135a8c8348800cd02
IX2215コマンド記録


```
設定を書き込む(これをやらないとアップデートで設定が消える)
write memory
```

```
IPアドレスの設定
enable-config
interface <GigaEthernet2.0>
ip address <192.168.10.1/24>

<>内は例です。設定したいインターフェースやIPアドレスが違う場合は、変更しなければいけません。
```

```
現在音設定を確認する方法
enable-config
show running-config
```


```
再起動
reload
```


```
再起動
reload
```

```
バージョンを確認する
show version
```
【ChatGPT】ビジネス文書の最終チェックに使えるPromptをご紹介。


　どうも、カーブミラーです。

　今回は、ビジネス文書の最終チェックに使えるPromptをご紹介します。Promptはこの記事内にはありません。

:::note info
本記事は、ChatGPT（Plus版）
で行なっております。
画像はありません。あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)
***
　こちらも載せますね。
　　[ChatGPTが使えない？ログインできない・反応しない原因やエラー時の対処法を解説](https://aismiley.co.jp/ai_news/chatgpt-error-resolution-explanation/)
***
　まずは、
　　ChatGPTの不具合？ニュースです。

　これは
　　スマホブラウザで
　　　Web版を操作している人限定
　　　　かと思われる現象です。

　ここしばらく
　　Canvas機能が働きませんでした。
　　　現在も働きません。

　ChatGPTも
　　“Canvasって何？”状態。

　そこで
　　ブラウザを
　　　“PC版サイト”に設定して
　　　　再生成してみました。
　　　　　ちゃんとCanvas機能が
　　　　　　働きました。

　こうなると
　　設定を戻してもOKです。
　　　ちゃんと働いてくれます。

　おそらくですが、
　　ChatGPT内部で、
　　　ブラウザが
　　　　PC版サイト設定なのかを
　　　　　チェックしていて、
　　　　　　モデルを切り替えている
　　　　　　　のかと思われます。

　モデルの自動切り替えが働き、
　　GPT-4o with Canvasに
　　　ならなかったのかと。

　PC版サイトに設定して
　　ようやく規制が外れて
　　　GPT-4o with Canvasが
　　　　働くようになった。

　なぜこんな仕様にしたのか、は
　　わかりませんが、
　　　そのうち修正が入るでしょう。
　　　　期待薄ですが。
***
　では、【本題】です。

　今回は、
　　ビジネス文書の最終チェックに
　　　使えるPromptをご紹介します。

　ビジネス文書は
　　内々ならば、許されるものでも
　　　ほかの部署やほかの会社様に
　　　　出す場合は、
　　　　　誤字脱字等をチェック
　　　　　　しなければなりません。
　　　　　　　当然かと思います。

　以前は、
　　同僚や上司に見せて
　　　確認をしていました。

　しかし、
　　人間のすること。
　　　穴はあるものです。

　そんな確認作業は
　　こちらも相手も時間の浪費です。

　せっかく生成AIがあるのだから
　　任せてしまいましょう。
　　　少なくとも、相手に見せる前に
　　　　チェックはしておきたい
　　　　　ところです（よろしく🤣）
***
　さて、
　　生成AIに任せる、とはいえ
　　　ビジネス文書の校正は
　　　　単純ではありません。

　　誤字脱字チェックは当たり前。
　　　相手によっての言葉の使い分けも｡

　　相手から優しく指摘されるのは
　　　恥ずかしいこと。

　　厳しく指摘されるのは
　　　ありがたいこと。

　　でも、黙り込む場合は
　　　信用を失ったこと。

　　　信用を取り戻すには
　　　　簡単ではないのです（マジで）

　　そうならないためにも
　　　ビジネス文書の校正は
　　　　必要不可欠です。

　そこで紹介するのが
　　今回のPromptです。

　このPromptは、
　　miraiさんが教えてくださいました。

　miraiさんは、
　　次世代AI検索エンジンFelo
　　　公式アンバサダーを
　　　　やっておられます。

　Promptは
　　miraiさんの
　　　下記のnote記事を
　　　　参照してください。
　　　　　力作っぽいので
　　　　　　さすがにコピペはマズい😅
[書類やレポートを提出する前の最終チェックで使える！「誤字脱字・文脈チェッカー」プロンプト付き](https://note.com/miraispark/n/n3e6b9523b17b)

　miraiさんは、
　　このPromptで、
　　　思わぬ指摘を得て
　　　　驚かれているそうです。
***
　使い方は、
　　このPromptを入力して送信。

　　返事が来たら、
　　　校正したい文書を入力します。
　　　　もちろん、ファイルの
　　　　　アップロードでもOKです。

　　あとは
　　　指摘されるだけです。
　　　　深堀りしていくのもアリです。

　　次の文書を処理する場合は、
　　　文書の入力とともに
```Text:次の文書を処理する場合
最初のPromptに従ってください。
```
　　　　　と入力して送信すれば
　　　　　　継続してくれます。
***
　ちゃんと使ってみましたw

　私は、
　　ビジネス文書を
　　　扱わない仕事なので
　　　　テストできぬ🤣

　その代わり、
　　自作小説の一章分を与えてみました｡
　　　ビジネス文書では
　　　　ありませんので、
　　　　　参考程度に、です。

　小説の誤字脱字は
　　すでにチェック済のものです。
　　　人間の目でですが😅

　肝心のPrompt実行結果ですが、
　　やはりビジネス的な指摘が
　　　出てきました。

　小説はライトノベルなので、
　　“そんな硬い表現は……”とか
　　　“必要があって簡潔にしたのよ”とか
　　　　指摘内容にツッコミを入れて。

　しかし、
　　このPromptを何も修正せずに
　　　実行して、これだけの指摘が
　　　　できたことは確かです。

　このPromptを改造して
　　ライトノベル用にしても
　　　いいかもしれませんね😸
　　　　あっ、それはオレ得か(汗)

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
***
PS.
あとから再度確認したところ、
このPromptは、
GPTs用のPromptでした。

つまり、
“ご自分で修正してGPTsを作成して使ってくださいね”
というmiraiさんのご好意なのでしょうね。
ありがとうございます😊　>miraiさん
カーソルの表示/非表示を切り替えるブックマークレット

こんにちは、りょうです。
今回はカーソルの表示/非表示の切り替えが簡単にできるブックマークレットの紹介です。
(ほんとうに誰得なんこれ)

### ブックマークレットとは
ブラウザのブックマークにjavascriptのコードを入れて、押すだけで実行できるようになる簡易的なプログラムです。
(そういう認識なんだけど間違ってたら教えてください)

### カーソルの表示切り替えブックマークレット

```cursor.js
javascript:(function(){
    const elements = document.querySelectorAll('*');
    elements.forEach(el => el.style.cursor = el.style.cursor === 'none' ? '' : 'none');
})();
```
このコードをこのようにブックマークに登録して、押すと実行されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/2ddaff7c-6b22-da80-9d5b-c94cb4b3fefc.png)

### コードの説明
```js
    const elements = document.querySelectorAll('*');
```
↑ページ内の要素全部を取得してelements変数にぶちこむ。
```js
    elements.forEach(el => ... );
```
↑各要素に対して処理を実行するためにforEachを使用しています。
```js
    el.style.cursor = el.style.cursor === 'none' ? '' : 'none'
```
↑カーソルの表示切り替えを行っている箇所です。
カーソルがすでにnone(表示されていない状態)であれば表示する。
そうでない場合(表示されている場合)はnoneで非表示にします。

### まとめ
今回はカーソルの表示、非表示を切り替えるブックマークレットの紹介でした。
非表示になっているだけなのでクリック等は普通にできます。
学校のChromebookなどではブックマークレットの実行がPolicyで規制されている可能性があるのでその場合はできません。

わからないことあったら書いてくれれば答えていきます。

**Discordにいる荒らしの情報や対策方法の共有をしている自鯖です**
ぜひ参加お願いします↓↓↓↓

https://discord.com/invite/ESRGwGQhxc
Zendesk API でエンドユーザー作成時にエラー Client error: `POST https://{subdomain}.zendesk.com/api/v2/users.json?xxxxx...` resulted in a `422 Unprocessable Entity`...

お問い合わせメールやチャットほかヘルプデスク管理を効率的に行うためのクラウドベースのソフトウェアソリューション、Zendesk。

Zendeskに関する詳しい説明は省きますが、API経由でzendeskのエンドユーザー作成（カスタマー用アカウント作成）をしようとしたら以下のエラーになりました。

:::note warn
APIのリクエストにはPHP/LaravelおよびGuzzleHttpを使用しています。
:::




```php:Laravel
GuzzleHttp \ Exception \ ClientException (422)
Client error: `POST https://{subdomein}.zendesk.com/api/v2/users.json?xxxxx...` resulted in a `422 Unprocessable Entity`
```

`Unprocessable Entity` というのが見慣れないエラーメッセージでしたが、

_Unprocessable = 加工不可、処理不能_ 
_Entity = エンティティ、実体_

とすると **「処理できないデータです」** くらいの意味合いでしょうか。
HTTPのレスポンスステータスコードが `422` ということもあり、こちらからリクエストを出しているデータ（パラメータ）に不備がありそうではあります。

[Mozilla/MDN web docs - 422 Unprocessable Entity](https://developer.mozilla.org/ja/docs/Web/HTTP/Status/422)

---

Zendesk公式のヘルプ記事では以下の情報が見つかりました。

[Error : 422 Unprocessable Entity](https://support.zendesk.com/hc/en-us/community/posts/4966731442074-Error-422-Unprocessable-Entity)

使用しているエンドポイントが異なるため完全に一致するケースではありませんが、Zendesk側からは以下のやり取りが行われています。
>  Could you confirm that this user actually exists in your Zendesk instance? Perhaps it did at one point and then was either deleted or merged with another user?
>> （日本語訳: Google翻訳）このユーザーが実際に Zendesk インスタンスに存在するかどうか確認できますか? おそらく、ある時点では存在していたものの、その後削除されたか、別のユーザーと統合されたのでしょうか? 

結論から言えば、今回の自身のエラーに関しては
**「同じメールアドレスで重複してユーザー登録をしようとしていたため発生したエラー」**
でした。
だから **処理できないデータ** ということだったんですかね。

もっとわかりやすいエラーの文面を返してほしいものだと思いますがユーザー周りはデリケートな部分ではあるので（例えばログイン情報登録時にそのメールアドレスで既に情報が存在しているかを悪意あるユーザーに知られるのはよくない等）、あえて表現を曖昧にしているという可能性もあるのかもしれません。

#### 参考URL
[zendesk developers - APIドキュメント](https://developer.zendesk.com/api-reference/ticketing/users/users/)
[HTTP 422エラーの解決方法](https://kinsta.com/jp/knowledgebase/http-422/)
[HTTPステータスコード422とは](https://qiita.com/Hashimoto-Noriaki/items/c9a3b638ee137a0b347c)
pipenv多用によるムダかもしれないvenvを整理する(適当)

# なにをしてるのか?

pipenvを使って仮想環境を作るじゃないですか。でもこれって、作るきっかけとなったディレクトリがあったから作成されたわけで、ちょっと作って不要になったら『きっかけのディレクトリ』が削除されてしまっていて、作成された仮想環境が無意味になってしまうことがありませんか?

ディレクトリを削除する前に`pipenv --rm`しろよ、という話もありますが、していなかった場合に山積してしまうので、そういうものを削除したいという話です。

# 前提条件

今回の前提条件は以下の通り。

- macOS(Sequoiaにて確認)
- シェルを使います

# どこに仮想環境はあるのか

実際に仮想環境を使っているディレクトリがわかっていれば、そのディレクトリに入って`which`すればいいわけですよね。

```zsh
% cd ~/some/sourcedir
% pipenv run which python
```

このとき可能性は2つありそうです。

- このディレクトリ直下(`.venv`など)
    - これはディレクトリそのものを消せば済むだけなので楽ちん
- `~/.local/share/virtualenvs`
    - ここにこれまで作られたものが山積みとなっている

ここでは後者が問題となります。

# 仮想環境はどのディレクトリを生成源としているのか

ちょっと確認すると、各仮想環境ディレクトリにある`.project`ファイルに入っています。

```zsh
% cd ~/.local/share/virtualenvs
% ls
FugaPythonTest-mnWoDknf         calc-9yT_M8cQ                   dockerbook-Cv0d3VR9             github-pages-sample-S_lCV0KN    pythonProject3-ueJ4H6Z-         tmp-agwWamBd
apiserver-study-kit-7r5IN4zl    compose-wordpress-ayvybK9J      fastapi-KYozqYVt                jsd-gPxllzqj                    pythontest-BcnVINUZ             xampp-devenv-YPuEHIYF
asbook-ZYHrOfTI                 deco-VHY-sAUw                   flet-calc-R8ij6Hm7              numpy-SUf2Jong                  restart-router-WH7gP2l4         xampp-devenv-doc-YDoh67jC
book-m9RVk3aO                   django-sample-O3yebDy3          github-book-ci5jYApU            python-study-template-G4FxdT1f  tests-Xz5WsfNt                  xampp-system-O_UCM2x4
% cat calc-9yT_M8cQ/.project  
/Users/densuke/Documents/calc
```

ということは、雑に考えれば、このディレクトリが無くなっていれば呼ばれることもないわけでゴミと考えて良いと思います。

なお、各ディレクトリにモジュールも入っているため、よく使っているところはそれなりに大きくなっています。

```zsh
% du -hs *    # ~/.local/share/virtualenvsにいること前提
 12M    FugaPythonTest-mnWoDknf
143M    apiserver-study-kit-7r5IN4zl
 90M    asbook-ZYHrOfTI
370M    book-m9RVk3aO
116M    calc-9yT_M8cQ
...(以下略)
```
 

# ではどうするか?

**各仮想環境の中にある `.project` に書かれたディレクトリがなければ削除する** というロジックでどうにかできそうです。

```zsh
% for DIR in *;do P=$(cat $DIR/.project); [ ! -d "$P" ] && echo "$DIR"; done
```

これで『既に存在しないディレクトリを向けに作られた仮想環境』が出力されることになります。
これらを削除すればいいわけですよね…

破壊的操作になるので実際の削除方法は書きません、ここまで来られた方はおわかりですよね。

# きっと『もっといい方法』があるはず

もっとシンプルな方法がきっとあると思います。
監視対象でアプリのインストールを禁止しているiPhoneに好き勝手なアプリをインストールする方法

※念の為、モバイルデバイス管理担当者への注意喚起の記事となります、悪用しないでね※

# 用意するもの：
1. 監視対象でアプリのインストール・Appストアの利用を禁止しているiOS端末（端末A）
2. Appストアから個人Apple Accountで好き勝手にアプリをインストールしたiOS端末（端末B・種別は同じに！）
3. iTunesをインストールしたWindows PC若しくはApple ConfiguratorをインストールしたMac

# 手順：
1. 端末BをiTunesまたはApple Configuratorでバックアップする
2. 端末Aを端末Bのバックアップから復元する
3. 起動してきたらMDMにチェックインし直す
4. 端末Bにインストールされていたアプリのアイコンが並んでいるのでどれかタップする
5. Apple Accountの入力を求められるので端末Bと同じものを入力する
6. インストールの完了を待つと禁止アプリが使える＼(^o^)／
※但しアップデートできない為いずれは使用できなくなる

# 防ぐ方法の例：
1. 構成プロファイルの制限ペイロードなどでホワイトリスト方式で使用できるアプリを限定する

2. 許可アプリ以外のインストールをアラート通知するようになどしてインストールが発見されたものをブラックリスト登録する
→いずれも内部的にインストールされた状態にはなり、MDMのデバイス情報などにはインストールアプリとして許可外のアプリが表示されますがアイコンが表示されず起動できません。

3. 構成プロファイルでApple Configurator以外とのペアリングを禁止する
→管理用のMacが必要・機種変更時にiTunesでのデータ移行ができなくなる（例外対応時は許可設定するなら別・ただ事故が起きるのはユーザーで非監視対象→監視対象端末に機種変を行う時なので……）・またペアリングしていないホストでのリカバリーモードを許可しないと起動しなくなった時にユーザーで解消できず厄介かも

# 防げない設定の例：
構成プロファイルの制限ペイロードで下記を禁止
* アプリのインストール
* アプリの自動ダウンロード
* アカウント設定の変更
→いずれも不可です。
この辺Appleの法人サポートやMDMの開発元もあまりわかってない印象

# その他小ネタ
https://developer.apple.com/jp/help/app-store-connect/test-a-beta-version/invite-external-testers/
に「管理対象Apple Accountは、ビルドのテストに使用できません。」と書いてあるのですが、実際は使用できます。
鵜呑みにして使用できないと書いてある記事も幾つかありますが……
エンタープライズiOS研究所さん
https://www.micss.biz/2024/06/10/7129/
では使用できるとちゃんと書いてありますね。流石です。
rex0220 計算式プラグイン レコード再利用時テーブル行を選択して設定

[計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73)で、レコード再利用時テーブル行を選択して設定する例です。

# 概要

レコード再利用時に、先頭に行追加し、ドロップダウンが "sample2" の行をコピーする例です。
TABLE_DATA 関数で、テーブル行の初期設定やテーブル行の再利用を行います。
※ABLE_DATA 関数は、 Ver.85 以降で利用できます。

![2025-01-17_11h09_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/bed51bc7-a3af-a5ee-8eae-6a5d2e316294.png)

# 操作例

![2025-01-17_11h16_52.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/eb01d5f4-a118-f99a-5d46-1f51a4fd9cf5.gif)

# アプリ設定

「テーブル初期設定制御用」文字列を追加

![2025-01-17_11h20_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/4ac656a5-e08f-20d5-6437-6f23764fcbc4.png)


# 計算式プラグイン設定

「テーブル初期設定制御用」に、レコード再利用時の計算式を設定

![2025-01-17_11h18_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/b94c6888-e41b-8f43-b7af-764ab9cdfde9.png)

```.js
// テーブル初期設定制御用 SINGLE_LINE_TEXT (hide)
IF(IN(EV_INFO("type"),"app.record.create.show","mobile.app.record.create.show"),
  FSET(テーブル,TABLE_DATA(
    ARRAY(
      DIC(
        "日付",	TODAY(),
        "文字列", "先頭行"
      )
    ),
    TABLE_MAP(テーブル,
      TPFILTER(ドロップダウン="sample2"),
      TPDIC(
        "日付",	日付,
        "ドロップダウン", ドロップダウン,
        "文字列", 文字列
      )
    )
  ))
)
```
[US Keyboard] 言語切替

# For Mac
`Alt`+`'`

# For Windows
`Ctrl`+`Space`

# 参考リンク
- [USキーボードって何？設定方法や製品選びのポイント・おすすめ製品も紹介](https://happyhackingkb.com/jp/life/hhkb_life41.html#:~:text=Windows%E3%82%92%E3%81%8A%E4%BD%BF%E3%81%84%E3%81%AE,%E3%81%A6%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82)
subprocess-exited-with-errorの解決法

# 概要
このリポジトリ(https://github.com/shabaz/gpu-cpm) をcolabで使おうとしたときに**subprocess-exited-with-error**というエラーが出て、なかなか解決出来なかったので解決法を残しておきます。

# エラー文
```python:
Processing ./gpu-cpm
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... done
Building wheels for collected packages: gpucpm
  error: subprocess-exited-with-error
  
  × Building wheel for gpucpm (pyproject.toml) did not run successfully.
  │ exit code: 1
  ╰─> See above for output.
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
  Building wheel for gpucpm (pyproject.toml) ... error
  ERROR: Failed building wheel for gpucpm
Failed to build gpucpm
ERROR: ERROR: Failed to build installable wheels for some pyproject.toml based projects (gpucpm)
```

# 解決法
pythonの**バージョンが高い**ことが、原因でした。2025/1/17現在、colabはpython3.11なので、python3.7に変更するとエラーはなくなりました。githubに上がっているコードは、昔のコードが多いので、**現在のpythonのバージョンで動かない**こともあるようです。

pythonのバージョンの変更はこのサイト (https://qiita.com/kotomiya07/items/c07e1ccce9033d843617) を参考にしました。しかし、この方法でバージョンを変更しても、ipynbで実行されるのは、元のバージョンのため、
```
!python3.7 example.py
```
というようにpythonファイルを直接実行しなければなりません。結局は、**バージョンを変更する際は、ローカルで実行するのがいいかもしれません。**
フロントエンドにReactを採用するか、Tailwindcssを採用するかの基準について

# フロントにReactを採用するか、Tailwindcssを採用するかの基準について

## Reactを採用する基準


### 大規模なアプリケーション開発
Reactはコンポーネントベースのアーキテクチャを採用しており、大規模なアプリケーションを効率的に開発・管理することができます。状態管理やデータフローの管理が容易であり、複雑なインタラクションを持つアプリケーションにも適しています。

### 再利用性の高いコンポーネント:
Reactで作成したコンポーネントは、他のプロジェクトでも再利用することが可能です。これにより開発効率が向上し、一貫性のあるUIを構築できます。

### 活発なコミュニティ: 
Reactは非常に人気のあるフレームワークであり、多くの開発者やライブラリが提供されています。そのため、問題解決や学習が容易であり、最新の技術を取り入れることができます。

### 動的なUI:
Reactは仮想DOMを利用することで、効率的にUIを更新することができます。そのため、インタラクティブな要素が多いアプリケーションやリアルタイムなデータ表示が必要なアプリケーションに適しています。


## Tailwind CSSを採用する基準

### 迅速なプロトタイピング:
Tailwind CSSは、あらかじめ定義されたユーティリティークラスを用いることで、CSSを書く時間を大幅に削減できます。そのため、迅速なプロトタイピングやデザインの変更に適しています。

### カスタマイズ性の高いデザイン:
Tailwind CSSは、柔軟なカスタマイズが可能です。そのため、独自のデザインシステムを構築したり、既存のデザインガイドラインに合わせたりすることができます。

### CSSフレームワークに抵抗がない:
Tailwind CSSは、従来のCSSフレームワークとは異なるアプローチを取っています。そのため、従来のCSSフレームワークに慣れている開発者にとっては、学習曲線がある場合があります。

## どちらを採用すべきか？
### ReactとTailwind CSSの併用:
ReactとTailwind CSSは互いに競合するものではなく、むしろ相乗効果を発揮することが可能です。Reactでコンポーネントを作成し、Tailwind CSSでスタイリングすることで、効率的で柔軟な開発が可能になります。

### プロジェクトの規模と複雑性:
小規模なプロジェクトであれば、Tailwind CSS単体で十分な場合もあります。しかし、大規模なアプリケーションや複雑なインタラクションを持つアプリケーションの場合は、Reactを採用することで開発の効率化が期待できます。

### 開発チームのスキルセット:
チームメンバーがReactやTailwind CSSに精通しているかどうかも、採用を検討する上で重要な要素です。

## まとめ
ReactとTailwind CSSは、それぞれ異なる強みを持つツールです。どちらを採用するかは、プロジェクトの要件や開発チームのスキルセットに合わせて慎重に検討する必要があります。両方の特徴を理解し、最適な組み合わせを見つけることが、成功するWebアプリケーション開発につながります。


具体的なプロジェクトの規模や機能
チームのスキルセット
重視する点（開発速度、デザインの自由度、パフォーマンスなど）


## 結論
   - 開発速度を重視し、デザインも自由度高くしたい場合: Tailwind CSSが適しているかもしれません。
   - 大規模なアプリケーションで、パフォーマンスと保守性を重視したい場合: Reactが適しているかもしれません。
いつか忘れるジェネリクスについて

いつか忘れる自分に宛てて

### ジェネリクスとは？

・型の抽象化に使われる
・クラス、関数の引数に対して使われる


例コード、というか、わからなかった会社のコード
※書き換えてあります

```typescript
export class BaseEntity<
    T extends Record,
    U extends keyof T
> 
// 型パラメータの制約
extends EntityModel<T, U> {
    // ...
}
// クラスの継承
```

### わかったこと
・extendsが３つ書いてあってややこしいけど、`extends EntityModel`これはただのクラス継承
・型パラメータ: `<T>` のような形で指定する型の変数
・型パラメータはクラス名の横に記載するらしい
・ジェネリクス（generics）: 型パラメータを使う機能全般
・ジェネリッククラス: 型パラメータを使うクラス
・T extends Record　第１引数の型はRecord
・U extends keyof T　第２引数の型は第１引数のプロパティのユニオン型
[keyofの説明](https://typescriptbook.jp/reference/type-reuse/keyof-type-operator#:~:text=keyof%20%E3%81%AF%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E5%9E%8B,name%22%20%E3%81%8C%E5%BE%97%E3%82%89%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82&text=2%E3%81%A4%E4%BB%A5%E4%B8%8A%E3%81%AE%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3,%E5%9E%8B%E3%81%A7%E8%BF%94%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82)

### 疑問

・T,Uって名前はなに？
![スクリーンショット 2025-01-16 10.51.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3505174/74b96eef-7bb2-a3be-70f4-6086b5182c79.png)
![スクリーンショット 2025-01-16 10.52.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3505174/8b77dc5f-939e-b9ab-d912-75a70e792c87.png)

・T extends RecordでTはRecodeのプロパティを完全に満たさないといけない？
→YES，追加のプロパティを持たせることは可能

・`EntityModel<T, U>`はなに？
![スクリーンショット 2025-01-16 11.40.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3505174/dcfd039d-871f-fe58-b757-75b0d770cdbe.png)

親クラスの型パラメータを見てみました。
親クラス第１引数のDataTypeには子クラスの第１引数Recordが含まれていました。
```typescript
export class EntityModel<T extends DataType, U extends keyof T> {
// ...
```

簡単に考えると子クラスで第１引数の型パラメータを`A|B|C`としていて、親クラスでは第１引数の型パラメータを`A|B|C|D|E...(略)|Z`ってしてる感じでしょうか

・なんで引数に直接型定義を書かないの？
```typescript
export class BaseEntity<
    T extends Record,
    U extends keyof T
> extends EntityModel<T, U> {
    // ...
}
```

![スクリーンショット 2025-01-16 12.13.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3505174/91d07bc5-5024-d816-83a9-497a590ca4fe.png)

![スクリーンショット 2025-01-16 12.12.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3505174/fa196cea-cc6f-506c-5443-44ca71236499.png)

![スクリーンショット 2025-01-16 12.12.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3505174/e79e6e80-894b-9458-799b-d839a6434d89.png)

### おわり
最後までお読みいただきありがとうございました

◯ジェネリクス
✗ジェネリック
✗ジェネリティスクス
missing required field: [nextApproverIds] の解決

# はじめに
またまたSalesforceの罠みたいなエラーに引っかかったので、メモ。

`ProcessSubmitRequest`クラスを使うことで次の承認者等をカスタマイズして承認処理を進めることができます。  
[ProcessSubmitRequest クラス | Apex 開発者ガイド | Salesforce Developers](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_ProcessSubmitRequest.htm)

この時、次の承認者も設定することが出来るのですが・・。  
セットしてあるはずなのに`missing required field: [nextApproverIds]`と表示され詰まってしまいました。

# 原因
参考：[Next Approver IDs in Submit for | Salesforce Trailblazer Community](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54V00007aiplKSAQ)  


こちらの通り「`List<Id>`型を指定しているくせに、2件以上データが入っているとエラーを吐く」 + 「データは入っているのに、`missing required field`というエラーを吐く」というのが原因でした。

ちなみに、はじめに記載したリンク先のドキュメントにも一応
> 承認プロセスの次のステップが別の Apex 承認プロセスである場合、次の承認者として **1 つ** のユーザー ID を指定します。そうでない場合、ユーザー ID を指定できず、このメソッドは null である必要があります。

> **単一** のエントリリストである必要があります。

と記載はあります。

じゃあリストじゃなくて単一の型にしたらいいのに・・。

# おわりに
型とエラーメッセージを信用してはいけないらしい。  
流石に修正してくれないかな・・。
クラウド vs オンプレミス どちらを選ぶべきか？(初心者向け)

# 自己紹介
株式会社KANGEN Holdingsのniikuraです。
主にネットワーク案件のPM/PL、プリセールスでの提案活動を主として従事しております。

[株式会社KANGEN Holdings](https://kangen-holdings.co.jp/3)では、
ITソリューション事業をベースとし、クライアント企業様のニーズや課題に合わせてWEB系や業務系、官公庁向けシステムなど幅広い分野のシステム・ソフトウェア開発のご支援を行っております。
システム・ソフトウェア開発のご依頼やお困りごと等、ぜひお気軽にお問い合わせください。

https://kangen-holdings.co.jp/contact

# はじめに
自身がクライアントへの提案時にクラウドとオンプレミス（以降オンプレとも記載）どちらが適しているのだろうか。迷うことが多々あります。どちらを選ぶかでコスト、運用方法、拡張性に影響があり、どちらも「一長一短があるため、ニーズに合った選択が必要」だと考えています。
今回は、自身への備忘も含めて、クラウドとオンプレの違いや、それぞれのメリット・デメリットを記載し、実務で役立つ記事に出来ればいいなと思っています。

※本記事はあくまで参考程度に留めてください。選択の際は、他ドキュメントや専門家の意見、事例なども参考にして、より適切な判断を行うことをおすすめします。

# 目次
- [クラウドとは？オンプレミスとは？](#クラウドとはオンプレミスとは)
- [クラウドの特徴とメリット・デメリット](#クラウドの特徴とメリットデメリット)
- [オンプレミスの特徴とメリット・デメリット](#オンプレミスの特徴とメリットデメリット)
- [比較表](#比較表)
- [どちらを選ぶべきか？](#どちらを選ぶべきか状況ごとに記載)
- [まとめ](#まとめ)





# クラウドとは？オンプレミスとは？


### クラウドとは？
クラウドとは、インターネット経由で利用できるリモートのコンピュータ資源やサービスを指します。ユーザーは自社でサーバーやハードウェアを所有せず、必要なときに必要な分だけ利用できる仕組みです。


##### クラウドサービスの具体例


- AWS（Amazon Web Services）
世界中で利用されている最も人気のあるクラウドプラットフォーム。EC2（仮想サーバー）、S3（ストレージ）、RDS（データベース）など、多様なサービスを提供する


- Microsoft Azure
マイクロソフトが提供するクラウドプラットフォーム。Windowsとの親和性が高く、企業の業務システムと統合しやすい


- Google Cloud Platform（GCP）
データ解析やAIに強みを持つクラウドプラットフォーム。BigQuery（データウェアハウス）やTensorFlowとの連携が可能である




### オンプレミスとは？
オンプレミスとは、企業や組織が自社内にハードウェアやサーバーを設置し、完全に自社管理で運用する形態を指します。外部プロバイダーに依存せず、システムを自由にカスタマイズ可能です。


##### オンプレミスの具体例


- 社内データセンター
サーバーを専用ルームに設置し、IT部門が運用・管理する


- プライベートクラウド
企業内のオンプレ環境でクラウド技術を活用する形態（例: VMware）





# クラウドの特徴とメリット・デメリット

###  メリット


- 初期投資が少ない
ハードウェアの購入が不要で、使った分だけ支払うモデルである（従量課金制）


- 拡張性が高い
リソースを簡単に拡張・縮小が可能である（例: トラフィック急増時に対応できる）


- 柔軟性に富んでいる
インターネット接続があれば、どこからでもアクセス可能である


- メンテナンスが不要
サーバーの管理やアップデートはクラウドプロバイダーが担当する



### デメリット


- ランニングコストが高い
長期間運用するとコストがオンプレより高くなる場合がある


- カスタマイズ性が低い
一部のクラウドサービスは細かいカスタマイズが難しい


- 依存リスクが高い
クラウドプロバイダーの障害やサービス変更に影響を受ける可能性がある



# オンプレミスの特徴とメリット・デメリット


### メリット


- 制御性が高い
ハードウェアやソフトウェアを自社で管理できるため、カスタマイズが自由である


- コストの固定化
初期投資が大きいが、その後の運用コストが一定になる


- 高セキュリティ
データが完全に社内にあるため、高いセキュリティを構築できる　※ただし、運用次第



### デメリット


- 初期コストが高い
サーバー購入、設置、ライセンス費用などが必要となる


- 運用負担が大きい
メンテナンスや障害対応が自社の責任となる


- 拡張性が低い
リソースの追加には物理的な作業とコストが必要となる



# 比較表
  ![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956951/06248347-8c9d-60f0-581c-876b3bb0d37f.png)
  
  上記の表はクラウドとオンプレの主要な違いをまとめたものです。それぞれの特徴を比較することで、どちらがニーズに合うかの判断材料になります。



# どちらを選ぶべきか？（状況ごとに記載）


### コスト


- 初期投資を抑えたい → クラウド


- 長期的な安定運用を目指す → オンプレ


### データセキュリティ


- 高度なセキュリティが必要 → オンプレ


- 通常のセキュリティで十分 → クラウド


### 柔軟性


- 需要変動が予想される → クラウド


- 一定の負荷で安定運用する → オンプレ


### 運用リソース


- IT部門が充実している → オンプレ


- 専門人材が不足している → クラウド



# まとめ
クラウドとオンプレのどちらが良いかは、業務内容や目指すゴールによって異なります。ただし、どちらか一方に固執するのではなく、柔軟に両方を組み合わせたハイブリッド構成にすることで、ビジネスの効率性や安定性を高められる可能性があります。ニーズに合わせてベストな選択をしてください！今回は初心者向けに簡単な記載まででしたが、次回以降でより詳細に纏められれば良いなと思っています。
読んでくださりありがとうございました。
【Go】Goでエニグマを実装してみた


## 概要


[**暗号技術入門 第3版**](https://amzn.asia/d/4EzqngT)で最初の方に出てきた暗号、`エニグマ`をGo実装してみた


## サンプルコード


```go
package main

import (
    "fmt"
)

// ロータをシミュレートする
var rotor = []string{
    "EKMFLGDQVZNTOWYHXUSPAIBRCJ", // ロータ1
    "AJDKSIRUXBLHWTMCQGZNPYFVOE", // ロータ2
    "BDFHJLCPRTXVZNYEIWGAKMUSQO", // ロータ3
}

// リフレクタをシミュレートする
var reflector = "YRUHQSLDPXNGOKMIEBFZCWVJAT"

// プラグボード設定
var plugboard = map[rune]rune{
    'A': 'B', 'B': 'A',
    'C': 'D', 'D': 'C',
    'E': 'F', 'F': 'E',
    // 他の設定を追加可能
}

func rotate(rotor string, steps int) string {
    return rotor[steps:] + rotor[:steps]
}

func encryptChar(c rune, rotors []string, reflector string) rune {
    index := int(c - 'A')

    // 前進処理
    for i := 0; i < len(rotors); i++ {
       index = int(rotors[i][index] - 'A')
    }

    // 反射
    index = int(reflector[index] - 'A')

    // 後退処理
    for i := len(rotors) - 1; i >= 0; i-- {
       for j := 0; j < 26; j++ {
          if int(rotors[i][j]-'A') == index {
             index = j
             break
          }
       }
    }

    return rune(index + 'A')
}

func plugboardSwap(c rune) rune {
    if swapped, exists := plugboard[c]; exists {
       return swapped
    }
    return c
}

func processMessage(message string) string {
    processed := make([]rune, len(message))
    rotorPositions := []int{0, 0, 0}
    for i, char := range message {
       pluggedChar := plugboardSwap(char)

       // 現在の rotor 位置で文字をエンコード
       rotatedRotors := make([]string, len(rotor))
       for j := range rotor {
          rotatedRotors[j] = rotate(rotor[j], rotorPositions[j])
       }

       // 暗号化処理
       encryptedChar := encryptChar(pluggedChar, rotatedRotors, reflector)

       // プラグボードの確認
       processed[i] = plugboardSwap(encryptedChar)

       // ロータを回転
       rotorPositions[0] = (rotorPositions[0] + 1) % 26
       if rotorPositions[0] == 0 {
          rotorPositions[1] = (rotorPositions[1] + 1) % 26
          if rotorPositions[1] == 0 {
             rotorPositions[2] = (rotorPositions[2] + 1) % 26
          }
       }
    }
    return string(processed)
}

func main() {
    message := "HELLOENIGMA"
    encryptedMessage := processMessage(message)

    // ロータの位置をリセットして復号
    decryptedMessage := processMessage(encryptedMessage)

    fmt.Println("元のメッセージ:", message)
    fmt.Println("暗号化メッセージ:", encryptedMessage)
    fmt.Println("復号化メッセージ:", decryptedMessage)
}


// 出力
// 元のメッセージ: HELLOENIGMA
// 暗号化メッセージ: FIYHMJPFDKE
// 復号化メッセージ: HELLOENIGMA
```
axxで80286のハンドリング

axx で、80286のアセンブルをしてみました。Hello Worldだけですが、マシンコードは正しく出ました。

##### パターンファイル

ビットパターンの解析をしていず、文字列リテラルが多いです。

```80286.axx
MOV AX,CS   :: 0x8c,0xc8
MOV DS,AX   :: 0x8e,0xd8
MOV ES,AX   :: 0x8e,0xc0
MOV AH,!c   :: 0xb4,c
MOV DX,!a   :: 0xba,a,a>>8,a>>16,a>>24
MOV AX,!a   :: 0xb8,a,a>>8,a>>16,a>>24
INT !a      :: 0xcd,a
DB !a :: a
```

##### プログラム

```hw.s
section .text
_start:
    mov ax, cs
    mov ds, ax
    mov es, ax

    mov ah, 0x09
    mov dx,hello_message
    int 0x21

    mov ax, 0x4C00
    int 0x21

hello_message: .ascii "Hello, World!"
    db 0xa
    .ascii "$"
```

##### アセンブル

```
$ axx 80286.axx hw.s
0000000000000000 hw.s 1 section .text 
0000000000000000 hw.s 2 _start: 
0000000000000000 hw.s 3     mov ax, cs  0x8c 0xc8
0000000000000002 hw.s 4     mov ds, ax  0x8e 0xd8
0000000000000004 hw.s 5     mov es, ax  0x8e 0xc0
0000000000000006 hw.s 6  
0000000000000006 hw.s 7     mov ah, 0x09  0xb4 0x09
0000000000000008 hw.s 8     mov dx,hello_message  0xba 0x16 0x00 0x00 0x00
000000000000000d hw.s 9     int 0x21  0xcd 0x21
000000000000000f hw.s 10  
000000000000000f hw.s 11     mov ax, 0x4C00  0xb8 0x00 0x4c 0x00 0x00
0000000000000014 hw.s 12     int 0x21  0xcd 0x21
0000000000000016 hw.s 13  
0000000000000016 hw.s 14 hello_message: .ascii "Hello, World!"  0x48 0x65 0x6c 0x6c 0x6f 0x2c 0x20 0x57 0x6f 0x72 0x6c 0x64 0x21
0000000000000023 hw.s 15     db 0xa  0x0a
0000000000000024 hw.s 16     .ascii "$"  0x24
0000000000000025 hw.s 17 
```

テストアセンブルです。今どき、80286なんか使っている人はいないと思いますが、一応やってみました。
Python 3.13.1がとんでもなく重かった件

情報共有まで

職場で使っているPCがハッキング問題に巻き込まれ、Win11をclean installして最新のPython 3.13.1を導入したところ、とんでもなく動作が重くなり難儀しました。症状はIdleの立ち上がりに５秒くらいかかり、そこからプログラムをrunするのに１０秒くらいかかるという感じで、なにかのpathが切れていないのとかをうたがい検討したけれどもわからず。

思い立ってPythonをdown versionして3.10.1を導入してみたら正常に動作しました。PCはDELL XPS8930 16GBです。

同様の症状が出ている人がいれば参考まで。
GitHub fetch/pull エラー

## Could not resolve hostname

リゾルバが正引きできませんでした的なエラー。
ずっと接続できていて、いきなりこのエラーが発生した、という場合は一時的なネットワークエラーとか、使用しているDNSサーバが死んでいるとか、そのあたり。
ワークアラウンドとしては、信頼できるパブリックDNSに一時的に変更するとか、ですかね。

以下はSourceTree使用時に表示されたエラー例

```
git --no-optional-locks -c color.branch=false -c color.diff=false -c color.status=false -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree fetch --prune origin 
ssh: Could not resolve hostname github.com: nodename nor servname provided, or not known
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
Completed with errors, see above
```
新卒IT研修では、フレームワークを教えたくない！

仕事で新卒向けのIT研修をしている私は、新卒エンジニアの研修において、最初からフレームワークを教えることに懐疑的な意見を持っています。

この記事では、フレームワークの使い方をひたすら教える教育現場のエンジニアたちがどうなっていくのかについて記述しています。

## フレームワークの便利さがもたらす功罪

フレームワークは、開発を効率化するためのツールです。たとえば、Webアプリケーションを作る際にReactやVue.jsは、複雑なUI構築を簡単に実現できます。同様に、バックエンドではRuby on Railsなどがよく利用されます。

しかし、フレームワークを使うことで、HTTPリクエストやCookieの仕組みといったWebの基礎技術を理解しなくても、それらを扱えてしまいます。結果として、「なんかよくわからないが動く」という状態のまま進んでしまうのです。

### Cookieの例: 基礎知識の欠如

たとえば、セッション管理のためにCookieを利用する場合を考えてみましょう。多くのフレームワークでは、Cookieの読み書きを抽象化し、簡単なAPIで操作できるようにしています。これは非常に便利ですが、一方で以下のようなことは理解しないまま進んでしまいます。

- CookieがHTTPレスポンスヘッダーの一部として送信される仕組み
- クライアントがCookieを自動的にリクエストに含める理由
- Secure属性やHttpOnly属性がセキュリティに与える影響

これらを知らずにアプリケーションを構築すると、セキュリティリスクを考慮しないアプリができあがります。新人エンジニアに基礎を教えないままフレームワークを教えても、ただツールが使いこなせるようになっただけにすぎません。

## フレームワーク前提の教育がもたらす問題点

### 基礎技術の未理解
フレームワークに依存すると、HTTPやデータベース接続など、システムの基本的な仕組みを理解しないまま進んでしまいます。その結果、トラブルシューティングが困難になり、フレームワーク外の技術を学ぶ際に大きな壁に直面します。

### フレームワークの寿命
現在人気なフレームワークも、数年後には使われなくなる可能性があります。基礎を理解していない場合、新しい技術への適応が難しくなります。

### 「ブラックボックス」の増加
フレームワークの内部ロジックが「ブラックボックス」と化し、「どうしてこのコードで動くのか」という疑問を解消できないまま進んでしまいます。この状況では、自信を持ってコードを変更したり拡張したりすることが難しくなります。

## 基礎技術を教えることの重要性

新人エンジニアには、まず以下のような基礎技術を教えるべきです。
- HTTPプロトコル: リクエストとレスポンスの流れ、ステータスコード、ヘッダー
- Cookieとセッション: データの保存方法、セキュリティ設定
- データベースの基本: SQLの書き方やトランザクション管理
- サーバーサイドの基礎: リクエストとレスポンスの中身や処理

これらを理解したうえでフレームワークを学ぶと、フレームワークがどのように基礎技術を抽象化しているのかが見えてきます。これにより、フレームワークに依存しすぎず、柔軟に技術を学び続ける力が養われます。

## 結論

フレームワークは便利な反面、基礎技術を理解しないまま使うことでエンジニアの技術力向上を阻害します。新卒研修では、まず基礎技術を徹底的に教え、その後でフレームワークを学ばせるステップを踏むべきだと考えます。

私は、このような基礎技術を「基礎概念」として定義しています。興味がある人は読んでみてください。



 https://note.com/raretech_it/n/n0982e8368844
MySQLバージョンを確認する

# コマンド
```
SELECT VERSION();

+-----------+
| version() |
+-----------+
| 5.7.26    |
+-----------+
```

```
status

--------------
mysql  Ver 5.7.26 for debian-linux-gnu on x86_64
...
Server version: 5.7.26 MySQL Community Server - GPL
--------------
```

# phpMyAdmin

1）ホーム画面右　「MySQLバージョン」

2）SQLページ

```
SELECT VERSION();

VERSION()
5.7.26-log
```

# WordPress
ホーム　＞　サイトヘルス　＞　情報　＞　データベース

# 参考記事
https://www.dbtech.digibeatrix.com/archives/42
Spring BootでH2データベースを使う方法【初心者向け】

### **はじめに**

H2 Databaseを使えば、簡単にテストデータを操作できます。本記事では、H2データベースの概要と、Spring Bootでの設定方法を解説します。

---

### **1. H2データベースとは**

H2データベースは、以下の特徴を持つ軽量なリレーショナルデータベースです：

- **組み込み型データベース**：アプリケーション内部に直接組み込んで利用可能。
- **メモリデータベース**：デフォルトではメモリ上にデータを保存し、アプリケーション終了時に消えるため、テスト環境に最適。
- **SQL互換性**：標準SQLをサポートしており、学習コストが低い。

Spring Bootでは、H2を簡単に利用できるように設定が自動化されています。これにより、特別なセットアップを必要とせずに利用できます。

---

### **2. 手順**

### **1. 設定ファイルの編集**

以下の設定を`application.properties`に追加します：

```
spring.datasource.url=jdbc:h2:mem:testdb
spring.h2.console.enabled=true
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
```

### **2. コンソールのアクセス方法**

- Spring Bootアプリケーションを起動。
- ブラウザで`http://localhost:8080/h2-console`にアクセス。
- **JDBC URL**: `jdbc:h2:mem:testdb`を入力し、「Connect」をクリック。

### **3. サンプルクエリ実行**

以下はサンプルクエリの例です：

```sql
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50),
    email VARCHAR(50)
);

INSERT INTO users (name, email) VALUES ('test name', 'test@example.com');
SELECT * FROM users;
```

これをコンソール上で実行し、結果を確認してください。

---

### **3. まとめ**

「H2データベースは、軽量で設定が簡単なため、テストや学習に最適です。Spring Bootの自動設定機能を活用すれば、さらに効率的に開発が進められます。ぜひ試してみてください！」
【ESLint / Flat Config】naming-convention を使って命名規則をチェックする

# はじめに
この記事では、ESLint の Flat Config で命名規則をチェックする方法を記載します。
命名規則のチェックには、typescript-eslint の naming-convention というルールを使用します。

https://typescript-eslint.io/rules/naming-convention/

# 開発環境
開発環境は以下の通りです。

- Windows 11
- VSCode
- TypeScript 5.7.3
- React 18.3.1
- ESLint 9.18.0
- @typescript-eslint/eslint-plugin 18.20.0

:::note
ESLint のバージョンが 9.18.0 なので、Flat Config を利用します。
:::

# 事前準備
React / TypeScript のプロジェクトファイルで ESLint と typescript-eslint が利用できるようにしておきます。
ESLint の Flat Config の設定手順については以下の記事に記載しています。

https://qiita.com/Yasushi-Mo/items/c2e259f8e2a86b79cb8a

# naming-convention の有効化
まず、`eslint.config.mjs` の `rules` に `"@typescript-eslint/naming-convention": ["error"]` を追加します。

```eslint.config.mjs
export default [
  rules: {
    "@typescript-eslint/naming-convention": ["error"]
  }
];
```

次に `"@typescript-eslint/naming-convention"` の配列に命名規則を追加します。
以下の例では、type 定義の命名に以下の規則を追加しています。

- パスカルケース（アッパーキャメルケース）
- サフィックスに Type をつける

```eslint.config.mjs
export default [
  rules: {
    "@typescript-eslint/naming-convention": [
      "error",
      {
        selector: "typeAlias",
        format: ["PascalCase"],
        suffix: ["Type"],
      },
    ]
  }
];
```

動作確認をします。

- パスカルケースではない場合、エラーになる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/87b593ef-a3a8-676b-7338-4f631e5175b2.png)

- サフィックスに Type がついていない場合、エラーになる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/aa33bbe0-6b17-ba06-eb99-60cbd23ea52c.png)

- パスカルケースかつサフィックスに Type がついている場合、エラーにならない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/c20fc009-f079-a6c0-c401-dc0ee710e22d.png)


# 参考
- [naming-convention](https://typescript-eslint.io/rules/naming-convention/)
EC-CUBEとPHPのバージョン対応表（EC-CUBE4.0.0~4.3.0）

![スクリーンショット 2025-01-17 9.32.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1653133/ccd3b27c-36ba-6360-f034-cf9a2ea365d2.png)

![スクリーンショット 2025-01-17 9.30.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1653133/97bf7d83-88be-6953-4eef-c623f2b0e7b3.png)

![スクリーンショット 2025-01-17 9.33.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1653133/7b5561ab-e9c0-dbbd-2feb-71b03970fcf7.png)

![スクリーンショット 2025-01-17 9.33.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1653133/9e41ded3-2b80-df24-e50b-34f836a1795c.png)

https://doc4.ec-cube.net/quickstart/requirement
Ginフレームワークで簡単にAPIテスト！httptestを使ったテスト方法を徹底解説

## はじめに
GinフレームワークでAPIを構築した際、正しく動作しているかを確認するためにテストを書くことは非常に重要です。本記事では、標準パッケージの`httptest`を使ってAPIコントローラーのテストを書く方法を詳しく解説します。

## サンプルコード概要

今回は以下のようなシンプルな`Health`エンドポイントをテストします。このエンドポイントは、アプリケーションのヘルスチェックを行い、ステータスをJSONで返すものです。

```go
package controllers

import (
	"net/http"

	"github.com/gin-gonic/gin"
)

// Health エンドポイント: アプリケーションのヘルスチェック
func Health(c *gin.Context) {
	c.JSON(http.StatusOK, gin.H{
		"status": "ok",
	})
}
``` 

このコードに対して、`httptest`を利用したテストを実装します。

## テストコードの実装

以下が`httptest`を利用したテストコードです。一行ずつ解説していきます。

```go
package controllers

import (
	"net/http"
	"net/http/httptest"
	"testing"

	"github.com/gin-gonic/gin"
	"github.com/stretchr/testify/assert"
)

// TestHealthHandlerはHealthエンドポイントのテスト
func TestHealthHandler(t *testing.T) {
	// HTTPレスポンスを記録するRecorderを作成
	w := httptest.NewRecorder()

	// テスト用のHTTPリクエストを作成。GETメソッドで/healthエンドポイントを指定
	request, _ := http.NewRequest("GET", "/health", nil)

	// Ginのテスト用コンテキストを作成
	ginContext, _ := gin.CreateTestContext(w)

	// Ginのテスト用コンテキストにリクエストを設定
	ginContext.Request = request

	// テスト対象のHealthハンドラーを呼び出し
	Health(ginContext)

	// Recorderに記録されたレスポンスコードが200(OK)であることをアサート
	assert.Equal(t, 200, w.Code)

	// Recorderに記録されたレスポンスボディが期待するJSON文字列と一致することをアサート
	assert.JSONEq(t, `{"status":"ok"}`, w.Body.String())
}
```

## 詳細な解説

### 1. Recorder作成
HTTPレスポンスを記録する`httptest.ResponseRecorder`を作成します。Recorderを通じて、ハンドラーが返すレスポンスの中身を後で検証します。  
```plaintext
w := httptest.NewRecorder()
```

### 2. テスト用のHTTPリクエストを作成
テスト用のHTTPリクエストを作成します。ここでは`GET`メソッドで`/health`エンドポイントを指定しています。  
```plaintext
request, _ := http.NewRequest("GET", "/health", nil)
```

### 3. Ginのテスト用コンテキストを作成
Ginの`CreateTestContext`を使ってテスト用のコンテキストを作成します。これをハンドラー関数に渡します。  
```plaintext
ginContext, _ := gin.CreateTestContext(w)
```

### 4. リクエストをコンテキストに設定
作成したHTTPリクエストをGinのテスト用コンテキストにセットします。これでハンドラー内でリクエスト内容を利用できるようになります。  
```plaintext
ginContext.Request = request
```

### 5. ハンドラーを実行
テスト対象の`Health`ハンドラーを実行します。レスポンス内容はRecorderに記録されます。  
```plaintext
Health(ginContext)
```

### 6. レスポンスコードを検証
Recorderに記録されたレスポンスコードが期待するHTTPステータスコード(200)であることを検証します。  
```plaintext
assert.Equal(t, 200, w.Code)
```

### 7. レスポンスボディを検証
Recorderに記録されたレスポンスボディが期待するJSON文字列`{"status":"ok"}`と一致することを検証します。`assert.JSONEq`を使うと、JSONのキー順序に関係なく比較できます。 
```plaintext
assert.JSONEq(t, `{"status":"ok"}`, w.Body.String())
```

## まとめ

今回の記事では、`httptest`を使ったAPIコントローラーのテスト方法を解説しました。この方法を使えば、Ginフレームワークで構築したAPIの挙動を簡単に検証できます。テストコードはプロジェクトの品質向上に欠かせません。ぜひ、自分のプロジェクトにも取り入れてみてください！
［ServiceNow］Script Include（sys_script_include）について

※この記事はServiceNow初心者が学習用のために記載した記事です。内容について誤っている場合がございます。不足点などございましたらコメントいただけますと幸いです。


# Script Includeとは
- Script Includeはクラスライブラリのようなもので、処理をパッケージ（部品）化し、複数のサーバーサイドスクリプトから利用できるようにしたもの
    - クラス
        - プログラムの中で「データ（プロパティ）」と「処理（メソッド）」を一つにまとめた設計図のようなもの
    - ライブラリ
        - 複数のクラスや関数をまとめたもの
        - 共通で利用される処理を集めておくことで、コードの再利用性や管理性が向上する
- Business RuleやUI Actionなどでコードが長くなった場合に、複数の個所から使われる汎用的な処理ではなくてもコードの見通しをよくするために処理をScript Includeに書くケースもある

# Script Includeの設定・使い方
- 一つのScript Includeは一つのクラス（API）に対応しており、その中に処理を関数として定義

## 作成方法
1. メニュー > System Definition > Script Includesを開く
    - またはFilter navigatorにsys_script_include.listと検索
2. ”New”ボタンを押下して新規レコードを作成する
3. “Name（名前）”項目を入力する
4. 自動生成されたクラス定義のコード中に、処理を関数として定義する
5. 保存する

![スクリーンショット 2025-01-17 082221.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/bbc590ef-6b68-5ae7-a401-9229859095ef.png)
![スクリーンショット 2025-01-17 082542.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/b76fe316-b2cd-afbf-93ec-1ce2429704b9.png)

 ## 使用方法
使うときは、サーバーサイドスクリプト内でScipt Includeで定義されたクラス(API)をインスタンス化し、
クラスメソッドとして処理を呼び出す。
メニュー > Scripts – Backgroundに張り付けて呼び出してみる。
```
var msi = new global.MyScriptInclude();
var result = msi.myfunc('bar', 'foo');
gs.info(result);
```
上記によって、syslog.listにログが表示されるはず？？表示されなかった。


 # 参考
 https://servicenow-lab.com/what-is-script-include/
［ServiceNow］Scriptingの論理名と物理名

※この記事はServiceNow初心者が学習用のために記載した記事です。内容について誤っている場合がございます。不足点などございましたらコメントいただけますと幸いです。

# 使用目的
- テーブルのリストページを表示したいとき
    - Filter navigatorで物理名.listと検索
- Dictionary Entriesテーブルなどで検索するとき
# Client-side scripting

| 論理名                    | 物理名                  |
|--------------------------|-------------------------|
| Client Script            | sys_script_client       |
| UI Policy (Script)       | sys_ui_policy           |
| UI Action (Client-side)  | sys_ui_action           |
| UI Script                | sys_ui_script           |

# Server-side scripting

| 論理名                   | 物理名                      |
|--------------------------|----------------------------|
| Business Rule            | sys_script                |
| UI Action (Server-side)  | sys_ui_action             |
| Script Action            | sys_script_action         |
| Scheduled Job            | sysauto_script            |
| Embedded Server-side Script | (Depends on functionality) |
| Access Control List (ACL)| sys_security_acl          |
| Transform Map            | sys_transform_map         |
| Reference Qualifier      | sys_dictionary.reference_qual |
| Default Value            | sys_dictionary.default_value |
| Flow Designer            | sys_flow_context          |
| Script Include           | sys_script_include        |


各項目については、以下の記事を参照してみてください
https://qiita.com/hashikazu20540/items/befb87337e345c671a1e
paizaラーニングレベルアップ問題集の「3行の出力」をやってみた。

paizaラーニングレベルアップ問題集の[3行の出力](https://paiza.jp/works/mondai/d_rank_level_up_problems/d_rank_level_up_problems__stdout_4)をやってみました。
- - -
###### 問題
https://paiza.jp/works/mondai/d_rank_level_up_problems/d_rank_level_up_problems__stdout_4
- - -
###### C
```c
#include <stdio.h>

int main() {
	printf("%d\n", 8);
	printf("%d\n", 1);
	printf("%d\n", 3);
	return 0;
}
```
- - -
###### C++
```cpp
#include <iostream>
using namespace std;

int main() {
	cout << 8 << endl;
	cout << 1 << endl;
	cout << 3 << endl;
	return 0;
}
```
- - -
###### C#
```cs
using System;

class Program
{
	public static void Main()
	{
		Console.WriteLine(8);
		Console.WriteLine(1);
		Console.WriteLine(3);
	}
}
```
- - -
###### Go
```go
package main
import "fmt"

func main() {
	fmt.Println(8)
	fmt.Println(1)
	fmt.Println(3)
}
```
- - -
###### Java
```java
public class Main {
	public static void main(String[] args) {
		System.out.println(8);
		System.out.println(1);
		System.out.println(3);
	}
}
```
- - -
###### JavaScript
```js
console.log(8);
console.log(1);
console.log(3);
```
- - -
###### Kotlin
```kotlin
fun main() {
	println(8)
	println(1)
	println(3)
}
```
- - -
###### PHP
```php
<?php
	echo 8 . PHP_EOL;
	echo 1 . PHP_EOL;
	echo 3 . PHP_EOL;
?>
```
- - -
###### Perl
```pl
print 8 . $/;
print 1 . $/;
print 3 . $/;
```
- - -
###### Python3
```py
print(8)
print(1)
print(3)
```
- - -
###### Ruby
```rb
p 8
p 1
p 3
```
- - -
###### Scala
```scala
object Main extends App{
	println(8)
	println(1)
	println(3)
}
```
- - -
###### Swift
```swift
print(8)
print(1)
print(3)
```
circuitjsの作法 その50

# 概要
circuitjsを調査してみた。
webでネットリストを拾ったので、やってみた。
たぶん、ダイナミックRAM。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/4dcaac70-4750-4a79-cdd1-32b3069e9124.png)


# ネットリスト

```
$ 3 0.000005 5.023272298708815 86 5 50
w 400 16 424 16 0
c 424 16 424 48 0 1e-8 0.4465434553091324
w 368 16 344 16 0
g 424 48 424 56 0
f 384 72 384 16 4 1.5 0.02
w 400 88 424 88 0
c 424 88 424 120 0 1e-8 3.774240253355689
w 368 88 344 88 0
g 424 120 424 128 0
f 384 144 384 88 4 1.5 0.02
w 344 16 344 88 0
w 400 160 424 160 0
c 424 160 424 192 0 1e-8 2.014987557788454
w 368 160 344 160 0
g 424 192 424 200 0
f 384 216 384 160 4 1.5 0.02
w 400 232 424 232 0
c 424 232 424 264 0 1e-8 3.7742402533820143
w 368 232 344 232 0
f 384 288 384 232 4 1.5 0.02
w 344 160 344 232 0
w 344 88 344 160 0
w 384 72 320 72 0
w 384 144 320 144 0
w 384 216 320 216 0
w 384 288 320 288 0
150 280 72 320 72 1 2 0 5
150 280 144 320 144 1 2 0 5
150 280 216 320 216 1 2 5 5
150 280 288 320 288 1 2 0 5
w 232 64 280 64 0
w 232 64 232 136 0
w 232 136 280 136 0
w 232 136 232 152 0
w 280 208 232 208 0
I 232 152 232 208 0 0.5 5
w 232 208 232 280 0
w 232 280 280 280 0
w 280 80 264 80 0
w 264 80 264 224 0
w 264 224 280 224 0
w 280 152 256 152 0
I 208 224 208 296 0 0.5 5
w 208 224 264 224 0
w 256 152 256 296 0
w 208 296 256 296 0
w 256 296 280 296 0
L 208 224 160 224 2 1 false 5 0
L 232 152 160 152 2 0 false 5 0
w 344 304 408 304 0
a 408 312 456 312 3 5 0 1000000 2.5 2.0149882176346074
R 408 320 376 320 0 0 40 2.5 0 0 0.5
w 456 312 456 352 0
159 344 352 456 352 0 20 10000000000
159 280 352 344 352 0 20 10000000000
x 84 195 143 198 4 12 row\sselect
g 424 264 424 272 0
w 344 232 344 304 0
w 344 304 344 352 0
w 280 352 280 392 0
L 280 392 160 392 0 1 false 5 0
L 208 360 160 360 0 0 true 5 0
w 208 360 208 376 0
w 312 376 312 368 0
w 400 376 400 368 0
w 208 376 312 376 0
x 96 365 125 368 4 12 write
x 89 430 130 433 4 12 refresh
x 96 398 121 401 4 12 data
M 456 312 536 312 0 2.5
w 400 376 400 424 0
L 400 424 160 424 0 0 true 5 0


```

以上。
【Rails】uninitialized constant ActiveSupport::LoggerThreadSafeLevel::Logger (NameError)の対処法

# はじめに
こんにちは！ アメリカで独学でソフトウェアエンジニアを目指している者です。
本日はRails Tutorial を進めている際に新たにアプリを作成しようとしたらエラーが発生したのでそれについて記事にしようと思います。
なお、一時的なものの可能性がありますので参考程度にしてください。

開発環境
ホストOS: Windows 11
ruby : 3.2.3
Rails : 7.0.4.3
Docker Desktop 


# エラーの原因と解決方法

2025年1月16日に、以下のコマンドを実行しました：

```bash
rails new _7.0.4.3_ sample_application
```
その後、rails -v を実行すると、以下のエラーが表示されました：

```ruby
uninitialized constant ActiveSupport::LoggerThreadSafeLevel::Logger (NameError)
 ・
 ・
 ・
```
原因を調査したところ、`concurrent-ruby` gem が最近バージョン 1.3.5 にアップデートされたことが関係しているようでした。


## 解決方法
以下の手順で問題を解決しました：

1. Gemfile に次の行を追加します：
```ruby
gem 'concurrent-ruby', '1.3.4'
```
2. bundle install を実行します。
これでエラーが解消され、正常に動作するようになりました。
circuitjsの作法 その49

# 概要
circuitjsを調査してみた。
circuitjsをcodepenでiframeするテスト。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/e3d7250e-347b-3409-3b05-0b6ed2677003.png)

# 結果

セキュリティポリシーとして、ブラウザがjsからiframeへのアクセスをブロックしています。




以上。
良いコード／悪いコードで学ぶ設計入門 第４章

# 第4章 不変の活用 ─安定動作を構築する─

可変（ミュータブル）と不変（イミュータブル）の設計は、コードの安定性や保守性を大きく左右します。本章では、不変性を活用して意図せぬバグを防ぐための設計指針について解説します。

---

## 4.1 再代入

### 再代入の問題点
破壊的代入（変数への再代入）は、以下の問題を引き起こします。
- **変数の意味が変化**し、コードの推測が難しくなる。
- バグを誘発する可能性が高まる。

### 推奨される方法
変数を再代入せず、新しい変数を用意します。また、ローカル変数や引数を変更不可にできる言語では、その仕組みを活用します。

#### 言語別の例
- **Java**: `final` 修飾子  
- **C++**: `const` 修飾子 (`const T`, `const T* const`)

#### 補足
ただし、**ループ内の変数など意味が明確に固定される場合**は変更を許容する場面もあります。

---

## 4.2 可変がもたらす意図せぬ影響

### 問題点
可変な設計には以下のリスクがあります。
1. **インスタンスの使い回し**: 同じインスタンスを再利用すると、予期せぬ場所で値が変わり、バグを引き起こします。
2. **副作用**: 同じ結果を得るために、操作手順に依存する設計は予測困難で保守が困難になります。

#### 副作用の分類
- 主作用: 引数を受け取り、結果を返す関数の本来の動作。  
- 副作用: 主作用以外に、関数の外部状態を変更する動作（例: メンバ変数の変更、ファイルI/O）。

副作用を持たない設計が推奨されます。  
具体的には以下のような方針です。
- **引数で状態を受け取り、関数内で状態を変更しない**。
- 結果は新しい値を返す形にする。
- 影響をクラススコープ内に閉じ込める。

#### 実現方法
不変性を保つには、メンバ変数を不変にし、新しいインスタンスを生成する設計を採用します。

---

## 4.3 不変と可変の取り扱い方針

### 不変をデフォルトにする理由
- 変数の意味が変化せず、**混乱を防ぐ**。
- 挙動が安定し、**結果が予測可能**。
- 影響範囲が限定され、**保守が容易**。

### 可変を許容するケース
以下の場面では、可変を認める設計が実用的です。
1. **パフォーマンスが重要な場合**: 大量データ処理や画像処理など。
2. **スコープが局所的な場合**: ループカウンタや一時的なローカル変数。

#### 注意点
可変にする場合は、状態変更を明確に制御し、誤操作を防ぐ設計（例: フールプルーフ）が重要です。

---

## まとめ
- 不変性を基本とした設計は、コードの安定性と保守性を向上させます。
- 再代入や副作用を極力排除し、状態変更が必要な場合でも範囲を明確に限定することが推奨されます。
- 言語が提供する不変性を活用し、不変な変数やインスタンスを積極的に採用しましょう。

---

## 方針
社内メンバと勉強会を行った結果、下記の方針で実装を行うこととなった。
1. **再代入は極力避ける**: 変数の意味が変わらない設計を心がける。
2. **副作用を最小限に**: 関数やメンバ変数の影響を局所化する。
3. **不変をデフォルト**にし、可変は必要な場面に限定する。
Amplifyデプロイ中にcdk bootstrapが失敗するときの対処

# 事象
AWS AmplifyのコンソールからNext.jsアプリケーションをデプロイしたとき、以下のエラーでデプロイが失敗する。
```
Error updating stack: UPDATE_ROLLBACK_IN_PROGRESS The following resource(s) failed to update: [ImagePublishingRoleDefaultPolicy, StagingBucket].
```
![スクリーンショット 2025-01-13 18.02.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159675/6d5bbd3a-fc45-af80-045d-b160f2851226.png)

# 解決策
ECRリポジトリに`cdk-hnb659fds-container-assets-[account ID]-[region]`という名前のリポジトリが存在するか確認し、なければ手動で作成しましょう。

# 解説
- Amplifyのデプロイロジックは裏でCDKが動いている
- `cdk bootstrap`が実行されると、CDKがAWSリソースを生成するために必要な前準備を行う。具体的には以下リソースが作成される。
    - S3バケット 
        - AWS Lambda関数コードやアセットなどの CDK プロジェクトファイルを保存するために使用
    - ECRリポジトリ(private)
        - Dockerイメージの保存に使用
    - IAMロール
        - デプロイを実行するために必要なアクセス許可を AWS CDK に付与するように設定される
    - 参考：https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/bootstrapping.html
- この3つのリソースをBootstrap Resourceと呼ぶ
- Bootstrap ResourceになっているECRリポジトリを誤って削除してしまうと、cdk bootstrapが失敗していしまう。
- ログにあった`ImagePublishingRoleDefaultPolicy`は、`Fn::Sub: "${ContainerAssetsRepository.Arn}"`でBootstrap ResourceのECRリポジトリを参照している。
- ソースコード：https://github.com/aws/aws-cdk/blob/main/packages/aws-cdk/lib/api/bootstrap/bootstrap-template.yaml#L427C3-L427C35
【解決】US配列とJIS配列を併用したいがキーマップレイヤーのせいで無理そう【拘りを捨てろ】

US配列キーボードKeychron V8 Maxと，JIS配列ノートPC内蔵キーボードを併用したい．

## V8 Maxのキーマップレイヤー
V8 MaxはVIAでキーマップを変更できる．
WebアプリKeychron Launcherではキーマップを5つのレイヤーに分けて保存できる．
V8 Max本体でレイヤー切り替えができる．

## キーボードの併用
配列の異なるキーボードの併用のためにはデバイスインスタンスパスが必要．regファイル内でデバイスインスタンスパスを指定してなにやらレジストリを書き換えるそう．
*先駆者さまリンク*

https://zenn.dev/gn5r/articles/coexistence-jis-and-us

## デバイスインスタンスパスを確認
デバイスマネージャーを見ると日本語配列でないキーボードが5つある．
もしかしてレイヤーごとに別のデバイスとして認識させてる？？
![debai.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3988033/4a080fd7-db53-cfe9-cae3-690240ea954c.png)
並びがレイヤーの数字順とは限らない．消してみて動かなくなったレイヤーが該当ってやり方しか無さそう？？消した後の戻し方もわからないのにそんなことはできない……
内蔵キーボードの方を書き換えるのはなんか……憚られる．外付けデバイスをいじるのは勝手だけど内蔵はまずいと感じてしまう

## 一旦あきらめ
表記と違って困るけど手元見ないで打つ練習と思って一旦あきらめる．
US配列に慣れたくて買ったのに，無理矢理JIS配列で使うことになるとは情けない……

## 番外：V8 Maxのマクロキーを変換キーのように使いたい
V8 Maxはスペースの隣にマクロキーが2つ付いている．これをJIS配列の変換キー無変換キーのように使いたい．自分はATOKを利用しており，そのプロパティ機能を用いた方法で実現した．
マクロキーに変換キーを割り当てると，JIS配列キーボードとして認識させれば変換操作を受け付けるが，US配列キーボードとして認識させると受け付けなくなる．
よってCtrl+Spaceなどで代用することにした．
……が，JIS配列として使うことにしたので変換無変換を割り当てればいい話になってしまった．

# できました
記事をよく読むと，内蔵キーボードのレジストリこそいじるべしとわかった．むしろ内蔵キーボードでしかできない．
デバイスインスタンスパスは機器を付け外しすると変わってしまうそう．

regファイルをコピペ，内蔵キーボードのデバイスインスタンスパスを挿入
名前を付けて保存でエンコード方法を変更して保存
本体を再起動
## 結果
うまくいった！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3988033/5bac1c0d-35c5-c763-8af3-f493f31b2c0d.png)


早とちりせずちゃんと読みましょうねという教訓を得た．
[Github] remote: Support for password authentication was removed on August 13, 2021.の対処法

# はじめに
Git CLIを使用してリポジトリをクローンしようとした時に、Githubのアカウントのパスワードを入れると、
```shell
remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
```
というエラーが出ます。

普段Github Desktopを使用していて、この対処法をよく忘れてしまうので、メモしておきます。

# 原因
エラーメッセージのURLにアクセスしてみると,

https://docs.github.com/ja/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls

セキュリティのため、パスワードによる認証を廃止したようです。

代わりに、個人用アクセストークンを入力します。

# 解決法
https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens

ます、[Github](https://github.com)でログインし、自分のアイコンをクリック->「設定」を開きます。

![ScreenShot 2025-01-17 4.32.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2871960/a0fa7f06-d0a1-f91e-724d-13557e105523.png)

左のメニューの一番下の「Developer Setting」を開きます。

![ScreenShot 2025-01-17 4.35.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2871960/1d6a9b5f-ba6b-e187-5c98-0178e2c5480a.png)

ここで、「Personal access tokens」のFine-grained tokens」を開き、「Generate new token」ボタンをクリックします。

- token name：トークンの名前
- Expiration：トークンの有効期限
- Repository access：必要に応じて選択
- Permissions：必要に応じて選択

上記の設定が終わったら「Generate」ボタンを押します。
生成されたトークンはこの画面でのみコピーができるので、忘れずにコピーして保存しておいてください。

あとは、このトークンを使用してgitの操作を行うことができます。

# 終わりに

個人用アクセストークンには、

- Personal access token(classic)
- Fine-grained tokens

の2種類があり、公式ドキュメントでは後者を勧めていました。
しかし、前者でなければできないこと（例えば自分が所有していないリポジトリへのアクセスなど）があるようです。