OmniAICreator/Qiita-1.07M huggingface dataset:
Selenium等インストール不要のTinySeleniumVBAで起動済みEdgeをExcelから操作する方法

SeleniumBasicや、.NET Framework等、ツールをインストールする必要が無く、WebDriverの配置のみでVBAからブラウザを操作可能な「[TinySeleniumVBA](https://github.com/uezo/TinySeleniumVBA/)」を利用して、起動済みEdgeを操作する方法です。
TinySeleniumVBAのREADMEにも記載がありますが、
> インストール権限のない人でもすぐにブラウザ自動操作に取り掛かることができます

つまり、業務ツールなど管理者権限で設定を前もってしておかないといけない場合でも、設定（環境整備）無しにブラウザ操作の自動化が可能になります。

# 準備

https://github.com/uezo/TinySeleniumVBA

上記リポジトリからソースをダウンロードして、展開。以下4ファイルを対象のプロジェクトにインポートします。
- Capabilities.cls
- JsonConverter.cls
- WebDriver.cls
- WebElement.cls

プロジェクトの参照設定に以下を追加
- Microsoft Scripting Runtime

対応したWebDriverをダウンロードして、解凍
→ソースの中で、パスを指定するので分かりやすいところに置いておくと良いです

# 動作確認

```VBA
Sub TinySeleniumTest()
  Dim driver As New WebDriver
  ' 準備のところで用意し格納した対象のWebDriverを指定
  driver.Edge "hoge\msedgedriver.exe"
  driver.OpenBrowser
  driver.Navigate "https://www.google.co.jp/"
  driver.Shutdown
End Sub
```

もし、うまく実行できない場合は参照に、「Selenium Type Libraly」が含まれていることが原因かもしれませんので、チェックを外して再度試してみてください
（オブジェクト定義が重複してしまっていることが原因です）


# 起動済みブラウザにも適用
前回の記事で、remote-debugging-portを利用する方法を記載しました。
今回もそれを用います。
ショートカットを作成して簡単にremote-debugging-portを指定してEdgeを立ちあげられるように準備しておいてください（詳しい説明は前回の記事をご覧ください）

ソースを以下のように修正
```VBA
Sub TinySeleniumTest()
  Dim driver As New WebDriver
  driver.Edge "hoge\msedgedriver.exe"
  ' 以下4行を追加と修正
  Dim cap As Capabilities
  Set cap = driver.CreateCapabilities()
  cap.SetOption "debuggerAddress", "127.0.0.1:9222"
  driver.OpenBrowser cap

  driver.Navigate "https://www.google.co.jp/"
  driver.Shutdown
End Sub
```

これで、起動済みのEdgeをTinySeleniumVBAを用いて操作可能になります。
あとは適宜、DOMを取得するなどして良い感じに利用してください。
Koyebのデプロイ周りで原因不明のエラーが発生した時

### 環境情報
* アカウント：GitHub連携で作成
* Railsのサーバーとして利用


Koyebを使っていると指定したブランチのコミットの自動デプロイがある日突然反映されなくなったり、デプロイが終わってから原因不明のエラーで悩むことががたびたびあった。色々設定をいじっても解決なかったが、最終的に解決した。

Koyebは一定期間でセッションが切れる仕様になっているため、ビルドがおかしくなったらログアウト->再ログインで解消することがある

Koyebはまだユーザー数が少ないので同様の現象に遭遇した人のために共有
カロリーコントロールがマイブーム。食べる前に「打つ」。食欲と戦うLINEBOTを作りたい！

## 健康診断の結果で再検査になり続けているので一念発起　　　～運命の本との出会いが私を変えました。～

### ◆手ごわい「わがままボディ」になっていた、、、
私は、現在 小売業勤務で食品の仕入を担当しています。
売場担当から仕入れ担当に代わり、運動量が減ったうえに食べるのが仕事なので,,,と

結果：体重は10年で「10キロ」近く増量。

ここまでも　何度かその時々で流行るダイエット法にチャレンジすることも。
しかしなかなか続かず、逆に反動を重ねて増量が止まらぬ状態に。

![diet_before_man.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840234/8de986dc-320d-54b6-56e1-662b95e367d7.png)

### ◆ようやく自分に合う管理手法が見つかった。なんとか続けたい！
ある日　偶然出会った本に衝撃！　摂取カロリーを調整するだけで
体重が落とせる。ということが分かったのでした。
早速本の内容にそって摂取カロリーを記録するアプリで日々管理するようにしました。

結果：2か月で「7キロ」減りました。

今も維持していますが、時々お菓子を食べても記録しないなど
少し気が抜けたところが出てきちゃいました。

そこで食べた後の記録だけでなく、事前にカロリーを確認し判断できるようにしたい。
そう思って食材名を入れるとすぐにカロリーがわかるLINEBotを作成してみました。

## できたものはこちら
https://x.com/i/status/1822991830864326711


## 使用シーン「イメージ」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840234/cc2497e0-9ae8-f3c9-7628-a02a9f9d85c7.png)


- お昼ご飯は何にしよう？「A：てんぷら」「B：お刺身」「C：洋食セット」？
- ちょっと小腹へったけど　これ何カロリーだろ？
- この料理はカロリー高そう？使っているこの食材のせい？
  みたいなときは単語入力だけで確認できちゃいます。


## 使用ツール　
・[Make](https://www.make.com/en)
・Googleスプレッドシート
・[LINE Developers](https://developers.line.biz/ja/)


## 最終構造=シナリオ
ごくごくシンプルなものしかできず、、、、
スプレッドシートと条件分岐が１つだけでのシナリオです。
返事と一緒に「食べるのをやめたくなる画像」を出したいと思ってましたが、
うまくAPIと連動することができず、今後の課題にしたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840234/48cdae48-2551-8f78-3eaf-0d1ec5e98d9e.png)




## LINEBOT作成の過程
### ①食材・メニューを入力すると100gあたりの数字が返ってくるように
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840234/e7e7e32f-2b36-6572-125d-f5ad3ef1e9fd.png)



### ②　カロリー表示＋「カロリーが高いのか、低いのか」の一言が欲しい
味気ないので　ルーターで分岐をいれて、100gあたり300カロリーを基準に
応えに「低カロリー」「高カロリー」の文言を付け足すことにしました。

■分岐をいれる。カロリーが300カロリ以上で、「ハイ」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840234/90e71a2b-451d-57aa-0b77-077d8ab8f53d.png)


### ③ハイカロリーの場合、答えに「食べすぎ注意」の一言入れました。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840234/d6bdc80a-2f0d-745f-1333-6262f83835b4.png)

 
## 少しだけ工夫(？)したこと
食材は豊富に入れないと意味ない　半面、漢字やひらがな交じりだと
検索条件が一致しないので入力は全角カタカナで。答えに食材名をいれて返すこと。
スプレッドシートにそのように記載しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840234/3d1dea4d-83e7-7f91-14fe-304090e07cd2.png)

## 今後改良したいこと
①行動が変わる印象的な画像を加えたい
②100ｇあたりのカロリーしかないので、ガムとか飴とかの実際の適量がイメージできない。
③カロリー以外の商材ごとのエネルギーも追記したい。(塩分・糖分・タンパク質など)
④検索条件は完全一致ではなくすれば、カタカナではなくひらがなや漢字でもいけるのか？

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

## はじめてのLINEBOT作成でしたが、継続して勉強したい！
最初は初期設定と作業の手順を覚えることでいっぱいいっぱいに感じましたが
シナリオの流れ・意味が徐々に理解できてからはやりたいことも少しずつ湧いてきました。

リマインダー的な機能であったり、Pythonなどのコードも活用できるようになれば
もっと、色々なシーンで活用できるようなものが作れそうだと思いました。

あと、日々こういうツールや機能欲しいなぁとか、考えておくことも大切で、
それがあってアウトプットを作ろうとするモチベーションになるんだろうなと
改めて感じました。日ごろから周りの方のお困りごとにも耳を傾けようと思います。
【2024/8/12】インフラ勉強日記

## 勉強した内容

### コマンド一覧

| コマンド | 内容 |
|----------|----------|
| Ctrl + b    | 後方1文字   |
| Ctrl + f    | 前方1文字   |
| Ctrl + a    | 行頭   |
| Ctrl + e    | 行末   |
| Ctrl + k    | カーソル位置から行末まで削除   |
| Ctrl + u    | カーソル位置から行頭まで削除   |
| Ctrl + y    | 削除した内容を貼り付ける   |
| Ctrl + s    |画面表示をロックする   |
| Ctrl + q    |画面表示のロックを解除する   |
| Ctrl + l    |画面を消去する   |

### マウント
- ディスクをディレクトリとしてくっつける手法

:::note info
Windowsとの違い
Linuxでは何台のディスクがあろうが、システム全体で１つのディレクトリツリーしか持たない
:::

### 各ディレクトリの役割

#### /bin
- 一般ユーザー及び管理者ユーザーの両方が利用するコマンドの、実行ファイルを置くためのディレクトリ
- Linuxシステムの動作に最低限必要な、重要度の高いコマンドが格納されている

#### /dev
- デバイスファイルを格納するディレクトリ
- ディスクやキーボードなどのハードウェアをファイルとして扱えるように用意された、特殊なファイル

#### /etc
- 設定ファイルを置くためのディレクトリ
- アプリだけでなく、Linux自体の設定に関わるファイルもこのディレクトリにある

#### /home
- ユーザごとに割り当てられる。ホームディレクトリ(~)が配置されるディレクトリ

#### /sbin
- /binと似ており、実行ファイルを置くためのディレクトリ
- 管理者ユーザ向けのコマンドが置かれてる

#### /tmp
- 一時的なファイル（テンポラリファイル）を置くためのディレクトリ
- アプリの実行中に、作業途中の結果などを一時的にファイルとして保存する

:::note warn
ファイルの保存に注意
定期的に削除する設定となっているディストリビューションが多いため
:::

#### /usr
- 各種アプリと、それに付随するファイルを置くためのディレクトリ
- サブディレクトリとしてbinやsbin、etcなどを持ち、内部にルートディレクトリ配下と似た構造を持つ

#### /var
- 変化するデータを置くためのディレクトリ
- アプリが動作する上で作成されたデータやログ、電子メールなどが格納される

### pwd
- カレントディレクトリ（現在位置）を表示する
:::note info
明示的にパスを表記するには
./ファイル名　と書くこともできる
:::

### パス名展開で使われる記号
| コマンド | 内容 |
|----------|----------|
| *    | 任意の文字列   |
| ?    | 任意の1文字   |

lsコマンドのオプション
- -l：ファイル属性などの詳細情報を同時に表示する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3857754/c1a047d0-7985-3bb7-1b04-84de8fbc7db8.png)
- -a：.で始まるファイルを表示する
- -F：ファイル種別を表示する

| 種類 | 記号 |
|----------|----------|
| 通常ファイル    | なし   |
| ディレクトリ    | /   |
| 実行可能ファイル    | *   |
| シンボリックリンク    | @   |

## 本日の参考書
https://www.amazon.co.jp/%E6%96%B0%E3%81%97%E3%81%84Linux%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E7%AC%AC%EF%BC%92%E7%89%88-%E4%B8%89%E5%AE%85-%E8%8B%B1%E6%98%8E-ebook/dp/B0CW1MW6HB/ref=sr_1_1?crid=216E68GPE5H9E&dib=eyJ2IjoiMSJ9.X04RHOOx-dU_OfHyidFOdTHPNsLDE5Tq1mP93h4lW2Ii099O3dFpcF22XM3ylOvWq5CZ1iykLJ-xVyG3wwRgxg.SQs-4elVvcbM5nezgxry0rN7bY-HOsbRDf2KaP_36IA&dib_tag=se&keywords=%E6%96%B0%E3%81%97%E3%81%84linux%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8+%E7%AC%AC%EF%BC%92%E7%89%88&qid=1723213361&sprefix=%E6%96%B0%E3%81%97%E3%81%84Linux%2Caps%2C238&sr=8-1
paramsのできること

## 初めに

疑問に思ったことや上手くいかなかったことのアウトプットをしています。
自分なりの理解でアウトプットしていきます。初学者なので誤りもあると思います。
その際はご指摘いただけると幸いです。

## paramsのできること
一時的に送る、もしくは受け取るデータの一時的な格納庫になる。コントローラ内で簡単にデータにアクセスしやすくなる。

## 具体的には
フォームから送信されたデータはPOSTリクエストの一部としてparamsに格納され、
URLのクエリパラメータはGETリクエストの一部としてparamsに格納される。

## クエリパラメータとは？
URLの一部として指定される追加情報のこと。
通常、URLの?の後に「key=value」の形式で書かれる。
複数のパラメータの場合は&で区切る。
主にGETリクエストで使われて、サーバーに何らかの情報を伝えるために利用される。
特定のデータの取得、検索結果の絞り込みが可能。

## 最後に
paramsは今までformメソッドでしか使った記憶がなかったので、
POSTリクエストでしか使わないと思ってたのでGETリクエストでも使うと知り
衝撃を受けました。今回学んだことだけでなく、他のことにも使えたりするのかと疑問に思い調べました。
ANGEL Calendarを開催します！

こんにちは、ふくちと申します。

私は2024年7月~10月でAWSさんが主催する研修「ANGEL Dojo」に参加しています。

https://aws.amazon.com/jp/blogs/psa/2024-07-angel-dojo-kickoff/

この研修は、参加企業から選出された4〜6名のメンバーでチームを組み、3ヶ月間でサービスの企画から開発まで行うトレーニングです。

参加企業としては、パートナー企業18社・ユーザー企業12社の計30社(102名)となっています。
チーム構成としては、1社だけのところもあれば、複数社合同のところもあります。

そんなANGEL Dojoですが、「せっかくこれだけのエンジニアが集まっているのだから、普通に研修を進めていくだけじゃ勿体無い！」ということで、アドベントカレンダーならぬ**ANGEL Calendar**を始めることにしました！8888〜

# 開催概要
- 開催内容：1日ごとに1人ずつブログ記事を投稿していく(普通のアドベントカレンダーと同じ形式)
- 開催形式：[2024-ANGEL-Dojo Organization](https://qiita.com/organizations/2024-angel-dojo)にて情報発信
- 開催期間：~~8/20(火)~9/20(金)~~ → 9/1(日)~9/30(月)※
- 開催目的：アウトプットの機会創出、コミュニティ内でエンジニア同士の交流を活発化すること
- 参加者　：2024年ANGEL Dojo参加者
- テーマ　：技術に関わるものであればなんでもOK！

(本当はQiitaのアドベントカレンダー機能を使って実施しようと思っていたのですが、どうやら11〜12月にしか作成できないようで…やむを得ずOrganization機能を用いることにしました)

色んな企業のエンジニアが集って情報発信をしていく予定なので、様々な話を聞けるのが楽しみです！

ご興味がある方は是非ご覧ください！

※開催期間が変更となりました！
詳しくは[はらしまさんの記事](https://qiita.com/kharashima/items/50249da74d01c19ad989#_reference-635eff9a019d40b6b24a)をご確認ください！
【Obsidian】テンプレートで前日や翌日の日付を入力する方法

## プラグインをインストールする

Templater というコミュニティプラグインをインストールし、有効化します。

https://github.com/SilentVoid13/Templater?tab=readme-ov-file

## テンプレートファイルを作成する

前日や翌日の日付を入力するには Templater の [tp.date](https://silentvoid13.github.io/Templater/internal-functions/internal-modules/date-module.html) を使用します。

```md:template.md
<<　[[<% tp.date.yesterday("YYYY-M-D") %> ]]　|　[[<% tp.date.tomorrow("YYYY-M-D") %>]]　>>
```

テンプレートを使用すると以下のように表示されます。

```md
<<　[[2024-8-11 ]]　|　[[2024-8-13]]　>>
```

デイリーノートコアプラグインなどでファイルを作成した際に動作させたい場合には設定の「Trigger Templater on new file creation」を有効にする必要があります。

![画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/c2ce71ab-1146-b6e9-0993-75a4233441c4.png)
特定のtsxファイルを起点にimportしているファイルを一覧で出力したい

とある都合でNext.jsの各pageでimportしているtsxファイルを一覧で抽出したかったので、同僚に教えてもらった`dependency-cruiser`を使ってみました。
CLIでは割とすぐ行けたのですが、APIではあれれ？とハマったので記事にしてみました。

## インストール
[dependency-cruiserのGithub](https://github.com/sverweij/dependency-cruiser?tab=readme-ov-file#how-do-i-use-it)を見るとサクッと入れられます。
`--init`オプションで設定ファイルも簡単に出力してくれました。
```bash
> pnpm install -d dependency-cruiser
> npx depcruise --init
✔ Where do your source files live? … src
✔ Do your test files live in a separate folder? … no
✔ Looks like you're using a 'tsconfig.json'. Use that? … yes
✔ Full path to your 'tsconfig.json › tsconfig.json
✔ Also regard TypeScript dependencies that exist only before compilation? … yes

  ✔ Successfully created '.dependency-cruiser.js'
```

## CLIで出力してみる
ためしにCLIで出力をしてみました。
Githubの手順に従ってdotを使用して出力をしてみます。dot言語というもので依存関係を出力し、GraphViz dotを使用して可視化してみます。

```bash
brew install graphviz
npx depcruise src/app/page.tsx --include-only "^src" --output-type dot | dot -T svg > dependency-graph.svg
```
以下のように出力できました。（例のために今回は簡単なサンプルで出力しています）

![スクリーンショット 2024-08-11 22.51.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7188/295da330-50b7-191d-5018-a3b429fc5840.png)

* `--include-only`
    * 特定のフォルダ配下のみを対象とするオプション
    * これがないと例えば"node_modules"フォルダなど、実行したディレクトリ配下の依存関係を全て出力してくれます
* `--output-type`
    * 依存関係等をどのように出力するかのオプション
    * `text`なども指定できます
    * 何もしないと、バリデーション結果だけが出力されます

ただ、このままだとhooksのtsファイルも出力されてしまいます。今回はtsxファイルだけを取り出したかったのと、グラフではなく、ファイル一覧が出力したかったのでAPIを使用してみることにしました。

## APIを使ってみる

show-dependency-tsx.tsのようなファイルを作って実行できるようにします。

```ts:show-dependency-tsx.ts
import { cruise } from 'dependency-cruiser'
import ruleSet from './.dependency-cruiser' // tsファイルで読み込みたかったので、.dependency-cruiserファイルもtsに変更しました

const startFile = 'src/app/page.tsx'

const { output } = await cruise(
  [startFile],
  {
    includeOnly: ['^src'],
    ruleSet, // ここ重要！作成した設定ファイルを読み込まないと情報が出てこない
  },
)

if (typeof output === 'string') {
  console.error(output)
  process.exit(1)
}
const tsxFiles = output.modules
  .filter((module) => module.source.endsWith('.tsx'))
  .map((module) => module.source)

console.log('tsx files:')
tsxFiles.forEach((file) => console.log(file))

```

tsxを使って実行します
```bash
> npx tsx show-dependency-tsx.ts
Used TSX files:
src/app/page.tsx
src/components/ChildComponent.tsx
src/components/descendants/DescendantCompoent.tsx
```

これでgraphを使用せず、一覧を取得できるようになりました🎉
Bashやシェルスクリプトで使用される"$()"と"${}"の違い

## "$()"の場合
**コマンド置き換え** と言われ、内部でコマンドを実行し、その結果を展開する。

```bash
echo "Today is $(date)"
# "Today is Mon Aug 12 23:45:37 JST 2024" のように表示される
```

## "${}"の場合
変数を参照するために使用される構文。中括弧は省略可能な場合もある。明示的に変数と分かるようにするのも可。
```bash
name="World"
echo "Hello, ${name}!"
# "Hello, World!"
```
起動済みのEdgeに対して、VBAから操作する方法(Selenium Basic)

前回投稿した記事では、新しくEdgeを立ちあげて操作する方法となり、
すでに表示しているブラウザに対しては操作が出来ません。

今回の記事では、Webサービスでログインするところまでは、手動で操作しその先を自動化したいときなどに利用できる方法になります。

デバッグ機能を提供するためのリモートデバッグポートを指定し、そこから接続する方法となります。

# 準備
前回の記事同様に
1. Microsoft Edge WebDriver
1. Selenium
1. .NET Framework
を用意します。


## 「remote debugging port」を指定してブラウザを立ちあげる
1. Edgeのショートカットを作成
1. プロパティを立ちあげる
1. リンク先を以下のように設定


```
"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" -remote-debugging-port=9222
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779836/0b7a6e6e-6879-06f4-c04c-2e55ba173edb.png)

作成したショートカットからEdgeを立ちあげて、コマンドプロンプトでnetstatを叩いてport9222でリスニング状態であることを確認します。

```cmd
>netstat -ano | findstr :9222
  TCP         127.0.0.1:9222         0.0.0.0:0              LISTENING       5944
```

もし、正しくポートが開いていない場合はEdgeの設定で以下2つをOFFにしてみましょう。
- スタートアップブースト
- Microsoft Edgeが終了しても...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779836/2d1cfc44-7df7-1813-e5ec-24dac27afc4a.png)

## 動作確認
```VAB
Sub BrowserTest()
  Dim driver As New Selenium.WebDriver
  ' リモートデバッグポートを指定
  driver.SetCapability "ms:edgeOptions", "{""debuggerAddress"":""127.0.0.1:9222""}"
  
  driver.Start "edge"
  driver.Get "https://google.com/"
  driver.Close
  Set driver = Nothing
End Sub
```

次回、TinySelenium（Seleniumとか.NET Frameworkなどのインストールが不要）を利用して、起動済みブラウザを操作する方法を（検証中なので実現できれば）書きます。
よくあるディレクトリ構造をマークダウンで書く方法

技術ブログでよく見かけるこれ、マークダウンでどうやって書かれているのか気になったことはありませんか？という備忘録。

```
.
├── Package.swift
└── Sources
    └── main.swift
```

ディレクトリ構造をマークダウンで表現する際に使用する「├──」「└──」などの記号、直接キーボードで打つことはできない。正確には、エスケープシーケンスや、Altコードを使った直接入力の方法はある。ただ、Unicode（例えば、「├」　の Unicode である U+251C）を直接コードブロックに入力してもそのまま表示されるだけで、記号には変換されない。
よって、現実的な方法として、一瞬で書きたいなら既存のもの（上のやつ）をコピー&ペースト。カスタマイズしてより詳細を書き込みたいなら変換ツールの使用（↓）。手元のディレクトリを出力したいなら `brew install tree` して `tree` コマンドで出る。

https://tree.nathanfriend.io/?s=(%27options!(%27fancy5~fullPath!false~trailingSlash5~rootDot5)~6(%276%27Edit%20me%20to%20generate4a0nic7tre7*diagram%27%3A3*%3A%7D4Use%20indentation0to%20indicat7fil7and3folder3nesting.02You%20can%20even32us7*2markdown3*2bullets%27%3A%27)~version!%271%27)*%20%2004*2-%2030*4%5Cn*5!true6source!7e3%017654320
Dataverse テーブルの取得で 500 エラーに対処してみた

Power Automate クラウドフローで Dataverse テーブルからデータを一覧取得しようとした際 「Internal Server Error」（500 エラー）が突然発生して、えっー！？ ってなったので、調査した結果と対策を備忘録的にネタにしていきます。

なお、対策案は「当方が試してうまくいった」内容になります。皆さんが同様の状況に陥った際、同じ対策で改善するとは断言できませんが・・・「よくわからないエラーになったら試してみるコト」ぐらいで記憶の片隅に置いといていただけると、いつか（自分を含む）誰かが救われるかもしれない、と思って続けます。

# 発生した事象、あるいは遭遇したエラー
Power Platform 環境へ Dataverse を作成すると、自動で準備されるマネージドレイヤーのテーブルから、クラウドフローでデータを取得しようとしたんです。アクションを少しずつ追加しながら、動作確認しながら作り進めていった途中で、以下のエラーが発生しました。

![01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/5123f9d0-f2d0-5741-073c-92668914ea25.jpeg)

> InternalServerError. Encountered internal server error. The tracking Id is 'xxxxxx'.

なお、フローの左上に表示されたエラーは「Network Error」。

クラウドフローでネットワークエラー・・・って、もしかしてインシデント発生！？と焦って管理センターの正常性レポート等を確認しましたがオールグリーンでした。

詳細は割愛しますが、アクションが 3～4個の時は正常に動作していたのです。その後、後続の処理を追加した後に実行したら突然エラーとなったので「なんでやねん！」ってなりました汗。

# エラーが発生したアクション
Microsoft Dataverse コネクターの「選択された環境から行を一覧にする」です。

https://learn.microsoft.com/ja-jp/connectors/commondataserviceforapps/?WT.mc_id=%3Fwt.mc_id%3DDX-MVP-5004053#%E9%81%B8%E6%8A%9E%E3%81%95%E3%82%8C%E3%81%9F%E7%92%B0%E5%A2%83%E3%81%8B%E3%82%89%E8%A1%8C%E3%82%92%E4%B8%80%E8%A6%A7%E3%81%AB%E3%81%99%E3%82%8B

環境指定して、行のフィルターに簡単な OData クエリ書いてあるだけなんですけどねぇ。

## Copilot さんに質問してみた
検索しても「コレかな？」という内容に出会わなかったので、Copilot さんに聞いてみました。

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/8c8ef5ff-47b7-1214-8e6a-cee8743189a3.png)

ふーむ・・・ピンとくる内容が無いですね。途中まで意図した動作をしていたのに、突然エラーになったので「ひと晩寝かせてみるか」と思い、その日はこれ以上の調査をせずに終了しました。

## ひと晩寝かせてみた
翌日、再度試してみましたが、同じアクションで 500 エラーになってしまいます。ブラウザーのキャッシュを削除したり、フローをエクスポートしてインポートしなおしてみたり、色々試してみましたが、エラーになる環境では全く改善される気配がありません。テスト実行だけでなく、1回保存して、一覧画面に戻ってから実行しても状況は変わらずエラー。

なんでやねん！

と思いつつ・・・。
「同じアクションで必ずエラーになる」というコトは、そのアクションが怪しい、という仮説がたちますよね。なので、該当アクションで何かやれないか考えてみたのです。

# うまく行った対策案
既に［行のフィルター］を仕込んだ状態だったので、取得する行数をこれ以上減らすのは避けたい、と判断。

そこで、取得する列数を減らしてみようと思いました。

該当アクションの［列を選択する］にパラメーターを指定してみます。

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/4edeb363-e0ef-4d8c-67bb-0c693a4552fb.png)

さて、テストしてみましょう！

![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/77ce2103-5fcb-6697-23fc-e78eb673af65.png)

いったぁ！！動いたぁ！！！
おめでとうございます、ありがとうございます。

## 関連するかもしれない情報
今回、話題にしているアクションで、Internal Server Error（500 エラー）とは異なり BadRequest エラーになるパターンもあります。

![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/1b55cac7-5198-e773-4164-6270aa22f610.png)

> BadRequest. Http request failed as there is an error: 'Cannot write more bytes to the buffer than the configured maximum buffer size: 104857600.'.

「単一のトリガーまたはアクション - 入力または出力の最大サイズ」が 104,857,600 バイト(105 MB) になっており、それを超過するやり取りがエラーになる、というコトですね。

https://learn.microsoft.com/ja-jp/azure/logic-apps/logic-apps-limits-and-config?tabs=consumption&WT.mc_id=%3Fwt.mc_id%3DDX-MVP-5004053#workflow-definition-limits

このエラーが発生した際も、応答のやり取り総量をチューニングする必要があります。

# 結び
冒頭にも明記してありますが、同様のエラーが発生した際、同じ対策方法で必ず改善するとは断言できません。ただ、1回試してみても良い操作だと思いますので、頭の片隅にあって、いつか誰かのお役に少しでも立てれば幸いです。

それでは、皆さま。素晴らしい Power Platform Life を！
XAMPPでMySQLのポート番号を変更してphpMyAdminにログイン出来なくなったとき

色々と調べてやっと解決出来たが、無駄に時間を費やしてしまったため、自分の備忘録用

XAMPPでMySQLのポート番号を変更してphpMyAdminにログインを拒否された時に、
以下のサイトに解決方法が記載されていた。
https://itsakura.com/xampp-port

以下のファイルにある27行目の127.0.0.1の後に自分で書き換えたポート番号を追記したら無事開けた。
\xampp\phpMyAdmin\config.inc.php
$cfg['Servers'][$i]['host'] = '127.0.0.1:独自につけたポート番号';
AtCoder緑色になりました

## AtCoder

2024年1月から始めたAtCoderで緑色になったので、いわゆる入色記事・色変記事を書いてみたいと思います。

![AtCoder rating graph](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13070/a25bf085-26bb-163f-b536-d630c9eb1137.png)

:::note info
記事を書くのが遅くなったため、緑色からまた茶色に戻っていますが、まあそれはそれ...
:::

## 始めたきっかけ

* 「[世界一流エンジニアの思考法](https://www.amazon.co.jp/dp/4163917683)」で、「一流エンジニアは基礎がしっかりしている」と書いてあり、アルゴリズム的なことをしっかり学んでみようと思った
  * 「米国のテック企業は入社時にコーディングテストがあり、エンジニアとして働くにはAtCoder換算で茶色〜緑色くらいは必要」とのことなので、そのレベルには達しておこうと思った
* 会社の若手社員さんが始めていて、面白そうだった
  * 休憩時間に鉄則本（競技プログラミングの鉄則）を読んでいて、勉強熱心だなあと思ってちらっと読ませてもらったところ興味を引く内容だった
* ポッドキャスト rebuild.fmで話題に出ていた [Rebuild: 352: There's a Fifth Way (naoya)](https://rebuild.fm/352/)
  * Rebuild	 はよく聞いていて影響を受けやすいのです...(影響でメカニカルキーボードも買ったり)




## 方針

* 言語はPythonにした
  * 仕事では主にSwiftを書いていますが、Swiftは競技プログラミングではマイナーなのと、仕事とは別の言語を使いたいという理由で不採用
  * AtCoderはPythonで参加している人が多いので、過去問の解説などが充実している
  * 機械学習関連で以前触ったことがあるので、もう少し詳しく使ってみたい & 将来役に立ちそう
* はじめはレーティングなどを気にせず「参加する」ことを目標にした
  * ローカルにPython環境を整えて、A問題・B問題レベルまでやった程度
  * 数回参加してみて、なんとなく緑色まで行けそうな感触があったので、いったん緑色到達までは続けることにした


## 参考書

お世話になった本を書いておきます。競技プログラミング関連は、わかりやすい本が出版されていて、これから入門する方にはいい環境だと思います。

#### アルゴリズム的思考力が身につく！ プログラミングコンテストAtCoder入門 [Amazon](https://www.amazon.co.jp/dp/B0B6MLQ43C/)

AtCoder公認本だけあって、始め方からの解説が丁寧で良いです。アカウントの作り方〜数種類のアルゴリズムの紹介、過去問と解説もあり、基本的なところはこれ一冊でいけるのではと思います。


#### 最速で緑になる 基礎・典型50問詳細解説 [Amazon](https://www.amazon.co.jp/dp/B0BBB7RKTP/)

過去問を解くにあたって、「どうせなら頻出問題から着手するのが効率がよいだろう」ということで、こちらの本を参考にさせていただいた。
図入りの解説、Pythonでの回答例もあり、問題集として良いと思います。


#### 競技プログラミングの鉄則 [Amazon](https://www.amazon.co.jp/dp/B0BDZGDM9J/)

上記二冊を読み終わり、もう少しアルゴリズムの種類を掴んでおきたいときに読んだ本。アルゴリズムの説明が図解付きでとても丁寧。すごく良い本だと思います。入門者には難しいアルゴリズムもあるので、そこはスキップしても良いかもです。


## 感想

* 緑色到達は1年くらいかかると思っていたので、予想よりも早く到達できた
  * 大学が情報学部だったので、その点で有利だったのかもしれない（とはいえ、学生だったのはだいぶ前の話ですが）
* 企業がコーディングテストを実施する理由が何となくわかった
  * 必ずしも「競技プログラミングができる == 仕事のプログラミングができる」 ではないと思う。しかし、デバッグ速度が早くなったり、実行速度に気をつけるようになる効果はあると思った
  * DBのindexは、なぜSELECTが速くなるのかとか INSERTは遅くなるのかとか、想像がつきやすくなるのでは
* そういう意味でも、会社の若手社員さんたちには競技プログラミングやってもらいたい
  * 茶色は「[学生や派遣社員などが茶色のレーティングを持っていたら、とても喜ばしいです](https://info.atcoder.jp/utilize/jobs/rating-business-impact)」レベルとのことなので、みんなそのくらいできると良いですよね
* 次の目標は迷い中
  * 緑色(レート800)の次の水色(レート1200)到達は相当難しく感じられる
orderとpluckを併用する時には記述する順番に気をつけようというお話

あまり実用的なケースではないが、最新の一件のデータを取りたいがカラムはpluckしたい時に、クエリの呼び出し順に気をつけとかないと思うようなデータが取れないよというお話


# 試したコード
```
last_tweet = User.pluck(:userName, :tweetContent).order(created_at: "DESC").first
```
※コードは実際に使ったものを改変しています

# 発生したエラー

```
NoMethodError (undefined method `order' for an instance of Array):
```

# 解決策
```
last_tweet = User.order(created_at: "DESC").pluck(:userName, :tweetContent).first
```


シンプルにorderで並び替えてからpluckすれば仕様を満たすことができる
pluckしてからorderしようとしても該当のカラム(created_at)がないので並び替えることができない
【学習記録　2024-08-12】　　JavaScript

## 教材を使用する
Udemy「超JavaScript完全ガイド 2024」

## 学習内容
### 学習時間：3h
- Proxyを使ってオブジェクトの動きを自由に変更する方法
- ReflectAPIを使って統一感のあるコードを書く方法
- シンボルを使って絶対に被らない値を作る方法
- プロパティ名にシンボルを使用する方法
- Well-Knownシンボルを使用して言語を拡張する方法
- for-ofの仕組み
- ジェネレータ関数を使って簡潔にイテレーターを作成する方法
- タグ付きテンプレート

#### 学習メモ
量が多すぎるので省略。

## 所感
　今回は他の開発者を手助けする技術について学習しました。使用頻度は低いとのことでしたのでざっくりとした理解になりましたが、もしものために頭の片隅に入れておきたいと思います！
PlatformIO にライブラリを登録する

### はじめに
Arduino で開発をするとき、まず最初に自作のタスク風ライブラリやボタンライブラリをプロジェクトにコピーするのですが、この「手作業」をやめてライブラリからインストールできないかな、と思い、調べてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/d19e2be4-b3b5-9a13-6c88-7f8901422730.png)

### 登録作業
結論から言うと登録作業は割と簡単で、むしろ審査もなしで登録即反映されたのには驚きました。

基本的には[こちらの記事](https://qiita.com/zakkied/items/34954d0e6f0f697cc872)にある通りなので省略しますが、ここや[公式サイト](https://docs.platformio.org/en/latest/manifests/library-json/index.html)に載っていなかった部分を補足したいと思います。

+ ログイン&公開
ログインは**GitHubアカウントではなくPlatformIOアカウント**です。特に2回目以降は勘違いしがちなので注意。
```
> pio account login
  :
> pio package <folder path>
```
　
+ 複数キーワードの登録
キーワードは
``` "keywords": "button,doubleclick,release,hold,chattering,debounce", ```
のように、カンマ区切りで並べてダブルクオーテーションで囲めばOKです。
　
+ ChangeLogの追加
library.jsonにはChangelogを記入する場所がなかったのですが、これはGitHub側でReleasesを作成することによりChangelogに反映されるようです。

### Releaseの作成
PlatformIOライブラリへの登録だけであれば不要ですが、Changelogに反映されるようにReleaseを作ってみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/e48be2c1-40ae-2952-9b4a-bc9834d0c12a.png)

+ PlatformIOに登録したコミットにタグをつける
先ほど登録したGitHubリポジトリの該当コミットにタグをつけます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/05bb089e-9928-6937-a598-dc72be98d680.png)


+ Create a new releaseをクリック
先ほど登録したGitHubリポジトリの右側にある**Create a new release**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/80805bc8-c414-5f83-71f7-62ae325bee65.png)
Releaseを追加したい場合はBranchの横にある **Tags** を選択し、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/598ba6b5-3780-e74b-0a81-ee98939fc286.png)
Create release を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/30492e0a-04b7-619f-6ee4-044c7492f2ec.png)

+ タグを選択しReleaseを作成
先ほど作成したタグを選択し、Describe this releaseのところにリリース内容を書き込みます。これがChangelogに表示される内容となります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/bdfb58e3-562e-76cb-0faa-52ce8f68adfd.png) 

+ バイナリを追加
リリースを書きこんだすぐ下に、[登録作業](https://qiita.com/zakkied/items/34954d0e6f0f697cc872)の時に作成した **.tar.gz** をドラッグ＆ドロップします。
登録作業はPlatformIO CLIから行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/a2bf85d7-fceb-bb21-bddf-33a2908967ea.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/b1ebf308-687d-6478-4180-d30ea130e69c.png)

+ 登録
Publish releaseボタンを押すとRereaseが登録されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/d61bbbcb-887e-f8cb-14d1-33869c429c1a.png)


### 確認
変更からしばらくすると、PlatformIOのChangelogに先ほど作成したReleaseの内容が反映されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/e48be2c1-40ae-2952-9b4a-bc9834d0c12a.png)

以上、おつかれさまでした。

### 付録

参考記事：[PlatformIO のライブラリを登録してみた](https://qiita.com/zakkied/items/34954d0e6f0f697cc872)

今回登録したライブラリ
[OpenButton](https://github.com/misawa2048/OpenButton/tree/master)：複数ボタンのRelease/DoubleClick/Hold 等を取得可能
[OpenTSS](https://github.com/misawa2048/OpenTSS):タスクを用いずタスクライクな時分割処理が可能
【AWS】Batch作成のAutoscalinggroupのテンプレートヴァージョンがデフォルトに戻ってしまう場合の対応方法

# 概要
AWS Batch作成のAutoscalinggroupのテンプレートヴァージョンがデフォルトに戻ってしまう現象に遭遇しました。Batch Compute環境に起動テンプレートを書く際に、注意点があることがわかったので紹介します。

# 事象と解決法
先日、以下の記事に記載したようなテンプレートでAWS Batchを作成しました。

https://qiita.com/Ryo-0131/items/b99a72952a672351ace2

すると、AWS Batchからジョブが発行されてAutoscalinggroupが動くたびに、その「起動テンプレート」の「ヴァージョン」がデフォルトヴァージョン(1)に戻ってしまう現象に遭遇しました。つまり、例えばインスタンスタイプを変えるなどしてヴァージョン2を作成、Autoscalinggroupでヴァージョン2を選んでも、一度Autoscalingを使用すると、ヴァージョン2にした更新情報は失われ、デフォルト(1)に戻ってしまうのです。

その原因は、`BatchComputeEnvironment`の`LaunchTemplate`の`Version`にありました。
ここで、デフォルト以外のものを指定する必要があったのです。

```yaml
  BatchComputeEnvironment:
    Type: 'AWS::Batch::ComputeEnvironment'
    Properties:
      # 略 #
      ComputeResources:
        # 略 #
        LaunchTemplate:
          LaunchTemplateName: "EC2Template_sample"
          Version: $Latest
```

ここになにも指定していない場合、管理コンソールの`BatchComputeEnvironment`詳細を確認すると起動テンプレートは「 `-` 」と表示されているのですが、これ実はデフォルトが適用されています。私は「 `-` 」とあるので、Autoscalinggroupの方で設定したヴァージョンが生きるのだと勘違いしていました。

挙動を確認するに、`BatchComputeEnvironment`で指定されたテンプレートのヴァージョンが、Autoscalinggroupで指定されているテンプレートのヴァージョンを上書きする形になっているようです。指定がない場合は、デフォルトのヴァージョンで上書きされるわけです。

そもそもこのAutoscalinggroupは`BatchComputeEnvironment`作成時に自動で生成されたものであるので、`BatchComputeEnvironment`配下のリソースというイメージになるのだと思います。

「Autoscalinggroupは既に別の起動テンプレートを選択してしまっている！」という場合でデフォルトバージョン以外を適用したい場合は、一度`BatchComputeEnvironment`から作成し直して、上記yaml例のようにテンプレートヴァージョンを指定する形を加える必要があります。ちなみに、ここはバージョン番号、`$Default`、`$Latest`のいずれかを選ぶ必要があります。

これにより、デフォルトのヴァージョンに戻ってしまう現象が解決しました。


以下、AWS公式ドキュメントに近しいものがあったので紹介しておきます。

https://docs.aws.amazon.com/ja_jp/batch/latest/userguide/compute_environments.html

> これらのルールに従うと、インフラストラクチャの更新をトリガーする更新により、AMI ID が再選択されます。起動テンプレートversionの (launchTemplate)設定が$Latestまたは$Defaultに設定されている場合、launchTemplateを更新していない場合でも、インフラストラクチャの更新時に起動テンプレートの最新バージョンまたはデフォルトバージョンが評価されます。

AWS BatchとAutoscalinggroup、起動テンプレートの関連性についてはあまり記事が見当たらず、体験談ベースのようなものになってしまいました。見識・経験のある方でなにかお気付きのことがあればぜひコメントで教えてください！
CommandLineToolsのXcodeバージョンを変更する方法。

## はじめに
fastlaneを使用してアプリをAppStoreConnectにアップロードしたとき、CommandLineToolsのXcodeのバージョンが原因でエラーが発生してたので、備忘録的に記録しておきます。

## エラーの内容
こんな感じのメッセージが表示されていました。
fastlaneの```build_app```でこけていました。
![スクリーンショット 2024-08-12 22.34.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644705/766a7822-9fcc-2d0e-5847-7b6a31c86621.png)


メッセージを見てみると、以下のように```たぶん使ってるXcodeのバージョンが間違ってるよ〜```と書いてありました。

少し前にfastlaneのバージョンをあげた時に、Xcode ver15.2でビルドができなくなっていたので、かなり高い確率でこのメッセージが正しそうでした。
![スクリーンショット 2024-08-12 22.20.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644705/5306484b-0e1c-960c-ebd3-7f7551417fbb.png)

## 解決方法
Xcodeのアプリを開き、上部のバーから```Xcode > Settings > Locations```と進むと```Command Line Tools```という項目があるので、適切なバージョンに変更できます。

![スクリーンショット 2024-08-12 22.43.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644705/7257743a-c7ad-4fbb-c7a7-9380d347967a.png)

## おわりに
無事fastlaneでアップロードできるようになりました。
では！！
画像ファイル形式の特徴をまとめてみました。


最近、業務でSVGを使う機会が増え、他の画像形式との違いが気になりました。この経験を踏まえて、JPEG、PNG、GIF、WEBP、SVGの特徴を簡潔にまとめることで、画像形式の選び方を理解しやすくしたいと思いました。この記事では、各形式の基本的な違いと用途をわかりやすく説明します。

### **1. JPEG（.jpg / .jpeg）**

- **圧縮方式**: 非可逆圧縮（ロスイー）。ファイルサイズを小さくするが、画質がわずかに低下する
- **カラー**: 24ビットカラー（約1677万色）
- **透明性**: サポートしない
- **アニメーション**: サポートしない
- **用途**: 写真や色が豊富な画像に最適。例：旅行の写真

### **2. PNG（.png）**

- **圧縮方式**: 可逆圧縮。画質が保たれる
- **カラー**: 24ビットカラー（約1677万色）、透明度のアルファチャネルサポート
- **透明性**: 完全な透明性をサポート
- **アニメーション**: サポートしない
- **用途**: ロゴ、アイコン、透明な背景が必要な画像に最適。例：ウェブサイトのアイコン

### **3. GIF（.gif）**

- **圧縮方式**: 可逆圧縮。画質が保たれるが、色数が制限される
- **カラー**: 最大256色
- **透明性**: 単一色の透明性をサポート
- **アニメーション**: サポートする。複数のフレームを連続表示できる
- **用途**: シンプルなアニメーションやグラフィックに最適。例：ウェブサイトのバナーや短い動きのある画像

### **4. WEBP（.webp）**

- **圧縮方式**: 可逆圧縮および非可逆圧縮。高い圧縮率と画質を両立
- **カラー**: 24ビットカラー、アルファチャネルサポート
- **透明性**: 完全な透明性をサポート
- **アニメーション**: サポートする。複数のフレームを含むアニメーションが可能
- **用途**: 高画質かつ小さいファイルサイズが必要な場合に最適。例：Webページの画像

### **5. SVG（.svg）**

- **圧縮方式**: 圧縮なし（XML形式で圧縮可能）
- **カラー**: ベクター形式で、色やグラデーションを自由に設定可能
- **透明性**: 完全な透明性をサポート
- **アニメーション**: CSSやJavaScriptでアニメーション可能
- **用途**: ロゴやアイコン、スケーラブルなグラフィックに最適。例：ウェブサイトのロゴやアイコン


### **最後に**
この記事を書くことで、画像形式の特性と選び方についての理解が深まりました。特にSVGの使いどころや他の形式との違いが明確になり、今後の業務に役立てたいと考えています。もし補足や違う点があれば、ぜひ教えてください。
SQL CASE文でテーブルの内容を分類する

# 背景
実務だと、「DBをさまざまな角度から検討したい」って時、ありますよね。
（年齢別、地域別、性別、など。）

そんな時にcase文を使用することで実現できるとのこと。

# 目的
さまざまな切り口でデータを分析するときに、
case文を使用して抽出するイメージができるようになること。

# キーワード
- case、group by,
- 部分集合、集約関数

# 例題（※SQL実践入門から抜粋）

下記人物テーブル1から人物テーブル2を作成したい。

人物テーブル1
|名前|年齢|
|-|-|
|An|30|
|Ad|21|
|Bate|87|
|Be|54|
|Bill|39
|Ch|90|
|Da|12

人物テーブル2
|年齢区分|人数|
|-|-|
|子供|1|
|成人|5|
|老人|2|

子供は Da　の1人
老人は Bate、Ch　の2人👬

## 回答

```sql
select　
    case when 年齢 < 20 then 子供　
    case when 年齢　between 20 AND 69 then 成人
    case when 年齢 > 80 then 老人
    else null END AS 年齢区分
    , count(*) AS 人数
from 人物テーブル1
group by 年齢区分
```

# 学び
- 完成系のテーブル（今回ではテーブル2）を先に作ると、SQLを書く前のとっかかりとしてわかりやすい。


- 2つのパートで考えるとわかりやすかった。
 
1. 各レコードを、どの部分集合に当てはめるか 
=> 　Bate と Ch は「老人」の部分集合

2. その集合に対してどのような処理（今回であればcount）をしたいか　
=> 　Bate　と　Ch　の「数を数えたい」

- 集約関数とgroup by の実行計画は、ワーキングメモリ以外は特に注意しなくてOKとのこと

（その他）
- BETWEENは両端の値を含む
- 条件色の「かつ」はAND

# 次のステップ
case文をたくさん使って慣れたい！
8/10 tecHub（LT＋懇親会）を開催しました！

![kore_tsukau.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670233/6c3c3e1e-b304-37b0-58e3-8ccbb99f8d6c.jpeg)

最近、本を読んでいますか？

本から得た知識を実践するのは、大切です。
しかし、実践する時に覚えていなかったり、上手く活かせずに終わってしまう経験あると思います。

**本から得た知識を実践するには、記憶力よりも「読み方」が大事です！**
今回のトピックは、”読書術について”です。

**目次▼**
<INS>[今月のトピック](#今月のトピック)
[2024年8月のtecHubを開催しました！](#2024年8月のtecHubを開催しました！)
[今後について](#今後について)
[次回の開催](#次回の開催)</INS>

<h3>今月のトピック</h3>

**本の内容を忘れるのは当たり前！反復して定着を！**
人間の記憶量には限界があり、徐々に忘れていくのは仕方のないこと。
プログラミングの本や、仕事で役立つ本をよく読むと思います。
せっかく読むなら、効率良くしたいものです。

そこで、記憶に定着させる読書術を調べてまとめました。

**学んだら実践する身につく読書術 3選
１）振り返り用のメモを駆使する
２）全部を理解するのではなく、読み切る事が大切
３）本の内容を自分なりの言葉で発信する**

本の内容を振り返れるようにメモにまとめることです。
後日メモで振り返ることができ、何度も見返すことで記憶に定着します。

内容の理解は、後回しでOKです。
まずは、読み切ることが大切です。
学生時代の教材と同じで、何度も読んでいると理解が深まります。

**さらに、自分でまとめてアウトプットするのも大事です。**
ブログに書く、他の人に話す、などアウトプットすると、知識をより腑に落とすことができます。

<h3>2024年8月のtecHubを開催しました！</h3>

![kore_tsukau.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670233/b5bbee3c-983c-9424-7fa4-28dff48edf9f.jpeg)


8/10にtecHubをお茶の水で開催しました。
参加者は、66名となり、大盛況でした。

日付：8/10(土)　14:00～16:30
場所：ワイム貸会議室お茶の水 RoomB
参加者：66名
内容：LT、懇親会

<b>tecHubは毎月イベント開催しています！</b>
毎月60〜80名ほどの方が参加している人気のイベントです。

3ヶ月に1度：LT（ライトニングトーク）と懇親会の2部構成イベント
その他：オフラインのIT交流会イベント

LT＋懇親会では、前半は「働き方」をテーマにLT、プレゼンテーションを、後半は懇親会で自由に交流の時間を設けています。
LTでは、外部スピーカーをゲストに招くこともあります。

懇親会にはスピーカーも参加し、発表内容をさらに掘り下げてディスカッションすることも可能です！
色々な方が自由に意見・情報交換をできる場となっています。

<h3>参加者の声</h3>

今回も、幅広い分野のIT関係者が集まり会社員からフリーランスエンジニア、法人化まで様々な人が参加していました。

今月のLTでは、TECH PLAY（テックプレイ）から数多くのサービスを立ち上げた方をゲストにお迎えし、自身の体験談を交えてご講演いただきました。
豊富な経験から来るリアルな話は、勉強になりました。

交流会でも参加者一人一人の実体験から来る仕事の話は、濃厚かつ具体的でした。今後のキャリアをどうするか考えている話も多かったです。
幅広い分野と様々なキャリアの話は、異なる視点や考え方を知る機会になっているようでした。

参加者からは、
**「参加してよかった」
「転職やフリーランス転向などのキャリアアップを考えるきっかけになった」
「自分にとって身近な体験談を聞くことができた」**
などの声をいただいています。

tecHubは、今後も毎月イベントを開催していきます。
他にもITエンジニアがより活躍し、理想のキャリアを切り拓けるように新たな取り組みをしていく予定です。
今後もtecHubをよろしくお願いいたします。

<h3>次回の開催</h3>
次回の開催は以下の日程を予定しております。

日時：9/14(土)　14:00～16:30　
場所：LIFORK秋葉原Ⅱ1階ラウンジ
内容：IT交流会

tecHubはコミュニティサイトも始めました。
会社員、フリーランス、法人の方向けに、オフラインコンテンツと人脈形成の機会を提供しています。
詳細とお申込みは以下のサイトをご確認ください。

https://www.navi56.com/communities/tecHub
無料公開されているAPIで、日出・日没時間を取得する

# はじめに
　無料で公開されている[Sunrise and sunrise times API](https://sunrise-sunset.org/api)を使って、日出・日没時間を取得する方法を紹介する。

# 動作確認完了

* Ubuntu 20.04
* Ubuntu 22.04

# 方法

## APIの仕様

　URLに、緯度経度などのパラメータをつけてアクセスすると、JSON形式で日出時間、日没時間などを取得できる。

|パラメータ|型|必須|デフォルト|概要|例|
|:-:|:-:|:-:|:-:|:-:|:-:|
|lat|float|〇|-|緯度|36.720160|
|lon|float|〇|-|経度|-4.420340|
|date|string||現在日時|YYYY-MM-DD形式の日時|2024-08-11|
|callback|string||-|JSONPのコールバック関数名||
|formatted|integer||1|0の場合、[ISO 8601](https://en.wikipedia.org/wiki/ISO_8601)形式|0|
|tzid|string||UTC|タイムゾーン|Asia/Tokyo|

詳細は、以下をを参照。

https://sunrise-sunset.org/api

## 使い方

### 例

#### 東京駅(緯度=35.6809591,経度=139.7673068)、[ISO 8601](https://en.wikipedia.org/wiki/ISO_8601)形式、タイムゾーン=東京の場合

```bash
https://api.sunrise-sunset.org/json?lat=35.6809591&lng=139.7673068&formatted=0&tzid=Asia/Tokyo
```
上記アドレスを、ブラウザに入力すると、JSON形式で下記のような値が返ってくる。

```json
{
  "results": {
    "sunrise": "2024-08-11T04:55:35+09:00",
    "sunset": "2024-08-11T18:36:40+09:00",
    "solar_noon": "2024-08-11T11:46:08+09:00",
    "day_length": 49265,
    "civil_twilight_begin": "2024-08-11T04:29:37+09:00",
    "civil_twilight_end": "2024-08-11T19:02:38+09:00",
    "nautical_twilight_begin": "2024-08-11T03:56:42+09:00",
    "nautical_twilight_end": "2024-08-11T19:35:33+09:00",
    "astronomical_twilight_begin": "2024-08-11T03:21:56+09:00",
    "astronomical_twilight_end": "2024-08-11T20:10:19+09:00"
  },
  "status": "OK",
  "tzid": "Asia/Tokyo"
}

```

### Bashで取得する場合

curlを用いる。

1. 依存関係のインストール
    ```bash
    sudo apt-get install curl jq
    ```
2. curl -sコマンドを利用して、APIを使う  
    例：東京駅(緯度=35.6809591,経度=139.7673068)、[ISO 8601](https://en.wikipedia.org/wiki/ISO_8601)形式、タイムゾーン=東京の場合
    ```bash
    curl -s https://api.sunrise-sunset.org/json?lat=35.6809591&lng=139.7673068&formatted=0&tzid=Asia/Tokyo
    ```

#### Script化

JSONの戻り値から、```jq```コマンドを使って、日出時間と日没時間を抽出するスクリプト。
```bash
#!/bin/bash

# 緯度と経度を設定
LATITUDE="35.6809591"
LONGITUDE="139.7673068"

# Sunset and sunrise times API呼び出し
RESPONSE=$(curl -s "https://api.sunrise-sunset.org/json?lat=$LATITUDE&lng=$LONGITUDE&formatted=0&tzid=Asia/Tokyo")

# 日出時間を抽出
SUNRISE_JST=$(echo $RESPONSE | jq -r '.results.sunrise')

# 日没時間を抽出
SUNSET_JST=$(echo $RESPONSE | jq -r '.results.sunset')

echo "日出時間 (JST): $SUNRISE_JST"
echo "日没時間 (JST): $SUNSET_JST"

exit 0
```

# まとめ
　無料公開されている[Sunrise and sunrise times API](https://sunrise-sunset.org/api)を使って、簡単に日出時間と日没時間を取得することができた。簡単なテスト用などには使えることが分かった。ただし、大量アクセスする場合は、サイトにリンクを掲載する必要があるとのことなので注意が必要。詳細は下記参照。

 https://sunrise-sunset.org/api#limits

# 参考

https://sunrise-sunset.org/api

https://qiita.com/Tatsuki_Yo/items/e831cfe8963c989da094
TP-Link　AX73　IPv6通信不具合発生と解決方法

<h3>TP-Link AX73不具合情報</h3>
現在家庭内のデフォルトゲートウェイとして稼働しているTP-Link AX73で不具合が発生いたしました。
<h4>不具合状況</h4>
毎日0時を過ぎると突然インターネットに接続できなくなる。

<h4>NW環境</h4>
NW構成は以下の順番で行っている。
HGWはPPPoEブリッジを有効にしており、各無線AP、クライアントはAX73をGWとして通信を行う。
<ol>
    <li>HGW</li>
    <li>AX73</li>
    <li>無線AP</li>
</ol>
<H4>AX73不具合発生時に変更した設定</H4>
<ul>
    <li>IPv6を有効</li>
    <li>MU-MIMOを有効</li>
    <li>フロー制御　TX Enable/RX Enableを有効</li>
</ul>
<H4>トラブル原因</H4>
TP-Link製ルーターでは、IPv6toIPv4トンネル接続を有効にした際、初回接続時にはデフォルトでDNSがプロバイダーから自動取得を行うようになる。
<br>自動取得は行えるので設定時は問題なく稼働するが、日付が変わるとプロバイダーへDNS情報を再取得しに行く。その際に上手く取得することができずにインターネット通信ができないような動きが見られました。<br>
現時点（2024/08/12）ではファームウェアで修正されていないので、自動取得ではなく手動で設定が必要となります。
<H4>解決方法</H4>
以下手順でIPv6設定を行います。（DNSサーバはGoogleにしました。）
<ol>
    <li>管理コンソールにログイン（Tetherアプリでも可）</li>
    <li>詳細設定　→　IPｖ6</li>
    <li>IPv6を有効にする</li>
    <li>高度な設定をクリック　→　次のDNSサーバーを使用　に☑</li>
    <li>プライマリDNS　2001:4860:4860::8888</li>
    <li>セカンダリDNS　2001:4860:4860::8844</li>
    <li>接続ボタン　をクリック</li>
    <li>成功すると完了です。</li>
</ol>
<H4>最後に</H4>
今回の不具合とその解決方法については、調べてみても情報が無く、一部価格.comとXで同じ症状が発生した方を見つけることができました。<br>公式情報も無いため、ソースとしては弱いですが1か月経過した今でも問題なく稼働しております。<br>同じ症状が発生した方のお役に立てましたら光栄でございます。
type(型エイリアス)とinterfaceの違い - TypeScript

TypeScriptを実用している中で、typeとinterfaceの使い道の違いがわからなかったので、今回まとめることにしました。

# 定義の方法と用途

## interface
主にオブジェクトの形状（プロパティやメソッド）を定義するために使われます。
インターフェースは拡張（継承）が可能で、他のインターフェースやクラスを継承することができます。
```typescript
interface Person {
	name: string;
	age: number;
	greet(): void;
}

class User implements Person {
	name: string;
	age: number;
	
	constructor(name: string, age: number) {
		this.name = name;
		this.age = age;
	}
	
	greet() {
		console.log(`Hello, my name is ${this.name}`);
	}
}
```

## type（型エイリアス）
型エイリアスは、型に対して新しい名前を付けるために使われます。
プリミティブ型、ユニオン型、タプル、関数型など、さまざまな型に対してエイリアスを作成でき、オブジェクト型に限らず、複雑な型表現を簡単に再利用できるようにします。
```typescript
type ID = string | number;

type User = {
	name: string;
	age: number;
}

let userId: ID;
userId = "abc123"; // OK
userId = 12345; // OK
```


# 拡張性とマージ

## interface
インターフェースは他のインターフェースやクラスを継承することができ、同名のインターフェースが複数定義された場合、自動的にマージされ、プロパティが結合されます。
下記の例では、`Animal` インターフェースが2回定義されていますが、マージされて1つのインターフェースになります。
```typescript
interface Animal {
	name: string;
}

interface Animal {
	age: number;
}

interface Dog extends Animal {
	breed: string;
}

let myDog: Dog = {
	name: "Buddy",
	age: 5,
	breed: "Golden Retriever"
}
```

## type（型エイリアス）
型エイリアスも拡張できますが、`&`（インターセクション）や `|`（ユニオン）を使って行います。
型エイリアスはインターフェースのようにマージされることはありません。
```typescript
type Animal = {
	name: string;
}

/*
 * 同じ名前のtypeは再定義でエラーになる
 * マージされない
 */
type Animal = {
  age: number;
}

type Dog = {
	breed: string;
}

let myDog: Dog = {
	name: "Buddy",
	breed: "Golden Retriever"
}
```


# ユニオン型やタプルの定義

## interface
インターフェースは、オブジェクトの形状を定義することが主な用途となるため、ユニオンやタプルを直接表現することはできません。

## type（型エイリアス）
型エイリアスのユニオン、タプルの定義
```typescript
type Status = "active" | "inactive" | "pending";
type Point = [number, number];
```


# まとめ
ここまでinterfaceと型エイリアスの違いについてまとめましたが、実際のところどっちを使った方がいいかは、明確な正解はないようでした。
個人的には、オブジェクトの形状を定義し、オブジェクト指向における継承を利用したい場合などは、interface。
ユニオン型やタプルなど、より複雑な型定義を扱いたい場合は、type（型エイリアス）を使う方がいいのではないかと思っています。
SimpleTuner v0.9.8.1でFluxモデル微調整が進化 - StableDiffusion界隈に朗報

## はじめに

StableDiffusionユーザーの皆さん、お待たせしました！SimpleTunerの最新バージョンv0.9.8.1がついにリリースされ、Fluxモデルの微調整において画期的な進歩を遂げました。本記事では、この重要なアップデートの詳細と、StableDiffusionコミュニティにもたらす影響について深掘りしていきます。

## SimpleTuner v0.9.8.1の主な特徴

1. **互換性の向上**: AUTOMATIC1111/stable-diffusion-webuiなど、主要な推論プラットフォームとのシームレスな連携が実現。
2. **高速推論**: CFGノードを使用せずに高品質なLoRAを調整可能に。これにより推論速度の低下を回避。
3. **最適化されたFlux蒸留**: `--flux_guidance_value = 1`の設定により、Fluxの能力を最大限に引き出す。
4. **マルチサブジェクト対応**: 複数の被写体を1つのLoRAに効果的に統合する能力を実証。

## Fluxモデル微調整の具体的な改善点

- **推論速度の向上**: CFGノードを使用しないアプローチにより、処理速度が大幅に改善。
- **品質の維持**: 速度向上にもかかわらず、生成画像の品質は維持または向上。
- **柔軟性の増加**: 様々な被写体や スタイルに対応可能になり、ユーザーの創造性をさらに引き出す。

## デモ画像で見る驚異的な結果

SimpleTuner v0.9.8.1の能力を示す印象的なデモ画像が公開されています：

1. **精密なディテール再現**: タトゥーの細部まで正確に描写。
2. **自然な肌の質感**: 適切なそばかすの表現により、リアルな肌の質感を実現。
3. **複雑な背景との調和**: 被写体と川などの背景要素が自然に調和。
4. **独特なスタイルの把握**: Juggaloのような特殊なスタイルも正確に描写。

## SimpleTunerの今後の展望

開発チームは、さらなる機能拡張を計画しています：

1. **IPアダプタートレーニング**: より高度な画像処理能力の実現を目指す。
2. **SchneIIモデルの活用**: 凍結された定量化SchneIIモデルを教師として使用し、新たな可能性を探求。

これらの機能追加により、タスク固有のSchneIIモデル作成が可能になり、商業利用の幅も広がると期待されています。

## ユーザーコミュニティの反応

StableDiffusionコミュニティからは、概ね熱狂的な反応が寄せられています：

- **ハードウェア要件の緩和**: 16GB VRAMでのLoRAトレーニングが可能になったことへの歓迎の声。
- **トレーニング手順の共有**: 24GBのGPUを使用したトレーニング方法に関する情報交換が活発化。
- **課題への取り組み**: 適切なデータセット準備やトレーニング設定の最適化など、残された課題にも積極的にアプローチ。

## まとめ：StableDiffusion開発の新たなマイルストーン

SimpleTuner v0.9.8.1のリリースは、StableDiffusion技術の進化において重要なマイルストーンとなりました。高品質なLoRA生成と幅広い互換性を実現したこのアップデートは、AIアート制作の可能性を大きく広げます。

開発者の不断の努力とコミュニティからの建設的なフィードバックにより、StableDiffusion技術はさらなる高みを目指していくでしょう。今後の展開に、ますます目が離せません。

## 参考サイト

https://www.reddit.com/r/StableDiffusion/comments/1epd0bc/simpletuner_v0981_released_with_exceptional/?rdt=33864

https://github.com/bghira/SimpleTuner/releases/tag/v0.9.8.1

https://huggingface.co/ptx0/flux-dreambooth-lora-r16-dev-cfg1
デバッガについて

## デバッガとは
デバッガとはバグの原因を見つける作業を手伝ってくれるツールのことを言う。
ターミナルからvar_dumpやechoなどで出力結果をいちいち確認しなくても、VScode上で出力結果を確認することができる。
また、任意の行で実行を止めてその時点での変数の中身を確認することもできる。

## PHPのよく使われるデバッガは「Xdebug」

Xcodeの特徴は以下の通りである。
- コードにブレークポイントを設定して１行ずつアプリケーションを実行
- ブレークポイントごとに変数の中身を出力して確認
- エラーが発生するまでの経過を詳細に表示
- VSCodeと一緒に使える
【Ruby】レキシカルスコープと継承の定数探索の違い

### これは何？
RubyGoldの勉強をする中で定数探索について理解が浅く、レキシカルスコープと継承の違いを理解できていなかったため学んだことをまとめた記事になります。

### まずレキシカルスコープについて
クラスやメソッドなどの定義内にできるスコープのことで、見かけ上の静的なスコープ。"静的"というからには"動的"なスコープもあり、そちらはダイナミックスコープというものがある。（Wikipdeiaを参照するとLISPやEmacs Lispなどがダイナミックスコープにあたるらしい）

### 定数探索時、レキシカルスコープ内の定数を優先する
大前提として、定数探索はレキシカルスコープを優先して探索し、レキシカルスコープ内になければ継承関係を辿って探索する。

### レキシカルスコープと名前空間は違う

下記の２つはどちらもクラス"M::C"を定義。
上のコードはモジュール"M"の中にネストしてクラス"C"を定義している。下のコードは名前空間としてモジュール"M"を定義したのちクラス"M::C"を定義。

まずこちらのコードはネスト定義の中、つまりレキシカルスコープ内にあたるため、クラス"M::C"から定数CONSTを参照することが可能。
```ruby
module M
  CONST=10

  class C
    def print
      puts CONST
    end
  end
end
M::C.new.print  # => 10
```
こちらはレキシカルスコープでもなければ継承関係にもないため、Mに定義した定数CONSTはクラス"M::C"からは参照できない。
```ruby
module M
  CONST=10
end
class M::C
  def print
    puts CONST
  end
end
M::C.new.print  # uninitialized constant M::C::CONST (NameError)
```

### レキシカルスコープ内で継承関係があるかどうかを確認

C1 は C を継承しているのではなく、ネスト定義に含まれているだけ。
つまりレキシカルスコープ内に含まれていることになる。
```ruby
class C
  CONST=100

  class C1
    def self.test
      puts CONST
    end
  end
end

puts C::C1 < C ? true : false
p C::C1.ancestors
C::C1.test
```

```ruby
# 実行結果
false  # 継承はしていないため false
[C::C1, Object, Kernel, BasicObject]  # 継承ではないため C は含まれない
100
```

継承の場合は下記。
```ruby
class C2
  CONST=100
end
class C3 < C2
  def self.test
    puts CONST
  end
end

puts C3 < C2 ? true : false
p C3.ancestors
C3.test
```

```ruby
# 実行結果
true    # C3 は C2 を継承しているため true
[C3, C2, Object, Kernel, BasicObject]
100
```

### レキシカルスコープ内とスコープ外

下記のソースコードについて、どちらもレキシカルスコープで定数が参照できるように見えるが、ネスト定義から外れるとスコープ外となる。Module::nesting を使って確認できる。

- レキシカルスコープ内

```ruby
module M
  CONST = 10
  class C
    def hello
      p Module::nesting
      p CONST
    end
  end
end
M::C.new.hello
```

```ruby
# 実行結果
[M::C, M]   # ネスト定義の順を返す
10   # レキシカルスコープ内なので M::C にCONSTが未定義の場合 M::CONST を参照する。
```

- レキシカルスコープ外

```ruby
module M
  CONST = 10
end
class M::C
  def hello
    p Module::nesting
    p CONST rescue p "error."
  end
end
M::C.new.hello
```
こちらは"M"がネストに含まれていない。（2番目のサンプルとほぼ同じ）
```ruby
# 実行結果
[M::C]     # ネスト定義の順を返す
"error."   # スコープ外のためエラーとなり、定数は見つからず例外が発生しrescueで補足される
```

### 名前探索でもレキシカルスコープが優先される

たとえば定義が重複しているように見えるクラス名で継承させた場合どうなるか。
クラス"C"が2つあるように見えるが、"B::C"と"C"は別のクラスであることを理解できていれば特に難しくない。

```ruby
class C
  CONST = 10
  def hello
    "Hello world"
  end
end

module B
  class C
    def hello
      "HelloHello"
    end
  end
  class C2 < C
  end
end

# どちらが実行される？
p B::C2.new.hello
p B::C2.ancestors
```

レキシカルスコープが優先されるため、B::C が継承され B::C#hello が実行される。

```ruby
# 実行結果
"HelloHello"  # "B::C::hello"が実行される
[B::C2, B::C, Object, Kernel, BasicObject]   # "B::C2"は"B::C"を継承する
```

クラス"B::C"が定義されていなかった場合はクラス"C"が継承される。

```ruby
class C
  CONST = 10
  def hello
    "Hello world"
  end
end

module B
  #class C
  #  def hello
  #    "HelloHello"
  #  end
  #end
  class C2 < C
  end
end

p B::C2.new.hello
p B::C2.ancestors
```

```ruby
"Hello world"  # "C::hello"が実行される
[B::C2, C, Object, Kernel, BasicObject]  # "B::C2"は"C"を継承する
```
2024年 AWS CLF試験 合格体験記

## 趣旨
AWSのクラウドプラクティショナー試験に合格しました。この経験を通じて感じた「もっとこうすればよかった」という点を共有したいと思います。これから受験を考えている方や、同じように勉強している方の参考になれば幸いです。

## 経歴
私は前職で車の部品営業をしており、IT業界への転職を果たしてからのキャリアはまだ浅いです。同年代の方々に比べて経験や知識が圧倒的に不足しているため、土日には業務に関係なくAWSやPythonの勉強に励んでいます。
開発歴　：3年程度
開発経験：JAVA、PHP（Laravel）
備考　　：AWS開発は未経験（趣味でサイトを構築）

## 結果
結果として、約2週間（20時間程度）の学習で、838点を取得しました。
![CLF_pass.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170341/5b35a8de-8cb0-a526-8a35-22a87c1c0fed.png)
もともとAWSに関する基礎知識は少しだけあったため、初学者と比較すると、アドバンテージがあります。その上で、2週間の勉強で合格できたという状況です。

## 振返り（もっとこうすればよかった）
* 学習方法
「参考書→問題集」ではなく、「問題集→参考書」の順で学習する方が効率的でした。
特に、第1章の「クラウドのコンセプト」、第2章の「セキュリティとコンプライアンス」の「AWSの責任共有モデル」、そして第4章の「請求、料金、およびサポート」においては、ケース問題が多く出題されます。これらは、参考書で概念やAWSサービスの名称を覚えるよりも、問題集でよく出るケースを勉強する方が理解しやすかったです。もちろん、学習方法は人それぞれ異なるので、これはあくまで私に合った方法です。
尚、CLF-02の試験は以下の構成となっています。

|No|分野|配点|
|-----|-----|-----|
|第1分野|クラウドのコンセプト|24%|
|第2分野|セキュリティとコンプライアンス|30%|
|第3分野|クラウドテクノロジーとサービス|34%|
|第4分野|請求、料金、およびサポート|12%|

* 分野ごとに学習
試験ガイドには4つの学習分野が記載されていますが、このガイドは体系的に学習を進めるための良い指針となりました。一部の問題集サイトでは、どの分野から出題されるのかがわからず、無計画に問題を解くことになり、結果として時間を無駄にしてしまいました。そのため、最初から[Cloud資格学習](https://cloud-certification.com/)のように体系的に出題されているサイトで学習し、その後、[CloudLicense](https://cloud-license.com/)で大量の問題を解くようにしていれば、もっと短期間で合格できたと感じています。

## 最後に
自分はIT業界に転職したため、同年代と比べて経験や知識が少ないと感じています。経験はすぐに積み上げることはできませんが、知識は日々の学習や新しい情報のキャッチアップで補えると考えています。資格は「意味がない」と言われることもありますが、実務を想定した資格勉強を通じて、アプリ開発とインフラの知識が結びつくことが多く、自分にとっては役に立つことが多かったです。「資格は意味がない」という言い訳をせず、皆さんと共に日々研鑽していければと思います。
かつて、資格勉強を避けて仕事が終わるとYouTubeばかり見ていた自分への戒めも込めて。
SQL(group by + having句)

# 背景
group by に関わるイメージをもっと具体的にしたいと思い、
例題にトライ

# 目的
例題を見て下記がわかるようになること
- group by が必要なところ
- havingが必要なところ

## 例題1

下記の部屋番号から、利用日数が10日以上の部屋を選択するSQLを作成する。

利用履歴テーブル
|部屋番号|利用開始日|利用終了日|
|---|---|---|
|---|---|---|
|101|24-09-05|24-09-08|
|101|24-09-10|24-09-11|
|101|24-09-13|24-09-19|
|---|---|---|
|201|24-09-05|24-09-08|
|201|24-09-09|14-09-10|

完成予想テーブル
|部屋番号|日数
|-|-|
|101|10|

## 自分が書いた誤った回答
201 nullで表示されてしまうため間違い。
as　も抜けている。
```sql
SELECT 部屋番号
CASE WHEN SUM(利用終了日-利用開始日)>=10 then SUM(利用終了日-利用開始日) ELSE NULL END
FROM 利用履歴テーブル
GROUP BY 部屋番号
```

## 正解
```sql
SELECT 部屋番号,SUM(利用終了日-利用開始日) AS 日数
FROM 利用履歴テーブル
GROUP BY 部屋番号
HAVING SUM(利用終了日-利用開始日)>=10
```

# 学び
最近case whenを学んだことで、
いらんところにcase文を使ってしまった。

今回の間違えによって下記を学んだ
- select内にcase文を書くだけだと、集約キーを全て表示する。
- havingを使用することで条件に満たない、集約キーのレコードは削除する。

※集約キーとは、group by　〇〇 に指定したキーのこと

# 次のステップ
case文はもう少し練習が必要そう。。。
IPアドレス変更に伴いデプロイの自動化ができなくなってしまった。


Qiita初めての記事なので読みにくい部分もあるかと思いますが、個人的に自分で解決できたのがうれしかったので載せます。

:::note alert
注意
Cloud9が新規で作れなっているそうなので使える人向けです。
:::
そもそも絶対にあってるとも限らないので信頼できるエンジニアの方がいる人は質問したほうが良いかと思います。

## 始まりは一通のメールだった

![スクリーンショット 2024-08-12 205810.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3752108/f5082a24-5973-8165-980b-ef256696335f.png)

スクールの学習を終え、学習の継続に励もうと自分のポートフォリオを編集し、pushした時にあやしいメールが届きました。
GitHubActionsで確認したらDeployができていない。


## 原因
一度EC2を変更したことで、デプロイの自動化を設定したときとIPアドレスが変わっていることでした。 **EIP** は設定していなかった、、、

cloud9上ではEC2にログインしたりしていたので忘れていた。

## 解決方法

</dl>
  <dt>1. デプロイしたいGitHubのリポジトリに移動</dt>
  <dt>2. Settings -> Secrets and variables に折りたたまれている Actionsまで行く</dt>
  <dt>3. Repository secrets の中のIPアドレスが入ってるファイルを変更したいIPアドレスに書き換える</dt>

:::note warn
注意
この後は必要かわかりませんでしたが、やってからデプロイ確認したので真相はわかりません。
公開キーは変わっていないので必要ないかも。
:::

  <dt>4. cloud9から公開キーをEC2に送ります。</dt><dd>$ scp -i ~/.ssh/キーペア名 ~/.ssh/id_rsa.pub ec2-user@ipアドレス:.ssh/id_rsa.pub</dd>
  <dt>5. cloud9からEC２にログイン</dt><dd>$ ssh -i ~/.ssh/キーペア名 ec2-user@IPアドレス</dd>
  <dt>6. EC2ログイン状態でauthorized_keysに公開鍵の値が追記する。</dt><dd>$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys</dd>
</dl>

## 動作確認
適当にポートフォリオをいじってpushすると
![スクリーンショット 2024-08-12 213236.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3752108/516c8a58-b3da-415c-7876-d9a042f66cb5.png)

#### できた。。。。。
できるのか確認したい気持ちが先走って誤字していますが…
以上になります。学習まだまだ頑張れそうです。頑張ります。
改行を20個入力した状態でメモ帳を開くVBScript

[DateModule.vbs](https://qiita.com/istoyo/items/64211128ab17093ec895)
[FsoModule.vbs](https://qiita.com/istoyo/items/8147f25c0a304adb2784)
[WShllModule.vbs](https://qiita.com/istoyo/items/72975d8a8bc8e8a3d35d)

※Include用のモジュールファイルは、スクリプトを保存するフォルダに「Module」というフォルダを作ってそこに格納しておく。

```vb:MemoEOF.vbs
Option Explicit

Include "DateModule"
Include "FsoModule"
Include "WShllModule"

Dim folderPath, fileName, filePath

folderPath = MakeFolder(GetBuildPath(Array(DesktopPath, "TXT", "memo")))
fileName = "memo" & DateFormat(Now, "［yyyy-mm-dd］hhnnss") & ".txt"

With Fso
    filePath = .BuildPath(folderPath, fileName)
    With .OpenTextFile(filePath, 8, True)
        .Write StringN(20, vbCrLf)
        .Write "[EOF]"
        .Close
    End With
End With

OpenFolder filePath
wShll.run "notepad " & filePath
```
```vb:
'// 与えられた文字を指定回数つなげた文字列を返す
'// String関数で改行（vbCrLf）をつなげると vbCr だけになるため

Function StringN(ByVal n, ByVal str)

    Dim i, strN

    For i = 1 To n
        strN = strN & str
    Next

    StringN = strN

End Function
```
```vb:
'// 外部関数ライブラリ（VBSファイル）の読み込み

Function Include(ByVal mod_name)

    Dim modFolderPath

    With CreateObject("Scripting.FileSystemObject")
        modFolderPath = .BuildPath(.GetFolder(".").Path, "Module")
        With .OpenTextFile(.BuildPath(modFolderPath, mod_name & ".vbs"))
            ExecuteGlobal .ReadAll
            .Close
        End With
    End With

End Function
```

＜参考サイト＞
[【vbCrLfの注意点】String関数で繰り返してはいけない(VBA)](https://yaromai.jp/vba-string-vbcrlf/)
AtCoder Beginner Contest 136

## A - Transfer

https://atcoder.jp/contests/abc136/tasks/abc136_a

### 解説

- 容器2の容量(c)が容器1の残りの容量(a-b)より大きければc-(a-b)
- それ以外で、容器2の容量が容器1の残りの容量以下であれば容器2には何も残らない

### 実装例（C++）

```cpp
#include <iostream>

using namespace std;

int main() {
    int a, b, c;
    cin >> a >> b >> c;

    int result = 0;

    if (b + c > a) {
        result = c - (a - b);
    }

    cout << result << endl;

    return 0;
}
```

## B - Uneven Numbers

https://atcoder.jp/contests/abc136/tasks/abc136_b

### 解説

- N<10^9なので全探索する
- 桁数が奇数かどうかを調べる方法
    - 文字列に変換した時の桁数（長さ）: シンプルだが実行速度が遅い
    - 数値を10で割りながら桁数をカウント: 比較的高速
    - 対数?

### 実装例（C++）

```cpp
#include <iostream>

using namespace std;

bool check_if_odd(int num) {
    string num_str = to_string(num);
    if (num_str.length() % 2 != 0) {
        return true;
    }
    return false;
}

int main() {
    int n;
    cin >> n;

    int ans = 0;

    for (int i = 0; i < n; i++) {
        if (check_if_odd(i + 1)) {
            ans++;
        }
    }

    cout << ans << endl;
}
```