OmniAICreator/Qiita-1.07M huggingface dataset:
OracleのEXECUTE IMMEDIATEを実行しても自動COMMITされるわけではない

最近会社で聞かれて答えたことをまとめてみました。

以下のようなことを聞かれました。

| Oracleで[EXECUTE IMMEDIATE](https://docs.oracle.com/cd/E82638_01/lnpls/EXECUTE-IMMEDIATE-statement.html)を使うと自動COMMITされるのか

このことについて、答えたこと、答えていないことをまとめてみました。

# 実験

この程度のことであれば、実験するのが早いです。会社で答えたときも実験コードを作って説明しました。

ここでの実験は、DB環境には[OracleCloud(ATP)](https://qiita.com/szly/items/899d382b89af6fa937f1)を、クライアントには[DBeaver](https://dbeaver.io/)を使っています。

## 実験用コード(DML)

実験用のコードを改めて起こしてみました。会社では、DBMS_OUTPUTの中をこんなに丁寧には書いていません。

```
CREATE TABLE TBL_DUMMY AS SELECT 1 AS X FROM DUAL WHERE ROWNUM = 0;

DECLARE
	V_CNT	NUMBER;
BEGIN
	-- 初期化
	DELETE FROM TBL_DUMMY;
	COMMIT;
	SELECT COUNT(*) INTO V_CNT FROM TBL_DUMMY;
	DBMS_OUTPUT.PUT_LINE ( 'INSERT前(DELETE後) : ' || V_CNT );
	-- 通常INSERT
	INSERT INTO TBL_DUMMY VALUES ( 1 );
	SELECT COUNT(*) INTO V_CNT FROM TBL_DUMMY;
	DBMS_OUTPUT.PUT_LINE ( 'INSERT後 : ' || V_CNT );
	-- EXECUTE IMMEDIATE INSERT
	EXECUTE IMMEDIATE 'INSERT INTO TBL_DUMMY VALUES ( 2 )';
	SELECT COUNT(*) INTO V_CNT FROM TBL_DUMMY;
	DBMS_OUTPUT.PUT_LINE ( 'INSERT(EXECUTE IMMEDIATE)後 : ' || V_CNT );
	-- ROLLBACK
	ROLLBACK;
	SELECT COUNT(*) INTO V_CNT FROM TBL_DUMMY;
	DBMS_OUTPUT.PUT_LINE ( 'ROLLBACK後 : ' || V_CNT );
END;

DROP TABLE TBL_DUMMY CASCADE CONSTRAINT PURGE;
```

実行結果は以下のようになります。

```
INSERT前(DELETE後) : 0
INSERT後 : 1
INSERT(EXECUTE IMMEDIATE)後 : 2
ROLLBACK後 : 0
```

ROLLBACKによってTBL_DUMMYの内容は0件に戻りました。つまり、EXECUTE IMMEDIATEの前後で自動COMMITされているわけではないということです。

## 実験用コード(DDL)

おそらく質問者は、EXECUTE IMMEDIATEでDDLを使うと自動COMMITされるときの記憶と混ざっていたのだと思います。DDLを用いた動きも実験用コードを作って試してみます。こちらは会社では実験していません。

```
CREATE TABLE TBL_DUMMY AS SELECT 1 AS X FROM DUAL WHERE ROWNUM = 0;

DECLARE
	V_CNT	NUMBER;
BEGIN
	-- 初期化
	DELETE FROM TBL_DUMMY;
	COMMIT;
	SELECT COUNT(*) INTO V_CNT FROM TBL_DUMMY;
	DBMS_OUTPUT.PUT_LINE ( 'INSERT前(DELETE後) : ' || V_CNT );
	-- 通常INSERT
	INSERT INTO TBL_DUMMY VALUES ( 1 );
	SELECT COUNT(*) INTO V_CNT FROM TBL_DUMMY;
	DBMS_OUTPUT.PUT_LINE ( 'INSERT後 : ' || V_CNT );
	-- EXECUTE IMMEDIATE INSERT
	EXECUTE IMMEDIATE 'CREATE TABLE TBL_DUMMY2 AS SELECT * FROM DUAL';
	EXECUTE IMMEDIATE 'DROP TABLE TBL_DUMMY2';
	SELECT COUNT(*) INTO V_CNT FROM TBL_DUMMY;
	DBMS_OUTPUT.PUT_LINE ( 'EXECUTE IMMEDIATE後 : ' || V_CNT );
	-- ROLLBACK
	ROLLBACK;
	SELECT COUNT(*) INTO V_CNT FROM TBL_DUMMY;
	DBMS_OUTPUT.PUT_LINE ( 'ROLLBACK後 : ' || V_CNT );
END;


DROP TABLE TBL_DUMMY CASCADE CONSTRAINT PURGE;
```

実行結果は以下のようになります。

```
INSERT前(DELETE後) : 0
INSERT後 : 1
EXECUTE IMMEDIATE後 : 1
ROLLBACK後 : 1
```

ROLLBACKしても登録件数は0に戻りません。EXECUTE IMMEDIATEの前後で自動COMMITされていることが分かります。

[公式ドキュメント(11g)](https://docs.oracle.com/cd/E16338_01/appdev.112/b56265/tdddg_dml.htm)で"Oracle Databaseは、データ定義言語(DDL)文の前後で、暗黙的COMMIT文を発行します。"と書かれているあたりの話です。公式表現は、自動COMMITではなく暗黙的COMMITでした。

# まとめ

EXECUTE IMMEDIATEはトランザクション制御には無関係、EXECUTE IMMEDIATEによって実行されるSQLによっては自動COMMITが掛かるものもある、ということを実験しました。

実験環境に用いた[OracleCloud環境](https://qiita.com/szly/items/899d382b89af6fa937f1)は、こういうちょっとしたSQL確認に使う分には便利な環境です。極めて短時間でDB環境を準備できます。
Vue.jsでメッセージを一時的にフェードインとアウトで出す方法

#やりたいこと
Vue.jsをやり始めたばかりで、間違っている点あればご教授お願いします。
更新や適応をした際に、画面の上や下に一時的にメッセージが表示される物を作成します。
例えば、メッセージを送信したら「送信完了」などのように表示されるようにします。
今回はボタンを押した後、メッセージを２秒間表示するようにしています。

#コード
CDNなどでVue.jsは使用することができるようにしておいてください。
##HTML
```html
<div id="app">
  <div class="">
    <button @click="clickBtn" id="btn">ボタン</button>
  </div>
  <transition name="fade">
    <p v-if="message" class="result">{{ message }}</p>
  </transition>
</div>
```
##CSS
```css
.fade-enter-active, .fade-leave-active {
  transition: opacity .5s;
}
.fade-enter, .fade-leave-to{
  opacity: 0;
}
.result {
  position: fixed;
  top: 0;
  width: 100vw;
  background-color: rgba(0,195,255,0.5);
  margin: 10px;
  padding: 10px;
  border-radius: 5px;
}
```
##javascript
```javascript
var App = new Vue ({
  el: "#app",
  data: {
  	message: "",
  },
  methods: {
  	clickBtn: function () {
    	this.message = '更新されました。'
			setTimeout(() => {this.message = false;}, 2000);
    }
  }
})
```
#やっていること
##HTML
HTMLではボタンにクリックイベントを設定し、<transition>タグで囲まれたところにメッセージが表示されるようになります。
##CSS
```css
.fade-enter-active, .fade-leave-active {
  transition: opacity .5s;
}
.fade-enter, .fade-leave-to{
  opacity: 0;
}
```
この部分では、フェードインとフェードアウトのために、opacityを設定しています。
それより下の部分ではメッセージの装飾を制御しています。
この部分は好きに変更して大丈夫になります。
##javascript
```javascript
  data: {
    message: "",
  },
```
messageの中は初期値を空白にする必要がありますので、必ずmessage:""を記載します。

```javascript
  clickBtn: function () {
        this.message = '更新されました。'
        setTimeout(() => {this.message = false;}, 2000);
    }
```
this.message = ''この部分で表示する文章を記載します。
```setTimeout(() => {this.message = false;}, 2000);```の2000の部分で表示する時間を設定します。ミリ秒で記載する必要があります。（例：1秒=1000、10秒=10000)

#活用
現在はボタンを押したときに表示されるようになっていますが、今後はデータの更新や削除などを行なった際に出るようにしていきたいです。
作り次第まとめていきます。
Scratchのメモ

#よく使うスタジオの一覧
##自分専用
###使っているもの
[100%Penのキャラクター](https://scratch.mit.edu/studios/29918836/)
[ペン](https://scratch.mit.edu/studios/30254612/)
[行事](https://scratch.mit.edu/studios/30878311/)
[Jsonハック](https://scratch.mit.edu/studios/30833726/)
[機械学習　人工無脳　など](https://scratch.mit.edu/studios/30809261/)
[３Dっぽいもの](https://scratch.mit.edu/studios/30302944/)
[その他](https://scratch.mit.edu/studios/30254615/)
###最近作っていないもの
[素材](https://scratch.mit.edu/studios/29883809/)
[イントロ](https://scratch.mit.edu/studios/30108186/)
##キュレーターになっているものなど
[ブロック大喜利](https://scratch.mit.edu/studios/29700716/)
[イントロ好きは集まれ！](https://scratch.mit.edu/studios/27780208/)
[ペンから成るスタジオ](https://scratch.mit.edu/studios/25836584/)

#主なトピック
##開いている
[スクリプトクイズ](https://scratch.mit.edu/discuss/topic/133890/)
[Scratch-Wiki](https://scratch.mit.edu/discuss/topic/568537/)
[Scratch以外のプログラミング言語](https://scratch.mit.edu/discuss/topic/116160/)
[コードを書き込む場所](https://scratch.mit.edu/discuss/topic/221924/)
[フォント・字形](https://scratch.mit.edu/discuss/topic/515899/)
[Scratchの古い情報](https://scratch.mit.edu/discuss/topic/535770/)
[競技プログラミング](https://scratch.mit.edu/discuss/topic/504096/)
[議事録](https://scratch.mit.edu/discuss/topic/552847/)
[数学カフェ](https://scratch.mit.edu/discuss/topic/235922/)
[学校でのプログラミング](https://scratch.mit.edu/discuss/topic/384612/)
[日本語フォーラムを使うときの注意について](https://scratch.mit.edu/discuss/topic/279091/)
[隠しコマンド・裏技](https://scratch.mit.edu/discuss/topic/218316/)
[スタジオの更新](https://scratch.mit.edu/discuss/topic/526563/)
[セーブコード](https://scratch.mit.edu/discuss/topic/371996/)
[副題用](https://scratch.mit.edu/discuss/topic/210678/)
[INTRO&OUTRO 2](https://scratch.mit.edu/discuss/topic/566945/)
[Scratch 3.0 の拡張機能](https://scratch.mit.edu/discuss/topic/337226/)
[プログラミング言語をつくろう](https://scratch.mit.edu/discuss/topic/422548/)
[弾幕寺子屋](https://scratch.mit.edu/discuss/topic/343198/)
[ラズベリーパイ](https://scratch.mit.edu/discuss/topic/173780/)
[スマホアプリ](https://scratch.mit.edu/discuss/topic/336811/)
[Scratch Jr](https://scratch.mit.edu/discuss/topic/47528/)
[クラウドリスト](https://scratch.mit.edu/discuss/topic/338894/)
[オンラインゲーム](https://scratch.mit.edu/discuss/topic/371992/)
[将棋のAI](https://scratch.mit.edu/discuss/topic/280952/)
[3D](https://scratch.mit.edu/discuss/topic/372004/)
[鉄道関係](https://scratch.mit.edu/discuss/topic/227804/)
[未完成の作品を完成品に変える](https://scratch.mit.edu/discuss/topic/379014/)
[合成音声](https://scratch.mit.edu/discuss/topic/332800/)
[演算](https://scratch.mit.edu/discuss/topic/496044/)
[人工知能](https://scratch.mit.edu/discuss/topic/300750/)
[1.4派？2.0派？それとも3.0派？](https://scratch.mit.edu/discuss/topic/370424/)
[自動作曲研究所](https://scratch.mit.edu/discuss/topic/391533/)
[オーディオスペクトラム](https://scratch.mit.edu/discuss/topic/555797/)
[micro:bit](https://scratch.mit.edu/discuss/topic/344269/)
[初心者の歓迎方法](https://scratch.mit.edu/discuss/topic/307806/)
[ドット・2Dゲーム](https://scratch.mit.edu/discuss/topic/406354/)
[ユーザーインターフェイス](https://scratch.mit.edu/discuss/topic/511835/)
[Scratch Lab](https://scratch.mit.edu/discuss/topic/480836/)
[初心者歓迎トピックの設立](https://scratch.mit.edu/discuss/topic/533111/)
[]()
[]()
arch環境でのvala-panel-appmenu-xfceの入れ方@2022/1

自環境:Manjaro Xfce


ソース->https://aur.archlinux.org/packages/vala-panel-appmenu-budgie-git/#comment-793308

``` bash
yay -S gobject-introspection
yay -S vala-panel-appmenu-xfce
```
TerraformでElastiCache構築時に「InvalidParameterCombination: PreferredCacheClusterAZs can only be specified for one node group」が出た時の対処

# 状況
AWSのElastiCacheでRedisをクラスターモード且つマルチAZで構築しようとし、Terraformを実行するもタイトルのエラーが出てapplyに失敗しました。

# 結論
`availability_zones`の指定を書いている場合、これをなくします。
（自分の場合は別途定義している変数でnullを渡しても行けました）
これで無事構築ができました。
（AWSコンソールで確認してちゃんとクラスターモード且つマルチAZがenabledになっていました）

```
resource "aws_elasticache_replication_group" "default" {
  ...
  multi_az_enabled              = true
-  availability_zones            = XX
  ...

  cluster_mode {
    replicas_per_node_group = XX
    num_node_groups         = XX
  }
}
```
NetBeansで宣言元へのジャンプ機能が使えない時に確認してみること

# はじめに
NetBeansでは、関数などの宣言元へジャンプする機能（Ctrl+左クリック）があります。
しかし、新しい案件で使用してみたところジャンプ機能が使用できなく解決に苦戦したため記録します。

# キャッシュを消してみる
自分の場合NetBeansのキャッシュは以下の場所にありました。
C:\Users\[user名]\AppData\Local\NetBeans\Cache

Cache以下に数字の名前のディレクトリがあるのでそれを削除しNetBeansを再起動します。
再起動すると、再度キャッシュディレクトリが作成されます。

これで解決する人もいましたが、自分の場合は解決しませんでした。


# nbprojectの削除
NetBeansではプロジェクトを作成すると、nbprojectというディレクトリが作成されます。
本来であれば、プロジェクト作成の際に作成されるので1つしか存在しないですが、今回どうやらこのnbprojectがGitでコミットされていたため、cloneしてしまったことが原因でした。

そのため、もしキャッシュを消しても治らなかった場合は確認してみると良いと思います。

# おわり
今回はNetBeansのジャンプ機能が使えなくなった際に確認したことについてまとめました。
以上。
Dynamics 365 Finance and Operations ~ Asset Management（資産管理）~

比較的最近 FO（SCM）のモジュールに出てきた Asset Management について調べました。Finance モジュールの固定資産モジュールとは異なる話です。（以下イメージ）
どこかの調査では、直接費として運用コストの25%がメンテナンスに掛かっていて、そのメンテナンスも30%が実際には不必要な支出らしく、このムダを無くそうやという話です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/76d6d8cf-b875-7345-f40e-f206304226e9.png)

#資産管理とは
組織内の以下の現物資産についての「管理」と「メンテナンス」​をするためのモジュール。
・静的な固定資産 (Fixed Assets) – buildings, land, machinery​
・動的な固定資産 (Moving Assets) – vehicles, ships, movable equipment​
・インフラ系 (Linear Assets) – roads, rail tracks, pipelines, power lines

必要なメンテナンスを、優先度・スキル・資材・ツール・情報にもとづいて計画・最適化・実行・追跡することが可能です。
D365 Field Service も似たようなケースで利用できると思いますが、Field Service は資産自体は持たず、あくまで付加価値となるサービスを提供することを管理するのに対して（P/L）、Asset Management は資産を所有していて（B/S）、それを自社サイト外の場所（遠方の製造現場や顧客サイト）に貸与・リースし、かつそれを維持・サービスするのにコストが発生するのを管理します（P/L）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/d1aaaa62-33cf-17dc-1870-5260d3bd9636.png)

「メンテナンス」も5段階の成熟度モデルがあり、受動的なメンテナンスからAI予測によるメンテナンスにしましょうよ的なことを言っております。
②Preventative maintenance（予防保全）・・・交換の目安に従う（○回/△時間使ったら交換する）
④Predictive maintenance（予知保全）・・・兆候に従う（壊れそう！だから交換する）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/495fe96d-5bc6-9840-56e3-1a8baa8eee0c.png)

#資産管理マスターの用語（作業の場所、資産、メンテナンス計画）
まず、資産管理のマスターの設定が必要です。資産は製造現場とか顧客サイトにて設置されて稼働していますよね。
・機能の場所とは、資産が存在する場所のことです。
・下位の場所を含めることで、機能の場所を階層的に確立できます。（サイト＞製造ライン＞作業場所）
・資産とは、コンベヤーやプリンターなど、使用される機器のことです。
・資産は、資産の予備部品などの下位資産を含めることができます。
※機能の場所の構造は、作成後に変更することはできません。つまり、場所の移動はできません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/308cb33a-1891-43c6-d5ee-6ce47149dca3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/b104e772-ee3f-5276-7d7c-2deb59053d0e.png)

#デモ
USMFのデモデータで見てみましょうか。以下は非常発電機（Emergency Generator：GEN-001）の例です。✓が入った所が伝えたかったところです。流れというよりは設定値内容を見たほうが有用かなと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/9b9ffd21-5aed-2a4e-05ca-8568ac311bb3.png)

資産：GEN-001
機能の場所：PP-04-03
メンテナンス要求（計画に基づく）：MR-0000012
作業指示書：WO-000005
資産（マスター）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/f51804a8-b7a3-6d35-dbd1-04800d9f30fb.png)
メンテナンス計画（マスター）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/12406f5c-bba2-2f08-1555-772bf517438e.png)
メンテナンス要求（トランザクション）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/7dc1049e-f44a-9474-39f0-f91682c6e4cf.png)
作業指示書（トランザクション）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/01cb271f-417f-6b35-473c-399ef9d494f1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/89b8aa37-589f-e9eb-d134-53ef1130e962.png)
Laravel Breezeのインストール

## Laravel Breezeとは

Laravel Breezeとは、Laravelでログイン、登録、パスワードのリセット、電子メールの検証、パスワードの確認などの機能が実装されているLaravelのPluginです。
Laravelの公式ドキュメントの[Starter Kits](https://laravel.com/docs/8.x/starter-kits#laravel-breeze)にはLaravel Breezeのインストール方法が記載されていますが、Sailを使っていないので、今回はSailにLaravel Breezeをインストールします。

## インストール

Laravelアプリケーションのインストールをします。

```shell
curl -s https://laravel.build/example-app | bash
cd example-app
./vendor/bin/sail php artisan migrate
```

Composerを使用してLaravelBreezeをインストールします。

```shell
./vendor/bin/sail composer require laravel/breeze --dev
./vendor/bin/sail artisan breeze:install
./vendor/bin/sail npm install
./vendor/bin/sail npm run dev
./vendor/bin/sail artisan migrate
```

sailを起動します。

```Shell
./vendor/bin/sail up -d
```

正常にインストールが終わっていれば[http://localhost/register](http://localhost/register)のURLからアカウント登録ができます。

## DB管理ツールAdminerの導入

開発環境ではDB管理ツールがあると便利なので、AdminerをSailのdocker-compose.ymlに追加します。
Adminerは、MySQL, MariaDB, PostgreSQL, SQLite, MS SQL, Oracle, Elasticsearch, MongoDBをサポートしているDB管理ツールです。
データ分析の為にFluentd+Elasticsearch+Kibanaを導入予定の場合は、Kibanaは開発としては重いのでAdminerがデータの登録確認に使えますし、Session用のDBにMongoDBを採用すればSessionデータ確認にも利用できます。

```yaml
    adminer:
        image: adminer:4
        ports:
            - '${FORWARD_ADMINER_PORT:-8080}:8080'
        networks:
            - sail
        environment:
            ADMINER_DEFAULT_SERVER: 'mysql:3306'
```

docker-compose.yamlの修正後にsailを再実行します。

```Shell
./vendor/bin/sail up -d
```

正常にAdminerが起動されている場合は、[http://localhost:8080/](http://localhost:8080/)からAdminerにアクセスできます。
PoC とは

## 勉強前イメージ

そういえばちゃんと調べたことなかった・・・
最初にちょっと試してみること？

## 調査

### PoC とは

Proof of Concept の略で、日本語では 概念実証 になります。
新たなアイデアなどの実現可能性や効果を検証することを言います。
PoCで効果が実現したい効果が期待できるとなるのであれば
実際にプロジェクトを起こして進めていくような形になります。

### PoCのやり方

- PoCを行う目的・ゴールの決定

PoCを行う目的、そもそもこれがなぜ必要なのか、
どんな効果がほしいかなどゴールを決定する。
目的・ゴールを決めることで指針がブレるのを防ぐ。

- 実施内容の決定

どのようにして検証を行うのかを決める。
概要だけでなく、具体的にする必要がある。

- 検証

検証をしていきます。
そのための環境なのか、小規模なのかは色々あると思いますが
ゴールに沿って実施をします。

- PoCの結果から評価

検証の結果を確認し、評価を行います。
PoCの目的が果たされているか、ゴールに沿うような結果になっているか
今後プロジェクトを行うのかなどを決めます。

## 勉強後イメージ

雰囲気合ってた。
小さく検証してみるって感じだと思ってたけど
PJの大小に関わらず「小さく試す」は合ってそう

## 参考

- [PoCとは](https://www.ntt.com/bizon/glossary/e-p/poc.html)
- [PoCとは？意味・やり方・ポイント・事例10選](https://www.softbank.jp/biz/future_stride/entry/technology/20200710/)
GitHubでhttps認証からSSH認証へ変更方法（ローカルPC内の既存プロジェクトをgit pushする場合）

ローカルPC内の既存プロジェクトをgit pushする場合：
configファイルの「url=」をSSH接続のURL（git@…）にしておく
の詳細を記録に残します。
【参考URL】
https://halzoblog.com/github-ssh/



ターミナルのURL部分は省略していますのでご自身のものに置き換えください。
もう2回目なので来たる3回目忘れた頃に見返せるように記事にしておきます。

【状況】
ローカルPC内のプロジェクト最新状態
ローカルリポジトリの内容最新状態
リモートリポジトリの状態古い状態（ローカルリポジトリと差分あり）
リモートリポジトリへローカルリポジトリの反映がhttps認証のためできない
https認証からssh認証に変更したい

【前提】
sshkey生成、GitHubへ設定済み
ルートディレクトリでssh接続確認済み
ssh-agentに追加済み


```:ターミナル
プロジェクトディレクトリ　　% git push origin main
Username for 'https://github.com':... .git
Password for 'https://...';
remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.
fatal: Authentication failed for 'https://github.com/.../'
プロジェクトディレクトリ　　%

```

https認証ではpushができませんと言われている？
上記のUsername for　’URL'の内容からhttps認証になっていることがわかります。
当時はそれがわからずにひたすらsshkeyを作っていました...

■ssh認証へ変更方法
.gitフォルダのconfigファイルのURLをsshのURLに書き換える。

```:ターミナル
プロジェクトディレクトリ　　% open .git
```

configファイルを展開して[remote "origin"]のurl =　部分を上書きします。

```:config（ビフォー）
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
	ignorecase = true
	precomposeunicode = true
[remote "origin"]
	url = https://github.com:... .git
	fetch = +refs/heads/*:refs/remotes/origin/*
```

```:config（アフター）
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
	ignorecase = true
	precomposeunicode = true
[remote "origin"]
	url = git@github.com:... .git
	fetch = +refs/heads/*:refs/remotes/origin/*
```

書き換えるsshurlはGitHubのCode>sshタブurlをコピペ
![スクリーンショット 2022-01-07 22.12.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618527/c48f2cde-9fb4-791a-ef30-9cb4f840be69.png)

この後にpushするとUsernameやPasswordなしで完了しました。

【追記】
下記でremote urlを変更する方がスマートな模様

```:ターミナル
git remote set-url origin git@github.com:... .git
```
ESP32でI2Cを任意のピンで使用する時、引っかかった話（プルアップ抵抗）（ArduinoIDE）

#起こったこと
I2Cで使用したPINは、GPIO12,13
プルアップ抵抗をしていなかったので2.2Kのプルアップ抵抗を入れるとエラー。

__シリアルモニターにこんな表示が__
```rst:0x10 (RTCWDT_RTC_RESET),boot:0x33 (SPI_FAST_FLASH_BOOT)
flash read err, 1000
ets_main.c 371
ets Jun  8 2016 00:22:57```
エラー内容については後で。。。
#原因
__原因はPULLDOWN初期値のGPIOをPULLUPしたこと__

ESP32のGPIOには初期値が、GPIOによって違う。
>GPIOの初期値についてはLang-shipで詳しく解説してくれています（マジ、助かる）
https://lang-ship.com/blog/work/esp32-gpio/

大体はPULLUP or INPUTなのだが、所々にPULLDOWNがある。
__GPIO13__は初期値が__PULLDOWN__なのでそこでエラーがおこった。
#対策
初期値がPULLUP or INPUTのGPIOに変更するといいと思います。
#エラー内容
エラー内容をGOOGLEで検索をかけると、前例が出てきました。
>https://bokunimo.net/blog/esp/848/

どうも不安定な電源が原因のようです。
勝手な憶測ですが、PULLDOWN初期値のGPIOをPULLUPしてしまうと、短絡した状態になるようで電源が不安定になるのかなと思います。
PythonでUnion-Findアルゴリズムを実装する

けんちょん本（「[アルゴリズムとデータ構造](https://amzn.to/3f69Xsx)」）の第11章で扱われているUnion-Findについて、Pythonで実装してみました。

## 前提知識：素集合データ構造に対する操作

素集合データ構造とは、互いに重なり合うことが無い集合を持つデータ構造（おおざっぱにいうときれいに分類されているということ）。このデータ構造に対して、Union（2つの集合を1つに統合する）とFind（特定の要素がどの集合に属しているかを調べる）という操作を行うアルゴリズムを**Union-Findアルゴリズム**と呼びます。この2操作に、MakeSet（集合を作成する）を加えることにより、さまざまな分割問題をとけるようなツールとして利用できます。

https://ja.wikipedia.org/wiki/%E7%B4%A0%E9%9B%86%E5%90%88%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0

## Pythonで実装してみた

けんちょん本とはちょっと実装方針を変えています。

- 素集合データ構造（DisjointSet）の中にUnion-Findを含めた。
- Root→Find、Unite→Unionにメソッド名を変えた。

```python
class DisjointSet:
    def __init__(self) -> None:
        self.parent = {}
        self.size = {}

    def makeSet(self, set):
        for e in set:
            self.parent[e] = e
            self.size[e] = 1

    def Find(self, x):
        if self.parent[x] == x:
            return x
        else:
            # 経路圧縮
            self.parent[x] = self.Find(self.parent[x])
            return self.parent[x]

    def Union(self, x, y):
        a = self.Find(x)
        b = self.Find(y)

        if a == b:
            return False

        # union by sizeで効率化
        if self.size[a] < self.size[b]:
            a, b = b, a

        self.parent[b] = a
        self.size[a] += self.size[b]
        return True

    def issame(self, x, y):
        return self.Find(x) == self.Find(y)

    def getsize(self, x):
        return self.size[self.Find(x)]

def printSet(set, ds):
    return [ds.Find(i) for i in set]

def test_unionfind():
    ds = DisjointSet()
    ds.makeSet([1, 2, 3, 4, 5, 6])
    ds.Union(1, 2)
    ds.Union(2, 3)
    ds.Union(5, 6)

    assert ds.issame(1, 3) == True
    assert ds.issame(2, 5) == False

    ds.Union(1, 6)

    assert ds.issame(2, 5) == True
```

## 参考
- [Disjoint–Set Data Structure (Union–Find Algorithm)](https://www.techiedelight.com/disjoint-set-data-structure-union-find-algorithm/)
qiitaに初投稿した際の苦戦

## VSCodeで挑戦してみた
### 環境
os&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Windows 10 Pro 20H2
node&nbsp;&nbsp;v12.18.4. 

### インストールは下記を参考にできた
[VS CodeでMarkdownを書くために便利な拡張機能Markdown All in One](https://tonari-it.com/vscode-markdonw-all-in-one/) 
    


### ファイルの作りかたがわからない
 検索したが出てこない・・
    拡張子をmdでやってみたら、できてる様子

### プレビューを見ながら編集できるらしい
[プレビューをサイドバイサイド（隣り合わせ）に表示](https://atmarkit.itmedia.co.jp/ait/articles/1804/20/news030.html)


    コマンドパレット：［Markdown: プレビューを横に表示］（Markdown: Open Preview to the side）
    キーボード：［Ctrl］＋［K］→［V］（Win／Linux）、［Command］＋［K］→［V］（macOS）
おー！！、プレビュー表示するとそれらしい

### qiitaに登録

[Qiitaの始め方](https://qiita.com/pukupukuaaa/items/33edfae2deb8b376f35f)

### 投稿する
右上の「投稿する」ボタン押す。
vscodeで書いたものをコピペ
・タイトル記入
・タグを記入（5つまで）
・本文をコピー

右下の「qiitaに投稿」ボタンを押す

### 今回はこれで終了
見た目があまりよろしくありません。まだまだ修行が必要・・・
スクリーンショットなど次は写真を入れたい

追記　2022/1/7 21:50
検索してみたらコピペが2回してある部分あり、すいません
タイトルと本文も2重になってた。
追記２　2022/1/7 21:54
肝心のどこで苦戦したが書いてませんでした。投稿できなかった原因はタイトルが未記入だったみたい・・
【Ruby】  &. (ぼっち演算子) の使い方


Ruby でたまに見かける **&.** というメソッドについて

# &. ってなに？

一般的に「ぼっち演算子」と呼ばれています。
Ruby 2.3 で追加されたメソッドです。

# どう使うの？

レシーバ + &. + 呼び出したいメソッド　という形で使います。

以下の例では "hoge" という文字列をレシーバとし、
呼び出したいメソッドは upcase （小文字を大文字に変換） とします。

```
irb(main):001:0> "hoge"&.upcase
=> "HOGE"
```

# どういう時に使えるの？

レシーバが nil の可能性があるような場合、かつレシーバが nil なら nil を返してほしい時に使えます。

普通、レシーバが持っていないメソッドを使おうとすると NoMethodError が発生します。

例えば数字 (Integer) に対して　 upcase メソッドを使ってみましょう。
upcase メソッドは String 型に対して使うものであるため NoMethodError が発生します。

```
irb(main):002:0> 1.upcase
...
NoMethodError (undefined method `upcase' for 1:Integer)
```

nil がレシーバの時も同様です。

```
irb(main):003:0> nil.upcase
...
NoMethodError (undefined method `upcase' for nil:NilClass)
```

一方、レシーバが nil の時に &. を使ってメソッドを呼び出すと NoMethodError を発生させず、ただ nil が返ってきます。

```
irb(main):004:0> nil&.upcase
=> nil
```

# 注意点

レシーバが nil ではない時は NoMethodError が発生するので注意しましょう。

```
irb(main):006:0> 1&.upcase
...
NoMethodError (undefined method `upcase' for 1:Integer)
```
Kotlinで地図アプリ（ゴミ拾いアプリ）。（16日目）　Navigation Drawerの実装。

#今日やった事

・Navigation Drawerの実装テスト



参考サイト：

https://developer.android.com/topic/libraries/support-library/packages?hl=ja

https://developer.android.com/jetpack/androidx?hl=ja

https://qiita.com/R-Az/items/8afc555d3c7e6fcb0565

https://akira-watson.com/android/androidx.html

https://stackoverflow.com/questions/57492085/androidx-navigation-drawer

https://stackoverflow.com/questions/50333357/navhostfragment-not-accessible-from-xml

#


#レイアウト

```xml:activity_maps.xml
<androidx.drawerlayout.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:keepScreenOn="true"
    android:launchMode="standard"
    android:orientation="vertical"
    tools:context=".MapsActivity">

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/navi_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header" />


....
```

```xml:nav_header_home.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_blue_light">
<ImageView
    android:id="@+id/imageView"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:layout_marginTop="16dp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:srcCompat="@drawable/ic_launcher_foreground" />
<TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="16dp"
    android:text="ナビゲーションドロワーヘッダ"
    android:textColor="@android:color/background_light"
    android:textSize="18sp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.5"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/imageView" />
<View
    android:id="@+id/divider"
    android:layout_width="409dp"
    android:layout_height="1dp"
    android:layout_marginStart="16dp"
    android:layout_marginTop="16dp"
    android:layout_marginEnd="16dp"
    android:background="?android:attr/listDivider"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/textView" />
</androidx.constraintlayout.widget.ConstraintLayout>
```

実行：

![Intent.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503948/d5a2c900-dc22-1c47-b0c9-97f503032381.gif)



問題点：
メインレアウトのボタン消える
Python tkinter で undo/redo をやりたいメモ

## 背景

tkinter で undo, redo やりたい.

`Text` widget だと `undo=True` でいけたりするが, たとえば `Entry` widget では対応していない.
また, カスタム widget 作った場合も同様で自前で undo/redo の仕組みを作る必要がある.

## 方法

ウィジェト全体にキーバインドをしかけて, 自前で undo/redo 処理が必要でした.

https://stackoverflow.com/questions/45393923/python-tkinter-key-binding-to-all-subsequent-widgets

`ctrl-z` で undo したい場合, `<Control-z>` を bind に指定します.

### undo/redo の情報の保存

幸い Python は値を保存するというのがやりやすいので, 適当に編集履歴の情報を stack(list) に追加したりしていけばいいでしょう.
(C++ とかだとめんどい. `std::any` や, JSON とかにメッセージをシリアライズとかしないといけない)

GUI 要素が動的に追加/削除されるのではなければ, `event` あたりにあるウィジェトの id(ハンドル?)あたりを保存でもいいかもしれません.

## `ctrl-shift-z` で redo したい.

tkinterのTextウィジェットを使っているときCtrl+Shift+Zでredoが効かないのを直す
https://qiita.com/Dr_Thomas/items/c825e4bf21e150f6188c

ありがとうございます. `shift` キーを含める場合は, この場合は `Key-Z` と Z 大文字が必要でした.
poetry dev コンテナで .venv が壊れて、想定外の仮想環境再作成が行われたことへの対処

# 発端

自身のlocal環境に .venv を作成しました。
そして、元々開発で使っていた poetry dev コンテナを立ち上げた時、
ホストの .venv がコンテナの .venv にバインドされて壊れてしまいました。
気が効く poetry は仮想環境の再構築を始めました。
(ここまではありそうな話の想定)

しかし、poetry は想定外の仮想環境の構築をし始めてしまいました :thinking: 

```
root@e4a563668462:/var/www# poetry run uvicorn apps.main:app --reload --host 0.0.0.0
The virtual environment found in /var/www/.venv seems to be broken.
Recreating virtualenv www-p9HyaoIY-py3.9 in /root/.cache/pypoetry/virtualenvs/www-p9HyaoIY-py3.9

  FileNotFoundError

  [Errno 2] No such file or directory: b'/bin/uvicorn'

  at /usr/local/lib/python3.9/os.py:607 in _execvpe
       603│         path_list = map(fsencode, path_list)
       604│     for dir in path_list:
       605│         fullname = path.join(dir, file)
       606│         try:
    →  607│             exec_func(fullname, *argrest)
       608│         except (FileNotFoundError, NotADirectoryError) as e:
       609│             last_exc = e
       610│         except OSError as e:
       611│             last_exc = e
```

現在ディレクトリに .venv を作ってもらうにはどうしたら良いかというお話です。


# poetry config を設定し直し、 .venv を再構築してパッケージを入れ直す

virtualenvs.in-project を true に修正することで、現在ディレクトリに .venv を作ってくれました。

```
root@531b098ed9d3:/var/www# poetry config --list
cache-dir = "/root/.cache/pypoetry"
experimental.new-installer = true
installer.parallel = true
virtualenvs.create = true
virtualenvs.in-project = null
virtualenvs.path = "{cache-dir}/virtualenvs"  # /root/.cache/pypoetry/virtualenvs


root@531b098ed9d3:/var/www# poetry config virtualenvs.in-project true

root@531b098ed9d3:/var/www# poetry config --list
cache-dir = "/root/.cache/pypoetry"
experimental.new-installer = true
installer.parallel = true
virtualenvs.create = true
virtualenvs.in-project = true
virtualenvs.path = "{cache-dir}/virtualenvs"  # /root/.cache/pypoetry/virtualenvs

root@531b098ed9d3:/var/www# poetry install
The virtual environment found in /var/www/.venv seems to be broken.
Recreating virtualenv www in /var/www/.venv
Installing dependencies from lock file

Package operations: 60 installs, 0 updates, 0 removals

  • Installing certifi (2021.10.8)
  • Installing charset-normalizer (2.0.7)
  • Installing idna (3.3)

```
この後無事パッケージ install が進み、 uvicorn が起動してくれました。


# 参考
poetry の設定のリファレンス

https://python-poetry.org/docs/configuration/#available-settings
Rustで実行時にPanic。曰く「byte index 4 is not a char boundary」から始まる異世界狂想曲

# はじめに

Rust、素敵です。ネイティブコードを吐けるコンパイル言語なのに、こんなに書きやすい。これまでC/C++での悩みだった「コンパイルは通るけど、まともに動かない。つか落ちる」ということがほとんどなく、日常遣いの書き捨てツールでも、ガンガン使えます。うれし。

でも、いくつかハードルがあります。ご存じの通り、借用の概念は身につくまでに多少苦労しますし、```Option```とか```Result```とか、付随して```match```とか```try!```とか```if let```とかにも、慣れるまでちょっとした違和感の谷があります。

ともあれ、「普段使いできるコンパイル言語」って、長い間待ち焦がれてきたものだったので、Rustには感謝しかありません。……でも昨日、ちょっといやーんな場面に出くわしました。

```
byte index 4 is not a char boundary; it is inside '請' (bytes 3..6) of `申請日時`
```

落ちた！　落ちたよ！　Panicだよ。```unwrap()```で暫定的に手抜いていたところじゃないよ！　とひとしきりワンワン吠えました。

# 何が起きたか

どういうことが起きたかというと、スライスの境界が文字と文字の間ではなく、ひとつの文字をぶった切るようになってしまった、ということです。ご存じとは思いますが、ASCII文字以外のUTF8の文字って、人間にとっての1文字が、バイト列としては3×nバイトになります。今回の例で言うと、文字とメモリイメージの対応は下図の肌色部分のようになっていまして、それに対して、赤で示した範囲をスライスで取ろうとしたのでPanicしたのです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79187/096780d2-1b96-fcdf-ff5d-2d53d15eaa4a.png)
これはガード不能攻撃で、**予測不能な入力文字列をStringに入れて、as_str()で中身を覗いてスライスに対して判定をかます**、という**大変当たり前なコードが、チェックする暇もなく落とされてしまう**のです。スライスが```Result```を返してくれるわけでもないので、そうすると、```&str```のスライス自体が……詰んでね？

# 聖典を見る

では、とRust Bookを見ます。章のタイトルに「UTF」が入っているものを検索すれば、すぐに該当の記述は見つけられます。

https://doc.rust-lang.org/book/ch08-02-strings.html

ここに言及されてはいますが、あまり助けになる説明はありません。軽く絶望します。事前に```[u8]```にして自力で妥当な切れ目を調べれば回避可能ですが、それも頭が悪そうな気がしますので、もう少しなんとかならないものでしょうか。まあcrate.ioのリンクがあったので、使えそうなcrateを探すことにしました。一応[こんなの](https://crates.io/crates/unicode-segmentation)があって、書記素に分割してくれるようですが、別に書記素に分けたいわけじゃないんですよね。

# 暫定解決策と展望もしくは教えてエロい人

単にこの際、```&str```のスライスは禁じ手にして、```chars()```イテレータを走査するのがいいのかもしれません。そういうもんなの？　[教えてエロい人](https://dic.nicovideo.jp/a/%E6%95%99%E3%81%88%E3%81%A6%E3%82%A8%E3%83%AD%E3%81%84%E4%BA%BA)！　[ボスケテ](https://dic.pixiv.net/a/%E3%83%9C%E3%82%B9%E3%82%B1%E3%83%86)……。**コンパイラスイッチで```&str```のスライスをエラーにさせてほしい気分です**。当面は```chars().collect()```で作った```Vec<char>```に対して、各種文字列処理を行う道具を整えようと思います。割と使うけど自明でない（＝作っておく必要がある）のは、```cmp, instr, replace, atoi系, toupper系, 全角半角変換, かなカナ変換```とか、その辺ですかね。正規表現マッチは自分で書きたくありませんので、**そのときはStringに戻します**かね。抽象度の高い正規表現があって、そのまま```Vec<char>```にも使えたらいいけど、期待できない気がします。自分で書くのは……車輪の再発明という意味では[Dr.STONE](https://www.google.com/search?q=%E3%81%9D%E3%81%9D%E3%82%8B%E3%81%9C%E3%80%81%E3%81%93%E3%82%8C%E3%81%AF&tbm=isch&ved=2ahUKEwjnktrzwZ_1AhVIAaYKHdhYAF0Q2-cCegQIABAA&oq=%E3%81%9D%E3%81%9D%E3%82%8B%E3%81%9C%E3%80%81%E3%81%93%E3%82%8C%E3%81%AF&gs_lcp=CgNpbWcQA1CODViIHmCCM2gAcAB4AYABfYgBuAiSAQMyLjmYAQCgAQGqAQtnd3Mtd2l6LWltZ8ABAQ&sclient=img&ei=DyHYYafPHciCmAXYsYHoBQ&bih=761&biw=1378)なのですが、**そそらないです、これは**……。

**何か、盛大に勘違いしていますか、私は？**

# 太字でうっすら思っていた通り、盛大に勘違いしていました

コメントで教えていただいたので、追記です。上記の通り、太字でうっすら思っていた通り、盛大に勘違いしていました。

```
fn main() {
    let s = "申請日付";
    println!("{}", s.get(0..3).unwrap_or("ouch"));// 申
    println!("{}", s.get(0..4).unwrap_or("ouch"));// ouch
    ()
}
```

そんなわけで、getなら、スライスと同じ結果を、Resultに包んで得られるのです。不用意にスライスを使うと危ない、というのは、それはそれとして何か対策が必要な気はしますが、まずは正しいやり方が分かって良かったです。ありがとう、そして、ありがとう。

なお、ハコヅメは第1話は楽しめましたが、第1話なのにテンポというか間合いがもっさりしていて、若干不安が残りました。
(PHP)PDOのプレースホルダーについて

#PDOのプレースホルダーは変数名で書くべき
結論から言うとプレースホルダーには入れ込む変数名を記述するようにしましょう。
?でも可能ですしexecuteの引数の記述も減らせますが可読性や保守性面を考えると変数名で記述すべきだと言えるでしょう。

```php
$label = '素晴らしい！！';
$n = 80;
$stmt = $pdo->prepare(
    "UPDATE
       posts 
    SET 
      message = CONCAT(?, message) 
    WHERE 
      likes >= ?"
  );
  $stmt->execute([$label, $n]);
```

↓書き換えると

```php
$stmt = $pdo->prepare(
    "UPDATE
       posts 
    SET 
      message = CONCAT(:label, message) 
    WHERE 
      likes > :n"
  );
  $stmt->execute([':label' => $label, ':n' => $n]);
```

またexecute()の　第1引数のコロン(:)は省略できるので↓

```php
$stmt = $pdo->prepare(
    "UPDATE
       posts 
    SET 
      message = CONCAT(:label, message) 
    WHERE 
      likes > :n"
  );
  $stmt->execute(['label' => $label, 'n' => $n]);
```
こうなります。
以上。
第一期ブロックチェーン研究開発部会の活動に参加しました！

## ブロックチェーン研究開発部会について
JPYC開発コミュニティで10月から12月まで毎週1回1時間程度の研究開発部会を開催され、講師のサポートのもと、意見交換やサンプルコードを作成しました。私の場合はブロックチェーンに関する記事を3つとBTCの価格を予想するゲームを作成しました。
## 活動内容
### 自分の所信表明
以下の二つがブロックチェーン研究開発部会で立てた自分の所信表明です。
● 有名なコントラクトのコードの解説をできるようになる。
● コントラクトにゲームのロジックを書き込んでいろんな人にスマコンに親しんでもらえるようにする。　⇨　BTCの価格を予想し、当てるとERC20トークンがもらえる完全オンチェーンのゲームを作って見たら面白いのでは、と考えました。
### BTC価格予想ゲーム
#### 構成
![スクリーンショット 2021-12-31 21.07.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449978/47b40f9e-fc1b-c402-83f6-b15512b43024.png)

#### プロダクトの説明
##### 事前準備
metamaskのインストール
＊コントラクトやフロントエンドを編集する場合
node.js(v12以降)の環境

##### 概要
1週間おきにビットコインの価格を予想し、的中すればPBT(PredictBitcoinToken)トークンがもらえます。精度が高ければ高いほどトークンをたくさんもらえます。ビットコインの価格はAgrregator, Chainlinkから取得します。締め切り、スナップショットはインセンティブをつけてユーザーが行います。＊デモ用に間隔は5分にしています。

##### PBT(PredictBitcoinToken)算出法
予想と実際の価格の誤差が0.1%未満の場合50000PBT、1%未満の場合は20000PBT、3%未満の場合は10000PBT、5%未満の場合は5000PBT、8%未満の場合は2000PBT、10%未満の場合は1000PBT、20%未満の場合は500PBTがもらえます。
#### プロダクトのリンク
間隔はデモ用に5分に設定されています。
webアプリ⇨https://retocrooman.github.io/predictBTC/
GitHub⇨https://github.com/retocrooman/predictBTC
トークンが一斉mintされているトランザクション⇨
https://rinkeby.etherscan.io/tx/0x9128b818fbbf2c15c81b26bc6a60830a5f94d2fe897330035f12ae4a95347768

### 記事作成
#### 目的
コントラクトを解説している日本語の記事は少なく、少しでもコントラクトの開発の手助けになればと思い自分で勉強したことを記事にまとめました。

#### 記事紹介
SolidityにおけるMerkle Proofについて⇨https://zenn.dev/retocrooman/articles/98badb1cf200d9
ERC20Permitについて⇨https://zenn.dev/retocrooman/articles/6105e03de7b5c9
SafeERC20について⇨https://zenn.dev/retocrooman/articles/20768619a313ae

## 終わりに
JPYC開発コミュニティで研究開発部会はこれからも続いていくので、自分のスキルアップとweb3の盛り上がりを願って活動を続けていこうと思います。
【Ruby】引数にデフォルト式を指定するときはキーワード引数を使おう

###キーワード引数

メリット

- 引数の順番を気にしなくていい
- 引数が何を指しているのかわかりやすい

####引数にデフォルト値を与える

```ruby
def greet(name, message = 'Hello')
  "#{message}, #{name}さん"
end

#messageを指定しないとデフォルト値がそのまま出力される
greet('Kato')
#=> Hello, Katoさん

#デフォルト値を変更
greet('Kato', 'Hi')
#=> Hi, Katoさん

#引数の順番を逆にすると意図してない動きをする
greet('Hi', 'Kato')
#=> Kato, Hiさん
```


####キーワード引数を使う

```ruby
def greet(name: '名無し', message: 'Hello')
  puts "#{message}, #{name}さん"
end

#引数指定なし
greet
#=> hello, 名無しさん

#nameのみ指定
greet(name: 'Kato')
#=> Hello, Katoさん

#messageのみ指定
greet(message: 'Hi')
#=> Hi, 名無しさん

#name, messageともに指定
greet(name: 'Kato', message: 'Hi')
#=> Hi, Katoさん

#引数の順番を逆にする
greet(message: 'Hi', name: 'Kato')
#=> Hi, Katoさん
```


###キーワード引数はシンボルと同じじゃないの？と思った人はこちら

https://qiita.com/jnchito/items/74e0930c54df90f9704c

###参考

https://qiita.com/aeroastro/items/49e18cb7e95a64e0eacf


####おまけ
「デフォルト引数」という言葉が公式なのか微妙だった
この画像を QR として認識したらダメなんじゃ？

:::note alert
記事中の QR 風画像では iPhone/iPad (iOS 15.2他) 機能（コードスキャナー）の
バグ（以前に正しく読み取れたデータと誤認して動作開始）を誘発します。
:::

iPhone/iPad のバグ確認と予測不能な動作を防ぐため、"https://qiita.com/" の QR を置いておきます。

![qiita.com.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226677/35781113-d6c5-5eb5-ad0c-ef138c72fae5.gif)

これをスキャンして Qiita のホームが開いたら、左上の「閉じる」を実行し、下記の QR 風画像をスキャンすると Qiita のホームが再び開きます。

:::note alert
下記の QR を iPhone/iPad でいきなりスキャンすると、最後にスキャンに成功したものと同じ動作する恐れがあります。
:::

コードスキャナーのプロセスをきちんと終了させてから起動すると問題は発生しませんが、アプリの切り替え操作ではコードスキャナーが終了したように見えることがあります。この場合、アプリの一覧には出てこないだけで、プロセスは終了しておらず、コードスキャナーを起動すると「閉じる」操作と同じ状態から開始されるようです。


# QR として認識されてしまう画像

![NOT-QR.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226677/911fbfbf-431c-3e65-196c-f8ed0c7e9bcf.png)

見るからに、何もデータが入ってなさそうです。（QR 生成ソフト開発してたら動作確認のために、こういうのを作ってしまいますよね？）

この画像を QR として見た場合の状態は

| | 内容 | 備考 |
|:-:|:--|:--|
| ○ | 位置検出パターン | |
| ○ | タイミングパターン | |
| × | 形式情報 | マスク処理後の値が 00000 0000000000 になっている |
| ○ | マスク パターン | 参照子が 000 と同じならば |
| ○ | データ コード語 | マスク パターンを解除した場合、全てゼロ(埋め草がない) |
| ○ | 誤り訂正 コード語 | マスク パターンを解除した場合、全てゼロ |

となるハズです。

手元で試した QR リーダーのいくつかは、これが読み取れたことになります。

読み取れたことになるからには

- 情報形式の欠如をパスする（マスクパターンの参照子は 000 としてしまう）
- マスク パターンを解除すると、データ コード語と誤り訂正 コード語が全てゼロ
- コード語が全てゼロだと誤り訂正の必要がない

という経路を辿っていると推測できます。

最後に「エラーなしでデータ コード語が読み取れた」という部分が他の誤処理を覆い隠している感は否めません。そして、データ（文字列）復元のため、最初のモード指示子の取得を試みると終端パターンが現れるので、見事に空データを取得できてしまいます。

エラーとしてもよさそうなポイントがいくつかあります。

- 形式情報の欠如
- 全コード語がゼロ
- データの最初が終端パターン

リーダーを作る事があったら、これには気をつけたい。
【MUI】MUIのpasswordTextFieldを使いやすいようにカスタムする【React】

<h2>TextFieldをカスタム</h2>
MUIには便利なTextFieldのコンポーネントがありますが、かゆいところに手が届かない感じだったので、少し自分なりに手を加えてみました。

追加したところ
・Enterを押下したときに、特定の処理(submitなど)を差し込めるように
・Passwordの●のON/OFF(MUIでは、TextFieldでのON/OFFは例示されていなかったため追加)
・カスタムしたComponentなので、外部からvalueやsetvalueを引数にもらうように

<h2>実装例</h2>

```react:textField.js
import React, { Fragment, useState } from 'react';
import { makeStyles } from '@material-ui/core/styles';
import TextField from '@material-ui/core/TextField';
import IconButton from '@mui/material/IconButton';
import Visibility from '@mui/icons-material/Visibility';
import VisibilityOff from '@mui/icons-material/VisibilityOff';
import InputAdornment from '@mui/material/InputAdornment';

const useStyles = makeStyles((theme) => ({
  root: {
    '& .MuiTextField-root': {
      margin: theme.spacing(1),

    },
  },
}));

export function PasswordTextField({ label, value, setValue, onKeyDown, helperText }) {
  const classes = useStyles();
  const [showPassword, setShowPassword] = useState(false);

  function handleChange(event) {
    setValue(event.target.value)
  };

  function handleClickShowPassword() {
    setShowPassword(!(showPassword))
  }

  function handleMouseDownPassword(event) {
    event.preventDefault();
  };

  return (
    <Fragment>
      {
        <form className={classes.root} noValidate autoComplete="off">
          <TextField
            id="outlined-basic"
            label={label}
            variant="outlined"
            fullWidth
            value={value}
            helperText={helperText}
            type={showPassword ? 'text' : 'password'}
            InputProps={{
              endAdornment:
                <InputAdornment position="end">
                  <IconButton
                    aria-label="toggle password visibility"
                    onClick={handleClickShowPassword}
                    onMouseDown={handleMouseDownPassword}
                    edge="end"
                  >
                    {showPassword ? <VisibilityOff /> : <Visibility />}
                  </IconButton>
                </InputAdornment>
            }}
            onChange={(event) => handleChange(event)}
            onKeyDown={(event) => {
              if (event.key === 'Enter') {
                event.preventDefault();
                onKeyDown(event)
              }
            }}
          />
        </form>
      }
    </Fragment>
  );
}

```

<h2>参考</h2>

https://mui.com/components/text-fields/
UnityEditorでobjectを一定間隔ですぐに配置する

[UnityStation](https://learning.unity3d.jp/7693/)みて知った. 
記事っぽいのもなさそうなので自分用にメモ.

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

transformのフィールドに `L(-1,1)` みたいな感じで打つと、複数選択したオブジェクトが均等間隔で配置される. 便利..!
UnityStationの方でsinとかRとかいろいろ他にも紹介してて面白かった.
サンプルプロジェクトを見る

Unity Learnでブリーフについてのチュートリアルがあったので，「個人的に」メモしておく．
実際に学びたい方は，[こちらのリンク](https://learn.unity.com/tutorial/explore-the-sample-project?uv=2020.3&pathwayId=5f7e17e1edbc2a5ec21a20af&missionId=5f751af7edbc2a0022cdbbb6#)から学ぶことを推奨します．

# 概要

プロジェクトの概要を確認し、これから取り組むアプリケーションのUnityプロジェクトについて、時間をかけて検討します。

## 始める前に

[バージョン管理の設定](https://qiita.com/pvicugna11/items/3e30869ae55c2a4822ec)のチュートリアルを完了する必要があります．

## プロジェクトへようこそ

今回取り組むUnityプロジェクトは，**資源管理シミュレーションアプリケーション**です．

![image_001_0001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2365808/bbcc9ad1-0575-8c0c-ee13-4ee6733e90d1.jpeg)


この種のプロジェクトは，プログラミングシステムやアーキテクチャを含むことが多いため，
プログラミングの探求に特に適している：

- シミュレーションに影響を与えることができる，ユーザーとのインタラクション
- ユーザーによるさらなるカスタマイズを可能にするシーン間の遷移
- シミュレーションをより複雑なものにするための拡張システム

## シミュレーションを体験する

このプロジェクトでは，基本的な資源管理シミュレーションを提供した．
それでは，じっくりと見ていく：

1. プロジェクトウィンドウで，**Assets** > **Scenes**と進み，Mainシーンを開く．
1. **Play**を選択すると，Playモードになり，シミュレーションを確認することができる．
1. 現時点では：
 - 2種類の**Resource Pile**(パレット上のオブジェクト)があり，  
いずれも1秒間に0.5個の速度でリソースアイテムが生成される．
 - 決められた**拠点**(赤丸で示したトラック前方のスペース)に資源を運ぶ  
**トランスポーターユニット**(フォークリフト)3台  
![image_001_0001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2365808/bbcc9ad1-0575-8c0c-ee13-4ee6733e90d1.jpeg)  
トランスポーターユニットやリソースパイルを左クリックすると，  
その詳細を示すユーザーインターフェースの情報がオーバーレイ表示される．
1. トランスポーターユニットを左クリックすると，その上に緑色の矢印のアイコンが表示され，選択されたことを示す．  
![image_002_0100.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2365808/6bec3766-d41c-c2bd-aaaf-3fe10e5808df.jpeg)
1. 2つの資源の山のうち1つを右クリックする．
1. 輸送ユニットでできることを試してみる！
1. 終了したら，忘れずにもう一度**Play**を選んでPlayモードを終了する．

## プロジェクト概要の確認

**プロジェクトの概要**を作成してくれてるので，見てみる：

- このUnityプロジェクトの内容
- シミュレーションの基本機能
- このパスウェイの次の2つのミッションで実装する追加機能

集中して，ブリーフに目を通す時間をとる：

- プロジェクト概要書をダウンロードし，保存する．  
([こちら](https://learn.unity.com/tutorial/explore-the-sample-project?uv=2020.3&pathwayId=5f7e17e1edbc2a5ec21a20af&missionId=5f751af7edbc2a0022cdbbb6#60b01e14edbc2a5522e2d539)からダウンロードしてきてください．)
- Unity Editorでプロジェクトを開いた状態でドキュメントを確認し，プロジェクトを参照しながら作業できるようにする．
- スクリプトファイルを開いて，さらに詳しく調べる．

## このミッションでの目標

実装するもの：

- 必要なシーンフローとユーザーインターフェースボタン
- シーン間のデータの永続化により，ユーザーはスタートメニューで色を選択し，  
シミュレーション内のTransporter Unitsに適応することができる
- セッション間のデータの永続化により，ユーザーが最後に選択した色が，  
アプリケーションを再度起草したときにあらかじめ選択されるようにする．

最終提出課題では，学習した内容を応用し，簡単なゲームプロジェクトにデータの永続化を実装する．

次のミッションでは，オブジェクト指向プログラミングの原則に基づき，コードを改良し，
シミュレーションに新しい機能を追加する．

### アプリケーションをカスタマイズする

このミッションの焦点は，プログラミングシステムとアーキテクチャだが，
プロジェクトをカスタマイズし，以前のミッションで学んだスキルを統合する機会をここで見つけることができる．

## 最後に

このプロジェクト概要は，この学習体験を通じて自分のものにできることを忘れないでください．

このチュートリアルの目安が15分なのバグでしょ...(ボソッ)
ただ，客観的に，このチュートリアルの追加機能をすぐに実装できるぐらいにならないと，
まだまだ初心者なんだろうなと思います．
そんな日がすぐにでも来ることを目指して日々開発していきます！対戦よろしくお願いします！
vue3 beforeEach で ログイン管理

・外部から直接URLを指定してもmypageで弾く
・mypageに行く前にlocalStorage があるかチェック

?crypt_id がある場合は localStorageにデータを入れる
ない場合はログインしてねページへ飛ばす

```app.js

    const routes = [
        {
            path: "/mypage",
            component: Mypage,
            meta: { requiresAuth: true,title: 'マイページ' }
        },
    ];


    //router
    const router = createRouter({
        routes, // short for `routes: routes`
        history: createWebHistory(),
        scrollBehavior
    })


    //beforeEach
    router.beforeEach((to, from, next) => {

        //?crypt_id があれば storageに セット
        if(to.query.crypt_id){
            localStorage.setItem('crypt_id',to.query.crypt_id);
        }

        if (to.matched.some(record => record.meta.requiresAuth)) {
            if(localStorage.getItem('crypt_id')){
                next();
            } else {
                next({ path: '/login', query: { redirect: to.fullPath }});
            }

        } else {
            next();
        }

    });



```
関数の作り方

初心者用に関数の作り方のテンプレを置いておきます


```
fun 関数名(引数) : 戻り値の型　{
    この関数で行いたい処理
　　 return 戻り値
}
```
例：　

```
fun ChangeSwitch(text:A):Boolean{

  if(text == A){
    （text が　A だったら〜〜〜してね）}
  return true
}
```
//これで　true の値が　取れる
GOWIN Syntyesis Top Level Moduleの設定

メモレベルの記事です。加筆できればしていきますが、ひとまず個人用の備忘録レベルで。
なお、本稿はGOWINを使い方としての記載であり、FPGA開発においてどこまで適用できる説明になっているか不明。
= トラ技を読みながらFPGA勉強するうえでハマったところになるので、用語が結構怪しいという予防線です...。

【概要】
論理合成の対象の設定としてTop Level Module、すなわちどの*.vファイルを最上位と置くかを設定する必要がある。
おそらく、とくに手動設定しない場合には最後に変更・保存したファイルが充てられるようになっているが、
下位モジュールの変更が最後になることは往々にしてあることのため、後述の設定欄を埋めておくのが無難。

【困る点】
論理合成の対象が意図と違う設定になっている場合、合成処理がすべて意図しない範囲に対して行われるため、
具体的には以下のような困りごとが起こった。

・FloorPlannerのI/O Constraintsが思ったIOで設定されていない

【設定方法】
対象バージョン：GOWIN FPGA Designer 1.9.8.01

1. Processパネル > Synthesize > Configurationを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127486/cf0236a3-34f3-635c-dd4a-f4a98baf7af9.png)

2. Sythesize > General > Top Module/Entity に最上位モジュールのファイル名を記入し、OKを押下。
 
下図の場合、最上位モジュールはmatrix_key.vです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127486/fb258b45-cb4b-072b-8e5a-97f9c01517cd.png)


3. 正しく設定できているかは、Synthesizeを一度Runした後にProcessパネル > Synthesize > Synthesis Report > Synthesis Detailsを表示することで確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127486/13f59b8c-0c50-cb48-5090-749c81f1d8f6.png)
MRTKのRemoteRenderingでエラーも出ずにロードが開始されなかった原因

## 発生した現象と解決した方法

Unityのエディタではできたが、実機やエミュレータだとなぜか認証状況などのステータスが変更するイベントの発火がなかった

```c#
using UnityEngine;
using static RemoteRenderingCoordinator;

void Start()
{
    RemoteRenderingCoordinator.instance.OnRequestingAuthorization.AddListener(() =>
    {
        // 実機だとここの処理がこない
    });
}
```

インスタンス内のイベント追加を使わずに、用意されている静的なイベント追加をやってあげることでできました

```c#
RemoteRenderingCoordinator.CoordinatorStateChange += (RemoteRenderingState currentState) =>
{

};
```

## 環境

* Unity v2019.4.18
* MRTK v2.7.2
* Azure Remote Rendering v1.0.36

## ちょっとだけRemoteRendering入門のために

https://docs.microsoft.com/ja-jp/azure/remote-rendering/tutorials/unity/view-remote-models/view-remote-models

上記の公式が一番入門としてはよいかと

そして、Unityで利用するには以下のように「Remote Rendering Coordinator」を追加してやると簡単に利用できそうです！

[![Image from Gyazo](https://i.gyazo.com/26cae26cb1a5bac15d94c97fa58e5c66.png)](https://gyazo.com/26cae26cb1a5bac15d94c97fa58e5c66)

### 公式のRemoteRenderedModel でモデル表示

https://docs.microsoft.com/ja-jp/azure/remote-rendering/tutorials/unity/custom-models/custom-models

[![Image from Gyazo](https://i.gyazo.com/fe0f75f8b787f7297962deb1f40b5457.png)](https://gyazo.com/fe0f75f8b787f7297962deb1f40b5457)

「Model Path」の部分にパスを書けば表示できちゃうScriptも公式にありましたので、利用しました。
Athenaで統計情報を取得する

#背景・目的
- Athenaでどこに時間がかかっているか内訳を調べたい。

#結論
- Athenaのget-query-executionのオプションを指定することで統計情報が取得できる。

#内容
## CLIで調査する
- 以下のコマンドを実行する。

```
aws athena get-query-execution  --query-execution-id {クエリID} --query QueryExecution.Statistics --output table
```

- 結果

```
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|                                                                             GetQueryExecution                                                                             |
+--------------------+------------------------------+----------------------------+-------------------------+---------------------------------+------------------------------+
| DataScannedInBytes | EngineExecutionTimeInMillis  | QueryPlanningTimeInMillis  | QueryQueueTimeInMillis  |  ServiceProcessingTimeInMillis  | TotalExecutionTimeInMillis   |
+--------------------+------------------------------+----------------------------+-------------------------+---------------------------------+------------------------------+
|  79139461          |  5083                        |  798                       |  295                    |  68                             |  5446                        |
+--------------------+------------------------------+----------------------------+-------------------------+---------------------------------+------------------------------+
```

- DataScannedInBytes
    - スキャンしたデータ量（バイト数）
- EngineExecutionTimeInMillis
    - クエリの実行にかかった時間（ミリ秒）
- QueryPlanningTimeInMillis
    - Athenaがクエリ実行計画に要した時間（ミリ秒）
    - データソースからテーブルパーティションを取得するために費やした時間も含まれる。
    - この時間はEngineExecutionTimeのサブセット。
- QueryQueueTimeInMillis
    - リソースを待機している時間。（ミリ秒）
    - 実行前の時間と思われる。
- ServiceProcessingTimeInMillis
    - クエリ実行後、クエリ結果を公開するのに要した時間（ミリ秒）
- TotalExecutionTimeInMillis
    - クエリを実行するのに要した時間（ミリ秒）
    - 合計時間と思われる。

- TotalExecutionは以下のように整理できる。
    - 上述したとおりQueryPlanningTimeInMillisはEngineExecutionTimeInMillisのサブセットのため、計算対象から外しています。

| 内訳| 実行時間| 計算対象|
|:-- |:-- |:-- |
| EngineExecutionTimeInMillis| 5083|　◯|
| QueryPlanningTimeInMillis | 798||
|QueryQueueTimeInMillis|295|◯|
|ServiceProcessingTimeInMillis|68|◯|
|TotalExecutionTimeInMillis|5446||


#考察
- これらの数字を確認することで以下の判断ができそう。
    - QueryQueueTimeInMillisが長い。
        - スループットが大きい。（多い）
        - 競合のクエリが多いなど。
        - アカウントあたりのAPIコールのクォーターの引き上げを検討する。
            - StartQueryExecution（デフォルト20/秒）
    - QueryPlanningTimeInMillisが長い。
        - テーブルパーティションを取得する時間も含まれるので、パーティション数が多いか追加で確認する。
        - GlueやAthenaのパーティションインデックスを検討する。
    - ServiceProcessingTimeInMillis
        - クエリの結果を返すのに時間がかかっている。
        - 単純にデータ量が多い場合が考えられる。

#参考
https://docs.aws.amazon.com/cli/latest/reference/athena/get-query-execution.html
https://docs.aws.amazon.com/ja_jp/athena/latest/ug/service-limits.html#service-limits-api-calls
[Drupal]hook_presaveでフォーム以外がトリガーになっているの場合のみ処理を行う

```php
/**
 * Implements hook_ENTITY_TYPE_presave().
 */
function my_module_node_presave(NodeInterface $node) {
  // リクエストオブジェクトを取得.
  $request = \Drupal::request();

  // フォームIDがある場合は何もしない.
  if ($request->get('form_id')) {
    return;
  }
}


```