OmniAICreator/Qiita-1.07M huggingface dataset:
1on1信頼関係構築 完全ガイド【エンジニア心理学】




## 雑談の戦略

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1678228/112a90c2-5695-87e6-34e2-2de2bf17d361.png)



## 準備事項

### 自己紹介シートを記入してもらう

これは必須事項です。

プロジェクトが始まって、相手との関係構築が重要である場合はすぐに「自己紹介シート」に記入してもらってください。

なぜなら、これには二つの効果が期待できるからです。

- 相手の好きな話題を知ることが出来る
        - この後のステップでは「相手が話してほしいこと」を話してもらうことが重要になります。ですので、相手の好み、趣味、プロジェクトでやりたいことを聞き出しておきましょう。
- 行動の一貫性を誘う
        - 「自己紹介シートを記入するのが面倒だ」と考える人もいますが、それでも書いてもらってください。
        - 行動の一貫性によると、**自分の意図していない行動をした後、その行動が自分の意図していた行動であるかのように解釈を変える**というせいしつがあるそうです。
        - 今回の例ですと、「（記入したくもない）自己紹介シートにわざわざ時間をかけて記入したのは わたしがこの人たちと仲良くしたいからだ」と考えてくれる可能性がたかいです。


自己紹介記入例


```
こちらへ自己紹介をお願いいたします！

【テンプレート】
お名前：田中太郎
趣味：温泉巡り
好きな技術：Python
参加目的：エンジニア関連の雑談がしたい
ボイチャ可能：OK
雑談面談希望：希望
Docker技術：自信あり！
最近のお悩み：上司がforループの意味を理解できなかった。
みんなへ一言：初心者ですがよろしくお願いします！
```

記入してもらうのはTeamsでもmiroでもどちらでもよいです。

ユーザーに書いてもらえるような媒体を選びましょう！



## 会話中

### 相手の食いつきそうな話題を振る

自己紹介シートの情報が手元にある状態で、会議が始まる2~3分前には会議MTGに入りましょう。

そして、早めに入ってきた方に対して、その方の自己紹介シートにあるネタを振っています。


- ex) 「ooさん自己紹介シートの記入ありがとうございました！」
- ex) 「00さんランニングが好きなんですね～。（返事をまつ）　おすすめのコースとかあるんですか？」


なぜ自己紹介シートの話題を振るのかといえば、**ほとんどの人は自分の話が好き**だからです。

- 若手のエンジニアだったらフロントエンドやペアプロなどイケイケな話が好き
- ベテランの歴戦の猛者なら「自分がいかにブラックな職場で無茶なやり取りをしたかの思い出」が好き

これらの話題を振ることで、**自分と相手の共通点を強調しておきましょう。**



## 自分の話はしない

相手の食いつきそうな話題を振る際には一つポイントがあります。

それは、**自分の話は基本的にはしてはいけない。かならず聞き手に回らなければならない** ということです。

なぜならば、 **ほとんどの人間は話を聞くよりも、話をするほうが好き** だからです。
（逆に、人の話を聞くのはすごい疲れる行為でもあります）


> デートの相手は、学生時代の同級生で理系男子でした。
> お互いが社会人になってから、同窓会で仲良くなり、私が好きになりました。
> 女の子と二人で食事に行ったことがないということだったのでこちらも緊張。
> 何を話したらいいのかと考えに考えて…当時趣味で勉強していた『核分裂』について話そうと決意し、デート当日。
> 食事の席で2時間びっちり核分裂について話をしました。
> しかも私は1軒目の居酒屋後に「カラオケ行く？」と誘われたのにも関わらず「なか卯でいい、安いから」と彼をなか卯へ連れて行きました。
> 帰りに告白をしたのですが「なんか違ったわ」と玉砕しました……。

https://ota-koi.com/kaiwa/

**とにかく聞き手に回りましょう！**


## ミラーリング

ミラーリングとは、簡単に言えば**相手の真似をするだけで簡単に相手の信頼を得ることができる**というテクニックです。

> ミラーリングとは、先述したように相手の警戒心を取り払い、安心感や親近感をつくり、無意識レベルで、深い信頼関係を築くコミュニケーション技法の一つです。
> その技法を一言でお伝えすると、相手の動作や静止しているときの手足の位置、また呼吸などを、まさに鏡のように合わせていくというやり方です。
> 本人も気づかないほど、心がオープンになり、知らず知らずのうちに「この人なら、ここまで話してもいい」と感じてしまうような状態が生まれます。

<img src="https://life-and-mind.com/wp-content/uploads/2017/04/comparison_position001.gif">

from https://life-and-mind.com/nlp-mirroring-4657#i-2

あくまでもこのテクニックの目的は相手の信頼を得るためであり、情報を抜き出すテクニックではないことに留意しておいてください。

ここでまねるべき点は以下の通りです。

- しぐさ（相手が足を組んだら足を組む。同じ飲み物を飲んだら同じタイミングで飲む）
- ワードチョイス（相手が使った言葉で会話を行う）
- 会話のテンポ

**とにかくありとあらゆる内容を、自分が対象者の鏡であるかのように真似してください！**
そうすれば、相手との信頼関係が気づけるはずです。




## レスポンスは早めに

これはオンラインならではの悩みだと思いますが、
相手からの話から間を置きすぎてレスポンスを話すと、相手は勝手に不安要素を洗い出してしまいます。

> 「何かまずいこと言ったかな？」
> 
> 「なんで何も反応がないんだろう...?」

逆に、素早いレスポンスは「安心感」を生んでくれます。
**そのレスポンスがネガティブであれ、ポジティブであれ、レスポンスがないよりははるかにマシです。**
日本語(カタカナ)の表示ラベル変更

プロファイル名の検索では要注意です。
プロファイルにはNameしかないので、言語設定がダイレクトに影響します。

+ [System.QueryException: List has no rows for assignment to SObject](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007UtKoj)

:::note
What language settings are you using?
In Japanese, I think ”ー” is added, like ”ユーザー”.

 
```
p = [select Id from Profile where Name = '標準 Platform ユーザー'];
```


https://ideas.salesforce.com/s/idea/a0B8W00000Gdf6dUAB/field-developername-in-profile-object
:::


+ [[日本語(カタカナ)の表示ラベル変更]の準備について](https://successjp.salesforce.com/article/NAI-000551)
+ [Japanese Katakana Style Change in Winter ’24](https://help.salesforce.com/s/articleView?id=000393183&type=1)
VisualForce Email Templateのまとめ


+ [VisualForce Email Templateの制限](https://qiita.com/Keiji_otsubo/items/8e62fefaebf23735924a)

+ [ display the Approval's Quote's Line Items in the Email Template](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007UtQxT)
+ [**商談商品**のレコードをメールテンプレートに表示する](https://qiita.com/Keiji_otsubo/items/0a63adf0c8697572cce1)

:::note
Please check this article.

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A91EDSAZ
:::

# Visualforce Email template to display date and time in User's timezone (local time)
メールテンプレートで日付を使った場合は　GMT表示になってしまいます。
ローカルのタイムゾーンは考慮されないようです。

以下に、その回避策が紹介されていました。

+ [Visualforce Email template to display date and time in User's timezone (local time)](https://developer.salesforce.com/forums/?id=906F000000098DmIAI)


# プロファイル画像を使う

VFpageのテンプレートでないとできないと思うけど

+ [Display User Profile Image in Lightning Email Template dynamically based on logged in User](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007F3Z7y)
AzureでWindowsアプリのCI/CD環境を作る：DevDriveの効果は？

# 概要

[以前の記事](https://qiita.com/spc_ksudoh/items/772143b189d059832e60)で、Azure VM＆Azure Pipelinesのビルド環境へDevDriveを導入してみました。これにどれほどのビルド加速効果があるのか、測定してみようと思います。

# 結果まとめ

内訳に興味が無い人向けに、最初に結果をまとめておきます。こんな感じになりました。

1. 効果はいまいちで、ビルド時間が数%減るか減らないかくらい
1. むしろCPU強化のほうが効果があったので、そのあたりがネックにならないリッチなビルド環境向けかも
1. 少なくともマイナスではなかったので、ダメ元で導入してみても良いと思う

# 測定

## 測定のやり方

次の条件で、実際にパイプラインを動かして所要時間を測定していきます。

* 測定対象
   * 1，C#とC++(WDK)の小規模ソリューション（非公開・手元にあったもの）
    * C#部分は発行（publish）、WDK部分はビルド
   * 2，[OrchardCore](https://github.com/OrchardCMS/OrchardCore.git )
    * [MSのブログ](https://blogs.windows.com/windowsdeveloper/2023/06/01/dev-drive-performance-security-and-control-for-developers/)で、DevDriveのパフォーマンス例で22%改善としていたもの
    * VisualStudio2022で、ソリューション構成Release/Any CPUをビルド
* 測定条件（組み合わせて測定する）
    * VMのサイズ
        * Standard_D4ds_v5
        * Standard_F8s_v2
    * ストレージ
        * 一時ディスク（Dドライブ）
        * データディスク Premium SSD
    * DevDrive
        * パーティション全体をDevDriveに設定（Premium SSDのみ）
        * vhdファイルを作成してマウントし、DevDriveに設定（一時ディスクのみ）
        * DevDrive無し（通常のNTFS）
* 測定方法
    * 2～3回ほどパイプラインを実行して、パイプライン実行結果に記録された所要時間を見る
        * 対象条件での初回の実行結果は捨て、2回目以降の実行結果を採用する
        * あまり効果が見られないため、途中から一部組み合わせの測定をカットしたり回数を減らしたりしている

## 測定結果

条件別に、次の対象の測定結果を表にまとめます。測定結果の単位は全て秒です。

 * 対象1：測定対象1のcheckout
 * 対象2：測定対象1のC#ソリューション発行
 * 対象3：測定対象1のWDKビルド
 * 対象4：測定対象2のNuGet復元
 * 対象5：測定対象2のソリューションビルド

### Azure VM Standard_D4ds_v5

データディスクでは、ほとんど差が無いという印象です。一時ディスクのほうでは、数%くらいはDevDriveのほうが優れてるかも・・・？というところでしょうか。動きを見ているとCPUが一番ネックになっていそうにも見えるので、CPUが強そうなサイズに変えてみます。

|ストレージ|対象1|対象2|対象3|対象4|対象5|
|---|---|---|---|---|---|
|データディスク NTFS|8～20|53～61|10|19～20|98～108|
|データディスク DevDrive|7～12|53～60|10～11|19～23|103～111|
|一時ディスク NTFS|10～19|57～62|11～13|-|-|
|一時ディスク DevDrive|7～10|54～58|10|-|-|

### Azure VM Standard_F8s_v2

もう少し効果が明確になった印象でしょうか。せいぜい5％がいいところですが、確かに改善はしているように見えます。もしかして、IOPS制限などAzure VM固有の要素に影響されているのかもしれないので、ローカルのHyper-Vも試してみます。

|ストレージ|対象1|対象2|対象3|対象4|対象5|
|---|---|---|---|---|---|
|データディスク NTFS|9|78|13|24|85～100|
|データディスク DevDrive|9～11|68～75|13|24～27|91～95|
|一時ディスク NTFS|-|-|-|25～28|92～100|
|一時ディスク DevDrive|15|73|13|24～26|84～95|


### Hyper-V（あまり性能は良くない）

適当に確保したローカルのHyper-V環境での測定です。さほど性能が良いものではありません。こちらでは10%程度の改善はしているように見えます。Azure VM固有の要因が悪いと言えるほどのデータではありませんが、条件によっては改善幅が大きくなるものと期待はできます。

|ストレージ|対象1|対象2|対象3|対象4|対象5|
|---|---|---|---|---|---|
|システムドライブ NTFS|-|-|-|22～24|100～112|
|システムドライブ上のvhd DevDrive|-|-|-|24～28|89～108|

# 考察

MSのブログで出ているような22％もの改善は得られませんでした。とはいえ、ストレージが大きなネックになっている環境では、5～10％程度の改善は出ているように見えます。当たり前といえばそうですが、ストレージ以外がネックになっている場合は効果は出づらいようです。もしかするとDevDriveは、もっと各種スペックが高くてストレージだけがどうしてもネックになる、というようなリッチなビルド環境でこそ力を発揮するのかもしれません。

いずれにしても、「DevDriveにしたら、かえって悪化した」ということはなく、使って損はないようです。

Azure VMにおいては、高価なPremium SSDを使っても一時ディスクと速度に大差はありませんでした。追加コストを支払ってデータディスクを追加するよりも、一時ディスクを使うほうが良さそうです。

# まとめ

DevDriveを使用した場合には、22%という大きな改善効果こそ見られなかったものの、使って損はない程度の改善は見られました。[以前の記事](https://qiita.com/spc_ksudoh/items/772143b189d059832e60)に書いたように、一時ディスク上に確保してとりあえず使ってみる価値はあるように思います。色々な条件に左右されるので、もしかして用途によっては大きな改善を得られるかもしれません。
カラペースとは？

<font color="Grey">*[What is Karapace?](https://aiven.io/blog/what-is-karapace)の翻訳です。*</font>

2022年3月11日

# カラペースとは？

Apache Kafka®とKarapaceを組み合わせることで、あなたのアプリケーションを全く新しいレベルに引き上げることができます。スキーマレジストリのマジックの詳細をご覧ください！

[Karapace](https://karapace.io)は、オープンソースの分散イベントストリーミングプラットフォームであるApache Kafka®のためのオープンソースのHTTP APIインターフェースとスキーマレジストリです。


オープンソースのプロジェクトなので、[Karapace on GitHub](https://github.com/aiven/karapace) のAivenという組織の下にあります。KarapaceをApache Kafkaプロジェクトに追加することで、イベントドリブンやその他のデータ中心のアプリケーションで非常に有用な追加機能が得られます。


## Apache Kafka®とデータスキーマ


Karapaceが提供する重要な機能の1つにスキーマ・レジストリがある。では、スキーマレジストリとは何でしょうか？スキーマとは何か、そしてKafkaでどのようにスキーマを使用するのかについて復習しましょう。


Kafkaは非常に柔軟で強力なツールであり、ユーザーはあらゆるフォーマットや構造のデータをあらゆるトピックに追加することができる。しかし、大きな力には大きな責任が伴います。多くのアプリケーションにとって、データ構造の柔軟性は間違いなく機能ではありません。スキーマはメッセージ・ペイロードのデータ・フォーマットを記述する方法です。スキーマには、フィールドとそのデータ型、そしてデフォルト値が記述されます。


Kafkaはデータの構造について意見を持っていないので、*スキーマレジストリ*と呼ばれる追加のツールが必要です。スキーマレジストリは別のツールなので、コンシューマーとプロデューサーはこの追加エンドポイントの場所を設定する必要があります。その名の通り、希望するスキーマをスキーマ・レジストリに登録することができます。


## Karapaceを使う理由


一旦スキーマが登録されると、プロデューサはトピックにレコードを生成する前に、期待されるスキーマに対してペイロードを検証することができる。[Apache Avro](https://avro.apache.org/)のような圧縮フォーマットを使うアプリケーションでは、スキーマの登録は不可欠です。プロデューサは、メッセージのペイロードを圧縮するために使用したスキーマを登録し、スキーマのバージョン番号をメッセージに含めます。消費者はメッセージを受け取り、使用されたスキーマのバージョンを確認し、スキーマ・レジストリを参照してフィールドの順序やその他の詳細を理解することができる。


Karapaceには、JSON Schema、Avro、Protobufデータ形式をサポートするスキーマ・レジストリ機能がある。スキーマ・レジストリを使用すると、アプリケーションのすべてのコンポーネントが共通のデータ構造定義を共有できる。また、データ形式が進化する必要がある場合、スキーマレジストリに複数のバージョンのスキーマを登録することもできます。


## Apache Kafka 用 RESTful API エンドポイント


Karapaceのもう一つの大きな特徴は、既存のApache KafkaにRESTful HTTP APIを追加できることだ。この追加統合により、HTTP上でKafkaを操作する機能が追加される。これにより


* データを直接操作し、メッセージを生成・消費する。
* API上でトピック、メッセージ、生産者/消費者情報を管理し、メタデータを扱う。


追加インターフェースにより、技術にとらわれない方法でKafkaと対話するための追加ツールの追加が容易になります。[Aiven for Apache Kafka](https://aiven.io/kafka)サービス上で、Aiven Consoleの「トピック」タブにあるデータを閲覧することで、この機能を実際に確認することができます。この機能は、REST APIを使用してWebコンソールに提供されます。Aiven for Apache KafkaサービスでKarapace HTTP API機能が有効になっていない場合、これらの機能にアクセスしようとすると、エラーメッセージが表示されます。


## Karapaceはオープンソースです


KarapaceはPythonベースのプロジェクトで、AivenによってApache 2.0ライセンスの下でリリース、メンテナンスされています。私たちはKarapaceのメンテナであることを誇りに思っており、他の人からの問題、貢献、機能要求を歓迎します。ここにあるいくつかの優れた機能は私たちによって構築されたものではなく、それは健全なオープンソースプロジェクトの証だと考えています。


あなたがAiven for Apache Kafkaの一部としてKarapaceを使うにせよ、他のApache Kafkaソリューションと一緒に使うにせよ、基本的なApache Kafkaにスキーマ・レジストリとHTTP API機能を追加することで、このツールは全く新しいレベルに到達します。あなたがどのようなものを構築したのか、ぜひお聞かせください！


## さらに読む


* Karapaceについての詳細は[karapace.io](https://karapace.io)を参照。
* [プロジェクトリポジトリ](https://github.com/aiven/karapace)をチェックし、ツールをローカルにインストールして使用する方法と、既存のApache Kafkaサービスに接続する方法を見つける。


## まとめ


Apache Kafkaでスキーマレジストリを使用する基本について見てきた。


次に、[Aivenアカウントにサインアップ](https://console.aiven.io/signup)して、Aiven for Apache Kafkaサービスを開始し、RESTとスキーマレジストリの機能を有効にすることで、Karapaceを簡単に試すことができます。


それまでは、[changelog](https://aiven.io/changelog)と[blog](https://aiven.io/blog)のRSSフィード、または[LinkedIn](https://www.linkedin.com/company/aiven/)と[Twitter](https://twitter.com/aiven_io)のアカウントをフォローして、製品や機能関連の最新ニュースをチェックしてください。
tooling APIのまとめ

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)

+ [Tooling API のトラブル](https://qiita.com/Keiji_otsubo/items/dc84fee0d879237f6dae)
+ [Tooling API を活用するための検討](https://qiita.com/Keiji_otsubo/items/25b82bbd250da9a486e3)

---------------------------

+ [自分の組織のディスク使用量をカスタムオブジェクトにて取得し、使用量の推移を目視化させたい。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007X6GrK)

:::note
ストレージ容量はTooling APIを使えば取得できます。

Apexから呼び出すことは可能だと思います。


File storage: https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/dome_limits.htm
Record count per object: https://releasenotes.docs.salesforce.com/en-us/summer17/release-notes/rn_api_rest.htm#rn_api_rest_record_count
https://salesforce.stackexchange.com/questions/193503/how-to-get-storage-usage-organization-information-of-a-salesforce-to-another-s 
:::



+ [I want to create multiple fields (>300) on a custom object.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Ut9UL)

:::note
I think that you can only create one field with the tooling API.

https://salesforce.stackexchange.com/questions/397090/creating-multiple-custom-fields-via-tooling-api-in-a-single-call
:::


# Postman
+ [PostmanからSalesforceのToolingAPIを使ってみる](https://qiita.com/Keiji_otsubo/items/0eac0f4cd3f8b16273a8)
+ [Salesforceのオブジェクトにカスタム項目が追加できるかを確かめる方法](https://qiita.com/Keiji_otsubo/items/209a5a371685adcc3efb)
+ [Salesforceのオブジェクトのカスタム項目の作成者、最終変更者を確認する方法](https://qiita.com/Keiji_otsubo/items/0b2e5ccc223e5aa0177a)
+ [Salesforceで関数が対応しているかを調べる方法](https://qiita.com/Keiji_otsubo/items/f95522a3579548ed6830)
+ [SalesforceのApex classをダウンロードする](https://qiita.com/Keiji_otsubo/items/1e92766fa425da72f2d4)
Pythonで「タプルを別のタプルと結合して新しいタプルを作成する」の動作を確認してみた

# 概要

Pythonで「タプルを別のタプルと結合して新しいタプルを作成する」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/python/tuple/index5.html

# 実装

以下のファイルを作成しました。
```sample.py
tuple1 = ("A", "B", "C")
tuple2 = ("D", "E")
tuple3 = tuple1 + tuple2
print(tuple3)

redtuple = ("Orange", "Strawberry")
yellowtuple = ("Lemon", "Banana", "Grapefruit")
# redtuple と yellowtuple を結合する
fruittuple = redtuple + yellowtuple
print(fruittuple)
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
('A', 'B', 'C', 'D', 'E')
('Orange', 'Strawberry', 'Lemon', 'Banana', 'Grapefruit')
```

# まとめ

何かの役に立てばと。
カレントディレクトリ内のソースファイルをコンパイルして実行し、エラーログを記録する

## はじめに

最近、古典的なコンピュータサイエンスの教科書を読んでいますが、そこに掲載されているサンプルコードが古くなっており、最近のコンパイラでは警告やコンパイルエラーが発生することがあります。そのため、手直しをしました。

この記事では、実行時エラーがないか調査するスクリプトと、それに関連する知見をまとめています。
これらのスクリプトは、コンパイル自体は成功しているものの、実行時にエラーが発生するソースコードを特定するための手段として活用しました。

## 記事のまとめ

- 警告やコンパイルエラーがなくなった後にも、実行時エラーが潜んでいることがあるため、実行して確認する。
- 目視で確認するのは辛いので終了ステータスでスクリーニングする。
- 直前のコマンドの終了ステータスは```$?```に自動で格納される。

## サンプルコード

for ループを使ったスクリプト。
このスクリプトでは入力を求められる実行ファイルの場合はその場で停止し、入力後再開する。

```bash
#!/usr/bin/env bash

# ソースファイルを検索し、ループで処理する
for file in *.c; do
    echo "+----------------------------------"
    echo "| 実行中のファイル: $file"
    echo "| ファイル名: ${file##*/}"
    echo "+----------------------------------"
    gcc -Wall "$file" -lm
    ./a.out

    # 直前のコマンドの終了ステータスが $? に入っている
    if [ $? -eq 0 ]; then
        echo "$file:成功"
    else
        echo "+----------------------------------" >> res.txt
        echo "| ファイル名: ${file##*/}" >> res.txt
        echo "+----------------------------------" >> res.txt
        echo "エラーの内容：" >> res.txt
        ./a.out &>> res.txt
        gcc -Wall "$file" -lm &>> res.txt
        echo "" >> res.txt
    fi

    # 実行ファイルの削除
    rm ./a.out
done
```

while ループを使ったスクリプト。
このスクリプトでは入力を求められる実行ファイルを実行したときの動作が異なる。
具体的には入力を求められる実行ファイルを実行したときも停止しない。

```bash
#!/usr/bin/env bash

# 改行文字を区切り文字として扱う。デフォルトでは区切り文字にはタブとスペースも含まれている。
IFS=$'\n'

# find コマンドを使ってソースファイルを検索し、ループで処理する
find . -maxdepth 1 -name "*.c" -print0 | while IFS= read -r -d '' file; do
    echo "+----------------------------------"
    echo "| 実行中のファイル: $file"
    echo "| ファイル名: ${file##*/}"
    echo "+----------------------------------"
    gcc -Wall "$file" -lm
    ./a.out

    # 直前のコマンドの終了ステータスが $? に入っている
    if [ $? -eq 0 ]; then
        echo "$file:成功"
    else
        echo "+----------------------------------" >> res.txt
        echo "| ファイル名: ${file##*/}" >> res.txt
        echo "+----------------------------------" >> res.txt
        echo "エラーの内容：" >> res.txt
        ./a.out &>> res.txt
        gcc -Wall "$file" -lm &>> res.txt
        echo "" >> res.txt
    fi

    # 実行ファイルの削除
    rm ./a.out
done
```
整数リテラルの各進数表記と接頭辞の由来

# 整数リテラル(Integer Literals)における接頭辞
### 【さっそく】
下記のコードについてのコンソール出力値がどうなるのか考えてみましょう。
```Java
class Prefixes { 
    public static void main(String[] arg) {
        int x1 = 10; // 10 in decimal
        int x2 = 012; // 10 in octal
        int x3 = 0xA; // 10 in hexdecimal

        System.out.println(x1);
        System.out.println(x2);
        System.out.println(x3);
    }
} 
```


コンソール出力: 
```java
10
10
10   
```
出力値を見ると、どの変数にも整数として10が格納されていることがわかります。
なぜ初期値の記述が違うにもかかわらず、どの変数も10を格納しているのかというと
変数”x2”、”x3”はそれぞれ8進数、16進数の記述方法で初期化値が渡されているからです。

### 【Refresher】
int型変数に10進数以外の値を格納する場合の接頭辞についておさらいします。
- 10進数：接頭辞不要
- 2進数：扱う2進数の頭に0bを加える
- 8進数 - 扱う8進数の頭に0を加える
- 16進数 - 扱う16進数の頭に0xを加える

進数テーブル：
|進数|接頭辞|
|:---:|:---:|
|10|なし|
|2|0b|
|8|0|
|16|0x|
### 【Example】
- **2進数**：
```Java
class BinaryPrefix{ 
    public static void main(String[] arg) {
        int binary1 = 0b10;
        
        System.out.println(binary1);
    }
}

/*
Outputs:
2
*/
```
- **8進数**:
8進数表記で8を記述しているためコンパイルエラーとなるコード
```Java
class OctalPrefix{ 
    public static void main(String[] arg) {
        int octal1 = 0801; // コンパイルエラー
        
        System.out.println(binary1);
    }
}
```

- **16進数**:
```Java
class HexDecimal{ 
    public static void main(String[] arg) {
        int hexdecimal1 = 0xF;
        
        System.out.println(hexdecimal1);
    }
}

/*
Outputs:
15
*/
```

### 【関連英単語】
参考までに
これまで説明してきた接頭辞の由来となるギリシャ語、ラテン語の接頭辞、そしてこれらが使われている英単語を以下のテーブルにまとめましたので興味のある方はご覧ください。
|ギリシャ|ラテン|意味|英単語例|
|:---:|:---:|:---:|:---:|
|Mono-|uni-|1|monotheism, universe, uniform, unicorn|
|Di-|<font color="MediumPurple">bi-du-</font>|2|<font color="MediumPurple">binary</font>, duo|
|Tri-|-tri|3|tripod, triple|
|Tetra-|quadri- quart-|4|quarter|
|Penta-|quin-|5|pentagon, quintet|
|Hexa-|sext-|6|hexagon, sextet|
|Hepta-|septem-, septi-|7|heptagon|
|Octo-|<font color="MediumPurple">octa-</font>, oct-|8|octagon, octopus|
|Ennea-|novem-|9|novena|
|Deca-|<font color="MediumPurple">deci-</font>, decem-|10|<font color="MediumPurple">decimal, decade</font>|
|Hemi-|semi-|half|hemisphere, semicircle, semifinal|
|Poly-|multi-|<font color="MediumPurple">many</font>|<font color="MediumPurple">polymorphism</font>, polygon, polynomial|
SwiftUIのalertのためにOptionalを持つBindingの拡張メソッドを作ってみた。

SwiftUIでalertをスマートに実装する方法を模索中です。

例えば [`alert(_:isPresented:presenting:actions:message:)`](https://developer.apple.com/documentation/swiftui/view/alert(_:ispresented:presenting:actions:message:)-3md6l) の場合、`presenting`に与えるデータの有無に連動して、`isPresented`のtrue/falseが切り替わる仕組みがあると、便利と思いました。

`Binding`には [get/setのクロージャで値変換が可能なイニシャライザ](https://developer.apple.com/documentation/swiftui/binding/init(get:set:)-7ufcp)があるので、これを利用してみます。

で、汎用的に使えるように拡張メソッドを作ってみました。

``` swift:
extension Binding {
    func bool<T>() -> Binding<Bool> where Value == Optional<T> {
        Binding<Bool> (
            get: {
                self.wrappedValue != nil
            },
            set: { newValue in
                // alertはボタンタップで非表示に変化の時にfalseをsetする。
                // その際には、元のOptional値をnilに更新する。
                if !newValue {
                    self.wrappedValue = nil
                }
                // trueがsetの時は何もしない。
            }
        )
    }
}
```

alertで利用する場合は、以下のような感じ。

``` swift:
enum AlertKind {
    case hello
    case world
}

struct DemoView: View {

    @State
    var alertKind: AlertKind?

    var body: some View {
        Form {
            Button("hello") {
                alertKind = .hello
            }
            Button("world") {
                alertKind = .world
            }
            Button("state") {
                print("kind: \(String(describing: alertKind))")
            }
        }
        .alert(
            "alert demo",
            isPresented: $alertKind.bool(),
            presenting: alertKind
        ) { kind in
            switch kind {
            case .hello:
                Button("OK") { }
                Button("NG") { }
            case .world:
                Button("OK") { }
            }
        } message: { kind in
            switch kind {
            case .hello:
                Text("hello")
            case .world:
                Text("world")
            }
        }
    }
}
```

SwiftUI経験がまだ浅いので、他に良い方法があるのかは分かっていませんが。
`isPresented`のために、わざわざ`Bool`のプロパティを持つ必要が無くなるので、割とスマートな実装になりそうと思いました。
VPS借りたらrootユーザーがパスワード認証でグローバル公開されている、さあ何から手を付ける

VPSマシンが悪意ある攻撃者に乗っ取られて攻撃の踏み台にされたりするのを防ぐ方法についてです。

通常、Linuxマシンは侵入と乗っ取りを防ぐためにリモートログインは次の認可・認証体制をしいていることがほとんどと思います。
- 認証は公開鍵方式のみ。パスワードは使わない
- rootにはログインできない。root権限が必要なら一般ユーザーからsudoコマンドを使わせる
（rootがパスワードログインできるのはリモートでなく実機でだけにします。実機で許すのは、ssh壊れてにっちもさっちもいかなくなったときのためですね。実機に触れるという時点である程度の本人性が担保されていますし）

VPSもインスタンスを借りた時点からこういう構成になっていることがほとんどですが、海外の格安VPSなんかですと
- グローバルからrootにパスワードでログインできる

状態のインスタンスをいきなりぽんと渡されたりします。
まずこの状態はセキュリティ上不十分であることを知っておいてください。パスワード認証は総当たり攻撃に弱く、それで侵入された時点でrootユーザーですからシステム全権限を乗っ取り完了となってしまいます。

さて、この状態から記事先頭に書いたまともな状態にしていきましょう。

手順です
----
1. **鍵ペアを用意する**  
もともと持っている方はOK。ない方は、ssh鍵ペアを用意します。用意の仕方はぐぐってくだされ。
2. **自分用の一般ユーザーを用意する**
私yubaって名前なので、yubaって名前のユーザーを作ることにしますね。名前はお好きに。
まずrootにそのパスワードを使って入ります。
    1. **ユーザー作成**
    `useradd yuba`
    2. **ユーザーにsudoで管理権限を行使できるようにする**
    通常Linuxではユーザーがwheelってグループに所属しているとsudoでrootの権限使えるようになってます
    `usermod -G wheel yuba`
    3. **ユーザーがログインするための公開鍵を配置してやる**
    まず自分の鍵ペアの公開鍵（id_rsa.pubのほう）の内容をクリップボードにコピーして乗せておきます
    `mkdir /home/yuba/.ssh`
    `cat > /home/yuba/.ssh/authorized_keys` そしてクリップボードをペーストしてから`ctrl D`
    `chown -R yuba:yuba /home/yuba/.ssh`
    `chmod 600 /home/yuba/.ssh/authorized_keys`
    4. **ユーザーにパスワードも設定してやる**
    ログインには使わないのですがsudoコマンドを打ったときにパスワードを要求されてそこで詰むので、そのときに打てるパスワードを設定しておいてあげます。
    `passwd yubad`
3. **公開鍵認証を有効にしパスワード認証を無効に**
`vi /etc/ssh/sshd_config`
sshサーバーの設定ファイルをいじっていきます
    1. **公開鍵認証を有効にする**
    `PubkeyAuthentication`という行をみつけてonにします。先頭に`#`があったら消します。
    2. **パスワード認証を無効に**
    `PasswordAuthentication`という行をみつけてoffにします。先頭に`#`があったら消します。
    3. **rootにはsshで入れないようにする**
    `PermitRootLogin`という行をみつけてoffにします。先頭に`#`があったら消します。
4. **設定変更を適用**
`service sshd reload`
さあ、まだrootユーザーをログアウトしてはいけません。
ssh壊れてしまっていたらいきなりにっちもいかなくなりますからね。このログインセッションは最後まで命綱です。
5. **確認**
    1. **一般ユーザーで公開鍵ログインとsudoできることを確認**
    2. **rootユーザーにパスワードログインできなくなったことを確認**
    3. **すでにrootが何者かに侵入されていないかを確認**
    いまさっきまで危ない状態でしたからね、一応すでに入られ済みでないか見ておきましょう。
    `sudo grep "Accepted password" /var/log/secure`
    自分がこの作業を開始したよりも前にこのログイン成功ログが残っていたらおかしい、侵入され済みかもとなります。ただ、時刻が日本時間とは限りませんからね、特に海外VPSだったりするなら。おかしいじゃんとあわてる前にタイムゾーンのご確認を。
6. **完了**
確認がOKなら、もう一般ユーザーとして公開鍵認証で入り必要に応じてsudoするという一般的なセキュリティレベルが完成しています。
これでもう、最初にログインしたrootのセッションは切っても大丈夫です。
React環境を高速構築する【vite】

React学習の際に使用したビルドツールviteについて
備忘録として記載させていただきます。

**手順**
```ruby:qiita.rb
npm create vite@latest
```
始めに任意のディレクトリで上記コマンドを入力します。
```ruby:qiita.rb
Need to install the following packages:
create-vite@5.1.0
Ok to proceed? (y)
```
次のパッケージをインストールする必要があります。
create-vite@5.1.0
続行してもよろしいですか? (y)
(私は問題ないので続行しました。)
```ruby:qiita.rb
? Project name: » vite-project
```
名前を聞かれていますので、プロジェクトの名前を入力しましょう。
```ruby:qiita.rb
? Select a framework: » - Use arrow-keys. Return to submit.
    Vanilla
    Vue
>   React
    Preact
    Lit
    Svelte
    Solid
    Qwik
    Others
```
環境を選択できます。
今回はReactを選びましょう。
```ruby:qiita.rb
? Select a variant: » - Use arrow-keys. Return to submit.
>   TypeScript
    TypeScript + SWC
    JavaScript
    JavaScript + SWC
```
お好みの言語を選択してください。
(SWCとはJavaScriptおよびTypeScriptコードを高速にコンパイルするためのツールです。)
```ruby:qiita.rb
Done. Now run:

  cd noteapp-with-react
  npm install
  npm run dev
```
上記が表示されればOKです
```ruby:qiita.rb
npm create vite@latest
``````ruby:qiita.rb
npm create vite@latest
```

あとはcdコマンドで作成したディレクトリに入って
$ code .で開きましょう。

```ruby:qiita.rb
 npm install
```
最後に必要なモジュールをインストールして完了です。
【ブラウザ拡張機能】Reactサイトに外部からHTMLタグを挿入する

## 事象
Chrome拡張機能にて、**Reactを使用しているサイトに対し** 下記のようにHTMLコードを直書きしたところ、
```javascript
root.innerHTML += new_HTML
```
そのサイトの更新が停止した。

## 解決手法
`innerHTML`書き込みでは、 **`React`のレンダリングが機能しない**

`appendChild`で解決される。
```javascript
root.appendChild(new_tag)
```

これで  [ページ乗っ取りの王、ページ乗っ取りキング](https://qiita.com/uts1_6/items/11e348ead4bae71571b8)ですね。
うおぉぉぉ！いつの間にかiOS形式に変換できるようになっていた消しゴムモデルLaMaをiPhoneで使う

# あの消しゴム機能がついにiOS形式に変換できるようになった
![Dec-27-2023 23-34-07.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/1af1859c-f58c-5920-e6f9-050d8aa9ff08.gif)

以前はiOS形式にできなかったLaMaインペインティングモデル。
フーリエ変換か何かが変換できなかった。
CoreMLToolsのアップデートで変換できるようになったらしい。
というのは、変換スクリプトを提供してくれている人をGitHubで見つけた。

https://github.com/mallman/CoreMLaMa

ありがとうマルマンさん。

# 変換方法

```shell
git clone https://github.com/mallman/CoreMLaMa.git
cd CoreMLaMa
pip install -r requirements.txt
python convert_lama.py
```

これだけでLaMa.mlpackageがゲットできる。

![スクリーンショット 2023-12-28 0.47.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/91bd6432-5644-ada9-3d1e-9c0493396712.png)

サイズも２００MBぐらいで、実行時間も2秒ぐらい（iPhone13pro）。
最高か。

ちなみに、変換スクリプトでは、LaMaのラッパーモデルを作って、出力を画像のピクセル値に非正規化している。

```python
class CoreMLaMa(torch.nn.Module):
    def __init__(self, lama):
        super(CoreMLaMa, self).__init__()
        self.lama = lama

    def forward(self, image, mask):
        normalized_mask = ((mask > 0) * 1).byte()
        lama_out = self.lama(image, normalized_mask)
        output = torch.clamp(lama_out * 255, min=0, max=255)
        return output
```

うむ、勉強になる。

# iOSで実行

```swift
let config = MLModelConfiguration()
let model = try LaMa(configuration: config)
let input = try! LaMaInput(imageWith: inputCGImage, maskWith: maskCGImage)
let out = try! model.prediction(input: input!)
let pixelBuffer = out.output
```

これだけである。入力画像と、消したい領域が白の白黒画像を入れるだけ。
結果も画像(PixelBuffer）で出てくる。
最高かよ。

**入力**
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/73035bd0-2146-b47e-88ae-fd2cc2c2c2fa.jpeg width=300>

**マスク**
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/6e1104c6-5fe3-d039-d6ae-3e4a31c4d23e.jpeg width=300>

**結果**

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/8d2ff16c-c78d-2fa4-a10b-317d34860028.jpeg width=300>

# アプリ例
ということで、lama-cleaner-iOSを作ってみました。

マスク描画→インペインティング→スライダー比較
というだけだけど、インペインティングの基本的なiOS実装は入っていると思います。

https://github.com/john-rocky/lama-cleaner-iOS

🐣
****
フリーランスエンジニアです。
AIについて色々記事を書いていますのでよかったらプロフィールを見てみてください。

もし以下のようなご要望をお持ちでしたらお気軽にご相談ください。
AIサービスを開発したい、ビジネスにAIを組み込んで効率化したい、AIを使ったスマホアプリを開発したい、
ARを使ったアプリケーションを作りたい、スマホアプリを作りたいけどどこに相談したらいいかわからない…

いずれも中間コストを省いたリーズナブルな価格でお請けできます。

お仕事のご相談はこちらまで
rockyshikoku@gmail.com

機械学習やAR技術を使ったアプリケーションを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
テストケース作成のポイント

## はじめに
テストケースを見ることがあるが気になることが多いのでポイントを記載することにした、気の向くままに書いてみる

## 赤い糸で紐づける
テストケースは何を基に作成したのかをわかるように紐づけておく
そうすることで、仕様に記載されている内容のテストに漏れがないことが判断できるようにする
また、リリース後に問題が発覚したときに、関連する機能に対してどのようなテストをしたのかが確認しやすくなる
ついでにいうとほんまにこのテストケースあってるの？って疑われた時に調べやすいです(私はすぐに疑います、自分で作ったものすら疑います)

理想は、仕様⇔テストケースが相互に追いかけられること

例：仕様書ｘｘｘを基に作成しました
　　紐づくリンクを貼り付けておく
　　

## 目的が大事
どのような目的・意図なのかを記載する(一目でわかるように)
記載されているとテストする人にやりたいことが伝わりやすいためです
手順と期待結果だけが記載されていても、ポイントが伝わらずに、流出につながることもある。
また、目的・意図が記載されていると、手順を読まずともやりたいことがわかるのでレビューしたり、テストケースを探しやすくなる
個人的には、仕様が変わったなどで、同じ手順でテストができないことが判明した場合に、目的・意図があれば、テスト手順を修正して残すべきなのか、テスト自体が不要なのかの判断がしやすいと思っている。

例：保存ボタンを2回押下するというテストがある、しかし目的の書き方を変えるとやりたいことが変わってくる。
　　目的：保存ボタンを連続で二回押下してもデータが二つ作られないことを確認したい
　　目的：保存ボタンを押下すると、ボタンが非活性に変わるので二回目の押下は無効であることを確認したい
　　

## 誰がやっても同じがいいんです
極端な場合は、仕様だけ記載されていて、手順も何もない場合がある
これでは人によって手順がことなり、結果が変わる可能性がある
あと、別の人(または未来の自分)が再実施するときに苦労するだけなので、手順は丁寧に記載するべきだと思う。


## 正しくってなんですか？
期待結果に良くあるのが「正しく動くこと」
正しくって書くのは楽だけど、どうだったら正しいの？の「どう」の部分をしっかり記載する
しっかり記載しておかないとどっかで見落として、流出するから

例
・何が表示されていたら正しいの？
・どのようなデータが作られていたら正しいの？
・どこで挙動すれば正しいの？
・何秒で切り替われば正しいの？
・どれが動けばいいの？

## 終わりに
フォーマットなんかはいったん自由でいいと思うんですが
以下を満たすようなテストケースを作ることを意識してもらえればなーと思いました。

・何を基にしたのかがわかる
・何をしたいのかがわかる
・どうすればできるのかがわかる
・何を確認すればいいのかがわかる
異常ではなく以上
【TailwindCSS】peerの使用方法


以下のように`peer`を使用すると兄弟要素の状態に基づいてスタイルを設定できます。

```html
<form>
  <label class="block">
    <span class="block text-sm font-medium text-slate-700">Email</span>
    <input type="email" class="peer ..."/>
    <p class="mt-2 invisible peer-invalid:visible text-pink-600 text-sm">
      Please provide a valid email address.
    </p>
  </label>
</form>
```

`peer`を先に記述している要素に記述しなければ適用されません。
以下のように記述した場合には適用されません。

```html
<!-- spanとinputの順番を入れ替えなければ適用されない -->

<label>
  <span class="peer-invalid:text-red-500 ...">Email</span>
  <input type="email" class="peer ..."/>
</label>
```
AWS SAM CLIインストールではまったこと。（メモ）

VScodeでLambda関数を作成してデプロイする事を勉強する為
AWS SAM CLIをインストールしました。
環境はWindows 11です。
AWSの公式サイトを参考にインストールしたのですが、sam --versionを実行しても何も表示されません。
パスを通してないのが原因だと思い
withch samを実行して確認して、そのパスを環境変数に登録。
再起動かけても変わらない。
調べたら、
C:\Program Files\Amazon\AWSSAMCLI\binの配下にsam.cmdとsam.exeが入っていないといけないらしい。
sam.cmdはあるがsam.exeがない。
sam.exeがないとコマンド打っても動作しないらしい。
アンインストールして

[AWS SAM CLI 再入門 2021.08](https://qiita.com/hayao_k/items/7827c3778a23c514e196)
の記事を発見。

この記事を参考にpip installを実行したら、正常にインストールできました。
Markdownしか書きたくない人のためのWebサイト制作

# 制作背景
- ReactでWebサイトを作ろうと考え勉強していたが、React以外の知識 (TypeScript, HTML, CSS, etc...) が足りていなかった。
- でも自分のWebサイトは欲しい。
- もうMarkdownで書けば良くね？
- GitHubPagesならJekyllのテーマ指定するだけでいい感じになるじゃん。
# 内容
- Markdownで楽してWebサイトを作る
    - Markdownに対するJekyllテーマの適用
    - GitHubPagesを用いたサイトの公開
# 作ったもの
https://github.com/comimome/comimome_web

Google Analytics付けるためにファイルが色々あるが、最低限`_config.yml`と`README.md`があればよい。
# リポジトリを作る
ついでに`README.md`も生成して中身を書いておく。
# Jekyllテーマの選択
https://pages.github.com/themes/

GitHubがいくつかのテーマをサポートしているので好きなものを選択。今回使用したテーマはMinimal

https://github.com/pages-themes/minimal

リポジトリにある`_config.yml`を自分のリポジトリ直下にぶち込む。
少しいじれば自分の好みに出来そう。
# GitHubPagesを有効にする
リポジトリの`Setting -> Pages -> Build and deployment`で`Source = Deploy from a branch`, `Branch = main -> /root -> Save`を選択。
# コンテンツを追加する
Markdownファイルを追加して`README.md`にリンクを付けたりする。このときリンク先はMarkdownファイルではなくHTMLファイル or URLにした方がよい、偶にMarkdownファイルに飛ばされるため。
```md
[プロフィール](/contents/profile.md)
```
ではなく
```md
[プロフィール](/contents/profile.html)
```
or
```md
[プロフィール](https://comimome.github.io/comimome_web/contents/profile.html)
```
のように書く。
Androidアプリをリリースし広告収入を得るための手順

# はじめに
最近Android向けアプリをリリースし広告収入(リアルに1円ですw)を得たので、そこまでの流れを整理しようと思い投稿

ちなみに・・・
今日のご飯をスワイプで簡単に決めるアプリを作りました↓
https://play.google.com/store/apps/details?id=com.teamdelta.mealmotion

# 手順
ひとまず私が実施した手順を示します。

1. アプリの内容を決める
1. google abmobにアカウントを登録する
1. play consoleにアカウントを登録する
1. アプリを開発する（applicationIDには注意！）
1. リリースビルドを作成する
1. アプリ情報をplay consoleに登録し審査に送信する
1. google admobのapp-ads.txtを公開する
1. リリース後、google admobにアプリを登録する

次に、各手順について説明していきます。

# 1. アプリの内容を決める
これは説明不要だと思いますが、まずは作るアプリの内容を決めましょう。

# 2. google admobにアカウントを登録する
今回はgoogle admobで広告配信をするので、アカウント登録します。
詳しい説明はググってください。

# 3. play consoleにアカウントを登録する
play storeにアプリを公開するので登録必須です。
おとなしく25$払ってアカウント登録しましょう。

# 4. アプリを開発する
好きなやり方でアプリを開発しましょう。
ただし、applicationIDはデフォルトのexample以外にしておきましょう。
参考↓
https://qiita.com/deritto777/items/3bacde2254fd5f8b23fc

また、広告配信のためにgoogle admobにアプリを登録しておきましょう。
play storeに公開されていないアプリも登録できるので、この辺りで登録しましょう。

# 5. リリースビルドを作成する
リリース用にaap(Android App Bundle)を作成します。
開発用の設定（テスト広告用の設定など）は修正して本番用にしてからビルドしましょう。

# 6. アプリ情報をplay consoleに登録し審査に送信する
アプリができたら、play consoleに必要な情報を登録していきます。
アプリをリリースする場合、**プライバシーポリシーを公開するためのwebページ**が必要になります。
私は無料でできるということで、GithubPagesを使ってプライバシーポリシーを公開しています。

データセーフティやプライバシーポリシーなど初めてやる場合は結構時間がかかると思いますがもうひと踏ん張りです。リリースビルドを登録し、審査に送信できれば準備完了です。

# 7. google admobのapp-ads.txtを公開する
admobで広告配信するためにはapp-ads.txtというファイルを公開する必要があるようです。
色々ググりまして、結局firebaseで公開しています。

# 8. リリース後、google admobにアプリを登録する
手順4で登録したのは仮の情報なので、ストアに公開されたら登録し直しましょう。

# おわりに
ざっくりとですが、admobを使って広告収入を得るまでの流れを書いてみました。
アプリを作るぞー！となって開発するやる気があるうちにリリースまでしてみると面白いですよ。

補足ですが、手順6の審査には3日、手順7のapp-ads.txt反映は2.5日かかりました（この間やることないのでソワソワしてましたw）
手順の順番をうまいことすれば待つだけの時間は減らせるかも知れません。

ではでは、楽しい開発ライフを
[Poetry]poetry env infoコマンドで環境の詳細をチェック！

poetryを使用しているなら`poetry env info`で詳細な情報が見れますよ。


```linux
root@hogehoge0000:/code# poetry env info

Virtualenv
Python:         3.11.2
Implementation: CPython
Path:           /root/.cache/pypoetry/virtualenvs/project_name-MATOk_fk-py3.11
Executable:     /root/.cache/pypoetry/virtualenvs/project_name-MATOk_fk-py3.11/bin/python
Valid:          True

System
Platform:   linux
OS:         posix
Python:     3.11.2
Path:       /usr/local
Executable: /usr/local/bin/python3.11
```

# Poetryとは
[Poetry HP](https://python-poetry.org/)
RAM(メモリ)について

# はじめに
毎週1本様々な技術に関する記事を投稿しています。
もし興味のある方は下のリンクから他の記事も見ていただければ幸いです。
 [@7_inai_](https://qiita.com/7_inai_)

# RAMとは
`RAM(Random Access Memory:自由にアクセスできるメモリ)とは、コンピューターが実行中のプログラムやデータを一時的に格納するためのメモリ`のことです。
RAMは、CPUが処理するためのデータを迅速に読み書きすることができる __高速な記憶装置__ で、RAMは電源が供給されている間のみデータを保持し、電源が切れると中身が消える __揮発性メモリ__ です。

### ※備考：ROMとは？
ROM(Read Only Memory：読み取り専用のメモリ)とは、半導体などを用いた記憶素子および記憶装置の一つで、製造時などに一度だけデータを書き込むことができます。
情報を書き込み事が出来ず、かつ電源がOFFした場合も情報を保持する性質から、コンピューターの基本的な動作を管理するためのファームウェア（例：BIOS）や、製造時に固定された特定の情報を格納する用途に使用します。


# RAMの種類
### ■DRAM（Dynamic Random Access Memory)：
__容量が大きく比較的安価__ であるため、メインメモリとして使用されます。しかし、定期的なリフレッシュが必要であり、アクセス速度もそれほど速くありません。

### SRAM（Static Random Access Memory）:
DRAMよりも高速で、リフレッシュが不要なメモリです。しかし、__高価で容量が小さい__ ことが特徴であり、キャッシュメモリなどに使用されます。


# RAMの役割
### ■プログラムの実行:
コンピューターが実行中のプログラムやそのデータを保持し、CPUが必要な情報に迅速にアクセスできるようにします。
### ■マルチタスク処理:
複数のプログラムやタスクを同時に実行する際に、RAMはそれらのデータを同時に保持し、効率的に切り替える役割を果たします。

# 終わりに
多くのRAMを搭載することで、大規模なプログラムや複数のタスクを効率的に処理することができます。特に、メモリが不足するとシステムの動作が遅くなる場合があるので、RAMの容量やアクセス速度はコンピューターの性能に大きな影響を与えます。

最後までお付き合いくださりありがとうございました。
「開発コンテナー構成'.devcontainer/devcontainer.json'ファイルは既に存在します。」への対応

# 背景
こちらのissueを参考に解決したが、日本語での記事がなかったので作成
https://github.com/microsoft/vscode-remote-release/issues/9302

# 目的
vscodeの拡張機能であるdevcontainerを使用してコンテナ作成したい。
devcontainerの設定ファイルはwsl上のubuntu内に配置して利用したい。
wsl上で動作するUbuntuに以下のようにプロジェクトフォルダを準備した。

```
  dev_project
  └ .devcontainer
    ├ devcontainer.json
    └ Dockerfile
```

# 環境
- Windows11 Home 23H2
- vscode 1.85.1
  - devcontainer v0.327.0
  - wsl v0.81.8

# 事象
vscodeのコマンドパレットより「Dev Container: Open Folder in Container...」で
プロジェクトフォルダを指定するが、以下のポップアップが表示され、
フォルダ内のdevcontainer.jsonを読み込まない。

![already_exist.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118317/41840520-7e57-f028-07a2-999095b2c182.png)


# 原因
vscodeのUNCパス設定不足
vscodeがubuntu内のファイルを認識することはできたが、
内容へのアクセスができない状態となっていた

・vscodeでubuntu内のdevcontainer.jsonを開こうとしたときの表示

![UNCエラー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118317/12023db6-8c2d-124e-4093-cb97ee4371fe.png)


# 対応
1. vscodeで「ファイル」→「ユーザー設定」→「設定」で設定画面を開く
1. 「セキュリティ」セクションにある「Allowed UNCHosts」に「wsl.local」を追加
1. vscodeを再起動

![vscode_security.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118317/d21b1a31-301f-d0b8-fa1e-6aba7bfc93a6.png)
自動テストツール「MagicPod」を半年間使ってみた

## 今までの状況

以前までは[NightWatch](https://nightwatchjs.org/)を導入し、使用していました。
以下はその時の状況になります。
- **導入初期**  
  開発エンジニアの手によって定期的に更新されていた。
- **導入から1年後**  
  システムの機能が増えるにつれて管理されなくなり、コードでのテストは行わず、テスターの手動でテストを行なっていた。

開発エンジニアの片手間でテストを実装していたこともあり、保守性やテストカバレッジは決して良いものではなかったです。


また、コードで実装することは開発未経験のテスターの手には余り、次第に手動でテストを行うことが当
たり前になってしまってました。


テスターの負担が大きくなりすぎたため、テスターの人でも自動テストをメンテナンス出来る方法がないかと考え、テスト自動化ツール「MagicPod」に辿り着きました。

## なぜMagicPodにしたか
- **国内での知名度が高く、ユーザーコミュニティやイベント等の情報交換の場が多く設けられていること**
    - 知名度が高いと使用ユーザーも多く、日本語の情報が取得しやすいかなと考えたためです。
    - 現在だと国内で特に有名なのが、「MagicPod」と「Autify」の二つになります。

- **実行回数が無制限**
    - 「Autify」は実行回数が決まっているのに対して、「MagicPod」は実行回数が無制限です。
    - 実行回数が無制限であれば、テスターの人も積極的にテスト実装やメンテナンスが出来ると思い、ここは特に重視してツール探しを行いました。

## 半年間使ってみて実際どんな感じ？
**結論：すごくいい**
- **テスターの工数が削減できた**
    - 今まで手作業でやっていたテストケースを自動化したことで月10時間ほどの削減に繋がった。
    - 余ったリソースで例外的なテストケースを手動でテストすることが出来るようになり、バグの早期発見にも繋がった。

- **日々新しい機能が追加される**
    - 改善要望等のユーザーの声を積極的に取り入れており、新しい機能が日々追加される。
    - 最近だと、「ヘルスコア機能」が実装されて、テスト自動化の状況を定量的に見ることができ、テスターのテスト自動化をより良くしていこうという意識も見れるようになった。
- **サポートが丁寧で的確である**
    - 不明点やわからないことがあっても、サポートに問い合わせをするとすぐに的確な回答をもらえる。
    - 回答も開発未経験の人でもわかりやすく、テスターの方からも好評である。

## まとめ
MagicPodを導入してから、決まった手順を繰り返し正確に行う必要のあるテストケースを自動化した事で例外的なテストケースを重点的に行うことが可能になりました。

自動テスト化したことでリソースが余り、テスターの方が主体的に様々なテストケースを実施してくれるようになり、テストチーム全体の雰囲気も良くなったと思います。

サポート体制も充実しており、不明点が聞ける環境があるのでテストを自動化したい方には是非おすすめだと思います。

## これからどうしていきたいか
- ヘルスコア機能のスコアが現状が70台のため、90台を目標にテストケースを見直していきたい。
- MagicPodについての情報を積極的に発信していきたい。

---
2023 AI実装検定 A級を受けた所感など

# はじめに  
2023年12月下旬に[AI実装検定 A級](https://kentei.ai)を受験したので，その所感などを記録しておく．  
少しでも何かの役に立てれば幸いである．

# 受験の流れについて 
以下のサイトを参考にしてマイページを登録し，そこから申し込みを行う．
https://cbt-s.com/examinee/examination/equ.html

# 簡単な概要  
- CBT（Computer Based Testing）形式，すなわちコンピュータ上で試験を行う
- 試験会場は出願時に[会場一覧](https://cbt-s.com/examinee/testcenter/?type=cbt)から任意に選択し，当日現地で受験した 
- ３つの分野（AI，数学，プログラミング）からそれぞれ20問ずつ，計60問を60分で解かなればならない
    - 各問題の範囲は公式のシラバス通りである（[HP](https://kentei.ai)に掲載）
- 経験者からの話によると問題の中には出題ミスが含まれていることがあるらしい
    - 実際集合の問題で，何度計算しても全体のうち$A$と$B$に属さない人数がマイナスになってしまっていた...（普通は [全体] $\ge$ $A \cup B$）
- 問題はランダムで出題されるので，時間配分を事前に把握することが難しい
    - しかし，時間が余れば後で問題を見返すことはできる（後で見たい問題にチェックを付けることが出来る）
- 試験終了後，その場で点数を把握できる（合格証と領収書はマイページから入手できる）

# 結果 
- 結果：合格
- 点数：91.6% （90%超えたのはうれしく思う）
- 内訳：数学 90% / プログラミング 90% / AI 95%  

# 所感 
- 実際はインターネット上にサンプル問題と同様の問題であり，思考力が問われるような特段難しい問題は出なかった．
    - 計60問を60分なのでどちらかというとスピードが問われる？
- numpy, pandas, matplotlib, scikit-learnなどは勿論独学で取得するのもよいが，[signate](https://signate.jp/)や[kaggle](https://kaggle.com/)で実際にそれらを使ってみた方が理解度が速い？
- 数学は線形代数，微積分，確率が出題されるが，確率は高校の教科書，その他は大学の参考書の各章末問題に出てくるレベルである．
    - 問題を見て瞬時に解法が出てくるくらい演習するのが望ましい？（実際そのおかげで20分以上残して全問解き終わることが出来た）
    - 特に **固有値及び固有ベクトル** は頻出かつ地道に計算して解かなければならない．
- 計算問題の解き方を工夫する（以下「[計算問題の工夫](#計算問題の工夫)」参照）
- 合格率は70%以上と決まっているので，自分は何問落とすことが出来るか？を考えてから問題を解いた．
    - 某漫画か何かで実践された考え方を参考にした
    - 苦手な科目があるときは特にそこの配分を考えた方がスムーズにやりやすい？

# 計算問題の工夫
## 注意事項
実際に以下の問題がそのまま出ることは無いであろう．
## 例（一部）
以下の問題の解を選択肢から選べ．（$\bigodot$はアダマール積を表す）

$
\begin{pmatrix}
   a \\\\  
   b
\end{pmatrix} 
\bigodot
\begin{pmatrix}
   c \\\\  
   d
\end{pmatrix} 
\bigodot
\begin{pmatrix}
   e \\\\  
   f
\end{pmatrix} 
\bigodot
\dots
\bigodot
\begin{pmatrix}
   y \\\\  
   z
\end{pmatrix} 
$

- このまま計算してしまうと時間がかなりかかると思われる（特に小数が含まれる場合があるのでなおさらである）．
- **My解法：** 各行列の各値の符号や倍数に着目して選択肢を絞る
    - 例：$a$が$0.04$，$b$が$-9$であれば，解は上が4の倍数，下が9の倍数となり，選択肢が絞れる！


# おわりに
次はS級取得に臨む．
あと[Pythonデータ分析試験 #python試験](https://www.pythonic-exam.com/exam/analyist)を年内もしくは遅くとも2024年１月中までに受験完了する（書籍がもらえるらしいので，Qiitaで呟いてみるがどうだろうか...）．
合格したらまた記事を書くかもしれない．

追記：Pythonデータ分析試験合格しました。
Keyball61を無線化したい

Keyball61で無線化した情報が見つからなかったのでまとめる

ブートローダーを更新
下記のサイトでブートローダーとアプリケーションを更新する
ble_micro_pro_bootloader_0_11_2
ble_micro_pro_default_0_11_3

https://sekigon-gonnoc.github.io/BLE-Micro-Pro-WebConfigurator/

下記のGitからクローンする
マウス入力ができなかったので、ファームウェアを書き換えてます

https://github.com/yu-zyu/ble-micro-pro-keyball61/tree/main

ReadMeの手順を進める

手順４は、make -j8 SKIP_GIT=yes keyball/keyball61:bmp:uf2　でビルドした

電源は下記の記事を参考に作ればおk

https://qiita.com/BlackChoco1ate-Xp10r/items/c23af9625b3a98b557ed

キーマップの変更は下記

https://sekigon-gonnoc.github.io/qmk_configurator/#/Keyball61/undefined
【SwiftUI】箇条書きできるViewを作成する

# はじめに
箇条書きViewってありそうでないんですよね
そう思ったので作ってみました。

# サンプルアプリ
![スクリーンショット 2023-12-27 22.44.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/89c060f9-ea08-2c6e-429b-0a444d3bfc48.png)

# 実装
```swift
import SwiftUI

struct BulletPointListView: View {
    let alignment: HorizontalAlignment
    let spacing: CGFloat?
    let bulletPointShape: BulletPointShape
    let items: [String]
    
    init(alignment: HorizontalAlignment = .center, spacing: CGFloat? = nil, bulletPointShape: BulletPointShape, items: String...) {
        self.alignment = alignment
        self.spacing = spacing
        self.bulletPointShape = bulletPointShape
        self.items = items
    }
    
    enum BulletPointShape: String {
        case circle = "circle"
        case circleFill = "circle.fill"
        case square = "square"
        case squareFill = "square.fill"
        case diamond = "diamond"
        case diamondFill = "diamond.fill"
    }

    var body: some View {
        VStack(alignment: alignment, spacing: spacing) {
            ForEach(items, id: \.self) { item in
                HStack(alignment: .top, spacing: 5) {
                    Text(Image(systemName: bulletPointShape.rawValue))
                        .scaleEffect(0.5) // BulletPointのサイズを調整
                    
                    Text(item)
                }
            }
        }
    }
}
```

# 使い方
```swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        BulletPointListView(
            bulletPointShape: .circle,
            items: "あいうえお", "かきくけこ", "さしすせそ", "たちつてと"
        )
    }
}
```

# おわり
本当はこんな感じで作りたかったのですが、技術不足で実現できませんでした。

```swift
BulletPointListView(bulletPointShape: .circle) {
    Text("あいうえお")
    Text("かきくけこ")
    Text("さしすせそ")
    Text("たちつてと")
}
```

こんな感じでできませんかね？
【色変記事】一般情報系大学生がAtCoder入茶＆入緑した話

# 1. 始めに
初投稿です。
2023年時点で大学三年生の[Ang](https://twitter.com/Ang_kyopro)と申します。
先日のABC334にて7か月、28回のコンテスト参加で<font color="green">**入緑**</font>を達成できました。
そこで、記念、振り返りとして入茶、入緑をまとめて色変記事を書くことにしました。
基本的には自己満記事になりそうですが、略歴が似ている方などは参考になるかもしれません。

**レートとパフォーマンスの推移**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535783/704c24ef-b970-639a-d062-f2af662cdc61.png)

**Achievement**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535783/7ddea8d5-b4c5-387c-ca0c-f24095afbc71.png)

**ABC Pie Charts**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535783/0d7e3be3-8243-438d-08ff-9d630d99161a.png)

# 1. 略歴、スペック
AtCoderの成長については、本人の略歴や開始時点でのスペックが強く相関があると感じているので、簡単に自己紹介を失礼します。
#### 基礎スペック
* 底辺国立情報系大学生B3
* セキュマネ、基本情報、応用情報合格済み(セキスぺは今秋の受験で不合格)
* プログラミングは大学で初めて触れた
* コード書くのは講義があるときくらい

#### AtCoder始めた時点での数学力
* 義務教育レベルの数学、算数は理解している(つもり）
* 高校数学はほとんど分かっていない
* 大学数学も同じく全く分かっていない
#### AtCoder始めた時点でのプログラミング力
* 大学の講義で習ったPythonの基本文法や簡単な使い方は分かっているレベル
* FizzBuzzくらいなら苦労せず書ける
* 基本情報の午後の疑似言語問題を苦労せず解けるレベルのアルゴリズム力
# AtCoderを始めたきっかけ
AtcCoderという名前だけは、[某数学解説系Youtuber](https://www.youtube.com/@UMRgurashi)のツイッターアカウントをフォローしていたので認知していたのですが、縁のない世界だと思っていました。
しかしB3の5月ごろ、就活も視野に入ってくる中で、プログラミング強くなれば就活の役にも立ちそう、プログラミング出来るのって何となくかっこいい!みたいなノリで始めました。
# 入茶までにやったこと
* ABCに毎週参加
* ABCの復習

基本的にこれだけです。
競技プログラミングというものを楽しめる性格だったようで、毎回楽しく参加していたら、気づいたら茶色になっていました。
# 入緑までにやったこと
* ABCに毎週参加
* ABCの復習
* 暇を見つけてABCの過去問埋め
* E869120さんの鉄則本とアルゴリズム×数学本の購入、流し読み
* B1の後輩へのプログラミング指導

入茶までは順調にレートが伸びていたのですが、そこで停滞してしまいました。
その中で、それを打開するのに特に効いたと思うのは、ABCの過去問埋め+参加したABCの復習、B1の後輩へのプログラミング指導2つです。

**ABCの過去問埋め+参加したABCの復習について**
出来なかった問題は解説を読んで方針だけ理解し、実装は極力自力で行うようにしていました。他人のコードを読むのが下手なだけかもしれませんが、コードの意図を理解しながら写経するよりは、自身で解法の方針を咀嚼し、コードに書き起こす方が易しく楽しいと感じたからです。
それが結果として、出来なかった問題をできるようにすることに繋がっていたのかもしれません。

**B1の後輩へのプログラミング指導について**
サークルで後輩にプログラミングを教える中で、メソッドや言語の仕様について理解があやふやだった部分を固めると言った意味で効果があったと感じています。教えることが学ぶことに繋がるということを強く実感できる機会になりました。

# 今後について
院進予定なので、就活が本格化するまでのあと一年半あります。
そこまでに、アルゴリズムは青タッチ、ヒューリスティックは黄色到達を目標に精進するつもりです。

# 終わりに
最後までお読みいただきありがとうございます。
では、また次の色変記事でお会いしましょう。
Codelabsで学ぶandroid開発1(基本コース)

# Codelabsとは
googleが発信しているハンズオンまとめサイト

https://codelabs.developers.google.com/



今回勉強するのはその中でも
「Composeを用いたAndroidアプリ開発の基礎」コース

https://developer.android.com/courses/android-basics-compose/course?hl=ja

自分のスペックは
・エンジニア歴半年程度
・PHP,Java,C#は多少触ったことがある
・スマホアプリ開発は全くの未経験

分かる範囲ははしょりつつ、自分なりに咀嚼した内容のアウトプットとしてまとめていく。


# Kotlinとは
JetBrains社が開発したオブジェクト指向言語
Javaの統合開発環境を作ってる会社が開発した言語なのもあってかJava VMでも動くらしい

拡張子は.kt

## Kotlinプレイグラウンド
ブラウザで動く簡単なエディタ
Hello World!
みたいな超基礎の書き方はこの辺で確認できる

https://developer.android.com/training/kotlinplayground?hl=ja


## Kotlinのコード規約
細かい内容はスタイルガイド参照のこと

https://developer.android.com/kotlin/style-guide?hl=ja

・小かっこと中かっこの間にスペースが必要
・タブ文字じゃなくてスペース4つ分インデントしてね
・行末セミコロンいらない

```kotlin:sample.kt
fun main() {
    println("Hello, world!")
}
```

同じ行に複数処理を書くとエラーになる
セミコロン使わない影響かな
```kotlin:sample.kt
fun main() {
    println("Cloudy") println("Partly Cloudy") println("Windy")
}
```

## 変数
`val 変数名: 型 = 初期値`

```kotlin:sample.kt
val num: int = 256
```

…クセ強くない？
`const int a = 1;`
の方が直感的だよね

変数名はキャメルケース

型はString, Int, Double, Float, Booleanなど
数値型でも基本的に大文字スタートらしい


### 文字列の中で変数を表示する

変数の前に `$` をつける

```kotlin:sample.kt
fun main() {
    val num: Int = 1
    println("num = $num")
}

```

### 型の推論
明示的に記述しなくてもコンパイル時に型を推論してくれる

```kotlin:sample.kt
//初期値があるなら、型はなくても良い
val num1 = 1

//変数宣言のみで初期値がない場合は型宣言が必要
val num2 :Int
```

### 文字列の中で計算する
`${ 任意の計算式 }` になるよう囲う

```kotlin:sample.kt
fun main() {
    val num1 = 1
    val num2 = 2
    println("num1 + num2 = ${num1 + num2}")
}
```

Javaだと
`println("num1 + num2 = " + (num1 + num2)};`
と文字列の足し算にしないといけなかったところが文字列の中に変数を組み込めるのは便利


### 変数の値を更新する
```kotlin:sample.kt
val num: Int = 1
num = 100 //Val cannot be reassigned
```

valは定数の宣言なので再代入できない
再代入を行いたい場合、変数宣言時に`var`を使う
……valとvarさすがにどっかで間違えそうだな


```kotlin:sample.kt
var num: Int = 1
num = 100 //問題ない
```

ちなみに、Kotlinで定数はUPPER_SNAKE_CASE
詳細はスタイルガイド参照


## 関数
```
fun 関数名(引数): 戻り値の型 {
    中身
    return 返り値
}
```
戻り値を宣言しない場合、型はUnitとして扱われる。Unitは他言語のvoidと同じ。
何も返さない場合も戻り値の型としてUnitを宣言した方が明示的でわかりやすい。

```kotlin:sample.kt
fun main() {
    val num: Int = sumGetter(1, 2)
    println("num = ${num} \nnum * 4 = ${num * 4}")
}
fun sumGetter(num1: Int, num2: Int): Int {
    val sum: Int = num1 + num2
    return sum
}

/* 出力内容
num = 3
num * 4 = 12
*/
```

### 名前付き引数
関数呼び出し時に、引数の部分に
`引数の名前 = "hoge"`
みたいな書き方をすることができる

引数の順番を変更できたり、
後述の「デフォルトの引数」がある場合それを省略できる

```kotlin:sample.kt
fun main() {
    outputString(1, "test1")
    outputString(str = "test2", num = 2)
}
fun outputString(num: Int, str: String): Unit {
	println(str)
}

/*出力内容
test1
test2
*/
```

### デフォルトの引数
関数の定義時に
`fun sample(num: Int = 1)`
のようにすることで、デフォルトの値を設定することができる。
上述の名前付き引数と合わせることでちょっと楽に書けるようになる

```kotlin:sample.kt
fun main() {
    outputString(1, "test1")
    outputString(num = 2)
}
fun outputString(num: Int, str: String = "default"): Unit {
	println(str)
}

/*出力内容
test1
default
*/
```

これで基本コースは終わり
Amazon Kinesis Data Firehose zero bufferingを試してみた

# 背景・目的
本日、[Amazon Kinesis Data Firehose now supports zero buffering](https://aws.amazon.com/jp/about-aws/whats-new/2023/12/amazon-kinesis-data-firehose-zero-buffering/)が発表されましたので、簡単に特徴を整理し、試してみます。

# まとめ
- Kinesis Data firehoseではZero bufferingがリリースされました。これにより、0秒〜900秒まで選択ができるようになりました。

# 概要
今までは、最低60秒間のバッファだったが、更にリアルタイム性を求める場合は、バッファリングしない（ゼロバッファリング）がサポートされるようになったようです。
変換など追加の処理が行われない場合は、ほとんどのワークロードでは5秒以内に配信されるとのことです。

# 実践
## KDFの作成（60秒）
まずは、以前の60秒で試してみます。
1. KDFのトップページで「配信ストリームを作成」をクリックします。
1. バッファ間隔を60秒に設定します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/98c22063-72d3-e473-54f7-6cb33bed7ba1.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/f08fe5d8-dcf8-1479-b08b-984415777924.png)

### デモデータでテスト
1. 「デモデータの送信を開始」をクリックします。※2023/12/27 21:37（JST）に開始しました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/78458233-f523-8be0-a693-7cca7962b6cd.png)

1. 「デモデータの送信を停止」をクリックし、停止します。
1. S3を確認します。おおよそ一分ごとにファイルが配置されていることがわかります。ファイルサイズは、800K前後です。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/c5fd4a5f-6dd8-e27c-096d-0baef734c6af.png)

1. KDFのメトリクスでもリアルタイム性（データの鮮度）は61秒というのがわかります。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/dc2afdac-09c4-06ac-3c63-950d375c6b15.png)


## KDFの変更（0秒）
上記のKDFから、バッファリングを60秒から0秒に変更してみます。

1. 「編集」ボタンをクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/bebe2b6e-f9d0-8390-3ddc-c659467e3376.png)

1. バッファ間隔を「0秒」に変更し、「変更を保存」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/637f07de-3941-6040-d3fb-7ba5a06df823.png)

### デモデータでテスト
1. 「デモデータの送信を開始」をクリックします。※2023/12/27 22:10（JST）に開始しました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/6703a0de-7732-6b5d-31f0-5ad0b6751f75.png)

1. 「デモデータの送信を停止」をクリックし、停止します。
1. S3を確認します。おおよそ**6秒ごと**にファイルが配置されていることがわかります。ファイルサイズは、70Byte 前後です。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/a4a54689-2a0e-9d7d-09d9-2aa0205568fd.png)

1. KDFのメトリクスでもリアルタイム性（データの鮮度）は、5秒というのがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/0dc686b0-e765-350e-f0a4-009eaca16d9c.png)

# 考察
今回、Kinesis DataFirehoseのZero burfferingを試してみました。
S3へのフィードでは、5秒程度で送信されていることが確認できました。

S3にフィードした場合では、このあとに、ETL（※1）やAthenaなどで利用する際にはファイルが細かくなりすぎてI/Oが多く発生し効率性の観点ではマイナス面もあると思われますが、HTTPエンドポイントなどワークロードによっては有効かもしれません。

※1 ただし、Glueではデータをまとめて読み込むgroupFiles/groupSizeのパラメータがあるので、まとめて読むことも可能です。

# 参考
https://docs.aws.amazon.com/ja_jp/firehose/latest/dev/buffering-hints.html
LaravelでAPIを叩いた時に[cURL error 60: SSL certificate problem]が出てきた時の対処法(本番環境非推奨)

# 発生環境
- MAMP
    - PHP 8.3
    - Laravel 10.35
    - MySQL
    - Apache


# 発生経緯
```php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Http;

public function syncPost(Request $request){
    $fetched = Http::get("https://example.com/api/");
    return response()->json(["response" => 200]);
}
```
Laravelを用いて上記のようなコードでAPIを叩いたところ、以下のようなエラーが出た。
```
cURL error 60: SSL certificate problem: unable to get local issuer certificate (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for https://example.com/api/ {"userId":1,"exception":"[object] (GuzzleHttp\\Exception\\RequestException(code: 0): cURL error 60: SSL certificate problem: unable to get local issuer certificate (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for https://example.com/api/ at /Users/projectdir/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php:211)
[stacktrace]
```


# 検索してみた結果
以下のような手順が出てきた
- 証明書をダウンロード
- php.iniに記述を追加

う---ん...めんどくさい...

# 結果
本番環境は非推奨だが、開発環境でパパッとやるなら以下のように書き換えればよさそう
```php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Http;

public function syncPost(Request $request){
    $fetched = Http::withOptions([
        'debug' => true,
        'verifiy_host' => false,
    ])->get("http://example.com/api/");
    return response()->json(["response" => 200]);
}
```

やったことは単純でwithOptionsを用いて検証をスキップしただけ。
あんまりお勧めできないが信頼できるホストかつ開発環境ならこれの方が楽