OmniAICreator/Qiita-1.07M huggingface dataset:
セールス向け Einstein 会話インサイト


+ [セールス向け Einstein 会話インサイトを設定する](https://trailhead.salesforce.com/ja/content/learn/modules/set-up-einstein-conversation-insights/set-up-einstein-conversation-insights-for-sales)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c7941b8a-7e7c-17b3-12f7-8aa8cafe335d.png)

テスト１ってどこに書いてある？おいおい、書いてないだろう。

https://help.salesforce.com/s/articleView?id=000392584&type=1

ECI を録画プロバイダと接続して開始します。Sales Dialer、Zoom Meetings、Amazon Connect (Service Cloud Voice 付き) はそのままサポートされます。また、Redbox、Tenfold、Fastcall にも、ECI サポートについてお問い合わせください。
[無料の画像生成AI] すごいよ Adobe Firefly Image 3 (DALL・E超え)

## すごいよ Adobe Firefly Image 3

Adobe Photoshop（ベータ版）およびAdobe Firefly web版で利用可能な画像生成モデル「Adobe Firefly Image 3 Foundation（ベータ版）」が発表されました。
以下から無料で使えます。

ウェブ版Adobe Firefly

https://firefly.adobe.com/inspire/images

## 安全？

オープンライセンス画像や著作権が切れた一般コンテンツのコンテンツライブラリを活用して学習しているので、生成された画像は安心して使って良さそうです

商用利用もOKとのこと

https://www.adobe.com/jp/products/firefly/discover/firefly-vs-midjourney.html

https://www.adobe.com/jp/news-room/news/202309/20230913_adobe-express-firefly-commercially-available.html

## 主な特徴と進化

| 特徴 | 説明 |
| --- | --- |
| 画質とスタイルの向上 | フォトリアリスティックな画像生成が可能で、ユーザーはスタイルやディテールをより細かくコントロールできます。 |
| 生成速度の向上 | アイデア出しとクリエイティブプロセスが迅速化され、効率と生産性が向上しています。 |
| 新機能の追加 | 「構成参照」や「スタイル参照」などの機能により、クリエイティブコントロールが強化されています。 |

## ChatGPT DALL・E vs Adobe Firefly

ちょこっと触ってみた感じ、Adobe Fireflyなかなか良い画像を生成してくれるんですが、使い勝手含めChatGPTに搭載されたDALL・Eと比較してみたいと思います。

|  | DALL・E | Firefly |
|:-:|:-:|:-:|
| 画像生成の時間 | 遅い | 早い |
| 画像のサイズ調整 | :o:<br>プロンプトで | :o:<br>UIで  |
| 画像の部分変更 | :o:※1 | :x:  |
| 文字入れの指示 | :x: | :white_flower:<br>ASCIIはOK |
| イラスト風 | :o:<br>プロンプトで | :o:<br>UIで |
| 写真風 | :o:<br>プロンプトで | :o:<br>UIで |
| 一度に生成できる画像 | 1つ | 4つ |

※1: 可能だが、ほぼ指示に従ってくれない・・・

DALL・Eより使い勝手良くて、しかも無料・・・
凄い

## Adobe Fireflyの凄いところ

### 写真風の画像クオリテイ

以下のプロンプトで生成してみます
```
テレワークしている日本人男性の画像
写真風の画像にして
```
まずはDALL・E
![DALL·E-2024-04-24-13.50.08-A-realistic-photo-style-image-of-a-Japanese-man-teleworking-from-home.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3741957/caea0f6e-3691-01b0-bce9-6889e76e7e9b.png)
悪くはないけど、AIで作った感が強いですね

次にFirefly
![スクリーンショット 2024-04-24 13.52.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3741957/ca3752d1-5b30-ba3d-ca9d-2ddb4b34d9e1.png)
これもう写真の素材じゃん！凄い・・・

### 写真以外

こんなプロンプトで試します
```
テレワークしている日本人男性の画像
日本画風の画像にして
```
まずはDALL・E
![DALL·E-2024-04-24-13.55.41-A-Japanese-ink-painting-depicting-a-Japanese-man-teleworking-from-home.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3741957/fcd109f0-b126-8362-be26-d47cb482e2ee.png)

悪くはないけど、イメージしていた日本画風とちょっと違う

次にFirefly
![スクリーンショット 2024-04-24 13.58.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3741957/fb9d3b3c-d3c0-5edf-e1a3-4f3e5b5324d4.png)
一部ちょっと変な着物来てますが、良い感じ

個人的にはDALL・Eよりもかなり良い感じかなと思います

## Adobe Fireflyの今後

Adobe Firefly には今後以下のような機能が追加される予定とのことです

- 写真からの不要物の除去
- ビデオの雰囲気変更
- イラストに新要素の追加
- 様々なデザインオプションの試行
- 3Dオブジェクトへのテクスチャ追加
- デジタルエクスペリエンスの創造

今後が楽しみですね
Linuxで統合版マインクラフトを遊ぶ

Linuxで統合版マインクラフトを遊ぶ方法です。
マイクラサーバーではなく、クライアントです。


統合版は Windows かスマホ、Switchなどでしか遊べません。

ですが、LinuxでスマホのAndroid版を実行してしまえば遊べます。


と、いうことで Waydroid をインストール。
最初は VANILLA タイプを選択して、通常のAndroid端末と同じように使えることを確認。


初期設定で VANILLA を選択してしまいましたが、Google Play でマインクラフトをインストールしようとGAPPS に変更しようとするも、エラー

下記で変更できました。






```bash
$ sudo waydroid init -f -c https://ota.waydro.id/system -v https://ota.waydro.id/vendor -s GAPPS
```

FedoraはSystemとVenderの OTA を明示する必要があるようです

---


試しに非常にスペックの低いノートＰＣのFedora Linuxでも実行しましたが、問題なくプレイできました。
　インテル® Celeron® 5205U プロセッサー
　インテル® UHD グラフィックス
　PC4-19200 DDR4 SO-DIMM 4GB (4GBx1)
https://www.tsukumo.co.jp/bto/pc/note/n1400l/2021/N1400L100TPROWH.html


Waydroid すごい！


---


### Waydroid のインストール方法
[https://docs.waydro.id/usage/install-on-desktops](https://docs.waydro.id/usage/install-on-desktops)

https://docs.waydro.id/usage/install-on-desktops


### Google Play の認証方法
[https://docs.waydro.id/faq/google-play-certification
](https://docs.waydro.id/faq/google-play-certification
)

https://docs.waydro.id/faq/google-play-certification


---


### Waydroid の ファイル

ここが、Androidとしてのファイル類

```bash
~/.local/share/waydroid/data/media/0
```

マインクラフトのワールドデータやリソースパックを確認するためのファイル格納場所

```bash
~/.local/share/waydroid/data/media/0/Android/data/com.mojang.minecraftpe/files/games/com.mojang
```

通常はAndroidからは触れないファイルも、Linux側からは自由にさわれるのでAndroidのRoot化不要
なかなか便利ですね
Bitcoin Coreソースコード学習用シラバス（初級編）

# 趣旨
Bitcoin Coreをどうしてもソースコードレベルで理解したいので、GPT先生にGithubの該当ページを読み込ませてシラバスを制作してもらい、手直ししました。

以下、シラバスです。

Bitcoinのソースコードを効果的に学習するための詳細な学習シラバスを以下に示します。このシラバスは、基本的な概念から始めて、より複雑なトピックへと段階的に進んでいきます。各セクションでは、関連するソースコードファイルや具体的な学習目標を示します。

# 週1：導入と環境の設定
目標：プロジェクトの構造とビルドプロセスを理解する
学習内容：
- README.md と doc ディレクトリのドキュメントを読む
- 開発環境のセットアップ（依存関係のインストール、ビルドプロセスの実行）

# 週2：主要なエントリーポイントと初期化プロセス
目標：Bitcoinソフトウェアの起動と実行の流れを理解する。

学習内容：
- src/bitcoind.cpp：コマンドラインインターフェイスの解析
- src/qt/bitcoin-qt.cpp：グラフィカルインターフェイスの起点
- 初期化プロセス (src/init.cpp) の詳細解析


# 週3：ネットワークと通信
目標：ネットワーク層の構造とピアツーピア通信の基本を学ぶ

学習内容：
- src/net.cpp：ノード接続とメッセージのハンドリング
- src/net_processing.cpp：メッセージの種類とそれに応じた処理の流れ
- P2Pプロトコルの詳細

# 週4： ブロックチェーンとトランザクションの管理
目標：ブロックとトランザクションの処理方法を理解する

学習内容：
- src/validation.cpp、src/txmempool.cpp の検証とメモリプール管理
- src/txmempool.cpp：未確認トランザクションの管理
- UTXOセットの管理 (src/txdb.cpp)

# 週5：マイニングとコンセンサス
目標：マイニングプロセスとコンセンサスメカニズムの基本を把握する

学習内容：
- src/miner.cpp のマイニングプロセス
- ブロックの難易度調整とコンセンサスルール (src/consensus)

# 週6：ウォレットとキーマネジメント
目標：ウォレットの機能とセキュリティ機能を学ぶ

学習内容：
- src/wallet 内のファイル群、キー生成と管理、トランザクションの署名

# 週7：テストとデバッグ
目標：ソフトウェアのテスト戦略と保守性を理解する

学習内容：
- src/test と src/qt/test のテストケース分析


# 週8：応用とプロジェクト
目標：学んだ知識を活用して小さなプロジェクトや改善提案を行う

学習内容：
- 実際の問題を解決するためのコード変更や新機能の提案
- BitcoinのGitHubリポジトリへの貢献の試み
Playwright で HTML を直接書き換える例 ( DOM 操作 ) ( Evaluating JavaScript )

Playwrightのテストでどうしても直接DOM操作をする必要がある場合は、出来るようだ

# テストファイルの例


```ts
test('example', async ({ page }) => {
  await page.goto('http://example.com')

  await page.screenshot({
    path: `before.png`,
  })

  await page.evaluate(() => {
    const h1Element = document.querySelector('h1')

    if (h1Element) {
      h1Element.innerHTML = 'Overwritten BY Playwright!'
    }
  })

  await page.screenshot({
    path: `after.png`,
  })
})

```



# 結果

書き換え前の画像

![image](https://github.com/YumaInaura/YumaInaura/assets/13635059/f97f25b0-9221-419d-91c1-cdc39e980948)

書き換え後の画像

![image](https://github.com/YumaInaura/YumaInaura/assets/13635059/bcfcf19b-e91d-4cc7-bdb2-00de7ef589d0)

# 公式説明

>Playwright scripts run in your Playwright environment. Your page scripts run in the browser page environment. Those environments don't intersect, they are running in different virtual machines in different processes and even potentially on different computers.
>
>The page.evaluate() API can run a JavaScript function in the context of the web page and bring results back to the Playwright environment. Browser globals like window and document can be used in evaluate.

>Playwright スクリプトは Playwright 環境で実行されます。ページ スクリプトはブラウザ ページ環境で実行されます。これらの環境は交差せず、異なるプロセスの異なる仮想マシンで実行されており、場合によっては異なるコンピューター上でも実行されます。
>
>page.evaluate() API は、Web ページのコンテキストで JavaScript 関数を実行し、結果を Playwright 環境に戻すことができます。ウィンドウやドキュメントなどのブラウザ グローバルは評価で使用できます。


https://playwright.dev/docs/evaluating



# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
【Access VBA】日付操作

# はじめに
C#でアプリ開発を行っていたエンジニアが、半年にわたるAccess案件で学んだことをまとめています。
今回はAccessVBAでの日付操作についてまとめます。

### 加算/減算と差分
#### ⋙加算/減算
>```
>（例）
>DateAdd("d", 2, 2024/01/01)
>```
>→取得結果：`2024/01/03`
>
>第一引数：時間単位
>|時間単位|指定方法|
>|:---:|:---:|
>|年|yyyy|
>|月|m|
>|日|d|
>|時|h|
>|分|n|
>|秒|s|
>
>第二引数：加算/減算時間（減算の場合はマイナス値を指定）
>第三引数：基準となる日時
>
>第三引数に指定した日時に、第二引数で指定した値の、第一引数の単位分を加算するという仕組みになっています。

#### ⋙差分
>```
>（例）
>DateDiff("d", 2024/01/02, 2024/01/01)
>```
>→取得結果：`-1`
>
>第一引数：時間単位
>|時間単位|指定方法|
>|:---:|:---:|
>|年|yyyy|
>|月|m|
>|日|d|
>|時|h|
>|分|n|
>|秒|s|
>
>第二引数：開始日時
>第三引数：終了日時
>
>第三引数-第二引数の差分を、第一引数の単位で算出するという仕組みになっています。

### SQL実行時の日付指定
>データ型が日付のデータを条件に用いる場合は以下のように#で囲みます
>```
>テーブル名.カラム名 = #2024/01/01#
>```
>文字列型のまま条件に指定してしまうと、正しく比較ができないので注意しましょう
>
### 日付ソート時の注意
>文字列型で日付を登録している場合に昇順で取得すると、たとえば2024/09/01より2024/10/01の方が若い判定になってしまいます
>日付としてソートしたい場合は以下のように日付型に変換する必要があります
>```
>CDate(XXXXX)
>```
# さいごに
いかがでしたか？
少しでも役に立つ知識があれば幸いです。
他に気づくことがあれば追記していきます。
[Unity]metaファイル追加のコミット漏れをGit Hooksで検知

# はじめに
特にチームでのUnity開発において、metaファイルのコミット漏れがあると嬉しくないことが多いと思います。
そこで、**Git Hooks**を使って、metaファイルなしでは新規ファイル追加のコミットができないように検知してみようと思いました。

※今回はmetaファイルの追加コミット漏れの検知であり、変更のコミット漏れは検知していない

# フックスクリプトの作成 pre-commit

.githooks/pre-commitを追加
```bash:.githooks/pre-commit
#!/bin/bash

# Assetsフォルダへのパス
assetPath="Assets"
error=0

# アントラックのファイルを取得
untrack_files=$(git ls-files --others --exclude-standard)

# 新規に追加されたファイルのリストを取得
new_files=$(git diff --cached --name-only --diff-filter=A)
new_folders=()

# 新規に追加されたファイルの中で、Assetsフォルダ以下にあるファイルのみを処理
IFS=$'\n'
for file in $new_files; do
    if [[ $file != "$assetPath"* ]]; then
        continue
    fi
    # ファイルパスを「/」で分割し、非表示になるアセットをチェック
    OLD_IFS=$IFS
    IFS='/' read -ra components <<< "$file"
    skip_file=false
    for component in "${components[@]}"; do
        # 名前が ‘.’ から始まるファイルとフォルダー
        if [[ "$component" == .* ]]; then
            skip_file=true
            break
        fi
        # 名前が ‘~’ で終わるファイルとフォルダー
        if [[ "$component" == *~ ]]; then
            skip_file=true
            break
        fi
        # 名前が cvs のファイルとフォルダー
        if [[ "$component" == "cvs" ]]; then
            skip_file=true
            break
        fi       
        # 拡張子が .tmp のファイル
        if [[ "$component" == *.tmp ]]; then
            skip_file=true
            break
        fi   
    done
    IFS=$OLD_IFS

    if [ "$skip_file" == true ]; then
        continue
    fi

    new_folders+=($(dirname "$file"))
	if [[  "$file" != *.meta && (" ${untrack_files[@]} " =~ "$file.meta" || ! -f "$file.meta") ]]; then
        echo "Error: $file.meta がコミットされていません"
        error=1
    fi
done

# 重複削除
new_folders=($(printf "%s\n" "${new_folders[@]}" | sort -u))

# 新規に追加されたフォルダ内の.metaファイルがコミットされているかチェック
for folder in "${new_folders[@]}"; do
    if [ "$folder" == "$assetPath" ]; then
        continue
    fi
	if [[ " ${untrack_files[@]} " =~ "$folder.meta" || ! -f "$folder.meta" ]]; then
        echo "Error: $folder.meta がコミットされていません"
        error_found=1
    fi
done
unset IFS

exit $error
```

- 新規追加したファイル/フォルダのmetaが存在しないか、未追跡になっている場合はエラーにする
- 「.」から始まるファイル/フォルダはmetaファイルが作られないのでスルーする

# GitHooksのパスを調整

```
git config --local core.hooksPath .githooks
```

:::note info
デフォルトのGit Hooksのパスは `.git/hooks`になっている
しかし、これはGit管理対象外でチーム内で共有できないので`.githooks`にパスを変更する

※個人利用の場合は `.git/hooks/pre-commit`でも問題はない

参考
https://qiita.com/MasaoSasaki/items/fb741b54d807a49c2817
:::


# まとめ
- Unityでmetaファイルのコミット漏れ辛い
- Git Hooksでmetaファイル無しでは新規ファイル追加のコミットができないようにした
- フックのスクリプトをチームで共有する場合はデフォルトパス(`.git/hooks`)では管理できないので`./githooks`などに変える必要がある
[サービス終了] Google Jamboard の移行先を検討する

## Jamboard サ終・・・

Jamboardは、2024年に段階的にサービスを終了します。
社内では最近Jamboardを使い始めたのですが、使い始めていきなりサ終通知になってしまいました。
ということで代替のデジタルホワイトボードへの移行が求められており、ここでは、終了のスケジュールと代替アプリについてまとめます。

https://support.google.com/jamboard/answer/14011742?hl=ja

## Jamboard サービス終了スケジュール

| 日付 | 状況 |
|---|---|
| 2024年10月1日まで | 通常通りの運用 |
| 2024年10月1日以降 | 表示専用に移行 |
| 2024年12月31日以降 | サービス終了、アクセス不可 |

## 移行に向けた主な対策

1. **Jamファイルのダウンロード**: 2024年12月31日までに実施
   Jamファイルは2024年末にPDF形式で自動変換され、Googleドライブに保存されるとのこと
2. **代替ソリューションへの移行**: FigJam、Google 図形描画、Google スライドなどが提案されています

## 代替デジタルホワイトボードアプリ

会社としては以下を導入しています
* Google Workspaceのアカウント契約あり
* Microsoft Office 365契約あり

できれば以下の条件を満たしたい
* 無料
* リアルタイムで編集したり共同作業できる
* Google、Microsoftアカウントを利用したい

| ソリューション | 料金 | アカウント登録 | リンク |
|---|---|---|---|
| **Google 図形描画** | 無料 | Google アカウント | [:globe_with_meridians:](https://docs.google.com/drawings/?hl=ja) |
| **Google スライド** | 無料 | Google アカウント | [:globe_with_meridians:](https://docs.google.com/presentation/create?hl=ja) |
| **Zoom ホワイトボード** | 無料 | Google SSO可 | [:globe_with_meridians:](https://explore.zoom.us/ja/products/online-whiteboard/) |
| **Microsoft Whiteboard** | 無料 | Office 365アカウント | [:globe_with_meridians:](https://www.microsoft.com/ja-jp/microsoft-365/microsoft-whiteboard/digital-whiteboard-app) |

Google 図形描画、Google スライドはGoogleのページで移行先として紹介されていますが、ホワイトボードアプリじゃないので正直イマイチ・・・

Zoomホワイトボード、Microsoft Whiteboardはなかなか良さそう

除外したアプリ
* **FigJam by Figma**: 複数人で作業するためには￥750/月のプラン契約が必要
* **Lucidspark by Lucid Software**: 複数人で作業するためには￥1,500/月のプラン契約が必要
* **Miro**: 複数人で作業するためには$16/月のプラン契約が必要
* **Canva**: 複数人で作業するためには￥9,000/年のプラン契約が必要

## まとめ

Jamboardの直接的な代替としては、**Zoom ホワイトボード**や**Microsoft Whiteboard**が適している感じがします。
これらのアプリをしばらく使用してみて移行先を決めていきたいと思います。
【Access VBA】ADOによるDB操作

# はじめに
C#でアプリ開発を行っていたエンジニアが、半年にわたるAccess案件で学んだことをまとめています。
今回はAccessVBAの要ともなるDB操作についてまとめます。

### 1.基本テンプレート 
>```
>Dim CN As ADODB.Connection
>Set CN = CurrentProject.Connection
>Dim RS As New ADODB.recordset
>Set RS = New ADODB.recordset
>RS.Open "テーブル名", CN, adOpenKeyset
>```
>まず`Dim CN As ADODB.Connection`で接続用変数を定義し、`Set CN = CurrentProject.Connection`でカレントデータベースへの接続を保持します。
次に`Dim RS As New ADODB.recordset`でレコードセット用変数を定義し、`Set RS = New ADODB.recordset`でレコードセットオブジェクトを保持します。
最後に`RS.Open "テーブル名", CN, adOpenKeyset`で、テーブルに接続(CN)し、結果をレコードセット(RS)に格納しています。
:::note info
テーブル名にはクエリ名やSQL文も指定可能
:::
>これによりレコードセットを使った処理ができますが、レコードセットの必要ない接続(UPDATEやINSERT等)は、レコードセットの定義やオブジェクトが必要ないので以下のように省略することが可能です。
>```
>Dim CN As ADODB.Connection
>Set CN = CurrentProject.Connection
>CN.Execute "クエリ名", cnt
>```
>cntにはUPDATEやINSERTを行った際のレコード数が返ります。使用しない場合は省略可能です。

### 2.レコードセット
#### ⋙EOFとは
>`EOF`はカレントレコードを示すポインターのようなものです。
>レコードがある場合は`True`
>レコードが無い場合は`False`を返します
>```
>If Not RS.EOF Then Exit Function
>```
>このようにすると、テーブルやクエリ結果のレコードが存在しない場合はFunctionを抜ける、という使い方をすることができます。
>また、最終レコード以降にポインターが移動した際も`False`が返るため以下のようにして全レコードのループ処理を作ることができます。
>```
>Do Until RS.EOF 
>  //ループ処理
>  RS.MoveNext
>Loop
>```
:::note warn
ループのたびに`RS.MoveNext`で次レコードに移動する必要があります。これをしないと同じレコードでループし続けて無限ループになってしまうので注意しましょう
:::

#### ⋙レコード数の取得
>Open直後にはうまく取得できない場合があります
>```
>RS.MoveLast
>RS.MoveFirst
>```
>このようにすることで正常にRecordCountが取得できるようになる

#### 現在のレコード番号の取得
>```
>RS.AbsolutePosition
>```
>このようにすると現在のレコード番号を取得できる
>最初から〇番目のレコードまで、などの条件を付与したいときに使えます。
#### レコードの削除
>```
>Do Until RS.EOF
>　If 〇〇〇 Then
>　　RS.Delete
>　End If
>　RS.MoveNext
>Loop
>```
>このようにすることで、〇〇〇の条件に一致するレコードを削除することができる
# さいごに
いかがでしたか？
始めはweb系の言語とは違い必要なコードが増えますが、慣れるとテンプレートに沿った書き方をすればいいので扱いやすいなと思いました。
他に気づくことがあれば追記していきます。
Amplify + NextJS + MUIで本番ビルドでデプロイ後、画面表示全体でエラー

# エラー内容
> Error: Minified React error #306; visit [https://react.dev/errors/306?args[]=[object Object]&args[]=](https://react.dev/errors/306?args%5B%5D=%5Bobject%20Object%5D&args%5B%5D=) for the full message or use the non-minified dev environment for full errors and additional helpful warnings.

## devモードだと再現しない
next build , next startで動作確認（producitonモード）すると、ローカルでも再現する。

## ソース
```jsx
import Typography from "@mui/material/Typography";
import Image from "next/image";
import Box from "@mui/material/Box"

```
## 原因
名前付きインポートしていないと、エラーになる。

## 対応
```jsx
import {Typography, Box} from "@mui/material";

```
サーチコンソールのデータをBigデータ解析することで得られるメリット

Search Consoleデータの収集
まずは、Search Consoleからサイトの検索トラフィックに関連するデータを収集します。特に注目すべきは「パフォーマンス」レポートで、以下の情報が得られます：

クエリ（ユーザーが検索したキーワード）
クリック数（特定のクエリでサイトがクリックされた回数）
表示回数（サイトが検索結果に表示された回数）
クリック率（CTR）
平均掲載位置
2. キーワードの分析と選定
収集したデータから、特にパフォーマンスが良い（クリック数が多い、CTRが高い、掲載位置が高い）キーワードを特定します。また、パフォーマンスは良くないが潜在的に価値がある（表示回数が多いがクリック数が少ない）キーワードについても注目します。これらのキーワードをさらに分析して、以下の点を評価します：

検索者の意図：キーワードが何を意味しているのか、ユーザーが何を求めているのかを理解します。
競争状況：同様のキーワードで競合他社がどのようにパフォーマンスを出しているかを分析します。
3. コンテンツ戦略の策定
選定したキーワードを基にして、コンテンツ戦略を策定します。以下の点を考慮に入れます：

コンテンツの最適化： 既存のコンテンツを見直し、選定したキーワードを適切に組み込むことで、SEO効果を高めます。
新規コンテンツの創出： 新しいキーワードや検索者の意図に基づいた新規コンテンツを作成します。これには、ブログ記事、FAQページ、チュートリアルなどが含まれます。
ユーザーエンゲージメントの向上： コンテンツをより魅力的で読みやすくし、画像やビデオ、インフォグラフィックを使用してユーザーの関心を引きます。
4. パフォーマンスのモニタリングと調整
コンテンツを公開した後は、Search Consoleを利用してその効果を定期的にモニタリングします。具体的には、クリック数、表示回数、CTR、検索順位の変動を追跡し、必要に応じてコンテンツを調整します。

5. 自動化とスケーリング
効率を上げるためには、データ収集と分析を自動化することが重要です。APIを利用してデータを定期的に取得し、分析を自動化するスクリプトを開発することができます。また、この分析を基にしたSEO対策の実施も、できる限り自動化することを検討してください。

このプロセスを通じて、サイトへの流入を増やすためのデータ駆動型のアプローチを実施することができます。最終的には、これによって検索ランキングの改善とトラフィックの増加が見込めるでしょう。
WSL2からWindows側のNICのIPアドレスを取得したいな

VSCodeなら`host.docker.internal:host-gateway`で済むけどPHPStormなので

# ありがたい記事

https://zenn.dev/d_hori/articles/128f8976a48b52

こちらを参考にしたものの、どうもうまく動かないのでいろいろ試した。

# 原因

## grepすると「バイナリファイル (標準入力) に一致しました」と言われる

`-a`オプションをつけて、強制的にテキストでの入力とみなす必要がある

でした。

# 結果

```sh
ipconfig.exe | sed -e 's/\r//' | grep -a 'IPv4' | grep -a '192.168.' | awk -F': ' '{print $2}'
```
picoCTF 2019 writeup The Numbers

## The Numbers (Cryptography)

The numbers... what do they mean?

添付ファイル
・the_numbers.png

the_numbers.pngを開いてみる。![the_numbers.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638553/743be293-4606-7869-4ea4-85ca1a46dbbc.png)
おそらく、A1Z26暗号なので、[変換ツール](https://planetcalc.com/4884/)を使ってみるとフラグが得られた。

`picoctf{thenumbersmason}`
VSCode で MySQL操作

VSCodeでMySQLを操作できる拡張機能「MySQL Shell for VS Code」を利用しようとしたところ、証明書関連でエラーとなったので調べてみた


「MySQL Shell for VS Code」はこちら
https://marketplace.visualstudio.com/items?itemName=Oracle.mysql-shell-for-vs-code

証明書関連のドキュメントを探すとこちらにありましたが。。
https://dev.mysql.com/doc/mysql-shell-gui/en/mysql-shell-vscode-certificates.html#mysql-shell-vscode-certificates-unix

　On Linux, issue: となっているところ、コマンドがMacでした。残念。。




結論、VSCode上でインストールは完結せず、途中までウィザードで実行した後にターミナルで証明書を手動登録することで利用可能となりました。


参考になったのはコチラ
https://qiita.com/msi/items/9cb90271836386dafce3
ありがとうございました。




## まずはインストール

![Screenshot from 2024-04-24 09-32-33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153259/a8265599-b4f7-87aa-c56a-d4e6df1e1818.png)

## Welcomeウィザード 開いて

![Screenshot from 2024-04-24 09-44-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153259/716b9e15-d478-49da-0b5a-486f2d03189a.png)


Next -> Next と進んでいくと、エラー表示で完結しません。。


## 手動で証明書を登録

ウィザードを途中まで進めてるので、証明書はできているはず。
もし出来ていなければ openssl などのインストールを確認した方が良いかも。


```bash
$ cd ~/.vscode/extensions/oracle.mysql-shell-for-vs-code-1.14.2-linux-x64/shell/lib/mysqlsh/plugins/gui_plugin/internal/certificates/

$ ls 
cert.pem  readme.md   rootCA.key  rootCA.srl  server.csr      server.key
key.pem   rootCA.crt  rootCA.pem  server.crt  server.csr.cnf  v3.ext
```


これを手動で登録してあげます。

```bash
コピーして
$ sudo cp -p rootCA.crt /usr/share/pki/ca-trust-source/anchors/

コピー確認
$ sudo ls /usr/share/pki/ca-trust-source/anchors/
rootCA.crt

証明書登録
$ sudo update-ca-trust 

登録確認
$ ls -l /etc/pki/ca-trust/extracted/openssl/
-rw-r--r-- 1 root root    787 Jan 21  2023 README
-r--r--r-- 1 root root 638306 Apr 24 09:16 ca-bundle.trust.crt
```

ca-bundle.trust.crt が更新されていたらＯＫなハズ
一応ファイル内を覗くと「 # MySQL Shell 」 が追加されていることが確認できます。


## VSCode を再起動で有効化

接続情報等を入力すると、MySQLに接続できるようになりました。

![Screenshot from 2024-04-24 11-18-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153259/49d19127-8f78-0a14-4d67-2e973c327c25.png)


![Screenshot from 2024-04-24 11-18-59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153259/c280c990-2de9-4782-36d8-ef6614adbba0.png)
Amazon Linux 2でホスト名を永続的に変更する方法

## はじめに

Amazon Linux 2でシステムのホスト名を変更することは、システム管理の基本的な作業の一つです。
ここでは、ホスト名を永続的に変更する手順について詳しく説明します。

## ホスト名の変更手順

### 1. ホスト名の設定

まず、`hostnamectl` コマンドを使用してホスト名を変更します。
以下のコマンドを実行し、ホスト名を `hogehogehostname` に設定します。

```bash
sudo hostnamectl set-hostname hogehogehostname
```

#### 2. `/etc/hosts` ファイルの編集

`hostnamectl` コマンドでホスト名を変更した後、この変更をシステムに正しく認識させるために `/etc/hosts` ファイルを編集する必要があります。

```bash
sudo vi /etc/hosts
```

編集する内容は以下の通りです。

```plaintext
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
127.0.1.1   hogehogehostname
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
```

ここで、新しいホスト名 `hogehogehostname` は `127.0.1.1` に関連付けられます。
これにより、`localhost` の標準的な意味での使用を維持しつつ、新しいホスト名も正しく解決されるようになります。

#### 3. システムの再起動

すべての設定が完了したら、以下のコマンドでシステムを再起動し、変更を有効にします。

```bash
sudo reboot
```

#### 4. 設定の確認

再起動後、システムのホスト名が正しく設定されていることを確認します。

```bash
hostname
```

表示されたホスト名が `hogehogehostname` であれば、設定は正しく適用されています。

### まとめ

この記事では、Amazon Linux 2でホスト名を永続的に変更する方法について説明しました。適切な手順を踏むことで、システムの管理をより効率的に行うことができます。何かご不明な点がありましたら、コメントでお知らせください。
picoCTF 2019 writeup what's a net cat?

## what's a net cat? (General Skills)

Using netcat (nc) is going to be pretty important. Can you connect to jupiter.challenges.picoctf.org at port 25103 to get the flag?

問題文の指示に従って、ncで接続。
```
> nc jupiter.challenges.picoctf.org 25103
You're on your way to becoming the net cat master
picoCTF{nEtCat_Mast3ry_d0c64587}
```

フラグが得られた。
コマンドクエリ分離の原則とは

# コマンドクエリ分離の原則とは

メソッドでコマンド（副作用）とクエリ（主作用）を分離することが大事という原則です。

値を変えない作用が主作用で値を変える作用が副作用みたいな認識で大丈夫です。
- クエリ（主作用）…値を取得する操作
- コマンド（副作用）…値を変更する操作

以下のように例を見てみましょうー

## コマンドの例（値を変更する）

```
public class CommandExample {
    public static int increaseNumber(int number) {
        this.number = this.number+1;
        return this;
    }
}
```



## クエリの例（値を取得する等）
```
public class QueryExample {

    public int getNumber() {
        return this.number;
    }
}
```

## コマンドとクエリが分離していない場合の例
```
public class CommandExample {
    public static int getNumber(int number) {
    　　//クエリ
        this.number = this.number+1;
        //コマンド
        return this.number;
    }
}
```

## コマンドとクエリが分離されている場合の例
```
public class CommandExample {
　　//クエリ
　　public static int increaseNumber(int number) {
        this.number = this.number+1;
        return this;
    }
    //コマンド
    public int getNumber() {
        return this.number;
    }
}
```

## コマンドとクエリが分離されていないと？

メソッドの責務が複数になり、理解容易性を下げて意図しない不具合を生み出す可能性があります。

例えば、getIdというメソッド名を見たときにエンジニアの皆さんは
Idを取得するメソッドだと考えると思います。

ただそのgetId()にIdを取得する際にidの値を+1するなどのクエリが入っていたとしたら、、
（コマンドとクエリが混在している状態）

getIdの期待値と異なるものが返ってしまい予期しない不具合が発生します。

そのため、コマンドとクエリは分離して定義してあげる必要があります。

（クエリはvoidかその値ではなくてObjectを渡すのが良さげですね）

# まとめ
コマンドクエリ分離の原則とは主作用と副作用を分離して定義する原則です。
分離しないことで、メソッドに複数の責任が定義されてしまい、理解容易性を下げます。
また意図しない不具合を生み出す可能性があります。
そのため以下のアクションが必要になります。
- メソッド名を単一にする
- 主作用と副作用を分ける
--dart-defineで渡した値がrestartするまで反映されない謎現象に遭遇した話

##　はじめに
--dart-define および --dart-define-from-file はビルド時に定数を渡せる機能です。

```zsh
flutter run --dart-define=NAME=k9i
```
のようにすると、Dartコードで
```dart
const String.fromEnvironment('NAME');
```
として定数の値を取り出せます。

以下の記事のようにFlutterの環境分けに使っている方が多いと思います。

https://zenn.dev/altiveinc/articles/separating-environments-in-flutter-old-edition

https://zenn.dev/altiveinc/articles/separating-environments-in-flutter

## restartするまで定数の値が反映されない現象に遭遇

今回既存アプリに新しい--dart-defineを追加したところ、アプリをrestartするまで定数の値が反映されない現象に遭遇しました。

具体的には最初の例で言うと
起動直後は
```dart
print('name: ${const String.fromEnvironment('NAME')}');
```
で
```
name:
```
と表示されるのです。
その後restartすると
```
name: K9i
```
となり、ますます謎でした。

## 原因

今回の問題はiOSでのみ発生しました。
具体的な原因はDebug.xcconfig、Release.xcconfigにDART_DEFINESが直書きされていたことでした。

何も設定してない場合Debug.xcconfigはこんな感じで、Generated.xcconfigをincludeしています。
```
#include "Generated.xcconfig"
```
今回
```
#include "Generated.xcconfig"
DART_DEFINES=hoge
```
のようになっていました。
(hogeの部分はbase64エンコードされた定数)

### あるべき姿

Generated.xcconfigはFlutterのビルドプロセスで自動生成されるファイルです、Flutterフレームワークへのパスやアプリのバージョン情報が設定されます。（詳細はお手元のFlutterプロジェクトをご覧ください。）
--dart-defineを使っている場合は、その情報もGenerated.xcconfigに自動で記入されます。
つまりDebug.xcconfigはGenerated.xcconfigをincluedeすることで--dart-defineの値を使えます。

### 何が起きていたのか
ここからは挙動を見た限りの予想になってしまうのですが、Flutterアプリの起動時はDebug.xcconfigに直書きされたDART_DEFINESの値が使われ、restart時に本来の--dart-defineの値が使われていました。

## まとめ
.xcconfigにDART_DEFINESの値を間違って直書きするとrestartまで値が取れない現象が発生します。
間違って直書きされたの自分がプロジェクトに入るよりかなり前だったため、気づくのに時間がかかりました😂

### おまけ
同じ現象の質問
https://stackoverflow.com/questions/76610810/flutter-dart-define-not-loading-on-first-build-only-on-hot-restart
picoCTF 2019 writetup caesar

## caesar (Cryptography)

Decrypt this message.

添付ファイル
・ciphertext

ciphertextをテキストエディタで開くと
```
picoCTF{ynkooejcpdanqxeykjrbdofgkq}
```
括弧内の文字列がシーザー暗号でエンコードされているので、cyberchefで文字をずらしていくと、４文字目でうまくいった。

`picoCTF{crossingtherubiconvfhsjkou}`
picoCTF 2019 writeup Bases

## Bases (General Skills)

What does this bDNhcm5fdGgzX3IwcDM1 mean? I think it has something to do with bases.

タイトルから、とりあえずBase64デコードすると、フラグが得られる。

`picoCTF{l3arn_th3_r0p35}`
kintone ゲストスペースの bulkRequest api オプション指定方法

kintone ゲストスペースの bulkRequest API 処理時のメモ書き

# 概要

kintone ゲストスペースの bulkRequest API 処理時は、api オプション指定時に 「/k/guest/GUEST_SPACE_ID/v1/record.json」 のような形式が必要

>[複数アプリのレコード操作を一括処理する](https://cybozu.dev/ja/kintone/docs/rest-api/records/bulk-request/)

```sample1.js
{
  "requests": [
    {
      "method": "POST",
      "api": "/k/guest/123/v1/record.json",
      "payload": {
        "app": 1972,
        "record": {
          "文字列1行": {
            "value": "文字列1行を追加します。"
          }
        }
      }
    },
    {
      "method": "PUT",
      "api": "/k/guest/123/v1/record.json",
      "payload": {
        "app": 1973,
        "id": 33,
        "revision": 2,
        "record": {
          "文字列1行": {
            "value": "文字列1行を更新します。"
          }
        }
      }
    },
    {
      "method": "POST",
      "api": "/k/guest/123/v1/record.json",
      "payload": {
        "app": 1974,
        "record": {
          "文字列1行": {
            "value": "文字列1行を追加します。"
          }
        }
      }
    }
  ]
}
```

# api オプションフォーマット変換方法

kintone.api.url 関数で、URL 変換のままではエラーになるので、不要な部分を削除

```.js
const apiStr1 = kintone.api.url('/k/v1/record', true).replace(/.*\/k\//, '/k/');
```
ChatGPTくんにMatrixコードを出力してもらった。

ChatGPT4に、Matrixコードを出力してもらった。
プロンプトはすごく簡単にしてみた。

```プロンプト内容.
映画のマトリックスに出てきた、緑色の文字がランダムに表示される文字列のアニメーションをJavaScriptで再現してほしいです。
```

出力されたコード
```matrix.html
<!DOCTYPE html>
<html>
<head>
    <style>
        body {
            background-color: black;
            overflow: hidden;
        }
        .matrix {
            font-family: monospace;
            color: lime;
            position: absolute;
            top: 0;
            left: 0;
        }
    </style>
</head>
<body>
    <canvas id="matrixCanvas"></canvas>
    <script src="matrix.js"></script>
</body>
</html>
```
```matrix.js
var matrixCanvas = document.getElementById('matrixCanvas');
var context = matrixCanvas.getContext('2d');

matrixCanvas.height = window.innerHeight;
matrixCanvas.width = window.innerWidth;

var characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
characters = characters.split('');

var fontSize = 10;
var columns = matrixCanvas.width/fontSize;

var drops = [];
for(var x = 0; x < columns; x++)
    drops[x] = 1; 

function drawMatrix() {
    context.fillStyle = 'rgba(0, 0, 0, 0.05)';
    context.fillRect(0, 0, matrixCanvas.width, matrixCanvas.height);

    context.fillStyle = '#0F0'; 
    context.font = fontSize + 'px arial';

    for(var i = 0; i < drops.length; i++) {
        var text = characters[Math.floor(Math.random()*characters.length)];
        context.fillText(text, i*fontSize, drops[i]*fontSize);

        if(drops[i]*fontSize > matrixCanvas.height && Math.random() > 0.975)
            drops[i] = 0;

        drops[i]++;
    }
}

setInterval(drawMatrix, 33);
```
このコードをそれぞれファイルに保存して
ブラウザで表示するとこんな感じに表示されます。
もちろんアニメーションします。
![mt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5028/32034858-bfd9-0641-45c3-3f432ab672f5.png)

楽しいですね！
（ChatGPTやばいですね）
【google analytics】集めたデータから自分のQiitaの傾向分析してみた

前回の記事でgoogleアナリティクスの設定をしました。
#### 前回の記事

https://qiita.com/nakaizumi_slj/items/7c6002c24bffd8623f36

今回はどのような情報が見られるのか説明します。
また、得たデータを分析していきたいと思います。

# 筆者のgoogle アナリティクスのアカウント
前回の記事でも紹介しましたが、選択したビジネス目標によっては表示が変わってくることもあると考えられます。
念のため筆者のアカウントの概要を説明しておきます。
| 項目 | 内容 |
|:-:|:-:|
|レポートのタイムゾーン|日本時間|
|通貨|日本円(￥)|
|ビジネス目標|ベースラインレポートの取得|

# ユーザー
それでは早速レポートを確認していきましょう。
レポートでは、右上から好きな期間を選んで表示することができます。
### リアルタイム
![スクリーンショット 2024-04-24 10.05.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524128/d81d458c-ed52-f576-ad42-c230da73f284.png)
現在どのような場所からどのページにアクセスされているのかを確認することができます。

### ユーザー属性　概要
![スクリーンショット 2024-04-24 10.00.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524128/a22a9a2b-ff2e-7908-5578-a5e584c97c69.png)
こちらではアクセスした人の都市を確認することができます。
見たい項目を選択するとより詳細な情報を確認することができます。
私のページでは、日本からのアクセスがほとんどということがわかります。

### テクノロジー　概要
![スクリーンショット 2024-04-24 10.12.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524128/6d43fe6e-04d2-6eee-af8f-da2e1c5dc6c1.png)
テクノロジー概要では、どのような端末から閲覧されているのかを確認することができます。
画面の解像度まで確認が可能なため、Qiitaの改行などユーザーに優しい記事作成の参考にできそうだと感じました。

# ライフサイクル
次はライフサイクルのレポートを確認します。
## 集客　集客サマリー
![スクリーンショット 2024-04-24 10.22.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524128/2ccbd1f1-facd-df3e-2f67-ba9de531cff3.png)
新規ユーザーの数などを確認することができます。

## エンゲージメント
![スクリーンショット 2024-04-24 10.29.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524128/59a09221-cf75-adf2-53cc-267add1f261e.png)
どのページがどのくらいのユーザーに見られているのかなどを確認することができます。

# 収益化
Qiitaにおいて収益というところはあまり関係なかったので今回は見ていません。

# 維持率
![スクリーンショット 2024-04-24 10.36.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524128/957a3f29-a369-1ad9-053d-4a4d16b89d57.png)
ユーザーのリピート数を確認することができます。

# 各時間のユーザー数
探索を使って毎日の人数の移り変わりを確認してみました。
![スクリーンショット 2024-04-24 10.54.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524128/c7221e7b-6990-7d88-5f90-06d124bce682.png)
ディメンションに日、指標に総ユーザー数を選択すると上記のような表を見ることができます。
平日の方がアクセス数が多く、日中では12時付近で一旦閲覧数が少なくなるという傾向が見られました。

# 私のQiita記事に関する分析
* 初心者向け・基礎的知識に関する記事が伸びている
* webでのアクセスが多い
* 朝10時と15時くらいに記事の閲覧数が多い
* ダイレクトで見られるよりも、検索に引っかかって見られる方が多い

# 終わりに
このように自分のQiitaの閲覧数が見えると発見があり、楽しいと感じています。
分析を踏まえて、どうやったら検索に引っかかりやすいのかなどについても工夫をしていきたいです。
ここまで読んでいただきありがとうございます。
結合度とは

# 結合度とは
結合度とは「モジュール間の依存度の高さを示すもの」です

凝集度に関してはモジュール内の評価に使われるのに対して 結合度はモジュール間の相互依存性（依存度）の程度を示します。

凝集度は以下を読んでください

https://qiita.com/kotukotukun/items/0c2c2bbaf451a47ddfcb

# 依存とは

依存関係は、一つのオブジェクトが他のオブジェクトに対して依存している状態を表します。この関係には「使う側（使用側）」と「使われる側（被使用側）」があります。

# 依存の例

- ユーザークラス(使われる側）
ユーザーは名前やメールアドレスなどの情報を持ちます。 通知クラス…通知は送信先ユーザーやメッセージなどの情報を持ちます。 

- 通知クラス（使う側）
ユーザークラス（使われる側）に依存しています。 通知クラスで特定のユーザーに通知を送信するために、ユーザーの情報（名前やメールアドレスなど）にアクセスする必要があります。 つまり、通知を送信するためにはユーザークラスに依存しており、ユーザーの情報を使って通知の処理を行います。

依存関係がある場合、使う側（通知クラス）は使われる側（ユーザークラス）に依存しており、使われる側の変更が使う側にも影響を与える可能性があります。

例えば、ユーザークラスの属性やメソッドが変更されると、通知クラスも変更が必要になるかもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766869/2893fa99-8607-53c8-8506-65d2fb6ba503.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766869/5b68ce2e-5fbe-49d2-916d-62dae77a881d.png)

# 依存度が高いと？
つまり依存度が高い（結合度が高い）と依存先の修正の影響を受けやすくなるため、変更容易性が低いです。

# 依存度が低いと？
依存度が低い（結合度が低い）と依存先の修正の影響が受けにくいので、変更容易性が高いです。

# まとめ
結合度とは、モジュール間の依存度の高さを示すものです。
依存とは使用側と被使用側の関係のことです。
依存が多いほど結合度は高く
依存が少ないほど結合度は低い
そして結合度が高いと変更容易性を下げてしまいます。

そのため不要に結合度を高めないように実装を進める必要があります
（継承ではなくて抽象クラスを用いる/引数に不要なものを渡さないなど）
terragruntで配列や連想配列をinputしているのに「Inappropriate value for attribute "変数名": set of string required.」と怒られてしまう場合の対処

## 配列を渡しているのに怒られた！？

結論から言うと、受け取り側の変数で型指定
`variable "hoge" { type = list(string) }`
等が必要となる。

「terragrunt→terraform」の段階で型情報が失われる事から、配列(list, set)や連想配列(map)を受け取っても判断出来ないとのこと。

## プラクティス

```:ディレクトリ構成
.
├── envs
│   ├── dev
│   │   ├── app
│   │   │   ├── 〇〇.tf
│   │   │   └── terragrunt.hcl
│   │   ├── ecs
│   │   ├── log
│   │   ├── network
│   │   ├── security_group
│   │   └── terragrunt.hcl
│   └── prod
├── modules
│   ├── app
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
```
```:envs/app/terragrunt.hcl
include {
  path = find_in_parent_folders()
}

dependency "network" {
  config_path = "../network"
}

inputs =  {
  subnet_ids = [
    dependency.network.outputs.private_subnet_a_id,
    dependency.network.outputs.private_subnet_c_id
  ]
}
```

```:modules/app/variables.tf ※ダメな例
variable subnet_ids {}
```

こんな具合で、渡したら以下のようなエラーが出てきます
```:consoleの結果
│ Error: Incorrect attribute value type
│ 
│   on main.tf line 99, in resource "aws_db_subnet_group" "db_subnet_group":
│   99:   subnet_ids = var.subnet_ids
│     ├────────────────
│     │ var.subnet_ids is "[\"subnet-xxxxxx\",\"subnet-xxxxxx\"]"
│ 
│ Inappropriate value for attribute "subnet_ids": set of string required.
```

「いやいや、配列じゃん！」ってなりますよね、なお、ダブルクオーテーションでくくった形`subnet_ids = ["${dependency.network.outputs.private_subnet_a_id}"]`にしても無駄です。同様のエラーになります。

```:modules/app/variables.tf ※良い例
variable subnet_ids { type = set(string) }
```

受け取り側で明示的に型定義をすることで無事、通ります。連想配列のときは`map(string)`などを使いましょう。
terraformの型に関しては以下の記事がよくまとまっているので、参考にしてください。

https://qiita.com/hikaru_motomiya/items/d773355d3ffa854c7ad3
picoCTF 2021 writeup Nice netcat...

## Nice netcat... (General Skills)

There is a nice program that you can talk to by using this command in a shell: $ nc mercury.picoctf.net 22342, but it doesn't speak English...

問題文に掲載されているコマンドをそのままコピペすると、
```
> nc mercury.picoctf.net 22342
112 
105 
99 
111 
67 
84 
70 
123 
103 
48 
48 
100 
95 
107 
49 
116 
116 
121 
33 
95 
110 
49 
99 
51 
95 
107 
49 
116 
116 
121 
33 
95 
53 
102 
98 
53 
101 
53 
49 
100 
125 
10 
```
10進数のASCIIっぽいので、変換ツールに投げてみるとフラグが得られた。

`picoCTF{g00d_k1tty!_n1c3_k1tty!_5fb5e51d}`
Ubuntu18.04 ROS-Melodicのインストール方法

# あらすじ
この記事ではROS Melodicのインストール方法を紹介します。
といっても、割と古いバージョンですしインストール方法は他の方々が紹介されていると思うので、この記事では詳しいところは解説しません。
ちなみに私はJetson-Nanoを使用する時にこの方法を使っています。
### 注意
ROSのインストールにはインターネットが必要ですので、有線かWi-Fiかで筐体をネット環境に接続しておいてください。
また、本記事のコードはコピーしてそのまま使えるように$マークを付けていません。
コードが複数行になっているときは各行毎に実行するようにお願いします、
それか、まとめてコピーして実行するようにしてください。
# コード
では早速インストールに移りましょう。
### ダウンロードするROSパッケージを使用するコンピュータに登録
```
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
```
### ダウンロードのための公開鍵を取得
```
sudo apt install curl
curl -sSL 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xC1CF6E31E6BADE8868B172B4F42ED6FBAB17C654' | sudo apt-key add -
```
### ROSのインストール
```
sudo apt update
sudo apt install -y ros-melodic-desktop-full
```
インストールには大体20分くらいかかるのでTikTokでも見ながら待ちましょう。
ちなみに、ネットワークが切れたりスリーブに入ったりでインストールが失敗してしまっても、もう一度同じコマンドを実行すれば続きからインストールを再開してくれるので安心してください。
### ROSの開発環境の整備
ROSの開発を行う上でターミナルを利用することが多いですが、それをしやすくするために環境変数を設定します。
```
cd
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc
```
### ROSのパッケージのインストール
ROS上の様々なパッケージのインストーラをインストールします。
```
sudo apt install python-rosinstall python-catkin-tools python-rosdep
```
### おわり
これでインストールは完了しました。以下のコマンドをターミナルで実行して、画像のような実行結果がでれば成功です。お疲れ様でした！
```
roscore
```
![Screenshot from 2024-04-24 10-11-40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511665/b8db6523-bc95-c6b6-b06f-a469143dbece.png)

# 補足：ROSワークスペースの作成
補足としてROSパッケージを使用するワークスペースを作成する方法も紹介します。
ビルドシステムとしては" catkin "を使用して、個人的な好みで" catkin_make "を使います。
" catkin build "というコマンドが上位互換らしいですが。
この記事ではワークスペースの名前を、最も主流な" catkin_ws "として進めます。
### ディレクトリの作成と初期化
```
cd
mkdir -p ~/catkin_ws/src
# 好きな名前にしたいときは、$ mkdir -p ~/<好きなワークスペースの名前>/src
cd ~/catkin_ws/src/
catkin_init_workspace
```
### ディレクトリのビルド
```
cd .. # catkin_wsまで移動
catkin_make
```
### ワークスペースの環境変数の設定
```
cd
gedit .bashrc
```
このコマンドを実行すると、PCの設定ファイルである.bashrcファイルが開きます。このファイルの一番下に以下のような文があるかと思います。
```
source /opt/ros/ROSのバージョン/setup.bash
```
この文の下に以下の文を追加します。
```
source ~/catkin_ws/devel/setup.bash
# 好きな名前にしたときは、source ~/<好きなワークスペースの名前>/devel/setup.bash
```
これでワークスペースが作成できました。ワークスペース内には" devel " " build " " src "という三つのディレクトリが出来ているはずですが、使用するパッケージは" src "内に保存して使用します。
凝集度とは

# 凝集度とは
「モジュール内の要素同士がどれだけ関連しているかを示す指標」です。

簡単に言うと「クラスの責務とクラスメソッドとデータの関連の強さ」を凝集度といいます。

参考

https://little-hand-s.notion.site/10-d85b38b1846048cea37a015a52636d53

# 責務とメソッドとデータ関連の強さとは？
「クラスの責務とクラスメソッドとデータの関連の強さ」とは？

クラスの責務とは「そのクラスは何をするクラスか？」という問いへの答えです。

クラスは何をするクラスか明確に定義されており、
そのクラスに適したメソッドやデータが関連して存在しているかが凝集度ということが分かります。

以下の観点で凝集度を見たりします。
・クラスの責務が明確か
・責務に応じたメソッドが配置されているか

# 凝集度が高い例

クラスの責務がハンバーガーを提供するとしましょう
その場合にハンバーガーを作る・ハンバーガーを提供するメソッドがそのクラスにある場合は責務に応じたメソッドが存在するので凝集度は高いと判断できます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766869/061bfa62-ba02-0662-09ae-239e20766069.png)

# 凝集度が低い例

ただ以下のようにサラダを提供するメソッドやライスを提供するメソッドが存在する場合は、責務から関係ないものが存在してしまっていることから凝集度が低いといえます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766869/fea4f476-fcf7-ea9c-17ba-8ef084ca8ebb.png)

# 凝集度が高いことのメリット

### 理解容易性を高められる
凝集度が高いモジュールは、クラスの役割や目的が明確で分かりやすく設計されています。
関連する機能が集中しているため、他の部分との関係や依存関係を理解しやすくなります。

これにより、開発者や保守者がソフトウェアの全体像を把握しやすくなるため理解容易性が高くなります。

# 噛み砕き

家の服の管理とかも同じですね

以下がクラスの責務で
- ズボンを入れる箱
- 靴下を入れる箱
- パンツを入れる箱

以下がメソッド
- ズボン
- 靴下
- パンツ

箱に対して箱が指定するものと異なっているものがあると、この箱は何か？入っているものは何に使っているものか？とわからなくなりますよね


# まとめ
凝集度はクラスの責務とメソッドやデータの関連度のこと。
凝集度を高めることで理解容易性が高まる

凝集度を高めるのに重要なのは
1.クラスの責務を明確にする
2.責務に応じたメソッドやデータかを判断する
共通化の罠とは

# DRY原則とは

以下を読んでください

https://qiita.com/kotukotukun/items/6163429d8ef0824b45e5

# DRY原則を学んだ私

DRY原則を理解した私です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766869/a4f68456-c2a7-6a5c-a7e0-d78302a227be.png)

同じような考えになったエンジニアの皆さん以下の動画を見てみてください
（はっとします）

https://twitter.com/MinoDriven/status/1127539251761909760

# 共通化の罠とは

共通化の罠は同じ意味を持たないものを共通化してしまった場合に発生する問題です

ここでいう問題は
変更容易性/理解容易性/テスト容易性を下げてしまいます

# 共通化の罠の例

例えば、以下コードを共通化してしまうと想定しましょう。

1.CalenderAクラスで定義され利用されているaddメソッド（日を進める）

```
class CalenderA {
  void addメソッド(date）{
   cal.add(date);
}
```


2.CalenderBクラスで定義され利用されているaddメソッド（日を進める＋進めた日の合計値を計算する）

```
class CalenderB {
  void addメソッド(date）{
   cal.add(date);
   sum=sum+date;
}
```


1.2を共通化したCalenderUtilクラスをつくりaddメソッドを作ったとします
(まあこの時点でいけてないですが上手い例が出なかったので）

```
class CalenderUtil {
  void addメソッド(date）{
   cal.add(date);
   if(クラスBからの条件分岐){
    sum=sum+date;
   } 
}
```

上記の共通化メソッドでも、ひとまずCalemderAクラスでもCalenderBクラスでも動作はします。
ただ、CalenderBクラスに仕様の変更が発生して、修正が必要になったとしましょう。
仕様の変更により、CalenderUtilに修正が入ります。

```
class CalenderUtil {
  void addメソッド(date）{
   cal.add(date);
   if(クラスBからの条件分岐){
    sum=sum+date;
   } 
   if(追加された条件分岐){
    sum=sum+date*2;
   }
}
```

## 変更容易性を下げる
本来であれば、CalenderBクラスにのみ必要な修正なので（CalenderAには不要）
CalenderBクラスだけの動作確認で良いのに、CalenderAクラスの動作も考慮しながら修正を入れる必要があります。つまり変更する際のコストが高くなり、変更容易性を下げる内容になります。

## テスト容易性を下げる
テストに関してもCalenderBの動作確認だけでなくCalenderAの動作確認も必要になります。
テストの準備が多くなるので、テスト容易性を下げる内容になります。

## 理解容易性を下げる
CalnederB専用のクラス専用の条件分岐がCalenderUtilクラスに入るので理解容易性も下がります。
これらのように共通化の罠にはまると変更容易性・テスト容易性・理解容易性を下げてしまいます

# まとめ
上記の点から
DRY原則を遵守するためになんでもかんでも共通化すると共通化の罠にはまります。
罠にはまると、変更容易性・テスト容易性・理解容易性を下げて後々自分の首を絞めることになります。
なので共通化するものは同じ意味かどうかをまず判断することが重要です。
paiza.ioでelixir その287

# 概要
paiza.ioでelixirやってみた。
練習問題、見つけたので、やってみた。

# 参考にしたページ

https://qiita.com/kohei-s/items/552c6bd561e29cb2b632

# サンプルコード

```

"パタトクカシーー" 
|> String.codepoints 
|> Enum.take_every(2) 
|> Enum.join                       
|> IO.puts



```

# 実行結果

```
パトカー
```

# 成果物

https://paiza.io/projects/L5OmuxlpHZEkAE3SaJodew


以上。
DRY原則とは

# DRY原則って何
DRY原則とは、ソフトウェアの構成や構築手法について原則の1つで、同じ意味を持つ情報を複数の場所に重複して置くことを避けるべきとする考え方です。
「達人プログラマー」の中で提唱された原則の1つである。

# 同じ意味とは？
同じ意味に関しては色々解釈があると思います。
ここでは、同じ意味は役割（求められるもの）みたいなニュアンスです。
以下で説明します

## 同じ意味の例
以下であれば同じ意味になります
Aメソッド…ハンバーグを作るメソッド
Bメソッド…ハンバーグを作るメソッド
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766869/74ba9e75-d303-7967-945d-55680542b61c.png)

## 同じ意味ではない
以下であれば同じ意味ではありません
Aメソッド…ハンバーグを作るメソッド
Bメソッド…オムバーグを作るメソッド\
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766869/682941c7-8336-db51-f4d9-f164680d21e3.png)


## DRY原則の事例
ここまでソフトウェアの構成や構築手法について原則の1つで、同じ意味を持つ情報を複数の場所に重複して置くことを避けるべきとする考え方がDRY原則として学び、意味は役割的なものと理解しました。
では実際にDRY原則違反かどうかを以下で見てみます

## DRY原則違反
メソッドAとメソッドBがメソッドの処理で「勤務労働時間の合計値」が欲しい場合は同じ意味になり、
それぞれに勤務労働時間の合計値を算出するコードを記述する場合はDRY原則違反になります。
（この時は勤務労働時間を計算する共通メソッドを作ってメソッドAとメソッドBに呼び出してもらう必要があります）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766869/7957ffc0-fe49-5601-9f4d-03aff37d839c.png)


## DRY原則違反ではない
メソッドAは「勤務労働時間の合計値」メソッドBは「深夜労働時間の合計値」が欲しい場合は、目的が異なるため同じ意味にはならずDRY原則違反にはなりません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766869/b81a1b74-f2df-ce04-deb6-d2db41033b2a.png)


## なぜ同じ意味を持つ情報を複数の場所に複数置くことを避けるべき？
少しDRY原則の概要に関しては理解できたと思います。
ではなぜDRY原則を守る必要があるのでしょうか？ （同じ意味を持つ情報を複数の場所に複数置くことを避ける）
以下観点で良さを説明できます
1.変更容易性の向上
2.理解容易性の向上

## 変更容易性が向上するから
変更容易性は以前学んだ通り以下の内容であり、DRY原則を守ることで高めることが出来ます。

変更容易性（maintainability）は、ソフトウェアの開発や保守において、コードを簡単に変更、修正、拡張することができる度合いを指します。

仮に勤務労働時間の合計を計算するメソッドに変更や修正が必要になったとしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766869/8c62fbf2-fbad-036c-ad5f-5db86ed34e3d.png)

上記のように、DRY違反で各地に勤務労働時間の合計値を出すコードを書いていた場合は
全てに修正を入れる必要があり、変更するのにコストが多くかかりますね。
また修正漏れも出たりして不具合が発生する可能性もあります。

ただDRYを順守していてメソッドを共通化していた場合、
１つのメソッドだけ修正を加えるだけでいいので、変更コストも少なく、修正漏れも出ずらいですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766869/da337a81-598a-58c6-77d8-c534c4495151.png)



## 理解容易性が向上するから
理解容易性（コード）は以下であり、DRY原則を守ることで高めることができます。

コードが理解しやすいということは、そのコードを読む人がコードの意図、機能、振る舞いを正確に理解できるということを意味します。

仮に、勤務労働時間の合計を計算する内容を利用したいとしましょう。
DRY違反していて散らばって各勤務労働時間の合計を計算するメソッドが書かれているとすると
理解容易性が下がりますよね（「どれが勤務労働時間の合計値を出してくれるメソッドなんだ？どれを使えば良いんだ？」などの疑問が生まれます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766869/d8fb758a-8407-e9f1-65a3-618aa6cdf1b1.png)

逆にDRYが守られていると、このメソッドが勤務労働時間の合計値を出す内容と分かりやすいです。
こういったことから理解容易性も向上することが出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766869/16aa7dea-3b2a-de3f-3468-1ae4ca4a8b42.png)

# まとめ
DRY原則とは、同じ意味のものを重複して置くことを避けるべき考え方です
DRY原則を遵守することで以下を高めます
・変更容易性（修正箇所が少ない＆修正漏れリスクの減少）
・理解容易性（利用すべきメソッドが分かりやすい）
「AWS」責任共有モデル

# 責任共有モデルとは
AWSと利用者間のセキュリティや、コンプライアンスの責任の所在について示したものです。
簡単にいうと、
「クラウド環境のセキュリティ-AWSが管理」
「クラウド内のセキュリティ-利用者が管理」
することが示されています。
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760027/6961539b-a303-646b-1c1a-56ca404edabb.png)

AWSでは、セキュリティを最優先事項としてクラウドインフラストラクチャーを考えていて、
セキュリティ担保のために、膨大なコストをかけているそうです。
セキュリティ担保の一つとして、セキュリティ機能の実装やコンプライアンス要件に対して、第三者機関による検証が行われており、高い安全性が確保されています。
ですが、AWSがセキュリティ担保のためにコストをかけても利用者が自由に利用してしまうと、セキュリティが維持できないそうです。
そこで、責任共有モデルが生まれました。
# AWS側の責任範囲
AWSはクラウドのセキュリティに責任を持ちます。
リージョン、アベイラビリティゾーン、データセンター、コンピュート、ストレージなどのハードウェア、マネージドサービスのソフトウェアです。
データセンター内では、管理人、監視カメラなどを用いてデータセンター内を担保しています。
ハードウェア内では、データセンター内の発電、冷房、暖房などでサーバを正常に稼働させることで担保しています。
ソフトウェアでは、アクセス制限や脅威検出機器などを用いることで担保しています。
# 利用者の責任範囲
利用者はクラウド内のセキュリティに責任を持ちます。
AWSでは、ベストプラクティスとして、利用者がセキュリティに対して何を意識して実施すれば良いかを提示しています。
セキュリティのベストプラクティス
伝送中、保管中のデータ保護について、データを機密性レベルに分類して、暗号化、アクセスコントロールなどを使用してデータを守ります。
強力なアイデンティティ基盤の実装
IAMユーザを作成して、アクセス情報を管理することによって。重要な情報にアクセスできる利用者を限定して不正なアクセスを制限します。
すべてのレイヤーでセキュリティを適用
セキュリティコントロールをい使用して、VPC、インスタンス、オペレーティングシステムなどのすべてのレイヤーにセキュリティを適用します。
# まとめ
AWS責任共有モデルはAWS側と利用者側での責任を示したもので、
AWS-クラウドのセキュリティ
利用者-クラウド内のセキュリティ
に対して、責任を持つことです。
paiza.ioでelixir その286

# 概要
paiza.ioでelixirやってみた。
練習問題、見つけたので、やってみた。

# 参考にしたページ

https://qiita.com/kohei-s/items/cafef111737d38f07cd0

# サンプルコード

```
pc = "パトカー" 
tx = "タクシー"
pc1 = String.codepoints(pc)
tx1 = String.codepoints(tx)
Enum.zip_with(pc1, tx1, fn x, y -> 
    x <> y 
end) 
|> Enum.join
|> IO.puts


```

# 実行結果

```
パタトクカシーー
```

#  成果物

https://paiza.io/projects/AfZqXaOGPNhjOp4lzZ_ArQ


以上。
【Azure】3月更新情報 Azureから移行時のデータ転送料金が無料に


# はじめに
私は普段からAzureに触れる機会が多いのですが
念のため、備忘録＆誰かへ有益な情報になればと思いましたので、残しておきます。

# 更新内容
今回の更新の背景としては、新たに欧州データ法に対応するための仕組みとして導入されたものかと思われます。

https://eur-lex.europa.eu/eli/reg/2023/2854/oj

更新内容を簡潔にまとめると、**Azureからデータ移行をする際のデータ転送料金の無償化**です。
Azureでは、Azureからの下り通信に対しては毎月100GBの無償範囲が提供されています。
しかし、AzureからDB移行等の大規模なデータ転送が発生する場合に料金が増加してしまうという一面もありました。
各クラウドプロパイダーが様々なサービスを展開しており、クラウド間の移行やマルチクラウド化等は今後増えていくので、とても嬉しい更新だと感じております。
さらに、欧州データ法による対応なので他クラウドプロパイダーからAzureへの移行も無償に対応していくものが増えていくと予想されますので
今後は一つのクラウドプラットフォームだけではなく、より多くのクラウドプラットフォームに対する知識を付けていかなければと感じました。

https://azure.microsoft.com/ja-jp/updates/now-available-free-data-transfer-out-to-internet-when-leaving-azure/

# 実際の移行時の流れ
データ転送料金を無償で移行を検討したい場合には、Microsoftへサポートリクエストを行う必要があります。
パートナーセンターやAzure Portalからサポートリクエストを作成し、移管予定日やSUB ID等必要情報を記入した後
要求が承認されれば、データ転送料金に対するクレジットがMicrosoftから受け取る事ができます。
基本的にはデータ転送期間は60日と記載ありましたので、スケジュール感はある程度定めておく必要があります。（延長申請可能）

https://learn.microsoft.com/en-us/azure/cost-management-billing/manage/cancel-azure-subscription#what-data-transfer-fees-are-applied-when-moving-all-data-off-azure

# さいごに

他にも3月はStandard SSDのパフォーマンス向上（料金変更は無し）等もあり
毎月の更新情報確認は大事だと改めて実感いたしました。
この記事に対してのコメントがありましたら、是非教えていただければと思います。

https://azure.microsoft.com/ja-jp/updates/ga-improved-throughput-performance-on-azure-disks-standard-ssd/

https://learn.microsoft.com/ja-jp/azure/virtual-machines/disks-types#standard-ssd-size
Create Digital Engagement on Multiple Channels


+ [Service Cloud for Lightning Experience >Create Digital Engagement on Multiple Channels](https://trailhead.salesforce.com/content/learn/modules/service_lex/service_lex_channels)

+ [Create Digital Engagement on Multiple Channels wants me to forward email to salesforce email. I have done all the steps and salesforce even had me confirm. No case was created with the email address error.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007YwZxB)

:::note
私もこれを経験しました:( Trailhead の確認ページでは機能しないことが示されていますが、ケースを作成するために偽のメールアドレス (または Salesforce が作成した転送アドレスに直接) にメールを手動で送信すると、まだ機能します。

I experienced this too :( The confirmation page in Trailhead indicates it doesn't work, but when I manually send an email to my pretend email address (or directly to the forwarding address Salesforce created) to create a case, it still works! 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f09e137c-2610-6e74-8eb7-91ed71a47ed1.png)
:::

+ ["No case was created with the email address." Issue on Service Cloud for Lightning Experience, Create Multiple Engagement on Multiple Channels](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cmQVGSA2)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/66c425bc-4628-c3cd-de33-6fc81c16fe3c.png)


# 資料

+ [オンデマンドの「メールからケース」ではケースは作成されません](https://help.salesforce.com/s/articleView?id=000384980&type=1)
Gitでshallow cloneした後に特定のブランチをcheckoutしたい


## TL;DR

以下のようにshallow cloneしたローカルリポジトリに対し、

```
git clone --depth 1 ＜リポジトリURL等＞
```

以下のコマンドを実行すれば指定したブランチがcheckoutできるようになる

```
git remote set-branches origin ＜ブランチ名＞
git fetch origin ＜ブランチ名＞
```

※ `origin` の箇所は適宜読み替える

## 少し詳しく

以下のようにshallow cloneしたローカルリポジトリがある

```
git clone --depth 1 --single-branch -b ＜ブランチ名＞ ＜リポジトリURL等＞
```

このままcheckoutしようとすると以下のようなエラーになる

```
❯ git checkout master       
error: pathspec 'master' did not match any file(s) known to git
```

何となくfetchすれば良いのでは？と思いやってみるも…

```
git fetch origin master 
```

この状態でcheckoutしても同じエラーになる

```
❯ git checkout master       
error: pathspec 'master' did not match any file(s) known to git
```

これを回避するには以下のようにする　※順番が大事

```
git remote set-branches origin master
git fetch origin master 
```

## 参考
https://stackoverflow.com/questions/6368987/how-do-i-fetch-only-one-branch-of-a-remote-git-repository
paiza.ioでelixir その285

# 概要
paiza.ioでelixirやってみた。
練習問題、見つけたので、やってみた。

# 参考にしたページ

https://qiita.com/kohei-s/items/4bb833abd5d67495e368

# サンプルコード

```
String.replace("Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.", ",", "") 
|> String.replace(".", "") 
|> String.split 
|> Enum.map(fn x -> 
    String.length(x) 
end)
|> IO.inspect

```

# 実行結果

```
[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9]
```

# 成果物

https://paiza.io/projects/PkeVuTxAwU461u_fxUezlg


以上。
「AWS」CloudWatchとは

# CloudWatchとは
EC2、RDSなどのAWSリソースやAWSで実行されているアプリケーションなどを
「リアルタイムでモニタリング」するサービスです。
ログ、メトリクス、イベントを通して監視、および運用データを収集します。
このデータは自動化されたダッシュボードを通じて、AWSのリソース、アプリケーション、サービスなどの情報を確認できます。
ワークフローはデータ収集から始まり、モニタリングとアクション、その後に運用決定に役立つ分析を実行します
# CloudWatch Metrics(メトリクス）
EC2やRDSなどの監視対象から取得するデータのまとまりのことです。
メトリクスには「標準メトリクス」と「カスタムメトリクス」があります。
# 「標準メトリクス」とは
AWSの管理範囲の情報は標準メトリクスとして収集が可能です。
EC2では、CPU使用率やネットワークのトラフィック情報が標準メトリクスとして収集されます。
RDSでは、EC2の標準メトリクスに加えて、メモリやディスク使用量などの情報が標準メトリクスとして収集されます。
ここでの違いは、EC2とRDSのAWS側の責任範囲の違いです。
RDSはOSもAWSの管理範囲ですので、標準メトリクスとして収集されます。
# 「カスタムメトリクス」とは
標準メトリクスとして、収集されない情報を収集する際にカスタムメトリクスを使用します。
EC2のディスク使用率などのOS以上の情報は、カスタムメトリクスとして収集する必要があります。
# CloudWatch Alarmとは
CloudWatchのメトリクスの対してアラームとアクションを設定することができるサービスです。
EC2のCPU使用率が設定していた範囲を超えた場合にアラームを出し、利用者宛にメールを飛ばすなどを設定できます。
アクションとして、SNSを使用したメール送信、EC2インスタンスの自動復旧などがあります。
# CloudWatch Logsとは
使用中のすべてのシステム、アプリケーション、AWSのサービスからのログを一元管理することができるため、ログを表示したり、特定のエラーコードなどで一括に分析することができます。
CloudWatch Logsを使用することで、ログの管理や分析作業を軽減することができます。
# まとめ
CloudWatchは、EC2、RDSなどのAWSリソースやAWSで実行されているアプリケーションなどを「リアルタイムでモニタリング」するサービスです。