OmniAICreator/Qiita-1.07M huggingface dataset:
AWSEC2へのSSM経由SSH接続時のPermission denied (publickey)でハマった

<!-- @import "[TOC]" {cmd="toc" depthFrom=1 depthTo=6 orderedList=false} -->

<!-- code_chunk_output -->

- [1. 概要](#1-概要)
- [2. 結論](#2-結論)
- [3. 前提](#3-前提)
    - [3.1. 環境](#31-環境)
- [4. 問題](#4-問題)
- [5. 解決策](#5-解決策)

<!-- /code_chunk_output -->




# 1. 概要
EC2に対してSSM経由でSSH接続したい場合は基本的に[AWSのSSH 接続ガイド](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-getting-started-enable-ssh-connections.html)に従えばいいが<br>`Permission denied (publickey)`エラーでハマったので共有する。
# 2. 結論
以下の記事が参考になる.
- [Permission denied (publickey) when SSH Access to Amazon EC2 instance [closed]](https://stackoverflow.com/questions/18551556/permission-denied-publickey-when-ssh-access-to-amazon-ec2-instance)
- [バカなことに・・・AWS EC2にssh接続できず超ハマった小話](https://qiita.com/zd6ir7/items/6b9a7ef483e69585ea35)
  
<ins>結論から言えば今回の件の場合接続先のUser名を.ssh/configで指定する必要があった<ins>

UbuntuのEC2の場合`User ubuntu`と設定する必要がある。


# 3. 前提
### 3.1. 環境
- 接続元: Windows11,AWSCLIは導入済
- 接続先: UbuntuAMI,キーペア設定済
上記のガイドに従いSSH接続のAWSのpolicyを割り当てる。
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ssm:StartSession",
            "Resource": [
                "arn:aws:ec2:region:account-id:instance/instance-id",
                "arn:aws:ssm:*:*:document/AWS-StartSSHSession"
            ],
            "Condition": {
                "BoolIfExists": {
                    "ssm:SessionDocumentAccessCheck": "true"
                }
             }
        }
    ]
}
```
次にSSH接続用の設定を行う。通常`~/.ssh/config`に存在する。(無い場合は作成する)
ガイドでは以下のように設定すればよいとされている。
```
# SSH over Session Manager
host i-* mi-*
    ProxyCommand C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters portNumber=%p"
```
# 4. 問題

秘密鍵の指定を適宜割り当てる。
```
# SSH over Session Manager
host i-* mi-*
    ProxyCommand C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters portNumber=%p"
    IdentityFile ~/.ssh/key.pem
```
こうすると以下のコマンドでSSH接続が可能になるが失敗する。

```powershell
ssh i-fugafuga
hogehoge@i-fugafuga: Permission denied (publickey).
```
エラーの要因は秘密鍵の指定やタイポもあるがここでは接続先に存在するユーザに対応したユーザ名ではなかった事が原因となる。.ssh/configで未指定の場合はwindowsのユーザ名がログイン時に用いられる。
参考:[https://stackoverflow.com/questions/18551556/permission-denied-publickey-when-ssh-access-to-amazon-ec2-instance](https://stackoverflow.com/questions/18551556/permission-denied-publickey-when-ssh-access-to-amazon-ec2-instance)
# 5. 解決策

UbuntuAMIの場合は以下のように.ssh/configを設定すればよい。
```
# SSH over Session Manager
host i-* mi-*
    ProxyCommand C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters portNumber=%p"
    IdentityFile ~/.ssh/key.pem
    User ubuntu
```
Gitを安心して使うために知っておきたいGitコマンドの動き　git branch編

# はじめに
私がGitについて勉強し始めてすぐの頃、Gitのコマンドを間違えてしまい研修で作ったプログラムがすべて消えてしまったことがあります。それからGitを使うのがとても怖かったです。もしもGitコマンドの動きを正確に知っていればこのようなミスはしなかったと思います。
この記事ではGit初心者向けに、`git branch`コマンドに焦点を当てて実行されたときの動きをまとめています。

# 具体例と実行コマンド
### 自分で作成した既存のブランチを一覧表示する
```
git branch
```
本記事で出てくるコマンドの基本となる`git branch`ですが、こちらは**リモート追跡ブランチ**以外のローカルブランチを一覧表示します。
これだけではローカルブランチをすべて表示することはできません。

#### ローカルブランチ
自分のパソコンの中にあるブランチです。
「オフラインで操作可能なブランチ」のようなイメージであり、本来は下記の**リモート追跡ブランチ**もローカルブランチに含まれます。
しかし、一般的にローカルブランチと呼ばれるものは上記コマンド`git branch`で表示されるブランチのことを指します。

#### リモート追跡ブランチ
リモートブランチを参照している**ローカルブランチ**です。
本来はローカルブランチの一つですが、本記事ではわかりやすくするためにグラフなどでローカルブランチとリモート追跡ブランチを分けて書いている場合があります。

#### リモートブランチ
ネットワーク上にあるブランチです。
「オンラインで操作可能なブランチ」のようなイメージです。

![スライド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715171/cd3904ed-f8f6-b8f2-4f32-5d2643c01e5e.png)

### すべてのローカルブランチを一覧表示する
```
git branch -a
git branch --all
```
こちらのコマンドがすべてのローカルブランチを表示することができます。リモート追跡ブランチも一緒に表示したい場合はこちらを使います。

### よくある`-a`オプションの間違った説明
よく「ローカルブランチとリモートブランチを表示する」と説明されていることがありますが、これは誤りでリモートブランチは表示されません。 表示されるのはリモート追跡ブランチです。

例えば、別の人が新しくリモートブランチを作成したとします。もしリモートブランチを見られるのなら、`git branch -a`コマンドで表示できるはずです。
しかし実際には追加されたリモートブランチは表示されません。
表示されるリモート追跡ブランチを更新するには、`git fetch` や`git pull`を使用する必要があります。これによりリモートブランチとリモート追跡ブランチが同期され、その後`git branch -a`コマンドを実行することでリモートブランチと同期したリモート追跡ブランチが表示できるようになります。

![スライド2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715171/e9fa2df4-eb0d-78b0-8eeb-111be8b18c53.png)

### ブランチごとに最新のコミットIDとメッセージ、上流ブランチの名前を表示する
```
git branch --verbose --verbose
git branch -vv
```
`verbose`とは「詳細な」という意味があり、それが二つ繋がっているのでとても詳細な情報を表示してくれます。
具体的には下記の５つですが、基本的には３番を知るために使うことが多いです。

1. コミットIDの最初の７文字
1. 最新のコミットのコミットメッセージ
1. 上流ブランチ名
1. 上流ブランチにプッシュしていないコミットの数
1. 上流ブランチからプルしていないコミットの数

上流ブランチという単語は聞きなれない方もいると思いますが、Gitコマンドの動きを知るうえではとても重要だと思います。

#### 上流ブランチ
ローカルブランチの追跡先として設定しているブランチのことです。
基本的にリモートブランチを上流ブランチとして設定します。
`git push`や`git fetch`、`git pull`などのコマンドを省略して使用したい場合は意識することになります。

#### 追跡ブランチ
特定のブランチを追跡しているブランチのことです。

リモート追跡ブランチから作成されたブランチは同期しているリモートブランチを上流ブランチとして設定しています。

![スライド3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715171/7f2c4339-f5dd-0865-fdab-7833e1d47b88.png)

### ローカルブランチを削除する
```
git branch -d [ローカルブランチ名]
```
ローカルブランチを削除できます。
しかし削除したいブランチが上流ブランチを設定している場合、変更履歴が失われないための措置としてマージ済みかどうかをチェックしています。そのため、マージされていない場合は警告を出すため削除することができません。

例として下記のグラフのような状況があるとします。

![スライド4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715171/b2741687-8812-fca7-7eae-2461b466dbdd.png)

ローカルブランチのfeature/01を削除するには下記の２つを満たさなければいけません。
1. feature/01がmasterにマージされている
1. `git fetch`や`git pull`でリモート追跡ブランチの情報を更新している

![スライド5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715171/2aa2026a-b202-8cfc-c0f7-e8210b7bf899.png)

### 強制的にローカルブランチを削除する
```
git branch -D [ローカルブランチ名]
```
`git branch -d`で警告が出るけど必要ないブランチを削除したいときはこちらのコマンドで削除することができます。
強制的に削除できてしまうので本当に必要ないブランチなのか把握したうえで使うようにすべきだと思います。

# おわりに
この記事には書いていない便利なコマンドはほかにもありますが、特に`git branch`について紹介しました。
Gitについて調べるといろいろな情報が出てきてどれが正しいのかわからなくなる時があるので公式ドキュメントを確認するのはとても大切だと考えています。ぜひご自身でドキュメントを読んで理解していただきたいと思います。
SSH Keysの作成とGit Hubでの認証（超超初心者向け）

- ## リポジトリのクローンが作成できないときの原因
出先のPCで作成したリポジトリを、自宅PCのターミナルからgit cloneしようとしました。（自宅PCでGitを操作したのは初めてでした）
どうやらHTTPS経由ではクローンできず、SSH Keysなるものを作成しないといけないようです。


<br>

- ## 参考にした記事
SSHがなんだかサッパリの人間でも、下記の2つの記事の手順どおりに進めれば必ずできます！
**↓SSH Keyの生成はこっちのほうがわかりやすい**
https://qiita.com/suthio/items/2760e4cff0e185fe2db9
**↓Git Hubでの鍵の認証の手順はこっちがわかりやすい**
https://qiita.com/suthio/items/2760e4cff0e185fe2db9
GCP Cloud Storageはダウンロード時にはセキュリティルールは適用されない


## GCP Storageはダウンロード時にはセキュリティルールは適用されない
セキュリティルールは、「getDownloadURL()」を利用して、トークン付きURL を取得する場合には適用される。
しかし、一度取得した トークン付きURL でダウンロードアクセスする際には、セキュリティールールは適用されない。
つまり、発行後のダウンロードURLをユーザが外部にE-mailなどした場合、セキュリティルールの設定にかかわらず誰でもダウンロードは可能になってしまう。

### じゃあ、有効期限の設定は？
また、有効期限expiresの設定は、サーバサイド向けのAdminAPIの「getSignedUrl()」にはあるのだが、クライアント向けの「getDownloadURL()」にはない。

### つまり
実装する機能によっては、自作のバックエンドを介した方が良い。
VSCode で Vue.js + TypeScript 開発していたらなんか動かなくなったので拡張機能を更新

## ことはじめ
Vue.js + TypeScript で開発していたら、急にコードジャンプが効かない＆型チェックが走らない状態に。

拡張機能のホストを再起動してみると右下に以下のメッセージが表示されました。
> The "TypeScript Vue Plugin (Volar)" extension is no longer needed in version 2.0. Please uninstall it.

> Takeover mode is no longer needed in version 2.0. Please enable the "TypeScript and JavaScript Language Features" extension.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135266/6c74c597-8ab5-f68f-bd4c-b95b36b3f126.png)

## 原因

Vue.js 公式 extension で以下のアップデートがあったようです。

- "Volar Language Features (Volar)" extension が "Vue - Official" に名称変更
- Volar 廃止
- テイクオーバーモード廃止
    - 代わりに「ハイブリッドモード」として、デフォルトの TypeScript プラグインで動作するようになったようです

https://github.com/vuejs/language-tools/blob/master/CHANGELOG.md#200-202432

## 対策
新しいワークスペースでは、シンプルに「Vue - Official」 extension のみを追加すればOKと思われます！

作業中のワークスペースでは Volar + Take Over Mode で開発していたので以下の対策を行いました。

1つ目ポップアップに従って Volar を無効にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135266/4f8a9c3b-821a-46b5-b485-c211975d78f4.png)


２つ目のポップアップに従って「TypeScript と JavaScript の言語機能」を有効にします.
（もともと、テイクオーバーモードを利用するために「ワークスペースで無効」に設定していたらしい）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135266/705cbbd9-bdcf-df03-3f87-a2e605275e1a.png)


Vue - Official も表示してみると「再読み込みが必要です」と表示されているので、再起動したら完了！
これまで通り開発できるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135266/c8b0ac10-5d94-6916-0d21-8b05cfa14c1b.png)
プライベートサブネットにECSFargateを配置する際に、エンドポイント or NATゲートウェイどちらを使うかって話

## 背景
プライベートサブネットにECSFargate環境を作ろうと思ったときに、他サービスとの連携にエンドポイントとNATゲートウェイどちらがいいだろうかと調べたのでメモ代わりに投稿


## エンドポイントを使用する場合
#### 必要となりそうなエンドポイント
・ECRからイメージ取ってくる
com.amazonaws.region.ecr.dkr
com.amazonaws.region.ecr.api
com.amazonaws.region.s3

・CloudWatchにログ送る
com.amazonaws.region.logs

・パラメータストアから環境変数を取得する
com.amazonaws.region.ssm
こちらについては記事によって若干違うが、ECSFargateでパラメータストアから環境変数を取得する場合は上記一つだけでできた(パラメータストア先で暗号化していても上記一つだけでできた)

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/setup-create-vpc.html#sysman-setting-up-vpc-create

https://repost.aws/ja/knowledge-center/ec2-systems-manager-vpc-endpoints

https://dev.classmethod.jp/articles/vpc-endpoints-for-ecs-2022/

・execを使う
com.amazonaws.region.ssmmessages

#### 料金(東京)
エンドポイント一つあたり: 0.014$ / 時間
処理データ1gbあたり: 0.01$

https://aws.amazon.com/jp/privatelink/pricing/


## NATゲートウェイを使用する場合
#### 料金(東京)
NATゲートウェイ一つあたり: 0.062$ / 時間
処理データ1gbあたり: 0.062$

https://aws.amazon.com/jp/vpc/pricing/


## 所感
・手間はNATゲートウェイの方が楽なのでは
・料金は頻繁にデプロイなど繰り返すならエンドポイントで、そんなにしないならNATゲートウェイでいいのでは
・NATゲートウェイだとインターネットに出てるのでは、という疑問があったけどこれは実際にはAWS内のネットワークで完結しているらしい

https://future-architect.github.io/articles/20210618a/
FlaskでSessionを使ってみるの巻

# はじめに
FlaskでRest APIサーバの学習をしていてFlaskでセッションでどうやってやるんだろう？？って疑問が湧いてFlaskでSessionを使う方法を調べてみました。
本記事ではFlaskに標準で容易されているSessionを利用してみます。
思いの外超簡単だったのでショート記事ですがまとめてみました。

# 環境
Visual Studio Code:1.85.2
Python:3.11.6
Flask:3.0.1
Werkzeug:3.0.1

# サンプルコード
[GitHub](https://github.com/ktaro-nakaya/flask-session)で公開しています。

# サンプルコードの使い方
:::note alert
事前に下記がインストールされていること
* pytohon（pipコマンド）
* Node.js（npmコマンド）
:::

## サーバサイド
SunChannelフォルダで以下のコマンドを実行します。

```sh:コマンド
pip install flask
pip install blueprint
python app.py
```

## クライアントサイド

client/counter-client フォルダで以下のコマンドを実行します。

```sh:コマンド
npm i
npm run start
```

## アクセス
必ず以下のURLでアクセスしてください。

```npm run start```を実行した時に表示するURLにアクセスします。

# 動作イメージ
Sessionでデータをサーバに保持しておりボタンをクリックするとカウントアップしいきます。
下記のイメージでは変な値がからスタートしていますが、初めて実行する時は1からカウントアップします。

<img width="40%" alt="count_up.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99960/dc2d28b9-5d28-5ae4-b3a4-be7fd46344d3.gif">

# 実装手順

大まかなセッションの利用手順は以下の通りです。

1. 必要なパッケージをインストール
1. secret_keyの設定
1. Sessionのインポート
1. セッションを使う

# 説明
## 必要なパッケージをインストール
まずは必要なパッケージをインストールしていきましょう。

```sh:コマンド
pip install flask
pip install blueprint
```

## secret_keyの設定

```python:app.py
from flask import Flask
from counter import bp_counter

# Flaskのインスタンス生成
app = Flask(__name__, static_url_path='/')

# Sessionの暗号化キー
app.secret_key = b'abcdefghijklmn'
```

Flaskのインスタンスを生成したらsecret_keyを設定します。
secret_keyには文字列もしくはバイト列か文字列を設定します。
上記のコードでは文字列をバイトに変換しています。
文字列のプレフィックスに関しては[公式サイト](https://docs.python.org/3/reference/lexical_analysis.html#string-and-bytes-literals)を確認してください。

今回はsecret_keyを直に記述しておりますが、こういったセンシティブな情報は秘匿されておくべきです。
設定方法や推奨方法については[公式サイト](https://msiz07-flask-docs-ja.readthedocs.io/ja/latest/config.html)を確認してください。

## Sessionのインポート
準備が完了したらsessionをインポートします。

```python:count.py
from flask import  session
```

## セッションを使う
あとはセッションを利用するだけです。
sessionは[dict型](https://docs.python.org/ja/3/c-api/dict.html)なので、
今回は初回アクセスに対応してキーの存在確認などを行っております。


```python:count.py
    # sessionはdic型なのでキーが存在するか確認
    if 'count' in session:
        # すでにキーが存在する場合はカウントアップ
        current_count = session['count'] + 1
        session['count'] = current_count
    else:
        # キーが存在しない場合は初期値を格納
        session['count'] = 1

    # レスポンスのメッセージを生成してJSONに変換してHTTPステータスコード200で返す
    message = {'number': session['count']}
```

# まとめ
session自体はかなり簡単に利用できるっぽいですね。次回はflask-sessionなどの記事をアップできたらいいなと思います。
MT7628のu-boot

githubにあったソースを無理やりFreeBSDでビルドして焼いてみました。ファイルがなかったり、Linuxコマンド固有の処理があります。

https://github.com/kysonlok/u-boot-mt7628

ターゲットのDRAMはW9751G6KBなのでDDR2の16Bitで512MBitになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/a13f2948-90db-0e10-9f3a-e768d56f2015.png)

```
[04000D07][04000D07]
DDR Calibration DQS reg = 00008787


U-Boot 1.1.3 (Mar  4 2024 - 09:37:56)

Board: Ralink APSoC DRAM:  64 MB
relocate_code Pointer at: 83fb0000
******************************
Software System Reset Occurred
******************************
flash manufacture id: c2, device id 20 17
find flash: MX25L6405D
====================================================== 
Ralink UBoot Version: 4.3.0.0
-------------------------------------------------- 
ASIC 7628_MP (Port5<->None)
DRAM component: 512 Mbits DDR, width 16
DRAM bus: 16 bit
Total memory: 64 MBytes
Flash component: SPI Flash
Date:Mar  4 2024  Time:09:37:56
-------------------------------------------------- 
icache: sets:512, ways:4, linesz:32 ,total:65536
dcache: sets:256, ways:4, linesz:32 ,total:32768 
-------------------------------------------------- 
 ##### The CPU freq = 580 MHZ #### 
 ##### Memory size =64 Mbytes ####
====================================================== 


Press press WPS button for more than 2 seconds to run web failsafe mode

WPS button is pressed for:  0 second(s)

Catution: WPS button wasn't pressed or not long enough!
Continuing normal boot...

   *** ***         ** ** *****  ***   ***   ***    *    ** ***
  *  *  *          ** ** * * * *   * *   * *   *   *     *  * 
 *      *          ** **   *       * *   * *   *   **    ** * 
 *      *    ***** ** **   *     **  *   * *   *  * *    ** * 
 *  *** *          * * *   *       * *   * *   *  * *    * ** 
 *   *  *          * * *   *       * *   * *   *  ****   * ** 
  *  *  *   *      * * *   *   *   * *   * *   *  *  *   *  * 
   **  ******      * * *  ***   ***   ***   ***  **  ** *** * 


Hit SPACE to stop autoboot:  0 
gl-mt300an>   
```

なぜか起動がすごく遅いです。

ターゲットのオリジナルがZ-LOADERというu-bootのアプリケーションを使っていたのでシンプルなu-bootを試してみました。Z-LOADERはFlashの先頭の3Mを使っていて、8MのFlashだと5MしかOSに使えません。元々は32MのFlashがついていたので、それでもいいんでしょうが。

このu-bootはGL.iNet社のGPLで公開されたソースと思われますが、結構荒く手が入っているような感じなのであまりお勧めしません。

MT7628でFreeBSDが起動できないので、ブート依存の問題か確認のためにためしました。オリジナルに近いこのu-bootでも起動できないので、FreeBSD側の問題の可能性が濃厚です。

後日追記：MT7621,MT7628はUARTの仕様が変更されていたことが原因でした。対応して起動できるようになっています。
記号のソート順【フォルダ整理 / プログラミング一般】

# はじめに

「記号を使うことで、効率的にフォルダ整理をしよう！」
「そのために、記号のソート順を知ろう！プログラミングにも活きるかもしれないし。」

という記事です。

## 数字によるフォルダ整理の欠点

フォルダ整理術としてよく使われるのが、
```
00_やること
01_仕事
02_買い物
```
のように、頭に数字をつけることで順番を整理するというものです。

とても良いやり方なのですが、以下の欠点があります。
- 「新しく追加する際に番号を変える・考え直す手間」
- 「入力の手間（3文字の入力・番号を考える手間）」
- 「特定のファイル・フォルダだけに適用する」というケースに不向き
  例：記号が優先されてしまう。かといって全部に番号を振るのは・・・
  ```
  【後回し】やること2
  【重要】やること1
  0_やることリスト
  やること3
  やること4
  ```


# 解決方法

「最優先される記号」を知ることで、「どの記号よりも優先する」ことができます。

<font color="LimeGreen">それはずばり、`!`です</font>。

  ```
  !やることリスト
  【後回し】やること2
  【重要】やること1
  やること3
  やること4
  ```

⚠️注意：`!`は半角であることが条件です。

## `!`が最優先されるケース

<font color="Salmon">実は、採用されているソートシステム・文字コードによります。</font>
ただ、<font color="LimeGreen">多くの場合で「ASCIIで定義された記号」を最優先で表示</font>します。

> カスタムソートを適用した場合、または特定のロケール設定で動作するアプリケーションでは、標準的なASCIIソート順とは異なる結果が得られることがあります。
> しかし、これらはユーザーが明示的にソートルールを変更した場合や、特殊な環境設定下での話であり、ほとんどの標準的な設定では`!`はASCII文字の中で最も低いコードポイントを持ち、ソート時に最初に来ることが多いです。（ChatGPT-4）

ASCIIの記号に限った場合、以下の順になります。
全角の記号や、特殊記号はこの後に続くケースがほとんどでしょう。

```
'!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', ':', ';', '<', '=', '>', '?', '@', '[', '\', ']', '^', '_', '`', '{', '|', '}', '~'
```

### 余談：ASCII全体のソート

```
' ', '!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~'
```

ASCIIに基づいてソートするとこの順になります。
数字やアルファベットが、一部の記号より優先されています。

実際はこの順ではなく、アプリケーションによって「記号優先・次に数字・その次にアルファベット」になっていることが多いです。

# おわり

なお、これを思い立った理由であるKindleの並び替え問題は解決していません😇
Kindleは特殊な並び替えをしているようだ・・・

全く話は変わりますが、
スペイン語は感嘆や疑問で、特殊な記号を頭につけるんですよね。
`¡Hola!`(こんにちは！)とか。

言語特有のsort問題があったりするのかな・・・

# 参考

ChatGPT-4

https://rcmdnk.com/blog/2020/08/02/computer-google/#google_vignette

http://www3.nit.ac.jp/~tamura/ex2/ascii.html

https://pepacomi.com/column/kintone-sort-order/

https://www.w3.org/TR/xml-entity-names/bycodes.html
Elixir: Map の使い方

## プログラム

```exs:map01.exs
# ------------------------------------------------------------------
#
#	map01.exs
#
#						Mar/04/2024
# ------------------------------------------------------------------
IO.puts :stderr,"*** 開始 ***"
#
dict_aa = %{
	t2381: %{name: "名古屋", population: 36952, date_mod: "1910-9-27"},
	t2382: %{name: "豊橋", population: 43951, date_mod: "1910-7-21"},
	t2383: %{name: "岡崎", population: 76352, date_mod: "1910-6-12"},
	t2384: %{name: "一宮", population: 28752, date_mod: "1910-1-17"},
	t2385: %{name: "蒲郡", population: 56251, date_mod: "1910-5-9"},
	t2386: %{name: "常滑", population: 16453, date_mod: "1910-9-16"},
	t2387: %{name: "大府", population: 81957, date_mod: "1910-8-5"},
	t2388: %{name: "瀬戸", population: 92947, date_mod: "1910-10-20"},
	t2389: %{name: "犬山", population: 34918, date_mod: "1910-7-11"}
}
#
ll = Map.keys dict_aa
#
Enum.each(ll, fn(s) ->
	str_out =  to_string(s) <> "\t" <>  dict_aa[s].name  <> "\t" <> Integer.to_string(dict_aa[s].population) <> "\t" <> dict_aa[s].date_mod
	IO.puts(str_out)
	end)
IO.puts :stderr,"*** 終了 ***"
# ------------------------------------------------------------------
```

## 実行結果

```text
$ elixir map01.exs 
*** 開始 ***
t2381	名古屋	36952	1910-9-27
t2382	豊橋	43951	1910-7-21
t2383	岡崎	76352	1910-6-12
t2384	一宮	28752	1910-1-17
t2385	蒲郡	56251	1910-5-9
t2386	常滑	16453	1910-9-16
t2387	大府	81957	1910-8-5
t2388	瀬戸	92947	1910-10-20
t2389	犬山	34918	1910-7-11
*** 終了 ***
```

## 確認したバージョン

```text
$ elixir -v
Erlang/OTP 25 [erts-13.1.5] [source] [64-bit] [smp:16:12] [ds:16:12:10] [async-threads:1] [jit:ns]

Elixir 1.14.0 (compiled with Erlang/OTP 24)
```
Pythonでの閏年判断

閏年で不幸になる人を少しでも減らすためのメモ

# 閏年の特徴

↓とてもわかりやすいサイト↓
https://www.casio.com/jp/watches/contents/leap-year/

- 閏年は、西暦年が4で割り切れる年
- ただし、100で割り切れる年は閏年ではない
- しかし、400で割り切れる年は閏年になる
  このルールにより、閏年は一般的に4年に1度発生するが、上記の例外によって調整される

検索条件で1年前以降とかを指定する時に何も考えずにyear - 1とかしちゃうと閏年の日にエラーになる(戒め)

# 指定した年が閏年かどうかを判断

Pythonでは、calendar モジュールの isleap(year) 関数を使用して、指定した年が閏年かどうかを判断できる

```python
is_leap = calendar.isleap(2024)
print(is_leap)  # 出力: True
```

# 指定した範囲内の閏年の数を計算

calendar モジュールの leapdays(y1, y2) 関数は、指定した範囲内の閏年の数を返す。ここで、y1 年から y2 年の直前までの間で閏年がいくつあるかを計算する

```python
num_leap_years = calendar.leapdays(2000, 2024)	# 2000~2023が計算範囲
print(num_leap_years)  # 出力: 6
```

あとはこのライブラリをこねくり回してやりたい処理を書きましょう
データの企画に立ち返ってみた

# 背景
業務データのデザインは、結構プロセス面から何となくで企画されてしまっているし、自分自身でも感覚的にやってしまっていることにずっと課題意識を感じていた。
案件の中でも、アプリエンジニアが多いためか、データの側面からの議論はわりとおざなりにされがちな印象を受けてしまっている。

この業務データがそもそも生まれた背景や企画などを通らないことには、適切なデータの側面におけるコンテキスト境界も定義できないはずだ！という強い情念みたいなものがある。

そこで今回は分析データ系を軽くでも学んだうえで、
どのように業務データをデザインしていくのか？について考察してみる。

# 前提
自分はアプリケーションアーキテクト兼BPMを主に担当している。
データのマネジメントも軽くではあるがやってはいるものの、充分にデータの品質まで考慮できてはいない。


# その業務データは誰にとっての価値となるのか？
まず誰にとって、どんな状況下でその業務データが価値を生むのか？を起点に考えなくてはいけない。
簡単な具体例を考えてみよう。

## エンドユーザーの属性データ
たとえばエンドユーザーのエンティティに含まれる性別や年齢といったもの。
あれは結局誰にとって価値を生んでいるのだろうか？
恐らくであるが、プロダクトマネージャーやマーケティング担当者といった人々であろう。

自分たちのプロダクトは、どの市場のどこのセグメントに対して打ち出しているものかを考えた上で、そのセグメントの人々がもっとも価値を感じるであろうモノコトを考えている。

その上でじゃあ実際にはどのセグメントの心に響いているのか？その仮説を検証したいはずだ。
でないと品質改善もへったくれもない。
すると自ずとエンドユーザーの属性として、年齢や性別といったものが欲しいはずだ。
そして集めた業務データを分析集計した分析計のデータを見ながら、
仮説段階で想定していたセグメントと実際の検証によってセグメントとのズレを検証する。

もちろん最初のセグメントで設定したイメージ像によって集める属性も変わり得る。
大事なのは、検証でどんな分析データを見たいのか？それによってどう改善サイクルを回したいのかだ。

## イベント系の属性データ
注文といったイベント系のエンティティに対する属性データも考えてみよう。
これも注文日時　とかって思考停止した状態でも必須な属性は出せるが、
何を分析してビジネスの改善に生かしたいのか？を起点に考えるのだ。

たとえばビジネス背景と目的が
「今現在は24時間営業であるが、このところエンドユーザからサービス品質に対するクレームが来ている。
今までは24時間一定したサービス品質を心掛けていたが、現場を見てみると明らかに深夜帯は暇なことが多い割には、従業員の１時間当たりの単価が高い。
さらに調べてみたところ、クレームが来ているのは注文の集中している忙しい時間帯であった。
そこで営業時間を24時間するのではなく、注文が集中していない時間帯にのみ厳選することで無駄なコストをカットし、その分サービス品質向上に回したい。」
というものがあったとする。

すると事業のトップや経営層は自ずと注文の時間毎の濃淡を分析データを通して調べたいはずだ。
注文の集中していない時間帯を傾向から把握した上で、
その時間帯に関してはいっそのことサービスを停止してしまい、浮いたコストで注文の集中している時間帯にコストをつぎ込むという戦略を取ることにする。
そのためには現場で注文日時という属性を含んだ注文という業務データを集めなくてはならない。


# GQM(+D)ワークショップ
上記では簡単な具体例を想定して必要な業務データをデザインしていく様を書いたが、若干感性に訴えかけたようなデザインの仕方に思えるので、自分なりに感性ではなく仕組みでデータをデザインする工程を考えてみた。
その際に使うスキルがこのGQMDワークショップである。

https://www.oreilly.co.jp/books/9784814400607/

ソフトウェアアーキテクチャメトリクスという書籍の最終章でこのGQMについて触れられている。詳細は別の記事を読んでほしい。

また一度企画したデータはそれで終わりではなく、
継続的にもっとメトリクスを集めるのに適したデータは何かな？って考え続けるサイクルを回し続けていく。

そのような活動はアジャイルメトリクスという書籍で触れられている。

https://www.amazon.co.jp/%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E3%83%A1%E3%83%88%E3%83%AA%E3%82%AF%E3%82%B9-Christopher-W-H-Davis/dp/4798169412

要は目標となるゴールがあり、そこを起点に仮説ベースで
「じゃあその目標を何をもって達成したかどうかを考えるの？」と議論し、
メトリクスの候補を考えた上で、そのメトリクスのためにはどんなデータが必要か？
そのデータは実際問題集めることができるのか？
などを集めるコストと、そのデータによって生み出される恩恵効果の両軸から考えるのだ。

これと全く同じ発想が業務データのデザインの時に必要である。

各ステークホルダーにとって想定シーンに応じた目的があり、
その達成度合いを調べるために、業務データや運用上のデータが存在する。

継続的にこのGQMDワークを行うことで、不要なデータも明らかになりやすい。

## データの用途
さらにドメインサービス用の業務データなのか？
それとも運用用のデータなのか？については、そのデータを誰が必要とするのか？
を起点に考えればいい。

プロダクトを提供する組織内部の人にとってしか使わないデータは運用上のデータだ。
対して、エンドユーザーなど組織外部の人にとっても使うデータはドメインサービス上の業務データである。
たとえばエンドユーザーは口コミの詳細内容といったデータなどを見て、注文しようかどうか決めたいという想定であれば、口コミの詳細はドメインサービス上の業務データである。


# まとめ
今回はデータの企画という原点に立ち戻ってみた。

さらに一度定義したデータが継続的に利用されるとしても、データに求められる非機能部分が変更されるかもしれない。
その場合にも、継続的なGQMDが有効と思われる。

もしもメトリクスに必要なデータが求められる品質を満たすために膨大なコストがかかるなら、
別のデータの方がより費用対効果があるから、そっちを集めた方がいいよねってなる。
システムファイルによるディスク容量問題の解決法

システムファイルが膨らんでディスク容量を圧迫する問題は、よく見られます。
今回、システムファイルが原因でディスク容量が一杯になる問題を解決した内容をメモします。

# ステップ1: ディスククリーンアップの使用
Windowsには、不要なファイルを削除してディスクスペースを解放するためのツール「ディスククリーンアップ」が備わっています。

「スタート」メニューで「ディスククリーンアップ」を検索し、開きます。
解放したいドライブを選択します。
不要なファイルのチェックボックスを選択し、「OK」をクリックします。

関連コマンド：
　　　cleanmgr

# ステップ2: システムファイルの削除
ディスククリーンアップで解放できるスペースには限りがあるため、システムファイルの削除も検討してください。

「ディスククリーンアップ」の画面で「システムファイルのクリーンアップ」をクリックします。
削除するシステムファイルを選択し、「OK」をクリックします。

# ステップ3: 一時ファイルの削除
一時ファイルはディスクスペースを大量に消費することがあります。これらを定期的に削除することが重要です。

「設定」＞「システム」＞「ストレージ」を開きます。
「一時ファイル」をクリックし、不要なファイルを削除します。

関連コマンド：
　　　del /q /f /s %temp%\*
   
# ステップ4: 大きなファイルの特定と削除
不要な大きなファイルを特定し、削除することもディスクスペースを解放する効果的な方法です。

ファイルエクスプローラーを使用して、大きなファイルを検索します。
不要なファイルを特定し、削除します。

関連コマンド：（Powershell）
　　　Get-ChildItem -Path "C:\" -Recurse | Sort-Object -Property Length -Descending | Select-Object -First 10

# ステップ5: Windows Search のインデックスの作成対象をチューニングする(Windows.edb)
Windows.edb のサイズは、Windows Search のインデックスの作成対象によってサイズが変わりますため、インデックスの作成対象が多いほど、サイズが大きくなり、対象が少ないほどサイズが小さくなります。

----------------
- 設定手順
----------------
1. ファイル名を指定して実行に "control /name Microsoft.IndexingOptions" と
   入力して実行し、[インデックスのオプション] を開きます。
2. [変更] ボタンをクリックします。
3. インデックスを作成するフォルダーを設定します。
必要なフォルダーにのみチェックを入れ、検索対象から外すフォルダーのチェックを外すことで対象ファイルを減らします。

さらに、以下コマンドで Windows Search サービスを一時的に停止した後にデータベースを最適化しており、実行後にインデックスが再構築されます。
````
   Sc config wsearch start=disabled
   Net stop wsearch
   EsentUtl.exe /d %AllUsersProfile%\Microsoft\Search\Data\Applications\Windows\Windows.edb
   Sc config wsearch start=delayed-auto
   Net start wsearch
````
※すでに容量不足の場合は、該当ファイルを削除して再構築で進めてください。
Stop-Service -Name "WSearch"
Remove-Item -Path "C:\ProgramData\Microsoft\Search\Data\Applications\Windows\*" -Recurse
Start-Service -Name "WSearch"

# ステップ6: Officeキャッシューの削除
C:\Users\<User>\AppData\Local\Microsoft\Office\16.0\OfficeFileCache

こちらはOffice アプリケーションで WebDAV が有効なサーバーなどからOffice ファイルを開くことで生成されるキャッシュ ファイルであり、削除が可能なファイルでございます。

本ファイルはキャッシュ ファイルであり、削除を実施しても Office やシステムなどへの影響はございません

# 結論
システムファイルによるディスク容量問題は、上記のステップにより解決することができます。定期的なメンテナンスと不要なファイルの削除により、ディスクスペースを効果的に管理することが可能です。
【子育て中エンジニア】エンジニア歴3年目キャリアが詰んでるのか？

# はじめに

__いつもお世話になっております！兼業主夫SESの@yone051319です！__
2023年12月〜2024年2月にかけて転職活動を行いまして、無事に終了しました。
結論としましては、キャリアは詰んではいなかったのですが、<font color="red">**かなり厳しい状況**</font> でした。

将来振り返りする際や当時の状況を残したいと考え、書き留めました。
採用関係の方や同年代の方の参考になれば幸いです。


## 筆者のスペックと家庭事情
* 非情報系の地方国立大院卒
* エンジニア歴3年目（2社目）
* 1社目退社〜現職入社までに10ヶ月の空白期間あり
* 共働き（妻は医療従事者で激務）
* 子供は1歳
* 家事育児負担割合　自分：妻＝４：１

https://qiita.com/JY8752/items/d9ffda5d36237c44cede

上記の記事は子育て中の状況を言語化しており、非常に共感できる内容でした。
（首が折れそうなほど頷きました）

## 保有資格
* ExcelVBAエキスパートベーシック（2022年4月）
* ITパスポート（2022年5月）
* 基本情報技術者（2022年11月）


## 転職軸
転職軸は下記の２軸でした
1.　育児のため中長期的なリモート環境を確保すること
2.　マネジメント方面へのキャリアに向けての成長環境があること

子供の保育園関係や病院受診を含めた育児全般と、日々の家事を主に担当していることもあり、フル出社を求められる就業はできない状況でした。
エンジニアとしてもPLやPMといったマネジメント層へ進むことを見据えて、それらポジションの存在と会社としてバックアップしていただける環境を求めました。


## 結果
書類落ち: 41社
選考途中辞退: 24社（カジュアル面談、書類通過、1次面接通過を含む）
1次選考落ち: 16社
2次選考落ち: 1社
最終面接落ち: 3社
内定: 2社

**企業側からよくされた質問**
*　経歴を教えてください
*　志望動機を教えてください
*　前職の退職理由を教えてください
*　転職理由を教えてください
*　3年後、5年後のキャリアの希望について教えてください
*　マネジメントに進みたい理由を教えてください


## 使用したサービス
*　転職ドラフト
*　リクナビエージェント
*　レバテック
*　Green

主に上記の4つのサービスを使用しました。
まず、転職ドラフトを使用してオファーをいただける粒度感の職務経歴書を作成するのが良いかと思います。
携わったプロジェクトの内容だけでなく、自身の役割や貢献などを詳細に記載する必要があります。自分自身を見つめ直し、スキルの棚卸しができるはずです。
（転職ドラフト招待コード：FAEO）

作成した職務経歴書を持って各社のサービスに登録し、スカウトの中から条件に合いそうな企業とカジュアル面談を実施する流れで進めました。


## 印象的だった質問
今回の転職活動にあたって印象的であった質問の一部を記載します。
やはり、働き方の部分で答え難い質問をされたことが印象に残っています。

### **「うちは出社必須ですけど、就労できますか？」**

:::note warn
無理です
中長期的なリモート環境を求める旨の転職軸をレジュメに記載しています。スカウトを送るのであれば見てから送っていただきたいです。（お互いに時間の無駄になってしまいます）
:::


### **「この1年（2023年）は資格の取得に向けたチャレンジはしなかったの？」**

:::note warn
すみません。
当日に子供の体調不良で受験できない可能性が高いです。
そもそも満足に勉強時間を確保できないので、業務に関係するインプットで精一杯でした。
:::


### **「奥さんが医療従事者なら、あなたが専業主夫になってもいいんじゃない？」**

:::note alert
ないです。
パートナーが医療従事者の人は主夫（婦）にならないといけないというルールでもあるのでしょうか？
:::


### **「育児を主体にして、エンジニアとして成長したいというのは矛盾しているよね（笑）」**

:::note alert
~~御社の育児中エンジニアは全く成長していないんですね。~~
~~隣に座っている人事の女性が苦笑いしてますよ~~
育児と仕事のバランスが重要だと思います。子供の成長とともに仕事に注力する時間も増えるので、ジャンプアップに向けての助走期間にできないでしょうか？
:::



### **「家事も育児も仕事も抱える過酷な状況かと思います。継続できている秘訣は何でしょうか？」**

:::note info
子供の成長を毎日楽しむことだと思います。
その時間を確保したいです。
:::


## まとめ
今回の転職活動で感じたのは、育児と仕事の両立を目的とした転職は自分の場合は難しいということでした。

「会社として求める自分」や「仕事人としてありたい自分」が、「家庭内であるべき自分」とのバランスが取れなくなると、最も大切な家庭が崩れてしまい全てを失いかねません。
求職者として <font color="red">**「自分を雇用することにあたってのリスク」**</font>ではありますが、カジュアル面談や1次面接のフェーズで積極的に話すことを意識しました。
「定着懸念」や「働き方の確約が困難」といった理由で選考落ちすることが多々ありました。逆に入社してから、「リモート案件がない」であったり「保育園送迎による中抜けが許可されない」といった、<font color="red">**就労困難**</font>な会社都合が発生する前に気が付くことができて良かったと切り替えました。


社風によるかと思いますが、プライベートを大切にして長期的な就労を目指す事を目的とした転職活動について、面接官さんの個人ベースで理解していただけることが意外にも多かったです。もちろん企業の採用戦略との兼ね合いになりますので、ご縁がなかった結果となることも多くありました。
めげずに根気よく転職活動を続けた結果、自身の状況や今後のキャリア方向に共感していただく企業と出会うことができました。


## 最後に
この記事が、同じような状況にある方々の助けとなれば幸いです。
長文にもかかわらず、読んでいただきありがとうございました。
引き続き頑張ります！
net/http で GraphQL API にリクエストする

GraphQL かどうかはあまり大きな問題ではないですが...

## コード

- `Net::HTTP::Post.new` の第2引数 `initheader` は、必要に応じて設定してください。今回は `Authorization` と `Content-Type` を設定しています
- `hostname` と `api_token` を取得しているところは、Rails の機能で実現しています。必要に応じて読み替えてください
- Rails でない場合などで `require 'net/http'` されていない場合は、別途記述してください

```ruby
query = <<~QUERY
  {
    books {
      name
    }
  }
QUERY
{ query: }.to_json

http = Net::HTTP.new(Rails.configuration.settings.fetch(:hostname), 443)
http.use_ssl = true
req = Net::HTTP::Post.new(
  '/graphql',
  Authorization: "Bearer #{Rails.application.credentials.fetch(:api_token)}",
  'Content-Type': 'application/json'
)
http.request(req, query)
```

## ポイント

- `Net::HTTP.new` の第1引数 `address` はホスト名を指定します（`https://` は含めない形にします）
- `Net::HTTP.new` の第2引数 `port` はデフォルト 80 なので、443 にする場合は指定します
- SSL/TLSを有効にする場合は、`http.use_ssl = true` を記述します

## 参考

- [library net/http](https://docs.ruby-lang.org/ja/latest/library/net=2fhttp.html)
- [Net::HTTP.new](https://docs.ruby-lang.org/ja/latest/method/Net=3a=3aHTTP/s/new.html)
- [Net::HTTP#use_ssl=](https://docs.ruby-lang.org/ja/latest/method/Net=3a=3aHTTP/i/use_ssl=3d.html)
- [class Net::HTTPRequest](https://docs.ruby-lang.org/ja/latest/class/Net=3a=3aHTTPRequest.html)
AWSにデプロイしたGoアプリに独自ドメインでhttps接続した話

# はじめに
これまでにAWSサービス上での開発などは経験あるものインフラ全体を設定することは初だったので、1週間ほどかかってしまいました笑

なので今回はつまづいたポイントを押さえて、次回1からデプロイする際はスムーズにいくよう記録に残したいと思います。

# 参考記事
[【初心者向け】AWS ECS + Fargate + CodePipeline + RDS でバックエンドサービス基盤を作る](https://zenn.dev/taiki_asakawa/books/dfc00287d5b8c7/viewer/f19054)

まずはほとんどの設定、構成を上記を参考にさせていただきました！（マジ助かる〜）
違う部分はPBかPRのサブネットの場所くらいです。

で、どこでつまづいたのよ？

# 独自ドメインでHTTPS接続できない
インターネット → Route 53 → ALB → ECS Fargate → RDS
みたいな構成でした。
起動すると以下のログでアプリは正常に起動できていそう。

![スクリーンショット 2024-03-04 11.38.16（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289261/3273653d-87f8-6845-3e92-ec9728f954a3.png)


よし、独自ドメインの https://hogehoge.com にアクセス！
```
このサイトにアクセスできません
hogehoge.com にタイプミスがないか確認してください。
DNS_PROBE_FINISHED_NXDOMAIN
```
なんでやねん。となりました。

でも、ALBのDSN名でアクセスすると、

![スクリーンショット 2024-03-04 11.41.07（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289261/f08763a0-c479-2b8d-1585-b2233094417d.png)

接続できてるんです。（画面にアクセスできたら、JSONが返却されます）

と、いうことは、Route53 が怪しい！
以前デプロイした際に設定していたので、それが残ってるのが悪いんじゃないか？と考えたので、ACMとRoute53の設定を全削除しました。→ (地獄の始まり)

そして、ホストゾーンを再発行したら、まさかのネームサーバーも再登録が必要になった。（チーン）
下記の記事を参考にさせていただき、再登録しました（再登録にお金かかります）
[Route 53で取得したドメインのホストゾーンを削除してしまったら](https://qiita.com/tutti618/items/44d4718b842b74ea34b2)

そして、いろいろ調べた結果、Aレコードの登録が原因でした！笑
お前IT初心者かよ！と言われても仕方ないです。ちなみに5年目です。はい、すみません。
ちなみにAレコードを知らない方に向けて説明すると、
```
A(Address)レコードは、IPｖ4でホスト名とIPアドレスの関連づけを定義するレコード。
「www」などのホスト名を入力し、VALUEにグローバルIPアドレスを入力することによって、
ご利用いただくサーバーへの名前解決が行われます。
```
つまり、ホスト名(独自ドメイン)とIPアドレス(ALBで設定したDSN名）の紐付けをしないとドメインでアクセスできない！という結果でした。
設定に関しては、こちらを参考にさせていただきました。
[【AWS環境構築メモ⑧】Route53でAレコードのエイリアスを作成する](https://qiita.com/yuuichimizuta/items/23ed28b7518cdd9a7801)

Route53でAレコードを設定して、数分後アクセスすると上手く行きました！

# 自分へ
プライベートサブネットに作成したDBに一時的にアクセスするには、ルートテーブルを一旦パブリックに変えて、 RDSの設定をパブリックアクセス可能にし、サブネットグループをパブリック指定するとローカルマシンから接続できるよ。ちなみにアクセス後はちゃんと設定戻さないとあかんよ。

# 最後に
AWSと少し仲良く慣れた気がします。
アーキテクチャ部分はもっと勉強しないとなっとなりました。
英語の技術動画から学ぶためにやっている５つのこと

# はじめに

- 海外の最新の技術情報に触れたい
- しかし、英語を読んだり聞いたりするのがシンドイ
- どうしたらよいのだ

この記事では、生成AIサービスを使用して、英語動画コンテンツの理解をサポートする手段を紹介します。


##  本記事で扱うモチーフ
tani junさんのAlife2023の講演動画を要約してもらいました。

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


# 1.要約をしてもらう

「summarize.ing」というサービス

YouTubeのURLをいれてボタンを押すだけ。YouTubeの内容が要約される。便利ぃです。

https://summarize.ing/ja

実際にやってもらった結果がこちら。

https://summarize.ing/ja/video-8274-ALIFE2023-Keynote-Jun-tani

発表者の略歴とテーマがmarkdown treeに抽出されるまで..！ありがたいですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348593/fb8e92f4-2e62-d65a-155f-ec9e92a72f52.png)


無料版でも1日に20のビデオ要約できます。充分すぎでは！？　ありがたいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348593/366e0332-1f85-8926-affa-fb3e68a56991.png)


# 2. 文字起こしを、日本語訳にして整形する

youtubeの「文字起こしを表示」を使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348593/849337a8-4bea-3166-7f26-e7eb68272140.png)

表示された文字起こしをタイムスタンプを表示しない形式に変更し、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348593/ecc656ae-7d9e-8116-373f-0bd657fc9f82.png)

全量をコピー。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348593/95ce8d78-60a2-52e6-6045-a21b36688096.png)

ChatGPTにぶっこみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348593/5ae961b6-4dda-c5e6-8ae8-0f201f83be7f.png)

すると、このように見出しつきで整形された形で日本語訳を返してくれました。
あざすです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348593/e9bf201c-18fd-caa2-ef4b-4466f32c65e9.png)

# 3. 文字起こしを元に、用語辞書をつくる

先ほどの文字起こしテキストを元に、用語辞書をつくります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348593/9e008d9b-db9a-e4e6-4ad4-3419b0a36ca4.png)

バチコリ抽出してくれています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348593/209762dd-65f8-92d8-6eed-68486761b4c9.png)

追加のおねだりもしちゃいましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348593/779980c6-8b94-4528-660f-549614809388.png)

# 4. GPT4vに　キャプチャごとの解説してもらう

要約を読みつつ、内容は動画をちゃんと聞いていくことになります。
途中の難しいキャプチャは、ChatGPTにキャプチャをコピーして「説明して」とだけお願いします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348593/41c792f0-e6a7-2fb2-a6b1-b13bb816c602.png)

すると、高解像度の回答を返してくれます。ﾊﾞｧｶ便利ぃです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348593/fc7a2f24-4f82-bd80-018b-2676322e97ef.png)

GPT4vは日本語苦手なので、図示は英語の方がむしろありがたいまであります。

# 5.さいごに　

さいごに必要なのは、時間とやる気です。
どれだけ要約がAIツールで便利になろうと元文書を読むことは欠かさずに。たくさん読みます。

たくさん読むことで、読むスピードや理解力が徐々に上がってくるかと思います。
みんなもAIと一緒に英語の動画をたくさん読んでね👍 そして、要約して教えてくれ！！

https://www.youtube.com/@LangChain

https://www.youtube.com/@LlamaIndex

https://www.youtube.com/@OpenAI/videos

https://www.youtube.com/@MetaDevelopers/videos

https://www.youtube.com/@MicrosoftDeveloper/videos

https://www.youtube.com/@GoogleDevelopers/videos
Links

## 計算機
- [計算機システム | 工業大学生ももやまのうさぎ塾](https://www.momoyama-usagi.com/entry/category/%e6%83%85%e5%a0%b1/keishisu/)
- [プロセスとスレッドの違いとは？超わかりやすく解説！【図解とプログラム付き】 | Webpia](https://webpia.jp/thread_process/)

## SSH
- [GitHub - Generating a new SSH key and adding it to the ssh-agent](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent)
- [Qiita - サーバが多くSSH鍵の管理が大変です。どんな工夫をしていますか？](https://qiita.com/suin/items/e4a976d076134f755a9a)
- [SSH config file for OpenSSH client](https://www.ssh.com/academy/ssh/config#configuring-public-key-authentication)

## Computer Vision
- [CVMLエキスパートガイド | ホーム – コンピュータビジョン中級者を支援する「探求型の学習サイト」](https://cvml-expertguide.net/)
- [Self-Supervised Learning from Images with a Joint-Embedding Predictive Architecture](https://arxiv.org/abs/2301.08243)
- [The first AI model based on Yann LeCun’s vision for more human-like AI](https://ai.meta.com/blog/yann-lecun-ai-model-i-jepa/)
- [V-JEPA: The next step toward advanced machine intelligence](https://ai.meta.com/blog/v-jepa-yann-lecun-ai-model-video-joint-embedding-predictive-architecture/)

## Others
- [PowerCert Animated Videos - YouTube](https://www.youtube.com/@PowerCertAnimatedVideos)
- [論文の読み方 / How to survey - Speaker Deck](https://speakerdeck.com/kaityo256/how-to-survey)
- [CQRS実践入門 [ドメイン駆動設計]](https://little-hands.hatenablog.com/entry/2019/12/02/cqrs)
- [AWSでCQRS Event Sourcing するにはどうすればいいのか - Speaker Deck
](https://speakerdeck.com/j5ik2o/awstecqrs-event-sourcing-surunihatousurehaiifalseka)
- [PostgreSQL のトランザクション &amp; MVCC &amp; スナップショットの仕組み
](https://www.nminoru.jp/~nminoru/postgresql/pg-transaction-mvcc-snapshot.html)
- [MVCC による PostgreSQL の並列性 | Heroku Dev Center
](https://devcenter.heroku.com/ja/articles/postgresql-concurrency)

## Docker
```sh
sudo rm -rf /var/run/docker
sudo rm /var/run/docker.*
sudo rm -rf ~/Library/Containers/com.docker.docker
```

## Test
- https://abseil.io/resources/swe-book
- https://zenn.dev/yudai64/articles/c1f7fba3c93536

### References
- https://github.com/docker/for-mac/issues/6499#issuecomment-1263773762
- https://stackoverflow.com/questions/41508511/docker-commands-hanging-with-no-response
最速でNixをOSパッケージマネジャとして使う（2024/03/04時点）

新しくMacBook Proを購入したついでに、Homebrewから良いと噂のNixへパッケージマネジャを変更した時に情報が錯綜していて困ったので備忘録。

**NOTE: Nixは現在も頻繁に開発されており、情報の新陳代謝が早く、適切な手続きが大きく変化する可能性がある。この情報は2024/03/04時点のものである。**

## 手順

### インストール

[nix-installer](https://github.com/DeterminateSystems/nix-installer)を使う。

```bash
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install
```

シェルを再起動して、うまくインストールできてるか確認

```bash
nix --version
# nix (Nix) 2.20.3
```

### 使い方

知人に教えて貰った早見表を貼り付けておく。

```bash
# パッケージの検索 https://search.nixos.org/packages で調べても良い
nix search nixpkgs <パッケージ名>

# インストール
nix profile install nixpkgs#<パッケージ名>

# 現環境からパッケージ削除(アンインストール相当)
nix profile remove <パッケージ名>

# 未使用パッケージをディスクから削除
nix store gc

# アップグレード
nix profile upgrade <パッケージ名>

# 全パッケージアップグレード
nix profile upgrade '.*'

# パッケージ一覧
nix profile list
```

## Next Reading

* **Zero to Nix: https://zero-to-nix.com/**
Xcode15.3 Swift5.10 個人的まとめ

# Swift5.10
https://www.swift.org/blog/swift-5.10-released/

## リリースノート
https://github.com/apple/swift/blob/release/5.10/CHANGELOG.md

再確認して直します


# Xcode15.3RC リリースノート
https://developer.apple.com/documentation/xcode-release-notes/xcode-15_3-release-notes~

## ビルドシステム
>スキームは、Swift パッケージを含む、ワークスペース内のすべてのターゲットに対して構築されるアーキテクチャのセットを制御する、新しい「アーキテクチャの上書き」ビルド オプションを提供します。推奨されるオプション (および新しいスキームのデフォルト) は、「実行先の一致」です。詳細については、Xcode のスキーム ビルド オプション シートの「アーキテクチャをオーバーライド」設定の横にある情報アイコンをクリックすると表示されます。

理解できていないので要調査

## プレビューのスクショを出力できるようになった
[エディター] > [キャンバス] > [プレビュー スクリーンショットのエクスポート]

## global変数　static変数 
グローバル変数にwarningが出るようになります
```
var mutableGlobal = 1

final class NonsendableType {
    init() {}
}
 
struct S {
    static let immutableNonsendable = NonsendableType()
}
```
回避方法
```
nonisolated(unsafe) var global: String

final class NonsendableType: Sendable {
    init() {}
}
 
struct S {
    // letかつSendableに準拠していること
    static let immutableNonsendable = NonsendableType()
}
```

## デフォルトで同じActorの関数を呼び出せる
```
   @MainActor
   func requiresMainActor() -> Int { ... }

   // クラスの初期値として使える
   class C {
     @MainActor
     var x: Int = requiresMainActor()
   }

 　　　　// 関数のデフォルト引数として使える
   @MainActor func defaultArg(value: Int = requiresMainActor()) { ... }
```


## Thread Performance Checker
> スレッド パフォーマンス チェッカーは、「既知のハング」と呼ばれるランタイムの問題の新しいカテゴリを生成します。これは、コード内のハングがアプリのユーザーに影響を与えることがわかっている場所を開発者に示します。

要調査
【YOLOv8】物体の長さを取得する方法

# YOLOv8で物体の長さを取得する方法

結論から言うと、画像中に既知の長さの物体があれば可能。
※ 今回はある程度垂直に撮影され、比較する物体の奥行き方向が０の場合を想定している。

### １. 推論結果からBBoxの長さを取得する

下記のコードで推論したバウンディングボックスの座標を取得できる。

```
results[0].cpu().boxes.numpy().boxes
```
### 2. 既知の物体の比の計算
既知の長さの物体と長さがわからない物体のバウンディングボックスの大きさを比較する。
仮に既知の長さ物体を縦５cm、横2センチ、BBoxの縦をy1,横をx1とすると
```math
5cm : 3cm = y1 : x1
```
となる。
y1,y2については画像ごとに結果が変わり、上記のコードで取得できる。
詳しくは公式の情報を確認のこと。
これで現実世界の長さを画像世界の長さに置き換えることができた。
### 3. 目的の物体の長さの計算
あとは、２で得られた情報を元に目的の物体の長さを比で計算する。
Livewire: Multiple root elements detected.

Livewireで開発中、wire:clickを設定したボタンが全く反応しない。
開発者ツールを見ても、普通だったらEVENTが付くはずが付かない。
(Firefoxの開発者ツールだと、「livewire:ほにゃらあ」を設定すると、JSのEVENTが設定される）

開発者ツールのコンソールを除くと

```
Livewire: Multiple root elements detected. This is not supported. 
See docs for more information 
https://laravel-livewire.com/docs/2.x/troubleshooting#root-element-issues
```
と出ていた。
　複数のroot要素？
　それはサポートされていません？

なんとなくこれ系のエラーはlivewireに担当させるblade側のHTMLのしでかしだな・・と
(livewireに担当させるblade = render()内のreturn view()で指定したblade)
思ったので、HTMLタグをキレイにタブでインデントしていったら
粗く解説すると、以下の通りに
```
<div>
  <div>
    <div>
      aaaa
      <input type="text" wire:model="data1">
    </div>
  <div>
</div>
  <button wire:click="abc()">Add</button>
</div>
```
という感じでルートDIVから外れていた・・

ちなみにLivewireのBladeでは必ずコンテンツすべてを``<div></div>``で囲まないといけなくて
囲った範囲がLivewireで動的に扱える範囲って認識をする。

ので、そこから外れると、
「おい兄弟、その書き方だと俺達の範囲から外れるから動かないぜ」
というわけなんだな

たしかに確かに・・

なんかwire:clickとかが反応しなかったらbladeHTMLをキレイにしてみましょう。
CoE Starter Kit更新手順・注意点

CoE Starter Kitの更新は定期的にやらなければいけないため、毎回少し手間がかかります。
その際に注意が必要な点をまとめました。
こちらは同じ環境にすでにCoE Starter Kitを入れたことがある場合の更新の手順とその時の注意点となります。

最新のアップデートについては
https://learn.microsoft.com/ja-jp/power-platform/guidance/coe/after-setup#subscribe-to-coe-starter-kit-releases

# 0. Creator Kitインポート
2023年アップデートしてない方はCreator Kitのインポートからお願いいたします。
（コードコンポーネントオンにするのが注意点）
https://learn.microsoft.com/ja-jp/power-platform/guidance/creator-kit/setup


# 1. 最新のソリューションダウンロード
アップグレードに必要な最新バージョンをダウンロードします。
以下のリンクから最新のバージョンをダウンロードします。
https://aka.ms/CoeStarterKitDownload

# 2. アンマネージドレイヤー削除
ソリューションレイヤーにアンマネージドレイヤーがあるとアップグレードできません。
アップグレード前にアンマネージドレイヤーの削除を行う必要があります。

CoE Admin Command Centerアプリで確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/1e8d4581-957d-2ab6-4ea3-a6ba545ad9ac.png)

「CoE Flows」を選択します。
アンマネージド レイヤーがあることを示すレイヤーアイコンが表示されているかどうかを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/0ab0f4cc-d2ac-d31c-4cff-b12fb90777db.png)

レイヤー アイコンを選択して、フローのソリューション レイヤー ページに移動し、アンマネージドレイヤーを削除します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/0e23859c-ac38-1884-87c8-575b91807b06.png)



::: note

 バージョンアップにより変更がリセットされる（厳密には複製したフローやアプリを削除してからバージョンアップする必要がある）ため、カスタマイズした場合はバージョンアップのたびにカスタマイズの必要があります。
:::
::: note
※ テーブルとモデル駆動型アプリはマージがサポートされています。
独自のアンマネージドソリューションを作成し、そこで変更を加えることにより、簡単に拡張できます。 
:::



# 3. ソリューションのインポート

ダウンロードしたソリューションを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/e2dc3c00-168c-a271-72aa-ff93b140da76.png)

zipファイルの中の「Core Component」 をインストールします。
同様に、必要に応じて「Gavement Compornent」「Nurture Compornent」「Audit Component」「InnovationBacklog  Compornent」「ALMAccelerator  Compornent」などをインストールします。
ソリューションインポートの手順は以下を参照ください。

https://qiita.com/skuramoto/items/a425e128cad2a827a5dc#%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88

# 4. CoE Setup and Upgrade Wizardアプリで設定

CoE Setup and Upgrade Wizardアプリで初期設定を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/9313c954-e928-a9be-03b5-a61a9800ae62.png)

手順に沿って新しい環境変数、接続参照などを設定していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/8923fbee-75ef-b75d-7220-339b327919a6.png)


# 注意
手順通りアップデートしても、エラーになる可能性があります。
その場合は、開発チームに直接問い合わせたり、過去の問い合わせを確認してください。

https://github.com/microsoft/coe-starter-kit/issues

## issueの調べ方
エラーログのダウンロードを行い、キーになる値を取ってきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/f1d57d8d-37aa-3f7e-4113-752443a13be2.png)

GitHubのフィルターで入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/9457ed30-73de-07e9-405c-0dace3324437.png)
このように情報を絞り込んでほしい質問とその回答の情報を得ることができました。

https://github.com/microsoft/coe-starter-kit/issues/7419
sql subquery combine

```sq
select q.da, (q.e + m.avg + w.op)/3 AS comL
from
(
SELECT da, (s + d - 50)/2 AS e
FROM index where code = 'M Index'
ORDER BY DA DESC
)as q,
(
select 
t.da
,t.code
,(t.v - 50 + t.d - 50 + z.x)/3 as avg
FROM index as t, z as z
WHERE t.code = z.code and t.da = z.da
and t.code = 'W'
order by t.da desc
)as m,
(
select da, op from e as t where code = 'T Index' order by da desc
)as w
where q.da = m.da and m.da = w.da
order by q.da asc;
```
入れ子になったJSONからJavaオブジェクトにデシリアライズしたい

## やりたいこと

ObjectMapperでJSONが入れ子構造になっているJSONを
Javaオブジェクトにデシリアライズしたい。

対象JSONは、
・dates, page, results, total_pages, total_resultsが項目として存在。
・dates内に2つ項目が含まれている。
・results内が配列で、かつ複数項目が含まれている。

## エラーの原因と解決策
JavaのBeansクラスが正しく構成されていなかった。
JSONの入れ子構造に合わせて、Beansを構成しなければいけない。

```java:MainController.java
        ObjectMapper mapper = new ObjectMapper();
        try {
            Json list = mapper.readValue(json, Json.class);
        } catch (JsonParseException e) {
            e.printStackTrace();
        } catch (JsonMappingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
```


Json.classが最上階層のBeanクラス。
Dates, Resultsがさらに入れ子で入っているため、
型はそれぞれDates, Resultsになっている。
さらに、ResultsはJSONで配列になっているため、List<Results>になる。



```java:Json.class

public class Json {

    private Dates dates;
    private String page;
    private List<Results> results;
    private String total_pages;
    private String total_results;
    //以下ゲッターとセッターを実装。
```

```Java:Dates.class
package com.example.movie.dto;

public class Dates.java {
    private String maximum;
    private String minimum;
    //以下ゲッターとセッターを実装。
```
```java:Results.java
public class Results {
    private boolean adult;
    private int[] genre_ids;
    private int id;
    private String language;
    private String title;
    private String overview;
    //以下ゲッターとセッターを実装。
```
フィールド作成時にプロファイルではなく権限セットでフィールドにフィールドレベルのセキュリティを設定する (ベータ)



トレイルヘッドでもこの設定が影響している可能性がある。

# FLSの設定でプロファイルでなくて、権限セットが表示されている

+ [Modify Your Data Model: not showing all field level security options](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ZBLox)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ce1219f4-3625-a58c-8a0c-813ec66e155f.png)


:::note
Do you have the following settings enabled?
If in doubt, try a new playground

Set Field-Level Security for a Field on Permission Sets Instead of Profiles During Field Creation (Beta)
https://help.salesforce.com/s/articleView?id=release-notes.rn_forcecom_fls_permsets.htm&release=240&type=5

Please check if this setting is disabled.

SETUP -->  User Management Settings

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f5f8c4a7-0aa6-d52c-186c-dd2485321655.png)
:::

# 予告？

+ [why is my trailhead playground suddenly denying permission to object fields?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007CJ3pW)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c2a65d3f-acec-7c62-47b8-130bbc3ff452.png)

:::note
Please just ignore it or turn it off. It is info only. It is also a reminder that we should add permissions to permission sets, not the profile. In the future permissions will move out from the profile.

無視するかオフにしてください。それは情報のみです。これは、プロファイルではなく権限セットに権限を追加する必要があることを思い出させるものでもあります。将来的には、権限はプロファイルから移動される予定です。
:::
【flutter】モーダルを表示の自分なりの手順とは？

こんにちは！
今回は、flutterでモーダルの表示の仕方について、紹介したいと思います。
今回も最後まで、読んでいただけたら嬉しいです！

## 1,まず、モーダルとは？
### ・ 確認や警告メッセージの表示
ユーザーが重要なアクションを実行する前に、確認メッセージや警告メッセージを表示して注意を促します。

### ・ 情報の表示
ユーザーに対して重要な情報を提供するために使用されます。例えば、アプリの新機能や更新情報を表示するために使用されます。

### ・ フォームの入力
ユーザーに追加の情報やオプションを提供するために使用されます。例えば、ログインフォームや設定ダイアログなどがあります。

## 2,モーダル表示

### showDialog
showDialogメソッドには、さまざまなオプションパラメータがあります。例えば、barrierDismissibleやuseRootNavigatorなどのパラメータを使用して、ダイアログの外観や動作をカスタマイズすることができます。
```php
showDialog(
  context: context,
  builder: (BuildContext context) {
    return AlertDialog(
      // ダイアログ内に表示するウィジェットを構築する
    );
  },
);

```

## 3,実装例
```php
SizedBox(
                child: ElevatedButton(
              onPressed: () {
                showDialog(
                  context: context,
                  builder: (BuildContext context) {
                    return AlertDialog(
                      backgroundColor: Colors.white,
                      title: const Text('モーダルを表示'),
                      content: const Text('モーダルを表示できていますか?'),
                      actions: [
                        TextButton(
                          onPressed: () {
                            Navigator.of(context).pop(); // ダイアログを閉じる
                          },
                          child: const Text('Cancel'),
                        ),
                        TextButton(
                          onPressed: () {
                            // ここに確認後の処理を追加
                            Navigator.of(context).pop(); // ダイアログを閉じる
                          },
                          child: const Text('OK'),
                        ),
                      ],
                    );
                  },
                );
              },
              child: const SizedBox(
                height: 50,
                width: 180,
                child: Center(
                    child: Text(
                  "モーダル紹介",
                  style: TextStyle(fontSize: 16),
                )),
              ),
            )
        )
```

![Screenshot_1709515667.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524127/a42252b2-8ec0-972f-b78d-3c6dc32f4914.png)


## 終わりに
今回は以上になります！
今回も最後まで読んでいただき、ありがとうございました！
では、また次の記事で〜！