OmniAICreator/Qiita-1.07M huggingface dataset:
Laravel:マイグレーションとシーディング

## マイグレーションとは
マイグレーションはデータベースのバージョン管理のようなもの。  
マイグレーションを使用してデータベースの変更を行うことにより、データベースの構造変更やデータの追加、変更、削除などの機能を持っており、PHPのスクリプトを使ってテーブルの作成処理などを用意している。

### マイグレーションの手順
1. **専用のスクリプトファイルの作成**
　コマンドを使いマイグレーションを記録するためのスクリプトファイルを作成する。
2. **スクリプトの記述**
　スクリプトファイルに、データベース管理の処理を記述する。
3. **マイグレーションの実行**
　マイグレーションを行う場合は、コマンドで実行する。コマンドにより、用意されたマイグレーション用のスクリプトファイルを実行してテーブルの生成や削除などが行える。

 ### マイグレーションファイルの生成
 マイグレーションファイル作成は以下のコマンドを実行する。

 `php artisan make:migration ファイル名`
 指定んほテーブルを作成するためのマイグレーションファイルが作られる。
 マイグレーションファイルは`database`フォルダに生成される。
 
- upメソッド
　 テーブルを生成するための記述をする。テーブル作成に関する必要最小限のコードが自動で用意されている。

 - downメソッド
　 テーブルを削除売るための処理を記述。 

この二つのメソッドが、テーブル操作の基本となる。これらはマイグレーションコマンドによっって自動的に呼び出される。
　　　

## シーディングについて
テーブルを用意しただけでは、レコードは全く用意されていない。
初期状態ではいくつかのダミーレコードを用意しておくと便利になる。
こうした機能を**シーディング**という。これは、最初から用意しておくレコード**シード**を作成する機能である。

### 手順

1. シーディングのためのスクリプトファイル（シーダー）を作成。
2. スクリプトファイルを編集しシードを追加。
3. コマンドでシーディング実行する。

### シーディング処理について
シーディング処理は、「Seeder」を継承したクラスとして定義する。「run」メソッドが用意され、そのメソッド内にレコードを作成するための処理を用意する。

#### シードを作成する
「run」メソッドの中にシードを作成する処理を用意。`DB::tanle->insert`を使って、レコードをいくつか作成している。

### シーダーファイルの登録
手順によりシーダーファイルは用意できるが、このままでは使えない。作成したファイルが実行されるように、`DatabasesSeeder`に登録しておく必要がある。
デフォルトでDatabaseSeeder.phpというファイルが用意されている。シーディングのコマンドで実行されるスクリプトとなる。このファイルの中に各テーブルのシーダーを呼び出す処理を書く。
```$this->call(シーダークラス::class)```
実行するシーダークラスのclassプロパティを引数にして「call」というメソッドを呼びだす。これはSeederクラスにあるメソッドで、これにより指定したクラスにrunメソッドが呼び出され、シーディング処理が実行されるようになている。

### シーディングを実行
```php artisan db:seed```コマンドを実行。これでrunが呼び出されて実行するされている。

シーディングが完了したら、テーブルとレコードが用意できているかを確認。
```php artisan serve```コマンドでサーバーを起動しアクセスする。


以上がマイグレーションとシーディングの流れとなる。
参考文献）PHPフレームワーク　Laravel入門 第2版 掌田 津耶乃
Vue/Nuxtの理解度を測るための設問

# Vue/Nuxt理解度設問

Vue/Nuxtの理解度を測るための設問を5つ用意しました。
また、それらの設問の模範解答も記載しています。

## 設問

### [設問1]基本的なVue.jsの概念
Vue.jsでコンポーネントのライフサイクルを説明してください。特に、`created`, `mounted`, `updated`, `destroyed`の各ライフサイクルフックの役割について詳しく教えてください。

### [設問2]リアクティブなデータ処理
Vue.jsでは、データプロパティが変更されると自動的にビューが更新されます。
このリアクティビティシステムの背後にある仕組みについて説明してください。

### [設問3]Nuxt.jsの利点と付加価値
Nuxt.jsを使う利点として、何を挙げることができますか？
また、Nuxt.jsを使うことでVue.jsプロジェクトにどのような付加価値がもたらされるのでしょうか？

### [設問4]サーバーサイドレンダリング (SSR)の利点
Nuxt.jsはサーバーサイドレンダリングをサポートしていますが、これが通常のクライアントサイドレンダリングとどう異なるのか、そしてどのような場面でSSRが有効なのかを説明してください。

### [設問5]Vuexの使用
VuexはVue.jsのアプリケーションで状態管理を行うためのライブラリです。Vuexの主要な概念（ステート、ゲッター、ミューテーション、アクション）について説明し、なぜVuexが大規模なVueアプリケーションで重要なのかを述べてください。

## 模範回答

### [模範回答1]基本的なVue.jsの概念

<details><div>

* `created`: このフックは、インスタンスが作成され、リアクティブなデータとイベントが設定された後に呼ばれますが、DOMへのマウントやレンダリングはまだ行われていません。
* `mounted`: このフックは、VueインスタンスがDOMにマウントされた後に呼ばれます。テンプレートやレンダリングされたDOMにアクセスする必要がある場合は、このフックを使用します。
* `updated`: このフックは、データが変更され、DOMが再レンダリングされた後に呼ばれます。しかし、子コンポーネントが再レンダリングされた後では呼ばれません。
* `destroyed`: このフックは、Vueインスタンスが破棄される直前に呼ばれます。イベントリスナーの削除やリアクティブなサブスクリプションの停止などのクリーンアップ操作を行います。

</div></details>

### [模範回答2]リアクティブなデータ処理

<details><div>

Vue.jsのリアクティビティシステムは、オブザーバーパターンに基づいています。
データオブジェクトの各プロパティは、ゲッターとセッターを使って変換されます。
これにより、プロパティの読み取りや変更が行われるたびに、Vueはこれを追跡し、変更があった場合に関連するコンポーネントを再レンダリングします。

</div></details>

### [模範回答3]Nuxt.jsの利点と付加価値

<details><div>

* Nuxt.jsは、Vue.jsアプリケーションの開発を簡素化し、構造化されたフォルダ構造、ルーティングの自動生成、サーバーサイドレンダリングなどを提供します。
* Nuxt.jsを使用することで、SEOの向上、初期ロード時間の短縮、より良いユーザーエクスペリエンスが可能になります。また、ビルトインのVue Metaでメタタグの管理が簡単になります。

</div></details>

### [模範回答4]サーバーサイドレンダリング (SSR)の利点

<details><div>

* SSRでは、ページのコンテンツはサーバー上でレンダリングされ、完全なHTMLがクライアントに送信されます。これにより、検索エンジンのクローラーがコンテンツをより効果的にインデックス化でき、SEOが向上します。
* SSRは、初期ページロードのパフォーマンスを向上させ、特に低速な接続でのユーザーエクスペリエンスを改善します。

</div></details>

### [模範回答5]Vuexの使用

<details><div>

* ステート: アプリケーションの状態（データ）を保持します。
* ゲッター: ステートから派生した値を計算するために使用されます。
* ミューテーション: ステートを同期的に変更するためのメソッドです。
* アクション: 非同期操作を行い、その結果に基づいてミューテーションをコミットします。

Vuexは、大規模なVueアプリケーションにおいて、状態管理を一元化し、コンポーネント間でのデータの流れを管理しやすくするために重要です。これにより、アプリケーションの構造がより予測可能で保守しやすくなります。

</div></details>
Pythonのおみくじサンプルコードを応用したデートプラン作成プログラム（簡易版）

# はじめに

　デートで行きたい場所・やりたいことがありすぎて困ったことはありませんか？　
　いっそ、誰かが決めてくれたら楽なのにな、と思いませんか？

　『Python1年生』でランダム関数を利用した「おみくじ」のサンプルコードがあったので、それを応用して代わりに意思決定してもらえないかなと思い、この記事を書きました。

https://www.shoeisha.co.jp/book/detail/9784798170381

# Pythonのおみくじサンプルコードを応用したデートプラン作成アプリ

## 1. デートプラン例をChatGPTに出してもらう

　デートプランの案なんて手持ちでそんなにないので、ChatGPTに出してもらいました。

<details><summary>リスト（50件あって長いので折りたたみ）</summary>

1. 地元の美術館や博物館の訪問
2. 近くの公園でのピクニック
3. カフェでのコーヒーデート
4. 星空観察
5. ハイキングや自然散策
6. 地元の動物園や水族館への訪問
7. ビーチでの日帰り旅行
8. ワインテイスティングツアー
9. カラオケナイト
10. 料理教室への参加
11. 映画館での映画鑑賞
12. ローカルマーケットやフリーマーケットの散策
13. ボードゲームカフェでの一日
14. スポーツイベントの観戦
15. ボートでの川下り
16. ロマンチックなレストランでのディナー
17. バルーンフェスティバルや他のローカルイベントへの参加
18. スパや温泉でのリラックス
19. ロープコースやアドベンチャーパークでのアクティビティ
20. アイススケートやローラースケート
21. コンサートやライブミュージックの鑑賞
22. ロマンチックなクルーズ
23. 自転車での町中散策
24. ヨガクラスへの参加
25. ブックカフェでの読書デート
26. パズルやエスケープルームのチャレンジ
27. 地元のコメディクラブでのショー
28. テーマパークや遊園地への訪問
29. ジャズバーでの夜
30. アートギャラリー巡り
31. アイスクリームやデザートカフェ巡り
32. 近くの湖でのカヌーかカヤック
33. 日帰りで近隣の街への小旅行
34. ボウリングやビリヤード
35. 屋内または屋外のクライミング
36. ブルワリーまたは蒸留所ツアー
37. ビーチバレーや他のビーチアクティビティ
38. レトロなゲームセンターでのアーケードゲーム
39. 地元の歴史的名所の探訪
40. DIY工房やアートワークショップ
41. スタンドアップパドルボーディング
42. ファーマーズマーケットや地元の食材市場の散策
43. ポットラックディナー（互いに料理を作って持ち寄る）
44. 釣りや釣り堀
45. ダンスクラスや社交ダンスのイベント
46. バードウォッチングや自然観察
47. アンティークショップや古本屋の巡り
48. 地元の花火大会や祭り
49. 家での映画マラソンナイト
50. 星座観察や天文台の訪問

</details>

## 2. コードを書く

:::note warn
50案作ってもらいましたが早速上手いコードが思いつかなかったのでとりあえず10案でコード作成しました。
テーブルデータからインポートするやり方があった気がするので、学習次第作ってみたいと思います。
:::

### デートプランと食事案を出す

~~~Python
import random

# プラン案
date_Plan = ('地元の美術館や博物館の訪問', '近くの公園でのピクニック', 'カフェでのコーヒーデート', '星空観察', 'ハイキングや自然散策', '地元の動物園や水族館への訪問', 'ビーチでの日帰り旅行', 'ワインテイスティングツアー', 'カラオケナイト', '料理教室への参加')

# 食事案
dinner_Plan = ('和食', 'イタリアン', '中華', 'スペイン料理', 'インド料理', '前から行きたがっていたあの店', 'デート終わりに最初に目についたお店')

# 乱数の生成
randint = random.randrange(0, len(date_Plan))
randint2 = random.randrange(0, len(dinner_Plan))

# 出力
date_Plan = date_Plan[randint]
dinner_Plan = dinner_Plan[randint2]

# 入力
print(f"今日のオススメデートは「{date_Plan}」です。\n夕食は、{dinner_Plan}にしましょう！")

~~~

### 出力イメージ

#### パターン1
今日のオススメデートは「ハイキングや自然散策」です。
夕食は、インド料理にしましょう！

#### パターン2
今日のオススメデートは「近くの公園でのピクニック」です。
夕食は、スペイン料理にしましょう！

#### パターン3
今日のオススメデートは「ビーチでの日帰り旅行」です。
夕食は、中華にしましょう！

# まとめ

　これをデート前に使えば喧嘩がなくなること間違いなし！（理解のある相手がいる場合に限る）

 input()で変数に変化を加えたり、表示された情報から、実際の情報を検索できるようになると面白いのかな〜と思います。Pythonが分かってきたらもう一回作り直したいです。

# 参考サイト

f文字列はとても便利ですね。理解があやふやだったのでこちらのサイトを参照しました。

https://note.nkmk.me/python-f-strings/
Python(folium)でコンビニをプロットしよう!!

## 最初に
今回はfoliumライブラリを用いて、北陸の石川県・富山県・福井県＋長野県のコンビニを地図にプロットしたいと思います。
#### ライブラリとデータの読み込み
```python
import pandas as pd
import folium

df = pd.read_csv('convenience_store.csv')
df.dtypes
#出力
#店名          object
#fX         float64　    (経度)
#fY         float64　　　　　　　　　　（緯度）
#店の種類   object
```
#### 黒点でコンビニをプロット
```python
folium_map = folium.Map(location=[36.06528, 136.22194], zoom_start=10)
for i in range(len(df)):
    folium.CircleMarker(location=[df.iloc[i]['fY'], df.iloc[i]['fX']], radius=1, color='black').add_to(folium_map)
folium_map
```
![スクリーンショット 2023-12-23 20.58.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536819/81d17d2b-54ad-27ce-85df-0bb7c802ac45.png)
#### セブンイレブンは赤、ファミリーマートは緑、ローソンは青、ヤマザキとYショップは黄、それ以外は黒でプロットする
```python
folium_map = folium.Map(location=[36.06528, 136.22194], zoom_start=10)

for i in range(len(df)):
    if 'セブンイレブン' in df.iloc[i]['店の種類']:
        color = 'red'
        radius = 1
    elif 'ファミリーマート' in df.iloc[i]['店の種類']:
        color = 'green'
        radius = 1
    elif 'ローソン' in df.iloc[i]['店の種類']:
        color = 'blue'
        radius = 1
    elif 'ヤマザキ' in df.iloc[i]['店の種類'] or 'Yショップ' in df.iloc[i]['店の種類']:
        color = 'yellow'
        radius = 1
    else:
        color = 'black'
        radius = 0.5

    folium.CircleMarker(location=[df.iloc[i]['fY'], df.iloc[i]['fX']], radius=radius, color=color).add_to(folium_map)

folium_map
```
![スクリーンショット 2023-12-23 21.08.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536819/74d0f884-bc11-6c09-f400-ef6b64e68c86.png)
長野県はセブンイレブンが多い傾向がある。
Copilotを使っていい回答が得られるように検証してみた。

　今回は、複数のプロンプトエンジニアリングを使って「稼げる副業」を検索してみた。
 今回使う生成AIはCopilotとChat-GPT3.5の２つである。

 使う質問は、「フルタイムで働きながらできる副業をいくつか挙げてほしい。」という直接的なもの。もうひとつは、副業の定義を「１，平日19時以降・土日休日でできるもの　２，月５～１０万円でも大丈夫　３，資格も不要」の仕事として質問を構築した。

 # 「フルタイムで働きながらできる副業をいくつか挙げてほしい。」という質問の検証

 まず、Chat-GPT3.5の結果
 ```Chat-GPT3.5
 フルタイムの仕事と両立できる副業はいくつかあります。以下はそのいくつかの例です：

フリーランスの仕事: ウェブ開発、デザイン、ライティング、翻訳、音楽制作などのスキルを活かしてフリーランスで仕事を受注することができます。フリーランスプラットフォームや専門のウェブサイトを利用して案件を探すことができます。

オンライン講師: 言語、学科、楽器、プログラミングなどのスキルを持っている場合、オンラインで講師をすることができます。多くのプラットフォームがあり、柔軟な時間で教えることができます。

アフィリエイトマーケティング: ブログ、YouTubeチャンネル、SNSなどで特定の製品やサービスを紹介し、そのリンクを使って商品が売れると報酬を得る方法です。長期的な投資が必要ですが、自分のペースで取り組むことができます。

ストックフォトグラフィー: 写真を撮るのが好きなら、写真をストックフォトサイトにアップロードして販売することができます。売れた際に収益を得られます。

オンラインショップの運営: 手作りの商品、アート作品、クラフト品などを販売するオンラインショップを開設することもできます。プラットフォームを使うか、自分のウェブサイトを構築して販売することが可能です。

これらは、趣味やスキルに応じて取り組むことができる副業の例です。しかし、副業を始める前に、自分の時間や能力、法的な制約をよく考えることが大切です。
```

Copilotの結果はこちらである。
```Copilot
こんにちは、こちらはBingです。副業についてお探しですね。😊

フルタイムで働きながらできる副業は、さまざまな種類があります。自分のスキルや興味に合わせて、適切な副業を選ぶことが大切です。

例えば、以下のような副業があります。

1,テープ起こし（文字起こし）の仕事をする。速く正確にタイピングができる人に向いています。

2,ブログで発信する。自分の知識や経経験をオンラインで発信し、広告やアフィリエイトの収入を得ることができます。

3,Webデザインサービスを提供する。グラフィックデザインやコーディングができる人に向いています。

4,YouTubeチャンネルを作成する。自分の趣味やテーマについて動画を作成し、アップロードし、広告収入やファンからの支援を得ることができます。

5,オンラインで日本語（または他の言語）を教える。外国語の教師としてオンラインン講師として働くことができます。

6,中古品を販売する。家にある使わないものや必要ないものをリサイクルショップやフリマアプリで売ることができます。

7,ホームステージングをする。不動産業者のために家の室内演出をすることができます。

8,ペットシッターになる。。飼い主からペットの世話を依頼されたり、ペットシッターとして働いたりすることができます。

9,フードデリバリーのドライバーになる。自自転転車やバイク、、車などで食品配達サービスに参加することができます。

10,買い物や用事の代行を引き受ける。ネット上で買い物代行サービスに登録し、空き時間に買い物代行を依頼されたり、提供したりすることができます。

これらは一例ですが、他にも多くの副業はあります。詳しくは2や3などの記事も参考にしてみてください。

副業は本業以外でもお金稼ぎに役立つ方法ですが、注意点もあります。例えば、

副業は本業以外でも行う場合は、本業会社へ事前申告する必要がある場合もあります2345
副業は本業以外でも行う場合は、本業会社から許可された範囲内で行う必要があります234
副業は本業以外でも行う場合は、時間管理や健康管理に気を付ける必要があります235
副業を選ぶ際は、自分のの状況や目的に合わせてて慎重に判断しましょう。

以上、Bingからお伝えしました。ご参考になれば幸いです😊
```

# 「以下の条件の仕事があれば教えてください。１，平日19時以降・土日休日でできるもの　２，月５～１０万円でも大丈夫　３，資格も不要」の場合

Chat-GPT3.5の場合

```Chat-GPT3.5
条件に合致する副業のいくつかを挙げますね。

オンラインアンケートの回答者: 数多くのウェブサイトが、アンケート回答に対して報酬を提供しています。自宅にいる時間を利用して、アンケートに回答することで収入を得ることができます。資格不要で、時間の制約もなく柔軟です。

ブログやSNSのアフィリエイト: 自分のブログやSNSで広告を掲載し、その広告からの収益を得ることができます。資格は必要ありませんし、時間を選ばずに取り組めます。

オンラインマーケットプレイスでの販売: 手作りの商品やリサイクル品などをオンラインマーケットプレイスで販売することもできます。販売者登録を行えば、自分のペースで販売活動を進められます。

ライティングや編集のフリーランス: 文章を書くのが得意なら、オンラインでフリーランスライターやエディターとして仕事を受けることができます。様々な分野で需要があり、時間の制約が少ない場合もあります。

これらの仕事は、特に時間を選ばずにできるものであり、資格も不要なので、条件に合った副業の一部です。ただし、報酬には個人の努力や投入する時間に応じて差が出ることを覚えておいてください。
```

Copilotの場合

```Copilot
あなたの条件に合う仕事を探すために、いくつかの情報を見つけました。

ITエンジニア: IT関連の情報技術、システム開発を担う仕事で、土日休みが多い職業に該当します。また、在宅勤務も可能な場合が多いです2。

経理: 平日のみ営業する金融機関とのやりとりが伴うため、銀行などが閉まっている土日は、出勤することがほとんどありません。

人事: 管理系の職種で、土日休みの企業が多い傾向にあります。

Webデザイナー: IT業界の一部で、在宅勤務やフレックスタイム制度を導入している企業も多いです。

データ入力・タイピング: コンピュータを使ってデータを入力する仕事で、在宅勤務が可能な場合もあります。

コールセンター テレフォンオペレーター (テレオペ): 顧客からの問い合わせに電話で対応する仕事で、シフト制であることが多く、夜間や週末の勤務が可能です。

これらの仕事は、資格が不要で、平日の夜間や週末に働ける可能性があります。ただし、具体的な勤務時間や給与は、求人情報や企業により異なるため、詳細は各企業の求人情報でご確認ください312。また、仕事を探す際には、転職エージェントを利用すると、あなたの希望に合った仕事を見つけやすいです1。
```

# 結論

　だいぶ違った返答が来ていて驚いています。やはり、生成AIも新しい情報がある場合とない場合とでは精度はだいぶ異なるのかなと思っております。
【Databricks】コンピュートポリシーを作成してみた

# 背景・目的
[【Databricks】クラスターについて整理してみた](https://qiita.com/zumax/items/4fbcce9886fa843bb3ab)に書いた、コンピュートポリシーについて確認してみます。

# まとめ
コンピュートポリシーは、ポリシールールに基づいてユーザーまたはグループのコンピュート作成アクセス許可を制限するために使用できるツールです。

# 概要
[コンピュートポリシーの作成と管理](https://docs.databricks.com/ja/administration-guide/clusters/policies.html)を元に整理します。

## コンピュート ポリシーとは何ですか?
[こちら](https://qiita.com/zumax/items/4fbcce9886fa843bb3ab#%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%83%88-%E3%83%9D%E3%83%AA%E3%82%B7%E3%83%BC%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B)で整理したので割愛します。

## コンピュート・ポリシー・リファレンス
[コンピュート・ポリシー・リファレンス](https://docs.databricks.com/ja/administration-guide/clusters/policy-definition.html)を元に整理します。

### サポートされている属性
> ポリシーは、 クラスター API で制御されるすべての属性をサポートします。 属性に設定できる制限の種類は、属性の種類と UI 要素との関係に基づいて、設定ごとに異なる場合があります。 ポリシーを使用してコンピュートのアクセス許可を定義することはできません。
> また、ポリシーを使用して、時間あたりの最大 DBU 数とクラスターの種類を設定することもできます。 仮想属性のパスを参照してください。

気になった属性を載せておきます。

| 属性 |説明|
|:--|:--|
|autoscale.max_workers | 最大ワーカー数 |
|autoscale.min_workers | 最小ワーカー数 |
|autotermination_minutes | 0は、自動終了がないことを表している |
|aws_attributes.availability | SPOT、 ON_DEMAND、または SPOT_WITH_FALLBACK |
|aws_attributes.ebs_volume_count| EBSボリューム数|
|aws_attributes.ebs_volume_size | EBSボリュームサイズ（GiB）|
|aws_attributes.ebs_volume_type| EBSボリュームタイプ |
|aws_attributes.first_on_demand|オンデマンドインスタンスに配置するノードの数|
|spark_version|Spark イメージのバージョン名|



# 実践
## ポリシーを作成する
1. Databricksにログインし、ナビゲーションペインの「Compute」をクリックします。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ec34b4f6-a81c-3888-a34b-50a3ab548786.png" width=200>

1. ①「Policies」タブを選択し、②「Create policy」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/928162be-f2a3-6e29-d6a6-a31b65b80c87.png)

1. 下記を入力します。
    - Name:任意の名前を指定します。
    - Family: Shared Computeを選択します。選択するとDefinitionsにテンプレートとして、自動で入ります。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/d9737701-f498-746b-fc73-bacb133c9e37.png" width=300 />

1. ①「Permissions」タブをクリックし、下記を入力し②「Add」をクリックします。
    - Max Compute resources per user: 任意の数
    - Name:Admins or ALl Users
    - Can Use:デフォルト
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/f80dbeb8-0670-eb06-beb3-991f6f2378a0.png" width=500>

1. 最後に「Create」をクリックします。
1. 追加されました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/bc045069-6f81-cd14-9c74-badd9c37874f.png)

## ポリシーへのライブラリの追加
1. ポリシーを選択します。
1. 「Edit」をクリックします。
1. ①「Libraries」タブを選択し、②「Add library」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/c2f69a16-3afa-3c89-101b-6a05bab7ea5b.png)

1. Library Sourceを選択し、Library Typeを選択し「Add」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/aa8155d4-f2ab-d4fc-2a5a-85e9b1153ab6.png)


# 考察
今回、コンピュートポリシーを作成してみました。次回は、これをクラスタにアタッチして使ってみます。

# 参考
https://docs.databricks.com/ja/administration-guide/clusters/policies.html#add-libraries-to-a-policy
PostgreSQL  チートシート

## はじめに
最近PostgreSQLを使い始めたのでコマンドを軽くまとめておきます。

## 一般

| コマンド | 説明 |
|---------|------|
| \copyright | PostgreSQL の使い方と配布条件を表示 |
| \crosstabview [列数] | 問い合わせを実行し、結果をクロスタブに表示 |
| \errverbose | 最後に発生したエラーメッセージを冗長性最大で表示 |
| \g [ファイル] または ; | 問い合わせを実行（し、結果をファイルまたは |パイプ へ出力） |
| \gdesc | 問い合わせを実行せずに結果の説明を行う |
| \gexec | 問い合わせを実行し、結果の中の個々の値を実行 |
| \gset [PREFIX] | 問い合わせを実行して結果を psql 変数に格納 |
| \gx [ファイル名] | \g と同じですが、拡張出力モードで実行 |
| \q | psql を終了 |
| \watch [秒数] | 指定した秒数ごとに問い合わせを実行 |

##  問い合わせバッファ

| コマンド | 説明 |
|---------|------|
| \e [ファイル] [行番号] | 現在の問い合わせバッファ（やファイル）を外部エディタで編集 |
| \ef [関数名 [行番号]] | 関数定義を外部エディタで編集 |
| \ef [ビュー名 [行番号]] | ビュー定義を外部エディタで編集 |
| \p | 問い合わせバッファの中身を表示 |
| \r | 問い合わせバッファをリセット（クリア） |
| \w ファイル | 問い合わせの中身をファイルに保存 |


## 接続関連

| コマンド | 説明 |
|---------|------|
| \c[onnect] {[DB名|- ユーザ名|- ホスト名|- ポート番号|-] \| 接続文字列} | 新しいデータベースに接続（現在: "postgres"） |
| \conninfo | 現在の接続に関する情報を表示 |
| \encoding [エンコーディング] | クライアントのエンコーディングを表示または設定 |
| \password [ユーザ名] | ユーザのパスワードを安全に変更 |

## 入出力

| コマンド | 説明 |
|---------|------|
| \copy ... | クライアントホストに対し、データストリームを使って SQL コピーを行う |
| \echo [文字列] | 文字列を標準出力に書き出す |
| \i ファイル | ファイルからコマンドを読み込んで実行 |
| \ir ファイル | \i と同じ。ただし現在のスクリプト位置からの相対パスで指定 |
| \o [ファイル] | 問い合わせ結果をすべてファイルまたは |パイプ へ送る |
| \qecho [文字列] | 文字列を問い合わせ出力ストリームに出力（\o を参照） |


## オペレーティングシステム

| コマンド | 説明 |
|---------|------|
| \cd [DIR] | カレントディレクトリを変更 |
| \setenv 名前 [値] | 環境変数を設定または解除 |
| \timing [on|off] | コマンドのタイミングを切り替え（現在: オフ） |
| \! [コマンド] | シェルでコマンドを実行、または対話型シェルを起動 |

## 変数

| コマンド | 説明 |
|---------|------|
| \prompt [テキスト] 変数名 | ユーザに対して内部変数のセットを促す |
| \set [変数名 [値]] | 内部変数の値を設定。引数がない場合は一覧表示 |
| \unset 変数名 | 内部変数を削除 |

## ヘルプ
| コマンド | 説明 |
|---------|------|
| \? [コマンド] | バックスラッシュコマンドのヘルプを表示 |
| \? オプション | psql のコマンドライン・オプションのヘルプを表示 |
| \? 変数名 | 特殊変数のヘルプを表示 |
| \h [名前] | SQL コマンドの文法ヘルプの表示。* で全コマンドを表示 |
Memorystore for Redis Clusterを導入してみる

## はじめに
本記事は「QualiArts Advent Callender 2023」の23日目の記事になります。

23新卒のバックエンドエンジニアの苅谷です。
大学・大学院では機械学習を専攻し、入社後、モバイルゲームのバックエンドエンジニアとして働いています。

今回は、先日Google CloudからGAされたMemorystore for Redis Clusterを導入するために行なったことについて紹介していきたいと思います。

## Redis Clusterとは
ここでRedis Clusterについて簡単に説明する。
詳しく学びたい方は、こちらの公式から提供された動画でわかりやすくまとめられているので、学びやすいです。

https://www.youtube.com/watch?v=3WOfXRjYnGA

Redis Clusterとは、最低6台(ノード)のRedis Instanceから構築することができる。
3台のマスターノードと3台のリードレプリカから構成され、1つのマスターノードと1つのリードレプリカで1シャードとなる。

Redis Clusterの主な特徴としては次の2点が挙げられます。
- キーの自動分散
    - キーごとに決定論的なハッシュ関数を使用して、どのシャードにキーを配置するのかを自動で決定されます。
- 自動フェイルオーバー
    - どれかのマスターノードで障害が発生し、アクセスできない状態になった時に、そのノードのリードレプリカが自動でマスターノードに昇格します。
    - 各ノードは他のノードと常に通信しており、どのノードで障害が発生しているのかを常に把握し自動でフェイルオーバー後の通信が勝手決まるので、つなげているアプリケーションで再接続などを行う必要がありません。

上記の二つの特徴があるため、お手軽に負荷分散と高可用性を実現できます。

しかし、シャードをスケールさせようとする時は、少し手間がかかります。
- キーの再配置
  - シャードを増やすと、キーをどのシャードに配置させるかを計算するハッシュ関数が、新たなシャードも配慮に入れて計算するため、同じキーでも、スケールする前と後では違うシャードに配置される可能性が高いです。そのため、スケーリングした時に、すでに配置されたキーを新たに配置しなおす必要があります。
- Clusterの再起動
  - シャードを減らす時に、一つのシャードにあるマスターノードとリードレプリカをそのままシャットダウンすると、Redis Clusterにアクセスした時に、`CLUSTER DOWN`と受信されてしまいます（たとえ取得しようしたキーが削除されたシャードに配置されていなくても）。

## Memorystore for Redis Clusterの強み
Mmeorystoreが提供しているRedis Clusterの一番大きな特徴は、**シャードのスケーリングをフルマネージメントかつダウンタイムなし**で行うことができるところにあると思います。

上記のネイティブなRedis Clusterで抱えた問題点記の一つ目である「キーの再配置」を全自動で行われます。二つ目である「Redis Clusterの再起動」はDiscovery Endpointにアプリケーションで使っているRedisクライアントライブラリーを接続させると、シャードがスケールした時に、新しいシャード数をクライアントに伝えるために、再起動・再接続をする必要がないです。

## Redis Clusterに移行するための労力
まずGoogle ConsoleまたはコマンドラインツールでRedis Clusterを作成します。
オプションが少ないため、それなりに簡単に作れます。
```
gcloud redis clusters create 
    --replica-count=1 
    --region=us-central1 
    --project=...
    --network=...
    --shard-count=10
```

RedisClusterを作成した後に、Discovery Endpointが発行されるので、それをアプリケーションのRedisクライアントライブラリーに繋げる。
```go
c := redis.NewClusterClient(&redis.ClusterOptions{
    Addrs: []string{DISCOVERY_ENDPOINT},
})
```
## Redis Clusterに移行するための注意点

## SLA
Memorystore for Redis Clusterは非常に高価なサービスで、できるだけ小さい構成で構築する需要があります。
リードレプリカなしで、3シャードが最小の構成となりますが、これだけでもそれなりに負荷分散・フルマネージドスケーリングの恩恵を受けることができます。
しかし、リードレプリカなし構成は、SLAが保証されていないため、実際のサービスで導入するときは必ずリードレプリカを1以上にすることが推奨されています。

https://cloud.google.com/memorystore/docs/cluster/operational-guidelines

### ReadWriteモード・ReadOnlyモード
ClusterモードでRedisを構築した時に、マスターノードにある情報をリードレプリカにコピーが行われますが、一定のレプリ遅延が発生する。つまり、リードレプリカからデータを読み出すときに、データが最新では可能性があります。
Redisクライアントでは通常、ReadとWriteを両方マスターノードに対して行われます（ReadWriteモード）。リードの負荷分散を行うために、リードレプリカからデータを読み出す（ReadOnlyモード）場合は次のようにクライアントを設定する必要がある。
```go
r := redis.NewClusterClient(&redis.ClusterOptions{
    Addrs:         []string{DISCOVERY_ENDPOINT},
    ReadOnly:      true,
    RouteRandomly: true,
})
```
ReadOnlyモードを使って負荷分散する時は、必ずレプリ遅延を許容できるかどうかを考えて移行する必要がある。

## おわりに
今回はネイティブのRedisClusterと、GCloudが提供しているMemorystore for Redis Clusterを違いを解説し、プロダクトに導入する場合の注意点などについて触れました。お力になれると嬉しいです！
ORANGE pico で WS2812B (フルカラーLED) をなんちゃって制御する

[ORANGE pico](http://www.picosoft.co.jp/orange/) には、[IchigoJam](https://ichigojam.net/) と異なり、WS2812B (フルカラーLED) の色を設定する信号を送る機能は無い。
しかし、PWM機能を使えば、幅広い周期とデューティー比の信号を送ることができる。
今回は、この機能を用い、ORANGE pico と WS2812B でLチカを行う。

※IchigoJamはjig.jpの登録商標です。

# IchigoJam が送出する制御信号の観察

きちんと WS2812B のデータシートを参照して送信する信号の仕様を決めてもいいが、面倒なので今回は IchigoJam が送出する制御信号をパクることにした。
IchigoJam (1.4.3) で以下のプログラムを実行し、LED端子に出力される信号を[ロジックアナライザ](https://www.switch-science.com/products/7642)で観察した。

```
10 LET[0],0,0,0,#FF,#FF,#FF
20 WS.LED 2
```

すると、以下の信号が得られた。

![IchigoJam による制御信号](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/4fc5bf19-eebf-c386-0b3b-e84ccc43cd10.png)

今回は、まず全消灯を表す信号を送り、次に全点灯を表す信号を送っている。

## 全消灯を表す信号

全消灯を表す信号の長さは、35.5μsである。

![全消灯を表す信号](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/321e680c-d0f0-78d9-ecbd-59430530b88d.png)

全消灯を表す信号の1周期の長さは 1458.3ns、周波数は685714Hzである。

![全消灯を表す信号 1周期](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/5d0f9c22-d5cb-daf1-24a6-161eec27d067.png)

全消灯を表す信号の1周期のうちHIGHの長さは416.7ns、デューティー比は 28.57% である。

![全消灯を表す信号 HIGHの部分](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/07f04c51-1280-f933-ed24-f8ff52466ce5.png)

## 全点灯を表す信号

全点灯を表す信号の長さは、34.9μsである。
(最後の「0」の部分を数えていないので、これは正確ではない。全消灯を表す信号と同じ35.5μs程度だろう)

![全点灯を表す信号](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/7e8fd97d-488e-51dd-748f-82f24779d533.png)

全点灯を表す信号の1周期の長さは 1458.3ns、周波数は685714Hzである。

![全点灯を表す信号 1周期](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/422a026f-f56e-4a4e-3d11-f0f5a11877a0.png)

全点灯を表す信号の1周期のうちHIGHの長さは1000.0ns、デューティー比は 68.57% である。

![全点灯を表す信号 HIGHの部分](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/f8767107-23d3-c597-5555-78ee3dbf688f.png)

## まとめ

全点灯・全消灯のためのPWMのパラメータは、以下のように設定すればよいことがわかった。
LED 1個分の信号の長さは35.5μsなので、1ms間信号を送信するとLED約28個分になることがわかる。

|制御|周波数 [Hz]|デューティー比 [%]|
|:-:|:-:|:-:|
|全消灯|685714|28.57|
|全点灯|685714|68.57|

# ORANGE pico による WS2812B の制御

WS2812B を制御するには、制御対象の WS2812B が無ければならない。
今回のPWMによる制御では、明るさや点灯させる数を細かく制御できず、繋がっていれば多数のLEDをフル点灯させることになるので、LEDが多いモジュールを用いると明るくなりすぎてしまうことが予想できる。
そこで、今回は WS2812B が4個搭載された以下のモジュールを制御対象として選んだ。

[NEO Pixel WS2812BフルカラーLEDモジュール 4素子タイプ / LEDM226-12B4](https://eleshop.jp/shop/g/gICR312/)

以下のプログラムにより、点灯の信号と消灯の信号を約500msおきに交互に送信することで、Lチカを行う。

```
10 pwm_port=2
20 ioctrl pwm_port,200
30 ' WS2812B ON
40 pwm pwm_port,685714,68.57
50 pause 1
60 pwm pwm_port,1,0
70 pause 500
80 ' WS2812B OFF
90 pwm pwm_port,685714,28.57
100 pause 1
110 pwm pwm_port,1,0
120 pause 500
130 goto 30
```

公式のコマンド一覧の `pwm` の説明には

> 周波数に0を指定するとPWM出力を停止します。

とあるが、周波数0を用いると

* ポートの出力がHIGHの状態で止まる
* そもそも信号が出ないことがある

という問題が起きたので、信号の停止には周波数1Hz、デューティー比0%という設定を用いた。

プログラムを実行すると、PORT2 から以下の信号が出ていることが観測できた。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/1db633b1-eebf-08fc-ec3e-de0cacf31ff7.png)

PWMの開始から停止までに1msの待ちを入れているはずなのに、なぜか500μsしか信号が出力されていない。
しかも、信号のあとに、しばらく HIGH になっている時間ができている。

それでも、WS2812B モジュールを接続すると、狙い通りLチカをすることができた。

![ORANGE pico + WS2812B でLチカ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/f9b1fdb4-3563-02e8-026a-5192399fd1f6.gif)
（プレリリース）Spring '24 レポート・ダッシュボードの気になるアップデートを確認

# はじめに

Spring ’24のリリースノートが公開されましたね！リリースノートの中にレポート・ダッシュボードのアップデートが気になるものがいくつかあったので確認してみます。

https://help.salesforce.com/s/articleView?id=release-notes.rn_rd_reports_dashboards.htm&release=248&type=5

:::note warn
2023年12月現在Spring '24は、プレリリース組織での提供となってます。
:::

# すべてのエディションでダッシュボードで画像とリッチテキストウィジェットが利用できるように

https://help.salesforce.com/s/articleView?id=release-notes.rn_rd_dashboards_image_text.htm&release=248&type=5

画像とリッチテキストウィジェットは
`Unlimited`と`Performance`で使用可能な機能でしたが
他のエディションでもSpring '24から配置できるようになります。


![スクリーンショット 2023-12-23 19.45.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445600/c300ec6a-eb5e-e494-f3ad-ee6bf9bee657.png)

![スクリーンショット 2023-12-23 19.59.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445600/846a20bd-4e09-2a39-3a20-f7b9091f04f6.png)

# ダッシュボードフィルタが5つまで設定できるように

https://help.salesforce.com/s/articleView?id=release-notes.rn_rd_dashboards_5_filters.htm&release=248&type=5


![テスト-Salesforce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445600/bc99535e-7dc0-4e89-c96c-ca93e93954f5.png)

# レポート：集計値をフィルターの対象に（ベータ）

https://help.salesforce.com/s/articleView?id=release-notes.rn_rd_reports_summary_filters.htm&release=248&type=5

`レポートおよびダッシュボードの設定`で`Enable filter on aggregated data such as record counts in reports`を有効化すると利用できるようになります。

![レポートおよびダッシュボードの設定-Salesforce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445600/73bb4ddd-dec4-2e02-c214-68d89212e8c2.png)

グループ化、明細行をオフにすると `Add Summary Filter`が出てくるので選択します。

![レポートビルダー-Salesforce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445600/82d371ac-bfe0-3cb5-7079-a8751492e5f5.png)

選択すると集計値でフィルターを設定できるようになります。

![スクリーンショット 2023-12-23 20.26.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445600/5d5641ac-8abe-aaf6-8244-1c985f30f234.png)

# レポート：複数列の一括移動

https://help.salesforce.com/s/articleView?id=release-notes.rn_rd_reports_columns_drag.htm&release=248&type=5

列要素で複数選択して列要素内でドラッグ&ドロップをして
一括で列の表示位置を変えることができるようになります。

今までは同じ位置に移動したいのに、一個一個移動だったのが一括でできるようになるのでだいぶ助かりますね

![レポートビルダー-Salesforce (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445600/3c7b9385-fc4b-6ecd-efe3-e4916e9326a6.png)

![レポートビルダー-Salesforce (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445600/2e0482b0-791c-e73d-61ba-b3e007746c5b.png)

# 最後に

Spring '24 レポート・ダッシュボードの新機能が根本の使い易さ改善のものばかりでとてもいいですね。
特に集計値でフィルターできるようになるのはだいぶSalesforceのレポート・ダッシュボードできることが増えるのではないでしょうか？
アップデートが楽しみです！！
Googleのページのコードを解析してみた

# 初めに
自分がプログラミング**初心者**ということ、さらにこのアドベントカレンダーに初めて参加して**初めて記事を書く**ということをを踏まえた上で気楽に読んでいただけると嬉しいです。

# 記事のきっかけ
web作成に興味があり、最近はjsやphpの勉強をしています。アドベントカレンダーに参加するにあたって何か物を作ろうと思い立ちましたが技術力のなさと時間のなさにより喪失。毎日使用しているGoogleのwebサイトがどのような要素でできているか調べれば自分の勉強により生かすことができると思い今回googlewebサイトのスクレイピングを行いました。
 
 # 困ったときはとりあえずのchatgpt
  Gooleのホームページの開発者ツールをのぞいてみました。
  
  ![スクリーンショット 2023-12-13 215815.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627166/74c06b09-8785-20b9-a7a5-c83e965387ce.png)
  
### 全然わからない。

ところどころしかわからない。地道に調べていけばわかると思うが途方もない時間がかかってしまいます。そういうときのためのchatgpt。早速聞いてみました。

 ![スクリーンショット 2023-12-13 214834.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627166/cc9d266e-f78e-464c-1c63-083a23c00ce6.png)

### そうですよね


やっぱり手動で地道にコードをひとつずつ調べていくしかないのでしょうか…？


 ![スクリーンショット 2023-12-13 215109.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627166/228f0e9b-a399-2500-8b78-9c12c238fa7b.png)

１は言わずもがな一旦省く。
 ２の方法を試してみました。
 
 # スクレイピング 
 Googleのサイトをスクレイピングをする。それにあたって以下の記事を参考に行いました。
[【徹底解説】GASによるスクレイピング完全ガイド](https://itc.tokyo/gas/gas-scraping/)
今回は**GoogleSpreadSheet**を使用してストレイピングをしていきます。

まずはグーグルドライブ開いて，新規作成を押し，新しくGoogleスプレッドシートを作成。
![GOOGLEDRIVE.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627166/b9f203d3-4ff0-e363-1526-cd03df70f3b8.png)

次に、「ツール」→「スクリプトエディタ」を選択して作成する。

![名前を付けて.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627166/1f2256c9-7958-28f1-ee6c-eceb73c45e8e.png)

この画面が開けばok

![konogamenn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627166/d3a1b8e0-98c9-e393-6501-03e5770f6119.png)

## htmlを取得していく
　実際に以下のコードを**GAS**(Google Apps script)に入力することでストレイピングを行っていきます。
```diff_javascript
function myFunction(){var getUrl = "https://www.google.co.jp/";
var html = UrlFetchApp.fetch(getUrl).getContentText('UTF-8');
}
```
UrlFetchApp　指定されたURLからHTTPリクエストを送り、そのURLのコンテンツを取得
getContentText('UTF-8')　取得したコンテンツをUTF-8形式のテキストとして取得するメゾット


# 取得不可


**このアプリはGoogleで確認されていません**


![スクリーンショット 2023-12-13 231849.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627166/d6559fe7-a7cd-1fb3-f53f-6da73a4665c2.png)


やっぱりそうでしたか
# スクレイピングをする際の注意事項
　今回Googlewebサイトのスクレイピングをおこないましたが、スクレイピングをする際には注意事項があります。
 
・**ウェブサイトの利用規約を確認する**: サイトごとに異なる利用規約があります。スクレイピングが禁止されている場合もあるので、利用規約をよく読み、スクレイピングが許可されているかを確認しましょう。
・**個人情報や著作権の尊重**: スクレイピングで得たデータが個人情報を含んでいたり、著作権を侵害している可能性があります。他者の権利やプライバシーを尊重し、法的な規制に従いましょう。
・**IPアドレスのブロック**: スクレイピングを継続的に行うと、ウェブサイトからIPアドレスがブロックされることがあります。極端な頻度や過度な負荷を避けることが大切です。

今回エラーが起こってしまったのは、一つ目のウェブサイトの利用企画に引っかかったことが原因でした。

スクレイピングをする際は以上の注意事項に沿って行うようにしましょう。
# 最後に
 　Googleのページのコードを解析するのは手動でひとつずつ確認しなければいけないことがわかりました。本当は部分的にで解析を行いたかったのですがあまりの知識量のなさに、中途半端な内容になりそうでしたので今回はこういった内容になってしまいました…
 　もっと勉強して次回はより専門的な記事をかけえるようにがんばりたいと思います。
オブジェクト指向について

最近Rubyを学び始めた初心者です。オブジェクト指向について学ぶ機会があり、いろいろな説明があったので、結局どういうことなのか確認のために自分なりに簡潔にまとめてみようと思います。
# オブジェクト指向とは
プログラム上で扱う対象を**オブジェクト**(モノ)に見立ててオブジェクトを中心としてコードを組み立てていく手法のこと。
### オブジェクト指向の目的
* プログラムの再利用性を高めるため
* 変更に対して柔軟に対応するため
* 理解しやすいプログラムにするため　　 ...etc
# カプセル化
要はデータを保護するということ。
直接テータを操作させずに一度関数を通す状況を作ることによって、不正なテータ操作を防ぐ。
# 継承
クラス定義の共通部分を別クラスにまとめることで、コードの重複を排除する仕組み。
これによって無駄を省くことができる。
# ポリモーフィズム(多態性)
呼び出した関数が呼び出し元のオブジェクトに適した振る舞いをすること。
中に入るものによって同じ関数でも違う処理を行えるということ。
# 単一責任の原則
1つのクラスやモジュールは、1つの責務(役割、機能)だけを持つべきであるという考え方。
# まとめ
まだまだ理解したには程遠いですし、浅い説明だったかもしれません。ですが他の記事や本を読んで学んだ方が、これを読んで少しでも考えをまとめる参考になれば嬉しいです。
【ポエム】日々のプロジェクトが大変で勉強の時間が取れないと相談された話

こんにちは。Kaneyasuです。

最近Kaneyasuさんはたくさん苦労していそうと言われます。
むず痒いところです。

これは、そんな私が若者に相談されまして、その時話した内容を書き残したものです。

# 日々のプロジェクトが大変で勉強の時間が取れない

若手からこんな感じの相談をいただきました。
なるほど、とてもよくわかります。

まず、相談してくれた人はとても真面目で良い人だと思います。
やらされているのか、放っておけないのか、状況はわかりませんが、プロジェクトの対応が大変ということは、毎日真面目に仕事に取り組んでるのだろうと想像します。
周りを放っておいて早くあがることはできない、進捗が芳しくないので、できるだけ取り戻さねば！
そんな感じですよね。
周りを思う、チームに貢献したい、それは至極まともな考えです。
別に否定するようなポイントもありません。

ただ、現実問題として、目の前のプロジェクトに邁進するばかりだとスキルが伸び悩むことが多いです。
というのも、どのプロジェクトでもあるラインを超えると、創造的な部分は少なくなり、ただただ面倒な作業が増えてきます。
面倒な作業にあまり時間を割きすぎると、スキルを伸ばすという観点では仕事以外に勉強時間を取らざるを得ません。

相談してくれた人は、この面倒な作業を丁寧にやってくれそうな良い人でした。
真面目にやるほど疲弊するので、勉強する時間も気力もない、そんな流れです。

これに対しては私は次のような話をしました。

# 人生で考える

一応考え方としては、プロジェクトとかチームとかも大事だけど、「自分の人生が一番大事」というのがあると思います。
プロジェクトやチームの運営が上手くいくにこしたことはありませんが、組織に所属している以上、忙しいのは自分一人の責任ではない。
組織が自分の人生の責任は取ってくれるわけでもない。
自分の人生を考えた場合、どこかで割り切って、自分のスキルアップ・プライベートを確保しよう。
そんな考えです。

とはいえ、この考えに至り、実践するのは結構難しい。
私はおじさんですが、仕事・勉強・プライベート、ワークライフバランスを取るのは今でも上手にはできません。

# 進捗報告を利用する

どこかで割り切るって結構難しいですよね。
私もそんな図太くはないので苦手です。

しかし、時間の管理を考え続けることで、ほんのちょっとずつですが、割り切り方がわかるようになる・・・こともあります。

一時期、私は勉強時間の確保を意識付けするために、SNSで進捗報告をしていました。
別にSNS進捗報告しても誰も褒めたりツッコんだりするわけじゃないのですが、
定期的に進捗報告やってると、「今日は進展ありませんでした・・・」って書くのに謎の抵抗感を覚えるようになります。

この抵抗感を利用して、自分の頭を勉強時間の確保＝時間の管理を考える方向に持って行ってました。

ていうか仕事の進捗報告もそんな感じですよね。
報告するからやるってのはあると思います。

ちなみに、進捗報告じゃなくても、ブログ記事とかでもいいと思います。
定期的に投稿するというルールを宣言して、それを破るのに抵抗感を覚えるのを利用する感じです。

# 広く浅く勉強する

勉強時間の確保ができない理由に、勉強したことが何の役に立つかわからないので、いまいち乗り切れないというのもあるでしょう。

騙された気持ちでやってみろ！
なるほど！やってみるか！
・・・そうはならないですよね。

時間を割く限りは意味を見出せないと、頭も体もついていきません。
小さくても動くものを仕上げるのが一番勉強になるという説をよく聞きます。
私はこれに、広く浅く勉強することも意味があるということを付け加えたいです。

もしあなたがWeb系のバックエンドエンジニアで、面倒な作業ばかりで、仕事でスキルはこれ以上伸びない。
よりよいプログラムを書きたいから勉強したいけれど・・・と悩んでいるのなら、一旦プログラムを深く勉強する方向は置いといて、
ログインとか何もなくていいので、サイトを公開する方向で行ってみるといいかもしれません。
サイトを公開というのは、実際にドメインを購入して証明書もつけて、シェアが可能なところまで行くということです。
公開する限りは多少は見栄え良くしたくともHTML書くのも簡単ではなく、ドメインの購入とか設定も意外と難しいと感じると思います。

これに何の意味があるのかというと、他のレイヤーの人の気持ちが多少わかるようになるというのと、広く浅く知識を得ることで、技術的な雑談ネタが増えること、引いては打ち合わせで発言できる可能性が向上するという効果があります。
その結果、面白いプロジェクトに参加する可能性があがります。
なぜ可能性があがるかというと、選ばれるためには顔と名前を覚えてもらわなければならず、喋らないと人は覚えてもらえないからです。
面白いプロジェクトに参加できれば、当初勉強しようとしていたよりよいプログラムを学ぶ機会にありつけるかもしれません。

だいぶ飛んだ理論かもしれませんが、あり得ない話ではないかと。
勉強するための動機づけとして、こんなストーリーもありえると思うことで行きましょう。

# ポエムの最後に

口ではだいぶ熱っぽく喋りましたが、何か伝わったかはわかりません（笑）
自衛官からエンジニアへ Elixirから始める Web開発 Part23

この記事は「Elixir Advent Calendar 2023」23日目の記事です
東京にいるけどfukuokaexのYOSUKEです。

普段は 合同会社TheWaggle で教材開発・システム開発・研修講師などマルチに活動してます。

このシリーズでは、文系ですらない、体育会系でも始められるプログラミング学習　というテーマで元自衛官だった僕が
自衛官からエンジニアになってもらいたいという気持ちを込めて、普段は大人しいですが、このコラムシリーズでは、あえて、体育会系のノリで、貴様ら理屈で覚えるなら体で覚えろ！というノリで書いてみたいと思います。

なので、初学者向けですが、理論は後回し、まずは動かして体感しろってノリの第23回目です。

それでは、いくぞ！

## c-4爆弾と安全性の担保

よーし、貴様ら関数でc-4爆弾を生成する仕組みの途中で判定処理やらリファクタリングやら、正規表現やら教えて横道にそれたが、まだc-4爆弾を生成する関数は完成してない。

今日は、続きを再開するぞ。いいか、貴様ら、知っての通りc-4爆弾の成分は扱いやすくするための成分を爆薬に追加しているに過ぎない。要するにRDXが危険物だが、ちょっとしたことで爆発していては扱いづらい、そこで追加の成分を入れて、簡単に爆発しないようにしてるわけだ。

そして、Wikiによると他の成分と分量がパーセンテージで記されている。これも同じc4を作成する成分なので`create_c4`で作れるようにしよう。

* RDX（トリメチレントリニトロアミン）：91%
* 爆発物マーカー（ジメチルジニトロブタン）：0.1%
* 可塑剤（セバシン酸ジオクチルなど）：5.3%
* 結合剤（ポリイソブチレン）：2.1%
* 界面活性剤：1.5%

引数のパターンマッチを２パターン作ることができる

```elixir
defmodule TNT do
  def create_c4({"RDX", rdx}, {"ポリイソブチレン", polyisobutylene}, {"モーターオイル", motorOil}, {"セバシン酸ジオクチル", dioctylSebacate}, {"ガソリン", gasoline}) do
    materials = [rdx, polyisobutylene, motorOil, dioctylSebacate, gasoline]

    Enum.map(materials, &convert_material_to_numeric/1)
  end

  def create_c4({"RDX", rdx}, {"ジメチルジニトロブタン", dimethyldinitrobutane}, {"可塑剤", plasticizer}, {"結合剤", binder}, {"界面活性剤", surfactant}) do
    materials = [rdx, dimethyldinitrobutane, plasticizer, binder, surfactant]

    Enum.map(materials, &convert_material_to_numeric/1)
  end


  defp convert_material_to_numeric(material) do
    numeric_part = String.replace(material, ~r/[gml%]/, "")
    
    convert_to_numeric(numeric_part)
  end

  defp convert_to_numeric(numeric_part) do
    if String.contains?(numeric_part, ".") do
      String.to_float(numeric_part)
    else
      String.to_integer(numeric_part)
    end
  end
end
```

いいか、貴様らこのように引数のパターンマッチで作成した場合は、同じ引数の数での同じ関数名で作成することができる


```elixir
TNT.create_c4({"RDX", "91%"}, {"ジメチルジニトロブタン", "0.1%"},  {"可塑剤", "5.3%"}, {"結合剤", "2.1%"}, {"界面活性剤", "1.5%"})
[91, 0.1, 5.3, 2.1, 1.5]
```

また、今回、ジメチルジニトロブタンは爆発物マーカーとして入れてるに過ぎない。逆にマーカーをしないで生成するパターンも作る事にしよう。

```elixir
  def create_c4({"RDX", rdx}, {"可塑剤", plasticizer}, {"結合剤", binder}, {"界面活性剤", surfactant}) do
    materials = [rdx, plasticizer, binder, surfactant]

    Enum.map(materials, &convert_material_to_numeric/1)
  end
```

このように同じ関数名で作成することができる。

```elixir
TNT.create_c4({"RDX", "91%"},{"可塑剤", "5.3%"}, {"結合剤", "2.1%"}, {"界面活性剤", "1.5%"})
[91, 5.3, 2.1, 1.5]
```

これで、この関数を利用するものは、c4爆弾を様々な方法で作成することができるようになったわけだ

いいか、聞け貴様ら！こんなにも素晴らしい関数名を同じにする理由をそのnil頭に叩き込め！

まず、一つの関数名で複数のパターンマッチをすることで、同じ目的のための異なる材料や条件に柔軟に対応できるんだ。これがどれだけ効率的か、理解できるか？まるで、同じ銃で異なる弾薬を撃つようなものだ。戦場では状況に応じて装備を変えるが、この関数はそれを一つの枠組みでやってのける。

さらに、この方法はコードの可読性と保守性を高める。貴様ら、戦場での命令が一貫していることの重要性はわかるな？同じ関数名を使うことで、その関数が何をするのか一目でわかる。そして、似たような機能を持つ関数が別々に存在するよりも、一つの関数にまとめる方が、後でコードを修正する際にも迷わずに済む。

そしてな、これによって再利用性が高まるんだ。同じ関数を異なる引数で呼び出すだけで、さまざまな結果を得ることができる。これはまるで、多目的な軍用ナイフのようなものだ。一つで多くの仕事をこなす、そういうわけだ。

最後に、このアプローチはバグのリスクを減らす。なぜなら、一つの機能に関連するコードが一箇所に集中しているからだ。修正する際にも、一箇所を直せばいい。これは、戦場での防御戦略と同じだ。要点を一つに絞れば、防御しやすくなる。

だから、貴様ら、この関数の重要性を忘れるな！これはただのプログラミング技法ではない。これは戦略だ！戦略と効率の極みを見せつけるための方法だ！

今日はここまで、それでは次回 Part24でまた会おう！
Glideを利用して新潟県の観光案内アプリを作ってみた

## はじめに
この記事ではGlideを使用して新潟県の観光案内アプリを制作します。この記事を読む事によって30分程度で簡単な観光案内アプリを作成することができます。これからGlideを始めようと思っている方におすすめです。
## Glideとは
Glideとはノーコードで本格的なアプリやサイトを作成できるツールです。
以下に公式が出しているテンプレートをいくつか紹介します。

![スクリーンショット 2023-12-21 16.18.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658498/989d50a5-494e-7d98-edc2-1c0a07b2cc90.png)
（事業報告書サイトテンプレート）

![スクリーンショット 2023-12-21 16.16.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658498/de1423ca-bdca-64c8-cfbd-7abde97d61db.png)
（部品管理アプリテンプレート）
※Glideの公式が発表しているテンプレート
#  新潟県観光案内アプリ作成
###  Googleスプレットシートを用意
以下のようにwebページに必要なデータをスプレットシートに格納する。
![スクリーンショット 2023-12-21 16.27.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658498/b797a7ad-8262-9c1f-0957-203e6a65dcc3.png)
### 観光地マップ作成
COMPONENTSからMAPを選択しITEM DATEに値を格納する。
![スクリーンショット 2023-12-21 18.05.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658498/282d171b-5ea7-fd88-0cc3-a55522908800.png)
sourceから先ほど入力したデーターベースを選択する。titleにMAP入力し、適切なitem dataを選択する。
![スクリーンショット 2023-12-21 18.17.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658498/1e60f870-a681-30e6-4ff1-ed415f6db5f3.png)

### 観光地一覧作成
先ほどと同様にCOMPONENTSからcollectionを選択する。![スクリーンショット 2023-12-23 19.41.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658498/971d21af-c6eb-076a-e7c8-8e3f8eb2ccc8.png)
sourceから先ほどと同様のデーターベースを選択する。titleに観光地一覧を入力。STYLEからGlidを選択し、適切なitem dataを選択する。![スクリーンショット 2023-12-23 19.42.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658498/f3e6e85d-0cf4-c0e0-b857-6a35b100d22b.png)

### 実装結果![スクリーンショット 2023-12-23 19.47.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658498/e070c93a-c39c-372c-d748-6cab262c2177.png)
![スクリーンショット 2023-12-23 19.47.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658498/63102afc-e6af-efe8-ebbb-25d04149ad24.png)
### まとめ
記事を通じて、Glideというノーコードツールを使用して新潟県の観光案内アプリを作成する方法についてご紹介しました。プログラム未経験者でも簡単にアプリやホームページを作成できます。ホームページ制作やアプリ制作に興味がある方はぜひGlideを使ってみてください。



## 参考文献
https://www.glideapps.com/templates

https://niigata-kankou.or.jp/
正規化ってなに？正規化のメリットをおさらい

## この記事の内容
- 正規化とは何か
- 正規化のメリットを紹介

## 正規化とは？
まず、正規形とはデータベースで保持するデータの冗長性をなくし、一貫性と効率性をもったデータ形式です。行き当たりばったりの設計をすると、同じ情報を何度も登録したり（**冗長性**）、更新時に整合性のないデータが発生する（**非一貫性**）ことがあります。

データベース設計において、冗長性や非一貫性を極力ださないようにする方法論が正規化です。

## 論理設計における正規化
論理設計における、正規化の順番を図にしました。正規化は理論に基づいて機械的に行うことができます。しかし、正規化に必要なエンティティを抽出するには作りたいシステムの理解が欠かせません。せっかく正規化したのに、仕様変更でパーにならないように、よく業務理解することが大切です。

![](https://storage.googleapis.com/zenn-user-upload/4b57cd128ab1-20231118.png)

### 正規化の段階
正規化には段階があり、第1〜第5正規形までが一般的によく知られています。
段階によって、正規化度合いが上がっていき、冗長性や非一貫性がなくなっていきます。

業務においては、第3正規化まで行うことが一般的です。これは正規化度合いが高すぎると、「そこまで仕様がかたまっていない」、「パフォーマンスが落ちる」、「運用担当者がわかりずらい」など、正規化のメリットよりデメリットの方が大きくなるためです。大きくなることがあるためです。
もちろん、ケースバイケースなので、案件仕様に照らし合わせてどこまで正規化を行うか？と検討することが大切です。

### 声を大にして言いたい、正規化のいいところ
正規化の素晴らしい点はテーブル設計の経験が浅い人でも、機械的に正規化を実行すれば、適切なテーブル設計ができることです。玄人さんは「テーブル設計？感覚でやってるよ^^」とか言ってくることがありますが、実際は正規化を経験則的に行なっていることが多いです。

間違っても初心者が感覚でやらないよう注意してください。
（私はそれでレビューに出した設計を跡形もなく修正されたことがあります。）
むしろ、正規化する必要がないテーブルたち

## この記事で書くこと
- 正規化の役割は更新時のデータ不整合を防ぐこと
- 更新しないデータには正規化する必要がない理由

## はじめに
通常、正規化は第3正規形まで行うのが一般的です。
しかし、**正規化する必要がない**テーブルも存在します。
本記事では、どのようなテーブルが正規化の対象外になるのか解説します。

### 正規化とは
正規化とは、データの重複をなくし、一貫性と効率性を保持するためのプロセスです。

### 正規化の目的
以下に、正規化の目的を挙げます。
- データの異常や不整合を防ぐ
- 整合性制約をサポートする

正確なデータを格納し、問題の発生を防ぐことが正規化の目的です。
ただし、パフォーマンスの改善が直接的な目的ではないことに注意してください。

## 正規化を必要としないテーブルの例
正規化の目的の一つである「データの異常や不整合を防ぐ」について、
データの異常や不整合はいつ起こるのでしょうか。
それは、**データの更新時**です。

従って、更新操作を行わないテーブルは正規化を行う必要がありません。
ここでは、正規化が不要なデータベースの例を３つ紹介します。

### データ更新を行わないもの
データウェアハウスやアクセスログなど、データを追記するだけで更新しないものは、正規化の必要がありません。
![](https://storage.googleapis.com/zenn-user-upload/6dfc7805b0d0-20231108.png)

### データの履歴を残すもの
社員異動履歴や価格改変履歴のように、古いデータを保存することを目的とするテーブルは、データを更新しないため、正規化の必要がありません。

![](https://storage.googleapis.com/zenn-user-upload/dc7ad99cbb0c-20231108.png)

### 高速化が特別に必要なもの
特に問い合わせの高速化が必要なテーブルは、正規化を行わない場合があります。
しかし、正規化は基本原則であり、安易に非正規化の状態にするのは避けるべきです。
高速化のために、インデックスの追加やビューテーブルなど別の方法を検討することをお勧めします。


## まとめ
- 更新されないテーブルは正規化する必要はありません
- データベース設計は、用途に応じた正規化の選択をしていきましょう！

## 参考文献
徹底攻略 データベーススペシャリスト教科書 正規化理論
https://book.impress.co.jp/books/1122101156

SQLアンチパターン　付録
https://www.amazon.co.jp/SQL%E3%82%A2%E3%83%B3%E3%83%81%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-Bill-Karwin/dp/4873115892
toio Do の v1.5 の新機能を使って簡易に声に反応して動く toio： Microbit More の拡張機能で micro:bit のマイクを組み合わせる【完走賞ゲット-23】

:::note info
※ [Qiita の完走賞をゲットするための条件は「単一／複数のカレンダーに投稿した記事が合計25」です](https://twitter.com/Qiita/status/1593441648796524545)
:::

この記事は、「[完走賞ゲットのため小ネタ 25記事を投稿しようとチャレンジ v2 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/youtoy)」の 23日目の記事です。

## 今回の内容
この記事は、toio Do の v1.5 の新機能である「外部からの拡張機能の読み込み」を使って、以下の動画のような「声に反応して動く toio」を簡易に作ってみた話です。具体的には、拡張機能として「Microbit More」を読み込み、そこで使える micro:bit のマイク機能を活用しました（toio Do標準というか、その元になっている Scratch標準の micro:bit の拡張機能だと使えないもの）。

<iframe width="560" height="315" src="https://www.youtube.com/embed/-tSJWGozPyI?si=IwjKNJZGhwWuuL1y" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

## やってみたこと
### toio v1.5 の新機能
まず、今回使った toio v1.5 の新機能から説明します。

内容は、公式の以下の記事に書いてあるものです。

●toio Doの新バージョンv1.5が公開！拡張機能の読み込みでブロックを追加可能に！ | toio blog | toio（トイオ）
　https://toio.io/blog/detail/202311_toio_do_v1.5_release.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/a3cd0a38-6949-a77c-e061-59243a232879.png)

toio Do標準で、読み込みができる拡張機能は用意されていますが（※ 基本的に、元になっている Scratch 3.0 の拡張機能が使える状態という形）、新機能を使うと以下をさらに増やすことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/99b7750f-f9a9-8080-2541-87621ef65319.png)

上で画像で示した URL の情報を、以下にリストで記載します。

- Posenet2Scratch （姿勢検出）	
   - https://toio.github.io/toio-visual-programming/beta/static/extensions/posenet2scratch.mjs
- Speech2Scratch （音声認識）
   - https://toio.github.io/toio-visual-programming/beta/static/extensions/speech2scratch.mjs
- Microbit More （micro:bit制御）
   - https://toio.github.io/toio-visual-programming/beta/static/extensions/microbitMore.mjs

### Microbit More 
ここで、toio Do の新機能で使った Microbit More について、少し補足しておきます。

Microbit More は、toio Do標準の拡張機能（※ 基本的には、元になっている Scratch 3.0 の拡張機能）に入っている micro:bit の拡張機能よりも、多くのことが行える拡張機能です。

具体的に、以下で利用できるブロックを並べて示します。

#### 標準の micro:bit拡張機能で使えるブロック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/0258f8c0-517a-cde0-1ad6-5596f4c8520e.png)

標準の micro:bit拡張機能で使えるブロックは以下のとおりです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/e51ce2b6-7953-e163-b9d4-3f299cb31546.png)

#### Microbit More で使えるブロック
次に `https://toio.github.io/toio-visual-programming/beta/static/extensions/microbitMore.mjs` を読み込んで使える、Microbit More で使えるブロックを以下に掲載してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/4e9d0bac-90cb-333d-1d98-b09f0a0cc038.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/eccc228a-3dd4-ab24-12fc-536cc5b5104a.png)

標準の拡張機能と比べて、micro:bit のかなり多くの機能を使えるようになります。

###　今回のプログラム
今回使ったプログラムは、以下の通りです。

利用するブロックを最小減にできるような、シンプルなもので試しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/254a655b-01fd-602c-10ae-871d316cae16.png)

これだけのブロックで、冒頭の動画のような仕組みを作ることができました。
paramsで配列形式のデータを受け取るには？

### はじめに
Railsで配列形式のデータ（例えば、tag_ids）をフォームから受け取る方法についての記事です。
具体的なパラメータ構造を以下に示します。

```terminal:
params => 
{
    "article"=>
    {
        "title"=>"title", 
        "tag_ids"=>["1","2"]
    }
}
```
本記事では、tag_idsが配列としてどのようにフォームから受け取られるかを解説します。

### 動作環境
ruby : 3.1.4
rails : 7.0.8

### どういうケースを想定している？
今回は、多対多の関係を持つテーブルを想定しています。
例としては、以下ER図にあるように、記事（Article）とタグ（Tag）に対して中間テーブル（ArticleTags）が存在しているケースです。

```mermaid
%%{init:{'theme':'forest'}}%%
erDiagram
  articles ||--o{ article_tags : ""
  tags ||--o{ article_tags : ""

  articles {
    bigint id PK
    string title
    references user_id FK
  }

  tags {
    bigint id PK
    string name
  }

  article_tags {
    bigint id PK
    references article_id FK 
    references tag_id FK
  }
```

### 実装

form_with ヘルパーを使ってフォームを設定し、
text_field_tag を使用して tag_ids の配列を作成します。

```erb
<%= form_with(model: @article, local: true) do |form| %>
    <%= form.text_field :title %>
    <br>
    <%# 以下タグは必要な配列分増やしてください。 %>
    <%= text_field_tag 'article[tag_ids][]'%>
    <br>
    <%= form.button "Submit",type: "submit" %>
<% end %>
```

* text_fieldとtext_field_tagの違いについては以下記事参照

https://qiita.com/takuo_maeda/items/e2036d1a67725af6359e


### まとめ
本記事では、Railsで多対多の関連を持つテーブルを操作する際に、配列形式でパラメータを受け取る方法について説明しました。
エンジニア-1年生がUdemy講座でWebアプリを作成できるようになった話


## はじめに
はじめましてんぐ。（特に意味のない現在進行形）
強強エンジニアを目指す大学3年生です。

私は最近色んなことに手を挑戦しているのですが、
今回は私が受けてよかったなと感じるUdemy講座について紹介します。

https://www.udemy.com/course/php7basic/

結論から述べると、上のリンクの
「**ちゃんと学ぶ、PHP+MySQL（MariaDB）入門講座**」
です。

PHP未経験の私にとってすごく分かりやすい講座でした。

**PHPを勉強してみたい人、何かしらWebアプリを作ってみたい人にはとてもオススメです！**

受講する前〜受講後の私の状況と、おすすめポイントを以下で述べたいと思います。

## 受講前の私
参考になるように、
受講前にできたこと、できなかったこと、この講座に期待していたことを述べます。

ざっくりいうと、
私は情報学部生である程度のプログラミングはできたので、

「**Web アプリの作り方を理解しながら PHP を使ってアプリ制作をしたいなあ**」

と思っていました。

### できること
- Python、C言語などでの簡単なプログラミング（AtCoder茶色レベル）
- Ruby on Rails を使って簡単なWebアプリを作る
- SQLでデータベースを操作する

### できないこと
- PHPを使ってWebアプリを作る
    - そもそもPHPがWeb専用の言語だということすら知らなかった
- データベースを自分でいじってWebアプリを作る
    - Ruby on Rails はフレームワークがそこら辺をやってくれるので、自分でSQLを書いてWebを作ったことはなかった

### この講座に期待していたこと
- PHP の書き方を理解する
- Web の作り方を理解する
- PHP を使って Web アプリを作れるようになる


## 受講中の私
受講中は基本的に、
新しいことを知れてワクワクしていました！

### プラスの感情
- プログラミング楽しい
- 環境構築から一緒にやってくれるなんて神すぎませんか...🥺
- PHP の豆知識まで教えてくださるんですか！？
- DB の GUI での操作ツール始めて触れて嬉しい
- 講師の方が優しすぎる
- プログラミング楽しい

### マイナスの感情
- ゴールまでが長いなあ...。
    - レッスン終了に 10 時間ほどかかります

レッスンの内容に対するマイナスの感情は本当になく、
早くWeb作りたいけどまだ基礎か...という
時間的なモヤモヤがありました。（私がせっかちなだけです笑）

## 受講後の私
結論、受講前の私が期待していたことをすべてクリアできました！

それプラスで様々な学びがあったので、本当に受講した良かったなあと感じています。

### できるようになったこと
- PHP を使って Web アプリを作れるようになった！
    - ちょっとしたセキュリティ対策も盛り込めるようになった
- PHP のドキュメントを読めるようになった！
    - ドキュメントを見ながら細かな解説をしてくれるので、自分でドキュメントを読む力が付きました
- MySQL の GUI ツールを使いこなせるようになった！


## おすすめポイント
この講座をおすすめするポイントは色々あります。

せっかくなので思いつく限りで書いてみます。

- 実践ベースだから受講していて楽しい
- 解説がわかりやすい
- 細かなところまで丁寧に解説してくれる
- 環境構築から一緒にできる
- Windowsもmacも対応している
- 一コマあたりの時間が短く、スキマ時間に取り組みやすい
- 講座でわからないところがあっても質問できる
- **実践ベースだから受講していて楽しい**

特に、ただ解説している動画ではなく、
講師の方も手を動かしながら解説してくださっているので、

実際に手元で Web アプリを完成させる体験ができて**すごく楽しかった**です！

さらに解説も分かりやすく、自分ひとりで実装する力もついたんじゃないかなと思います！

https://www.udemy.com/course/php7basic/


### こんな方にオススメ
- 楽しく勉強したい
- 解説を聞くだけは嫌
- 自分で手を動かしながら理解したい
- 基礎からちゃんと教えてほしい
- HTMLとCSSは触ったことあるけどプログラミング言語の経験は浅い
- Webアプリを何かしら作ってみたい

何かしらに当てはまれば、受講を検討しても良いと個人的には思います。


## 最後に
今回始めてUdemy講座を受けましたが、
思った以上に分かりやすく楽しい講座でした。

今度は AWS の勉強がしたいので、AWS の講座を探してみようかなあと思っています。
今すぐできる AWS re:Invent 2023 workshop

この記事は [AWS Community Builders Advent Calendar 2023](https://qiita.com/advent-calendar/2023/aws-community-builders) の23日目の記事です。

# はじめに

こんにちは。  
最近、登壇等のアウトプットよりもスマホアイコンがAWSサービスアイコンの奴で有名になりかけている角中です。

AWS re:Inventには workshop と呼ばれるハンズオンがあります。  
この一部は個人のAWSアカウントからCloudFormationやCDKを使って構築して実際に始めることもできますし、ブラウザ翻訳で快適に実施できます。  
そのため、この記事が下記の使われ方につながると嬉しいです。
* AWS re:Invent へ行けなかったがハンズオンがあるならやってみたい
* 1月に出張報告しないといけないが、もう忘れて困っている
* 来年参加する際にworkshopはどのくらい時間がかかるのか体感しておきたい  
* 職場の中でワイワイやりたい

また、こちらは投稿時期での情報です。  
AWS re:Invent 2022では少し時間が経つとリンクが変わっていたり、なくなったりしていました。  
最後に探し方を簡単に記載しておきます。  

# 私が認識している範囲の workshop
全て探し出すには多いので把握している範囲で紹介してみます。

## DAT303 | Build generative-AI-powered search with Amazon Aurora & Amazon RDS
こちらはAmazon Auroraに関するPDFを格納して、Bedrockに解答させるハンズオンでした。  
生成AIについて完全素人でも簡単に体験できておすすめですし、解説やデータベース上で何が起きているのか確認する手順がついているのがポイント高いです。  
現地でやりましたが、復習したいなと思っているので見つけてラッキーでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330185/31444c8a-817a-4bfc-a6ca-9dc77d66d634.png)

https://catalog.us-east-1.prod.workshops.aws/workshops/1b65c05a-7ca9-474d-b6a7-4471e489c569/en-US

## SUP306 - Troubleshooting in the Cloud
https://catalog.us-east-1.prod.workshops.aws/workshops/fdf5673a-d606-4876-ab14-9a1d25545895/en-US/introduction

たまたま現地で予約していて、Amazon Qが発表され、"Amazon Qが大暴れするか！？"と思ってやってました。  
ネットワークがなぜ遅延しているのかを直す際に、Amazon Qに何を聞くのか手が止まってしまいました。  
原因の切り分けが整理されていないと"Amazon Qから何を聞こうか。。"となってしまい、結局自分で考えて作業していました。  
手順を見るとチームでトラブルシューティングの話し合いしてみようと記載があったので、ワイワイやるにはちょうどいいのかもしれません。  
分野もネットワーク以外に沢山あるので興味ある範囲でやってみるといいかもしれません。

## ARC301 Advanced Multi-AZ resilience patterns: Mitigating gray failures
こちらはマルチAZ構成においてgray failuresが起きて普及するまでの流れが追えるそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330185/2dcb70a2-66e7-70c4-404f-c994423d9915.png)

https://catalog.workshops.aws/multi-az-gray-failures/en-US

下記で紹介と解説あるのでぜひ！(私はやっていないので詳細は説明できません。)

https://speakerdeck.com/hatahata021/tried-workshop-advanced-multi-az-resilience-patterns

## COP306 Hands-on experience with Amazon CloudWatch and AWS X-Ray
こちらはタイトルの通りAmazon CloudWatchとAWS X-Rayの話です。  
こちらも私はまだ実施していないので詳細な説明はできません。  
が、アプリケーションを実際に作成する手間なく、こういったサービスの学習ができるものになっています。感謝です！！  

https://catalog.workshops.aws/native-cloudwatch-experience/en-US

https://speakerdeck.com/yoshiiryo1/re-invent2023-xian-di-repo-and-cloud-operation-sabisu-update?slide=10

# workshop の探し方
シンプルにググるだけです。  
ですが、ググる素材はこちらにしています。  
過去のre:Inventのスライド資料もここにあるみたいです。  

https://aws.amazon.com/jp/events/events-content

re:Invent2023のセッション予約時に"Automate operations management on AWS"を見つけましたが、検索してみると去年もやっていることがわかります。  
もちろんここにあるのは全てではないので完全にカバーできるわけではないのですが一助としては機能すると思います！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330185/d29fb8e3-7911-0306-35d4-eacb4b58ceab.png)

同様に下記のworkshopも過去にやっているものだなと想像つきます。

https://catalog.workshops.aws/layered-vpc-security/en-US?fbclid=IwAR3ilYlraOJ8ZPhysTVbji9GYHeOlzK4aYIIymj3cwyf79jdi5P5D4cnCZc

# まとめ
という訳でAWS re:Inventで開催されたworkshopの紹介でした。  
AWS re:Inventに限らず他にもworkshopはあるのでよかったら試してみてください。
  
https://workshops.aws/