OmniAICreator/Qiita-1.07M huggingface dataset:
画像のalt属性を自動で作ってくれるWebアプリを作ってみた

こんにちは。普段フロントエンドを中心にWeb開発をしている、あいすです。

突然ですが皆さん、画像のalt属性ってちゃんと設定していますか？
私も必要性は十分に理解できるものの、適切な文章を考えるコストがめちゃくちゃ高くて雑にやってしまっている事があります。。。

そこで、GPT-4oの力を借りて、画像から説明を生成してくれるWebアプリを作ってみました。

## 完成物

![AutoAltGeneratorの動作例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730661/6cde7506-e2c5-59ee-842a-a1b5f095a70e.gif)

以下のURLで確認できます:

https://aag.cho-ice.xyz/

## 技術構成

**Vite + TypeScript + Tailwind + Preact**

あえてPreactで行ったのは、小規模なSPAなので基本的なフックがあれば十分かな〜と思ったからです。

また、今回はサーバーを立てずに全てクライアントサイドで処理しています。これは、よくわからない個人のサービスに自分の画像を上げるのを躊躇う方も多いのでは？という考えからです。各自でOpenAI API Keyを用意してください。

## 動作例

![Auto Alt GeneratorというWebアプリのスクリーンショット。説明の生成部分には、公園の木々と芝生が夕日の光の中で映っている写真が表示されています。右側には生成された説明が表示されており、写真が天神岬スポーツ公園の風景を示していることが書かれています。](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730661/95f9e7f4-2904-505e-d0eb-ec28fe728a7d.png)

![Auto Alt GeneratorというWebアプリのスクリーンショット。説明にはチャーシュー、もやし、脂身などがトッピングされたラーメンの写真が表示されている。](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730661/8df123bb-4dcc-d169-ea23-f5ad84b57c63.png)

![Auto Alt GeneratorというWebアプリのスクリーンショット。会議中の写真で、3人の男性が机の前に座っており、1人が座席を外して何かを指示している。机の上にはノートパソコン、資料、飲み物、お弁当が並んでいる。](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730661/c9468aa8-f0a8-8c53-4980-7f1ca62322c2.png)

## プロンプト

そのままでもJSONが返ってきたので、JSONモードにはしていません。

```
私はWebデザイナーです。imgタグを使ってホームページで添付の画像を紹介しようと思ったのですが、alt属性に何を書けば良いかわかりません。
WCAGのガイドラインに沿って、「写真」「様子」「風景」など、画像の内容を簡潔な言葉で説明してください。
説明は以下のフォーマットで紹介してください。また、詳細な情報があればより良い説明ができる場合は、"status"を"need more infomation"にしてください。

altを生成できた場合
{
"status":"ok",
"alt":画像の説明
}

追加の情報があるとより適切なaltを生成できる場合
{
"status":"need more infomation",
"alt":画像の説明
}
```

## 画像の処理

大きすぎる画像はトークンを消費してしまうため、クライアントサイドで画像サイズを変換しています。

```tsx
const readImage = useCallback((file: File) => {

    // 対応ファイルの確認
    const avaivableTypes = ["image/png", "image/jpeg", "image/webp"]
    if (!avaivableTypes.includes(file.type)) {
      toast.error("対応していない画像形式です")
      return
    }

    try {
      // 選択画像を縦横比を保ちつつ横幅640pxにリサイズし、URLに変換
      const canvas = document.createElement("canvas")
      const ctx = canvas.getContext("2d")
      if (!ctx) return
      const image = new Image()
      image.src = URL.createObjectURL(file)
      image.onload = () => {
        canvas.width = 640
        canvas.height = (640 * image.height) / image.width
        ctx.drawImage(image, 0, 0, canvas.width, canvas.height)
        setImage(canvas.toDataURL("image/jpeg"))
      }
    } catch (e) {
      toast.error("画像の読み込みに失敗しました")
      console.error(e)
    }
  }, [])
```

## トークン使用量を表示する

画像の説明が生成されると、このような表示が行われます。

![生成された説明
テーブルの上に置かれたスマートフォンの画面に「こんにちは」というメッセージが表示されています。使用トークン数 (金額は目安)プロンプト:943 ($0.00472)生成:38 ($0.00057)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730661/26903d88-7a8d-fc64-d336-c76e0ed3c6b9.png)

OpenAIのAPIレスポンスには`usage`というキーが含まれており、その中に使用したトークン量が入っているので、それを表示することで生成にいくらくらいかかったのか可視化できます。

## 終わりに

画像の説明を書くのは結構大変ですが、生成AIが台頭してきてこういった解決方法も出てきたのは面白いと感じました！
ちなみに、MSEdgeではaltがない画像に自動で説明をつけてくれるようです。こういったブラウザの機能が標準化していけば、開発者・ユーザーのいずれもより便利な世の中になるかもしれないですね。
バンドラのすすめ

## バンドラとは何か
- Webアプリにおけるフロントエンド用のツール
- いろんなアセット（資産）をひとまとめにしてくれる

----
## バンドラが必要な背景
- Webアプリの複雑化に伴い、様々なフロントエンド技術が発達
CSSメタ言語／AltJS／Reactに代表される仮想DOMをベース技術とするフレームワーク　など
- しかしブラウザが理解する言語は相変わらずHTML/JS/CSSの３つ！

---
## バンドラの機能
- コンパイル：CSSメタ言語→CSS、やAltJS→JS、などの変換を実行
- HTMLの書き換え：コンパイルしたCSSやJSを参照すようにHTMLを書き換える
- 最適化：minify（最小化）／画像最適化　など
- 開発用サーバ

----
## HMR(Hot Module Replacement)
- 開発中にいちいち　**ビルド→Webサーバ再起動** という操作をしないといけないのは非効率極まれる
- そこでバンドラには、モジュールの変更を検知したら勝手にビルドしてHTML/JS/CSSを最新化してくれる機能が備わっているものが多い

----
## node.js/npm[or yarn]は必須
- バンドラを始め、フロントエンド開発に必要なツールの多くはnpmで提供される
- npmとは、node.jsのパッケージマネージャ
- npmはyarnに置き換えられつつある

----
## 具体的なバンドラは？
- Parcelがいちおし：とにかくお手軽

----
## 最後に
- フロントエンド開発にバンドラを導入し、堅牢なWebアプリを爆速で開発しましょう！
画像形式の使い分け

## はじめに
デザイナーさん向けに「用途によって画像形式を使い分けてね」というのを伝えたかったときのメモ。

## Web向け画像形式いろいろ
| 形式 | 画像種類 | 圧縮 | 色数 | 用途 | 透過 |
|:-:|:-:|:-:|:-:|:-:|:-:|
| JPEG/JPG  | ラスター  | 非可逆  | 1,677万色以上  |  写真向き	 | ×  |
| PNG  | ラスター  | 可逆  | 1,677万色以上  | イラスト向き（同じ色が連続している部分が多いもの）  | ◯  |
| SVG  | ベクター  | 可逆  | 280兆色  | ロゴ、アイコンなど（拡縮で劣化させたくないもの）  | ◯  |
| GIF  | ラスター | 可逆  | 256色  | アニメーション向き	  | ◯  |
| WebP  | ラスター  | 可逆・非可逆両方に対応  | 1670万色  | 画像の容量が軽い(JPEGと比べて25~30%)	  | ◯  |

## ラスターとベクターって？
#### ラスター形式
* 小さな画素の集まりでできており、１ピクセルごとに色情報をもっています。
* 拡大・縮小では、画素の数を増やしたり減らしたりすることになります。画素の補完が必要になるため、画像が荒れてしまいます。

#### ベクター形式
* 点と線で描画した図形でできており、描画の情報を数値で表すことができます。
* 拡大・縮小では、計算によって描画されるため、画像が荒れることがなく、きれいに表示できます。

## 可逆・非可逆　って？
ラスター画像において、保存時にファイルを軽くするための圧縮方式の種類です。アルゴリズムに違いがあります。
#### 可逆圧縮
* ロスレス圧縮（Lossless Compression）ともいう。
* 可逆＝元に戻せる
    * 圧縮・解凍を繰り返しても、画質劣化が発生しないがが、容量は重くなる。

#### 非可逆圧縮
* ロッシー圧縮（Lossy Compression）ともいう
* 非可逆＝元に戻せない
    * 圧縮率は高いため、可逆圧縮よりも容量を軽くできるが、画質の劣化度合いは高くなる。 

## Webサイト向け画像の形式に迷ったとき
#### 解像度
* 72dpi
* 高解像度ディスプレイでは72dpiだと荒くみえる場合があるため、x2の144dpiで出力するとよい
    * その際は容量が大きくなるため、圧縮して容量削減するとよい
        * 圧縮ツール：https://squoosh.app/

#### 用途による使い分け
* ロゴ、アイコン： svg
* 写真：webp、jpg
* イラスト：webp、png

※2024年5月現在、GoogleはWebサイト向けの画像形式として、Webpを推奨している。
　
#### 参考
Webサイトの画像最適化

https://web.dev/articles/compress-images?hl=ja#image_optimization_checklist

WebPの詳細

https://www.adobe.com/jp/creativecloud/file-types/image/raster/webp-file.html
TCP/IPモデルとカプセル化

# TCP/IPモデル
TCP/IP（Transmission control protocol/internet protocol）

OSI参照モデルは最近の通信ではほとんど使用されていません。実際に使用されているのがTCP/IPモデル。

## TCP/IPモデルの４つの階層
・アプリケーション層（OSI参照モデルのアプリケーション層・プレゼンテーション層・セッション層）
・トランスポート層（OSI参照モデルのトランスポート層）
・インターネット層（OSI参照モデルのネットワーク層）
・リンク層（OSI参照モデルの物理層・データリンク層）

# カプセル化
コンピュータ層でデータを送信するとき、作成したデータは上位のアプリケーション層から処理を行なっていきます。各層において必要な情報は、データの前にヘッダとして取り付けて下位の層へ渡します。この処理をカプセル化と言います。などデータリンク層ではヘッダの他にデータの後ろにエラーチェック用の値（トレーラ）が付与されます。

# 非カプセル化
受信側のコンピュータでは電気信号をビット列に変換してデータを取り込みます。各層では、その層のヘッダ情報に基づいて処理を行い、ヘッダを外してから上位層へ渡します。受信側では逆の手順でヘッダやトレーラが取り除かれていき、この処理を非カプセル化と言います。
Munin で YAMAHA のルータをモニタリングしてみる IPv6 で

Munin は snmp 通信時のデフォルトじゃと
* version 2
* domain UDP/IPv4

じゃけ、IPv6 のマルチスタック下なら問題無いが、IPv6 のみじゃと通信せんのです。

っま、調査時から UDP/IPv6 やら指定をすればエエだけじゃが、一度設定しおるとそうそう触る機会も無いもんだけん、スイッチ類を毎度毎度 man で調べて非効率💦

って事で、ワシの作業忘備録として簡単に纏めてみたけぇ、1ミリでも参考になれば佳き🤗

Munin は ports でも packages でもどちらでもインスコされている事が前提で✌
```shell:packages
pkg install munin-node
```
```shell:ports
cd /usr/ports/sysutils/munin-node ; make install
```
ルータの設定は省略m(__)m

Munin のプラグインで smnp__* ってのが有るけん、そいつでプラグインのスタティックリンクを作成
```shell
munin-node-configure --snmpdomain udp/ipv6 --suggest --shell --snmp [ルータのホスト名 or IPv6 アドレス] --snmpversion 1 --snmpcommunity public
```
RTX1200 での実行結果↓
```shell:ルータと上手く通信確率しおるとこういうコマンドラインが標準出力されよる
ln -s '/usr/local/share/munin/plugins/snmp__if_' '/usr/local/etc/munin/plugins/snmp_[ルータのホスト名 or IPv6 アドレス]_if_1'
ln -s '/usr/local/share/munin/plugins/snmp__if_' '/usr/local/etc/munin/plugins/snmp_[ルータのホスト名 or IPv6 アドレス]_if_3'
ln -s '/usr/local/share/munin/plugins/snmp__if_err_' '/usr/local/etc/munin/plugins/snmp_[ルータのホスト名 or IPv6 アドレス]_if_err_1'
ln -s '/usr/local/share/munin/plugins/snmp__if_err_' '/usr/local/etc/munin/plugins/snmp_[ルータのホスト名 or IPv6 アドレス]_if_err_3'
ln -s '/usr/local/share/munin/plugins/snmp__if_multi' '/usr/local/etc/munin/plugins/snmp_[ルータのホスト名 or IPv6 アドレス]_if_multi'
ln -s '/usr/local/share/munin/plugins/snmp__netstat' '/usr/local/etc/munin/plugins/snmp_[ルータのホスト名 or IPv6 アドレス]_netstat'
ln -s '/usr/local/share/munin/plugins/snmp__uptime' '/usr/local/etc/munin/plugins/snmp_[ルータのホスト名 or IPv6 アドレス]_uptime'
```
この結果を元にプラグインのスタティックリンクを作成する。

プラグイン実行時のスイッチ
以下のファイルを作って置く。
```text:/usr/local/etc/munin/plugin-conf.d/__SNMP.conf
[snmp_*]
env.domain      udp/ipv6
env.version     1
env.community   public
```
注：sysutils/munin-common/files/patch-plugins_lib_Munin_Plugin_SNMP.pm のパッチが当たっている事が大前提✌

あとは、デーモンを再起動なり起動すれば取得出来る(筈)

お約束じゃが...
Munin をソースコードを tarball とか git のクローンで持ってきおると、インスコ先のパスが変わりおるけん、その辺は適宜読み替えんさいな。
Requestsを使ってWebデータの取得

ウェブ上のデータを取得するためにPythonを使用する場合、便利なライブラリの一つがRequestsです。
Requestsは、HTTPリクエストを簡単に行うためのPythonライブラリで、ウェブスクレイピングやAPIとの通信に広く使用されています。

#### Requestsのインストール

まず、Requestsライブラリをインストールします。以下のコマンドを実行してください。

```bash
pip install requests
```

#### Requestsの基本的な使い方

##### 1. GETリクエスト

GETリクエストは、最も基本的なHTTPリクエストの一つです。
指定したURLからデータを取得するために使用されます。

```python
import requests

# URLの指定
url = 'https://api.example.com/posts/1'

# GETリクエストの送信
response = requests.get(url)

# ステータスコードの確認
print(f"ステータスコード: {response.status_code}")

# レスポンス内容の表示
print(f"レスポンス内容: {response.json()}")
```

##### 2. パラメータ付きのGETリクエスト

クエリパラメータを付けてリクエストを送ることもできます。
例えば、検索クエリを含むリクエストを送信する場合です。

```python
# URLの指定
url = 'https://api.example.com/posts'

# パラメータの指定
params = {'userId': 1}

# GETリクエストの送信
response = requests.get(url, params=params)

# ステータスコードの確認
print(f"ステータスコード: {response.status_code}")

# レスポンス内容の表示
print(f"レスポンス内容: {response.json()}")
```

##### 3. POSTリクエスト

POSTリクエストは、サーバーにデータを送信するために使用されます。
例えば、新しいリソースを作成する場合です。

```python
# URLの指定
url = 'https://api.example.com/posts'

# データの指定
data = {
    'title': 'foo',
    'body': 'bar',
    'userId': 1
}

# POSTリクエストの送信
response = requests.post(url, json=data)

# ステータスコードの確認
print(f"ステータスコード: {response.status_code}")

# レスポンス内容の表示
print(f"レスポンス内容: {response.json()}")
```

##### 4. ヘッダーの設定

リクエストヘッダーを設定することで、認証情報やカスタムヘッダーを送信することができます。

```python
# URLの指定
url = 'https://api.example.com/posts'

# ヘッダーの指定
headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}

# GETリクエストの送信
response = requests.get(url, headers=headers)

# ステータスコードの確認
print(f"ステータスコード: {response.status_code}")

# レスポンス内容の表示
print(f"レスポンス内容: {response.json()}")
```

##### 5. タイムアウトの設定

タイムアウトを設定することで、リクエストが指定された時間内に完了しない場合にエラーを発生させることができます。

```python
# URLの指定
url = 'https://api.example.com/posts/1'

# タイムアウトの設定（5秒）
try:
    response = requests.get(url, timeout=5)
    print(f"ステータスコード: {response.status_code}")
    print(f"レスポンス内容: {response.json()}")
except requests.exceptions.Timeout:
    print("リクエストがタイムアウトしました")
```

##### 6. エラーハンドリング

リクエストが失敗した場合にエラーハンドリングを行う方法です。

```python
# URLの指定
url = 'https://api.example.com/posts/invalid'

# GETリクエストの送信
response = requests.get(url)

# ステータスコードの確認
if response.status_code == 200:
    print(f"レスポンス内容: {response.json()}")
else:
    print(f"エラーが発生しました。ステータスコード: {response.status_code}")
```

以上
QiitaCLIで作成したファイル（ローカル）はpublish時にIDを更新してくれるのか？→結果...


## 発端
QiitaCLIをガチャガチャいじっていて気がついたが、publishで更新する処理はCIでいうところの

```
- uses: increments/qiita-cli/actions/publish@v1
  with:
    qiita-token: ${{ secrets.QIITA_TOKEN }}
    root: "."
```

が実行しているからでは？という疑問。
単純にローカルから`npx qiita push`だとどうか？
→`npx qiita push --all`としないと新しいファイルが追加されなかったので修正。

## 検証結果
更新された！本ファイルで確認。

```
---
title: QiitaCLIで作成したファイル（ローカル）はpublish時にIDを更新してくれるのか？
tags:
  - QiitaCLI
private: false
updated_at: ''
id: 
organization_url_name: null
slide: false
ignorePublish: false
---
```

が

```
---
title: QiitaCLIで作成したファイル（ローカル）はpublish時にIDを更新してくれるのか？
tags:
  - QiitaCLI
private: false
updated_at: '2024-06-13T14:15:04+09:00'
id: 384f130aba7ea537937b
organization_url_name: null
slide: false
ignorePublish: false
---
```

になった。変更差分だけ取り出すと、

| 行数 | 変更前 | 変更後 |
| --- | --- | --- |
| 6 | updated_at: '' | updated_at: '2024-06-13T14:15:04+09:00' | 
| 7 | id:  | id: 384f130aba7ea537937b |

であるので、qiita pushによって元ファイルへの更新も同時に行なっていることがわかった。
慣れてくると勘違いしがちだが、qiita pushはあくまでqiitaへのアップロードなのでgit pushはまた別に行う必要がある。

ただし、CIを実行すると

```
- uses: increments/qiita-cli/actions/publish@v1
  with:
    qiita-token: ${{ secrets.QIITA_TOKEN }}
    root: "."
```

のタイミングでgit pushも実施される（コミッターはgithub actions[bot])

## 実はこっそり別の検証も
いったんpublishした状態でpublicフォルダ・ディレクトリから記事ファイルを削除して、もう一度publicに追加し直す、という操作をやってみた。
どうやら記事ID(FrontFormatter)で管理しているらしいので、新しくファイルが追加される、ということはないらしい。
よく考えたらそれはそうで、別の端末またはディレクトリにgit cloneして複数の環境を作ってもqiita pullされない限りは環境差異が生じないことになる

逆に言えば、いったん記事をpublishした環境とは別の場所でqiita pullしてそこからまたpublishをすると、別の場所ではqiita pullしないと最新版にならないよね、という話にもなる。
これはgitと同じ考え方ができるので納得感もある。

QiitaCLIは（Webエディタでの編集による競合を考えなければ）運用可用性はある！
OSI参照モデルとは

# OSI参照モデル
●OSI参照モデル
Open systems interconnection(開放型システム間相互接続)
ネットワークで必要とされる機能を７つの階層（レイア）に分類した通信の基本モデルです。
異なる種別のコンピュータ間でのデータ通信を実現するためにISOという団体によって決められた。


## OSI参照モデルの７つの階層
レイア１　物理層・・・データを伝送路に流すため、ネットワークに関数する物理的な使用を定義する。
レイア２　データリンク層・・・１つのネットワークに接続された隣接するノードとの正確なデータ通信を実現する
レイア３　ネットワーク層・・・異なるネットワーク上のノードと通信するために、最適な経路を選択する
レイア４　トランスポート層・・・データを確実に届けるために信頼性を提供し、プログラム間での通信を行う
レイア５　セッション層・・・通信内容を区別し、セッション（通信の開始から終了）の管理を行う
レイア６　プレゼンテーション層・・・データを正しく表現するために表現形式を決定する
レイア７　アプリケーション層・・・ユーザが利用するアプリケーションに対してネットワークサービスを提供する

### 物理層（レイア１）
ネットワークに関する全ての物理的な使用を定めている。
それらの仕様に従ってコンピュータとケーブルを接続し、送信されてきたデータをコンピュータが理解する「0」と「１」のビットの列に変換し、送信するときはビットの列をケーブルで扱う電気信号に変換します。

### データリング層（レイア２）
**データの送信元や宛先の識別方法、送信中にエラーが起きた時の対処方法を定める**
１つのネットワーク内（ケーブルなどで直接接続されたネットワーク）でデータを正しく宛先のノードへ転送するための取り決めをしています。データリンク層では、データの宛先を示すために物理アドレスを使います。物理アドレスとは、PC内のLANカードなどのネットワーク機器に付与されている固有の識別番号で、MACアドレスとも言います。

### ネットワーク層（レイア３）
ネットワーク層は、異なるネットワーク間でデータの転送を行うために取り決めている。

### トランスポート層（レイア４）
**データが確実に届くように通信の信頼性を確保**
トランスポート層の役割は、送り出したデータを宛先のコンピュータのアプリケーションに届ける。

### セッション層（レイア５）
**URLを入力→enter通信開始→ページを表示の一連を制御**
セッションとは、アプリケーションによる通信全体をさします。セッション層は通信を行うプログラム同士の論理的な通信路（セッション）の確率から終了までを管理します。

### プレゼンテーション層（レイア６）
**文字化けなどを起こらないように制御するところ**
データの表現形式を取り決め、文字、画像、動画といったデータ形式を区別する。

### アプリケーション層（レイア７）
ユーザとのインターフェイス（接点）になる層で、アプリケーションの目的に応じたサービスを提供します。
クラウドゲーム開発プラットフォームで世界をリードするウェルリンクテックは、日本に新しいオフィスを開設します

ウェルリンクテックは、リアルタイムクラウドレンダリングのソリューションを提供する主要プロバイダーであり、日本では最初のオフィスを東京都渋谷区に開設しました。これは、活気あふれる日本のゲーム業界により良いサービスを提供し、自社のグローバル化を推進することを目的としています。

![well_link.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784576/40d28a75-1880-3382-ccc9-2c9d6a84f78d.jpeg)

ウェルリンクテックは、リアルタイムクラウドレンダリングソリューションのリーディングカンパニーとして知られており、ゲーム開発者、パブリッシャー、プラットフォームやメタバースを利用したイベントの主催者に向けて、サービスを提供しています。サービス時間は10億時間を超え、1日あたりのアクティブユーザーが100万人、サービスレベルアグリーメントは99.9％を保持しています。これにより、ウェルリンクテックは、信頼できるテクノロジーパートナーとして支持されています。

ウェルリンクテックが持つ独自のクラウドゲーミング開発プラットフォームを利用することで、開発者はPC、モバイル、またはコンソールゲームをクラウドゲーム化することができ、プラットフォームやデバイスをまたいで、シームレスなゲームプレイをユーザーに提供することが可能になります。更にこのプラットフォームは、より高いユーザーのコンバージョンレートと共に、マーケティングROIを実現するために、新しいマーケティング手段を提供します。その１つとして、ウェルリンクテックのクラウドストリーミングサービスを利用して、ワンクリックでプレイ可能なゲーム広告を提供することができます。そのプレイ体験は、ゲームが本来持つ操作性と高いグラフィックのクオリティを損なうことなくゲームプレイを正確に表現し、あらゆるデバイスに容易に提供することが可能です。

長きに渡りゲーム業界に従事及び貢献してきた田代昭博（以下、田代）は、この度日本オフィスであるウェルリンクテックジャパン株式会社のCEOに就任しました。田代はウェルリンクテックが持つサービスを利用したソリューションの中でも、特に期待できるクラウドゲーミング、クラウドストリーミング可能な広告、メタバースイベントのストリーミングやデジタルヒューマンを通じて業界を変革する可能性に対して期待を寄せています。

「リアルタイムクラウドレンダリングは、デバイスの制限を克服し、プラットフォームをまたいでユーザーに高品質なコンテンツを提供する素晴らしいサービスです。」と田代は言います。また、「私たちはオフィスにクラウドゲーミングが体験できるセンターを設立しました。一人でも多くの日本の業界関係者様が体験に立ち寄っていただき、今後のビジネスにおけるパートナーシップの可能性について語り合うことを楽しみにしています。」と話しています。

オフィス開設に加え、ウェルリンクテックジャパン株式会社は、日本の一般社団法人コンピュータエンターテイメント協会（CESA）に加盟しました。これにより、日本のコンピュータエンターテイメント業界により良いサービスを提供し、産業の振興に対して貢献することを約束します。

ウェルリンクテックのグローバルビジネス責任者であるHeidi Sunは、日本への進出とCESAへの加入について意気込みを語っています。「これらの動きは、日本の市場に対する私たちのコミットメントを示しています。」、「私たちは、クラウドゲーミングとクラウドストリーミング可能な広告など、すでにいくつかの主要なパートナー様と協力体制を実現しています。今後近い将来、さらにエキサイティングな技術を市場に提供できることを楽しみにしています。」

ウェルリンクテックはシンガポールに本社を置き、日本、中国、韓国、東南アジア、ヨーロッパ、米国に事業を展開しています。詳細については、[www.well-linktech.com](https://www.well-linktech.com)をご覧ください。
社会人になっても勉強するということ

### はじめに

ふと、自分が社会人になっても勉強していた（いる：現在進行形）ので、社会人になっても勉強するということはどういうことか振り返ってみました。

偉そうなことを言いたいわけではなく、また、当たり前のことしか書いてないかもですが、気楽に読んでいただけると幸いです。

### きっかけは？

自分が勉強を始めたきっかけはコロナによる外出自粛でした。
それまでは飲みに行ったり、映画を見に行ったりしてました。
家で過ごす時間が増えたときに、だらだらしているこの時間もったいないなと思ったのがきっかけです。

### 何を勉強したの？

勉強した成果は見える方が良いですよね。
自分は**資格取得**を目標に勉強を始めました。
ちょうどその頃興味があったクラウド（AWS、Azure、GCP）の資格をターゲットにしました。

### どうやって勉強したの？

自分は主に朝活です。
朝いつもより早めに家を出発し、カフェで勉強してました（してます：現在進行形）。

ポイントとしては、自宅ではなくカフェで勉強するということ。
自宅だと怠けてしまいがちですが、場所を変えることで気持ちを切り替えています。

あとは夜帰宅後、就寝までの時間に勉強します。
寝る時間を何時と決めていれば、それまで勉強する時間と考えていました。

みなさんの生活スタイルに合わせて勉強するのが良いと思います。

**「仕事が忙しすぎて勉強する時間がないんだけど！」**
って思いますよね。

自分もそう思います。

仕事が忙しいときは物理的に時間が確保できずに勉強できないこともありました。
ただ、朝は比較的時間を確保しやすいので朝活を中心にしてました。

> 「一番多忙な人が一番多くの時間を持つ。」
> アレクサンドル・ビネ（神学者）

この言葉にすごく共感しました。
何もしないで過ごしている人もいれば、その時間に何かに取り組んでいる人もいる。

そして、時間がない、時間がない、と言いいますが、**時間は作るもの**だと考えています。
限られた時間の中でやりたいことを実現していくのですから。

では、どうやって時間を作るのか。

普段は仕事をしていますから、勉強する時間は必然的にプライベートな時間になります。
つまり、プライベートな時間を削って勉強する時間にあてることになります。

みなさんは30分間とか、1時間とか時間作れますか？

ポイントとしては、一度にたくさんの時間を確保するのではなく、
**毎日少しずつの時間**を確保するということ。
そして、それを毎日続けて習慣化すること。
短期的には少ない時間でも、長期的に考えれば充分です。

あとは、勉強をする目標を掲げていますので、その目標達成に向けて取り組むだけです。

ひたすら勉強していると疲れますよね。もちろん息抜きも必要です。
自分はよくYoutubeでQuizKnockとかを見て休憩してました。
（逆に彼らの知識に刺激されたりしてました 笑）


### 勉強して結果どうだったの？

クラウドの資格取得を目標に勉強を続けた結果、AWS認定資格12冠達成しました:point_down:

https://qiita.com/zzzzico/items/974eadb35bdb7de09377

AzureやGCPの認定資格もいくつか取得できました。

これは自分にとって大きな財産です。
さらに仕事でも活かせる環境が生まれるなど、勉強していて良かったと思えることが多々あります。


### 社会人になっても勉強するということはどういうこと？

振り返ってみて思ったことです。

* **勉強は自己投資である。**
勉強している時間、勉強のために購入した教材（Udemyや参考書）は自分への投資です。
長い目で見て取り組みましょう。
そうすればやがて大きな成果となると思います。
勉強に限ったことではなく、例えばジョギングなんかも自分の健康維持と考えると自己投資ですね。

あと、

* **自分の付加価値を向上させよう。**
勉強により得られた知識や経験は大きな財産です。
自分の資格取得は目に見える成果として、自身の付加価値を向上させてくれました。
**勉強しよう、それを続けよう、という姿勢そのものにも価値はあると思います。**

### さいごに

まだまだ自分は勉強したいことがたくさんあります。
英語も勉強したいし、趣味の世界遺産検定も勉強したい。あとKaggleもやりたい。

みなさんも一緒に勉強しましょう！
iTerm2でSSH接続時などにパスワード入力を簡略化する方法

## 背景
iTerm2を利用していると、SSHなどでパスワードを求められる度に毎回入力するのが面倒だと感じることがある。これを解決するために、iTerm2のパスワードマネージャー機能を使ってパスワード入力を自動化する方法を紹介する。

## やったこと
1. iTerm2 のメニューから `Window > Password Manager` を選択
    ![スクリーンショット 2024-06-13 13.10.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634885/7070a867-a021-4be0-6f2f-947833400915.png)
    <br>

2. Password を登録
    - Account Name： 適当（覚えやすいキーにすればいいかと）
    - User Name: 空欄
    - Password: パスワード

    ![スクリーンショット 2024-06-13 13.28.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634885/2682e84e-499a-d5a3-27f6-358dd51711de.png)
    <br>

3. iTerm2 のメニューから `iTerm2 > Settings` を選択
    ![スクリーンショット 2024-06-13 13.32.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634885/26665645-c23f-4823-47a7-6bc6efa2097f.png)
    <br>

4. `Profiles > Advanced > Triggers > Edit` を選択
    ![スクリーンショット 2024-06-13 13.20.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634885/2e235299-e712-23f1-cac2-cf5ec8acda9c.png)
    <br>

5. Trigger を登録
    トリガーを設定して、Passwordという文字が表示されたら　Password Manager　を開くようにする
    - Regular Expression: Password
    - Action: Open Password Manager
    - Parameters: 空欄
    - Instant: Checked
    - Enabled: Checked

    ![スクリーンショット 2024-06-13 13.20.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634885/0c266cdf-4a64-de8a-9dcb-5ae337fe5d96.png)
    <br>


## 動作確認
Password という文字が表示されたときに自動的に Password Manager が開くようになった

![ssh2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634885/53c8b047-0303-ccef-3bc9-79a3f7eab556.gif)

## まとめ
SSH接続時のパスワード入力が簡略化され、毎回手動で入力する手間を省くことができた！
prismaでseedデータを追加する方法

https://qiita.com/Itsuki54/items/ea4e0ff9a593e77fb098

### tsxライブラリを入れよう

```zsh
npm i tsx
```

必要なライブラリは以上です

```prisma/seed.ts
import { PrismaClient } from "@prisma/client";

const db = new PrismaClient();
async function seed() {
  await db.user.create({
    data: {
      email: "[email protected]",
      password: "password",
    },
  });
}

seed()
  .catch(e => {
    console.error(e);
    process.exit(1);
  })
  .finally(async () => {
    await db.$disconnect();
  });
```
簡単なseedの追加です　コレを書き換えてそれぞれの環境に合わせたものを作成してください

```package.json
  + "type": "module",
   "scripts":{
  +  "seed" : "tsx ./prisma/seed.ts"
  +  }
  ----
  +"prisma": {
  +  "seed": "tsx ./prisma/seed.ts"
  +  }
```

:::note warn
prismaのseedの部分の追加をすることでmigrateするときに自動で実行されます
:::

```zsh
npm run seed
```

こうすることで手動で実行できるようになります
【Swift】URLSession 最新メソッドたちの使い分け

並べて引数と戻り値に注目しながら考えると分かってきます。

```Swift
func data(
    for request: URLRequest,
    delegate: (any URLSessionTaskDelegate)? = nil
) async throws -> (Data, URLResponse)
```
```Swift
func data(
    from url: URL,
    delegate: (any URLSessionTaskDelegate)? = nil
) async throws -> (Data, URLResponse)
```

```Swift
func download(
    for request: URLRequest,
    delegate: (any URLSessionTaskDelegate)? = nil
) async throws -> (URL, URLResponse)
```
```Swift
func download(
    from url: URL,
    delegate: (any URLSessionTaskDelegate)? = nil
) async throws -> (URL, URLResponse)
```
```Swift
func download(
    resumeFrom resumeData: Data,
    delegate: (any URLSessionTaskDelegate)? = nil
) async throws -> (URL, URLResponse)
```

```Swift
func upload(
    for request: URLRequest,
    from bodyData: Data,
    delegate: (any URLSessionTaskDelegate)? = nil
) async throws -> (Data, URLResponse)
```
```Swift
func upload(
    for request: URLRequest,
    fromFile fileURL: URL,
    delegate: (any URLSessionTaskDelegate)? = nil
) async throws -> (Data, URLResponse)
```

```Swift
func bytes(
    for request: URLRequest,
    delegate: (any URLSessionTaskDelegate)? = nil
) async throws -> (URLSession.AsyncBytes, URLResponse)
```
```Swift
func bytes(
    from url: URL,
    delegate: (any URLSessionTaskDelegate)? = nil
) async throws -> (URLSession.AsyncBytes, URLResponse)
```

リクエスト・レスポンス・ヘッダー・ボディで比較しようと思ったけどもういやだ。

# 🤔 まとめ

これが基本で万能ですね!

```swift
func data(
    for request: URLRequest,
    delegate: (any URLSessionTaskDelegate)? = nil
) async throws -> (Data, URLResponse)
```
# 🤔 引用

https://x.com/maochanz/status/1801099269451006358
npx ts-nodeでTypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" エラーを直すためにtsxを入れよう

### npx ts-nodeを実行するとエラーが出る

環境:node:20

このバージョンだとts-node を使ってtypescriptを直接実行はできないのでtsxというライブラリを利用します

### 代わりとなるライブラリtsx
```zsh
npm i tsx
```

これで実行できるようになります！

```zsh
npx tsx ...
```

コレで実行できます！

こちらを利用してprismaのseedデータの追加を以下の記事に記述しています
興味があればぜひ！

https://qiita.com/Itsuki54/items/7a7781379ba3d981673a
[AWS #2]AWSの長所と利点

## ■はじめに
こんにちは
今回はクラウドの概念やメリットなどを簡単に紹介いたします。
## ■クラウド（クラウドコンピューティング）とは
[**クラウド（クラウドコンピューティング）** ](https://x.gd/HqgZv)とは、インターネット経由でコンピューティング、データベース、ストレージ、アプリケーションなどの <font color=red>**「ITリソースをオンデマンドで利用できるサービスの総称」**</font> です。

:::note info
利用したいときに、利用した分だけに**従量課金**される
:::
:::note info
ネットワークを利用してコンピュータリソースを利用する形態
:::
***
### ■オンプレミスとクラウドの違い
オンプレミスとは**インフラ**（サーバー、ネットワーク、ソフトウェアなどの設備）を**自分たちで購入、運用する**システムです。

それに対しクラウドはインフラを**ネットワーク経由で使用・管理する**ことです。
### ▶オンプレミスとクラウドの違い
|  | オンプレミス | クラウド |
|:-:|:-:|:-:|
|**意味**|インフラを**自前で用意**、**自社で所有・管理すること**|インフラを**ネットワーク経由で使用・管理すること**|
|**メリット**| サーバーやインターネット機材などの**自由度が高い**  |**初期コストが少なく、すぐに始められる**、サーバーの増減が自由に可能|
|**デメリット**|初期コストがかかり、機材などの**調達時間が必要**、サーバーの**増減がしにくい**|費用の予測が付きづらい、クラウド全体で障害起こると対応ができない   |
***
## ■AWSクラウドコンピューティング6つのメリット
**①固定費が柔軟な変動費へ
②コストの最適化
③キャパシティが予測不要に
④スケールによる大きなコストメリット
⑤スピードと俊敏性の向上
⑥わずか数分で世界中にデプロイ**

### ①固定費が柔軟な変動費へ
実際に利用したリソースに応じた支払いが可能となります。
特にスタートアップ企業にとって、大きな**初期投資を避けて**小規模から始められることは大きなメリットです。

:::note info
・事前の設備投資が必要なし
・リソースを利用したい時、**利用した分だけ支払います**
:::
### ②コストの最適化
AWS各種サービスの利用料には、従来のオンプレミスシステムに関する様々な費用が含まれています。（サーバー、ライセンス、電気、人件費など…）さらに、定期的な機器更新に関わる費用も考慮する必要ありません。これにより、**本来の業務に集中ができます。**
クラウド利用により、サーバーの設置、連携、起動といった重労働が不要になり、ユーザーに直接関わる業務に専念できるようになります。

:::note info
・ビジネスを差別化するプロジェクトに専念できます。
:::

### ③キャパシティが予測不要に
AWSでは必要に応じてリソースの増減が可能であるため、最大のインフラ容量を予測する必要がなくなります。（足りなかったら追加すれば良いか～という気持ちでキャパシティを決めることができます）

:::note info
・状況に応じて**柔軟にスケーリング**を行えばよいでしょう
:::

### ④スケールによる大きなコストメリット
世界中の何十万単位の多くのユーザーがクラウドを使用する事でその経済規模を生かして料金を変動させていきます。サービスの使用量が増える、利用者が増えれば増えるほどコストが下がるというメリットが期待できます。

:::note info
・オンプレミスよりも低い変動コスト
:::

### ⑤スピードと俊敏性の向上
新しいITリソースをマウスやタップを使い数クリックで追加することができます。もし従来型のオンプレミスだとすると機械の導入までに数週間～数ヶ月かかってしまうことも…
速く調達できるということは、それだけチームのスピードも向上するということですね。

:::note info
・**迅速なリソース調達が可能**
・コストと時間が大幅に削減され、**組織の俊敏性も大きく向上**します
:::

### ⑥わずか数分で世界中にデプロイ
AWSを利用すれば数クリックで数分以内に世界中のリージョンにWebサーバーを構築できます。オフィスにいながらにして、シンプルな操作かつ最小限のコストで世界中にデプロイができます。

:::note info
・AWSを利用すれば現地に行かなくても**数クリックでWebサーバーを構築できる**
:::

## おわりに
今回は主にクラウドのメリットを6つ紹介させていただきました。このメリットは[「AWS CLF」](https://aws.amazon.com/jp/certification/certified-cloud-practitioner/)の試験にも出る内容とのこと。しっかりと理解できるようにイメージを固めたいと思います。#3では「Well-Architected フレームワーク」について取り上げたいと思います。

最後までお読みいただきありがとうございました！

>日頃より活用している参考書です。
>> **「参考書」**
[AWS認定クラウドプラクティショナー改定第3版](https://x.gd/19i6N)
>
> **「AWS公式サイト」**
[AWSの料金](https://x.gd/kfotv)
>
> **「Youtube」**
[AWSクラウドの概念（2020年に投稿されたものです）](https://x.gd/rEVDB)
【Docker】runに失敗したとき

## はじめに
「[仕組みと使い方がわかる Docker&Kubernetesのきほんのきほん](https://www.amazon.co.jp/%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%A8%E4%BD%BF%E3%81%84%E6%96%B9%E3%81%8C%E3%82%8F%E3%81%8B%E3%82%8B-Docker-Kubernetes%E3%81%AE%E3%81%8D%E3%81%BB%E3%82%93%E3%81%AE%E3%81%8D%E3%81%BB%E3%82%93-%E5%B0%8F%E7%AC%A0%E5%8E%9F%E7%A8%AE%E9%AB%98/dp/4839972745/ref=sr_1_1?adgrpid=146725663834&dib=eyJ2IjoiMSJ9.dDRosS2AQsiPnHUDmvHXsqXzSHjVP6-vSxs0v-09se7AM-Ol7va2CtR9bsI6l6uz0MGKUlpbccoXyJuXXpwgnPWEpVT11Amz9nE3mzbgNjBjZqQIO5ioa_jQY-SNhDt31nIojIHH4ozqFsrZinclh-wLG4eHEmN-Pkpth_ViANteF__kD125Hor2ZYwrusvpN82qvbul9IlLe4rkzz4CESBrINosxc1pbSdhJPkz-cxtfKslpKFbNJ5Ete6MGD7qbdgQ1LqyVTbgGw--e5-YC86MleBeoN8UQaI-ngwOYD0.9GhhYqvV0zI0D1bOQ29VWL2XaaPr_KBPzlsgvdil3Ms&dib_tag=se&hvadid=665685603506&hvdev=c&hvlocphy=1028853&hvnetw=g&hvqmt=e&hvrand=7631521062054359146&hvtargid=kwd-1926694090691&hydadcr=27523_14701159&jp-ad-ap=0&keywords=docker+%26+kubernetes%E3%81%AE%E3%81%8D%E3%81%BB%E3%82%93%E3%81%AE%E3%81%8D%E3%81%BB%E3%82%93&qid=1716335821&sr=8-1)」を学習しているなかで下記コードを実行しようとした際に失敗しました。忘備録として対策を残そうと思います。
```
docker run --name apa000ex1 -p 8080:80 -d httpd
```

## エラー内容
```
Unable to find image 'httpd:latest' locally
docker: Error response from daemon: Head "https://registry-1.docker.io/v2/library/httpd/manifests/latest": unauthorized: incorrect username or password.
See 'docker run --help'.
```

認証エラーが発生したことを示しています。Docker Hubへのアクセスに失敗しているため、イメージを取得できない状態です。

## 対処方法
**手順1: Dockerにログイン**
まず、Docker Hubにログインします。以下のコマンドを実行し、Docker Hubのアカウント情報を入力します。
```
docker login
```

**手順2: イメージの取得**
ログインが成功したら、もう一度docker runコマンドを実行してイメージを取得し、コンテナを起動します。
```
docker run --name apa000ex1 -p 8080:80 -d httpd
```
これで、httpdイメージがDocker Hubから正しく取得され、コンテナが起動するはずです。

## まとめ
書籍でも思い通りに進まないことがありますが、それも勉強です。


## 最後に
私の働いている会社で経験の有無を問わず採用を行っています。
興味のある方は是非カジュアル面談から応募してみてください！

https://jambo-support.com/recruit_engineer/
PostgreSQL: SQL のサンプル （スキーマの一覧）

スキーマの一覧を表示する SQL

```sql
SELECT schema_name FROM information_schema.schemata;
```

スキーマ名が sch で始まるものだけを選ぶ

```sql
SELECT schema_name
FROM information_schema.schemata where schema_name LIKE 'sch%';
```

## Python 版

```text:.env
user='scott'
password='****'
data_base='*****'
```

```py:select_schema.py
#! /usr/bin/python
#
#	select_schema.py
#
#					Jun/13/2024
#
# --------------------------------------------------------
import sys
import os
import psycopg2
import psycopg2.extras
from dotenv import load_dotenv
#
# --------------------------------------------------------
# [6]:
def db_search_proc(cur):
	sql_str= "SELECT schema_name "
	sql_str += "FROM information_schema.schemata "
	sql_str += "where schema_name LIKE 'sch%';"
#
	print(sql_str)
#
	cur.execute (sql_str)
	rows = cur.fetchall()
#
	if len(rows) == 0:
		sys.stderr.write("*** error ***\n")
#
	schemas = []
	for row in rows:
		schemas.append(row[0])
#
	return sorted(schemas)
# --------------------------------------------------------
# [4]:
def db_process():
	conn = psycopg2.connect("dbname=" + DATA_BASE + " user=" + USER + " password=" + PASSWORD)
#
	cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
#
	schemas = db_search_proc(cur)

	for schema in schemas:
		print(schema)

	conn.commit ()
#
	cur.close ()
	conn.close ()
#
# --------------------------------------------------------
sys.stderr.write ("*** 開始 ***\n")
#
dotenv_path = '.env'
load_dotenv(dotenv_path)
USER=os.environ.get("user")
PASSWORD=os.environ.get("password")
DATA_BASE=os.environ.get("data_base")
#
db_process()
#
sys.stderr.write ("*** 終了 ***\n")
#
# --------------------------------------------------------
```
２進数、１０進数、１６進数とネットワークの階層

１０進数・・・「0-9」の１０種類の数字で表現している
２進数・・・「０」と「１」の２種類の数字で数値を表現している
１６進数・・・「０-9」と「A-F」の１６進数で数値を表現している

# プロトコル
●プロトコル
ネットワーク上のルール（通信規約）
コンピューターネットワークにはさまざまな種類の端末が接続され、色々な用途で利用されています。使用するプロトコルがお互いに異なっていると、サーバはクライアントからリクエストを理解できずに破棄してしまったり、そもそもサーバまでデータが届かないなどの問題が生じます。
プロトコルにはそれぞれの役割があり、役割ごとに寄せ集めて階層構造にし、目的に応じて組み合わせる。この階層化されたプロトコルの集まりをプロトコルスタック（積み重ね）といい、各層はレイヤとも呼ばれています。階層化して役割の範囲を明確にすることで、それぞれの仕事に独立性を持たせることができ、部分的な変更や改良が容易になる。
オドメトリを簡単に取得できるセンサーで遊んでみた

## はじめに

みなさん、日々の自己位置は足りてますか？私は足りていません。LiDARで取得するにしても、タイヤから取得するにしても一長一短があり、どれにするか決めかねています。
そんなある日、タイムラインでこんなセンサーを見つけました！！

| センサ名  | SparkFun Optical Tracking Odometry Sensor |
|---|---|
| 価格  | ￥13,111  |
| インターフェース  | I2C  |
| オドメトリ計算  | センサー上  |
| 大きさ  | とっても小さい  |
| 取り付け穴  | M3ネジ  |
| 取れる場所  | 屋内  |

これだけで購入決定ですね。

## いざセットアップ
このセンサーを使うためには以下のものが必要です。

- ジャンパー線
- はんだごて
- 適当なスペーサー
- Arduinoマイコン（今回はXIAO RP2040を使用）
- 定規

それでは、いい感じに線やスペーサーを取り付けます。　(**レーザーセンサーについている保護シールは必ず取ってください**)
↓いい感じにした結果。

![IMG_0679 Medium.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/899689/9977cdfa-03b6-31e3-4e1b-34feb9aba5fb.png)

できたら次は以下の通りマイコンに接続します。

| センサーのピン  | XIAOのピン |
|---|---|
| GND  | GND  |
| 3V3  | 3V3  |
| SDA  | SDA(P6)  |
| SCL  | SCL(P7)  |

## ソフト側の環境構築
必要なライブラリはこの二つです。zipでダウンロードして追加してください。

https://github.com/sparkfun/SparkFun_Qwiic_OTOS_Arduino_Library/tree/main?tab=readme-ov-file

https://github.com/sparkfun/SparkFun_Toolkit

あとはexampleから`BasicReading`を実行すると...あら不思議、オドメトリが出てくるじゃありませんか!!

![Screenshot 2024-06-13 at 1.31.08 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/899689/6fb9431a-e6ae-2240-9f49-7c8cd019e7cf.png)


## キャリブレーション
定規を当ててみると若干ズレていることがわかると思います。exampleにある`Calibration`を見てキャリブレーションしてみてください。

## 最後に
実際に触ってみた感想は「使えそう」です。若干キャリブレーションを詰める必要がありますが、概ね許容誤差内です。製品ページに記載されている誤差率通りの結果が出ます。センサーは若干上下に移動しても、しっかりとオドメトリを取得し続けてくれるのでGoodです。
ぜひみなさんも試してみてください。
【基本】アプリケーション動作ログについて

## 対象者
- 未経験からエンジニアを目指したい！と考えている方
- 経験の浅いエンジニアの方

## はじめに
こんにちは。
[株式会社メディアテック](https://www.mediatech.jp/)の和田です。

先日開発チームでログに関する勉強会を行いました。
そこで考えたこと・発見について記載します。

## 前提
 - Webアプリケーション開発を行うチームです
 - 発足して2年足らずの比較的若いチームです

## 開発チームの現状は？
 - ログの種類って何があるの？
 - 障害発生時に追いかけるのが大変、欲しい情報がない！

## ログのベストプラクティスを読んでみた！
 - [Heroku](https://devcenter.heroku.com/ja/articles/writing-best-practices-for-application-logs)
 - [OWASP](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Logging_Cheat_Sheet.md)
時間の都合上OWASPのセキュリティ視点のログは読み切れなかった…
ので、この記事はHerokuの「アプリケーションログ」について議論した内容が中心です。

### 正しいログレベルについて

| レベル | 内容 |
|:-----------|:------------|
| INFO       | 障害やエラーを表示しない情報メッセージ                              |
| WARN       | 潜在的な問題があるが、ユーザーエクスペリエンスに影響しないことを示す   |
| ERROR      | ユーザーエクスペリエンスにいくらか影響する重大な問題であることを示す   |
| FATAL      | ユーザーエクスペリエンスに大きく影響する致命的なエラーであることを示す |
| DEBUG      | アプリの開発者を対象としてデバッグに使用される                       |

### ログ出力が必須である場合
 - アプリケーションエラー
 - 入力および出力の検証の失敗
 - 認証の成功と失敗
 - 承認の失敗
 - セッション管理の失敗
 - 特権の昇格の成功と失敗
 - その他のリスクの高いイベント (データのインポートやエクスポートなど)
 - ログ記録の初期化
 - オプトイン (サービス利用規約など)

### ログ出力の検討が必要な場合
 - トラブルシューティング
 - 監視とパフォーマンスの向上
 - テスト
 - ユーザー行動の理解
 - セキュリティと監査


## 前職での経験を持ち寄ってみた
- ERRORをログを必要以上に出しすぎて怒られたことがある
- FATAlログを使ったことがある（DB周り）が、そもそもFATALログを使用するような実装をすべきではないのでは？
- IF文を使用してDEBUGログが開発環境のみ出るようにしていた


## 今後のログとの付き合い方
 - サーバーアクションの実行時間が延びることを考慮して、検知するためにWARNログを出してもよさそう
 - ログ集計ツールの導入もありかも。現状はExcelに出力して必要なときだけ見ている。
 - 障害発生時に必要な情報は都度考慮が必要なので、開発時にログ設計のプロセスを追加してみる（試運転中…）


## 参考文献
 - [Heroku](https://devcenter.heroku.com/ja/articles/writing-best-practices-for-application-logs)
 - [OWASP](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Logging_Cheat_Sheet.md)
cos2π/9+cos4π/9+cos8π/9,cos2π/9 cos4π/9 cos8π/9「2015 兵庫県立大学 前期工学部【５】」をChatGPTとsympyとWolframAlphaでやってみたい。

・ステキな問題です。

# オリジナル

・大学入試数学問題集成 様＞ 前期工学部【５】　テキスト

https://mathexamtest.web.fc2.com/2015/201511613/2015116130100mj.html#top-0110

# ChatGPT-3.5先生へ(1回目)
```
<p class="slevel"><a name="q-0110" 
id="q-0110" /><span 
class="qnum">【５】</span>　次の値を求めよ．</p>
<p class="s1level">(1)　<math>
<mrow><mi>cos</mi><mo>&af;</mo><mspace width=".2em"></mspace>
<mstyle displaystyle="true"><mfrac><mrow><mn>2</mn>
<mo>&it;</mo><mi>&pi;</mi></mrow><mn>9</mn></mfrac>
</mstyle><mo>+</mo><mi>cos</mi><mo>&af;</mo>
<mspace width=".2em"></mspace><mstyle displaystyle="true"><mfrac>
<mrow><mn>4</mn><mo>&it;</mo><mi>&pi;</mi></mrow>
<mn>9</mn></mfrac></mstyle><mo>+</mo><mi>cos</mi>
<mo>&af;</mo><mstyle displaystyle="true"><mfrac><mrow><mn>8</mn>
<mo>&it;</mo><mi>&pi;</mi></mrow><mn>9</mn></mfrac></mstyle>
</mrow></math></p>
<p class="s1level">(2)　<math>
<mrow><mi>cos</mi><mo>&af;</mo>
<mstyle displaystyle="true"><mfrac><mrow><mn>2</mn>
<mo>&it;</mo><mi>&pi;</mi></mrow><mn>9</mn></mfrac>
</mstyle><mo>&it;</mo><mspace width=".2em"></mspace>
<mi>cos</mi><mo>&af;</mo><mstyle displaystyle="true"><mfrac>
<mrow><mn>4</mn><mo>&it;</mo><mi>&pi;</mi></mrow>
<mn>9</mn></mfrac></mstyle><mo>&it;</mo>
<mspace width=".2em"></mspace><mi>cos</mi><mo>&af;</mo>
<mspace width=".2em"></mspace><mstyle displaystyle="true"><mfrac>
<mrow><mn>8</mn><mo>&it;</mo><mi>&pi;</mi></mrow>
<mn>9</mn></mfrac></mstyle></mrow></math>
</p>
</div>
</div>
```
```
日本語で
```
よって、答えは0
よって、答えは-1/8

# ChatGPT-3.5先生へ(2回目)sympyのソース
・print文を直しています。だんだんわからなくなってきました。
```python
import sympy as sp

# Define the variables
pi = sp.pi

# Define the angles
theta1 = 2 * pi / 9
theta2 = 4 * pi / 9
theta3 = 8 * pi / 9

# Calculate the sum of cosines
cos_sum = sp.cos(theta1) + sp.cos(theta2) + sp.cos(theta3)

# Calculate the product of cosines
cos_product = sp.cos(theta1) * sp.cos(theta2) * sp.cos(theta3)

cos_sum_value = cos_sum.evalf()
cos_product_value = cos_product.evalf()

cos_sum, cos_sum_value, cos_product, cos_product_value

print("#",cos_sum, cos_sum_value, cos_product, cos_product_value)
print("#",sp.simplify(cos_sum), sp.simplify(cos_sum_value), cos_product, sp.simplify(cos_product_value))
# -cos(pi/9) + cos(4*pi/9) + cos(2*pi/9) 0.e-125 -cos(pi/9)*cos(2*pi/9)*cos(4*pi/9) -0.125000000000000
# -cos(pi/9) + sin(pi/18) + cos(2*pi/9) 0.e-125 -cos(pi/9)*cos(2*pi/9)*cos(4*pi/9) -0.125000000000000
```

# sympyで(オリジナル 様の方法を参考に)
省略

# WolframAlphaで
・丸括弧が必要でした。

https://www.wolframalpha.com/input?i=cos%282%CF%80%2F9%29%2Bcos%284%CF%80%2F9%29%2Bcos%288%CF%80%2F9%29%2Ccos%282%CF%80%2F9%29+cos%284%CF%80%2F9%29+cos%288%CF%80%2F9%29&lang=ja

別の形
{0, -1/8}

https://www.wolframalpha.com/input?i=cos%282%CF%80%2F9%29%2Bcos%284%CF%80%2F9%29%2Bcos%288%CF%80%2F9%29&lang=ja

https://www.wolframalpha.com/input?i=cos%282%CF%80%2F9%29+cos%284%CF%80%2F9%29+cos%288%CF%80%2F9%29&lang=ja


# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

# いつもと違うおすすめです。

https://qiita.com/mrrclb48z/items/555d85face87552c34fb
BigQueryでのパーティションテーブル作成とクエリ

## はじめに
BigQueryでパーティションテーブルを作成し、クエリを実行する方法について説明します。パーティションテーブルを使用することで、大規模なデータセットのクエリパフォーマンスを向上させ、コストを削減することができます。今回は、サンプルデータを作成し、それを月ごとにパーティション化する方法を紹介します。

## サンプルデータの作成

まず、サンプルデータを作成します。以下のSQLクエリを使用して、サンプルデータを含むテーブルを作成し、データを挿入します。

```sql
-- サンプルデータを作成するテーブルを作成
CREATE OR REPLACE TABLE `project123.sample_dataset.sample_data` (
  id INT64,
  name STRING,
  value INT64,
  created_date DATE
);

-- サンプルデータを挿入
INSERT INTO `project123.sample_dataset.sample_data` (id, name, value, created_date)
VALUES 
  (1, 'Alice', 10, DATE '2023-01-01'),
  (2, 'Bob', 20, DATE '2023-01-02'),
  (3, 'Charlie', 30, DATE '2023-01-03'),
  (4, 'David', 40, DATE '2023-02-01'),
  (5, 'Eve', 50, DATE '2023-02-02'),
  (6, 'Frank', 60, DATE '2023-03-01'),
  (7, 'Grace', 70, DATE '2023-03-02'),
  (8, 'Heidi', 80, DATE '2023-04-01'),
  (9, 'Ivan', 90, DATE '2023-04-02'),
  (10, 'Judy', 100, DATE '2023-05-01');
```

このクエリは、`project123.sample_dataset`データセット内に`sample_data`というテーブルを作成し、10件のサンプルデータを挿入します。各レコードには、ID、名前、値、作成日が含まれています。
![スクリーンショット 2024-06-13 13.02.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/ffadda2b-bc0e-40a3-1e72-d5feefd2a072.png)


### パーティションテーブルの作成

次に、作成したサンプルデータを基に、パーティションテーブルを作成します。ここでは、`created_date`を基に月ごとにパーティションを作成します。

```sql
-- パーティションテーブルを作成
CREATE OR REPLACE TABLE `project123.sample_dataset.partitioned_sample_data`
PARTITION BY DATE_TRUNC(created_date, MONTH) AS
SELECT id, name, value, created_date
FROM `project123.sample_dataset.sample_data`;
```

このクエリは、`created_date`を基に月ごとのパーティションを作成します。`DATE_TRUNC`関数を使用することで、日付を月単位に切り捨て、パーティション化を行います。
![スクリーンショット 2024-06-13 13.11.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/2ce92e93-0e2e-a359-6bdd-cfece06c5318.png)
テーブルの見た目に違いはありません。
![スクリーンショット 2024-06-13 13.15.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/4bed88e7-04af-b8d7-a31c-f90f64665c1b.png)

## パーティションテーブルのクエリ

パーティションテーブルをクエリする際には、特定のパーティションのみを対象とすることで、クエリのパフォーマンスを向上させることができます。以下のクエリでは、特定の日付のパーティションを対象としています。

```sql
-- 特定のパーティションをクエリ
SELECT * FROM `project123.sample_dataset.partitioned_sample_data`
WHERE created_date = '2023-02-01';
```
このクエリは、`created_date`が2023年2月1日のデータのみを取得します。パーティション化されたテーブルを使用することで、大量のデータから特定の範囲を効率的に抽出できます。
![スクリーンショット 2024-06-13 13.06.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/d2da628d-2d8e-9cfc-f8ae-ae8d1ecb4181.png)


## パーティションテーブルの利点

パーティションテーブルを使用することで、次のような利点があります。

1. **クエリパフォーマンスの向上**: 必要なデータのみをスキャンするため、クエリの実行速度が向上します。
2. **コストの削減**: スキャンするデータ量が減るため、クエリ実行にかかるコストを削減できます。
3. **管理の容易さ**: データを特定の範囲で分割することで、大規模データセットの管理が容易になります。

## 結論

BigQueryのパーティションテーブルは、大規模なデータセットのクエリパフォーマンスを向上させるための強力なツールです。今回紹介した方法を参考にして、パーティションテーブルを活用し、効率的なデータ処理を実現してください。
マルチディスプレイでウィンドウをドラッグするとディスプレイの境目で引っかかる問題

Windows11では解決しているが、Windows10ではマルチディスプレイでもう一つのディスプレイにウィンドウを移動しようとすると、境目で引っかかってしまう問題がある。
これは境目でもウィンドウスナップが効いてしまうのが原因なので、「システム」の「マルチタスク」から「ウインドウのスナップ」をOFFにしてしまえばいいのだが、逆に一番上に持って行ったときに全画面にならないのも困るのでツラいところ。

まあ実はスナップをOFFにしなくても解決する方法はあるのだが、それが
・高速でウィンドウを動かす
なので技術者的にはひっくり返るところ。スナップ判定が出る前に通り過ぎればいいということなのだろうが。
素直に11にしろってのはその通りです。
ネットワークの基礎知識①

ネットワーク・・・つながり

コンピューターネットワーク・・・情報（データ）をやり取りできるようにしたもの

LAN・・・一つの建物や敷地など限られた場所で構築されたネットワーク。
例：家庭で複数のPCやプリンタを接続したネットワーク
有線LANや無線LANがある。

WAN・・・地理的に離れたLANとLANを繋いだネットワークです。
WANは通信事業者が提供するサービスを使用して構築されます。

ノード・・・コンピュータネットワークは、点（機器）とそれを結ぶ線（リンク）で構成される。この一つの点をノード（node）と言います。

インターネット・・・世界中のコンピュータが網の目のように繋がれた巨大な地球規模のネットワークです。インターネットは誰でも自由に利用できる。

ISP・・・インターネットを利用するには、回線を提供している通信事業者とは別に、インターネットの接続サービスを提供する事業者と契約する必要がある。それをISPまたはプロバイダという。

AS・・・接続が複雑にならないように、ある程度のネットワークを一つのまとまりにして管理する仕組み。

ネットワークトポロジ・・・ネットワークに機器（ノード）をどのようにつなぐかを表す接続形態。

①バス型トポロジ
１本のバスと呼ばれるケーブル上に各ノード（機器）を形態。

②スター型トポロジ
ハブやスイッチなどの集線装置を中心に各ノードを繋いで、お互いに通信できるようにする形態です。１本のケーブルが断線しても影響を受けるのはそのケーブルを使用しているノードだけで、他のノードは通信を続けることができます。

③メッシュ型トポロジ
メッシュ型トポロジは、多くのノードを網状に相互接続する形態です。
何番煎じ、かつ定期的に考えてしまう「投稿するならQiitaかZennか」問題の考察


:::note alert
元記事タイトルは「QiitaCLIで作成したファイルはpublish時にBOTが走ってID更新してくれる？かチェックする記事」です
検証が終わったので、内容は検証記事に移行しました
:::

検証記事でバッジもらい逃げというのは個人的にも気に入らないので、検証が終わってからきっちり再利用しました。

## 結論
「キャンペーンがあればQiita、なければZenn」かな。
以下、そこまでに至るプロセスとQiitaCLIとZennCLIの話も含めて悩む様子をお届けしてます。

---

## QiitaCLI使うならgithub.devでいけるやん！→しかし…
github.devでは[Qiita PreviewのVSCode拡張機能](https://marketplace.visualstudio.com/items?itemName=ryokat3.vscode-qiita-markdown-preview)が使えないので、これはもう諦めるしかない😢

ゴリゴリのQiita使いならQiita専用のマークダウン拡張記法にも対応できるはずですが、Zennにも浮気気味の私は、時々messageと書いておっかしーな🤔となる事がまー、あります。
ので、こういうちょっとしたミスに気づく仕組みとしてプレビュー機能はとても大事なのです。
（細かい事を言うと、QiitaからZennに乗り換える、または逆を行う場合はこういった細かい拡張記法の書き方を置換する必要もあります。結構面倒くさい）

ちなみに、Zennの拡張機能も同じ問題があります。
結局ローカルに持ってくるしかない

## Zennが優れていると感じる点
Zennは後から編集をする必要がありません。具体的にいうと、キャンペーンの投稿がありません。編集で追加すると言う作業を行う必要があるため、Qiitaの場合、色々な催しがあるので執筆意欲は高まるのですが、結局Webエディタを使わなければならないためCLIのメリットが消えてしまっています。
そのため「Zennがいいよ！」というより「Qiitaもいいのに痒いところに手が届かなくて残念」という気持ちが強い。

ある意味「GitHub連携したらWebエディタは使えんよ」というスタンスのZennはわかりやすくなるという意味では良いのかもしれない。
特に、本にまとめる機能が便利で使っているところもありますね。
ある程度続き物というか、シリーズとして管理したい場合などは特に。おかげでCMS上でも「これとこれは繋がりのある記事だから！」という運用ができています。

## とはいえ、Qiitaの投稿キャンペーンに魅力がある！
と、Zennユーザーでもありnoteユーザーでもある私は思います。
投稿企画の魅力で言えばQiitaで、エンジニアリング以外の話がしたいならnoteに書く（ある意味宣伝的な要素も含みつつ）という形で運用を分けています。

## どうやって記事データと投稿先を管理するか？
最終的には記事を個人所有のCMSで頑張って保持しつつ、GitHubを活用しながら色々なところに送信するわけですが[^1]、送信先自体も管理したいのでフロントフォーマッターとか独自記法（せっかくなので、この記事を試験的に使おうとしてます）が色々あって、それらもチェックすると相当面倒臭い。

拡張機能も便利なものが多いので、本家にうまいこと組み込んでくれないかなー、という気持ちでいっぱいです。

## そもそも、なんでQiitaとZenn（とnote）なの？
最初に書くべきでした、特定のブログサービスへ登録するとスコアになるサービスを展開しているサイトがあり、こちらを活用しようとしています。
スコアを上げるだけなら不正な手段などいくらでも思いつきますが、そういうのは良くないよね！という前提での運用を考えるのが本稿です・

## キャンペーンがあればQiita、なければZenn
かな。
どちらも長所をうまいこと使えるのが良いのですが、単純に私がQiitaよりZennの方が好みだというだけですね。
Qiitaの方が好き！という方は一本で統一しちゃっていいと思います。

## 注釈
[^1]: 【マルチポスト】よくない派のため、やってません。一時期規約云々の話題になり、記事をバックアップしようというモチベーションは高かったのでコンテンツを保持する事は大事だと考えています。
あまり知られていないLaravelのコレクションメソッド #1: macro

# 目次
1. あまり知られていないLaravelのコレクションメソッド #1: macro （本記事）
1. [あまり知られていないLaravelのコレクションメソッド #2: concat](https://qiita.com/aminevg/items/8c3fbd6c7381836a4055)

# 背景

Laravelのコレクション、使いこなしていますか？

以下の記事を先程読んで面白いと思いました。

「あなたは使ったことがないLaravelのコレクションメソッド10選」

https://backpackforlaravel.com/articles/tips-and-tricks/top-10-collection-methods-you-have-never-used

ただし、英語で書かれていますし、各メソッドの説明が不十分に感じました。
ということで、以上の記事を翻訳する上で、それぞれのメソッドの活用方法を説明していきたいです！
今回はCollectionのmacroメソッドを解説します！

# macro: 全てのコレクションにカスタムメソッドを追加する

### 概要

スタティックメソッドになり、以下のように呼び出すことができます。

```php
Collection::macro('カスタムメソッド', function ($arg1, $arg2) {
    // カスタムメソッド処理
});
```

定義したカスタムメソッドはどのコレクションでも使えます！

```php
collect([1, 2])->カスタムメソッド(1, 'abc'); // 日本語のメソッド名はあり！！
```

実用性が意外と高いです。例えば、コレクション内の文字列を大文字に変換するには↓

```php
Collection::macro('toUpper', function () {
    return $this->map(fn ($value) => Str::upper($value));
});

collect(['abc', 'def'])->toUpper();
// ['ABC', 'DEF']
```

全角半角変換も簡単にできます！
```php
Collection::macro('toZenkaku', function () {
    return $this->map(fn ($value) => mb_convert_kana('ask'));
});
Collection::macro('toHankaku', function () {
    return $this->map(fn ($value) => mb_convert_kana('ask'));
});

collect(['811', 'John', '-'])->toZenkaku();
// ['８１１', 'Ｊｏｈｎ', '－']
collect(['８１１', 'Ｊｏｈｎ', '－'])->toHankaku();
// ['811', 'John', '-']
```

### カスタムメソッドの定義はどこに置くの？

公式ドキュメント曰く、

> Typically, you should declare collection macros in the boot method of a [service provider](https://laravel.com/docs/11.x/providers).

> 通常、コレクションマクロは[サービスプロバイダ](https://readouble.com/laravel/11.x/ja/providers.html)のbootメソッドで宣言する必要があります。

ということで、AppServiceProviderに置きましょう。

```php:app/Providers/AppServiceProvider.php
class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     */
    public function boot(): void
    {
        Collection::macro('カスタムメソッド', function ($arg1, $arg2) {
            // カスタムメソッド処理
        });
        // ...
    }
}
```

### 参考

https://laravel.com/docs/11.x/collections#extending-collections

https://readouble.com/laravel/11.x/ja/collections.html#:~:text=%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E6%8B%A1%E5%BC%B5,%E8%BF%BD%E5%8A%A0%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82

# まとめ

いかがでしたか？
今度はconcatメソッドなど、あまり知られていないLaravelのコレクションメソッドをさらに解説していきたいです。
ではまた！
インフラエンジニアなど

# ネットワークエンジニアとは
ネットワークシステムの設計から構築、運用などを幅広く担うエンジニアです。

# インフラエンジニア・サーバーエンジニアとの違い

インフラエンジニア
    ーネットワークエンジニア
    ーサーバーエンジニア
    ークラウドエンジニア
    ーセキュリティエンジニア
インフラエンジニアの種類の中の一つがサーバーエンジニア

・ネットワークとは
複数のコンピューターを結び、データなどを共有し、情報処理の効率化を図るシステム。具体的にはインターネットやLAN (ラン) などをさす。

・サーバーとは
他のコンピュータ（クライアント）から要求や指示を受け、情報や処理結果を返す役割を持つコンピュータやソフトウェア

・クラウドとは
ユーザーがインフラやソフトウェアを持たなくても、インターネットを通じて、サービスを必要な時に必要な分だけ利用する考え方

# ネットワークエンジニアの仕事内容
ー上流工程ー
●要件定義
クライアントへのヒアリングを実施して、現状の問題点や必要とする機能、目的、予算などをすり合わせて要件を決定する。

●設計
クライアントからのヒアリングで定められた要件定義をもとに、設計するネットワークの方針や詳細を固めていく。

●構築
ネットワークを構築することで構築を具体化する業務。

ー下流工程ー
●保守
ネットワークシステムにトラブルや異常が判明した際に対処

●運用
ネットワークシステムの安定稼働を図るために、障害やトラブルを未然に防ぐシステム運用を行う維持管理業務

●監視
ネットワークシステムが正常に動作しているかを確認する業務
「リモート窓際族」のすすめ

:::note warn
ここでの「リモート窓際族」とは、リモートワークで日の光を取り入れるべく、窓に向かって仕事している人たちのことを言います。実際の「窓際族」の意味は含まれません。
:::

## 背景

![time1_asa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486784/ac77f622-c6c8-908c-a9ad-b954f66b75ff.png)

自宅の窓際で仕事していると、幾度となくすがすがしい気持ちになりました。  
この気持ち、共有したい。ただそれだけの理由でこの記事を書きます。

（いらすとやさんの画像を 9 枚使わせてもらいました。ありがとうございます。）

## 触れないこと

リモートワークの良さそのものについてはここには書きません。

## 窓際で仕事することのメリット

### 日光を浴びてビタミン D を生成できる

![nikkouyoku_man.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486784/f876d80a-a410-3cc4-605c-dc6e9b71bc6a.png)

日光を浴びることで、ビタミン D やセロトニンが生成されます。

ビタミン D はカルシウムやリンの吸収を促進し、骨や歯を丈夫にします。  
また、セロトニンには心身をリラックスさせる効果があります。

[再春館製薬所の記事](https://www.saishunkan.co.jp/goodaging/lifestyle/020/) によると、次のような効果があると言われています。

> 日光浴によりセロトニンやビタミンDが分泌されることで、ストレス解消やリラックス効果も期待できます。ストレス解消することで、集中力の向上や疲労解消にもつながります。  
> メンタルヘルスの不調を未然に防ぐためにも、日光浴を日常的な習慣として取り入れるのがおすすめです。

このように、日光浴では多大な効果を得られます。  
リモート窓際族になると、この効果を年平均 1,900 時間も受けられるのです（気象庁・日照時間の 1990 年～ 2020 年平年値）。

### 会議で明るい顔を見せられる

![computer_man4_laugh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486784/8bd98f5a-b8e4-79c7-5a86-9b4bdf1c8b92.png)

外の光に顔を向けて仕事をするので、顔に光がよく当たり、オンライン会議で印象が良くなります。もちろん、元気がない日も元気だと思わせることができます。  
私の体験では、晴れの日に限らず、雨の日でも十分顔を明るくすることが可能です。

### 電気代を節約できる

![money_kakeibo_happy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486784/557d20bd-9a41-abcd-4226-598697098538.png)

天然の光で仕事ができるため、昼間から照明をつける必要がなくなります。

## 窓際で仕事することのデメリット

### ポジションによっては窓枠の影が顔に重なり、良からぬ表情に見えることもある

![megane_hikaru_woman.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486784/10459db9-708f-a976-e270-76787e05a900.png)

執務ポジションによっては、顔の真ん中に窓枠の影が重なることもあります。  
私も以前、顔に影が立ち込めたことで、会議の際に悪い人だと間違えられてしまったことがありました。

机の位置を調節して、いいポジションで会議に臨みましょう。

### エディタにダークテーマを設定している場合、日光が強すぎると画面が見えにくくなる

![eye_ganseihirou_computer_woman.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486784/007dbbfa-214e-6a7e-afd4-dc9b1fe1fa93.png)

これはリモート窓際族の宿命とも言える問題です。  
対処しようとして、画面の明るさを上げることになり、かえって電気代を浪費してしまうことも少なくありません。

日中はライトテーマにしたり、レースカーテンや置物などで光を遮るなど、調整しましょう。

### 冬季は太陽が低い位置にあり、日光を直接目で見てしまう危険性が高まる

![mabushii_man.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486784/f5762b47-21fa-38ea-9d42-aba479b04bc9.png)

日光を直接目で見てしまうと、目を傷めてしまう可能性があります。  
良かれと思ったことで体に害が発生しては、元も子もなくなってしまいます。

カーテンを一部閉めたり、少し窓から離れるなどして、日光を直接見ることの無いようにしましょう。

---

これらデメリットを解消するために部屋中を移動しなければならないこともあります。

![computer_nekorogaru_man.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486784/50c88d1b-fed9-c672-4dff-013eaf157245.png)

おすすめは座椅子に座り、ちゃぶ台の上に PC を置くことです。  
執務ポジションをいつでも動かせるようにし、コード設計だけでなく仕事ポジションの設計も変更に強いものへ変えていきましょう。  
外部ディスプレイは、可動式のディスプレイスタンドに取り付けるのが良いでしょう。

## まとめ

![osusume_text.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486784/97f53729-89bf-7ec7-2e86-42e0f80027be.png)

今回ご紹介してきたリモート窓際族。前述のメリットから、この方法は健康・お金・対人関係すべてにおいて効果が得られる画期的な方法です。

みなさんもぜひやってみてください。
【ChatGPT＋DALL-E3】でのポイントと注意点。


　どうも、カーブミラーです。

　今回は、生成する際のポイントと注意点。昨日の記事に補足しました。

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3で行なっております。
画像はありません。あしからず。
:::

　まずは、ニュース。

　Luma AIから
　　動画生成AIが公開されました。
　　　Dream Machineです。
[Luma AI  Dream Machine](https://lumalabs.ai/dream-machine/creations)

　テキストから
　　動画を生成することも
　　　画像＋テキストから
　　　　生成することも可能。

　しかも現在は
　　WaitList待ちもなく、無料。

　ただし、
　　生成時間が二分とあるが、
　　　現在混み合っているらしく
　　　　5分10分は当たり前と
　　　　　覚悟しておきましょう。

　私も三度やってみましたが、
　　いい結果にはならなかったです。
　　　Prompt次第なのかも。

　それでも
　　街なかのクルマが
　　　自然に動いて、
　　　　画像ではいなかったクルマが
　　　　　出てきたりと
　　　　　　いい感じは受けました。

　あと、
　　入力は
　　　画像だけはダメみたいです。
　　　　アップロードしても
　　　　　送信ボタンが
　　　　　　グレーのままでした。

　それと
　　Promptだけの方がきれいかも。

　サンプルPromptも
　　出してくれるので
　　　それらを集めて、
　　　　欲しいPrompt生成を
　　　　　ChatGPTに解析させるのも
　　　　　　ありかもね😸
***
　昨日（2024/06/12）の記事は
　　いかがでしたか？
[【ChatGPT＋DALL-E3】六枚の羽の天使セラフィムを描きます。](https://qiita.com/kabumira/items/f263f533062e2c66f239)

　今回は、ポイントの補足です。

　まずは、昨日書きましたポイントを
　　抜粋して再掲載。
***
***記事再掲載***
　ここでのポイントは
　　・PromptShareのPrompt使用。
　　・質問。
　　・質問から得られた情報を
　　　　Promptに組み込む。
　　・ダメな画像をアップロードして
　　　　事実を確認させる。

　あとは
　　今回は使いませんでしたが、
　　　Promptの確認ですね。
　　　　余計な文言がないか
　　　　　間違った指示じゃないか、
　　　　　　ネガティブ文言は？

　　　これらを
　　　　チェックすることは
　　　　　確実な生成を
　　　　　　手助けすることに
　　　　　　　なることでしょう。
***
　ここで出てくるPromptShareは
　　下記を参照してください。
[【ChatGPT＋DALL-E3】で苦戦している方（初心者）でもイメージを言語化できれば、盛ってくれるPromptShare](https://qiita.com/kabumira/items/651829e852129496b467)

　これは
　　作った自分が
　　　一番使っているかも
　　　　しれませんね😅

　画風スタイルとアスペクト比、
　　それにイメージを書けば、
　　　ChatGPTが盛ってくれる
　　　　Promptです。

　ふつうにPromptを
　　書くのも悪くはありませんが、
　　　こうしたPromptを使うことで
　　　　試行錯誤の手間を減らせます。

　また、これを使ったあとは
　　ふつうにやり取りで
　　　イメージに近付けていくのは
　　　　いつものとおりです。
***
　さて、
　　ほかのポイントです。

　選択する（Select）機能を
　　使う場面もあります。

　何もない空間に
　　何かを出す場合、
　　　注意したいのがサイズ感。

　また、
　　服の上などに
　　　コサージュなどの
　　　　付属品を出そうとしても
　　　　　出ないことが多い。
　　　　　　これも注意点。

　ただ、Promptをチェックすると
　　組み込まれているので
　　　いつ出てくるのか
　　　　どこに出てくるのか
　　　　　わかりません。

　すでに描かれているものを
　　変更するのは、得意なので
　　　こちらを使うようにしましょう。

　編集する（Edit）機能は
　　再描画なので、構図やデザインが
　　　変わってしまう可能性が大きい。
　　　　これも注意しましょう。
　　　　　私は使うことはないです😅

　とりあえず
　　こんなところでしょうか。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
AI-900合格体験記

## 結果
1000点満点中942点

## ai skills challenge 2024 
こちらで獲得した無料チケットにて変更後の試験を受けてきました

## 参考資料
Examtopics
JPNTest

## テスト概要
43問 45分 ケーススタディなし

## 単語
単語が変わってました。
Form RecoginizerはDocument Intelligenceへ変わったり
LUIS,QnA Makerとかの複数の旧名称サービスは、Languagサービスへ変わってました。

## 感想
OpenAIの問題が出ました！けど答えが全然わかりませんでした…残念。

Oracle AIの試験と比べると、Azure AIの試験の方が難しかったです。
あと、生成AIパスポートの試験も受けたので結果待ちです。

次はVBA Standard受けます。

## 追記(2024/7/22)
生成AIパスポート合格！公式テキストが、わかりやすかった。
生成AIの勉強って面白いから、今年中に、pythonの資格も取りたいね。面白そうだし、簡単そうな気がするんだよね。どうなのかな。
VBAで「実行時エラー‘1004’ 呼び出しのターゲットが例外をスローしました」がファイルを保存するタイミングで出た

原因は「保存しようとするエクセルファイル名と開いてるエクセルファイルの名前が同じ」でした。同じ名前のエクセルファイルを閉じることで解決。
「エラー1004」も「呼び出しのターゲットが例外をスローしました」も様々な原因があるエラー表示のようなので備忘録として残しておきます。