OmniAICreator/Qiita-1.07M huggingface dataset:
Hugo + CloudFront + S3 + GitHub Actions でCI/CD付きブログサイトを構築してみる Part4 IAM周りの作成

## 概要

https://qiita.com/Tanamachi_kaoru/items/3f9c2e8bef0d5119a4ce

の続きです。
IAM周りの作成を行います。[参考サイト](https://dev.classmethod.jp/articles/cloudfront-and-s3-using-hugo-with-github-actions/)では「OpenID Connect ID Provider」と「IAM ロール」の部分です。

https://qiita.com/Tanamachi_kaoru/items/0686b3a451a5d86d9196

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_policy

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_policy_attachment




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185852/b017d04e-b7b4-c304-eef1-6d3a7cd9d9f1.png)
この記事はそのメモやまとめです。
すでに設定済みの項目がいくつかある。
試行錯誤しながらやったので、手順として不要かもしれない。**あくまでメモ用。**

# 完成した資材
```terraform
# IAMポリシーを定義
data "aws_iam_policy_document" "s3_policy_for_github_actions" {
  statement {
    effect    = "Allow"
    actions   = ["s3:ListBucket", "s3:PutObject"]
    resources = ["arn:aws:s3:::hogehoge", "arn:aws:s3:::hogehoge/*"]
  }
}

resource "aws_iam_policy" "s3_policy_for_github_actions" {
  name = "S3AccessPolicy"
  Path = "/"
  policy = data.aws_iam_policy_document.s3_policy_for_github_actions.json
}


# assumerole用のIAMロールを定義
data "aws_iam_policy_document" "github_assume_role" {
  statement {
    actions = ["sts:AssumeRoleWithWebIdentity"]
    effect = "Allow"

    principals {
      type        = "Federated"
      identifiers = arn:aws:iam::xxxx
    } 
  }
  condition {
    test     = "StringLike"
    variable = "token.actions.githubusercontent.com:sub"
    values   = "repo:my-repo/hogehoge:*"
    }
}

resource "aws_iam_role" "github_assume_role" {
  name               = "github_assume_role"
  assume_role_policy = data.aws_iam_policy_document.assume_role.json
}

# IAMロールにIAMポリシーをアタッチする
resource "aws_iam_role_policy_attachment" "test-attach" {
  role       = aws_iam_role.github_assume_role.name
  policy_arn = aws_iam_policy.s3_policy_for_github_actions.arn
}
```

上記をapplyしてリソースを作成。
これで、CloudFront + S3 構成の静的コンテンツ配信するガワを作成し、GitHub Actions から AWS へアクセスすための認証（OpenID Connect provider）、権限（IAM ロール）の用意が完了しました。

# ハマったところとか
- dataでjsonで記載する中身を書き、それをresourceで読み込むという流れを理解するまでに時間がかかった。
- 意外とiam系のterraformについて言及しているブログなどがなかったので作成するだけでかなり大変だった。

# 次にやること
- GitHub Actionsの設定
- HUGOでHPをいい感じに編集する
- テスト記事の投稿
Cloud Integration Hub のサブスクリプションの「モード」について

# はじめに
2023 年 7 月のリリースより、Cloud Integration Hub (以下 CIH) のサブスクリプションのモードに「有効化」「無効」に加え「一時停止」が追加されました。この記事では「無効」「一時停止」の動作の違いについて記載します。

# 準備

例として下記のようなパブリケーションとサブスクリプションを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335778/2872b9de-e025-6fa4-e487-004e64704170.png)

サブスクリプションのスケジューリングは「手動または外部トリガを使用」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335778/08a6ab8c-96ff-28a4-5702-e3302c64e25e.png)

サブスクリプションのモードが「有効化」の場合にはパブリケーション pub_emp_test のイベント完了後に子イベントが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335778/0a92a55d-1c40-ca90-55b0-9e6787ecff6f.png)

この状態からサブスクリプションを実行可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335778/2e1fe545-cbab-2cd6-2811-6a9ba765840f.png)


# 一時停止

では、モードを「一時停止」に変更してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335778/a66a0a6e-a147-d25a-17c3-c23ad79100f4.png)

pub_emp_test を実行すると、「有効化」の時と同じく子イベントとなる sub_emp_test が作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335778/115673e2-3104-1162-9c33-3c60e07ffcad.png)

しかし、Postman から REST API でサブスクリプションを実行しようとすると、サブスクリプションは無効扱いとしてエラーが返ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335778/bb3000b5-e2a6-c0f5-44f0-2251a71a2f24.png)

一方、画面上から「実行」を選択した場合にはダイアログは表示されますが、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335778/662a12c4-1136-0fe5-90cb-f855060652da.png)

「OK」を押すと、サブスクリプションが実行されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335778/287793cd-7853-b73e-28a9-bcab3b53385c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335778/6b111e37-3be4-fe5a-27a1-3a2c459c982b.png)

# 無効

続いてモードを「無効」に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335778/55ce0b99-199d-bafa-7949-23e18505c598.png)

パブリケーションを実行しても、サブスクリプションの子イベントは作成されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335778/be494058-4a75-ddf5-efcd-99553ceb9ff3.png)

子イベントが存在しない状態のため、画面上からサブスクリプションを実行しようとしてもコンシュームするデータがないと判断されてエラーになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335778/00767933-3632-01d8-c110-b1d731551ed6.png)

# アップデート前の「無効」

アップデート後の「一時停止」と同じ動作です。
つまり、これまでの「無効」が「一時停止」になり、さらに画面上からも実行できない状態にするモードとして「無効」が新たに用意されたということになります。

# まとめ

アップデート前の「無効」、アップデート後の「一時停止」「無効」のサブスクリプションの動作を表にすると下記のようになります。

|  | 無効(2023年6月以前のリリース) | 一時停止 | 無効 (2023年7月以降のリリース)|
|:-:|:-:|:-:|:-:|
| API による実行 | できない | できない | できない |
| 画面上からの実行 | できる | できる | できない |

尚、上記いずれのモードの場合でも、画面上から「以前のパブリケーションの取得」による実行は可能です。

2023年7月より前のリリースでは「無効」と言いつつも画面上からはサブスクリプションの実行が可能でしたが、新たに「一時停止」という設定ができたことで「無効」という名称に即した動作に変わったと言えるでしょう。
(随時更新)よく使うけどいつもコピペしてるgit操作まとめ

# 概要
「この操作よくするけど、覚えてはないからローカルのメモから探して...」ってなる事が多々あるので、今の現場を飛ばされてpc没収されても困らないようにqiitaに残しておく。
あくまで操作をまとめるだけなので、それぞれのコマンドの概念を理解したい方は他の優秀な記事をご参照ください。<br>(merge, fetch, rebase周りの概念についてもまとめたいなと思ったのですが、その手の記事はちょっと調べたら大量にでてくるので止めた。)
# 内容
## 1. 特定のファイル(ディレクトリ)だけ他ブランチと置き換える
作業ブランチ配下で
```
git checkout ブランチ名 -- ファイル(ディレクトリ名)
```

config系のファイルで意図しない差分が出てしまったり、勘違いして関係ないファイルも修正してしまった時なんかによく使う。大抵developから反映させる。
(コピペ用)
```
git checkout develop -- hoge
```

## 2. コミットをまとめる、削除する
rebase -iで修正したいコミットの数（正確にはHEADから何個前までのコミットを修正するか）を指定
```
git rebase -i HEAD~4
```
編集モードでpickをs(squash)かd(drop)に修正する
```
pick cbe176caa2f (1 commit-message)
s 6e63c323984 (2 commit-message)
pick 8b94ad76fe1 (3 commit-message)
d c5e952c6425 (4 commit-message)
```
sにすると直前のコミット(1と2)が統合され、dにするとそのコミットは削除される。sは連続して書けば3つ以上ののコミットをまとめることも可能。

自分は実装中にdraftでPR作って、細かくcommitしてpushしまくり、レビュー前にcommitログを整形するのがルーティン。
## 3. ローカルブランチの削除
定期的に掃除する。
```
git branch | grep -v "develop|se-kihyo-gen" | xargs git branch -D
```
`grep -v`で消したくないブランチを指定する。developは固定で、ブランチはチケットIDで切っているので、直近のIDに近いところだけ一応正規表現で除外する。

`git branch -D`部分は -dにすればmergeしていないブランチは対象外となる。が、大抵いらないので問答無用で削除する。

## 4. 指定したコミットとHEADとの具体的な差分を確認

```
git diff COMMIT_ID HEAD
```
レビュー中、PRを開いているブラウザに移動するのがめんどくさい時に使うくらい。
使う頻度は高くない。

## 5. 特定のファイルをgitの差分に含めない
.gitignoreを修正するべきではないけど、差分に含めたくないファイルを一時的に登録しておく。
バージョンやパッケージ管理系のファイルを設定するくらい？
```
git update-index --skip-worktree （ファイル名）
```

* 上記の設定を削除
```
git update-index --no-skip-worktree （ファイル名）
```

* （コマンドではないが）.git/info/excludeに追記するのもあり。プロジェクトに共有されないgitignoreというイメージ。

# 最後に
随時更新予定。他にも便利な操作あったらぜひ教えてください。
DirectX12の勉強①　用語について

## ディスクリプタ
GPUに送ったデータをシェーダーで使用するための仕様書的なやつ

## ディスクリプタヒープ
テクスチャや定数などのアドレスを一か所にまとめておくためのヒープ領域

## ディスクリプタテーブル
ディスクリプタヒープとシェーダーのレジスタを関連付けるもの

## ルートシグネチャ
ディスクリプタテーブルをまとめるもの

## パイプラインステート
頂点レイアウトや頂点シェーダー、ピクセルシェーダーなどのパラメーターをまとめたもの
※作成する際にはルートシグネチャオブジェクトが必要

## コマンドリストとコマンドキュー
コマンドリストは命令オブジェクトをどんどんためていくもの
コマンドキューはコマンドリストでためた命令を実行する
※非同期処理なので実行が完了するまで待たせる必要がある

## コマンドアロケーター
コマンドリストの本体

## フェンス
GPU側の処理が完了したかを監視するやつ

## バリア
コマンドを投げた時にリソースが何の用途に使用するかを設定するもの

## スワップチェーン
ダブルバッファリングをするための仕組み

## 参考資料
[DirectX12の魔導書 3Dレンダリングの基礎からMMDモデルを踊らせるまで](https://www.shoeisha.co.jp/book/detail/9784798161938)
QiitaとZennを使い分ける

- Qiita
    - 1000文字以下ぐらいの投稿、短めで断片的/局所的な知識の投稿
- Zenn
    - それ以上の文字数の投稿、わりとまとまった情報の投稿
- Twitter
    - 大喜利
特定回線に接続しているときのみ、ターミナル周りを一括更新するコマンドを実装してみた

## はじめに

&emsp;こんにちは。Hagianです。現在大学院の修士2年です。表題のとおり、「**特定回線に接続しているときのみ、ターミナル周りを一括更新するコマンドを実装**」してみたので ~~自己満足で~~ 備忘録的に記事を書きます。

## きっかけ

* Pythonのライブラリ、Homebrewのformulaを頻繁に更新したいが、かなり通信量を必要とすることが多い

&darr;

* できれば通信量を気にせず使える回線で更新したい

&darr;

* 大学にいるとき **のみ** 更新すればいいのでは？

## やりたいこと
1. Homebrewのupgradeと、pipを使ったライブラリの更新を一括でする
2. 大学の居室のWi-Fiに接続しているときのみ実行させる

## 環境

* MacBook Pro（M1, 2020）
* macOS Ventura 13.4
* Z shell 5.9
* Python 3.11.4

## 実装

### 参考にしたもの

https://qiita.com/kazushisan/items/183bdeaddf9629a2f21d

https://analytics-note.xyz/programming/subprocess-pipeline/

### ディレクトリ構造

```
~/
├　PersonalShell/
    ├ main.sh # コマンドを記述したシェルスクリプト
    └ pip3_all.py # pipを使ってライブラリを一括更新するPythonスクリプト
```

### Pythonライブラリ一括更新

&emsp;本当はワンライナーをシェルスクリプトにそのまま記述したかったのですが、パイプを使ったりしている関係か、うまくいかなかったので、別ファイルに記述してシェルから呼び出すようにしました。Pythonの`subprocess`を用いて、コード内でシェルのコマンドを動作させています。

```python3:pip3_all.py
import subprocess

cmd = subprocess.run("pip3 list -o | tail -n +3 | awk '{print $1}' | xargs pip3 install -U",
                    capture_output=True,
                    text=True,
                    shell=True # ここがコマンドインジェクション
)
print(cmd.stdout)
print(cmd.stderr)
```
&emsp;このスクリプト、1点だけ注意するポイントがあります。

::: note warn
このファイルではコマンド（シェル）インジェクションを使用しています。再現した際に発生する可能性のあるセキュリティ上の問題の責任は負いません。自己責任でお願いします。
:::

### Homebrewの更新

&emsp;これはHomebrewユーザーにとっては基本的なコマンドですね。`brew upgrade`するだけで更新可能です。

### シェルスクリプトにまとめる

&emsp;これらをまとめて、回線判別の後に動作させてみた例です。

```shell:main.sh
#!/bin/zsh

# 接続している回線名（SSID）を取得
wireless=$(networksetup -getairportnetwork en0)
echo ${wireless}

# if文で判別、SSIDは一例です
if [ "$wireless" = "Current Wi-Fi Network: Buffalo-A-****" ] || [ "$wireless" = "Current Wi-Fi Network: Buffalo-G-****" ]

# とあるルーターの5GHz/2.4GHzのどちらかであれば更新実行
then
	brew upgrade
	python3 ~/PersonalShell/pip3_all.py
else

# それ以外のSSID
	echo "Not upgradeable"
fi


```
### おまじない

&emsp;最後に、権限 ~~おまじない~~ を付与して、シェルから呼び出せるようにします（Permission denied回避）。

```terminal
$ sudo chmod 755 ~/PersonalShell/main.sh
```

&emsp;エイリアスにしておくと、すぐ呼び出せて便利です。`.zshrc`などの設定ファイルに追記しておきましょう。

```terminal
alias "terminal-update=/Users/hogehoge/PersonalShell/main.sh"
```

## おわり

&emsp;もっとスマートな方法もありそうですが、現状動くのでいいかなと。
電子記録装置市場成長と機会展望 2023-2035

電子記録装置市場成長と機会展望 2023-2035

Research Nesterは、宅配需要の増加やオンラインショッピングのトレンドの高まりを背景に成長すると予測される世界の電子記録装置市場の成長と市場規模を評価しています。

ニューヨーク-2023年4月2日- Research Nesterの最新市場調査「電子記録装置市場」： 世界の需要調査＆機会展望 2035年」は、世界の電子記録装置市場を、フォームファクター別、コンポーネント別、車両タイプ別、地域別に市場細分化し、詳細な競合企業調査とその概観をお届けします。
関連市場レポートのサンプルコピーを請求する@ https://www.researchnester.jp/sample-request-4817 

配送業務従事者数の増加が電子記録装置の世界市場シェアを促進

電子記録装置の世界市場は、配送セグメントに配置される人数の増加により大きく成長すると推定されている。また、食品などのオンライン注文の増加傾向により、宅配サービスのニーズも高まると予想される。現在、米国では約140万人の宅配ドライバーが働いている。また、宅配ドライバーに占める女性の割合は約17％で、男性が約83％を占めている。また、中国では約700万人のフードデリバリー・ドライバーがいる。さらに、中国第2位のデリバリーサービスであるMeituanは、2019年初めに、前年だけで約300万人のドライバーを雇用したと述べた。これに加え、2022年にはEU市民の68％がインターネット経由で個人的な商品やサービスを注文・購入し、2017年の54％から増加する。しかし、2020年までに、世界中で約150億件の配達が完了している。さらに、2020年までに約7億人の消費者がプラットフォーム・ツー・コンシューマー・デリバリーを利用している。

このほか、市場成長の背景には、タクシーサービスへの需要の高まりと、IoTに接続される自動車台数の増加がある。IoTは電子記録装置の機能を向上させ、ドライバーは自分の車を他の機器に接続することができる。2021年までに、世界にはほぼ2億4,000万台のIoT接続自動車が存在する。また、2025年には4億台を超えると予想されている。さらに、車のエンジンなどの車両テレマティクスは、ELDによって自動的に生成された。この方法により、車両は毎年数百ドル以上の燃料費を節約できる。ウーバーは世界中に約1,200の拠点を持ち、10,000の町や都市にサービスを提供している。最盛期には、ウーバーは世界で400万人以上のドライバーと1億2,000万人近くのアクティブユーザーを抱えていた。

世界の電子記録装置市場の成長に関連する主な成長要因と課題をいくつか挙げる：
成長ドライバー

•	オンラインタクシーサービスの急増
•	宅配サービスの巨大ネットワークに対するニーズの高まり

課題

電子ロギングデバイスのコストは高く、電子ロギングデバイスの様々な偽の販売者が存在し、これらは電子ロギングデバイスの世界市場規模を妨げると予想される主要な要因のいくつかである。一方、電子記録装置の使用により、ドライバーのプライバシーが侵害され、市場成長を阻害する可能性が高い。勤務中は半径1マイル以内を追跡し、勤務時間外は半径10マイル以内を追跡する。GPS追跡は電子記録装置で使用され、これらの追跡装置は自動車運転者のすべての動きを記録し監視する。絶えず観察されるため、利用者のプライバシーは侵害される。さらに、完璧なELD製品は市場に出回っていない。ハードウェア、ソフトウェア、通信のいずれかが故障した場合、あるいはハッカーがELDとやりとりした場合、ドライバーと同乗者の安全が損なわれる。

車種別では、世界の電子記録装置市場は小型商用車、トラック、バスに区分される。トラックセグメントは、予測期間中に著しいCAGRで成長することにより、2035年末までに最も高い収益を獲得する。車両における電子記録装置の利用が増加していることと、トラックの検査時間を短縮したいという要求が高まっていることが、このセグメントの上昇の原因となっている。米国では、ELDの装着が義務付けられている400万台のトラックのうち、2019年5月時点で半数以上が装着していない。さらに、2017年12月から2019年6月にかけて、少なくとも1回の運行時間違反となったトラックドライバーの検査件数は、1％以上から1％未満へと大幅に減少した。米国運輸省（DOT）は、クラス8の商用車を運行するトラック運送会社および独立系トラック運転手に対し、ELDの使用開始を義務付けた。さらに、ドライバーの安全を確保し、トラック事故の可能性を減らすために導入されている。

地域別では、北米の電子記録装置市場が2035年末までに最も高い収益を上げると見られている。市場の拡大は、衣料品、ガジェット、食品、さらにはサービスなど、さまざまな商品のオンライン・ショッピングや宅配に対する需要の増加が主な要因である。2020年3月時点で、アメリカの消費者の約38%が、レストランデリバリーアプリを利用して食事を取っている。さらに、2021年3月までに約47％のアメリカ人がフードデリバリーアプリを利用するようになるだろう。さらに、米国では実質的に誰もがオンラインで食品を注文しており、約86%が少なくとも月に1回は注文している。一方、同地域では、自動車機能にアクセスするためのスマートフォンやラップトップの利用が増加していることから、市場の発展が見込まれている。電子記録装置は、注文の入力、担当の配達員、配達の開始、商品の最終的な配達など、すべての配達の詳細の収集を支援する。
 

このレポートについて業界の専門家に問い合わせる@ https://www.researchnester.jp/reports/electronic-logging-device-market/4817 

について Research Nester

Research Nesterは戦略的市場調査とコンサルティングのリーディング・サービス・プロバイダーです。業界、コングロマリット、エグゼクティブが将来のマーケティング戦略、事業拡大、投資などのために賢明な決断を下せるよう、偏りのない比類のない市場洞察と業界分析を提供することを目指しています。私たちは、戦略的思考を通じて適切なタイミングで適切なガイダンスを得ることができれば、あらゆるビジネスが新たな地平へと拡大できると信じています。私たちの既成概念にとらわれない思考は、お客様が将来の不確実性を回避するための賢明な決断を下すのに役立ちます。

お問い合わせ先
ナオミコスギ
Eメール：info@researchnester.jp
電話番号 +81 505 050 8480
「凝集度」「結合度」って何さ？

社内で「凝集度」「結合度」がわからんって声が聞こえたのでざっと書いておきます

## 比較

||凝集度|結合度|
|---|---|---|
|「高い」|⭕️|❌|
|「低い」|❌|⭕️|

## 「凝集度」

ひとことでいうと「どれだけ仕事が意味ある1箇所にまとまっているか」ということ。

「高い」と「しっかり単一責任になっている」ということ
「低い」と「責任が多い、色々なところに処理が散らばってる、定まっていない」という意味

## 「結合度」

ひとことでいうと「1つのモノが他にどれだけ依存してるか」ということ。

「高い」と「他に依存しまくっていてスパゲッティになっている」ということ
「低い」と「依存が少なくて修正とかがしやすい」という意味

## 使い方
「これは結合度が高いから良い感じに分割していこう！（訳：スパゲティコードだから直そう）」
「これは凝集度が低いからよくないね！（訳：なんか色々なことしすぎてるから直そう）」


日本語だと字面・語感が似ててややこしいので、言葉でマウンティング取る人以外は別の伝わりやすい言い方にした方がいいと思います。
やっぱりこっちでした。【Rails】フロントから指定したidが返ってこなかった場合、バックエンドで新しいidを作成してレコードを作成する

前回書いた記事が糞コードで、もっと簡単に書けました。

https://qiita.com/ytnd0928/items/5434e71bcc2cab088b51

# find_or_initialize_byを使う

```ruby
    def onair
        radio_item = SilsilRadio.find_or_initialize_by(id: 1)
        radio_item.update(radio_item_params)
        radio_item.save
        render json: radio_item
     end

      private

     def radio_item_params
       params.permit(:id, :radio_url)
     end 
```

# find_or_create_byを使う

```ruby
    def onair
        radio_item = SilsilRadio.find_or_create_by(id: 1)
        radio_item.update(radio_item_params)
        render json: radio_item
     end

      private

     def radio_item_params
       params.permit(:id, :radio_url)
     end 
```

# find_or_initialize_byとfind_or_create_byの違い

### find_or_initialize_by
 新規作成をするが、保存まではしない。そのため、.saveが必要だった。

### find_or_create_by
新規作成をし、保存までする。


# 最後に

いけた。

コード書きながら、長いな。だるいな。と思ったらもっと短く簡潔に書く方法があるというサインなのではないかと思ってきました。
簡単に書けるよと教えてくれた先輩に頭が上がりません。
django・Viewクラスの関数のオーバーライドで本来の挙動を変えてることに気づかずエラーにハマってしまった話

# 結論
Viewクラスの関数のオーバーライドすると、実装によっては本来の挙動を変えてしまうこともあります。
それに気づかないとエラーが出てハマることもあるのでこれからは注意しておきたいという記事です。

# 実際に起きたこと
djangoを使ったコードを書いているときです。
`CreateView`を継承した登録用のViewクラスを作成しているところでした。
はじめ、登録成功時のリダイレクトURLを`success_url`に格納させることで指定していました。
```views.py
class RecordCreateView(CreateView):
    # ...

    # success_urlに格納することでリダイレクトURLを指定
    success_url = reverse_lazy('record_list')

    def form_valid(self, form):
        """
        登録処理
        """
        # ...
        return HttpResponseRedirect(self.success_url)
```

今後、リダイレクトURLを動的に変更したり、パラメータを付与できるようにしたいと思いました。
そこで、`get_success_url`をオーバーライドする方法をとるようにコードを変更しました。
```views.py
class RecordCreateView(CreateView):
    # ...

    # success_urlに格納からget_success_url関数をオーバーライドするように変更
    def get_success_url(self):
        return reverse('record_list')

    def form_valid(self, form):
        """
        登録処理
        """
        # ...
        return HttpResponseRedirect(self.success_url)
```
上記のコードで実際に登録処理を実行しました。すると、登録には成功しました。しかし、「Page not Found」のエラーが発生しました。リダイレクト先もどうやらデフォルトのURLになっているようでした。想定と違う挙動となったため、原因を探る調査をすることにしました。

# 調査
いろいろな記事を回りましたが、`get_success_url`をオーバーライドすることで間違ってはなさそうでした。なのにうまくいかない。そもそも`get_success_url`が実行されているかをprintデバッグで試してみたところ、どうやら実行されていない様子。でも、`success_url`に値を格納する形だと想定通りの挙動になる。何かおかしいと思いソースコードを眺めていたところ、答えが`form_valid`にありました。

# 原因
```views.py
class RecordCreateView(CreateView):
    # ...

    # success_urlに格納からget_success_url関数をオーバーライドするように変更
    def get_success_url(self):
        return reverse('record_list')

    def form_valid(self, form):
        """
        登録処理
        """
        # ...
        # success_urlにリダイレクトしていたことが原因
        return HttpResponseRedirect(self.success_url)
```
`form_valid`でHttpResponseRedirectをreturnする処理を書いていたようでした。これにより、引数のURLにリダイレクトすることになります。継承元では`get_success_url`関数を呼び出してリダイレクト先を決めているの思います。ですが、それを`success_url`で固定するよう上書きしていたため、`get_success_url`関数が呼び出されることなく想定と違う挙動になってしまっということでした。

# 原因を踏まえての対応
```views.py
class RecordCreateView(CreateView):
    # ...

    def get_success_url(self):
        return reverse('record_list')

    def form_valid(self, form):
        """
        登録処理
        """
        # ...
        # 登録処理を済ませたら継承元の関数に任せるようにする
        return super().form_valid(form)
```

上記のコードのように、登録処理を済ませた後は継承元の関数に任せるようにしました。これで、無事に`get_success_url`関数が実行され、関数で返されるURLにリダイレクトできました。

関数のオーバーライドするときは、本来の挙動を変えてしまっていないか、注意していきたいです。

以上です。
2次元のListのkeyに同じ値が入っている場合にまとめる方法

List配列の中にList<String,String>の形で最初のStringに同じ値が入っていた場合は他のListに配列として入れるようなコードの書き方がわからなくて調べた。

Javaの`List`では、`List<String, String>`のような二つのジェネリック型を指定することはできなく、おそらくこちらでできる。

`Pair`や`Map.Entry`のような2つの要素を持つ型をリストに格納することで実現が可能。

リスト内で最初の`String`値が同じ要素を見つけた場合には、それらを別のリストに移動する、ということで可能。

以下は一例

まず、Apache Commons Langライブラリを使用して`Pair`型を利用する。もし使用する場合は、そのライブラリをプロジェクトに追加する必要がある。

```java
import org.apache.commons.lang3.tuple.Pair;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        // 初期のペアリストを作成
        List<Pair<String, String>> originalList = new ArrayList<>();
        originalList.add(Pair.of("key1", "value1"));
        originalList.add(Pair.of("key2", "value2"));
        originalList.add(Pair.of("key1", "value3"));
        originalList.add(Pair.of("key2", "value4"));
        originalList.add(Pair.of("key3", "value5"));

        // 結果を保存するマップを作成
        Map<String, List<Pair<String, String>>> resultMap = new HashMap<>();

        // 元のリストを走査
        for (Pair<String, String> pair : originalList) {
            String key = pair.getLeft();
            // マップにキーが存在しない場合は新しいリストを作成
            resultMap.computeIfAbsent(key, k -> new ArrayList<>()).add(pair);
        }

        // 結果を表示
        resultMap.forEach((key, value) -> System.out.println(key + ": " + value));
    }
}
```

このコードでは、`Pair<String, String>`型のリストを作成し、各ペアの最初の`String`が同じものを新しいリストに格納している。また、それらのリストは、キーを基にしたマップに格納される。
Firebase Analyticsのリアルタイムのデバッグ方法(Xcode向け)

## この記事は何？
Flutter開発をしていた時に、Firebase Analyticsのイベント発火を確認したかったのですが、
リアルタイムでは反映されなくて困ったのでその時の解決策をメモします。

## 解決策
XcodeのProduct > Scheme >
EditScheme -> Run -> Arguments Passed On Launch に```-FIRDebugEnabled``` を追加します。
自動で有効になっているはずです。

![スクリーンショット 2023-07-10 18.40.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/795935/adb6fe0c-38d7-a5c3-0edd-e08324b6f2e0.png)

Firebase側の確認画面をなかなか見つけられなかったのですが、Firebaseのプロジェクトコンソールの「Debug View」から確認できます
> 開発デバイスでデバッグモードを有効にしたら、Google アナリティクスの上部ナビゲーションで [StreamView] の横の矢印をクリックして [DebugView] を選択し、DebugView に移動します。

以下のように実機でアプリを動かしながら、実際とほぼ変わらないイベント計測が可能です！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/795935/4d0ed469-9e5a-535a-7b69-5676b2175aef.png)

上記方法は、<strong>実機でのデバック</strong>でしか確認できないのでご注意ください。

もし間違った箇所などあればご指摘ください。

## 参考記事

https://qiita.com/hinom77/items/d35d0009e4dfb8cb084e

https://wootan1102.hatenablog.com/entry/2017/03/14/201540

公式ドキュメントは以下
https://firebase.google.com/docs/analytics/debugview?hl=ja#enabling_debug_mode
サイズの小さな線形代数計算を高速に行う

# 結論
サイズの小さい、かつ固定長の線形代数の計算は[StaticArrays.jl](https://github.com/JuliaArrays/StaticArrays.jl)を使おう
# 実験
[公式ドキュメントのPerformance Tips](https://docs.julialang.org/en/v1/manual/performance-tips/)には、計算結果をPre-allocateする工夫として、次の例が掲載されています。

```Julia
function xinc(x)
    return [x, x+1, x+2]
end;

function loopinc()
    y = 0
    for i = 1:10^7
        ret = xinc(i)
        y += ret[2]
    end
    return y
end;

function xinc!(ret::AbstractVector{T}, x::T) where T
    ret[1] = x
    ret[2] = x+1
    ret[3] = x+2
    nothing
end;

function loopinc_prealloc()
    ret = Vector{Int}(undef, 3)
    y = 0
    for i = 1:10^7
        xinc!(ret, i)
        y += ret[2]
    end
    return y
end;

@time loopinc()
@time loopinc_prealloc()
```

結果は、手元の環境では

```julia
  0.323081 seconds (10.00 M allocations: 762.939 MiB, 14.33% gc time)
  0.035206 seconds (1 allocation: 80 bytes)
```
とメモリ消費量が減ったおかげでおよそ10倍計算時間が短くなりました。
しかし、StaticArrays.jlのMArrayを使うと

```Julia
function loopinc_prealloc_Mvec()
    ret = @MVector zeros(Int, 3)
    y = 0
    for i = 1:10^7
        xinc!(ret, i)
        y += ret[2]
    end
    return y
end;

@time loopinc_prealloc_Mvec()
```
```Julia
0.000001 seconds
```
なんとメモリ割り当てが0になり、計算時間がさらに約10000倍早くなりました。

# まとめ
公式ドキュメントには最速のやり方を載せて欲しい
【悲報】AppRunnerドキュメントのイベント名全然違う件

# はじめに

AppRunnerのデプロイ完了時に、通知が出したくて調べたところ、EventBridgeできそう（[リンク](https://docs.aws.amazon.com/ja_jp/apprunner/latest/dg/monitor-ev.html#monitor-ev.pattern-examples)）
この通りにやったらうまくいかない！！

# 結論

detail-typeも違うし、なんかキー名全然違う（笑）
公式ドキュメントだと「Service Status Change」のものが、実際は、「AppRunner Service Status Change」だった。他にもいろいろ違ったので、以下イベント例。

```json
{
	"version": "",
	"id": "xxxxxxxxxxxxxxxxxxxxxxxxxx,
	"detail-type": "AppRunner Service Status Change",
	"source": "aws.apprunner",
	"account": "123456789012",
	"time": "yyyy-mm-ddThh:MM:ssZ",
	"region": "ap-northeast-1",
	"resources": [
		"arn:aws:apprunner:ap-northeast-1:123456789012:service/xxxxxxxxx"
	],
	"detail": {
		"serviceId": "xxxxxxxxxxxxxxxxxxxxxxxxxx",
		"serviceName": "xxxxxxxxxx",
		"message": "Service status is set to RUNNING.",
		"previousServiceStatus": "OPERATION_IN_PROGRESS",
		"currentServiceStatus": "RUNNING",
		"severity": "INFO"
	}
}
```

みたいな感じなので、デプロイ成功時に通知を出す場合は以下のような感じ！
サービス名もフィルタした方がよさそうだけど、公式ドキュメントもたまには間違ってるので気をつけなはれや！！

```json
{
  "detail-type": ["AppRunner Service Status Change"],
  "source": ["aws.apprunner"],
  "account": ["123456789012"],
  "detail": {
    "previousServiceStatus": ["OPERATION_IN_PROGRESS"],
    "currentServiceStatus": ["RUNNING"]
  }
}
```
Run pgvector in docker

- docker pull ankane/pgvector
- docker run --name mypgvector -e POSTGRES_PASSWORD=654321 -p 5433:5432 -d ankane/pgvector
- Use DBeaver to connect pgvector, host:localhost, port:5433, username:postgres, password:654321 

- Run SQL:
```SQL
CREATE EXTENSION vector;
CREATE TABLE test1 (id bigserial PRIMARY KEY, name VARCHAR(100), embedding vector(3));
INSERT INTO test1 (name,embedding) VALUES ('a','[1,2,3]'), ('b','[4,5,6]'), ('c','[7,8,9]');
SELECT * FROM test1 ORDER BY embedding <-> '[3,4,5]';
```
（初心者向け）OpenAI APIとPythonでGPT-4を試してみる

この記事はChatGPTとNotionAIと対話しながら作成しました。


結論ですが、7月10日時点でGPT-4 APIは動かせませんでした。


## はじめに
人工知能の分野は、急速に進化しており、その中でも自然言語処理の分野は特に進歩が目覚ましいものとなっています。OpenAIのAPIを使用することで、GPT-4のテキスト生成機能を簡単に利用することができます。本記事では、OpenAI APIとPythonを使用して、GPT-4を試してみましょう。


## OpenAI APIについて

OpenAI APIは、GPT-4を使用するためのAPIです。これを使用することで、簡単にGPT-4を利用できます。APIを使用するには、OpenAIのWebサイトで登録を行い、APIキーを取得する必要があります。APIキーを取得すると、PythonでOpenAI APIを使用することができます。


【OpenAI公式サイト】
[OpenAI APIリファレンス](https://platform.openai.com/docs/api-reference/chat/create)

本来であれば、公式サイトの通りにすればうまくいくはずですが、私のPCではうまくいかなかったので以下の記事を参考にさせていただきました。

[OpenAI APIを使ってPythonでChatGPT遊びするための最初の三歩くらい](https://dev.classmethod.jp/articles/openai-api-chat-python-first-step/)

## 検証環境
* OS：Windows11
* Python 3.10.11
* venv
* VSCode


## 準備
今回はVSCodeとPythonの仮想環境で行いました。

https://qiita.com/toki_mwc/items/f2e81bdf244cab46cf5e

```powershell
pip install openai
```

次に説明するPythonスクリプトを実行するとエラーが出てしまいました。おそらく、環境変数がうまくいかなかったので以下を参考にしました。

[OpenAI API "AuthenticationError No API key provided" when switching to internalConsole in VS Code launch.json](https://stackoverflow.com/questions/76148267/openai-api-authenticationerror-no-api-key-provided-when-switching-to-internalc)



jsonファイルで環境変数を作成します。

https://qiita.com/toki_mwc/items/67047e93996c033f5c8e


```json
   {
        "OPENAI_API_KEY": "あなたのAPIキーをここに入れる"
    }
```


このjsonファイルは作成したプロジェクトフォルダの中に入れたらいいです。




## PythonでGPT-4を試してみる

まずは、gpt-3.5-turboでトライ


```python
import json
import openai


def load_api_key(secrets_file="secrets.json"):
    with open(secrets_file) as f:
        secrets = json.load(f)
    return secrets["OPENAI_API_KEY"]

api_key = load_api_key()
openai.api_key = api_key

response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "user", "content": "のび太について教えて"},
    ],
)
print(response.choices[0]["message"]["content"].strip())

```

>のび太（のび-だ）は、日本の漫画『ドラえもん』に登場する架空のキャラクターです。
>
>のび太は主人公であり、物語は彼を中心に展開されます。彼は小学生で、比較的おっちょこちょいで臆病者です。学校ではあまり優れた成績を収めず、勉強も苦手です。また、体力もなく運動も苦手ですが、心優しく人懐っこい性格で、友達想いな一面も持っています。
>
>のび太は、幼馴染のしずかちゃんに好意を寄せており、彼女との関係を進展させようと努力しますが、自信のなさからなかなか上手くいかず、ドジな行動 が災いしてしまうこともしばしばです。
>
>彼の最大の特徴は、未来からやってきた猫型ロボットであるドラえもんとの友情です。ドラえもんはのび太を助けるため、彼に様々な未来の道具を貸してくれます。のび太はこれらの道具を駆使しながら、様々な冒険や騒動に巻き込まれます。
>
>のび太は非常に人気のあるキャラクターであり、日本を代表する漫画の一つである『ドラえもん』のシリーズ作品において、中心的な存在となっています 。



よしよし。動いた。（のびーだ？）


続いてGPT-4。
モデルのところを変更すればいいはずだが…。

```python
import json
import openai


def load_api_key(secrets_file="secrets.json"):
    with open(secrets_file) as f:
        secrets = json.load(f)
    return secrets["OPENAI_API_KEY"]

api_key = load_api_key()
openai.api_key = api_key

response = openai.ChatCompletion.create(
    model="gpt-4",   # ここを変更
    messages=[
        {"role": "user", "content": "のび太について教えて"},
    ],
)
print(response.choices[0]["message"]["content"].strip())

```



> openai.error.InvalidRequestError: The model: gpt-4 does not exist



あれ？動かにゃい。（存在しないだと…。）

もしかしたら、やり方が違うのかも。または、アクセスが殺到している？


## まとめ

OpenAI APIとPythonを使用することで、gpt-3.5-turboは動かすことはできました。GPT-4は、進化した自然言語処理のアルゴリズムであり、非常に興味深いものです。今後、GPT-4がどのように進化するかに注目したいと思います。
pry-railsを導入してrails cを見やすくしてみた

# はじめに
`rails c`のirbの画面を見やすくするための[pry-rails](https://github.com/pry/pry-rails)の導入を、初心者にもわかりやすくまとめました。

導入までの手順は以下のサイトを参考にさせていただきました。
https://pikawaka.com/rails/pry

# 手順
#### 1. Gemfileに以下の記載をする
```
gem 'pry-rails'
```
Gemfileの場所は**Railsで作成したアプリケーションフォルダの中**です。この中に記載することでpry-railsのセットが完了します。
![スクリーンショット 2023-07-10 18.05.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729110/697f5b67-770b-b5b7-fa3e-a3c5bf08d8a5.png)


ただし、最下部にそのまま書けばいいと言うわけではありません。（最下部に書いてしまうと常時pry-railsが発動してしまう）
詳細は省きますが、今回のpry-railsは**デバッグ下でのみ使用したい**ので`group :development, :test do`の中に書きます。
![スクリーンショット 2023-07-10 17.54.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729110/00e5b84b-3a2a-abd7-31cb-ba50a00c3010.png)

#### 2. bundle installする
該当の作業ディレクトリ内のターミナルで`bundle install`と入力してください。
```
bundle install
```
`bundle install`することで、先ほど記載したGemfileの内容が実際に起動されます。

これで準備完了です。

# ビフォーアフター
 
導入前の`rails c`で普通にデータベースの検索をかけた結果はこんな感じでした。練習のデータベースから１０件のデータを取得してみるも、かなり見辛い。

![スクリーンショット 2023-07-10 17.19.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729110/ee2209d2-f892-e3c5-7f28-eedbaefbb056.png)

これがpry-railsを起動させるとこう！

![スクリーンショット 2023-07-10 18.18.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729110/00271a47-6c59-d800-3a57-4ef973e6cfa8.png)
**滅茶苦茶見やすくなりました！**
よくみるとirb(main)...>がpry(main)>に変わってますね。こうなってれば導入成功です。（１０件でないのは省略されているためです。↓にカーソルを合わせれば同じように見れます）

# おわりに
以上`rails c`におけるpry-railsの導入方法でした。
pry-railsは他にもデバッグ作業の効率化に役立つ機能を搭載しているようですので、便利だと思ったものがあればまた投稿します。
Go言語の例外処理がないってのは結局どういうこと？

# はじめに
はじめまして。インターンをしているイナです。
今回は初心者がGo言語の例外処理がないって本当なの？という部分について概念を中心に調べたものをまとめました。

# Q. 例外処理とは
まずは兎にも角にも、例外処理とはなんぞやってところからです。
いくつかのサイトで例外処理の定義について調べてみましたが、サイトによって言ってることはバラバラでした。
例外とエラーは一緒です or 違います！例外は想定外 or 想定内&想定外のエラーのことです！など人によって言ってることが違いました。

最初から壁が高すぎ...?と戦々恐々としていましたが、[IT用語辞典 e-Word](https://e-words.jp/w/%E4%BE%8B%E5%A4%96%E5%87%A6%E7%90%86.html)で気になる部分がありました。

> 例外は「エラー」（error）と同種の概念で、普遍的に成り立つ両者の明確な違いは無く、同義として扱われる場合が多い。ただし、プログラミング言語や処理系によっては両者に異なる意味合いが与えられている場合もある。

こちらの内容に関しては、まとめてくださっている方がいるので詳しくはそちらの記事をご覧になったほうが良いかと思います。
[例外とエラーの違い](https://qiita.com/KyojiOsada/items/4c65e3c014d27a16bb6f)


例外とエラーの違いに普遍的な概念がないために、例外処理も普遍的な概念が成り立たなくなっているみたいです。

**A. 例外処理の概念はプログラミング言語によって違う**

# Q. Go言語の例外処理の扱い
じゃあGo言語での例外処理ってどういう扱いなんだ？というところですが、公式のドキュメンテーションにありました。

- [Goのよくある質問](https://go.dev/doc/faq#exceptions)
> It also tends to encourage programmers to label too many ordinary errors, such as failing to open a file, as exceptional.

「プログラマーは通常のエラーも例外として分類する傾向がある」といった感じのことが前提として、述べられています。
実際に概念を調べていたときに、全てのエラーを例外としてる人もいたので納得です。
その上で[Go at Google](https://go.dev/talks/2012/splash.article#TOC_16.)で

> The Java-like style of try-catch-finally blocks interlaces multiple overlapping flows of control that interact in complex ways. 
>
> Javaのようなtry-catch-finallyブロックのスタイルは、複雑な方法で相互作用する複数の重なり合った制御フローをインターレースする

> Explicit error checking forces the programmer to think about errors—and deal with them—when they arise. Exceptions make it too easy to ignore them rather than handle them, passing the buck up the call stack until it is too late to fix the problem or diagnose it well.
>
> 明示的なエラー・チェックは、プログラマーにエラーについて考えさせ、エラーが発生したときに対処することを強いる。例外があると、問題を修正したり、うまく診断したりするのが手遅れになるまで、コールスタックの上に責任転嫁して、エラーに対処するのではなく、無視することがあまりにも簡単になる。

例外はできるだけ少ない方がよくて、エラーはできるだけ明示的な方がいいから、try-catch-finally形式の例外処理機構を用意してないと述べています。
ここからも分かる通り、Go言語では「意図しないエラー＝例外」というふうに扱っています。

**A. 例外（意図しないエラー）はできるだけ少ない方がよい**


# 結論
Go言語の例外処理がないというのは「try-catch-finally形式の例外処理機構がない」ということです。

# 補足：Go言語の例外処理の方法
じゃあ、Go言語処理の例外処理ってどうするの？というところですが、簡単にまとめると
- 通常のエラー
    - 関数はerrorを戻り値の最後に返すことを利用して処理する
- 例外
    - panic/recoverなどを利用して処理する

といった感じです。ただ例外は少ない方がいいという観点から、基本はerrorを使うことをGo言語では推奨しています。
詳しくは公式ブログがあるので、そちらを見ていただくのがいいかと思います！
- [Error handling and Go](https://go.dev/blog/error-handling-and-go)
- [Defer, Panic, and Recover](https://go.dev/blog/defer-panic-and-recover)




## 参考文献

この記事は以下の情報を参考にして執筆しました。

- [例外とエラーの違い](https://qiita.com/KyojiOsada/items/4c65e3c014d27a16bb6f)
- [「例外」がないからGo言語はイケてないとかって言ってるヤツが本当にイケてない件](https://qiita.com/Maki-Daisuke/items/80cbc26ca43cca3de4e4)
- 「例外処理」（2023年7月10日（月）11時（日本時間））『ウィキペディア日本語版』
https://ja.wikipedia.org/wiki/%E4%BE%8B%E5%A4%96%E5%87%A6%E7%90%86
- [Frequently Asked Questions (FAQ)](https://go.dev/doc/faq#exceptions)
- [Go at Google: Language Design in the Service of Software Engineering](https://go.dev/talks/2012/splash.article#TOC_16.)
- [Error handling and Go](https://go.dev/blog/error-handling-and-go)
- [Defer, Panic, and Recover](https://go.dev/blog/defer-panic-and-recover)
C言語でn個の要素からr個の要素を選ぶ組み合わせの数を求める。

# 注意！
・以下のネタバレあり

https://atcoder.jp/contests/abc143/tasks/abc143_b


# 学んだこと
・2N×(N−1)​/2 の公式
・二重ループのjの値

# 2N×(N−1)​/2 の公式 
・n個の要素からr個の要素を選ぶ組み合わせの数を求める公式。
・そもそも組み合わせは同じ要素を重複しない。
A B Cの組み合わせを考える場合は、AA BB CCは同じ要素を重複しているので考慮しない。

# 二重ループのjの値の実験したコード
・入力例1で実験しています。
<b>ACしたコード</b>
```C
#include <stdio.h>
int	main(void)
{
	int	n;

	scanf("%d",&n);
	// printf("%d\n",n);

	int d[n];
	for (int i = 0; i < n; i++)
	{
		scanf("%d",&d[i]);
		// printf("%d ",d[i]);
	}
	int ans = 0;
	for (int i = 0; i < n; i++){
		// j = i + 1と定義することでjの値が常にi + 1になるので同じ整数同士を掛け算しなくなる。
		for (int j = i + 1; j < n; j++){
			// printf("%d ",d[j]);
			ans += d[i] * d[j];
			printf("i = %d,j = %d\n", d[i],d[j]);
			printf("ans = %d\n", ans);
		}
	}
	// printf("%d\n", ans);
	return (0);
}
```
<b>ターミナル</b>
![スクリーンショット 2023-07-10 17.53.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823837/c8e317be-8ea2-59a3-b2a6-01edd1335474.png)

<b>実験したコード</b>
AA BB CCを同じ要素を重複しているので考慮したい時に使う。
(まだそのような問題は見たことがない)
```C
#include <stdio.h>
int	main(void)
{
	int	n;

	scanf("%d",&n);
	// printf("%d\n",n);

	int d[n];
	for (int i = 0; i < n; i++)
	{
		scanf("%d",&d[i]);
		// printf("%d ",d[i]);
	}
	int ans = 0;
	for (int i = 0; i < n; i++){
		// j = 1にすると同じ整数同士を掛け算するので2N×(N−1)​/2の公式の条件に合わなくなる。
		for (int j = 1; j < n; j++){
			// printf("%d ",d[j]);
			ans += d[i] * d[j];
			printf("i = %d,j = %d\n", d[i],d[j]);
			printf("ans = %d\n", ans);
		}
	}
	// printf("%d\n", ans);
	return (0);
}
```

<b>ターミナル</b>

![スクリーンショット 2023-07-10 17.55.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823837/474e9cad-2247-f7ae-5426-b9a5681f6c37.png)
【Rails】フロントから指定したidが返ってこなかった場合、バックエンドで新しいidを作成してレコードを作成する

*見習いエンジニア向けです

こちらの記事の方が簡潔で短く書けます。

https://qiita.com/ytnd0928/items/b16b1fc5bc8c01252d2f

# やること

Ruby on Railsを用いてバックエンドを実装している際に、フロントがid=1を指定します。
その際にid=1のものが存在しなかった場合に、バックエンド側でidを作成し、レコードを返すという実装をしたいと思いました。


### 手順1


フロントエンドからID=1が返ってこなかった場合に、Railsで新しいIDを作成してレコードを作成するか、既存のレコードを更新する。

- 今回はItemsControllerというコントローラーを作成
- PUTに処理を書く
- idが1のitemを探す
- id = 1のitemが見つからない場合(nilの場合).newで新しく作成する
- .saveで保存する



```ruby:ItemsController.rb
class ItemsController < ApplicationController
# PATCH/PUT
    def update
        @item = Item.find_by(id: 1)
        if @item.nil?
            @item = Item.new(@item_params)
            @item.id = 1
            if item.save
                render json :@item
            end
        else
           # 手順2での処理
        end
    end
```



### 手順2

- id = 1が存在していた場合、更新する
- もともと、id = 1 が存在しない場合404を返していたため、ルーティング間違った？？というような感覚になったため、204を返すようにする
```ruby:ItemsController.rb
class ItemsController < ApplicationController
# PATCH/PUT
   def update
      @item = Item.find_by(id: 1)
      if @item.nil?
        @item = Item.new(@item_params)
        @item.id = 1
        if @item.save
          render json: @item
        end
        
    # 手順2で追記
      elsif @item.update(@item_params)
        render json: @item
      else
        # 204を返す
        head :no_content
      end
    end

    private
    
      def permitted_params
        params.require(:@item).permit(:description)
      end
```

### 結果
Itemテーブルが空の場合、またはidカラムの中に1が存在しない場合(nullの場合)、新しくid = 1のレコードを作成することに成功。
Itemテーブルの中にid=1の行が存在していた場合、id = 1の中身を更新することに成功。


# 最後に
なんとかいけた
【LINE×GAS】非エンジニアが順番予約システム実装してみた

<h2>自己紹介


　初投稿記事:raised_hand_tone1:

　皆様はじめまして！当方、地方企業で働くゴリエルと申します。

　非エンジニアで、ただの営業マン（40歳）です。
　
　ＡＩが当たり前に活用され、リスキリングなんて叫ばれる時代。

　
　chatGPTを使ってみて衝撃を受けた私は、

　<b>★これはもうエンジニアじゃなくても、システム作れんじゃね？？</b>
　
　と安易に考え、QiitaさんとchatGPT兄貴の手を借りて色々作ってみることにしました。
　
　自分への備忘録としても活用していきます。


<h2>非エンジニアのキーワードは、chatGPTとGAS

　私のようなド素人の非エンジニア、且つ40歳おじさんにとってのキーワードは、
　
　<b>・chatGPT</b>
　<b>・GAS</b>
　
　です。これは間違いないです。
　
　Qiitaには沢山の先人がおられ、LINEやGASで検索すると多くの事例が共有されています。
　
　Googleフォームやスプレットシートを使った事例を参考にして、色々と作成する事ができました。
　
　GASを使う場合、コードを理解する必要もでてくると思いますが、

　よく分からないままアホみたいな質問をしても、GPT兄貴に聞けば教えてくれます。
　
　しかも何度でも根気よく。ここのコード例書いてくれや！という雑な質問にも応えてくれます。
　　

<h2>医療機関でよく使われる順番予約システムを実装したい


　参考にしたのは、実際に耳鼻科で開業医をされている土井先生の記事。

https://qiita.com/doikatsuyuki/items/842b675415abd463e499


　ドクターって本当に凄い。

　元々賢いから、ちょっと触ると自分でシステムを作ってしまうって先生を、
　
　たまに現場でもお見かけします。（尊敬）　
　
　
　医療機関でよく見る順番予約システムというのは、私も販売したことがありますが、

　<b>・イニシャルコスト：数十万～
　・毎月コスト：１万～</b>
　
　くらいの費用がかかっていたりします。
　
　それをご自身で作ってしまうのですから・・・


　
　先生が公開している内容で自分が理解できないところは、
　
　GPT兄貴にしつこく聞きながら、1日かけて作りました。
　
　全く無知な私の能力では、流石に１時間じゃ無理でしたが💦

　
　作成者へ直接質問すると、作成者様自身の時間を取ってしまいますが、
　
　GPT兄貴になら気兼ねなく何度でも質問できます。
　

<h2>作成したシステムの概要図

　![概要図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509710/900b0481-4cf0-b08f-f5a8-24516a2583b5.png)


　こちらが概要図です。
　
　患者さんがLINEで発券すると、Googleスプレットシートの番号が更新。
　
　土井先生の事例だと、WEBアプリをで搭載しているようでしたが、


https://qiita.com/doikatsuyuki/items/2fa437eabbf778782bc7

　
私は、GoogleSiteとGoogleスプレットシートを連携する事で実装しました。



<h2>作成したシステムを体験できます

　<b>★順番システムを試すLINE友達登録はこちら　↓　
![LINEで友達登録.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509710/d5df821d-7aaa-e654-1282-dbb5a1580ad5.png)


※むやみに利用したり、公開したりは致しませんが、
　LINEIDがを知られるのは嫌だ！という方は利用を遠慮ください。


　
　<b>★表示状況はこちら　↓
　https://sites.google.com/view/goriwell-jyunban


<h2>作成時に必要な知識
　

今回省いておりますが、

・LINE公式アカウント
・GAS
・Googleスプレットシート
・GoogleSite

等、


素人とは言え、最低限触って理解して使ってみないと駄目な部分があります。

それこそ、QiitaやchatGPTに聞けば教えてくれるので、説明は割愛しています。

また、コードは土井先生が載せているものから着想を得ていますので、私は載せていません。

上記にて実際に動くところを体感いただけたらなと。


<h2>無料で動いているけど、これで十分なのでは

　
　シンプルな順番システムを利用するなら、これで十分なのではないでしょうか。
　
　この内容を公開されている土井先生が、只々凄すぎるの一言に尽きます:sweat_smile:
　

<h2>今後も色々改良してみたい

　素人ながら先人達の記事を参考にして、今後もGoogleWorkSpaceやGASなどを活用し、
　色々と業務改善を進めていきたいと思います。

　
　最後まで見ていただき、ありがとうございました。
　
　初めての投稿で至らぬ点もあるかも知れません。
　
　内容不備やご指摘等ありましたら教えていただければ幸いです。

　
　ゴリエル
スクラムでのボーイスカウトルールについて考えてみた

## はじめに
私達のスクラムチームのスクラムマスターで定期作業のかいぜんについて話している中で、「ボーイスカウトルール」を使ったらどうか、という話題が上がったので、スクラムでのボーイスカウトルールについて考えてみました。

## ボーイスカウトルール
ボーイスカウトルールとは、「来た時よりも美しく」というものです。
以下の記事を参考にしています。
[ボーイスカウト・ルールってご存じですか？
](https://qiita.com/eKushida/items/c3c57dcf50a4c8905d77)

プログラマが知るべき97のことにも記載があります。
[プログラマが知るべき97 ボーイスカウトルール](
https://ja.wikisource.org/wiki/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%8C%E7%9F%A5%E3%82%8B%E3%81%B9%E3%81%8D97%E3%81%AE%E3%81%93%E3%81%A8/%E3%83%9C%E3%83%BC%E3%82%A4%E3%82%B9%E3%82%AB%E3%82%A6%E3%83%88%E3%83%BB%E3%83%AB%E3%83%BC%E3%83%AB)

この記事では、プログラムではなくて、スクラムの成果物へのボーイスカウトルールについて考えています。

## スクラムの成果物
スクラムの成果物としては以下があります。それぞれについてボーイスカウトルールで「来たときよりも美しく」できないか考えてみます。
- プロダクトバックログ
- スプリントバックログ
- インクリメント

### プロダクトバックログ
プロダクトバックログは整理せずそのままにしておくと、肥大化しがちだと思います。そのため、プロダクトバックログの整理にボーイスカウトルールを適用することで、プロダクトバックログが肥大化し過ぎるのを防ぎ、チームの焦点を絞り、最も価値のあるタスクに集中することができます。

プロダクトバックログにボーイスカウトルールを適用するタイミングとしては、プロダクトバックログリファインメントやスプリントプランニングがよいと思います。プロダクトバックログリファインメントやスプリントプランニングの際に、期限が過ぎたアイテムの更新や削除を行うことで、プロダクトバックログを常に最新の状態に保つことができます。

### スプリントバックログ
スプリントバックログはプロダクトバックログほど肥大化しないと思われますが、ボーイスカウトルールを適用することで、PBIに付随する各タスクの情報が常に最新かつ正確な状態に保たれるようにすることが可能です。

これにより、スプリントバックログはチームが開発を効率的に進めるための「美しい」ツールとなります。またスプリントのデータとして、ふりかえりで活用することができます。

### インクリメント
[スクラムガイド](https://scrumguides.org/docs/scrumguide/v2020/2020-Scrum-Guide-Japanese.pdf)には、インクリメントは以下のように記載されています。
> インクリメントは、プロダクトゴールに向けた具体的な踏み⽯である。インクリメントはこれまでのすべてのインクリメントに追加する。

この説明やインクリメントという言葉から、積み上げていくものと捉えがちです。しかし機能の削除やリファクタリングもインクリメントの1つと捉えることができ、ボーイスカウトルールの適用も可能です。

機能の削除やリファクタリングはプロダクトのシンプルさと効率性を高めるための重要な戦略となり得ます。これは、プロダクトオーナーや開発チーム全体にとってもとても価値の高いものだと思います。

そのようなボーイスカウトルールのPBIをスプリントに投入することで、プロダクトのユーザビリティ、保守性、そして全体的な品質を向上させるとともに、必要な機能だけに焦点を絞ることで開発の効率性も向上させる可能性があります。

## まとめ
スクラムの成果物に焦点を当てて、ボーイスカウトルールを適用できるか考えてみました。

ボーイスカウトルールは、スクラムチームがプロダクトの品質と効率性を継続的にかいぜんするための一つの有効な戦略です。

また、ボーイスカウトルールは継続的にプロダクトを維持するために必要なマインドやプロセスだと思います。スクラムのように反復的・漸進的やり方と、親和性の高いものだと思いました。
(メモ)RailsでMySQLのstraight joinを利用する方法

この記事は
===

* RailsでMySQLの方言「```STRAIGHT_JOIN```」をある程度ちゃんと使う方法をまとめます

やりたかったこと
===

* MySQLで実行計画を見ていると、期待と異なる順序でテーブル結合がされることがあります
* [```STRAIGHT_JOIN```](https://dev.mysql.com/doc/refman/8.0/ja/join.html)はそんな場合に強制的に結合順序を指定する句です
* 左側のテーブルが常に右側のテーブルの前に読み取られるようになります
* SQL的には普通の```JOIN```の場所に```STRAIGHT_JOIN```と書けばいいだけです

しかし
---

* ActiveRecordはSTRAIGHT_JOINに対応しておらず、普通に差し込むことはできません
* 太古の昔に[無理やり文字列的に差し込んで対応している人](https://discuss.rubyonrails.org/t/straight-join-in-rails/21458)はいたりするのですが、複雑なSQLを組んでいる場合、そんな雑なやり方ではSQL構文エラーになり、うまくいきません

ちなみに
---

* MySQL8系以降では、[optimizer hints](https://dev.mysql.com/doc/refman/8.0/ja/optimizer-hints.html)という、OracleみたいなSQLコメントのshebangを書けて、オプティマイザへテーブル結合の優先度を提案することができます
* そして、最近のRailsでは[optimizer_hints](https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-optimizer_hints)メソッドを使うことで、オフィシャルに利用することができます
* MySQL5.7以前でもhintはあるのですが、テーブル結合に関する指定ができず、STRAIGHT_JOINを利用することになります
* MySQL8以降でもhintはあくまでヒントなので、絶対に結合順序を指定したい場合はやはりSTRAIGHT_JOINを使う局面はあるかもしれません

ざっくりしたやり方
===

* RailsのActiveRecordは[Arel](https://github.com/rails/rails/tree/main/activerecord/lib/arel)というSQL生成ライブラリを内部で利用しています
* 内部ライブラリというには汎用性が高すぎて超便利で、通常時でもちょっと凝ったサブクエリなどを使いたい場合は、Arelを使うといい感じに書けたりします
* 今回はArelを拡張し、新たな句を追加することでSTRAIGHT_JOINに対応させます

具体的なやり方
===

Arelの拡張
---

* initializerの中で新たなArelのNodeサブクラスを定義します
    * ```class StarightJoin < Arel::Nodes::Join```という名前にしました
    * クラス名が大事なので、実装は空で問題ないです
* ArelがSQLを組み上げる時に構文木を巡回するvisitorに、STRAIGHT_JOIN対応の機能を追加します
    * ```visit_Arel_Nodes_StraightJoin```というメソッド名にします。これは上記クラスの名前をスネークケースっぽく書いたものです（命名規則）
    * メソッドの中身はほぼ[INNER JOIN](https://github.com/rails/rails/blob/a5fc471b3f4bbd02e6be38dae023526a49e7d049/activerecord/lib/arel/visitors/to_sql.rb#L549)のコピペです

```ruby:initializer/straight_join_ext.rb
module Arel
  module Nodes
    class StraightJoin < Arel::Nodes::Join
    end
  end
end

module Arel
  module Visitors
    class MySQL < Arel::Visitors::ToSql
      def visit_Arel_Nodes_StraightJoin(o, collector)
        collector << "STRAIGHT_JOIN "
        collector = visit o.left, collector
        if o.right
          collector << " "
          visit(o.right, collector)
        else
          collector
        end
      end
    end
  end
end
```

使い方
---

* こんな感じで```Arel::Nodes::StraightJoin```を使って、通常のArelの書き方に則った結合を書くと、STRAIGHT_JOINが出力されます
* ```TableA.joins(join_phrases)```以降はただのActiveRecordですので、ここからチェーンで諸々条件だとかを繋げていくこともできます

```ruby
table_a = ModelA.arel_table
table_b = ModelB.arel_table
join_phrases = table_a.join(table_b, Arel::Nodes::StraightJoin)
  .on(table_a[:model_b_id].eq(table_b[:id]))
  .join_sources
TableA.joins(join_phrases)
```

終わりに
===

* このあたりの仕組みを使えば、SQL方言への対応はそんなに怖くないですね！
ブロックチェーンアプリをApple審査に出すときのポイント - おかむーが最新ガイドラインをわかりやすく解説

 どもー、皆さん。no plan inc.の[おかむー](https://note.com/okamu_/n/nc8b3f80cdb58)です。今回は、ブロックチェーンやNFT（非代替性トークン）を取り扱うアプリをApple審査に出す際の要点をまとめていきたいと思います。

# この記事でわかること
- ブロックチェーンアプリをApple審査に出すときのポイントがわかります

# 2023年6月5日の最終更新版
まず始めに、AppleのApp Store Review Guidelinesを見てみましょう。2023年6月5日の最終更新版では以下のように記載されています。

https://developer.apple.com/jp/app-store/review/guidelines/

### 3.1.1 App内課金
原文
```
3.1.1 App内課金
Appのコンテンツまたは機能（例：サブスクリプション、ゲーム内通貨、
ゲームレベル、プレミアムコンテンツへのアクセス、フルバージョンの利用）は、
App内課金を使用して解放する必要があります。コンテンツや機能を解放するため、
ライセンスキー、拡張現実マーカー、QRコード、暗号通貨、暗号通貨ウォレットなど、
App独自の方法を用いることはできません。

3.1.3（a）の条件を満たす場合を除き、
App内課金以外の方法で、ユーザーを何らかの購入に誘導するボタン、外部リンク、
その他の機能をAppやメタデータに含めることはできません。
```

要するに
- コンテンツや機能を解放するためには、App内課金を使用する必要があります。

`つまり、ライセンスキーや暗号通貨、暗号通貨ウォレットなどのApp独自の方法を用いることはできません。`


### App内でのNFT販売
原文
```
Appは、App内課金を利用して、非代替性トークン（NFT）
およびNFTに関連するサービス（ミンティング、リスティング、譲渡など）を
販売することができます。
Appでは、NFTを所有することによってApp内のコンテンツや機能が解放されることがないことを条件として、
ユーザーが自分のNFTを確認できるようにすることが可能です。

App内課金以外の方法で、ユーザーを何らかの購入に誘導するボタン、
外部リンク、その他の機能をAppに含めないことを条件として、
他のユーザーが所有するNFTコレクションをブラウズすることを
ユーザーに許可することも可能です。
```

要するに
- 例外として、非代替性トークン（NFT）およびそれに関連するサービス（ミンティング、リスティング、譲渡など）はApp内課金を利用して販売することができます。

`ただし、そのNFTを所有することでApp内の他のコンテンツや機能が解放されてはならないという点に注意が必要です。`


### 3.1.5 暗号通貨について
原文
```
3.1.5 暗号通貨
（i）ウォレット：組織として登録しているデベロッパに限り、
Appで仮想通貨ストレージを提供することが許可されます。

（ii）マイニング：処理がデバイスの外部で実行されるもの（クラウドベースのマイニングなど）でない限り、
Appで暗号通貨をマイニングすることはできません。

（iii）取引：Appが、暗号通貨の取引を行うための適切なライセンスと認可を取得している
国や地域のみで提供されることを条件として、認可されている取引所での暗号通貨の取引や送金を、
Appで取り扱うことができます。

（iv）イニシャルコインオファリング：イニシャルコインオファリング（ICO）、暗号通貨の先物取引、
その他の暗号証券や準証券による取引を行うAppは、既存の銀行、証券会社、先物取引業者（FCM）、
またはその他の承認された金融機関のみ提供することができます。
またそうしたAppは、適用されるすべての法令に準拠している必要があります。

（v）暗号通貨のAppでは、他のAppをダウンロードする、他のユーザーにダウンロードを促す、
ソーシャルネットワークに投稿するといったタスクの実行に対して通貨を提供することはできません。
```

要は
- ウォレットの提供は組織として登録しているデベロッパに限られ、
- 暗号通貨のマイニングはデバイス外で実行されるもののみが許可されています。
- また、暗号通貨の取引は適切なライセンスと認可を取得している国や地域のみで提供されること、そしてICOや暗号証券取引は承認された金融機関のみ提供することが求められています。

なかなか厳しいっすねぇ〜

# まとめ
- iOSアプリを制作する前には、最新のレビューガイドラインをよく読み、リリースできるか確認しましょう


# ちなみにApple Review Guidelinesの毎回の差分
最新のガイドラインの差分については私が個人で更新している差分リポジトリからもご確認いただけます。

https://github.com/okamuroshogo/appleReview/commit/269dc72212dba99259351738779d20254b45dd13

![Screenshot 2023-07-10 at 4.02.46 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62822/04ee4896-7f01-be39-4036-26aac04f4de3.png)


先日のWWDCで行われた2023年6月5日の更新では、ブロックチェーンやNFTの部分に大きな変更は見られませんでした。

ただ、この領域は急速に進化し続けているため、Appleのポリシーもそれに応じて変化する可能性もあるので開発者としては、常に最新のガイドラインに目を通していこうと思っています〜

# no plan株式会社について
- no plan株式会社は、ブロックチェーン技術、Webサイト開発、ネイティブアプリ開発、チーム育成、などWebサービス全般の開発から運用や教育、支援などを行っています。よくわからない、ふわふわしたノープラン状態でも大丈夫！ご一緒にプランを立てていきましょう！
- [no plan株式会社について](https://noplan-inc.com)
- [no plan株式会社 | ブロックチェーン実績](https://noplan-inc.com/blockchain)
- [no plan株式会社 | ブログ一覧](https://noplan-inc.com/blog)
- [お問合せはこちら](https://noplan-inc.com/contact)
Arduino IDE 2.ｘの Arduino15フォルダの場所を変更する。

# この記事について
M5Stack core2のプロジェクトをビルドしようとしたらエラーになっていしまいました。
原因を調べていたら、windows環境でのパスの長さが問題らしいということで、追加ボードなどのライブラリなどがあるフォルダを移動させようとしたのが発端です。

# 発生したエラー
ボードはM5Stack - M5Stack core2 を選択してビルドすると、bits/c++config.h がないというエラーが発生。ボードをesp32 - M5Stack core2 で行うとエラーにはならず。

# 原因を探る
原因を探っていくとどうも、パスが長すぎるのが原因の様子。
Windowsの場合user profile以下にボードのライブラリ類がインストールされるため、長くなる傾向に。

https://github.com/arduino/arduino-cli/issues/1002

https://community.m5stack.com/topic/3255/error-compiling-for-m5stack-core2-in-arduino-ide/2

この問題使用するAPIによって出るんですよね．．．

https://learn.microsoft.com/ja-jp/windows/win32/fileio/maximum-file-path-limitation?tabs=registry

# Arduino15を移動させる
IDE 1.xのころは、CドライブをあけるためにUser Profile下にあったArduino15 フォルダを移動させていたのでIDE 2.x でもと思ったら思いのほか情報がなかった。
公式のフォーラム上でportable版についての議論にヒントが。

https://forum.arduino.cc/t/arduino-ide-2-0-portable/1031833/17

>An alternative is to point Arduino IDE to these paths by defining them in the Arduino CLI configuration file used by Arduino IDE at %USERPROFILE%/.arduinoIDE/arduino-cli.yaml.

早速手元の環境で以下の様に書き換え。（user:はスケッチの場所なのでファイル-基本設定から変更される。）

```arduino-cli.yaml
directories:
  builtin:
    libraries: d:\Arduino15\libraries
  data: d:\Arduino15
  downloads: d:\Arduino15\staging
  user: d:\arduino
```

書き換えた後、%USERPROFILE%/AppData/Local/Arduino15 を D: にコピーし、Arduino IDE
IDEを起動しこれでボードのインストールを試みたところちゃんと移動していました。

IDE 1.x と移動させる方法が変わっていたのでお困りの方お試しください。
Commerce Cloud のコミュニティ・サイトのまとめ

※ これから記載する事項は、私が所属する会社とは一切関係のない事柄です。

今回は Commerce Cloud 製品群のグローバル・日本のよく利用されるコミュニティ・サイトをまとめてみました。



## グローバル（英語）

### Commerce Trailblazers
製品に関わらずコマース製品群に関する情報を交換することができます。

https://trailhead.salesforce.com/ja/trailblazer-community/groups/0F94S000000kJKhSAM?tab=discussion&sort=LAST_MODIFIED_DATE_DESC



### B2C Commerce
B2C Commerce に関する情報を交換することができます。

https://trailhead.salesforce.com/ja/trailblazer-community/groups/0F93A000000DGi3SAG?tab=discussion&sort=LAST_MODIFIED_DATE_DESC



### B2B Commerce
B2B & D2C Commerce に関する情報を交換することができます。

https://trailhead.salesforce.com/ja/trailblazer-community/groups/0F93A000000HWXUSA4?tab=discussion&sort=LAST_MODIFIED_DATE_DESC



### Commerce Salesforce Order Management
Salesforce Order Management に関する情報を交換することができます。

https://trailhead.salesforce.com/ja/trailblazer-community/groups/0F93A0000004nUYSAY?tab=discussion&sort=LAST_MODIFIED_DATE_DESC


### B2C Commerce Developers
B2C Commerce の開発者向けの情報交換場所です。

https://trailhead.salesforce.com/ja/trailblazer-community/groups/0F94S000000H1fESAS?tab=discussion&sort=LAST_MODIFIED_DATE_DESC





## 日本（日本語）
### Success - Commerce Cloud コミュニティ 日本
日本語で運営されている Commerce Cloud を導入されたお客様同士が情報交換を行う場所です。

https://trailhead.salesforce.com/ja/trailblazer-community/groups/0F93A0000001zRMSAY?tab=discussion&sort=LAST_MODIFIED_DATE_DESC



### Commerce Cloud - Japan Developers
日本語で運営されている Commerce Cloud の開発者が情報を取得できる場所です。

https://trailhead.salesforce.com/ja/trailblazer-community/groups/0F94S000000H1M8SAK?tab=discussion&sort=LAST_MODIFIED_DATE_DESC




## その他

### Unofficial SFCC （英語）
非公式で運営されている Slack チャンネルでの情報交換、Github を通したリソースの取得、PODCAST の利用が可能です。

https://unofficialsfcc.com/



### The Rhino Inquisitor（英語）
グローバルの B2C Commerce の有名なトレイルブレーザーが運用しているブログ、コミュニティ、動画配信サイトです。

https://www.rhino-inquisitor.com/
インポートにおける"パッケージJava.hogeが存在しません"の対処法

# インポートにおける"パッケージJava.hogeが存在しません"の対処法

Visual Studio CodeでJavaのプログラムを作成している際に、以下のようなエラーが発生した。ただし、このエラーが発生しても実行することはできた。
その際の対処法についてまとめる。

対処法のみを知りたい方は、下まで飛ばしてください。
![java存在しません.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509684/b805a0ac-4f29-9a79-f233-87774a8be02c.png)
## 目次
[1. 実行環境](#実行環境)
[2. やってみたこと](#やってみたこと)
[3. 実際に有効だった対処法](#実際に有効だった対処法)
[4. 終わりに](#終わりに)
[5. 参考資料](#参考資料)

## 実行環境
- MacOS Monterey 12.4
- Mac book Air 2022 m1
- Visual Studio Code 1.79.2
- java version 20



## やってみたこと
- Javaのバージョンの変更
- vscode上でのJavaHomeのアドレスの変更
- パスが通っているのかの確認

ネット上でJavaのimport文のエラーについて調べると、これらのことを勧められたのでやってみた。しかし、これではエラーは治らなかった。

## 実際に有効だった対処法
- 拡張機能の"Java Language Support"の無効orアンインストール

下の画像の拡張機能を無効にすることでエラーが解消された。
![Java Language Support.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509684/6504360a-dd2e-cb77-e1ef-fc9818d74233.png)
理由としては、以下のIssues[[1]](#参考資料)にもあるように競合を起こしているからのようだ。
この機能を、無効(アンインストール)にすることでエラー文が消えた。
![java存在しません解消.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509684/8bc9c309-1f43-c400-f7e8-a5a0cd6efc69.png)

## 終わりに
今時点では実行することはできていたが、今後影響があったかもしれない。なので、エラーは可能な限り消すべきであろう。

### 参考資料
[1]https://github.com/redhat-developer/vscode-java/issues/956
jetpack composeでWrapContetを実装する

# はじめに
今回は`jetpack compose`で`WrapContet`を実装していきたいと思います
### 本文
実は意外と単純で
```kotlin
// 横
Modifier.widthIn

// 縦
Modifier.heghtIn
```
これを記述するのみです`min`と`max`を指定できるので結構使い勝手が良かったりします
### 最後に
今回は備忘録としてWrapContentのやり方を紹介しました
どなたかのお役に立てれば幸いです