OmniAICreator/Qiita-1.07M huggingface dataset:
最新のRubyをインストールする

## はじめに

長年、Ruby2.6を使っていたが、最新版のRubyをインストールする必要性がでてきました。ついでにrbenvも最新版にしました。

## 環境

Ubuntu20.4

## rbenvのバージョンアップ

現状のrbenvのバージョンを確認します。

```
$rbenv -v
rbenv 1.2.0-87-ge8b7a27
```

rbenvが入っているディレクトリ（ルート）を調べます。

```
$rbenv root
```

rbenvのルートが分かったら、そこに移動してGitから最新版を取得します。

```
$cd "$(rbenv root)"
$git pull
```

rbenvのバージョンが最新になったことを確認します。

```
$rbenv -v
rbenv 1.2.0-91-gc3ba994
```

ついでに、ruby-buildのルートに移動して、ruby-buildも最新版を取得します。

```
$cd "$(rbenv root)"/plugins/ruby-build
$git pull
```

ruby-buildが最新版になったかどうかを確認するコマンドはありません。ruby-buildルート配下のなんらかのファイルの更新日付が変わっていたら、最新版になっています。

## Rubyのインストール

rbenvを使ってインストールができるRubyのバージョンを確認します。

```
$rbenv install -l
$rbenv install --list-all
```

Rubyをインストールします。（結構長いです。自分の環境で５分程かかりました）

```
$rbenv install -v 3.3.0
```

インストールされている、すべてのRubyのバージョンを表示させて、インストールされたことを確認します。

```
$rbenv versions
* 2.6.0 (set by /home/vagrant/.rbenv/version)
  3.3.0
```

Ruby3.3.0だけを動作させたいディレクトリに移動して、このディレクトリ内のプロジェクトのみ、Ruby3.3.0の利用に固定させます。

```
$rbenv local 3.3.0
```

Ruby3.3.0が動作するようになりました。

```
$ruby -v
ruby 3.3.0
```

別のディレクトリに移動すると、Ruby2.6に戻ります。グローバルではRuby2.6を指定しているためです。

```
$cd ..
$ruby -v
ruby 2.6.0p0
```

この通り、グローバル環境はRuby2.6のままになっています。

```
$rbenv versions
* 2.6.0 (set by /home/vagrant/.rbenv/version)
  3.3.0
```

## 参考記事

https://qiita.com/pyon_kiti_jp/items/fc8ca75737106cee618f
YouTubeのコメントでスパム判定を貫通させるデカ文字を考える


YouTubeでは以下のようなコメントは表示されない。

```
🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑
🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑
🌑🌑🌑🌑🌑🌕🌑🌑🌑🌑🌑🌑🌑
🌑🌑🌑🌑🌑🌕🌕🌑🌑🌑🌑🌑🌑
🌑🌑🌑🌑🌑🌓🌕🌑🌑🌑🌑🌑🌑
🌑🌑🌑🌑🌑🌕🌘🌑🌑🌑🌑🌑🌑
🌑🌑🌑🌑🌕🌕🌑🌑🌑🌑🌑🌑🌑
🌑🌑🌑🌑🌕🌑🌑🌑🌑🌑🌑🌑🌑
🌑🌑🌑🌕🌕🌕🌕🌑🌑🌑🌑🌑🌑
🌑🌑🌒🌕🌕🌑🌕🌕🌑🌑🌑🌑🌑
🌑🌑🌕🌘🌑🌑🌑🌖🌑🌑🌑🌑🌑
🌑🌕🌕🌑🌑🌑🌒🌖🌑🌑🌑🌑🌕
🌑🌕🌑🌑🌑🌑🌒🌖🌑🌑🌑🌕🌗
🌕🌕🌑🌑🌑🌑🌒🌕🌑🌑🌕🌕🌑
🌕🌘🌑🌑🌑🌑🌑🌕🌕🌕🌕🌑🌑
🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑
🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑
🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑
🌑🌕🌘🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑
🌑🌒🌕🌑🌑🌑🌕🌕🌕🌕🌕🌕🌑
🌑🌓🌕🌑🌑🌑🌑🌑🌒🌕🌕🌑🌑
🌑🌔🌘🌑🌑🌑🌑🌕🌕🌑🌑🌑🌑
🌑🌕🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑
🌒🌗🌑🌕🌑🌑🌑🌑🌑🌑🌑🌑🌑
🌓🌘🌑🌗🌑🌑🌑🌑🌑🌑🌑🌑🌑
🌓🌘🌕🌑🌑🌗🌑🌑🌑🌑🌑🌑🌑
🌓🌕🌕🌑🌑🌕🌑🌑🌑🌑🌑🌑🌑
🌑🌕🌘🌑🌑🌒🌕🌕🌕🌕🌕🌕🌑
🌑🌕🌗🌑🌑🌑🌑🌕🌕🌕🌕🌕🌑
🌑🌑🌗🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑
🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑
🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑
🌑🌑🌑🌑🌑🌑🌕🌕🌑🌑🌑🌑🌑
🌑🌑🌑🌑🌕🌕🌕🌕🌗🌑🌑🌑🌑
🌑🌑🌑🌑🌕🌑🌑🌕🌕🌕🌕🌕🌑
🌑🌑🌑🌑🌕🌕🌕🌕🌑🌑🌑🌕🌑
🌑🌑🌕🌕🌕🌕🌑🌑🌑🌑🌑🌕🌘
🌑🌑🌕🌕🌑🌒🌕🌑🌕🌕🌕🌕🌑
🌑🌑🌑🌑🌑🌑🌕🌑🌑🌕🌑🌑🌑
🌑🌑🌑🌑🌑🌑🌓🌕🌑🌑🌑🌑🌑
🌑🌑🌑🌑🌑🌑🌑🌕🌑🌑🌑🌑🌑
🌑🌑🌑🌑🌑🌑🌑🌕🌑🌑🌑🌑🌑
🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑
🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑
🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌕🌑
🌑🌑🌑🌑🌑🌑🌑🌑🌑🌒🌕🌕🌕
🌑🌑🌑🌕🌕🌘🌑🌒🌕🌓🌑🌑🌕
🌕🌕🌕🌕🌕🌑🌑🌒🌖🌑🌕🌕🌕
🌑🌑🌕🌕🌑🌑🌑🌑🌕🌑🌑🌑🌑
🌑🌓🌕🌑🌑🌑🌑🌑🌕🌑🌑🌑🌑
🌑🌕🌑🌑🌑🌑🌑🌑🌕🌗🌑🌑🌑
🌓🌗🌑🌑🌑🌑🌑🌑🌕🌕🌑🌑🌑
🌕🌑🌑🌑🌑🌑🌑🌑🌗🌓🌕🌑🌑
🌔🌑🌑🌑🌑🌑🌑🌒🌗🌑🌕🌕🌑
🌔🌑🌑🌑🌑🌑🌑🌕🌗🌑🌑🌑🌑
🌕🌕🌑🌑🌑🌑🌒🌕🌑🌑🌑🌑🌑
🌑🌕🌕🌕🌕🌕🌕🌘🌑🌑🌑🌑🌑
🌑🌑🌕🌕🌕🌕🌑🌑🌑🌑🌑🌑🌑
🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑
🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑
🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑
```

記号が多すぎる。内容がないよう。みたいなコメントはスパム判定されるようだ。

という訳でこれはどうかと試してみた。

```
そのころわたくしはモリーオ
市の博物局に勤めて居りまし
た十八等官・でしたから役所
のなかでも・・ずうっと下の
方でしたし・・俸給もほんの
わずかでし・・たが受持ちが
標本の採・・集や整理で生れ
付き好き・なことでしたから
わたく・・・・しは毎日ずい
ぶん・・・愉・・快にはたら
きま・・した殊・にそのころ
モ・・リーオ・・市では競・
馬・場を植物・・園に拵・・
・・え直すと・・いう・・の
・・でその景色・・・・のい
いまわりにアカシヤを植え込
んだ広い地面が切符売場や信
号所の建物のついたままわた
く・・しどもの役所の方へま
わ・・って来・・・・・・た
も・・のですから・・・わた
く・・しはすぐ・・宿直とい
う・名前で月賦で買った小さ
・・な・蓄音器と二十枚ばか
・・り・のレコードをもって
・・・その・番小屋にひとり
・・・住む・ことになりまし
た・・わた・・・・・・・く
し・・はそこの・・・・・馬
を置・く場所に板で小さなし
きいをつけて一疋の山羊を飼
いました毎朝その乳をしぼっ
てつめたいパ・・ンをひたし
てたべそ・・・・・れから黒
い革のか・ばん・・・・・へ
すこしの・・・・書類や・雑
誌を・・・・入れ靴もき・・
れい・・に・・み・・・・が
き並木のポプ・ラの・影法師
を大股にわた・・って市の役
所へ出て行くの・でしたあの
イーハトーヴォ・のすきとお
った風夏でも底に冷たさをも
つ青いそらうつくしい森で飾
られたモリーオ市郊外の・ぎ
らぎらひかる草の波・・・・
またそ・・・の・・・なか・
・・・・・でい・・っ・・・
しょ・・になった・たくさん
の・・ひとたちフ・ァゼーロ
と・ロザーロ羊飼・・のミー
・・ロや顔の赤い・・こども
・たち地主のテー・・・モ山
・猫博士のボー・・ガ・・ン
・ト・デストゥ・・パーゴな
・・どいまこ・・の暗い巨き
な・・・・・・・石の建物の
なか・・・・で考えていると
みんなむかし風のなつかしい
青い幻燈のように思われます
ではわたくしはいつかの小さ
```

## 結果

![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/3ea15be2-fa32-8f79-cc0f-c55c1a55de35.png)

OK。別垢で確認したところ表示された。

## 備考

背景の文字列はフォント幅の都合で全角文字を推奨する。
Android SDKが年2回更新されるようになる

2024 年の TheAndroidShow で発表があった、Android SDK の更新スケジュールの変更について、わかっていることのまとめです。

https://android-developers.googleblog.com/2024/10/android-sdk-release-update.html?m=1


- Android SDK のメジャーアップデートが 2Q にリリースされる
  - Android 16 が 2025/4~6 にリリースされる
  - 新 OS でのテストがこれまでより早くする必要が出てくる
- メジャーアップデートとは別にマイナーアップデートが 4Q にリリースされる
  - マイナーアップデートでは新しい API の追加があるが、動作の変更はない
  - マイナーアップデートでは API レベルの値は変わらないが、メジャーと切り替えるためのマイナー API レベルの値が新しく追加される

![image2 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/747f0ebc-7ff9-70ad-33f8-b96f283e962b.png)

- 毎年の targetSdk の要件は変わらない予定
Visual Studioエラー対処方法「Your project file doesn’t list ‘win’ as a ‘RuntimeIdentifier’」


このエラーは、Visual Studioがターゲットプラットフォームとして指定されたRuntimeIdentifier（実行対象）を認識できないことが原因です。この場合、RuntimeIdentifierに「win」が設定されていないため、プロジェクトが正しくビルドされず、WPFアプリケーションの実行に必要な依存関係が読み込まれません。以下の対処方法を順に試して、エラーを解消してください。

---

### 環境

- Visual Studio 2022
- .NET Framework 4.7.2
- WPF

---

### 対処方法

主な対処方法を4つ紹介します。1つのエラーを解消しても他のエラーが発生することがあるため、必要に応じてこれらの対処方法を組み合わせて実行してください。

1. **`bin`および`obj`フォルダの削除**

   `bin`と`obj`フォルダには、ビルド時に生成される一時的なファイルが含まれています。これらのフォルダを削除することで、ビルドプロセスに関するキャッシュデータがクリアされ、エラーの解消に繋がることがあります。この操作を行うと、ビルドプロセスが新しいファイルを生成するため、エラーや依存関係の問題が解決されることがよくあります。削除手順は次の通りです：

   - プロジェクトフォルダ内で`bin`と`obj`フォルダを探し、削除します。
   - 再度ビルドを行い、エラーが解決したか確認してください。

2. **[.vs]フォルダの削除**

   Visual Studioの`.vs`フォルダには、ユーザーの設定やキャッシュ情報が保存されています。このフォルダを削除することで、Visual Studioの設定が初期化されるため、環境に起因するエラーが解消される可能性があります。削除後、プロジェクトを再度開き、エラーが再現するか確認します。

   - プロジェクトのルートフォルダで`.vs`フォルダを見つけ、削除してください。
   - Visual Studioを再起動し、プロジェクトを開き直します。

3. **`dotnet restore`の実行**

   `dotnet restore`コマンドは、プロジェクトが依存するNuGetパッケージを再インストールするために使用されます。これにより、依存関係の不足や破損が原因のエラーが解消されることが期待されます。再インストールすることで、プロジェクトに必要なパッケージが最新状態になり、依存関係の整合性が保たれます。

   - コマンドラインまたはターミナルを開き、プロジェクトディレクトリで次のコマンドを実行します：
     ```bash
     dotnet restore
     ```
   - 依存関係のダウンロードと再インストールが完了したら、プロジェクトを再ビルドします。

4. **NuGetパッケージのアンインストールと再インストール**

   特定のパッケージが破損していたり、互換性がない場合、エラーの原因となることがあります。パッケージを一度アンインストールしてから再インストールすることで、破損したパッケージが再構築され、プロジェクトが正常にビルドされる可能性が高まります。

   - NuGetパッケージマネージャーから各パッケージを個別にアンインストールします。
   - 再度、必要なパッケージをインストールし直してください。
   - 再ビルドして、エラーが解消されるか確認します。

---

### 補足

これらの手順を組み合わせて実行することで、ビルドキャッシュやパッケージの依存関係に関連する問題が解消されることが多くあります。特に、WPFアプリケーションの開発環境でこのエラーが発生する場合は、これらの手順が有効です。
なぜAドライブやBドライブが無くてCドライブ、Dドライブなのか

# Aドライブ
５年くらい前、毎日毎週異なるお客様先のサーバールームや情シスに伺い、色々な対応をしていました。
その頃、色々な情シスの方と話す機会があり、業務以外の話を聞くこともありました。

もうどこで聞いたのか忘れてしまったのですが、
それが表題の、

#### なぜAドライブやBドライブが無くてCドライブ、Dドライブなのか

です。

ふと思い出したので、調べたことを含めてまとめます。

# 「フロッピーなんだよ」

当時の思い出

古のサーバー、古のサーバールームの中。

夏でもダウンジャケット持参推奨と、引継ぎメモには書かれていたとおり、
凍えるような寒さでサーバーにコマンドを打ち込む手先がふるえます。

入室前には、テロリストを疑われているかのような、厳重なチェックがなされました。スマホどころか水すら持ち込めません。

そんな、ロシア兵の塹壕とも思われるようなあるビルの一室で、こんな言葉を聞きました。

#### 「Bドラはフロッピーなんだよ」

# 調べてみる

>OS用がAドライブ。ソフトやデータ保存用のフロッピーディスクはBドライブで、メインドライブが「A:」、サブドライブが「B:」という、至極当たり前の名称だった。

https://koneta.nifty.com/koneta_detail/170112000203_1.htm

# フロッピー？

https://ja.wikipedia.org/wiki/%E3%83%95%E3%83%AD%E3%83%83%E3%83%94%E3%83%BC%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF

# 結論

コンピュータ初期の名残。
当時OSがAドライブ、フロッピーディスクがBドライブだった。
結果としてディスクはC、D、、、となっている。

//コメントを頂いたので追記
AもBもフロッピーで AにOSを入れて、Bに持ち出し用を入れていた。
pythonでwatson discoveryのプロジェクトを作成

```python
# %%
from ibm_watson import DiscoveryV2
from ibm_cloud_sdk_core.authenticators import IAMAuthenticator

# %%
apikey='APIKEY'
version='VERSION'
service_url='SERVICE_URL'
authenticator = IAMAuthenticator(apikey=apikey)
discovery = DiscoveryV2(version=version, authenticator=authenticator)
discovery.set_service_url(service_url=service_url)

# %%
name = 'NAME'
type = 'TYPE'
response = discovery.create_project(name=name, type=type).get_result()
print(response)
```
【モチベーション】なぜブログを書き続けるのか

# はじめに
本日は、「なぜブログを書き続けるのか？」というテーマでお話しします。私は10月6日からこのQiitaを毎日更新しており、別途noteでもアメリカ生活に関するブログを掲載しています。

この記事をご覧いただいている皆さんの中には、「知識を共有したい」とブログを続けている方も多いと思います。
一方で、ブログを書いていることに対して「なんで続けているの？」と尋ねられることも少なくありません。

今回は、私がブログを書き続けている理由について、特にQiitaで毎日投稿する意義をお伝えできればと思います。
少しでも、ブログを続けるヒントになれば幸いです。

# なぜブログを続けているのか
まずは、私がブログを続ける理由を以下にまとめます。
* 勉強の達成感がわく
* 言語化能力が向上する
* 勉強する際にすべての物事をアウトプットしようという意識になり、理解度が加速する
* 有識者の方からのフィードバックが得られる
* 本を読む習慣につながる
* 誰かの役に立てる

## 勉強の達成感がわく
私は独学でソフトウェアエンジニアを目指しており、わからないことがあっても相談できるメンターがいません。
また、アメリカで周りに友達や同じ志を持っている人がいないので、モチベーションを保つのが難しい環境にいます。
そんな中、日々の学びをブログに記録することは、勉強の「達成感」を得るための重要な方法になっています。
しんどいときも記録を見ると、「頑張った証」が残っているのを感じられ、続ける励みになっています。

## 言語化能力が向上する
ブログを書くことで、自分の学びを言語化する力が養われます。特に、以下のプロセスが役立っています：

* 疑問の発見
「何がわからないか？」を明確にする
* 調査と解決
QiitaやChatgptで調べ、理解を深める
* 理解の整理
必要な情報だけを取り入れ、記事として構成する

## 勉強する際にすべての物事をアウトプットしようという意識になり、理解度が加速する
私は学んだ内容を他の人に説明できるかを基準に、理解度を測っています。
例えば、会議中に積極的に質問することで内容が頭に入りやすくなるのと同様に、アウトプットの意識が理解度を高めてくれます。

私はアメリカの日常生活もnoteに書いており、身近なことも「アウトプットネタ」として捉えるようになりました。
例えば、運転免許取得初日にスピード違反の罰金を払った経験も、ブログのネタとして活かしていますｗ

https://note.com/tairog/n/n2f13fe92de57

## 有識者の方からのフィードバックが得られる
ブログをやってる暇があったら勉強しろよ！と思われる方がいるかもしれませんが、とてもとてもありがたいことにQiitaは有識者の方がコメントして「これはこう考えたほうがいいよ」的な感じでフィードバックをもらえるのです！
独学だとなかなか得られない気づきを頂けるので、単に勉強時間を増やしても得られない可能性が高い知識で決して無駄ではないと思います。
実は現在アメリカの大学に語学を学ぶために行っているのですが、平日の勉強時間2時間取れたらいいほうでほんとにブログを書いて終わるみたいな日が多いのですが、とてもありがたいことにコメントを頂けているのでその疑問を持っている分野の理解度が上がり効率的に勉強できています。

すぐにはコメントを返すことはできなので心苦しいのですが、この記事を見ていただいている有識者の方も毎回でなくていいので「現場だとこんな使われ勝たされているよ」的なコメントを頂けると1つ1つのコードに意味を持ち始めて理解度が高まるのでとても助かります。

## 本を読む習慣につながる
私はもともと文章を書くのが好きでしたが、読むのは苦手でした。
ブログを書くようになって活字への抵抗が減り、技術書も前よりスムーズに読めるようになったため、新しい知識を効率的に得られています。

## 誰かの役に立てる
エンジニアにもなっていないペーペーが何を言っているんだ？と思う方もしれません。
それについては、私はまだそこまで深い内容の記事は書けませんが、未経験であるからこそ初歩的な疑問がたくさんあるわけで書くこともたくさんあるのです。

経験のない私でも、未経験からエンジニアを目指している方や独学で頑張っている方も同様の悩みをもつ可能性があるならば記事を書いておくことでマイナスになることはないと思っています。

また、某youtubeでは独学は無理だといわれているので再現性のある独学からのルートを示すという理由でもブログを書いています。
もちろん自分のアウトプットとしてやっていますが、経験のない私だからわかることもあると思うので自分の記事をみてやる気を出してくれる方が一人でもいてくれたらうれしいです。一緒に頑張りましょう！

# まとめ
ブログを書き続けることで得られるものは多く、学びの達成感やモチベーション維持、知識の共有など、さまざまな価値があると感じています。
今後も日々の学びを記録していくので、皆さんの参考になれば幸いです。
【備忘録】Ref関数・Sub関数・GetAtt関数

# Ref関数・Sub関数・GetAtt関数の違いを理解する

まず、Ref関数・Sub関数・GetAtt関数の違いを覚えます。

次にRef関数はそのリソースのキーっぽいものを返す故にリソースから他のリソースが読めることと、

Sub関数は文字列結合に使えることを意識する。

**Ref・Sub関数**を使うと、パラメータやリソースを変数のように参照できます。

[AWS公式 - Ref関数](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html)

[AWS公式 - Sub関数](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html)

作ったリソースから、インスタンスIDとかではなく特定の属性値を参照する場合は、

**GetAtt関数**を使います。

[AWS公式 - GetAtt関数](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-getatt.html)

## Ref関数・Sub関数・GetAtt関数

※ パラメータは別ファイルの JSON 形式で定義し、その他の基本設定は YAML を軸に記述しています。
これにより、パラメータの値を変更する際には JSON ファイルを更新するだけで済み、YAML の可読性やメンテナンス性も確保できます。

### !Ref

パラメーターから取るときは、そのまま値をとる

同ファイルの`Parameters:`,そしてparameters.jsonファイルを作り`Parameters` のValueを設定する事(戻り値)で、下記のように変数として使用する事ができる。

```
Parameters:
  SystemName:
    Type: String
    
```

```parameters.json
{
    "Parameters": [
        {
            "ParameterKey": "SystemName",
            "ParameterValue": "First"
        }
    ]
}
```

### <!Ref 使い方>

`Parameters` を変数として使用する

```jsx
      Tags: 
        - Key: SystemName
          Value: !Ref SystemName
```
- これでTagのValueに`First`が入る


---
### !Sub

- `Parameters`を結合して使いたいときに使用する

```
Parameters:
  SystemName:
    Type: String
  EnvType:
    Type: String
```

```parameters.json
{
    "Parameters": [
        {
            "ParameterKey": "SystemName",
            "ParameterValue": "First"
        },
        {
            "ParameterKey": "EnvType",
            "ParameterValue": "dev"
        }
    ]
}
```

```jsx
Tags: 
	- Key: Name
    Value: !Sub
	    - ${SystemName}-${EnvType}-ec2-bastion
	    - {SystemName: !Ref SystemName, EnvType: !Ref EnvType}
            
- または -

Tags:
  - Key: Name
    Value: !Sub ${SystemName}-${EnvType}-ec2-bastion
```

- これでTagのValueに`First-dev-ec2-bation`が入る


---


### !GetAtt

**!Refと!GetAttの違い**

!Ref VPC などリソース名 => IDが返される


GetAttは○○の中の○○

!GetAtt VPC ⇒ ×
!GetAtt VPC.CiderBlock ⇒ ◎
**!Ref VPC = GetAtt VPC.VpcId**


- `!Ref` はリソースの ID などの基本的な情報を取得するのに使います。
- `!GetAtt` はリソースの特定の属性を取得するために使用し、柔軟にプロパティにアクセスできるため、構成の詳細な指定が必要な場合に便利です。

※GetAtt関数で取れる属性の種類は、リソースの種類によって変わります。
例えば先述のDynamoDBテーブルですが、

`!GetAtt DynamoDBTable.TableName`

とかできそうですがこれはできません。
テーブル名はRef関数で取るのが正解です。

Ref関数で何が返り、GetAttで何が取れるかは各リソースのタイプの公式ページをみなくてはわかりません。
Docker 環境で開発しているWebサービスを新しく構築する方法とチェックシート

# 背景
委託開発中のPHPアプリをDockerを使って開発している。
新機能実装とチーム分けに伴い、
開発しているEC2のURLをチームごとで分けることになった。
- 前回URL => https://hoge.com/demo/
- 今回URL => https://hoge.com/dev/

# 概要
Webサーバーで設定しているURLとアプリで設定しているURLの二つを変更する必要がある。

# Docker 変更項目一覧
app
├─docker
│　└─app
│　　　├─apach2
│　　　│ └─conf-available
│　　　│　　　├─hoge.demo.conf (旧)
│　　　│　　　└hoge.dev.conf (新)
│　　　├─Dockerfile
│　　　└─php.ini
├─docker-compose.yml
└─ 使用しているフレームワークの Config で ULR を指定している個所
　　├─ logs # chmod 777 logs
  　　└─ sessions # chmod 777 sessions
# 手順
```bash:bash
docker-compose down
```

```vi:vi
# hoge.com/demo を hoge.com/dev に変更する
vi hoge.dev.conf [Apache]
vi Dockerfile [パス]
vi php.ini [パス]
vi docker-compose.yml [パス]
vi config.ext [フレームワーク]
```
```bash:bash
docker-compose build
docker-compose up -d
```
CH32X035でUSB PD対応のArduino Nanoを作る

__CH32X035__ で __ArduinoNano__ サイズの基板を作ってみました。
CH32X035は使い勝手が良いSoCですが、汎用的に使えるサイズにしたく検討した結果ArduinoNanoサイズが存在しないため製作しました。
![CH32X035-Nano-1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/a34a1c3e-3873-189d-2585-f141145b6b0a.jpeg)
![CH32X035-Nano-2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/2cc38ae4-2136-5d7d-368f-6ab1f00b6710.jpeg)

# 仕様
- ArduinoNanoサイズ
- ピン配置を純正に近づける
- USB-PD対応
# ピン配置
CH32X035のピン配列とArdino Nanoのピン配列は一致しません。
このため、一部のピンのみ一致させました。
# 回路図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/91bd7642-20e8-df3d-75f9-84409407b38e.png)
# USB PD
CH32X035の売りはUSB PD機能と言えます。
当然ながらPD出力用にコネクタを搭載しています。
今回はXHコネクタではなくターミナルブロックにしました。
# レギュレータ
USB PDの最大電圧は20V（または28V)になります。
今回、レギュレータは30V入力に対している78L03を使用しましたが
AP7333の方が効率もいいのでこちらが良かったかもしれません。
5Vも同じく78L05を採用しましたが、AP7375を使用した方が効率がいいです。

:::note warn
# USB PD 3.1は48V
USB PD 3.1では最大電圧が48Vとなります。
このため、3.1で使用する場合はレギュレータをMCP1792Tなどにする方がいいでしょう。
ただし、WCH社としてはサポートしないようです。
###  MCP1792T
- 入力電圧max.：55V
:::
# スイッチ
電圧切替とダウンロード用にスイッチを2個搭載しました。
電圧切替用スイッチはB0に割当ました。
# 1608と1004
チップサイズ部品は手実装できる1608を中心にしていますが、SoCの横コンデンサのみ1004にしており
ホットプレートなしでも組立て可能です。
# プログラムと書き込み機
Arduino IDEでも開発可能ですし、ダウンロードボタンによりUSBで直接書き込み可能です。
これによりWCH-Link-Eを使用せず書き込みが可能です。

https://qiita.com/usashirou/items/e407182b783185be145f

# ガーバーファイル
Githubにアップしました。
https://github.com/taisirou/ch32x035-Nano/tree/main
Last Epoch のキーバインディング等を保存・復元する方法

## はじめに

***注意事項として、以下の「保存」「復元」の手順を行う際は、Last Epoch を終了しておいてください。***

- この方法を使うと、グラフィック設定を除くあらゆる設定が保存・復元されます。

## Last Epoch のキーバインディング等をファイルに保存

Windowsキー+R を押してから「regedit」と入力して ENTER を押します。
レジストリエディターのメニューバーの直下にあるアドレスバーに
「コンピューター\HKEY_CURRENT_USER\Software\Eleventh Hour Games\Last Epoch」
と入力して ENTER を押します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140610/cbf79aad-fa29-592e-1cb9-5fbe2c634990.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140610/be7afc4f-72b9-919b-e18a-31ccd561aab7.png)

## Last Epoch のキーバインディング等をファイル(～.reg)から復元

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140610/b43fa5ea-309b-8379-0381-f778813271a0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140610/c8c33af7-4ddf-cbe6-6508-f07fdb755dd3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140610/fdf6b1e8-c30d-460e-9d97-d421522806c4.png)

# 以上です。
AmplifyのCustomで生成した動的なResouceの情報をフロントエンドで参照する

## 概要

AmplifyのCustomで生成したAPIのエンドポイントに対してフロントエンドからリクエストを送信したい場合など、AmplifyのCustomで生成した動的なResouceの情報をフロントエンドで参照したいケースがあります。その対応方法について記載します。

## 方法

### Step 1. Custom Resource側で参照したい情報をOutputsに出力する

#### CDKの場合

[CfnOutput](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.CfnOutput.html) を使用して出力します。

```javascript
new CfnOutput(
    this, 
    '<Name>', 
    { value: <Value> }
);
```

#### CFnの場合

[Outputs](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html) を使って出力します。

```yaml
Outputs:
  <Name>:
    Value: <Value>
```

### Step 2. Hookでフロントエンドから参照するファイルに書き出す

Outputsに出力した情報は `amplify/backend/amplify-meta.json` に出力されます。

```json
{
  "custom": {
    "<ResourceName>": {
      "output": {
        "<Name>": "<Value>"
      }
    }
  }
}
```

この情報をフロントエンドから参照するファイルに受け渡します。
フロントエンドから参照するファイルとして、 `src/amplifyconfiguration.json` （v5の場合 `src/aws-exports.js` ）を使用することができます。

受け渡すためには [Hook](https://docs.amplify.aws/gen1/react/tools/cli/project/command-hooks/) を使用します。今回実行するタイミングは `post-pull` と `post-push` です。

hooksに下記のような処理を追加します。

```javascript
const config = JSON.parse(fs.readFileSync('src/amplifyconfiguration.json', { encoding: 'utf8' }).trim())
const meta = JSON.parse(fs.readFileSync('amplify/backend/amplify-meta.json', { encoding: 'utf8' }).trim())

config.custom = {
  ...meta.custom.<ResourceName>.output,
  ...config.custom,
}

fs.writeFileSync('src/amplifyconfiguration.json', JSON.stringify(config, null, 4))
```

### Step 3. フロントエンドから参照する
フロントエンドで書き出されたファイルを参照します。

```javascript
import config from '@app/amplifyconfiguration.json'

const value = config.custom.<Name>
```

## 参考

[Custom Resource output in aws-exports.js](https://github.com/aws-amplify/amplify-cli/issues/12598)

## バージョン情報
```sh
% amplify -v
12.10.1
```
プログラミング歴１週間が説明するPythonのPandas講座

<h1>はじめに</h1>
学習のアウトプットとして記載しています。誤りがあれば訂正します。
<br>大目に見てください</br>

<h1>Pandas（パンダス）について</h1>

Pandasとは、Pythonというプログラミング言語でデータ分析を行う際に便利なライブラリの一つです。
ライブラリとは、エクセルのSUMやAVGのようなそれぞれ専門に特化した関数が大量に詰まった超お得パックです。
つまりPandasは分析をするときにデータを整理してくれる、お得パックということです。

<h2>Pandasを使うメリット</h2>

<h3>1.色んな型のデータを１つの表形式のデータで扱えること</h3>

例えば以下のような情報を含むデータがあるとします

- 名前（文字列型）：創る
- 年齢（整数型）：100
- 生年月日（日付型）：1924-11-01
- 身長（浮動小数点型）：120.5
- 免許はあるか（ブール型）：False

このような種類の違うデータ型を同じデータフレーム（表形式のデータ）で表現することができます。
ようはエクセルです（？）
| 名前 | 創る|
|:-:|:-:|
| 年齢 |  100 |
| 身長| 120.5|
| 免許はあるか| False |




<h3>2.データ加工や解析の便利機能が多いこと</h3>

データの中にはデータが欠損していたりするのですが、それらを削除や補完したりできます。
穴が開いたTシャツをおばあちゃん（Pandasの関数）が縫ってくれたり、汚れが付いた場所を引きちぎってなかったことにしてくれます。


<h2>Pandasインストール</h2>

PandasはPythonに入っていない外部ライブラリのためインストールする必要があります。
最初はプログラミングの知識がないので、学習する必要があるのと同じですね。
Windowsのコマンドプロンプトを開いて、下記の文字列を入力することでインストールできます。

```
pip install pandas
```


ちなみにpip（ピップ）はPythonのライブラリなどをインストール、管理するためのコマンドラインツールです。

<h2>Pandasを使う</h2>

Pandasを使うには最初にコードをインポートする必要があります。

```
import pandas as pd 
#意訳 パンダスの機能使えるようにしてね、あとこれ以降「pd」ってあだ名で呼ぶね～
```



<h2>Pandasのデータの型</h2>

Pandasは二つのデータ型でデータを持っています。

1.Series（シリーズ)
2.DataFrame（データフレーム）

まず<b>Seriesとは１列のみのデータ型</b>です。
エクセルの縦１列を想像してください。そうあれなのです。（？）

```py
import pandas as pd

A = pd.Series(['スライム','スライムベス','ホイミスライム','メタルスライム'])
#意訳 Aはパンダスのシリーズってデータの形で（）内の要素があるデータだよ

print(A)
#意訳 Aを出力してね

"""
0 スライム
1 スライムべス
2 ホイミスライム
3 メタルスライム
"""

```



次に<b>DataFrameとは縦と横からなるデータ型</b>です。
ほぼエクセルです（？）
DataFrameの１列を抽出するとSeriesになります。
スライムがSeriesとするとキングスライムがDataFrameです。うんわかりやすい

```py
import pandas as pd

df = pd.DataFrame({
    '名前' :['スライム','スライムベス','ドラゴンスライム','メタルスライム'],
    '色' : ['青', '赤', '黄','銀'],
    'HP' : [10, 15, 30,5]
    })
    #意訳 dfはパンダスのデータフレームってデータの形で（）内の要素があるデータだよ
    
print(df) #コンソールにdfを出力してね

print(df.dtypes) #データタイプ（各列のデータ型）を表示するコマンドだよ
                 #文字（object）なのか数字（int64）なのか他

print(df.columns) #カラム名（各列の名前）を出力してね

"""
         名前  色   HP
0      スライム  青  10
1    スライムベス  赤  15
2  ドラゴンスライム  黄   30
3   メタルスライム  銀  5
名前    object
色     object
身長     int64
dtype: object
Index(['名前', '色', '身長'], dtype='object')
"""
```



ちなみにデータフレームに対応するデータがないとNaNとして扱われます。
UdemyとCloud License（旧コイワクラブ）はどちらの方が合格しやすいか？合格者が比較

どうも、ふーみんと申します。

AWSやGoogle Cloud等のクラウド系資格の学習にあたり、UdemyとCloud Licenseのどちらを選ぶべきか悩んでいる方も多いのではないでしょうか。どちらも人気の学習プラットフォームですが、それぞれ特徴が異なります。

**私はそれぞれのサイトを利用し、Udemyのみで学習し合格した経験と、Cloud Licenseのみで学習し合格した経験の両方があります。**
現保有資格（AWS：CLF、SAA、SOA　Google Cloud：CDL、ACE）

これから学習する人が教材を選ぶ際、少しでも参考になれば幸いです。

なお、ここでは各サービスの説明は省きます。そもそもクラウドライセンスって何？という方は下記リンクから確認ください。

https://cloud-license.com/

https://about.udemy.com/jp/


# Cloud Licenseの特徴

## 特徴

- 問題種は1セクション7問のセット

- 回答した直後に解説が読める

- 税込み4080円～のサブスクで複数試験の問題集の学習が可能

- 模擬試験モードは問題集からランダムで本試験と同じ問題数を抜粋

## Cloud Licenseメリット

**解説が丁寧**
1問1問の解説はUdemyの教材と比べると丁寧です（私見）また、解説に公式ドキュメントへのリンクの記載があるため最も正確な情報に基づいて学習できる

**問題の更新頻度が高い**
クラウドベンダーのアップデートごとに問題を更新してくれるため、最新の試験傾向に対応しやすいです。

**合格記が読める**
本試験の出題傾向がが読めたり、モチベーションの維持に効果があります。

## Cloud Licenseデメリット
**コピー＆ペースト不可**
単語をググるのに手間がかかります。

選択して単語を検索したり、コピペしてAIに質問することができないので、チリツモで学習時間が伸びてしまいます。

**模擬試験の問題順が保持されない**
模試の復習する時に順番がバラバラの状態で学習することになります。その為「模試の序盤で出てくる問題だ」というような記憶の仕方はできません。（本来良くないかもしれませんが）


Cloud Licenseは、公式ドキュメントに紐づいた正確な情報と、頻繁な問題更新が魅力です。しかし、コピー＆ペーストができないことや、模擬試験の形式が使いにくいといった点は気になります。

# Udemyの特徴

## 特徴

- 世界中のUdemy講師が作成した教材を購入することができる。

- 講義動画、模試等様々な形態の教材がある。

- 必要な教材を自分で選んで購入する。（Cloud Licenseはサブスク）

## Udemyメリット
**コピー＆ペースト自由**
最初の内は解説から何度も単語をググるので結構大事です。問題の内容をAIに質問したりもできるので、効率的な学習につながると思います。

**教材の種類が豊富**
講義動画、模試のセット等多様な学習スタイルに対応できます。

**教材費を抑えられる**
Udemyは頻繁にセールを行っているため、2000円以下で模試が購入できることが多いです。

## Udemyのデメリット

**教材の質にばらつきがある**
問題作成者は海外の人が多く、日本語が変な解説が多いです。たぶん自動翻訳。

**更新頻度が低い**
問題の内容は作成者に一任されるため、最新の情報が反映されていない可能性があります。ある教材で解説に違和感を感じた問題があり、調べてみると、今の情報では明らかに間違いな選択肢が正解とされていることもありました。

**教材が削除されることがある**
コンプライアンスに違反する教材は購入後であっても削除されることがあります。実際に購入後模試の教材が削除されたことがありました。（合格後に返金されるというラッキーな展開なりましたが）

Udemyは、コピー＆ペーストができたり、教材の種類が豊富であったりと、自由度の高い学習が可能です。しかし、教材の質にばらつきがあり、全て鵜呑みにすると間違った情報をインプットしてしまう可能性もあります。

# どちらを選ぶべきか？

どちらのプラットフォームがクラウド系資格の合格に繋がりやすいかは、学習スタイルや重視する点によって異なります。（なんやねん）

正確な情報に基づいて学習したい方: **Cloud License**

数問ずつコツコツ勉強したい方: **Cloud License**

教材費を抑えたい方: **Udemy**

まとまった時間で模試を繰り返し解きたい方: **Udemy**

# まとめ＆結論

Cloud License: 正確な情報、最新の試験傾向に対応できるが、操作性がやや不便。

Udemy: 自由度が高いが、教材の質に注意が必要。

どちらのプラットフォームも一長一短です。理想としては、両方を併用し、それぞれの強みを活かすことがおすすめです。

教材を選ぶ際の参考になれば幸いです。
【初心者向け】API制限とは？

## 初めに
X（Twitter）のAPI制限により、多くのユーザーがサービスを正常に利用することができなくなります。それでは、このAPIの制限はなんでしょうか？なぜか多くのサービスプロバイダーでも制限を設けていますか？

この記事は、API制限の概要、種類、原因を詳しく解説し、デベロッパーが一般的なAPI制限のタイプとその目的を理解する助けになります。是非最後まで目を通してみてください

## API制限とは
APIの制限とは、APIを利用するユーザーへのリクエスト数やデータ使用量などを制限することを指します。APIを提供する側としては、サービス品質と負荷耐性のバランスを取りながら、適切な制限を設けることが重要です。

### どこからAPIの制限を確認？
それでは、利用中のAPIの制限をどこから確認できますか？一般的にはAPIの制限が存在している場合、[APIのドキュメント](http://apidog.com/jp/blog/intro-to-api-document/)やリファレンスで明確に掲載されています。そこで、APIの制限を確認するには、以下のリソースを確認してみましょう。

#### APIのドキュメントやリファレンス
- ほとんどのAPIは、制限に関する規定や上限値をドキュメント内に記載しています

#### APIの利用規約や利用条件
- 利用する上での具体的な制限事項が記載されていることが多い
#### APIプロバイダーへの直接問い合わせ
- ドキュメントに記載がない場合はプロバイダーに問い合わせて確認する
#### APIからのレスポンス内に含まれる情報
- 現在の制限値や残り利用可能回数がレスポンスヘッダー等で返されることがある

また、APIキーを取得後のデモやテスト利用の段階で、実際のアプリケーションに組み込む前に制限に対する余裕を確認しておくことをおすすめします。

### よく見られるAPI制限の種類
それでは、一般的にはどういう側面からAPIを制限していますか？最も頻繁に見られるAPI制限の種類は次のようになります：

#### リクエスト数制限 
- 1日あたりや1時間あたりのリクエストの上限が設けられている
#### レートリミット
- ある間隔で送信できるリクエスト数に上限がある
#### 同時接続制限
- 同時に接続できるセッション数やコネクション数の制限
#### データ制限
- 1リクエストや月間で送受信できるデータ量に制限がある
#### CPU使用量制限
- 使用可能なCPU時間が制限されている(クラウド型API)
#### 課金制限
- 有料プランで上限が緩和されるケースがある

これ以外にも、IPアドレス制限、特定ドメインからのみの利用許可など、APIの用途や性質に応じた制限があるので、個別のAPIのドキュメントで確認が必要です。

### APIに制限を課す原因は？
それでは、APIのプロバイダーはなぜかAPIの制限を設けていますか？APIに制限を課す主な原因は以下の通りだと思います：

#### サーバーへの過剰な負荷を防ぐため
- 制限がなければサーバーがダウンするなどの事態を招くおそれがあるため
#### サービスの品質と性能を保証するため
- 特定のユーザーからの大量アクセスで全体の品質が低下することを防ぐ
#### 公平なリソース配分
- リソースを独占せず公平に配分するための調整
#### 業務上の秘密データの保護
- 大量アクセスで内部データが漏えいすることを防ぐ
#### 有料プランによる課金限度額の設定
- 利用量に応じた公平な課金制度を構築するため

つまり、サービス側の実装やインフラの限界による制約だけでなく、運営と利用者の両面での利用制限が必要であるためです。


## 自社のAPIに制限を設定すべき？
上記の内容から、APIの制限ということを様々な方面から説明しました。API制限を十分に理解した上、自分のAPIに制限を設定するかどうかを判断するにあたって、以下の点を検討することをおすすめします。

APIが扱うデータや機能の機密性・セキュリティリスクを確認

- 機密データが含まれる場合はアクセス制限が必要


予想されるアクセスユーザー数や1ユーザーあたりの利用頻度を推定

- 大量アクセスを許容できるインフラか確認


APIサーバーの処理能力やネットワーク帯域の制限を把握

- 性能面での制限が現実的にあるか評価


アクセススパイクや不正利用があった場合の影響度を考慮

- サービスへの影響がある場合はリスクが高い


制限によって可能となる課金モデルがあるか検討

- 有料プラン等のビジネスインセンティブになりうるか


これらを総合的に判断した上で、サービス品質の確保とビジネス目的のバランスを取りつつ、適切な制限の必要性と水準を検討していくことが重要です。

## ApidogでAPIを簡単に設計して開発する
APIに制限を設定するかどうかにも関わらず、APIを開発するために、APIをよく設計する必要があると思います。そこで、[Apidog](http://www.apidog.com/jp/?utm_source=opr&utm_medium=a2takuya)という便利なAPI管理ツールを皆さんにお勧めします。[Apidog](http://www.apidog.com/jp/?utm_source=opr&utm_medium=a2takuya)を使用することで、APIを簡単に設計したり、ドキュメントを生成したりすることもできますし、APIのモックサーバー、テスト自動化などの機能も備えているので、APIライフサイクルのいずれかの段階でも役立つツールです。

![apidog-クライアント-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877124/325563fa-1e27-c858-6657-8be95deb2eed.png)

## 終わりに
**今回は以上になります！
最後まで見ていただきありがとうございました！
この記事を読んで少しでも理解を深めていただければ幸いです！
では、また次の記事で～！**
PostgreSQL オブジェクト識別子データ型

# システムカタログで管理されているオブジェクトはidで不便
特に`pg_class`ですが、列に`relowner`や`relnamespace`というカラムありますが、idなので
確認するときは、わざわざ別カタログから名称を取得してました。。

こんな感じで
```sql
select 
    r.rolname as owner,     -- オーナ名
    n.nspname as schema,    -- スキーマ名
    c.relname as name       
from pg_class c
    inner join pg_roles r on r.oid = c.relowner
    inner join pg_namespace n on n.oid = c.relnamespace
where
    r.rolname = 'postgres'
    and c.relkind = 'r'
```

これを「オブジェクト識別子データ型」を使うとこうなります。
```sql
select
    c.relowner::regrole as owner,               -- オーナ名
    c.relnamespace::regnamespace as schema,     -- スキーマ名
    c.relname as name 
from pg_class c
where
    c.relowner = 'postgres'::regrole
    and c.relkind = 'r'
```

めちゃくちゃスッキリした！！

以上です。
adbで結果が複数あった時に指定した箇所のみを抽出する

adbで複数のポートがあるときに毎回ポート番号を調べるのが面倒くさい為、いつも上から◯番目のポート番号を取得するようにしたいと思い、記述した。

```

# adb devices -l の結果を取得
$adbOutput = adb devices -l

# 正規表現で "abc" から始まる tranceport:数字 を探して数字を抽出
$pattern = "abc.*tranceport:(\d+)"
foreach ($line in $adbOutput) {
    if ($line -match $pattern) {
        $number = $matches[1]
        Write-Output $number
    }
}
@echo off
setlocal enabledelayedexpansion

rem コマンドの設定
set "adbCommand=adb devices -l"
rem 正規表現の設定
set "pattern=^abc.*tranceport:[0-9][0-9]*"
rem 実行するコマンドの設定（ここでは adb -t 数字 root）
set "command=adb -t !number! root"

rem adb devices -l の出力を取得して処理
for /f "tokens=*" %%A in ('!adbCommand!') do (
    set "line=%%A"
    rem 正規表現に一致する行を検索
    echo !line! | findstr /r "!pattern!" >nul
    if not errorlevel 1 (
        rem tranceport: の後の数字を抽出
        for /f "tokens=2 delims=:" %%B in ("!line:tranceport=tranceport:!") do (
            set "number=%%B"
            rem 設定したコマンドを実行
            call !command!
        )
    )
)

endlocal
```

powershell
```
# 指定するフォルダパス
$folderPath = "C:\path\to\your\folder"

# フォルダ内で最も更新日が新しいテキストファイルを取得
$latestFile = Get-ChildItem -Path $folderPath -Filter "*.txt" | Sort-Object LastWriteTime -Descending | Select-Object -First 1

if ($latestFile -ne $null) {
    # 特定の文字列を設定
    $searchString = "特定の文字列"

    # ファイルの内容を読み込んで特定の文字列の出現回数をカウント
    $content = Get-Content -Path $latestFile.FullName
    $count = ($content -join "`n") -split [regex]::Escape($searchString) | Measure-Object | Select-Object -ExpandProperty Count
    $count = $count - 1  # 最初の分割で余分な要素ができるため1を減らします

    Write-Output "ファイル: $($latestFile.Name)"
    Write-Output "文字列 '$searchString' の出現回数: $count"
} else {
    Write-Output "フォルダ内にテキストファイルが見つかりませんでした。"
}
```
AI 推論でインテル® Xeon® プロセッサーのインテル® AMX を活用する方法

【開発と活用を推進するインテルの AI】
インテルはクラウドからデータセンター、エッジにおいて、あらゆる場所での AI 活用を目指す、ソフトウェアやハードウェアでの AI 開発、さらには AI ソリューションへの活用を動画で解説するWebサイトを公開しています。
https://www.intel.co.jp/content/www/jp/ja/artificial-intelligence/ai-development-and-utilization.html

＜AI 活用を動画で学ぶ＞
インテルのエキスパートたちが、ソフトウェアやハードウェア、AI ソリューションに関してのノウハウを動画で解説。今回ご紹介するのは、「推論 / エッジ推論」
学習によって作成された推論モデルのエッジへの実装や、効率的な推論の実行など、推論に関して紹介します。

タイトル：
AI 推論でインテル® Xeon® プロセッサーのインテル® AMX を活用する方法

![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/4d7ee6ab-e898-7ae7-12b6-7b97a2dc1667.png)

インテル® Xeon® プロセッサーは AI ワークロード処理を高速に行える拡張命令、インテル® AMX が搭載されています。このビデオでは、なぜインテル® AMX 命令で AI 処理が高速化されるのか、インテル® AMX 命令を利用して推論を高速化する方法などについてご紹介いたします。

https://www.intel.co.jp/content/www/jp/ja/artificial-intelligence/ai-development-and-utilization.html

是非この機会にAI Everywhere を実現するインテルのソリューションをご覧ください！
Goでのファイル操作と非推奨機能：os.SEEK_ENDからio.SeekEndへ

## 背景


下記のUdemy講座で、Goでのファイル操作について学びましたが、その中で`os.SEEK_END`が非推奨であることを知りました。
Go 1.9以降では、osパッケージのシーク定数（`os.SEEK_SET`、`os.SEEK_CUR`、`os.SEEK_END`）の代わりに、ioパッケージの`io.SeekStart`、`io.SeekCurrent`、`io.SeekEnd`を使うのが推奨されているぽいです。

https://www.udemy.com/course/golang-webgosql

## 変更点
#### 元のコード
```go
package main

import (
	"os"
)

func main() {
	// ファイル操作
	// -- Create --
	f, _ := os.Create("foo.txt")

	f.Write([]byte("Hello\n"))

	f.WriteAt([]byte("Golang"), 6)

	// ファイルの末尾にオフセットを移動
	f.Seek(0, os.SEEK_END)

	f.WriteString("Yaah")
}
```

#### 修正コード
`os.SEEK_END`の代わりに`io.SeekEnd`を使用しました。

```go
package main

import (
	"os"
	"io"
)

func main() {
	// ファイル操作
	// -- Create --
	f, _ := os.Create("foo.txt")

	f.Write([]byte("Hello\n"))

	f.WriteAt([]byte("Golang"), 6)

	// ファイルの末尾にオフセットを移動
	f.Seek(0, io.SeekEnd)

	f.WriteString("Yaah")
}
```

## 参考

https://github.com/golang/go/issues/17920
Tauri + React + TypescriptにTailwindCSSを導入

TailwindCSSは賛否あるが俺は使いたい！
Tauri + React + TypescriptにTailwindCSSを導入します．
# ダウンロード
## bun
1. インストール
```zsh
bun add -d tailwindcss postcss autoprefixer
```
2. イニット
```zsh
bunx tailwindcss init -p
```
## npm
1. インストール
```zsh
npm install -D tailwindcss postcss autoprefixer
```
2. イニット
```zsh
npx tailwindcss init -p
```
# ファイルを編集
`tailwind.config.js`を書き換える．

```tailwind.config.js
/** @type {import('tailwindcss').Config} */
export default {
  content: [
    './index.html',
    './src/**/*.{js,ts,jsx,tsx}'
  ],
  theme: {
    extend: {},
  },
  plugins: [],
}
```

`index.css`に追加
```index.css
@tailwind base;
@tailwind components;
@tailwind utilities;
```
# さいごに
できた！
自分史上最高に「芯を食った」(ように錯覚した?)バグレポートの備忘録

ここ数年、macOS版のVivaldiブラウザには大変お世話になっておるのですが、ちょっと前にV7.0のメジャーアップデートをインストールしたら、CSSの:hover擬似クラスの挙動がおかしいというバグに気づいたんですよ。『浮遊』するdiv要素が、マウスのhoverから外れると縮んで引っ込むというモノなのに、その要素上でマウスが1/3くらい右に動くともう引っ込んじゃう。
その後一回のマイナーアップデートを経てもバグの挙動は変わらなかったんで、まぁちょっとバグレポートでも送ってやるかと思って、以下のHTMLをバグの”Description”欄にマンマ貼り付けて送ったら...
```HTML
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>floating panel test</title>
</head>
<body>
    <div id="float-panel">
Floating Panel Appears when Mouse Hovered
    </div>
The ':hover' pseudo-class behavior is incorrect when:<br>
- This file is opened on a tab of a window, and<br>
- One or more other tabs exist in the same window, and<br>
- One of these tabs is 'pinned' and the others are not<br>
If mouse pointer goes to the right about 1/3 of 'float-panel', ':hover' gets lost.
</body>

<style type="text/css">
#float-panel {
    border: 1px gray solid;
    background-color:  lightgrey;
    border-radius: 6px;
    padding: 10px;
    width: 80px;
    height: 20px;
    overflow: hidden;
    position: absolute;
    left: 20px;
    bottom: -33px;
    transition: bottom .5s .2s;
}
#float-panel:hover {
    width: 400px;
    bottom: 0px;
    background-color:  mintcream;
}
</style>
</html>
```
なんと、翌日には次のマイナーアップデートが通知されて、インストール&再起動してみたら、:hoverの挙動は正常に戻っていたという。実行ファイルのビルド日時(ファイル作成日時)を見ると、オレがバグレポート送ってからわずか12時間ほどしか経ってない。
Vivaldiの開発保守チームは化け物かww って一瞬思ったけど、そうでもないのかなー? 実は、もう結構前から内部では認識されて修正を進めてた件なのかもしんないよねw
真相はわからんけど、バグは爆速で直ったので大満足です!
SnowflakeのRBACロールとCRUD権限の違いをまとめてみた

## はじめに
**Snowflake**には、データの安全な管理とアクセスコントロールのために、事前定義されたRBAC（Role-Based Access Control）ロールと、データ操作のためのCRUD（Create, Read, Update, Delete）権限があります。本記事では、SnowflakeのRBACロールの役割やCRUD権限の付与方法について詳しく解説し、各ロールが実行可能な操作を表でまとめます。この記事を通して、RBACロールとCRUD権限の違いが明確になり、適切な権限管理の手助けとなるでしょう。


## Snowflakeの主要RBACロール

Snowflakeには、アカウント全体やデータベースオブジェクトの管理を目的とした以下の6つの事前定義RBACロールが存在します。

- **ORGADMIN**：組織全体を管理し、複数のSnowflakeアカウントをまたぐ権限を持つ。
- **ACCOUNTADMIN**：アカウント内の全リソースとロールを管理できる最上位ロール。
- **SECURITYADMIN**：他のロールやユーザーへのアクセス権を管理。
- **SYSADMIN**：データベース、スキーマ、テーブル、ビューといったデータベースオブジェクトを管理。
- **USERADMIN**：ユーザーとロールを管理するが、データそのものへのアクセスはない。
- **PUBLIC**：すべてのユーザーが持つデフォルトロールで、最小限のアクセス権を提供。

これらのロールは階層的に構成されており、上位のロールは下位のロールの権限を継承します。



## RBACロールの権限一覧表

| ロール           | アカウント管理 | ユーザー/ロール管理 | データベース管理 | データ閲覧 | データ操作 (更新・削除) |
|-----------------|----------------|----------------------|------------------|------------|-------------------------|
| **ORGADMIN**    | ◯              | ×                    | ×                | ×          | ×                       |
| **ACCOUNTADMIN**| ◯              | ◯                    | ◯                | ◯          | ◯                       |
| **SECURITYADMIN**| ×             | ◯                    | ×                | ×          | ×                       |
| **SYSADMIN**    | ×              | ×                    | ◯                | ◯          | ◯                       |
| **USERADMIN**   | ×              | ◯                    | ×                | ×          | ×                       |
| **PUBLIC**      | ×              | ×                    | ×                | ◯          | ×                       |


## CRUD権限とGRANTコマンド

**CRUD（作成、読み取り、更新、削除）**の権限は、特定のデータベースオブジェクトに対して`GRANT`コマンドを用いて付与します。RBACロールとは異なり、CRUD権限はオブジェクトレベルで付与され、特定のテーブルやビューに対するデータ操作を許可します。

### CRUD権限の例

例えば、次のようにしてCRUD権限を付与できます：

```sql
-- データベースレベルでSELECT権限をSYSADMINロールに付与
GRANT SELECT ON DATABASE my_database TO ROLE SYSADMIN;

-- 特定のテーブルに対するUPDATE権限をUSERROLEに付与
GRANT UPDATE ON TABLE my_table TO ROLE USERROLE;
```

これにより、指定されたロールが特定のオブジェクトに対して指定された操作を実行できるようになります。

## カスタムロールとRBACロールの活用

Snowflakeでは、事前定義されたRBACロールだけでなく、**カスタムロール**を作成して特定の業務や組織のニーズに合わせた権限管理を行うことができます。事前定義ロール自体を作成・削除することはできませんが、これらのロールに対して他のロールや権限の委譲を行うことが可能です。

### カスタムロールの作成と委譲の例

例えば、独自のロールを作成して、`SYSADMIN`ロールへの委譲を行うことができます。

```sql
-- カスタムロールの作成
CREATE ROLE custom_role;

-- カスタムロールにSYSADMINロールへの委譲を付与
GRANT ROLE SYSADMIN TO ROLE custom_role;

-- カスタムロールをユーザーに付与
GRANT ROLE custom_role TO USER some_user;
```

このようにすることで、カスタムロールに対して必要な権限のみを委譲し、柔軟なアクセス管理を行うことができます。


## まとめ

SnowflakeのRBACロールは、アカウント管理やリソース管理を階層的に行うための役割であり、各ロールはその範囲に応じて異なる権限を持っています。一方、CRUD権限は特定のオブジェクトに対する操作権限で、データアクセスと操作を細かく制御するために使用されます。また、カスタムロールを活用することで、組織のニーズに応じた柔軟な権限管理が可能です。この違いを理解することで、Snowflakeでの適切な権限管理を実現できるでしょう。
リモナビ： オンプレ提供でお客様システムへの組込

# リモナビ・オンプレ提供
- お客さまシステムに内包して<b>リモナビ</b>を利用したい
- オンプレ環境でリーチャビリティのないターゲット接続に活用したい

　このようなケースを想定して、リモナビはオンプレ環境への導入をサポートしています。　提供は docker-compose 形式です。　内部構成は、本体 docker 1つとデータベース情報を格納する volume 1つのシンプルな構成です。
 
# 組込み構成例

<img width="1024px" src="https://remonavi.com/img/onpre_embeded.png?1">

　上記は、お客様サービスシステムにて、管理ターゲットへのリーチャビリティがない場合の具体的な接続構成図です。　お客様システムへの配備は以下です。

 - RemoNavi オンプレ docker-compose 
 - RemoNavi Sender (docker)

 RemoNavi Sender の操作は、Sender を リモナビ接続の対象として登録することで、二段階認証の RemoNavi 管理画面からのみ操作することができます。
 具体的には、以下のようなイメージです。

<img width="1024px" src="https://remonavi.com/img/remonavi_with_sender.png">

# リモナビと利用者様サービスシステムの連携
### 🔹利用シーン
- 利用者様サービスシステムから、管理ターゲットまでの接続を通信レベルで確立できない。
- FW設定や、IPマスカレード|SNAT設定のみでは「サービスシステム → 管理ターゲット」方向への接続確立ができない。

　その他、ネットワークセグメント超えなど。

### 🔹リモナビによる通信経路
　<font color="#cc6633"><b>利用者様サービスシステム</b></font>
　　↓①↓
　<font color="#3399ff"><b>RemoNavi Sender</b></font>
　　↓②↓ 　TLS通信 + リモナビ独自認証,コネクション確立シーケンス
　<font color="#333399"><b>RemoNavi オンプレ版</b></font>
　　↓③↓ 　TLS通信 + リモナビ独自認証,コネクション確立シーケンス
　<font color="#3399ff"><b>RemoNavi Receiver</b></font>
　　↓④↓
　<font color="#cc6633"><b>利用者様管理ターゲット</b></font>

### 🔹リモナビを組み込んだ接続の特徴

:::note info
③ の RemoNavi ー RemoNavi Receiver 間接続で、RemoNavi Receiver側 が TCPクライアントとして接続する点です。　<INS>Receiver が RemoNavi へ接続できれば、TCPコネクションは双方向通信のため「FW超え」が実現されると同時に、RemoNavi は プライベートネットワーク内の管理ターゲットのIPアドレスや NAT構成などを意識せずに通信できる点です。</INS>　これによって③区間のネットワーク設定が単順な IPマスカレード | SNAT 相当で実現できることになります。
:::
:::note info
① の 利用者様サービスシステム ー RemoNavi Sedner の通信は、接続先が「利用者様管理ターゲット」から　「RemoNavi Sender」 に変わるだけです。
:::
:::note info
<b>セキュリティ</b>
- RemoNavi Receiver が Active かつ RemoNavi 利用状態[可能] でないと RemoNavi オンプレ版にて通信が遮断されます。
- RemoNavi 通信は TLS通信 で暗号化されます。
- RemoNavi ー Sender | Receiver 通信は接続時に、独自の認証シーケンス、コネクション確立シーケンスが導入されています。
- RemoNavi ー Sender | Receiver 通信は、全て通信ログに記録されます。
:::

### 🔹設定順序
リモナビにて、管理ターゲットまでの経路を作成してから、利用者様サービスシステムにて管理ターゲットの登録をします。

1. <font color="#333399"><b>RemoNavi オンプレ版</b></font> にて、<b>利用者様管理ターゲット</b>への<INS>経路#1</INS>を登録します。
    - 種別 : <b>L4 TCP-Stream</b>
    - 接続種別： <b>Receiver 経由</b>
    - 接続先ホスト｜ポート：<b>RemoNavi Receiver からみた接続先のホストアドレスとポート番号</b>
1. <font color="#3399ff"><b>RemoNavi Receiver</b></font> 側にて、<INS>経路#1</INS>の 利用登録。
1. <font color="#3399ff"><b>RemoNavi Sender</b></font> 側にて、<INS>経路#1</INS>の 利用登録。
    - SenderのAccept Port 番号
1. <font color="#cc6633"><b>利用者様サービスシステム</font> にて、管理ターゲットの登録</b>
    - 管理ターゲットは、 RemoNavi Sender の ホストと前項の Acceptポート番号を指定
[tips][cpp] stringのconstructor

cppのtipsです。`int main(){}`やincludeヘッダなどは省略します。

# std::basic_string::constructor

stringのconstructorからよく使うものをピックアップしてメモ。

## `vector<char>` からstringに変換

```cpp
    vector<char> c_vec = {'h', 'e', 'l', 'l', 'o'};
    std::string s99(c_vec.begin(), c_vec.end());
    std::cout << "s99 : " << s99 << std::endl; // "hello"
```

```cpp
hello
```

## 文字をN回繰り返して構築 by refs

```cpp
  // 文字をN回繰り返して構築
  std::string s7(3, 'a');
  std::cout << "s7 : " << s7 << std::endl;
```

```cpp
aaa
```

## 文字列の範囲から構築　by refs

```cpp
  // 文字列の範囲から構築
  std::string s4 = "hello";
  std::string s8(s4.begin(), s4.end());
  std::cout << "s8 : " << s8 << std::endl;
```

```cpp
aaa
```

## 文字の初期化子リストから構築　by refs

```cpp
  // 文字の初期化子リストから構築
  std::string s9 = {'h', 'e', 'l', 'l', 'o'};
  std::cout << "s9 : " << s9 << std::endl;
```

output
```cpp
hello
```

## 参考

https://cpprefjp.github.io/reference/string/basic_string/op_constructor.html
Linuxでログイン中のユーザーを調べる

## はじめに
Linuxでログイン中，ログイン状態にあるユーザーについて調べるコマンドを紹介します


## 調べ方

### w コマンド
```
w
```

```:出力
11:23:25 up 20 days, 22:02,  4 users,  load average: 1.66, 2.02, 2.03
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
AAA    pts/44   tmux(468300).%0  1610月24  5days  8days  8days /AAA/XXX.py
BBB    pts/113  192.XXX.XXX.XXX  月14    3:32   0.02s  0.02s -bash
```

### who コマンド
```
who
```

```:出力
AAA    pts/44       2024-10-16 21:05 (tmux(468300).%0)
BBB    pts/113      2024-10-28 14:58 (192.XXX.XXX.XXX)
```


### users コマンド
```
users
```

```:出力
AAA BBB
```

### last コマンド
```
last | grep "still logged in"
```
```:出力
BBB    pts/113      192.XXX.XXX.XXX  Mon Oct 28 14:58   still logged in
AAA    pts/44       tmux(468300).%0  Wed Oct 16 21:05   still logged in
```

### finger コマンド
インストールしていないので未検証ですが，fingerコマンドというコマンドもあるようです．
```
finger
```



## おまけ
### 現在自分がログインしているユーザーを確認する方法
```
whoami
```
```
who -m
```
ビルド(build)とデプロイ(deploy)の違い

初投稿です。<br>
初心者もしくは新卒エンジニアの方々、システム開発および自分に向けての備忘用。

（アプリケーションのリリースに向けてなんとなく動くようにする…位しか分かっていなかったので）

<h2>ビルド(build)</h2>
<b>作ったソースコード（達）を基に実行可能なファイルを造ること。</b>コンパイルもビルド時に行われる処理の１つです。

具体的には次の２つの作業をまとめてビルドと呼ぶらしい。
<ol>
    <li>
    書いたソースコードを機械語に翻訳する（コンパイル）
    </li>
    <li>
    システムに必要なコンパイル済ファイル達・外部のライブラリを連携させて、アプリケーションを動かすための実行ファイルをつくる（リンカ）
    </li>
</ol>


<h2>デプロイ(deploy)</h2>
英語では、「展開する」、「配置する」等の意味で使われているよう。
（例）Troops were <b>deployed.</b> 「軍隊が配備された」

IT用語としてのデプロイは、<b>ビルドした実行ファイルをサーバー上にアップロードして稼働できる状態にすること</b>

<h2>まとめ</h2>
ソースコード作成→<b>ビルド→デプロイ</b>→リリース<br>のプロセスを覚えておく。

作るにあたって、「ビルド」「デプロイ」について色々調べましたが、それぞれ定義が曖昧なようです。厳密な定義が欲しい場合は、同じ職場の上司や先輩に聞きましょう。←重要<br>

間違い・ご指摘があれば是非教えて頂けると幸いです。
2024年11月 AIOps 定点観測

# 概要
AIOps の動向や学習のため、Google で AIOps を検索した結果を記録している記事です。

# 2024年11月1日の検索結果 (リスティング広告)

![スクリーンショット 2024-11-01 104914.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/1cabb6d8-7b1f-5e4f-d00d-0dbb077ca945.png)

* Dynatrace
* Splunk
* オージス総研

今月は Dynatrace が TOP で、2番目に Splunk、3番目にオージス総研です。

先月の結果はこちら --> [2024年10月 AIOps 定点観測](https://qiita.com/mkodera/items/4a7f3cc44d9df4bc6df9)

# 2024年11月1日の検索結果 (広告以外)

![スクリーンショット 2024-11-01 105101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/4719a2c4-7d09-95f2-b39a-3ab70d88bab0.png)

* AWS
* IBM
* オージス総研
* HPE
* Monster Lab


今月は AWS が TOP で、IBM とオージス総研が続いています。Splunk がいないですね。

先月の結果はこちら --> [2024年10月 AIOps 定点観測](https://qiita.com/mkodera/items/4a7f3cc44d9df4bc6df9)
nextjs app routerのmiddlewareのmatcherで全てのpathを対象にする

# nextjs app routerのmiddlewareのmatcherで全てのpathを対象にする

## TL;DR

方法は2つパターン。
1. configをなくす
1. matcherで記載する

## 背景

[nextjs example](https://github.com/vercel/next.js/tree/canary/examples/middleware)を確認している際に、ふと気になった。

## 0. middleware

```(src/)middleware.ts
import { NextRequest } from "next/server";

export function middleware(request: NextRequest) {
    console.log(request.url)
}

export const config = {
  matcher: "/api/:path*"
}
```

## 1. config を削除する

```(src/)middleware.ts
import { NextRequest } from "next/server";

export function middleware(request: NextRequest) {
    console.log(request.url)
}
```

```terminal
next_web_container   | http://localhost:3000/
next_web_container   |  GET / 200 in 39ms
next_web_container   | http://localhost:3000/_next/static/css/app/layout.css?v=1730426140917
next_web_container   | http://localhost:3000/_next/static/chunks/webpack.js?v=1730426140917
next_web_container   | http://localhost:3000/_next/static/chunks/main-app.js?v=1730426140917
next_web_container   | http://localhost:3000/_next/static/chunks/app-pages-internals.js
next_web_container   | http://localhost:3000/_next/static/chunks/app/page.js
next_web_container   | http://localhost:3000/favicon.ico
next_web_container   |  GET /favicon.ico 200 in 11ms
```

## 2. matcherで記載する

```(src/)middleware.ts
import { NextRequest } from "next/server";

export function middleware(request: NextRequest) {
    console.log(request.url)
}

export const config = {
  matcher: ['/:path*'],
}
```

```terminal
next_web_container   | http://localhost:3000/
next_web_container   |  GET / 200 in 21ms
next_web_container   | http://localhost:3000/_next/static/css/app/layout.css?v=1730426250311
next_web_container   | http://localhost:3000/_next/static/chunks/webpack.js?v=1730426250311
next_web_container   | http://localhost:3000/_next/static/chunks/app/page.js
next_web_container   | http://localhost:3000/_next/static/chunks/main-app.js?v=1730426250311
next_web_container   | http://localhost:3000/_next/static/chunks/app-pages-internals.js
next_web_container   | http://localhost:3000/favicon.ico
next_web_container   |  GET /favicon.ico 200 in 14ms
```
PowerAppsでアコーディオンメニューを作る※アニメなし

## PowerAppsでアコーディオンメニューを実現
動きのあるメニューを作りたいと色々試していたのですが
操作と見た目も楽しいアコーディオンメニューを作ることができました。
とりあえずアニメーションなしで、アニメーション付きは別途投稿します。

メニューには、ボタンとコンテナを使用します。
垂直コンテナ(下図で赤)の中にボタンと垂直コンテナ(下図でオレンジ)を交互に配置します。
大項目をボタンに表記し、垂直コンテナの中に小項目を表記したボタンを並べます。
↓こんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880604/cb7708d5-5f67-97f5-2071-871c897966f6.png)
ヘッダーのメニューボタンで赤枠の垂直コンテナを表示非表示させます。
単に表示非表示させるだけなら、コンテナのVisibleプロパティに変数を設定してメニューボタンのOnSelectプロパティで変数をtrue・falseに設定するだけです。

たとえば、上のメニューボタンのOnSelectプロパティに
```
Set(_menu,!_menu)
```
として、垂直コンテナ(オレンジ)のVisibleプロパティに変数_menuを設定すれば
ボタンを押すたびにtrueとfalseが入れ替わるので、メニューを表示したり非表示したり出来ます。
これと同じで、小項目のボタンを配置した、オレンジ色の垂直コンテナのVisibleプロパティに変数を設定し
大メニューのボタンのOnSelectプロパティに先ほどのコードを変数名だけ変更して入れれば、アコーディオンメニューが実現可能です。

大メニューのOnSelectプロパティに例えば
```
Set(_menu1,!_menu1);
Set(_menu2,false);
Set(_menu3,false);
Set(_menu4,false);
```
こんな感じで、押したメニュー以外をfalseにしておけば、押したメニューだけが開かれます。
![アコーディオンメニュー2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880604/b0766340-2e32-0a27-4425-8ce96b26a1ea.gif)

とりあえず今回はここまで
【超初心者ミス】ハッシュを設定してる際に『no implicit conversion of Symbol into Integer』がでてしまった

## 状況
hashを設定している際に上記のエラーが出てしまった。
`no implicit conversion of Symbol into Integer` を調べても原因がでてくるが解決法がピンとこない（試したが上手く行かない）

## 解決策
`return`で返り値設定しているか確認
下記の場合はhash値を指定しているメソッドの最後に **`hash`** をつけたら解決した
~~~ruby
def edit_hash
  hash = {}

  #メソッド内容

  hash  # ここの宣言が必要　"return hash"を省略した記述
end
~~~

## 何故だったのか
Rubyの返り値には`最後に評価された値が返る`という暗黙のルールがある。
そのため返り値を"return"で指定しているのだが、上のコードのように省略して書かれているので初学者は忘れやすい。（忘れた）

~~~ ruby
# retrunを設定していない
def edit_hash
  hash = {}
  hash[:name] = '鈴木'
  hash[:age] = 24
  hash[:gender] = 'female'
end

# result
female
~~~

~~~ ruby
# retrun（返り値）を設定
def edit_hash
  hash = {}
  hash[:name] = '鈴木'
  hash[:age] = 24
  hash[:gender] = 'female'
  hash 
end

# result
{:name=>"鈴木", :age=>24, :gender=>"female"}
~~~


## 反省
普通に初歩過ぎてビビった
最初にhashという変数を設定している時点で気づくべきだし、変数の中身確認すれば一発なのに…
超恥ずかしいけど今後見返すときの為、自戒の念をこめて全国公開
AWS DOP合格記(2024/10/31)

# はじめに
本記事は、AWS Certified DevOps Engineer - Professional （略称：DOP-C02）の合格記について、記載する。
筆者の私は、既にAWS DOPは取得しており、資格更新の合格記です。

# 試験結果
試験の結果は、下記の通りで、無事に合格でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252895/fd0bfa8f-2bd4-e62e-9943-da1c59b4ebb7.png)

# 勉強した内容について
勉強した内容としては、今回は1つのみで、下記サイトの問題集をひたすら解くだけで合格できました。

https://cloud-license.com/

# 受験時の所感
あとは、今回の受験で思ったことを、ダラダラとと書いていきます。

## ①受験前に思ったこと
前回のDOPより、問題文や選択肢の文章量増えてね？と思い、勉強時の負担が前試験より多くなったと感じた。

## ②受験中に思ったこと
問題数75問は、非常に多くないか。。。
問題数が多いと、途中で集中力が切れてしまう人間なので、なかなか大変だった。試験中にトイレ行ったり、仮眠を挟んだりして、なんとか問題を解いた感じでした。
次の更新時は、問題数50問にしてくれないかなと思った。。。

## ③資格の更新について
今回、資格有効期限の最終日に試験を受けたが、合格扱いになるまでのリードタイムがどのようになるのか不安でした。
AWS DOPの資格を更新することで、下位資格のDVAとSOAも併せて更新される。だが、合格判定のタイミングがずれると、DOPが一度失効扱いになる為、下位資格のDVAとSOAの更新ができなくなってしまうので、そこ大丈夫かなとずっと心配でした。
AWSさんが気を利かせてくれたおかげ？で、早めに合格判定をいただき下位資格も併せて更新することができました。
※ぎりぎりの受験は精神衛生上良くないのでやめたほうがいいです。

# 最後に
今回は資格の更新だったので、前資格で得た知見を活かすことができ、そこまで苦戦せずにいけました。
他資格もそろそろ有効期限を迎えるので、頑張って更新していきます。
ミニゲーム作成1　必要な要素を考えてみる (GapDush_1)

こんにちは．
↓前の記事

https://qiita.com/tdtiger/items/ffea5046cfc7c8c38767

今回から実際に，前回考案したミニゲーム，「GapDush」の作成をしていこうと思います．
初回は，ゲームに必要なものは何なのか，を考えていこうと思います．
何が必要なのかもわからずに手当たり次第に作っていくのも良くないと思いますので．

## 実際何が必要になるのか?
| 要素 | 用途 |
|:--|:--|
| プレイヤー  | 実際にユーザーが操作するキャラクター  |
| 地面  |  プレイヤーが立つオブジェクト |
| 天井 | 画面上部から迫ってくる，凹凸のあるオブジェクト |
| タイマー | 残り時間を表示する |
| 結果表示用キャンバス | ゲームクリア，あるいはゲームオーバーになった時に結果を表示するキャンバス |
| タイトル画面 | 一番最初に表示される画面 |
| ゲームマネージャー | ゲームのクリア判定などを行うための総括係 |

これくらいか...?

## それぞれに持たせなければならない機能
### プレイヤー
* キー入力に応じて左右に移動する
* しゃがみ機能(仮．つけないかも)

### 地面
* 特に無し．強いて言うならプレイヤー，天井との当たり判定か？

### 天井
* 画面上部から徐々に下がってきて，地面まで到達したら画面上部に戻る
* プレイヤーに接触した場合，ゲームオーバーと判定する
* 凹凸の位置を降下ごとに変化させる
    * これをどうするか．凹凸の位置を変えて壁を複数作るかと考えたが，パターンが少なくなってあまり面白くなさそう．
    * 平らな天井を1つ作っておいて，その下にさらに凸部分を確率的に生成するという方針で進めてみる．重くならないかが心配．
* 残り時間に応じて降下速度が変化する

### タイマー
* ゲーム開始時から1分を計測開始し，残り時間を画面に表示する
    * 表示するのは整数部分のみでいいと考えている
* 残り時間が0になればゲームクリアと判定する

### 結果表示用キャンバス
* ゲーム終了時，結果に応じて表示内容を変化させる
* リトライボタン，タイトルに戻るボタン

### タイトル画面
* ゲームスタートボタン，オプションボタン(仮．つけないかも)

### ゲームマネージャー
* ゲームのクリア判定等を受け取った時に，適切な処理に遷移させる
* BGM，効果音の再生等も任せたいが，サウンドマネージャーという別の管理役を作ったほうがいいのかも

## まとめ
一先ずはこれらの機能を実現することを目的に制作を進めていこうと思います．
その中で必要そうなものが新たに思いついたら適宜追加していく形にしていこうかと．

天井の凹凸の仕様，これで実現できるかが心配ですね．

(この記事，いや全部の記事休み時間にばっと書いてるので粗があるのは許して)
SPF設定入門：初心者のためのわかりやすいガイド

# SPF（Sender Policy Framework）とは？

SPFは、電子メールの送信元を検証するための仕組みです。簡単に言えば、「このドメインからのメールは、これらのサーバーから送信されます」という宣言をDNSレコードに記載することで、なりすましメールやスパムメールを防ぐ技術です。

# なぜSPF設定が重要なのか？

- なりすましメールの防止：自社ドメインを騙ったメールの送信を防ぎます。
- メールの信頼性向上：受信側がメールの正当性を確認できるようになります。
- メール到達率の向上：SPF設定により、正規のメールがスパムフィルターに引っかかりにくくなります。

# SPF設定の基本

SPF設定は、DNSのTXTレコードに特定の形式で記述します。基本的な形式は以下の通りです：

```
v=spf1 [メカニズム] [修飾子] -all
```

## 主なメカニズム

- a：ドメインのAレコードに登録されているIPアドレス
- mx：ドメインのMXレコードに登録されているメールサーバー
- ip4：特定のIPv4アドレス
- include：他のドメインのSPF設定を含める

## 修飾子

- +：許可（デフォルト）
- -：拒否
- ~：ソフトフェイル（許可するが警告を発する）
- ?：中立（判断を行わない）

# SPF設定の例

以下は、一般的なSPF設定の例です：

```
v=spf1 mx a ip4:192.0.2.0/24 include:_spf.google.com -all
```

この設定は以下を意味します：

- このドメインのMXレコードに登録されているサーバーからの送信を許可
- このドメインのAレコードに登録されているIPアドレスからの送信を許可
- 192.0.2.0/24のIPアドレス範囲からの送信を許可
- Googleのサーバー（G Suiteなどを使用している場合）からの送信を許可
- 上記以外のすべての送信元を拒否

# SPF設定の手順

1. 現在の送信元を確認：自社で使用しているメールサーバーやサービスを把握します。
2. SPFレコードの作成：上記の例を参考に、自社に適したSPFレコードを作成します。
3. DNSレコードの追加：作成したSPFレコードをドメインのDNS設定に追加します。
4. 設定の確認：オンラインのSPF確認ツールなどを使用して、設定が正しく反映されているか確認します。

# 注意点

- SPFレコードは1つのドメインにつき1つだけ設定できます。
- DNSの反映には時間がかかる場合があるので、設定後しばらく待つ必要があります。
- SPFレコードが長すぎると問題が発生する可能性があるため、できるだけシンプルに保つことが重要です。

# まとめ

SPF設定は、メールセキュリティの基本的な要素の一つです。適切に設定することで、なりすましメールのリスクを減らし、メールの信頼性を向上させることができます。初めは複雑に感じるかもしれませんが、基本的な仕組みを理解し、自社の環境に合わせて慎重に設定を行うことが重要です。定期的に設定を見直し、必要に応じて更新することも忘れずに行いましょう。
[ASP.NET] VSCode上でソリューション、プロジェクトの作成

Vscode上でターミナルを開き、以下のコマンドを実行する

```
cd <ソリューション作成先フォルダ>
dotnet new sln -o <ソリューション名>
cd <ソリューション名>
dotnet <テンプレート> -o <プロジェクト名> -f <バージョン>
dotnet sln add <プロジェクト名>
```
テンプレートにはmvcやrazorなどが指定できる。
詳しくは[こちら](https://learn.microsoft.com/ja-jp/dotnet/core/tools/dotnet-new)から

例）mvcテンプレートを使用する場合
```
dotnet mvc -o <プロジェクト名> -f net8.0
```
paizaラーニング問題集「3Dプリンタ」を解いてみた

https://paiza.jp/works/mondai/b_rank_skillcheck_archive/3d_printer

▼考え方

この問題を解くために私が考えた内容1.～3.を以下に示します。

[概要]
z軸方向の下から1段ずつ処理します。入力される立体データはリストxyzに格納します。X=3,Y=3,Z=3のときの1段分の入力データと座標系(x,y,z)の関係を示します。

▽入力データ
```
3 3 3
###
##.
#..
--
以下略
```
▽座標系(x,y,z)の関係
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3881331/01c1216e-e271-eb86-b5ab-6376aa9abab4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3881331/333e22b7-2e85-c801-efe2-8f388d795925.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3881331/aeae040a-fed5-f9c1-2a03-171d558d0d0f.png)

1. 1段分の入力データをリストxyzに格納します。区切り記号"--"は不要なのでpopします。

2. 1段分の入力データから、その段を正面から見たときの立体データを考えます。x軸方向に1つでも"#"が存在すれば正面から見えることになります。一方、（以下の図の赤点線矢印の部分のように）"#"が存在しない場合は正面から見えません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3881331/ee3cc10e-7322-dfdc-3336-9ef108b00c2c.png)

3. 考え方2で求めたものをすべて、リストoutputにまとめます。最後にoutputを出力します。

▼コード
```py
########## 処理0(準備) インプット,リストや変数定義 ###########

X,Y,Z = map(int,input().split())

# xyz: 1段分の、入力される立体データを格納するリスト
xyz = [[0]*Y]*(X+1)

# tmp: 1段分の、正面から見たときの立体データを格納するリスト
tmp = []

# output: 全段分の、正面から見たときの立体データを格納するリスト
output = []

########## 処理1  ###########

# 考え方 概要
for _ in range(Z):

    # 考え方1.
    for i in range(X+1):
        xyz[i] = list(input())
    xyz.pop()

    # 考え方2.
    for j in range(Y):
        if "#" in [xy_r[j] for xy_r in xyz]:
            tmp.append("#")
        else:
            tmp.append(".")

    # 考え方3.
    output.insert(0,tmp)
        
    xyz = [[0]*Y]*(X+1)
    tmp = []

for i in range(Z):
    print(*output[i],sep="")
```