OmniAICreator/Qiita-1.07M huggingface dataset:
rails db:migrate マイグレーションの種類とエラー


```ruby

rails db:migrate

```
データーベースを作るの意味



```ruby

rails db:rollback

```
データーべースに作ったカラム（名前）などの追加や編集をしたい場合にロールバックをして１度戻す
その後再度rails db:migrate をする


そして今回のエラーですが
db>migrate内にあるactiverecord内で
```ruby

  def change
    create_table :addresses do |t|
      t.string :zip_code,                                    null: false
      t.references :region_of_shipping_origin_id,            null: false
      t.string :city,                                        null: false
      t.string :street_address,                              null: false
      t.string :apartment_name,                              null: false
      t.string :tel,                                         null: false
      t.references :order,                                   null: false, foreign_key: true
      t.timestamps
    end


```
当初t.references :region_of_shipping_origin_id,            null: false,foreign key
と書いておりましたがなぜかマイグレーションができませんでした。

原因はreferences ではなくintegerが正解だったみたい。ちなみに外部キーもいりません！

ちなみに マイグレーションの状況を確認するには
ターミナルに`rails db:migrate:status`コマンドでマイグレーションファイルの状況を確認します。
【メモ】AWSのサービス（分析）

|service name|AIの解説|
|:----|:----|
|Amazon OpenSearch Service|オープンソースの検索および分析エンジンであるOpenSearchをAWS上で提供するマネージドサービスです。高速なデータの検索、分析、視覚化に適しています。|
|Amazon Athena|サーバーレスなインタラクティブクエリサービスであり、S3に保存されたデータに対してSQLクエリを実行できます。データの分析や探索が目的です。|
|Amazon CloudSearch|マネージドサーチサービスであり、ウェブサイトやアプリケーション内でのデータ検索を提供します。構造化データやテキストデータの検索に使用されます。|
|Amazon DataZone (プレビュー)| データの保存や処理を行うための物理的な場所（ゾーン）を指定するサービスです。データのローカル性やコンプライアンス要件を満たすために使用されます。|
|Amazon EMR|ビッグデータの処理や分析に使用されるマネージドHadoopフレームワークです。スケーラビリティと柔軟性に優れており、Apache SparkやApache Hiveなどのツールを活用できます。|
|Amazon FinSpace|金融機関向けのデータ管理および分析プラットフォームであり、金融データの収集、整理、分析をサポートします。|
|Amazon Kinesis|リアルタイムのデータストリームを処理、分析、視覚化するためのマネージドサービスです。ストリーミングデータの収集や処理に使用されます。|
|Amazon Managed Streaming for Apache Kafka (MSK)|Apache Kafkaをマネージドで提供するサービスであり、ストリームデータの処理や分析に使用されます。|
|Amazon QuickSight|ビジュアルデータ分析ツールであり、ビジュアルダッシュボードやレポートの作成、データの探索や洞察をサポートします。|
|AWS Clean Rooms (プレビュー)|セキュアなデータ共有環境を提供するサービスです。データの共有や分析におけるプライバシーやセキュリティの要件を満たすために使用されます。|
|AWS Data Exchange|サードパーティのデータプロバイダからデータセットを購入および配信するためのマーケットプレイスです。|
|AWS Data Pipeline|異なるデータソースやデータストア間のデータの移行および変換を自動化するためのサービスです。|
|AWS Glue|データの抽出、変換、ロード（ETL）を自動化するためのマネージドサービスです。データの準備や変換を行うために使用されます。|
|AWS Lake Formation|データレイクの構築、セキュリティ、データアクセスの管理を簡素化するためのサービスです。データの収集、保存、分析、共有に使用されます。|
TypeError: KV storage and writes quota are exhausted.

exhausted:sob:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/3c782f6d-a2a5-3a19-0469-228671581c58.png)


```typescript
const kv = await Deno.openKv();

Deno.cron("delete all entries", "* * * * *", async () => {
    console.log(new Date())
    const start = Date.now()
    const entries = kv.list({ prefix: [] });
    for await (const entry of entries) {
        kv.delete(entry.key);
    }
    console.log((Date.now() - start) / 1000)
});
```
NewRelic の折れ線グラフ (Line chart) に閾値を表示する

# グラフに閾値を表示したい

同時にいくつものサービスを運用していると、そのサービスの正常値がどれくらいか、すぐに思い出せないことがあります。
また、運用経験の浅いチームメンバーはメトリクスの数字だけ見ても良し悪しを判断できないことがあるでしょう。

ダッシュボードは単に現在の値を表示するだけでなく、問題の有無をひと目で識別できるようにしたいものです。

AWS さんも

> アラートを設定する際は、グラフに閾値を表示する

と言っています。

https://logmi.jp/tech/articles/328519


# NewRelic の場合
NewRelic のグラフには、これまで閾値を表示する機能が無かったのですが、[2024/01 のアップデート](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202401) で折れ線グラフ限定で静的な閾値を表示する機能が追加されたようです。
今回はこれを試してみました。

# これまでの (古い) 方法
これまで閾値の表示機能はありませんでした。
しかし、グラフは「`Add another query`」機能を使って複数の NRQL の実行結果を描画できるので、メインの NRQL とは別に固定値を SELECT すれば擬似的に閾値を描画することができました。

閾値が WARNING を表すなら、Series の色をオレンジや赤色にしてやれば、それっぽくなります。(下図)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97890/54bd62ba-da18-68e9-b5a1-50ea7ab6b9bb.png)


# 新しい方法
`Chart type` を `Line` にすると、設定項目に `Thresholds` が出てくるようになりました。
ここで名前や閾値を設定すると、下図のようにグラフ上に閾値が表示できるようになりました。
カンタンですね！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97890/d3e716f6-6cff-91f3-5d78-cb2bb355cfd9.png)

ちなみに From == To に設定すると範囲の塗りつぶしではなく線だけの描画になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97890/5aa5415a-b765-4774-fc6b-b79189d53392.png)

# まとめ
新設された設定項目 Thresholds で Line chart に静的な閾値を表示する方法を紹介しました。
設定できるのはあくまでも静的な値だけなので、何か別のメトリクスから動的に閾値を決めたいようなケースがあれば、古い方法にもまだ出番はあるかもしれません。

あと希望としては Stacked Bar の Chart type にも閾値表示できると嬉しいんだけどなぁ...。
複数の Chart type をオーバーレイして表示するのは技術的に難しいんですかね？
【Unity】Meta Quest をUnityEditor + Meta Linkでデバッグ中にパススルーとか色々な機能を使えるようにする

# はじめに
これまでMeta Linkでデバッグ中にパススルーなんて出来ないんだろうなぁ、と先入観を持って触っていましたが、実は設定を変えることで利用できるようになるみたいです。

※ただし、UnityEditorの画面上はパススルー映像が反映されないのでQuestのレンズを覗く必要があります。

# 設定方法
* PCのOculusアプリを開く
* Settingsタブから開発者ランタイム機能にチェックを入れる
* 以下の項目が表示されるので、使いたい機能のチェックをONする
    * パススルー機能
    * アイトラッキング機能
    * 表情推定
    * 点群（PointCloud）共有機能
    * 空間情報

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/6ae936b5-92de-3da1-ceb2-a81f47b63435.png)

以上
【GAS】複数のGoogle Classroomに連絡事項を投稿する

## １ 目的
Google Classroomは、一般にはあまり馴染みがないかもしれませんが、学校でよく使われているGoogleアプリケーションです。全校のclassroom、たくさんのclassroomに同じ連絡事項を投稿したいことがあるかもしれません。同じ投稿を手作業で何個もするのは面倒くさいですよね。そこで、Google apps Scriptで、複数のclassroomに同じ連絡事項を投稿するものを作ってみました。スプレッドシートのデータを元に連絡事項を投稿するコンテナバインドのスクリプトです。

## ２ データのスプレッドシート
データのシートが２つあります。
シートmyclasslist2に、クラス名と クラスルームID（courseId）が入っています。これは、[【GAS】Google ClassroomのcourseId等一覧を取得する](https://qiita.com/freshcl/items/ad79fe433e776f5517dd)で作成したシートを元に作ると良いと思います。（例示しているcourseIdはランダムな数字で実在のものとは関係ありません。）
![Screenshot20240228_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157289/60aefcc6-d4ba-6f55-66a5-7df55e721c53.png)
シートannounceに、メッセージとリンクURLを入力します。メッセージはセルB2、リンクはセルB3に入力します。リンクを添付しない場合はB3は空欄として下さい。メッセージ本文中にURLを書けばクラスのストリームでの表示はハイパーリンクとなります。
![Screenshot20240228_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157289/9178e0b3-d4fc-6e52-1369-80cb948f6ce9.png)

## ３ スクリプト
```JavaScript:postAnnounce.gs
function postAnnounce() {
  //シートからclassroomのデータを読み取る
  const myspreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const mysheet1 = myspreadsheet.getSheetByName('myclasslist2');
  const mydata1 = mysheet1.getRange(2, 1, mysheet1.getLastRow() - 1, 2).getValues();
  //シートからメッセージとURLのデータを読み取る
  const mysheet2 = myspreadsheet.getSheetByName('announce');
  const mymessage = mysheet2.getRange('B2').getValue();
  const myurl = mysheet2.getRange('B3').getValue();
  //各クラスに対して連絡事項を投稿
  for (let i = 0; i < mydata1.length; i++) {
    let className = mydata1[i][0];
    let courseId = String(mydata1[i][1]);
    try {
      //連絡事項を作成 
      let myannouncement = {
          text: mymessage   
      }
      if (myurl !== '') {
        myannouncement.materials = [{ link: { url: myurl } }]; 
      }
      //連絡事項を投稿
      Classroom.Courses.Announcements.create(myannouncement, courseId);
      Logger.log('連絡事項がクラス "' + className + '" に投稿されました。');
    } catch (error) {
      Logger.log('クラス "' + className + '" への投稿中にエラーが発生しました: ' + error.message);
    }
  }
}
```

クラスルームのID（courseId）は数字なので、スプレッドシートに入ったcourseIdは特に設定しなければ数値型になってしまうのですが、courseIdは文字列型として使いたいので、String()で文字列型にしています。最初そのことを忘れていて数値型で扱ったのですが、このスクリプトは問題なく動きました。courseIdは数値型でもいけるのか？と思い、他の、ユーザーをclassroomに招待するスクリプトで試してみたらそちらはエラーになりました。courseIdは文字列型で使用することにしておいた方が無難なようです。

## ４ 参考
- [【GAS】Google ClassroomのcourseId等一覧を取得する](https://qiita.com/freshcl/items/ad79fe433e776f5517dd)
【Deno KV】delete all entries purge【TRUNCATE】TypeError: KV storage quota is exhausted.【Deno Deploy】

```typescript
const kv = await Deno.openKv();

Deno.cron("delete all entries", "* * * * *", async () => {
    console.log(new Date())
    const start = Date.now()
    const entries = kv.list({ prefix: [] });
    for await (const entry of entries) {
        kv.delete(entry.key);
    }
    console.log((Date.now() - start) / 1000)
});
```

全消しするのに結構時間かかります。進捗はダッシュボードをリロードしましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/9af8adfa-83e1-eac4-2039-e2379fdfd1f0.png)


Deno Deployで怒られた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/da21a6c1-ddd4-39c0-7165-339c96177a9a.png)
Pythonで「関数からreturn文を使って呼び出し元へ戻り値を返す」の動作を確認してみた

# 概要

Pythonで「関数からreturn文を使って呼び出し元へ戻り値を返す」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/python/userfunc/index4.html

# 実装

以下のファイルを作成しました。
```sample.py
def myfunc():
    print("Hello")
    return "Good bye"

x = myfunc()

print(x)

def myfunc(num):
    if num % 2 == 0:
        return "偶数です"
    return "奇数です"

for i in range(1, 5):
    print(str(i) + "は" + myfunc(i))

def myfunc():
    name = "Yamada"
    old = 24
    return (name, old)

x = myfunc()
print("name : " + x[0])
print("old : " + str(x[1]))

def myfunc(num1, num2):
    goukei = num1 + num2
    heikin = (num1 + num2) / 2
    return (goukei, heikin)

num1 = 10
num2 = 8
x = myfunc(num1, num2)

print("num1 = " + str(num1))
print("num2 = " + str(num2))
print("合計 = " + str(x[0]))
print("平均 = " + str(x[1]))
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
Hello
Good bye
1は奇数です
2は偶数です
3は奇数です
4は偶数です
name : Yamada
old : 24
num1 = 10
num2 = 8
合計 = 18
平均 = 9.0
```

# まとめ

何かの役に立てばと。
Deno KV on Deno Deploy動作確認スニペット

https://docs.deno.com/deploy/kv/manual

```typescript
const kv = await Deno.openKv();

const prefs = {
  username: "ada",
  theme: "dark",
  language: "en-US",
};

const result = await kv.set(["preferences", "ada"], prefs);

const entry = await kv.get(["preferences", "ada"]);
console.log(entry.key);
console.log(entry.value);
console.log(entry.versionstamp);


Deno.serve((req: Request) => new Response("Hello World"));
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/e40e8f15-d0eb-128d-b83d-42d46997857f.png)
ROS環境を使わないrosbagの読み取り

# やりたいこと

ROS2で記録されたrosbagファイルを読んで中身のデータをCSV等に変換したい．
いちいちplayしてechoするのは色々な意味でめんどくさいので避けたい．
できればROS2の環境に依存するのも避けたい．



# 手法
rosbagsというpythonライブラリがあるのでこれを利用する．
https://gitlab.com/ternaris/rosbags

導入は普通にpipでOK
```
pip install rosbags
```

基本的な使い方は
https://ternaris.gitlab.io/rosbags/topics/rosbag2.html
を参照

このページのサンプルコードの場合，タイムスタンプがtimestamp，データがmsgに入っている．
msgはインスタンス的な構造になっていて，例えば画像（sensor_msgs/msg/Image）の場合こんな感じ
```
sensor_msgs__msg__Image(header=std_msgs__msg__Header(stamp=builtin_interfaces__msg__Time(sec=1505454387, nanosec=719656343, __msgtype__='builtin_interfaces/msg/Time'), frame_id='front', __msgtype__='std_msgs/msg/Header'), height=540, width=720, encoding='bayer_rggb8', is_bigendian=0, step=720, data=array([255, 255, 255, ...,  31,  26,  31], dtype=uint8), __msgtype__='sensor_msgs/msg/Image')
```
ここで例えばmsg.heightみたいに書けば720という値が取得できる．

vars(msg)とすることで辞書型に変換できて，
```
{'header': std_msgs__msg__Header(stamp=builtin_interfaces__msg__Time(sec=1505454387, nanosec=719656343, __msgtype__='builtin_interfaces/msg/Time'), frame_id='front', __msgtype__='std_msgs/msg/Header'),
 'height': 540,
 'width': 720,
 'encoding': 'bayer_rggb8',
 'is_bigendian': 0,
 'step': 720,
 'data': array([255, 255, 255, ...,  31,  26,  31], dtype=uint8),
 '__msgtype__': 'sensor_msgs/msg/Image'}
```

list(vars(msg))とすれば変数名一覧が取得できる．
```
['header',
 'height',
 'width',
 'encoding',
 'is_bigendian',
 'step',
 'data',
 '__msgtype__']
```

なので（たぶんもっときれいな書き方があるんだろうが）とりあえずこんな感じで書くとデータの中身をざっくり取り出せる．
```
for i in range(len(vars(msg))):
    print(vars(msg)[list(vars(msg))[i]])
```
構造がネストしている場合はもう少し頑張る必要がある．


# 独自定義のトピックを読む場合

メッセージ定義ファイル（.msg）を用意する
/hoge/msg以下にまとめて配置してあるとすると，

```
from rosbags.rosbag2 import Reader
from rosbags.typesys import get_types_from_msg, register_types
from pathlib import Path
from glob import glob

msgl=glob("/hoge/msg/**/*.msg",recursive=True)
add_types = {}
for i in range(len(msgl)):
    add_types.update(get_types_from_msg(Path(msgl[i]).read_text(),メッセージタイプ名 ))
register_types(add_types)
```


メッセージタイプ名はわかっているならべた書き（文字列）でいい
大量に処理したいなら本来ROSがmsgファイルのコンパイルに使うCmakefileの中のproject()部分を読むなどすれば自動化可能．


# Limitation
metadata.yamlが存在しない場合には読めないらしい．
もしかしたら回避策があるのかもしれないが，とりあえずここだけ別途ROS2環境を用意してreindexして対処．
```
ros2 bag reindex -s sqlite3 hoge/bag/
```
ここで-sオプションがなくてもreindex自体はできるが，後々rosbagsが読むときにエラーを吐くので-sオプションは必須．


---

rosbagsにはROS1のbagをROS2のbagに変換する機能とかもあるらしい…
【Unity】Photon Fusionで"incompatible versions"のエラーが出る

# 現象
Photon Fusionで"incompatible versions"のエラーが出る

# 対処方法
Photonのダッシュボード上でAPPを作成時にSelect SDK Versionが間違っていないか確認する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/d98b9818-1df1-d62e-28b8-9ce1b57f7310.png)

設定済みの場合はAPP一覧の `詳細へ' から確認することができる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/447714e6-73e8-0987-8e2c-4f78ca0a899e.png)
AWS CLF入門 - データベース編

## はじめに
AWS CLF (AWS Certified Cloud Practitioner) を取得した際の学習記録をアウトプットとして以下に記す。

## リンク
[ネットワーク](https://qiita.com/yashiuri/items/31b2c9c3c49c2584cd01)
[セキュリティ](https://qiita.com/yashiuri01/items/73e5310b09ff41912862)
[コンピューティング](https://qiita.com/yashiuri01/items/9eaf71a1590e7815f9ef)
[コンテナ](https://qiita.com/yashiuri01/items/708b57ee179ae29e72a9)
[スケーリング](https://qiita.com/yashiuri01/items/79050093aff66b0f0665)
[ストレージ](https://qiita.com/yashiuri01/items/6d48d81f5a1651dcc999) 
[データベース](https://qiita.com/yashiuri01/items/159ea63b197f7a836d1c)
[メッセージ](https://qiita.com/yashiuri01/items/d98772b540ef2201c4e2)
[モニタリング](https://qiita.com/yashiuri01/items/64f6dbf38603cdb4828a)
[デプロイ](https://qiita.com/yashiuri01/items/85151311897d6afd429c)
[コストとサポート](https://qiita.com/yashiuri01/items/bac23130a43d62677330)
[移行とイノーベーション](https://qiita.com/yashiuri01/items/6e327034a7c50d56ca88)
[AWS用語集](https://qiita.com/yashiuri01/items/bd36c99623ca596b76e4)


## データベース
### **Amazon RDS(Relational Database Service)**

- データモデル - 格納するデータの構造。適切に定義することで効率よくデータの管理や分析が可能
    - SQL
        - リレーショナル - 表形式
    - NoSQL
        - キーバリュー - キーと値のペア
        - グラフ - グラフ形式
- 対応DB
    - Amazon Aurora
    - MySQL
    - PostgreSQL
    - MariaDB
    - OracleDB
    - Microsoft SQL Server
- AWSが以下を全て管理
    - 自動パッチ適用
    - バックアップ
    - 冗長性
    - フェイルオーバー
    - 災害対策

### **Amazon Aurora**

- RDB
- 対応DB
    - MySQL
    - PostgreSQL
- MySQLより最大 5倍、PostgreSQLよも最大3 倍高速
- コストは商用DBの1/10
- データレプリケーションによって３つのAZに6つのコピーが保存
- 最大15のリードレプリカ
- S3への継続的バックアップ
- ポイントタイムリカバリ

# **Amazon DynamoDB**

- フルマネージド型の非リレーショナル NoSQL DB
- 専用
- サーバーレス
- Auto Scaling
- 低レンテンシー
- 細かなアクセスコントロール
- 1日あたり最大10兆件のリクエストまでスケーリング

### **Amazon Redshift**

- RDB
- ビッグデータ分析特化型
- データウェアハウス - 履歴分析に特化
- ペタバイト規模のデータを扱える

### **AWS DMS (Database Migration Service)**

- リレーショナルデータベース、非リレーショナルデータベース、およびその他のタイプのデータストアを移行
- ソースとターゲットのデータベース間でデータを移動し、移行中も通常通り運用可能
- [ソースとターゲットのデータベース](https://aws.amazon.com/dms/resources)は同じタイプでも異なるタイプでも使用可能
- 異種DBへの移行の場合はAWS Schema Conversion Toolを使用し、データベーススキーマを変換してからAWS DMSを使用して移行する。
- ユースケース
    - 開発およびテスト環境でのDB移行
    - DBの統合
    - 継続的なレプリケーション


### **Amazon ElastiCache**

- データベースの上にキャッシュレイヤーを追加して一般的なリクエストの読み取り時間を短縮するサービス
- アプリケーションのリアルタイムな高速処理に利用可能
Ngrokのドメインを固定してDockerで立ち上げる方法

**メニューのDomainsに移動します**

<img width="248" alt="image.png (21.8 kB)" src="https://img.esa.io/uploads/production/attachments/5658/2024/02/28/145821/41c7e151-bc9e-4ce9-bde1-3c9e53cc3b4e.png">

**New Domainをクリックします**
無料プランでは１つしか作れないです

<img width="1204" alt="image.png (89.8 kB)" src="https://img.esa.io/uploads/production/attachments/5658/2024/02/28/145821/6ab9bf3c-dbb8-424c-92d3-a4471e7a7fe9.png">

**Domainを１つもらいました。**
![스크린샷 2024-02-28 오후 7.02.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3256444/bc980901-7f2f-38ba-66dd-4d43560d7fe5.png)


**docker-compose.ymlのservicesにngrok container追加**
```docker-compose.yml
    ngrok:
        image: ngrok/ngrok:latest
        ports:
            - 4040:4040
        volumes:
            - ./ngrok.yml:/etc/ngrok.yml
        environment:
            NGROK_AUTHTOKEN: ${NGROK_AUTH_TOKEN}
            NGROK_CONFIG: /etc/ngrok.yml
```

**docker-compose.ymlと同じディレクトリにngrok.ymlを作ります**
```ngrok.yml
tunnels:
  website:
    addr: web
    basic_auth:
      - "user:password"
    schemes:
      - https
    host_header: "domain"
    inspect: false
    proto: http
    domain: domain
version: 2
```

 DockerのBuildをし直す
```
docker compose build
```

終わりです〜！
WordPress.com でホストする Web サイトにも SPF, DKIM, DMARC を設定しましょう


## はじめに

DMARC を設定しレポートを確認したところ WordPress.com でホストする Web サイトからメールが送信されていることがわかりました。
WordPress はインストールしたプラグインがメール送信を行う場合があります。WordPress.com でホストする Web サイトにも SPF, DKIM, DMARC を忘れずに設定しましょう。

## 設定する SPF, DKIM, DMARC

[Set Up Email Authentication For Your Domain – WordPress.com Support](https://wordpress.com/support/set-up-email-authentication-for-your-domain/) に設定する SPF, DKIM, DMARC が記載されています。

### SPF

すでに SPF レコードが設定されている場合は既存の SPF レコードに追加してください。

| Type | Host | Value                                 |
| ---- | ---- | ------------------------------------- |
| TXT  | @    | v=spf1 include:\_spf.wpcloud.com ~all |

### DKIM

| Type  | Host                 | Value                             |
| ----- | -------------------- | --------------------------------- |
| CNAME | wpcloud1.\_domainkey | wpcloud1.\_domainkey.wpcloud.com. |
| CNAME | wpcloud2.\_domainkey | wpcloud2.\_domainkey.wpcloud.com. |

### DMARC

WordPress.com のサポートページには下記設定例が記載されていますが、環境等に応じて適切な設定を行ってください。

| Type | Host    | Value             |
| ---- | ------- | ----------------- |
| TXT  | \_dmarc | v=DMARC1; p=none; |

https://support.google.com/a/answer/2466563

## Ref

https://wordpress.com/support/set-up-email-authentication-for-your-domain/

https://blog.postmaster.yahooinc.com/post/730172167494483968/more-secure-less-spam

https://support.google.com/a/answer/81126?hl=en
ChatGPT活用　プロンプト記号

## メッセージに１工夫する
```
# 前提条件
あなたは{# 役割}です。{# 制限条件}を必ず守り、{# 入力文}の入力に対して、{# 形式}の形で出力してください。
{# 出力例}の出力例も記述があれば参考にしてください。
# 役割
くだものの専門家
# 制限条件
初めに"あ”が付くくだもの
# 形式
～のサラダ
# 入力文
新しいサラダを作りたい。珍しいくだものを組み合わせたサラダを作って
１０個作って
# 出力例
れもんといちごのサラダ
とりにくとごーやのサラダ
```
出力結果
```
アボカドとアセロラのサラダ
アンズとアロニアのサラダ
アップルマンゴーとアケビのサラダ
アカボクとアマルーラのサラダ
アケビとアサイーのサラダ
アブリコットとアマゾンカカオのサラダ
アンデスベリーとアフリカンマンゴーのサラダ
アラサとアイスクリームビーンのサラダ
アメリカンチェリーとアテモヤのサラダ
アシタバとアロエのサラダ
```

プログラムをかじったことがあればどんなことが出来るかわかると思う。
## 追加で選択肢の例

```
果物を一つ選んでください[りんご/いちご/みかん]
```
出力結果
```
選んだ果物は「りんご」です。 ​
```

## メモ書き
ChatGPT公式としてどんなプロンプトが使えるのかドキュメントが見つからなかった。知っていたらだれかおしえて。＃についても必ず単語のくくりや、タイトルとして使用するのではなく、文章の中でどのようにつかわれているのか分析して使っているらしい。かっこについても{}これで囲われた条件がマクロのように使われているかは不明。
利用する時はその点を踏まえてつかってね。
以上。
[Vim入門②] 横の移動をマスターしよう

# はじめに
:::note info
この記事はVim入門シリーズの第2弾です。 第1弾は[コチラ](https://qiita.com/rolzy_j/items/300477b85d400f95e47c)
:::

今回はVim入門シリーズ第2弾、横の移動について徹底解説していきます！

# おさらい
さて、前回はVimの4つのモードについて解説しました。
その中で、**h, j, k, l** キーで移動できることについて軽ーく触れました。

hキーで左に一文字移動、lキーで右に一文字移動でしたね。

しかし、ちまちま一文字移動してたら日が暮れてしまいますね。
こんなんじゃVim使ってドヤれません。 

今回は、もっと早い横への移動方法を3つ、ご紹介します。

# 横の移動その1: 回数を指定する
Vimでは、 **移動コマンドの前に回数を指定** することができます。
![Vim](https://rolzy-blog-assets.s3.ap-southeast-2.amazonaws.com/general-images/2024-02-28-Vim-Nyuumon-2/5l10h.gif)

例えば、`l`を使って右に移動する場合、`10l`と打つと右に10文字移動できます。
l押しっぱなしにするよりちょっと早いですね。

しかし、回数が指定できるからと言って、「移動したい文字ってここから何文字だろう」ってなりますよね。

例えば、「文末の句点はここから何文字だろう」なんて考えてると辛いものがあります。
文字をいちいち数えてるとかえって遅いですよね。なので、これはあまり使われないです。

# 横の移動その2: 単語で移動
Vimでは、`w`で次の単語に移動し、`b`で後ろの単語に移動できます。
![](https://rolzy-blog-assets.s3.ap-southeast-2.amazonaws.com/general-images/2024-02-28-Vim-Nyuumon-2/wandb.gif)

これ、英語を使ってる場合は有用です。`h`と`l`を連打するよりちょっと早くなります。
また、このコマンドも回数指定できるので `3w`で三つ先の単語に移動できたりします。

英語の場合、単語は空白で区切られてるので見分けがつきやすいですよね。パッと近くの単語に移動したい場合に便利です。

問題は日本語を使ってる場合。一応、Vimは日本語が申し訳程度にわかるみたいで、それなりに単語を横断していきます。しかし、その精度はお世辞にもいいとは言えないです。しかも、日本語はスペースの概念がないので回数指定が難しい。
![](https://rolzy-blog-assets.s3.ap-southeast-2.amazonaws.com/general-images/2024-02-28-Vim-Nyuumon-2/wandb_japanese.gif)

Vimで英語書いてる時はよく使うコマンドです！

# 横の移動その3: 文字を検索
Vimでは、`f`で先の文字を検索し、`F`で後ろの文字を検索できます。
![](https://rolzy-blog-assets.s3.ap-southeast-2.amazonaws.com/general-images/2024-02-28-Vim-Nyuumon-2/fpFA.gif)

`f`ind の `f` ですね。

`f`または`F`を打った後に移動したい文字を打つと、その文字に移動してくれます。

また、行の中に検索した文字が複数ある場合は、`;`で次のヒットに移動、`,`で後ろのヒットに移動できます。

これがすごく便利で、横移動はもっぱらこれで行います。文字は指定が楽なので、字数や単語数で移動するより簡単ですし、一度に移動できる距離も長いです。

# その他使えるやつ
## 行端への移動
- `0`で行の先頭に移動できます
- `_`で行の先頭の文字に移動できます
- `$`で行の末尾に移動できます
![](https://rolzy-blog-assets.s3.ap-southeast-2.amazonaws.com/general-images/2024-02-28-Vim-Nyuumon-2/zero_$.gif)

行端に移動することは頻繁にあるので、移動を早くしてくれるこれらは覚えておいて損はないです！

# ビジュアルモード中の移動
今日紹介した移動コマンドは、ビジュアルモード中にも使えます！

- `vfy` -> 次のyまで選択
- `d3b` -> 後ろ3つの単語を削除
- `yFo` -> 後ろのoまでコピー
- `d$`行の末尾まで削除

![](https://rolzy-blog-assets.s3.ap-southeast-2.amazonaws.com/general-images/2024-02-28-Vim-Nyuumon-2/tricks.gif)

このように、今日紹介した横の移動だけでも、編集コマンドとの組み合わせは多彩にあります！
コンビネーションを駆使できればどんどん編集スピードが速くなりますよ！

# 終わりに
この記事では、Vimでの横の移動について紹介しました！

次回は縦の移動について詳しく掘り下げていきます!
Denoってなに？試しに使ってみよう

2か月前に投稿してそのまま放置してました。
~~まあUbuntuやらなんやらで遊んでただけですがね~~
さて本題に戻って、今回はDenoってなに？って人向けに簡単に説明を書きます。

# Denoとは
Node.jsの作者のライアン・ダールがJSConf EU 2018での公演「Node.jsに関する10の反省点」で発表されたJavascirpt・Typescirptのランタイムです。


# インストール方法
Windowsは
```powershell:PowerShell
irm https://deno.land/install.ps1 | iex
```
Mac・Linuxは
```sh:Bash
curl -fsSL https://deno.land/install.sh | sh
```
のコマンドを実行するとインストールされます。

# 実際に使ってみよう
:::note warn
自分が使っているDenoのバージョンはv1.41.0です。
なのでバージョンが上がるにつれ動かなくなる可能性があります。
:::
まずDenoを実行してみましょう。
```
deno run --allow-net --allow-read https://deno.land/std@0.217.0/http/file_server.ts
```
とすると(多分)localhost:4507にアクセスするとファイルサーバーにアクセスできるようになります。

次は自分でTypescriptのコードを書いて実行してみましょう。
```typescript:index.ts
Deno.serve((_request: Request) => {
  return new Response("Hello, world!");
});
```
と書いて、
```
deno run --allow-net index.ts
```
で実行してやるとlocalhost:8000にアクセスするとHello, world!と表示されるはずです。

# Node.jsとDenoの違い
### 1.Denoはpackage.jsonやらなんやらがない
Node.jsにはpackage.jsonでごにょごにょしたりnode_moduleが必要ですがDenoにはなんとありません。
なぜならDenoにはパッケージ管理システムが組み込まれているのでnpmとかが必要ないのです。

### 2.Typescriptが使える
Node.jsで使うにはコンパイルとかいろいろしないといけなかったのがDenoはそのまま実行できます。
もちろんJavascriptも使えますけどね。

### 3.セキュリティが強くなった(語彙力)
Denoは--allow-netなどのフラグを使わないとファイルやネットワークにアクセスできないようになっています。
フラグがなくても動くには動くのですが、実行前に権限がないから権限付与するかい？的なことが聞かれるようになりました。

### 4.Web標準の互換性がある
DenoはWeb標準の互換性があります。
例えば
HTTPリクエストはfetch、WebSocketサーバーと接続するならWebSocketオブジェクトなど。

### 5.一応npmも使える
Denoはnpmも使えます。
Denoでパッケージをinportするときにnpm:<パッケージ名>@<バージョン>と指定してやるとnpmのパッケージが使用できます。
全部が全部対応しているわけではないですが、主要なパッケージはほとんど対応しています。

他にもいろいろありますがこんなもんでしょう。

# おわりに
Node.jsの記事は大量にあるのにDenoの記事があまりなかったのでこの記事を書きました。
まだまだNode.jsには届きませんがDenoのことを知ってもらえたら嬉しいです。

# 参考にしたサイト

https://zenn.dev/uki00a/books/effective-deno/viewer/what-is-deno
きーた　初投稿

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;

@SpringBootTest
@AutoConfigureMockMvc
public class MyControllerIntegrationTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void testProcessInput() throws Exception {
        String userInput = "Test Input";

        mockMvc.perform(MockMvcRequestBuilders.post("/processInput")
                .param("userInput", userInput))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.view().name("result"))
                .andExpect(MockMvcResultMatchers.model().attribute("userInput", userInput));
    }
}
SQL Serverによるデータウェアハウス設計ベストプラクティス

## はじめに
DWHシステム用途に限定したSQL Serverのベストプラクティスを記述しています。
想定されるDWHシステムの特性は以下のとおりです。
・利用者からのアクセスは参照のみ
・バッチ処理でデータを更新
・データ量が多い
・可用性のレベルは高くない
なおSQL Serverのバージョンは2017を前提としています。

## 目次
・テーブル
・パーティション
・インデックス

## テーブル
テーブルを作成するには以下に基づいて、データ型の選択・制約を設定する必要があります。

整数型もしくは日付型を選択することで、テーブルの結合列が有利になり、実行プランにおいて高速なBITMAPフィルター操作となる可能性が高くなります。
文字列のデータ型はUNICODEデータ型nchar,nvarcharを選択することでSSAS,SSRSではUNICODEデータ型だけのサポートを受けられます。
SSISもUNICODEデータ型への自動内部変換のオーバーヘッドが発生します。
また列ストア圧縮をすることでUNICODE圧縮機能が有効となるため、データベース上のサイズに関しては問題提起されることはありません。

ファクトテーブルの制約に関しては以下のようになります。
主キー制約・外部キー制約は更新性能に影響があるため、定義しない方が好ましいです。主キー制約が使用できない代わりに一意性はETLの実装によって確保されます。ETLが障害により異常終了した場合、障害の原因を除去し再実行すれば問題のない状態に戻せるように実装する必要があります。
既存のUpdateや新規行のInsertの場合、更新内容をそのまま再実行しても問題はないですが、更新するSQLがInsertだけの場合、Insert前に更新データの論理キーに一致する行をDeleteする必要があります。

## パーティション
1つのテーブルのデータの格納場所をテーブルの範囲などで分割する処理のことです。パーティーションを使用することでDBのパフォーマンスが良くなることが見込まれます。
以下ファクトテーブルをパーティション分割する場合の特徴を記載します。

【時間軸でファクトテーブルをパーティション分割する場合】
・インデックスなしでスキャンする範囲を絞り込むことが可能
・パーティション単位のTruncateが可能
・パーティションあたり100万行以上
・クラスタ化列ストアインデックスの最適行数に適合させる
・パーティション単位でファイルグループを分けない
・データファイルのI/Oが均等に分散できない
・パーティションスキームで1つのファイルグループだけを指定する

※パーティション化したテーブルのイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2753500/b622e5ec-0f22-3e56-b546-196954d2d1cf.png)


## インデックス
インデックスとは、テーブルの特定の列に対して作成されたデータ構造で、データの検索や並び替えを高速化するために利用されるデータベース管理の仕組みの１つです。
SQL Serverではテーブルと一体となったインデックスに「クラスタ化」という用語を頭につけます。
例:)
・クラスタ化インデックス 行ストアテーブル
・クラスタ化列ストアインデックス = 列ストアテーブル

クラスタ化列ストアインデックス（列ストアテーブル）とはDWH用途に適した機能です。行ストアと比較して集計操作を伴うクエリーの高速化と列単位の圧縮による高い圧縮率の実現とそれによるI/Oの削減とメモリの有効利用やSelect句で選択された列だけを処理することによる所要リソースの削減、列が格納されるセグメント管理情報に列の値のmax,minを保持することによる高速フィルターが可能となっています。

クラスタ化列ストアインデックスの更新ではInsertまたはDelete操作が可能です。Update分の実行時は内部的にDelete/Insertを使用しての更新となります。
約100万行単位で行グループおよび列セグメントを構成し約10万行未満の一括挿入は行ストア形式のデルタストアに格納され、デルタストアが約10万行を超えると列セグメントに自動変換されます。インデックスが定義された行ストアテーブルよりも Insert 処理が高速であることも特徴です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2753500/5c0b1363-bee4-b80e-d5da-240b0cf8f7ac.png)

インデックスのベストプラクティスとして以下テーブルを利用することが好ましいです。
【ファクトテーブル】
・100万行以上のテーブルにクラスタ化列ストアインデックスを作成する
・主キー制約・外部キー制約は更新性能に影響があるため、定義しない方がよい
・一意性はETLの実装で担保する
・非クラスタ化インデックスは使用しない
・対象範囲の行数が多い集計クエリーでは実行プランで使用されない可能性が高い
・更新性能への影響と圧縮効率低下によるデータサイズ増大
【ディメンションテーブル】
・主キー制約を定義し、主キー列にクラスタ化インデクスを作成する

## 最後に

株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area
No module named 'utils' デバッグ

## エラー内容
pythonで実行したところ，以下のエラーが発生した．

``` shell:エラー内容
Traceback (most recent call last):
  File "parser.py", line 11, in <module>
    from utils.helpers import get_conf
ModuleNotFoundError: No module named 'utils'
```

## 使用している環境

今回は ROS は関係ありませんが，一応載せます．

- 使用PC: Jetson AGX Orin
- JetPack: 5.1.2
- CUDA: 11.4
- cudnn: 8.6
- python: 3.8
- tensorflow: 2.12.0
- ubuntu 20.04
- ROS noetic

## 原因： import 方法が違った

正しくは，`getconf`をインポートすべきだった．

``` shell: ライブラリをインポート
pip3 install getconf
```

コード上では，
``` python: script.py
import getconf
```
と記述する．

## 終わりに
メモとして投稿しました．
データセキュリティ要件のためのマインド

# 主張
データ利活用のためInformationビューのあとのデータには、
品質指標の定義ができた方がデータ観点での品質考慮もできていい。
基本的に考察結果から、大体いまのUAFと同じ構成配置になると考えられる。
以下で言うデータとは業務データと分析データ両方のことを指す。

# 背景
最近品質保証や品質管理について興味関心が強く、
その中のセキュリティについても探究心が強くなってきた。
というのもあらゆるものが繋がる世界においては、
セキュリティは単なる品質の１つという枠だけでなく、
必ず考慮しなくてはならない横断的関心事だと痛感してきたからである。
しかしながらセキュリティをただ強めればいいってもんでもなく、
強くし過ぎたがためにコストがかかりまくる、
データの利活用がしにくいといった事態に繋がって、
それが上位の目的を阻害してしまっては、何のためにセキュリティを強化したのか本末転倒になってしまう。

# 戦略的セキュリティ設計
あらゆるデータに対して一様にセキュリティを高めるというのは、
コストも無駄遣いしてしまうし、データによって利便性高くあってほしいもの、
そうではないものとまちまちであるはずだ。
そのため、データごとにセキュリティの強さはメリハリを持たせた戦略的設計が重要である。
さらには、法律の変化やステークホルダーの関心の変化などによって、
当然データに求められるセキュリティの強さなども変わってくる。

ここでいろんなデータが大量にあるとそのメンテコストもかかってくるし、
データの構造だって当然変化していくもの。
不要なデータが残ったままでは、それのメンテする必要性が出てきたり、
それによって本当に重要なデータ群に対する再設計にかかる労力などのコストが足りなくなってしまいかねない。

そこでセキュリティのそもそものWhyにあたる考察、
こんなデータはどの程度重要であり、決して悪用されることは許されない。
などを考えるデータの観点での企画～要件定義に立ち返ることにした。

# データの企画～要件定義
データ構造も動的構造と一緒で、上位概念ほど安定していて、
下位の具体レイヤーに行けば行くほど変化が起こりやすい不安定な構造になっていることが
メンテナンス性が高いといえる。(データクリーンアーキテクチャと呼ぶことにする)

まずそもそもデータの制約
・一般データ保護規則
・消費者プライバシー法が前提制約としてある。

この制約をもとにして、データの観点でのAsIs-ToBeやリスク分析が必要である。

これもまた各種データがどのような能力値(加工のしやすさ、想定される利活用頻度)
があるべきなのか？　
このデータは特に重要であり、閉じた領域でのみ活用したいのか？
それとも他の限られた領域にも相互展開していきたいものなのか？
といった品質特性の考察や、実際にそのデータを採取しようとするとコスト的に可能なのか？

仮説でもいいからそのデータを採取して利活用することで、どのくらいの利益を生むと考えられるのか？
といったことまで考察するだけでなく、
データフロー図などを用いて、データに対する脅威シナリオを想定したうえで、
リスク分析結果からデータのセキュリティを利便性などの他の観点と考慮したうえでデータの要件定義を行う。

もちろん、データも変えていかなくてはならないので、
事前に「この数値をこの頻度で下回ってきたら、データアーキテクチャの再検討をする」
「法律の改定といった前提条件が変わったら再検討する」
という運用面での要件定義も事前にしておくことが重要である。

# データのリスク分析
先にKPIツリーを作成しておいて、データの構造のベースを作成しておく。
そのうえで、「このデータは今までにないうちだけのブランドを表す変数であるため、
他に漏らしたくないものである」といったものや、
「このデータが流出または悪用されたら、甚大な被害が発生する」
「不整合が起きたことで甚大な混乱が起きる」という脅威シナリオの分析をしてみる。

これもあらゆる脅威シナリオを検討するのではなく、
あくまでも脅威自体の発生頻度の多さ、経営へのインパクトの大きさ、
そのデータ自体の現在の脆弱性といった考察の上で、ピンポイントで重要な脅威シナリオに専念するべきである。

脆弱性っていうのは、結局どの程度セキュリティが高くあってほしいのか？
というToBeと、現在のそのデータ自体のセキュリティの強さAsIsによって決まってくる。
ここのギャップがさほどない所をコストかけて脆弱分析したところであまり意味はないからだと考えている。

## データの品質特性同士のトレードオフ
データの品質には代表的なものとして、CIAがあげられる。

<img width="300" alt="illust001.png (11.2 kB)" src="https://img.esa.io/uploads/production/attachments/5827/2023/08/28/135213/fbdf9117-af41-4caa-9f9c-b06e4362a1a8.png">

これらは互いにトレードオフな部分がある。


# データ面の運用
データの要件が決まれば、その要件を本当に満たせているのか？
常に監視できるように、何を監視すればいいのか？まで事前に定義しておく。
「本当に当初の想定の範囲内の利用頻度なのか」
「本当に当初の想定の範囲内の加工のしやすさなのか」
「本当に当初の想定の範囲内のリスク軽減ができているのか」
「この領域は当初の想定のように同時にデータ構造が変更されるか」
「統制の甘さによって、内部のユーザによって予期せぬ使われ方をしていないか」
「データのコンテキストを分けてしまったがために予期せぬ不整合は起きていないか」
といった重要なデータにおける品質が保証されてるのか？を監視する。
想定してた脅威と思われる者以外からの予期しなかった悪用の監視も必要である。

この辺は別にデータ観点特有の考え方でなく、一般的なリスク分析と同じ考え方だ。

# データガバナンス
データの脅威分析が終わったら、今度はその分析結果をもとに
データ観点でのルール決め、データガバナンスを定義しなくてはいけない。
そのビジネス固有のデータ観点でのルール決めである。
それによってリスクの回避や軽減をできる仕組みをデータの側面でも作成するのが、
このデータガバナンスの目的である。

ここでの考え方もリスコフの置換原則を思い出してほしい。
下位特有のルールが、より上位のルールに従っていない、
リスコフ置換原則違反を起こしていないかのチェックはマストである。
データの側面でもこの設計思想は引用できると考えている。
IAMユーザへのMFA認証設定手順

# はじめに
IAMユーザーへのMFAの設定方法について、自分用のメモを兼ねて記載しておきます。
※本記事は2024年2月時点での手順となります。
# 前提
・IAMユーザーが作成済みであること
・スマートフォンなどのデバイスにAuthenticatorのアプリがインストールされていること
※この手順ではMicrosoft社の「Authenticator」を使用しています。
# MFA認証の設定方法
AWSのマネジメントコンソールにログインし、検索窓で「IAM」と検索します。
「IAM」を押下し、ナビゲーションペインの「ユーザー」を押下し
ユーザーの一覧から対象のIAMユーザー名をクリックします。

「セキュリティ認証情報」タブを押下し、「多要素認証(MFA)」のフィールドの
「MFAデバイスの割り当て」を押下します。
<img width="500" alt="スクリーンショット 2024-02-21 141530" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/5949520e-dbb4-bfd0-b7de-c0c076decac4.png">

MFAデバイスを選択する画面が出てくるので「デバイス名」を入力します。
ここで入力したデバイス名がデバイス側にも表示されます。
今回の手順では「Authenticator app」を選択し、右下の「次へ」を押下します。

<img width="500" alt="スクリーンショット 2024-02-21 141616" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/5b89ef83-f22e-1717-5bdd-42d949c48742.png">

デバイスの設定画面に変わります。

<img width="500" alt="デバイスの設定2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/fbf71694-22a7-0e7c-750e-4dad90fab34f.png">

「QRコードを表示」を押下しQRコードを表示させます。

続いてデバイス(Authenticator)側の作業になります。
1.「Authenticator」アプリを起動
2.ホーム画面右上の「＋」を押下
3.アカウント追加(個人・職場または学校のいづれか該当するもの)を選択
4.「QRコードをスキャン」を押下
5.AWSマネジメントコンソールに表示されているQRコードを読み取る
※デバイス側の作業はここまで。

IAMユーザー情報がデバイス(Authenticator)側に追加されるので、30秒毎に更新される
6桁のコードを「MFAコード１と2」の欄に入力し、右下の「MFAを追加」を押下します。
※MFAコード欄には別々のMFAコードを入力します。

設定が完了すると「セキュリティ認証情報」タブの「多要素認証(MFA)」のフィールドに
デバイスが登録されます。
設定終了後に実際にIAMユーザー側でログアウト/ログインを試して問題なければ
作業完了となります。
[tips]masterかmainか確認せずデフォルトブランチでrebaseしたい

何かのリポジトリで作業している際、最新の`master`ブランチに追従したい場合このようなコマンドを使うことは多いと思います。

```sh
git fetch && git rebase origin/master
```

ただ、現在GitHubの新規に作成されたリポジトリのデフォルトブランチは原則`main`です。

https://github.blog/changelog/2020-10-01-the-default-branch-for-newly-created-repositories-is-now-main/

２０２０年にこの変更が行われた結果、デフォルトブランチが`main`と`master`両方存在してしまっている組織は多いと思います。
自分でなんとかできる範囲のものなら統一するように動けば良いですが、範囲外の場合確認する必要があります。

## デフォルトブランチを確認するだけなら `git remote show origin | grep 'HEAD branch' | awk '{print $NF}'`

こちらのコマンドはブランチ一覧から`HEAD branch`(デフォルトブランチ)を抜き出しています。[^1]
抜き出した状態だと、`HEAD branch: master`のような文字列になっているため、`awk`コマンドの`$NF`オプションを利用してブランチ名だけを取れるようにします。[^2]

```sh
git remote show origin | grep 'HEAD branch' | awk '{print $NF}'
# デフォルトブランチ名が出力される
```

## 一行でrebaseまでしたい場合は`$()`で囲ってあげる

確認だけじゃなくて、rebaseまでしたい、という場合は`$()`を使って先ほどのコマンドを発展させます。

```sh
git fetch && git rebase origin/$(git remote show origin | grep 'HEAD branch' | awk '{print $NF}')
```

`$(git remote show origin | grep 'HEAD branch' | awk '{print $NF}'`の出力を、rebaseした際に利用するため、こちらのコマンドを利用することによってデフォルトブランチでrebaseされます。

### aliasにする時は$の前にバックスラッシュをつけよう

「よし、じゃあこのコマンドをaliasに登録しよう」と`.zshrc`などに以下のように書き込みターミナルを開き直すとエラーメッセージが出ます。

```sh
alias rbdb="git fetch && git rebase $(git remote show origin | grep 'HEAD branch' | awk '{print $NF}')" 
```

aliasに登録する際は、コマンドが即時実行されないようにする必要がありますが、$が存在することによって`git remote show origin | grep 'HEAD branch' | awk '{print $NF}` が`.zshrc`を読み込んだ時に実行されてしまいます。

この時は以下のようにして、$の前にバックスラッシュを置いてエスケープをすることで回避できます。

```sh
alias rbdb="git fetch && git rebase \$(git remote show origin | grep 'HEAD branch' | awk '{print \$NF}')"
```

## 参考
[^1]:[git コマンドでデフォルトブランチ名を取得する #Git - Qiita](https://qiita.com/ymm1x/items/b22bddc9fbc192ae1a70)
[^2]:[awkガナス - 組み込み変数NF(フィールド数) NR(行番号) | 株式会社創夢 — SOUM/misc](https://www.soum.co.jp/misc/awk/4/)
Node.jsでHTML、CSSを反映させる（自分用メモ）

# はじめに
ポートフォリオ用にウェブサイトを作りたいけどやり方が分からねぇってことで勉強したことをまとめました。最初の導入部分的なことしかまだわかっていませんが、もし似たようなことをしたくて困っている人の助けになればと思います。

# 1.プロジェクトを作成
（最初はNode.jsの導入をする必要があります）
ターミナルにて好きなフォルダに行く
```
cd プロジェクトファイル
```
package.jsonの作成
```
npm init
```
express（モジュール）をインストール
```
npm install  express --save
(npm install モジュール名 オプション)
```

こんな感じにファイルを置く（by ChatGPT）
GPT先生は偉大
```
プロジェクトフォルダ/
│
├── node_modules/             # npmによってインストールされたモジュール
│
├── public/                   # 静的ファイルを格納するディレクトリ
│   ├── css/                  # CSSファイル
│   │   └── style.css
│   │
│   ├── js/                   # JavaScriptファイル
│   │   └── script.js         #今回は使わない
│   │
│   └── index.html            # HTMLファイル
│
├── server.js                 # Expressサーバー設定ファイル
│
├── package.json              # プロジェクトのメタデータと依存関係
│
└── package-lock.json         # 正確なツリーを記録するためのファイル（npmが自動生成）

```

# 2.いい感じにコードを書く

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>ポートフォリオ</title>
    <link rel="stylesheet" href="css/style.css" type="text/css">
</head>
<body>
    <header>
        <h1>ポートフォリオ</h1>
    </header>
    <main>
        <section>
            <h2>スキル</h2>
            <p>ここにスキルに関する説明を書きます。</p>
        </section>
        <section>
            <h2>リンク</h2>
            <ul>
                <li><a href="https://github.com/あなたのユーザー名">Github</a></li>
                <li><a href="https://qiita.com/あなたのユーザー名">Qiita</a></li>
            </ul>
        </section>
    </main>
    <footer>
        <p>© 2024 あなたの名前</p>
    </footer>
</body>
</html>

```

```style.css
/* 全体のフォント設定 */
body {
    font-family: Arial, sans-serif;
    line-height: 1.6;
    margin: 0;
    padding: 0;
    background-color: #f4f4f4;
}

/* ヘッダーのスタイル */
header {
    background: #333;
    color: #fff;
    padding-top: 20px;
    min-height: 70px;
    border-bottom: #0779e4 3px solid;
}

header h1 {
    color: aqua;
    margin: 0;
    padding-left: 20px;
}

/* メインコンテンツエリアのスタイル */
main {
    padding: 20px;
}

section {
    margin-bottom: 20px;
}

/* フッターのスタイル */
footer {
    background: #333;
    color: #fff;
    text-align: center;
    padding: 10px;
    position: fixed;
    bottom: 0;
    width: 100%;
}

/* リンクのスタイル */
a {
    color: #0779e4;
}

a:hover {
    color: #0336bf;
}
```

```server.js
const express = require('express');
const app = express();
const port = 3002;

// publicディレクトリを静的ファイルのルートディレクトリとして指定
app.use(express.static('public'));

// ルートパスへのアクセスをindex.htmlにマッピング
app.get('/', (req, res) => {
  res.sendFile(__dirname + '/public/index.html');
});

// サーバー起動
app.listen(port, () => {
  console.log(`Server running at http://localhost:${port}/`);
});
```

# 3.実行する
ターミナルにてプロジェクトフォルダの中に入る
```
cd プロジェクトフォルダ
```
以下を実行する
```
node server.js
```
こんな感じの出力がされるのでリンクを開く
```
Server running at http://localhost:3002/
```
このようなサイトを開くことができたら成功です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/304d6939-3265-3a0a-d570-e600d132b4d4.png)
【XAMPP】Error: Cannot create file "xampp-control.ini" アクセスが拒否されましたの直し方

xamppでconfigの設定（Main Port）を変更し、Saveボタンをクリックしたら **Error: Cannot create file "xampp-control.ini" アクセスが拒否されました** のエラーが出てしまいました。


:::note alert
Error: Cannot create file "xampp-control.ini" アクセスが拒否されました
:::


「OK」を押しても設定は反映されますし、configボタンも滅多に触らないのでそこまで気になりませんが、せっかくなのでqiitaで備忘録として書き残します。


### エラーの原因
調べたところ、Main Port等などのポート番号や、ServerNameなどのconfigファイルの設定を変更した時に書き換えの権限などが許可されていない場合に出るようです。


### 対処法
xamppがインストールされているディレクトリにまで移動し、**xampp-control.ini** ファイルを右クリックし「プロパティ」を選択します。

![スクリーンショット 2024-02-28 172601.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3474232/0fd140c7-ef25-23a2-cd7c-0121282e4965.png)


セキュリティタブの編集ボタンをクリックします。

![スクリーンショット 2024-02-28 172818.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3474232/0e63c5db-ebf0-ae1b-86d7-84d9e82d7122.png)


「アクセス許可」の許可にチェックを入れます。

![スクリーンショット 2024-02-28 172901.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3474232/ffb81972-c780-9c87-95cb-05d315314ea5.png)

これで「OK」をクリックして設定は完了です。
エラーも消えました。
Rails x SQLite x Docker

## 前提
Ruby on Rails SqLite(Railsのデフォルト)の環境を作成
Ruby on Rails Tutorial等の学習目的にサクッと作成できる環境を目指したのが作成動機
ホスト側にRuby関連の環境が存在しない場合の構築手順

## 準備すべきファイル
```
docker-compose.yml
Dockerfile
entrypoint.sh
```

docker-compose.yml
```yml

services:
  app:
    build:
      context: .
      dockerfile: ./Dockerfile
    tty: true
    volumes:
      - ./:/myapp
    ports:
      - "3000:3000"
    environment:
      - TZ=Asia/Tokyo
```

```sh
#!/bin/bash
set -e 

rm -f /myapp/tmp/pids/server.pid

# RUN MAIN PROCESS
exec "$@"
```

```Dockerfile
FROM ruby:3.2.2

WORKDIR /myapp

COPY Gemfile* /myapp/

RUN apt -qq update && apt install -y build-essential

RUN gem update --system && \
    bundle install

COPY . /myapp

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]

CMD ["rails", "server", "-b", "0.0.0.0"]
```


## 手順
1 初めはDockerfileの内容を下記のみ残しそれ以外をコメントアウトする
```Dockerfile
FROM ruby:3.2.2

WORKDIR /myapp
```

2 docker compose build
3 docker compose run app bash
4 gem install rails
5 rails new . (Dockerfileの上書きの許可を求められるが今回は許可しないを選択)
6 exitでdockerコンテナから抜けてコンテナがdownしていることを確認
7 Dockerfileのコメントアウトを元に戻す
8 docker compose build
9 docker compose up(開発時のログを確認するため -dオプションは不要)

10 他のterminal windowでdocker compose exec app bash (開発時のコマンドはここで叩く)


## 終わりに
サクッと作れるDocker環境を持っておくと便利です。
shellでスクリプト化してrailssetupとかで自動作成されるようにすると便利そうですね。
環境構築 Ruby Rails

## はじめに
Railsを1年以上ぶりに触る過程でいろいろ気づきを得た
以前は勘違いしていた箇所や不要な処理もあったため書き直し

## 前提
HomebrewとxcodeのCommand Line Toolsはinstallされている前提とします。
まだの方は下記記事を参考にinstallしてください

https://brew.sh/ja/

https://qiita.com/SayCheeese/items/1b9db660917049bbad64

## rbenvのインストール
```shell
# rbenvのinstall (ruby-buildも自動でインストールされる)
# ruby-build:「rbenvのプラグインとしてrbenv installコマンドを使用できるようにする」
1 brew install rbenv

# rbenvが正常にインストールできたか確認
2 rbenv -v

# rbenvでinstallされたRubyを実行するためのPATHを通す
3 echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc

# rbenvの初期化(rbenvを現在のSHELLで有効化するためのコマンド)
# shimのPATHの設定, rbenvでの自動補完の有効化など、複数の効果がある
4 echo 'eval "$(rbenv init -)"' >> ~/.zshrc

# .zshrcを再読み込み
5 source ~/.zshrc
```
## Rubyのインストール
```shell
# install可能なRubyを一覧取得
rbenv install --list

# rubyのinstall
rbenv install <version>

# rbenvでinstallしたRubyの確認
rbenv versions

# 使用したいRubyを設定する
rbenv global <version>

# rbenvの設定を再読み込み (適切なversionのコマンドを利用可能にする)
rbenv rehash

# Rubyの設定を確認
ruby -v
```

## Ruby on Railsのインストール
```shell
# railsのinstall (global)
# versionを指定しない場合最新versinonがinstallされる
gem install rails -v 'version'

# 適切なversionのコマンドを利用可能にする (Railsコマンドが使えるように再読み込み)
rbenv rehash

# railsのversionを確認する
rails --v
```

## Railsの開始
```shell
# 新しいRailsのアプリケーションを作成
# applicationに必要なファイル群を生成し最後にbundle installを実行する
rails new myapp

# lockファイルに記載されたrailsで起動「bundle execをつけたのと同様」
# errorが出ない限りrail sでも大丈夫そう
/bin/rails s
```

## 終わりに
以前はRails界隈における2大勢力 --path vendor/bundle付ける派 vs 付けない派閥で付ける派だったのですが、bundlerのデフォルトの挙動がglobal installな点や参考資料のリンク先での主張を考慮してglobalで行こうと思います。
むしろlocal installしたことが影響してエラーにつながる経験を何度かした。

globalを汚染したくないのであればDocker化するのが良いかもしれません。

## 参考
[Pikawaka](https://pikawaka.com/rails/curriculums-wakatter-mac-env-rails6#4.rbenv%E3%82%92%E7%94%A8%E6%84%8F%E3%81%97%E3%82%88%E3%81%86)
[Ruby STUDIO eval "$(rbenv init -)が必要な理由とか](https://ruby.studio-kingdom.com/rbenv/guides/installation)
[pathいらないんじゃないか論](https://qiita.com/jnchito/items/99b1dbea1767a5095d85)
顔認証の実験をしようとしたら顔画像のデータセットの入手に困った話

## 顔画像のデータセット
ディープラーニングのモデルを顔画像で学習をしようと考え、顔画像データセットを探してみました。

探してみてわかったのは、顔画像データセットって結構少ないということです。

探せば、あることはあるのですが「学術研究用Only」だったり、制約が多かったりして使いにくい。

著作権的には、「[著作物を学習用データとしてAI開発に利用することは、著作物に表現された思想又は感情の享受を目的としない利用行為であるとみなされます](https://www.hitachi-solutions-create.co.jp/column/technology/ai-copyright.html)」ということで利用は問題ないのですが、**利用規約で学術目的以外NG**になっているやつは流石に使えません。

というわけで、ネットで顔画像データセットを探しました。

## Kaggleの顔認証データセット

いろいろ探した結果、Kaggleに使えそうな顔認証のデータセットがあったので紹介します。

ライセンスもCC0(Creative Commons License)でいい感じです。

データセットへのリンクは以下になります。

Kaggle : [Face Recognition Dataset](https://www.kaggle.com/datasets/vasukipatel/face-recognition-dataset)

|私はアカウントを持っているので普通にアクセスできましたが、もしかしたら、kaggleにログインしないとアクセスできないかもしれません。|
|:-|

データセットの概要は以下になります。

| | |
|:-:|:-|
|データセット名　| Face Recognition Dataset|
|画像枚数|2562枚
|人物数|31人
|画像種類|顔の切り出し画像と元画像の２パターン
|容量|約760MB

31人で2562枚なので、人あたり８０枚前後の画像が含まれている計算になります。


|データの中身を見ると俳優のBrad Pittの画像など含まれています。肖像権的には不味そうな気もしますが、機械学習に使う分には問題ないはず|
|:-|

###  ちょっとした実験には使えそう

枚数的に少し少ない気がしますが、個人の学習や実験用には十分だと思います。とりあえず、顔画像データが見つかったので、「顔認証」の実験にトライしたいと思います。

## scikit-learnの顔画像セット

scikit-learnにも顔画像のデータセットがあります（LFW）。

|This dataset is a collection of JPEG pictures of famous people collected over the internet, all details are available on the official website:http://vis-www.cs.umass.edu/lfw/|
|:-|

顔画像は、あらかじめ顔部分が切り出されています。
color=Trueを設定することで３チャネル（カラー）で画像を取り出せます。


### 顔識別用のデータセット
[sklearn.datasets.fetch_lfw_people](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.fetch_lfw_people.html)

顔画像と、IDがペアになったデータセットです。

### 1:1認証用のデータセット
[sklearn.datasets.fetch_lfw_pairs](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.fetch_lfw_pairs.html)

２枚の顔画像がペアになったデータセットです。

以下のコードで簡単に取り出せるのでちょっとした実験は楽です。

```python
from sklearn.datasets import fetch_lfw_people
lfw_people = fetch_lfw_people(min_faces_per_person=70, resize=0.4)
```

```python
from sklearn.datasets import fetch_lfw_pairs
lfw_pairs_train = fetch_lfw_pairs(subset='train')
```

## まとめ
もし、顔画像のデータセットで困っている方がいた場合に参考になればと思い書いてみました。

ここで紹介したデータセットを使って実験を行っています。実験内容については以下のブログ記事を参考にしてください
- [FaceNetとFaissで高速な1対Nの顔認証を実装してみる｜PyTorch](https://tech.aru-zakki.com/facenet-faiss-recoginition-test/)
- [PyTorchとFaceNetを使えば1対1の顔認証が手軽に作れる](https://tech.aru-zakki.com/facenet-pytorch-face-recoginition-1-1/)
mise で Nodejs を管理する環境で Playwright Test for VSCode 使用時にハマったこと

## はじめに

開発環境のパッケージ管理にいままで[pyenv](https://github.com/pyenv/pyenv)と[nodenv](https://github.com/nodenv/nodenv)と[asdf](https://asdf-vm.com/)と、と使用するパッケージに合わせて使い分けていたのですが、最近[mise](https://mise.jdx.dev/)で一元管理するように乗り換えました。

この記事では mise で Nodejs を管理する環境で VSCode の拡張である [Playwright Test for VSCode](https://marketplace.visualstudio.com/items?itemName=ms-playwright.playwright) が node を呼び出せないとエラーを出した時の対処方法を記述します。

## エラー内容

mise で Nodejs を管理する環境下で Playwright Test for VSCode を使用していると、以下のようなエラーをこの拡張機能が出ました。

``` console
Unable to find 'node' executable. Make sure to have Node.js installed and available in your PATH. Current PATH: '...'.
```

確かに Current PATH には `/Users/username/.local/share/mise/installs/node/18.15.0/bin` のような Nodejs のパスが含まれていませんでした。

## 原因

筆者の環境ではログインシェルに `zsh` を使用していました。この環境下で `mise` をアクティベートするために [mise のドキュメント](https://mise.jdx.dev/getting-started.html#_2a-activate-mise)に従って `$HOME/.zshrc` に以下のように記述していました。

``` shell
if command -v mise 1>/dev/null 2>&1; then
  eval "$(mise activate zsh)"
fi
```

この記述により、対話モードのシェルでは mise 管理下の Nodejs へのパスが `PATH` の環境変数に追加されます。しかし VSCode では、 `$HOME/.zshrc` を読み込まないため、 `PATH` の環境変数にmise 管理下の Nodejs へのパスが追加されません。

## 解決方法

[mise のドキュメント](https://mise.jdx.dev/getting-started.html#_2b-alternative-add-mise-shims-to-path)にあるように `shims` へのパスを `PATH` の環境変数に追加することで解決できます。この処理は対話モードのシェルでは不要のため、`$HOME/.zprofile` に以下のように記述します。

``` shell
if command -v mise 1>/dev/null 2>&1; then
  eval "$(mise activate --shims)"
fi
```

## おわりに

VSCode と Playwright Test for VSCode と具体的な環境によるエラーについて記述しましたが、 mise で管理する環境下で他のパッケージを ほかの IDE で使用する場合にも同様のエラーが発生する可能性があると思います。mise のアクティベートと shims を PATH に追加する処理を profile ファイルと rc ファイルそれぞれに記述することでエラーを回避できるかもしれません。

<!-- zenn article id: f9e8a2d1b8cb7b -->
技術トレンドの収集方法

### はじめに
新入社員でIT企業に就職しましたが、変化の速さに触れ、最新技術トレンドに対して、敏感になることの大切さを学びました。

そこで、自分自身も知識を常にアップデートできるように、
最新の技術トレンドや情報を集めるための方法をまとめようと思います。

## トレンドに敏感になることの重要性
トレンドや最先端技術を押さえることは、自己成長をはじめ今後のキャリアを広げることにも効果的です。

日々進歩を続けるIT技術のトレンドはもちろん、
IT以外の世間のトレンドにも敏感であると良いでしょう。
IT技術は様々な業界と結びつけることができるため、
世間のトレンドから新しいアイディアが生まれる可能性も秘めています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632608/7beb2c9c-61bb-c1e1-3e11-68866c444b3c.png)




## 情報収集のコツ　


### 1．複数の情報源を活用
１つの情報源だけでなく、ほかの情報源と照らし合わせることで、
情報の信憑性を確認することができます。

### 2．鵜呑みにしない
多くの情報に触れるだけでは情報収集力が高いとはいえません。
SNSや個人ブログなどは、間違った情報を発信しているケースがあるため、鵜呑みにしないことも大切です。
また、情報発信者の立場や意図を考慮して情報と向き合うことで、客観的に情報を分析できます。


### 3．目的を持って情報収集する
探す情報を明確にイメージしたうえで作業を行うと、
短時間で必要な情報が収集できます。
情報収集すべきタイミングを理解することで、
通常業務に負担にならない範囲で効率よく情報が入手できます。

### 4．日常的に情報収集する
スキマ時間を活用して情報収集するのも、1つです。
毎日決まった時間に情報収集することで、無理なく続けやすくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632608/c5cc9378-9ca6-004f-0145-6b6529255487.png)



### 5．アウトプットして情報を整理・精査する
情報を蓄積するだけでなく、アウトプットするスキルも必要です。
アウトプットをすることで、情報の取捨選択力や論理的思考力が高まります。
また、他者の反応を踏まえて、情報のブラッシュアップも可能です。
積極的にアウトプットをする人には、他の人も情報を共有したいと思うようになり、さらに情報が集まりやすくなるといった好循環が生まれます。

### 6．デジタルツールを使いこなす
ハッシュタグ検索や画像検索機能など、デジタルツールを活用すれば自分が求める情報を効率よく絞り込めます。
情報を整理・分類し、アウトプットする際も、デジタルツールが役立ちます。



## 情報収集ツール


### 情報サイト
- **日経クロステック**
日経BPが運営する技術系のニュースサイトであり、AIやIoTなど最先端の動向について発信しています。

https://xtech.nikkei.com/top

- **はてなブックマーク**
ユーザーがウェブページを保存・共有し、そのページに対するコメントやタグ付けを行えるソーシャルブックマーキングサービスです。
興味のあるトピックで人気のある記事を発見したり、同じ興味を持つコミュニティ内で情報を共有するのに適しています。

https://b.hatena.ne.jp/hotentry/it


- **SlideShare**
プレゼンテーション、ドキュメント、PDF、動画などをアップロードし、世界中で共有できるプラットフォームです。
ビジネス、教育、技術など様々な分野のコンテンツがあり、知識の獲得やアイデアの発信に利用できます。

http://www.slideshare.net/

### コミュニティ
- **connpass**
connpassは、勉強会やセミナー、イベントの企画・運営・管理を行えるプラットフォームです。
IT、プログラミング、デザイン、ビジネスなど多岐にわたるテーマのイベントが開催されており、自分の興味に合ったイベントを簡単に探せます。

https://connpass.com/dashboard/

- **techplay**
techplayは、技術系イベントの情報を集めたポータルサイトで、プログラミング、デザイン、スタートアップ関連の勉強会やセミナー情報を提供します。

https://techplay.jp/event/search

- **Qiita**
プログラマーやエンジニアが技術情報を共有するためのプラットフォームです。
コーディングのヒント、プログラミング言語やフレームワークの使い方、開発のベストプラクティスなど、実践的な知識が共有されています。

https://qiita.com/


### ソーシャルメディアを活用する
- **Twitter**
業界に精通したインフルエンサーをフォローすることで、無意識にアプリを開くだけで情報が入るようになります。
興味のあるものをより深堀することで理解が深まります。

- **YouTubeチャンネル**
YouTubeチャンネルを通じて提供されるコンテンツは、幅広い分野の情報収集に適しています。
無料でいつでもどこでもアクセスでき、手軽に知識を入れることができます。

## まとめ
情報収集に関する方法を探す中で、
情報は自ら積極的に収集しなければ得られないものの、
意外にも身近なところに豊富に存在していることがわかりました。
知識を更新する手段は様々で、自分に合った方法を選択できると感じます。

これを踏まえ、私はconnpassで開催されたセミナーに参加してみました。
その結果、学ぶべき知識だけでなく、社外の人々と交流することで、
視野が広がり、新たな発見や学びが深まることを実感しました。

今後も、自分に合ったツールを駆使して、
最新トレンドの把握や情報収集に励んでいきたいと思います。

## 参考文献

https://nkbb.nikkei.co.jp/km/usage/column-202307-006/

https://www.webstaff.jp/guide/trend/webit/2022trend_technologies/

https://www.sejuku.net/blog/60820#index_id0