OmniAICreator/Qiita-1.07M huggingface dataset:
保育園、幼稚園向けの連絡帳サイトを生成AIの力を駆使してマイクロサービスで作ってみたい～画面デザイン作成～

# はじめに

今までは単発の技術ブログでしたが、今回は初の試みで、パートを分けてシステム開発を行ってみようと思います。

保育園や幼稚園での、保育士さんや幼稚園教諭さん、忙しい保護者の方の日々の事務業務のDXを行い、
もっと子どもたち一人一人に向き合う時間を増やしてもらうための、手助けになるシステムを作成できたらいいなと思います。

生成AIと力技を駆使して一人開発を行います。公開環境へのデプロイまでできないかもですが、
クラウドへの配置も視野にして、いったんローカル環境での動作まで確認できるようにしてみたいと思います。

# STEP
・[要件整理（画面デザイン作成）](https://qiita.com/Jasmine_teeeeee/items/e65e6e41f1eaced9d71d)　 ←いまここ
・フロンドエンド開発
　・[静的画面](https://qiita.com/Jasmine_teeeeee/items/d087b0b309508c7ceaec)
　・[表示切り替え（useState）](https://qiita.com/Jasmine_teeeeee/items/71d5caa3f1d54ccf8918)　
　・[画面遷移（useRouter）](https://qiita.com/Jasmine_teeeeee/items/6848f94dcec817d3e04f) 
　・[APIモック作成](https://qiita.com/Jasmine_teeeeee/items/76294bb468a065400b0e)
・バックエンド開発

## 今回のやることとゴール

このSTEPではお客様要件をヒアリングするイメージです。
今は対面にお客様はいないのですが、いる体で進めていきます。
生成AIのノーコードツールを使用して、動く画面イメージでお客様と対面で使用感を確かめているものだと思ってください。

## 目次

１\. feloで要件資料作成
２\. create.xyzでモック作成

# 開発開始

## feloで要件資料作成

feloにお客様からヒアリングしたやりたいことを伝えて、資料化と要件を具体化しました。

https://felo.ai/search/iVYP2GSbcjn5djNwcz9zrZ?invite=rR4nZw4W4nZMR

※feloってなに？

https://qiita.com/Jasmine_teeeeee/items/0207345c03433c07530e#feloai

### 画面仕様抜粋

#### 1. ログイン機能
目的: 保護者や園の職員が安全にシステムへアクセスできるようにする。

認証方式:

メールアドレスとパスワードによる認証。
2段階認証（セキュリティ強化のため）。
ソーシャルログイン（GoogleやLINEなど）を追加することで利便性を向上。

#### 2. 連絡帳機能
目的: 保護者と園の間でスムーズな情報共有を実現。
機能要件


上部エリア:

前日の園からの連絡事項を表示。
保護者が翌日の連絡事項を入力できるエリアを設置。
入力内容には「既読」や「返信不要」などのオプションを追加することで、過剰なやり取りを防止。


下部エリア:

カレンダー形式で過去の連絡内容を簡単に遡れるようにする。
カレンダーには重要な日付（行事予定や締切日など）をハイライト表示。

検索機能:

期間指定やキーワード検索で過去の連絡内容を素早く確認可能。

通知機能:

新しい連絡事項が登録された際に、保護者へプッシュ通知やメール通知を送信。

UI/UX設計:

スマートフォンでの操作を前提としたシンプルなデザイン。
重要なアクション（例: 送信ボタン）は画面下部に配置し、操作性を向上。

モーダルUI:

連絡事項の追加や編集はモーダルウィンドウで行い、ユーザーが迷わない設計を採用。

## create.xyzでモック作成

### サンプル画面

https://www.create.xyz/share/a1b29673-a263-4478-92ad-e79bc710d83a

create.xyzを使用して画面デザインを作成しました。
実際の動作がその場で確認できて、変更依頼も自然言語で行るのでその場で要望を画面に取り込めます。

※実務では、デザイナーさんを入れてfigmaで作成してもよいと思います。私にはデザインの才能がないので生成AIの力を借りました。

※create.xyzってなに？

https://qiita.com/Jasmine_teeeeee/items/45d4bcd32e82ce7362bb

#### 1. ログイン機能

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/b0840c14-c755-9528-c542-19b5175d426d.png)

#### 2. 連絡帳機能

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/cc64a009-5639-2878-42f8-a557c3e200bb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/4412b3f2-c73e-c7a4-b383-29a439fcf32f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/8dc49f0a-4612-9dd9-e424-fd17644b4adc.png)

# まとめ

サンプル画面を触ってもらえるような開発が行えると、ユーザーさんが製品のイメージが付きやすく、
ステークホルダーを巻き込みやすいのではないでしょうか。

ただし、工数面やセキュリティ面を考慮する必要があり、
今回のcreateの選定が正解だとは思っていません。生成AIを使用したサンプル画面の製造については、まだまだ思い通りのアウトプットが出力されることが保証されず、練度も必要です。

ただこんな選択肢もあるんだ、と知識の幅を増やしていただける機会になれば幸いです。
もっとセキュアな自然言語の理解力が高いモデルがたくさん出てくると思います。
その際にでも思い出していただければと思います。
【JsvaScript】ESModulesのimport/exportについて

# はじめに
初学者のアウトップト兼備忘録です。
間違いや補足等あればご指摘ください。

今回はJSのESModulesについてまとめます。

# ESModulesとは
JSファイルをモジュール化して、他のJSファイルで使うことができるものです。
モジュール化することで、コードを再利用でき、保守性の向上につながります。

# 使い方
１ jsを読み込むscriptタグにtype="module"を記述します。
２ 読み込ませたいJSファイルの関数の頭にexportを記述します。
```module.js
export const hello = () => {
  console.log("hello!");
};
```
３ 読み込みたいJSファイルでimportを記述して読み込みます。
```main.js
import { hello } from "./module.js";
hello();
```

# export、importの書き方
export、importの書き方は大きく分けて3つあります。
１ constで宣言する。
```module.js
export const hello = () => {
  console.log("hello!");
};
```
```main.js
import { hello } from "./module.js";
hello();
```

２ オブジェクトリテラルで読み込む
```module.js
class User {
  constructor(name) {
    this.name = name;
  }
  hello() {
    console.log(this.name)
  }
}

export { User }
```
```main.js
import { User } from "./module.js";

const user = new User("Tom")
user.hello();
```

３　デフォルトエクスポート
```module.js
const hello = () => {
 console.log("hello!");
}

export default  hello;
```
```main.js
import Halo from "./module.js"

Halo();
```
:::note info
export defaultを使う場合、importでは{}で囲わない。
また、Haloの部分は変更できます。
:::
:::note warn
デフォルトエクスポートはモジュールにつき１つのみ使用できます。
:::

終わり
まだ初心者ですが、デプロイまでできました。

# はじめに
　独学でnode.js, react, typescriptを勉強してUdemy講座をみながら制作したことはありましたが、自分で考えてデプロイまでしたことは初めてやりました。

# DBの設計図・UIワイヤーフレーム
　どんなものを作るかを考える際に考えて作ってみたDBの設計図とUIワイヤーフレームです。作りながらDBもUI少しづつ変わりましたが、大体の部分を図で書いてから進んだので、自分が作りたいものの全体像をイメージしやすく、また進行中に修正が必要になった場合でも対応がスムーズにできたと考えます。:flushed:

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3963379/9233e8ce-f949-4d43-4725-bfe3a0bb1d9a.png">

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3963379/7f610605-059b-21fc-605f-c7507c8b4004.png">


# Achivoとは
「達成したい目標（goal）、目標を達成するための計画（plan）、さらに計画を分解して小さしたタスク（task）に分解して効率的に目標を達成、管理できるアプリ」になります。
　何か始める時なにから進めばいいのかわからないときに、目標を細かく刻んで目標達成を助けられるアプリになります。URLは以下になります。
 >なぜかiphoneではログアウトができない現象があるので、PCでの操作を推奨します。:bow_tone1::bow_tone1::bow_tone1:

https://achivo-y4pe.vercel.app/

# 開発環境
- バックエンド: Node.js + express + typescript
- フロントエンド: React + typescript + tailwind
- ホスティング: Vercel (フロントエンド), Render (バックエンド)
- DB: Mongodb

# 修正点
1. Googleログイン機能
ローカル環境ではGoogleログイン機能を実装出来ていましたが、なぜか本番環境では`passport-google-oauth`でprofileがundefinedでしか返されてなくてログインに失敗するエラーになってました。本番環境でもできるように修正したいと思います。

2. iPhoneでのログアウト不具合
iphoneログインするとログアウトができない状況になのでこの点も修正し全てのデバイスで正しく動作するようにしたいと考えています。

# まとめ
　デプロイは成功してもローカル環境で出来ても、本番環境ではできないことも多くあったのでそれらを修正してある程度動くようにできるまでも1日以上かかったと思います。
 　デプロイしながら学んだこともあったためそれについても整理して残したいと思います。:smiley::smiley:
ラングトンのアリ

# 講義外の自主的な学習内容を投稿する記事#1

今回はラングトンのアリです。

## 概要
ラングトンのアリは、単純な規則で記述される2次元チューリングマシンです。

・白いマス：アリは90°右に方向転換し、そのマスの色を黒に変更。
・黒いマス：アリは90°左に方向転換し、そのマスの色を白に変更。

これを繰り返して進みます。

## 実行環境
・Python
・Google Colab

### 以下のライブラリを使用しました
・matplotlib（可視化）
・numpy（配列操作）
・IPython.display（可視化更新）

## シミュレーション
実行すると、アリが移動しながらマスの色を変化させていく様子をリアルタイムで観察できます。

・グリッドサイズ: 101×101
・ステップ数: 11,000
・可視化更新間隔: 500ステップごと

# 可視化結果
アリの軌跡は単調に見えますが、ある程度進むと特異な模様が現れることが特徴です。最終的には「ハイウェイ」と呼ばれる直線的なパターンが形成されます。



まずは色々準備
````
import matplotlib.pyplot as plt
import numpy as np
from IPython.display import clear_output
import time
````

そしてコード
````
# グリッドのサイズを設定
grid_size = 101
grid = np.zeros((grid_size, grid_size), dtype=int)
x, y = grid_size // 2, grid_size // 2
direction = 0  # 0: 上, 1: 右, 2: 下, 3: 左

# 移動ルール
dx = [0, 1, 0, -1]  # x方向の移動
dy = [-1, 0, 1, 0]  # y方向の移動

# シミュレーションのステップ数
steps = 11000

# 可視化を更新する間隔
update_interval = 500

# シミュレーションの実行
for step in range(steps):
    # 現在のセルの状態に応じて回転と色の変更
    if grid[y, x] == 0:  # 白
        direction = (direction - 1) % 4
        grid[y, x] = 1
    else:  # 黒
        direction = (direction + 1) % 4
        grid[y, x] = 0

    # アリを次のセルに移動
    x += dx[direction]
    y += dy[direction]

    # グリッドの範囲を超えないように調整
    x %= grid_size
    y %= grid_size

    # 可視化の更新
    if step % update_interval == 0 or step == steps - 1:
        clear_output(wait=True)
        plt.figure(figsize=(6, 6))
        plt.imshow(grid, cmap='binary', interpolation='nearest')
        plt.title(f"Step: {step}")
        plt.axis('off')
        plt.show()
        time.sleep(0.1)
````

# 結果
![uploading...0]()
リサージュ曲線と周波数測定

# はじめに
2つの周波数が異なる正弦波を入力として、x,y平面に図示するとリサージュ曲線という神秘的な曲線が描写される。この曲線は2つの信号の周波数や位相差に依存する。したがってその曲線の形状をもとにして、2つの信号の周波数の差や位相差を推定することが可能になる。今回は、以下のようなリサージュ曲線を描写することができるかをPythonを用いて調査する。

![オシロスコープ_周波数測定_2_1_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/f126bd4f-62f3-32b9-cd4e-5c10cee7a476.png)


# 導入
## リサージュ曲線とは
時刻$t$を媒介変数表示として、以下に表される曲線のことをいう。



```math
\begin{equation}
\left\{ \,
    \begin{aligned}
    & x = Asin(2\pi nf t ) \\
    & y = Bsin(2\pi mf t +\alpha)  \\
    \end{aligned}
\right.
\end{equation}

```

ただし、$x$を位相の基準として、$A,B$を振幅として$f$を基準周波数とした。また、$n,m$を基準周波数の倍数とした。


## プログラム
以下のようなプログラムをかいた。

``` python osiro.py
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
import math
num=100
f=1
t=np.linspace(0,1/f,num)
#周波数（基準波の倍数）
n=2
m=1
#振幅
A=1
B=1
#位相差
alpha=0
x=A*np.sin(2*np.pi*(n*f)*t)
y=B*np.sin(2*np.pi*(m*f)*t+alpha*np.pi/180)

plt.plot(x,y)
plt.xlabel('x')
plt.ylabel('y')
plt.savefig("オシロスコープ_周波数測定_{}_{}_{}.png".format(n,m,alpha))
plt.show()
```
# 結果
これを実行すると以下のようなグラフが出力される。

## 周波数が同じで位相差が45度のとき

![オシロスコープ_周波数測定_2_2_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/c20b3788-bb17-d60f-b59b-96de6918d0c5.png)

このように、楕円形になる。

## 周波数が異なるとき

![オシロスコープ_周波数測定_2_1_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/ce3c902f-c06e-8b42-0f0a-e376d1ba71e2.png)

![オシロスコープ_周波数測定_2_4_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/4670b1ba-44d6-648c-207c-69e56cad8189.png)

このように、綺麗なリサージュ曲線を描写することができた。

# まとめ

今回は、Pythonを用いてリサージュ曲線をかくことができるかに挑戦した。結果、上手く描写することができ、リサージュ曲線の特別な場合が楕円形であるということも理解することができた。
Reactを使用して初心者から基本的なアプリを作成できるようになるまでのまとめ

React初心者の状態から、一通りwebアプリの開発を完了したので、全体的な所感を書きます。

## 完成したアプリ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3456603/0702a610-39e4-3081-719b-de8c2b94774d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3456603/318ede9a-3a53-0e63-d970-ad715fea8f48.png)

https://github.com/q-1-p/learn-log-ts

## 使用技術

- React
- Jest
- Chakra UI Ver 2.x
- Firebase
- Supabase

## 全体を通して詰まったところ

### UI作成時

Ui作成時、当初はChakra UIのVer 3を使用していた。
しかし、開発中多数のエラーが発生し、情報も少なかっため、結果的にVer 2.xに下げて開発した。

それまで、新しく学び始めるときは、わざわざ古いものを学ぶよりも、最新のバージョンから学び始めた方がいいと思っていた。しかし、Ver 3のエラーで詰まって時間を浪費してしまったので、情報のあるもので一度学んでから、最新のものを学んで行った方がいいと感じた。

### テスト時

Jestでテストを行う際、記述したはずの内容が検出できないことが多々あった。
原因は、エラーメッセージ内のDOMを確認したところ、ロード画面の状態でテスト内容を確認しようとしてしまっていたことだった。

教訓として、普段意図的にasync/awaitを記述していない、単純なダイアログ表示などのプログラムでも、テスト時には処理完了の待機時間を常に意識してコードを書くべきだった。
また、フロントエンドのコードは、バックエンドほどの確実性がないが、その中でも実行順番に関しては特にコードの記述順を参考にしてはいけないことを学んだ。

テスト時のダミーデータは、データのルールさえ守っていれば、それ以外の内容は問われないので、AIによるコード生成が特に力を発揮する場面だった。

### 詰まったりなどしてモチベーションが下がった時

人次第ではあるが、自分の場合、他のアプリケーションを開発していた。
そうしていれば、同系統の問題に対処する場合でも、別のことをしていると認識できるので、詰まってる感を紛らわせれた。

## 気付き（感想）

**英語力が重要**

エラーメッセージも、公式ドキュメントも、大抵は英語で、特にエラーメッセージはブラウザのように自動で翻訳することが難しいので、まず情報を仕入れるようになるための英語力が今のエンジニアに一番重要な能力だと再三感じた。

また、AI問い合わせる際にも、返答が英語で返ってきたりすることがあり、その度に小規模な動作の中断が起こって集中が途切れるので、常に英語力が欲しい状態だった。

## JISOUのメンバー募集中

プログラミングコーチングJISOUではメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？

気になる方はぜひHPからお願いします👇

https://projisou.jp
[ServiceNow] Configurable Workspaceのブランドカラー設定

### 完成図
AgentWorkspaceのBrand color1で設定していたものをConfigurable Workspaceでも実現する
![スクリーンショット 2024-12-29 17.50.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487914/d1d04956-8ecf-29cc-7db4-8e148fc2b2fb.png)

### なぜカラーを設定したいか
複数のインスタンス（開発・ステージング・本番など）を扱う場合、どの環境で操作しているか分かりやすくした方が誤操作を防げるため

コアUI側はユーザー自身で自由に設定可能ですが、Configurable Workspace側は設定できないため本設定をしたい
(Next Experience UIだったらタブで開かれないのでいらないかも）

### 環境
バージョン：Xanadu(PDI)

### 設定方法
 1. [すべて] > [Now Experience フレームワーク] > [テーマ管理] > [テーマ]に移動します
 2. 新規ボタンを押下
 3. [従来：エクスペリエンスのテーマ]タブでBase Agent Workspace themeを設定
 4. テーマフィールドに定義したいブランドカラーを記載
```テーマフィールド参考値(完成図と同じ色).
{
  "--now-color_brand--primary": "138,48,127"
}
```
5.送信ボタンを押下
6.新規作成したテーマを再度開く
7.[UX アプリ構成]タブでCSM/FSM 構成可能ワークスペースのアプリ構成を紐づける
![スクリーンショット 2024-12-29 18.42.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487914/8d864b39-6e7f-33de-9984-574e38045474.png)

### 参考
[次世代エクスペリエンス UI - テーマの理解](https://noderegister.service-now.com/kb?id=kb_article_view&sysparm_article=KB1120004#section5)
ESP32でワンショットタイマーを使う(esp32-arduino v3系)

# 背景
esp32に限らず、タイマー割り込みを使う際はずーっと同じタイマー間隔で延々とタイマーを入れ続けることが多いかと思います。

でも例えば「2回点滅してちょっと休む」を繰り返すLEDチカチカとかをやろうとすると、同じ時間で繰り返すではやりづらい...※ちょっとロジックを工夫すれば同じ間隔でのタイマーでもできますけど、なんか気持ち悪い

その場合、繰り返しのタイマーを使うのではなく、こんな感じでワンショットタイマーを繰り返し実行したいのです。
* 1回だけのタイマー割り込み(ワンショットタイマー)をセットする
* 時間が経過しタイマーが弾ける(タイマー処理が実行される)
* そのタイマー処理内で、再度時間を指定してタイマー割り込みをセット ※このタイミングで任意のタイマー時刻」をセットする
* 次のタイマー処理が実行される
* ※以降、繰り返し

しかし、ESP32でワンショットタイマーを使うという記事が見つからず、逆にうまく行かない、という例を見つけるぐらいでした。

# 実際うまく行ったのか？
結論としては、以下となりました。
* esp32-arduino V3系ではOK
* esp32-arduino V2系ではNG

esp32-arduino V2系で本当はやりたかったのですが、今の所 V3系でしかできませんでした。
なぜかV2系では、2回目の設定したタイマー処理が実行されません。

## esp32-V3系でワンショットタイマーが動作したプログラム
動作確認時のesp32-arduinoのバージョンはv3.0.7です(2024/12/29 時点の最新)。
![esp32-arduino_v3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65847/23b1592a-53aa-57f2-16cc-d5422cc7ce19.png)

```cpp:esp32_oneshot_timer.ino
hw_timer_t * timer = NULL;
volatile SemaphoreHandle_t timerSemaphore;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;

volatile uint32_t isrCounter = 0;
volatile uint32_t lastIsrAt = 0;

volatile bool timer_3s = false; // チェック時の値でタイマー時間を決める。false:1秒、true:3秒をセット

void ARDUINO_ISR_ATTR onTimer(){
  uint32_t timer_val;
  portENTER_CRITICAL_ISR(&timerMux);
  isrCounter = isrCounter + 1;
  lastIsrAt = millis();

  // タイマー時間を決める(1秒 or 3秒)
  timer_3s = !timer_3s;
  if(timer_3s) {
    timer_val = 3000000;
  } else {
    timer_val = 1000000;
  }
  timerRestart(timer); // タイマーを再スタート。★★★この行が重要★★★
  timerAlarm(timer, timer_val, false, 0); // タイマーを再設定
  
  portEXIT_CRITICAL_ISR(&timerMux);
  xSemaphoreGiveFromISR(timerSemaphore, NULL);
}

void setup() {
  Serial.begin(115200);
  timerSemaphore = xSemaphoreCreateBinary();

  timer = timerBegin(1000000);
  timerAttachInterrupt(timer, &onTimer);
  timerAlarm(timer, 1000000, false, 0); // 第3引数をfalse指定で、繰り返し無し=ワンショットタイマー。その際は第4引数は無効
}

void loop() {
  if (xSemaphoreTake(timerSemaphore, 0) == pdTRUE){
    uint32_t isrCount = 0, isrTime = 0;
    portENTER_CRITICAL(&timerMux);
    isrCount = isrCounter;
    isrTime = lastIsrAt;
    portEXIT_CRITICAL(&timerMux);

    // タイマー割り込みが実行された時刻を表示
    Serial.print("onTimer no. ");
    Serial.print(isrCount);
    Serial.print(" at ");
    Serial.print(isrTime);
    Serial.println(" ms");
  }
}
```
# まとめ
本来やりたかったesp32-arduino V2系ではできなかったのですが、V3系では可能なことを確認できたのでまずはよし、としようと思います。

なお、この記事は、[【札幌現地+オンライン開催】力強くブログを108記事アウトプットする日の 20241229](https://forceoutput.connpass.com/event/339151/)のブログの一つとして書きました。
参加した皆さん、お疲れ様です！
(DAY5) 俺と学ぶRust言語~フィボナッチ数列~

## 今日の内容
- フィボナッチ数列を表示する
- 変数定義
- イミュータブル
- ミュータブル

# はじめに
[前回](https://qiita.com/FUKAch/items/e6d3fc4ca70c5c95e546)はfor文について学びました。今回は、Rustでの変数定義について学びます。また、そのためにフィボナッチ数列を表示するプログラムを作ります。

# フィボナッチ？
フィボナッチ数列とは、隣り合う二つの数字が、次の数字になるという次のような数列です。
```
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,...
```
今日はこの数列を表示するプログラムを作ります。

# 変数定義
フィボナッチ数列を表示するプログラムを作るには、変数を二つ用意して、それらを足して使いまわしていきます。
そのために、まずは変数定義について学びます。
Rustでは次のように変数を定義します。
```rust
let 変数名 = 値;
```
ここで注意するべきポイントは、**プログラム内で変数を変えることは出来ない**ということです。Rustでは、デフォルトで変数が **不変（イミュータブル）** なのです。
Rustでは「値を変数に束縛する」という表現をしますが、これは、値に名前を付けて使えるようにするという意味です。
Rustで変数を **可変（ミュータブル）** にするには、以下のように、letの後にmut（ミュータブル）を付けます。
```rust
let mut 変数名 = 値;
```

変数なのになぜデフォルトで変更できないのか、という疑問は当然のものですが、開発者の「安全性第一」という意思の表れと考えれば納得いきますね。

# フィボナッチ数列を表示しよう
以下はRustで31要素までフィボナッチ数列を表示するプログラムです。
```rust
fn main(){
    let mut a=1;
    let mut b=1;
    println!("{}", a);
    println!("{}", b);
    for _ in 1..30{
        println!("{}", a+b);
        let tmp = a;
        a = b;
        b = tmp + b;
    }
}
/******** 出力結果 *******
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
46368
75025
121393
196418
317811
514229
832040
1346269
*************************/
```
変数a,bは可変になるため、mut(ミュータブル)で定義しています。
変数tmpはa,bがそれぞれa->b(次の要素に移る),b->a+b（新しい要素は、その前の二つの要素の和）となるので、ここでaを一時的に保存するために定義しています。変数名は「temporary（一時的な）」からきています。

# おわりに
おつかれさまでした。今回は、100DaysOfCode 五日目として、フィボナッチ数列を通して変数定義について学びました。次回は変数の「型」について学んでいきます。
ご精読、ありがとうございました。
One-liner syntax

#### 1行の構文
># One-liner syntax
RSpecはsubject上で期待を設定するために1行の構文をサポートします。
RSpecはexampleで使われたマッチャーから自動で生成されるドックストリングをexampleに与える。
ドッグストリングそしてexampleで使用されたマッチャー正確にお互いに反映される状況で重複を避けることを助けるために明確に設計されている
過度に使われた時、うまく読めない出力されたドキュメントを作り出せたりまた、あなたが記述したオブジェクトを理解できないよう貢献する
>RSpec supports a one-liner syntax for setting an expectation on the subject. RSpec will give the examples a doc string that is auto- generated from the matcher used in the example. This is designed specifically to help avoid duplication in situations where the doc string and the matcher used in the example mirror each other exactly. When used excessively, it can produce documentation output that does not read well or contribute to understanding the object you are describing.

これには二つの味がする
>This comes in two flavors:

`is_expected`は`expect(subject)`として簡単に定義される。そしてそのより新しい`expect`ベースの構文で`rspec-expectations`を使っているときに設計される
>* `is_expected` is defined simply as `expect(subject)` and is designed for
  when you are using rspec-expectations with its newer expect-based syntax.

`should`は`rspec-expectations`が`should`ベース構文しか持っていなかった時、設計された。
しかしながら`:should`構文が無効されても(単に`Object#should`が削除されたに過ぎない、しかしこれは`RSpec::Core::ExampleGroup#should`です)`should`は利用可能かつ動作します。
>* `should` was designed back when rspec-expectations only had a should-based
  syntax. However, it continues to be available and work even if the
  `:should` syntax is disabled (since that merely removes `Object#should`
  but this is `RSpec::Core::ExampleGroup#should`).
>Notes:

この機能は`rspec-expectations`を使うときだけ利用可能です
>* This feature is only available when using rspec-expectations.

1行の構文を使って定義されたexampleはthe [`--example` option]を使ってコマンドラインから直接選ばれない
>* Examples defined using this one-liner syntax cannot be directly selected from the command line using the [`--example` option](../command-line/example-option).

1行の構文はブロックのない期待値でのみ動作するそしてブロックの期待値で使えない。
>* The one-liner syntax only works with non-block expectations (e.g. `expect(obj).to eq`, etc) and it cannot be used with block expectations (e.g. `expect { object }`).

>### Implicit subject
```rb
RSpec.describe Array do
  describe "when first created" do
    # Rather than:                  # むしろこっちがいいと書いてるのだろうか？
    # it "should be empty" do
    #   subject.should be_empty
    # end

    it { should be_empty }
    # or
    it { is_expected.to be_empty }
  end
end
```
```
Run options: include {:full_description=>/Array/}
2 examples, 0 failures, 2 passed
```
* 以下の場合と比べてみると1行で済んでいる
```rb
RSpec.describe "something" do
  it "does something" do
  end
end
```

>### Explicit subject
```rb
RSpec.describe Array do
  describe "with 3 items" do
    subject { [1,2,3] }
    it { should_not be_empty }
    # or
    it { is_expected.not_to be_empty }
  end
end
```
```
Run options: include {:full_description=>/Array/}
2 examples, 0 failures, 2 passed
```

### 感想
exampleのコメントを書くことができないので分かりにくさがあるので使いにくそうだ。
ドックストリングとは?
npmコマンドの使い方

npmコマンドとは、JSのフレームワークを使用する際に、頻繁に使うコマンドです。

package.jsonにインストールしたいものを記載して、
npm install　を実行すると、記載した内容のライブラリがnode_modulesにインポートされる。

その後、追記でインストールしたいものがあれば、
npm install jquery
また、不要なライブラリを削除したい場合は
npm rm jquery
で削除がされる。
Jackson 3へ向けた議論に是非ご参加下さい！

この記事はKotlin Advent Calendar 2024 12日目の記事になりました ~~（まだ年内だからセーフ！）~~。
`Kotlin`のアドカレでやるべき話か感も有りますが、他に空いていて適当そうなカレンダーが無かったのと、一応`Kotlin`文脈でも利益の有る話なのでご容赦下さい。

https://qiita.com/advent-calendar/2024/kotlin

---

`jackson-module-kotlin`のメンテナをやっているwrongwrongと申します。
この記事では`Jackson 3`に向けたデフォルト挙動変更に関する議論について紹介します。

# `Jackson 3`について
`Jackson 3`は、`Jackson`のメジャーアップデートバージョンです。
開発は2017年後半から進められていましたが、この度本格的な移行へ向けた議論のための`Discussion`がメンテナのTatu Saloranta氏から投稿されました。

https://github.com/FasterXML/jackson-future-ideas/discussions/72

個人的に特に重要と感じているのは、**メジャーバージョンアップ = デフォルト挙動の変更が可能**という点です。

`Jackson`は非常に歴史の長いライブラリであるため、不合理な挙動がデフォルトとなっている場合も有ります。
メジャーバージョンアップではそれを変更出来るため、ユーザーの皆様からの意見を取り込むことで、`Jackson`をより使いやすくする大きな機会です。

ご意見の有る方は、是非上記の`Discussion`へご参加下さい。

また、現時点での変更点全体は以下の`Wiki`にまとめられています。

https://github.com/FasterXML/jackson/wiki/Jackson-Release-3.0

## `jackson-module-kotlin`での議論について
私がメンテナを務める`jackson-module-kotlin`でも、リクエストを受け付けるためのイシューを作りました。
運用を定められていない部分も有りますが、ご意見など有りましたら一旦はこちらへ投稿頂ければ幸いです。

https://github.com/FasterXML/jackson-module-kotlin/issues/870

# `FAIL_ON_NULL_FOR_PRIMITIVES`について
次に、個人的に最も変更したいと考えているデフォルト挙動として、`FAIL_ON_NULL_FOR_PRIMITIVES`を紹介します。

`Jackson 2`のデフォルト挙動では、`Java`上でプリミティブ扱いされる型に対して、`nullish`値を入力してもエラーになりません。
サンプルコードに示す通り、特に`Kotlin`から利用する場合、これは強く直感に反する挙動となります。

```kotlin
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue

// DTO上はa・b共に非null定義
data class Dst(val a: Int, val b: Long)

val mapper = jacksonObjectMapper()

// 入力はaがundefined, bがnull -> Dstの定義より、直感的には失敗するはず
val src = """{"b":null}"""

// 一方、デフォルトだとデシリアライズできてしまう！
// Dst(a=0, b=0) が出力される
println(mapper.readValue<Dst>(src))
```

これを抑制できるのが、`FAIL_ON_NULL_FOR_PRIMITIVES`オプションです。
有効化することで、プリミティブ型に対する`nullish`値の入力をエラーとできます。

```diff_kotlin
+ import com.fasterxml.jackson.databind.DeserializationFeature
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue

data class Dst(val a: Int, val b: Long)

+ val mapper = jacksonObjectMapper().enable(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES)
- val mapper = jacksonObjectMapper()

val src = """{"b":null}"""

// FAIL_ON_NULL_FOR_PRIMITIVESを有効化すればMismatchedInputExceptionになる！
println(mapper.readValue<Dst>(src))
```

個人的には、なるべくデフォルトが直感的な挙動になっているべきということで、`Jackson 3`ではデフォルト有効にしたいと考えています。
賛同頂ける方は是非以下の`Discussion`へ投票お願いします！

https://github.com/FasterXML/jackson-future-ideas/discussions/79

前述の通り、この他の意見も募集しておりますので、`Jackson 3`へ向けた議論に是非ご参加下さい！
しんどかった一年を越えて前を向くための書籍3選

# はじめに
今年も残りわずかとなりましたが、皆さんは今年一年どうでしたか？
環境の移り変わりや人間関係、若くは自身の成長に関してなど、メンタル的にしんどい感じる一年だった方もいらっしゃるかもしれません。

私が社内のメンバーと話をする際などによく伝えているものになりますが、「苦しい時は本を読め、困った時は本を読め、楽しい時も本を読め」です。

書籍には著者が長年かけて歩んでいく中で学んだ経験や人生観が詰まっており、取り入れることで短時間で困難な状況を打開するためのヒントを得ることができます。
そこで今回は来年の活動に向けてポンっと背中を押してくれるような書籍を3冊ほどオススメしたいと思います。

# 1.嫌われる勇気

https://amzn.asia/d/22R5q0t

200万部超えの大ベストセラー本ですので、ご存知の方も多いかもしれません。
この書籍はアドラー心理学をベースに、「自己肯定感」や「他人の期待から解放される為の方法」を解説した本になります。

どんな業務でもそうですが、基本的に仕事はコミュニケーションで始まり、コミュニケーションで終わります。
そこに対人関係が存在している以上、終始のコミュニケーション一つでも劣等感につながるケースもあると思います。

そういった方でお悩みの方はこの書籍を読了する事で、他人の目や評価に縛られがちな自分に、**自由に生きるヒント**を与えてくれます。
自分自身を肯定し、前向きに一歩を踏み出したいとお考えの方には是非オススメの一冊です。

# 2.やり抜く力 GRIT(グリット)――人生のあらゆる成功を決める「究極の能力」を身につける

https://amzn.asia/d/divlqmi

成功の鍵は「才能」ではなく「やり抜く力」であると提唱する心理学者アンジェラ氏の書籍になります。
この書籍はまさに、**努力に疲弊している方**にぴったりの書籍です。

この書籍のベースとなっているGRITとは、以下から連なる造語になります。

- Guts（ガッツ）
- Resilience（レジリエンス）
- Initiative（イニシアチブ）
- Tenacity（テナシティ）

Gutsは**立ち向かう力**、Resilienceは**立ち直る力**、Initiativeは**自ら目標を見つけて取り組む自発性**、Tenacityは**執念や粘り強さ**を指しています。

「自分に才能がない」と感じたり、「努力しても無駄」などネガティブな感情に支配された時に、この本は成功は小さな継続の積み重ねであることを再確認させてくれます。

ビジネスシーンで必要な**忍耐力**や**モチベーション維持のヒント**が満載の書籍になっているので、上記に当てはまる方は是非読んでみてください。

# 3.マインドセット「やればできる! 」の研究

https://amzn.asia/d/4YFKiFW

この書籍では**失敗が怖い人**や**新たな挑戦に勇気を持って取り組めない人**にオススメの書籍になります。
書籍中では「固定マインドセット」と「成長マインドセット」の2つを説いており、固定マインドセットは**能力は生まれつき固定されていると考え、失敗を恐れるマインド**です。
これに対して、成長マインドセットは**能力は努力や経験によって伸ばせると考え、失敗を学びの機会へと転換できるマインド**です。

如何にして成長マインドセットを持つように切り替えられるか、ということが書籍中では説かれており、学校教育、スポーツ、ビジネスの現場など数多くの実例を元にあらゆる環境下で成功に一歩近づくための手法を説明しています。

一歩前に進むことができないと感じる方はこちらの書籍を読了することで、来年から新たな気持ちを持ってチャレンジできるかもしれません。

# さいごに
今年も記事を読んでくださり、ありがとうございました。
今回ご紹介した書籍が皆さんの背中を押してくれることを願っています。
私も来年から新たな事業に取り組むということで、新たな気持ちで成長できるよう年末年始で整えていこうと思います！
TanstackQueryのメモ

## TanstackQueryとは
非同期のServer Stateを効率的に管理する仕組み

### 状態（State）は3種類ある

|  |役割|例|ライブラリ|
|:-:|:-:|:-:|:-:|
|Client State|コンポーネント内で管理する状態|toggle|useState
|Global State|複数のコンポーネント間で管理する状態|toast|Redux|
|Server State|サーバで管理している状態|ユーザ情報|TanstackQuery|

:::note info
Client StateとGlobal Stateはクライアントで完結しているから、常に最新の状態で取得できる。
:::

:::note warn
Server Stateはサーバにデータを取りに行く必要があり、タイミングによっては古い場合もある。サーバにデータを取りに行く時は、非同期にしないと、UIが悪くなる
:::


## tanstackQueryの使い方

```tsx:main.tsx
import { QueryClientProvider } from "@tanstack/react-query";
import { queryClient } from '@/queryClient'

createRoot(document.getElementById("root")!).render(
  <StrictMode>
    <QueryClientProvider client={queryClient}>
      <App />
    </QueryClientProvider>
  </StrictMode>
);

```

```ts:queryClient
import { QueryClient } from "@tanstack/react-query";
export const queryClient: QueryClient = new QueryClient({
  defaultOptions: {
    queries: {
      // コンポーネントにフォーカスが当たるとフェッチが作動してしまうのを無効
      refetchOnWindowFocus: false,
    },
  },
});
```

## useMutation

### useMutationの型引数は4つ
:::note info
useMutation\<TData, TError, TVariables, TContext>()
:::

#### TData：ミューテーション関数の戻り値の型
- ミューテーションが成功したときに返されるデータの型を指定する
- サーバー側処理の結果のオブジェクトやステータスコードを返す場合、その型をここで指定する
```tsx
const mutation = useMutation<string>(); // 戻り値が文字列
```



#### TError：ミューテーション関数がエラーになった場合のエラーオブジェクトの型
- エラーとして Error オブジェクトやカスタムエラー型を指定

```tsx
const mutation = useMutation<string, Error>(); // エラー型が `Error`
```

#### TVariables：ミューテーション関数へ渡す引数の型
- mutate または mutateAsyncへ引数を渡したい場合、引数の型を指定
```tsx
type Variables = {
  userId: string;
  flowId: string;
};

const mutation = useMutation<string, Error, Variables>(); // 引数に Variables 型を指定
mutation.mutate({ userId: '123', flowId: '456' });
```

#### TContext：楽観的更新で使用するためのコンテキストの型
- onMutateフック内で返す値の型を指定
- この型はonErrorやonSettledの中で復元処理などのために使用


## キャッシュの生存期間
キャッシュの生存期間をコントールするためには、staleTimeとcacheTimeの理解が必要。

### staleTime
キャッシュが古い状態とみなすまでの時間のこと。
staleTimeはデフォルトで`0`に設定されているので、キャッシュはすぐに古い状態と判断され、リクエストの度に毎回データフェッチされる。
逆に`Infinity`と設定すればキャッシュは常に最新（fresh状態）と判断されるため、データフェッチが初回しか行われない。この場合は適切なrevalidate処理をしないと最新の状態を取得できないため注意。

:::note info
staleTime:0 → キャッシュは常にstale状態（古い）→ 毎回データフェッチされる
:::

:::note info
staleTime:Infinity → キャッシュは常にfresh状態（最新）→ 初回のみデータフェッチされる
:::


### cacheTime
キャッシュをガベージコレクション（メモリ領域の開放）するまでの時間のこと。
ゲームボーイ RGBDS 開発メモ 第2回 チュートリアルを読んでいく

### チュートリアルを読んでいく

とても丁寧なチュートリアルで、16進数の説明なんかもありました。16進数を知らない人がこのチュートリアルを読むことはあるのだろうか（笑）

### Registers

ChatGPT先生に翻訳してもらいながら読みすすめていきます。

ゲームボーイのCPUにはa, b, c, d, e, h, l という７つのレジスタ（変数のようなもの？）があり、それぞれ8ビットの値をいれることができる。a は計算することができるらしい。ということは他のレジスタでは計算できないので、入れたり出したりするのでしょうか。

また、レジスタは a 以外、ペアで使うことができて、16ビットとして扱える。

### Assembly basics

```
INCLUDE "hardware.inc"

SECTION "Header", ROM0[$100]

    jp EntryPoint

    ds $150 - @, 0 ; Make room for the header

EntryPoint:
    ; Shut down audio circuitry
    ld a, 0
    ld [rNR52], a
```

やっと来ました、アセンブラのソースコードです。INCLUDEのように RGBASM が解釈するものがディレクティブ、マシン語と一対一に対応する命令(instruction) がある。

INCLUDE はよく使う定数が入っているようです。

ld がニーモニックで、a, 0 がオペランド（引数のようなものかな）。

SECTION はメモリの連続した範囲を決めるために使うディレクティブ。 ROM0[\\$100] は ROM の先頭のアドレスでしょうか。\\$ は 16進数。

ds は命令ではなくてディレクティブで、 @ は現在のアドレスを表し、 \\$150 - @ バイトを0で埋める。 \\$100 から \\$150 まで 0 で埋めるということでしょうか。

ディレクティブなので、実行時に実行される命令ではなく、アセンブル時に処理される。

メモリに命令とデータを一緒に置くので、こんな感じになるんですね。

### Memory

`ld a, [de]` はdeに格納されている内容をレジスタa にコピーする。
EntryPointのようなラベルがメモリアドレスになっている。

ROMやVRAMなどのデータが全部、\\$0000  から \\$FFFF まで入っていて ROMの部分を切り替えて読み込むらしい。これがバンク切り替えってやつでしょうか。

### 次回

だんだんわかってきました（笑）次回もチュートリアルを読んでいきます。
Xcode 文字サイズ変更方法

Xcode 文字サイズ変更方法です。

XcodeVersion 16.0です。

# 文字サイズ変更方法
Xcode→Settings→Themesをクリック

![スクリーンショット 2024-12-29 17.40.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/5230900a-6e0f-8d7b-ba08-5b03f118542d.png)

![スクリーンショット 2024-12-29 17.40.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/bcec60f5-9f99-88aa-259b-8026fdc6a841.png)

このスクリーンショットで言うと`SF Mono Medium - 18.0`の箇所をクリックします。
![スクリーンショット 2024-12-29 17.41.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/121191c1-c8e2-d6c6-0956-6769237ec394.png)
Sizeを変更すると文字サイズが変わります。
ゴーレイ符号がS(5,8,24)系であることを確認する

# はじめに

吉荒聡『散在型有限単純群』を読みながら、手を動かして確認してみる(定義などの番号は同書による)。ゴーレイ符号(符号理論の文脈では「拡張2元ゴーレイ符号」と呼ぶようだ)は$S(5,8,24)$系と関係がある。

# 定義

(定義) $X$を有限集合、$t$を自然数とするとき、${X \choose t}$を大きさ$t$の$X$の部分集合と定義する。つまり、${X \choose t} := \lbrace Y \subseteq X : |Y|=t \rbrace$

(定義 2.28) $\Omega$を大きさ$v$の有限集合とし、$t,k$は$1\le t \le k < v$を満たす自然数とする。$\Omega$と$\mathcal{O} \subseteq {\Omega \choose k}$の対$(\Omega, \mathcal{O})$が$(t,k,v)$シュタイナー系(Steiner system)であるとは、任意の$X \in {\Omega \choose t}$について、$X \subseteq C$を満たす$C \in \mathcal{O}$がただ1つ存在することであり、$S(t,k,v)$系と書く。

# 確認
```python
def bit_positions(n):
    positions = []
    index = 0
    while n > 0:
        if n & 1:
            positions.append(index)
        n >>= 1
        index += 1
    return positions

def positions_to_number(positions):
    number = 0
    for pos in positions:
        number |= (1 << pos)
    return number
```


```python
from functools import reduce
from itertools import chain, combinations
from operator import xor

golay = [0b100000000000100111110001,
         0b010000000000010011111010,
         0b001000000000001001111101,
         0b000100000000100100111110,
         0b000010000000110010011101,
         0b000001000000111001001110,
         0b000000100000111100100101,
         0b000000010000111110010010,
         0b000000001000011111001001,
         0b000000000100001111100110,
         0b000000000010010101010111,
         0b000000000001101010101011]
elements = []
for gs in chain.from_iterable(combinations(golay, r) for r in range(1, len(golay) + 1)):
    g = reduce(xor, gs)
    if g.bit_count() == 8:
        elements.append(g)
```

$S(5,8,24)$系の$|\mathcal{O}|$は$759$だが、実際そうなっている。

```python
len(elements)
# 759
```

任意の5点集合に対して、それを包含する$C$がただ1つ存在する。

```python
for x in combinations(range(24), 5):
    x = positions_to_number(x)
    assert len([c for c in elements if c & x == x]) == 1
```

## 性質

(補題 3.1) (1) 任意の$A,B\in\mathcal{O}$について、$|A \cap B| = 0,2,4,8$

```python
{(a & b).bit_count() for a in elements for b in elements}
# {0, 2, 4, 8}
```

(補題 3.1) (2) $m \in \lbrace 0,2,4,8\rbrace$に対して$X\in{A \choose m}$を固定する。$|\lbrace B \in \mathcal{O} : A \cap B = X\rbrace|$は、$m=0,2,4,8$に対してそれぞれ$30,16,4,1$となる。

```python
for m, l in [(0, 30), (2, 16), (4, 4), (8, 1)]:
    for a in elements:
        for s in combinations(bit_positions(a), m):
            n = positions_to_number(s)
            assert len([b for b in elements if a & b == n]) == l
```

(補題 3.1) (3) $m \in \lbrace 0,2,4,8\rbrace$と任意の$A$について、$|\lbrace B \in \mathcal{O} : |A \cap B| = m\rbrace|$は、$m=0,2,4,8$に対してそれぞれ$30,448,280,1$となる。

```python
for m, l in [(0, 30), (2, 448), (4, 280), (8, 1)]:
    for a in elements:
        assert len([b for b in elements if (a & b).bit_count() == m]) == l
```

(補題 3.2) (トッドの補題) $A, B \in \mathcal{O}$が$|A\cap B|=4$ならば、$A+B\in\mathcal{O}$

```python
for a in elements:
    for b in elements:
        if (a & b).bit_count() == 4:
            assert (a ^ b) in elements
```
2024年12月末 まだ間に合うかも Pi Network の始め方

## はじめに
Pi Networkを始める=スマホ(+ Windows or Mac)でマイニングを始めるとほぼ同じ意味になるかと思います。目に入る範囲でざっと眺めていると、①BTCのときに「やっておけばよかったなー」なら「いまやろうぜ」、②「GPUやASICがなくてもスマホがあるじゃん」「全世界のスマホの台数、何台あるか考えてみたことある?」「金本位制に(もBTCにも)代わる何かができそうじゃない?」という夢を感じました。
### 先ず隗より始めよ
掘ってみました。開いていたスマホ(iPhone)と空いていた[Askhand(Amazon非アフィリエイト)](https://www.amazon.co.jp/gp/product/B0C5XQHQT6/)で。毎日こつこつといい仕事をしてくれます。2024/12/15に開始。2024/12/29時点で4.31Pi(=coins)。
![fig1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159724/d4c2d8c0-5de1-55dc-391a-64046d036edd.png)
昭和新山の観察日誌と似たノリです。だって増えてってるんだもん(笑)。足し算好きなんですよ。持ち出しゼロっすよゼロ。パイセン(*'▽')3年ロックアップだけどいまのレートなら360万円になりそうなんだもん。単純に年120万円の副業。上場すればより一層の荒波に揉まれることは必定(笑)。だけれどもそれはBTCもSHIBも同じです。
電気代は上記のAskhandで月700-800円。どのみちサーバ的に稼働させていたもの。Dockerがもうちょい負荷を背負うかなと思っていたらそうでもない。うれしい誤算でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159724/75b469ff-4ca1-578f-16da-873bbf3e141a.png)
ある程度の軌道に乗ってくると、1マイニングセッションが24時間になります。24時間にいちど、スマホで、まあロボットでないことを証明するためにゲーム等のアプリ広告を見て、厳かに閉じる(笑)、そうして次のセッションのマイニングを開始する――よって、容易に想像できるように、「朝イチ」「昼休み」「就寝前」がサイクルになるようにするのが望ましい――はずです。筆者は午前5時45分になるようにしました。「朝イチ」です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159724/c2531a0e-722d-a5fb-1c25-ce5c2f05c91e.png)
### 「始め方」はよ。
1. スマホを用意します。空きスマホの専属にすることが望ましいかな。筆者はiPhoneですが、「Andoridでも(当然)ええんちゃう」。スマホから[ここ](https://minepi.com/dk4130523)をクリックして、以下、画面の指示に従ってください。筆者のチームの一員となり、win-winになります(笑)。よくある招待制です。笑ってばかりのようですが、こういうのを1個1個、笑いながら払拭することが、新規導入の心理的障壁を下げることになるわけですよね。で、まあスマホで、いろんなリンクを(訝しみながら)触って「どうも大丈夫なんじゃないかな」と感じていただけるかなと思います。
2. Windows端末かMac端末を用意します。筆者はWindows10ですが、「Macでも(当然)ええんちゃう」。スマホと同様にいろんなところペタペタと触ってください。不明点があれば[AIが作成してくれたおねえさん](https://x.com/dkpijp4130523)が旧Twitterで応接してくれるかもしれません。[中身はおれ](https://www.officenekohana.com/profile/)だよ。悪かったな(笑)。それから「デカパイジャパン」とか呼ぶなよ(ダチョウ倶楽部的に。これPi Networkのグローバル運営チームに英訳を見て認めてもらう策略なんだから(笑))。
3. 「昭和新山観察日誌」を付けることをお勧めします。理由は、楽しいから。
4. それでその「いろんなところをペタペタと」「昭和新山観察日誌」の付けるポイントなのですが、メニューを順繰りに見ていくと「メインネットチェックリスト」という箇所があります。これを1から9まで消化していって、マイニングノード(Node)として認めてもらう、brabra...というのが、実に大雑把な流れになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159724/143b3e86-077b-a47e-2cb3-5aefad995f28.png)
### 今回、以上です。
で、みなさんはやらない(笑)。おれはやる(笑)。もう始めちゃった(*'▽')また、続き書きます。
Planioを使い始める時の注意ポイント

## はじめに

個人の目標管理のため [Planio](https://plan.io/ja/)(プラニオ) を使い始めました

https://plan.io/ja/

https://redmine.jp/hosting/

無料枠はプロジェクト1つまでですが、
自前でRedmineを構築せず気軽に使えるのは大変ありがたいです

ただ、諸々カスタマイズしてくれているものを利用するだけに
「アレっ」と思ったことが何点かあったのでシェアします。

## コピーしたチケットが関連チケットになってしまう

意図せずチケット同士が紐づいていることがあり、設定を確認したところ
デフォルトでコピーしたチケットをコピー元の関連チケットにする設定がされていました。

設定 > チケットトラッキングの
「チケットをコピーしたときに関連を設定」を「いいえ」
にすることで紐づけを止めることが可能です。

URLは
https://[自分のサブドメイン].planio.jp/settings?tab=issues になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917871/d20d5895-7f9e-1eff-6bc3-6a2cac5f0af4.png)

（都度選択だと「関連を設定」がONの状態で複製画面に遷移するため「いいえ」が無難です）

## 親子チケットの期日が連動してしまう

親子チケットを設定した際、
親チケットの期日が意図せず変わってしまうことがありました。

こちらはPlanioのデフォルトが
「子チケットの期日をもとに親チケットの期日を設定する」になっているためで、
先ほどと同様に

設定 > チケットトラッキングから「親チケットの値の算出方法」を「子チケットから独立」にすることで連動してフィールドの値が書き換えられることを防げます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917871/3edece8e-258e-e57f-c864-1a75b1b8fe0e.png)

## チケット作成時にウォッチが設定される

新規チケットの作成時に、ウォッチャーを設定していないにも関わらず、
チケットをウォッチしていることがありました。

これはPlanioのデフォルトで自動ウォッチの設定がされているためで、
個人設定画面から「Auto watch」の
「Issues I created」「Issues I contributed to」のチェックを外すことで回避できます。

URLは
https://[自分のサブドメイン].planio.jp/my/account になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917871/30474a4d-eba2-1e24-00e6-c663b34234a0.png)
RuboCopでError以上のみ表示する

# はじめに
既存のRailsプロジェクトにRuboCopを導入したところ、大量の違反が表示されたので、とりあえずError以上の項目のみ表示する方法のまとめです。

# コマンド
```sh
rubocop --fail-level E --display-only-fail-level-offenses
```
- ```--fail-level E```
  - 検出したエラーのレベルがError以上の場合、RuboCopの実行が失敗します
  - Eの部分を変更することで、任意のレベルに設定できます

- ```--display-only-fail-level-offenses```
  - --fail-levelで指定したレベル以上のエラーのみを表示するようにします

# RuboCopのエラーのレベル
Fatal：実行が不可能な致命的なエラー
Error：コードに明確なエラーが存在
Warning：潜在的な問題の警告
Convention：コードスタイルに関する警告
Refactor：リファクタリングが必要な問題

# 参考
https://qiita.com/mh4gf/items/0f98e55e80fda9589309

https://qiita.com/KKDDD/items/208430f3b26b56fee9b2
ActiveSupport::HashWithIndifferentAccessとは


```rb
  def with_indifferent_access
    ActiveSupport::HashWithIndifferentAccess.new(self)
  end
```
# ハッシュのサブクラス
>ActiveSupport::HashWithIndifferentAccess < Hash

https://api.rubyonrails.org/classes/ActiveSupport/HashWithIndifferentAccess.html#:~:text=ActiveSupport%3A%3AHashWithIndifferentAccess%20%3C%20Hash


# ハッシュを生成できる　シンボルと文字列を同じキーとして割り当ててくれる

キー`:foo`と`"foo"`を同じとみなされるハッシュを実装する
>Implements a hash where keys :foo and "foo" are considered to be the same.
```rb
irb(main):001:0> rgb = ActiveSupport::HashWithIndifferentAccess.new
=> {}
irb(main):002:0>
irb(main):003:0> rgb[:black] = '#000000'
=> "#000000"
irb(main):004:0> rgb[:black]  # => '#000000'
=> "#000000"
irb(main):005:0> rgb['black'] # => '#000000'
=> "#000000"
irb(main):006:0>
irb(main):007:0> rgb['white'] = '#FFFFFF'
=> "#FFFFFF"
irb(main):008:0> rgb[:white]  # => '#FFFFFF'
irb(main):009:0> rgb['white'] # => '#FFFFFF'
=> "#FFFFFF"
irb(main):010:0> rgb
=> {"black"=>"#000000", "white"=>"#FFFFFF"}
```
```rb
irb(main):007:0> rgb = ActiveSupport::HashWithIndifferentAccess.new({"black"=>"#000000", "white"=>"#FFFFFF"})
=> {"black"=>"#000000", "white"=>"#FFFFFF"}
irb(main):008:0> rgb["black"]
=> "#000000"
irb(main):009:0> rgb[:black]
=> "#000000"
```

書き込みインターフェース全体でキーとして使われる時内部的にはシンボルは文字列にマッピングされる。このマッピングはパブリックインターフェースに属しています。
>Internally symbols are mapped to strings when used as keys in the entire writing interface (calling []=, merge, etc). This mapping belongs to the public interface. For example, given:

```rb
irb(main):011:0> hash = ActiveSupport::HashWithIndifferentAccess.new(a: 1)
=> {"a"=>1}
```

https://api.rubyonrails.org/classes/ActiveSupport/HashWithIndifferentAccess.html
Go学習日記 Week5

## 先週のあらすじ

学習内容が学習内容なだけに実質競プロ入門メモのようになってきた。それはそれとして何この法則オモロというものが多いので以外と続いている。
Week8（2か月目）までにはAランクメニューを攻略したいがAWSの勉強を放置しているのも良くないのでバランスよくやっていきたい。

## 今週の学習内容

### 1. ユークリッドの互除法
学生時代にやったようなやっていないような。多分やってるやり方。
$a = bq+r$なら$a$と$b$の最大公約数が$b$と$r$の最大公約数とイコールになる法則で、$a \div b$を計算し、余りとして出た$r$を使って余りが0になるまで割り算を続けることで最大公約数を計算できる。

$r_n$...余り、 $q_n$...商
```math
\displaylines{
a = bq_1+r_1 \\
b = r_1q_2+r_2 \\
r_1 = r_2q_3+r_3 \\
....
}
```

```main.go
func saidaiKoyakusu(a, b int) int {
    for b != 0 {
        a, b = b, a % b  // aをbに、bをa % bに置き換え
    }
    return a  // bが0になった時、aが最大公約数
}
```

[(高校数A) 5分でわかる！ユークリッドの互除法](https://www.try-it.jp/chapters-4962/sections-5064/lessons-5065/)

## 今週のまとめ
業務命令の出た資格勉強をしてたり、競プロになれるため、ひたすら問題を解いてたら全然書く内容がなかった。
![paiza06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796391/b13689e9-a538-6198-89f4-bd6a505007e3.png)

まあこの記事自体は私が学んだことをアウトプットして脳に定着させるための自分用記事なので、気にしないことにする。多分Ａランクチャレンジ→敗北を繰り返すまでそんな書くこともないような気がする。ほぼ成果報告週が続く見込み。

来週もひたすらBランクを解き続けて考える力を育てていきたい。
モジュールと名前付き関数

## はじめに
モジュールと名前付き関数について理解を深める。
一般的な言語の取り扱いと大差はないが独特の表現方法とiexでの実行時の挙動を紹介する。

## 実践
名前付き関数を含むファイルの作成を行う
```
touch times.exs
```
でファイルを生成する。
次に
```
vim times.exs
```
でファイルを編集し以下のコードを記述する。

```elixir
defmodule Times do
  def double(n) do
    n * 2
  end
end
```
この時点でモジュール名Timesでdoubleという関数が１つある状態となった。
なおここでのdoubleは引数を１つ取っている。
この場合elixirではdouble/1という表現をする。

この状態でiexを実行する。
なお実行方法はiex実行時にファイル名を含む場合と後からファイルを読み込ませる場合がある。
実行時はモジュール名＋関数名で実行をする。

### iex実行時にファイル名を含める
```elixir
iex times.exs
Erlang/OTP 27 [erts-15.1.2] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit:ns]

Interactive Elixir (1.17.3) - press Ctrl+C to exit (type h() ENTER for help)

iex(1)> Times.double(4)
8
```

### iex実行後にファイルを読み込ませる
```elixir
iex
Erlang/OTP 27 [erts-15.1.2] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit:ns]

Interactive Elixir (1.17.3) - press Ctrl+C to exit (type h() ENTER for help)

iex(1)> c "times.exs"
[Times]
iex(2)> Times.double(4)
8
```

なおこの際に読み込ませるcのことをcヘルパーと呼ぶ。
cヘルパーを使ってファイルのコンパイルを行っている。

## 終わりに
cヘルパーを使って後から読みこませる方法は知らなかったので勉強になった。
ただなぜelixirのファイルをコンパイルするのにcヘルパーを使うのかが腑に落ちない。
判明した段階で追記を行う。

参考文献　プログラミングElixir 第２版
TypeScriptの基本的な型

#JavaScriptでも一般的に使用される型

## number型
**1、5.3、-10**
整数や浮動小数点を含む全ての数値

```typescript
let age: number = 25;
```

## string型
**'HI'、"HI"、`HI`**
全ての文字列

```typescript
let name: string = "Alice";
```


## boolean型（ブーリャン型）
**true、false**
trueまたはfalse、真偽値型

```typescript
let isActive: boolean = true;
```

## null型
****
明示的に「何もない」ことを示す型
```typescript
let value: null = null;
```


## undefined型
****
値が未定義であることを示す型
```typescript
let value: undefined = undefined;
```

## symbol型
****
```typescript
let uniqueKey: symbol = Symbol();
```

## bigint型
****
```typescript
let largeNumber: bigint = 123456789012345678901234567890n;
```

## Array型
**[1,2,3]**
複数の変数を格納できるデータ型。また異なったデータ型をミックスして入れることもできるし緩く指定することも厳しく指定することもできる。JavaScriptの全てのArray。配列操作が直感的かつ安全になる。

```typescript
let numbers: number[] = [1, 2, 3];
let strings: string[] = ["hello", "world"];
```

# TypeScript固有の型

## object型
**{age: 30}**
{}（中括弧）にkey value形式の値を入れて表す。;でプロパティを仕切る。JavaScriptの全てのobjectの事。TypeScriptでプリミティブ型（string, number, boolean, symbol, null, undefined）以外のすべての値を表す型。一般的な型からよりきめ細かい明確な型になりように指定していく。汎用性が高いですが型安全性が低い。実際に使う場面は限られますが、汎用的な関数の引数やプリミティブ型を除外する場合に有用
```typescript
Objectリテラル:key=>value
Ocject型:key=>type(型)

let obj: { key: string } = { key: "value" };
console.log(obj.key); // OK
```


## any型
****
任意の型を許容する型。ただany型を使うとTypeScriptが提供する型の恩恵を得ることができない。
```typescript
let anything: any = "Hello";
anything = 42; // OK
```

## unknown型
****
不明な型。anyよりも安全で、型を確認するまで操作ができない
```typescript
let something: unknown = "Hello";
if (typeof something === "string") {
  console.log(something.toUpperCase());
}
```

## void型
****
戻り値がない関数の型
```typescript
function logMessage(): void {
  console.log("This is a message.");
}
```

## never型
****
オブジェクト型
```typescript
let obj: object = { key: "value" };
```

# ユニオン型と交差型

## ユニオン型 (|)
複数の型を許容する
```typescript
let value: string | number = "Hello";
value = 42; // OK
```

## 交差型 (&)
複数の型を結合する
```typescript
type Person = { name: string } & { age: number };
let person: Person = { name: "Alice", age: 30 };
```

# 配列とタプル
## 配列 (Array<T> または T[])
```typescript
let numbers: number[] = [1, 2, 3];
```

## タプル ([T1, T2, ...])
```typescript
let tuple: [string, number] = ["Alice", 30];
```

# 列挙型 (enum)
値の集合を定義する型
```typescript
enum Color {
  Red,
  Green,
  Blue,
}
let color: Color = Color.Green;
```
AuroraDB クロスリージョン レプリケーションやってみた



実務でもしかしたら使用するかも？と思い、クロスリージョンレプリケーションを試してみました

# Aurora クロスリージョンレプリケーション作成手順

## 1. VPC作成（プライマリリージョンとセカンダリリージョンで）
- **新しいVPCを作成**
  - プライマリリージョンとセカンダリリージョンそれぞれでVPCを作成します。
- **サブネットを最低2つ作成（異なるAZで）**
  - 各VPCに少なくとも2つ以上のサブネットを作成（異なるAZに分散）。
  - **CIDR設定**: プライマリとセカンダリのVPCでCIDRブロックが重複しないよう設定。
    - 例: プライマリ：`10.0.0.0/16`、セカンダリ：`10.1.0.0/16`
- **セキュリティグループ（SG）の確認/作成**
  - Auroraクラスターが利用するポート（通常3306）のインバウンドアクセスを許可。
  - プライマリリージョンとセカンダリリージョン間の通信が必要な場合は、互いのVPCからのトラフィックを許可。

---

## 2. パラメータグループ作成
- **DB パラメータグループを作成**
  - タイプを**DB Cluster Parameter Group**に設定して作成。
  - 作成したパラメータグループを選択し、「アクション」→「編集」をクリック。
    - 「binlog_format」を検索し、**値を `ROW` に変更**。
![スクリーンショット 2024-12-29 16.32.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/748934/5affcdb1-50c9-4e01-1fb2-e4c79ee4efbe.png)
- **保存後の適用**
  - パラメータグループは既存のAuroraに割り当て後、再起動で適用されます。

---

## 3. AuroraDB作成（プライマリリージョン）
- プライマリリージョンにAuroraクラスターを作成。
  - **VPC/SG/パラメータグループ**: 作成済みのものを設定。
  - **認証情報管理設定**: 
    - **セルフマネージド**を選択（AWS Secrets Managerはサポート外）。
- DB作成後、クラスターが利用可能状態になるまで待機。

---

## 4. クロスリージョンレプリケーションの作成
- プライマリリージョンで作成済みのAuroraクラスターを選択。
  - 「アクション」→「クロスリージョンのレプリケーション作成」をクリック。
![tokyo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/748934/919e2478-21f7-ea8b-94b4-1075a2e75a94.png)
- **作成画面の設定**
  - セカンダリリージョンを選択。
  - 対応するVPCやサブネットを設定。
- 作成後、セカンダリリージョンのRDSコンソールに遷移し、レプリケーション状態を確認。
  - レプリケーションがアクティブになるまで少し時間がかかります。
![osaka.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/748934/06fc3f44-0d1b-0c5c-5c02-93a23b36393d.png)


---

## 注意点ます。セカンダリリージョンのレプリカでリードクエリを実行する際はレイテンシを考慮。
1. **コスト**
   - クロスリージョンレプリケーションは通常のレプリケーションよりもコストが高いため、必要性を確認。

---
each_key

# Enumeratorクラスにしてハッシュのキーを繰り返しできる
>each_key {|key| ... } -> self
each_key -> Enumerator
`ハッシュのキーを引数としてブロックを評価`します。

>反復の際の`評価順序はキーが追加された順`です。ブロック付きの場合selfを、無しで呼ばれた場合Enumeratorを返します。

例
```rb
irb(main):017:0> {:a=>1, :b=>2}.each_key {|k| p k}
:a
:b
=> {:a=>1, :b=>2}

irb(main):026:0> p({:a=>1, :b=>2}.each_key)
#<Enumerator: {:a=>1, :b=>2}:each_key>
=> #<Enumerator: ...>
```

https://docs.ruby-lang.org/ja/latest/method/Hash/i/each_key.html

### Enumeratorクラスで返すと以下のようにブロックで評価することができる
```rb
irb(main):027:0> a = {:a=>1, :b=>2}.each_key
...
irb(main):037:1* a.each do |i|
irb(main):038:1*   puts i
irb(main):039:0> end
a
b
=> {:a=>1, :b=>2}
```
Java初心者必見！なぜメソッドにScanner scannerを2回書くのか？

### **Java初心者向け解説：なぜ`Scanner scanner`を2回書くの？**

Javaでプログラムを書いていると、次のようなメソッド宣言を見たことがあるかもしれません。

```java
private static void addTask(List<String> tasks, Scanner scanner)
```

「なぜ `Scanner scanner` を2回も書かなきゃいけないの？」と思ったことはありませんか？  
この記事では、この疑問を初心者の方向けに分かりやすく解説します！

---

### **メソッドの基本構造を理解しよう**
Javaのメソッドは、大きく分けて次の2つの部分から成り立っています。

1. **メソッド宣言（ヘッダー）**: メソッドの名前や引数を定義する部分。
2. **メソッドの処理（ボディ）**: メソッドが実際に行う処理。

例えば、以下のコードを見てみましょう：

```java
private static void addTask(List<String> tasks, Scanner scanner) {
    String task = scanner.nextLine();
    tasks.add(task);
    System.out.println("タスクを追加しました: " + task);
}
```

- **メソッド宣言（ヘッダー）**:
  ```java
  private static void addTask(List<String> tasks, Scanner scanner)
  ```
  - この部分では、メソッド名を`addTask`とし、**引数として必要なデータを2つ（`tasks` と `scanner`）受け取る**ことを指定しています。

- **メソッドの処理（ボディ）**:
  ```java
  String task = scanner.nextLine();
  tasks.add(task);
  ```
  - 実際に引数から渡されたデータを使って処理を行っています。

---

### **なぜ`List<String> tasks`と`Scanner scanner`が必要なの？**

このメソッドでは、2つの引数を使っています。それぞれの役割は次の通りです。

#### 1. `List<String> tasks`
タスクリストを管理するための引数です。

- `tasks`は「今のタスクリスト」を指しています。
- このメソッド内でタスクを追加すると、リスト自体が更新されます。

#### 2. `Scanner scanner`
ユーザーの入力を受け取るための引数です。

- ユーザーが入力した内容（新しいタスク）を取得するために使います。
- 例えば、`scanner.nextLine()`を使って、キーボードからの入力を読み取ります。

---

### **なぜ引数を渡す必要があるの？**

メソッドは、外部からデータを受け取ることで柔軟に動作します。  
もし引数を渡さない場合、メソッド内でデータを使うことができません。

#### 引数なしだとどうなる？
例えば、以下のように引数を使わないコードを書いた場合、`tasks`や`scanner`が見つからずエラーになります。

```java
private static void addTask() {
    String task = scanner.nextLine(); // エラー: scannerが定義されていません
    tasks.add(task); // エラー: tasksが定義されていません
}
```

#### 引数を渡す場合
引数を渡せば、外部で作成したリストや`Scanner`をメソッド内で利用できます。

```java
List<String> tasks = new ArrayList<>();
Scanner scanner = new Scanner(System.in);
addTask(tasks, scanner); // 引数として渡す
```

---

### **具体的な動き：どこで`scanner`を作成している？**

次のコードを見てみましょう：

```java
public static void main(String[] args) {
    List<String> tasks = new ArrayList<>(); // タスクリストを作成
    Scanner scanner = new Scanner(System.in); // Scannerを作成

    addTask(tasks, scanner); // リストとScannerを引数として渡す
}
```

1. `main`メソッドで、1つの`Scanner`オブジェクトを作成しています。
2. この`Scanner`を`addTask`メソッドに渡すことで、同じ`Scanner`を共有して使えるようにしています。

---

### **効率的な設計をする理由**

#### 1. **引数として渡す設計のメリット**
- 同じ`Scanner`オブジェクトを他のメソッドでも使い回せるため、メモリ効率が良い。
- 1つのリストや`Scanner`を複数のメソッドで共有できる。

#### 2. **毎回作成する非効率な例**
もし毎回`Scanner`を作成する設計にした場合、プログラムの効率が下がります。

```java
private static void addTask(List<String> tasks) {
    Scanner scanner = new Scanner(System.in); // 毎回新しいScannerを作成
    String task = scanner.nextLine();
    tasks.add(task);
}
```

- 毎回`Scanner`を新しく作ると無駄が多く、他のメソッドで共有もできません。

---

### **まとめ**

`private static void addTask(List<String> tasks, Scanner scanner)` のように引数を2つ指定する理由は、**必要なデータ（`tasks`）とツール（`scanner`）をメソッドに渡すため**です。

#### **ポイント**
1. **`List<String> tasks`**:
   - タスクを管理するリストを渡すことで、外部のリストを直接操作できる。
2. **`Scanner scanner`**:
   - 1つの`Scanner`を共有することで、効率的にユーザー入力を処理できる。

これを理解すれば、Javaのメソッド設計がもっと身近に感じられるはずです！  
疑問があれば、ぜひコメントで教えてください😊

--- 

💡 **もっとJavaの基本を知りたい方は、この記事をストックしていただけると嬉しいです！**
量子コンパイラを作る。 その9

# 概要
量子コンパイラを作る。
elixirで、論理回路アセンブラから高位合成してblueqatを出力してみた。

# コマンド　リファレンス
## make
回路を作る。量子ビットを指定する。
inputが２つで、outputが２つ、なら４。make 4

## in
inputを作る。
０，１，２がinputならば、in 3

## out
outputを作る。
３，４，５がoutputならば、out 3 5

## xor
xorを作る。
０，１が入力で、2が出力ならば、xor 0 1 2

## and
andを作る。
０，１が入力で、2が出力ならば、and 0 1 2

## or
orを作る。
０，１が入力で、2が出力ならば、or 0 1 2

# 投入したソース
半加算器
```
make 4
in 2
out 2 3
and 0 1 3
xor 0 1 2
```

# 実行結果

```
from blueqat import Circuit

print (Circuit(4).h[ : 2].cx[0, 3].cx[1, 3].ccx[0, 1, 2].m[ : ].run(shots = 1000))

```

# 回路図


![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/d5c2feac-1aed-7446-3c86-d19f2bf37a34.jpeg)


# サンプルコード

```

defmodule Asm do
	def start_link do
		Agent.start_link(fn ->
			%{in0: "", in1: "", make0: "", u: ""}
		end, name: __MODULE__)
	end
    def make0(a) do
		Agent.update(__MODULE__, fn v ->
            str = "Circuit(" <> a <> ")" 
            %{v | make0: str}
		end)
	end
    def in0(a) do
		Agent.update(__MODULE__, fn v ->
            str = ".h[ : " <> a <> "]"
            %{v | in0: str}
		end)
    end
    def out0(a, b) do
    end
    def and0(a, b, c) do
		Agent.update(__MODULE__, fn v ->
            str = ".cx[" <> a <> ", " <> c <> "].cx[" <> b <> ", " <> c <> "]"
            %{v | u: v.u <> str}
		end)
    end
    def xor0(a, b, c) do
		Agent.update(__MODULE__, fn v ->
            str = ".ccx[" <> a <> ", " <> b <> ", " <> c <> "]"
            %{v | u: v.u <> str}
		end)
    end
    def or0(a, b, c) do
		Agent.update(__MODULE__, fn v ->
            str = ".ccx[" <> a <> ", " <> b <> ", " <> c <> "].cx[" <> a <> ", " <> c <> "].cx[" <> b <> ", " <> c <> "]"
            %{v | u: v.u <> str}
		end)
    end
    def print() do
		Agent.get(__MODULE__, fn v ->
            IO.puts "from blueqat import Circuit\n\nprint (" <> v.make0 <> v.in0 <> v.u <> ".m[ : ].run(shots = 1000))\n"
		end)
	end
end

defmodule Main do
	def run(str) do
    	Enum.map(String.split(str, "\n"), fn l ->
		    #IO.puts l
		    s = String.split(l, " ")
		    #IO.puts Enum.at(s, 0)
		    cond do
			Enum.at(s, 0) == "make" ->
				Asm.make0(Enum.at(s, 1))
			Enum.at(s, 0) == "in" ->
				Asm.in0(Enum.at(s, 1))
			Enum.at(s, 0) == "out" ->
				Asm.out0(Enum.at(s, 1), Enum.at(s, 2))
			Enum.at(s, 0) == "and" ->
				Asm.and0(Enum.at(s, 1), Enum.at(s, 2), Enum.at(s, 3))
			Enum.at(s, 0) == "nand" ->
				Asm.nand0(Enum.at(s, 1), Enum.at(s, 2), Enum.at(s, 3))
			Enum.at(s, 0) == "nor" ->
				Asm.nor0(Enum.at(s, 1), Enum.at(s, 2), Enum.at(s, 3))
			Enum.at(s, 0) == "xor" ->
				Asm.xor0(Enum.at(s, 1), Enum.at(s, 2), Enum.at(s, 3))
			Enum.at(s, 0) == "or" ->
				Asm.or0(Enum.at(s, 1), Enum.at(s, 2), Enum.at(s, 3))
			true ->
				IO.puts ""
			end
	    end)
	    Asm.print
	end
end

Asm.start_link

Main.run("""
make 4
in 2
out 2 3
and 0 1 3
xor 0 1 2
""")





```

# 成果物

https://paiza.io/projects/bMUcq4-OSg0250-4fvMZug?language=elixir


以上。
{}とは

# `{}`はハッシュを表す
```rb
{}.class
```
### 試してみた
```rb
irb(main):014:0> parameters = {}
irb(main):015:0*
=> {}
irb(main):016:0> parameters.class
=> Hash
```
https://gihyo.jp/book/2017/978-4-7741-9397-7