OmniAICreator/Qiita-1.07M huggingface dataset:
【AWS】オンプレ環境のログファイルをS3に移行させる方法

## はじめに
オンプレサーバのログファイルをS3に移行させないといけない事案を対応したので備忘録として記事にします。

## 方法
AWS CLIを使ってコマンドでS3にファイルを送っていきます。
今回使うのは「S3 Sync」です。

## 手順
### AWS環境側の用意
まず連携先となるAWS環境のS3を用意します。
その次に連携する時の認証で使うIAMユーザも用意しておきます。
IAMユーザ作成する時アクセスキーも作成して情報を控えておいてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3577451/3c6dd95c-14cb-8b1f-56cb-56d1c2ed4b7a.png)

### オンプレサーバ側の用意
サーバにAWS CLIをインストールします。（OSによってインストール方法違うので皆さん自分の環境にあった記事を参考にしてください！）

AWS CLIがインストールされているか確認
```
$ aws --version
```

サーバに作成したIAMのクレデンシャルを登録します。

サーバ上でクレデンシャル複数登録する可能性もあるので名前つけて登録した方がいいかなと思います。

```
$ aws configure --profile 【適当な名前】
```
上記のコマンドを打った後は流れに従ってアクセスキーやシークレットキーなどを登録してください。

### ファイルを移行する
ここで「S3 Sync」を使います。
このコマンドは指定したディレクトリと指定したS3を同期させるコマンドです。
▼詳しいことが知りたい方はこちら↓（公式）
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-services-s3-commands.html

以下の形でコマンドを打ちます。
```
$ aws s3 sync 【オンプレ上のログファイルが格納されている場所のパス】 s3://【バケット名】/ --profile=【クレデンシャル名】
```
これで連携できているはずです。
自分が実行した時は700ファイルくらい、500MBほどで5秒もかかりませんでした。

## さいごに
やっぱりサーバ上でコマンド打って作業するのはいつになっても緊張しますね。。
最初はテスト用のサーバ・テスト用のS3を用意して試してみるのがいいと思います。

オンプレからS3にファイルを移行するやり方は色々あると思うのでおススメなやり方があれば教えてください！
読書感想文　10月編

## 10月の課題図書
『新版　エンジニアのための文章術　再入門編』(芦屋広太 著)を読みました。手に取った理由は、分かりやすい文章を素早く書く知恵を身に着けたいと思ったからです。
昔から「分かりやすい構成はないか」「どう表現すればいいか」考える時間が長い傾向にありました。ただ、"文章の型"を持っていればその分構成を考える時間が減ります。この本を読んで"文章の型"を身に着けるきっかけになればと思い手に取りました。

## 概要
本書はビジネス文章の書き方がメインです。エンジニアが日ごろの業務で書くことになるであろう文章(報告書、議事録、提案書など)を場面を想定して書き方のポイントがまとめられていました。本書前半は、どんな場面でも使える汎用的な文章作成のポイントが書かれているので、気になる方は前半部分だけでも読んでみてください。

## 学び
- **良い文章とはダメな文章でないこと**
良い文章を書こうとすると終わりがありません。**どのような目的で、誰に対して作成すること**を意識することが、ダメな文章を避ける第一歩です。

- **言いたいことを一番最初に持ってくる**
ピラミッド型の文章構成といわれるものです。言いたいことを一番最初に書くことで、主張が一目でわかりやすくなります。外部研修でも口酸っぱく言われました。

## 最後に
本書は、エンジニアに関わらず社会人1年目が読むのにピッタリな内容でした。簡潔にポイントがまとまっているので時間をかけずに読み切ることができました。
思い返すと学生時代は、他人に文章を書くことはほとんどありませんでした。論文作成時も指導教員の添削に従ってばかりなので、構成の意図を気にしていませんでした。文章校正の意図を再確認する目的では本書はおすすめです。
Docker PHP:8.1 ImageMagick で PDFを画像に変換

# やろうとしていること
・Docker環境内にImageMagickをインストール
・PHP（Laravel）でPDFを画像に変換

# 環境情報
PHP：8.1
Laravel：10.22.0

# Dockerfileへの記述

Docker環境内にimagemagickをインストール
phpのモジュールにImagickを追加

```Dockerfile
RUN apt-get update \
&& apt-get install -y \
libmagickwand-dev imagemagick \
&& pecl install imagick \
&& docker-php-ext-enable imagick
```

# Dockerの起動し直し

```terminal
// 起動しているコンテナを停止
docker-compose stop

// 過去のコンテナを削除
docker rm docker ps -a -q

// dockerイメージの一覧表示
docker images

// 削除するイメージを選んで削除
docker rmi 【IMAGE ID】

// 起動し直し
docker-compose up -d

// 起動したコンテナの中に入る
docker-compose exec app bash

// ImageMagickのバージョン確認
convert -version 

// imagickがphpモジュールに含まれているかチェック
php -m | grep imagick
→imagick

```

# PHPファイルにImagickの記述

サンプルコード
↓

```php
use Imagick;


$im = new Imagick();
$file_path = storage_path('app/public/pdf/pdf_sample.pdf');
//画像を生成したいPDFを読み込む
$im->readImage($file_path);
//ページ数を取得する
$totalPage = $im->getImageScene();

for ($i = 0; $i <= $totalPage; $i++) {
    //PDFのページ
    $im->setImageIndex($i);
    //サムネイルサイズ 640pxに収める
    $im->thumbnailImage(640, 640, true);
    //シャープ
    $im->sharpenImage(0, 1);
    //生成
    $im->writeImage('out_' . $i . '.jpg');
}
```

上記を試そうとすると。。。
pdf脆弱性に対応した権限エラーが発生します

```terminal
attempt to perform an operation not allowed by the security policy `PDF' @ error/constitute.c/IsCoderAuthorized/421
```

それを次の項目で対応します。

# Imagemagick の gs pdf脆弱性対応の無効化


vi /etc/ImageMagick-6/policy.xml
下記の箇所を削除する

```xml
<policy domain="coder" rights="none" pattern="PS" />
<policy domain="coder" rights="none" pattern="PS2" />
<policy domain="coder" rights="none" pattern="PS3" />
<policy domain="coder" rights="none" pattern="EPS" />
<policy domain="coder" rights="none" pattern="PDF" />
<policy domain="coder" rights="none" pattern="XPS" />
```

ここで権限を管理しています。コメントアウトでもOK。

```terminal
// コンテナの中から出る
exit

// コンテナの停止
docker-compose stop

// コンテナの起動
docker-compose up -d

```

もう一度PHPファイルのImagickの挙動を確認すると。。。
↓
問題なくPDFが画像に変換されました！

終わりです。

# 補足
imagickでjpegに変換すると背景が黒色になるので
pngに変換してからの工夫が必要。
https://www.codelab.jp/blog/?p=2346


# 参考
・Imagemagick の gs pdf脆弱性対応の無効化
https://gordiustears.net/imagemagick-の-gs-pdf脆弱性対応の無効化/
・Class 'Imagick' not found Error
https://hapicode.com/php/imagick-error.html#imagick-%E3%83%A2%E3%82%B7%E3%82%99%E3%83%A5%E3%83%BC%E3%83%AB%E5%85%A5%E3%81%A3%E3%81%A6%E3%82%8B%E3%81%8B%E7%A2%BA%E8%AA%8D
・PHPのImagickで「Unable to load dynamic library ‘imagick.so’」とWarningが出て読み込まなくなった件
https://uteee.com/system/5930/
Amazon Linux 2 に ImageMagick 7 をインストールする(PHP)
https://qiita.com/qwe001/items/110bc0a12d56052aeb01
Auth0のセッション、リフレッシュトークン、アクセストークンの持続時間

Auth0にはアクセストークンとリフレッシュトークンの他にセッションの有効期限も設定できます。セッションの有効期限の知識がなく、「リフレッシュトークンの有効期限超えてるのになんでログインできてるんだ」となったので備忘録

## アクセストークンの有効期限
- Applications -> APIs -> 該当API -> Token Expiration & Token Expiration For Browser Flows で設定可能
- これは単純にアクセストークンの有効期限
- デフォルトは86400秒（24時間）

## リフレッシュトークンの有効期限
- Applications -> Applications -> 該当Applications -> Refresh Token Expirationで設定可能
- リフレッシュトークンはアクセストークンの有効期限が超えたときに新たにアクセストークンを取得するときに使用する。
- デフォルトは期限なし
- リフレッシュトークンを使用したトークン取得が行われた場合、Monitoring -> Logs  でDescriptionに`Successful Refresh Token exchange` という文言が入ったログが出る。

## セッションの有効期限
- Tenant Settings -> Advanced -> Login Session Managementで設定可能
- デフォルトは4320分（72時間）
- Silent Authenticationで使用される。Silent Authenticationについては[リンク](https://auth0.com/docs/authenticate/login/configure-silent-authentication)を参照。ざっくり言うと画面遷移をせずにログインを実行してアクセストークンを取得する。
- Silent Authenticationが行われた場合、Monitoring -> Logs  でDescriptionに`Successful Silent authentication` という文言が入ったログが出る。

## ログイン後に再度トークンを取得するときの流れ

- 有効期限がアクセストークン < セッション < リフレッシュトークンの場合
  - アクセストークン有効期限が切れたら、リフレッシュトークンでのトークン取得が行われる。リフレッシュトークンの有効期限が切れていた場合は再度ログイン画面からのログインが必要。

- 有効期限がアクセストークン < リフレッシュトークン < セッションの場合
  - アクセストークンの有効期限が切れたら、リフレッシュトークンでのトークン取得が行われる。リフレッシュトークンの有効期限が切れていた場合、Silent Authenticationが行われる。セッションの有効期限も切れていた場合は再度ログイン画面からのログインが必要。

## まとめ
基本はデフォルト通りの アクセストークン < セッション < リフレッシュトークン にする。

参照
https://dangerous-animal141.hatenablog.com/entry/2021/06/08/220637
https://auth0.com/docs/tokens/refresh-tokens/refresh-token-rotation
https://auth0.com/docs/authorization/configure-silent-authentication
Pythonで今日の週数を取得

## はじめに
Pythonの備忘録です。

## 内容
今日が月の何週目なのかを割り出す。


```python:main.py
import calendar
import datetime

def get_week_of_month(year, month, day):
    month_calendar = calendar.monthcalendar(year, month)
    for index, week in enumerate(month_calendar):
        if day in week:
            return index + 1

# 使用例
today = datetime.date.today()
week_of_month = get_week_of_month(today.year, today.month, today.day)

print(f'{today}は{week_of_month}週目の週です。')

# 1月1日の場合　　2023-01-01は１週目の週です。
```


## 使うライブラリ、モジュール
* schedule
* datetime


## 押さえておくべき点
* scheduleは一番最初の曜日は日曜日
* indexは0からのため＋1がないと0週目になってしまうため必要。
* enumerateでindex、要素を同時にループ処理できる組込み関数。

## 参考にしたサイト
[Qiita書き方メモ](https://qiita.com/sakekasunuts/items/c498654481e2c83497d3)
「Pydantic」とは

「Pydantic」とは、Python言語で使われるライブラリの一つです。このライブラリは、データの検証（チェック）と設定管理を簡単にするために使われます。Pythonのプログラムでデータを扱う時、そのデータが正しい形や型をしているかどうかを確かめたり、設定情報を管理するのに役立ちます。

### メリット：

1. **型の厳密さ**:
   Pydanticを使うと、プログラムにおいてデータが期待する型（例えば数字や文字列など）であることを保証することができます。これは、バグを減らすのに役立ちます。

2. **自動ドキュメント生成**:
   Pydanticは、データモデルから自動的にドキュメント（説明文書）を生成することができるので、APIなどの開発でとても便利です。

3. **エディタのサポート**:
   型ヒントがあるので、IDE（統合開発環境）が自動補完やエラーチェックをサポートしてくれます。

4. **簡単な使用感**:
   モデルを定義して、それにデータを渡すだけで、データの検証が行われます。使い方が簡単で直感的です。

5. **データ変換**:
   データを適切な型に自動で変換してくれるので、例えば文字列の数字を実際の数値型に変換するなどの手間を省けます。

### デメリット：

1. **実行速度**:
   型検証のプロセスがあるため、とても型検証が厳密でないPythonのコードに比べると、少し実行速度が遅くなる可能性があります。

2. **学習曲線**:
   型ヒントやモデルの定義など、初学者にとっては新しい概念が多く、学ぶことが多いかもしれません。

3. **動的な型付けの柔軟性の喪失**:
   Pythonは動的型付け言語で、型をあまり厳密にしない自由さがありますが、Pydanticを使用するとその自由さが減ることがあります。

4. **エラーハンドリング**:
   間違った型のデータが入力されたときにはエラーが発生しますが、これを適切に扱うためには追加のエラーハンドリングが必要になります。

Pydanticは、特にWeb開発やデータサイエンスの分野で、データを扱う際に整合性を保つためによく使われます。初学者にとっては、型の概念やエラーハンドリングに慣れる必要がありますが、データが複雑になるにつれてその真価を発揮します。


### ライブラリとは？


ライブラリとは、プログラミングで使える便利なツールや機能の集まりです。中学生で言えば、図書館の本棚のようなもので、いろいろな本が並んでいて、必要な情報を手に入れるために使います。プログラミングでのライブラリも同じで、特定の機能を持った「本」のようなコードがたくさんあり、プログラマーがそれを使って、自分の書くプログラムをもっと強力に、簡単に作れるようになります。

例えば、数学の問題を解くために特定の計算が必要なとき、その計算方法を一から自分で考える代わりに、ライブラリにある「計算の公式」を使って問題を解くことができます。プログラミングでは、ウェブサイトを作るためのデザインのコードや、データを管理するためのコードなど、さまざまな種類のライブラリがあります。

ライブラリを使うメリットは、時間を節約できることや、複雑な機能を簡単に追加できること、そして多くの場合、他の多くのプログラマーが使っているために信頼性が高いことが挙げられます。
【Django】STATIC_URLの'/static/'と'static/'...バージョンによって異なる！CSS読み込みエラーを対処

# 概要
DjangoでCSSの読み込みがされない現象が発生しましたので、その原因と解決方法を記載します。バージョンは、Django 3.0.5を使っています。

結論、Djangoのバージョンによって`STATIC_URL`の書き方が異なる、ということでした。

## `STATIC_URL = 'static/'`の場合：
以下は`/admin`を叩いた場合です。
見ての通り、CSSが反映されていません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710373/c8aace4f-7932-caa6-1a75-8226d388a965.png)

ログには以下のようにCSS読み込みエラーが出ていました。
```
Not Found: /admin/static/admin/css/base.css
Not Found: /admin/static/admin/css/responsive.css
[01/Nov/2023 13:31:24] "GET /admin/static/admin/css/base.css HTTP/1.1" 404 4927
Not Found: /admin/static/admin/css/dashboard.css
[01/Nov/2023 13:31:24] "GET /admin/static/admin/css/responsive.css HTTP/1.1" 404 4945
[01/Nov/2023 13:31:24] "GET /admin/static/admin/css/dashboard.css HTTP/1.1" 404 4942
```

もちろん、ルートを叩いても同じです。
以下のように出ました。

```
Not Found: /static/polls/style.css
```

## `STATIC_URL = '/static/'`の場合：
わずかな変化ですが、`'/static/'`というように`/`を頭につけてあげると、CSSが反映されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710373/08baee4d-dac6-9f3b-64be-73f3abe50c57.png)

## 原因はバージョンだった
調べてみると、

古いDjangoのバージョン=`'/static/'`
新しいDjangoのバージョン=`'static/'`

とのこと。

以下の記事にもこのように書いてありました。

> 古いバージョンの Django の場合、STATIC_URL = '/static/' と定義されている可能性があります
このように STATIC_URL が定義されている場合、以降の解説は、/STATIC_URL を STATIC_URL に置き換えて読んでいただければ話が合うはずです
引用元:[【Django】静的ファイルの扱い方（画像・CSS・JS）](https://daeudaeu.com/django-staticfile/#static-how-to)

今回、自分はDjango4.1で作ったDjangoチュートリアルのアプリを、
既存で使っていたDjangoアプリケーション(3.0.5)の`settings.py`と混ぜて使ってしまっていました。
そのため、このようにバージョン違いによるエラーが発生してしまったのです。

たった一つの`/`で解決しました。。。
【VB.NET】デザイナーでコンポーネントの位置がずれる不具合の対処法

## 不具合の詳細
Formのオプションを変更するたびに、LabelやTextBoxなどのコンポーネントがずれてしまった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323019/94de555c-d2e4-c8ed-b57e-be36cb5f2c8a.png)

## 結論
ディスプレイのスケーリングを100%にする。

## 原因
ディスプレイのスケーリングが125%になっていた。
→windowsの設定でディスプレイの拡大縮小を100%にした。

## 参考サイト
https://teratail.com/questions/257179
https://qiita.com/Kosen-amai/items/42550b177a8c705dd547
/bin、/usr/bin、/usr/local/bin、~/binの用途

/bin
ランレベルがシングルユーザーモードで使用するプログラムの格納

/usr/bin
ランレベルがシングルユーザーモードで利用しないプログラムかつ、
rpmなどのパッケージ管理ソフトで管理されているプログラムの格納

/usr/local/bin
ランレベルがシングルユーザモードで利用しないプログラムかつ、
rpmなどのパッケージ管理ソフトで管理されないプログラムの格納
※つまり自分でrpmパッケージをパッケージ管理ソフトを使わず展開した場合などはこちらに格納しておくのが一般的

~/bin
システム全体ではなく、あるユーザーが使うだけのプログラムはこのディレクトリに格納
PostgreSQLのメリット

PostgreSQLを選択することには以下のように多くのメリットがあります。


### PostgreSQLの主なメリットと差別化要因:

1. **高度なSQL標準のサポート**:
   - PostgreSQLはSQL標準に対するコンプライアンスが高く、複雑なクエリ、外部結合、トランザクション、サブクエリなどを広範囲にわたってサポートしています。

2. **拡張性**:
   - カスタム関数をPL/pgSQLや他の言語（例：Python、C）で作成することができ、データベース機能をユーザーが拡張することが可能です。

3. **オブジェクトリレーショナルマッピング（ORM）サポート**:
   - PostgreSQLはオブジェクト指向データベースの機能も一部サポートしており、より複雑なデータ構造を扱うことができます。

4. **トランザクションと同時実行性の管理**:
   - ACIDプロパティ（原子性、一貫性、隔離性、持続性）を完全にサポートし、優れた同時実行性の管理とデータ整合性を提供します。

5. **セキュリティ**:
   - 強力なセキュリティ機能とアクセス管理があり、エンタープライズレベルでの利用に適しています。

6. **大規模データの扱い**:
   - 大規模なデータセットの処理に強く、高いパフォーマンスを維持します。

7. **GISサポート**:
   - 地理情報システム（GIS）のデータをネイティブにサポートし、PostGIS拡張を通じて高度な地理空間データベース機能を提供します。

8. **豊富なデータ型**:
   - JSON、XML、配列などのリッチなデータ型をサポートしており、非常に柔軟なデータモデリングが可能です。

9. **コミュニティドリブン**:
   - アクティブなオープンソースコミュニティに支えられており、継続的な改善と支援が行われています。

10. **コスト効率**:
    - オープンソースであるためライセンス費用が不要で、初期及び維持コストを抑えることができます。

これらの特性をうまく活用し、アプリケーションの要件に合わせたデータベース設計と機能実装を行うことで、PostgreSQLを使ったサービスやアプリケーションを市場で差別化することが可能です。たとえば、高度な地理空間機能を活用したアプリケーションや、複雑なデータ分析を必要とするサービスなどが考えられます。



### もうちょっと言葉を崩すと。。。


1. **難しい問題も得意**:
   PostgreSQLは、難しい計算やデータの管理が得意です。ちょっとした計算はもちろん、大きな数学の問題も上手に解けます。

2. **自由にカスタマイズ**:
   自分の必要に応じて、新しい機能を自由に作ったり追加したりできます。まるで、自分だけの特別な工具箱を持っているようなものです。

3. **しっかり守る**:
   大切なデータを守る力が強く、間違いが起きにくいです。まるで、しっかりとした鍵がかかった金庫のように安全です。

4. **大きな地図も得意**:
   世界の地図や場所に関するデータも得意で、それを使ったゲームやアプリを作る時にとても役立ちます。

5. **いろんなデータを扱える**:
   文章だけでなく、リストや番号、さらにはちょっと変わった形のデータも上手に扱えます。

6. **みんなで協力**:
   世界中の人たちが協力して、より良くするために助け合っています。

7. **お金がかからない**:
   無料で使えるので、お小遣いを使わずに済みます。



### 以下は意味調べ


**SQL** っていうのは、データベースと話すための特別な言語です。データベースに、「この情報教えて」とか「これを記録しておいて」とお願いする時に使います。

- **複雑なクエリ**:
  クエリとは、データベースに対する質問や命令のことです。複雑なクエリとは、例えば、「クラスで数学のテストの平均点以上を取った人は誰？」みたいな、ちょっと考えないといけない質問をデータベースに投げることができるってことです。

- **外部結合**:
  これは、2つの異なるリストにある情報をうまく組み合わせる方法です。たとえば、一つのリストには生徒の名前が、もう一つのリストにはその生徒が所属するクラブ活動が書かれていて、それらを上手く組み合わせて一覧を作ることができます。

- **トランザクション**:
  トランザクションは、いくつかの操作を一つのパッケージのように扱うことです。例えば、お小遣い帳に「お金をもらった」と「おもちゃを買った」という記録を同時に行うみたいなものです。これによって、もし途中で何か問題が起きても、全部の操作をキャンセルして、お小遣い帳を元に戻すことができます。

- **サブクエリ**:
  サブクエリとは、一つの質問の中に小さな質問を入れることです。例えば、「数学が得意な生徒で、足が速い人は誰？」と聞くときに、「数学が得意な生徒」を探す小さな質問をして、その答えを使ってさらに「足が速い人」を探す、ということを一度にやります。

PostgreSQLはこれらの難しいことを上手にできるので、もし難しい問題やたくさんのデータを扱いたいときには、とても役に立つんです。
SHORT COURSES IN LAHORE

Upon successful completion of the SHORT COURSES IN LAHORE, participants receive a recognized certificate, validating their skills and expertise. This certificate serves as a testament to their dedication and commitment to continuous learning, enhancing their credibility in the job market.

In summary, our short course in Lahore stands out as a unique and comprehensive learning experience, offering a perfect blend of academic excellence, practical skills, and networking opportunities. Join us and embark on a transformative journey that will empower you with the knowledge and confidence to achieve your goals in the rapidly evolving world.
[PHP] ｢Fatal error: Class ‘…’ not found｣に陥ったときのチェック項目

さっきまで快適に作業してたのに、ちょっとファイルいじったら Class not found になったんです！

というときの対処方法です。

# 基本のチェック

まずは以下の記事からの抜粋です。

https://qiita.com/suin/items/752f3721c4b9084fef4e

## vendor/autoload.phpをrequireしているか？

「さっきまで動いてたんです :joy:」 → 該当せず

## composer.jsonにautoloadの定義を忘れていないか？

「さっきまで動いてたんです :joy:」 → 該当せず

## vendor/composer/autoload_*.phpの内容が最新になっているか？

以下のコマンドを実行……

```console
$ composer dump-autoload
```

……解決せず

## スペルミスは無いか？

「クラス名変えてません :joy:」 → 該当せず

## いま作業しているディレクトリは実行環境のものか？

「さすがに大丈夫っす :joy:」 → 該当せず


# さらなるチェック

さらに以下の記事からの抜粋です。

https://qiita.com/marks_mac_mk2/items/8bac530757738a374d4c

## PSR-4 のパスが正しいか？

以下のコマンドを実行……

```console
$ php -r '$a=require "vendor/autoload.php";echo json_encode($a->getPrefixesPsr4(), JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);'
```

……該当ネームスペースのパスは正しい :joy: → 該当せず

## autloaderが正しいファイルを見つけられているか？

以下のコマンドを実行……

```console
$ php -r '$a=require "vendor/autoload.php";echo json_encode($a->findFile("App\\Application"));'
```

:::note info
`"App\\Application"`のところは、あなたの見つからないクラス名に書き換えてください。
:::

……出力されたパスは正しい :joy: → 該当せず


## Composerにパッケージの最適化をしてもらう

:::note warn
これをすると、PSR-4 非準拠のディレクトリ階層でも、クラスを見つけてくれるようになるそうです。
:::

以下のコマンドを実行……

```console
$ composer dump-autoload --optimize
Generating optimized autoload files
Class App\Appelication located in ./src/Application.php does not comply with psr-4 autoloading standard. Skipping.
Generated optimized autoload files containing 3808 classes
```

……んん :interrobang: :interrobang: :interrobang: 

Class App\Appelication located in ./src/Application.php does not comply with psr-4 autoloading standard. Skipping.
これ :point_up: なに :interrobang:


# 名前空間とディレクトリ階層がマッチしているか？

PSR-4のことはよくわかりませんが、名前空間とディレクトリ階層がマッチしている必要があるそうです。

composer.json に次のように定義されていたとき

```json
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    },
```

`App\Controller\MyController` クラスを置く場所は

|  | :ok: OKパターン | :ng: NGパターン  |
|:-:|:--|:--|
| クラスを置く場所  | `src/Controller`  | `src/Controller` 以外  |

となります。

……なんですけれど、これは該当しないですね。

# 基本に戻ってチェック！

納得いかない問題のとき、えてして原因は単純なものなのです。

## いま作業しているディレクトリは実行環境のものか？

大丈夫！autoloaderが出力するパスも期待通り！

## スペルミスは無いか？

`git diff`してみました……

```diff
-class Application extends BaseApplication
+class Appelication extends BaseApplication implements AuthenticationServiceProviderInterface
```

……んん :interrobang:

いつの間にか指が滑っていたようです :flushed: :flushed: :flushed:
Railsでコードジャンプしたい

## 概要
VScodeの拡張機能でどうにかならんかな〜と思っていたところ、
そういった拡張機能はなかったので設定方法だけまとめておきます

## Railsでコードジャンプする設定方法
VScodeにある拡張機能のRubyは入れておいてください！

1. Command + , で設定を開きます
2. 検索部分に “ruby” と打って検索
3. Intellisenseを false から rubyLocate に変更

上記だけで設定が完了します。
VScode　を再起動すれば設定が適応されるはずです。
Pythonを片手間に覚えるための水先案内

# Abstract
Pythonの入門には以下の問題がある:
- 教材が掃いて捨てるほど存在し、検索汚染の原因（インターネットデブリ）になっている
- 各記事や書籍は、バックグラウンド、解説の順番がてんでばらばら
- わかりきった内容を懇切丁寧に説明していると思えば、自分の欲しい情報については尻切れトンボになっている
- 「超入門」を謳っている記事のくせに、見たこともない「おまじない」が登場したりする
- 「超入門」を謳っている記事のくせに、見たこともない謎のライブラリが登場したりする
- そういった細かい謎を解決するために毎回検索をかけるのはannoyingである
[この記事の目的]
「Pythonの構文や使い方そのものの入門」ということを念頭に、既存の解説記事にかかれた解説を、翻訳する。フォーマットは以下のとおりである:

ジャンル
タイトル
ページリンク
[翻訳]
@@@翻訳内容@@@


# 本文
## デコレーター

## 基本

https://qiita.com/yuandesu/items/f8965940943819005c5f

[翻訳]
- なぜ関数なのにプロパティcount, sumが設定でき、計算結果がメモリに残っているのか？

### 「イベントハンドラ」と「関数上書き」に焦点をあてた解説

https://qiita.com/nattyan_tv/items/70b49ad785fcca39df54

[翻訳]
- なぜ引数を使わない関数なのに、引数に(＊args,＊＊kwargs)が設定されているのか？
    - 引数を追加実装する可能性がある、という考えに基づいた、拡張性確保のための措置。解説は、[この記事](https://note.com/engneer_hino/n/n9c6c6297845d).
    - ほとんど「おまじない」のように、当然のごとく書かれている場合も多いので注意。
- 引数の頭のアスタリスク
    - 「アンパック」という分割代入の機能.一個付きはリスト、二個付きはオブジェクトにつかう。
    - [簡素な解説記事](https://qiita.com/LouiS0616/items/1bbe0a9bb93054f6c380)
        - この記事のprint関数に出てくるsepとendはprint関数に実装されたkey。[この記事のトピック10](https://hashikake.com/python_print#toc10)を参照


### 挙動に焦点を当てたサンプルコード
https://www.sejuku.net/blog/25130

[翻訳]
- passとは
    - 書いても書かなくても良いおまじない。まだ追加実装の可能性がある関数の最後に慣習的に記述
- 文字列.format(hoge)とは
    - formatは、文字列オブジェクト共通のメソッド。代入機能がある。

## 初歩的な構文

### Pythonに登場するすべてのアスタリスクについて解説した記事

https://qiita.com/LouiS0616/items/1bbe0a9bb93054f6c380

[翻訳]
- print関数のsepとend(二個のアスタリスクの箇所)
    - 用法については「[このリンク](https://hashikake.com/python_print#toc10)」
Livewireでバイディングされる値が表示されない時の解決法

# 【結論】値が表示されないのはバリデーションの設定がないから
毎回かどうかわからないが、フォームコンポーネントを作っていて、前にもこんなんあったなとなったやつ。
以下のように、wire:modelの指定は間違いないし、`dd()`や`dump()`を使って値がきちんと渡ってきているところまで確認ができているのにテキストボックスの初期値が表示されない。
```
 <div class="form-row">
   <div class="col-sm-6">
     <div class="form-group">
       <label for="name">名前</label>
       <input type="text" id="name" class="form-control
       @error('model.name') is-invalid @enderror"
       wire:model="model.name" @if($disabled) disabled @endif>
       @error('model.name')
       <span class="error text-danger">{{ $message }}</span>
       @enderror
     </div>
   </div>
 </div>
```

コンポーネントクラスの`rules()`メソッドにバリデーションルールを指定したら解決する。
```
protected function rules(): array
{
    return [
        'model.name' => 'required|max:125',
    ];
}
```
どの条件で発生する挙動なのか謎だが、
バリデーションさえ設定すれば解決することをおさえておくと、戸惑わずに済む。
【ネットワーク】初心者のためのOSI参照モデル説明

## 概要
前回の記事はネットワークの通信方式やプロトコルについて説明いたしました。
今回はその続きの内容となり、プロトコルを階層的に構成した**プロトコルスタック**（または**プロトコルスイート**）の階層化の考え方の代表例の**OSI参照モデル**について説明していきます。
前回の記事は下記のものとなります。こちらの記事を読んでからの方が理解しやすいと思います。
是非、こちらも読んでみてください。

https://qiita.com/nakamura_slj/items/4d10e529f771225d2844

## 対象とする読者
* ネットワークの基礎から学びたい人
* 前回の記事を読んだ人
* これからIT業界で仕事をしようと考えている人
* CCNAの資格を取ろうとしている人

# OSI参照モデルの概要
以前は異なるベンダー（ネットワークの機器メーカー)間では通信ができず、異なるベンダー間でも通信できるように共通の仕様が必要となりました。
そこで、ISO（国際基準化機構）が異なるベンダー間で相互接続できるように定めたものがOSI参照モデルです。
そして、OSI参照モデルに基づいて設計されたプロトコル群が、**OSIプロトコル**です。

※現在では、インターネットの普及によりTCP/IPモデルが基準となっていて、OSIプロトコルは利用されていませんが基本的な概念としては残っているので、理解しておく必要があります！

# OSI参照モデルの７階層と役割
OSI参照モデルは、通信を行うための機能を
**アプリケーション層**、**プレゼンテーション層**、**セッション層**、**トランスポート層**、
**ネットワーク層**、**データリング層**、**物理層**の７階層に分け、それぞれ役割を定めています。
そのうちの上からアプリケーション層、プレゼンテーション層、セッション層が**上位層**となり、
残りのトランスポート層、ネットワーク層、データリング層、物理層が**下位層**となります。
送信元からデータを送る際には、上の層のアプリケーション層から順番に各階層で通信に必要な情報が付加されます。
それでは各階層について説明をします。

![スクリーンショット 2023-11-02 12.38.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524075/57b7e28e-5336-8262-8223-5a9ac957a873.png)
※レイヤとは各階層のことです。略すとL7、L6のような表記になります

### アプリケーション層
ユーザーが利用するアプリケーション間での通信に関して規定をしています。
WebブラウザであればWeb用のプロトコルとなり、ユーザーが利用するアプリケーションで使用するプロトコルが規定されます。

### プレゼンテーション層
通信する際の文字コードなどのデータの表現方式に関して規定してます。
データ送信する際に、この層で送信側のアプリケーションが使用している独自の表現方式から共通方式に変換します。
受信側では、受け取ったデータを受信側のアプリケーションでの表現方式に復元することで、送信元とは異なった表現方式でも通信可能になります。

### セッション層
通信の開始から終了までを管理するひとまとまりをセッションといい、そのセッションの確立や終了に関して規定しています。
セッションが確立するととでアプリケーション間での通信が可能になります。
機器では複数のアプリケーションを利用して通信を行っている場合があり、その際に、あるアプリケーションでやり取りを行なっているデータが他のアプリケーションに届かないように制御しています。

### トランスポート層
ノード間の通信制御に関して規定しています。
送信元から送られたデータは様々な機器を経由して宛先に届き、経由している中でデータが欠けてしまうと宛先でデータを正しく処理をできなくなってしまいます。
そのようなことにならないように、データが欠けることなく届けるといった通信の信頼性に関する機能が提供されています。

### ネットワーク層
複数のネットワークがまたがった**エンドツーエンド**（送信元からの通信開始から宛先での端末間）の通信に関して規定しています。
データ送信時には宛先を指定する必要があり、そうした宛先を識別するために必要となる**IPアドレス**などに関するプロトコルが規定されています。
また、いくつかの機器を経由していく際にどのような経路で通れば良いのかを決定する機能が提供されています。

### データリング層
直接接続されたノード間の通信に関して規定されています。
ネットワーク層で指定された宛先に向かうためには、直接接続している機器間でデータ転送する必要があり、
そういった直接接続している機器間で、相手を識別するためのアドレスに関する規定やエラーの検出などの機能が提供されています。

### 物理層
データの電気信号への変換や物理的な接続に関して規定されています。
ノード間を接続するケーブルやその接続口の規格などを規定することで、危機感を物理的に接続することができます。

# 最後に
以上となります。
今回はOSI参照モデルについて説明いたしました。
次回はカプセル化、非カプセル化について説明をしようと思います。
記事は下記のものとなります！是非、見てください！

https://qiita.com/nakamura_slj/items/297a55f295b5191c010f
AzureのStatic Web AppsにIP制限をかける方法

# やりたいこと
Next.jsで開発したWebアプリにIP制限をかけたい

# 事前準備
<b>その１</b>. 構築するStatic Web Appsは<b><font color='red'>Standard</font></b>プランである必要があります。無料プランだとできないので、注意。
![スクリーンショット 2023-11-02 17.16.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1812049/e91c0fa7-a778-275c-598a-84e743959328.png)

<b>その2</b>. pipelineを作成済みであること。
Pipelineを作成されてない方は↓で構築してください。

https://qiita.com/flutter_daisuki/items/2f49d1ee9404d3cc084f

# 方法
### 1. プロジェクトに設定ファイルを作成
プロジェクトのルートに<b>`staticwebapp.config.json`</b>を作成

### 2. jsonファイル内を記載

```staticwebapp.config.json
{
    "networking": {
      "allowedIpRanges": [
        "<ここにipアドレスを記載>",
      ]
    }
  }
```

### 3. commitして実行
おそらく再デプロイが走って、IP制限がかかっていると思います。

# staticwebapp.config.jsonでその他設定できること

https://learn.microsoft.com/ja-jp/azure/static-web-apps/configuration

その他にはグローバルヘッダーの設定や、ルートごとのアクセス権なども設定することができます。
Next.js vs Remix

Next.js使いからしたRemixの体験メモ

### 前提

- マーケティング/コーポレートサイト
- 全ユーザーに同じものを見せる
- 更新が頻繁なデータソースがある
- 状態を持たない・mutationしない（お問い合わせフォームくらい）


# 関係ないこと

以下は大差ない

- ルーティング
- Image,Script,metaなどの便利モジュール
- コンパイル
- API Route的なNodeサーバーとしての機能

以下は要件によっては重要だろうが、今回は関係ない
- [Nested route](https://remix.run/docs/en/main/file-conventions/routes#nested-routes) ※Next.jsのlayout相当の機能

# ページキャッシュ
Next.jsは「俺に任せろ」系。
開発者は[独自の拡張fetch](https://nextjs.org/docs/app/api-reference/functions/fetch)のrevalidate設定や、[segment config](https://nextjs.org/docs/app/api-reference/file-conventions/route-segment-config)を与え、Next.jsは、SSG/SSRの選択と自前の[フルルートキャッシュ](https://nextjs.org/docs/app/building-your-application/caching)機構で最適なページキャッシュを行う。開発者は`Cache-Control`を変更することはできない。※1


Remixは「好きにして」系。
SSGはなく、全てはSSRであり、`Cache-Control`を自由に設定できる。
各位CDNを用意したら、[MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Cache-Control)でも読んで好きにしたまえ。
`stale-while-revalidate`なんかいいんじゃない？くらい。

Remixが圧倒的にシンプルかつ効果的。

Next.jsのハイテクキャッシュが生きるのは、
- Next / Vercelのソリューションに思いっきり乗り切って
- 複数のデータソースがそれぞれ違うタイミングでアップデートされるような複雑なアプリを作る

の場合と感じる。

# スタイリング
### Tailwind・CSS Modules・素のCSSといったZero Runtimeのもの
どちらも問題ない。

### CSS in JS

どちらも設計思想と衝突してるようで、苦労している。

Next.jsでは制限付きで可能。
[一通り対応できている](https://nextjs.org/docs/app/building-your-application/styling/css-in-js)がServer Componentで動かせず、将来的を考えると黄色信号。

Remixは恐らく既に実用に耐えない
[公式に推奨しないよ](https://remix.run/docs/en/main/styling/css-in-js)と言っていて、exampleもすごい黒魔術コードだらけで、Remix v.1からアップデートされていない。チラツキなどの多くのバグ報告あり。赤信号。

どちらを選んでも、CSS in JSからは離れるしかないのかもしれない。

# フォーム
Next.jsは特別な機構を用意しない。※2
フォームはReact世界で作り、送信用API Routeにfetchで送るのが通例。

Remixは、（希望すれば）バリデーション→ミューテーション→UI更新まで含めた一連のソリューションを用意している。サーバーとUIのデータ同期を自動で行う機能でもある。これは楽。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233072/ee5a2609-6948-cffa-4fc4-828377a21d1e.png">

```jsx
//データを取得
export async function loader({
  request,
}: LoaderFunctionArgs) {
  const user = await getUser(request);
  return json({
    email: user.email,
  });
}

//UIコンポーネント
export default function Component() {
  const user = useLoaderData<typeof loader>();
  return (
    //このactionで起動するactionを指定
    <Form action="/account">
      <input name="email" defaultValue={user.email} />
    </Form>
  );
}

//コンポーネントから起動され、データをアップデート
export async function action({
  request,
}: ActionFunctionArgs) {
  const formData = await request.formData();
  const user = await getUser(request);
  await updateUser(user.id, {
    email: formData.get("email"),
  });
  return json({ ok: true });
}
```

軽く触った感じはとても便利だが。
バリデーションは送信ボタンを押した後なので、UX的にはB級かも...
データのmutationが盛んなサイトほど生きるもので、今回はそれほど重視しない。


# 暫定結論

- どちらも十二分な機能を持っている
- 結構似ている。App RouterとPages Routerの差くらいの距離
- 「非VercelのCDNを利用したパーソナライズしないページ」という特別な状況から、キャッシュのシンプルさという一点でRemix＋1000点
- Remix開発陣のフォーカスは動的でmutationが多い複雑なアプリケーションにある。が、よりシンプルなサイトのDXも全く問題ない


----
※1 https://nextjs.org/docs/app/api-reference/next-config-js/headers#cache-control と書いてあるがVercel以外なら設定できたり　よく分からない

※2 [server action](https://nextjs.org/docs/app/api-reference/functions/server-actions)はできたてで不安定・よく知らない
ランダムな文字列をワンライナーで生成する

任意桁数のランダムな文字列生成を生成したいことがよくあります。
ターミナルからワンライナーで生成できるようにしておくと便利なので紹介します。

ShellScript と Python を利用するため、Mac で Python3 がインストール済みである前提です。

## 実行

以下のコードをコピペすると生成できます。
- アルファベット大文字・小文字、数字を使って64文字分の文字列を生成する

```bash
python3 -c 'import random;import string;print("".join(random.choice(string.ascii_letters+string.digits) for x in range(64)))'
```

実行結果サンプル
```bash
$ python3 -c 'import random;import string;print("".join(random.choice(string.ascii_letters+string.digits) for x in range(64)))'
E8ZWrBYn5twiBD9ykgxHnnvXTGx3YIQuUhLy6Q3niBZwEOVZjIGiPel5vyYqe5Og
```

文字列の長さを変えたい場合は `range(64)` の数値を変えればOKです。

## 解説

Pythonコードを ShellScript で実行しているだけですので、中身にPythonコードの解説になります。分割して分かりやすく変換すると以下のようになります。

```python
import random
import string

chars = string.ascii_letters + string.digits
print("".join(random.choice(chars) for x in range(64)))
```

> chars = string.ascii_letters + string.digits

こちらで使用する文字種別を定義しています。
[stringライブラリ](https://docs.python.org/ja/3/library/string.html) を使用しており `ascii_letters` がアルファベット大文字・小文字。`digits` が数字になります。その他文字種別を含めたい場合は適宜カスタマイズしてください。

> print("".join(random.choice(chars) for x in range(64)))

`range(64)` で指定回数分だけ実行しており、`random.choice(chars)` で定義された文字列の中からランダムに文字列を取得します。生成する文字数を変更したい場合は `range(64)` の数値を変更してください。
備忘録2

kintoneについて、学んだことを記述していかないと忘れてしまう。

kintone仕様：
・ルックアップ機能で参照する。

・ルックアップ参照元は重複禁止である必要がある。
なのでルックアップ参照をさらにルックアップで直接参照することはできない。
参照するためのデータを重複禁止にして、ルックアップで取得しておき、それをルックアップする、などの手間が発生する。

・サブテーブルは参照にひと手間必要
サブテーブルは書きだす分には便利だが、参照するためにはプラグインを利用する必要がある（との認識）
基本的にサブテーブルで表現したくても他の形式の方がわかりやすくなる？


・自動採番について
なにかのプラグインかカスタマイズで自動採番が可能になるが、した方がよい。
参照したい名前そのものが変わるかもしれない。その時に採番しているとデータをほぼ書き換えても参照できるため、
参照関連の不具合が減るはずだ。
⇒自動採番プラグイン使ってる方がよい。(20231102)



・ルックアップ自動更新
ルックアップは参照した瞬間のデータを保持する。これはそういう性質であり、その時のデータを保持してくれるという意味でもあるが、
再度参照すると消えてしまう。
金額関連はこの仕様が問題があるので、一度参照したらもう参照できないようにプラグインなどで再入力禁止の縛りを与えるなどした方が
よいかもしれない。
逆に定期的に正しいデータに更新したい場合は、GASや無料版カスタマインでルックアップデータの全更新をかけていくことになるか。
TiSのプラグインでも自動更新はあるが、すべてのアプリに入れて更新するのは難しいだろう。
カスタマインはすごい便利だったので有料版に移行して色々入れたくなるが、料金的に会社の許可が下りなさそう。
⇒条件分岐処理プラグインで実現できるので、実装した。
一覧画面にボタンを用意し、それをクリックするだけでとりあえず実行できる。(20231102)
設定自体は簡単にできる。設定する量が多いので多少面倒だが、自動製番をルックアップ更新に使えば少ない設定で済むように思う。（当社比）


・書籍について
kintoneは今のところ勉強した内容がだいたい記憶できている。これはノーコードツールで直感的にわかるものになっているためである。
ただ書籍とかを活用して体系知識として入れないとすぐ忘れてしまうと思う。
kintone認定アソシエイト試験の教材とか使えるんだろうか？



python,javascript,GASと初心者にしては色々手を出して少し覚えたけど、
pythonは完全に忘れてしまったので備忘録として記述していこうかな
VBAもほぼchatGPT頼りだし
Dockerの ENTRYPOINT 実行直後、コンテナを起動し続ける方法

Laravel@ECS(Docker)でアプリケーションを作っています。
Dockerコンテナ（phpコンテナ）起動直後に何かしらコマンドを打ちたいとき、***ENTRYPOINT*** を使うことがあるとおもいますが、ENTRYPOINTを実行したあとコンテナが終了してしまうので、それの回避方法です。

### やりたいこと
phpコンテナ起動直後、laravel の artisanコマンドでキャッシュを生成したい。

### 実現方法
以下のように cache.sh を用意して、cache.shをDockerfileのENTRYPOINTで実行させます。
ファイルの最後に ***php-fpm*** を実行させるのが肝です。
```shell: cache.sh
#!/bin/sh

# キャッシュクリア
php /app/artisan event:clear
php /app/artisan view:clear
php /app/artisan route:clear
php /app/artisan config:clear
php /app/artisan clear-compiled

# キャッシュ生成
php /app/artisan config:cache
php /app/artisan route:cache
php /app/artisan view:cache

# php-fpm起動
php-fpm  <============= ここが肝です。
```

Dockerfileは以下の感じ
```shell:Dockerfile
＜中略＞
　：
COPY cache.sh /usr/local/bin/cache.sh
RUN chmod 777 /usr/local/bin/cache.sh
ENTRYPOINT  ["/usr/local/bin/cache.sh"]
```

### 参考サイト
https://zenn.dev/flyingbarbarian/articles/bedd7961d74b83
JavaScript入門 その1：演算子、変数、データの型、prompt

JavaScript入門の書籍を読んで書いてあったこと＋自分で調べたことのメモ書きその1。演算子、変数、データ型、prompt。

# 算術演算子

| 演算子 | 説明 |
|:-:|:-:|
| + | 加算  |
| - | 減算  |
| * | 乗算  |
| / | 除算  |
| % | 剰余  |
| ** | べき乗  |


# 演算子の優先順位

| 優先順位 | 演算子の種類 | 結合性 | 演算子 |
|:-:|:-:|:-:|:-:|
| 19 | グループ化 | なし | `(…)` |
| 18 | メンバーへのアクセス | 左から右 | `….…` |
| - | new（引数リスト付き） | なし | `new …(…)` |
| - | 関数呼び出し | 左から右 | `…(…)` |
| - | オプショナルチェーン | 左から右 | `?.` |
| 17 | new（引数リストなし） | 右から左 | `new …` |
| 16 | 後置インクリメント<BR>後置デクリメント | なし | `…++` `…--` |
| 15 | 論理NOT | 右から左 | `!…` |
| - | 単項+、単項-<br>（正負の符号） | 右から左 | `+…` `-…` |
| - | 前置インクリメント<br>前置デクリメント | 右から左 | `++…` `--…` |
| 14 | べき乗 | 右から左 | `…**…` |
| 13 | 乗算、除算、剰余 | 左から右 | `…*…` `…/…` `…%…` |
| 12 | 加算、減算 | 左から右 | `…+…` `…-…` |
| 10 | 小なり、小なりイコール | 左から右 | `…<…` `…<=…` |
| - | 大なり、大なりイコール | 左から右 | `…>…` `…>=…` |
| - | in<br>（プロパティの存在確認） | 左から右 | `… in …` |
| - | instanceof<br>（型の確認）| 左から右 | `… instanceof …` |
| 9 | 等価、不等価 | 左から右 | `…==…` `…!=…`  |
| - | 厳密等価、厳密不等価 | 左から右 | `…===…` `…!==…` |
| 8～6 | ビットAND,XOR,OR | 左から右 | `…&…` `…^…` `…\|…` |
| 5 | 論理AND | 左から右 | `…&&…` |
| 4 | 論理OR | 左から右 | `…\|\|…` |
| - | Null合体演算子 | 左から右 | `…??…` |
| 3 | 条件（三項）演算子 | 右から左 | `…?…:…` |
| 2 | 代入 | 右から左 | `=` `+=` `-=` `*=` <br> `/=` `%=` `**=` |

わかりづらいと思ったら括弧でくくって明確にしておくべき。

### 結合性

#### 左から右（左結合性）
・を演算子とすると、 `A・B・C = (A・B)・C` が成り立つ。

#### 右から左（右結合性）
・を演算子とすると、 `A・B・C = A・(B・C)` が成り立つ。
JavaScriptの三項演算子は右結合なので
　`a ? b : c ? d : e = a ? b : (c ? d : e)` 
である。
※例にあげておいてなんだが、三項演算子をネストして使うのは可読性の観点からやめておいた方がいいと思う。


# 変数
変数名は半角英数字とアンダースコアの組み合わせで命名するのを推奨する。他にも使える文字はあるが特に使う必要がない。更に言えばアンダースコアも使わずにローワーキャメルケースで命名するのを推奨する。


# データの型
### プリミティブ型
値の中に1つのデータしか持てない型を ***プリミティブ型*** という。下記はプリミティブ型である。

* 数値型（Number）：`-1.5`  `0`  `42`
* 文字列型（String）：`"Hello"` `'こんにちは'`
* 真偽型（Boolean）：`true` `false`
* Null型：`null`
* Undefined型：`undefined`

### オブジェクト
プリミティブ型に対してオブジェクトがある。詳細は後日。


# prompt
`prompt(message[, default])` は文字列の入力を受け取る関数。
PCのchromeではテキストフィールド、OKボタン、キャンセルボタンを備えてダイアログが表示され、テキストフィールドに入力された値を文字列として返す。

```js
let str = prompt("入力してください。");
console.log(str, typeof str);
```

【実行結果："abc"と入力した場合】
```console
abc string
```

【実行結果：キャンセルボタンを押した場合】
```console
null 'object'
```

※`typeof null` の戻り値は `"object"` である。


# 参考情報

### 書籍

[解きながら学ぶJavaScriptつみあげトレーニングブック | マイナビブックス](https://book.mynavi.jp/ec/products/detail/id=126984 "解きながら学ぶ JavaScriptつみあげトレーニングブック | マイナビブックス") 1章

### WEBページ
[演算子の優先順位 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Operator_precedence "演算子の優先順位 - JavaScript | MDN")
[演算子の右結合性、左結合性とは - Panda Noir](https://www.pandanoir.info/entry/2016/06/26/115235 "演算子の右結合性、左結合性とは")
[Window.prompt() - Web API | MDN](https://developer.mozilla.org/ja/docs/Web/API/Window/prompt)
[typeof - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/typeof)
OpsRamp Logsについて

本記事では、OpsRamp Logsについて説明します。

# 概要
OpsRampには、OpsRamp AgentによるアプリケーションログおよびOSログの収集やサードパーティシステムから転送されたログを集中管理するLogsという機能があります。OpsRamp SaaSに取り込んだログからアラートを発報したり、AWS S3へアーカイブすることが可能です。
[Log Management](https://docs.opsramp.com/platform-features/feature-guides/log-management/)

- 主な機能と利点
    - 事実上あらゆるソースからログ データを取り込んで処理します。
    - アプリケーションの種類、時間枠、重大度に基づいてログ データを解析、検索、フィルタリングします。
    - アプリケーションのパフォーマンスに関する知識が深まります。
    - 考えられる根本原因をより迅速に特定します。
    - 状況の理解を向上させて、インシデントをより迅速に解決できるようにします。
    - 主要なワークフローのトラブルシューティングを行う際の人的エラーを削減します。

# コア機能の説明
以下の機能について説明します。

- [ログの取り込み方法について](https://qiita.com/vistanet-kh/items/379ca0c3b9cb5127b999)
- [ログの見方について](https://qiita.com/vistanet-kh/items/e5ffa94138797abcc937)
- [ログからアラートを発報する方法について](https://qiita.com/vistanet-kh/items/3c5109657a55e2d1a5a1)

# その他機能の説明
「RETENTION」、「ARCHIVING」、「LOG SIZE LIMIT」、「AGENTS」の設定について、設定します。
これらの設定は、Infrastructure > Logs画面左のハンバーガーマークから「Log Configuration」から設定することができます。
![configuration.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/4d903161-4b04-bfe1-8569-e3db751f0e1c.png)

- RETENTION
ログ保存期間の設定になります。7日、15日、30日から選択することが可能です。
![configuration-retention-period.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/d0935190-9629-aa95-bc5e-2f403b4667c4.png)

- ARCHIVING
AWS S3にアーカイブするための設定になります。
![configuration-archive.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/798df973-3dd9-0323-fb10-985ad686278e.png)

- LOG SIZE LIMIT
取り込むログ量の上限設定になります。日また月単位で上限を設けることができます。
![configuration-log-size-limit.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/31ec4881-b9df-78b0-fa2d-f631279d755b.png)

- AGENTS
Agent単位でログ取得機能を有効・無効化することができます。
![configuration-agents.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/1106b6f7-5b14-54ac-a391-24d3e8c4d3bd.png)

---------------------------------------
[<img width = 250 height = 200 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/111de30a-4d33-aa33-5c7d-83d9015093e6.png">](https://www.vistanet.jp/knowledge-base/)
【Ruby】begin-end構文

# 書き方
```rb
@sample ||= begin
  # 処理1
  # 処理2

  # 戻り値
end
```


**begin-end**は例外処理以外にも使用される。
複数の文をグループ化するために使用されるブロック構文。
→`begin`と`end`の間に挟まれた部分は、1つのまとまりとして扱われる。


# begin-end構文とメソッドそれぞれのメリット
- begin-end構文
    - 複数の処理を1つのまとまりとして扱い、それを直接変数に代入したい場合に便利。
- メソッド
    - 再利用性と可読性を高めるために使われ、大きな処理をまとめる際に便利。


# サンプルコード
```rb
class Sample
  def execute
    # 処理終了：対象会員が存在しない場合
    if target_members.blank?
      puts '対象会員が存在しません。'
      exit
    end

    # 更新処理 ※省略
    update_members(target_members)
  end

  # 対象会員抽出
  def target_members
    @target_members ||= begin
      results = Member.where(active: true)
      results.each { |member| member.name += '様' }

      results
    end
  rescue => e
    # エラーハンドリングの処理
    puts "エラーが発生しました: #{e.message}"
  	puts e.backtrace.join("\n")
  end

  # 更新処理のサンプル
  def update_members(members)
    # 省略
  end
end

# Sampleクラスのインスタンスを作成し、executeメソッドを呼び出す
Sample.new.execute
```

この例だと

:::note
- **begin-end構文**で複数処理を1つのまとまりとして扱い、**可読性**を高めている。
- `#target_members`というメソッドにすることで**再利用性**と**可読性**を高めている。
- [メモ化](https://qiita.com/royal_straight_flush/items/d36842be24e0d682eebe)しているため、`#target_members`を何度呼び出しても<ins>無駄にクエリ発行等の処理が実行されることはない。</ins>
:::
Pythonのパッケージを配布する方法

# setup.pyを作成する.

setup.pyファイルを作成し、パッケージの下に置く。

```python setup.py
from setuptools import setup, find_packages

setup(
    name='ml',
    version='0.0.0',
    license='MIT',
    description='machine learning library',

    author='momo',
    author_email='momo@gmail.com',
    
    packages=find_packages(),
)

```

# setup.pyを置く.

```
ml-project
|-ml
|-setup.py
|-__init__.py
```

#  `__init__.py`にバージョンを書く。

`__init__.py`にバージョンを記載しておきましょう。

```python __init__.py
__version__ = '0.0.0'
```

#  wheelファイルを生成する。

あとは、ml-projectのフォルダに移動し、下記を実行しましょう。

```
cd .\ml-project
py -3.8 .\setup.py bdist_wheel
```

```
ml-project
|-ml
|-setup.py
|-__init__.py
|-build
|-dist ----ml-0.0.0-py3-none-any.whl
```


# pipでインストールする。

distフォルダに移動し、ml-0.0.0-py3-none-any.whlをインストールする。

```
py -3.8 -m pip install ml-0.0.0-py3-none-any.whl
```
Unityでサイコロアプリをつくってみたい

# これは何？

意気込みを記事にしてみました、

# なんでサイコロアプリ？

ボードゲームが好きで、よく友達と自宅で遊んだりします:relaxed:

「カタン」というボードゲームがあり、６面のサイコロを２つ利用します
この前、他のゲームでサイコロを利用してしまい、サイコロをなくしてしまって遊べない事態がありました:sweat_smile:

その時にスマホアプリで探したら、サイコロアプリが結構あることを知りました

カタンで遊んだことがある人は共感できるかもですが、
ゲームが終わった後にサイコロの出目の偏りについて雑談しながら話したいことがあります

ただ意外とサイコロアプリで統計的なのを表示する機能がなかったので、作ってみようと思いました


# Unityとは？

> Unity（Unity3D）は、Unity Technologies（日本法人はユニティ・テクノロジーズ・ジャパン株式会社[5]）が開発・販売している、IDEを内蔵するゲームエンジンである。主にC#を用いたプログラミングでコンテンツの開発が可能である。PC（Windows、macOS）だけでなくモバイル（iOS、Android）やウェブブラウザ（WebGL）、家庭用ゲーム機（PlayStation 4、Xbox One、Nintendo Switch等）といったクロスプラットフォームに対応しており、VR/AR/MR機器向けのコンテンツ開発にも対応している。

https://ja.wikipedia.org/wiki/Unity_(%E3%82%B2%E3%83%BC%E3%83%A0%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3)

## 有料・無料？

昨今、規定が変わって、お金を取るようになったとか、ならないとか…
確認しましたが、個人開発アプリでは無縁かなと思ったので、一旦スルーしました

## Unityのアセット

今回、作ろうと思ったのは、無料のアセットがあったからというのが大きいです
なかったら、おそらく作らなかったと思います

https://assetstore.unity.com/packages/templates/packs/dice-pack-light-165?locale=ja-JP

**※現在は配布が終了してしまいました**

# まずはチュートリアルから始めた

まったくわからない状態なので、Unityのチュートリアルを参考にしながら進めてみました
用語も多く一つひとつ調べながら理解を深めていきました

https://learn.unity.com/project/roll-a-ball-visual-scripting-jp

ボール転がしから始めたいと思います

**追記: チュートリアルをやってみた記事**

https://qiita.com/acronhub/items/f94954cbe7f91f9c1b72

# 最後に

進みも少しずつだと思うのですが、自分が覚えた事を後々見てもわかるような感じでまとめたいと思います

## 連載記事

https://qiita.com/acronhub/items/a46c6f5c16c4d262728c

https://qiita.com/acronhub/items/ccbdda267de28730d68e

https://qiita.com/acronhub/items/25d626d7ae2956942735

https://qiita.com/acronhub/items/7fa83565ffdd05576605

https://qiita.com/acronhub/items/7c3a39d384c0b6ea277c

https://qiita.com/acronhub/items/c273a54507b07a5937e3
Lispによるゲーデルの証明

# 難解な本
チャイティンの本を2冊持っています。「数学の限界」と「知の限界」です。いずれも難解です。というか、説明が不足しているように思います。なぜ、そうなるのか？中途の思考が省略されているのです。これらの本は講義録から文字お越しをしたようです。それが原因かもしれません、私が興味があるのはゲーデルの不完全性定理のLispによる証明です。この度、本を読みなおしつつ、他の人の解説も読み直しました。なんとなくわかったような気がしました。そのことを書き記そうと思います。


# 手抜きの証明器
チャイティンは本の中で(valid-proof? x)という関数について述べています。xはS式でありそれが証明可能ならその証明を返し、証明できないならnilを返すように思います。そうは説明していないのですが、多分そういうことです。でも、その具体的な実装はここでは必要ありません。

```
(defun valid-proof-p (x) 
    ;; un implemented
)

```

すごく手抜きなコードです。？はLispの慣習に倣ってpとしました。


次に(is-unprovavle x)について考えてみます。これは前述の(valid-proof-p x)を利用します。「S式ｙが証明できないとは、すべてのS式に対して、(valid-proof? x)がｙと等価とは限らないという表現でよいのです。」とチャイティンは説明しています。どうせ手抜きですから、(valip-proof-p x)がnilを返さなければよいということにしてしまいます。

```
(defun unprovable-p (x) (not (valid-proof-p x)))
```

すごく手抜きです。大丈夫なのかな？

さらに本では(value-of x)という関数が必要とされています。これは説明からするとLispに古くからある(eval x)のことに思えます。そういうことにしてしまいましょう。

# 自己言及
「クレタ人はうそつきだ」とクレタ人は言った　　

これがアイディアの根本です。本では (value-of (('x) ('x)) )と表現されています。ここでxは関数です。関数に関数を適用させます。問題は一般的にLispにおいて関数の名前空間と大域変数の名前空間とは別だということです。関数に関数を食わせるにはfuncallを使わないといけません。

(funcall #'x #'x)

SchemeのようにファーストクラスのタイプのLispだと関数空間と変数空間が同一空間です。ですから

(eval '(x x))


と表せます。islispではこれができません。(funcall #'x #'x)で表現することにしましょう。


# いよいよ核心
自己言及をするコードは証明不能と主張する関数gを定義してみます。チャイティンの作ったLispは極めて特殊です。
本のコードを読むもののさっぱりわかりません。どうもこういうことを言っているようです。

```
(defun g (x)
    `(unprobable-p (funcall ,x ,x)))
```

関数gに関数gを適用するとどうなるのでしょうか？

```
> (funcall #'g #'g)
(UNPROBABLE-P (FUNCALL <function> <function>))

```

なぜ、クアジクオートを漬かるのでしょう？　(unprobable-p x)は未実装だから動作しませんからね。だからなのかな？


ところで(unprovbable-p  )の引数着目します。これをevalしたらどうなるのかな？残念ながらこれはうまくいきません。funcallの引数の<function>と表示されているものは、関数の実体です。これだとevalできません。仕方ありません、また、funcallを使うことにしましょう。

```
> (let ((f (funcall #'g #'g))) (funcall (elt (elt f 1) 1) (elt (elt f 1) 2)))
(UNPROBABLE-P (FUNCALL <function> <function>))
```


# いよいよクライマックス
ここまでやるととっかかりがつかめてきました。上述の２つの結果を見比べてください。あらまあ、不思議、まったく同じですね。

```
> (funcall #'g #'g)
(UNPROBABLE-P (FUNCALL <function> <function>))
> (let ((f (funcall #'g #'g))) (funcall (elt (elt f 1) 1) (elt (elt f 1) 2)))
(UNPROBABLE-P (FUNCALL <function> <function>))
> (equal (funcall #'g #'g) (let ((f (funcall #'g #'g))) (funcall (elt (elt f 1) 1) (elt (elt f 1) 2))))
T
```


関数gは不動点関数となっています。計算は終わりません。これは何を意味しているのでしょう？

関数gは自己言及しているs式は証明不能であると主張しています。でも、これは不動点になっていて計算は終わりません。もしも証明不能だったとしてもそれを確認することができません。また、関数gの主張が間違っているとしても不動点になっていて計算は終わりません。関数gの主張が正しい、あるいは間違いのいずれであったとしても確かめようがありません。

# ヘルプミー
このように書き連ねてきたものの、私はこれがチャイティンの言っていることを正しく再現しているのかどうか？自身がありません。これでいいのでしょうか？　どなたか助言をいただければ幸いです。

それにしてもLispで表したコードは不完全性定理の証明と言えるのでしょうか？　アイディアの概要を示してはいるものの、ゲーデルが行った厳密な証明とは異なるもののように思えてなりません。

どなたら助言をいただければ幸いです。
コードはここにあります。https://github.com/sasagawa888/eisl
Github ActionsでのJSDoc自動化の設定

## リポジトリは次のようになっているとする。

- リポジトリ名```switchbot-handler.js```（.jsまでリポジトリ名）
- リポジトリ直下にindex.jsやREADME.mdが入っている。
- JSDocの設定ファイルはdocsフォルダにいれてある。（下記１番のとおり）

## やること

1. ローカルで必要ファイルを作成しておく。
```./docs```と```./docs/config.json```を用意しておく

2. 該当リポジトリ > Setting > Pages > Source
[Deploy from a Branch] > [Github Actions]

3. GitHub Pages Jekyll
[Configure]
[Commit changes...]
[Commit chages]

ここでできたファイルを下記のように修正。リポジトリ名などは自分のものにする。
```
# Sample workflow for building and deploying a Jekyll site to GitHub Pages
name: Deploy Jekyll with GitHub Pages dependencies preinstalled

on:
  # Runs on pushes targeting the default branch
  push:
    branches: ["main"]

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions:
  contents: read
  pages: write
  id-token: write

# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
concurrency:
  group: "pages"
  cancel-in-progress: false

jobs:
  # Build job
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - name: Setup Pages
        uses: actions/configure-pages@v3
      - name: dir
        run: |
          dir # confirm
      - name: Build with Jekyll
        uses: actions/jekyll-build-pages@v1
        with:
          source: ./
          destination: ./_site
      - name: Build JSDoc
        uses: andstor/jsdoc-action@v1
        with:
          source_dir: ./
          output_dir: ./docs/jsdoc
          config_file: ./docs/config.json
          template: minami
          front_page: README.md
      - uses: actions/upload-pages-artifact@v1
        with:
          path: ./docs/jsdoc

  # Deployment job
  deploy:
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}
    runs-on: ubuntu-latest
    needs: build
    steps:
      - name: Deploy to GitHub Pages
        id: deployment
        uses: actions/deploy-pages@v2
```
5. URLは下記のような感じ。もちろんActionsを見ながら、実行結果が成功したか確認する。
https://hiroshi-sugimura.github.io/switchbot-handler.js/
6. URLをREADME.mdにいれておく
Postmanの学習(Salesforceとの連携)


+ [Connect Postman to Salesforce](https://quickstarts.postman.com/guide/connect-postman-to-salesforce/index.html?index=..%2F..index#0)
+ [ワークショップ - Postman入門](https://www.postman.com/postman/workspace/postman-japan-workshop/collection/27917608-5a8f38ea-1532-452c-ade3-c671a45a26cb)
+ [Test Salesforce Rest API using postman](https://www.apexhours.com/test-salesforce-rest-api-using-postman/)
+ [Quick Start: Connect Postman to Salesforce > Set Up Your Org](https://trailhead.salesforce.com/content/learn/projects/quick-start-connect-postman-to-salesforce/set-up-your-org)

# Postman を使用して Salesforce プラットフォーム API にアクセスする理由は何ですか?

Salesforce は、サードパーティ システムと統合する豊富なアプリケーション プログラム インターフェイス (API) セットを公開しています。これらの API はすべて徹底的に文書化されていますが、特定の組織、またはできれば複数の組織でこれらの API をすばやく試すにはどうすればよいでしょうか? Postman は、Salesforce Platform API との統合オプションを発見、探索、テストするのに役立ちます。

# Postman について
Postman は、REST や SOAP などの HTTP ベースの API を構成して呼び出すために使用できるアプリケーションです。この強力なツールは、使いやすいグラフィカル ユーザー インターフェイスで設定します。環境変数、チーム ワークスペース、JavaScript 自動化をサポートします。

# Salesforce Platform APIs for Postman コレクションについて Salesforce
Platform APIs for Postman コレクションは、多くの Salesforce Platform API の 200 以上の要求テンプレートをまとめたリソースです。このオープンソース コレクションでは、構成可能な Postman 環境と変数を使用するため、複数の Salesforce 組織でリクエストを簡単に認証して試行できます。

+ [解説：Quick Start: Connect Postman to Salesforce](https://qiita.com/Keiji_otsubo/items/4f5e261b286a647243a2)
新規PJ前に既存テーブルの使用状況（キレイか）確認したいときはiostats

作業メモです。
新規案件が走るときに既存パッケージ（例えばCMDB関連）に手動追加されたり、といった状況を確認したいときには以下のテーブルを使いましょう。
1.システム診断[v_iostats]
システムのインサートや更新の数が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/f6c1f01b-bf4d-4a91-17aa-36216a0e9bb3.png)
SwiftUIでSVG画像を表示する方法

[Globeeアドベントカレンダー](https://qiita.com/advent-calendar/2023/globee)6日目の記事です。
2日連続になっちゃいましたが、本日は簡単な内容になります。
簡単なんですが、意外とこの内容の記事は見当たらなかったので、置いておきます。

# 背景

`SwiftUI.Image`は現在のところSVG形式の画像を十分にサポートしていないため、実装方法を模索している方も多いのではないでしょうか？
特に、SVGファイル側で定義されているキャンパスのサイズよりも大きくリサイズした場合に、画像が粗くなってしまう問題があります。
今回の記事では、UIKitの`UIImageView`を利用してこの問題を解決する方法を共有します。
以下が結果のスクリーンショットです。

| before | after |
|---|---|
| ![b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35008/e037d87f-5eea-ad46-a2a0-ce2b24c3d691.png)| ![スクリーンショット 2023-11-02 15.53.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35008/340ba268-b448-1058-ce41-064f030865f4.png) |

## 前提

以下が今回利用するSVG画像の定義の一部です。

```xml
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
...
```

このように`viewBox`が24pxということで定義されています。
今回これを150x150にリサイズして利用しているので、実はこのキャンパスサイズを150にすることでも解決できます。

Globeeの開発チームではFigmaから自動的にアイコン定義を抜き出すツールを開発しているので、あまりこの定義を変えたくはないというのがあります。
というかベクター画像なんだからサイズ定義は気にせず扱いたいですよね。
というわけでsvgの定義はこのままで拡大可能にする実装の紹介です。

ちなみにFigmaのAPIでサポートされている画像出力形式は現在以下の通りのようです。

> A string enum for the image output format, can be jpg, png, svg, or pdf

https://www.figma.com/developers/api#get-images-endpoint

## ステップ1: UIImageViewをSwiftUIで利用する

`UIViewRepresentable`プロトコルを採用することで、UIKitのUI部品をSwiftUIで使用することができます。以下は`UIImageView`をSwiftUIで利用するための`ScalableImageView`というカスタムビューの実装です：

```swift
import SwiftUI

struct ScalableImageView: UIViewRepresentable {
    let image: UIImage
    
    init(_ image: UIImage) {
        self.image = image
    }

    func makeUIView(context: Context) -> UIImageView {
        let imageView = UIImageView(image: image)
        imageView.contentMode = .scaleAspectFit
        return imageView
    }
    
    func updateUIView(_ uiView: UIImageView, context: Context) {
        uiView.image = image
    }
}
```

## ステップ2: SwiftUIビューでSVGを表示

最後に、以下のように`ScalableImageView`を使用してSVG画像を表示します：

```swift
struct ContentView: View {
    var body: some View {
        ScalableImageView(UIImage(named: "iconSpeaker")!)
            .frame(width: 150, height: 150)
    }
}
```

## まとめ

いかがだったでしょうか？記事にするほどのことでもなかったでしょうか。
SVGImageのようなライブラリもあるようですが、このようにUIKitの良さを活かす形で簡単にSVGに対応することができます。
将来的にSwiftUIがSVGのネイティブサポートを追加することを期待しつつ、現時点ではこの方法を活用することでプロジェクトにSVG画像を取り入れることができますね。

[Globeeアドベントカレンダー](https://qiita.com/advent-calendar/2023/globee)、明日は @LyW による「Exploring Altair: The Rising Star in Data Visualization」です。
よろしくお願いします。

# 採用情報
現在株式会社Globeeではエンジニア採用を積極的に行っています。
まずはカジュアル面談にて弊社の「教育」にかける思いや「ものづくり」の考え方についてお話できればと思いますので、皆様お気軽にご応募ください。
https://globee.notion.site/Globee-d184eefc3561480292481299c64b04bc
microsoft designerでロゴをつくってみた

![スクリーンショット 2023-11-02 11.33.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587166/a3da4809-af87-da07-358f-37f53483eed5.png)

Micsoroft提供しているAIデザインサービス「microsoft designer」。
chatGPTのようにプロンプトで指示を与えることで、様々なデザインや画像を即座に生成することが可能です。

今回はmicrosoft designerを使って「エンジニアのコミュニティ」のロゴを作成してみました。

（microsoft designerへの登録は割愛します）
[microsoft designer](https://designer.microsoft.com/)

# プロンプトを作成する
まずはロゴデザインを指示するためのプロンプトを作成します。
microsoft designerは英語で指示した方がいいらしいので、chatGPTで英語のプロンプトを作成します。

イメージは「誰をターゲットにしたどんなサービス」など意図を明確に指示するようにしましょう。

以下は実際にchatGPTに与えたプロンプトです。
```
生成AIを使ってロゴを作るためのプロンプトを、英語で出力してください。
イメージは以下の通りです。
「プログラミングを得意とするエンジニア向けコミュニティ」
```
そうすると以下のプロンプトを作成してくれました。
```
"Create a logo using AI for a community catering to engineers skilled in programming."
```

これを元にmicrosoft designerでロゴを作ってみます。

# microsoft designerを使ってみる

最初の画面の「Generate image」をクリックすると画像生成の画面へ遷移します。

![スクリーンショット 2023-11-02 11.49.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587166/6e0a5fbc-a404-4de2-f385-6218cdad37e0.png)

作成したプロンプトをmicrosoft designerに貼り付けます。

![スクリーンショット 2023-11-02 11.49.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587166/f11805a2-214c-50c8-0bd6-c1bfda8ea15b.png)

できた。

![スクリーンショット 2023-11-02 11.51.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587166/8c437be2-3761-023e-9a5b-ed01faa16b49.png)

生成されたロゴの中から好きなものをSELECTしましょう。
目的のロゴをつくってくれるまでプロンプトを変更するなどして何度も繰り返します。

![スクリーンショット 2023-11-02 11.54.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587166/0469239a-ee8b-941e-8167-879a22fad353.png)

作ったロゴはダウンロードもできるし、カスタムもできます。

# 最後に
今回はmicrosoft designerを使ってロゴを生成してみました。
ロゴはサービスの理念や価値観を視覚的に表現する大切な要素です。
普通はちゃんとロゴデザイナーに依頼したほうがいいけどコストや時間的に省きたいならAIを使うのもありかも。（なかなか思った通りに作ってくれないとストレスだけど）