OmniAICreator/Qiita-1.07M huggingface dataset:
Apache 2.4 の SSL設定手順 忘備録

# 背景
- 業務で十数年前のシステムを移行した
- 今度同様の作業がある
- 作業記録を Qiita 向けに作成

# /etc/httpd/conf.d/ssl.conf の編集

```bash:bash
vim /etc/httpd/conf.d/ssl.conf
```
```vim:ssl.conf
DocumentRoot "/vol/www/html/"


ServerName hogefoobar.jp

 ErrorLog "|/usr/sbin/rotatelogs /var/log/httpd/error_log.%Y%m%d 86400 540"
 CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/access_log.%Y%m%d 86400 540" combinedi

Alias /foobar "/vol/www/html/foobar/
<Directory "/vol/www/html/foobar/publ
    Options ExecCGI Indexes FollowSym
    AllowOverride AuthConfig All
    Require all granted
    # AddHandler cgi-script .cgi
</Directory>
AddType application/x-httpd-php .php

# DL したサーバー証明書
SSLCertificateFile /etc/ssl/certs/server.crt
# 生成した秘密鍵
SSLCertificateKeyFile /etc/ssl/private/foobar.key
# DL した中間証明書
SSLCertificateChainFile /etc/pki/tls/certs/jprs_ca.crt
```
```bash:bash
systemctl restart httpd
```
# http へのアクセスを https に流す
```vim:# vi /etc/httpd/conf.d/your-domain.conf
<VirtualHost *:80>
    ServerName your-domain.com
    Redirect permanent https://your-domain.com/
</VirtualHost>
```
# SSL証明書および関連ファイルの適切な権限設定
これらの証明書ファイルは、一般的に公開情報であり、ウェブサーバーおよび関連プロセスが読み取る必要がある。
### サーバー証明書 (/etc/ssl/certs/server.crt) と中間証明書 (/etc/pki/tls/certs/jprs_ca.crt)
```bash:Bash
sudo chown root:root /etc/ssl/certs/server.crt
sudo chmod 644 /etc/ssl/certs/server.crt

sudo chown root:root /etc/pki/tls/certs/jprs_ca.crt
sudo chmod 644 /etc/pki/tls/certs/jprs_ca.crt
```
### 秘密鍵 (/etc/ssl/private/foobar.key)
秘密鍵は機密情報であり、厳格に保護する必要がある。ウェブサーバーのみが読み取れるようにするのが一般的。
```bash:Bash
sudo chown root:root /etc/ssl/private/foobar.key
sudo chmod 600 /etc/ssl/private/foobar.key
```
### ディレクトリの権限
```bash:Bash
sudo chmod 750 /etc/ssl/private
```
所有者は読み取り、書き込み、実行が可能であり、グループは読み取りと実行が可能になります。他のユーザーにはアクセスが制限される。

# 設定反映
```bash:bash
systemctl restart httpd
```
# 参考資料
- [オンラインサインアップから申し込み・設定をしたい（JPRSドメイン認証型）](https://help.sakura.ad.jp/ssl/2315/)
- [JPRSサーバー証明書のサービス概要 設定マニュアル](https://jprs.jp/pubcert/service/manual/)
- [ルート証明書・中間CA証明書について](https://jprs.jp/pubcert/service/certificate/)

# 学び
- .crt と .csr は違う
- crt は certificate = 証明書
- csr はSSLサーバー証明書を発行するための証明書署名要求 Certificate Signing Request
- File 生成した秘密鍵
- KeyFile 中間証明書
- ChainFile CA証明書
- httpdが起動しなくなったら、ログを追跡する
- 生成した秘密鍵とCSRで発行したサーバー証明書のペアを確認する
- 設定するパスが入れ違いになってないか確認する
テスト116

```vb

'Excel
Sub Excel_SQL_JOIN2()

Dim CN As ADODB.Connection
Dim RS As ADODB.Recordset
Dim MyPath As String
Dim str_SQL1 As String
Dim str_SQL2 As String

Set CN = New ADODB.Connection
Set RS = New ADODB.Recordset

MyPath = ThisWorkbook.FullName

CN.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
               "Data Source=" & MyPath & ";" & _
               "Extended Properties='Excel 12.0;HDR=YES' "

'完全外部結合(サブクエリ分)
str_SQL1 = "SELECT A.*, B.* " & _
                    "FROM [テストデータ1$] AS A " & _
                    "LEFT OUTER JOIN [テストデータ2$] AS B " & _
                    "ON A.商品コード = B.商品コード " & _
                    "UNION " & _
                    "SELECT A.*, B.* " & _
                    "FROM [テストデータ1$] AS A " & _
                    "LEFT OUTER JOIN [テストデータ2$] AS B " & _
                    "ON A.商品コード = B.商品コード "

'片側テーブル分だけで処理しようとすれば重複は防げる
str_SQL2 = "SELECT DISTINCT A.商品コード " & _
                   "FROM (" & str_SQL1 & ") AS C"

Set RS = CN.Execute(str_SQL2)

With ThisWorkbook.Sheets("テスト出力")
    
    .Cells.Clear
    
    .Range("A1:D1").Value = Array("商品コード_A", "金額", "商品コード_B", "金額")

    .Range("A2").CopyFromRecordset RS
    
    .Columns("A:D").AutoFit

End With

RS.Close
CN.Close

Set RS = Nothing
Set CN = Nothing

MsgBox "処理が終了しました。", vbInformation

End Sub
CSR を発行するための Linux コマンド 忘備録

# moemo
- /etc/ssl/private/    # 秘密鍵の保存用ディレクトリ
- /etc/ssl/certs/     # 証明書の保存用ディレクトリ
# 作業ディレクトリ	
- /etc/ssl/private

# CSRの発行
### ディレクトリの作成（存在しない場合）
```bash:bash
sudo mkdir -p /etc/ssl/private
sudo mkdir -p /etc/ssl/certs
```
### 適切な権限を設定
```bash:bash
sudo chmod 700 /etc/ssl/private
sudo chmod 755 /etc/ssl/certs
```
### 作業ディレクトリに移動
```bash:bash
cd /etc/ssl/private
```
### 秘密鍵の生成
```
sudo openssl genrsa -out /etc/ssl/private/foobar.jp.key 2048
```
### CSRの生成
```
sudo openssl req -new \
-key /etc/ssl/private/foobar.jp.key \
-out /etc/ssl/certs/foobar.jp.csr \
-subj "/C=JP/ST=Kyoto/L=Kyoto-shi/O=City of Kyoto/CN=foobar.jp"
```
### 作業後は適切な権限を設定
```
sudo chmod 600 /etc/ssl/private/foobar.jp.key
sudo chmod 644 /etc/ssl/certs/foobar.jp.csr
```
Databricks認定資格 Data Engineer Associate 受験感想/合格体験記

:::note info
何か知りたいことがあれば、コメントいただければ、可能な範囲でお答えいたします。
ぜひお声がけください。
:::

### 試験に使えそうな資材
- 公式のAcademyTraining
- 公式のPracticeExam（オススメ）
- UdemyでもYoutubeでも、自分に合ったものであればOK
  
### オンライン受験について
- 15分前から実行可能：早めにLaunchして、試験に臨むとよいでしょう
    - 試験開始前に
        - セルフチェックが促される
        - 規約などが読まされる
        - 写真が再度撮られる
        - ビデオ・マイク・インタネットの動作確認が行われる
- クリーンデスク&Well-lit room
    - 試験部屋全体はチェックされなかったため、ネット上で勧められている浴室などで受験する必要はないと思う。試験部屋の要件に従って、いつもの環境を整えれば十分だと思う

### 受験感想
- 試験内容的には、Badgeよりも取得しやすい
    - 設問が短くて理解しやすくて回答もしやすい
    - 試験範囲はBadgeよりも絞られていると思う
- 試験時間的には、十分な余裕がある
    - 約4、5回、全問を取り直すことができるほど
- １ヶ月もあれば、合格するための勉強が十分にできるでしょう
- 英語以外の言語で受験する場合、原文の英語を確認することができない（改善してほしい）

### 受験にあたってのおすすめ
- 公式の[PracticeExam](https://files.training.databricks.com/assessments/practice-exams/PracticeExam-DataEngineerAssociate.pdf)は非常に役に立つ
    - PracticeExamは本番試験で使われなくなった問題だが、理解してほしいDatabricksの概念や機能などはほとんど変わっていないと思う

### 参考情報
https://qiita.com/nttd-saitouyun/items/e7d1ca77e23b8e635518
Google Cloud でサービスアカウントキーの発行ができなくなってる件

弊社では Google Workspace を立ち上げた場合は Azure AD を IdP とした SSO 設定を行うルールになっているのですが、今回あらたに GWS を立ち上げた際に Azure AD と接続するために必要な Credential であるサービスアカウントキーの発行ができなくなり、情シスの方が首をひねっていたので、代わりに対応したときのメモです。

# 大前提: GCP のデフォルトのセキュリティポリシーが 2024/5 に大きく変更されている

https://cloud.google.com/resource-manager/docs/secure-by-default-organizations?hl=ja

> デフォルトで保護されている組織のポリシーが、2024 年 5 月 3 日以降に作成されたすべての組織に適用されます。2024 年 2 月から 2024 年 4 月の間に作成された組織の一部には、これらのデフォルト ポリシーの適用が設定されている場合もあります。組織に適用されている組織のポリシーを表示するには、組織のポリシーを表示するをご覧ください。

この中の先頭バッターとして `サービス アカウント キー作成を無効にする(constraints/iam.disableServiceAccountKeyCreation)` が記述されていますが、これが理由です。5月以降に GWS/GCP を立ち上げた方はネットの記事ではなく公式ドキュメントを読むのが良いです。

# 手順

基本的には上記のリンクに記載の通りの手順で進められますが、CLI を使わない方法もあるので、書いていこうと思います。

## 1. 対象の GWS アカウントを発行してもらう

対象の Organization 管理者に依頼しました。

## 2. アカウントに対して Organization に対する管理権限を付与してもらう

これも対象の Organization 管理者に依頼します。

- GCP にアクセスし、リソースは対象 Organization を選択したうえで、ナビゲーションメニューの **IAM と管理** → **IAM** をクリック
- 対象のアカウントの **鉛筆マーク（プリンシパルを編集）** をクリック→ **組織の管理者(`roles/resourcemanager.organizationAdmin`)** をロールに追加してもらう

## 3. アカウントに対してポリシー管理者の権限を付与する

2 の手順が済んでいれば、自力で対応できます。

 こちらも IAM から **組織ポリシー管理者(`roles/orgpolicy.policyAdmin`)** をロールに追加

 ## 4. `disableServiceAccountKeyCreation` をオフにする

- ナビゲーションメニューの **IAM と管理** → **組織のポリシー** をクリック
- ポリシー一覧が表示されるので、フィルター部分に `disableServiceAccountKeyCreation` と入力
- **Disable service account key creation(`constraints/iam.disableServiceAccountKeyCreation`)**  を探してクリック
- 画面右上の **ポリシーを管理** をクリック
- **ルール** 部分の **適用済み** 横にあるゴミ箱アイコンをクリックして一旦削除
- その後 **ルールの追加** をクリックし、適用を **オフ** にして完了ボタンをクリック
- **ポリシーを設定** ボタンをクリックして保存

デフォルトでは、この組織ポリシーのソースが「親のポリシーをオーバーライド」になっているため、必要に応じて子のリソースにも実施するか、GCP の使い方によっては「親のポリシーを継承する」に変更しても構いません。

## 5. 対象のサービスアカウントに対してキーを発行する

操作についてはこれまでと変わりませんが、 上記の操作が完了していれば、対象のアカウントのキーを発行できるようになっています。

## 6. `disableServiceAccountKeyCreation` を再度オンにする

Google のドキュメントの焼き直しになりますが、**サービスアカウントキーを前提とした運用はセキュアではない** ので、今後の GCP のベストプラクティスに従えるように、改めてサービスアカウントキーの発行を禁止しておきます。

といっても、手順4の逆の操作を行うだけです。

- **ルール** 部分の **適用済み** 横にあるゴミ箱アイコンをクリックして一旦削除
- その後 **ルールの追加** をクリックし、適用を **オン** にして完了ボタンをクリック
- **ポリシーを設定** ボタンをクリックして保存

# 感想

日々の業務では情シス・コーポレートIT的なオペレーションや、インフラ周りの操作はほぼやらないので、GCP のデフォルトポリシーが変わったことを知るいいきっかけになりました。。
遠隔でグループポリシーを操作する。

1.機能をインストールする。
  「設定」-「システム」-「オプション機能」から「オプション機能を追加する」から「RSAT:グループポリシーの管理」を検索しインストールする。
2.  下記コマンドで実行する。
 runas /noprofile /user:ドメイン\編集可能アカウント "%SystemRoot%\system32\mmc.exe %SystemRoot%\system32\gpmc.msc"


*セントラルストアのポリシーテンプレートではなく、そのPCに入っているポリシーテンプレートを使用したい場合は、下記のレジストリを設定する。
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\GroupPolicy\
    名前：EnableLocalStoreOverride
    型:REG_SZ
    値:1

参考場所
　https://support.microsoft.com/ja-jp/topic/%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97-%E3%83%9D%E3%83%AA%E3%82%B7%E3%83%BC-%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88-%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E3%83%BC%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%AE-admx-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E4%BD%BF%E7%94%A8%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B%E6%9B%B4%E6%96%B0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99-24ea6900-fa03-d53f-c666-199e5ac02be9
AWS DVA-C02 まとめ

# Cognito
- Cognito IDプール
文章引用：[AWS CLIで動かして学ぶCognito IDプールを利用したAWSの一時クレデンシャルキー発行](https://dev.classmethod.jp/articles/get-aws-temporary-security-credentials-with-cognito-id-pool-by-aws-cli/#toc-3)

# DynamoDB
‐ DynamoDB Stream
文章引用：[Amazon DynamoDB ストリームトリガーとしてのAWS Lambda 関数](https://www.kodyaz.com/aws/dynamodb-streams-send-sns-notification-from-aws-lambda-function-using-python.aspx)

# CI/CD
- CodeArtifact
文章引用：[AWS CodeArtifact とは何ですか?](https://docs.aws.amazon.com/codeartifact/latest/ug/welcome.html)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631787/e4de37a3-21a5-fa57-1bec-10b3f3e04f7a.png)

# ElastiCache
- ElastiCache for Redis
 **ライトスルー(書き込みスルー)キャッシュ**
文章引用：[ライトスルー方式](https://shikaku-dou.com/write-through/#rtoc-1)
bun + biomeでイケてるTypeScript環境を作りたい！(vscodeの設定付き)

# はじめに
最近TypeScriptに入門したのですが、どうせ勉強するなら新しくてイケてる環境を作りたい！ということで、今回はvscode+bun+biomeでいい感じの環境を作っていこうと思います！


# イケてる環境とは？実現したいこと
- TypeScriptが動く環境をサクッと作りたい
- ライブラリのインストールやテストの実行が爆速の環境を作りたい
- vscode上で「ctrl + s」でセーブした時にLintやFormatが自動で効くようにしたい



# 環境
- Windows(wsl2)
- vscode

# 作成方法
## bunのinstall
今回はwsl2上で行うのでLinux用のコマンドでインストールします。windowsやmacの方はInstallationのページを見て適宜読み替えてください
```
$ curl -fsSL https://bun.sh/install | bash
```

https://bun.sh/docs/installation

## bunでのプロジェクト作成
bunを使ってプロジェクトの初期設定を行います！基本的には`bun init`を使うのですが、Next.jsなどよく使うものはbun側でTemplateを作成しているので使ってみましょう！
```
# bunのプロジェクト作成コマンド
$ bun init

# Next.jsの場合はこっち
$ bun create next-app .
```

https://bun.sh/docs/cli/bun-create

## biomeのインストール
### bunでbiomeをインストールする
Linter&Formatterのbiomeをインストールします。後々vscodeの機能でコードのオートフォーマットなどを実現するために必要です。
```
$ bun add -d @biomejs/biome
```
### 設定ファイルを出力する
下記のコマンドで設定ファイル`biome.jsonc`を出力することができます！
```
biome init --jsonc
```

## vscodeの設定
### biomeの拡張機能のインストール
vscode上のExtensionsで`biome`と検索し、拡張機能をインストールします。

https://biomejs.dev/ja/reference/vscode/

### vscode/settings.jsonの設定
この設定で実現するのは以下
- デフォルトフォーマッターをbiomeに設定する
- ファイル保存をしたらフォーマットされる
  - biomeを使って自動でフォーマットをかける
  - biomeを使ってimport文を自動でフォーマットをかける
- ファイルを1秒後に自動保存する

```
{
    "editor.defaultFormatter":　"biomejs.biome",
	"editor.formatOnSave": true,
	"editor.codeActionsOnSave": {
		"quickfix.biome": "always",
		"source.organizeImports.biome": "always"
	},
	"files.autoSave": "afterDelay",
	"files.autoSaveDelay": 1000,
	
}

```

## （おまけ）bunでyarn.lockを出力する
bun.lockbは、Bunのロックファイルで、速度向上のためにバイナリ形式となっています。人が読める形式のロックファイルを出力するには、`bun install -y`コマンドを使用して`yarn.lock`を生成する必要があります。
ライブラリをインストールした際は、同時に下記コマンドを実行することをおすすめします！
```
$ bun install -y
→yarn.lockが出力される
```

# おわりに
biomeなどのFormatterなどが最初からちゃんと設定してあるとコードの品質が統一されやすくなりますね！
bunのオールインワンパッケージの思想も開発初期のスピードを高めてくれるのでとても好きです！
ぜひ試してみてください！
paiza.ioでc# その13

# 概要
paiza.ioでc#、やってみた。
練習問題やってみた。

# 練習問題
AtCoderをhashsetを使って解け。

# 参考にしたページ

https://oraclesqlpuzzle.ninja-web.net/kyoupro/05-atcoder-02-abc/kyoupro-abc097-c.html


# サンプルコード
abc097 c
```
using System;
using System.Collections.Generic;
using System.Linq;

class Program {
    static string InputPattern = "InputX";
    static List<string> GetInputList() {
        var WillReturn = new List<string>();
        if (InputPattern == "Input1") 
        {
            WillReturn.Add("aba");
            WillReturn.Add("4");
        }
        else if (InputPattern == "Input2") 
        {
            WillReturn.Add("atcoderandatcodeer");
            WillReturn.Add("5");
        }
        else if (InputPattern == "Input3") 
        {
            WillReturn.Add("z");
            WillReturn.Add("1");
        }
        else 
        {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) 
                WillReturn.Add(wkStr);
        }
        return WillReturn;
    }
    static void Main() {
        List<string> InputList = GetInputList();
        string S = InputList[0];
        int K = int.Parse(InputList[1]);
        var SubStrSet = new HashSet<string>();
        int UB = S.Length - 1;
        for (int I = 0; I <= UB; I++) 
        {
            for (int J = I; J <= UB; J++) 
            {
                int StrLen = J - I + 1;
                if (K < StrLen) 
                    break;
                SubStrSet.Add(S.Substring(I, StrLen));
            }
        }
        var Query = SubStrSet.OrderBy(pX => pX).ElementAt(K - 1);
        Console.WriteLine(Query);
    }
}





```

# 実行結果

```
b
```

# 成果物

https://paiza.io/projects/whVzEz_PDSKkEMXQPjIopA


以上
【随時更新】Django（Python）チートシート（まとめ）

Django・Pythonで使うコマンドをまとめました。随時更新していきますのでご活用下さい。



```python
# 仮想環境関連

python -m venv env
# 仮想環境を作成して依存関係を隔離

source env/bin/activate  # (Linux/macOS)
env\Scripts\activate  # (Windows)
# 仮想環境を有効化し、パッケージ管理を簡単に

deactivate
# 仮想環境を無効化

pip install -r requirements.txt
# 必要なパッケージをインストールして環境を整える


# Djangoプロジェクトの作成・初期設定

django-admin startproject プロジェクト名
# 新しいDjangoプロジェクトを作成

django-admin startproject プロジェクト名 .
# プロジェクトディレクトリをルートに作成

python manage.py startapp アプリ名
# 新しいアプリケーションを追加

python manage.py runserver
# 開発サーバーを起動

python manage.py runserver 8080
# 特定ポートで開発サーバーを起動

python manage.py runserver 0.0.0.0:8000
# 外部アクセス可能なIPでサーバーを起動

python manage.py createsuperuser --skip-checks
# パスワードバリデーションを無視してスーパーユーザーを作成

python manage.py makemigrations
# モデルの変更内容をマイグレーションに反映

python manage.py migrate
# データベースにマイグレーションを適用

python manage.py migrate アプリ名 zero
# 特定アプリのマイグレーションをリセット

python manage.py showmigrations
# 現在のマイグレーション状態を確認

python manage.py sqlmigrate アプリ名 マイグレーション番号
# マイグレーション内容のSQLクエリを表示


# データ操作および管理

python manage.py createsuperuser
# 管理画面へのスーパーユーザーを作成

python manage.py flush
# データベースを初期化

python manage.py dumpdata > data.json
# データベース内容をJSONでエクスポート

python manage.py loaddata data.json
# エクスポートしたJSONデータをインポート

python manage.py dbshell
# データベースのSQLシェルを起動


# テスト関連

python manage.py test
# すべてのテストを実行

python manage.py test アプリ名
# 特定アプリのテスト実行

python manage.py test --verbosity=2
# テストの詳細表示

coverage run --source='.' manage.py test
coverage report
# テストカバレッジを取得してテストカバー率を確認


# 静的ファイル・キャッシュ

python manage.py collectstatic
# 本番用に静的ファイルを収集

python manage.py clear_cache
# キャッシュをクリア（カスタムスクリプト追加が必要）


# その他便利なコマンド

python manage.py shell
# Django環境でのPythonシェルを起動

python manage.py diffsettings
# デフォルト設定との違いを確認

python manage.py changepassword ユーザー名
# 特定ユーザーのパスワード変更

python manage.py runserver --noreload
# サーバーの自動リロードを無効化

python manage.py clean_pyc
# キャッシュファイルを削除（Django Extensionsが必要）

python manage.py show_urls
# プロジェクト内のすべてのURLを一覧表示（Django Extensionsが必要）

pip freeze > requirements.txt
# インストールされているパッケージをrequirements.txtに記録

python manage.py sql_injection_check
# SQLインジェクションチェック（Django Debug Toolbarが必要）

python manage.py unused_migrations
# 未使用のマイグレーションを確認

```
MACアドレスの仕組みを考える。(M5NanoC6)


x 過去ログを見よ!!
x MACアドレス系のプログラムのアクセス回数が異常に少ないので書いてみた
x 書いている途中であきた

いろいろ
MACアドレスが単なる意味の無い、数字の羅列なので
受け付けない人がいると思ったのでラクガキを書いてみた。
ブロードキャスト系は、各自考えてね!!(あきた)
メーカーが付けた重ならない任意のアドレス(それだけの意味)(一意と言うらしい)
ねこといぬは、メーカー製かとなるがそこは、考えない。




MACアドレス
ねこさんがいぬさんにおくる


![neko_ie.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/0565fa48-9ab4-7648-dd5f-1d8b13ef9962.jpeg)

![inu_ie.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/c980b7d0-18f8-57fd-d580-8cf1159bbd88.jpeg)

![paketo1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d25f6869-d678-c23b-65a1-ff64fc230dc2.jpeg)


![paketo.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/8bff921a-beee-83f0-bfe0-8c33d550340a.jpeg)


![tensou.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/dd7b70de-21b4-c2dd-0390-ac0aa630f3a5.jpeg)

![inu_ie2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e8fb1d0f-055e-6228-6d44-a9be103f29f3.jpeg)


![mede.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/de61cb3e-ec1c-a031-e071-c85eddd9a2ad.jpeg)
SORACOM Flux で OpenAI モデルを使用する方法！クレジット枯渇に悩むあなたへ！

この記事では、SORACOM Flux の AIアクション で OpenAIモデル を使用する方法について解説します。

# SORACOM Flux の AIアクションとは
AIアクション は、AIモデルとプロンプトを指定して、SORACOM Flux から生成AIと連携することが簡単に出来るようになります。AIモデルに指示や質問をして、そのレスポンスを次のアクションに渡すことが出来ます。これにより、データや画像解析などさまざまなシーンにおいて生成AIとの連携がローコードで可能となります。

Flux 上では以下のアイコンで表示され、AIモデルの選択やプロンプトの指定などを行うことが可能です。
今回は、このAIアクションの中でも、OpenAIモデルを使用する方法について解説します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/a35b835d-b551-a0cf-4ba7-ac2d97ff79f1.png)

AIアクションの詳しい情報はこちらを参照してください。

https://users.soracom.io/ja-jp/docs/flux/action-ai/

# クレジットがなくなったんですが
現在、SORACOM Flux の AIアクションはクレジットを消費する形となっており、事前に用意されているクレジット分を消費しながら様々なモデルを使うことができます。
Azure OpenAI／Amazon Bedrock／Google Geminiなど、さまざまなAIモデルを SORACOM Flux で選択できるのがすごく便利な一方で、現在はクレジットの料金体制については、まだまだ準備中という状況もあり、クレジットが枯渇すると継続的に運用が出来なくなるという課題も発生します。

そこで、ライセンス持ち込みが可能で、SORACOM Flux のクレジットがなくても利用できるOpenAIモデルの使用方法について今回は解説します。尚、OpenAIサービスの利用料は掛かるので、その点は注意して下さい。


# 事前準備：OpenAIのAPI Keyの作成
SORACOM Flux で OpenAIモデル を使用する場合は、『ライセンス(API Key)持ち込みのみ』が対応しています。そのため、OpenAIのサービスでAPI Keyを作成する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/c5eb342e-0dbd-efea-1b64-0edaf476e318.png)

<br>
この記事では、OpenAIのアカウント作成などに関する説明は割愛しますが、アカウントを作成して、API Keyを生成する場合には以下の画面から生成することが出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/ffdbbc61-60c3-26a8-431a-ffdac88dcccb.png)

生成した API Key は SORACOM Flux 上で入力する必要が出てくるので、必ずメモを取っておきましょう。




# OpenAIをAIモデルで選択
ここでは、AIモデルでOpenAIを使う方法を説明します。

「OpenAI を利用する場合、お客様自身のライセンスが必要です」
とあるように、自分のOpenAIのライセンスを使用する必要があり、先ほど作成した OpenAI の API Key がそれにあたります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/9e28319b-9cd5-37c9-cf30-35d00abe7ae1.png)

<br>
[AI モデル] の選択で、OpenAI の以下のモデルの内、いずれかを選択します。

* OpenAI (GPT-4o)
* OpenAI (GPT-4o mini)

OpenAIを利用する際には、ライセンス(API Key)持ち込みが必要になるので、[認証情報] を設定する必要があります。
[認証情報を追加] のボタンを押すと、以下のような画面になるので、任意の [認証情報ID] の設定と [API トークン] の設定を行います。これにより、OpenAIモデルを使用することが出来るようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/5dc38a70-b41e-6588-bb27-09f62566551b.png)

# 認証情報を削除する方法
いろいろ試している過程で認証情報をいろいろ作ってしまい、不要になることがあります。その場合は、以下の記事を参考に、ユーザーコンソール 画面の 右上の [セキュリティ] のメニューより削除することが可能です。
SORACOM Flux のみを操作していると、この認証情報の削除がどこから出来るのか分からなくなり、自分も調べて対応したので、参考までにこちらでも取り上げます。

https://users.soracom.io/ja-jp/docs/credentials-store/delete/

# 最後に
SORACOM Flux はローコードでいろいろなことが出来て、AIアクション を使って、生成AIとの連携がかなり容易になっている点が個人的には推しポイントです。ただ、現時点(2024/11/15)では、クレジットを増やして使えるPro/Enterpriseの料金プランがまだ準備中となっているので、AIアクションを使ってちょっと何かを作ってみた場合に、すぐにクレジットが枯渇します(笑) なので、しばらくは継続的に運用を回そうと思うと、OpenAIモデルを使用する必要が出てくるので、この記事を参考にしてもらえたらと思います。


# その他の参考リンク

https://qiita.com/yukima77/items/68b133628a00b1e2a654

https://qiita.com/yukima77/items/e2b78d506575d82d9bce
【React】+【TypeScript】+【Vite】環境構築

## はじめに
この記事は【React】+【TypeScript】+【Vite】の環境構築についての備忘録である
## 導入方法
### React + TypeScript + Vite のインストール方法
ターミナル上で、上記の環境をインストールしたいフォルダに移動し、以下コマンドを実行する
```
npm create vite@latest
```
質問がいくつか出てくるので回答し、最初はこのアプリの名前で、フォルダの名称に使用される
任意の名称を決め、「Enter」キーを押下する
```
? Project name: › vite-project
```
フレームワークを選び、↓矢印キーでReactを選んで「Enter」キーを押下する
```
? Select a framework: » - Use arrow-keys. Return to submit.
    Vanilla
    Vue
>   React
    Preact
    Lit
    Svelte
    Solid
    Qwik
    Others
```
TypeScriptを使うか聞かれる。一番上を選んで「Enter」キーを押下する
```
? Select a variant: » - Use arrow-keys. Return to submit.
>   TypeScript
    TypeScript + SWC
    JavaScript
    JavaScript + SWC
```
プロジェクト・フォルダの作成はこれで完了。次は、上記の指示に従って依存パッケージのインストールを行う
プロジェクトのフォルダに移動し、npm installを実行する
```
npm install
```
これでセットアップは完了である
NET::ERR_CERT_COMMON_NAME_INVALIDのエラー



+ [unable to launch - Hands-on challenges](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007clWHK)

:::note alert
Your connection is not private

Attackers might be trying to steal your information from ap4.salesforce.com (for example, passwords, messages or credit cards). Learn more

NET::ERR_CERT_COMMON_NAME_INVALID
:::


一般的には

[「保護されていない通信」「この接続ではプライバシーが保護されません」と表示される](https://www.bestssl.net/faq/chrome-privacy/)
paiza.ioでc# その12

# 概要
paiza.ioでc#、やってみた。
練習問題やってみた。

# 練習問題
AtCoderをhashsetを使って解け。

# 参考にしたページ

https://u-ske1.sakura.ne.jp/wp1/2022/11/24/abc278/


# サンプルコード
abc278 c
```
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Numerics;

public class Hello
{
    public static void Main() {
        var NQ = Console.ReadLine().Split().Select(x => int.Parse(x)).ToArray();
        var N = NQ[0];
        var Q = NQ[1];
        var users = new Dictionary<int, HashSet<int>>();
        for (int i = 0; i <= Q - 1; i++) 
        {
            var op = Console.ReadLine().Split().Select(x => int.Parse(x)).ToArray();
            if (op[0] == 1) 
            {
                if (users.ContainsKey(op[1]) == false) 
                {
                    users.Add(op[1], new HashSet<int>() { op[2] });
                }
                else 
                {
                    users[op[1]].Add(op[2]);
                }
            }
            else if (op[0] == 2) 
            {
                if (users.ContainsKey(op[1]) == false) 
                {
                    users.Add(op[1], new HashSet<int>());
                }
                else 
                {
                    users[op[1]].Remove(op[2]);
                }
            }
            else 
            {
                if (users.ContainsKey(op[1]) && users.ContainsKey(op[2])) 
                {
                    if (users[op[1]].Contains(op[2]) && users[op[2]].Contains(op[1])) 
                    {
                        Console.WriteLine("Yes");
                    }
                    else 
                    {
                        Console.WriteLine("No");
                    }
                }
                else 
                {
                    Console.WriteLine("No");
                }
            }
        }
    }
}
```

# 実行結果

```
No
Yes
No
No
```

# 成果物

https://paiza.io/projects/6RRE_21GCMXXBk7XCBMQig

以上
SnowflakeでRAGを構築する上で知っておきたいいくつかのこと。その１STAGEの操作

# 1.RAGを構築してみたいそんなあなたへ
以前こんなスーパー有益な記事を見つけました。
SnowflakeでRAGを構築してみるHOW TOの記事になります。

https://zenn.dev/minedia/articles/21d5b4b23e38eb

「これはすごい！」
となった反面
「この独自の関数なんだ・・？」
ともなりました。

ここでは、上の記事をより深ぼると共に一緒に学んで行ければなと思います。


## 2.1 ディレクトリテーブルのクエリ

https://docs.snowflake.com/ja/user-guide/data-load-dirtables-query

内部ステージや外部ステージにRAGに読み込ませるためのPDFなどを保存していることを前提としています。
そこで、ステージにあるデータにアクセスする際のクエリが必要となります。

```sql
SELECT * FROM DIRECTORY( @<stage_name> )
```

stage_name:有効化されたディレクトリテーブルを持つステージの名前になります。

実際に、*を使ってクエリを叩いてみます。

```sql
select *
from directory(@docs);
```
そうすると以下のようなものが出力されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526914/cc55a988-dc91-eaa2-4725-087df76cee06.png)

詳細なカラムの詳細は以下の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526914/38e0cabf-bccd-3b9e-2c09-3b960bbb5666.png)

この中で、MD5とETAGは馴染みがある人とそうでない人が別れるのではないでしょうか

### MD5とは
ファイル用のMD5チェックサムは、ファイルの内容に基づいて生成される一意のハッシュ値で、ファイルの整合性や一貫性の確認に使用されます。


https://academy.gmocloud.com/wp/know/20200116/8627

### ETAGヘッダーとは？
Etagとは、ブラウザキャッシュの仕組みの中で使用されるHTTPレスポンスヘッダーでリソースの特定のバージョンに関する識別子のことです。

Etagがあることでウェブサーバーは、コンテンツが変更されていない場合はレスポンス全体を再送する必要がないので、キャッシュがより効率的になるとのこと。

ヘッダーにも色々種類があるようで、詳しくは以下の記事に記載されているのでよかったら見てみてください。

https://zenn.dev/msy/articles/e81ff7cd52659a

https://qiita.com/OmeletteCurry19/items/a84d6a7c91df50e7dcd6


## build_scoped_file_url

https://docs.snowflake.com/ja/sql-reference/functions/build_scoped_file_url


ステージ名と相対ファイルパスを入力として使用して、スコープ付きSnowflakeファイル URL をステージングされたファイルに生成します。

```sql
BUILD_SCOPED_FILE_URL( @<stage_name> , '<relative_file_path>' )
```
二つ目の引数には、単一の相対パスを入力していただくと、一つのパスに対してスコープ付きURLが適用されます。
ステージ全体のファイルに対して適用したい場合は以下のように記載します。

```sql

select 
    relative_path,
    file_url,
    -- ここでステージ全体にスコープつきURLが適用されている
    build_scoped_file_url(@docs, relative_path) as scoped_file_url
    
from
    directory(@docs);

```

実行順序として```directory(@docs)```でステージの情報をテーブルとして表現しています。
これは上の「2.1 ディレクトリテーブルのクエリ」を参照してください。
これで、ステージ全体のpdfファイルのパスを一気に抽出できます。

この後に、渡されたrelative_pathをbuild_scoped_file_urlに渡しています。

### スコープ付きSnowflakeファイル URLとは？

スコープされたファイル URL は、ステージ上の特権を与えることなく、ファイルへの短期的なスコープされたアクセスをユーザーに与えるために、ユーザー用に生成することができます。

S3でイメージが湧くのが「署名付きURL」でしょう

スコープ URL はエンコードされ、指定されたファイルへのアクセスを限られた期間許可します。出力のスコープ URL は、永続化されたクエリ結果期間が終了するまで（結果キャッシュが期限切れになるまで）、呼び出し元に対して有効です。その期間は現在24時間です。


# 3.最後に
今回は、データをスコープ付きURLにするまでを深ぼって解説してみました。
ではなぜRAGを構築する上でスコープ付きURLにしなくてはいけないのか？

それは今度解説できればと思います。
それではまた。
コミュニケーション能力に自信のない若手エンジニアへ

## コミュニケーション能力に自信のない若手エンジニアへ

### はじめに
ITエンジニアでもコミュニケーション能力は重要だとよく言われると思います。とはいえ努力して身につけるのはなかなか難しいものがあります。
コミュニケーション能力向上の書籍とか研修とかもありますが、少なくとも私の経験上では役に立った試しはありません。
しかし営業などに比べてそこまでハイレベルなものが求められるわけではないので、コミュニケーション能力が低くてもなんとかやっていくことはできます。私もコミュニケーション能力は低い方ですが10年以上やらせてもらってます。
特に最初の数年が一番きついと思うので、ここではその乗り切り方について私見を述べていきます。

### 健康第一
まずは健康第一です。
コミュニケーションに対して苦痛やストレスを感じる場合、あんまり無理して積極的にコミュニケーションを取ろうとすると潰れる可能性があります。
私も新人の頃は出たくもない飲み会とかマラソン大会とか無理して全部出てましたが、結局体調を崩して休職して退職する羽目になりました。
業務だと避けられないこともありますが、必要最低限こなしていればそれ以上は無理しなくていいと思います。
あと睡眠不足は強烈なデバフになるので、睡眠時間を確保するなり質の良い寝具を揃えるなり内科に行って睡眠導入剤等を処方してもらうなりしてください。

### 慣れ
ある程度は慣れです。ただしコミュニケーションにストレスや苦痛を感じる場合はダメージが蓄積するという面もあるし、慣れてきたらそれ以上は漫然とやっても向上しづらいので無制限にやればいいというものでもありません。
面接でも何十連敗もしていると、落ちるのが当たり前になって負け癖がつく上にノイローゼ状態になります。健康第一です。

### 電話対応
ここでは社内の固定電話にかかってきた場合を想定しています。
特に新人だと固有名詞や専門用語を連発されると何を言っているかさっぱり聞き取れないし、誰々さんをお願いしますと言われても人数が多いと誰が誰かわからないということもあります。
手に負えないようであれば無理せず周囲の人にバトンタッチするか、周囲に誰もいなければ後でかけ直してもらうように言った方がいいです。

### 会議
最初のころは何を言っているかさっぱりわからないので置物になることも多々あると思います。議事録もまともに取れません。長時間拘束されているだけというのも苦痛なので、わからない単語や不明点をメモして後で調べるなりその場で聞くなりしましょう。

### 確認
何かやる前、やった後、やろうとしていることなど、何でも確認してもらった方がいいです。
確認なしでやっていいこととだめなことの区別は最初はわからないし、会社や現場によっても違うので、とにかく何でも確認が必要です。ルールが明文化されていたり権限管理がきっちりしていてそもそも承認なしではアクセスできないこともありますが、そうでないことも多々あります。
報連相のようなものですが、どっちかというと相手に承認してもらうことでミスを減らしたり責任を取ってもらうことで自分を守ることが主目的です。
口頭だと証拠が残らないのでメールやチャットの方がいいですが、たまにメールをしょっちゅう見逃す人やどうしても口頭でないとだめという人がいます。込み入った内容の場合は口頭で会話した後で内容をメールやチャットで送付して「抜け漏れや認識齟齬があれば訂正お願いします」とした方が安全でしょう。

### 伸ばせそうなところから伸ばす
コミュニケーションといっても対話が全てというわけではありません。
文章や資料、図解等をわかりやすく書くとか、知識・技術を蓄えて話について行けるようにするとか、別方面から攻めるのもアリだと思います。

###  コミュニケーション以外の分野で力を発揮する
裏方的な立場であまり表に出ないのもアリです。
この場合はコミュニケーションが得意な人にクライアントや他部署等との窓口をお任せする機会が多くなりますが、その分技術・知識の向上が必要になります。
お任せする相手にはギブアンドテイクで積極的に技術・知識面で丁寧にサポートしていきましょう。これも一つのコミュニケーションです。
SadServersで障害復旧を体験してみた #2

# はじめに
トラブルシューティングの体験をしてliunxコマンドを記憶に定着させるためと
現場でどんなことをやっているか実際にやって経験値を積みたいのでやってみた。

# #2のシナリオをやってみた
#### 問題 webサーバーにaccess.logファイルがありそこにhttpリクエストが1行ずつ構成されているのでその中で最も多くアクセスしているIPアドレスを特定して指定されたファイルに書き込む事で解決できる。

![スクリーンショット 2024-11-14 22.35.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535626/aff38d58-c271-9807-c968-8d2665a5a027.png)

# まずはlsでファイルがあるか確認した。

```bash
ls -la /home/admin/access.log
```

![スクリーンショット 2024-11-14 22.26.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535626/bf106905-4b4f-c9ee-06d2-559cf32aaa4f.png)

ちゃんと存在していた

# fileの中身をのぞいてみた

```bash
cat /home/admin/access.log

```

![スクリーンショット 2024-11-14 22.27.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535626/265ca4b8-5544-a879-edcb-af2db1bf5f1a.png)

確かになんかいっぱいアクセスされている、この中から一番アクセスされてるIPアドレスの特定...なるほど！分からん。

# ヒントを見てみた

 ヒントを見ると`awk`を使えるみたいなことを書いていた。みたことあるけどいまいち使い方がわからないので調べた。

 # awkとは
 awk(オーク)と呼ぶ。由来はプログラミング言語開発者のAho(エイホ)さん、Weinberger(ワインバーガー)さん、Kernighan(カーニハン)さんの頭文字からきてるらしい

 awk はテキスト処理が得意で表記表現の文字列の検索が得意で他にいっぱいやれることがあって全ては把握できていない

 ```bash
 awk '{print $1}'
 ```
 こんな構成ではfile内のスペースやタブなどで区切られている部分を絞るかんじで＄1なら一番最初の区切りが対象になる
上のaccess.logファイルの中身でいうと、
```$1=IPアドレス 
   $2=-(ハイフン) 
   $3=-(ハイフン) 
   $4=タイムスタンプ
```   
   のようにいる部分だけ指定して表示させたり集計することができる。

 これにいくつかコマンドを追加してIPアドレスの集計を行う

 # sort コマンド
  sort(ソート)は表示入力やファイルの内容をソートする役割
ただ整列、並び替えするだけでは集計出来ないのでさらにコマンドを追加
-g オプション uniqの出力を数値で並べる
-r オプション逆順での意味のソートをする　数値が高い順に並ぶ

# uniq コマンド
  uniq(ユニーク)はソートされた内容の重複を削除して、重複した行の数を数える、このコマンドを正常に使うには先にsortで並び替える必要がある。
  -c オプションでそれぞれの行が何回出現したかを表示する。

# head コマンド
  head(ヘッド) 上位10を出力する これを入れないと行が多すぎる時に見切れる

# catからawkに渡す

```bash
cat /home/admin/access.log | awk '{print $1}' |sort | uniq -c | sort -gr | head
```
catでファイルの中身を出力してそれをパイプでawkに渡す事で、重複した行を削除して同じ行を計算してくれる。
表示のしていは$1だけなのでIPアドレスのみが多い順で10位まで出力される

![スクリーンショット 2024-11-14 22.32.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535626/e467d1a2-b2e8-4a38-3f2f-4b382368f709.png)
# 特定したIPアドレスを指定されたファイルに書き込む

vimなどのエディタではなくヒントに書かれてある`echo > {ファイル名}`の形で記述する

```bash 
# ファイルはSadServersから指定がある
echo 特定したIP > /home/admin/highestip.txt
```

# 回答が正解か確認してみる

![スクリーンショット 2024-11-14 22.35.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535626/3575b0cf-fd70-af7c-c0d5-2b89faf68b8a.png)

見事に正解した！　ヒントがほぼ答えなのでそのコマンドについて調べて概要がわかると正解に辿りつけそう。ただ、全ての機能とかオプションまで覚えるのは大変だなと感じた。

# まとめ
`awk`はテキスト処理と表記表現の文字列の検索が得意で、必要な情報だけ見たい時にそこだけピックアップできる。重複する情報もあるので`sort`で並び替えて`uniq`ソートされた内容の重複を削除して-cで集計する。
集計したものを`sort -gr`で`unip`の出力した内容を数値と逆順で並び替える。
これで最も多くアクセスしているIPアドレスを特定することができた。

# 感想

`awk`は奥が深くてやれることが多くあり全て把握するのには時間がかかると思った。
こうして実体験する過程で使い方を学ぶことで、実際に障害復旧する時に大いに役立つコマンドだと言うことが分かった。
SQL パズル20　テスト結果 解法２ メモ


# 概要
SQLパズル11 テストの解法２についてのメモです。
題材としては、Having句を使った関係除算です。

# 要件
テスト結果に関したテーブルがある。
テストが完了している場合、日付が記入される
テストが完了していない場合、日付は記入されておらず　nullが記入される

テストが全て完了している科目のみを取得したい。

# DDL
```sql
drop table if EXISTS TestResults;
create table TestResults(
    test_name CHAR(20) not null,
    test_step integer not null,
    comp_date Date,
    primary key(test_name,test_step)
);

INSERT INTO TestResults VALUES('読解', 1, '2006-03-10');
INSERT INTO TestResults VALUES('読解', 2, '2006-03-12');
INSERT INTO TestResults VALUES('数学', 1, NULL);
INSERT INTO TestResults VALUES('数学', 2, '2006-03-12');
INSERT INTO TestResults VALUES('化学', 1, '2006-03-08');
INSERT INTO TestResults VALUES('化学', 2, '2006-03-12');
INSERT INTO TestResults VALUES('化学', 3, '2006-03-15');

```

# 答え
```sql
SELECT test_name
FROM TestResults
GROUP BY test_name
HAVING COUNT(*) = COUNT(comp_date)
;


```

# 経過
## sql
```sql
--test_name毎に部分集合を作る
SELECT test_name,count(*) as C_aster, count(comp_date) as C_comp_date
FROM TestResults
GROUP BY test_name
;

-- Having句で部分集合の条件を指定する
-- cout(*)がnullを数えるに対して、COUNT(comp_date)はnullを数えないことを利用している。
SELECT test_name,count(*) as C_aster, count(comp_date) as C_comp_date
FROM TestResults
GROUP BY test_name
HAVING COUNT(*) = COUNT(comp_date)
;

```

## 図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/9cca8f8c-eecd-8213-01e7-49d1140e9481.png)


# 参考
SQLパズル　p88

SQLパズル　サポートページ
https://mickindex.sakura.ne.jp/database/db_support_sqlpuzzle.html#LocalLink-p20

達人に学ぶSQL徹底指南書第２版 p133 column　関係除算
関係除算の定義が複数ある

達人に学ぶSQL徹底指南書第２版 p127 バスケット解析

github 差分
https://github.com/RYA234/SQL_Puzzle_Learning/commit/71ce75de6a6ac469009b738a56e35f8765e196fc
AZ-305 試験対策　学習方法

## はじめに
AZ-305 (Azure Solutions Architect Expert) を取得したので
その学習方法や受験の所感をまとめます。

## Microsoft Azure Infrastructure Solutions とは
https://learn.microsoft.com/ja-jp/credentials/certifications/exams/az-305/

Azureでの設計・管理・運用を担うエンジニア向けの資格です。
出題範囲と配分は以下の通りです。
・ID、ガバナンス、および監視ソリューションを設計する (25 から 30%)
・データ ストレージ ソリューションを設計する (20 から 25%)
・ビジネス継続性ソリューションを設計する (15 から 20%)
・インフラストラクチャ ソリューションを設計する (30 から 35%)

## 前提
現在新卒３年目で、業務ではAzureのクラウド開発に携わっています。
AZ-305取得の1年半前にAZ-900、半年前にAZ-104を取得しています。

## 所感
AZ-104に比べると、暗記が少なくかなり簡単な気がしました。
AZ-104の受験時は、試験中にLearnを参照できることを知らず、
苦戦したのが原因かもしれませんが。。。

## 学習方法
以下の2つの問題集を解き、解説で理解できなかったものは
LearnやChat GPTで復習しました。

試験中はMicrosoft Learnにアクセスできるため、
演習からLearnで調べながら解くと良いと思います。
効率よく調べる方法を練習しておくと、受験本番で焦らず調べられます。

### 最短で合格！Azure Solutions Architect Expert <br>AZ-305試験対策問題集（Udemy）
https://www.udemy.com/course/microsoft-azure-az305-exam/learn/quiz/5756940/results?expanded=1248575960#overview

60問×3回分の演習になります。解説も豊富で理解しやすいです。
各回、正答率が90%以上になるまで4,5回解き直しました。

### 公式模試（Microsoft Learn）
https://learn.microsoft.com/ja-jp/credentials/certifications/exams/az-305/practice/assessment?assessmentId=15&assessment-type=practice

1回50問の演習です。単一選択、複数選択の問題で、解説も豊富です。
90%以上になるまで5,6回解き直しました。
5,6回解くと、用意されている問題は網羅できたかと思います。

![スクリーンショット 2024-11-15 024657.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850932/fdf24cd1-8a86-1627-4943-f0eea655d254.png)

## その他参考
以下はAzureで重要なドキュメントの解説動画と資料となっています。
試験範囲には含まれていますが、直接問われることは無かったです。
各分野の問題を考える上での背景や根拠に繋がる内容かと思います。
試験対策以外にも使えますので、ぜひご活用ください。

### Cloud Adoption Framework
CAF：クラウド導入に向けたベストプラクティス

https://github.com/nakamacchi/AzureCAF.LandingZones.Demo/blob/master/readme.md

### Well-Architected Framework
WAF：優れたアーキテクチャの設計原則

https://info.microsoft.com/JA-AzureApp-CNTNT-FY21-12Dec-18-AzureLightupWellArchitectedFramework-SRGCM4091_01Registration-ForminBody.html
UE5 C++ GetSelectedFolder

BlueprintFunctionLibrary

.h file
```C++
	UFUNCTION(BlueprintCallable, meta = (DisplayName = "Get Selected Folder", Keywords = "GetSelectedFolder"), Category = "Editor")
	static void GetSelectedFolder();
```

.CPP file

```C++
void UBPLibrary::GetSelectedFolder()
{
	const TWeakPtr<ILevelEditor> LevelEditor = FModuleManager::GetModuleChecked<FLevelEditorModule>(TEXT("LevelEditor")).GetLevelEditorInstance();
	const TSharedPtr<ISceneOutliner> SceneOutlinerInterface = LevelEditor.Pin()->GetMostRecentlyUsedSceneOutliner();
	const STreeView<FSceneOutlinerTreeItemPtr>& CurrentTree = SceneOutlinerInterface->GetTree();
	TArray<FSceneOutlinerTreeItemPtr> SelectedItems = CurrentTree.GetSelectedItems();
	
	for (const FSceneOutlinerTreeItemPtr SceneOutlinerTreeItem : SelectedItems)
	{
		if (const FActorFolderTreeItem* FolderItem = SceneOutlinerTreeItem->CastTo<FActorFolderTreeItem>())
		{
			UE_LOG(LogTemp, Display, TEXT("GetSelectedFolder::SelectedObject %s"),*FolderItem->GetActorFolder()->GetLabel());
			UE_LOG(LogTemp, Display, TEXT("GetSelectedFolder::SelectedObject %s"),*FolderItem->GetActorFolder()->GetPath().ToString());
		}
	}
}
```

need Dependency Module
"UnrealEd"
"SceneOutliner"
【メモ書き】VBAアウトプット QueryTableでCSVファイルを取り込んでみよう編 #1

## 【メモ書き】VBAアウトプット QueryTableでCSVファイルを取り込んでみよう編 #1

100万行ほどのCSVをVBAで取り込もうとしたときに利用したVBAのQueryTablesメソッドを用いてCSVファイルを取り込む処理をメモ書きとして残しておきます。

### 1. インポートしてみる

Mainを実行すると「C:\csv\aiueo.csv」のCSVファイルをSheet1のA1セルに出力する。
※aiueo.csvの文字コードはSJIS

```text:aiueo.csv
番号,名前,点数
1,田中,20
2,遠藤,35
3,浜田,40
4,松本,42
5,月亭,55
```

```vb:test.bas
Option Explicit

Sub Main()
    Dim outputSheet As Worksheet '出力するワークシート
    Dim outputRange As Range '出力するセル
    Dim filePath As String 'CSVのファイルパス
    
    'パラメータを設定
    filePath = "C:\csv\aiueo.csv"
    Set outputSheet = ThisWorkbook.Sheets(1)
    Set outputRange = outputSheet.Range("A1")
    
    'CSV取り込み処理を呼び出し
    Call CsvToSheet(filePath, outputSheet, outputRange)
End Sub

'指定したファイルパスのCSVファイルを取り込む
Sub CsvToSheet(ByVal iFilePath As String, ByRef iOutputSheet As Worksheet, ByRef iOutputRange As Range)
    Dim qt As QueryTable
    
    '取り込むCSVファイルと出力箇所を指定する
    Set qt = iOutputSheet.QueryTables.Add( _
        Connection:="TEXT;" & iFilePath, _
        Destination:=iOutputRange _
    )
    
    With qt
        '#プロパティ1
        '#プロパティ2
        '#プロパティ3
        'etc...
        .Refresh 'インポートしたデータを吐き出す
    End With
End Sub
```

実行結果は以下のようになります。（ただcsvファイルの文字列をそのまま吐き出しただけですね。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935742/cd089a6c-5072-1f5d-f1fa-3477fc718cd7.png)

大まかな手順として以下の流れで処理を実施しています。

① QueryTableにインポートしたいCSVファイルと出力先を設定
```vb
'取り込むCSVファイルと出力箇所を指定する
Set qt = iOutputSheet.QueryTables.Add( _
    Connection:="TEXT;" & iFilePath, _
    Destination:=iOutputRange _
)
```
``QueryTables.Add``メソッドの ``Connection``と``Destination``を指定します。
| 名前 | 説明 |
|:-:|:-:|
| Connection　  | インポートしたいcsvファイルのパスを設定する。接続文字列のプレフィックスとして"TEXT;"を記載する。 |
| Destination   | 出力したいセル範囲の左上端を指定する。 |

② QueryTable.Refleshでシートに出力

`QueryTable.Reflesh`でインポートしたCSVファイルをシートに吐き出します。

```vb
With qt
    '#プロパティ1
    '#プロパティ2
    '#プロパティ3
    'etc...
    .Refresh 'インポートしたデータを吐き出す
End With
```

本来であれば、プロパティ1, プロパティ2と記載してある箇所にプロパティを指定して、出力時の形式を整えます。（今回は何も指定しないで出力してみました。）

### 2. 出力データを整える

データの区切り文字である`,`（カンマ）が残ってしまっているので、区切り文字だということを明示してあげます。

```vb:sample1
With qt
    .TextFileCommaDelimiter = True '区切り文字はカンマ
    .TextFileParseType = xlDelimited '区切り文字で分割
    .Refresh 'インポートしたデータを吐き出す
End With
```

`TextFileCommaDelimiter`と`TextFileParseType`を指定します。

| 名前 | 説明 |
|:-:|:-:|
| TextFileCommaDelimiter | `,`（カンマ）区切りの場合、Trueを指定する。デフォルトはfalse。 |
| TextFileParseType | 区切り文字で分割されているファイルの場合、`xlDelimited`を指定する。<br>固定幅でデータが並んでいるファイルの場合、`xlFixedWidth`を指定します。（今回はCSVファイルなので前者） |

「sample1」のように、カンマ区切りで分割するという指定を行って実行してみます。
すると、以下のような結果になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935742/fad5562c-6bb4-168e-011c-fcc34bfda9d9.png)

きれいに表示されました。

#1はここまで。。
「世界一流エンジニアの思考法」に忘れたくないことが書かれ過ぎているのでメモ

## 前提
- Web制作学習中。2024年6月に始めたので、現在5ヶ月目くらい。
- 細かいエンジニアリングの知識はないので、正確性には欠けるかも。
- この本はプログラミングについて書かれていたが、Web制作や普段の仕事にも活きることがあると思い読了。

## いきなり手を動かさない
自分は結構せっかちなので、バグやレイアウト崩れがあるといろいろ試してしまう。
<br>
例えば......
- ```console.log("何たらかんたら")```をいろんなところに記述してみてどこがダメか確かめる
- `flex-direction`や`gap`など、CSSのプロパティを手当たり次第に足してみる。
    - これ、解決したら満足しちゃって最悪。後から見返したら打ち消し合いの地獄スタイリングになっていたりする。
<br>
二つとも、どう考えても良くない。でもやってしまう。
そして、その原因も2つな気がする。

1. せっかちで、「早く習得しなきゃ」「早く完成させなきゃ」と焦って形だけ作ってしまう。
1. 考えるだけのエネルギーが足りない。夜とか食後に頻発するのでわかってきたけど、手当たり次第のコーディングは意外とエネルギーを使わない。なのでそっちに逃げてしまう。
<br>

これは防ぎたいな〜と思いつつ、昨晩も割と脳みそ空っぽコーディングをしていた......
まずは意識を変える必要がありそうなので頑張ります。

## 頭がいい人でも理解には時間がかかる
個人的には、この書籍で一番大切にしたい考え。

これまでは、「他のエンジニアはこんなに仕事できるのに俺はなんてダメなんだ〜」と焦りまくっていた。

ただ、できるエンジニアでも時間をかけて頑張った結果理解に辿り着いているという事実を知って少し安心してしまった。
いや、安心というか、「膨大な時間を投下しないと優秀にはなれない」という諦めかもしれない。地に足が付いたとでも言えそう。

この本を読んで2週間経った今でも相変わらず焦ってはいるけど()、前よりは緩和されたと思う。引き続き、穏やかな気持ちでコツコツと学習に取り組んでいきたい。

## ADHDは考えがまとまらない。
これ、本題ではない。
本題ではないが、自分にとっては結構大事なインプットだった。

たまたま、明日は2度目の精神科に行ってADHDの検査結果を聞いてくる（この本に影響されて受診してみた）
<br>
というのも、自分もADHDの気があってなかなか思考がまとまらないことが常態化している......
<br>
まぁADHDであることはいいのだけど、思考がまとまらないのはだいぶ困る。
興味の移り変わりが激しいのと衝動的に動いてしまうので、あれこれと教材を試してみたり書籍を買ったりして情報量がどんどん増えてしまう。
しかも、ずっと何かしらの考え事をしていることも相まって脳のリソースがどんどん消費されていく。
<br>
これは薬か何かで治ったらいいなと思う。そうしたら学習とかやるべきことに集中できるだろうなぁ。
薬じゃなかったとしても、「やるべきことを絞ってきちんとフォーカスする」「些細なタスクにすぐ反応しないでまとめて処理する」といった意志の力でギリギリなんとかなる部分はなんとかしようと思う。
iterrows() と itertuples() の違い

#### iterrows()
- **戻り値**: 各行を (インデックス, Series) のタプルとして返す
- **速度**: 比較的遅い
- **使い方**: 各行を Series として操作したい場合に便利

#### 出力例
~~~
import pandas as pd

df = pd.DataFrame({
    'accession_id': ['A001', 'A002'],
    'type': ['RNASeq', 'ChIPSeq'],
    'experimental_fact': ['["fact1", " fact2 "]', '["fact3", " \'fact4\' "]']
})

for index, row in df.iterrows():
    print(index, row['accession_id'], row['type'], row['experimental_fact'])
~~~
出力:

~~~
0 A001 RNASeq ["fact1", " fact2 "]
1 A002 ChIPSeq ["fact3", " 'fact4' "]
~~~
#### itertuples()
- **戻り値**: 各行を namedtuple または普通のタプルとして返す（namedtuple がデフォルト）
- **速度**: 比較的速い
- **使い方**: 各行をタプルとして操作したい場合に便利

#### 出力例
~~~
for row in df.itertuples():
    print(row.Index, row.accession_id, row.type, row.experimental_fact)
~~~
出力:
~~~
0 A001 RNASeq ["fact1", " fact2 "]
1 A002 ChIPSeq ["fact3", " 'fact4' "]
~~~
#### 違いのまとめ
- **パフォーマンス**: itertuples() の方が iterrows() よりも速い
- **戻り値の形式**: iterrows() は (インデックス, Series) のタプルを返し、itertuples() はタプル（デフォルトでは namedtuple）を返す
- **使い勝手**: iterrows() は各行を Series として操作できるため、列名でアクセスしやすいが、itertuples() はタプルとして操作するため、より軽量

具体的な用途やパフォーマンス要件に応じて、どちらを使うか選ぶと良い。
工場勤務から180°違うフルリモートエンジニアになってみて現実を知ったお話

# 憧れていたエンジニアに
2024年10月から憧れていたエンジニアになりました。
前年12月からプログラミングスクールで半年勉強して掴み取った採用！これからの生活にワクワクを抱えてました。
## 理想と現実のギャップ
入社してすぐにフルリモートの洗礼を浴びました。
#### 1.テキストベースのコミュニケーションの難しさ
今までは対面で**会話**をして全てを伝えなくても察してくれる環境だったものがテキストベースになった途端、相手に何も伝わらない。
「何をしていて、何が聞きたのか全然わからない」と返信が来る始末。
憧れを持っていたリモート業務の**理想と現実**を早速感じました。
#### 2.質問をする難しさ
エンジニアにはなったとはいえ素人同然、メンターや先輩方に質問することはいくらでもあります。
質問する時もある程度調べた上で自分の考えを持った上で簡潔に伝えないといけないのですが、意見がまとまらなかったり、すぐに質問してしまったりと質問をすることの難しさを痛感しました。
##### このように思っていた理想とかなり乖離した現実を入社してすぐに思い知らされました...
## 充実した毎日
ここまでネガティブなことを話してきましたが、今はかなり充実した毎日を送っています。
やりがいであったり、できることが少しづつ増えてきたりまだ入社して一ヶ月も経っていないですが成長を実感しています。
学生時代に魅了されたプログラミングを仕事として出来ていることにめちゃくちゃ感謝しています！
仕事に限らずやりたいことがあるならまずは**やってみる**ことが重要だと思います！
## 理想と現実のギャップを少しでも減らしたい人へ
最後に理想と現実のギャップを少しでも減らしたい人へ私なり身につけておいた方がいい力を伝えたいと思います。
#### 1.語彙力
言葉を知らないと苦しいです。
しっかり活字に触れて語彙力をつけると人に伝えるのが少し楽になります。
#### 2.言語化能力
人に伝える力はどの仕事でも必要ですがリモートワークはより求められます。
相手も仕事がありますからできるだけ時間を取らせないように端的且つわかりやすく伝えられるといいスタートが切れると思います。
#### 3.精神力
人はミスをする生き物です。時には厳しい言葉を言われることもあります。
テキストベースだと感情が読み取れないので自分の思い込みで心が苦しくなることもあると思います。
ここで粘れる精神力は絶対に必要となってきます。
**怒ってもらえるうちが華**とはよく言いますが本当にその通りなので、折れることなく次に活かせるように精神力つけてください！

これからは技術記事も投稿して行くので成長してるな〜みたいな感覚で見ていただけると嬉しいです！
【Ruby】Rubyにおける大小関係を理解する

# はじめに
こんにちは！アメリカの大学で語学を学びながら、独学でソフトウェアエンジニアを目指している者です。
今回は、Rubyにおける文字列の大小比較について解説していきます。
Rubyでは文字列を比較する際、五十音順や辞書順ではなく、文字コード順に基づいて評価されるのが特徴です。
この基準を理解すると、文字列や数値の比較や並べ替えを行う際の挙動がわかりやすくなります。さっそく、Rubyならではの大小比較のポイントを詳しく見ていきましょう！

# 比較の基本
Rubyで文字列同士を比較する際は、内部的に文字コード（`ASCII`や`UTF-8`など）に基づいて比較が行われます。
そのため、アルファベットや数字、記号の順序も文字コードの値に沿ったものとなります。
Rubyでの一般的な文字列の比較順序は以下の通りです

1. 特定の記号（例: 空白, `!`, `#` など）
2. 数字（例: `0 〜 9`）
3. 大文字のアルファベット（例: `A 〜 Z`）
4. 小文字のアルファベット（例: `a 〜 z`）

この順序で比較が行われるため、数字はアルファベットよりも小さいと評価されますが、一部の記号（`!`や`#`など）は数字よりもさらに小さいと評価されます。

では、具体的な例を使って見てみましょう。

```ruby
p "0" < "A"      # => true（数字 "0" はアルファベット "A" より小さい）
p "A" < "a"      # => true（大文字 "A" は小文字 "a" より小さい）
p "!" < "0"      # => true（記号 "!" は数字 "0" より小さい）
p "#" < "0"      # => true（記号 "#" も数字 "0" より小さい）
p " " < "!"      # => true（空白はほとんどの記号よりも小さい）
```

# 日本語文字列の比較基準
Rubyで日本語の文字列を比較する場合も、英数字と同様に文字コードに基づいて評価されます。
ただし、日本語文字の文字コードはアルファベットや数字よりも大きいため、通常は「英数字 < 日本語」という順序になります。
また、一般的には以下の順序で評価されます：

1. ひらがな
2. カタカナ
3. 漢字(ひらがなより小さい漢字もある)

実際のコードで確認してみましょう。

```ruby
p "あ" < "ア"    # => true（ひらがな "あ" はカタカナ "ア" より小さい）
p "ア" < "亜"    # => true（カタカナ "ア" は漢字 "亜" より小さい）
p "A" < "あ"      # => true（アルファベット "A" は日本語の "あ" より小さい）
p "0" < "あ"      # => true（数字 "0" は日本語の "あ" より小さい）
```
このように、日本語では通常、ひらがな < カタカナ < 漢字の順で評価され、アルファベットや数字と比較した場合は、英数字が日本語文字よりも小さいと評価されます。
しかし、特定の規則で日本語の比較順を決めることは難しく、比較の挙動については「UTF-8のバイト順序に基づく」ということを理解するのがいいと思います。

https://www.seiai.ed.jp/sys/text/java/utf8table.html

# まとめ
Rubyでの文字列の大小比較では、文字コード順に基づく評価が行われるため、以下のような順序で比較が行われます

1. 特定の記号（空白, `!`, `#` など）
2. 数字
3. 大文字のアルファベット
4. 小文字のアルファベット
5. ひらがな
6. カタカナ
7. 漢字(ひらがなよりも小さい漢字もある)


この順序を理解することで、より正確に文字列の比較やソートを行えるようになります。
上記でも伝えましたが、日本語での比較順を決める場合に漢字がひらがなよりも小さいことがあるので、UTF-8のバイト順序に基づくと覚えておきましょう。
このようにRubyでの文字列比較を使って、ソートや条件分岐を行う際の参考にしてみてください！
Orbstack(Macbook)を使った仮想Ubuntu+Docker環境の作成

# Orbstack(Macbook)を使った仮想Ubuntu+Docker環境の作成

この記事では、Orbstackを使ってMacBook上に仮想環境のUbuntuを構築する手順を紹介します。Orbstackは、Dockerをベースにした仮想化ツールで、軽量かつ高速な仮想環境を提供します。MacBook上でUbuntu環境を手軽にセットアップしたいときにおすすめです。仮想環境にすることで、問題が発生した際に簡単に削除して再構築できます。

---

## 1. Orbstackの導入

まずは、Orbstackをインストールします。Homebrewを使うことで、簡単にOrbstackをインストールできます。

### コマンド
```bash
brew install orbstack
```

> **補足**: Homebrewがインストールされていない場合は、先にHomebrewをインストールしてください。

---

## 2. 仮想Ubuntuの作成

次に、仮想のUbuntu環境を作成します。`orb create`コマンドを使って、指定した名前のUbuntuインスタンスを作成します。

### コマンド
```bash
orb create ubuntu ubuntu-virtual
```

> **補足**: `ubuntu-virtual` は仮想環境の名前です。任意の名前に変更可能です。

---

## 3. 作成した仮想Ubuntuの確認

作成した仮想Ubuntuが正常に作成されたかを確認するには、以下のコマンドを使用します。

### コマンド
```bash
orb list
```

---

## 4. 仮想Ubuntuのシェル起動

仮想Ubuntuのシェルを起動し、実際に環境にアクセスします。

### コマンド
```bash
orb shell -m ubuntu-virtual
```

> **補足**: `-m` オプションは指定した名前の仮想マシンに接続するためのものです。

---

## 5. Ubuntuのバージョン確認

仮想環境内でUbuntuのバージョンを確認します。

### コマンド
```bash
cat /etc/os-release
```

---

## 6. パスワードの設定

シェルのユーザーに対してパスワードを設定し、管理操作ができるようにします。

### コマンド
```bash
sudo passwd $USER
```

---

## 7. パッケージの更新

次に、Ubuntuのパッケージリストを更新し、アップグレードを行います。

### コマンド
```bash
sudo apt update -y
sudo apt upgrade -y
```

---

## 8. Dockerのインストール

仮想Ubuntu上でDockerをインストールします。以下のコマンドでDockerをダウンロードし、インストールを実行します。

### コマンド
```bash
curl https://get.docker.com | sh \
  && sudo systemctl --now enable docker
```

---

## 9. パッケージの再更新とDockerの再起動

Dockerのインストール後にパッケージを再度更新し、Dockerサービスを再起動します。

### コマンド
```bash
sudo apt-get update
sudo systemctl restart docker
```

---

## 10. Dockerの設定

現在のユーザーをDockerグループに追加することで、Dockerコマンドを管理者権限なしで実行できるようにします。

### コマンド
```bash
sudo usermod -aG docker $USER
```

---

## 11. 仮想環境から抜ける

`exit` コマンドで仮想環境からログアウトします。

### コマンド
```bash
exit
```

---

## 12. 仮想Ubuntuの停止と再起動

仮想Ubuntuを停止・再起動することで、設定が適用されているか確認します。

### コマンド
```bash
orb stop ubuntu-virtual
orb start ubuntu-virtual
```

---

## 13. Dockerの確認

再度仮想Ubuntuに接続し、Dockerが正常に動作しているかを確認します。

### コマンド
```bash
orb shell -m ubuntu-virtual
docker ps -a
```

> **補足**: `docker ps -a` コマンドで、現在動作中のコンテナが表示されれば、Dockerのインストールが正常に完了しています。

---

## まとめ

これで、Orbstackを使った仮想Ubuntu環境の構築とDockerのセットアップが完了しました。MacBook上で手軽にUbuntuを使った開発環境を整えたい場合に便利な手順です。OrbstackとDockerを活用し、開発効率を高めましょう。

VSCodeを使用する場合には、拡張機能Remote Developmentを使うと便利です。
拡張機能の導入後、ウィンドウの左下に表示される緑色のアイコン[><]をクリックし、"ホストに接続する"をクリックし、orbを選択すると接続されます。
また，orbに接続している状態で[><]をクリックし、"Attach to Running Container..."をクリックすると起動しているコンテナに接続できます。
[備忘録] FFmpeg

# 使用環境

- MacBook Pro 14-inch, Nov 2023
    - Chip: Apple M3 Pro
    - Memory: 18GB
    - macOS: Sequoia 15.1
- FFmpeg: 7.1

# 備忘録

## 使用可能なコーデックを一覧取得 (-codecs)

```shell
ffmpeg -codecs
```

全権取得から検索するときは`grep`と併用？

```shell
ffmpeg -codecs | grep libx
```

## よく使うコーデックの変換速度とデータサイズ

前提: 3分52秒の動画を使用．

### H264

| コーデック | 変換速度 | データサイズ |
| --- | --- | --- |
| libx264 | 2.3x | 677MB |
| h264_videotoolbox | 8.86x | 312MB |

## 変換周り

### 品質指定 (-crf)

```shell
ffmppeg -i input.m2ts -c:v libx264 -c:a aac -crf 18 output.mp4
```

画質を指定するConstant Rate Factorの略．
引数に指定できる値は`0~51`で，数字が小さいほど画質は良いがファイルサイズが大きくなる．
雰囲気`18`で十分画質？

### エンコード範囲指定 (-ss, -t)

```shell
ffmppeg -ss 01:23:45 -i input.m2ts -t 00:05:00 -c:v libx264 -c:a aac -crf 18 output.mp4
```

`-ss`: エンコード開始位置．
`-t`: エンコード開始位置からの処理対象時間．

上記の例だと，input.m2tsの1時間23分45秒から5分間を変換して出力してくれる．

### ビデオフィルタ (-vf)

```shell
ffmpeg -i input.m2ts -vf "yadif" -c:v libx264 -c:a aac output.mp4
```

変換後のファイルを再生して，線が入っているように見える場合はインターレース解除が必要な可能性あり．
その場合は，デインターレースフィルターを追加する．

`yadif`: Yet Another Deinterlacing Filter
【超基礎】TypeScript特殊な型まとめ

## 前提
この記事は、初学者の私が、サバイバルTypeScriptで学んだこと+調べたことをまとめたものになります。

従って、経験則に基づいた発言ではないため、一部慣習とは違っていたり、認知にずれがあったりする可能性がありますので、ぜひコメントで指摘していただけると幸いです。

https://typescriptbook.jp/

---
## 特殊な型
### any
- 型の制限なく、何でも代入できる。
- 安全性は低い
- TypeScriptの利点を放棄したようなものであり、基本的には使わない方がいい。
- 関数の引数の型注釈を省略した場合など、型推論ができない場合はany型として扱われる。
::: note
完全な悪というわけではなく、ケースバイケースで使い分けるべきである。
:::
``` JavaScript:any
let n : any =  5;

n = "five"; //文字列　=> OK
n = { number: "five"} //オブジェクト => OK
```
### unknown
- より安全性の高いany型
- 型が不明であることを明示的にすることで、型による予期せぬエラーを防ぐ。
- 型ガード以降は絞り込まれた型として使える

||any  | unknown |
|:-:|:-:|:-:|
|あらゆる型の値の代入|〇   |〇   |
|別の型の変数への代入 |〇  |×   |
| プロパティやメソッドへのアクセス |〇| ×  |
``` TypeScript:unknown
let a : unknown = "five";

a = 5; //数値の代入　=> OK
const num : number = a; //number型への代入 => NG

a = {name : "taro"}; //オブジェクトの代入　=> OK
console.log(a.name) //プロパティへのアクセス => NG
```

### void
- 普通、関数戻り値の型注釈にのみ使い、戻り値がないことを示す。
- c++やcの`void main()`のような扱い
- 関数の`return`は不要になる(undefined型ではエラー)
- `void <- undefined`の代入はできるが,`undefined <- void`の代入はできない。
```Typescript: void
function func: void{...}
```

### never
- 決して値を持たないことを示す型
- never型を除くあらゆる型を代入できない
- 理論上どんな型**にも**割り当てられるが、値を持たないため、値の代入はできない。
- nullが「明らかに中身のない箱」ならneverは「明らかに入口がない箱」
- 戻り値がvoidの関数は終了することを前提としているが、nevernの関数は終了しない。(例外のスローや無限ループなど)
- 値を代入するとエラーを吐く特性から網羅性チェックに使われる。
``` TypeScript:never
const nev: never = 1 //Error

//終了しない関数の戻り値
function neverEnd(): never{
    while(true){...}
}
```
---

### 列挙型
- 定数の集合を定義する
- 選択肢を限定するために使われる
- 値を文字列や数値で指定できる
- 指定しない場合自動インクリメントで数値が割り振られる。
- 逆引きが可能
- ドット演算子でアクセス
- オブジェクトと比較すると柔軟性に欠ける分、安全性は高い
```typescript:enum
enum Move{
    Up = "Up",
    Down = "Down",
    Left = "Left",
    Right = "Right"
}

const playerMoving: Move = Move.Up;// 文字列として扱うことができるMove型の変数

console.log(playerMoving);//=> "Up"
```
---
### ユニオン型
- 複数の型のうちいずれかを取る型
- `|`で繋ぐ。
- 柔軟性と安全性の両立が可能
``` TypeScript:ユニオン型
let numStr: number|string;
let numStrArr: (number|string)[]//配列の宣言

numStr = 5; //数値を扱う
numStr = "Hello"; //文字列を扱う
```
### インターセクション型
- 複数の型の特徴をすべて持つ新しい型を作る
- `&`で繋ぐ
- オブジェクト型の結合によく使われる
- プリミティブ型の結合は不可能
::: note warn
ユニオン型と対をなしている様だが、本質的な部分やユースケースは別のところにある。
:::
``` Typescript: インターセクション型
type Name = { name: string}; 
type Age = { age: number};

type Profile = Name & Age; //Name型とAge型、両方の特徴を持つProfile型の作成

const taro: Profile ={name: "太郎", age: 16};
```

## まとめ
「型」にスポットを当てた言語なだけあって、型の解釈や扱いの種類が豊富だなと感じました。ここまでくると座学というよりかは実装を通して学んでいった方が効率が良い気もしますね。

当方初学者なため、認知のずれや、モダンな開発現場ではもう使わない表現などがありましたらコメントで指摘していただけると幸いです。😸