OmniAICreator/Qiita-1.07M huggingface dataset:
FormDataを使用する際、最低限知っておきたいこと

その技術の概要と、利用する意味にフォーカスした記事になります。

**注意**
未経験から転職した、一年目のエンジニアが、作成したものになります。
そのため、至らぬ表現や、誤った表現をしている場合があります。

経験豊富な先輩エンジニアの方々へ
もし、誤った情報を記載していた際は、大変お手数をおかけしますが、ご指摘いただけますと幸いです。

少しでも、皆様のお役に立てれば幸いです。

# 記事の内容
- どんな内容なのか
- どういう目的で使うか
- どうやって使えばいいか

## どんな内容なのか
引用：[mdn web docks](https://developer.mozilla.org/ja/docs/Web/API/FormData)
>FormData インターフェイスは、フォームフィールドおよびそれらの値から表現されるキーと値のペアのセットを簡単に構築する手段を提供します。これは fetch()、XMLHttpRequest.send()、navigator.sendBeacon() の各メソッドを用いることで送信が可能です。エンコーディング型を "multipart/form-data" に設定した場合にフォームが使用するものと同じ形式を使用します。

つまり、「キーと値のペアのセットを簡単に構築する手段」です。
また、使用できるメソッドの中に、「append」や「set」などがあり、オブジェクトとしてデータを追加できるものです。

## どういう目的で使うか

>送信用のフォームデータを作成したり、送信方法を管理するフォーム要素内のデータを取得するために使用できます。
引用：[mdn web docks](https://developer.mozilla.org/ja/docs/Learn/Forms/Sending_forms_through_JavaScript)

Formのデータを作成する際に使用します。

>既存の`<form>` のデータを含む FormData オブジェクトを構築するには、 FormData オブジェクトの作成時にその form 要素を指定します。
引用：[mdn web docs](https://developer.mozilla.org/ja/docs/Web/API/XMLHttpRequest_API/Using_FormData_Objects)

HTMLのformタグのデータを、そのままFormDataオブジェクトに入れる事で、formの内容を反映する事ができる。
formに入力されている情報を、そのまま送信したりできるイメージです。

>ゼロから FormData オブジェクトを作成する
>以下のように FormData オブジェクトはあなた自身で作成でき、インスタンス化したら append() メソッドを呼び出すことでフィールドに付加します:
引用：[mdn web doc](https://developer.mozilla.org/ja/docs/Web/API/XMLHttpRequest_API/Using_FormData_Objects)

Formからデータを作成するだけでなく、自分でインスタンス化して、そのインスタンスに対して値を追加していく、こともできる。

## どうやって使えばいいか
細かい使用方法は、別のサイトをご参照ください
ここでは、ざっくりと概要をお伝えします。

1. 中身を追加する(メソッド：set, append)
1. 中身を確認する(メソッド：entries)
1. 送信する

大きく三つに分類できるかなと思います。

## 参考文献
この記事を書く際に、参考にさせていただいたサイトをご紹介します。

- [JavaScrpt入門 FormDataの使い方](https://javascript.keicode.com/newjs/how-to-use-formdata.php#5)
- [mdn web docs](https://developer.mozilla.org/ja/docs/Web/API/FormData)
- [FormDataって何？ゼロから解説](https://qiita.com/akkt222/items/ce93d53e8d92a78a0694)
Brainでlinux(その2)-i3wm導入

その1で準備が完了したので次はwmの変更。
Brainは画面が小さいのでワークスペースを効率的に活用できるタイル型のi3wmに変更してみた。

# 1. インストール
下記のコマンドで必要なモジュールのインストール。
~~~
sudo apt install i3 i3status rofi
~~~

再起動して、ログイン画面でi3が選択できれば成功

# 2. i3の設定
### 2.1 初回起動時の設定
i3を選択して初回の起動時に、設定画面が表示される。
modに割り当てるキーを選択する。
ここでAltを選択。

### 2.2 configファイルの設定
~/.config/i3/configが生成されているため、そのファイルを修正。
下記を追加する。

~~~
bindsym $mod+d exec rofi -show drun
~~~

重複して同じキーを設定するとエラーとなるため、初期設定の$mod+dはコメントアウトしておく。

もっと手の込んだ設定をした方が使いやすくなるのだろうか・・・？

### 2.3 i3の再起動
mod+Shift+c
で設定ファイルを再読み込み
mod+Shift+r
でi3を再起動

これで、rofiをランチャーモードで呼び出せる。

# 3. i3statusの設定
### 3.1 configファイルのコピー
下記のコマンドで初期設定ファイルをコピーし、自分用の設定ファイルを準備
~~~
cp /etc/i3status.conf ~/.config/i3status/config
~~~

### 3.2 configファイルの設定
macアドレスが表示されていると、画面の写真をそのまま使用できないため非表示にする。
configファイルの下記の行をコメントアウト。
~~~
order += "ipv6"
~~~

A9200は解像度が低いため、設定を変えなくても画面から切れて表示されなかったが、念のため変更しておく。

### 3.3 i3再起動
上記と2.3と同じ手順で再起動すると変更が反映される。

# 4. 次回予告
vimの設定
スタートアップ企業で社内初のアドベントカレンダーを実施する技術

この記事は[MOSH Advent Calendar 2023](https://adventar.org/calendars/9548)1日目の記事です。

プロダクティビティーチームの[@soartec-lab](https://github.com/soartec-lab)です。

# はじめに

私達はソフトウェアエンジニアは15人程という開発チームの規模感で開発しておりMOSHでは初のアドベントカレンダーの実施になります。
今回取り組みを行った際の考えていた事4つ、実際にやった事3つを共有するので将来「アドベントカレンダーやってみようかな？」と考えている誰かの参考になればと思います。

## 考えていた事

上記のような組織フェーズであることや日常で組織作りや採用に関わらせていただいている中で以下のようなことを考えていました。

### 1. 対外アウトプットとしての取り組みやすさ

MOSHの開発組織は対外アウトプットは多くはないと感じています。同時に今のフェーズや組織ケイパビリティでは実施するタイミングでは無いとも思っています。一方でアドベントカレンダーと言う形式だと1年に1度なのでチャレンジしやすいと考えています。

### 2. 今時点の組織フェーズだからこその楽しさ

アドベントカレンダーはソフトウェアエンジニアの界隈でやられることが多く、MOSHも来年はソフトウェアエンジニアの人数が増えて技術的な内容での実施になっている可能性があると考えています。そのため、このフェーズだからこそ色々な職種をまたいでMOSHというサービスに関わっていると言う共通点を持っているメンバーみんなで楽しめる貴重な経験かなと思ってます。

### 3. 始めるとしても少なくとも1人ではない

上記のような内容をふわっと思ってており週報やSlackのtimesで書いていたり、飲みの席で話していたら、賛同の声を聞いていた事で少なくとも1人では無さそうとは感じていました。また、普段の関わりからも、みんなで実施できるとは思っていました。

### 4. 葛藤

人数も少ないし実際にやるとしたらサービスや会社の名前を使うことになるし埋まらなかったら辛いな〜、とは言え来年になったらメンバーも会社のフェーズもも変わるしな〜と迷っていました。

## 実際にやった事

上記のような考えを持った上で、組織として初めての取り組みではあったので以下のポイントは抑えて進めていこうと決めていました。

1. 小さく始める
1. 判断軸を設定しておく
1. 上手くいかなかったら途中で止める
1. 手応えがあったら意思を固めて推進する

その上で以下を行いました。

### 1. アドベントカレンダー実施の社内記事を書く

やりたい背景にはエモい内容もあったのでポエムをそのまま書いてみました。以下は実際に書いた内容です。

![スクリーンショット 2023-11-28 17.51.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184760/d8fc77bc-30c9-3201-bf66-7b85251f2122.png)

> 参加者が15人集まったら実際にアドベントカレンダーを作って開始します。28日の時点で人数が集まってなかったら無かった事にします。又は私が残り全部埋めます。

1. **期日と集まった人数と言う判断軸**と**上手くいかなかったら途中で止める事**を明示する事で、本格的に進めるかの判断軸を持ったのと期待値調整を行う事を意識して**小さく始めました**。

### 2. 全体ミーティングで発信

MOSHでは毎週月曜日に全体会議と言う全メンバーが対象の共有ミーティングを行っており私も発言をする機会があるのでその場を借りて実施をアナウンスしました。以下は全体会議をリアルタイムで実況するチャンネルでの様子です。

![スクリーンショット 2023-11-28 19.01.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184760/e0759e33-f03c-1a3b-b1ae-d3d7a3395519.png)

### 3. Slackチャンネルの開設

実施にあたりコミニケーションが捗る様にSlackチャンネルを開設しました。開設したタイミングで以下のようにメンバーが参加して下さって単純にうれしかったです。

![スクリーンショット 2023-11-30 8.38.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184760/8fcdb083-7de7-fea6-e3bb-d0997ab89e4b.png)


合わせて実施に向けての具体的な質問や会話されたり参考情報をシェアしてくださる方がいたりと「みんなで作ってる感じ」がして盛り上がってきました。
初動で10人ほど集まり**手応えがあった**ので「残りは埋まらなかったら何か自分が書こうかな」と意思を固めて推進しました。

# まとめ

今回のアドベントカレンダーの実施では組織で新しい取り組みをする手段として以下のようなプロセスをとっています。

1. 小さく始める
1. 判断軸を設定しておく
1. 上手くいかなかったら途中で止める
1. 手応えがあったら意思を固めて推進する

このような流れはエンジニアリングの領域やプロダクト開発、組織作りなど様々な意思決定の確度を上げる方法にも共通していると思います。
事業と同様に今回の様な組織内の取り組みも小さく始めて大きく推進させ開発組織全体をより良くしていきたいですね。

# おわりに

いかがでしたか？

社内初のアドベントカレンダーを実施するまでの考えや実際にやったことを赤裸々に書いていました。どこかの誰かの参考になれば幸いです。

他の記事を自分で全部埋める事になっても外部発信を行う取り組みの成功体験を組織として持ちたいのでゴリっと進めたいと思っていましたが、最終的には実際には多くの人が手を挙げて下さり良いスタートが切れそうです。

明日は[CTOの村井さん](https://careers.mosh.jp/02a5ebae2cec4f24aed4336d9aff15d4)です！よろしくお願いします〜！
Amazon Bedrock：わかりやすい初心者向け概要

本記事は [Amazon Bedrock Advent Calendar 2023 by ナレコム](https://qiita.com/advent-calendar/2023/bedrock-knowledgecommunication) の1日目の記事です。

**Amazon Bedrock Advent Calendar 2023 by ナレコム** ではAmazon Bedrockの基本的な概要から具体的な各モデルの作り方や事例紹介などを行っていきます。

## はじめに

Amazon Bedrockは、AI技術を活用したい開発者にとって、画期的なプラットフォームです。この記事では、Amazon Bedrockの基本的な特徴、ファウンデーションモデル（FMs）の概要、および具体的な利用方法について解説します。

## Amazon Bedrockの概要

### 特徴

- **多様なFMsの選択肢**: AI21 Labs、Anthropic、Cohere、Meta、Stability AI、Amazon Titanなどの大手AI企業から、さまざまな高性能FMsを選択でき、ニーズに合わせた最適なモデルを見つけることができます。
- **簡単なインフラ管理**: APIを介してFMsにアクセスし、インフラの複雑さを排除。これにより、開発者はインフラ管理の手間をかけずにAIアプリケーションを開発できます。
- **カスタマイズの自由度**: 組織のデータを用いたFMsのカスタマイズが可能。ビジュアルインターフェイスを通じて、独自のデータを使用してモデルをプライベートにカスタマイズできます。
- **AWSツールとの連携**: AWSの既存ツールとのシームレスな統合により、安全かつ信頼性の高いAIアプリケーションの開発・運用が可能です。

### メリット

- **効率的な開発**: FMsを用いて、高性能なAIアプリケーションを迅速に開発。
- **スケーラビリティ**: 需要に応じてアプリケーションの規模を拡大可能。
- **カスタムAIソリューション**: 特定のビジネスニーズに合わせたカスタマイズが可能。

## ファウンデーションモデル（FMs）とは

ファウンデーションモデル（FMs）は、AI21 Labs、Anthropic、Cohere、Meta、Stability AI、Amazon Titanなどの大手AI企業によって提供されています。これらのモデルは、それぞれが独自の強みや専門分野を持ち、さまざまなAI関連のタスクをこなすことができます。しかし、これらのモデルを直接利用するには専門的な知識やインフラが必要です。
Amazon Bedrockは、これらのFMsをよりアクセスしやすくするプラットフォームです。Bedrockを通じて、開発者はこれらの高度なモデルを使って、自分のアプリケーションやサービスにAI機能を組み込むことができます。BedrockはAPIを通じてこれらのモデルへのアクセスを提供し、インフラ管理の複雑さを排除します。これにより、開発者は自身の専門知識に関わらず、容易にこれらの先進的なFMsを活用することが可能になります。

## Amazon Bedrockで利用可能なFMs

1. **AI21 Labs**: 多様な言語タスクに対応する大規模言語モデルを提供。
2. **Anthropic**: 安全性とカスタマイズ性に優れた対話型言語モデル。
3. **Cohere**: 自然言語理解と生成に特化したモデル。
4. **Meta**: 多言語対応と柔軟性に重点を置いた言語モデル。
5. **Stability AI**: 画像生成と編集に特化したモデル。
6. **Amazon Titan**: 文章生成や質問応答に特化したAmazonの言語モデル。

これらのFMsは、Amazon Bedrockを通じて利用でき、開発者が自分たちのニーズに合った最適なモデルを選択できるようになっています。

## まとめ：Amazon Bedrockの未来
Amazon Bedrockは、現在利用可能なFMsだけでなく、将来の技術進化にも対応する、柔軟なプラットフォームです。多様なファウンデーションモデルを提供することで、開発者は自身のビジネスニーズや要求に最適なAIソリューションを容易に見つけることができます。さらに、シンプルなインフラ管理とAWSツールとの連携により、安全かつ効率的なアプリケーション開発が可能になります。
Amazon Bedrockの将来は明るく、AIを活用した革新的なソリューションの開発を促進することで、さらに多くの企業や開発者がこの技術を利用し、その競争力を高めることが期待されています。このプラットフォームを活用することで、より賢く、よりユーザーフレンドリーなアプリケーションやサービスが創出され、AI技術の未来に貢献することでしょう。

---

また、ナレッジコミュニケーションでは  **「[Musubite](https://recruiting.musubite-job.com/features/company/knowledge-communication)」** というエンジニア同士のカジュアルトークサービスを利用しています！この記事にあるような生成AI 技術を使ったプロジェクトに携わるメンバーと直接話せるサービスですので興味がある方は是非利用を検討してください！

https://recruiting.musubite-job.com/features/company/knowledge-communication
初心者向け概要：GPTs（GPT Builder）とは

本記事は [OpenAI活用法 Advent Calendar 2023 by ナレコム](https://qiita.com/advent-calendar/2023/openai-knowledgecommunication) の1日目の記事です。

OpenAI活用法 Advent Calendar 2023 by ナレコム ではGPTsを含めた最新のOpenAIの活用法について紹介します。

### はじめに：GPTsとは？

GPTs（GPT Builder）は、2023年11月にOpenAIによって発表された、画期的な技術です。このツールは、人工知能の分野における最新のイノベーションであり、一般の人々が個々のニーズに合わせてカスタマイズされたChatGPTを作成することを可能にします。本記事では、GPTsの基本的な概念と、それを使用することのメリットを初心者の視点からわかりやすく解説します。

### GPTsの概要と基本的な特徴

GPTs（GPT Builder）は、ユーザーが自分自身のChatGPTをカスタマイズし、特定の用途や好みに合わせて調整することができるツールです。これは、AI技術の民主化を一歩前進させるもので、一般の人々にも手軽に利用できるように設計されています。このツールは以下のような主要な特徴を持っています：

- **カスタマイズ性**: 自分だけの独自のChatGPTを作成することができます。これにより、特定のニーズや好みに合わせた対話型AIの体験が可能になります。
- **利用のしやすさ**: GPT Builderは直感的なインターフェースを持ち、技術的な背景がない初心者でも簡単に使用できます。

### GPTsの利用シナリオ

GPTsを使用することで、以下のような様々な利用シナリオが想定できます：

1. **個性の追加**: あなたのGPTに特定の知識や性格を追加して、より人間らしい対話を実現することができます。たとえば、特定の分野の専門家として、または特定のユーモアセンスを持ったキャラクターとして設定することが可能です。
2. **特定の用途に特化**: 例えば、医療、法律、教育など特定の業界に特化したGPTを作成することで、その分野に特化した知識や回答を提供することができます。また、特定の趣味や興味に関連する質問に答えるGPTを作成することも可能です。

### GPTsの作成プロセス

GPTsを作成するプロセスは、以下のステップに分けられます：

1. **名前の決定**: まず、あなたのGPTに名前を付けます。これは、あなたのGPTが持つ個性や用途を反映するものであると良いでしょう。
2. **概要の定義**: あなたのGPTの目的や機能を定義します。これには、そのGPTがどのような質問に答えるか、どのようなタスクを実行するかなどが含まれます。
3. **プロンプトの設定**: あなたのGPTがどのような用途で使用されるか、どのような指示を受け取るかを設定します。

次の記事では、GPTsの具体的な作り方や作る上でのコツを紹介します。

### まとめ：あなたのGPTを作成しよう

GPTs（GPT Builder）は、AIと対話する新しい方法を提供し、個々のニーズに合わせたカスタマイズが可能です。この記事を通じて、GPTsの基本的な理解を深め、自分だけのChatGPT作成の旅を始めることができれば幸いです。次の記事では、具体的な作成プロセスや使用例について学ぶことで、より実践的な知識を身につけることができます。

---

また、ナレッジコミュニケーションでは  **「[Musubite](https://recruiting.musubite-job.com/features/company/knowledge-communication)」** というエンジニア同士のカジュアルトークサービスを利用しています！この記事にあるような生成AI 技術を使ったプロジェクトに携わるメンバーと直接話せるサービスですので興味がある方は是非利用を検討してください！

https://recruiting.musubite-job.com/features/company/knowledge-communication
Platform.shとは

[Platform.sh](https://platform.sh) とはアプリケーションをホストできるPaaS(Platform as a Service) です。よく知られている類似サービスにはherokuがあります。

以前はSymfonyCloudと呼ばれており、Symfonyフレームワークの開発者であるfabpotがPlatform.sh社のCPOを務めています。
https://platform.sh/company/

## インフラ

AWS, GCP, Azure等の上に構築されています。
デプロイ先をどのクラウドのどのリージョンにするか選べますし、万が一のときに変更もできます。

残念ながら日本リージョンには対応していません。

## 何ができるの？

自分でインフラを構築することなく、PHP, Ruby, Python, Java, Node, Goで作られたアプリケーションをデプロイできます。PHPは別にSymfonyでなくてもよく、LaravelもWordPressもデプロイできます。各言語のポピュラーなフレームワークに対応した"プロジェクトテンプレート"が提供されていて、フレームワーク向けの設定のサンプルとなっています。
※利用可能なプロジェクトテンプレート一覧 https://github.com/platformsh-templates

データベース等アプリケーションが使うミドルウェアは"サービス"と呼ばれます。PostgreSQLとMySQL(MariaDB)も好きな方を選べますし、Redisやmemcached, MongoDBも利用できます。
※利用可能なサービス一覧 https://docs.platform.sh/add-services.html#available-services

# まとめ

このアドベントカレンダーでは、日本ではほとんど知られていない＆使われていないPlatform.shの始め方〜使い方まで25日間に渡ってお伝えしていく予定です！

※ 一円ももらってませんが、これはすごいサービスだー！と思っているので勝手に宣伝しています。
【AWS re:Invent 2023】re:Inventでヘルシー生活に目覚めそうな件

# はじめに

現地は2023年11月30日、本日４日目になります。本当にあっという間で寂しい限りです:cold_sweat:
連日ネットワーキングの場にも参加し、充実した期間でした。

さて、アメリカといえばピザやハンバーガー等高カロリーなものが多く日本と比べて意識しないとヘルシーに過ごすのが難しいというイメージがありました。

しかしre:Inventでは、ヘルシーな食事や取り組みが複数あり日本にいるより美意識があがるかも？と思いましたので、現地レポートとしてその様子をまとめてみたいと思います。

# アクティビティ

会議中にはアクティビティセッションとして、ヨガ体験と5Kランが開催されました！

日本にいますと運動が中々できていませんでしたが、海外といういつもと違う環境なのでチャレンジしてみようと思えますしヘルシーな1日を送ることができました🏃‍♂️

私はヨガに参加しましたが、頭をすっきりさせて自分自身と向き合う時間を強制的に30分取れたことで頭がすっきりしてヘルシーな気持ちになりました。

ヨガ体験の様子はこちらの記事でまとめておりますので、ぜひご覧ください！

https://qiita.com/mizuki_hori_POHD_CCoE/items/4ee29e44c6afb60f3ff6

# 認定者ラウンジにコールドプレスジュース！

AWS認定者のみが利用できるラウンジでは食事や飲み物が充実提供されていますので、ラウンジに朝フラッと行ってみましたら、コールドプレスジュースが置いてありましたので早速飲んでみました！

![IMG_0267.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550351/baaa3ddf-2e2d-c937-3fca-65d0f53a7f6c.jpeg)


私はパイナップルときゅうりのジュースを飲みました！最初は複雑な味に感じましたが、どんどん癖になってきてとても美味しかったです🍹

ビタミン不足を解消することができました！

認定者ラウンジの様子は別の記事でも紹介しておりますのでぜひご確認ください！

https://qiita.com/masaki_seyama_POHD_CCoE/items/06c28775e84cc1430761

# サラダミールボックス(サラダ)

会期中はランチとしてミールボックスが食事会場に置いてあります。

ボックスの中身は２種類から選ぶことができそのうち１種類がサラダボックスでした！(写真撮るのを忘れました😇)

サラダは日本のコンビニサラダの3倍くらいの量に、更にキヌアがついておりかなりボリューミーです。

スーパーフードと呼ばれるキヌアをまさかre:Inventで食べられると思っていなかったのでとても嬉しかったです！

ぜひ参加された際には一度トライしてみてください！

# 毎日平均2万歩の移動と早起き

ホテル間、ホテルのセッション会場間の移動は日本では想像できない程距離がありますので、毎日沢山歩きます。私は日本にいると１日1000歩程のときもありましたので、この期間本当によく歩きました:runner_tone5:(おかげで足は筋肉痛ですｗ)

![IMG_0317.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550351/aab254d3-a791-0d8a-bbef-e793aa1d59f5.jpeg)

また、毎日KeyNoteは8時半からスタート、朝食は7時オープンなので基本6時前には起床していますので毎日早起き生活でこの期間で朝型人間になることができました:grinning:

この時間の流れに慣れてきた頃なので日本でも継続したいところです。

# さいごに

AWSについて沢山学んで、生活リズムと身体のビタミンバランスまで整えてくれるなんてこんな良いイベントは他にないのではないかと思います:smile::tangerine:

re:Invent期間は残り僅かですが最後までしっかりHave funしたいと思います！
SlackからAmazonQに聞いてみる。

こんにちは。これは[ディップアドベントカレンダー2日目](https://qiita.com/advent-calendar/2023/dip-dev)の記事です。

re:InventでAWSのサポートAI？的な機能AmazonQが発表されましたね。
すでに皆さんのコンソールに表示されており、使える状況にあるのではないかと思います。

実はひっそりAWS Chatbotとの連携もサポートされているのはご存知でしょうか？

https://aws.amazon.com/jp/about-aws/whats-new/2023/11/aws-chatbot-q-conversations-teams-slack/

今回はこれを試してみたいと思います。

## 1. Chatbotを立てる
まずはAWS Chatbotのクライアント設定を行います。
Chatbotのページ右側のクライアント設定からスラックを選び「クライアントを設定」をクリックします。

![スクリーンショット 2023-11-30 13.19.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86116/91fb15ec-6e15-09b6-0445-9f9984f9df21.png)

slackの連携ページが出るので、追加したいwork space名を入れ、連携を開始します。

![スクリーンショット 2023-11-30 13.19.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86116/43c59065-c3f6-42ab-c82d-8b519fea92b8.png)

![スクリーンショット 2023-11-30 13.20.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86116/b09a4a01-03fa-f6bc-d209-9e7755d2ee98.png)
![スクリーンショット 2023-11-30 13.20.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86116/e2c58e03-fa8a-9987-73d1-56861a06ab42.png)

コンソール画面に戻るので、chatbotの設定名、ログ記載オプション、Slackのチャネル
![スクリーンショット 2023-11-30 13.33.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86116/9592863c-929f-3931-67da-0341c33ec4bf.png)

アクセス許可などを設定していきます。
※今回はチュートリアル的な記事なので、アクセス許可はデフォルトにしています。
![スクリーンショット 2023-11-30 13.33.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86116/55fb2f12-8398-0bd2-fb85-61d8f0c79004.png)

通知オプションは設定しなくても大丈夫。
![スクリーンショット 2023-11-30 13.33.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86116/bbccecde-be57-8b2c-71c6-ad9a8ecd1f20.png)

あとは設定ボタンをクリックすれば終了。簡単ですね。


## 2. 早速Slackで聞いてみます。
![スクリーンショット 2023-11-30 13.36.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86116/a59be68e-d2f1-8145-809f-b9b6c9f602e8.png)

まだ日本語対応していないので、英語で聞くことになります。
※このときawsアプリをチャンネルに登録していなかったのでついでに登録もしました。

回答がスレッド形式で帰ってきました。
![スクリーンショット 2023-11-30 13.38.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86116/acffdcb5-f683-61bd-53c5-7a54291e995e.png)

簡単に連携できてとても便利です。
※マルチアカウントだったりの場合はまたちょっと違うのかもしれませんが一旦これでどうにかなるぞというところです。

発展アイデアとして、日本語対応が待てない場合、chatbotからamazon translateを一回挟んでQに投げられればいいなぁと思います。
※未調査なのでできるかどうかはこれから調べる感じです。

簡単ですが、機能調査と紹介でした。

https://aws.amazon.com/jp/translate/
【AWS】オンプレミス

# オンプレミスとは
自前でハードウェアを準備して、サーバやネットワーク機器などを自分たちで運用する利用形態。
企業はデータセンターを保有またはラックをレンタルする。

# オンプレミスのメリット
* 利用するサーバやネットワーク機器を自由に選択できる。
* 自社の都合でシステムを運用できる

# オンプレミスのデメリット
* ピーク時以外はリソースを持て余す傾向にある
* 一度構成を決めると、後から変更するのに労力がかかる
* 見積もりやサイジングが大変
* 費用がかかる(データセンターやソフトウェア、メンテナンス等)
 
:::note info
サイジング
運用するサービスの規模に合わせてサーバやネットワークのリソースを見積もること。
:::

# オンプレミスからクラウドへ移行する利点
* システム運用の負担が軽減される
* 低コストで運用可能
* システム変更やサーバ増強を低コストかつオンデマンドで実施可能
* 災害が起こった際、サービスへの影響を最小限に留めることが可能

# 参考
https://www.ntt.com/bizon/glossary/j-a/on-premises.html
https://www.idcf.jp/cloud/column/onpre_to_cloud.html
AWSの基本・仕組み・重要用語が全部わかる教科書
wslでelixir その114

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
練習問題、やってみた。

# 練習問題
Livebookでaxonで、sinを学習せよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/ce06e295-4888-ce1b-c83d-4686279db7da.png)


# セットアップ

```
Mix.install([
    {:nx, "~>0.6.1"},
    {:bumblebee, github: :"elixir-nx/bumblebee"},
    {:kino_vega_lite, "~> 0.1.7"},
    {:httpoison, "~> 1.8"},
    {:xla, "~> 0.5.1", XLA_BUILD: true},
    {:exla, "~> 0.6.1"},
    {:adbc, "~> 0.1"},
    {:kino, "~> 0.10.0"}
  ],
  config: [
    nx: [default_backend: EXLA.Backend]
  ])

  
```

# サンプルコード

```
defmodule Sin do
  require Axon

  def build_model(input_shape) do
    inp1 = Axon.input("x", shape: input_shape)
    inp1
    |> Axon.dense(8, activation: :tanh)          
    |> Axon.dense(1, activation: :tanh) 
  end

  defp batch do
    x = Nx.tensor(for x <- 1..100, do: [x / 15])
    y = Nx.tensor(for x <- 1..100, do: [:math.sin(x / 15)])
    {x, y}
  end

  defp train_model(model, data, epochs) do
    model
    |> Axon.Loop.trainer(:mean_squared_error, :sgd)
    |> Axon.Loop.run(data, %{}, epochs: epochs, iterations: 1000)
  end

  def run() do
    model = build_model({nil})
    input_data_100 = batch()
    data = Stream.repeatedly(fn ->
            input_data_100
          end)
    model_state = train_model(model, data, 10) 
        |> IO.inspect(label: "model_state")
    {x1_tensor, y1_tensor} = input_data_100
    x2_tensor = Nx.tensor(for i <- 0..100, do: [i / 15])
    y2_tensor = Axon.predict(model, model_state, %{"x" => x2_tensor})
    View.plotxy(Nx.to_flat_list(x1_tensor), Nx.to_flat_list(y1_tensor),
      Nx.to_flat_list(x2_tensor), Nx.to_flat_list(y2_tensor))
  end
end

Sin.run()

```

以上。
【Delphi】過去のプロジェクトを開くと変な位置にブレークポイントが表示される

# はじめに

**Delphi Users (Japan)** に寄せられた質問のやりとりをまとめてみました。

 - [Delphi Users (Japan) (Discode)](https://discord.gg/W593cak)

# Q: 過去のプロジェクトを開くと変な位置にブレークポイントが表示される？

過去のプロジェクトをマイグレーションするために新しい Delphi で開くと、変な位置にブレークポイントが設定されており、ブレークポイントを削除して保存しても次にプロジェクトを開くとブレークポイントが復活するのですが？

## A: [デスクトップの自動保存] を無効にした上で、プロジェクトフォルダ中のプロジェクトデスクトップファイル (*.dsk) を削除しましょう。

`[デスクトップの自動保存]` では次の設定が保存されます。

 - デスクトップ レイアウト
 - **ブレークポイント**
 - 監視式
 - IDE に現在開いているファイル

設定はプロジェクトを閉じた時に **プロジェクトデスクトップファイル (`*.dsk`)** に保存されます。

ですが、**[デスクトップの自動保存] が無効であっても、一旦作られたプロジェクトデスクトップファイルは IDE によって読み込まれてしまいます。** つまり、このプロジェクトは [デスクトップの自動保存] が有効な環境で過去に開かれた事があるという事になります。

[デスクトップの自動保存] が無効の場合には、プロジェクトを閉じてもプロジェクトデスクトップファイルは更新されませんので、ブレークポイントを削除しても、次にプロジェクトを開いた際に復活してしまいます。

以下、DocWiki からの引用です。

> プロジェクトを閉じるときや製品を終了するときに、プロジェクト デスクトップ ファイル（ファイル拡張子が .dsk のファイル）が自動保存または更新されます。
>
> <myproject>.dsk ファイルには、下記項目の現在の設定が記録されます。
> ・デスクトップ レイアウト
> ・ブレークポイント
> ・監視式
> ・IDE に現在開いているファイル
>
>［自動保存の設定］セクションの［プロジェクト デスクトップ］が無効になっている場合、既存のプロジェクト デスクトップ（.dsk）ファイルは、プロジェクトを開いたときにはすべて読み取られますが、更新はされません。 その結果、.dsk ファイルがディスクから手動で削除されるまでは、同じファイル群がプロジェクトで開かれます。
>
>後でプロジェクトを開き直すと、.dsk ファイルが読み取られ、デスクトップ レイアウト、ブレークポイント、監視式がすべて復元されます。 また、プロジェクトを閉じたときに開いていたファイルが、プロジェクトで使用されるかどうかにかかわらず、すべて再び開かれます。

いくつかある設定項目の内の `IDE に現在開いているファイルの自動保存` についてだけ書かれているので解りにくいですが、これをブレークポイントに置き換えると、

 - [デスクトップの自動保存] が有効だとプロジェクトを閉じた時にブレークポイントがプロジェクトデスクトップファイル (*.dsk) に保存される
 - プロジェクトフォルダにプロジェクトデスクトップファイル (*.dsk) があれば、[デスクトップの自動保存] の設定に関係なくブレークポイントが読み込まれる
 - [デスクトップの自動保存] を無効にしても、プロジェクトデスクトップファイル (*.dsk) は削除されないため、プロジェクトを開き直すとブレークポイントは復元される

という事を言っています。

## [デスクトップの自動保存]

メニューの `[ツール | オプション]` から設定しますが、Delphi のバージョンによって設定項目や呼び方が異なります。

### ・10.4 Sydney 以降

オプション画面の `[IDE | 保存とリカバリ]` にあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/e3ed660b-b3cb-d437-b8ae-bc036fd2af0a.png)

**See also:**

 - [保存とリカバリ (DocWiki)](https://docwiki.embarcadero.com/RADStudio/ja/%E4%BF%9D%E5%AD%98%E3%81%A8%E3%83%AA%E3%82%AB%E3%83%90%E3%83%AA)

### ・10.3 Rio 以前のガリレオ IDE

オプション画面の `[環境オプション]` にあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/cf726bfe-16b6-5d13-c394-9f13be0f5841.png)

**See also:**

 - [環境オプション (DocWiki)](https://docwiki.embarcadero.com/RADStudio/ja/%E7%92%B0%E5%A2%83%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3)

### ・Delphi 7 以前の旧 IDE

`[ツール | 環境オプション]` で開いた環境オプション画面の `[設定]` タブにあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/52f618c5-ef25-3ff1-7063-dcc4801c1d15.png)


# おわりに
結論としては **「デスクトップの自動保存を無効にしたら (なっていたら) \*.dsk を手動で削除しましょう」** という事になります。

過去のプロジェクトを開いて **Delphi.TStringsFileSystem はファイルシステムではありません** というエラーが出る時も `*.dsk` の削除で解決すると思います。

プロジェクトをバージョン管理している (複数人でプロジェクトファイルを共有している) 場合には、[デスクトップの自動保存] を無効にした上で `*.dsk` ファイルは除外しておいた方がいいかと思われます。

繰り返しになりますが、**古いプロジェクトに `*.dsk` が存在したら真っ先に削除する**のがトラブル回避のセオリーです。デスクトップの自動保存も外しておくとトラブルに遭遇しにくくなります。
私が保守運用の道を選んだ理由

社内の保守運用界隈で話しているときに、以下のようなお話を聞いたことがあります。

**「保守運用をやっているがメンバーのモチベーションが上がらない**
**「単純作業ばかりで将来が見えない」**

システムの保守運用をしている方からする**「あるある・・・」**となる内容で、チームメンバーの方や、もしかしたらご自身が当てはまるということもあるかと思っています。

**私自身は選んでシステムの保守運用を進んでいます。** 同じような思いの方や悩んでいる方へば少しでも力になればと思い投稿いたします

※私の記憶があいまいなところもあるかもしれませんm(_ _)m,noteに書いてたものとかなり類似、これから修正します、、、

# 自分がシステム保守運用を選ぶまで
## 入社直後（24歳）
　私はもともと”意識高い系大学生”と言われる部類だった気がしていて、入社してすぐの24歳のころ「孫正義さんの人生50年計画」を見て「カッコいい！」と思いました。

　よし、自分も決めよう！としたのですがなかなか決まらず、、、最終的に「30歳までに決めよう！それまでは３か月に１回振り返りをしていこう！」と決めました。

　普段は配属されたチームで必死にシステムの保守・運用と軽微な機能開発をやっており、入社して2,3年は「開発をしたい」という希望を少なからず出していた気がします。

　当初決めた通り３か月に程度普段より少し多く１回休みを取って「自分はどういう人生計画なんだろう・・・」とカフェで一日悩んだりしてました。

## 16連休・一人旅（28歳）
当時かなり忙しくしていたこともあり、たまっていた年休＋GWを利用して一人旅に出かけました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473422/052ea6ff-2615-480c-73e4-3c1731c8ce37.png)
>出てきた当時の計画※ただし、5/4には寂しくなって帰宅した模様

当時ちょっと流行っていたshot noteをもって、メモをしながら旅をしていました。過去の写真を漁って気づきましたが、なんと
**「命題：野村の人生の目標とは？」**
でした。このころから**世界平和**って言ってました、今となっては可愛い。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473422/2d95e2ce-4e18-1212-8ca9-0b539a10eef1.png)
>初々しい野村のメモ（16連休4日目）

## 更改プロジェクト立ち上げ（28歳）
これもシステム保守運用あるあるかもですが、配属され入社である程度仕事ができるようになってきた4年目に更改PJが立ち上がるときに上司と、「開発にいくのか保守運用に残るのか」と問われました。当時28歳だった私はぼんやり「楽しそう」と思って「システム保守運用」を選びました。

# 自分がシステム保守運用の道を選んだ理由
当時の私が決めたメモとともに３つの基準を書きます。〇〇を極めるというのは決めていて、その基準は当時以下３つ。これに**システム保守運用が当てはまる**と思いました。（言葉が汚いところもありますがご容赦を・・・）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473422/e904c299-f635-ada6-7c69-b363113f6996.png)
>初々しい野村のメモ（16連休15日目）

## 興味：オレが面白いと思うか・ワクワクするか
これはあまり論理的ではないかもです、私がチームリーダーをやっていたからかもでしれません、私はこのシステム保守運用という業界にワクワクしました
私自身はウォーターフォールを3年やりましたし、アジャイル開発も5年やりました。ただ、システム保守運用がいまだに一番ワクワクしています。ここはなぜかわかりませんが、周りに困っている人が大勢いて、そこに対して私がアクションすることで皆さんがより良い方向に導けている。そんな実感があるのかもしれません。

## 将来性：2050年まで必要になるものか・世の中で話題になるものか
システムの開発はもちろん将来性があるのはわかりますが、それ以上にシステム保守運用のほうが将来性があると考えています。
開発ももちろん将来性があると思いましたが、開発をするほど運用は増えるもの、、、ということは運用のほうが将来性高いのでは？と当時思いました。

## 自由度：完成されていない・ひねりようがある。
当時、開発の自動化やバグをいかに減らすかという論文は多くあり、世界的に「システム開発」に関しての改善を率先して進めていました。（今は昔ほどじゃないかもですが、まだ開発のほうが研究進んでいるように思います）　社内でも開発に関する改善は多くありましたが、システム保守運用に関してはまだまだ少なく、こちらのほうが改善の余地が大きいと思いました。

# そして2023年 システム障害対応へ特化
その後紆余曲折があり、私の個人的な思いが強い
**「システム障害対応」**
に特化することとしました。

[システム障害対応実践](https://www.amazon.co.jp/dp/479817890X?ref_=cm_sw_r_cp_ud_dp_T43F6C1K7C2K00NJ8E1D) という書籍も出版させていただき、「おわりに」にはしっかりと、**世界平和への思い**も書いています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473422/6fb4c8b1-3ccc-034e-95c8-56610a591e5d.png)

え！？何それ！？と思って頂いた皆様。12/02にこの世界平和の秘密を書きます！好うご期待！！
第一世代　本体の電源端子の追加

「aibo ers-11x/210で遊ぶ Advent Calendar 2023」の3日目です。

ers-11xをカプラーから電力を供給できるよう改造してきましたが、ケーブルがお尻から伸びていることとカバーを外したままなので見た目によくありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/b9de765a-2dc1-bebc-515c-f5ae7496b180.png)

そこでaibo本体に電源端子を追加する改造を施します。

:::note alert
警告
この記事について作者はいかなる責任も負いません。
バッテリーの分解、改造は非常に危険な行為です。
:::

:::note
業務外の個人的な検討活動です。
:::

#### 電源の配線の追加
本体を分解し、バッテリーのジャックに配線を追加しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/298227d5-e73e-13e8-c343-b9df46192f23.png)

背中のグリルの部分から配線を取り出し、ステップダウンレギュレータへ接続しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/2ca794c4-ade7-c76b-c106-095389ff578e.png)

#### 動作確認
電源ケーブルは背中から接続できるようになりました。
お尻の蓋を閉じて使用することができるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/e0ff1274-eab4-aa5b-5352-b1ed5cf1e47c.png)
GASでメチャクチャ簡単に「集計」をする方法。

# GASは集計が苦手？

自分、あんまりプログラム言語の得意不得意得手不得手には詳しくないんですが、Pythonに比べて集計するための情報があんまりないですよね(あるけどお前が知らんだけって言われちゃうと終わるのでそこは伏せておいて！）

で、ここではJavaScriptの集計関数、メソッドに詳しくなくても基本の集計やピボット化ができるよ、なお話です。

## 読んでくれると嬉しい対象者
- 会社でGoogleWorkSpaceを使える環境にある。
- プログラムの導入環境がセキュリティ上色々厳しい。
- GoogleのLookerStudioを使っているが動作が重くて困っている。
- GAS触ったことないからコピペで何かできるか体験してみたい。

じゃあレッツゴー。

## とりあえずデータを用意する。

ここに家計調査から引っ張ってきたお米の消費金額データを置いておきます。
[家計調査](https://docs.google.com/spreadsheets/d/1PhvdHoDtD33_yS7UWoQVjOSyGOt9oohZOVbV4EAU0aI/edit#gid=0&range=A1)

### まずは基本
このデータの中から、以下の条件で集計表を作ります。

1. 全国を除外
2. 米とパンの消費金額を都道府県の平均で集計

※ データ取りやすくするためにスプレッドシートでやっているので便利さが実感ないかもしれませんが、実務的にはcsvファイルを複数取得して結合して集計するなどする便利運用しています。

### 準備
:::note info
1. スプレッドシートに2枚のシートを用意します。
2. 1枚目のシート名を`家計調査`にして上記リンク先のデータを貼りつける。
3. 2枚目のシート名を`集計`にする。
:::

で、早速コードは以下な感じ。
```javascript
function create_Table_Average() {
  
  const sheetName = "家計調査";
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sh = ss.getSheetByName(sheetName);
  const allRecords = sh.getDataRange().getValues();
  console.log(allRecords);
  
  //クエリ関数を作っておく。
  const queryFormula = `=query('家計調査'!A:G,"select B,AVG(F) where D != '全国' AND (B contains('米') OR B contains('パン')) group by B label AVG(F) '平均消費金額(円)' format AVG(F) '#,##0' ")`

  //集計先のシートを指定
  const shTargetName = "集計";
  const targetSheet = ss.getSheetByName(shTargetName);
  targetSheet.getRange(1,1).setValue(queryFormula);

  //式を入れっぱなしだと不意に壊れる、関数参照に不都合だから値として入れなおす。

  const setedRecords = targetSheet.getDataRange().getValues();
  targetSheet.getDataRange().setValues(setedRecords);
  

}
```

どうでしょう？
これでお米とパンの平均消費金額が分かりましたね！

:::note alert
いやいや、米とパン以外の集計したいし。
:::

そらそうよ。
もっと動的に運用したいよね！

なので、ひとまずGASで関数の中に変数を入れられるようにしてみよう！

変数格納する方法は複数ありますが、クエリ関数の本体に' や　" を使うので、${}気泡は結構ややこしくなるため今回は + で対応します。

```javascript
function createTableAverage() {
  const sheetName = "家計調査";
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sh = ss.getSheetByName(sheetName);
  const allRecords = sh.getDataRange().getValues();

  // クエリ関数に入れる消費項目を変数で宣言、格納準備。
  const var01 = "米";
  const var02 = "消費支出";

  // クエリ関数を作っておく。
  //const queryFormula = `=QUERY('家計調査'!A:G, "select B, AVG(F) where D != '全国' AND (B contains ${var01} OR B contains ${var02}) group by B label AVG(F) '平均消費金額(円)' format AVG(F) '#,##0' ")`;
  const queryFormula = `=QUERY('家計調査'!A:G, "select B, AVG(F) where D != '全国' AND (B contains ('` + var01 + `') OR B contains ('` + var02 + `') ) group by B label AVG(F) '平均消費金額(円)' format AVG(F) '#,##0' ")`;


  console.log(queryFormula)

  // 集計先のシートを指定
  const shTargetName = "集計";
  const targetSheet = ss.getSheetByName(shTargetName);
  targetSheet.getRange(1, 1).setValue(queryFormula);

  // 式を入れっぱなしだと不意に壊れる、関数参照に不都合だから値として入れなおす。
  const setedRecords = targetSheet.getDataRange().getValues();
  targetSheet.getDataRange().setValues(setedRecords);
}

```

こんな感じ。
また次回はコードをいじれない人に動的に抽出方法を提供する方法に踏み込みます。
人生は体力だ - 2023年のひとりアドベントカレンダー

「続けていること」ってありますか。今年の 1 人アドベントカレンダーのテーマを「つづく」にしてみました。毎年 25 日間でなんとなく決めたテーマを基に書ききっている数年です。


## 「つづく」アドベントカレンダー…

https://qiita.com/advent-calendar/2020/mba

https://qiita.com/advent-calendar/2021/advent-calendar-delaxe

https://qiita.com/advent-calendar/2022/pineapple

上に続く、とにかく完走するためのアドベントカレンダーです。細かいところは走りながらかんがえます。

## 自己紹介

社会人歴 21 年目。上海赴任経て、2016Aug 生まれ娘、2018Oct 生まれ息子の母。2021 年, 2022 年 Qiita Top Contributor。ERP 界隈 20 年弱から飛び込んで Azure 歴 1 年駆け出しです。

アドベントカレンダーだからということでそれなりにひっそり日々のエンジニア職としての学びを書いていこうと思います。


## 人生は体力だ

印象に残っている一言があります。新卒入社した会社の先輩が言っていた一言です。正確には、
「『人生は体力だ』って言ってる体育の先生が高校の時いてさ、俺、高校の時はその先生のこと『何言ってんのこいつばっかじゃねえの』っておもってたんだけどさ、でも社会人になって分かったんだよ…人生って体力なんだ…」という新卒入社した会社の先輩の高校の体育の先生が言っていたという一言です (長い)。

当時はぼんやりそれを聞いていたわたしも、社会人歴をそれなりに重ねて分かりました。人生は体力です。体力とは言い換えると健康であることであり、因数分解すると続けること、楽しむこと、にもなる気がします。

- 健康であること
- 運動を始めたこと
- 体力がついたことで仕事ができるようになったこと

https://qiita.com/e99h2121/items/a279f8fb1fbe722aa31f

2023 年今年の学びです。

## つづく

そんなこんなで体力を維持しながらエンジニア職を続けるために、今年続けてきたこと、続けていること、続けたいことをアドベントカレンダーとして書いていきます。1 日目は動機だけ書いて埋まりました。つづく。
メインシステムのRubyをv3.2.2にバージョンアップした話

これは[Hubble Advent Calendar 2023](https://qiita.com/advent-calendar/2023/hubble)の4日目[^1]の記事です。

# はじめに
こんにちは！株式会社Hubbleでバックエンドのエンジニアをしている@okakeeです。
今回は少し前にメインシステムのRubyバージョンをv2.7系から最新安定版のv3.2.2にバージョンアップしたので、対応したポイントをまとめてみました。
またRuby3.1から試験的に導入され、Ruby3.2で正式採用となったJITコンパイラである「YJIT」も有効化してパフォーマンス比較もしてみました。

# リリース内容の確認
まずは事前にRubyのリリース内容を確認しておきます。
特に3.0で引数周りが大きく変わり動かなくなるケースがあるので把握しておきましょう。後述しますが今回はあまり大きなインパクトはありませんでした。

 - [Ruby 3.0.0 リリース](https://www.ruby-lang.org/ja/news/2020/12/25/ruby-3-0-0-released/)
 - [Ruby 3.1.0 リリース](https://www.ruby-lang.org/ja/news/2021/12/25/ruby-3-1-0-released/)
 - [Ruby 3.2.0 リリース](https://www.ruby-lang.org/ja/news/2022/12/25/ruby-3-2-0-released/)
 - [Ruby 3.0における位置引数とキーワード引数の分離について](https://www.ruby-lang.org/ja/news/2019/12/12/separation-of-positional-and-keyword-arguments-in-ruby-3-0/)

# キーワード引数系への対応
Hubbleではキーワード引数をほとんど使用していなかったので、コードの修正箇所としては数か所だけでした。
しかし、採用している一部のgemで長期間メンテナンスがされておらず、キーワード引数に対応していなかったものもあったので、代替のgemを採用したりforkしてパッチを当てる対応を行いました。
gemを見直すタイミングはなかなか難しいこともありますが、こういう機会があるとGemlistを見直す機会になりますね！
インパクトが大きくならないように定期的に更新や見直しを行うのも大事です。

# rubocopの追加ルール対応
rubocop自体のバージョンや`TargetRubyVersion`を更新して、新規のルールが追加されていますので増えたものを確認します。
私たちの方針としては基本的には新しいcopも全て採用した上で、構築とエンジニアリングのカルチャーに沿ってcopの変更や無効化をしています。採用するか判断に迷うルールはチームでアンケートを取ったり協議することで意見を取り入れて決定しています。
```yaml:.rubocop.yml
..

AllCops:
  TargetRubyVersion: 3.2
  DisabledByDefault: true
  NewCops: enable

Layout:
  Enabled: true

Style:
  Enabled: true

# Stringはダブルクォートで統一
Style/StringLiterals:
  Enabled: true
  EnforcedStyle: double_quotes

..
```
# YJITの有効化と計測
YJITの有効化は環境変数でさくっと有効にすることができます。
```
RUBY_YJIT_ENABLE=1
```
```
$ RubyVM::YJIT.enabled?
true
```

YJITを有効化した結果ですが、リクエスト全体やControllerなどのパフォーマンスは数%程度改善しました。その中で特にActiveRecordのLatencyがリリース前週比(P95)で122μs→87μsで14%の改善をすることができました。
このグラフは監視ツールのDatadogで出したものです。HubbleではBackendの全体的なモニタリングやログ収集にDatadogを使っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396830/e7520879-b544-674a-65f6-a789f6acc5c2.png)

実測値としての効果は薄いですが、コードやクエリのリファクタを行わず改善ができたのは嬉しいですね！
事前に調査していた通り、メモリの使用量は数十MB増加しましたが、余力が十分にあったため影響を与えるほどではありませんでした。
ちなみにYJITはRuby3.3以上のRailsアプリケーションでデフォルトで有効になるようです。[^2]

# 最後に
今回書かせていただいたポイント以外にもリファクタリングやRSpecの修正などを加え、全体的な動作チェックを行った上で結果的にバージョンアップは特に問題も起きず無事にリリースすることができました！

メジャーバージョンのアップデートはインパクトのある変更が入るので楽しみもある反面、アップデート内容を事前に把握して影響範囲に気をつけないといけません。
日頃から情報収集をして、トピックをチーム内で話題に上げたりするのもいいと思います。

明日は同じバックエンドエンジニアの@ks01050320141989さんの投稿です！
お楽しみに〜！

[^1]: 平日のみの投稿なので、投稿日は6日ですが4日目の記事としています。
[^2]: [Enable YJIT by default if running Ruby 3.3+](https://github.com/rails/rails/pull/49947)
wslでelixir その113

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
練習問題、やってみた。

# 練習問題
Livebookでnxだけで、sinを学習せよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/01fb43e5-ca9d-e06f-34d4-6e651cf7a46c.png)


# サンプルコード

```
defmodule Sin do
  import Nx.Defn

  defn init_random_params do
    key = Nx.Random.key(42)
    {w1, new_key} = Nx.Random.normal(key, 0.0, 0.9, shape: {1, 128}, names: [:input, :layer])
    {b1, new_key} = Nx.Random.normal(new_key, 0.0, 0.9, shape: {128}, names: [:layer])
    {w2, new_key} = Nx.Random.normal(new_key, 0.0, 0.9, shape: {128, 1}, names: [:layer, :output])
    {b2, _new_key} = Nx.Random.normal(new_key, 0.0, 0.9, shape: {1}, names: [:output])
    {w1, b1, w2, b2}
  end

  defn predict({w1, b1, w2, b2}, x) do
    x
    |> Nx.dot(w1)
    |> Nx.add(b1)
    |> Nx.tanh()
    |> Nx.dot(w2)
    |> Nx.add(b2)
    |> Nx.tanh()
  end

  defn loss({w1, b1, w2, b2}, x, y) do
    preds = predict({w1, b1, w2, b2}, x)
    Nx.mean(Nx.pow(y - preds, 2))
  end

  defn update({w1, b1, w2, b2} = params, x, y, step) do
    {grad_w1, grad_b1, grad_w2, grad_b2} = grad(params, &loss(&1, x, y))
    {w1 - grad_w1 * step, b1 - grad_b1 * step, w2 - grad_w2 * step, b2 - grad_b2 * step}
  end
end

y0 =
  0..100
  |> Enum.map(fn x ->
    :math.sin(x / 15)
  end)

x0 =
  0..100
  |> Enum.map(fn x ->
    x / 15
  end)

x = Nx.tensor(x0)
y = Nx.tensor(y0)
params = Sin.init_random_params()

params =
  for j <- 0..1000, reduce: params do
    acc ->
      for i <- 0..100, reduce: acc do
        bcc ->
          Sin.update(bcc, x[i], y[i], 0.01)
      end
  end

p =
  0..100
  |> Enum.map(fn x ->
    Xor.predict(params, Nx.tensor([x / 15]))
    |> Nx.to_flat_list()
  end)

Vl.new(width: 200, height: 200)
|> Vl.data_from_values(x: Nx.to_flat_list(x), y1: Nx.to_flat_list(y), y2: p)
|> Vl.layers([
  Vl.new()
  |> Vl.mark(:line, color: :red)
  |> Vl.encode_field(:x, "x", type: :quantitative)
  |> Vl.encode_field(:y, "y1", type: :quantitative),
  Vl.new()
  |> Vl.mark(:line, color: :blue, stroke_dash: [6, 4])
  |> Vl.encode_field(:x, "x", type: :quantitative)
  |> Vl.encode_field(:y, "y2", type: :quantitative)
])
```


以上。
Compose化する前にGroupieについて簡単に学ぼう！

Compose化する前にGroupieについて簡単に学ぼう！
RecyclerViewのフレームワークであるGroupieは、Androidアプリ開発においてよく使用される重要なライブラリの一つです。この記事では、Groupieライブラリを使用して、効率的かつ柔軟にリストやカードのレイアウトを構築する方法について紹介していきたいと思います。(今回XMLの実装はシンプルなのでXMLの実装は省略しています)
まず初めに通常のRecyclerViewのAdapterにあたるItemについて実装していきましょう。
```
//Itemの作成
data class HogeItem (
    private val text: String,
) : Item<GroupieViewHolder>() {
    // ここでデータをビューにバインド
    override fun bind(viewHolder: GroupieViewHolder, position: Int) {
        ...
    }
    // レイアウトを設定
    override fun getLayout() = R.layout.item_hoge 
}
```
次にActivityやFragmentなどのビューを操作する場所でAdapterをセットしましょう。
```
//Adapterのセットアップ
val recyclerView = findViewById<RecyclerView>(R.id.recycler_view)
val adapter = GroupAdapter<GroupieViewHolder>()
recyclerView.adapter = adapter
```
最後にアダプターにアイテムを追加してシンプルなGroupieの実装ができました。
```
//Itemの追加
adapter.add(HogeItem())
```
次にビューバインディングを使ってGroupieのアイテムを実装するためのクラスであるBinableItemを用いて実装してみました。
・基本的にビューバインディング推奨

それでは早速実装して見ましょう！
```
data class HogeBindableItem(
    private val text: String,
) : BindableItem<ItemHogeBinding>() {

    //データをビューバインディングにバインド
    override fun bind(viewBinding: ItemHogeBinding, position: Int) {
        viewBinding.text = text
    }

    override fun initializeViewBinding(view: View): ItemHogeBinding{
        return ItemHogeBinding.bind(view)
    }

    override fun getLayout() = R.layout.item_hoge 
}

```
そして通常のItemと同じようにアダプターをセットアップし、アダプターにアイテムを追加しましょう。

Groupie のItemを作成する際はItemのコンストラクタに必ずID(Long型)を渡すようにしよう！
・IDを設定しないと、areItemsTheSameメソッドによってItemが更新された際に同一のビューだと判断されず更新されてしまいリソースの無駄遣いになってしまいます。
```
data class HogeItem(id: Long) : Item<GroupieViewHolder>(id)
```
以下はItemとBinableItemの生コードです。
```
//ID生成の実装
protected Item(long id) {
    this.id = id;
    }

protected Item(long id) {
    super(id);
    }
    
```

次にGroupieの引数がある場合は、data class,引数がなく尚且つ外部から影響を受けない実装の場合はobjectでItemを作成するようにしよう！

・data classと通常のclassと違いequals()を自動で実装してくれるので、手間が省けます。
```
data class(private val hoge: Hoge):BinableItem<ItemHogeBinding>{
    .....
}
```

・引数がなく尚且つ外部から影響を受けない実装の場合にobjectで定義する理由は、objectで生成されるインスタンスはシングルトンであり、シングルトンは常に同じインスタンスを参照するため、equals()は必ずtrueを返すためequals()を実装しなくても同一のビューだと判断されるためです。
```
object HogeHoge: Item<GroupieViewHolder>{
    .....
}
```

最後にBinableItemを使わずにbindingをするパターン
```
data class HogeItem (text: String) : Item<GroupieViewHolder>() {
    override fun getLayout() = R.layout.hoge_item_layout 
    // ここでデータをビューにバインド
    override fun bind(viewHolder: GroupieViewHolder, position: Int) {
        HogeItemBinding.bind(viewHolder.itemView).apply{
            TextView.text = text
        }
    }
    
}
```
基本的にBinableItemを使う場合と動作はあまり変わらないので、他のファイルのコードの書き方に合わせて書くのがベターだと思います！

最後までお読みいただきありがとうございます！
GASで天気予報がGoogleドキュメントに表示されるようにした話

# GASってスプシばっかりだよね？？

いや、そーじゃないって意見もあるかもだけど。

出オチでごめんなさい、下のコードをGoogleドキュメントのエディタに貼って実行すると最新の天気予報と天気図がGoogleドキュメントに反映されるよ！

あとはGoogleWorkspaceのサイトにこのドキュメントをインサートしとけばオリジナルお天気サイトの出来上がりだ！

※HTMLデプロイしろとか言わないで・・・。

で、こんなもんYAHOO!天気でええやんけ。
って思うでしょ？

それが結構使い勝手イイんですよ。

身の回りで、自分の場合はお子様が

「サンタさんいつくるの？」

って聞いてくるたびにこの天気図にサンタさんのイラスト挿入して
見せてそれっぽいことを吹き込んでます。

```javascript
function createHTMLFromJSON() {
  // JSONデータを取得
  // 例えば広島のエリアコード、340000を変数に入れる。
  const office_area_code = "340000";
  const url = `https://www.jma.go.jp/bosai/forecast/data/forecast/${office_area_code}.json`;
  const jsonData = JSON.parse(UrlFetchApp.fetch(url).getContentText());

  // Googleドキュメントのアクティブなドキュメントと本文を取得
  const doc = DocumentApp.getActiveDocument();
  const body = doc.getBody();

  // タイトルを挿入
  const title = body.appendParagraph(jsonData[0].publishingOffice + ' - ' + Utilities.formatDate(new Date(jsonData[0].reportDatetime), 'JST', 'yyyy年MM月dd日 HH:mm') + '発表');
  title.setFontSize(14);

  // 各地域の情報を挿入
  for (let i = 0; i < jsonData[0].timeSeries[0].areas.length; i++) {
    const area = jsonData[0].timeSeries[0].areas[i];

    // 各項目を挿入
    const areaName = body.appendParagraph("\n●"+area.area.name + ':');
    areaName;

    if (Array.isArray(area.weathers)) {
      body.appendParagraph('\n天気: ' + area.weathers.join(', '));
    } else {
      body.appendParagraph('天気情報がありません');
    }

    if (Array.isArray(area.winds)) {
      body.appendParagraph('\n風: ' + area.winds.join(', '));
    } else {
      body.appendParagraph('風の情報がありません');
    }

    if (Array.isArray(area.waves)) {
      body.appendParagraph('\n波: ' + area.waves.join(', '));
    } else {
      body.appendParagraph('波の情報がありません');
    }
  }

  // 予報、気温、過去の情報、平均気温、平均降水量を挿入

  const jsonImageListUrl = "https://www.jma.go.jp/bosai/weather_map/data/list.json"
  const jsonImageDataList = JSON.parse(UrlFetchApp.fetch(jsonImageListUrl).getContentText());



  // エラーチェック
  if (jsonImageDataList[1] && jsonImageDataList[1].timeSeries && jsonImageDataList[1].timeSeries[0] && jsonImageDataList[1].timeSeries[0].areas) {
    // 過去の情報を挿入するコード
  }

  for (const category in jsonImageDataList) {
    if (jsonImageDataList.hasOwnProperty(category)) {
      body.appendParagraph(category); // カテゴリ名を文書に挿入
      const images = jsonImageDataList[category]["now"];
      for (const imageUrl of images) {
        if (imageUrl) {
          const imageBlob = UrlFetchApp.fetch(`https://www.jma.go.jp/bosai/weather_map/data/png/${imageUrl}`).getBlob();
          body.appendImage(imageBlob); // 画像を文書に挿入
        }
      }
    }
  }
}
```

これをGoogleドキュメントのGASエディターに貼ってください。
とりあえず手動でで動かして動作確認してみてね。

### 出来上がり
で、GoogleドキュメントをGoogleサイトの挿入すればおしまい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167883/c5f2050a-90b5-2784-9430-5f7d571e4e25.png)

出てくる天気図の画像ファイルが多くて動作に時間がかかっちゃうのでそこは適宜調整してみてください。

とりあえずこんなことできるんだー。
って疑似スクレイピング体験のススメでした。

ドキュメントのGASも結構楽しいよ。
Herokuを使用してlaravelアプリケーションのデプロイ

### はじめに

個人開発メモ📝
課題提出のため、Herokuを使用してlaravelアプリケーションのデプロイ作業を行ったので備忘録として残します。

### Heroku

Herokuのサイト↓
https://dashboard.heroku.com/

・アカウント作成
・プロジェクト作成
・デプロイ作業
主にこれだけでした。

### デプロイ後、ハマったエラー

ブラウザからアクセスすると、５００エラーが出ており解決するため以下の記事を参考にさせていただきました。
https://qiita.com/mumucochimu/items/f233d6f6347747dde7f2

上記に変更したら、今度は
![スクリーンショット 2023-12-01 3.04.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513569/5973b0cb-a85f-6769-78eb-a3ff921dbcf6.png)
５００エラーのままですが、内容が出るようになりました。

:::note alert
エラーメッセージ
No application encryption key has been specified.
アプリケーションの暗号化キーが指定されていない。
:::

laravelではセッションやクッキーの暗号化に使用するため、アプリケーションにキーを設定が必須です。
すでに、.envファイルに設定していましたがheroku側に反映されていなかったため起こったエラーでした。

### herokuにAPP_KEYを反映させる方法

```
// アプリケーションのキーを生成するコマンド
php artisan key:generate
```

herokuのサイトでキーを登録する方法は、まずプロジェクトの上部にある設定画面に入ります。

![スクリーンショット 2023-12-01 3.21.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513569/81df1426-8460-7ddb-7e6f-126d93dde4f9.png)

![スクリーンショット 2023-12-01 3.22.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513569/f38c439c-8262-4785-6d5f-e711674a8595.png)

![スクリーンショット 2023-12-01 3.23.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513569/0d739763-09e7-421c-f04b-0b1557f12b2f.png)

KEYにAPP_KEY、VALUEに生成したキーを貼り付けます。

### キーの登録後

![スクリーンショット 2023-12-01 3.28.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513569/b0096a51-0bc0-e9dc-3f97-fc19df20943e.png)

無事、公開できました！
フロントエンドエンジニアは生成AIによって淘汰されるか？を居酒屋議論レベルで

# はじめに
タイトル通りですが、GPTやDALL·Eなどの生成AIによって、テキストや画像などの生成が可能なように、フロントエンド開発に必要なソースコードの生成が行える、GitHub Copilotようなツールの可能性を考えます。

SNSなどで、特にフロントエンドはなくなるだろうと考える人をちらほら見かけて、自分なりにちゃんとした意見を作ろうかと思いましたが、それだと続かなそうだったので、ハードルを下げて居酒屋で議論するような感覚で投稿します。

# 結論

**淘汰される(2) : 淘汰されない(8)**
くらいに考えています。AIのみの完璧な仕事はできないと思ってますが、想像を超える時代になるかもという可能性も感じる部分もあります。また、私(AIを少し理解してる平凡な学生)がそこまでAIを万能ツールだと感じてない点が大きく影響してます。

# ここでいうフロントエンドエンジニアが淘汰される条件
アイデアがソースコードレベルで完璧に実現され、可読性や保守性、エラーに対する処理など必要だと思われる開発目線での仕様や動作的な仕様が実現でき、厳格なテストを通過できるレベルのものが生成できる機能を持ち、なおかつ人間が直接関与しないで自動的に動作するシステム(生成AIなど)が世界のどこかに生まれること。

ファンタジーのように感じます。ですが、このくらいできないと完全に仕事を奪うことはないのではないかと考えています。

理由をいくつかの観点をそれぞれ独立させてまとめたいと思います。

- プロンプト生成、理解の難しさ
- AIに対して難易度の高いタスク
- どうやったら作れるのか
- 想像を超えるAI領域の可能性
- 情報漏洩リスク

# プロンプト生成、理解の難しさ
- 生成AIの説明でされる「できること」
- 実際にやりたいレベルの話

の二つにはギャップがあり、そこでプロンプトエンジニアリングなどの話になりますが、フロントエンド開発を生成AIに委託するとしたら、プロンプトは
「仕様設計」「UI、デザイン設計」
をAIが理解できる形で入力する必要があります。これらの設計というのは非常に複雑でAIが正しく認識できるかどうかのハードルがあります。しかし、言語化可能で視覚化可能な設計であればAIに入力することは可能です。ただ、大きなデータサイズのプロンプトを読み込んでモデルを動かすためには、多くの計算リソースが必要となるのでそこにもハードルがあると感じます。

# AIに対して難易度の高いタスク
例えば、
- バグを考慮した生成
- 熟練エンジニアのレビューを通過できるような設計
- 想定外への考慮
- 経験則的な設計の工夫（どこどこを共通化した方がいいことや、こうすると遷移した時にパフォーマンスが下がるとか）
- 最新技術を用いること

上から4つは、要は単純に使用の動作を満たすコードを出力するのでなく、実務レベルでの質を保つコードを生成できるのかという点になります。

「このツールに、このような入力を与えるとこのような出力が可能である」といったその生成AIでできるとの説明と、自分がやりたいレベルの生成にギャップがあるということです。「完璧な仕事」ができるレベルのコード生成には大きなハードルがあります。

# どうやったら作れるのか
生成されるコードの質をどのようにアプローチすると良いかを考えると、動的解析(実際に動作させて、osのシステムコールなどを解析して評価する)の結果に対して理想的に報酬を設定した強化学習とかで可能性ありそうかなと思いました。ですが途方もなく難しいアプローチだと思います。

# 想像を超えるAI領域の可能性
ここまでは、淘汰できるほどのものなんて作れるわけないしドラえもんの世界の話だよ！スタンスで意見してましたが、現実ははるかに進歩する可能性もあるかなと思います。

[このポスト](https://x.com/silviasetitech/status/1727313267952075116?s=20)のようにchatGPTやBardのTransformerだって、少し先の未来では下級呪文に成り下がっているかもです。だとしたらまた、考え方も変わりますしその可能性は低くないかもしれません。

# 情報漏洩リスク
生成AIが外部ツールだとしたら、情報漏洩リスクなどがあって、そもそもツールをフル活用できないから無理じゃないかということです。実際にそのような問題も発生しているし、保守的な考えを持つ企業では導入が進みにくいのは間違いないと思います。逆に個人レベルでそこまで大規模な影響のない開発だったらフル活用してもいいかもしれません。ですが、仕事をするうえではリスク管理は必須だと思います。

# 終わりに
私としては、フロントエンドエンジニアが淘汰されるレベルのモデルはちょっと想像できないです。ですが、企業単位でオリジナルの安全な生成ツールを開発することは可能だと思うので、そういった方法で開発力を向上させるのは有効だと思います。(ソースなし)
ずんだもんに学ぶブロックチェーン実践講座

# はじめに
本講座では、金融庁認定の暗号資産：**Symbol** ブロックチェーンを利用し、
**プログラム知識ゼロ**でブロックチェーンを学習、体験していただきます。

**ずんだもん**が1講座辺り5分ほどで、丁寧にシンプルに解説いたします。
修学後は、ブロックチェーンが**あなたの手の中**にあることと存じます。

是非、年末年始にかけて実施していただけますと幸いです。

# 準備するもの
・インターネット接続環境
・PC環境

# １．Symbolブロックチェーンとは？？
### ずんだもんが解説する。Symbolブロックチェーンの特徴。

https://twitter.com/i/status/1730272481615999136




# ２．Symbol Walletの作成
### ずんだもんが解説する。Symbol Walletの作成方法。

https://twitter.com/i/status/1701880765133545849

# ３．Symbol Walletの復旧方法
### ずんだもんが解説する。Symbol Walletの復旧方法。

https://twitter.com/i/status/1704405039941292169

# ４．ハーベスト設定方法
### ずんだもんが解説する。ハーベスト設定方法。

https://twitter.com/i/status/1708086354608033905

# ５．マルチシグ設定方法
### ずんだもんが解説する。マルチシグ設定方法。

https://twitter.com/i/status/1714192265441427932

# ６．はじめてのブロックチェーン実践講座
### ６－１． プログラム知識ゼロではじめるブロックチェーンツール作成
Symbolの特徴である、**誰にでも利用可能なブロックチェーン**を利用して、
初心者の方でも、XYMの送金ツールが作成可能となります。

https://qiita.com/nembear/items/7e17b143945eb8eb41f6

### ６－２． プログラム知識ゼロではじめるアグリゲートトランザクション送金
Symbolの標準機能であるアグリゲートトランザクションを誰でも利用可能となります。

https://qiita.com/nembear/items/c7f39f5060d2209f1bfb

# ７．さいごに
ブロックチェーンを説明するために、より伝わりやすく、よしとっつきやすくを考えてました。
そこで辿り着いたのは、文字として書き起こすことではなく、地声で解説するわけでもなく、
**ずんだもん**という愛されるキャラクターの力を借りることでした。

実際に、文字や地声で説明すると15分以上かかる説明が、5分程度でシンプルにまとまりました。
また、このようにキャラクターがしっかり説明するブロックチェーンは他にないと思います。
みなさんにはどう感じたでしょうか？？

Symbolには可能性に満ちています。実施してくださった皆さんも、「おや？これはいいのでは？」
と感じてくださったらば幸いです。是非、Symbolでのツールを作ったり、XYMを購入しハーベストしたり、ブロックチェーン楽しんでください。

今日からはじまる、Symbol/NEMアドベントカレンダー。本講座の基本知識をもとに楽しんでいただけますと幸いです。ご覧いただき、ありがとうございました。

![iravdZaa_400x400.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/b3ae49ea-4429-4fbb-8f01-d5e17e6d2868.png)
HTTP/3についてまとめるの巻

# はじめに
今回は**HTTP/3**の理解を深めるために、自分なりに調べてまとめていこうと思います。

# まずHTTPとは
HTTP(Hyper Text Transfer Protocol)の頭文字をとった通信プロトコルの1つです。
### 通信プロトコルって？？
通信プロトコルとは「通信するときに使うお約束事」です。
片方が日本語で話しかけたのに、もう一方が英語で返事してしまっては、コミュニケーションが成り立ちませんよね。コンピュータも一緒なんです。<br/>
![こんにちは.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288804/f26ba2fc-8360-8426-42cc-3fac880c3c2e.jpeg)<br />
なので通信するときは足並みを揃える必要があるため、通信プロトコルが存在するのです。
その中でもHTTPは、ホームページのファイルを受け渡しするためのお約束事となります。そんなHTTPにも問題点があるんですね。やり取りするときに、通信の内容が暗号化されないという点です。悪い人が途中で盗み見ると、やり取りしている内容がバレてしまいますね。
そこで「やり取りする内容を暗号化する、HTTPと似ているお約束事」が作られました。
それが「**HTTPS**」です。


# HTTP/3とは
本題です😆
HTTPの3つめのバージョンです。ひとつ前のバージョンであるHTTP/2 に比べて、より速くWebサイトを表示できるよう改良されています。

### 導入メリット
- 接続開始時の遅延が小さい
- **セキュアな通信**（第三者から見られても中身がわからない安全な通信、暗号化しておこなう通信）を実現
- **パケットロス時**（データを送受信したときに一部のパケットが欠けてしまうこと）の通信を効率化

## HTTP/3とHTTP/2の違いは？？
HTTP/3はHTTP/2の問題点を改善している！！
### HTTP/2の問題点
- **ハンドシェイク**（二台のコンピューターが通信をする際、利用する通信方式や各種の設定値を互いに交換したり調整したりすること）による通信の遅延
- **ヘッドオブラインブロッキング**（TCPパケットを連続で送信する際、一番先頭のパケットに何かしらのエラーが発生すると、先頭パケットの再送が完了するまで後続のパケットをブロックすること）の問題

### HTTP/3はそんな問題を改善しています！！
**HTTP/3**は**QUIC**（UDPを用いた通信プロトコル）+**TLS1.3**を活用して安全性を確保しながらデータのやり取りを行えます。
HTTP/2は**TCP**という通信プロトコルを用いていました。

### TCPとは？**TLS1.3とは？**

どちらも通信するときに使用する通信プロトコルというもの

`TCP`・・・送ったデータが相手に届いたかを都度確認しながら通信するやり方。**信頼性が高いが、転送速度は低い特徴がある**

`UDP`・・・送ったデータが相手に届いたか確認しないで通信するやり方。**転送速度は高いが信頼性が低いという特徴がある。**

`TLS1.3`・・・**TLSプロトコル**（Webで暗号化を実装する場合に最もよく使用されるプロトコル）の最新バージョン。以前の**安全性の低い暗号化機能のサポートを廃止**し、 **TLSハンドシェイクをスピードアップ**したほか改善を加えた。

#### QUICの利点

- 通信開始時の接続確立を高速化
- 複数の通信経路の利用により通信を効率化
- TLS1.3を活用した高セキュリティ
- コネクションIDによるモバイルクライアントの再接続ロスの低減
- ヘッドオブラインブロッキングの解消

### **HTTP/3を導入するべきサイト**

- 画像を多く掲載するECサイト
- 動画を多く取り扱うSNSサービス
- ノウハウなどを解説して集客を見込むWebメディア

# 終わりに
Webエンジニアを目指す上で、自分が制作しているものがどのようにユーザーに届けられているのかはしっかり理解しておきたいと思います。
なので、まだ浅くしか理解していない部分をしっかり勉強したいです。
美味しいちゅらデータ

これは、[ちゅらデータ Advent Calendar 2023 シリーズ２](https://qiita.com/advent-calendar/2023/churadata)二日目の記事です。

初めまして、nakakenです。今年の７月にちゅらデータにジョインしました。入社早々、ゴツいシステム開発をさせてもらえて、毎日楽しくお仕事しています。
初日の[CTOの記事](https://zenn.dev/churadata/articles/bf60dd15f05c19)でもわかる通り、社内ではslackが社員同士のコミュニケーションの場として使われています。[社員の９割がリモート](https://churadata.okinawa/blog/4-interview/)（2022/4時点）という状況ですが、slackのようなツールを使うと、仕事の話だけではなく、雑談なども活発に交わされていて、リモートで仕事をしていても会社との一体感が感じられます。

そんな雑談が活発に行われるのは、仕事でのチームの枠を超えて色んな人と交流ができるslackチャンネルがたくさんあるのが一因かもしれません。今自分が入っている社内チャンネルの中の一つが、料理に関するチャンネルです。私事ですが、平日はほぼ毎日料理をしています。メニューが被らないようにカレンダーにメモをしているのですが、そのカレンダーも５年目に突入しています。
![IMG_1643.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75307/9e15097f-d598-7b71-a1e7-31808b1dcbca.jpeg)
![IMG_1644.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75307/b2accf22-57e7-0db5-b470-94dac7c8be10.jpeg)
入社して少し慣れてきた頃にslackチャンネルを物色していると、料理をしている人達のチャンネルがあったので参加して、料理してます〜投稿をしてみました。そうしたら、早速反応がありました。それだけではなくって、過去ログを見る限りちょっとおやすみ気味だったチャンネルが、色んな人が今日はこんな料理を作ったよ〜と報告してくれるようになりました。それがまた美味しそうな見た目で、今度チャレンジしてみようと思わせてくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75307/23048111-5374-5919-9099-7a41696f2849.png)
こんなアットホームな雰囲気のある職場ですが、お仕事チャンネルでは専門知識を使った仕事の話もバンバン飛び交っています（社内の多くのプロジェクトが公開チャンネルで会話していて、それを見ることができるのも、ちゅらデータっぽいいいところだと思います）。

入社してもうすぐ半年くらい経つと思いますが、どんどん面白くなってきました。こんなちゅらデータに興味を持たれた人がいたら、ぜひお気軽にカジュアル面談など受けてみてくださいね。

ではでは ノシ
【G検定合格レポ】使用したテキストと勉強方法まとめ

# はじめに
2023 #4のG検定に合格したので、勉強方法をまとめました。
Qiita初投稿記事です。（Qiita　アドベントカレンダー　2023用）

# 想定読者
筆者は業務でAIを扱うことはなく、個人的に勉強している文系事務職です。
※AIの周辺知識の把握を目的としてG検定を勉強したため、技術寄りの話は少なめとなります。

よって、想定読者は下記に該当する方です。

* 業務でAIに触れた経験がなく一からG検定合格を目指している方
* 生成AI活用の基礎・周辺知識習得ためG検定合格を考えている方

# 得点率
勉強不足すぎて「ディープラーニングの手法」が極端に低いですね…。
> 
> ■合否結果
> 
> 【　合　格　】
> 
> 総受験者数　 3,309名
> 合格者数　　 2,390名
> 
> ■シラバス分野別得点率（小数点以下切り捨て）
１．人工知能とは. 人工知能をめぐる動向. 人工知能分野の問題：83%
２．機械学習の具体的手法：73%
３．ディープラーニングの概要：80%
４．ディープラーニングの手法：58%
５．ディープラーニングの社会実装に向けて：88%
６．数理・統計：83%
７．法律・倫理・社会問題：85%

# 使用したテキスト
* [深層学習教科書 ディープラーニング G検定（ジェネラリスト）公式テキスト](https://www.shoeisha.co.jp/book/detail/9784798157559 "G検定（ジェネラリスト）公式テキスト")
最初に読んだ公式テキスト。
序盤の歴史の話の語り口が面白いので、読み物としても良いと思います。
ただ、AIに触れたことがない人がこのテキストを細かく読み通すのは時間がかかるので、最初は広く浅く、概要をつかむ目的で使うのが良いかと思います。
* [これで完璧 ディープラーニングG検定(ジェネラリスト)最強の「合格」問題集](https://www.sbcr.jp/product/4815617769/ "最強の「合格」問題集")
いわゆる緑本。解説が親切で分かりやすいのでオススメです。
問題演習はほぼこちらの問題集だけを使用しました。

# 勉強方法

勉強期間：約10日程度（具体的な勉強時間は記録していませんでした）

応用情報技術者試験の午前を勉強した時と同じ、過去問演習中心のオーソドックスな方法を取りました。4択なのと、問題文の傾向が似ているので上手く合致したと思います。
個人的には、G検定以前に「応用情報技術者試験」「知的財産管理技能検定」を勉強していた基礎があり、法律関係に苦手意識がなかったのが短期合格につながったと思います。

## 前日までに行った勉強法　3STEP

1. **公式テキストをさらっと眺める**
まずは目次を眺めて、どういった項目があるのを参照します。本文を読む際は、深入りせずに広く浅くを心がけました。（息抜きに関連ニュースを読むのも面白いと思います。）
2. **過去問演習**
まずは、自力で解ける問題と解けない問題を仕分けします。
私の場合は、3段階で印をつけていました。
    * ○ 何も見ずに解けた
    * △ 解説を読んだら理解できる
    * × 解説を読んでも理解できない・何度も間違えてしまう
3. **公式テキストに戻って分野ごとの単語を見直す**
過去問演習で混同しがちな用語を、テキストに戻って復習します。一度過去問で出会っているので、初回にテキストを読んだ時よりも格段に読みやすくなるかと思います。

## 当日の3STEP
1. **チートシートの用意**
当日、試験直前にGoogle検索で「G検定　チートシート」で見つけた良さそうなチートシートを使用しました。試験のウィンドウと２窓にして、Ctrl＋Fで用語検索して使っていました。
通常は、自前のチートシートを用意するか、事前に目を通しておくのが主流のようです。
2. **チートシートにない単語の対策**
チートシートにない用語は、Google検索で用語検索→画像検索にすると、ブログのアイキャッチなどで用語の概要が掴めるのでそこから考えました。
3. **分からなかった・あやふやな問題に印をつけて後で見直す**
G検定のUIは親切なので、問題に印をつけて見直すことができます。あやふやだったり、落ち着いて考えたい問題は後回しにしていました。
一度解き終わったあとに一覧で表示して、解き直した問題は一つずつ印を消していって確認していきました。

# まとめ
200問あるので時間が足りなくなるかな、と思っていたのですが、分からない問題はざっと飛ばして解いたので、30分ほど見直しの時間が取れて良かったです。ただ、苦手な分野をそのままにしてしまったので、時間のある時に復習していきたいと思います。