OmniAICreator/Qiita-1.07M huggingface dataset:
日本の祝日を判定するBATファイルを書いた件

# はじめに
業務アプリケーション寄りのプログラマであれば一度は書いたであろう営業日判定のプログラム。
@mindwood さんが下記の通り良記事を書いてくれています。本当にありがとうございます。
>【日本の祝日を判定するBashスクリプトを書いた件】
>https://qiita.com/mindwood/items/d22689d3da61034751bd

宗教上の理由がありPowerShellが使えなかったため、今回は**BATファイル**で書きなおしました。
作業時間3時間くらい。私の業務範囲は十分にカバーできた都合で省力化したため、一部処理を省略しました。有志による改良を期待します。。。

# 結論
細かい仕様や注意事項などは元記事を参照してください。
```bat:check_holiday.bat
@echo off
rem ###############################################################
rem #   本邦休日判定スクリプト
rem #   @translator  Rocky.S
rem #   @original    MindWood
rem #   @param       チェック日付を yyyy/mm/dd で指定。省略すると今日を仮定
rem #   @return      0       ... 確実に祝日
rem #                1       ... おそらく平日
rem #   @usage       check_holiday.bat || ”平日に必ず実行させるジョブ”
rem ###############################################################

rem 引数チェック
if "%1"=="" (
     set CHECK_DATE=%date%
) else (
     rem エラーチェックは(面倒なので)省略...
     set CHECK_DATE="%1"
)

rem 内閣府提供の祝日ファイルをキャッシュするディレクトリ
set CACHE_PATH=%~dp0

rem 祝日登録ファイル名
set HOLIDAY_FILE=%CACHE_PATH%holiday.csv

rem 祝日ファイルをダウンロード 
rem batでは日付の処理(特に加減算)が面倒なので更新が古い等の判定は省略 → 再取得は手動
if not exist %HOLIDAY_FILE% (
     bitsadmin /transfer "holiday" 
"https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv" %HOLIDAY_FILE%
)
rem ちなみにファイル更新日時は下記で取れます。誰か定期的な再取得の処理、実装してください。。。
rem for %%i in ( "%HOLIDAY_FILE%" ) do echo 祝日ファイル更新日時: %%~ti

rem (まずbat内で日付を取得/操作したいのでset_weekサブルーチンを実行する)
rem 土日なら 0 を返却して終了
call :set_week
if %WEEK% equ 0 (
     exit /b 0
)

rem set_weekで操作した日付表現をcsvに合わせる
set TODAY_FORMATED=%y%/%m%/%d%

rem CSVに祝日として登録されていれば 0 を返却して終了
findstr %TODAY_FORMATED%, %HOLIDAY_FILE%
if "%ERRORLEVEL%"=="0" (
     exit /b 0
)

rem 年末年始（12月31日～1月3日）なら 0 を返却して終了
rem 月日を2桁に固定するため、既定の桁数に削り(右から2桁)、出力
set d=0%d%
set m=0%m%
set TUKIHI=%m:~-2%%d:~-2%

rem 都合に合わせて自由に調整可能
set TRUE_FALSE=FALSE
IF %TUKIHI% equ 1231 set TRUE_FALSE=TRUE
IF %TUKIHI% equ 0101 set TRUE_FALSE=TRUE
IF %TUKIHI% equ 0102 set TRUE_FALSE=TRUE
IF %TUKIHI% equ 0103 set TRUE_FALSE=TRUE
IF %TRUE_FALSE%==TRUE (
     exit /b 0
)

rem 上記いずれでもなければ平日として終了
exit /b 1


rem ===========================================
rem 以下、batで曜日を判定するためのサブルーチン
rem 引用と感謝 -> https://casualdevelopers.com/tech-tips/how-to-calc-week-day-with-bat/
rem ===========================================

:set_week
set TODAY=%date%

REM 日付の分解
set /a h=%TODAY:~0,2%
set /a y=%TODAY:~2,2%
set m1=%TODAY:~5,1%
set m2=%TODAY:~6,1%
if "%m2%" equ "/" (
set /a m=m1
set /a d=%TODAY:~7,2%
) else (
set /a m=m1*10+m2
set /a d=%TODAY:~8,2%
)
if %m%==1 ( set /a y-=1&set /a m+=12 )
if %m%==2 ( set /a y-=1&set /a m+=12 )

REM ツェラーの公式
set /a week_value=( y + (y/4) + (h/4) - 2*h + (13*(m+1)/5) + d ) %% 7

REM 曜日の設定
if %week_value%==0 set WEEK=0
if %week_value%==1 set WEEK=0
if %week_value%==2 set WEEK=1
if %week_value%==3 set WEEK=1
if %week_value%==4 set WEEK=1
if %week_value%==5 set WEEK=1
if %week_value%==6 set WEEK=1
exit /b
```

# さいごに
BATファイルを書くことについて、イライラしないエンジニアはいないのではないだろうか。（よく頑張った自分）

@mindwood さま。事前了解などなく、記事の体裁をそのまま使用させていただきました。本記事についてよろしくない点等があれば忌憚なくご指摘ください。
【Laravel9】 新ヘルパー Benchmarkサポートクラス

# Benchmarkサポートクラス
![](https://storage.googleapis.com/zenn-user-upload/79ae03d368bb-20221102.png)
https://readouble.com/laravel/9.x/ja/helpers.html

処理を終えるまでにどれぐらいかかったかを簡単に測定できます

## example
```php
public function getEvents($start, $end): array
{
    $range = [
        CarbonImmutable::create($start)->format('Y-m-d'),
        CarbonImmutable::create($end)->format('Y-m-d'),
    ];

    Benchmark::dd(fn() => Schedule::query()
        ->whereIn('user_id', $this->selectedUserIds)
        ->whereBetween('day', $range)
        ->get()
        ->map(fn($schedule) => $this->convertToEventByScheduleForFullcalendar($schedule))
        ->toArray());
}

```
![](https://storage.googleapis.com/zenn-user-upload/19bd110e2997-20221102.png)
axiosのCORS対処

### 問題
axiosを使って、firebase dynamiclinksのREST apiをcallした時、なぜかCORS関連のエラーが出た。
XMLHttpRequestを使ったら出ず。

### 対処法
両者を比較したら、`withCredentials = false`が XMLHttpRequest でデフォルトになっている。
それが原因だとわかった。
ただ、通常の `axios.post(..., { headers })`で書いても、`withCredentials`がうまく設定できず、
以下のような書き方にした

```typescript
const axiosInstance = axios.create({
    withCredentials: false,
    headers: {
      "Content-Type": "application/json",
    },
  });
  return axiosInstance.post(`${FIREBASE_DYNAMIC_LINK_API}?key=${API_KEY}`, {
    dynamicLinkInfo: {
      domainUriPrefix: DYNAMIC_LINK_PREFIX,
      link: `${FUNCTION_BASE_URL}share?imgUrl=${link}`,
    },
    suffix: {
      option: "SHORT",
    },
  });
```
Microsoft PurviewのLineageを外部に出力する（その2）

# この記事でやること
この記事ではMicrosoft PurviewのLineageをREST APIでJSON形式で取得しGraphvizを使って可視化します。
REST APIの実行はPythonを使っています。

* [Microsoft PurviewのLineageを外部に出力する（その1）](https://qiita.com/cannoteat/items/1bc23d6b8c2d4ede1794)
* この記事
* [Microsoft PurviewのLineageを外部に出力する（その3）](https://qiita.com/cannoteat/items/ba97cd3d57193a458d76)

# Lineageの取得と表示
前回の記事で取得したLineageをそのまま使っていきます。
今回は各ノードを繋げていきます。

前回はguidEntityMapに着目しましたが、今回はrelationsに着目します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89512/a6a62e90-9e07-3d07-2b4c-8aeb460070d8.png)

relationsには各ノードの前後関係がfromEntityIdとtoEntityIdという形でGUIDで格納されています。
``` JSON
{
    "fromEntityId": "1e8307e9-24af-445b-a141-a4aa5ada48b4",
    "toEntityId": "1edd526e-95bf-4c99-84b7-d249e28abc3f",
    "relationshipId": "995e1e25-bfa1-4608-9fff-9733a38993a4",
    "source": "DataFactory"
},
{
    "fromEntityId": "1edd526e-95bf-4c99-84b7-d249e28abc3f",
    "toEntityId": "8e4efe1e-842a-42e6-a553-9f9d72d1b2d3",
    "relationshipId": "9c82f915-9c30-4532-9b9e-48d99c62e7d7",
    "source": "DataFactory"
},
```

## Lineageの表示（その2）
以下のコードでfromEntityIdとtoEntityId使って各ノードを繋げます。

``` python
lineage02 = Digraph(format="svg")
lineage02.attr('graph', rankdir="LR", compound="true")
lineage02.attr("node", fontname="Segoe UI")

for guid in response["guidEntityMap"]:
    lineage02.node(
        guid,
        shape="box",
        label=f'''
{guid}
{response["guidEntityMap"][guid]["attributes"]["name"]}
{response["guidEntityMap"][guid]["typeName"]}
        '''
    )

# relationの表示
for relation in response["relations"]:
    lineage02.edge(relation["fromEntityId"], relation["toEntityId"])

lineage02.render("lineage/02.gv")
SVG("lineage/02.gv.svg")
```

relationsを使って各ノードを繋げることができました。
見栄えは良くないですが、ノードの前後など再現できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89512/92e39a1e-a9f2-918f-1483-9e7c21f9387b.png)

PurviewでのLineage表示。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89512/dc7af3f1-839e-02ea-fd58-7cd1e67c8038.png)

## 次回
次回はカラムの情報を加えていきたいと思います。（予定）

* [Microsoft PurviewのLineageを外部に出力する（その1）](https://qiita.com/cannoteat/items/1bc23d6b8c2d4ede1794)
* この記事
* [Microsoft PurviewのLineageを外部に出力する（その3）](https://qiita.com/cannoteat/items/ba97cd3d57193a458d76)
Backlog記法でのページ内リンク記載方法

# 概要
備忘録。

# 目次
1. [結論](#Answer)
2. [参考文献](#reference)

<a id="#Answer"></a>
# 結論
1. 対象箇所を範囲選択
2. 右クリックし、選択箇所へのリンクをコピーを選択
![スクリーンショット 2022-11-02 18.20.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730977/6466ab3b-23cc-ee9c-57d7-82f5b33813d7.png)

3. [[Title>Link]]でLinkの箇所にペーストする

<a id="#reference"></a>
# 参考文献
- BacklogでURLの埋め込み方が記載されています。
  - [Backlog公式ドキュメント](https://backlog.com/ja/enterprise-help/userguide/userguide183/)
MySQLのWITH句を使ってみた

# はじめに
こちらの記事はMySqlに触れたことがあり、WITH句の初心者向けになります。
自身も使用したり、他の方が書かれたクエリを見たりしたときに「読みやすなー」と思ったので書かせていただきました。

# WITH句

[公式サイト：MySQL 8.0 リファレンスマニュアル  /  ...  /  WITH (共通テーブル式)](https://dev.mysql.com/doc/refman/8.0/ja/with.html)より
>WITH句はMySQL8.0の新機能です。
>WITH句は、単一ステートメントのスコープ内に存在し、あとでそのステートメント内で複数回参照できる名前付き一時結果セットです。

また、記事内でJOIN句なども使いますが、説明は割愛します。

```
WITH
  cte1 AS (SELECT a, b FROM table1),
  cte2 AS (SELECT c, d FROM table2)
SELECT b, d FROM cte1 JOIN cte2
WHERE cte1.a = cte2.c;
```
このような形で使えます。cte1は一度の指定で何度でも使えます。
計算を伴うクエリを書くとこのようなのもかけます。
```
WITH
  -- 女性のユーザー
  user_women AS (SELECT user_id FROM user WHERE sex = 1),
  -- 2022年09月以降に買い物をしたユーザー
  shopping_202209 AS (SELECT user_id FROM shopping WHERE date_ym >= '202209'),
  -- 2022年09月以降にアンケート1に答えたユーザー
  questionary AS (SELECT user_id FROM questionary_1 WHERE date_ym >= '202209'),
  -- 女性のユーザー数
  women AS (SELECT COUNT(DISTINCT user_id)　AS count_user FROM user WHERE sex = 1),
  -- 買い物をした女性ユーザー数
  user_shopping AS (SELECT COUNT(DISTINCT user_women.user_id) AS count_user FROM user_women 
           INNNER JOIN shopping_202209 ON user_women.user_id = shopping_202209.user_id),
  -- アンケートを答えた女性ユーザー数
  user_questionary AS (SELECT COUNT(DISTINCT user_women.user_id) AS count_user FROM user_women 
           INNNER JOIN questionary ON user_women.user_id = questionary.user_id),
  -- 買い物とアンケートをどちらもした女性ユーザー数
  user_shopping_questionary AS (SELECT COUNT(DISTINCT user_shopping.user_id) AS count_user FROM user_shopping 
           INNNER JOIN user_questionary ON user_shopping.user_id = user_questionary.user_id) 
-- 各ユーザ数と割合
SELECT 
w.count_user AS w_count, -- 女性のユーザー数
s.count_user AS w_count, -- 買い物をした女性ユーザー数
q.count_user AS w_count, -- アンケートを答えた女性ユーザー数
sq.count_user AS w_count, -- 買い物とアンケートをどちらもした女性ユーザー数
s.u_id * 100 DIV w.u_id AS s_ratio, -- 買い物をした女性ユーザー数の全体の割合
q.u_id * 100 DIV w.u_id AS q_ratio, -- アンケートを答えた女性ユーザー数の全体の割合
sq.u_id * 100 DIV w.u_id AS sq_ratio -- 買い物とアンケートをどちらもした女性ユーザー数の全体の割合
FROM women AS w
JOIN user_shopping AS s
JOIN user_questionary AS q
JOIN user_shopping_questionary AS sq;
```






# 終わりに
WITH句を使うことで可読性が向上するので、たくさんJOINがあるクエリなどにおすすめです。
また、WITH句はサブクエリやJOINと違い最初に仮想テーブルのようなもの作る仕様になりますので、メモリをサブクエリなどより使います。



こちらの方の記事でもメモリに負担がかかるがとありますが、大容量のデータを作りすぎるのはよくないかもしれないです。
[まずは蝋の翼から。WITH句かサブクエリか](https://knknkn.hatenablog.com/entry/2018/03/21/031231)＞パフォーマンス＞メモリ観点



MySQL8.0からしか使うことはできないですが、使える環境の方はぜひ使ってみてください。
「マーケティングの本質がわかる本」を読んで、社内で応用する方法を考えてみた

社内でマーケティンに関わることになったので、マーケティング界で有名な本を読んでみました。

## 著者
森岡毅さん
知名度も資金力も弱いのに、USJにディズニーランドよりも多くの人を集客できた方

## マーケティングとは
#### 商品、値段、場所、売り方をうまく掛け合わせて、自然と商品が売れる仕組みを作ること

近年マーケティングが重要視されるようになりました。
その理由は、簡単に技術・商品を真似できるようになったからです。
商品力が平均化されやすいので、売り方で勝負しないと競合他社に負けてしまいます。
世界的にみると、日本のものづくり技術は群を抜いていましたが、近年では技術が真似されてしまうようになったのでマーケティングを強める必要があります。



## マーケティングでコントロールするべき3点
#### お客さんの頭の中、商品の陳列、お客さんの体験

①お客さんの頭の中
まずは認知してもらい、その後好きになってもらう。
商品のイメージがお客さんの頭の中で出来上がっている状態までコントロールする。

②商品の陳列
お客さんが買いたいと思ったときに、罠のように商品が棚に並んでいる状態にする。
安ければ良いというものではなく、商品価値を示すことのできる値段設定にする。

③お客さんの体験
トライアルで良い商品・良いサービスを提供し、また買いたいと思わせる。
トライアル経由でお客さんを作るためには、リピーターと比較して5倍の費用が必要なので、リピーターを増やす戦略をとる。


## マーケティングで一番重要なのは？
#### お客さんは自分の潜在的は欲求に気づいていないので、これを突き止める

ターゲットと同じ生活・同じ体験をし、同じ目線を持って潜在的な欲望、恐怖、不安を突き止める必要があります。
著者である森岡毅さんは、USJのマーケティング戦略を練るために、ゲーム『ドラクエX』を7000時間プレイすることでお客さんの気持ちになったそうです。


## アプリ開発会社の私たちが応用するなら
株式会社やどかりには、案件を取ってくる営業職がありません。
これまではリピーターや紹介で案件を獲得していました。
しかし、会社の規模が大きくなってきた今、より多くの案件を獲得するために、マーケティングに力を入れています。

今回の本を通して、お客さんの気持ちになることの重要性を学びました。
私たちの「お客さん」は、ある程度規模のある会社の決裁者や社長です。


①決裁者のお悩みをとことん調べる
②解決に繋がるようなブログ記事を書いて、認知してもらう
③何度もやどかりブログに訪問してもらい、愛着を持ってもらう
④決裁者と接点を作り、アプリ開発がしたくなったときにアプローチする

以上のようなマーケティング戦略を考案中です。
マーケティング初心者なので、勉強しながら進めていきます。
UNIXのコマンドまとめ②

引き続きUnixについてなんとなく書いていこうと思います。

第2回は、Unixに関する基礎知識と簡単なコマンドについて書いていきます。
***
**基礎知識**
<ul>
    <li>ディレクトリ :ファイルを分類・管理するための概念であり、ファイルを格納する入れ物のこと。 「フォルダ」と同義</li>
    <li><code>/</code> : システム全体の最上位のディレクトリのこと。rootディレクトリ</li>
    <li>現在ログインしているユーザーのホームディレクトリは、<code>~</code>で表現される</li>
    <li>絶対パス : ルートディレクトリから目的のディレクトリまで全ての階層を表記する<br>
        例) <code>/home/userName</code> : 自分のホームディレクトリ</li>
    <li>相対パス：現在のディレクトリからの距離を表す<br>
        例）<code>../..</code> : 現在のディレクトリより２つ階層が上のディレクトリ</li>
</ul>
<br>

**コマンド**
<ul>
    <li><code>date</code> : 現在の日時(マシンに設定された時刻)を表示</li>
    <li><code>cal</code> : 今月のカレンダーを表示</li>
    <li><code><em></em>[controllキー] + c</code> : 現在のコマンドを実行せずに(中断)、新しいプロンプトに移る
    <li><code>[controllキー] + u</code> : コマンドのクリア
    <li><code>clear</code> or <code>[controllキー] + l</code> : 画面全体のクリア</li>
</ul>

<br>
<br>
以上
<br>
<br>
参考 : <a href="">https://www.pc-master.jp/words/directory.html</a>
ITパスポート合格体験記

<h1>はじめに</h1>
<p>2020年10月、ひょんなことからIT系の会社に入社することになった。</p>
基本情報は敷居が高く断念、まずはITパスポートからということで、勉強を始めた。
<p>もし今後、同じような迷える30代の方がIT業界へ飛び込もうというときの参考にでもなれば嬉しいです。</p>

<h1>当時のスペック</h1>
さて、ここで私の自己紹介。
<ul>
 <li>32歳♀</li>
 <li>前職営業。未経験入社</li>
 <li>IPアドレス、何それおいしいの？レベル</li>
 <li>転職回数5回？忘れたｗ</li>
 <li>SES企業入社</li>
 <li>とにかく覚えが悪い</li>
 <li>がちがちの文系</li>

 と、こんな感じ。

:::note info
未経験中の未経験レベル。よく私を採用してくれたな・・。
:::

<h1>使用教材</h1>
●YoutubeのITパスポート講座
<br>⇒秘密にしてたけど、実は入社前に受験し、ひっそりと不合格をもらっている。</br>
<br>合格したなら具体的な名前を出してもいが、今回はあえて名前は出しませんｗ</br>

<br><b>●過去問道場</b></br>
⇒テキストを一通り読んで、ずっとこればっかしてました。
とにかく問題量が多く収録されているので、これをやってれば間違いないと思います

<br><b>●いちばんやさしい ITパスポート 絶対合格の教科書＋出る順問題集</b></br>
⇒インプット用のテキスト。文とイラストがバランスよい。

:::note info
テキストは正直大差なし。とにかくアウトプットをしまくること。
:::


<h1>勉強記</h1>
まずは1か月くらいでテキストを一通り読み終えた。
<br>そこからは約2か月間、ひたすら過去問道場で問題を解く</br>
<br>このとき意識してたのは、間違えた問題はノートに書いて、覚えるところを覚えていた</br>
<br>twitterとかにもつぶやいて、イイネがもらえるのがただただ嬉しかったのを覚えているｗ</br>
<br>出発前と帰宅後とで合わせて1時間は勉強してたかと思います、ちなみに土日は結構休むタイプ</br>

<br>ちなみに不合格だったときは、、、</br>
1週間で流し読み後、まったく問題解かずに受験。
<br>あと5点たりずに不合格。。。</br>
<br>完全になめてかかってました。<br>

:::note info
やっぱりアウトプットだね～。なめてかかったらダメだよ。
:::






<h1>感想</h1>
合格したときは本当にうれしかった（なんせ2度目だったので・・）
<br>本当にスタートの資格だとは思うけど、やっとスタートラインに立った気もして自信をつけた</br>
<br>あんまりITパスポートは意味ないよっていう人もいるけど、私は勉強になったので取ってよかったと思ってる</br>

:::note alert
想定しているよりも難しい。未経験者なら勉強時間の確保は必須。
:::
Salesforce Winter’23 ロゴについて解説

Salesforceでは2022年10月16日ごろからWinter’23　のロゴに変更されました

今回はこちらのロゴについて紹介します

こちらの内容は動画でも公開しています

https://www.youtube.com/watch?v=_9teiUDa8Kc

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

まず、こちらのロゴについて紹介します



![ロゴ01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/386eb27f-94c7-2b19-0fbf-675b66b95ab0.png)


こちらのキャラクターの名前、皆さんご存じでしょうか

こちらのキャラクターはBrandy（ブランディ）といいます

　キツネをモチーフにしたMarketing Cloudのキャラクターのようですね

２０２１年に誕生しました

詳細はこちらの記事をご覧ください

https://www.salesforce.com/jp/blog/2021/08/meet-brandy-the-marketer.html



こちらのロゴは投票により決まったものです

https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000FUOcoSAH

https://www.salesforce.com/jp/blog/2021/08/meet-brandy-the-marketer.html

候補案は３案ありました

https://docs.google.com/forms/d/e/1FAIpQLSftW6lWfVf__sh7pzUh6L_9DimW0bAGBt6lTR3S1bRy7euJPA/viewform

Codey the Skater, Brandy the Shredder, and Appy with a Kite!

スケーターのコーディ、
スノーボードのブランディ、
凧あげのアッピィですね


2021年に登場したブランディですが古参のキャラクターを抑えロゴになったのは本当に素晴らしいですね

ブランディの人気の高さが分かります

なお、Winter ２３リリースの特長についてはこちらのTrailheadをご確認ください
https://trailhead.salesforce.com/ja/content/learn/modules/winter-23-release-highlights
最近よく見かけるbit.lyから始まるリンクはなんぞや？という話

 ## 調べようと思った背景
最近twitterのプロモーションなどでよく見かける「bit.ly」から始まるこのリンク。大きな企業でも使っているところがあるので気になって調べてみました。
気になりますよね？![IMG_162B3A81FB8D-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2318046/ee9e1bb2-e070-de69-5448-5698c0b0aa7a.jpeg)


## bittlyとは？
アメリカで発祥の短縮URLサービス。発行したURLは無期限で使える（2022年11月現在）。
短縮URLを発行したり、発行したURLからどれくらいアクセスされたのかがわかる。

例えば以下のような使い道がありますね。
・そのまま貼り付けてしまうとURLが長すぎて文字数制限に引っかかってしまう。
・どのSNSから該当のページにアクセスされたのか知りたい。
・商品をいろんな人に宣伝してもらった時、誰からのアクセスが多いか知りたい。

他にもアイディア次第で色々な使い方ができるのではないかと思います。

## 無料の範囲でできること

・短縮URLの発行
・作成したURLからどれくらいアクセスがあったかを確認（要サインイン）

## 有料にするとできること
・解析したアクセス数のエクスポートができる
・ドメインを作成できるようになる
・QRコードの作成が可能になる
・カスタマーサポートが受けれるようになる
など。

## 注意点

・サインインしてURLを発行しないとアクセス解析はできない
・全て英語のサイトである（google翻訳で訳して仕舞えばさほど問題ではない）
・個人で利用する場合、怪しいURLだと思われて逆にアクセスされない場合がある
・bit.ly自体のセキュリティは安全だが、その先のサイトは危険なことがある。
・bit.lyのURLがスパム認定されている場合、弾かれてしまう（有料版でドメインを設定した場合は問題なし）

この点を考えると、個人で使用する場合はある程度のリスクを承知で利用するか、信頼する個人同士で使うのが安全のようですね。

参考：
https://soundorbis.com/bitly/
※bitlyの利用方法も解説してあります。

## おまけ

有料版でのドメイン設定を解説してくださっているサイトを見つけましたので、貼っておきます。
https://asumeru.net/bitly
はじめてのZoom Marketplaceでの開示について

<h2>■ 前置き</h2>
ユーザの保持しているZoomの権限(ライセンス)を第三者の提供するプラットフォームを介して利用する場合には必ずZoomが定義するOAuthの実装を前提にZoomが提供するMarketplaceへの申請承認を事前に済ませる必要があります。<br><br>

<I>補足）審査、承認は全て本社にて実施させていただく関係上ご準備いただく資料やドキュメントは英文のみの受付となります。尚、申請後、一次回答まで約2-4週間程度かかり、US側の担当より直接ご連絡させていただきます。</I>

<h2>■ 実装する際の注意事項</h2>
　ZoomではAPIをご利用いただく際に必要となる認証トークン(access_token)の発行方法として大きく分けて３つの形態があります。<br>
　第三者の提供するプラットフォームを既存のZoomユーザへご利用いただくにはOAuthの実装が必要となります。
Server to Server OAuth は、管理者がWebポータルからアカウントの管理、操作をする意図と同等の目的で用意されており、社内利用もしくは個人利用のみにご活用いただけます。第三者により提供されるプラットフォームを社外のユーザが利用する際にはServer to Serevr OAuthはご利用いただけませんので<font color="red">必ずOAuthで実装し申請承認</font>を済ませるようにしましょう。

![スクリーンショット 2022-11-02 16.55.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2123842/44f87a02-8680-4fe5-6efc-a965362cff00.png)

<h2>■ OAuthの実装について</h2>

申請は、https://marketplace.zoom.us/develop/create よりOAuthの登録する中で必要要件をクリアしていることを確認いただき申請ボタンを押下することでリクエストいただけます。

概要：　https://marketplace.zoom.us/docs/guides/publishing/
申請について：　https://marketplace.zoom.us/docs/guides/publishing/app-submission/

申請を前提として進めるには、OAuthの登録の際<b>「Would you like to publish this app on Zoom App Markteplace」</b>を有効にするようにします。

![スクリーンショット 2022-11-02 16.55.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2123842/96e68f2b-055a-8595-bc3d-0554e3eb02df.png)

OAuthのシーケンスは下記のスクリーンショットの通りとなります。

![スクリーンショット 2022-11-02 16.57.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2123842/581acc9e-7aac-2492-f2a8-147f21100653.png)

![スクリーンショット 2022-11-02 16.57.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2123842/bfd38dd4-e53e-82c4-c2f6-23b61949efa5.png)

実装のサンプル：https://github.com/ysawamura-zoom/Workshop/tree/main/OAuth

<h2>■ Marketplaceへの登録について</h2>

以下、申請に必要なドキュメント類や注意事項がまとめられています。事前に熟読いただくことを推奨いたします。
https://marketplace.zoom.us/docs/guides/

![スクリーンショット 2022-11-02 16.57.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2123842/7d397fcc-3779-967a-b41b-ffc77885fb7a.png)
[FastAPI]レスポンスのキーに日本語を使う方法[Pydantic]

## FastAPIは日本語に対応しているが一工夫すると吉

まず、下記の様なレスポンスは何の問題も無く動作する。

```python
from fastapi import FastAPI

app = FastAPI()
@app.get("/jp")
def jp():
    return {"こんにちは": "hello"}
```

しかし、FastAPIの大きな利点であるPydanticを使った型バリデーション及び自動型変換を使用すると日本語が使えなくなる。
下記例ではPydanticオブジェクトのクラス変数名がレスポンスの鍵になるので英語になってしまう。もちろん日本語を変数名に使用することはできない。

```python
from pydantic import BaseModel, Field

class JP2ENG(BaseModel):
    message: str = Field(...)


@app.get("/jp", response_model=JP2ENG)
def jp():
    return {"message": "hello"} # JP#ENGクラスに変換され型チェックとキャストをしてくれる。
```

## どうするか

`Field()`オブジェクトのalias機能を使用する。

```python
class JP2ENG(BaseModel):
    message: str = Field(..., alias="こんにちは")


@app.get("/jp", response_model=JP2ENG)
def jp():
    return {"こんにちは": "hello"}
```

こうすることでPydanticの機能を維持しつつ日本語を返すことができる。
データサイエンス数学ストラテジスト上級を取得した

## これはどんな資格なのか
- 経済産業省の「MDASH SUPPORTER」に「数理・データサイエンス・AI教育プログラム」を支援する団体として認定されている日本数学検定協会の資格。
- データサイエンスの基盤となる数学スキル、リテラシーを学び、その理解度・習熟度を測定することで、データサイエンスにおける数学を扱う技能を認定する資格（Webサイトより引用）

https://www.mathdatascience.jp/personal/

### 個人的な所管
- データサイエンスに必要な最低限の数学の知識を問うている気がする。
  - 「（データアナリストではなく）データサイエンティストになるにはこの程度の数学的知識は最低限必要だよ」、という感じ。
    - とは言え、統計学についてはあまり触れられていないので、そこは別で補完する必要がある。
  - 初級がなく、いきなり中級と上級しかない、初心者お断りの勇者仕様。


## 筆者のスペック
- 偏差値50代の私立大の理工学部数学科卒。
- 10年以上SIer業界に従事。

## なぜ取ろうと思ったのか
- IT業界に従事する数学科卒としては倒さないといけないと思った。
  -  故に妥協せずに上級を取った。
  - 数学科卒で中級止まりは恥と思った。
- 「データサイエンス数学ストラテジスト」という文言をカッコいいと単純に思った。
  - 俗に言う中二病。
    - でも、だからこそ個人的な満足度は非常に高かった。
- 俗にいう「データサイエンス、データアナリシス、機械学習に必要な数学」と言われているモノが何なのか、を大まかにでも知りたいと思った。

## 勉強方法
- 公式の問題集を3周した。
  - 一周目：解答、解説を見ながら解いてみる
  - 二周目：解答、解説を見ずに解いてみる
  - 三周目：間違えた問題を復習

https://www.amazon.co.jp/dp/4296109898

- 数学科あるあるだとは思うが、かなりの解説や公式が省略されている。
  - 途中の式や考え方を自分で考えられる程度の数学の力量は必要。
- 実際の試験も含めて、元々の数学の素養がかなり問われる。
  - 大学初等程度、つまり教養数学レベルの知識がない場合、この問題集だけで合格を勝ち取るのは難しい気がする。。。
- なお、誤植がかなりあるので、[正誤表](https://www.su-gaku.biz/book/pdf/book_teisei_mdss_high.pdf)は必ず参照。

## 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953203/ca824987-aee1-e65a-8781-cb24fe1cc461.png)

- 無事に合格した。
  - 数学科卒の面目躍如。
    - と、言いつつダブルスターなのか。
    - トリプルスターは取り逃した。。。

## 雑感
- 公式サイトに出ている例題は全く難易度的にあてにならない。特に上級。上級は完全に罠。
  - 三角関数の倍角、半角、積和、和積の公式は当然として、多変数関数（偏微分・重積分）、計量線形空間、回帰分析、相関係数あたりを使いこなせないと厳しい。
    - マクローリン展開をして四次導関数を求める、行列の合成変換、漸化式を活用した定積分を部分分数して解くとか、学生以来。
    - 干支で一回り以上前に大学を卒業したのにも関わらず意外と覚えていた。
- 自身は数学科卒なので、合格するだけならそれが有利であったように感じる。
  - それでも実際の試験は問題集とはかけ離れて難しかったので学生時代に数学に取り組んでいなかったらおそらく合格は難しかったと感じる。
    - 次はトリプルスターを目指しましょう！とか書かれたけど、目指そうとはとても思えない難しさ。
  - 正直、文系の方や数学3, C及び高校の過程で行列が外されたいた時代の方々はかなり苦難の道のりを強いられるのではないかと思う。
    - 教育課程を知らないので断言はできないが。
- 合格率を少しでも高めるコツ
  - 表計算ソフトの使用が可能なので、公式問題集を解く過程で使用する関数などは予め頭に叩き込んでおく。
    - 関数によっては最終的には単純な四則演算に落ちる事があるが、それでも関数を使いこなせた方がよい。
    - 私はアプリ版のExcelを使用した。Google Calcだと故意か過失かは別にしてブラウザがフリーズ、落としてしまう可能性があるので。
  - 解法が分からない問題が出ても諦めずに回答の選択肢から逆算、あてはめて計算することで導けることがある。
- openbadgeは試験を申し込んだメールアドレスにお知らせが合格後、しばらくたってから届くので見逃さないように。
  - せっかくの合格を無駄にしてはならない。
  - そしてマイニングでブロックチェーンに書き込まれるが、これもまた更に数日（2, 3日）かかる。
【Electron】Bootstrap4を使用する際、jQueryの読み込み位置のミスの解決方法-備忘録

# 目的
 Electronでデスクトップアプリを作成する際に、Bootstrap4を使用して綺麗なデスクトップアプリを作成する。

# 準備
### BootStrapのインストール
```bash
npm install bootstrap@4.0.0-beta
```
### jQueryのインストール
```bash
npm install jquery
```
### Popper.jsのインストール
```bash
npm install popper.js
```
# 陥ったミス
###  ソースコード
```html
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="utf-8">
    <title>test</title>
     <meta http-equiv="Content-Security-Policy"
         content="script-src 'unsafe-inline' 'self';default-src 'self'; style-src 'self' 'unsafe-inline';" />
    <link rel="stylesheet" href="./node_modules/bootstrap/dist/css/bootstrap.min.css">
     
</head>

<body>

	   <script src="./node_modules/jquery/dist/jquery.slim.min.js"></script>
       <script src="./node_modules/popper.js/dist/umd/popper.min.js"></script>
       <script src="./node_modules/bootstrap/dist/js/bootstrap.min.js"></script>
 </body>
</html>
```
### エラーメッセージ
デベロッパーツールに下記のメッセージが表示された。
下記のメッセージを日本語訳にすると、どうやら、jQueryを上部に持ってこないといけないらしい。

>Uncaught Error: Bootstrap's JavaScript requires jQuery. jQuery must be included >before Bootstrap's JavaScript.
>at bootstrap.min.js:6

# 解決方法
解決方法として、

```html
    <script src="./node_modules/jquery/dist/jquery.slim.min.js"></script>
```

のコードを　```<head>```タグ内に移動させるだけの単純な作業で解決。

### ソースコード
```html
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="utf-8">
    <title>test</title>
     <meta http-equiv="Content-Security-Policy"
         content="script-src 'unsafe-inline' 'self';default-src 'self'; style-src 'self' 'unsafe-inline';" />
    <link rel="stylesheet" href="./node_modules/bootstrap/dist/css/bootstrap.min.css">
      <script src="./node_modules/jquery/dist/jquery.slim.min.js"></script>
     
</head>

<body>

	 
       <script src="./node_modules/popper.js/dist/umd/popper.min.js"></script>
       <script src="./node_modules/bootstrap/dist/js/bootstrap.min.js"></script>
 </body>
</html>
```
# 終わりに
　エラーメッセージの内容をしっかりと確認していなかったのが、悩ませる大きな原因でした。
chef/knife を使ってリモートホストにrbenv をインストールして ruby2.7.6を使えるようにする

ここでのプロビジョン対象は vagrant で起動した almalinux/9

* ip address 10.0.2.15 / 192.168.56.11
* ssh 10.0.2.15:2200 / 192.168.56.11:22
* user vagrant

## ディレクトリ構成

```
(作業ディレクトリ)/
    clients/
    cookbooks/
    nodes/
    site-cookbooks/
    Berksfile
    config.rb
```

## config.rb

```
local_mode true
chef_repo_path   File.expand_path('../' , __FILE__)
cookbook_path    [ 
  File.expand_path('../cookbooks' , __FILE__), 
  File.expand_path('../site-cookbooks' , __FILE__)
]

knife[:ssh_attribute] = "almaserver"
knife[:use_sudo] = true
knife[:listen] = true

knife[:automatic_attribute_whitelist] = %w[
    fqdn
    os
    os_version
    hostname
    ipaddress
    roles
    recipes
    ipaddress
    platform
    platform_version
    cloud
    cloud_v2
    chef_packages
]
```

## ~/.ssh/config


## 準備

```
knife zero bootstrap almaserver --node-name almaserver --ssh-user vagrant --sudo -z
knife node run_list add almaserver rails
```

## レシピ

ruby インストールのためのレシピを作る

```
mkdir site-cookbooks
cd site-cookbooks
chef generate cookbook ruby
```

site-cookbooks/ruby/recipe/default.rb にレシピを記述する

```ruby
global_version = '2.7.6'
#
# Cookbook:: rails
# Recipe:: default
#
# Copyright:: 2022, The Authors, All Rights Reserved.


%w[
    git 
    gcc 
    gcc-c++ 
    openssl-devel 
    readline-devel
    patch
  ].each do |pkg|
    package "#{pkg}" do
      action :install
    end
end


directory "/usr/local/rbenv" do
    recursive true
    action :delete
end

execute "install-rbenv" do
    command "git clone https://github.com/sstephenson/rbenv.git /usr/local/rbenv"
end
execute "install-ruby-build" do
    command "git clone https://github.com/sstephenson/ruby-build.git /usr/local/rbenv/plugins/ruby-build"
end


cookbook_file '/etc/sudoers.d/rbenv' do
    source 'rbenv'
    owner 'root'
    group 'root'
    mode '0644'
    action :create
end
cookbook_file '/etc/profile.d/rbenv.sh' do
    source 'rbenv.sh'
    owner 'root'
    group 'root'
    mode '0644'
    action :create
end

execute "install-ruby" do
    command "rbenv init -;rbenv install 2.7.6;rbenv rehash;rbenv global 2.7.6"
end
```

## プロビジョン実行

nodes/almaserver.json が以下のように作成されているので プロビジョン実行時にポートを指定する

```json
  "automatic": {
    "fqdn": "localhost",
    "os": "linux",
    "os_version": "5.14.0-70.26.1.el9_0.x86_64",
    "hostname": "localhost",
    "ipaddress": "10.0.2.15",
    ....
```

これは private address を追加して 192.168.56.11 と デフォルトで設定される 10.0.2.15 が混在しているから？
普通のリモートホストだと指定の ip address がそのまま使えるはず(ルーター機能とか使っている場合はデバイスが複数作られるはずなので注意)

実行

```
knife zero converge "name:almaserver" --ssh-user vagrant --sudo  -z -p 2200
```

## その他

ansible は残念ながら windows で実行できない(windows の構成は可能っぽい)ので他の自動プロビジョニングツールを使う事になるけどここでは chef workstation(旧chefdk) によってインストールされる chef, knife を使う
C# で オブジェクトのリストを JSON シリアライズする例

# コード例

```c#
using System.Text.Json;

public class Item
{
    public List<int> NumberList { get; private set; } = new List<int>();
}

public class Program
{
    public static void Main()
    {
        var item= new Item(){};

        item.NumberList.Add(0);
        item.NumberList.Add(1);
        item.NumberList.Add(2);
        item.NumberList.Add(3);

        string json = JsonSerializer.Serialize(item);

        Console.WriteLine(json);

    }
}
```

# 結果

```json
{"NumberList":[0,1,2,3]}
```


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
🔰JS初心者が作るGoogle extension V3 ⑥ -タイマー作動中の有無で表示する画面の処理-

前回の続き　→ [🔰JS初心者が作るGoogle extension V3 ⑤ -スタート/ストップ/リセットの各ボタン機能-](https://qiita.com/mmaumtjgj/items/d15df85bcb9dcf31d87d)

完成した作品は　→　[こちら🐕](https://chrome.google.com/webstore/detail/%E3%83%9D%E3%83%A1%E3%83%89%E3%83%BC%E3%83%AD/nfmmdehbjbenlngbihdhheccephmdfco)

## タイマー作動中の有無で表示する画面の処理
popupの画面が閉じても、タイマーが継続中なのか、一時停止しているのかによって表示する画面を切り替える。

```popup.js
chrome.storage.local.get(['timerStatus','btnStatus'], function(v) {
    if(v.timerStatus == true){
        timer_display();
        if(v.btnStatus == "start"){
            start();
        }else if(v.btnStatus == "stop"){
            stop();
        }

        startBtn.onclick = function() {
            start();
        };
        
        stopBtn.onclick = function() {
            stop();
        };
        
        resetBtn.onclick = function() {
            reset();
        };
    }else if(v.timerStatus == false){
        chrome.runtime.sendMessage({switch: "reset"});
    }
});
```

popup.jsの全体像は以下
```popup.js

//色々定義
const ~~
let ~~
//がいっぱい

//タブの切り替え
document.addEventListener('DOMContentLoaded', function(){省略}, false);

//「タイマーを設定する▷」を押した時
makeTimerBtn.onclick = function() {省略};

//フォームから時間内容を取得
function get_timer_form(){省略}

//タイマーを作成したら、タイマーとボタンを表示
function timer_display(){省略}

function start() {
    途中まで省略
    popup_pomodoro_timer()
};

function stop() {省略};

function reset() {省略};
```
以前飛ばした``popup_pomodoro_timer()``について細かく見ていく。

## backgroundの実装
本来popup.jsでタイマー機能を搭載しようとしたが、popup画面を閉じると、タイマーが裏で動いてくれないとのこと。
backgroundであれば常に後ろで動いてくれるので、分けて実装を行なった。

popup.js → タイマーのview担当
background.js　→ タイマーのカウントなどの中身の担当

として大まかにわけている。
start()内にある``popup_pomodoro_timer()``は
bgで毎秒ずつ減らしているのを、popupで表示するために、bgから値を取ってきて表示するための関数。

なので``popup_pomodoro_timer()``を実装する前に、bgにてタイマーの中身を実装しなければ``popup_pomodoro_timer()``を導入できないので後に実装していく。

## 拡張機能の記事リンク
[🔰JS初心者が作るGoogle extension V3 ①](https://qiita.com/mmaumtjgj/items/6538fd8814d93e9d7fa6)
[🔰JS初心者が作るGoogle extension V3 ② -popup.htmlの作成-](https://qiita.com/mmaumtjgj/items/ef7bf1116988bfeedd84)
[🔰JS初心者が作るGoogle extension V3 ③ -タブの切り替えの処理-](https://qiita.com/mmaumtjgj/items/0a9e73058727b101579b)
[🔰JS初心者が作るGoogle extension V3 ④ -タイマーを表示させる-](https://qiita.com/mmaumtjgj/items/6e1a978656580dab59d7)
[🔰JS初心者が作るGoogle extension V3 ⑤ -スタート/ストップ/リセットの各ボタン機能-](https://qiita.com/mmaumtjgj/items/d15df85bcb9dcf31d87d)
[🔰JS初心者が作るGoogle extension V3 ⑥ -タイマー作動中の有無で表示する画面の処理-](https://qiita.com/mmaumtjgj/items/d8083ac9576ea9dbe123)
[🔰JS初心者が作るGoogle extension V3 ⑦ -初インストール時の処理/５分間の再接続処理-](https://qiita.com/mmaumtjgj/items/abd7f4f3f63624dec6f9)
[🔰JS初心者が作るGoogle extension V3 ⑧ -start/stop/reset押した時の挙動-](https://qiita.com/mmaumtjgj/items/6b638388e7c39b2863f4)
[🔰JS初心者が作るGoogle extension V3 ⑨ -ポモドーロタイマーの処理-](https://qiita.com/mmaumtjgj/items/2c2e117d31db69adb825)
[🔰JS初心者が作るGoogle extension V3 ⑩ -popupのポモドーロタイマーの処理-](https://qiita.com/mmaumtjgj/items/5e80fa8fca2fa51b7445)
[🔰JS初心者が作るGoogle extension V3 ⑪ -content.jsの処理-](https://qiita.com/mmaumtjgj/items/cae1ae8e2869e8414567)
ソフトウェアの著作権と開発・構成管理

# 開発環境管理
効率的に開発を進めるためには、開発環境の整備が必要となります。開発に```必要なハードウェア```や```ソフトウェア```、```ネットワーク```を実際に動作する環境に応じて用意したり、```開発ツールを充実```させることで、```効率化や品質向上```に繋がる。

### 開発環境稼働状況管理
```コンピュータ資源```、```開発支援ツールなどの開発環境```を整備し、資源の稼働状況を管理する。

### 設計データ管理
システム設計に関わる、様々な```設計データのバージョン管理```、それらデータの```共有管理```、```安全対策```を行う。企業機密や個人情報が含まれている場合には、```持ち出しの管理```、```不正持ち出しや改ざんなどの管理```を行う必要がある。

### ツール管理
開発に利用するソフトウェアや開発ツールの種類、バージョンを管理。これらは社内外に関わらず統一することで、```互換性```、```セキュリティホールによる影響```を防げる。

### ライセンス管理
開発にかかわるソフトウェアについて、```ライセンス数や適用範囲などを確認```しておく。

### クロスライセンス契約
企業間で```お互いに保有する著作権や特許権を許諾し合う形の契約```。
取り決めにより費用を発生させない場合もある。```包括的な特許クロスライセンス```は、さらに進めた形で、```より範囲を広げ、分野ごとに交わす```クロスライセンスである。

# 構成管理・変更管理
システムを構成するハードウェアやソフトウェア、データベース、ドキュメントなどは、使用期間中に```何度も変更や更新```が行われる。そこで```最新バージョンを把握し、更新履歴を記録```しておくことが重要。

### 構成管理
ハードウェアの```台数```や```設置場所```、```ソフトウェアのライセンスなどの情報資源```を管理

### 変更管理
基準となる構成を決め、```品目の完全性を確保```したうえで```変更計画を策定し、管理```を行う。

### リリース管理
構成品目の完全性が保証されたものについて、```ソフトウェアや関連文書のリリース```を行い、```バージョン管理と保管期間の管理```を行う。

#### 完全性とは？
データを最新かつ正しい状態で維持すること
出典 https://www.idcf.jp/words/integrity.html#:~:text=%E5%AE%8C%E5%85%A8%E6%80%A7%EF%BC%88Integrity%EF%BC%89%E3%81%A8%E3%81%AF,%E3%81%AB%E3%82%82%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8
Route53で大量にエイリアスコードを登録したいならcli使お

# はじめに
20レコード程度でしたが、ALBを参照するドメインのAレコード（エイリアス）を作成する必要がありました。
「ゾーンファイルをインポート」で色々頑張っても頑張れなかったので別の方法で対応したので、備忘録を残します。

# 方法
1. [cli53](https://github.com/barnybug/cli53)というツールをインストール（バイナリファイルをダウンロードして実行権限付与してPATH通ってるところに置くだけ）
1. rrcreateコマンドでインポート ※ <> で囲っている部分は適宜変更
```shell
cli53 rrcreate <対象ドメイン> '<サブドメイン> 86400 AWS ALIAS A dualstack-<ALBのDNS> <ALBのホストゾーン> true'
```
このコマンドをベースにShellを組むなりすれば手間なくレコード追加できる！
Platform Events Basics > Subscribe to Platform Events


[Subscribe to Platform Events](https://trailhead.salesforce.com/content/learn/modules/platform_events_basics/platform_events_subscribe)

# Publishing an Order_Event__e did not create the associated task successfully.Please check your trigger and event.

正直回避策はよく理解できませんでしたね。

+ [Order_Event__e not creating the task successfully](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000FR2lFSAT)
+ [【解決】Can anyone please help me out with this issue?](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000JeVUk)

+ [Issue with "Subscribe to Platform Events" Challenge in the Define and Publish Platform Events Trailhead](https://salesforce.stackexchange.com/questions/189683/issue-with-subscribe-to-platform-events-challenge-in-the-define-and-publish-pl)

チェックロジックのハッキング方法が紹介されています。
結果的には

これがわかったので、できることは 2 つあります。

+ 検証を実行する前に、「出荷された注文 105 のフォローアップ」という件名でタスクを作成します。
+ プラットフォーム イベントをさらにデバッグして、これらの要件を満たしていない理由を突き止めます。

:::note
エラーが発生した場合の別の解決策は、プラットフォーム イベントのフィールド タイプを確認することです。
IsShipped はチェックボックス フィールドである必要があります。注文番号はテキスト フィールドである必要があります。
注文番号フィールドがテキストではなく数値タイプだったため、「Event_Order__e イベントを発行できません」というエラーが発生しました。
:::
【yarn】package.json: No license fieldの対処方法

<h2>症状</h2>
Dockerでyarnを実行したとき、下記のwarnが表示されました。

```docker:warn
app-1  |  yarn run v1.22.19
app-1  | warning package.json: No license field
```

```terminal:yarnバージョン
yarn -v    
1.22.11
```

<h2>解決策</h2>
package.jsonに下記を追加して、再配布を許可しない指定をしたら、warnが出なくなりました。

```package.json
  "license": "UNLICENSED"
```

<h2>参考</h2>

https://cpoint-lab.co.jp/article/202104/19606/

https://qiita.com/kozakura16/items/ebaf8ea58fc49dcbdd73
長い数式を折り返す方法の個人的最適解


調べると色々な人が色々な解決策を書いていますが、できるだけシンプルで、汎用性の高い方法を手短に知りたいという人向け。


# 結論

- mathtoolsパッケージを読み込んで、align環境の中で「複数行に分けたい式だけ」splitを使おう。
  - &で行の整列が可能。split環境の中では&が一つしか使えないので、&を複数使いたいなら代わりにalignedを使おう
  - split環境中は式番号が1つしかつかない
- 行を跨ぐ括弧の大きさを揃えるのは、自動でやってもらうよりも手動でやる方が楽。そのためのコマンドを作っておこう。
  - 調べると\left\{ aaa \right. がよく推奨されているが、これよりも楽
- \exp{} や \log{}の中で改行したい時は厄介。bigサイズの括弧なら何も気にする必要はないが、通常サイズの括弧の時、\log \\{　　\\\\　　\\ }とするとエラーになる。代わりに\lparen、\lbrace、\lbrack、\rparen、\rbrace、\rbrackを使おう。
- multline環境を使わない欠点として、数式の最終行を左端に配置することができない。代わりに\hspace{50pt}などと手動で調整しよう。(いい方法があれば教えてください)


# シンプルなサンプル
~~~latex
\documentclass{jarticle}

\usepackage{amsmath}
\usepackage{mathtools}

\newcommand{\BigParen}[1]{\Bigl(#1\Bigr)}
\newcommand{\Bigbrace}[1]{\Bigl\{#1\Bigr\}}
\newcommand{\Bigbracket}[1]{\Bigl[#1\Bigr]}

\newcommand{\BiggParen}[1]{\Biggl(#1\Biggr)}
\newcommand{\Biggbrace}[1]{\Biggl\{#1\Biggr\}}
\newcommand{\Biggbracket}[1]{\Biggl[#1\Biggr]}

\begin{document}
    
    \begin{align}
      \begin{split}
        &p(a,b,c,d,e,f) \\
       \propto & \exp \Biggbracket{ \log \lparen  abcdef \Bigbrace{ abcdef \\
        &+abcdef} \rparen -abcdef }
      \end{split}
      \\
      =& abcdef
    \end{align}
    
\end{document}
~~~

## 結果

![スクリーンショット 2022-11-02 16.27.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607007/b77a7767-147f-1370-11ba-01f89d399aad.png)


# 参考文献
https://qiita.com/Yarakashi_Kikohshi/items/d63790597d260a86dd4a#-split-%E7%92%B0%E5%A2%83

 https://qiita.com/Yarakashi_Kikohshi/items/3be42ed1985892e03c95
SSH コンフィグを追加した (Session Manager 経由で SSH する)

## Session Manager 経由で SSH する設定をしてみたけど

さすがに，`ssh i-xxx` みたいなログインをしたくない

```ssh:.ssh/config
# SSH over Session Manager
host i-* mi-*
    ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
```

## 追加した

たまたまホスト名がプレフィックス付いていたのでグルーピングした

```ssh:.ssh/config
host prefix-aaa
    (snip)

host prefix-bbb
    (snip)

# SSH over Session Manager
host i-* mi-* prefix-*
    ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
```

## Refs

- [Session Manager で SSH/SCPをトンネリングしてEC2に接続する - Qiita](https://qiita.com/hayao_k/items/78b5bfe030ad8a053e93#%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E5%81%B4%E3%81%AE%E8%A6%81%E4%BB%B6)
【Terraform】Backend の切り替え方法とは？

## はじめに
業務で `terraform import` を実施する機会があり、検証のために Backend を S3 → local に切り替える機会があったので記事としてアウトプットしたいと思います。

## S3 → local に変更する場合

### 1.backend を一時的に local に切り替える。
`backend.tf` や `terraform.tf` 等、backend先が記述されているファイルを以下のように修正する。

```terraform
terraform {
#  backend "s3" {
#    bucket = "mybucket"
#    key    = "path/to/my/key"
#    region = "ap-northeast-1"
#  }
   backend "local" {
     path   = "terraform.tfstate"
   }
}
```

### 2.`terraform init -migrate-state` を実行する。
以下コマンドを実行すると、S3 に保存されている backend(stateファイル) が local にコピーされる。
(`-migrate-state` は、 backend をコピーするためのオプション)

```zsh:コマンド
terraform init -migrate-state
```

s3 → local に backend をコピーするかどうか確認されるので、 `yes` と入力する。

```zsh:実行例
% terraform init -migrate-state
Initializing modules...

Initializing the backend...
Terraform detected that the backend type changed from "s3" to "local".

Do you want to copy existing state to the new backend?
  Pre-existing state was found while migrating the previous "s3" backend to the
  newly configured "local" backend. No existing state was found in the newly
  configured "local" backend. Do you want to copy this state to the new "local"
  backend? Enter "yes" to copy and "no" to start with an empty state.

  Enter a value: yes ← ここで yes と入力

Successfully configured the backend "local"! Terraform will automatically
use this backend unless the backend configuration changes.

〜〜〜長いので省略〜〜〜
%
```

## local → S3 に戻す場合

### 1.backend を local → S3 に戻す。
`backend.tf` や `terraform.tf` 等、backendが記述されているファイルを修正する。
local の記述を削除する。

```terraform
terraform {
  backend "s3" {
    bucket = "mybucket"
    key    = "path/to/my/key"
    region = "ap-northeast-1"
  }
}
```

### 2.`terraform init -reconfigure` を実行する。
以下コマンドを実行し、backend を local → S3 に戻す。
(local の設定を S3 にコピーしないようにするために `-reconfigure` を使用する。)

```zsh:コマンド
terraform init -reconfigure
```

```zsh:実行例
% terraform init -reconfigure
Initializing modules...

Initializing the backend...

Successfully configured the backend "s3"! Terraform will automatically
use this backend unless the backend configuration changes.

〜〜〜長いので省略〜〜〜
%
```

### 3.ローカルに保存されている `terraform.tfstate` 等のファイルを削除する。
`terraform init -migrate-state` 実行後に作成されたファイルになります。

```zsh:ファイルの例
terraform.tfstate
terraform.tfstate.1666956416.backup
terraform.tfstate.backup
```

## 参考
https://developer.hashicorp.com/terraform/language/settings/backends/s3

https://developer.hashicorp.com/terraform/cli/commands/init
cobraでヘルプをグループ化する機能が追加されたので試してみる

### 目的

cobraでヘルプをグループ化する機能が追加されたので試してみる

### 環境

- spf13/cobra 1.6以上
- go言語 バージョン 1.19

### グループ化してみる

コマンドにグループを追加する。追加順にグループが表示されます。
```golang
	rootCmd.AddGroup(&cobra.Group{ID: "group1", Title: "group1"})
	rootCmd.AddGroup(&cobra.Group{ID: "group2", Title: "group2"})
```

グループ化したいサブコマンドにグループIDを付与する
```golang
var subCmd1 = &cobra.Command{
	Use:     "sub1",
	Long:    "sub1 command",
	GroupID: "group1",
}
```

helpやcompletionをグループに含めるには`SetHelpCommandGroupID`と`SetCompletionCommandGroupID`を使う
※rootコマンドのみ設定が必要
```golang
    rootCmd.SetHelpCommandGroupID("group1")
	rootCmd.SetCompletionCommandGroupID("group1")
```

### 実際に動かしてみる
サンプルコードは以下
```golang
package main

import (
	"github.com/spf13/cobra"
)

var rootCmd = &cobra.Command{
	Use: "root",
}

var subCmd1 = &cobra.Command{
	Use:     "sub1",
	Short:   "sub1 command",
	GroupID: "group1",
	Run:     func(cmd *cobra.Command, args []string) {},
}

var subCmd2 = &cobra.Command{
	Use:     "sub2",
	Short:   "sub2 command",
	GroupID: "group2",
	Run:     func(cmd *cobra.Command, args []string) {},
}

func init() {
	rootCmd.AddGroup(&cobra.Group{ID: "group1", Title: "group1"})
	rootCmd.AddGroup(&cobra.Group{ID: "group2", Title: "group2"})

	rootCmd.SetHelpCommandGroupID("group1")
	rootCmd.SetCompletionCommandGroupID("group1")

	rootCmd.AddCommand(subCmd1)
	rootCmd.AddCommand(subCmd2)
}

func main() {
	rootCmd.Execute()
}

```

実行した結果は以下
```sh
$ go run test.go -h
Usage:
  root [command]

group1
  completion  Generate the autocompletion script for the specified shell
  help        Help about any command
  sub1        sub1 command

group2
  sub2        sub2 command

Flags:
  -h, --help   help for root

Use "root [command] --help" for more information about a command.
```

### 参考資料
https://github.com/spf13/cobra
https://github.com/spf13/cobra/pull/1003
Render.com無料プランのスリープ対策

# はじめに
Render.comのWebサービスの無料プランでは非アクティブな状態が15分間続くとサービスがスリープし、スリープ状態のWebサービスに新しいリクエストが来ると起動します。簡単にスリープ状態になる上に、起動に結構時間がかかるのでユーザ体験的によろしくないです。
本記事ではこの制限の対策方法を説明します。

# 対策
Herokuでもこのような制限があり[^1]、定期的にレスポンスをWebサービスに送ることで対策していました。Render.comでも同様の方法で対策できるためその方法を解説します。
本記事では定期的なレスポンスを送るために[UptimeRobot](https://uptimerobot.com/)というサービスを利用します。

## 注意
Render.comの無料プランでは750時間/月の実行時間制限があります。
1つのサービスのみ運用している場合であれば本記事で紹介する方法を利用しても制限を超過することはありませんが、2つ以上のサービスを運用している場合は実行時間に注意が必要です。

## 1. アカウント作成
[UptimeRobot](https://uptimerobot.com/)にアクセスし、「Start monitoring in 30 seconds」からアカウントを作成し、ログインします。
![スクリーンショット 2022-11-02 15.09.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608343/798fdd0f-bda6-f0d0-3474-623f1bbdeab7.png)

## 2. モニター作成
「Add New Monitor」から新規モニターを作成します。
![スクリーンショット 2022-11-02 15.12.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608343/4df55f01-e7d3-e6c1-d687-fd553aa1a828.png)

以下の項目を入力し、右下の「Create Monitor」をクリックし、モニターを作成します。以下の項目以外はデフォルト値で問題ありません。
* Monitar Type: HTTP(s)
* Friendly Name: 自分がわかりやすい名前
* URL(or IP): 対象のWebサービスのURL

![スクリーンショット 2022-11-02 15.16.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608343/f8e40beb-98ac-af79-0efa-188d395cae54.png)

こんな感じで監視結果が表示されれば成功です。
![スクリーンショット 2022-11-02 15.21.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608343/90dcd060-e62e-3a62-6fcf-a007b5812309.png)



[^1]: Herokuでは30分間制限だったのでRender.comの方がスリープしやすいです。

# 参考文献
[Herokuの無料dynoをスリープさせないで24時間稼働させる4つの方法 | Casual Developers Note](https://casualdevelopers.com/tech-tips/how-to-prevent-idling-of-free-dyno-on-heroku/)
管理者権限が必要なスクリプトを動かしたい。

# 管理者権限が必要な時に困る

普通のexeとかbatとか諸々の実行できるファイルであれば右クリックして**管理者権限で実行**とか出来るわけですがPythonのスクリプトはあくまで書類ですからそんなことできません。
だからといってPython自体に細工して管理者権限なんか付与した日には何か動くたびに確認画面が出てきて不安が止まりません。

そもそもの**管理者権限が必要なプログラム**なんてものはそれが必要なのかどうなのか自体を疑う必要があったりもしますが、それでもどうしてもどうにかしたい場合というのはあるものですので…。

## 管理者権限に昇格してコマンドを実行する

あとから調べたらそこそこ出てきたのですが、一応備忘録的に書いておこうと思いました。

```python:runas.py
from ctypes import windll

def runas():

    windll.shell32.ShellExecuteW(
        None,
        "runas",
        "python", # コンソール出したくないならpythonw
        "hoge.py", # 実行したいスクリプト
        None,
        0
        )

if __name__ == "__main__":
    runas()
```

こんなスクリプトを用意します、普段実行するプログラムをこのスクリプトで実行させるというイメージです。

このスクリプトは実行されるとshellをrunas（管理者権限）で実行、この場合は```python hoge.py```を管理者権限で実行します。

個人的にはこれで相当助かったので誰かが助かればと思い共有しておきます。
コードレビューを受ける姿勢-俺は悪くねえっ!-

# はじめに

こんにちは。上野です。
転職してちょうど一ヶ月が立ちました。
まず、心と体が共に軽くなったことを日々感じます。本当に。
何食べても美味しい、何しても楽しい、何時に就業しても疲れません。
健康第一！

中学からの知人は転職後一ヶ月で体調を崩していました。
それ考えると、会社選びは間違えてなかったなあ、と安堵しています。

# コードレビュー

今回はコードレビューについて。
僕は前職の時、コードレビューが苦手でした。
なんか、詰問というか、尋問みたいに感じてたんですよね。
おそらく、レビューしている本人たちからしたらレビューしてるだけなんだけど？って感じなんでしょうけど、僕からしたら呼吸できなくなる感じでした。とにかくしんどい。

とはいえ、レビューを受けないとバグだったり、仕様漏れだったりが気づけないのも事実。
レビュー嫌だからコミットしちゃうね〜とかは無理。そうは問屋が卸さない。

納税と死とレビューは逃れられない運命。
このままじゃまずいなあと、ある日レビューに臨む姿勢を少し変えてみました。

# 俺は悪くねえっ！（コードが悪いんだ！）
レビューに臨む姿勢は「俺は悪くねえっ！」です。（某テイルズ作品から引用。）
これだけ聞くと、無責任にも程があると思われます。僕も思います。

あくまで、「レビューに臨む」その時、限定です。

どういうことかというと、レビュアーは「コード」レビューをしています。当たり前ですけど。
なので、そのコードを書いた人（要は僕）がどんな性格で、どんな志を持っているのか、っていうのはレビュアーは興味ありません。

そのコードが仕様を満たせるか、保守性が高いか、規約に則しているかということに興味がある。
そこに私情はありません。
（私情を載せるレビュアーがいるなら三流。）

仮にコードに不備があったとしてそのことを指摘することは、「不備のあるコードを書いた設計者」を咎めることではない。
強いていうなら、「不備のあるコードそのもの」を咎めているに他ありません。

もちろん不備があるコードを書いてしまったことはしっかりと原因究明なりする、フィードバックするなり必要です。
が、それはコードレビューが終わった後に好きなだけやれます。

コードレビュー中に自分自身が傷つく必要はこれっぽっちもないんですよね。

レビューを受ける人間は一旦コードと自分自身を切り離して、レビューを受ける。
そして、指摘を受けたら「確かにコードが悪かったな。コード、元気出せよ。」と、素直に意見を受け取る。

そんな姿勢でレビューに挑むと少し楽になりました。（結局、転職したけど）

# まとめ

レビュー苦手な人、特に自分の技術力が足りないとか、新人エンジニアに多いんじゃないかなと思います。
謙虚な姿勢は素晴らしいことです。必ず身を結びます。でも、それだけじゃ潰れちゃいます。ぺしゃ！
そんな時は、「俺は悪くねえ！」の精神で身のあるレビューにしていただきたいと思います。


上野
【AWS】AWS Budgetsでコスト管理とアラート仕組みを作ってみた

こんにちは。
AWSマルチアカウント環境を管理している者です。

マルチアカウント環境を運用しながら出てくる課題の1つは、**各アカウントで発生するコストを把握して予算をオーバーしないように管理する**ことです。
AWSは、「AWS Budgets」という予算を管理する機能を提供しています。今回、このAWS Budgets機能をカスタマイズしてAWS SNSを通じMicrosoft Teamsに通知を送る仕組みを作ってみましたので共有します。


# アーキテクチャ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2203079/a2b495fa-50a1-2365-550b-6acb7a752673.png)

- 通常時（予算のしきい値を超えてない時）は、AWSコンソールよりアカウント別の予算とコスト状況が確認できます。また、CSVダウンロードやレポートのメール送信も可能です。

- 予測コストが予算の90％を超過した時、指定先のTeamsチャネルにてアラートします。超過時のアクションについては、Teamsチャネルメッセージとメール送信どちらも選択可能ですが確認が早いTeamsにしました。


# AWS Budgets 設定項目
- **アラートのトリガー**：以下のように、しきい値のXX％で「予測」および「実際」コストでトリガーされるか設定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2203079/94146db7-6ce5-7702-0240-387f73999a10.png)

- **アラートの通知先**：以下のように、メール・SNSトピック・Amazon Chatbotが選択できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2203079/9418c0bf-917f-165e-281e-0d5b67139596.png)

- **アカウント数を絞ってコストを把握したい場合**：予算の範囲の範囲オプションで「特定のAWSコストディメンションをフィルタリング」を選択し、リンクされたアカウントから対象アカウントを絞ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2203079/d3a87607-8098-05ff-3630-7b24cbb0a67b.png)





# 通知するLambdaコード
```python
import urllib3 
import json

http = urllib3.PoolManager() 
def lambda_handler(event, context): 
    url = "TeamsチャネルのWebhookアドレス"
    msg = {
        "text": event['Records'][0]['Sns']['Message']
    }
    
    encoded_msg = json.dumps(msg).encode('utf-8')
    response = http.request('POST',url, body=encoded_msg)
    
    # ...
```
特にメッセージを加工せずAmazon SNSからのメッセージをそのまま送るようにしています。
メッセージの加工が必要な場合は、event['Records'][0]['Sns']['Message'] の中身を取ってきて処理するようにすればいいと思います。

# 実装してわかった注意事項
- **アラートはしきい値を超えた最初の1回のみ発生**します。
しかし、実際コストベースではない**予測コストアラートは複数回アラートが発生する場合もあります。** → 詳しくは[こちら](https://docs.aws.amazon.com/ja_jp/cost-management/latest/userguide/budgets-best-practices.html#budgets-best-practices-alerts)
- 複数回アラートを発生させたい場合は、以下のように**複数のしきい値条件を追加**することで実現できます。もちろん予測コストと実際コストのアラートを組み合わせることも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2203079/884ea9b4-5920-7128-3e43-7ebc7a6e9be7.png)


# 参考ドキュメント
- AWS Budgets 公式ドキュメント：https://docs.aws.amazon.com/ja_jp/cost-management/latest/userguide/budgets-managing-costs.html
Google UXデザイン：ビックピクチャ・ストーリーボード

# はじめに

わたしが[Google UX Design Certificateで得られた素晴らしい体験][google]を、特に重要だと思われるポイントを小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ Google UX Design Certificateを受講してみてください。

[google]: https://qiita.com/mapami/items/7a0d0a3d4661c50f8bec

https://www.coursera.org/professional-certificates/google-ux-design

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/c3d622bb-c1ed-447b-c15e-c1bccff32a4a.png" width="800">

<details><summary>これまでの振り返り</summary>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/85c69232-7e47-8c49-d4c0-3e42b69b9526.jpeg" width="500">

</details>

# ２種類のストーリーボード

[前回紹介したストーリーボード][storyboard]には、２種類あります。

[storyboard]: https://qiita.com/mapami/items/8126858ad64f3ce14b92

<dl>
  <dt>ビックピクチャ・ストーリーボード</dt>
  <dd>ユーザーが何を必要としているか、その背景、そして、なぜその製品がユーザーにとって有用であるかに焦点を当てます。</dd>
  <dd>全体像のストーリーボードは、デザイナーがステークホルダーに自分たちのアイデアを支持してもらおうとするデザインプロセスの初期によく使用されます。</dd>
  <dt>クローズアップ・ストーリーボード</dt>
  <dd>製品やその仕組みに焦点を当てます。</dd>
  <dd>デザインプロセスの中盤から終盤に使用するのが最適です。</dd>
</dl>

今回は、ビックピクチャ・ストーリーボードについて、ご紹介します。

# ビックピクチャ・ストーリーボードを作成する

:::note info
（サンプル）
あなたは、バンドメンバーを募集するためのアプリをデザインしています。依頼主はロックバンドのギタリストのダンです。バンドのドラマーが突然辞めたので、ダンは新しいドラマーを探さなければなりません。
:::

#### プロブレム・ステートメントの定義
キャラクターを確立し、ストーリーボードのシーンを設定するのに役立ちます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/af3d3310-8c76-bd1c-af33-5e06d61453bc.png"  width="700">

>　ダンはバンドのリード・ギタリストですが、前のドラマーと入れ替わるのが難しいため、新しいドラマーを雇う必要があります。

#### ゴール・ステートメントの定義
ストーリーボードのプロット（デザインの利点や解決策）を決定するのに役立ちます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/7f67c35c-e040-9960-0006-0e1b0d66839b.png"  width="700">

>バンドメイトのアプリは、ユーザーが新しいミュージシャンや代理のミュージシャンを募集することができ、新しいバンドメンバーを必要としているユーザーにとって、雇うべき適格なミュージシャンを簡単に見つけることができるため、影響を与えます。私たちは、ユーザーのレビューを読んだり、採用の成功を追跡したりすることで、効果を測定します。

### ストーリーボードの作成

#### シナリオ
あなたのデザインが解決する問題を説明する短く明確な文章を書きます。

>ユーザーが自分のバンドに参加するために、資格のあるミュージシャン、新しいミュージシャン、または代理のミュージシャンを募集できるアプリ

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/27be77e1-e42b-78b2-655e-f2124402c8cf.png"  width="６00">

#### コマとキャプチャ
1. ダンが新しいドラマーを探すきっかけとなった出来事は何でしょうか？ この場合、ダンのドラマーは辞めてしまったので、バンドに参加する代わりのドラマーを探す必要があります。
1. ダンは、地元にいる有能な、新しい、または代わりのミュージシャンを募集するのに役立つアプリを見つけ、開いています。このアクションは、独立したパネルで描かれるべきです。
1. ダンはアプリをスクロールしながら、近くに住んでいる経験豊富なドラマーを見つけます。彼は、プロのバンドで5年以上の経験があり、良いレビューを持っていて、現在地から30マイル以内に住んでいるドラマーをフィルタリングしています。
1. 過去には、キーボード奏者を採用したところ、その奏者が無資格者であったという苦い経験もあります。この新しいアプリを使うには、ミュージシャンのプロフィールから、何年間バンド活動をしてきたか、他のユーザーからどのような評価を得てきたか、などを確認する必要があります。ダンは過去にバンド仲間を探すのに失敗した経験があるので、少し不安になっているかもしれません。
1. ダンはアプリでドラマーを選び、「スケジュール」ボタンをタップして、後任のドラマー候補との面接を設定します。
1. 新しいドラマーがバンドに加わるという結論になる。ダンはとても喜び、彼のバンドはいくつかのライブを予定しています。製品体験の最後に、ユーザーがどのように感じるかを示す感情を必ず入れてください。この場合、ダンは興奮と満足を感じています。


:::note warn
ストーリーボードはユーザーに関するものなので、例えば旅のステップごとに悲しい顔や嬉しい顔を使うなどして感情を盛り込み、人間らしさや親近感を感じさせることが重要です。
:::

# さいごに

あなたは、ユーザーであるダンに、自分のバンドのために新しいドラマーを探す旅をさせました。

あなたは、彼の痛みに対処し、有能なドラマーを見つける手助けをしました。ユーザーは、このアプリの体験に満足しています。

ストーリーボードは、ユーザーの体験に没頭することで、より良いプロダクトを生み出すのに役立ちます。