OmniAICreator/Qiita-1.07M huggingface dataset:
RubyでAtCoder ABC292(A, B, C, D)を解いてみた

# はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC292のA, B, C, Dを解きました。備忘録として解き方をまとめていきたいと思います。
# A - CAPS LOCK
https://atcoder.jp/contests/abc292/tasks/abc292_a
```ruby:a-292.rb
s = gets.chomp
puts s.upcase
```
## 解説
upcaseメソッドを使うことで大文字にすることができます。

# B - Yellow and Red Card
https://atcoder.jp/contests/abc292/tasks/abc292_b
```ruby:b-292.rb
n, q = gets.split.map(&:to_i)
hash = Hash.new(0)
q.times do
    t, x = gets.split.map(&:to_i)
    case t
    when 1
        hash[x] += 1
    when 2
        hash[x] = 2
    when 3
        puts hash[x] == 2 ? "Yes" : "No"
    end
end
```
## 解説
連想配列hashを用意します。そして、イエローカードならその選手（key）に対応するvalueをインクリメントし、レッドカードならそれ以上valueの値が増えることはないので2とします。t=3の場合は、その選手に対応するvalueが2であればYesを出力し、そうでなければNoを出力します。

# C - Make Takahashi Happy
https://atcoder.jp/contests/abc293/tasks/abc293_c
```ruby:c-292.rb
n = gets.to_i

hash = Hash.new(0)
for a in 1..n - 1
    b = 1
    while a * b < n
        hash[a * b] += 1
        b += 1
    end
end

ans = 0
for ab in 1..n - 1
    ans += hash[ab] * hash[n - ab]
end
puts ans
```
## 解説
（他の方の提出結果を参考にしました）

<方針>
前提として、abが決まればcdはcd=n-abと一意に定まります。また、ab場合の数はa,bの組み合わせによって決まります。これは、cdについても同様です。したがって、1<=ab<=n-1かつ1<=cd<=n-1であることから積が1..n-1となるような正整数の組み合わせの数を求めることで今回の問題は実装することができます。

<実装方法>
まず、連想配列hashに積が1..n-1となるような正整数の組み合わせの数を記録していきます。そして、ansにabとcdそれぞれの場合の数をかけた値を足していき、最後にansを出力します。

# D - Unicyclic Components
https://atcoder.jp/contests/abc292/tasks/abc292_d
```ruby:d-292.rb
n, m = gets.split.map(&:to_i)
arr = Array.new(n + 1){[]}
m.times do
    u, v = gets.split.map(&:to_i)
    arr[u] << v
    arr[v] << u
end

searched = Array.new(n + 1, false)
cnt_point = Array.new(n + 1, 0)
cnt_line = Array.new(n + 1, 0)

for i in 1..n
    next if searched[i]
    searched[i] = true
    stack = [i]
    cnt_point[i] += 1
    while node = stack.pop
        arr[node].each do|j|
            cnt_line[i] += 1
            next if searched[j]
            cnt_point[i] += 1
            searched[j] = true
            stack << j
        end
    end
end

for i in 1..n
    if cnt_line[i] != cnt_point[i] * 2
        puts "No"
        exit
    end
end
puts "Yes"
```
## 解説
こういうグラフ系の問題は、DFS(深さ優先探索)やBFS（幅優先探索）といった手法で全探索していきます。個人的には、どちらかが使えればいいと思っています。

<方針>
連結成分ごとに探索して、それぞれにおける頂点の数と辺の数を記録していきます。最後に、それぞれの連結成分における頂点の数と辺の数が一致していればYesを出力し、そうでなければNoを出力します。

<実装方法>
頂点の数を記録するcnt_point配列と辺の数を記録するcnt_line配列を用意します。また、連結成分を再現するためにその頂点と繋がっている頂点から行けるところまでDFSするようにしました。なお、頂点の数については頂点自身およびそこに連結している頂点それぞれについて加算しているため、実際の数の２倍となっています。

# 終わりに
グラフ系の問題は結構好きですが、今回の問題は工夫が必要で難しかったです。また、C問題についてはRubyはC++などに比べ処理時間が長いため、いかにスマートに書くかが重要であると感じました。

https://qiita.com/shoya15/items/50fd17e37d7c64f2b166
多項式x**2023-1を多項式x**4+x**3+x**2+x**1+1で割った余り「2023京都大学理系第1問 問2」<1>をwolframalphaとsympyでやってみたい。

WolframAlphaにPolynomialMod関数がありました。
sympyにdiv関数がありました。
多項式を忘れていました。申し訳ありません。失敗例は、参考にあります。

オリジナル

https://youtu.be/7wP8TErQSXE

上と同じです。大学入試数学問題集成＞テキスト

https://mathexamtest.web.fc2.com/2023/202310541/2023105410100mj.html#top-0102

# wolframで

https://www.wolframalpha.com/input?i=PolynomialMod%5B+x**2023-1%2C+x**4%2Bx**3%2Bx**2%2Bx**1%2B1+%5D&lang=ja


# sympyで(オリジナルのやり方)
現役東大生てんしろ【数学・勉強解説】 様の方法を勉強中。

# sympyで
div関数でできました。modでは、できませんでした。
```python
from sympy import *
x=Symbol('x',real=True)
print("#",Mod(x**2023-1, x**4+x**3+x**2+x**1+1))
print("#",div(x**2023-1, x**4+x**3+x**2+x**1+1))
print("#",div(x**2023-1, x**4+x**3+x**2+x**1+1)[1])
# # Mod(x**2023 - 1, x**4 + x**3 + x**2 + x + 1)
# ()
# (途中省略,x**3 - 1)
# x**3 - 1
```
①私の環境は,pycharmです。
②よく聞くのは、Jupyterです。
③web上で、上記のソースをコピー貼り付けでも、できました。
黒背景の右上に、マウスを移動すると、コピーマークが発生します。

https://live.sympy.org/

# 参考

https://qiita.com/mrrclb48z/items/1b8cf8d317dfeb68e6fc

失敗例

https://qiita.com/mrrclb48z/items/b500cab4d986183e97f8
Notionで公開ページの複製ができないときの対処法 -Googleアカウントと関連付けてログインしている場合ｰ

# Notionとは？
Notionは、仕事の質とスピードを向上させるコネクテッドワークスペースです（[Notion公式ページより](https://www.notion.so/ja-jp/product)）。具体的には、ドキュメント管理、メモ、表計算、スケジュール管理、タスク管理などあらゆる情報を一括管理できるツール。

# 目的
Notionでは、Webで一般公開されているページを自分のワークスペースに複製して使うことができる。しかしながら今回、公開ページの複製ができなかったため、その対処法について残しておく。

# 生じた問題
公開ページの複製をしようとしたができなかった。
本来であれば「複製」をクリックするとスムーズに複製されるがクリックしても反応しない。
![公開ページの複製方法](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1296275/80f9ce6a-b75b-7594-ab9a-dd71d134ac93.png)


# 解決策
NotionのアカウントとChromeブラウザのアカウントを合わせると複製できるようになる。

Googleアカウントと関連付けてログインしている場合、異なるアカウントのブラウザから「複製」をクリックすると、複製されないみたい…
Amazon VPC LatticeがついにGAしたので触ってみた！

# ついにLatticeが登場！

Re:Invent 2022で発表されたインフラ抽象化の新サービス「VPC Lattice」が東京リージョン含め正式リリースされました。

https://aws.amazon.com/jp/blogs/aws/simplify-service-to-service-connectivity-security-and-monitoring-with-amazon-vpc-lattice-now-generally-available/

VPC Latticeって何？という方は以下の記事もご覧ください。

https://qiita.com/minorun365/items/7f73aa1fe1ef2ca0c2c7


# 早速使ってみた

VPC Latticeは「VPCのインフラを抽象化しサービスメッシュを実現する」という画期的なサービスです。
ルートテーブルやセキュリティグループ等、難しいことを考えずにL7の世界でリソース同士を通信させることができます。
その代わりセキュリティ制御も低レイヤーではなく、IAM等を使えます。

今回は以下のような構成を作って疎通テストしてみました。
タコ足配線のようにVPC内外のリソースをバーチャルに相互接続しちゃえます。
![スクリーン ショット 2023-04-01 に 11.18.59 午前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/5d035059-c08c-d4f3-5805-a91b5b6baea8.png)

上記リソースを作ったあと、NLB配下のEC2からVPC外のLambda関数を呼び出してみます。

### 簡易手順

- AWSマネジメントコンソールから「VPC Lattice」コンソールを開く（VPCサービスの中にあります）
- サービスネットワークを作成する
    - 相互接続させたいVPCを関連づける
- 以下はぶら下げたいリソースごとに複数作成
    - ターゲットグループを作成する
        - ターゲットを登録する（インスタンス、IPアドレス、ALB、Lambdaが指定可能）
    - サービスを作成する
        - 上記で作ったサービスネットワークを関連づける
        - 上記で作ったターゲットグループをリスナーとして登録する
            - 複数のリスナーを登録しL7ルールでルーティングし分けることも可能

名前から分かるように、サービス＆ターゲットグループはALBとそっくりな概念になっています。

ターゲットグループの例：
![スクリーン ショット 2023-04-01 に 11.34.06 午前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/09cfa39b-d7ee-ee83-3617-b55ff2474b61.png)

サービスの例：
![スクリーン ショット 2023-04-01 に 11.32.52 午前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/27dd91d1-8360-3ef1-7c9a-9b6790d9ce26.png)


※まだ登場直後のためか、マネジメントコンソール上細かなバグのような挙動がありました。
（ウィザードで作成ボタン押した後にグルグルが終わらない、関連付け成功してもエラートーストが出る等）
どんどん世に出してくれるのはありがたいので、このへんはフィードバックを元に随時改善していただきたいですね。


### 疎通確認

上記のNLB配下のEC2インスタンスにSSH接続し、Lambda関数用Latticeサービスのドメイン名宛てにcurlコマンドを投げてみたところ200 OKのHTTPステータスが返却されました！

![スクリーン ショット 2023-04-01 に 10.43.12 午前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/2f92c4a4-4a4f-8294-2cec-ba8268bc21f8.png)


そしてLatticeサービスネットワーク内の通信をまとめてモニタリングすることも出来ます。
CloudWatch Logsにログ出力してみたところ、Lambdaへの疎通ログがしっかり出力されていました。

![スクリーン ショット 2023-04-01 に 11.39.56 午前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/0b82ddbc-f7d1-d1ce-adbd-bdb62f937489.png)


# まとめ

Latticeを集中管理的にセットアップしておけば、開発者がインフラのことをあまり気にせずL7の世界だけでサービス間の通信を自在に活用できるようになりそうですね！
週末お出かけ前のため雑な記事になってしまいましたが、ガチ検証はこれから色んな方がアウトプットしてくださるでしょう🙏
[Windows Server]評価版から製品版への変換

https://learn.microsoft.com/ja-jp/windows-server/get-started/upgrade-conversion-options

Windows Server の評価版を製品版に変換できます。
Standard Edition の評価版をインストールしている場合は、Standard Edition または Datacenter Edition のいずれかの製品版に変換できます。 
同様に、Datacenter Edition の評価版をインストールしている場合は、Datacenter Edition の製品版にのみ変換できます。

まだ Windows をアクティブ化していない場合は、デスクトップの右下隅に、評価期間の残り時間が表示されます。

##  Windows Server Standard または Datacenter の場合

サーバーで Windows Server Standard Edition または Windows Server Datacenter Edition の評価版を実行している場合は、次の手順に従って製品版に変換できます。

1. 管理者特権でのコマンド プロンプトまたは PowerShell セッションから次のコマンドを実行して、Windows Server の Microsoft ソフトウェアライセンス条項を保存します。これにより、内容を確認できるようになります。
`DISM /online /Set-Edition:ServerDatacenter /GetEula:C:\eula.rtf`
 
2. 以下のコマンドを実行して、現在のエディション名を確認します。 出力はエディション名の省略形です。たとえば、Windows Server Datacenter Edition の場合は、ServerDatacenter になります。
`DISM /online /Get-CurrentEdition`

3. 以下のコマンドを実行して、現在のインストールをどのエディションに変換できるかを確認します。 Windows Server Standard の評価版は、Windows Server の Standard Edition または Datacenter Edition の製品版のいずれかに変換できます。一方、Windows Server Datacenter の評価版は、Windows Server Datacenter の製品版にのみ変換できます。
`DISM /online /Get-TargetEditions`

4. 変換先のターゲット エディション名のメモを取り、以下のコマンドにこれと製品プロダクト キーを入力します。 このプロセスでは、前に保存した Windows Server の Microsoft ソフトウェアライセンス条項に同意する必要があります。

:::note
**ヒント**
適切なプロダクト キーとエディション ID を使用して、Windows Server Standard の評価版から Windows Server Datacenter の製品版に 1 ステップで変換できます。
`DISM /online /Set-Edition:<edition ID> /ProductKey:XXXXX-XXXXX-XXXXX-XXXXX-XXXXX /AcceptEula`
　
次に例を示します。
`DISM /online /Set-Edition:ServerDatacenter /ProductKey:ABCDE-12345-ABCDE-12345-ABCDE /AcceptEula`
:::

:::note alert
**重要**
サーバーが Active Directory ドメイン コントローラーの場合は、製品版に変換することはできません。 この場合は、まず製品版を実行するサーバーに追加のドメイン コントローラーをインストールし、保持されている FSMO ロールを変換して、評価版で実行されているドメイン コントローラーから Active Directory Domain Services (AD DS) を削除します。 
:::

## 以下の場合については引用元サイトの情報を確認しましょう。
Windows Server Essentialsの場合
Windows Server Standard Edition から Datacenter Edition への変換の場合
製品版、ボリューム ライセンス、OEM ライセンス間の変換の場合
【Windows】評価版ライセンスの利用期限を延長する［slmgr］

https://bizlog.tech/windows-evaluation-license/

評価版の Windows OS ですが、初回の利用期限を迎えても数回であれば期限を延長することができます。
猶予期限が切れたまま使用している（評価版認証を行っていない場合も同様）と、1時間ごとに強制的に OS がシャットダウンされてしまうので、猶予期限が切れる前に利用期限の延長を行う必要があります。

# ライセンスの猶予期間の確認
まずは、現在のライセンスの猶予期間の状態を確認します。
※ PowerShell もしくは コマンドプロンプトにて、以下のコマンドを実行します。

```console:コマンド例
slmgr /dli
```

# ライセンス猶予期限リセット回数の確認
次は、ライセンスの猶予期間リセット回数を確認します。
以下をコマンドで実行します。
```console:コマンド例
slmgr /dlv
```

# ライセンスの猶予期限をリセット
ライセンスの猶予期間をリセットします。
以下をコマンドで実行します。

猶予期限やリセット回数は評価版 OS によって変わります。
```console:コマンド例
slmgr -rearm
```

以上が完了しましたら OS の再起動を行います。
再起動後、再度猶予期間を確認して期限が延長されている事を確認します。

これでライセンスの猶予期間を延長する事ができます。
【Microsoft】評価版ソフトウェアの利用と注意事項［評価版ライセンス］

https://bizlog.tech/ms-license-evaluation/

Microsoft 製品の評価や検証などを行う場合、一般的には MSDN のサブスクリプションなどで評価期限のない開発用ライセンスを使うことが多いと思いますが、短い期間であればサブスクリプションを契約していなくても評価版ソフトウェアを利用することができます。

:::note alert
**注意事項**
評価版製品をオフライン環境へ導入した場合、有効期限が 180 日などのものであっても 10 日程度の利用期限となり、また、1 時間ごとにシャットダウンが行われる動作となります。
:::

評価版であっても評価版ライセンスの認証処理は必要となりますので、インターネット接続可能な環境でライセンス認証を行うようにします。
※インターネットへ接続できればライセンス認証は自動で行われます。

ライセンス認証が行われているかを確認するには、「ファイル名を指定して実行」（［Windows］+［R］キーを同時押し）にて `ms-settings:activation` を実行すると、ライセンス認証状態を確認することができます。

ライセンス認証が行われている場合は、「Windows はデジタル ライセンスによってライセンス認証されています」と表示されます。
Visual C++のヒープメモリエラー：書き込み中にアクセス違反

# エラーメッセージの英語版：
Exception thrown at 0x7AEA4550 (vcruntime140d.dll) in HeapTest01.exe: 0xC0000005: Access violation writing location 0x00000000.

# エラーメッセージの日本語版：
0x7AEA4550 (vcruntime140d.dll) で例外がスローされました (HeapTest01.exe 内): 0xC0000005: 場所 0x00000000 への書き込み中にアクセス違反が発生しました

# サンプルソース
```c
#include <stdlib.h>
#include <string.h>

int main()
{
    int* p;        // 対象メモリエリアへのポインター
    int* tmpP;     // 対象メモリエリアのアドレスカウンター
    p = (int*)malloc(sizeof(int) * 16);    // メモリエリア取得
    tmpP = p;      // 対象メモリエリアの先頭に指す

    // 対象メモリエリアに任意値を入れる
    for (int i = 0; i < 16; i++) {
        *tmpP = 0x3412;
        tmpP++;
    }

    // メモリ解放
    free(p);
    p = NULL;

    // 再度書き込み（エラー発生）
    memset(p, 0x00, 16);
    
    return 0;
}
```

# 例外発生した時に止まっている画面
memset関数でエラーが発生したため、memset関数が表示されます。
（***どの関数の画面が表示されるかによって、どの関数で落ちるかは分かります。***）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188794/278fe85a-4cd0-0114-d683-d98c60e63e43.png)

# エラー発生の原因
サンプルコードでは分かりやすいですが、原因は解放されたメモリに再度書き込みしようとしています。

メモリリークを避けるために、**malloc**で取得できたメモリを必ず**free**で解放する方法ですが、プログラムと処理ロジックがどんどん複雑になって、**free**されていることを意識されずに再度書き込みしようとするとこのエラーが発生します。

「Access violation writing location **0x00000000**」文面にあるアドレス「0x00000000」が書き込みしようとするアドレスのため、明らかにアドレスが誤って初期化されている、或いはポインターが誤ってNULL（0と同様）に設定されていると分かりますね。

# デバッグ方法
***注意：エラーが発生した時に、慌ててデバッグを停止・中止しないこと。メモリエラーは必ずしも毎回発生することもないので、発生した機会を大切にして冷静に分析しましょう。***

①例外が発生した時にどの関数に止まっているかによって対象関数を特定
②デバッグ→ウインドウ→呼び出し履歴を開いて、どのような処理の流れで事象が発生したかを把握
（呼び出し履歴に関数名と**行数**があるので、対象関数が呼び出し元のファイル・関数で呼び出されることは複数箇所があっても特定しやすいですね）
MySQLを初めて学ぶ１

MySQLは無絵用で利用することができるデータベース
データベースとは、検索や蓄積が容易にできるよう整理された情報の集まり。ほぼ全てのシステムが何かしらのベータベースを使用してデータを取り扱っている
ちなみにSQLはデータベース、テーブル、フィールド、レコード（データベース関連の用語）を扱う言語のことを指す

最近使い方知ったAWSのCloud9上でMySQLを使って学んでく
```terminal
manabo:~environment $ mysql --version
manabo:~environment $ systemctl status mysql
manabo:~environment $ mysql --help | grep my.cnf
manabo:~environment $ sudo vim /etc/mysql/my.cnf
manabo:~environment $ sudo systemctl restart mysql
manabo:~environment $ sudo mysql -u root

mysql> show variables like '%char%';
mysql> exit

```

・mysql --version
MySQLのバージョンを確認
・systemctl status mysql
MySQLが動いているか確認。active(running)が出てきたらオッケー
・mysql --help | grep my.cnf
my.cnf（MySQLの設定管理できるファイル）を探すためのやつ。
・sudo vim /etc/mysql/my.cnf
MySQLの設定管理には管理者権限が必要なのでsudo。vimはテキストエディタを使うときに使うコマンド。/etc/mysql/my.cnfは編集したいファイルで上のやつで出てきてる。/etcは設定ファイルが置かれてるやつ
↓
したらブワーーっと青文字が出てくる。一番下の端まで言って[i]をタイプ。Insertモードになるので、--INSERT--の上に
[mysqld]
character-set-server=utf8
を打つ。して、esc押しっぱで:wq打ってエンターで終了
・sudo systemctl restart mysql
これで設定を反映
・sudo mysql -u root
ログインして操作するためのやつ。sudoは管理者権限で実行する。mysql、でMySQLについての操作を行うよ、-uはユーザーを指定するオプションで、rootがユーザー名で管理者ユーザーを指している

・show variables like '%char%';
これは言語の確認
・exit
ログアウト

![Screenshot 2023-03-31 at 16.21.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125804/fec5c93a-0a1b-d6b6-9023-518e82ac445e.png)
こんなんなってたらOk
rex0220 計算式プラグイン 最大値・最小値計算

[rex0220 計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73)で、 kintone 数値項目の最大値・最小値計算を行ってみます。

# 概要

数値項目の最大値・最小値を計算式プラグインで計算します。
未入力の項目値は、無視されます。
テーブル内項目の計算も可能です。

![2023-04-01_11h00_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/3beb0d06-d5b6-8fd2-6665-1138d4ffafe6.png)

# 操作例

項目の値変更のタイミングで最大値・最小値が計算されます。

![2023-04-01_11h10_34.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/0e76368d-6be9-95ad-5ba5-a6618baecaf7.gif)

# プラグイン設定

用途により MIN, MAX, MINIF, MAXIF, TR_MIN, TR_MAX 関数を指定します。
TR_MIN, TR_MAX 関数は、テーブル行内の最小値・最大値を計算するときに指定します。

![2023-04-01_11h13_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/a68c636b-7f3f-ef43-2b20-fc66aa21fa60.png)

```.js
// 数値min
MIN(数値1,数値2,数値3)
// 数値max
MAN(数値1,数値2,数値3)

// T数値1min： テーブルのT数値1の最小値
MIN(T数値1)
// T数値1max： テーブルのT数値1の最大値
MAX(T数値1)

// 有効T数値2min： テーブル有効チェックのT数値2の最小値
MINIF(IN(有効,"有効"),T数値2)
// 有効T数値2max： テーブル有効チェックのT数値2の最大値
MAXIF(IN(有効,"有効"),T数値2)

// T数値min： テーブル行の最小値
TR_MIN(T数値1,T数値2,T数値3)
// T数値max： テーブル行の最大値
TR_MAX(T数値1,T数値2,T数値3)
```
Azure aoutomationでコマンドレットが用意されていない動作を自動化した

AzureAutomationを利用して、Azuremediaserviceのストリーミングエンドポイントの起動を自動化しました。
powershellコマンドレットにストリーミングエンドポイントの起動／停止が用意されておらず少し手こずったため備忘録も兼ねて投稿いたします。コマンドレットが用意されていない動作を自動化する際の一助となればと思います。
<h3>・課題<h3/>
Azureリソースに対する操作を自動化する際に、Automationを利用可能ですが、一部の動作はまだpowershellのコマンドレットが用意されいません。（CLIではすでにコマンド化されていたりするなどまちまちです）
<h3>・解決策<h3/>
今回はrestapiを使用しました。Azureのサービスはまずrestapiとしてリリースされます。ポータル上での操作もpowershell/CLIもこのapiをラッピングしたものに過ぎないのでrestapiを利用すれば事実上全ての操作をAutomationで行えます。

<h4>1.マネージドIDの作成、ロールの付与<h4/>
今回の方法ではAutomationアカウントのマネージドIDを使用して認証を行うため、事前にマネージドキー作成しておきます。作成後マネージドIDに対して対象となるリソースを操作するために必要なロールを割り当てる必要があります。詳しくは<a href="https://learn.microsoft.com/ja-jp/azure/role-based-access-control/role-assignments-portal-managed-identity">こちら<a/>をご参照ください。

<h4>2.powershhellのRUNBOOKを作成する<h4/>
Connect-AzAccount -IdentityとすることでAutomationアカウントのマネージドIDを使用してログインできます。

```
try
{
    "Logging in to Azure..."
    Connect-AzAccount -Identity
}
catch {
    Write-Error -Message $_.Exception
    throw $_.Exception
}
```

※事前にAutomationアカウントに対して対象リソースの操作に必要な権限を付与しておく必要があります。

```
$accesstoken = Get-AzAccessToken -TenantId "{TenantId}"
```

するとGet-AzAccessTokenコマンドでアクセトークンを取得できます。テナントIDは Get-AzTenant　コマンドで取得できます。詳しくは<a href="https://learn.microsoft.com/ja-jp/azure/active-directory/fundamentals/active-directory-how-to-find-tenant">こちら<a/>

tokenが手に入ったので、tokenをAuthorizationヘッダーに渡せばapiを呼び出せます。
必要な項目を埋めた上でinvoke-webrequestコマンドでリクエストを送信します。
```
$token = "Bearer " + $accesstoken.Token
$header = @{
    "Authorization" = $token;
    "Content-Type" = "application/json"
}
$uri = "https://management.azure.com/subscriptions/{suscriptionkey}/resourceGroups/{resourcegroupNmae}/providers/Microsoft.Media/mediaservices/{AcountName}/streamingEndpoints/default/start?api-version=2022-08-01"
$postRequest = @{
    Uri         = $uri
    Headers     = $header
    Method      = 'POST'
    ContentType = 'application/json'
}
$response = Invoke-WebRequest @postRequest
```
同様のやり方でAzureリソースに関する全ての操作をオートで実行できると思います。
【Salesforce認定資格挑戦】Platform デベロッパー試験体験記


こんにちは、J.Lです。

2023年の3月に認定資格のPlatform デベロッパー試験を受験したので体験をまとめてみました。

#### ■試験結果
まず、結果としては合格でした。:v:
各トピックの配点は以下の通りです。
![屏幕截图 2023-03-26 083511.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3290279/154760bf-31a8-48b7-655e-42766064e1fe.png)

各トピックの割合により、計算して私の得点は以下の通りです。
![屏幕截图 2023-03-26 090258.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3290279/e1222d22-4d6f-b14f-7a92-890117e31311.png)

Platformデベロッパーの合格点は68%で、私の得点は88%なので、今回は合格になりました。
「プロセスの自動化とロジック」は８割を超えることができなくて、この部分の知識はもっと勉強しなければならないです。

私の勉強実績は下記に記載しますので、Platformデベロッパー資格受験を考えている方は、参考にしてみてください。

#### ■勉強実績
Salesforceを勉強してから今まで、半年ぐらいとなり、勉強状況は以下の通りです。
- アドミンと関連する基礎知識学習　　　　２ヶ月
- Javascript学習　　　　１ヶ月
- Lightning Web Components学習　　　　２ヶ月

バッジ数：114、ポイント数：162025、Superbadge挑戦：25


今年の２月頃、Platform デベロッパー試験を受けることを決めました。
1ヶ月間試験に合格できた際の学習状況は以下の通りです。
- Platform デベロッパー試験に向けた学習　→　復習（2週間）
- 問題練習(500ぐらい)　→　繰り返し強化（3週間）

問題練習はかなり行えば、実際の試験には、問題を見ただけで、答えがわかる問題もあります。しかし、選択肢を注意しなければならないです。

#### ■今後予定
4月にアドミニストレーターの認定資格を挑戦する予定です。頑張ります。:runner:
【Swift】Model保存時に値を適切な形に変換して保存する

例えばiOSでTodoアプリを開発するとき
APIからFetchしてレスポンスをフロント側で表示したいけど
プロパティのデータ型や文字列の規則がフロントで扱いたい形と異なる時
仕方なくそのまま`Model`に保存して`ViewModel`で変換処理を行うこともできるが
**「適切な形に変換してから`Model`に保存したい」** と思った時の備忘録

# こんな構造のAPIがあったとする
`/api/todos`
``` json
[
    {
        "title": "マヨネーズを買う",
        "description": "マヨネーズはライフラインだ。絶対に在庫を切らすな。",
        "startDate": "2023-04-01T19:00",
        "status": "UNSTARTED"
    },
    ...,
    ...
]
```
`status`の型はバックエンド側でこんなenumで定義されているとする

```kotlin
enum class TodoStatus {
    IN_PROGRESS,
    CANCELED,
    UNSTARTED,
    FINISHED
}
```
# ●フロント側のModelを定義する

とりあえずそのままの形で保存するための`Model`を定義してみる
``` swift
// TodoModel.swift
struct Todo: Equatable, Identifiable {
    var id: String
    var title: String
    var description: String
    var startDate: Date
    var statusFlag: String
}
```
この場合、先ほどのAPIのレスポンスを保存すると当然こんな感じになる。
しかし、フロント側で`status`を`UNSTARTED`ではなく **`未着手`** などと
日本語で表示したい場合、このままだと`ViewModel`で変換が必要になる。
これを`Model`で完結させたい。

```swift
Todo(
    id: ???,
    title: "マヨネーズを買う",
    description: "マヨネーズはライフラインだ。絶対に在庫を切らすな。",
    startDate: 2023-04-01 19:00:00 +0000,
    statusFlag: "UNSTARTED" //★ここ
)
```
# Modelにenumを定義する
まずstatusに関する`enum`を定義し、`status`をこのenumに準拠させる
```swift
// TodoModel.swift
struct Todo: Equatable, Identifiable {
    var id: String
    var title: String
    var description: String
    var startDate: Date
    var statusFlag: TodoStatus

    enum TodoStatus: String, Decodable {
        case UNSTARTED
        case IN_PROGRESS
        case CANCELED
        case FINISHED
    }
}
```
`enum`内に表示する用のプロパティ`displayText`を追加する
```swift
// TodoModel.swift
struct Todo: Equatable, Identifiable {
    var id: String
    var title: String
    var description: String
    var startDate: Date
    var statusFlag: TodoStatus

    enum TodoStatus: String, Decodable {
        case UNSTARTED
        case IN_PROGRESS
        case CANCELED
        case FINISHED
        
        var displayText: String {
            switch self {
                case .UNSTARTED: return "未着手"
                case .IN_PROGRESS: return "実施中"
                case .CANCELED: return "中断"
                case .FINISHED: return "完了"
            }
        }
    }
}
```
プロパティ`displayText`は、enumのcaseによって適切な文字列に変換して保存するので
`ViewModel`で`Model`を呼び出すときは
```swift
    let todo: Todo // 何かしらのFetch処理のレスポンスが保存された変数

    // 「未着手」などの適切な文字列が保存されている
    let status = todo.todoStatus.displayText 
```

こうすることで、「適切な形に変換してから`Model`に保存」されている状態なので
ViewModelで変換の処理を書かずとも`displayText`にアクセスすれば
表示したい文字列を呼び出すことができる
超初心者向け タッチタイピング / ブラインドタッチの練習サイトまとめ

プログラミングを勉強するのに最低限必要な知識、技術はいくつかあると思いますが、その中で最も基礎的なのが、タッチタイピングだと思います。私は、一年前まで、タッチタイピングができなくて、毎日練習して最近は少しできるようになりました。今でも毎日練習をしています。もしタッチタイピングができない、あまり得意ではない、どこで勉強したらいいのだろうと思っている方は、ぜひ、この記事を参考に練習してみてください。

この記事では、日本語のサイトを2つ、海外のサイトを4つの合計6つのサイトを紹介したいと思います。それぞれに特徴があり、向いていることが違うので、必要に応じて使い分けるといいと思います。

**目次**

1. [e-typing](#e-typing)
1. [myTyping](#myTyping)
1. [10fastfingers](#10fastfingers)
1. [keybr](#keybr)
1. [monkeytype](#monkeytype)
1. [speedtyper](#speedtyper)


## e-typing
私が最初に使ったサイトは、このイータイピングというサイトでした。ここで毎日指の位置を覚える練習をしました。

https://www.e-typing.ne.jp/

## myTyping
このサイトは、練習に使用している人が多いイメージです。

https://typing.twi1.me/

今回紹介するサイトで、日本語のサイトは、e-typing, myTypingの2つだけです。まずは、どちらか気に入った方で、指の位置を覚えて、ゆっくりでもタッチタイピングができるようになるように毎日練習してみるといいと思います。私の経験から言うと、1日にたくさん練習するよりも、毎日5分くらいを続ける方が上達します。

## 10fastfingers
このサイトは、海外の方がタッチタイピングの練習と言ったらまず誰でも紹介する定番のサイトです。いろんな言語に対応していて、私は、基本的には英語のトップ200、トップ1000を練習しています。指の場所が覚えられたら、このサイトで毎日練習するといいと思います。スコアもつくので、毎日少しずつ上達しているのがゲーム感覚で実感できていいと思います。

https://10fastfingers.com/

## keybr
このサイトは、苦手をなくしていくのに向いているサイトです。アルファベット1文字に集中して、練習できるので、苦手な文字を克服するために利用するといいと思います。

https://www.keybr.com/

## monkeytype
このサイトは、他のサイトでは、数字や記号の練習ができます。普段練習しているサイトでは、数字や記号が出てこないのでいざ使うときに、すごく時間がかかってしまったりします。早く打てるようになる秘訣は、苦手キーをなくすことです。

https://monkeytype.com/

## speedtyper
このサイトは、プログラマーに特化したサイトです。さまざまなプログラミング言語に対応していて、プログラミング言語のタイピングが練習できます。普段使う文字では早く打てるのにプログラミングになった途端に打てなくなるというのはよくあることなので、練習しておくといいと思います。

https://www.speedtyper.dev/
STM B-L4S5I-IOT01A上でThreadXのサンプルを動作させる

# B-L4S5I-IOT01A評価ボードを準備
https://www.st.com/en/evaluation-tools/b-l4s5i-iot01a.html

![IMG_3724.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/5df0a221-6be1-71cf-5821-c77a2ce86dee.jpeg)

# 開発環境 STM32 Cube IDEをインストール
https://www.st.com/en/development-tools/stm32cubeide.html

# ThreadXのサンプルをダウンロード
https://github.com/azure-rtos/samples

SamplesのSTM32CubeIDEをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/07a98cbe-da2f-3e1d-6d35-e6544fe5ef8a.png)

# STM32 cube ideを起動
File -> import -> Existing Projects into Workspace
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/e5b68787-efc5-e01c-0455-ad30a867ad97.png)

先ほどDownloadしたThreadXのサンプルのb-l4s5i-iot01a\stm32cubeideフォルダを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/4ee1c997-2d1c-1b43-a321-bdff34b981e8.png)

インポートが完了した状態。複数のプロジェクトがインポートされています。この中で、sample_threadxプロジェクトを利用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/4739e4f7-769c-d605-5839-b7cfe94f22f5.png)

# WIFIのIDとパスワードを設定
sample_threadxプロジェクトのcommon_hardware_code/board_setup.cファイルを開きます。
wifi_nameとwifi_passwordをご自分の環境に合わせて変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/a9adad3a-77d7-ff4b-aa53-a2efddded5f8.png)

# 評価ボードに書き込んで実行
PCとB-L4S5I-IOT01A評価ボードをUSB-microBケーブルで接続します。

![IMG_3725.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/5d66ed28-b702-83ae-7df2-b4a81fa951bf.jpeg)

ビルドします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/3fb7e5aa-5436-60a5-78a9-8588f6ab7c6e.png)

デバッグ実行します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/347ee981-b7fe-0e37-4332-3ea5ff9ab989.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/b647ef4c-eefe-8360-17ec-874c65d48795.png)

thread_0_counterの値が増加しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/f7b6161e-b6be-30e9-cc67-189a891bd4e6.png)
vueでrequire()を使うとエラーが起きて動かなくなってしまった。

## はじめに

vueでconponentを作成しpropsを使って画像のpathを渡そうと思ったがうまく表示させる事ができなかった。
色々試してみて解決方法と原因がわかったので同じ現象に合った方は試してみてください。

## 環境
- M1 mac book
- vite
- vue3
- nuxt3

## 試してみた事①

`require()`を使う。

propsで画像のpathを渡したい時などはrequire()を使えばいいと記事では多くみた。

- 親コンポーネント
  ```js
  <script setup lang="ts">
    import srcImg from "画像path"
  </script>
  <template>
    <component/ :srcImg="srcImg">
  </template>
  ```
- 子コンポーネント
  ```js
  <script setup lang="ts">
    const props = defineProps({
      srcImg : String,
    })
  </script>

  <template>
    <div>
      <img :src="srcImg" alt="画像">
    </div>
  </template>
  ```
この方法が一番多く記事としてあったが自分の環境ではうまく表示する事ができなかった
  
## 試してみた事②

`import`を使って画像のpathを読み込む

自分の環境では`vite`を使って開発しています。
どうやら`vite`を使っていると`require()`を使う事ができないらしい。
（原因はここだった）

この方法を使ってうまく表示する事ができました。

- 親コンポーネント
  ```js
  <script setup lang="ts">
    import srcImg from "画像path"
  </script>
  <template>
    <component/ :srcImg="srcImg" >
  </template>
  ```

- 子コンポーネント
  ```js
  <script setup lang="ts">
    const props = defineProps({
      srcImg : String,
    })
  </script>

  <template>
    <div>
      <img :src="srcImg" alt="画像">
    </div>
  </template>
  ```

## まとめ

一度`vite`を使ってしまうと`vue-cli`には戻れる気はしないので解決できてよかったです。
彼女生成コマンド公開(feat. Web UI)

やり方はネットで山ほどあるのでこちらはコマンドのみ共有しておきます。

![16247-20230331223059__20230331223038__3538458946.0__20230331_223059_299691.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119461/7d922a11-6ea9-c070-62d4-6a4dba758a88.jpeg)

```
ulzzang-6500-v1.1, Random posture, (raw photo,8k,photorealistic:1.3),(masterpiece, best quality), 35mm shot, 8k,Fujifilm XT3,masterpiece, detail face, beautiful detailed eyes, ultra realistic details, sharp focus, looking at viewer, detailed skin,on back, (a young girl, solo) , (detailed beautiful face, detailed perfect skin), (beautiful detailed eyes), <lora:yaeMikoRealistic_yaemikoMixed:0.3>, extremely detailed, high res, best quality, korean girl, full body, 1girl, ulzzang-6500, kpop idol, yae miko, detached sleeves, brown hair, long hair, best quality, (wave hair:1.35), jewelry, brown eyes, standing, revealing modern outfit, see through, low cut, portrait, looking at viewer, solo, bokeh, professional light, detailed skin,<lora:Hana_Bunny_v1.5.1:0.7>,looking at viewer,Fashion entrepreneur teacher,full body, standing,on the street, sunny morning,standing,full body, standing,in the modern city,(Silk blouse), (wide skirt), (pumps), shulder bag
```
Negative Prompts
```
nsfw, sketches, (worst quality:2), (low quality:2), (normal quality:2), lowres, normal quality, ((monochrome)), ((grayscale)), skin spots, acnes, skin blemishes, bad anatomy,(fat:1.2), lowres,bad anatomy,bad hands, text, error, missing fingers,extra digit, fewer digits, cropped, worstquality, low quality, normal quality,jpegartifacts,signature, watermark, username,blurry,bad feet,cropped,poorly drawn hands,poorly drawn face,mutation,deformed,worst quality,low quality,normal quality,jpeg artifacts,signature,watermark,extra fingers,fewer digits,extra limbs,extra arms,extra legs,malformed limbs,fused fingers,too many fingers,long neck,cross-eyed,mutated hands,polar lowres,bad body,bad proportions,gross proportions,text,error,missing fingers,missing arms,missing legs,extra digit, extra arms, extra leg, extra foot
```

```
Steps
32
Sampler
DPM++ SDE Karras

Size
512x768

CFG Scale
11

Model
ChilloutMix

Seed
3538458946


```
TypeScript esbuildでKnexの入ったプロジェクトをビルドしようとするとエラーが出るときの対処法

```sh
✘ [ERROR] Could not resolve "better-sqlite3"
```
など、様々なDBのdriverが解決できないよ、というエラーが出る。
bundle時にknex内の依存を解決しようとしてエラーが出ているんだろう。

対処法はexternalにknexを追加すること。

```javascript:build.mjs
await esbuild.build({
  entryPoints: ["./src/main.js"],
  platform: "node",
  outfile: "./dist/main.js",
  tsconfig: "tsconfig.build.json",
  packages: "external",
  bundle: true,
  minify: true,
  external: ["knex"], //←これ
});
```

cliでやるなら
```sh
--external:knex
```
とかでいけると思う(未確認)。
【Laravel10】 composer update時のエラー解決方法

## はじめに
Laravel 10がリリースされ、早速アップグレードしようとComposerで依存関係を更新したところ、エラーが発生したので解決手順を記す。

## エラー内容
```
Your requirements could not be resolved to an installable set of packages.

Problem 1
- laravel/framework[v10.0.0, ..., 10.x-dev] require composer-runtime-api ^2.2 -> found composer-runtime-api[2.2.0, ..., 2.x-dev] but it conflicts with your root composer.json require (1.10.22)
- Root composer.json requires laravel/framework ^9.0 -> satisfiable by laravel/framework[v9.0.0, ..., 9.x-dev].

```

## 原因
- ComposerのランタイムAPIバージョン22が必要とされており、古いバージョンのComposerを使用しているために発生しているエラーらしいです。

## 解決策
解決策は、最新バージョンのComposerにアップグレードすることです。最新バージョンのComposerには、ランタイムAPIバージョン22が含まれているため、エラーが解消されます。


- 現在のComposerバージョンを確認します。
```
composer --version
```

- もしバージョンが古い場合は、次のコマンドを実行して最新バージョンにアップグレードします。
```
composer self-update
```

- アップグレードが完了したら、Laravelの依存関係を更新するために以下のコマンドを実行します。
    - これで、Laravel 10の依存関係が正しく更新され、エラーが解消されます。

```
composer update
```

## 終わりに
- 以上が、Laravel 10のアップグレード時に発生するエラーとその解決方法です。Composerのバージョンを最新に保つことで、このようなエラーを回避することができます。

## 参考
- https://www.itsolutionstuff.com/post/laravel-10-laravel-frameworkv1000-require-composer-runtime-api-22-solvedexample.html
ChatGPT x VoiceVoxを使った恋愛攻略ゲームをつくりました。 ~ Love Is War ~

まずはURLの紹介から。

https://droid.studio/love-is-war

## どんなゲームか？
テキスト入力で攻略対象キャラクターと会話をして、愛情（🥰）が５個貯まったらクリアです。同時または先にヘイト（😩）が５個貯まったらゲームオーバーです。

クリアとゲームオーバー、それぞれに記念イラストを追加しており、クリアした人だけが見れるようになっています。

ユーザーはテキスト入力だけですが、キャラクターは音声合成で発話してくれるようになってます。ぜひスピーカーをONにしてお楽しみください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16795/b0b76133-8e2d-4d38-cae6-76b7f52c4266.png)

音声には仮で『VOICEVOX:雨晴はう』を利用させてもらいました。このあたりは後々キャラクターごとに切り替えたりしてキャラクター固有の特徴を増やしていきたいと思いますが、まずは色々とシンプルにつくってみました。

## なぜつくったのか？

dalaさんがつくったAIバトラーに触発された形です。もともとはChatGPT x VoiceVoxを使った別のサービスをつくってたんですが、dalaさんのAIバトラーを触ってこれは面白いとなって、短期で作れるサービスを頭の横隅で考えていたら、友人から「ChatGPTを使ったギャルゲーとかどない？」と相談がきて、そこから始まりました。(2023.3.26）

もともと別サービス用としてChatGPTとVoiceVox連携の実装をしていたので、UI整えとキャラクター用の特徴設定を考えるだけでつくれた形です。

画像には全面的にStable Diffusion由来の画像生成を使っています。（多分界隈の人なら、見ただけで「アレ使ってるな」とわかるハズ。）

## なんか攻略が簡単じゃない？

まだまだキャラクター設定まわりの反映が弱いので、今後改善していくつもありです。
本気で攻略を楽しみたい方はこちらのリツちゃんがおすすめです。検証が少ないのもありますが、お試ししてもらった方にもまだクリアされてないので、もしクリアできた方いれば #LoveIsWar のハッシュタグをつけてツイートください。

https://droid.studio/love-is-war/ritsu

## 今後どうなるのか？

現在はまだまだキャラクター設定とその反映に粗があるので、攻略難易度が基本的に低かったり、ゲーム性が弱い部分があります。

まずはその部分を改善しつつ、その後はユーザーが自由に『うちの子』を登録できる場をつくるつもりです。

## 今後の更新情報が知りたい方

自分がTwitterヘビーユーザーなのもあり、とりあえず@taiyopをフォローしといてくれると一番最初に告知できると思います。Twitterでちょい出ししつつ、キリのよいところで今回のように記事化して発信するかと思います。

https://twitter.com/taiyop

## P.S.


Discord版フリーランスコミュニティをつくりました。
自分がエンジニアよりだったのもあり、メンバーにはエンジニアが多いですが、デザイナーの方などもいます。現在80名超えたところです。
Discordは音声対話やチャンネル自由度も高いので、各フリーランスが本業に集中できるように総務や会計業務、営業開拓など幅広く且つ横断的に効率的に情報種集・交換できるような場を目指してますので、興味ある方のご参加お待ちしてます。（フリーランスを目指してる方の情報収集の場としても活用してもらって大丈夫です）

Discord招待リンク↓
https://discord.gg/5EGxKRD746
ESP カード５枚の正答率は？（その３）


## 目的

「[ESP カード５枚の正答率は？（その２）](https://qiita.com/tadashi9e/items/90420ee524bff68f553c)」で出した確率を、別の方法で出したいと思います。

## 計算の方法

カード１枚の場合をまず考えます。「正答カード数０枚」、「正答カード数１枚」の２通りがあって、それぞれの確率は

- 「正答カード数０枚」の確率は $\frac{4}{5}$
- 「正答カード数１枚」の確率は $\frac{1}{5}$

であることはカードの絵柄が５パターンであることから明らかです。

ここでさらにもう一枚カードを当てることを考えると、

- 「正答カード数０枚」の確率は、元の「正答カード数０枚」の確率 $\frac{4}{5}$ に新たなカードが不正解である確率 $\frac{4}{5}$ をかけたもの
- 「正答カード数１枚」の確率は、元の「正答カード数１枚」の確率 $\frac{1}{5}$ に新たなカードが不正解である確率 $\frac{4}{5}$ をかけたもの＋元の「正答カード数０枚」の確率 $\frac{4}{5}$ に新たなカードが正解である確率 $\frac{1}{5}$ をかけたもの
- 「正答カード数２枚」の確率は、元の「正答カード数１枚」の確率 $\frac{1}{5}$ に新たなカードが正解である確率 $\frac{1}{5}$ をかけたもの

として計算することができます。

このように「カード N 枚引いた時点での確率分布 ${\bf P}^{N}$ に新たなカードを引いてカード N+1 枚を引いた時点での確率分布 ${\bf P}^{N+1}$ を得る手順（ここで、カード N 枚当てにいった時点での正答カード数 n の確率を $P^{N}_{n}$ と表記する）」を一般化すると

```math
\begin{align}
P^{N+1}_{n+1} &= \frac{4}{5} \times P^{N}_{n+1} + \frac{1}{5} \times P^{N}_{n}  \\
P^{N+1}_{0} &= \frac{4}{5} \times P^{N}_{0}
\end{align}
```

と書くことができます。

これを述語として書くとこんな感じになります。


```prolog
カードを当てる([], [_全カード正解の確率], _全カード正解の確率).
カードを当てる([_確率|_確率リスト残], [_当てた後の確率|_当てた後の確率リスト残], _正解カード数が増える確率) :-
    _当てた後の確率 is _確率 * (4 / 5) + _正解カード数が増える確率,
    _次の正解カード数が増える確率 is _確率 * (1 / 5),
    カードを当てる(_確率リスト残, _当てた後の確率リスト残, _次の正解カード数が増える確率).
カードを当てる(_確率分布, _当てた後の確率分布) :-
    カードを当てる(_確率分布, _当てた後の確率分布, 0).
```

初期条件

```math
P^{0}_{n} =
 \begin{cases}
   1 & n = 0 \\
   0 & n \ne 0
 \end{cases}
```

から出発して、カードを当てる手順を５回繰り返すと、求めたい確率分布が得られます。


```prolog
カード5枚を当てる(_カード5枚の場合の確率分布) :-
    カードを当てる([1], _カード1枚の場合の確率分布),
    カードを当てる(_カード1枚の場合の確率分布, _カード2枚の場合の確率分布),
    カードを当てる(_カード2枚の場合の確率分布, _カード3枚の場合の確率分布),
    カードを当てる(_カード3枚の場合の確率分布, _カード4枚の場合の確率分布),
    カードを当てる(_カード4枚の場合の確率分布, _カード5枚の場合の確率分布).
```

::: note
数式そのまま、以下のように書いたほうがよいかもしれません。

```prolog
p(0, 0, 1).
p(0, _, 0).
p(T, 0, P) :-
    T_1 is T - 1,
    p(T_1, 0, P1),
    P is (4 / 5) * P1.
p(T, N, P) :-
    T_1 is T - 1,
    N_1 is N - 1,
    p(T_1, N, P1),
    p(T_1, N_1, P2),
    P is (4 / 5) * P1 + (1 / 5) * P2.
カード5枚を当てる([_0枚当たる確率,
                  _1枚当たる確率,
                  _2枚当たる確率,
                  _3枚当たる確率,
                  _4枚当たる確率,
                  _5枚当たる確率]) :-
    p(5, 0, _0枚当たる確率),
    p(5, 1, _1枚当たる確率),
    p(5, 2, _2枚当たる確率),
    p(5, 3, _3枚当たる確率),
    p(5, 4, _4枚当たる確率),
    p(5, 5, _5枚当たる確率).
```
:::

確率分布を求めて、その結果を表示する述語を書き下すと、以下のようになります。


```prolog
:- initialization(main, main).
main(_) :-
    カード5枚を当てる(_カード5枚の場合の確率分布),
    各正解カード数についての確率を表示する(_カード5枚の場合の確率分布).

結果を表示する(_正答カード数, _確率) :-
    _確率_パーセント is _確率 * 100,
    format('~d ... ~|~` t~3f%~7+~n', [_正答カード数, _確率_パーセント]).

各正解カード数についての確率を表示する([], _).
各正解カード数についての確率を表示する([_確率|_確率分布], _正答カード数) :-
    結果を表示する(_正答カード数, _確率),
    _次の正答カード数 is _正答カード数 + 1,
    各正解カード数についての確率を表示する(_確率分布, _次の正答カード数).
各正解カード数についての確率を表示する(_確率分布) :-
    各正解カード数についての確率を表示する(_確率分布, 0).
```

## 結果

実行すると：

```
0 ... 32.768%
1 ... 40.960%
2 ... 20.480%
3 ...  5.120%
4 ...  0.640%
5 ...  0.032%
```

となり、「[ESP カード５枚の正答率は？（その２）](https://qiita.com/tadashi9e/items/90420ee524bff68f553c)」の結果と同じものが得られました。
Googleデジタルマーケティング＆Eコマース：シナリオに基づいた一連のアクティビティ

# はじめに

”Googleデジタルマーケティング＆Eコマース プロフェッショナル認定証"　の受講が完了しました(2022/3/3)。私がこのコースから得られた素晴らしい体験を、テーマごとに分割して、わかりやすくご紹介しています。興味を持たれた方は、是非下記を受講してみてください。

https://jp.coursera.org/professional-certificates/google-digital-marketing-ecommerce

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/05f6fefc-adb6-1242-4eb1-528a10511727.png" width="800">

# シナリオ概要

シンクレア・ベルデ・ランプ・カンパニーは、アリゾナ州フェニックスに拠点を置く店舗型家具小売業者です。同社の特徴は、「アップサイクル」と呼ばれるプロセスで不要な製品をランプに変えることで、廃棄物を減らすことに取り組んでいることです。売上げの一部は、非営利の環境支援団体に寄付されています。

最近、同社はオンラインストアを開設しました。オンラインショップの全体的な目標は、ブランドの認知度を高め、実店舗への来店を促進することです。

この目標を達成するために、同社はデジタルマーケティングとEコマースの代理店であるグッドマーキュリーマーケティングに協力を依頼し、デジタルマーケティング戦略プランを策定しました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/76bd0fd8-228d-3736-6bc2-0b64aecc4244.png" width="600">

# デジタルマーケティング戦略

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/4df831b6-86b1-e90b-e1aa-55ed04ad3e0e.png" width="700">

### Activity: Create an internal marketing proposal

グッドマーキュリーマーケティングのあなたのチームは、シンクレア・ベルデ・ランプ社のブランド認知度を高めるための事前調査を始めており、想定する人口統計学的な対象者（42歳から57歳の成人）に関する情報を収集しました。

このチームは、デジタルマーケティング初級者のあなたに、ターゲット層におけるブランド認知度の向上に焦点を当てた社内マーケティング提案書の作成を依頼しました。この提案は社内で共有されます。つまり、クライアントのブランド認知度を高めるための良い選択肢かどうかを判断するために、あなたのチームでのみ共有されるのです。

社内マーケティング提案書を作成するには、予算、スケジュール、サポートデータを考慮する必要があります。

- [Activity: Create an internal marketing proposal][a1]

[a1]: https://docs.google.com/document/d/12tjnWMeJ-zDE9xX78EBz7y-IlL-ra3vVVNT7iTuV2Hk/template/preview

### Activity: Adjust your campaign keywords

検討の結果、Good Mercuryのマーケティングチームは、シンクレア・ベルデ・ランプ社のために、Google Adsの検索キャンペーンを含むいくつかの異なるキャンペーンを実施することに決定しました。検索キャンペーンとは、Googleの検索結果に表示されるテキスト広告のことで、商品やサービスを探している人にアプローチすることができます。

このキャンペーンの検索広告では、ゴミを減らすという会社のミッションを説明するテキストが表示されます。しかし、このキャンペーンは30日前に開始されたばかりで、まだあまり成功していないという問題があります。

検索広告キャンペーンは、クリック単価（CPC）の入札戦略で動作します。CPCとは、ウェブサイトへのトラフィックを促進するために使用されるインターネット広告モデルで、広告がクリックされたときに広告主が出版社に支払うものです。

問題は、90%以上の視聴者が広告をクリックしていないことです。

クリック率を上げるために、あなたのチームは、広告キャンペーンに関連する特定のトピックとキーワードを調整するよう求めます。あなたのチームが実施した調査によると、トピックとキーワードを更新することで、クリック率が20%も向上する可能性があるとのことです。

- [Activity: Adjust your campaign keywords][a2]

[a2]: https://docs.google.com/spreadsheets/d/1ZrEEDEPRcVzAJNVOIu1LJ5hURxPWQ7nZQTXI7JhEulY/template/preview?resourcekey=0-OnuRpaCTz7ph5_brko5GSg#gid=1777151016

### Activity: Create a marketing report presentation

シンクレア・ベルデ・ランプ社があなたの代理店であるグッドマーキュリー・マーケティングのクライアントになってから、1年以上が経過しました。毎年、年末になると、あなたのチームはマーケティングプレゼンテーションでクライアントに進捗状況を発表します。このプレゼンテーションでは、昨年度うまくいったこと、改善すべきことを詳しく説明します。プレゼンテーションの作成と実施は、戦略的なマーケティング施策や長期的なプロジェクトの影響を検証し、クライアントやステークホルダーなど、キャンペーンにとって重要な人々に調査結果を伝えるための素晴らしい方法です。

あなたは、シンクレア・ベルデ・ランプ社の今年のマーケティングレポートプレゼンテーションを作成するよう依頼されました。 あなたは、Google Analyticsから収集したデータに基づいて調査結果を作成することになります。

プレゼンテーションには、毎月のソーシャルメディアデータと総トラフィックデータを含める予定です。また、2年連続でクライアントのマーケティング業務を担当することになったため、ホリデーシーズンのマーケティングデータも含まれます。

- [Activity: Activity: Create a marketing report presentation][a3]

[a3]: https://docs.google.com/presentation/d/10q28X7CTMIinQtkv0fLRHSf_5CwZjN3IS0MRzga4H-g/template/preview#slide=id.p
日本語の歌詞を外国語で考えて、音読させてみる。

# UPDATE

ネタのついでであるが、おもろいことがあり報告する。

ミスチルのTomorrow never Knowsという曲があるが、
日本人でさえ、桜井氏の歌詞を歌うのは、なかなか難しい。

# 外国語ルビ
　日本語の歌詞を外国語で考えて、音読させてみる。

　GOOGLE翻訳を使う　　→　　https://translate.google.co.jp/

元ネタ
　https://www.utamap.com/showkasi.php?surl=54853

## 英語

Total more alcohol to wash ill and night,talking know nut cut day,e coo two more no.
wood too lee you cool much nah me war,meets you maid hate eater.

https://motochan1969.hatenablog.com/entry/20210410/1618015566

## 中国語

多都马儿口躲 我 西朗那一、多给能那个地、一股粗磨弄
物资里语库马七纳米我、米子没得以他

https://motochan1969.hatenablog.com/entry/20210410/1618016031


## 考察

　今回はミスチルぽく歌うというよりは、歌詞の朗読っぽい感じになった。
カラオケのように歌うには、もう少し工夫がいるかもしれない。

　外国人の方に、これを実際に読んでもらい、ブラッシュアップする必要がある。

# ネタとして

 普段の逆のことをやってみたが、案外日本人にとっては
日本語を外国語に当てはめる方が楽なのかもしれない。

　少なくとも外国人との会話のネタにはなるし、
語学学習者としては、なかなか面白い遊びである。

　コロナが終わったころに、またドミトリーでテストするため、
何曲かのレパートリーを所持しておきたいと思う。

って、これって大変なので、Deeplearningでやってみたらいいのではないかと思う。
ChatGPTのAPIを利用する


# 背景
ChatGPTは[OpenAPIのWebサイト](https://chat.openai.com/chat)で以前から利用することができましたが、APIは公開されていませんでした。（OpenAIは様々なAIモデルのAPIを公開しています)
しかし、[公式ブログ](https://openai.com/blog/introducing-chatgpt-and-whisper-apis)に記載の通り2023/3/1よりChatGPTモデルがAPI利用できるようになりました。

# 利用方法

## Webページにアクセス

[公式ブログ](https://openai.com/blog/introducing-chatgpt-and-whisper-apis)から[Get started](https://platform.openai.com/signup)をクリックします。

![スクリーンショット 2023-03-25 8.05.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135548/de25122d-f1f7-24dc-c777-d89d7f39d845.png)

OpenAIアカウント登録が済んでいない場合は、登録が必要になります。嬉しいことに、$18のFree trialがありますので、APIを少し使ってみたいだけであれば無料で利用できます。



ログインが完了すると[overview](https://platform.openai.com/overview)のpageに遷移します。

![スクリーンショット 2023-03-25 8.11.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135548/832ce792-1520-dd64-ee1d-34ec577d8a91.png)


利用状況については[Usage](https://platform.openai.com/account/usage)から確認できます。


![スクリーンショット 2023-03-25 8.08.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135548/26f42940-8538-56b5-d14b-6e1fa718500f.png)


## API_KEYの発行

右上の自分のアカウントのアイコンをクリックし「View API keysをクリックします。

![スクリーンショット 2023-04-01 7.58.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135548/fcfb9e56-e936-6a10-9535-58f79779f8aa.png)

以下の画面に遷移するので、ここで「Create new secret key」をクリックします。

![スクリーンショット 2023-04-01 7.59.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135548/6f5b69d0-dc08-9f6f-9783-a19be5077b29.png)

※ここで生成されるkeyは他者に共有しないようにします。

# 実装

[Q&Aのサンプル](https://platform.openai.com/examples/default-qa)があるので、これを参考に日本語で会話してみます。

```py
import os
import openai
openai.organization = "org-vbYVbGD298zXX4KnA1HEVA1j"
openai.api_key = 'ここにAPI_KEYを入れる'

response = openai.Completion.create(
  model="text-davinci-003",
  prompt="Q: あなたは日本語を理解できますか?\nA:",
  temperature=0,
  max_tokens=100,
  top_p=1,
  frequency_penalty=0.0,
  presence_penalty=0.0,
  stop=["\n"]
)
print(response)
```

`model`で`text-davinci-003`を指定していますが、これでGPT-3.5が利用できています。
https://platform.openai.com/docs/models/gpt-3-5

各パラメータの詳細は以下を参照してください。

https://platform.openai.com/docs/api-reference/completions
Googleデジタルマーケティング＆Eコマース：顧客満足度の測定

# はじめに

”Googleデジタルマーケティング＆Eコマース プロフェッショナル認定証"　の受講が完了しました(2022/3/3)。私がこのコースから得られた素晴らしい体験を、テーマごとに分割して、わかりやすくご紹介しています。興味を持たれた方は、是非下記を受講してみてください。

https://jp.coursera.org/professional-certificates/google-digital-marketing-ecommerce

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/05f6fefc-adb6-1242-4eb1-528a10511727.png" width="800">

# 顧客満足度の測定

お客様がビジネスをどのように見るかは、そのビジネスでの経験や個人的な成果によって大きく左右されます。オンラインビジネスにおける顧客とのやり取りは、直接的であれ間接的であれ、将来的に再訪問を選択するかどうかに影響します。そのため、Eコマースビジネスでは、常に顧客満足度を評価することが重要です。

顧客満足度の測定には、製品やサービスのパフォーマンスを、顧客がどのように受け止めているかを調査することが含まれます。顧客満足度を測定することのメリットは、ビジネスの利益や競争優位性を高めることができる点です。

以下は、顧客満足度の測定方法の手順です。

## 1.目標の設定

企業が顧客満足度の測定を始める前に、何を改善すべきかを定義する必要があります。オンラインストアでの購入者の体験には、購入する商品の選択、チェックアウト・プロセス、商品の配送など、多くのステップがあります。これらのステップには、それぞれ何か問題が発生する可能性があるため、何をリサーチ目標とするかを具体的に考えることが重要です。

目標は具体的で、測定可能で、達成可能で、関連性があり、時間を区切ったものであるべきだと学びました。このことを念頭に置きながら、目標を立ててください。

目標の例としては、以下のようなものがあります。

- 冗長性と顧客との摩擦を低減する。
- セルフサービス・オプションを提供する。
- 販売担当者をeコマース・カスタマー・サービス・エージェントに置き換える。
- カスタマーレビューを真摯に受け止める。
- 問題を迅速に解決する。
- 1回の対話で問題を解決する。
- カスタマーサービス担当者がフレンドリーであることを確認する。
- 必要に応じて同じ担当者にフォローアップできる。
- 対話の内容を記録、印刷、保存できる。
- お客様に満足していただくために、その後のフォローアップができる。

## ２．顧客満足度調査の種類を選択する

以下は、一般的な顧客アンケートの種類です。

### <font color="MediumBlue">顧客満足度（CSAT）調査</font>

顧客満足度調査（CSAT調査）は、製品やサービスに対する顧客の満足度を測定するために使用されます。

### <font color="MediumBlue">ネットプロモータースコア（NPS）調査</font>

ネットプロモータースコア調査は、回答者に企業や製品、サービスを友人や同僚に薦める可能性を、「全く可能性がない」の0から「非常に可能性がある」の10までで評価してもらう単一質問形式の調査です。特定のサービスやブランドに対する顧客満足度を測る一般的なCSAT調査とは異なり、NPS調査は顧客の企業に対するロイヤリティを測ることを目的としています。スコアは3つのカテゴリーに分類される。

- プロモーター：9点または10点の回答者。彼らはブランドに対して熱狂的であると考えられています。
- 受動的な人：スコアが7または8の回答者。彼らは、満足しているが、ブランドを促進するほど熱心ではないと考えられる。
- 消極的: スコアが6以下の回答者。不満足で、その企業で再び買い物をする可能性は低いと考えられている。

NPSスコアを計算するために、企業は推進派の割合から消極派の割合を引きます。
- 例えば、15％が不満足で、60％が推進派の場合、全体のNPSスコアは45％になります。

### <font color="MediumBlue">ユーザビリティ調査</font>

Eコマースビジネスの場合、購入のほとんどはオンラインストアで行われます。ユーザビリティ調査は、企業のWebサイトに対するお客様の満足度に関係し、お客様が買い物をする過程で経験する可能性のある問題を特定します。

## 3.調査媒体の選択

アンケートの種類を選択したら、次はアンケートの媒体を選択します。

媒体には以下のようなものがあります。

- アプリ内またはオンサイト調査
- サービス利用後や購入後のアンケート
- 長文メールアンケート

:::note info
顧客からのフィードバックを受けると、顧客が自社のブランド、サービス、製品についてどのように感じているかを確認することができます。また、収集したデータの傾向から、今後のショッピング体験をより満足度の高いものにするために、フィードバックを実施することも可能です。
:::
Smart Contractにおけるアクセス制御の脆弱性

### スマートコントラクトのアクセス制御を理解する
アクセス制御は、アプリケーション内のユーザーの権限と役割に関する制限を定義します。スマートコントラクトにおけるアクセス制御は、ガバナンスや重要なロジック（トークンの発行、提案への投票、資金の引き出し、コントラクトの一時停止やアップグレード、所有権の変更など）に関連しています。

### OpenZeppelinのアクセス制御ライブラリ
多くのスマートコントラクトでは、OpenZeppelinのOwnershipライブラリが使用されています。OpenZeppelinのOwnableは、「onlyOwner」のようなmodifierを定義し、関数呼び出しを行っているユーザーがコントラクトの所有者であるかどうかをチェックします。他のライブラリも、「hasRole」のようなmodifier/関数を使ってユーザーが関数を呼び出す権限を持っているかどうかをチェックします。スマートコントラクトは、要件に応じてカスタムロールを定義できます。これらのロールは特権ユーザーに割り当てられ、OpenZeppelinライブラリを使ってこれらのロールを検証することができます。

https://docs.openzeppelin.com/contracts/2.x/access-control

### アクセス制御に関連する一般的な脆弱性
アクセス制御に関連する最も一般的な脆弱性は以下のように絞り込むことができます。

1. modifier検証の欠落 - 所有者の変更、資金およびトークンの移転、コントラクトの一時停止および再開などを実行する重要な関数には、アクセス制御の検証が必要です。modifierまたはrequire文や条件文内の検証が欠けていると、コントラクトの危険性や資金の損失がほぼ確実に発生します。

2. 不正確なmodifier名 - 開発者のミスやスペルミスにより、modifierや関数の名前が意図したものとは異なる場合があります。悪意のある攻撃者は、modifierなしで重要な関数を呼び出すためにこれを悪用することもあり、関数のロジックによっては資金の損失や所有権の変更につながる可能性があります。

3. 過剰な権限を持つロール - ユーザーに過剰な権限を持つロールを許可すると、脆弱性が生じる可能性があります。特権を割り当てる際には、最小限の特権の原則を常に守る必要があります。

### Summary
スマートコントラクトのセキュリティは、アクセス制御の脆弱性によって深刻な影響を受けることがあります。攻撃者は資金を盗んだり、データを操作したり、コントラクトを破壊したりすることができます。コントラクトがアクセス制御攻撃に対して脆弱でないことを確認するために、コントラクト開発者は注意深く設計し、テストを行うべきです。また、modifierを使用する際はミススペルなどや検証漏れを防ぐために、既に多くの人に精査されて使用されているライブラリを使用することも大切です。
Anacondaはシステム環境変数の設定方法が異なるらしい

# 目的

皆様の時間を奪わないようにする。

# 経緯

discord.pyでシステム環境変数にDISCORD_BOT_TOKENとしてTOKENを設定したが、なぜかエラーになる。

調べたところ、Anacondaとcmdでは環境変数の設定が異なることを知った。

# 該当のソース(一部抜粋)

``` python
import os
import discord

# Bot のアクセストークン
DISCORD_BOT_TOKEN = os.environ.get("DISCORD_BOT_TOKEN")
```

システム環境変数にはTOKENの値が設定してある状態で、エラーが発生した。

# 解決法

🤔「せや！Chat GPTに聞いたろ！」

``` cmd

Anacondaを使用している場合、環境変数を設定する方法が異なります。次の手順に従って、Anaconda環境に環境変数を設定してください。
まず、Anaconda Promptを開きます。
現在の環境に環境変数を追加するには、次のコマンドを実行します
（your_tokenを実際のDiscord Botトークンに置き換えてください）:

conda env config vars set DISCORD_BOT_TOKEN=your_token

環境変数が設定されたことを確認するには、次のコマンドを実行してください:

conda env config vars list

設定が完了したら、環境を再アクティブ化する必要があります。
次のコマンドを実行してください（your_env_nameを実際の環境名に置き換えてください）:

conda activate your_env_name

これで、Anaconda環境に環境変数が設定され、Pythonスクリプトからアクセスできるようになります。
環境変数が正しく設定されているかどうかをテストするには、次のPythonコードを実行してください:

import os

discord_bot_token = os.environ.get("DISCORD_BOT_TOKEN")
print(f"Discord Bot Token: {discord_bot_token}")

これにより、設定した環境変数の値が表示されます。

```

## 実行結果

``` python
python source.py

>>> Discord Bot Token: 設定したトークン
```
300円で買える教育用マイコンPICAXEへの書き込み環境を構築する

# はじめに
PICAXEというPICマイコンがベースの教育用マイコンをご存じでしょうか？PICマイコンと比べると少し値は張りますが、無償の開発環境が用意され、BASIC言語やビジュアルプログラミング言語を使って手軽に電子工作を始められることが魅力です。今回は書き込み回路、ソフトウェアなどの開発環境を整え、試しにLEDを点滅させるところまで試してみたいと思います。
![picaxe_blink.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951963/25da0a26-048f-0c40-a948-0d2f8963d916.jpeg)
# 開発環境
* Windows 11 Home 22H2 (22621.1265)
* PICAXE Editor 6.1.0.0

ソフトウェアは無償です。[__こちら__](https://picaxe.com/software/)からダウンロードできます。
# 書き込み
専用の書き込み装置がなくても汎用のUSBシリアル変換モジュールがあれば書き込みできます。ただし、PICAXEの場合は2本の信号線RXD、TXDを論理反転する必要があるそうです。今回は汎用のロジックICを使って書き込み回路を作りました。手元にNOT回路がなかったため、NAND回路で代用しています。NAND回路の入力同士を接続すればNOT回路となります。誤作動を防ぐため、未使用の出力端子はオープン、入力端子はGNDか電源どちらかに接続しておく必要があります。
![schematic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951963/39e194c7-e45a-17ca-0291-df22c906c800.png)
# 部品表
PICAXEにも数種類あり、ピン数などが異なるので用途により使い分けることができます。今回はPICAXE-14M2を使いました。ピン配置は以下の通りです。また、他のPICAXEのピン配置も[__こちら__](https://picaxe.com/what-is-picaxe/picaxe-pinouts/)より確認できます。
![picaxe-14m2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951963/33f13c03-8fb6-0a8e-b119-665b38377e6a.jpeg)最も小型なのは8ピンのPICAXE-08M2となります。シリアル通信周りのピン配置は同じなので、今回の書き込み回路がそのまま使えます。PICAXE-14M2は動作電圧範囲が1.8Vから5.5Vと広く、GPIOも多いので便利です。
| 部品名 | 通販コード | 個数 | 価格 |
|:--|:--|--:|--:|
| PICAXE-14M2 | I-06610 | 1個 | 280円 |
| TC74HC00AP | I-10856 | 1個 | 30円 |
| 22kΩ抵抗 | R-07843 | 2個 | 3円 |
| 100Ω抵抗 | R-07803 | 1個 | 1円 |
| USBシリアル変換モジュール | K-06894 | 1個 | 750円 |
| ブレッドボード | P-00313 | 1個 | 300円 |
| ジャンパー線 | P-02315 | 1個 | 300円 |

これらの部品は[__秋月電子通商__](https://akizukidenshi.com/)から入手できます。
# 回路構成
実験用のLEDをピンB.2に接続しています。
![picaxe_download_circuit_breadboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951963/6434a8dc-0328-7cc2-0d28-e3fea4140a72.png)
# プログラム
今回はビジュアルプログラミング言語を試してみました。直感的に操作しやすかったです。
![picaxe_blink_blockly.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951963/2e7f3506-a2d2-35de-a4f2-84fbc346d5bf.jpeg)
# 動作確認
USBシリアル変換モジュールをパソコンに接続し、書き込みが完了するとLEDが点滅し始めます。ただし、単体で動かす場合はピンC.5をプルダウンする必要があるみたいです。USBシリアル変換モジュールを接続したままなら問題なく動作しました。
# おわりに
BASIC言語に加えてビジュアルプログラミング言語も使えるなど、開発環境が充実していて使いやすかったです。
# 参考文献
+ http://eleclabyrinth.blog.fc2.com/blog-entry-3.html
+ http://airvariable.asablo.jp/blog/2013/05/11/6807569
ローカル(VirtualBox)でのGo実行環境構築

# 作業環境
| 項目 | 値 |
| :---: | :---:|
| 仮想OS | Amazon Linux2 |
| CPU | 2 Core |
| 実装RAM | 2 GB |
| Disk | 25 GB |

# 必要なツール
* SSH接続できるもの(Teratarm,Putty,Rloginとかなんでも)
* _Virtualbox_ + _Vagrant_ で構築した仮想環境

# 必要な知識
* Linux操作に対する知見

# 対象リソース
golang 1.18.9-1.amzn2.0.1

# 作業内容
* 対象環境へのログイン
* Goのインストール
* Goを使ってみる

# 作業開始
## 対象環境へのログイン
1. Vagrantfileのある作業フォルダでGitbashを起動する。
1. ログイン先確認
    ```
    $ vagrant global-status
    ```
1. 仮想マシンの起動
    ```
    $ vagrant ssh
    ```
1. 特権への切り替え
    ```
    $ sudo su -
    ```
1. packageのアップデート
    ```
    # yum update -y
    # yum upgrade -y
    ```

# Golangのインストール
1. インストール
    ```
    # yum install golang -y
    ```
1. バージョン確認
    ```
    # go version
    go version go1.18.9 linux/amd64
    ```

# Goを使ってみる
[Go公式チュートリアル](https://go.dev/doc/tutorial/getting-started)の手順を実施してみる。

1. 作業フォルダの作成
    ```
    # mkdir -p ./work/hello && cd ./work/hello
    ```
1. Goモジュールを作る
    ```
    # go mod init example/hello
    # vi hello.go
    # cat hello.go
    package main
    
    import "fmt"
    
    func main() {
      fmt.Println("Hello, World!")
    }
    ```

1. GOを実行する
    ```
    # go run .
    Hello, World!
    ```

# おしまい