OmniAICreator/Qiita-1.07M huggingface dataset:
WROに出るんだって

# WROに出るんだってさ
学校の中間テストが終わるがいなやコンピューター部の顧問に「WROに出てもらいます」と言われました。
ふぇ？って感じなんですが、まぁいいかと。

で、大会はいつなのかと言うと...
![Screenshot 2022-05-14 22.49.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449798/acffdd0d-84d3-76ba-dd1e-18c7b90a6b1f.png)
ん？...あと2ヶ月ちょい??笑

# ルール
出ろと言われたものはどうしようもないので早速準備していきましょう。
[WOR公式(英)](https://wro-association.org/competition/2022-season/)
[WRO Japan公式](https://www.wroj.org/action/2022)
ーーーーーーーーーーーー
[試合フィールド(シニア)](https://wro-association.org/wp-content/uploads/WRO-2022_RoboMission_Playfield_Senior.pdf)
[ルール(シニア/英)](https://wro-association.org/wp-content/uploads/WRO-2022-RoboMission-Senior.pdf)
※日本語のルールは5月中旬に公開される予定です。
![WRO-2022_RoboMission_Playfield_Senior_page-0001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449798/d9ec626f-f4d4-4968-433b-5f98d0964c33.jpeg)
コンセプトをざっくり説明すると「病院で患者さんのお世話をしよう‼」って感じです。

主要なタスクをざっくり言うと、
1. 各部屋の洗濯物を洗濯機まで持っていく。
1. 部屋のマーキングブロックが緑ならボールをネットに入れる。
1. 部屋のマーキングブロックが白なら水をその部屋に運ぶ。
他にもボーナスポイントがあったりします。後、色んな所で減点が待っています...

# 展望
使える部品に制限があったりする分ロボカップより難易度が高そうな感じがします。「病院内でロボットはどうやって自分の位置を把握するのだろうか...」とか「開始&終了地点をどうやって識別するんだ...」とか分からないことが様々ありますが、先輩とチームメイトに頼って頑張りたいものです。僕は生徒会室に籠もりますか...
【JavaScript】処理中の入力待ち


# したいこと

メソッド内で処理を一旦止めて、画面のイベントの発火を待ちたい。

# このようにするのだ

https://mogamoga1024.github.io/JSInputWaitingSample/

```html:index.html
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>JS 入力待ち</title>
</head>
<body>
    <div id="message"></div>
    <button onclick='onButtonClick("Yes")'>Yes</button>
    <button onclick='onButtonClick("No")'>No</button>
    <button onclick='alert("Hello!!")'>処理中も画面がフリーズせずに別の操作が行えるよ</button>

    <script src="main.js"></script>
</body>
</html>
```

```javascript:main.js
const messageHtmlElement = document.getElementById("message");
let resolveButtonClick = null;

async function なんか処理() {
    messageHtmlElement.innerText = "処理中…";

    const result = await waitButtonClick();

    messageHtmlElement.innerText = result + "ボタンが押されました。";
}

function waitButtonClick() {
    return new Promise(resolve => {
        resolveButtonClick = resolve;
    });
}

function onButtonClick(str) {
    if (resolveButtonClick !== null) {
        resolveButtonClick(str);
    }
}

なんか処理();
```
バグあり！！ Julia の OneWayANOVATest，LeveneTest，FlignerKilleenTest

前の記事で，

> 更にひどい話だが，Julia の OneWayANOVATest() は，各群のサンプルサイズが等しくないときには誤った答えを出すというバグがあり，このバグは 2021/08/02 に報告されているにも関わらず，2022/05/13 現在でも未だに修正されていない。

と書いたが，OneWayANOVATest のみならず，LeveneTest も FlignerKilleenTest も**腐っている**。

Julia に関しては，当分の間，初めて使う既存の関数が様々な場合に対して，ちゃんと正しい答えを出すかをチェックする必要がある。

どうせなら，自前で関数を書く。当然，他のプログラムパッケージと同じ答えになることを，様々な場合に対してチェックする必要があるが。

ともかく，Julia を盲信するのはやめたほうがよい。

どうにかならんか? Julia よ〜〜〜
<コマンド> failed without output (ENOENT).解消法【husky】【lint-staged】

## <コマンド> failed without output (ENOENT).解消法
### 状況
以下の手順でhuskyとlint-stagedを導入し、commit時に`eslint --fix`と`prettier --write`実行するように設定しました。
パッケージマネージャはyarn3を使用していました。

```:ターミナル
$ npx mrm@2 lint-staged
```
```package.json
{
  "scripts": {
    ...
    "postinstall": "husky install"
  },
    ...
    "lint-staged": {
    "src/**/*.{js,ts,tsx}": [
      "eslint --fix"
    ],
    "**/*": [
      "prettier --write --ignore-unknown"
    ]
  }
}

```

```.husky/pre-commit
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

npx lint-staged
```

`git commit -m "test"`を実行したところ以下のようにエラーが発生しました。

```:ターミナル
$ git add .

$ git commit -m "test"
✔ Preparing lint-staged...
⚠ Running tasks for staged files...
  ❯ package.json — 1 file
    ↓ src/**/*.{js,ts,tsx} — no files [SKIPPED]
    ❯ **/* — 1 file
      ✖ prettier --write --ignore-unknown [ENOENT]
↓ Skipped because of errors from tasks. [SKIPPED]
✔ Reverting to original state because of errors...
✔ Cleaning up temporary files...

✖ prettier --write --ignore-unknown failed without output (ENOENT).
husky - pre-commit hook exited with code 1 (error)
```

### 解決方法
`.husky/pre-commit`を以下のように修正することで解決しました。

```.husky/pre-commit
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

yarn lint-staged
```

yarnを使用している場合には`npx lint-staged`ではなく`yarn lint-staged`とする必要があるようです。

https://github.com/okonet/lint-staged/issues/1064

なお`yarn dlx lint-staged`と記述しても同様にエラーが発生しました。
```.husky/pre-commit
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

yarn dlx lint-staged
```
```:ターミナル
$ git add .

$ git commit -m "test"
➤ YN0000: ┌ Resolution step
➤ YN0000: └ Completed in 2s 468ms
➤ YN0000: ┌ Fetch step
➤ YN0000: └ Completed
➤ YN0000: ┌ Link step
➤ YN0000: │ ESM support for PnP uses the experimental loader API and is therefore experimental
➤ YN0000: └ Completed
➤ YN0000: Done with warnings in 2s 583ms

✔ Preparing lint-staged...
⚠ Running tasks for staged files...
  ❯ package.json — 1 file
    ↓ src/**/*.{js,ts,tsx} — no files [SKIPPED]
    ❯ **/* — 1 file
      ✖ prettier --write --ignore-unknown [ENOENT]
↓ Skipped because of errors from tasks. [SKIPPED]
✔ Reverting to original state because of errors...
✔ Cleaning up temporary files...

✖ prettier --write --ignore-unknown failed without output (ENOENT).
husky - pre-commit hook exited with code 1 (error)

```
【Unity】WebGLで使えるAR用SDK

# はじめに
UnityWebGLで利用できるSDKを調査してみました。
Unity自体がWebGLのモバイルサポートをしていないので該当するSDKはかなり少ないです。
    
# UnityWebGLに対応したSDK
## Zappar for Unity(ZapWorks)

https://www.zappar.com/

* 料金体系
    * 無料プラン
        * 1プロジェクトのみ
        * 非営利向け
    * 有料プラン
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/3dc3645d-57d8-c4a4-55ff-84169d7f22fe.png)
* サンプル
    * https://zap.works/showcase/

## blippar WEBAR SDK

https://www.blippar.com/
* サンプル
    * https://www.blippar.com/ar-creations
* 料金体系
    * 従量課金制
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/62c6bfc5-4470-e7fd-3742-0bfff54b6541.png)
  
 ## Needle Engine

https://needle.tools/

* 特徴
    * WebXR用の多機能プラグイン
    * VRHMDへの対応
    * マルチプレイ機能（ボイチャ付き）
* AR機能
    * 画像追跡は未対応とのこと(Mind)
* 料金体系
    * 個人利用はβ版のため無料
    * 商用利用は要問合せとのこと

* EAsyARSence for Unity

https://www.easyar.com/

## MindAR
※2023/08/01追記

UnityAssetStoreでJS用ライブラリ `MindAR` のラッパーのアセットが販売されているようです。


https://assetstore.unity.com/packages/tools/integration/augmented-reality-webgl-image-tracking-webar-241386

# 非Unity向けSDK
jslib等で連携する必要ありのため実装難易度が高い

## ARWT

https://github.com/ToughNutToCrack/ARWT
* 現在開発が止まっている？
* 特徴
    * AR.jsのラッパー
        * ARマーカー作成、マーカー追跡
        * 画像追跡（機能していない？）
* 料金体系
    * 無料

## ARjs_Unity

https://github.com/taylordigital13/ARjs_Unity
* 現在開発が止まっている？
* 特徴
    * AR.jsエクスポーター
        * ARマーカー追跡用コードを出力
        * スクリプトの追加は不可
        * ページジャンプ機能あり
* 料金体系
    * 無料


# 参考にした資料
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">【国内初！AR SDK17種の徹底比較レポート】<br><br>「AR SDK毎の機能/特徴を一目で知りたい…」<br><br>そんなクリエイターの方のために17種のSDKを実機検証した比較表を作成しました。<br><br>これからも随時アップデート予定です！<br><br>（※シェアゆる募です😇）<a href="https://t.co/Dyz6wYKR6l">https://t.co/Dyz6wYKR6l</a> <a href="https://t.co/FyVY2tDahf">pic.twitter.com/FyVY2tDahf</a></p>&mdash; XR-Hub - XRの「知」を共創するメディア (@XrHub) <a href="https://twitter.com/XrHub/status/1173485689624641537?ref_src=twsrc%5Etfw">September 16, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
XGBoost(勾配ブースティング)で癌データの検証

```
#覚書
# xgboostのimportのためにしたこと
# 1. cmakeのinstall(!pip3 install cmake)
# 2. pipを最新にする
# 　　今のバージョン確認(!pip3 --version)
# 　　最新に(!pip3 install --upgrade pip)
# 3. xgboostのinstall(pip install xgboost)
# 　　なぜか!pip3だとimportエラーになった
#必要かわからないがやったこと(conda install libgcc)



import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
import xgboost as xgb

from sklearn.datasets import load_breast_cancer
dataset = load_breast_cancer()
x = dataset.data
t = dataset.target

#XGBのモデル作成
#2値分類の時は引数にobjective="binary:logistic"を入れること
#デフォルトではmax_depthは6
model_XGB = xgb.XGBClassifier(objective="binary:logistic", max_depth=10) 

#分割方法は今回はcross_validationにする(テストデータの場所を変えていく)。交差検証。
#https://newtechnologylifestyle.net/%e6%a9%9f%e6%a2%b0%e5%ad%a6%e7%bf%92%e3%80%81%e3%83%87%e3%82%a3%e3%83%bc%e3%83%97%e3%83%a9%e3%83%bc%e3%83%8b%e3%83%b3%e3%82%b0%e3%81%a7%e3%81%ae%e5%ad%a6%e7%bf%92%e3%83%87%e3%83%bc%e3%82%bf%e3%81%a8/
#データに偏りがあった時にその効果を薄めることができる
from sklearn.model_selection import cross_validate, KFold

#cross_validationで何分割するか決める(普通は5, 10くらい)
kf = KFold(n_splits=5, shuffle=True)
#return_estimatorで重要な特徴量がどれかを後で見るためにTrueにする
score = cross_validate(model_XGB, x, t, cv=kf, scoring="accuracy", return_estimator=True)

score
#これを実行して得られるscoreの値が重要
#テストデータに対するaccuracyである。
#結果が5つあるのは交差検証で5つにしたため

#5つを平均
score["test_score"].mean()

#重要な特徴量がどれかを確認
#今回cross_validationで5つ検証したが、その一つひとつに対してその時重要だった特徴量がそれぞれ排出される。
score["estimator"][4].feature_importances_ #[]の中はcross_validationの数

#リスト内包表記で1-5を表示
[score["estimator"][i].feature_importances_ for i in range(5)]

#ただしこれだと見づらいので列で平均を取ってdf形式にする
mean_score = np.mean([score["estimator"][i].feature_importances_ for i in range(5)], axis=0)
pd.DataFrame({"説明変数": dataset.feature_names, "重要度":mean_score}).sort_values("重要度", ascending=False)

```

終了！
ランダムフォレストでirisデータを可視化

特徴量重要度の産出までのコード備忘録として。
ハイパーパラメータのn_estimatorsはどうやら高いほどモデルの精度が上がる印象。実際irisではn_estimatorsが上がると特徴量重要度の1/2位が逆転する。


```
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris

# データセット読み込み
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
x = iris.data
y = iris.target

# 学習データとテストデータに分割
x_train, x_test, y_train, y_test = train_test_split(x, y)

# ランダムフォレストのモデル構築
# n_estimators : 使用する決定木数(デフォルト10)
model = RandomForestClassifier(n_estimators=5000)
model.fit(x_train, y_train)

#特徴量の重要度
feature = model.feature_importances_
#特徴量の名前
label = df.columns[0:]
#特徴量の重要度順(降順)
indices = np.argsort(feature)[::1]

# プロット
x = range(len(feature))
y = feature[indices]
y_label = label[indices]
plt.barh(x, y, align = 'center')
plt.yticks(x, y_label)
plt.xlabel("importance_num")
plt.ylabel("label")
plt.show()
```
Silqに触れる

最近またShorのアルゴリズムに触れる機会があって，また実装をやりたいなぁってなりました．
なんですが，Qiskitでのスクラッチ実装は既にやっていたので，Qiskit以外にも触れてみたいなぁと思い，色々量子プログラミング言語を調べていました．

有名どころのQCLとかQuipperは最近あまり更新されていなかったため，かなり新し目のSilqという言語に触れてみました．
ETHの人たちが作った言語らしいです．

[インストール用ドキュメント](https://silq.ethz.ch/install)

↑に沿って進めれば基本的には問題なさそうです．
VSCodeの方はまだいいんですが，Githubからのだと，こうやるとエラー出るよっていうのも含まれているので，少し心臓に悪いかも・・・．

おそらく↓をコマンドライン上でペチペチやっていたら，correct.sqlができて，そのアウトプット（0か1）がコマンドライン上に表示されると思います．

``` sh
sudo apt-get install -y build-essential git wget unzip

git clone https://github.com/eth-sri/silq.git
cd silq && ./dependencies.sh && ./build.sh

sudo mkdir -p /usr/local/bin
sudo ln -s $(pwd)/silq /usr/local/bin/silq

echo "def main(){ x:=H(false); return measure(x); }" > correct.slq
silq correct.slq --run
```

エラー出た場合はすみません（何か飛ばしているのでドキュメントを見てください，無理そうならVSCodeの方が確実です）．

Silqを使ってShorの素因数分解アルゴリズムを今度やってみようと思います．
LaravelとMySQLの接続詰まったところ

# Laravel詰まったところ
## おそらく当たり前のことだけどわからなかったのでメモしておく
## php artisan migrationでのエラー
### .envで、DB_DATABASE=homestead, DB_USERNAME=homestead, DB_PASSWORD=passに設定したときやっておかなければならないこと。
### MySQLにログインする（各人で異なると思うが、私は[mysql -u root]でログインできたぁ）、そんでまずはhomesteadのデータベースを作成、次にhomesteadという名のユーザーをpassというパスワードで作成、最後にhomesteadユーザーにhomesteadデータベースの権限を付与する。
### 上記ができたら、[php artisan migration] を実行する。
### それでうまくいったら、mysqlにログインする。[mysql -u homestead -p] Enter passwordと出るので[pass]と入力する。
### MariaDB[none]> でるので[connect homestead]と入力する。MariaDB[homestead]と出れば接続完了になるはず！
### [show tables;]で作成したテーブルがあれば成功！！
#### 補足
##### 初めて触ったので、違うよっていう点があると思います。その際は教えてくれるとありがたいです
Netlify Functions（AWS Lambda）で Datastore に接続する方法

# GOOGLE_APPLICATION_CREDENTIALS ではなく、コードに値を直接渡す

`GOOGLE_APPLICATION_CREDENTIALS` はファイルパスにしか対応していません。
サーバーレス環境ではファイルパスを指定したくないので、環境変数を通してコードに値を直接渡します。

具体的には、Datastore のインスタンスを作成する際に、秘密鍵などの値を渡します。

```index.ts
const datastore = new Datastore({
  projectId: process.env.GCLOUD_PROJECT,
  credentials: {
    client_email: process.env.CLIENT_EMAIL,
    private_key: process.env.PRIVATE_KEY,
  },
});
```

（環境変数名はそれぞれの環境に合わせて変更してください）

それぞれの値は、サービスアカウントのキー（json ファイル）に含まれている値をコピーするだけです。
ただし、 Invalid PEM Format 的なエラーが出る場合は

```index.ts
    private_key: process.env.PRIVATE_KEY.replace(/\\n/g, "\n")
```

が必要かもしれません。

こちらをご確認ください。
https://stackoverflow.com/a/50376092/7978612
Vuetify3リリース前に、Vue 3 +  Vuetify3 + Storybookの構築予習

vue3+Vuetify+Storybook、簡単にできるだろうと思ったんですが、動くまでに苦労しました。

Vuetifyのを使うには、preview.jsのdecorators の設定が必要で、ネット上にいくつか方法が書いてあったんですが、私が試した方法では、Vutifyのコンポーネントが動作せず、うまくいきませんでした。
storybook-addon-vuetify3を使ってうまくいきました。
storybook-addon-vuetify3もドキュメントには書いてないのですが、builder-webpack5を入れないと、build時にエラーが発生するので入れました。


vite版もやってみたんですが、まだうまくいっていません。まずは、webpack版です。
Vuetify3リリース時には、すんなりインストールできるようになっていて欲しい。


# vue3+Vuetify+Storybookのインストール

```bash
$ yarn global add @vue/cli
$ vue create app
$ cd app
$ yarn
$ yarn dev
$ vue add vuetify
#(Vuetify 3 Preview (Vuetify 3))を選ぶ
$ npx sb init
$ yarn add -D storybook-addon-vuetify3
$ yarn add -D @storybook/builder-webpack5
$ yarn add -D @storybook/manager-webpack5

```

次のコマンドでsbをインストールすれば、webpack5対応になるらしいです。builder-webpack5を個別に入れる必要はなくなるかも（未確認）
```
$ npx sb init --builder webpack5
```

# 設定ファイル変更


```js:/.storybook/main.js
module.exports = {
  "stories": [
    "../src/**/*.stories.mdx",
    "../src/**/*.stories.@(js|jsx|ts|tsx)"
  ],
  "addons": [
    "@storybook/addon-links",
    "@storybook/addon-essentials",
    "storybook-addon-vuetify3"
  ],
  "framework": "@storybook/vue3",
  "core": {
    "builder": "@storybook/builder-webpack5"
  }
}
```

```js:/.storybook/preview.js
import { withVuetify } from 'storybook-addon-vuetify3/dist/decorators'
import { myCustomLightTheme } from "../src/plugins/vuetify";

export const globalTypes = {
  vuetify: {
    theme: {
      defaultTheme: 'myCustomLightTheme',
      themes: {
        myCustomLightTheme
      }
    }
  }
}

export const decorators = [
  withVuetify
]
```


```js:/src/plugins/vuetify.js
// Styles
import '@mdi/font/css/materialdesignicons.css'
import 'vuetify/styles'

// Vuetify
import { createVuetify } from 'vuetify'
import * as components from 'vuetify/components'
import * as directives from 'vuetify/directives'

export const myCustomLightTheme = {
  dark: false,
  colors: {
    background: '#FFFFFF',
    surface: '#FFFFFF',
    primary: '#123456',
    'primary-darken-1': '#3700B3',
    secondary: '#03DAC6',
    'secondary-darken-1': '#018786',
    error: '#B00020',
    info: '#2196F3',
    success: '#4CAF50',
    warning: '#FB8C00',
  }
}

export default createVuetify(
  // https://vuetifyjs.com/en/introduction/why-vuetify/#feature-guides
  {
    components,
    directives,
    theme: {
      defaultTheme: 'myCustomLightTheme',
      themes: {
        myCustomLightTheme,
      }
    }
  }
)
```
# storybookの動作確認

HelloWorld.vueのstory fileを作成して、Storybookに表示してみます。

```js:/src/components/HelloWorld.stories.js
import HelloWorld from './HelloWorld.vue';

export default {
  component: HelloWorld,
  title: 'HelloWorld',
};


const Template = args => ({
  components: { HelloWorld },
  setup() {
    return {};
  },
  template: '<HelloWorld />',
});
export const Default = Template.bind({});
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/3c211564-8f33-1914-e919-18dd6d3c3fdf.png)

なぜか、一回目の表示では、変わったフォントで表示されます。
リロードすると、正しいフォンのに直ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/69c7e09b-df45-0844-a320-566924b0ca8e.png)
【MySQL】【Go】this user requires mysql native password authentication.

go-sql-driverで`this user requires mysql native password authentication.`エラー

# 結論
my.ini
```
[mysqld]
default_authentication_plugin=mysql_native_password
```

# 詳細
このエラーで調べると、 `AllowNativePasswords: true` を設定するように書いているのですが、これだけだと繋がらない場合はmysql側の設定を見直します。
https://qiita.com/ushio_s/items/ab64e7e9222bb5a67a11

# 参考
https://github.com/go-sql-driver/mysql/pull/644/files
ランダムにグループ分けするRuby演習

## 問題
A、B、C、D、E、Fという6人のグループがありました。 このグループは定期的にみんなで通話をしています。 しかし6人全員で通話はやりずらいので、3人ずつか2人と4人に別れることにしました。 このグループを3人と3人、または2人と4人にランダムに分けるプログラムを書いてください。 このプログラムは実行するごとに結果が変わります。 また表示結果はアルファベット順にしてください。
```
$ ruby ramdom.rb
["B", "C"]
["A", "D", "E", "F"]
```

## 作成手順
① ramdom.rbファイル作成
(以下は①の中身)
② 6人グループの配列作成
③ ②を利用するメソッド作成
(以下④,⑤,⑥はメソッド内)
④ ②をシャッフルし、3-3でアルファベット順に分割
⑤ ②をシャッフルし、2-4でアルファベット順に分割
⑥ ④,⑤をランダムに条件分岐
⑦ ③メソッド実行
絵文字が使えない環境を絵文字が使える環境にリノベート

今回はcp932からutf8mb4に変更した話をします。
長年運用されているサービスでは、同じような課題があると思うので参考になればと思います。

## 何故対応する必要があったの？
1. 絵文字が使えない
cp932(ShifJIS)で構成されているため、絵文字が化けてしまい、ユーザの体験を下げていた。`<emoji:xxx>` などの絵文字コードで絵文字変換する仕組みを自前で実装しているが、メンテナンスコストが高くなっていた。
2. utf8mb4のテーブルとのJOINが遅い
各テーブルのIDをvarchar(255)で定義しているため、utf8mb4で定義したテーブルとJOINするとINDEXが適用されない。cp932にキャストすることで改善できるが本質的な改善ではない。

これらの課題を解決するため、全てのテーブルをutf8mb4に統一を行うことになりました。

# 実際の移行手順

以下の手順を開発環境で検証し、問題なく移行できると判断した後に対応しました。
また、本番環境では余裕を持ったメンテナンス日程を決めて事故がないように確認しながら進めています。

## 文字コードを変更してレプリケーションする

1. パタメータグループをコピーして **slave_type_conversions = ALL_NON_LOSSY** にしたものを作成する

2. パラメータグループを 1. で設定したものにしてDBをスナップショットから復元
    1. システム取得のスナップショットからではなく復元前にスナップショット取得する    

3. レプリケーション設定
    1. 既存DBでレプリケーションの設定を実行する
        ```bash
        CREATE USER 'repl_user'@'%' IDENTIFIED BY 'pass123';
        GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
        # bin logの確認
        SHOW MASTER STATUS;
        ```

    1. 新しいDBでレプリケーション設定を行う
        ⚠ ポジションを間違えないように注意 ⚠
        ポジションは復元したRDSのログに記載されている

        ```bash
        CALL mysql.rds_set_external_master ('xxxxx', 3306,'repl_user', 'pass123', 'mysql-bin-changelog.xxxx', xxxx, 0);
        CALL mysql.rds_start_replication;
        ```


4. スレーブ側の全テーブルのALTER TABLE（先にレプリケーションを止める）
    1. `CALL mysql.rds_stop_replication;`
    1. 照合順序の指定が必要なカラムの対応&全テーブルの文字コード変換
    - 照合順序の個別設定ALTER
            
    ```sql
    -- 全テーブル分文字コード変換するALTERを作成
    SELECT CONCAT(CONCAT('ALTER TABLE ', table_name),' CONVERT TO CHARACTER SET utf8mb4;') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'xxxx';
    ```

5. ALTERした後にレプリケーション再開してエラーなくレプリケーションが追いついたことを確認

6. メンテナンスを入れる
    1. パラメータグループを戻す（レプリケーション先クラスター）
    1. アプリケーションの向き先を変更する

# ボツ案
上記で移行出来ましたが、検討する際に何個かの案を試行錯誤しながら確定させていきました。
参考までにですが、ボツとした案も以下に記載します。

## 案① シンプルに置き換えるパターン
### ボツの理由

- データ量が多く時間がかかりすぎる（1番大きいテーブルで1時間以上かかるため）

### 検証方法、やること

1. 本番相当のデータをdevに持っていく
2. ALTERテーブルでテーブルのスキーマ情報をutf8mb4にする
3. `ALTER TABLE xxx CHARACTER SET utf8mb4;`
4. `ALTER TABLE xxx CONVERT TO CHARACTER SET utf8mb4;`

### メリット

- 最小の手間で済む

### デメリット

- ALTERにかかる時間検証が必要
  - ダウンタイムが発生する可能性あり

## 案② ダブルライトパターン
### ボツの理由

- 影響範囲が大きすぎるので、対応が現実的ではない

### 検証方法、やること

1. 本番相当のデータをdevに持っていく
2. 新定義のDBをutf8mb4で作成する
3. CREATE TRIGGERで別のDBにアクセスする
    1. 並行してメンバーなどの全データ移行batchも作成する
4. 数ヶ月の後、データが溜まったタイミングで置き換える

### メリット

- ダウンタイムはなし

### デメリット

- 全テーブルのダブルライトは工数が最大になる
- 影響範囲が大きい = オペレーションミスが発生する
ルータとルーティング

【ルーティングの定義】
ルータをルータたらしめる機能。ルーティングテーブルを参照し、宛先までの最適ルートを決定しパケットを転送することで、これをルーティングといいます。宛先に対する最適ルート(ネクストホップ)は、宛先に応じて変わります。

【解説】
　ルータは異なるネットワークを接続するOSI参照モデルのネットワーク層(レイヤ3)で動作する機器です。複数の異なるネットワークにまたがって位置している点に特徴があります。
　ルータは「IPパケット」を受信すると、IPヘッダ内に格納されている「宛先IPアドレス」をもとに転送先を決定します。転送先を決定する際には、宛先に向かうための最適なルートの情報が登録されている「ルーティングテーブル」を参照します。ルーティングテーブルを参照し、該当するルートがあればパケットを転送します。宛先が登録されていない場合、ルータはその通信を破棄します。
　このようにルーティングテーブルを参照し、宛先までの最適なルートを選んでパケットを転送することを「ルーティング」といいます。
numpyで公差と要素数から等差数列を生成する

# 概要
`numpy` により始点の値 `start` と公差 `step` と要素数 `num` から等差数列を生成するには、下記のようにするとスマート。

```python
array = start + np.arange(num) * step
```

# `numpy` の等差数列を生成する関数
`numpy` には等差数列を生成する関数として、`numpy.arange` と `numpy.linspace` がある。

https://numpy.org/doc/stable/reference/generated/numpy.arange.html

https://numpy.org/doc/stable/reference/generated/numpy.linspace.html

`numpy.arange` は、**始点の値** `start`、**終点の値** `stop`、**公差** `step` を指定する。
`numpy.linspace` は、**始点の値** `start`、**終点の値** `stop`、**要素数** `num` を指定する。

こうくると、**始点の値**、**公差**、**要素数**を指定して等差数列を生成する関数もありそうだが、記事投稿時のバージョン1.22ではこれに対応する関数はない。

# 始点の値、公差、要素数による等差数列の生成
始点の値 `start`、公差 `step`、要素数 `num` を指定して等差数列を生成する場合は、次のようにするとスマートである。

```python
array = start + np.arange(num) * step
```

等差数列が `0` 始まりであれば `start` を省略し、下記でもよい。

```python
array = np.arange(num) * step
```

この方法により等差数列を生成する例を示す。

```python
import numpy as np

start = 1.0
step = 0.1
num = 6

array1 = start + np.arange(num) * step
print(array1)
```

```:標準出力
[1.  1.1 1.2 1.3 1.4 1.5]
```

# 他の方法との比較
上記の方法ではなく、終点の値 `stop` を計算して `numpy.arange` や `numpy.linspace` の引数に与える方法も考えられる。しかし、バグ予防や保守性の観点では、`start + np.arange(num) * step` の方法が優れている。

## `numpy.arange` に `stop` を与える場合
`numpy.arange` の `stop` に実数を与えると、実数の計算誤差により意図した配列が得られないことがある。引数の値の組み合わせ次第では正しく計算されるが、バグの元になるため避けたほうがよい。

意図しない動作になっている例を示す。

```python
import numpy as np

start = 1.0
step = 0.1
num = 6

array2 = np.arange(start, start + step * num, step)
print(array2)
```
```:標準出力
[1.  1.1 1.2 1.3 1.4 1.5 1.6]
```
要素数が7個になってしまっており、望ましい結果ではない。

## `numpy.linspace` に `stop` を与える場合
`numpy.linspace` の場合、`numpy.arange` のような実数誤差によるバグは生じないため、こちらを使っても問題ない。 [^1]
しかし、今回のような公差と要素数から等差数列を生成する場合に `numpy.linspace` を使うと次のようになる。

```python
array3 = np.linspace(start, start + step * num, num, endpoint=False)
```

同じ変数が何度も出てきたり、`endpoint` 引数による最後の要素の扱いについて混乱しやすいなど、保守性が低下する恐れがある。

# 参考文献

https://stackoverflow.com/q/31820107

https://tam5917.hatenablog.com/entry/2021/02/11/200006

https://www.relief.jp/docs/numpy-arange-float.html

https://www.relief.jp/docs/numpy-linspace-floating-point-numbers.html

[^1]: `numpy.linspace` で生成した配列中の要素に実数計算の誤差が含まれる可能性はある。この記事で紹介している `start + np.arange(num) * step` でも誤差は発生するが、誤差の出方は異なる場合がある。そのため、この2つの方法で全く同じ配列が得られるとは限らない。
備忘録【Django】EC2でデプロイ後の更新方法(EC2×Django×Nginx×Gunicornの構築）

Djangoで作成したWebアプリのデプロイ後の更新時に少し躓いたので備忘録として書いています。
サーバー上のDjangoファイルを更新したあとの処理です。

# 動作環境
EC2（Linux）
Django3.8
Nginx：1
Gunicorn：20.1.0

# 結論
ファイルを更新しただけでは反映されないので以下を行う必要がある
１．EC2の再起動
２．gunicornの再起動
３．nginxの再起動

# 前提
・すでにDjangoWebアプリをEC2でデプロイされている
・その上でEC2のプログラムを更新した

# EC2を再起動
EC2インスタンスのコンソール画面に行き、インスタンスを再起動する
# Gunicornを再起動

### Guniconの停止
再起動の前に一度Gunicornを停止します
Gunicornを再起動する場合は、一度停止してから再度、起動が必要です

```
sudo pkill gunicorn
```

### 再起動
仮想環境を有効にし、projectアプリケーションを含むディレクトリ（manage.pyコマンドを実行する時のディレクトリ）に移動してGunicornを再起動する
*xxxxxx部分は自身のDjangoプロジェクト名です
```
gunicorn --bind 0.0.0.0:8000 xxxxxx.wsgi -D
```

xxxxxx.wsgi とする事で、projectアプリケーション内のwsgi.pyを参照させています 
0.0.0.0:8000と指定する事で、Djangoにバインド（紐付ける）させています
-Dのオプションをつける事で、バックグラウンドでGunicornを起動させます

### 起動確認
以下のコマンドを実行するとプロセスが立ち上がっているか確認できます。
```
ps ax|grep gunicorn
```

こんな感じになればOK
```
 3597 ?        S      0:09 /home/ec2-user/venv/bin/python3 /home/ec2-user/venv/bin/gunicorn --bind 0.0.0.0:8000 xxxxxx.wsgi -D
 3600 ?        S      0:02 /home/ec2-user/venv/bin/python3 /home/ec2-user/venv/bin/gunicorn --bind 0.0.0.0:8000 xxxxxx.wsgi -D
11471 pts/0    S+     0:00 grep --color=auto gunicorn
```

# Nginxを再起動

下記コマンドでNginxを再起動
```
sudo systemctl restart nginx.service
```

# サイトをリロードし確認
問題なく表示されていれば完了

#参考とした記事

https://qiita.com/show1107/items/d79fd0d4d366a4e367b1

https://tomato-develop.com/amazon-linux-2-django-python-nginx-gunicorn-postgresql/
PowerAutomate: Adaptive Card での表示プロパティの動きは公式ドキュメントで簡単に確認できるようになってますね・・

# 背景
Adaptive Card を使う際に、Designer で確認しながら作ってた際に、ちょっとずつ記録してたのでいつか記事にしようかと思ってたら・・
普通に公式ドキュメントが :laughing: 

以下のような表示切替や、タブ実装しようとする際に調べるとよさげ

https://qiita.com/baku2san/items/84c4e0732d0df2b660d6

# MS Doc.
https://docs.microsoft.com/ja-jp/adaptive-cards/rendering-cards/implement-a-renderer

## 表示系プロパティ動作

[レイアウトの高度な動作](https://docs.microsoft.com/ja-jp/adaptive-cards/rendering-cards/implement-a-renderer#advanced-layout-behavior) には、こんな感じで、非常にわかりやすく画像付きで説明してくれてるので、悩んだ時もばっちり
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/8975fa03-767e-23f7-4b6d-01311b53f664.png)


## アクション

Action についてわかってないときは、[アクション](https://docs.microsoft.com/ja-jp/adaptive-cards/rendering-cards/implement-a-renderer#actions) を読んでおくといいね

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/ea65be43-19df-8aac-f435-1abd04ce702b.png)

詳細は、Schema Explorer のこの辺り

https://www.adaptivecards.io/explorer/Action.OpenUrl.html

# あとがき
Documents はやっぱり一通り眺めて脳内索引作っておかないとなぁ・・と
Schema Explorer も同様に役立つ情報がありそうなのに放置してるけど

https://www.adaptivecards.io/explorer/

https://www.adaptivecards.io/designer/
Githubでデータ共有　その３　Github Desktop編

# はじめに
当記事は、以下の２記事の続編です。

　* [Githubでデータ共有　その１　Githubユーザー登録編](https://qiita.com/makaishi2/items/2369ee88d6381a3651b0)
　* [Githubでデータ共有　その２　インビテーション編](https://qiita.com/makaishi2/items/301630c1ef968cf0cd56)

２つめの記事の最後で説明したように、インビテーションへのAcceptが終わった段階で、privateなリポジトリへのアクセスは。ブラウザ経由ですでに可能です。しかし、Github Desktopを使うと、リポジトリへのアクセスの勝手が格段よくなります。
当記事はその設定をするための手順書ということになります。

<img src='' width=600>

#手順

ブラウザから次のリンクを入力します。

https://desktop.github.com/

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/44b4b0f0-a59a-11de-7bc2-44f95feb1654.png' width=800>

上の画面になったら、「Download for Windows (64bit)」のボタンをクリックします。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/28caf374-e229-d01b-056a-202061bcb264.png' width=600>

上の画面になったら「実行」をクリック

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/3fe01c52-e045-0a8e-ed42-ef729e214c66.png' width=600>

上の画面でしばらく待っていると、次の画面に遷移します。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/ba1e0253-fecc-41c7-f5f8-408a28f9c832.png' width=600>

上の画面では、枠で囲まれた「Skip this step」を選択します。

![スクリーンショット 2022-05-14 20.26.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/e92c5a7e-1a2d-986d-3c3c-2ababe3b76ae.png)

NameとEmailには、Githubのユーザー登録で利用したUsernameとEmailを指定し、「Finish」をクリックします。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/0d97c4db-06d7-4ef0-f50f-d3513b61890c.png' width=８00>

上の画面になったら、一番上の「**Create a repository from the Internet**」をクリックします。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/1da4cb59-038e-7cf7-20d8-10763d1e4f66.png' width=４00>

上の画面になったら。、デフォルトの「GitHub.com」タブが選択された状態で、「**Sign in**」をクリックします。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/e3b0381a-4cdb-e0b4-f733-af8c525b25d4.png' width=３00>

上の画面では「**Continue with browser**」をクリックします。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/00c8c7d0-0008-530a-6b01-5c672f53571c.png' width=600>

再び上の画面になると、図のようにアクセス可能なリポジトリが見えているはずなので、それを選択します。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/10a9cb44-987e-6605-e7c6-ec244e996464.png' width=600>

上の画面で右下の「**Clone xxx**」のボタンをクリックします。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/bb4e8e69-cbc9-7670-6d1f-ca7e669d401a.png' width=600>

すると、上のような画面になります。ここで黄枠で囲んだ「**Local path**」に注目して下さい。このパスは、クラウド上のリポジトリをローカルPCのどのパスにダウンロードするかを示しています。必要であれば、このパスを変更します。
ローカルパスを確認したら、画面右下の「**Clone**」をクリックします。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/4bf86ea3-f79a-0873-d8ee-ebcdc7198af0.png' width=600>

上のような画面になれば、クラウド上とローカルファイルの同期に成功しています。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/e7633b42-3237-062a-7218-5e4f8a4923d6.png' width=600>

エクスプローラーで先ほど確認したローカルパスを見た結果が上の画面です。リポジトリと同じファイルがローカルにコピーされています。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/2ec36a01-c8c5-cab4-767a-83c01a24e5e4.png' width=600>

クラウド上のリポジトリとローカルのファイルにずれがある場合は、次のような画面になります。このような場合「**Pull origin**」のボタンをクリックすると、２つのリポジトリ間の同期が取られます。
Symbol(XYM) の価格表示をする Wordpress プラグイン

# まえがき

Symbol コミュニティは今、phpにつよいエンジニアを探しています！

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">【募集】<br>そろそろPHPで(特にWordpressで)Symbol使いたいという要望が増えてきました。<br>PHPの開発経験がある方は一度Discord「NEM Japan UserGroup」にご参集いただけますでしょうか？🙇‍♂️<a href="https://t.co/pftIkRam56">https://t.co/pftIkRam56</a></p>&mdash; XEMBook@symbol📘 (@xembook) <a href="https://twitter.com/xembook/status/1524629929970655232?ref_src=twsrc%5Etfw">May 12, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

と、実は自分も Wordpress プラグインは作ったことがなかったので、試しに Symbol(XYM) 価格を表示するサンプルプラグインを作ってみたところ、意外と簡単でした。

## Wordpress plugin 本家

https://developer.wordpress.org/plugins/

## 参考にさせていただいたサイト

https://qiita.com/takeshi_du/items/09d4d61217fce1563c97


# Wordpress プラグインの作り方

Wordpress アプリの /wp-content/plugins 配下にwp-symbol-price-displayディレクトリを作成します。

```
cd wp-content/plugins
mkdir wp-symbol-price-display
```

作成したwp-symbol-price-displayディレクトリ配下にwp-symbol-price-display.phpを作成します。

```
vi wp-symbol-price-display/wp-symbol-price-display.php
```


```php:wp-symbol-price-display.php
<?php
/*
Plugin Name: Symbol(XYM/JPY) Price Display
Description: This plugin can view the price of the crypto asset Symbol(XYM) price.
Author: curupo
Version: 0.1
*/

function wpspd_description() {
  echo '<h1>WP Symbol(XYM) Price Display</h1>';
  echo '<h2>Usage</h2>';
  echo '<p>Embed the short code.</p>';
  echo '<li>Zaif => [zaif_price]</li>';
}

function wpspd_plugin_setup_menu() {
  add_menu_page(
    __( 'Symbol(XYM) Price Display', 'symbol-xym-price-display' ),
    'Symbol Price',
    'manage_options',
    'wp-symbol-price-display',
    'wpspd_description',
    'dashicons-chart-pie',
    30,
  );
}
add_action('admin_menu', 'wpspd_plugin_setup_menu');

add_shortcode('zaif_price', 'get_zaif_price');
function zaif_init() {
    function get_zaif_price() {
        $url = "https://api.zaif.jp/api/1/last_price/xym_jpy";
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        $response =  curl_exec($ch);
        $result = json_decode($response, true);
        curl_close($conn);
        return $result['last_price'];
    }
}
add_action('init', 'zaif_init');
```

Wordpress 管理画面にログインしプラグイン画面を表示させます。

Symbol Price Display プラグインを有効化させます。

![validation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50227/e92b2822-fb63-71dd-78de-d3aee3641d94.png)

すると Wordpress 管理画面のサイドメニューに Symbol Price という項目が表示されます。

これで準備完了です。

ショートコード [zaif_price] を埋め込むと現在価格が表示されます。

以上です。

Symbol コミュニティでは php 技術者をお待ちしております ^^

https://discord.com/invite/F5DQjgHBGw
RDSでMySQL5.6のバイナリログの保持期間が変更できない

## 事象

RDSを使ってMySQL5.6のreplication設定時にバイナリログの保持期間を変更しようとしたときに
`ERROR 1694 (HY000): Cannot modify @@session.sql_log_bin inside a transaction`
のエラーにより変更できない

## 結論

クエリ実行する際に `SET AUTOCOMMIT=1`の設定をいれる

## 補足

以下クエリ実行時にエラーが発生しました。

```sql
mysql> call mysql.rds_set_configuration('binlog retention hours',24);
ERROR 1694 (HY000): Cannot modify @@session.sql_log_bin inside a transaction
```

こちらはMySQL5.6のバグになっております。
ので、該当バージョンを使っている以上どうしようもなさそうです。

https://bugs.mysql.com/bug.php?id=53437

仕方ないので、手動で変更をしようと試みます。

```sql
mysql> SET sql_log_bin = 1;
ERROR 1227 (42000): Access denied; you need (at least one of) the SUPER privilege(s) for this operation
```

これはRDSで発生します。RDSではrdsadminというユーザがSUPER権限をもっており、
自身で作成したユーザにはSUPER権限が付与できません。

一時的にautocommitを1にすることで回避できました。

```sql
> SET AUTOCOMMIT=1;
> call mysql.rds_set_configuration('binlog retention hours',24);
> SET AUTOCOMMIT=0;
```
「フェルマーの二平方和定理の応用」を参考に、wolframalphaとvbaでやってみた。

オリジナル

x^2+y^2=1105

https://qiita.com/masa0599/items/2bef1c9124cff23489ce


# wolfram alphaで

https://www.wolframalpha.com/input?i=1105+mod++4&lang=ja

https://www.wolframalpha.com/input?i=mod%281105%2C4%29

Result
1

https://www.wolframalpha.com/input?i=x2%2By2%3D1105

Integer solutions
x = ± 33, y = ± 4
x = ± 32, y = ± 9
x = ± 31, y = ± 12
つづく

https://www.wolframalpha.com/input?i=x2%2By2%3D1105+++positive+integer++&lang=ja


https://www.wolframalpha.com/input?i=x2%2By2%3D1105+over+the+positive+integer&lang=ja



https://www.wolframalpha.com/input?i=x2%2By2%3D1105%2Cx%3E0%2Cy%3E0

Integer solutions
x = 4, y = 33
x = 9, y = 32
x = 12, y = 31
x = 23, y = 24
x = 24, y = 23
x = 31, y = 12
x = 32, y = 9
x = 33, y = 4


# vbaで

```vb
Sub aaa_main()
nMax = 1105
ActiveSheet.Cells.Clear
MsgBox "実行を開始します"
iR = 0
For i = 1 To nMax
For j = 1 To nMax
    If i ^ 2 + j ^ 2 = nMax Then
       iR = iR + 1
       Cells(iR, 1) = i
       Cells(iR, 2) = j
    End If
Next
Next
End Sub
' 4  33
' 9  32
'12  31
'23  24
'24  23
'31  12
'32   9
'33   4
```
# よく似た問題

https://mathmathmanabu.com/2005-kyoto-university-seisu/


 

# 参考

https://en.wikipedia.org/wiki/Fermat%27s_theorem_on_sums_of_two_squares


フェルマーの二平方定理、あるいは単にフェルマーの定理 ＜

https://ja.wikipedia.org/wiki/%E4%BA%8C%E5%80%8B%E3%81%AE%E5%B9%B3%E6%96%B9%E6%95%B0%E3%81%AE%E5%92%8C



https://en.wikipedia.org/wiki/1105_(number)

1101 から 1200 までの数 ＞

https://ja.wikipedia.org/wiki/1000#1101_%E3%81%8B%E3%82%89_1200_%E3%81%BE%E3%81%A7%E3%81%AE%E6%95%B0


https://www.wolframalpha.com/input?i=1105&lang=ja

1105は2つの平方数の和として4 通り表せる最小の数です:
1105 = 4^2 + 33^2 = 9^2 + 32^2 = 12^2 + 31^2 = 23^2 + 24^2

1105は4 組の原始ピタゴラス数の最小の斜辺です:
1105^2 = 47^2 + 1104^2 = 264^2 + 1073^2 = 576^2 + 943^2 = 744^2 + 817^2
Githubでデータ共有　その２　インビテーション編

# 始めに
別記事 [Githubでデータ共有　その１　Githubユーザー登録](https://qiita.com/makaishi2/items/2369ee88d6381a3651b0)の続編です。

想定としては、「今まで開発経験のない人たちと、もともとGithub(privateリポジトリ)にあるデータを共有したいという」話があり。Githubのユーザー登録は完了し、管理者が、リポジトリに対してアクセス許可をすでに出した、
という場合のその次の手順の解説です。


# 手順
リポジトリ管理者側でアクセス権の登録が終わると、次のような内容のメールが届きます。
「view Invitasion」のボタンをクリックします。


<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/23eb61c6-34e9-4d1a-69f1-380c45fa033a.png' width=800>

下の画面になったら、GithubのIDとパスワードを入力します。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/99ab30a6-5f40-3b3b-e62f-dbcaa4657df3.png' width=600>

下の画面になったら、「Accept Invitation」のボタンをクリックします。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/5c92be39-3938-1ada-b00f-660d6c4d8810.png' width=８00>

次のような画面になっていれば、めざすリポジトリにアクセスできる状態になっています。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/7c879e16-54e0-0627-def5-e28fad0097ed.png' width=８00>

これだけで、すでに当初の目的（Github(privateリポジトリ)にあるデータを共有したい）は実現できているのですが、より使い勝手を良くすることを目標に次のステップに進みます。

[Githubでデータ共有　 Github Desktop編](https://qiita.com/makaishi2/items/ab967951436a5c28b539) に続きます。
Azure for students 登録手順(2022年5月現在）

# Azure for students とは
Azureが提供している学生向け学習コンテンツ。年１００ドルの学習用無料クレジットも付帯。登録無料でクレジットカードの登録も不要。
 ※AWSが提供している類似のAWS Educateでは無料クレジットの提供は終了した模様。

# 前提条件
学位が出る２年制または４年制の学生であること。 他細かい規則は公式で確認してください。

# 検証日
2022/05/14

# 登録手順
1. 下記のURLにアクセス。
https://azure.microsoft.com/en-us/free/students/

2. 利用条件を確認の上，「Starts Free」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602128/f3198bfc-8360-d475-6dae-4888b51a37ff.png)

3. マイクロソフトアカウントのログイン画面に遷移する。大学から支給されたマイクロソフトアカウントでサインイン。
3. マイクロソフトアカウントの認証が通ると，ユーザー情報を入力する画面に遷移するので，入力する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602128/e6ff2240-33f9-de54-0a36-ea2231af60e4.png)
3. 登録完了。Azureポータルに遷移する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602128/389dbb50-bf2f-0b7e-3b6c-cbadf2caa957.png)
yukicoder No.1928 Make a Binary Tree

データ構造をマージする一般的なテクをひらめけなかったのでまとめておく
使用言語はPython

# 問題
https://yukicoder.me/problems/no/1928

# 事前知識
### 二分木
どの親も、子を3つ以上持たない木のこと
この問題では、ある親に対して子を2つまで繋げられるという解釈でよい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642825/cf723ff0-459d-e46a-aac5-c0c348d09543.png)

# 解説
まず、各頂点で「頂点 $i$ を親としたときに残せる最大の頂点数」を求めることを考える、最終的な答えは頂点 1 の値になる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642825/617b6d67-85d8-2e3a-d553-2590cf31df43.png)

頂点 $i$ の値を求めるには、その子の値を全て求めてからでないと残す頂点を決めることができないので、DFS(深さ優先探索)で順に求めることになる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642825/30b869b0-af4c-5fb6-45bb-5e55c2eda589.png)

親が選べる頂点のうち、最大と 2 番目に大きい値の子を選ばないといけないのだが、どこかのタイミングで切り捨てたものが 2 番目に大きい場合もあるため、選ばなかった頂点もまとめる必要がある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642825/07099390-7419-b3be-0ea8-da0091aa45c9.png)

そこで、次のような操作を行う
まず、子の値を全て求め、それを親のリストに格納する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642825/2bca9eb8-74fb-a784-1c71-821f3e34050a.png)

もし子のリストに値が残っている場合は、それを全て親のリストに移す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642825/e9fa05a6-9e1d-6f1d-2d88-532414ade669.png)

リストから最大の値を 2 つまで取り出し、取り出した分と自身の頂点分を加えた値と頂点の値とする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642825/0b0e310f-589c-3cbd-555c-48a82a32d373.png)

この操作を行うことによって切り捨てた分も候補に入れることができ、問題なく値を求めることができる
Pythonではリストの部分は優先度付きキューを用いることで高速に最大 2 つの値を取り出せる

ただし、子のリストが多く残っていると移すときに時間がかかるため、もう一工夫必要である
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642825/ab95054e-61f9-22c1-ec72-fa5b80367c4f.png)


最終的に子の要素が全て親に集約されるため、子のリストに移してからそれを親のリストとして扱っても問題ない
そのため、子の値を親のリストに格納していき、格納が終わった時点でのリストの長さが最大の頂点に値を集約し、それを親のリストとして使えば移す回数を減らせる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642825/f5874f0f-9192-bc1f-c484-e20df0848916.png)

## 提出コード
```python
from sys import setrecursionlimit
setrecursionlimit(10**6)

from heapq import heappop,heappush

def dfs(pos, pre):
    global G, Vec
    for nxt in G[pos]:
        if nxt == pre:
            continue
        P = dfs(nxt, pos)
        heappush(Vec[pos], -P)
    M = len(Vec[pos])
    idx = pos
    for nxt in G[pos]:
        if nxt == pre:
            continue
        if len(Vec[nxt]) > M:
            M = len(Vec[nxt])
            idx = nxt
    if idx != pos:
        while Vec[pos]:
            heappush(Vec[idx], heappop(Vec[pos]))
    for nxt in G[pos]:
        if nxt == pre:
            continue
        if nxt == idx:
            continue
        while Vec[nxt]:
            heappush(Vec[idx], heappop(Vec[nxt]))
    Vec[pos] = Vec[idx]
    ret = 1
    if len(Vec[pos]) <= 2:
        while Vec[pos]:
            ret += -heappop(Vec[pos])
    else:
        for _ in range(2):
            ret += -heappop(Vec[pos])
    return ret

N = int(input())
G = [[] for _ in range(N)]
for _ in range(N-1):
    x,y = map(int,input().split())
    x -= 1
    y -= 1
    G[x].append(y)
    G[y].append(x)
Vec = [[] for _ in range(N)]
print(dfs(0, -1))
```

## 感想
本番中は DFS で深い順に求めるのは分かっていたが、マージテクを知らなかったため、切り捨てた頂点の扱いが上手くできず正解できなかった
解説を見た時めちゃくちゃ感動した
【Kotlin】Viewを長押し時、クリックイベントをリピートする処理を追加する

Viewを長押しした時にクリックイベントをリピートする処理を追加したく、
以下のJavaコードをKotlinに変換したコードを作成したため、備忘録として残しておきます。

https://gist.github.com/shisashi/1718672


# 環境
- Android 10
- Android Studio 4.1.3


# コード

``` LongClickRepeatAdapter.Kt
import android.annotation.SuppressLint
import android.os.Handler
import android.os.Looper
import android.view.MotionEvent
import android.view.View

class LongClickRepeatAdapter {

    /**
     * 長押し時のリピート処理間隔
     */
    companion object {
        private const val REPEAT_INTERVAL: Long = 100
    }

    /**
     * 引数のViewに長押しリピート処理を付加する
     * @param view View
     */
    @SuppressLint("ClickableViewAccessibility")
    fun bless(view: View) {
        val handler = Handler(Looper.getMainLooper())
        val isContinue = BooleanWrapper()

        val repeatRunnable = object : Runnable {
            override fun run() {
                if (!isContinue.value) return

                view.performClick()
                handler.postDelayed(this, REPEAT_INTERVAL)
            }
        }

        view.setOnLongClickListener {
            isContinue.value = true
            handler.post(repeatRunnable)

            return@setOnLongClickListener true
        }

        view.setOnTouchListener { _, motionEvent ->
            if (motionEvent.action == MotionEvent.ACTION_UP || motionEvent.action == MotionEvent.ACTION_CANCEL) {
                isContinue.value = false
                handler.removeCallbacks(repeatRunnable)
            }
            return@setOnTouchListener false
        }
    }

    private class BooleanWrapper {
        var value = false
    }
}

```
CircleCI で jest がタイムアウトする問題の対処

# 問題

CircleCI 上で `jest` を実行した際、タイムアウトエラーが発生した。
特に時間がかかるテストでもなく、ローカルでは問題なく動作する。
```
Too long with no output (exceeded 10m0s): context deadline exceeded
```

# 解決策
[公式ドキュメント](https://circleci.com/docs/ja/2.0/collect-test-data/#jest)に記述されていた。

> Jest テストの実行時には、--runInBand フラグを使用してください。 このフラグがない場合、Jest は、ジョブを実行している仮想マシン全体に CPU リソースを割り当てようとします。 --runInBand を使用すると、Jest は、仮想マシン内の仮想化されたビルド環境のみを使用するようになります。

というわけで、`--runInBand` オプションをつければ OK。

```
jest --runInBand
```
AWS Educate 登録手順（2022年5月現在）

# AWS Educateとは
~~AWSの学生向けプログラム。学習教材と月XXドルのクレジットを無料で受け取ることができる。
クレジットカードの登録も不要（クレジットが枯渇するとインスタンス類は全部停止する）のため，「うわっ，私AWS使いすぎ・・・？」的な事案になることもない。~~
→どうやら無料クレジットは廃止された模様。実際のAWS環境でのハンズオンを含むオンラインコースを無料で利用できる。

# 前提条件
~~学生であること。教育機関支給の`.ac.jp`や`.edu`ドメインの個人メールアドレスがあること。~~
→学生という前提条件も取り払われた模様。

# 検証日時
2022/05/14。

# 手順
## 登録
1. AWS Educateのサイトにアクセスする。検証時点でのURLは下記の通り。
https://aws.amazon.com/jp/education/awseducate/?nc1=h_ls
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602128/55b72109-0a3e-913a-ab63-d3f8f1c689d7.png)

2. 「今すぐに登録」をクリック。

3. ユーザー登録画面が表示されるので，ユーザー情報を入力する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602128/a43c7cc7-4d1d-e551-ddcd-02af419caae2.png)

   | 英語 | 日本語 |
   |:-:|:-:|
   | First Name | 名 |
   | Last Name | 姓 |
   | Country | 国 |
   | Birth Month | 誕生日の月 |
   | Birth Year | 誕生年 |
   | Email | メールアドレス  |
   | Registration Code | 登録コード（任意） |

4. 入力したメールアドレス宛にメールが送られてくるので，記載されているリンクをクリック。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602128/a7dd2f52-6fa8-97e7-12fb-494d4939dbe3.png)

5. メールが確認された旨のページが表示される。
5. 少し待つと，パスワード設定用のメールが来るので，記載されているリンクからパスワードの設定を行う。

#### パスワード設定用のメールが来ない場合

   1. AWS Educateのログイン画面に遷移する。

   5. ログイン画面に遷移する。この時点ではパスワードを知らないので，「Forgot password?」をクリックして，パスワード再設定画面に遷移。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602128/f330c6b8-6fb8-539e-6d92-3004e89b21cb.png)

   5. 先程登録したメールアドレスを入力する。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602128/915713f9-3433-4789-af05-5e99bdb637f3.png)

   5. メールが届くので記載されているリンクからパスワードの設定を行う。

## ログイン
1. 下記のサイトにアクセスし，メールアドレスとパスワードを入力
https://www.awseducate.com/signin/SiteLogin

すると利用できるコースの一覧が表示される。

## 参考
Qiita上でも「AWS Educate」で記載すると無料クレジットがもらえるよーという記事がいくつかありますが，いずれも検証日時が古いため，おそらくサービス内容の変更があった模様。残念。
Javaの勉強をし始めた

Javaはオブジェクト指向プログラミング言語（OOP）。

オブジェクトとは、データの分散を防ぐためにデータと機能を一つにまとめたグループ。
オブジェクト指向は、問題をオブジェクトに分けて作業する方法で、オブジェクトが有機的に相互作用する。

クラスとは、同様の特徴を持つオブジェクトのグループ。

学生というクラスはAさん、Bさん、Cさんなどのオブジェクトで構成される。


printlnは文字、数式、変数の計算結果などを表示

データタイプ
整数: Int x = 30;
整数：long x = 30l;
小数点：double dd = 30.0;
booleanはTrue、Falseだけ表示可能
文字列：String str = "複数文字"

sout(Math.max(10, 30));の結果値は30
sout(Math.min(10、30));の結果値は10

ランダムクラス
Random random = new random();
int rand = random.nextInt(9);
sout（rand）; // 0から9までの数字をランダムに出力

Random random = new random();
int rand = random.nextInt(bound:4) + 5;
sout（rand）; // 5から9までの数字をランダムに出力

条件文は if文、 else if文、 else文
繰り返し文はfor文、while文、do while文。
1. for(int i = 0; i < 10; i++) { // 初期化；変数の条件；ブロックを一度実行した後にどうなるかを表示
sout（i）; }の結果は0,1,2,3,4,5,6,7,8,9
2. int i = 0;
   while（i> 10）; {
sout（i）;
i++; } の結果も 0,1,2,3,4,5,6,7,8,9
3. int i = 0;
   do{
sout（i）;
i++;
   }while(i<10);の結果も0,1,2,3,4,5,6,7,8,9

&& -> and、|| -> or、！ -> not

配列は0番目、1番目、2番目の順で数える。

Arraylist配列
ArrayList<Integer> scoreList = new ArrayList<>();
scoreList.add(10); // 0番目の配列
scoreList.add(20); // 1番目の配列
scoreList.add(30); // 2番目の配列
scoreList.add(40); // 3番目の配列
scoreList.add(50); // 4番目の配列

scoreList.add(2、200); // 2番目の配列に200という値を入る（既存の2番目の配列は3番目になる）
scoreList.remove(3); // 3番目の配列を削除する

sout(scoreList); 結果は10、20、200、40、50

importは他のパッケージ内のクラスを使用させる関数
import 他のパッケージ名.クラス名;
しかし、読み込むパッケージ内のクラスにpublicが付いている場合にのみimport可能

void は Return値がない時に使用。
public String getName() {
   return name;
} // getは目的の値を取得するためです。だからreturnに希望の値を入れて出力。

public void setName(String name) {
   this.name = name;
} // setは、目的の値を取得するためのものではなく、入れるためのものです。だからreturn値がない。
Amazon Managed BlockchainのEthereum Developer Guide

# 1.Amazon Managed Blockchainとは何か？
## 効果的に活用できるAWSサービス
* AWS Management Console
* AWS CLI
* Managed Blockchain SDK

## Managed Blockchainの規模
* 数千のアプリケーションと数百万のトランザクションを実行できる。

# 2.キーコンセプト
## ManagedBlockchain上のEthereumで考慮すべきこと、制約
* サポートしているネットワーク
  * Mainnet-EthereumのPoWネットワークの大元になるもの
  
  * Goerli-PoAネットワークを活用している。お金は効力を持たたないものなのでテストネットでの使用を推奨されている。
  
  * Rinkeby-PoAネットワークでGeth用のネットワーク
  
  * Ropsten-mainnetに似ているネットワーク。

## マイニングはサポートされていない
マイニングはできないようです。

## WebSocketとHTTPで違うエンドポイントがある。
[JSON-RPC-API](https://ethereum.org/ja/developers/docs/apis/json-rpc/)をサポートしている。

## JSON-RPC bath requentsはサポートされていない
JSON-PRC bath requestsはサポートされていない。
## API callのデータ制限
WebSocketsのデータ上限は512kb
上限を超えると"message response is too large" のエラーが出る。
このエラーが出た場合はHTTPを使うと良いHTTPの場合はデータ制限が6MBまである。

## APIコールの4つの署名バージョン
ノードを作成したAWSアカウントで認可されたIAMプリンシパルのみが、APIを使用してノードと対話できる。

AWS認証情報（アクセスキーIDおよびシークレットアクセスキー）は、呼び出しとともに提供されなければならない。

IAMポリシーはAPIコールに適用されず、ノードへのEthereum APIアクセスを許可または拒否するために使用することはできない。IAM許可ポリシーは、ノードの作成、削除、および管理に関連する操作にのみ適用されます。

クライアント認証情報は、ユーザー向けアプリケーションに決して埋め込まないでください。信頼できるウェブドメインから訪問する匿名ユーザーにマネージドブロックチェーン上のEthereumノードを公開するには、適切なIAM資格情報を使用してノードにリクエストを転送する。Lambda関数に支えられたAmazon API Gatewayで別のエンドポイントをセットアップすることができます。

## ロートランザクションのみサポートされている
トランザクションをサブミットするためにManaged BlockChainはeth_sendRawTransactionメソッドのみサポートしている。
トランザクションを作る際は秘密鍵で署名する必要がある。
言い換えればEthereumのウォレットは使えない。

## アカウント毎のノードの制限
アカウント毎に50個のノードが最高です。

# 参考
https://docs.aws.amazon.com/managed-blockchain/latest/ethereum-dev/ethereum-setting-up.html
【Xcode】リリース済みアプリで発生したクラッシュの原因を探る

# はじめに
リリース済みのアプリでユーザーからクラッシュ報告が来ても、こちらで再現できないと原因が分からないので修正のしようがありません。
クラッシュログを送ってもらってシンボル化して読めるようにするなどの記事がありましたが難しくてよくわかりませんでした。
そんな中いい方法を見つけたので書き残しておきます。

# 方法
メニューバーの「Window」を選択
![スクリーンショット 2022-05-14 13.48.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/96d65c3c-2ad6-ceec-e941-e43ca663fe8f.png)
「Organizer」を選択
![スクリーンショット 2022-05-14 13.50.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/855820ff-0cd2-1068-6bd2-6460e2b52500.png)
①アプリを選択
②「Crashes」を選択
![スクリーンショット 2022-05-14 13.52.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/e49a3571-c3fe-4df7-1287-f6961793d8a8.png)

クラッシュの原因が見れます
![スクリーンショット 2022-05-14 13.55.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/f3e439c0-eec3-9b16-4e34-07b8cc14b03b.png)

# おわり
この方法はユーザーが「iPhone解析を共有」をオンにしている必要があります。

**「iPhone解析を共有」の場所**
設定→プライバシー→解析および改善→iPhone解析を共有