OmniAICreator/Qiita-1.07M huggingface dataset:
Snowflake Pythonワークシートの出力(Output)に日本語を表示させる

## 結論

以下をハンドラーの前に追記すると良い。

```Python
import sys
import io

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
```

結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475867/1792f923-98c5-773d-2423-482a6060917c.png)


### Pythonワークシートは便利

Snowflake上でPythonを書いて実行できるのは便利。

とりあえず何らかのPythonでコードを書いて試してみよう...みたいなお手軽実行環境としても、アドホック対応でPythonコードを書いて実行して何かしらデータを更新する、みたいに使える。

FaaSっぽく使える？は言い過ぎかもしれないが。
クラウド上でエディタを開いてPython書いてクラウド上のコンピュートリソースを使って実行できて、実際にデータベース(リソース)に反映することができる、そういった動きからすると使用感としては近しい何かはあるのかな。

また、ここでコードが動くことを確認できていれば後でストアドプロシージャ(Python)に移植するのも楽になる。

とはいえまだ[プレビュー機能](https://docs.snowflake.com/en/developer-guide/snowpark/python/python-worksheets)の模様。

### 日本語が使えなさそう？

デバッグプリント目的で日本語を表示させようとすると、なんかエラーが出るぞ...

Pythonワークシートに以下のようなコードを書いてみる。

```python
import snowflake.snowpark as snowpark


def main(session: snowpark.Session): 
    print("日本語の表示テスト")
```

このコードではreturnしないので、Settings -> Return type を String にしておく。

また、Pythonワークシートを実行するときの最低限のお作法？としてはUSAGE権限があるデータベース、スキーマを選択しておくことも忘れずに。(SnowflakeデータベースのようなシェアオブジェクトもNG)

選択していない状態でコードを実行した後、Outputタブを開くと以下のように表示されているので、日本語表示確認どころではない。

```text
Log output not captured. Ensure you have selected a database and schema on which your role has USAGE privileges, and that the selected database is not from a share, then run the worksheet again.
```


では改めて。
先ほど書いたコード実行すると、Resultsタブの方に...

```text
100357 (P0000): Python Interpreter Error:

Traceback (most recent call last):
  Worksheet, line 4, in main
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-8: ordinal not in range(128)
```

とのこと。
日本語が入っているとこうなる。

これは、Snowparkのdataframeに日本語が入っているときに、dataframe.show()のように表示しようとしても同様のエラーに引っかかる。
日本語が入っているデータを扱う際には何かと引っかかってストレスになりそうな予感。


### なら対策すればいい

とりあえず出力時の文字コードに関する問題っぽいので、対処してみる。

```python
import snowflake.snowpark as snowpark
import sys
import io

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')


def main(session: snowpark.Session): 
    print("日本語の表示テスト")
```

これを実行すると...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475867/49fffd80-0e34-c4a8-fc44-1219bece4516.png)

Resultタブの方は何も出ない。 これはreturnしていないから。
エラーはないので、うまくいったということ。

Outputタブを開いてみると...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475867/72712511-94cb-1fb0-d273-3cb3721cac9f.png)

うまく表示できた。

標準エラー出力等も考慮してみると、以下の記述にしておいた方がいいかも。

```python
import snowflake.snowpark as snowpark
import sys
import io

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')


def main(session: snowpark.Session): 
    print("日本語の表示テスト")
```

とりあえず、現時点でSnowflakeのWebUI(Snowsight)でPythonワークシートで日本語をデバッグ出力したいならこの設定を入れておこう、といった感じで良さそうかな。
(SwiftUI)Firebaseに画像とテキストをアップロードしてみた

## 今回使ったFirebaseの味噌となるメソッド
- putData() 
- downloadURL()
- setData(from:)
## 画面

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3232025/f83ef43a-402c-4f2a-3682-047f33090e7f.png">

## アップロードするためのメソッド
```swift
func uploadFirebase(datas: [PersonData]) async throws {
        
        guard let uid = uid else {
            throw FirebaseError.uidError
        }

        for data in datas {
            guard let uiImage = UIImage(named: data.imageString),
                  let imageName = uiImage.jpegData(compressionQuality: 0.8) else {
                throw FirebaseError.getImageError
            }
            //Firebase Storageのリファレンス
            let storageRef = Storage.storage().reference().child("users/\(uid)/\(imageName)")
            //ストレージへ画像情報をアップロード
            storageRef.putData(imageName)
            //ストレージから画像のURLを取得する
            let url = try await storageRef.downloadURL()
            //urlをString型に変更
            let urlString = url.absoluteString
            //Firebaseに保存する。
            let person = PersonData(name: data.name, imageString: urlString)
            //Firestoreのリファレンスを作成
            let db = Firestore.firestore().collection("user").document(uid).collection("persons")
            //Firestoreへ保存する
            try db.document("\(person.name)").setData(from: person)
            print("🟢 Upload successful!")
        }
    }
```

## 内容の説明
1. PersonData型は`name: Stirngと imageString: String`を持っています。
1. 今回はFirestoreのUsersコレクションの直下にユーザーのuidを使って、uidドキュメントを作りたかったり、Storageの中にユーザーの階層フォルダをuidを使って作りたかったりしたので、`Auth.auth().currentUser?.uid`を使い取得してきています。
1. ここからですが、データをFirebaseにアップロードしていきます。storageRefを使って`.putData()`を使って画像データをアップロードします。
1. その後、storageRefに上がったURLを`.downloadURL()`を使って取得してきます。これは、Firestoreへは大きなデータを格納することはできないため、画像の保存場所のみをFirestoreへ教えてあげるために行います。
1. 最後に、`.setData()`を使ってFirestoreへデータをアップロードします。


## 最後に
現在作っているアプリの勉強過程をあげています！
もしも、違っているところや、こうした方が良いというところがありましたら、是非教えていただけると幸いです！！
特に、for文を使っていますが、もっと良い方法がないものでしょうか,,,,,
今回の場合は帰り値は必要ない？？
【2023年10月版】Windows への socat のインストール

# はじめに

Windows で socat を使いたいのでインストールするメモ

# インストール

## cygwin の準備

以下の記事を参考に、 cygwin をインストールする
[【2023年10月版】WindowsへのCygwinのインストールとパッケージマネージャの設定](https://qiita.com/nouernet/items/271a285db517e4a25817)

## socat のインストール

```
apt-cyg install libwrap0
apt-cyg install socat
```

※ libwrap0 がインストール出来ないときは、`setup-x86_64.exe` を使ってインストールする

# socat の実行

```plantuml
@startuml
left to right direction
rectangle "セグメントA\n172.16.0.0/24" as segment_a {
  node "クライアント　\n172.16.0.100" as client
  interface "172.16.0.5:13389" as socat_server_interface_a
}
rectangle "セグメントB\n10.0.0.0/24" as segment_b {
  node "転送サーバ\n10.0.0.10" as socat_server
  node "RDPサーバ\n10.0.0.11:3389" as content_server
}
client --- socat_server_interface_a
socat_server_interface_a --- socat_server
socat_server --- content_server
@enduml
```

```terminal
socat TCP-LISTEN:13389,bind=172.16.0.5,reuseaddr,fork TCP:10.0.0.11:3389
```

# さいごに

かんたんでしたね
React公式チュートリアルの三目並べに追加機能を実装してみた #6（AWSで公開しろ！編）

## はじめに
前回まででReact公式チュートリアルの三目並べに追加機能を実装しました。
せっかくなのでネットで公開したいですよね！ということで公開しちゃいましょう。

## 手順
公開までに必要な手順は以下です！

・ドメインの取得
・AWSでwebサーバを立てる
・作った三目並べをデプロイする

長かったので上二つは別記事に切り出しました。汗

## ドメインの取得

ドメインの取得は以下の記事にしました！こちら参考に取得してください。↓
[【お名前.com】初めてドメインを取得してみた](https://qiita.com/Ryukuu0919/items/64b2f46beac8aadbb3e5)

## ・AWSでwebサーバを立てる
こちらの手順は以下の記事に切り出しました。↓
[【AWS】ドメイン取得してブラウザでHello worldを表示させるまでやってみる](https://qiita.com/Ryukuu0919/items/e60aaf2efddbcf1356f3)

## 作った三目並べをデプロイする

さて、ここからがこの記事の本題です、、！
ここまでで【ドメイン】と【Webサーバ】は用意できているはずなのでデプロイのフェーズに入ります。

Reactは作ったプロジェクトをそのままサーバにアップロードすれば動くわけではありません。
**ビルド**というものをしてあげなくてはならないのです。

まず、ローカル上でプロジェクトディレクトリに移動し、以下のコマンドを実行します。
```
npm run build
```

成功したら「build」というディレクトリが作成されたはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3577451/2b8f1978-33ac-6478-d434-615d4ce22ffc.png)

作成された「build」ディレクトリをEC2の「/var/www/html/」配下にアップロードしましょう。
自分はコマンドを打つのが苦手なので**WinSCP**というFTPソフトでアップロードしています。

▼winscpの画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3577451/bac06785-f0f5-5c34-0b11-389147930f40.png)

アップロードする際にパーミッションエラーがでてしまう場合は、EC2に接続して以下のコマンドでディレクトリ所有者の変更やパーミッションの変更を試してみてください。

▼所有者の変更
```
sudo chown ec2-user:ec2-user /var/www/html/ -R
```
▼パーミッションの変更
```
sudo chmod 755 /var/www/html/ -R
```

buildをアップロードできたら次にwebサーバのDocumentRootを変更していきます。

```
DocumentRoot "/var/www/html/build"
```
Apacheを再起動して、変更を適用します。

```
sudo systemctl restart httpd
```

ここまで対応したら自分が取得したドメインをたたいてみましょう！

公開されているはずです。


## 最後に

ここまで長かったですが、webアプリを作って公開するところまでやり通すことができました。
いずれはちゃんとしたCI/CD整えていきたいですね！
拙い記事ですが見ていただいてありがとうございました！

### 他の関連記事↓
[React公式チュートリアルの三目並べに追加機能を実装してみた #1（現在のターンを示せ！編）](https://qiita.com/Ryukuu0919/items/50dc599c4f5acf4478b9)
[React公式チュートリアルの三目並べに追加機能を実装してみた #2（ループ処理でボードを表示しろ！編）](https://qiita.com/Ryukuu0919/items/7ec65b2964f611454c5e)
[React公式チュートリアルの三目並べに追加機能を実装してみた #3（トグルボタンを追加しろ！編）](https://qiita.com/Ryukuu0919/items/f22b4d6d13095b305cd3)
[React公式チュートリアルの三目並べに追加機能を実装してみた #4（勝利のマスを強調しろ！編）](https://qiita.com/Ryukuu0919/items/c44c5649d1f08b8e31f7)
[React公式チュートリアルの三目並べに追加機能を実装してみた #5（各ターンで打った手を記憶しろ！編）](https://qiita.com/Ryukuu0919/items/cdcd08987f6b727798f9)
Googleから学ぶプロンプトエンジニアリングのTips集


# 1: モデルの良し悪しを把握する

- AIモデルの能力と限界を理解することが開発者にとって重要
- モデルのトレーニングデータに偏りがあると、モデルも偏った結果を生む
    - 例えばブルーベリーの画像を認識するためにトレーニングされたモデルはストロベリーのがぞうを認識できない可能性がある。両方を期待するモデルを構築しても，期待した通りの動きはせずUXの低下につながる。

- AIモデルは”トレーニングされたデータによっては偏見”を持つことに注意する。
    - 開発者はデータの公平性を担保しなければならない。

- プロンプトエンジニアはモデルの限界を理解し、適切なプロンプティングを行う必要がある
AIモデルは進化し続けているがユーザーが強みと弱みを理解することが重要。

# 2: できるだけ具体的に
 - モデルは様々なプロンプトを理解する能力があるが，具体的でないプロンプト誤った解釈をする可能性がある。曖昧さを減らすには自身が望む結果が得られるよう具体的な指示を送ることが重要。
 - モデルに実行してほしい具体的なタスク、目指すアウトプットの例、を述べることでモデルはリクエストをより早く理解でき、より正確で関連性の高い回答を生成できるようになる，
     - 料理のレシピをモデルに生成させたいとしても，料理を食べるのが自分だけなのか・パーティーのような大人数の場合なのかといった情報が欠如すると，必要な材料のリストアップや効率的な調理を行う方法を提供することができない。
     - 適せるな例

# 3: プロンプトとペルソナを試す
 - 様々なリクエストを探求することでモデルが回答をどのように重視しているか，様々なパラメータを持つモデルが何を生成するのかの理解を深めることができる。
     - キーワード・文構造・プロンプトの長さを試行錯誤し最適なプロンプトの型を探求すべし。


# 4: Chain-of-Thoughtをトライする
 - Chain-of-ThoughtはLLMの水温能力を向上させるテクニックである。複雑な問題を小さなステップに分割し，各ステップでLLMに中間的な推論の提供を求めることでLLMが回答をよりよく理解することが可能。
     - 単に「新しいビジネスプランを提案してください」と指示するのではなく，市場調査⇒ターゲット顧客⇒競合他社の分析⇒といった形でステップを踏ませることでLLMの推論プロセスが明確になり、最終的な回答の質が向上する。

# おわりに
この記事ではGoogleが提唱する良いプロンプトの作り方をまとめました。検索エンジンから欲しい結果を得るためのクエリのように，プロンプトの質がLLMの応答を左右します。MIT，BCGらの研究によると[生成AIを活用することでトップパフォーマーの生産性が17%, 低パフォーマーの生産性が43％も向上した](https://www.linkedin.com/pulse/power-prompt-engineering-google-cloud-gyfbe/?midToken=AQHtwI9PVtLIUA&midSig=0IfJ9cbWyGXWY1&trk=eml-email_series_follow_newsletter_01-newsletter_hero_banner-0-open_on_linkedin_cta&trkEmail=eml-email_series_follow_newsletter_01-newsletter_hero_banner-0-open_on_linkedin_cta-null-atu7nz~lo94nmtu~x4-null-null&eid=atu7nz-lo94nmtu-x4&otpToken=MTQwMDFhZTcxYTJlY2JjN2JkMjQwNGVjNGYxNmUzYjA4ZGNjZDM0ODk5YTk4NjYxNzdjMDA3NmI0YjVjNWFmMWYzZDRkZjkwNGVlM2YxZGI3NTljZDg4MjNiNTY0MzcyMDA5YWZhZjBmZjkxYTkxZjYzYzI3MSwxLDE%3D)そうです。よいプロンプトを学び，生成AIを効率的に活用することで日々の生産性を向上していきましょう。

# 参考URL
 - Tips to enhance your prompt-engineering abilities

https://cloud.google.com/blog/products/application-development/five-best-practices-for-prompt-engineering?hl=en
【XD・Photoshop・Illustrator】AdobeでGoogle FontsのNoto Sans JPを使いたい！！

## 概要
いつもXDなのでなんのフォントを利用していますか？
一般的なフォントってなんなのだろうかって調べた時に「**Noto Sans JP**」というフォントを見つけました。
今回は**Noto Sans JP**について、**Noto Sans JP**を使えるようにする方法を話ししていきます！

## 対象とする読者
* Adobe(XD・Photoshop・Illustrator)を使い始めた人
* Adobeで新しいフォントを利用したい人
* なんのフォントを使うべきか迷っている人
* Noto Sans JPを入れようと思っている人

### Noto Sans JPとは 
まずNoto Sans JPは**GoogleとAdobeが共同開発した日本語対応しているフォント**となります。

無償で利用でき、フォント自体もクセもなく使用しやすいため、たくさんのWebサイトで使用されています。

フォントウェイトが6種類と豊富なため、文字の線の太さを変更するだけで見出しや本文など、使い分けにも優れています。

### Google Fontsとは
Webフォントとして無料で提供されているサービスで、2010年に発表されてから多くのWebサイトで使用されています。
商用・非商用かかわらず誰でも使用でき、決まったコードをコピペするだけで使える手軽さはもちろん、必要なフォントはインストールして自身でデバイスで使うこともできます。

## AdobeにGoogle Fontsを入れる方法
それではAdobeにGoogle Fontsを入れる方法について説明していきます！
今回は説明にも出した「**Noto Sans JP**」を入れていきます！！

使いたいフォントをダウンロードしてインストールするだけです！！

### 1.Googleフォントからダウンロードする
以下のGoogleフォントの公式サイトからで使いたいフォントを選択して右上の「Download Family」をクリックすると圧縮ファイル（zip）でダウンロードされます。

https://fonts.google.com/

![スクリーンショット-2023-10-29-16.09.03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/778eec36-3e84-d3c3-4789-48ad58b30ca7.jpeg)

### 2.使用したいGoogle Fontsをインストールする
ダウンロードした圧縮ファイル（zip）を解凍します。
![スクリーンショット 2023-10-29 16.14.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/ec89629b-6a84-5e8c-5166-487ff0bd4fbf.png)
![スクリーンショット 2023-10-29 16.15.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/baa50b1d-8679-ef78-f911-fd2a0e26d320.png)
解答したフォルダを開くと、「**static**」 フォルダの中にそれぞれのフォントファイルが入っています。
![スクリーンショット 2023-10-29 16.15.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/06bd8d83-20a6-c8d5-ad5b-92487d66ddf2.png)
![スクリーンショット 2023-10-29 16.16.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/d1148043-e177-186a-1940-dd91cd751615.png)
この中で、使いたいフォントをダブルクリックすると、フォントの詳細画面が表示されます。![スクリーンショット 2023-10-29 16.18.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/27e3b17f-12d9-1f87-19bf-135b8ad78fb8.png)

右下の「フォントをインストール」を押して完了です。

インストール後、XD / Illustrator / Photoshopを起動すると、Googleフォントが使えるようになっています。

## 最後に
以上となります！
簡単に使いたいフォントをインストールできるので、デザインの幅が広がります。
ぜひ活用していただきたいです！！
GeometryNodesの小ネタメモ

## 概要
GeometryNodesを使用する際に便利な小ネタのメモ

## 環境
Blender 3.6.5
Windows11

## 汎用的なNodeGroupを作成しAssetBrowserから使えるようにする
- Node群を選択し Ctrl + G でNodeGroupを作成する (TabでNodeGroupを出入りできる)
- FakeUserボタンを右クリック -> Mark as Asset を押下する
- Edit -> Preferences -> File Paths -> AssetLibraries -> Path を設定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440297/510b0bd5-7c82-da89-686f-eb8772042b55.png)

- 設定したPath以下にblenderファイルを保存する
- AssetBlowser Windowを開いて作成したNodeGroupを選択し、諸々設定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440297/5046aa4b-1579-fd27-ae20-d2fc1c9b1907.png)

## UV展開

UV展開用のNodeがある
ここで配布されているblenderFileを読むと大体わかります

https://twitter.com/amalbubble/status/1544050909105496064?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1544050909105496064%7Ctwgr%5E8f9ff6f470b58796f61699f5ae959a311770c53f%7Ctwcon%5Es1_&ref_url=https%3A%2F%2F3dnchu.com%2Farchives%2Fuv-unwrap-nodes-b3d33%2F

Blender3.6.5ではFaceCornerに2DVectorの値を保管するとUVとして扱われるようです
既にUVがある場合もあるので Data -> UVMaps で確認すると良さそうです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440297/eb83b38f-7182-23e8-a573-e8fa8e987c31.png)

## ショートカット
NodeWranglerを有効にしておきましょう(いい感じのショートカットが使えるようになるらしい)
Edit -> Preferences -> Add-ons でNodeWranglerのチェックを入れると使えるようになります

- ミュート(m)
Node選択状態でNodeをミュートできます
- Outputに繋げる(o)
Geometry(緑色の丸)を出力に持つNode選択状態でNodeをOutputに繋げます
- Node検索 (shift + a -> s)

- 線を繋いだままNodeを外す(alt + ドラッグ)

## DualMeshでの六角形化
Icosphereに対してよく使われるDualMeshですが、事前にTriangulateを行うといい感じにしてくれる場合があります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440297/feea7e30-5652-34ae-1315-0d200a58e507.png)

## WireFrame
MeshToCurve と CurveToMesh で簡単なワイヤーフレーム化が出来ます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440297/989077c1-9124-7ddf-6566-caa1298a2d89.png)

ExtrudeMeshで押し出した面を削除する方法もあります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440297/900ef1ff-2967-29ee-5c3d-d9fecaa7782a.png)

## 円柱等のSmoothShade
比較

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440297/3793c13a-9459-5c3b-14aa-12495e365a96.png)

適応外にしたいところを分離するといい感じになります(もっと良い方法があるかもしれません)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440297/b3be9f87-c854-9f08-630a-cd766b100aea.png)

## 回転順
Blenderではオイラー角を使って回転する際の順序はXYZです
3Dの回転に苦しめられたときに思い出しましょう

## Transfer attribute の代わり
Transfer attribute は廃止されたみたいなので、Tutorial動画等に出てきたときはSample系のNodeで解決しましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440297/e4747400-86cb-240b-b722-9e7cf374b156.png)
AppleプロジェクトにFirebaseのカスタムディメンションを作成する

# 実施前提
・FirebaseをAppleプロジェクトに追加済みであること
https://firebase.google.com/docs/ios/setup?hl=ja
・Firebaseのデフォルトのイベントでは足りず、カスタムしたイベントをロギングしたい方向け

# 目次
[1.Firebaseでカスタム定義の設定](#1-Firebaseでカスタム定義の設定)
[2.Appleプロジェクトにコード実装](#2-Appleプロジェクトにコード実装)
[3.Firebase DebugViewで確認する](#3-FirebaseDebugViewで確認する)

# 1. Firebaseでカスタム定義の設定

1. Firebase -> 使ってみる ->プロジェクトを追加
https://firebase.google.com/?hl=ja

2. Firebase Console -> Custom Difinitionsを開く

3. カスタムディメンションを作成を押下
- ディメンション名：任意
- 範囲　ユーザーの場合：ユーザープロパティ　ユーザの属性変更のタイミングで設定して以後のイベントで保持される項目に使用する。

- 範囲　イベントの場合：イベントパラメータでNSDictionaryのキーに設定する名称を記載　イベント毎に別個になる項目に使用する。
※イベント名は32文字以内のため注意

※カスタム定義が不要になった場合、カスタム定義一覧の「︙」から「アーカイブ」を選択で非表示になる
再設定するまで使われない

# 2. Appleプロジェクトにコード実装
①import文を追加
```
@import FirebaseAnalytics;
```

②ユーザープロパティまたはイベントパラメーターを実装
　【ユーザープロパティ：Firebaseカスタム定義で「範囲　ユーザー」で設定した場合】
https://firebase.google.com/docs/analytics/user-properties?hl=ja&platform=ios#swift
- setUserProperty() メソッドを使用して、アプリのユーザー プロパティを設定する

例) Swift
food：設定する値が入っている変数
favorite_food：カスタム定義したユーザープロパティ
```
Analytics.setUserProperty(food, forName: "favorite_food")
```
例)Objective-C
```
[FIRAnalytics setUserPropertyString:food forName:@"favorite_food"];
```

　【イベントパラメーター：Firebaseカスタム定義で「範囲　イベント」で設定した場合】
- https://firebase.google.com/docs/analytics/events?hl=ja&platform=ios
- logEvent() メソッドを使ってイベントをロギングする

例) Swift
```
Analytics.logEvent(AnalyticsEventSelectContent, parameters: [
  AnalyticsParameterItemID: "id-\(title!)",
  AnalyticsParameterItemName: title!,
  AnalyticsParameterContentType: "cont",])
```
例)Objective-C
kFIREventSelectContent：カスタムログイベント名
parameters:@{@"パラメーター(NSDictionary)値" : @"カスタム定義したイベントパラメーター"}];
```
[FIRAnalytics logEventWithName:kFIREventSelectContent
                    parameters:@{
                                 kFIRParameterItemID:[NSString stringWithFormat:@"id-%@", self.title],
                                 kFIRParameterItemName:self.title,
                                 kFIRParameterContentType:@"image"
                                 }];
```
※NSDictionayはキー/値にnilが入るとアプリがクラッシュする可能性があるため、回避策として事前にnil判定を入れた変数を作成しておくと良い。
https://developer.apple.com/documentation/foundation/nsdictionary
例) 
```
//FirebaseEvent Test
NSDateFormatter *df =[[NSDateFormatter alloc] init];
df.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
[df setDateFormat:@"yyyyMMddHHmmss"];
NSDate *now = [NSDate date];
NSString *strNow = now != nil ? [df stringFromDate:now] : @"nil";
[FIRAnalytics logEventWithName:@"Login_button" parameters:@{ @"DateAndTime" : strNow }];
```

# 3. Firebase DebugViewで確認する
- Firebaseコンソール -> 分析 -> Debug
　端末でアプリを操作し、実装したカスタムイベントが表示されることを確認する

 ![スクリーンショット 2023-10-29 15.59.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2027418/c709ab79-6590-df6d-eeea-d95d5caef585.png)
【2023年10月版】WindowsへのCygwinのインストールとパッケージマネージャの設定

# はじめに

毎回、Cygwin と apt-cyg のインストール方法を、たびたび忘れるのでメモ

# 環境

Windows7, Windows10, Windows11
Windows Server 2012, Windows Server 2019, Windows Server 2022

# 手順

## インストーラーのダウンロード

- [Cygwin ホームページ](https://www.cygwin.com) から、 インストーラーをダウンロードする。
- 64bit版は、 [setup-x86_64.exe](https://www.cygwin.com/setup-x86_64.exe) をダウンロードする
- 32bit版は、 [setup-x86.exe](https://www.cygwin.com/setup-x86.exe) をダウンロードする

## Cygwin のインストール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143127/c3a1b6d2-ac35-f296-8e50-51c55bf1e982.png)

- 次へ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143127/a807e1bc-d225-9333-b856-0d258e6560b7.png)

- 次へ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143127/295980fd-e348-d8c7-1c1d-1c25348c89a3.png)

- 適当なフォルダを選択して、次へ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143127/05974a57-387d-9c55-104e-bfc1a33f8727.png)

- 適当なフォルダを選択して、次へ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143127/00e6e31e-ac71-5600-9dbc-facfe3aef622.png)

- 自分のネットワークに合わせて、次へ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143127/98064bd2-f4dd-c65c-bff0-44cee655e8af.png)

- jp の ダウンロードサイトを選択して、次へ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143127/3320031b-1c2d-ea70-8f16-e170f1ded34a.png)

- wget を Search して、 最新版を選択して、次へ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143127/a7d24883-69a4-0745-7f8a-718249de4443.png)

- 必要なダウンロードリストが表示されるので、次へ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143127/fc86e34a-bf42-6ff0-0d8a-b09baf5f8f16.png)

- ダウンロードが始まるので、待つ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143127/94451e70-8cbf-dd12-58bc-6fbebe2da149.png)

- 完了

## apt-cyg のインストール

```terminal
wget https://raw.githubusercontent.com/transcode-open/apt-cyg/master/apt-cyg
chmod 755 apt-cyg
mv apt-cyg /usr/local/bin/
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143127/6679c4c6-26c2-9de9-d59a-bf307b9af733.png)

# その他パッケージのインストール

- apt-cyg install でインストールする

```
apt-cyg install vim
apt-cyg install screen
```

# さいごに

かんたんでしたね
【AWS】LambdaからRedshiftに接続する【SecretManager】

## はじめに
AWSではDBの接続情報やAPIキーなどはSecretsManagerで管理されていることが多いが、これをLambda関数から取得してRedshiftへ接続しSQLクエリを発行するアーキテクチャと実装コード例を記事にしました。

## 使うAWSサービス
・AWS SecretsManager
・AWS Lambda
・Amazon Redshift

## 実現方法
### アーキテクチャ図
![SecretsManager＋Lambda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/587717e3-fdd1-5988-bd0b-037c6af6efdf.png)
### Lambda関数コード
※前提
SecretsManagerには「DBクラスタ名、データベース名、ユーザ名」が保存されている場合
#### ①SecretsManagerへの認証情報要求、②認証情報の返信（取得）
```python:sample.py
session = boto3.session.Session()
client = session.client(
    service_name="secretsmanager",
    region_name=【リージョン名】# シークレットマネージャのリージョン名を指定する(Lambdaの環境変数などから取得)
)
try:
    # ①SecretsManagerへの認証情報要求
    get_secret_value_response = client.get_secret_value(
        SecretId=【シークレットID】# 取得するシークレットIDを指定する(Lambdaの環境変数などから取得)
    )
except ClientError as e:
    raise e
else:
    # ②認証情報の返信（取得）
    if 'SecretString' in get_secret_value_response:
        secret = get_secret_value_response['SecretString']
    else:
        secret = base64.b64decode(
            get_secret_value_response['SecretBinary']
        )
```
#### ③認証情報で接続確立、④SQLクエリ発行、⑤クエリ結果返信（取得）
```python:sample.py
data_client = boto3.client('redshift-data')
# ③認証情報で接続確立、④SQLクエリ発行
# 個々の接続情報の指定にシークレットマネージャから取得した値を使用する
result = data_client.execute_statement(
    ClusterIdentifier=secret["dbClusterIdentifier"],
    Database=secret["database"],
    DbUser=secret["username"],
    Sql=【SQL文字列】,# 目的のSQLクエリを文字列で渡す
)

# 実行IDを取得
id = result['Id']
# クエリが終わるのを待つ
statement = ''
status = ''
while status != 'FINISHED' and status != 'FAILED' and status != 'ABORTED':
    statement = data_client.describe_statement(Id=id
    status = statement['Status']
    time.sleep(1)
    
# ③クエリ結果返信（取得）
if status == 'FINISHED':
    if int(statement['ResultSize']) > 0:
        # selectの結果なども戻り値があるSQLの結果の処理
        result = data_client.get_statement_result(Id=id)
    else:
        # 戻り値がないSQLの結果に対する処理
elif status == 'FAILED':
    # 処理が失敗時に何か処理
elif status == 'ABORTED':
    # 処理を中断したときの処理

```

## さいごに
Lambdaは環境変数の設定ができるのでついついそこで様々な変数を管理をしたい気持ちになりますが、他のLambdaで共通で使用している設定情報やより機密性の高いDBの認証情報などはSecretsManagerで一元管理して利用したほうがよいです。
ユーザ、組織セット(async await)のメモ

## はじめに
kintoneでユーザから組織をセットするのに手間取ったのでメモる。
余談だが、chatgptを使用せず、調査しながら行い時間がかかったが、chatgptをに聞くと瞬殺だった。chatgptを使用するのとしないのとでは明らかに生産性が違いすぎる。


## 行うこと
・kintoneでユーザ、組織の取得、そのセット方法を記載する。
kintoneではユーザと組織のフィールドは特定のものがある。
ユーザはユーザ選択の設定、組織は組織選択の設定である。
・kintoneはそのデータを取得するのにkintone apiを使用する仕様である。
そのとき非同期を扱うことになる。
・２つ以上の非同期を順次実行することが必要である。
その場合の例として記載する。


## コード例の説明
1.ユーザ取得
fetchUserOrganization
ユーザコードより、組織情報取得するkinetone.apiを使用している。
2.組織コードを反映
copyToAnotherApp
kintone.apiのPUTを使用し、マニュアルに従い登録している。
3.ユーザ取得して組織コードを反映
箇所抜粋
```javascript
 async function handleProceedEvent(event) {

        //ユーザの組織情報取得
        const organizationName = await fetchUserOrganization(user.code);
        if (organizationName) {
            //組織コードを反映
            await copyToAnotherApp(organizationName);
        }

}
```
上記は以下を行う。
3.1 非同期で1,2を行う。
3.2 3.1の非同期を行うために、asyncで処理関数を処理する。

(その他)
・プロセス管理によるアクションで実行を行う
event.action.name にて処理を振り分ける。

・データ取得、登録
kintone.api()を使用
取得箇所例
```javascript
    const response = await kintone.api(kintone.api.url('/v1/user/organizations', true), 'GET', { code: userCode });
```
登録箇所例
```javascript
    const response = await kintone.api(kintone.api.url('/k/v1/record', true), 'POST', body);
```

・プロセス管理のアクション時動作
eventのrecord、actionの使いどころがある。
```
kintone.events.on('app.record.process.proceed', function(event) {
    if (event.action.value === "承認") {
        // "承認" アクションがクリックされた際の処理をここに記述
    }
    return event;
});
```
https://cybozu.dev/ja/kintone/docs/js-api/events/detail/detail-process-proceed-event/



## コード例
```javascript
(function() {
  'use strict';

  // ユーザの組織情報を取得
  async function fetchUserOrganization(userCode) {
    const response = await kintone.api(kintone.api.url('/v1/user/organizations', true), 'GET', { code: userCode });
    return response.organizationTitles[0] && response.organizationTitles.length > 0 ? response.organizationTitles[0].organaization.name : null;
  }

  // 組織情報を別のアプリにコピー
  async function copyToAnotherApp(organizationName) {
    const body = {
      "app": コピー先のアプリID,
      "record": {
        "組織フィールド名": {
          "value": organizationName
        }
      }
    };
    const response = await kintone.api(kintone.api.url('/k/v1/record', true), 'POST', body);
    return response;
  }

 async function handleProceedEvent(event) {
    if (event.action.name !== "コピー") {
        return event;
    }

    const record = event.record;
    const user = record['ユーザ選択フィールド名'].value[0];

    if (!user) {
        return event;
    }

    try {
        const organizationName = await fetchUserOrganization(user.code);
        if (organizationName) {
            await copyToAnotherApp(organizationName);
        }
    } catch (error) {
        console.error("エラー:", error);
    }

    return event;
}

//レコード詳細画面が表示されたときに発火
kintone.events.on('app.record.detail.show', handleProceedEvent);

kintone.events.on('app.record.process.proceed', function(event) {
    if (event.action.value === "承認") {
        // "承認" アクションがクリックされた際の処理をここに記述
    }
    return event;
});


})();

```
kintone初心者用メモ

## はじめに
kintoneを知らないものが、kintoneを使用している人と会話をして、当たり前のように使用している言葉で戸惑ったこと、またkintoneの使用で整理した。

## 独特の表現
ヘルプが充実しているので読めば色々記載がある。

https://jp.cybozu.help/k/ja/user/basic.html

ポータル、アプリ、スペース、ピープルあたりが普通に表現される。
使用していると抵抗はなくなると思う。

## kintoneでいうアプリとは
特にアプリという表現はkintone特有で知っているアプリという概念とは異なる。

kintoneアプリとは以下のこと。
・画面のこと
・画面が簡単に作れる、コード記載は一切不要
・この画面がアプリとなる

その画面で、crud処理(データの登録、修正、一覧、削除機能)が組み込まれている。

アプリ間同士のデータのやり取りは以下３つの表現を使い行っている。
・関連データ一覧
関連箇所のアプリのデータを表示できる。
・ルックアップ機能
https://jp.cybozu.help/k/ja/user/app_settings/form/lookup/whats_lookup.html
・アクションボタン
アプリからアプリへのデータコピーを行える。

柔軟に行おうと思えば、カスタマイズという呼称で、kintone特有のjsを使用することになる。

## プロセス管理
この辺つまづく箇所となるかもしれない。
かっこよく記載すれば、申請や承認などのワークフローをデジタル化するもの。
このステータスのタイミングで何かをしたい、このアクションで何かをしたいという感じで暗にこのプロセス管理がどういうものか理解しておかないとさっぱりわからない箇所となる。

https://jp.cybozu.help/k/ja/user/app_settings/process/whatsprocess.html

## テーブル
この表現もまぎらわしいか思う、DBのテーブルの認識で一致していそうでそうでもない。

画面作成するときのフォーム部品の一つである。
明細に値する。

https://www.r3it.com/column/kintone-fieldtype-table


## おわりに
ざっくりであるが、kintone初心者が戸惑う箇所を列挙した。
わかりにくいかもしれないが、キーワードを列挙した。
SpringContainerを使った Singleton

Singleton自体は大丈夫だが、Springで使用するには以下のような問題点があった。 
1. Singletonパターンを具現するコード自体が多く入る。
2. 依存関係上、クライアントが具体クラスに依存し、DIP、OCPに違反する。
3. 内部属性を変更したり初期化したりすることは難しい。
4. private生成者で子供クラスを作るのは難しい。

# Spring Container
<details>
<summary>以前のコード</summary>
<div>

```java
package hello.hellospring.singleton;

public class SingletonService {

    // 1。 static領域にオブジェクトを1つだけ生成しておく。
    private static final SingletonService instance = new SingletonService();

    // 2。 publicで開いてオブジェクトインスタンスが必要な場合、このstaticメソッドを通じてのみ照会することができる。
    public static SingletonService getInstance() {
        return instance;
    }

    // 3。 生成者をprivateと宣言し、外部からnewキーワードを使ってオブジェクト生成をすることを防ぐ。
    private SingletonService() {

    }
}
```
</div>
</details>

```java
package hello.hellospring.singleton;

public class SingletonService {

}
```
- getInstance()のようなSingletonパターンを具現するためのコードを作成しなくてもよい。
- クライアントが具体クラスに依存せず、
- DIP、OCP、プライベート生成者から自由にSingletonを使用できるようになった。

<details>
<summary>以前のコード</summary>
<div>

```java
package hello.hellospring;

public class SingleTonTest {

    @Test
    void singleTonTest() {
        SingletonService singletonService1 = SingletonService.getInstance();
        System.out.println(singletonService1);
        SingletonService singletonService2 = SingletonService.getInstance();
        System.out.println(singletonService2);
        Assertions.assertThat(singletonService1).isSameAs(singletonService2);
    }
}
```
</div>
</details>

```java
package hello.hellospring;

public class SingleTonTest {
		@Test
    void stateFulTest(){
        ApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class);
        SingletonService singletonService1 = ac.getBean(SingletonService.class);
        SingletonService singletonService2 = ac.getBean(SingletonService.class);
				Assertions.assertThat(statefulService1).isSameAs(statefulService2);
    }

    static class TestConfig{
        @Bean
        public SingletonService singletonService() {
            return new SingletonService();
        }
    }
}
```
追加）Springの基本Bean登録方式はSingletonであるが、要請するたびに新しいオブジェクトを生成して返却する機能も提供する。 (Bean Scope)


# CGLIB #
- classのバイトコードを操作するライブラリでSingletonを保障してくれる。
- @Configuationを付けることで、AppConfig classを相続した任意の別のクラス(AppConfig@CGLIB)を作り、それをSpring Beanとして登録する。
- **@Bean**が付いたメソッドごとにない場合は、生成してSpringBeanに登録して返すコードを作り、

**すでにSpring Beanが存在する場合、存在するBeanを返却してSingletonを保障してくれる。**

```java
package hello.hellospring;

@Configuration
public class AppConfig {
		@Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
}
```

AppConfig@CGLIBはAppConfigの子タイプなので、AppConfig タイプで照会できる。
```java
@Test
void springContainerTest(){
    ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
    MemberRepository memberRepository = ac.getBean("memberRepository", MemberRepository.class);
}
```
【受験記】AWS Cloud Practitioner 合格した！

## AWS Certified Cloud Practitioner (CLF-C02)とは？

AWS が実施するサービスの全体の概要把握を目的とした初級レベルの試験
なので、範囲がとてつもなく<font color="red">広い</font>

<br>

以下のリンクからサインインして、試験スケジュールを立てることから始めます。

https://aws.amazon.com/jp/certification/certification-prep/?th=tile&tile=ways

## なぜ、受けようと思ったか？

- 2023/10〜参画したプロジェクトで AWS を使用しているところに入った
- 個人的にそろそろ AWS も使えた方が良いなぁ〜という機運高まった
- **資格手当**欲しい

### <font color="red">**_5000 兆円欲しい!_**</font>

## 筆者のスペック

- CS の基礎的なOS、ネットワーク、セキュリティの<font color="red">知識はある</font>
- GCP の<font color="red">使用経験あり</font>
    - Compute Engineを用いて仮想サーバを構築できる
    - App Engineでアプリケーションをデプロイできる
    - Cloud RunでCI/CDを使用したアプリケーションの構築ができる
- クラウドに関する<font color="red">概念や知識はある</font>
- AWS のサービスも GCP で置き換えれば<font color="red">分かる</font>
- 保守経験もあるので、パフォマンスやチューニングについても<font color="red">多少の理解がある</font>

## 勉強方法

- Udemy をやる
- Udemy の模擬試験をやる

ひたすら、模擬試験を**繰り返し**解いて問題に慣れる

**以上**


### 参考にした Udemy の教材

:::note info
私が、使用したのはビジネスプランの講座ですが、通常版のリンク貼っております。
:::


:::note warn
ワクトでは、福利厚生でUdemyビジネスプランを契約しているため、受けたい講座が使い放題になります！！！
:::


https://www.udemy.com/course/aws-4260/

https://www.udemy.com/course/ok-aws-e/

## 勉強時間

- UdemyUdemy のハンズオン兼概要解説 <font color="red">**10 時間** (2 倍速)</font>
- Udemy の模擬問題 <font color="red">**10 時間**</font>

### 計<font color="red">**20 時間**</font>

## 当日の流れ

1.  受付

    - 署名や受験日付を記入する用紙を受け取り記入します
    - 記入した紙を持って再度、受付に行き、身分証明証を提出し、写真を撮ります
    - ホワイトボードやペンなどを受け取り係員の指示に従って、受験室に入室します

    :::note info
    政府発行の身分証明証必須
    運転免許証
    マイナンバーカード
    など
    :::

2.  指定された PC で受験します
3.  受験完了して、結果が出るので確認します
4.  貸し出されたホワイトボードやペンなどを返却窓口に返して終了です。
5.  後日、マイページにスコアレポートがダウンロード可能となります。また、認定バッジは、別途、登録したメールアドレス宛にメールが届きます

    :::note info
    私の場合、即日、バッジとスコアレポートが更新されました
    :::

    :::note warn
    公式には、5 営業日以内と記載があります。
    :::

## 今後取りたい資格

- AWS Solution Architect Associate
- Google Cloud Engineer
- Google Cloud Architect

:::note info
なぜ、Google Cloud の資格が Professional まで欲しいかというと、
Proffesional 資格を取得するとノベルティとして<font color="red">**グッズがもらえるからです！！！**</font>
:::

## まとめ

受験した感想としては、あっさりとしていて**結構簡単**だったなと思います。今回は、<font color="red">勉強の習慣ややり方が良くなく</font>2 週間ほど要しましたが、準備と計画を立ててやればもっと 1 週間程度取れたな反省しています。

これで、<font color="red">資格手当をもらうことが出来ます</font>🎉🎉🎉🎉🎉🎉

## さいごに

弊社では、**エンジニア積極採用中です**！！！
SES、請負、受託、Saleforce やりたい方はご興味を持っていただけたら幸いです。

ワクトでは、以下の **Mission**・**Vision**・**Value** を掲げております。

- **Mission** : 「IT× ワクワク」で、社会の発展に貢献する
- **Vision** : 大切な人に心から薦めたい会社であり続ける
- **Value** :
  - One team for customers
  - 熱意 × 人格 × 能力
  - まずやってみる

ワクトでは、もう一つ重要なものとして「 **マインドマップ** 」というものがあります。
個人的にですが、こちらに共感していただけた方はワクトに合うかなと思っております。

![Mind Map](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3512616/7cdae347-bb0c-9527-ed08-1d94c7f0337e.png)

https://wakuto.net/

https://www.wantedly.com/companies/wakuto0910

https://twitter.com/wakuwaku_toyou

また、本記事の内容は個人の考えであり、会社を代表するものではございません。
【Golang】実体とポインターで見る構造体の初期化の違い


Golangにおいて、実体かポインターとして構造体を初期化する際の挙動の違いを把握したため、備忘録として残すもの。

## 実体で構造体を初期化する場合
```go
package main

import "fmt"

type User struct {
	name string
	sex  int
}

func main() {
	var instanceUser User // User構造体を実体として定義

	fmt.Println(instanceUser)      //　結果：{ 0}
	fmt.Println(instanceUser.name) //　結果：
	fmt.Println(instanceUser.sex)  //　結果： 0
}
```

:::note info
実体で構造体を初期化すると、 **初期値** が格納される
:::

https://go.dev/play/p/b5WWHjo16l5

## ポインターで構造体を初期化する場合
```go
package main

import "fmt"

type User struct {
	name string
	sex  int
}

func main() {
	var pointerUser *User // User構造体を実体として定義

	fmt.Println(pointerUser)      //　結果：<nil>
	fmt.Println(pointerUser.name) //　結果：panic: runtime error: invalid memory address or nil pointer dereference
	fmt.Println(pointerUser.sex)  //　結果：panic: runtime error: invalid memory address or nil pointer dereference
}
```

:::note warn
ポインターで構造体を初期化すると **「nil」** が格納される。
そして、 **構造体のフィールドにアクセスするとpanic** が発生する
(本来ポインターはアドレスを貰うはずだが、nilが格納されているため)
:::

![スクリーンショット 2023-10-29 14.24.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501264/78cc8a2b-9f76-ea65-62ad-65fb7a1942bc.png)

https://go.dev/play/p/pcGkBTfR0aK

## まとめ
実体とポインターの初期化の違いを把握した上で、どちらを使用した場合に、どのような挙動となるのか理解しコードを書いていきたい。
duplicate value found: <unknown>



+ [【未解決】Has anyone used Custom Error in record-triggered flow and encountered the error 'duplicate value found: <unknown>" ?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007NDJL6)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/cf660c5b-2b57-d90a-25fe-b95fe6a4992c.png)


+ [How to debug the mysterious "duplicate value found: <unknown> duplicates value on record with id: <unknown>" error](https://salesforce.stackexchange.com/questions/79799/how-to-debug-the-mysterious-duplicate-value-found-unknown-duplicates-value-o)


+ [duplicate value found: <unknown> duplicates value on record with id: <unknown>](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000G39F8SAJ)

+ [Good Afternon, Anyone know video about the TrailHead Discover Lightning Web Component Actions please?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007erzdY)

:::note
Please make sure the following things to avoid this error.

1. Component file name as same as the component folder name
2. The component name is NOT the same name as the vs code project folder name
3. The name of the LWC component starts with a lower case letter

このエラーを回避するには、次の点を確認してください。

1. コンポーネントファイル名はコンポーネントフォルダ名と同じ
2. コンポーネント名はVSコードプロジェクトフォルダ名と同じではありません
3. LWCコンポーネントの名前は小文字で始まります
:::

+ [ContentAsset(salesforce) duplicate value found: <unknown> duplicates value on record with id: <unknown>](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000UjGT)

+ [【未解決】Updating Account returns DUPLICATE_VALUE, duplicate value found: <unknown> duplicates value on record with id: <unknown>](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000PXAsi0AH)

# Sandbox


+ [Updating Account returns DUPLICATE_VALUE, duplicate value found: <unknown> duplicates value on record with id: <unknown>](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000PXAsi)

:::note
It was resolved in the end with an SF Support Case, and they 'fixed' (with no real detail) some records in the Sandbox. I asked for more info but nothing useful was provided, and was told it was something I couldn't have done anyway.  


So, sounds like some sort of data corruption when the Sandbox was refreshed.
:::
【備忘録】laravel内部でAPIを作成し、reactからlaravelへフォームデータを送信する

### はじめに

個人開発メモ📝
laravel内部でAPIを作成し、react->laravelへフォームデータの送信を行う際に起きたエラー解消を行う。

## react側
フォームデータをfetchでlaravelに送信する
```register.jsx
import React, { useState } from 'react';

function RegistrationForm() {
  const [formData, setFormData] = useState({
    name: '',
    email: '',
    password: '',
  });

  // フォーム入力の反映
  const handleChange = (event) => {
    const { name, value } = event.target;
    setFormData({ ...formData, [name]: value });
  };
  
  // フォーム送信処理
  const handleSubmit = (event) => {
    event.preventDefault();

    // laravelのエンドポイント
    const apiUrl = '/api/register';

    const requestOptions = {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'X-CSRF-TOKEN': window.csrfToken,
      },
      body: JSON.stringify(formData),
    };
    console.log(requestOptions);

    // Postリクエストを送信
    fetch(apiUrl,requestOptions)
      .then(function(response) {
        return response.json();
      })
      .then(data => {
        console.log('送信完了', data);
      })
      .catch(error => {
        console.log('エラー', error);
      });
   }
}
```

## laravel側
```api.php
// react側からフォーム送信で使用するエンドポイント
Route::post('/register', [RegisterController::class, 'register']);
```
⚠️api.phpに記述すると、URIプレフィックスに/apiが自動的に付与されるので、注意
（/api/registerと記述していたのでphp artisan route:listで確認したら/api/api/registerになっていました。。）

```RegisterController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\User;
use Illuminate\Support\Facades\Hash;

class RegisterController extends Controller {
  public function register(Request $request) {
    $formData = $request->validate([
      'name' => 'required | string | max:255',
      'email' => 'required| string | email | unique:users',
      'password' => 'required | string | min: 8',
    ]);

    $user = User::create([
      'name' => $request->input('name'),
      'email' => $request->input('email'),
      'password' => Hash::make($request->input('password')),
    ]);
    return response()->json(['message' => 'ユーザー登録が完了しました', 'user' => $user]);
  }
}
```

## おわりに

```
// laravelのエンドポイント
    const apiUrl = '/api/register';
```
```
// react側からフォーム送信で使用するエンドポイント
Route::post('/register', [RegisterController::class, 'register']);
```
作成自体は簡単だけど、書き方が分かっておらずエラー解消に時間を使ってしまいました。。
地方のリモートワーカーとコミュニティ

# はじめに

こんにちは。Kaneyasuです。  
10月25日にJAWS-UG朝会で発表をさせていただきました。
主催者の方、参加者の方、ありがとうございました。
資料はこちらです。

https://speakerdeck.com/satoshi256kbyte/qiu-noye-chang-niamazon-timestreamtoyutukurito-xiang-kihe-tutemita

https://jawsug-asa.connpass.com/event/282615/

さて、私は広島在住で、リモートワークでお仕事をさせていただいています。
現在私はリモートワークの傍らで有志によるコミュニティが主催するIT勉強会などに頻繁に参加させていただいており、これらへの参加が私のモチベーション維持にとても役立っています。
今回はこのことを書きたいと思います。

# リモートワークの悩みどころ

みなさんはリモートワークについてどう思いますか？
効率がよい働き方でしょうか？楽な働き方でしょうか？

私の主観になりますが、現在所属している会社でのリモートワークは、効率の悪さを感じたことはありません。
それは、みんながリモートワークの働き方を理解しているとともに高いスキルを持っているからだと思います。
リモートミーティングは、オフラインのミーティングよりも情報量が劣ります。
それゆえ、事前準備と限られた時間内に全力を尽くすことが求められます。
チャットやチケット管理システムを用いたコミュニケーションは、非同期であること・・・他の作業の合間を縫って返信してくれることを理解した上でわかりやすい文章を書くことが求められます。
私の周りの人たちは、これらのことを理解しているのでリモートワークでの働き方が成り立っていると私は考えています。

一方で、このような気の使い方をするコミュニケーションは疲れますので、楽な働き方とは言い切れないと思います。
また、これは私個人の思いですが、リモートワーク故に、自分への負荷のかけ方を間違えることもあります。
会社に出社していれば、周りの人が帰るのに合わせて帰るかもしれませんが、リモートワークではそこの歯止めが聞きづらく、際限なく働いてしまうこともあります。
つまり、自分への負荷のかけ方を自分でコントロールしなければなりません。
そういった意味でも、楽な働き方とは言い切れませんね。

# 雑談の重要性

みなさんは喫煙はされますか？私は喫煙はしませんが、自動販売機でコーヒーを買うのが好きです。
昔、会社に出社する働き方をしていた頃は、自動販売機の前でよく雑談をしていました。
当時は、プロジェクトリーダーとして仕事を円滑に回すにはメンバーとの雑談も必要とか、他部署の人と関係性を築くのに雑談も必要だとか、そういったことを考えていました。

リモートワークでの働き方を始めるにあたって、今後はコミュニティへ参加した方がいいんだろうなと思い、コミュニティに参加するようになりました。
この行動を始めたことには、論理的に説明できる理由はありません。
社会人として働いてきて培った勘が、そういうことしておかないとお前はしんどくなるぞと教えてくれたのでしょう。

幸い広島には定期的に開催されるコミュニティがあります。

https://great-h.connpass.com/

ここで発表をさせていただくこともありますし、技術的な雑談をすることもあります。
コミュニティに参加して技術的な雑談をすると、頭がスッキリして次の日の仕事が捗ることがあります。
単なる雑談ではなくて、リアルでの技術的な雑談が私にとって重要なのだと思います。
雑談自体は家族ともできますしね。

私においては、自分の頭のメンテナンスのためにも、リアルでの技術的な雑談はとても重要と認識しており、とてもありがたい場所だと思っています。

# リモートワークとコミュニティ

コミュニティに参加する理由は人それぞれです。
純粋に勉強したいという方もいれば、私のように喋るのが目的の人もいます。
実際に私は「リモートワーカーだからリアルの会話が欲しいんです」と頻繁に口にしています。
知ってる限りでは、よほど場を荒らさない限り、コミュニティに参加する理由は人それぞれだよねでおしまいのようです。
おそらく、コミュニティに来られる方は、参加すること自体がそれなりの勇気がいる行動であることを理解しているからだと思います。

リモートワークという働き方は、自己を律することが求められます。
律し続けるためのエネルギーを充填させていただくことに私はコミュニティを利用させていただいています。
このことについてコミュニティの主催者・参加者の方に深い感謝を述べるとともに、この私の働き方についてのポエムが誰かのヒントになれば幸いです。
【SwiftUI】ForEachのドキュメントを読む

![スクリーンショット 2023-10-29 14.36.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70476/96db241c-9c04-825a-45e6-f786fb3a6d4e.png)
# この投稿は何？

SwftUIフレームワークのForEach型について、[Appleの開発者向けドキュメント](https://developer.apple.com/documentation/swiftui/foreach)を独自に解説する。

`ForEach`はSwiftUIアプリの開発で使用される、コンテナ系のビュー。

> Swiftを基礎から学ぶには
自著、工学社より発売中の「[まるごと分かるSwiftプログラミング](https://amzn.asia/d/7YPWJwl)」をお勧めします。変数、関数、フロー制御構文、データ構造はもちろん、構造体からクロージャ、エクステンション、プロトコル、クロージャまでを基礎からわかりやすく解説しています。
> また、Swiftプログラミングを基礎から動画で学びたい方には、Udemyコース「[今日からはじめるプログラミング](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uact=8&ved=2ahUKEwii1qTuj_2BAxV4hlYBHbj5BqEQFnoECBYQAQ&url=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fstart-programming-today%2F&usg=AOvVaw2vs4Sccq-bpfA4ZD2rCyNm&opi=89978449)」をお勧めします。


# 宣言

識別可能なデータからなるコレクションを基にして、ビューを動的に生成する構造体。

```swift:
struct ForEach<Data, ID, Content> where Data : RandomAccessCollection, ID : Hashable
```

インスタンスを生成するために受け取る3つの型パラメータのうち、`Data`は`RandomAccessCollection`に、`ID`は`Hashable`に適合することが要求される。

# 概要

`ForEach`を使用すると、一部のデータ型の`RandomAccessCollection`に基づいたビューを提供できる。
コレクションの要素は、どちらかの要件を満たす必要がある。

- `Identifiable`プロトコルの適合
- `ForEach`イニシャライザに`id`パラメータを提供する

次の例では、システムのフォントスタイル例を表示するSwiftUIビューを作成する。
`ForEach`は「フォントスタイルの配列」を反復し、その要素ごとに`Text`インスタンスを生成する。

```swift:テキストのリストを生成するForEachビュー
import SwiftUI

// フォントの種類をモデル化
struct NamedFont {
    let name: String
    let font: Font
}

// SwiftUIの各種システムフォントのコレクション
let namedFonts: [NamedFont] = [
    NamedFont(name: "Large Title", font: .largeTitle),
    NamedFont(name: "Title", font: .title),
    NamedFont(name: "Headline", font: .headline),
    NamedFont(name: "Body", font: .body),
    NamedFont(name: "Caption", font: .caption)
]

struct ContentView: View {
    var body: some View {    
        ForEach(namedFonts, id: \.name) { namedFont in
            Text(namedFont.name)
                .font(namedFont.font)
        }
    }
}
```

![スクリーンショット 2023-10-29 14.36.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70476/96db241c-9c04-825a-45e6-f786fb3a6d4e.png)

## idパラメータを省略する

コレクションが`Identifiable`プロトコルに適合するなら、コードを簡略化できる。
以下の例では`NamedFont`型に`id`プロパティを実装して、`Identifiable`に適合する。
そうすることで、コンパイラは「`namedFonts`配列の要素」を自動的に識別できるようになるので、イニシャライザから`id`パラメータの指定を省略できる。

```swift:
// フォントの種類をモデル化
// idプロパティを実装して、Identifiableに適合
struct NamedFont: Identifiable {
    let name: String
    let font: Font
    var id: String { name }    // フォント名からid情報を作成
}

// SwiftUIの各種システムフォントのコレクション
let namedFonts: [NamedFont] = [...]

struct ContentView: View {
    var body: some View {    
        // イニシャライザからidパラメータを省略した
        ForEach(namedFonts) { namedFont in
            Text(namedFont.name)
                .font(namedFont.font)
        }
    }
}
```
IOCとDI

# IOC #
- Inversion of Control
- 既存のプログラムは、クライアント実装オブジェクトが自ら必要な実装オブジェクトを生成し、接続し、実行した。 一言で言って、実装オブジェクトがプログラムの制御フローを操作した。
- **AppConfigは制御フローに対する権限をすべて持って行き、具現オブジェクトは自分のロジックを実行する役割だけを担当する。** つまり、実際にどの実装オブジェクトが実行されるかクライアントは知らない。


# DI #
- Dependency Injection
- アプリケーション実行時点(ランタイム)に外部から実際の実装オブジェクトを生成し、クライアントに伝達してクライアントとサーバの実際の依存関係が連結される。
KubernetesのOperatorパターンについて

# KubernetesのOperatorパターンについて

**はじめに**:

現代のソフトウェア開発の世界では、マイクロサービスアーキテクチャの採用が急速に広がっており、その結果、アプリケーションのデプロイや管理がより複雑になっています。この新しいチャレンジに対応するため、Kubernetes（k8s）はコンテナオーケストレーションツールとして非常に人気があります。さらに、その中でも「Operatorパターン」は、Kubernetesの自動化能力を強化し、カスタムアプリケーションロジックやサービス管理プロセスを統合するための有力な手段として注目されています。

**Operatorパターンとは何か**:

Operatorパターンは、Kubernetesのリソースを管理し、そのライフサイクルを制御するための方法論です。これは、特定のアプリケーションやサービスに特化したオペレーターを使用して、その管理と運用を自動化することを目的としています。基本的に、オペレーターはカスタムコントローラーとカスタムリソース（CRD）の組み合わせによって構成され、アプリケーションの現在の状態を監視し、望ましい状態に保つためのアクションを実行します。

**CustomResourceDefinition（CRD）とは何か**:

CRDは、Kubernetes APIの拡張機能で、クラスターに新しいリソースタイプを追加することができます。これにより、開発者はKubernetesの標準リソースセットに存在しない、アプリケーション特有の設定を定義できます。CRDを使用すると、新しいリソースに対するKubernetes APIのエンドポイントが作成され、ユーザーはkubectlを使用してそのリソースを操作できるようになります。

**Operatorの作成と利用**:

Kubernetesオペレーターの作成は、特定のアプリケーションやサービスの知識を持つオペレーターをコーディングするプロセスです。これは通常、Go、Python、または他のプログラミング言語を使用して行われ、オペレーターのロジックはアプリケーションのライフサイクルや各種イベントへの対応方法を定義します。

**Operator Framework**:

Operator Frameworkは、オペレーターのライフサイクルを維持管理するためのオープンソースプロジェクトで、オペレーターの開発、テスト、およびデプロイを容易にするためのツールセットです。これには、以下の主要なコンポーネントが含まれます。

1. Operator SDK: 新しいオペレーターの作成や既存オペレーターのビルドをサポートするためのツール。
2. Operator Lifecycle Manager (OLM): オペレーターのデプロイやアップデート、管理を担当します。
3. Operator Metering (使用されなくなった場合もあり): オペレーターおよび関連リソースの使用状況に関するレポートを生成します。

**CRDの使用例**:

KubernetesでCRDを設定し、それを利用する方法にはいくつかのステップがあります。以下に、CRDの作成とそれを使用するカスタムリソースのデプロイについての基本的な例を示します。

1. **CRDの定義**:
   まず、新しいリソースタイプのCRDを定義する必要があります。以下は、CRDのYAML設定ファイルのサンプルです。

```yaml
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: myresources.mycompany.com
spec:
  group: mycompany.com
  versions:
    - name: v1
      served: true
      storage: true
  scope: Namespaced
  names:
    plural: myresources
    singular: myresource
    kind: MyResource
    shortNames:
      - myres
```

このYAMLファイルを`myresource-crd.yaml`として保存し、`kubectl apply -f myresource-crd.yaml`で適用することで、KubernetesにCRDを登録します。

2. **カスタムリソースの作成**:
   CRDを作成した後、新しいリソースタイプのインスタンス、すなわちカスタムリソースを作成できます。以下はそのサンプルです。

```yaml
apiVersion: mycompany.com/v1
kind: MyResource
metadata:
  name: example-resource
spec:
  param1: value1
  param2: value2
```

このYAMLを`example-myresource.yaml`として保存し、`kubectl apply -f example-myresource.yaml`で適用することで、新しいカスタムリソースが作成されます。

**CRDの確認**:

Kubernetesクラスターに登録されているCRDをリストしたり、特定のCRDの詳細を表示したりするには、以下のコマンドを使用します。

1. **すべてのCRDをリストする**:
   ```
   kubectl get crd
   ```

   このコマンドは、クラスターに登録されているすべてのCRDの一覧を表示します。

2. **特定のCRDの詳細を表示する**:
   ```
   kubectl describe crd <CRD名>
   ```

   たとえば、`kubectl describe crd myresources.mycompany.com`というコマンドは、`myresources.mycompany.com`という名前のCRDの詳細を表示します。

これらのコマンドとYAML設定の例を使って、ユーザーは自分のKubernetes環境でCRDを簡単にセットアップし、カスタムリソースをデプロイし、既存のCRDを調べることができます。これは、Kubernetesのカスタマイズと拡張の基本的な側面であり、効果的なクラスター管理とアプリケーションのデプロイに不可欠です。

**まとめ**:

Operatorパターンは、Kubernetes環境におけるアプリケーションやサービスの運用を自動化・最適化する強力なメカニズムを提供します。これにより、開発者とシステム管理者は、状態の複雑さや運用上の課題を効率的に管理できるようになります。Operator Frameworkのようなツールを利用することで、このプロセスをさらに簡素化し、信頼性と効率性の高いクラウドネイティブアプリケーションのデプロイと運用が可能になります。
【組み込み開発】CAN通信に関する開発をする上で最低限知っておいたほうがいいこと

### はじめに

この記事では組み込みソフトウェア開発、特に、Controller Area Network（以下、CAN）通信の開発をする上で最低限知っておいたほうがいいことを書きます。この記事では、CANとは何か？CAN ID何か？ということは知っている前提で記事を書きます。
誤りがあれば修正していく予定です。

### ①1回で何バイトのデータを送受信できるのか
1回で8バイトまで送受信することができる。

### ②8バイト以上のデータを送りたいときはどうすればいいのか
複数回に分けて送る。データの送り方は規格で決まっていることが多いです。そのため規格を読む必要があります。

### ③規格を読むときに必要な視点は何か
規格は英語で書かれていることが多いです。全部読んでいると時間もかかるし大変なので、必要なところに絞って読む必要があります。
必要な視点は以下の2つだと思います。
1. 何バイト目の何ビット目にどんなデータを格納するのか。
例）0バイト目の0～3bit目にシーケンス番号を入れるなど。
2. 複数回に分けて送るとしたら周期はどのくらいか。
    ※50msと一意に決められているものもあれば、50～200msというように範囲が指定されていてこの範囲内であればOKという書き方のものもあります。

### おわり
組み込みソフトウェア開発者になったばかりで人に教えられるほど知識があるとは言えませんが、理解している範囲でこれからも記事を書いていこうと思います。

ご覧いただきありがとうございました。
Linuxを使えるようになろう #3

# Webサーバーをたてよう

Webサーバーとは，PCやスマホなどの端末からHTTPやHTTPSで送られたリクエストに対して，HTMLやCSSなどの情報を返すサーバーのこと．

HTTPとは，WebサーバーとWebブラウザとの間で情報をやりとりするための通信規則．

HTTPSは上記のHTTPを暗号化したものであり，パスワードの入力などの際には，安全に通信できる．近年は基本的にきちんとしたWebサイトはHTTPSを使うことが多く，暗号化されていないWebサイトは危険な場合が多い．

# Webサーバー
Webサーバーのソフトウェアとして，世界的に多く使われているのは，Apache2とNginxの二つ．

Apache2 : 30年ほど前に作られ，多くのWebサイトで使用されてきた．

Nginx : 20年ほど前に作られ，Apache2よりも大容量のデータ通信や大規模な同時アクセスに耐えられるようになっている．近年では，Apache2と同じくらいのシェア率．

# Nginxのインストールと設定

前回まででたてた仮想マシンを使用していく．

```
$ sudo apt update
$ sudo apt install nginx
$ sudo service nginx start
```

デフォルトの設定で起動．
localhostにアクセスすると下記のような画面が表示される．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189046/9cec5c61-efd0-86d0-d341-e520f895e362.png)

# Webページの作成

実際にHTMLを記述して，Webページを作成してみよう．
nginxのデフォルト設定では，/var/www/html内にhtmlファイルを作成すれば良い．
emacsを使用して，/var/www/html内にindex.htmlを作成してみよう．
```.html
<!-- -->
```
で記述されている部分はコメントアウトを示している．

```index.html
<html> <!-- html文書 -->
  <head> <!-- ヘッダー -->
    <meta charset="utf-8"> <!-- 文字コードの指定-->
    <title>Webページ作成練習</title> <!-- タイトルの設定 -->
  </head>
  <body> <!-- webページに表示される内容を記述 -->
    <h1>Webページ作成練習</h1>
  </body>
</html>
```


先ほどのようにlocalhostにブラウザでアクセスすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189046/b3472667-0e36-be6b-02fd-7e37ab99f2de.png)

といった画面が表示される．