OmniAICreator/Qiita-1.07M huggingface dataset:
Stirlingで構造体編集 その5

# 概要
バイナリエディタStirlingで構造体編集、やってみた。
練習問題、やってみた。

# 練習問題
exeファイルの構造体を書け。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/f95d7e5e-bbec-f706-8e32-45c6bbea98be.png)

# exe構造体

```
struct PE_IMAGE_DOS_HEADER {
	WORD	e_magic;
	WORD	e_cblp;
	WORD	e_cp;
	WORD	e_crlc;
	WORD	e_cparhdr;
	WORD	e_minalloc;
	WORD	e_maxalloc;
	WORD	e_ss;
	WORD	e_sp;
	WORD	e_csum;
	WORD	e_ip;
	WORD	e_cs;
	WORD	e_lfarlc;
	WORD	e_ovno;
	WORD	e_res0;
	WORD	e_res1;
	WORD	e_res2;
	WORD	e_res3;
	WORD	e_oemid;
	WORD	e_oeminfo;
	WORD	e_res20;
	WORD	e_res21;
	WORD	e_res22;
	WORD	e_res23;
	WORD	e_res24;
	WORD	e_res25;
	WORD	e_res26;
	WORD	e_res27;
	WORD	e_res28;
	WORD	e_res29;
	LONG	e_lfanew;
};

```

以上
X-Forwarded-Forヘッダには滅んでほしい

X-Forwarded-Forヘッダ、略してXFFってありますよね。リバースプロキシなどWebアクセスを中継するサーバーが、本当のアクセス元IPをバックエンドのWebサーバーへ渡すためのHTTPリクエストヘッダです。

その仕組みと「正しい」運用の仕方については以前職場のテックブログにまとめたものがありますので、興味のある方は読んでみてくださいませ。
[こんばんは、X-Forwarded-For警察です - エムスリーテックブログ](https://www.m3tech.blog/entry/x-forwarded-for)

問題は、どの記述を信用していいのか
-----
上でリンクした記事にも書いたとおりですが、XFFを解釈するときの問題はどのサーバーが付けてきたXFF記述を信用するかです。誰が書いたものでも信用してしまうと容易にアクセス元偽装ができてしまうから。

それで、上の記事にもある通り「信用できるサーバーのIPアドレスはこれとこれ」みたいに、解釈する側で信用できる人たちリストを保守していくことが必要になっています。

あれ、信用を担保するには署名って道具があったのでは？
----
でも、IPアドレス単位でサーバーの信用を判断するというのは、いろいろとおかしいです。
まず、運用上大変。サーバーのIPアドレスが変わってしまうことはいろいろな理由でありえて、そのたびにXFF信用リスト持ってるすべてWebサーバーで信用リストを漏れなく間違いなく更新するのはたぶん回りません。漏れれば、あっという間にセキュリティホールです。
そして、堅さ。同じサーバー内にもいろんなプロセスが走ってます。当然、悪意あるプロセスが立ち上がってしまったときのことを考えないといけません。IPアドレス単位ですべてのプロセスを信用してしまうというのは、普通にセキュリティの穴ってことです。

そして、記述の信用を担保する道具はもっと一般的なものがありましたよね。電子署名です。
つまり、XFFではなくて、こんなヘッダが定義されていれば運用も簡単、セキュリティも堅牢だったはずなのです。
```conf
X-Real-Ip-Signed: 10.1.1.1; signature=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```
リバースプロキシ（プロセス）やLB（プロセス）はもってる秘密鍵で署名を付けて、リクエストを受け取るWebサーバ側が公開鍵を持って署名を検証するという枠組み。多段プロキシだと、X-Real-Ip-Signedが付いていてそれが署名OKなら何も付け加えません（署名NGなら自分でX-Real-Ip-Signedを上書き）。
[AWS]Windows Server2022のEC2にFleetManagerで接続した際にPowershellへの入力ができない際の対応

## 問題
Windows_Server-2022-English-Full-Baseを使用して起動したインスタンスでPowershellを起動しても入力が出来ない。（ペーストやEnterは可能。）
2023/11/2現在、最新のWindows_Server-2022-English-Full-Base-2023.10.11でも発生。

## 原因
当該AMIで使用されているPSReadline2.0.0が原因。
PSReadLine v2.2.0-beta4 Releaseで解消されているとのこと。
参考：[PSReadline 2.1.0 doesn't work in the windows virtual desktop web interface · Issue #2725 · PowerShell/PSReadLine · GitHub](https://github.com/PowerShell/PSReadLine/issues/2725)

## 対策
PSReadLineのバージョンアップを行う

コマンド
入力はできないがペーストはできるので、以下をコピーしてペーストする。
もしくはセッションマネージャーから入力を行う。
```powershell
Install-Module -Name PSReadLine -Repository PSGallery -MinimumVersion 2.3.3 -Force
```

```powershell
PS C:\Users\Administrator> Get-Module                                                                                   
ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Manifest   3.1.0.0    Microsoft.PowerShell.Management     {Add-Computer, Add-Content, Checkpoint-Computer, Clear-Con...
Script     2.0.0      PSReadline                          {Get-PSReadLineKeyHandler, Get-PSReadLineOption, Remove-PS...


PS C:\Users\Administrator> Install-Module -Name PSReadLine -Repository PSGallery -MinimumVersion 2.3.3 -Force

NuGet provider is required to continue
PowerShellGet requires NuGet provider version '2.8.5.201' or newer to interact with NuGet-based repositories. The NuGet
 provider must be available in 'C:\Program Files\PackageManagement\ProviderAssemblies' or
'C:\Users\Administrator\AppData\Local\PackageManagement\ProviderAssemblies'. You can also install the NuGet provider by
 running 'Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force'. Do you want PowerShellGet to install
and import the NuGet provider now?
[Y] Yes  [N] No  [S] Suspend  [?] Help (default is "Y"): Y
PS C:\Users\Administrator>


PS C:\Users\Administrator> exit
```
Powershellを一度終了して再度起動することで入力が可能となる。

```powershell
PS C:\Users\Administrator> Get-Module

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Script     2.3.4      PSReadline                          {Get-PSReadLineKeyHandler, Get-PSReadLineOption, Remove-PS...    
```
【oh-my-zsh】ターミナルでpushしてないコミット数が表示されない問題

環境
```
oh-my-zsh
powerlevel10k
```

# 目標
下記画像のようなリモートリポジトリにpushしていないコミット数が表示されない問題を解決  

![Screenshot 2023-11-02 at 9.39.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599663/e6e2b583-1c2e-a941-343a-c419e4050714.png)

# 解決
`.git/config`に`[branch "main"]`の項目が必要でした。  

```
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
	ignorecase = true
	precomposeunicode = true
[remote "origin"]
	url = 
	fetch = +refs/heads/*:refs/remotes/origin/*
[branch "main"]
	remote = origin
	merge = refs/heads/main
```
AI-102試験対策のまとめ「QnA Maker」

## はじめに
Azure AI Engineer Associate(AI-102)取得に向けた勉強でまとめた内容を本記事では投稿しています。
試験範囲の内容を私が勉強していく中で、
・忘れてしまっていた内容
・他の知識と絡めて理解した方が良い内容
・Microsoft Learnの読解に苦戦した内容
などをできるだけ分かりやすく簡潔にまとめることを意識しています。
Azureの勉強を一から始め、AI-102取得を目指している方の参考になれば幸いです。
※本記事の内容が必ず試験に出るわけではないこと、ご注意ください
※勉強しながら投稿しているため、追加で学んだことがあれば随時投稿内容を更新します。

## 試験対策のまとめ
## QnA Maker
※2025年3月31日に廃止予定(新しいリソースは2022年10月1移行作成不可)  
    ⇒後継：Azure AI Languageの質問応答機能

* データに自然な会話レイヤーを作成できる自然言語処理(NLP)サービス
* 任意の入力に対してカスタムナレッジベースの情報から最も適切な回答を見つける目的で使用  
    ⇒ナレッジベースは質問と回答がペアになっている
* 使用例
    - ソーシャルメディアアプリケーション
    - チャットボット
    - 音声対応デスクトップアプリケーション
* リソース作成時に下記のリソースも自動的に作成
    - Azure Cognitive Search
    - Azure App Service
    - Application Insights(オプション)

<br>

* 参考
    - https://learn.microsoft.com/ja-jp/azure/ai-services/qnamaker/overview/overview
    - https://learn.microsoft.com/ja-jp/azure/ai-services/qnamaker/how-to/set-up-qnamaker-service-azure?tabs=v1

## 次の試験対策のまとめ
* **AI-102試験対策のまとめ「Azure Container Registry(ACR)」**

https://qiita.com/fsd-jume/items/590b42fbc6089631562a

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/65aba5d5514e023fd66d
AndroidのJUnitテストは超ムズい（7）

# Robolectric-4.11.xがリリースされた
以前に、compileSdk = 34だと、Robolectricが対応していなくて、localテストが動かないという記事を書きました。

https://qiita.com/cozyk100/items/0b3e9a91ca5404f382c6

昔からそうなんですが、googleはこのcompileSDKのAPIレベルのハードルをどんどん上げてきます。開発者をできるだけ最新のAPIレベルに誘導しようとします。

Robolectricに限らず他の依存ライブラリも、AndroidSdudioの推奨する通りバージョンを上げていくと、gradle同期の時にcompileSdk = 34を要求されます。

Robolectricも先月、10/29にやっと、4.11がリリースされ、compileSdk = 34に対応しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933408/b24e09da-a518-b463-dcb6-4313ec15ad65.png)

これで、このエラーは出なくなります。
```
Package targetSdkVersion=34 > maxSdkVersion=33
	at org.robolectric.RobolectricTestRunner.getChildren(RobolectricTestRunner.java:259)
 ```
指定ライブラリーに対応可能なpythonのバージョンを調べるスクリプト

# 目的
python処理系をバージョンアップしようかと思った時、使ってる又は使いたいライブラリーが対応できているかが気になる。
その確認のためのスクリプトを作成した。

# 対象
pypiで、そのライブラリーのjsonデータの"Classifiers" セクションで対応バージョンが記述されているライブラリーのみが以下のスクリプトで調べることができる。

# コード
```python
import json
import requests
import re

def get_latest_python_version(package_name):
    url = f"https://pypi.org/pypi/{package_name}/json"
    response = requests.get(url)
    if response.status_code == 200:
        data = response.json()
        classifiers = data.get('info', {}).get('classifiers', [])
        version = set()
        for classifier in classifiers:
            m = re.search(r"Programming Language :: Python ::\s*(\d\S*)$" , classifier)
            if m is not None:
                v = m.group(1)
                # version |= {v}
                version.add(v)
        if version:
            return version
    raise ValueError(f"Could not find classifiers data for {package_name}")

def applicable_python_version(pkg_names):
    V = []
    for pkg in pkg_names:
        V.append(get_latest_python_version(pkg))
    S = V[0]
    S.intersection_update(*V[1:])
    return S
```
# 使用例
```python
applicable_python_version(["numpy","scipy","pandas", "xlwings"])
# --> {'3', '3.10', '3.11', '3.9'}
```
リモートリポジトリ(GitHub)へのPush方法

# リモートリポジトリ(GitHub)へのPush方法

前回紹介した基本的なコマンドにより、自らのプロジェクトにローカルリポジトリを作成し、作業内容をcommitできるようになりました。

今回は、**GitHub**にて**リモートリポジトリ**を作成し、
<front red>**ローカルリポジトリでのプロジェクト内容をアップロード、Pushする方法**</front>を紹介します！

プロジェクトをアップロードしたい場合、次の3つのステップで順に実行します！

# 1. GutHubにて新しいリモートリポジトリを作成
最初に、GitHubの画面で右上のユーザーアイコンをクリックし、"Your repositories"を選択します。
(注意：アカウント登録をしていない場合は登録しましょう。)
そして、画面右上の "New" ボタンをクリックして新しいリポジトリを作成します。
新しいリポジトリの名前、説明、公開設定などを入力し、リポジトリを作成します。
作成が完了すると、以下のようなリポジトリのURLが表示されますので、それをコピーしておきましょう。
```bash
https://github.com/<user名>/<リポジトリ名>.git
```

# 2. リモートリポジトリ(GitHub)を新規追加
先ほどコピーしたURLを用い、ローカルリポジトリにリモートリポジトリを登録します！

以下のコマンドにより、"origin"というショートカット名でリモートリポジトリを登録します。
```bash
git remote add origin https://github.com/<user名>/<リポジトリ名>.git
```
これにより、今後"origin"を用い、ローカルリポジトリからリモートリポジトリに情報をpushしたり、pullできるようになります。

# 3. リモートリポジトリ(GitHub)へ送信する 
最後に、以下のコマンドにてローカルの変更をリモートリポジトリにPushします。
```bash
git push <リモート名><ブランチ名>
git push origin main
```
・**ブランチ**：プロジェクト内で異なる作業用のコピーを作成する仕組み。新機能の開発やバグ修正など、複数のタスクを同時に進行でき、それぞれの変更を分離して管理できます。

このコマンドは、ローカルリポジトリとリモートリポジトリでのブランチ名が一致していない場合はエラーが発生します。
もしエラーが出てしまった場合、以下のコマンドにて、現在のブランチ状況を確認してください。
```bash
git branch
```
現在のブランチ名が"master"などに設定されている場合、以下のコマンドによってメインブランチ名を"master"から"main"へと変更した後、改めてpushしてください。
```bash
// 現在位置するブランチ名を変更する
git branch -m main
```

# おまけ. Pushコマンドの省略方法
以下のコマンドを使用することで、次回からPushするときに、"origin main"を省略できるようになります。

```bash
git push -u <リモート名><ブランチ名>
git push -u origin main
```

まとめ
---

今回はGitHubにリモートリポジトリを作成し、ローカルリポジトリからプロジェクトをアップロードする方法を紹介しました！

**次回はブランチ関連のコマンドを紹介していきます！**
.Net8  BlazorでMudBlazorを動かすために

[.Net8で動作しました(2023年11月17日)](https://qiita.com/k-yamamoto/items/0cc7e8ea09cae4dc1a87)
# .Net8 BlazorでMudBlazorが動作しない
[公式手順](https://mudblazor.com/getting-started/installation#manual-install-add-components)でインストールしたが、現バージョン(6.11.0)は動作しませんでした

:::note alert
この対処法はSSRのみに対応しているようです
WASMは調査中です
:::

DotnetSDKのバージョンは8.0.100-rc.2.23502.2です
# 対応方法
Routes.razorに
```
@attribute [RenderModeInteractiveServer(prerender: true)]
```
を入れたところ現在動作することがわかりました。

まずは速報でした
AWS RDSとAuroraの違いについてまとめてみた

# はじめに
業務でオンプレ上のPostgreSQLをAWSに移行することになりました。
マネージドする方向で動いていますが、RDSとAuroraの違いを正確に理解できていなかったため、整理してみました。


|  | RDS | Aurora |
|:-|:-:|:-:|
| データベースエンジン  | MySQL<br>PostgreSQL<br>MariaDB<br>Oracle<br>Microsoft SQL Server  | MySQL<br>PostgreSQL  |
| デプロイオプション  | (1)単一AZデプロイメント<br>(2)マルチAZデプロイメント<br>(3)リードレプリカデプロイメント<br>(4)マルチリージョンデプロイメント  | (1)単一マスターデプロイメント<br>(2)マルチマスターデプロイメント<br>(3)グローバルデータベースデプロイメント  |
| レプリケーション  | マスタースレーブのレプリケーションを使用してデータの冗長性と耐久性を確保します。マスターデータベースとリードレプリカの間でデータが同期されます  | データの冗長性と可用性を高めるために、マルチAZ構成と分散ストレージが組み合わせて使用されます。データは6つのコピーに分散され、自動フェイルオーバーや耐久性の向上が実現されます。（６つの中で4個は同期、残り２つは非同期）  |
| バックアップ/リカバリ  | スナップショットや自動バックアップなどの機能を使用してデータのバックアップとリカバリを行います。  | 連続的バックアップと短期間のリカバリポイント（最大5分間隔）をサポートしています。バックアップはストレージレイヤーで行われるため、データのバックアップおよびリストアの速度が高速です。  |
|   |   |   |
|   |   |   |

# 補足

- RDSはマルチAZはサポートしているが、直接的なマルチリージョンはサポートしていない。
- マルチリージョンにするためには、リードレプリカを別リージョンに配置して、障害時に自動/手動で昇格させる必要がある
- 自動化のプロセスにはcloud watch eventとlambdaが必要
- マルチAZ：高可用性を高める。同期レプリケーション
- リードレプリカ：拡張性を高める(処理を早くする)。非同期レプリケーション
- RDS自動フェイルオーバー：自動
- RDSリードレプリカの昇格：手動(一時的な障害対応)

# 参考
https://atmarksol.jp/tech/aws-rds-vs-aurora/
https://chariosan.com/2019/09/01/rds_aurora_comparison/
https://dev.classmethod.jp/articles/cm-advent-calendar-2015-aws-re-entering-rds/
https://dev.classmethod.jp/articles/cm-advent-calendar-2015-aws-re-entering-rds/
https://qiita.com/tireidev/items/85954500a2c667f0e898
https://note.com/ym202110/n/n8f465cfb11cb
プロセス間同期をファイルの更新時刻でとる話（悪いお手本と改善案）

# この記事の概要

Windowsバッチ（コマンドプロンプト）を使用して、他プロセスとの同期をとるのに、ファイルのタイムスタンプ監視で対応していたが、意図通りに動かない可能性があるようだ。
しかし対策されないまま放置されていた。

何がいけないのか、どうすればいいのか、という話。

# 前提

1分間隔でフォルダ内ファイルを監視し、配置されたファイルを処理するプロセスAがいる。

処理とは、管理情報を取得した上で、別フォルダにコピー、元ファイルは削除するというもの。

出力先には、既にファイルがあるかもしれないし、無いかもしれない。（初期稼働とか故意にファイルをどけたとか）

但し出力先ファイルの更新日時は確実に更新される。

呼出元（本記事のターゲット）のWindowsバッチから、このプロセスAに対して処理を渡し、完了したことを *確実に* 保証した上で後続処理を実行させたい。

---

この実装のために、こんなコードを書いた。

```sample-sometime-failed.cmd

copy %WORK_FILE% %TARGET_SRC_DIR%\%TARGET_SRC_FILE%

cscript.exe waitWorkComplete.vbs %TARGET_DST_DIR%\%TARGET_DST_FILE%

copy %TARGET_DST_DIR%\%TARGET_DST_FILE% %MORE_WORK_FILE%

cscript.exe moreWork.vbs %MORE_WORK_FILE%

```

`waitWorkComplete.vbs` では、 `%TARGET_DST_FILE%` の更新時刻を、 *自身の起動時刻* を基準に監視、現在以降であれば処理完了したものとみなす。

単純に起動時刻で比較するのがNGなのはすぐに分かる。そりゃcscript起動して判定コードに到達するのに1秒や2秒かかることはよくあるだろう。

保険として、5秒もマージンとればいいか。。

このプログラム、月に数十回も起動されることないので、これで6年もちました。

6年目に発生し、5秒でもだめなことあるんか、そりゃ実行機の負荷状況によってはありえないとはいえないな。

とりあえずマージンを10秒に広げてみよう。

でもちょっと待て、これ何秒に広げても、ありうるんじゃないの？？

さらに保険を加えて、10分待ってもダメだったら打ち切りにしてオーケーにしちゃおう。（後述）

よくわかんないぞ、今まで記録を取れてなかったのがいけない。ちゃんと調べて記録も取るようにしよう。

監視プログラムをvbsで書いたのがいかんのか？Cで書いた小さなプログラムならなんとかなる？

いや、程度の差こそあれ、ゼロにできない以上一緒でしょう。。


# 結局、どうすりゃよかったの？？

落ち着け。

すいません、聡明な一部の読者な方ならすぐ気づいたのでしょうけれども、若輩者な自分はこれ気づくのに6年かかりました。。

（というか、現状を他人に説明する手段がないのでこの記事を書こうとしたときに、脳内が整理された模様）


# 正解

時刻を基準に判定するなら、確実に信用できる時刻を基準にしなくちゃならない。
でもって、**無いなら意図的につくる。**

上記の例なら、たとえばこうする。


```sample-correct.cmd

echo pre-check > %TIMING_FILE%

rem ** 必要に応じてここにsleep入れる（後述） **

copy %WORK_FILE% %TARGET_SRC_DIR%\%TARGET_SRC_FILE%

cscript.exe waitWorkCompleteWith.vbs %TIMING_FILE% %TARGET_DST_DIR%\%TARGET_DST_FILE%

copy %TARGET_DST_DIR%\%TARGET_DST_FILE% %MORE_WORK_FILE%

cscript.exe moreWork.vbs %MORE_WORK_FILE%

```

`waitWorkCompleteWith.vbs` では、（自分の起動日時ではなく）「第1引数ファイルの更新日時」と「第2引数ファイルの更新日時」を比較する。

第1引数ファイルは *確実に* 第2引数ファイルよりも前の日時になるので、第2引数ファイルが更新されているなら完了と見なせる。

第2引数ファイルがいつまでも更新されないなら、永久に刺さってしまうが、それはプロセスAに異常事態が生じて、予定されている処理が完了していないということなのだから、絶対に後続は処理してはいけない。（！）

元の実装ではタイムアウト処理を入れてしまっているが、もし発生してしまったら運用で気づけるのか、正直疑問。。。
（プロセスA側にはエラー時にメール通知する仕組みはある、いちおう）


# その他

上記例ではファイルシステム上の日時に依存しているので、時刻の精度はファイルシステムおよびプログラム実装の双方で確認が必要。

たとえば万一(※)、FATファイルシステムを使っているのであれば、精度の下限2秒、つまり2秒未満の差異は検出できない。

※今時まずありえないでしょうが。。考えるの大事。


# まとめ

一度思い込んでしまうと、いかに抜け出せないかというお話でした。
（そっちかい）
Uninstall Salesforce CLI or Plugins



+ [Uninstall Salesforce CLI or Plugins](https://developer.salesforce.com/docs/atlas.en-us.sfdx_setup.meta/sfdx_setup/sfdx_setup_uninstall.htm)
+ [Unable to update or uninstall sfdx cli](https://salesforce.stackexchange.com/questions/347973/unable-to-update-or-uninstall-sfdx-cli)


+ [Unable to update sf version](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Ou5Wn)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7590fd53-904d-adb7-6ab6-677c001fa02b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/1140670c-b846-46cd-fbc8-594a58766119.png)

# input must be a single directory

+ [input must be a single directory #41](https://github.com/jakesgordon/sprite-factory/issues/41)

このエラー メッセージは非常に誤解を招くものだと思います。たとえば、ディレクトリが見つからない場合にも同じことが起こります

+ [Move from sfdx (v7) to sf (v2)](https://developer.salesforce.com/docs/atlas.en-us.sfdx_setup.meta/sfdx_setup/sfdx_setup_move_to_sf_v2.htm)
AWSのアカウントを作ったらまずやること

[Amazon Web Services](https://aws.amazon.com/)のアカウントを作成したら、真っ先にやることは、以下の記事に書く通りである。

# ルートアカウントのMFAによる保護

ルートアカウントは、あらゆる操作が可能で、乗っ取られた場合にあらゆるリソースの追加・削除を許すことになる。このため、MFAによる保護は必須である。

# IAM経由での請求コンソールへのアクセス有効化

これを事前に行っておかないと、IAM経由での請求コンソールへのアクセスができない。このため、有効化することにより、以後、わざわざルートアカウントでのアクセスが必要なくなるようにする。

# MFAでの保護を行う管理ポリシーの追加

MFAでの管理保護を行う、IAMポリシーを定義する。[このページ](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_examples_iam_mfa-selfmanage.html)に書いてあるポリシーを定義するとよいとされるが、このポリシー通りに定義してしまうと、初回サインイン時に自らのパスワード変更もできなくなってしまうので、Deny節のNotActionに`iam:ChangePassword`と`iam:GetAccountPasswordPolicy`の2つを追加してあげると、初回サインイン時のパスワード変更が問題なく通るようになる。

# 管理者権限のIAMグループの作成

管理者権限を持ったIAMグループの作成は必須である。これは後述するIAMユーザーの作成時に、このグループを紐づけるためである。このグループのポリシーには、管理ポリシーであるAdministratorAccessと、先ほど作成した管理ポリシーを割り当てる。

なお、AdministratorAccessは全権限許可で、先ほどのポリシーは、一部アクションを除きMFAなしでの全権限拒否である。これで大丈夫なのか？と思うかもしれないが、明示的な全権限拒否が優先されるので問題ない。

# 管理者権限のIAMユーザの作成

管理者権限を持ったIAMユーザを作成する。なぜIdentity Centerを用いないのかであるが、これは、ひとまずIAMユーザを作成した後に、そこ経由で設定すれば足りるためである。

IAMユーザを作成する際、先ほど作成したIAMグループを紐づける。パスワードは自動生成で、後から変更を強制する、というデフォルトのオプションで問題ない。サインインURL、ユーザ名とパスワードは必ず控えておくこと。

ここまでやったら、ルートユーザからログアウトする。以後、ルートユーザでのログインは、以下の場合以外は行わないこと。ルートユーザでなければできないことの詳細は[こちら](https://docs.aws.amazon.com/IAM/latest/UserGuide/root-user-tasks.html)を参照せよ。

* アカウント名・メールアドレス・ルートユーザのパスワード設定
* 非推奨だが、ルートユーザのCLIのアクセスキー発行(および削除)
* 万一すべてのIAMユーザが管理不能となった場合の、権限の復活作業
* 一部の付加価値税の請求書の閲覧
* アカウントの解約・譲渡
* リザーブドインスタンスの販売者登録
* Amazon S3バケットのMFA削除の有効化(この場合のみ、ルートユーザのCLIのアクセスキー発行が正当化されるといっても過言ではない)
* Amazon SQSキューおよびAmazon S3バケットに関して、リソースポリシーで誤って全拒否に設定してしまった際の、誤ったポリシーの削除・修正
* AWS GovCloudへのサインアップ、およびルートユーザのアクセスキー請求(米国人・米国法人に限るため、日本人には関係がない)
* AWS KMSのキーが管理不能になった際の、AWSサポートセンターへの連絡による復元

# 管理者権限のIAMユーザの初期設定

管理者権限のIAMユーザでログインし、パスワードの設定を済ませる。その後、MFAの設定を行い、一度ログアウトする。

ここまで終わったら、再びログインし、MFA付きのログイン状態にする。

# 結び

ひとまず、ここまでで最低限セキュアなアカウントが完成したので、この後はIdentity Centerを作って管理するなり、IAMユーザベースで管理するなり、どのような運用をしてもかまわない。
Stirlingで構造体編集 その4

# 概要
バイナリエディタStirlingで構造体編集、やってみた。
練習問題、やってみた。

# 練習問題
wavファイルを新規で作れ。

# 写真

手打ちする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/8665023a-b3f4-9b59-f65a-60c2987b7587.png)

# サンプルコード

```
 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
52 49 46 46 2e 00 00 00 57 41 56 45 66 6d 74 20 
10 00 00 00 01 00 01 00 44 ac 00 00 88 58 01 00 
02 00 10 00 64 61 74 61 0a 00 00 00 00 00 ff 7f 
00 00 00 80 00 00 

```

以上
Stirlingで構造体編集 その3

# 概要
バイナリエディタStirlingで構造体編集、やってみた。
練習問題、やってみた。

# 練習問題
wavファイルの構造体を書け。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/5a55ff49-9d19-ad2a-e050-06093bd85c36.png)

# wav構造体

```
struct WAV_HEADER {
	DWORD	ChunkID;
	dword	ChunkSize;
	DWORD	FormType;
	DWORD	SubChunkFmtID;
	dword	SubChunkFmtSize;
	word	FormatTag;
	word	Channels;
	dword	SamplesPerSec;
	dword	AvgBytesPerSec;
	word	BlockAlign;
	word	BitsPerSample;
	DWORD	SubChunkDataID;
	dword	SubChunkDataSize;
};
```

以上。
Salesforce Maps package 




+ [マップ ライブ トラッキング オブジェクト スキーマ](https://help.salesforce.com/s/articleView?id=000390502&type=1)
+ [Salesforce Maps package installation - Custom objects and fields](https://help.salesforce.com/s/articleView?id=000393016&type=1)

# ストレージを圧迫する？

+ [Error: Maps Live Async Errorsがストレージから削除できない？](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Pf9VjSAJ)

物理削除してない？

+ [How to enable Hard Delete option in data loader?](https://salesforce.stackexchange.com/questions/107104/how-to-enable-hard-delete-option-in-data-loader)
+ [Dataloader is extracting records that have been hard deleted](https://salesforce.stackexchange.com/questions/321913/dataloader-is-extracting-records-that-have-been-hard-deleted)
AWS Session Manager接続でLinuxのOSユーザーを変えてみた

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

# 概要

この記事では以下の内容について説明します。

- EC2 Linux / Mac インスタンスで、ssm-user以外でセッションマネージャーに接続する方法
- Session Managerの「Run As」機能について


## 「Run As」とは？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/4c6f9cc1-45a5-152a-dbfe-e56573859a76.png)

Session Managerを使用してLinux/MacOSサーバーに接続する場合、
デフォルトでは`ssm-user`アカウントを自動生成し、接続されます。

(`ssm-user`アカウントは、サーバー内に`SSM-Agent`をインストールする際に
自動で生成され、以下の様に`/etc/sudoers.d/`に追加されます)

```shell
[root@ip-172-31-34-95 sudoers.d]# ll
total 8
-r--r-----. 1 root root 128 Oct 31 23:55 90-cloud-init-users
-r--r-----. 1 root root  58 Nov  1 00:13 ssm-agent-users

[root@ip-172-31-34-95 sudoers.d]# cat ssm-agent-users
# User rules for ssm-user
ssm-user ALL=(ALL) NOPASSWD:ALL
```

`ssm-user`は強い権限を持っているので、実際の運用で利用するには
別のOSユーザーで運用させたい場合もあると思いますし、IAMユーザーごとに
利用させたいOSユーザーを分けたいという場合もあると思います。

そのような場合、「Run As」を利用することで、
サーバー上に存在するOSユーザーアカウントを使用してセッションマネージャーに接続できるようになります。

ただし、インスタンス上に存在しないOSアカウントを利用しようとすると、接続は失敗します。
また、セッションマネージャーはrootユーザーを使用して接続することはできません。

## 使い方
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/74918d78-f0a9-6eb2-4055-199e8658cfbc.png)

「Run As」の使用方法は一般的に以下の通り

1. Session Managerの設定から「Run As」を有効化します。
2. IAMユーザーまたはロールに`SSMSessionRunAs`タグを付けます。
3. タグを付けたIAMユーザーでセッションを開始します。

「SSMSessionRunAs」タグが付いていないIAMユーザーは接続できないことに注意してください。


# 「Run As」の設定手順
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/4394941e-a522-bb28-927d-8e6a3bd3cf95.png)


ここでは、「Run As」を使用して特定のOSユーザーでセッションマネージャーに接続する方法を紹介します。
1. Session Managerの設定でOSユーザーを指定して接続
2. IAMユーザーに`SSMSessionRunAs`タグを付けて接続

スイッチロールに`SSMSessionRunAs`タグを付ける方法もありますが、ここでは省略します。

# 実装手順

1. AWS Systems ManagerのSession Manager画面から「Edit」を選択します。

    ![ssm-runas01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/5c9e92c4-c1ec-848b-d641-7c3f525ba367.png)


2. 「Enable Run As support for Linux instances」にチェックを入れると、「Run As」が有効になります。ここで「Operating system user name」の項目にOSユーザー名を入力すると、セッションを開始する際に常にそのユーザーで接続されるようになります。

    ![ssm-runas02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/72889db0-b22c-d1c9-3d83-055bf49430a4.png)

3. IAMユーザーの場合は、`SSMSessionRunAs`タグにOSユーザー名を指定します。

    ![ssm-runas03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/6e344567-661e-86f0-ed17-36612e381a77.png)

4. あとはEC2(Linux)にSession Manager接続を行えば、指定したOSユーザーでログインできます。（事前にLinux上でユーザーを作成していることが前提です）

![ssm-runas04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/2894965b-290b-d382-f2b9-bb0967973a6f.png)

# まとめ

この記事ではSession Managerの「Run As」機能について説明しました。
特定のOSユーザーでセッションを開始したい場合は便利な機能ですので、ぜひ活用してみてください。

# 参考リンク

[Turn on run as support for Linux and macOS managed nodes](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-preferences-run-as.html)
[CDGC] 寸劇デモ動画でわかるデータ・カタログ

# はじめに

[こちらの記事](https://qiita.com/masatoshimada-max/items/88369d2dc33bdb25a4ab)の続編となるので、[元記事](https://qiita.com/masatoshimada-max/items/88369d2dc33bdb25a4ab)も合わせてお読み下さい。

[インフォマティカ](https://www.informatica.com/jp/)が提供する、 [CDGC](https://www.informatica.com/jp/products/data-governance/cloud-data-governance-and-catalog.html)(データガバナンス＆カタログ)について、Youtubeにアップされた日本語の寸劇デモ動画で見て頂き、理解を深めてください。
筆者本人が実演しています！！
※2023/9時点の情報を元にしています。



すぐに、寸劇デモの動画を見たい方は[こちらをクリック](https://www.youtube.com/watch?v=fFKdQTvRfms&t=1471s)
セッションの全体をイチから見たい方は[こちらをクリック](https://www.youtube.com/watch?v=fFKdQTvRfms&list=PLDQNKHReEhj8Pxw_9Qlm-4aJGLLoPnQT_&index=14)

 
<!-- 各チャプター -->

# 寸劇デモについて
こちらは2023/9/15に、東京で実施された[「Informatica World Tour 2023」](https://iwt2023.jp/)において、『データガバナンスの最前線！データカタログからマーケットプレイスまで』と、題して実施されたブレイクアウトセッション内にて、寸劇形式のデモを実施しています。

 
# 寸劇デモ動画

下記の埋め込みフレームから再生、もしくは[こちらのリンク](https://www.youtube.com/watch?v=fFKdQTvRfms&t=1471s)からYoutubeへ飛び動画をご覧ください
<iframe width="560" height="315" src="https://www.youtube.com/embed/fFKdQTvRfms?si=aWTLt1n9GvlWnT21&amp;start=1471" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

### シナリオ
とある企業を舞台にして、データを取得した担当営業がデータアナリストに分析を依頼すると、「そのデータでは分析はできない。どこからデータを持ってきたんだ？信用できるデータなのか？」と言われ、その担当営業はデータシチュワードに対して相談をしに行き、データカタログを使って裏取りするというシナリオです。

実際に色々なお客様で、データの信頼性や品質の問題は多発しています。実際にデータを手に入れても、使えないデータや間違ったデータだと、分析結果も間違った結果になってしまいます。
それらを回避するために、データ・カタログを使って、裏取りをし、最終的には分析の精度を上げることができます。


### スクリーンショット
動画では、実際のデータカタログの画面が見づらい部分もあるかもしれませんので、下記にスクリーンショットを貼っておきます。

マーケットプレイスからデータカタログへの自動リンク
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/e4ae1769-0275-3a51-0e0b-e3fcc48ae707.png)

データカタログでデータの概要を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/77303d1e-52a7-6707-983a-3066a3d14f18.png)

データカタログでデータのカラム一覧を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/cbe23869-e9fe-d815-31b7-79e71de21526.png)

データ・リネージュの確認①
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/34c497a7-d787-e477-f1a5-ff70ca4340e8.png)

データ・リネージュの確認②
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/55e14c2d-17c2-0bb1-6fa0-b85c13914b14.png)

データ・品質の確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/94efdfe7-0722-3d4a-ce9d-62174335361a.png)



# 本編動画

『[データガバナンスの最前線！データカタログからマーケットプレイスまで』](https://www.youtube.com/watch?v=fFKdQTvRfms&list=PLDQNKHReEhj8Pxw_9Qlm-4aJGLLoPnQT_&index=14)
- 30分で、データガバナンスの潮流、インフォマティカのデータカタログとマーケットプレイスの機能を理解頂けます
- URL : https://www.youtube.com/watch?v=fFKdQTvRfms&list=PLDQNKHReEhj8Pxw_9Qlm-4aJGLLoPnQT_&index=14

# 関連するQiita投稿
[こちらの記事](https://qiita.com/masatoshimada-max/items/88369d2dc33bdb25a4ab)の続編となるので、[元記事](https://qiita.com/masatoshimada-max/items/88369d2dc33bdb25a4ab)も合わせてお読み下さい。
[CDMP] 寸劇デモ動画でわかるデータ・マーケットプレイス

# はじめに

[インフォマティカ](https://www.informatica.com/jp/)が提供する、 [Cloud Data Marketplace : CDMP](https://www.informatica.com/jp/products/data-governance/cloud-data-marketplace.html)( データ・マーケットプレイス)について、Youtubeにアップされた日本語の寸劇デモ動画で見て頂き、理解を深めてください。
筆者本人が実演しています！！
※2023/9時点の情報を元にしています。

すぐに、寸劇デモの動画を見たい方は[こちらをクリック](https://youtu.be/fFKdQTvRfms?si=NMCITJ_4DSWngjJp&t=910)
セッションの全体をイチから見たい方は[こちらをクリック](https://www.youtube.com/watch?v=fFKdQTvRfms&list=PLDQNKHReEhj8Pxw_9Qlm-4aJGLLoPnQT_&index=14)

 
<!-- 各チャプター -->

# 寸劇デモについて
こちらは2023/9/15に、東京で実施された[「Informatica World Tour 2023」](https://iwt2023.jp/)において、『データガバナンスの最前線！データカタログからマーケットプレイスまで』と、題して実施されたブレイクアウトセッション内にて、寸劇形式のデモを実施しています。

 
# 寸劇デモ動画

下記の埋め込みフレームから再生、もしくは[こちらのリンク](https://youtu.be/fFKdQTvRfms?si=NMCITJ_4DSWngjJp&t=910)からYoutubeへ飛び動画をご覧ください
<iframe width="560" height="315" src="https://www.youtube.com/embed/fFKdQTvRfms?si=ecArXPfdoE3UUEMZ&amp;start=910" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

### シナリオ
とある企業を舞台にして、担当営業が上司から、「売上目標を達成するために、データを使って優良顧客を探しなさい」と言われ、その担当営業はデータシチュワードに対して、データマーケットプレイスの使い方を相談しに行き、最適なデータを手に入れるというシナリオです。

実際に色々なお客様では、データ活用をする際に「いかに良いデータを見つけるか」「見つけたデータをいかに簡単に手に入れるか」と言う、活用以前の事前準備で悩まれています。
特にデータマーケットプレイスは、ITに詳しくない現場部門の方でも簡単に最適なデータを手に入れるような機能をたくさん備えており、セルフサービスでの分析を加速させる事ができます。

### スクリーンショット
動画では、実際のマーケットプレイスの画面が見づらい部分もあるかもしれませんので、下記にスクリーンショットを貼っておきます。

マーケットプレイスのメイン画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/36170e42-775b-d2cc-531c-c0ba53a1b108.png)

データコレクションのサマリ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/b37c42e0-cfd4-9c21-9b2d-39faf7f75abf.png)

データコレクションの使用される目的
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/06caa5d6-6527-b62a-3e4c-2375ccf8cf27.png)

データコレクションのチェックアウト①
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/67cb4c75-6155-2513-ef3b-8e995eba7fb7.png)

データコレクションのチェックアウト② 利用規約
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/3ced81dc-937f-5156-c74d-d9a96b6ffdb2.png)

オーダーの履歴 ワークフローの詳細
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/e4c3d367-5bc7-aa38-a2bd-1b8356730564.png)


# 本編動画

『[データガバナンスの最前線！データカタログからマーケットプレイスまで』](https://www.youtube.com/watch?v=fFKdQTvRfms&list=PLDQNKHReEhj8Pxw_9Qlm-4aJGLLoPnQT_&index=14)
- 30分で、データガバナンスの潮流、インフォマティカのデータカタログとマーケットプレイスの機能を理解頂けます
- URL : https://www.youtube.com/watch?v=fFKdQTvRfms&list=PLDQNKHReEhj8Pxw_9Qlm-4aJGLLoPnQT_&index=14
Pythonで「文字列の長さ(文字数)を取得する」の動作を確認してみた

# 概要

Pythonで「文字列の長さ(文字数)を取得する」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/python/string/index8.html

# 実装

以下のファイルを作成しました。
```sample.py
print("Hello の文字数は " + str(len("Hello")))
print("東京都 の文字数は " + str(len("東京都")))
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
Hello の文字数は 5
東京都 の文字数は 3
```

# まとめ

何かの役に立てばと。
DeviseGemでのデフォルトバリデーションをテストしよう

## DeviseGemでのデフォルトバリデーションをテストしよう

DeviseGemは、Ruby on Railsアプリケーションでユーザー認証を簡単に実装できるツールです。しかし、デフォルトのバリデーションをテストしてアプリケーションのセキュリティとデータ整合性を確保することは非常に重要です。以下に、DeviseGemのデフォルトバリデーションをテストするための7つの具体的なテストコードを示します。

```ruby
# 1. emailが空でないことをテスト
it 'validates presence of email' do
  user = User.new(email: nil)
  expect(user).not_to be_valid
end

# 2. passwordが空でないことをテスト
it 'validates presence of password' do
  user = User.new(password: nil)
  expect(user).not_to be_valid
end

# 3. パスワードが5文字以下でないことをテスト
it 'validates password length (minimum 6 characters)' do
  user = User.new(password: '12345')
  expect(user).not_to be_valid
end

# 4. パスワードが129文字以上でないことをテスト
it 'validates password length (maximum 128 characters)' do
  user = User.new(password: 'a' * 129)
  expect(user).not_to be_valid
end

# 5. パスワードと確認用が一致していることをテスト
it 'validates password confirmation' do
  user = User.new(password: 'password', password_confirmation: 'different_password')
  expect(user).not_to be_valid
end

# 6. emailに@がついていることをテスト
it 'validates email format (presence of @)' do
  user = User.new(email: 'invalid_email')
  expect(user).not_to be_valid
end

# 7. emailが重複していないことをテスト
it 'validates uniqueness of email' do
  existing_user = User.create(email: 'test@example.com', password: 'password')
  user = User.new(email: 'test@example.com', password: 'different_password')
  expect(user).not_to be_valid
end
```

これらのテストコードを使用して、DeviseGemのデフォルトバリデーションを確実にテストできます。バリデーションテストを実行することで、アプリケーションのデータが正しく整合し、セキュリティが確保されることを確認できます。アプリケーションの信頼性を向上させ、問題を事前に発見しましょう。

このテストコードを使用して、DeviseGemを効果的に活用し、アプリケーションのユーザー認証を信頼性のあるものにしてください。安全なユーザーエクスペリエンスを提供し、データ整合性を確保するためにこれらのテストを活用しましょう。
全てのメーリングリストのメンバーをメーリングリストごとにCSVとして保存する

## 前提条件
Windows PowerShell で Exchange Online へ接続済みであること


## 以下プログラムを実行する


```powershell
# 現在の日付と時間を取得（形式はyyyyMMdd_HHmmss）
$currentDateTime = Get-Date -Format "yyyyMMdd_HHmmss"

# 出力ディレクトリを設定（Cドライブ配下に 'maillist_日付_時間' フォルダ）
$outputDirectory = "C:\maillist_$currentDateTime"

# 出力ディレクトリが存在しない場合は作成
if (-Not (Test-Path $outputDirectory)) {
    New-Item -Path $outputDirectory -ItemType Directory
}

# Get-DistributionGroupの一覧をCSVとして保存
$groupListPath = "$outputDirectory\_MailList.csv"
Get-DistributionGroup -ResultSize Unlimited | Select-Object Name,DisplayName,PrimarySmtpAddress | Export-Csv -Path $groupListPath -NoTypeInformation

# Get-DistributionGroupから取得した一覧をループで処理
Get-DistributionGroup -ResultSize Unlimited | ForEach-Object {
    $groupIdentity = $_.PrimarySmtpAddress

    # CSVファイル名を設定（特殊文字をエスケープする場面も考慮）
    $csvFileName = "$($groupIdentity -replace '[\/:*?"<>|]', '_').csv"

    # 出力先のフルパスを設定
    $outputPath = "$outputDirectory\$csvFileName"

    # 各グループに対してGet-DistributionGroupMemberを実行し、CSVとして出力
    Get-DistributionGroupMember -Identity $groupIdentity | Select-Object DisplayName,Department,PrimarySmtpAddress | Export-Csv -Path $outputPath -NoTypeInformation
}
```

maillist_yyyyMMdd_HHmmssでディレクトリが作成されます。
メーリングリストの一覧を作成し、_MailList.csvに格納されます。
※_（アンダーバー）が入っているのは、一番上に表示させたいからです。
また上記ディレクトリ配下にメーリングリストごとにメーリングリストに所属するユーザーが格納されます。
動画プレーヤーmpvをmacOSで利用する

## オープンソースの動画プレーヤーmpv

macOSで動作が軽い動画プレーヤーが欲しい、mp4だけでなくmkvやaviやwmvやflvや、果てはrmまで、あらゆるファイル形式の動画を簡単に再生できるMacのソフトない？と思ったときに、mpvというオープンソースの動画プレーヤーがあります。

https://mpv.io

ただ、mpvは基本はコマンドラインアプリなので、これをいわゆるGUIのmacOSアプリとして、特にAppleシリコンネイティブアプリとして使えるようにするにはいくつかの手順が必要。ここではその方法を自分なりにまとめてみたので紹介します。

## こだわりがなければIINAがおすすめ

mpvの利用にはかなりのステップが必要なので、特にこだわりがなく簡単に利用したい場合には、mpvをベースにして動画プレーヤーとしての機能を充実させたIINAを使うのがおすすめです。

https://iina.io

## Intel版mpvならHomebrew caskで導入できる

また、Appleシリコンネイティブでなく、Intel版で良いのなら、mpvも簡単にインストールできます。
Homebrewが入っていない環境の場合は、まずはHomebrewを導入して、

https://brew.sh

導入できたら、以下のコマンドを入力
```
brew install --cask mpv
```
これだけで、アプリケーションフォルダにmpvがインストールされます。Intel版ですがAppleシリコンのMacでも動作はします。

## なぜIINAではなくmpvが良いの？
**軽い！**
それだけです。mpvは動画再生に特化しており、動作が軽快です。キーボードの矢印キーで早送り早戻しが可能ですが、そのスピードがとにかく早い。mpvをベースにしているIINAも早いのですが、純正のmpvはさらに早い。
そう、早さが欲しいので、やはり面倒な手順を踏んででもAppleシリコンネイティブで動いて欲しいのです。

## mpvをmacOSで利用する
ようやく本題。mpvをmacOSで、Appleシリコンネイティブで利用する手順です。

### Homebrew導入
Homebrewが入っていない環境の場合は、まずはHomebrewを導入

https://brew.sh

### Xcodeのインストール
mpvの作成(コンパイル)のためには、Xcodeが必要です。AppleのDeveloperサイトからダウンロードし、インストールするのが便利です。

https://developer.apple.com/download/all/

Developerサイトへユーザー登録していない、ユーザー登録したくないという場合は、XcodeはAppStoreからダウンロードすることもできます。
Xcodeはインストールが終わったら一度起動してください。利用規約への同意が終わったら終了して構いません。

### Homebrewのmpv.rbをコピー
以下のページのコードをコピーし、テキストファイルを作成し貼り付けます。保存するファイル名はなんでもいいですが、ここでは元と同じく「mpv.rb」として保存します。

https://github.com/Homebrew/homebrew-core/blob/master/Formula/m/mpv.rb

### mpv.rbを編集

このコードを見つけて
```diff_ruby
zsh_completion.install "etc/_mpv.zsh" => "_mpv"
```
その下にコードを追加

```diff_ruby
    zsh_completion.install "etc/_mpv.zsh" => "_mpv"

    # ここから追加
    system "python3", "TOOLS/osxbundle.py", "build/mpv", "--skip-deps"
    prefix.install "build/mpv.app"
    # ここまで追加

end
```
※こちらを参考にしています

https://github.com/deus0ww/homebrew-tap/blob/master/mpv.rb

追加ができたらmpv.rbを保存します。

### mpvの作成
「ターミナル」にコマンドを入力
```
brew install --HEAD
```
「ターミナル」画面に、保存した [mpv.rb] ファイルをドラッグ
```
brew install --HEAD /Users/username/Desktop/mpv.rb
```
[Enter] キーで実行します。

### 作成されたmpvはどこにある?
作成が終了すると、このような表示があるはずです。
```
🍺  /opt/homebrew/Cellar/mpv/HEAD-98a27b3: 42 files, 16.1MB, built in 20 seconds
```
パスの部分をコピーして、Finderのメニューから [移動] - [フォルダへ移動...] 
パスを貼り付けて [Enter] キー。

![mpvpath.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586657/00383815-7c3b-41c1-4f83-9c1f07270650.png)

できていますね。
![mpvapp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586657/66eca13b-29df-b13d-e3ca-01aeb4970033.png)

Appleシリコンmpvの完成です。
![mpvinfo2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586657/a699f024-ebb6-13b6-4a3e-1acafe25a0db.png)

必要に応じて、アプリケーションフォルダにコピーしたり、Dockに追加すると良いでしょう。

### mpvの削除
削除するときのコマンドです。最新版で作成し直したいときは、先に削除します。
```
brew rm -f mpv
```

## mpvの早送り早戻し
[→][←]キーで5秒シーク
[↑][↓]キーで1分シークです。
シークの早さとキーボードで動画操作できる快適性をぜひ実感してください。

## mpvのマニュアル
英語ですが公式マニュアルはこちらです。

https://mpv.io/manual/master/
laravel seederのファイルを階層深く掘ったら一瞬詰まった

## 概要

- laravelのseederをProductionで実行されるか、されないかで整理しようと思った。
- `database/seeders/non_production`と`database/seeders/production`というディレクトリを作ってそれぞれseederファイルを分けて設置した。
- seederファイル内のnamespaceを`namespace Database\Seeders\NonProduction;`や`namespace Database\Seeders\Production;`に変更し、DatabaseSeeder.phpの中のuse宣言も修正した。
- DatabaseSeederのuse宣言部分から各seederファイルにジャンプできることも確認した。

## 問題発生

- フレッシュマイグレーション + seederの実行を行うと個々のseederファイルが存在しない旨のエラーが発生しseederが流せない。

## 原因

- laravelのnamespaceはPSR-4のオートローディング規約に準拠している必要があるらしい。
- ディレクトリ名とnamespaceが一致している必要があるらしい。
- 下記のようにディレクトリ名を修正したら問題は解消した。
    - `database/seeders/non_production` → `database/seeders/NonProduction`
    - `database/seeders/production` → `database/seeders/Production`
- databaseディレクトリとseedersディレクトリの名前はアッパーキャメルケースじゃなくていいらしい。これはどうやら例がらしく、フレームワーク側から特別な存在として扱われているディレクトリらしい。（ヴェルタースオリジナルみたいなディレクトリやな。）
Matplotlib の Slider で任意の時間・角度でプロットする

# コード
時系列データを任意の時間・角度で指定し、可視化する必要があったため作りました。<p>
```python:slider.py
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider

# インタラクティブ用コマンド
%matplotlib widget

# 変数設定
value = np.linspace(0, 4*np.pi, 1000)
k = np.linspace(0.5, 1.5, 1000)
x = np.sin(value) * k
y = np.cos(value) * k
z = np.linspace(-1, 1, 1000)

# 図形オブジェクト作成
fig = plt.figure(figsize=(8, 8))

# 図形分割
grid = fig.add_gridspec(20, 1)
# スライダー領域確保
ax_slider_z = fig.add_subplot(grid[0,:])        # 方位角
ax_slider_xy = fig.add_subplot(grid[1,:])       # 仰俯角
ax_slider_time = fig.add_subplot(grid[2, :])    # 時間
# 3D 図形領域確保
ax = fig.add_subplot(grid[3:, :], projection="3d")

# Sliderの設定
slider_z = Slider(ax_slider_z, 'z-axis', -180, 180, valinit=0, valstep=10)
slider_xy = Slider(ax_slider_xy, 'xy-axis', -180, 180, valinit=0, valstep=10)
slider_time = Slider(ax_slider_time, "time", 0, 1000, valinit=0, valstep=1)

# 初期視点
ax.view_init(elev=0, azim=0)

# 視点変更のスライダーを動かした時に呼ばれるコールバック関数
def view_change(val):
    # スライダーの値入手
    sz = slider_z.val
    sxy = slider_xy.val

    # 視点変更
    ax.view_init(elev=sxy, azim=sz)
    # 図形の更新
    fig.canvas.draw_idle()

# 時間変更スライダーを動かしたときに呼ばれるコールバック関数
def time_change(val):
    # 前の図形削除
    ax.cla()
    # スライダーの値入手
    pos = slider_time.val
    
    # プロット
    ax.plot(x, y, z)
    ax.set_xlabel("X")
    ax.set_ylabel("Y")
    ax.set_zlabel("Z")
    # 現在地点プロット
    ax.scatter(x[pos], y[pos], z[pos], color="red")

# スライダーにコールバック関数を適応
slider_z.on_changed(view_change)
slider_xy.on_changed(view_change)
slider_time.on_changed(time_change)

# プロット
ax.plot(x, y, z)
ax.scatter(x[0], y[0], z[0], color="red")
ax.set_xlabel("X")
ax.set_ylabel("Y")
ax.set_zlabel("Z")

plt.show()
```

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

# 環境
VSCode 1.83.1
拡張機能 Jupyter

# コードの説明
11/5（日）ごろ公開予定

# 参考文献
https://qiita.com/nognog/items/a3c24c10095c880fc4c9
flaskのlocalhost起動

```.PowerShell
$env:FLASK_APP = "アプリ名"

例）
$env:FLASK_APP = "hello"
```

```.PowerShell
flask run
```

```.debug
flask --app app run --debug
```

#### 参考記事
https://flask.palletsprojects.com/en/2.0.x/quickstart/
縦横方向に波線を描く

こんにちは．ふじえもんです．


縦横方向に波線を描きたくなったのでやってみました．
藤と川をイメージしてそれぞれの色，縦と横方向にsin関数を使って描いてみました．

縦方向はrotate()とtranslate()を使って描画方向を変えてやります．
```js
function setup() {
  createCanvas(800, 600);
}

function draw() {
  background(255);
  strokeWeight(4);
	stroke("#23C4DC");
	drawwaves(20, 40 , 0.05, 40);

	stroke("#A09BD8");
	push();
	translate(0, height);
	rotate(-HALF_PI);
	drawwaves(20, 40 , 0.05, 40);
	pop();
}

function drawwaves(waves, spacing, basefrequency, amplitude){
	for(let v = 0; v < waves; v++){
		for(let h = 0; h <= width; h++){
			let frequency = basefrequency;
			let y = sin(h * frequency) * amplitude + v * spacing;
			point(h, y);
		}
	}
}
```

で，せっかくなら波らしく動いてほしいので，数秒動くようにしてみました．
```js
let time = 0;
function setup() {
  createCanvas(800, 600);
}

function draw() {
  background(255);
  strokeWeight(4);
	stroke("#23C4DC");
	drawwaves(20, 40 , 0.05, 40, time);

	stroke("#A09BD8");
	push();
	translate(0, height);
	rotate(-HALF_PI);
	drawwaves(20, 40 , 0.05, 40, time);
	pop();
	time += 0.1;
}

function drawwaves(waves, spacing, basefrequency, amplitude, time){
	for(let v = 0; v < waves; v++){
		for(let h = 0; h <= width; h++){
			let frequency = basefrequency;
			let y = sin(h * frequency + time) * amplitude + v * spacing;
			point(h, y);
		}
	}
}
```
動作している様子は[こちらのsketchからご覧いただけます．](https://openprocessing.org/sketch/2070440)

以上．ふじえもん．
ようつべ体験記13

[前回](https://qiita.com/matsukatsu/items/8034d639340dbf5346d3)

10月が終わりました。
今月の目標は `インプレッション数と視聴回数を右肩上がりの状態に戻す事` でした。

![Frame 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/cb1b992a-6c4c-a333-b171-3bb5e8e841fe.png)

9月後半からの失速を10月全部を使って止め、微増に向けられたようにも見えます。
ただ、インプレッション数を見ると顕著ですが、調子がいい時は動画を出してない日の谷も増加が見られますが、10月のインプレッション数でそのような傾向は見られません。
10月末に歴代トップで見られる動画が出せたので盛り上がって見えるものの、まだ傾向として増加に転じらていないように見えます。

チャンネルの質の改善 として、調子が悪い動画を非公開にしました。
下げ止まったように見えるのは、その効果があったのかもしれません。
![スクリーンショット 2023-10-31 23.42.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/975e08a7-3250-0296-1900-a14815d049a6.png)

動画の質の改善 として、コアの部分だけ実現した場合をどうのこうのと、1ヶ月前に言っていました。 `テスト1` という動画で試してみたのですが、平均再生率が恐ろしく低く、低評価もついたので公開1日で非公開にしました。
このチャンネルの他の動画と比較して手抜きに見えてしまったのかもしれません。

チャンネル全体として非常に厳しい1ヶ月だったように思うのですが、チャンネル登録者数はコンスタントに伸びて、10月で13人の方が登録してくれました。
結果的には9月より多くの方が登録してくれた事になります。
良い事なのですが、右肩上がりの状態にする事でよりテンポ良く登録者数を増やせるようにしたいです。
![スクリーンショット 2023-10-31 23.48.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/e25a797d-d2f2-ef3e-868d-938688badf47.png)


各動画のインプレッション数、インプレッションのクリック率、公開日あたりの視聴回数、平均再生率、リピーター数、高評価数、チャンネル登録者数を、横軸に公開日をとるグラフにプロットしてみました。
8/1を除いて1日1動画しか公開していません。8/1は最も良い動画をプロットしています。
グラフの上の方にプロットされていれば、その日に公開した動画が調子が良いことを表しており、下ならその逆です。
![スクリーンショット 2023-11-01 23.19.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/b31f942d-a45a-076b-b816-984f5eb44dc2.png)

8月上旬は調子が良く、8月下旬は調子が悪く、9月上旬は調子が良く、9月下旬が調子が悪い。
この一連の流れが、各動画に注目して見やすくなったかと思います。
8月上旬の調子が良かったのは、単純にそのタイミングで出していた動画の質が良かったのだろうと思います。
8月下旬の調子が悪かったのも、単純にそのタイミングで出していた動画の質が悪かったのだろうと思います。
9月上旬に出していた動画は調子が良かったにも関わらず、中旬以降インプレッションは伸びるのに視聴回数は下降する状況が生まれました。

おそらく、8月上旬、9月上旬の調子が良い事でチャンネルの評価があがって、インプレッション数が割り当てられた時期に、質の低い動画も溜まった為にインプレッションしてもクリックされにくい状況が生じ、最終的にチャンネルの評価が下がってインプレッションもされなくなったのかなという気がします。
動画単独の評価は出した直後の視聴者の反応で決まりそうですが、チャンネルの評価は2週間程度の時間差で再評価されていそうな感じがします。
13日間公開して低く停滞してしまう動画は、さっさと非公開にしてしまった方が次の動画の足を引っ張らずに済むような感じがするので、11月はそういう運用をして、良い動画だけが残っていくようにしてみます。
せっかく作ったし、何かの拍子に伸びる可能性もあるのにもったいない気もしますが、13日の間で問題箇所がわかる場合もあるので、いつかリメイクという形でやり直せれば良いかなと考えています。

11月は新たな運用ルールで `インプレッション数と視聴回数を右肩上がりの状態に戻す事` を実現したいと思います。


10月末に通常の3倍ぐらいのスピードで視聴回数を稼ぐ動画を公開する事ができました。
この動画の公開で様々な指標が一気に改善し、チャンネル登録者も増えました。
![IMG_4359.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/8f5b1463-4cf1-ab50-2d76-76d3377fb528.png)
すごく嬉しいのですが、次はこれ以上の動画を出さないと足を引っ張ると思うと出しにくくて仕方がないです。
【Rails】APIにAlbaを導入する方法

## Albaについて
AlbaはJSONシリアライザーです。

https://github.com/okuramasafumi/alba

## 導入方法

以下の手順でRailsのAPIにAlbaを導入できます。

### インストールする

`Gemfile`に以下のように記述して`bundle install`を実行してインストールします。

```Gemfile
gem 'alba'
```

```terminal
bundle install
```

### 設定ファイルを作成する

`config/initializer/alba.rb`を以下の内容で作成します。

```config/initializer/alba.rb
Alba.backend = :active_support
```

### resourcesディレクトリを作成する

`app/resources`ディレクトリを作成し、`user_resource.rb`を作成します。

```app/resources/user_resource.rb
class UserResource
  include Alba::Resource
  
  root_key :user

  attributes :id, :name
end
```

### コントローラーを編集する

コントローラーを以下のように編集します。


```app/controllers/api/v1/users_controller.rb
module Api
  module V1
    class UsersController < ApplicationController
      def show
        user = User.find(params[:id])
        render json: UserResource.new(user), status: :ok
      end
    end
  end
end
```

### リクエストする

`GET api/v1/users/1`をすると以下のようなレスポンスが返ります。

```
{
  user: {
    id: '1',
    name: 'sample',
  }
}
```

## 公式ドキュメント

https://github.com/okuramasafumi/alba/blob/main/docs/rails.md
JTC作法！手打ちしないで、バッチファイルでファイル名を簡単付与 

## この記事のハイライト
![Animation_AddEnd.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1582/ac6200e0-ebc9-c68f-ac23-f8e999d7ef68.gif)
バッチ処理により、「議事録.docx」のファイル名の末尾に「_山田修正」をつけたり、「+鈴木承認」をつけたりしています。

どんどんファイル名が長くなる様、体感いただけましたか？これで良いんです。

## 背景
古き良きJTC（Japanese Traditional Company）ならではのことですが、ファイル名の末尾に**修正者の名前**や**承認者の名前**を入れる作法があります。

例として、以下のようなファイル名を考えてみましょう。
* 「議事録_山田修正+鈴木承認.docx」
… はい、正直ダサい。

## 課題
この管理方法は、いくつかの点で不便です。

* ファイル名を変更する手間
* 拡張子を消し飛ばすリスク
* どれが最新ファイルか不明

これら課題があるにもかかわらず、今日も全社員がファイル名の手動変更をしています。

皆さんも感じるでしょう。JTCが求めるのは**キラキラとした斬新なDXシステム**。地味で現場で役立つツールの導入は不可能です。

そんな中、私は**小さな革命**を起こしました。

## ソリューション
自動で修正者名を追加する、超簡単なバッチファイル！

## 使用方法
以下のコードをメモ帳やエディタにコピーして、ANSI形式で保存します。

ファイル名は「AddEnd(_山田修正).bat」とします。括弧内部の文字列をプログラムで読み込んでいます。名前やセパレーターは自分の好きなものに変更してね。

あとは、冒頭のGif動画の通りです。

* ドラッグ&ドロップで即座に名前追加！
* 複数ファイルも、フォルダ名も、一瞬で変更！

## バッチファイルのコード
ファイル名の末尾に追記するバッチファイルのコードは以下の通りです。

```batch:AddEnd(_山田修正).bat
@echo off
chcp 65001 > nul
setlocal enabledelayedexpansion

rem get the inside of ()
set "Addition=%~n0"
set "Addition=%Addition:~7,-1%"

:LOOP
rem Exit if no filename is provided
if "%~nx1" == "" goto EOF

set "FileName=%~n1"

rem Add to the end of the filename
set "NewFileName=!FileName!!Addition!%~x1"

rem Rename the file
ren "%~1" "!NewFileName!"

rem Move to the next file
shift
goto LOOP

:EOF
endlocal

```

## 最後に
やっと名前の手打ち作業から解放されますね！なお、特殊な文字環境やお行儀の悪いファイル名は考慮していません。

バージョン管理を日付追記で行っている方には、こちらの記事もどうぞ。

JTC作法！もう日付を手打ちしない！バッチファイルでファイル名を簡単付与

https://qiita.com/enthumble/items/929dbef8b3ed6c54e15b
【Golang】スライスの要素を別のスライスに追加する場合のappend()の使い方

Go言語において、スライスに要素を追加するメソッドに「append()」がある。
この「append()」について、あるスライスを展開して、その要素を別のスライスに追加することが簡単にできたため備忘録として残す。


### スライスの要素を別のスライスに追加する方法
```go
package main

import "fmt"

type User struct {
	Name string
	Age  int
}

func main() {

	users := []User{
		{Name: "bob", Age: 10},
		{Name: "alice", Age: 20},
	}

	otherUsers := []User{
		{Name: "jorn", Age: 15},
	}

	otherUsers = append(otherUsers, users...)

	fmt.Println(otherUsers)
    // 結果：[{jorn 15} {bob 10} {alice 20}]
}
```

**append()の第2引数に追加したいスライスを記載して、「...」をつける。
これによって、第2引数に渡したスライスが展開されて、一つ一つの要素がotherUsersスライスに追加できる** 

### append()の第2引数について
append()の第2引数が可変長引数を受け取ることができる。

可変長引数とは、関数が異なる数の引数を受け入れることができる特殊な引数のこと。

### スライスと配列における「...演算子」とは
「...演算子」は **スライスと配列を展開して、その要素を個別の引数として関数に渡す** ために使用される。
これにより、可変長引数関数へのスライスの要素を渡すなど、関数呼び出し時に引数リストを柔軟に扱うことができる。

サンプルコード
```go
package main

import "fmt"

func sumIntegers(arg ...int) {
    sum := 0
    for _, arg := range args {
        sum += arg
    }
    fmt.Println("Sum of argument: %d\n", sum)
}

func main() {
    mySlice := []int{1, 2, 3}
    sumIntegers(mySlice...)
}
```


### まとめ
:::note info
* append()の第2引数には可変長引数を渡すことができる。
* 「...演算子」はスライス・配列を展開して、一つ一つの要素を個別の引数として関数に和すことが可能
:::
【仕組みについて】ユーザー登録とは？

### はじめに

個人開発でユーザー登録・ログイン機能を作成した際に、調べたことのメモ📝
※自分なりの言葉なので、おかしい箇所もあります

### ユーザー登録ってどんな仕組みなのか？

クライアント側から、フォーム上のデータを送信することで（リクエストすることで）、webサーバーを介して、専用のデータベースにフォームデータ内容が登録され、処理の結果を（レスポンス）返す。

## どんな風に動いているのか？
図で表すとこんな感じ↓

![IMG_0147.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513569/a52a0b59-6bd0-be59-c1be-2a43264b3b75.jpeg)

バックエンドと書いているけれど、バックエンド内でもユーザー登録ができるから今度はそちらの仕組みについても調べてみたいと思います。
Reactライブラリ用のテンプレートを作成してみた


こんにちは，ご覧いただきありがとうございます。
普段，Reactでフロントを作成しているのですが，個人開発なため，毎度同じようなコンポーネントを利用します。
そのため，最近はライブラリ化を行い，それぞれのコンポーネントを使いまわすようにしています。（これについては賛否両論あるかもしれませんが）
しかし，そのライブラリ化を行うにあたって，毎度同じようなリポジトリを作るのも億劫です（本当に面倒くさがりなんです）。
そこで今回，そのリポジトリをテンプレートにしちゃえということで作成しました。

https://github.com/ikepu-tp/js-lib-template

テンプレートとしてリポジトリを登録しておりますので右上の「Use this template」から簡単にリポジトリをコピーできます！！
ぜひご活用ください！！

以下はリポジトリについての簡単に説明です。

## 前提

- Reactのためのライブラリ
- Storybookでコンポーネント管理
- ビルド等はVite

## ディレクトリ・ファイル等

### ~/.github/workflows/publish.yml

`main`ブランチにおいて，`package.json`が更新された際に実行されます。

1. ビルドが行われ，npmに公開します。
2. `package.json`の`version`の値から取得したリリースとそのブランチを作成します。

:::note info
アクションのsecretsに`NPM_TOKEN`に`npmjs.org`で発行したトークンを登録しておいてください。
:::

### ~/.github/workflows/sb-build.yml

`main`ブランチにおいて，`/stories/*`が更新された際に実行されます。

1. `yarn build-sb`(`Storybook`のビルド)が行われます。
2. `gh-pages`にプッシュします。

:::note info
`gh-pages`のブランチを事前に作成してください。
:::

### ~/.storybook

`Storybook`に関する設定等のファイルです。
`Storybook`については公式サイトをご確認ください。

https://storybook.js.org/

### ~/docs

`Storybook`のビルドファイルを格納します。
GitHub Pagesで

### ~/src/index.ts

このファイルにコンポーネントを定義し，`export`してください。
あるいは他のファイルのコンポーネントを`import`し，`export`してください。
このファイルの内容のビルドが行われ，ライブラリとして公開されます。

### ~/stories

`Storybook`で管理するコンポーネントのストーリーファイルを作成してください。
詳細は公式サイトをご確認ください。

https://storybook.js.org/

### ~/*

諸々のファイルがありますが，ここでの説明は割愛します。
フリーランス2ヶ月目あれやこれや

## プロジェクトの概要
- 既存システムをSFDCにマイグレ
- 開発は海外
- スクラム

## 業務内容
- 開発がテストした後、リリースの前での大雑把なテスト

## スクラムだけどさ
- 基本的に現行踏襲or廃止で要件は固まっている
- 開発と要件出しのリソースを効率よく使うためにスクラムが採用されている
- デイリーでの課題提起や振り返りといったスクラムイベントは機能していない
- 短距離走的な志向になりがち
    - スプリント終盤やリリース間近に高負荷
    - なんでもできる人がなんでもやっちゃってチームとしての成長がいまいち

## サラリーマン時代との比較
#### 同じ
- フルリモ
    - サラリーマン時代は週1,2出社

#### フリーランスになってよかった
- 責任と裁量のあるアサインをしてもらえる
- 筋肉質なメンバーが周りに多い
    - 多分淘汰されていっている
- 年俸制になってだらだら仕事をしなくなった
- シンプルに給料がいい

#### サラリーマンのほうがよかった