OmniAICreator/Qiita-1.07M huggingface dataset:
Reactの基礎アウトプット

#はじめに

ポートフォリオ 作成のため、Reactについて学ぶ

今回はまずは初歩的な話からまとめる

##React公式HP
https://ja.reactjs.org/

##Reactとは

JSのライブラリーのこと

中身の書き方はほぼHTMLと同じだが、ファイルが異なる
→JSXとなる

##JSX
JSXは、HTMLとほとんど同じように記述可能
見出しには`<h1>`タグや`<h2>`タグ、文章には`<p>`タグ、その他`<div>`タグなど、HTMLと同様のタグが使える
→return内に複数の要素があるとエラーに。。。
複数の要素がある場合は、<div>タグで囲んで、1つの要素にまとめないといけない

```
<div>
	<h1></h1>
	<h2></h2>
</div>
```

##コメント
コメントは{/* */}で囲む

##imgタグ
imgタグは、HTMLでは、`<img src='画像のURL'>`のように閉じタグが必要ないが
JSXでは閉じタグが必要`<img src='画像のURL' />`のように、タグの終わりにスラッシュ「/」を記述

```
class App extends React.Component {
  render() {
    return (
      <div>
        <img src="o.png"/>←こんな感じ
      </div>
    );
  }
}
```

##JSXの構成

```JS
//Reactをインポート
import React from 'react';

// //React.Componentを継承するクラスの定義
class App extends React.Component{
  render(){
  //JSXを返り値とするrenderメソッドを定義
    return (
      <h1>Hello React</h1>	//JSX部分
    );
  }
}

// Appクラスをエクスポート
export default App;
```

①renderメソッドの、returnの外にはJavaScriptを記述できる
②returnの中でも、JSXにJavaScriptを埋め込むことが可能。
　JavaScriptの部分を中括弧{ }で囲む。

```JS
import React from 'react';

class App extends React.Component {
  render() {  //JSXを定義
    // 定数を定義　①
	const name="にんじゃわんこ";
    const imgUrl="https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/react/ninjawanko.png"
     return (
      <div>
        <h1>{name}</h1>　//②JS埋め込み
        <img src={imgUrl}/>
      </div>
    );
  }
}
export default App;
```

##イベント
アロー関数を使って、タグ内に　イベント名={() => { 処理 }}と書くことで、指定したタイミングで処理を実行できる

```JS
import React from 'react';

class App extends React.Component {
  render() {
    return (
    	<div>
			<h1>こんにちは、にんじゃわんこさん！</h1>
			<button onClick={()=>{console.log("ひつじ仙人")}}>ひつじ仙人</button>
			<button onClick={()=>{console.log("にんじゃわんこ")}}>にんじゃわんこ</button>
      </div>
    );
  }
}
export default App;
```

##state
ユーザーの動きに合わせて変わる値のことを、Reactではstateと呼ぶ。
stateを変えるには3つの段階を踏む

1. stateの定義
1. stateの表示
1. stateの変更

###stateの定義
stateは、constructorの中で、オブジェクトとして定義する。
ここで定義したオブジェクトがstateの初期値
その他の部分の、「constructor(props)」や「super(props);」といった処理はいつも同じ記述をするため、定型文として覚えておく

###stateの表示
定義したstateは、this.stateで取得する
stateはオブジェクトなので、console.log(this.state)をするとオブジェクトが出力される
`this.state.プロパティ名`とすることで、指定したstateのプロパティ名に対応する値を取得できる

###stateの変更
`this.setState({プロパティ名: 変更する値})`とすることで、指定されたプロパティに対応するstateの値が変更される

※注意
Reactでは、「stateの値に直接代入することで値を変更してはいけない」という決まりがある
値を変更したい場合は、setStateを使う

```JS
import React from 'react';

class App extends React.Component {
//stateの定義　
  constructor(props) {
    super(props);
    this.state = {name: 'にんじゃわんこ'};
  }
  
  render() {
    return (
    	<div>
    	  <h1>こんにちは、{this.state.name}さん！</h1>//stateの表示　this.stateで取得
    //stateの変更　this.setState({プロパティ名: 変更する値})で変更できる
        <button onClick={() => {this.setState({name:'ひつじ仙人'})}}>ひつじ仙人</button>
        <button onClick={() => {this.setState({name:'にんじゃわんこ'})}}>にんじゃわんこ</button>
         </div>
    );
  }
}

export default App;
```

以上

次の記事

https://qiita.com/kiyomasa05/items/c32e4f39ffb8a9b20673
Hook API(React)[Material-ui]

Hook API使う場合は
`npm install --save @material-ui/styles`
実行してください

```javascript
import {createStyles, makeStyles} from "@material-ui/core/styles";

const useStyles = makeStyles(() => (
  createStyles({
    "button": {
      borderColor: '#FFB549',
      color: '#FFB549',
      }
    }
  })
));

const Article = (props) => {
  const classes = useStyles();

  return(
    <Button 
      className={classes.button}
      {props.content}
    </Button>
  )

}

```
`const classes`から`Buttom`へ`style`をつけています。

**注意**
JSON形式でキャメルケースで書くこと
数値は`''`囲む必要がない


#おまけ(エントリーポイント使い方)
importの記述が多くなるため
エントリーポイント作ってあげたほうが良いです。


```javascript:index.js
export {default as Hoge} from './Hoge'
export {default as Fuga} from './Fuga'
export {default as Foo} from './Foo'
export {default as Bar} from './Bar'
```


```javascript:使いたいところ
import {Hoge, Foo} from './components/index';
```

`export {default as Hoge} from './Hoge'`
名前付きエクスポートしているので呼び出すときは`{}`が入ります
[Unity]Visual Scripting(旧Bolt)をとりあえず一回使ってみたい(Unity2021ならお手軽にできます)

# 概要
Boltはコードを書く代わりに視覚的に部品をつなげることでプログラムが作れるツールです。
UnrealEngineのブループリントの様なものですね。

BoltはUnity2021以降ならAssetStoreからダウンロードしなくても標準で使えます。
# 本文
Cubeを一つ作って選択します
![スクリーンショット (2127).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/cb4ded14-1ae9-14c1-6d12-ab9e9efe836e.png)
InspectorからAddComponentしてVisualScriptingを選びます
![スクリーンショット (2128).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/3899b93c-677b-06e7-1309-1d07f6410642.png)
ScriptMachineがあるのでクリックします
![スクリーンショット (2129).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/1d42a758-41de-d891-99a5-fa577be5e584.png)
Newを押すとファイル作成のポップアップが表示されるので適当な名前を入力してください。これでScriptGraphが作成されます。
その後EditGraphボタンが押せるようになるので押します(もしエラーが出たら下の補足を参考にしてください)。
![スクリーンショット (2130).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/fcf0ced9-e388-7bf1-3c67-64c1f068a8a4.png)
この画面でビジュアルスクリプティングを行っていきます。StartとUpdateがあって普通にC#でコードを書くときに近い雰囲気を感じられると思います。
![スクリーンショット (2132).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/5f8a9285-edc5-c444-f7e7-9bd17731c6c5.png)
Updateの右にある白い三角からドラッグすると線が出てきます。ボタンを離すと命令を指定するメニューが出てきます。
![スクリーンショット (2133).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/a90ee59d-8c62-817d-ed3e-eb7c03b4f55e.png)
今回はCubeを回転させます。transformと入力すると検索項目が出てくるので「Transform:Rotate(X Angle,Y Angle,Z Angle)」を選んでください。
![スクリーンショット (2126).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/f948b27c-4487-22c2-b169-2139f56f9139.png)
Y Angleに1を入力します
![スクリーンショット (2135).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/d3e2a82f-e1b6-2c01-af6a-fbd47a2d5431.png)
後は最初の画面に戻り実行ボタンを押すとCubeが回転してくれます
<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://twitter.com/hashtag/Unity?src=hash&amp;ref_src=twsrc%5Etfw">#Unity</a> <a href="https://twitter.com/hashtag/Bolt?src=hash&amp;ref_src=twsrc%5Etfw">#Bolt</a> <a href="https://twitter.com/hashtag/Qiita?src=hash&amp;ref_src=twsrc%5Etfw">#Qiita</a> <a href="https://t.co/goEbFYvhZ4">pic.twitter.com/goEbFYvhZ4</a></p>&mdash; kazuma (@kazuma_f) <a href="https://twitter.com/kazuma_f/status/1375577926175891459?ref_src=twsrc%5Etfw">March 26, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 補足1
EditGraphボタンを押した時にこんな画面が出るかもしれません。Change nowを押したら必要な設定変更をUnityが自動でやってくれます
![スクリーンショット (2113).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/c5fbee9b-2f56-47f0-ea93-8408392e80d5.png)

# 補足2
この記事はUnity JapanのYouTube動画『【解説】何が変わった？　Boltからビジュアルスクリプティングへ - Unityステーション』を参考にしています。よかったら動画の方もご覧ください:thumbsup:

https://www.youtube.com/watch?v=YzaqqwP9-48
OMC021 プログラミングを用いた解法

# はじめに
数学コンテストサイト「OnlineMathContest」の「OMC021 (for beginners)」において、B, C問題を解く際に、プログラミング (Python) を利用しました。
そのコードと解法・解説を記載します。
(コンテスト終了後に、より良さそうな方法やより分かりやすそうな記法などを発見した場合には、そちらを記載しています。)

<b>OMC021 (for beginners)</b>
https://onlinemathcontest.com/contests/omc021

<b><font color="Red">注意: 2021年8月より、OnlineMathContest のコンテストでは、プログラミングを含む外部ツールの使用が禁止される予定ですので、ご注意ください。</font></b>
(本記事は、外部ツールの使用が許可されていたコンテストについてのものです。)

# B問題
問題
https://onlinemathcontest.com/contests/omc021/tasks/131

最小公倍数が $10^{10} = 2^{10} 5^{10}$ であることより、 $a, b$ はどちらも $10^{10}$ 以下であり、かつ $2, 5$ 以外の素因数をもっていてはいけないことがわかります。
よって $a, b$ は、それぞれ $2^p 5^q \; (0≦p, q≦10)$ と表すことができます。
ここからさらに考察を進められますが、この時点で、プログラミングを使った $11^4$ 通りの全探索をすることでも解けます。
最小公倍数は $\mathrm{lcm}(a, b) = \frac{a \times b}{\mathrm{gcd}(a, b)}$ という公式より、math.gcdを利用して求められます。
(Python 3.9からmath.lcmが使えるようですが、2021年3月時点で競技プログラミングなどの環境では対応していないものがあります。)

```python
from math import gcd

A = [2**i for i in range(11)]
B = [5**i for i in range(11)]
n = 10**10

ans = 0
for i in range(len(A)):
    for j in range(len(B)):
        for k in range(len(A)):
            for l in range(len(B)):
                a = A[i] * B[j]
                b = A[k] * B[l]
                lcm = (a * b) // gcd(a, b)
                if a <= b and lcm == n:
                    ans += 1

print(ans)
```

# C問題
問題
https://onlinemathcontest.com/contests/omc021/tasks/132

コインのすべての出方は $2^{10} = 1024$ 通りなので、全パターンについて $3$ 回連続で表または裏が出ることがあるかをプログラミングで (計算時間的に) 十分早く求められます。
各パターンを「表表裏表裏裏裏表裏表」のように表記し、表を $0$ 、裏を $1$ に置き換えると、全 $1024$ パターンを $0$ ～ $1023$ を表す $2$ 進数 ( $0$ 埋めをして $10$ 桁になるようにしたもの) で表すことができます。
このとき、「表/裏が $3$ 回続くこと」は「 $2$ 進数の文字列内に $000$ / $111$ が登場すること」と言い換えられます。
条件を満たすパターン数が求まったら、最後に約分を行います。全パターン数 (＝分母) が $2$ の $10$ 乗なので ( $2$ 以外の素因数をもたないので) 、 $2$ で約分できるかだけを確認すれば大丈夫です。

```Python
n = 10
ans = 0
for i in range(2**n):
    ib = format(i, "b").zfill(n)  # 例えばi=5ならば、ibは「0000000101」という文字列になる
    ng = False
    for j in range(n):
        if ib[j : j+3] in ("000", "111"):  # 3回連続で同じ面が出ていたら
            ng = True
    if not ng:
        ans += 1

den = 2**10  # 分母
while den % 2 == 0 and ans % 2 == 0:  # 可能な限り2で約分する
    ans //= 2
    den //= 2

print(ans, den, ans + den)
```

Pythonでは整数 $i$ について「format(i, "b")」と書くことで $2$ 進数に変換できます (bはたぶんbinary (2進数) の略です) 。
zfillでゼロ埋めを行っており、例えば $i=5$ ならば、ibは「0000000101」という文字列になります。
$3$ 連続で同じ面が出た時点でngがTrueになり、答えのカウントからは除外されます。
分母は英語で「denominator」というらしいので、「den」という変数名にしています (私は本番では別の変数名でやりました) 。
「ans + den」の値が、最終的な答えとなります。
Fusion 360で電球のネジ形を作る方法 (E17形)

3D CAD (Fusion 360)で電球のネジを作った時の備忘録です。

1. ネジの本体となる円柱のスケッチを作成します。中心と直径の円を描き、直径は14mmを指定します。

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497212/542790f0-ac9f-2388-35c1-493230974b47.png)
2. 1のスケッチを押し出しでボディを作成します。長さは用途に合わせて。本稿ではネジが回せることを確認するだけなので25mmにします。

![22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497212/02b7f470-f293-45b9-5865-be30f7267061.png)
3. コイルを作成します。ネジの先端の平面を指定し、直径は14mmを指定します。その他、下図のように指定します。

![32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497212/c20c92e0-f3aa-58ef-959e-5eba6903eb2b.png)
4. ネジの先端を細くするために、削り取りたい部分を決めるためのスケッチを作成します。

![42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497212/2fd14d36-0d8f-c890-8a6d-84a141b87742.png)
5. 回転を使って、外側の三角形の部分を360度切り取ります。

![52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497212/e0746979-7873-9119-494b-7d226732b714.png)
6. これでE17形のネジっぽいのが出来上がりです。

![62.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497212/7a82deea-9fda-f1c0-ba64-b04030831503.png)
7. 感電しないでね。
【Swift】Navigation遷移する、Navigation遷移を戻る

# これはなに

Segueを使わずにコードで遷移する。
`NextViewController` という名前のControllerへの遷移を想定する。

## 遷移

```swift:ViewController.swift
let storyboard = UIStoryboard(name: "NextViewController", bundle: nil)
let vc = storyboard.instantiateViewController(identifier: "NextViewController")

self.navigationController?.pushViewController(vc, animated: true)
```

## 戻る

デフォルトの戻るボタンを使わない場合

```swift:ViewController.swift
self.navigationController?.popViewController(animated: true)
```

おわり(´・ω・｀)
【Mac版】Vim初級者へオススメの設定と知っておくと便利な最低限のコマンド

## tabインデントが入力しやすくなる**Vim**のおすすめ設定
他のテキストエディタと比べかなり癖が強いVimを，使い勝手の良い最強ツールにするための設定とコマンド一覧を記載する．

Vimの設定ファイル`.vimrc`を編集

```
sudo vim ~/.vimrc
```

キー`i`を押下し挿入モードへ切り替え，下記コマンドを貼り付け
```vim:~/.vimrc
"#####表示設定#####
set number "行番号を表示
set title "編集中のファイル名を表示
set showmatch "括弧入力時の対応する括弧を表示
syntax on "コードの色分け
set tabstop=2 "インデントを半角スペース2つ分に設定
set nosmartindent "スマートインデントOFF
set autoindent "オートインデントON
set expandtab "Tabインデント時に設定個数分の半角スペース挿入
set shiftwidth=4 "オートインデント時のズレ幅を半角スペース4つ分に設定

"#####検索設定#####
set ignorecase "大文字/小文字の区別なく検索
set smartcase "検索文字列に大文字/小文字が混在した場合のみ区別して検索
set wrapscan "末尾まで検索したら先頭に戻る
```

`ESC`キーを押下しノーマルモードへ切り替え，コマンド`:wq`を入力し変更内容を保存して終了

## 知っておくと便利な最低限のVimコマンド

|コマンド|内容|
|:-:|:-|
|i|挿入モードへ切り替え|
|o|カーソル直下行に新しい行を追加し挿入モードへ切り替え|
|ESC|ノーマルモードへ切り替え|
|x|カーソル文字を後方へ向かって1文字ずつ削除|
|dd|カーソル行を削除|
|yy|カーソル行をコピー|
|p|カーソル直下行にペースト|
|ZZ|変更内容を保存して終了|
|:wq|変更内容を保存して終了|
|:w|変更内容を上書き保存|
|:q!|保存せずに終了|
|:set nonumber|行番号非表示（行番号を含まずにソースコードをコピーが可能になる）|

**Vim**の醍醐味である高速移動は初級者にとって，それなりにハードルの高いスキルのため本記事では割愛している．
Elasticsearch の検索結果に一貫性がなかった（inconsistent）ので preference 指定して対処した

## 概要
- Elasticserach（以降Es）7.x系において、検索をした場合、ヒット数が paginate が発生するくらい多い（あるいは結果のsizeを限定していた場合）と最初（ページロールする前）に現れるドキュメントに一貫性がなかった（inconsistent）
    - 厳密には、スコアが変わることでランキング結果がかわり、１ページ目に現れるドキュメントが変わっていたぽい
- これは、 https://www.elastic.co/guide/en/elasticsearch/reference/current/consistent-scoring.html#_scores_are_not_reproducible でも述べられている通り仕方のない問題である
- 検索時に [preference](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html#search-preference) に適切なカスタム文字列を設定することで対処できた

## 詳細（というほどでもないけど）
- 原因
  - https://www.elastic.co/guide/en/elasticsearch/reference/current/consistent-scoring.html#_scores_are_not_reproducible でも述べられているように、Esは、検索時にクエリを各Shardにルーティングをしている
  - Shard によって統計データ（スコア計算に使う）が異なるため、ルーティングされたShardによってランキング結果が微妙に変わってしまっていた
        - https://medium.com/thron-tech/why-scaling-elasticsearch-broke-our-ranking-and-how-we-fixed-it-e603b60f0c05 によると、この統計データは、DF / IDF のことらしい
        - 転置インデックスなど、全文検索の仕組みを考えれば、それはそうかという感じ
- 対処方法
    - 検索時に `preference` に適当な文字列を渡せば、同じ文字列が渡されるならばルーティング先を保証してくれるので、結果、スコアリングにも一貫性がでて、検索結果に一貫性をもたせられる
        - https://www.elastic.co/guide/en/elasticsearch/reference/current/consistent-scoring.html#_scores_are_not_reproducible  
        > The recommended way to work around this issue is to use a string that identifies the user that is logged in (a user id or session id for instance) as a preference. This ensures that all queries of a given user are always going to hit the same shards, so scores remain more consistent across queries. 
    - 上でも述べられているように、カスタム文字列は、`user_id` や `session id` などのように、ある程度値が分散するような文字列にするべき
        - でないと、shardの負荷が偏ってしまうためだと思われる 
        - 一方で、再現性をもたせたい範囲では同じ文字列を渡す必要があるはず（それが、セッション単位なのか、ユーザ単位なのか、ユーザグループ単位なのかは場合によって異なる）
- 結果
    - 再現性がでるようになった（結果が同じになった）
- 残った疑問
    - `custom-string` に渡せるカスタム文字列って、制限（文字種、長さ）ないのかな？ 
        - 以下を読む限り、`_` で始まらなければ何でも良さそう？
        - https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html#search-preference  
        > <custom-string>
Any string that does not start with _. If the cluster state and selected shards do not change, searches using the same <custom-string> value are routed to the same shards in the same order.
        - 検証した限り、本当に任意の文字列でいけそうではあるが。。。
スクリプトメモ　その１


普段使っている（自分にとって）使用頻度の高いスクリプトコード

---
反復スクリプト
０から１になってまた０に戻るような遷移がしたいときに使います

```C#:
float result = 1.0f - Mathf.Abs(Mathf.Lerp(-1.0f, 1.0f, value));

```

---
途中から遷移
０から１のうち、途中(たとえば0.5)から途中(たとえば0.75)までの遷移を０から１にしたい場合に使います

```C#
float reslt = Mathf.InverseLerp(0.5f, 0.75f,value);

```

主にLive2Dのパラメータをスクリプトで動かすときに使ってます

---
応用
とあるオブジェクトに対して

```C#
float r = 1 - Mathf.Abs(Mathf.Lerp(-1, 1, value));
float s = 1 - Mathf.Abs(Mathf.Lerp(-1, 1, r));

float angle = s * Mathf.Sign(value- 0.5f)*10;

Quaternion rot = Quaternion.AngleAxis(angle, Vector3.back);
```

こうすることでベルが揺れるようなアニメーションを加えることが出来ます

```C#
    private float NormalizedSwingLikeBell
    {
        set
        {
            float t = Mathf.Clamp(value, 0.0f, 1.0f);

            float r = 1 - Mathf.Abs(Mathf.Lerp(-1, 1, t));
            float s = 1 - Mathf.Abs(Mathf.Lerp(-1, 1, r));

            float angle = s * Mathf.Sign(value - 0.5f)*10;

            transform.rotation= Quaternion.AngleAxis(angle, Vector3.back);
        }
    }

    public void SwingLikeBell(float t)
    {
        StartCoroutine(CoSwingLikeBell(t));
    }

    IEnumerator CoSwingLikeBell(float t)
    {
        float current_time = 0;
        while (t > current_time)
        {
            yield return null;
            current_time += Time.deltaTime;
            NormalizedSwingLikeBell = current_time / t;
        }
        NormalizedSwingLikeBell = 0;
    }
```
削除したファイルをプルリクエストする

マスターから `git clone` をしてリモートリポジトリからプロジェクトをクローンした。
この時に不要なファイル削除をしてその結果も細かくプッシュ、プルリクしようと思ったので、その時のことをまとめる。
ファイル内の追記や削除ではなく、ファイルそのものを削除したときのステージングにこの方法を参考にして欲しい。

#ブランチをきる

```
$ git checkout -b remove_admin/data
```
新たなブランチを作成する。
`git checkout -b　ブランチの名前`で新たなブランチの作成をする
`git branch` でブランチを確認できる。

```
 $ git branch
  master
* remove_admin/data
```
この時に自動で作ったブランチに `git checkout` されているようになっている。

# ファイルの削除とステージング
```
$ git rm -r admin/data
``` 
該当のファイルはdataディレクトリの中にあったがdataディレクトリも不要だったのでまとめて削除した。
`-r` オプションでディレクトリごと削除する。

```
$ git rm $(git ls-files --deleted)
```
このコマンドで削除したファイルをステージング対象にする。
ちなみに私はfishシェルを利用しているということや` --deleted` オプションが利用できなかったので下記のコマンドを利用した。

```
$ git ls-files --deleted | xargs git rm -f
```

`git status` でステージングされているか確認

```
$ git status
On branch remove_admin/data
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	deleted:    admin/data/monthly_mails.coffee
```

しっかりステージングされていた。ちなみに、`git rm -r` で削除したdataの中には `.coffee` のファイルが入っていた。

##ブランチにプッシュ
まずは、コミットをする

```
$ git commit -m "remove_data/mails.coffee"
```
その後作成したブランチにプッシュする

```
$ git push origin remove_admin/data

省略

* [new branch]          remove_admin/data -> remove_admin/data
```
しっかり作成したブランチに削除したファイルがプッシュできていた。
あとはリモートリポジトリでプルリクエストをするだけである。

参考記事
https://qiita.com/___xxx_/items/0cad6a5062fd166652cd
日付、時刻表示(firebase,timestamp,moment.js)

#日付、時刻表示について
チャットアプリ作成時、苦戦したのでまとめておく。
メッセージを送信した際に、Cloud Firestore（firebase）にtimestampを保存し、そのtimestampを取り出してフォーマットした後、表示させる。

#大前提として、、、
###○firestoreにtimestampを作る

```javascript
firebase.firestore().collection("messages").add({
      content: value,
      timestamp: firebase.firestore.FieldValue.serverTimestamp(), //<-new Date()だとそのパソコンの時刻が使われるのでズレる場合を考慮してサーバーサイドの時刻を追加する
      // timestamp: new Date(),
    });
```

new Date() だとクライアント側 (ブラウザ) の時刻になるが、端末の時刻が狂ってたら (または故意にずらしてたら) 問題が起こる可能性がある。
serverTimestamp() は Firebase のサーバー側で時刻を設定する

#####※serverTimestamp()について
firebase.firestore.FieldValue.serverTimestamp()でfirebaseにtimestampを作っているが、こちらで少しハマってしまった。
ただページを開いたり更新したりするだけだと日付と時間を表示できるが、メッセージを送信した際に表示ができず、エラーになった。

![スクリーンショット 2021-03-27 0.01.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234382/b7307db3-51a1-ec52-2245-f101976934b4.png)


今回のエラーはtimestampがnullだからtoDate()が使えないよっていうエラーだった。
つまりtimestampがnullになっているのだが、これは取得時に書き換えをすることで回避することができた。
firebaseのserverTimestampはデータをaddしたタイミングに作り始める。
だから、onSnapshotでデータをとろうとすると、
データをadd ⬅serverTimestamp作成開始
データを所得 ⬅serverTimestamp作成途中
serverTimestampがnullですよ(エラー) ⬅作成完了
のような流れになっている様です。
#####☆firebase.firestore.FieldValue.serverTimestamp() を使うと、すぐにtimestampが入るわけではなく、タイムスタンプが設定されるまでに、少しタイムラグがある様です。

これを回避するには、useEffect内のデータ取得時に

```javascript
timestamp: doc.data({serverTimestamps:"estimate"}).timestamp.toDate(), //この部分でfirebaseより取得（このように書くことで、serverTimestampが作成途中の時は見積もり時間を返してくれる）
//エラーが起きていたときにコード➜timestamp: doc.data().timestamp.toDate(),
```

とすることで回避できた。
doc.dataの引数にはSnapshotOptionsというオプションを指定することができ、今回はserverTimestampが作成途中の時は見積もり時間を返してくれるよというものになっている。
つまり、timestampがnullのときは見積もり時間を返し、timestampが作られたらその時間を表示してくれる様になります。

###○firestoreから取り出す
まずfirebaseからデータをとってくる際にDate型に変えるtoDate()を実行する。

```javascript
timestamp : doc.data().timestamp.toDate() // firebaseのtimestampの型からDate型にかえる
```

として取得します。
その後取得したデータはDate型なのでそのまま画面に表示させることができません。
一度string型、要は文字列にする必要があります。
そのやり方は↓でまとめる。（string型にフォーマットされた日付を作る方法と、moment.jsを使用する方法）

#実際に表示させる
####[今回、２通りの方法で実現した。]

###①フォーマットしつつ、string型に変換

```javascript
const formatTime = `${message.timestamp.getFullYear()}/${message.timestamp.getMonth()+1}/${message.timestamp.getDate()} ${message.timestamp.getHours()}:${message.timestamp.getMinutes()}:${message.timestamp.getSeconds()}`
```

としてstring型にフォーマットされた日付を作ります.それを

```javascript
<span>{formatTime}</span>
```

として表示してやる。

###②moment.jsを使用
######※moment.js以外にも使えそうなライブラリは多数あり。

```javascript
import dayjs from 'dayjs';

// 略
            <span>{dayjs(message.timestamp).format('YYYY/MM/DD HH:mm')}</span>

```

![スクリーンショット 2021-03-25 7.06.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234382/5c202ea0-ddab-ef1a-e659-e6446226ac7a.png)
rspecでfirebase-auth-railsの認証を通す

## 何をしたか
[firebase-auth-rails](https://github.com/penguinwokrs/firebase-auth-rails)というgemを使ったプロジェクトを作成したのですが、テストコード(rspec)で認証が通らないため、それを解決した方法を備忘録的に書きました。

## 事象

例えば下記のようなcontrollerがあったとします。
`before_action :authenticate_user` で認証が通らないと401エラーになります。

```ruby:controllers/api/books_controller.rb
class Api::BooksController < Api::ApplicationController
  include Firebase::Auth::Authenticable
  before_action :authenticate_user

  def create
    @book = Book.new(title: params[:title])

    if @book.save
      render json: { book: @book }
    else
      render json: { error: @book.errors.messages }, status: :internal_server_error
    end
  end
end
```

このcontrollerのテストコードを書いてみます。
headerの`Authorization`には適当な値を入れています。
今回はAuthorizationの値は任意で問題ない想定です。

```ruby
require 'rails_helper'

RSpec.describe Api::BooksController, type: :request do
  describe '#create' do
    let (:headers) {
      {
        'Content-Type': 'application/json',
        Authorization: "Bearer token"
      }
    }

    it 'return 200' do
      post api_books_path, params: { title: 'タイトル' }.to_json, headers: headers
      expect(response).to have_http_status 200
    end
  end
end
```

上記のテストコードはテストが通りません。
`before_action :authenticate_user` で認証が通らないためです。
そのため上記のテストコードでテストが通るように諸々追加します。

## 解決方法

`spec/support`配下に`firebase_stub.rb`を作成
`Firebase::Auth::Authenticable`の`authenticate_entity`というメソッドが引数で指定したuserを返すようなstubを作成します。
[Firebase::Auth::Authenticable](https://github.com/penguinwokrs/firebase-auth-rails/blob/master/lib/firebase/auth/authenticable.rb)

```ruby:spec/support/firebase_stub.rb
module FirebaseStub
  def stub_firebase(user)
    allow_any_instance_of(Firebase::Auth::Authenticable).to receive(:authenticate_entity).and_return(user)
  end
end
```

`spec/rails_helper.rb`に`FirebaseStub`を追加

```ruby:spec/rails_helper.rb
# This file is copied to spec/ when you run 'rails generate rspec:install'
require 'spec_helper'

# ...略

Dir[Rails.root.join('spec', 'support', '**', '*.rb')].sort.each { |f| require f }

# ...略

RSpec.configure do |config|

# ...略

  config.include FirebaseStub
end
```

最後に先ほどのテストコードに`stub_firebase`をbeforeで実行するよう追加します。
userはここではFactoryBotで予め定義されている前提で書きました。

```diff_ruby
require 'rails_helper'

RSpec.describe Api::BooksController, type: :request do
  describe '#create' do
    let (:headers) {
      {
        'Content-Type': 'application/json',
        Authorization: "Bearer token"
      }
    }
+   let(:user) { FactoryBot.create(:user) }

+   before { stub_firebase(user) }

    it 'return 200' do
      post api_books_path, params: { title: 'タイトル' }.to_json, headers: headers
      expect(response).to have_http_status 200
    end
  end
end
```

以上の設定によってテストコードで認証が通るかと思います。
また、`current_user`を使うと、stub_firebaseの引数のuserが取得できます。

今回はtokenの値を一切使わなかったため、もっといい書き方があるかと思いますが、自分はこう解決しました。

[firebase-auth-rails](https://github.com/penguinwokrs/firebase-auth-rails)
Luaを組み込んだC言語プログラムのコンパイル

C言語にluaを組み込もうと思ったのですが、コンパイルの仕方がよくわからなくてはまったのでまとめました。
#実行環境
OS:windows10
エディタ:Visual Stdio Code
コンパイラ:MinGW 64bit

#参考サイト
[C言語のプログラムにLuaインタプリタを組み込む](https://lipoyang.hatenablog.com/entry/2018/11/09/081036)
[gcc コンパイルオプション備忘録](https://qiita.com/seriru13/items/c2f5192615162c4c3f47)
[Luaプログラミング入門](https://densan-labs.net/_downloads/lua.pdf)
#コード
このコードをコンパイルすることが目標になります。

```c:LuaTest.c
#include <stdio.h>

#include <lua.h>
#include <lualib.h>
#include <luaxlib.h>

int main(void) {
   lua_State *L = luaL_newstate();
   lua_close(L);
   return 0;
}
```

#Luaのライブラリダウンロード
MinGW用のライブラリファイルをダウンロードします。
[このサイト](http://luabinaries.sourceforge.net/)のHistoryから最新版にアクセスします。LuaBinariesの中でWindows Libraries を選択しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1244319/4ebd5688-ea98-212f-62ab-9ba6f646ca80.png)
2種類ありますが、Staticを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1244319/a3f530a9-caab-d27e-fa1e-6cbdc063d18f.png)
コンパイラごとにライブラリがありますので自身のコンパイラにあったものを選択します。今回はMinGWの64bit版を使うのでlua-5.4.2_Win64_mongw6_lib.zipを選択しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1244319/d8bb5381-ce8b-7242-b12b-67edcfd50717.png)
ダウンロードしたいファイルをクリックすると始まるカウントダウンがゼロになるとダウンロードが始まりますので終わったら解凍してください。

#コンパイル
回答したフォルダに入っているincludeフォルダとliblua54.aファイル(たぶん54の部分はバージョンによって変わる)をコンパイルしたいプログラムの入っているフォルダに入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1244319/ba98f706-b80a-f3c1-8038-5090c2ad5bed.png)
コマンドラインで以下のコマンドを走らせます

```console
$ gcc -o LuaTest LuaTest.c -I "include" -L. -llua54
```
LuaTest.exeができていれば成功です。

#終わりに
gccのオプションの書き方とかwindows用のライブラリの場所とか分からなくて数日間さまよってました。
【Unity】スクリプトからRectTransformをStretchにする

# 概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/8b578daf-db9d-de8c-ec97-c7f1ae98c3a1.png)
スクリプトから↑の状態にする方法について、エディタ拡張を書いているときに詰まったので備忘録として残します。

# 結論
残念ながら`RectTransform.isStretch=true`のようには設定できないので、以下のようにコードでAnchorを設定します。

```c#
// 縦横Stretch
RectTransform rectTransform = (RectTransform)target.transform;
rectTransform.anchorMin = new Vector2(0, 0);
rectTransform.anchorMax = new Vector2(1, 1);

// 親オブジェクトにStretchするようにサイズを変更
rectTransform.offsetMin = new Vector2(0, 0);
rectTransform.offsetMax = new Vector2(0, 0);
```

# 解説
コードとInspectorの対応は以下のようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/01337ec0-304d-cd1f-5827-172dd4abfa48.png)

|Inspector|コード|
|---|---|
|Left|`offsetMin.x`|
|Right|`-offsetMax.x`|
|Top|`-offsetMax.y`|
|Bottom|`offsetMin.y`|

- anchorMin, anchorMaxのx軸, y軸について、0, 1になっている軸がStretchになる
- offsetMax(Right, Top)はコードとInspectorの符号が反転する

# おまけ
Hierarchyビューで右クリックからStretchなTextを子オブジェクトに作るサンプル

```c#

/// <summary>
/// TextMeshProを子に作成（Stretch）
/// </summary>
[UnityEditor.MenuItem("GameObject/Test/Stretched Text", false, 0)]
public static void CreateStretchText()
{
    var obj = UnityEditor.Selection.activeGameObject;
    if (obj == null)
        return;

    var target = new GameObject("Text (TMP)", typeof(TMPro.TextMeshProUGUI));
    var txt = target.GetComponent<TMPro.TextMeshProUGUI>().text = "New Text";
    target.transform.SetParent(obj.transform);

    // 縦横Stretch
    RectTransform rectTransform = (RectTransform)target.transform;
    rectTransform.anchorMin = new Vector2(0, 0);
    rectTransform.anchorMax = new Vector2(1, 1);

    // 親オブジェクトにStretchするようにサイズを変更
    rectTransform.offsetMin = new Vector2(0, 0);
    rectTransform.offsetMax = new Vector2(0, 0);
}

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/78357e28-c2ba-5bb9-df07-a941304c70c0.png)
ウェット(wet)出身者がバイオインフォマティクス始めました

#まえがき
この記事は著者の初投稿記事になります。
読み苦しい点が沢山あると思いますが、生温い目で見てください。
色んな方の記事などを参考にしつつ、わかりやすくアウトプットしていけたらなと思います。

#記事を書こうと思ったきっかけ
大学時代からずっとウェットで実験しかしてこなかった私ですが、最近仕事の縁もあり、バイオインフォマティクスっぽい業務をやることになりました。ついにDRYとWETの間の大きな溝を少し乗り越えられそうな気がするので、その経験を記録に残しつつ、同じ境遇の人がいたら参考になればと思ったのがきっかけです。
(基本、自己満足になりそうな予感です。)

###こんな人に読んでもらえたら
DRYを始める前の私は、漠然以下のようなことをずーっと思っていましたが同じようなことを思っている人って世の中にたくさんいるんじゃないかなーって思います。

* WET専門だけどDRYの解析もできたらかっこいいなあ
* WETで実験ばかりやっていてスキルが身についているのかなあ
* でもDRYって何からやればいいかわからないなあ
* 参考書とかWEBサービスとか色々スタートしてみて、少しはできるようになったけど、日々の業務のどこに応用したらいいかわからないまま、中途半端なところで終わっちゃったなあ
* 最近データサイエンスとかAIとか流行ってるし、やっていかないと生きていけないのかなあ
等々

筆者は大学からずーっと上記のようなことを悩み続けて、色んなものに手を出しは挫折を繰り返してきました。
(R、python、C++、HTML、CSS、JavaScript、Rubyのすべてに少しずつ手を出して全部で挫折をしています笑)

そんな感じで、同じように漠然とした不安とか似たような挫折とか、WET専門の人(特に生物系の人)には多いかなあと思ったので、少しでも共感できる人がいれば読んでもらえると嬉しいです。

#筆者のやっていること
ゲノミクス周辺の技術を応用して、オンコロジー領域(がん疾患)の製品開発に携わっています。
NGSのデータ解析全般をやっております(正直まだまだできることは限られていますが)。

##ご留意いただきたい点
さんざん偉そうなことを書いてしまいましたが、まだDRYの業務を始めて1年も経っていませんので、インフォマティクス熟練の方からしたら正直何もわかっていないレベルです。今後頑張って一人前のインフォマティシャンを目指していきたいと思いますので、皆様ご指導ご鞭撻のほどよろしくお願いいたします。

#今後こんなことを記事にしていこうかと
私の学んできた過程とかを記事にしていこうかと思いますが、主には以下の内容になるかと思います。
・R解析
・Linuxコマンド
・python
・時々バイオインフォ的なツールの紹介

インフォマティクスについて全く何もわからなかった自分が学習を進めていく際に、率直に感じたことや苦悩を共有しつつ、その経験をできる限り活かしてわかりやすく書いていけたらと思います。

#さいごに
毎週1回くらいは何かアウトプットして更新していきたいと思います。
よろしくお願いします。
[Swift] WKWebViewで他のアプリへのリダイレクトを無効にする方法

#はじめに
WKWebViewでYouTubeなどのリンクをタップした際、対応するアプリが端末上にインストールされている場合はそのアプリにリダイレクトされます。この時、WKWebViewのページは更新されません。

↓↓こんな感じ
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">WKWebViewはそのままだと、他のインストール済みアプリへリダイレクトする<br><br>リダイレクトして欲しくないこともありますよね <a href="https://t.co/B3dCTWf7Y2">pic.twitter.com/B3dCTWf7Y2</a></p>&mdash; M.xcframework (@p_x9) <a href="https://twitter.com/p_x9/status/1375463595094372353?ref_src=twsrc%5Etfw">March 26, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

今回はアプリへのリダイレクトを無効にし、WKWebView内で当該ページを表示させる方法を紹介します。

↓↓実装後はこんな感じ
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">WKWebViewのdelegateで処理を追加すればアプリへのリダイレクトを無効にできるっぽい <a href="https://t.co/Y84ymYb8FW">pic.twitter.com/Y84ymYb8FW</a></p>&mdash; M.xcframework (@p_x9) <a href="https://twitter.com/p_x9/status/1375463898283798536?ref_src=twsrc%5Etfw">March 26, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#実装
`WKNavigationDelegate`で以下のように実装します。

```swift
 func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        if navigationAction.navigationType == .linkActivated {
            decisionHandler(.cancel)
            DispatchQueue.main.async {
                webView.load(navigationAction.request)
            }
        } else {
            decisionHandler(.allow)
        }
 }
```

navigationTypeの`linkActived`はhtmlの`href`属性に設定されたリンクをタップした場合を表しますが、この時リンク先へのナビゲートを無効にすることでアプリへのリダイレクトを行わないようにしています。(アプリへのリダイレクトを伴わないhref属性のリンクも無効になります。)
その上で、リンク先コンテンツをwebviewで表示させたいので`load`メソッドで読み込んで表示させています。

#おわりに
今回も読んで頂きありがとうございました。

#参考
https://stackoverflow.com/questions/58291683/disable-youtube-app-redirect-from-wkwebview-in-swift
xcode で Command CodeSign failed with a nonzero exit code エラーが発生した時に疑うポイント

xcode でコードを書いていて遭遇したエラーと対処法です。

xcode でプログラムをコンパイルして実行する際に、突然、

> Command CodeSign failed with a nonzero exit code

というエラーが発生しました。エラー内容に関わるような作業は思い当たらず、何が起こったかよくわからかったのでググってみたところ、キーチェーンのロックを外すといった手順がヒットしました。

「いやいや、ファイルとフォルダを整理しただけなんだけど！」

という心の抵抗と、そもそもキーチェーンを操作したくなかったので、もう少し検索してみることにしました。

https://stackoverflow.com/questions/52421999/xcode-10-command-codesign-failed-with-a-nonzero-exit-code

最初に表示される Answer では、やっぱりキーチェーンのロック解除手順が挙がってます。

しかし、2つ目の Answer では・・・

> None of the listed solutions worked for me. In another thread it was pointed out that including a folder named "resources" in the project causes this error. After renaming my "resources" folder, the error went away.

えっ！？resources フォルダって、自分で作っちゃいけなかったの？

試しに、先ほど作った resources フォルダを resources2 にリネームしてみたところ、すんなりとコンパイルが通りましたとさ。

もし、同じエラーでお困りの方は、ぜひお試しください。これとは別にキーチェーンがおかしなことになっていたら、その時はキーチェーン対策などをお試しください。
HTTP レスポンスステータスコード

#【HTTP レスポンスステータスコード】

[MDN Web Docs](https://developer.mozilla.org/ja/docs/Web/HTTP/Status) HTTPレスポンスステータスコードをもとに学びました。

HTTPステータスコードを理解することは大事。
　→　Webサイトの構成エラーを診断、修正するための貴重なツール
　→　ステータスコードを理解していれば、エラーを修正する時に予想が立つ。
　→　重要なものだけでも覚えておくと開発の時に役に立つ。

##HTTP レスポンスステータスコード

HTTPにおいてWebサーバからのレスポンスの意味を表現する3桁の数字のコードからなる。
サーバーからのメッセージで特定のページを表示するリクエストを受信したときの状況を知らせる。

##5つのクラスにレスポンスは分類される。

特定のHTTPリクエストが正常に完了したかどうかを示す。

一般的に100番台と200番台は、サイトが正常に機能していることを知らせるもの。
　→　検索エンジンボットが通常通りの仕事をこなす。

基本的に重要なのは400番台と500番台のコード
　→　ボットによるページのクロールとインデックス登録の邪魔をする可能性がある。

###情報レスポンス (100–199)

リクエストは受け取られ、処理は継続される。

###成功レスポンス （200–299）

リクエストは受け取られ、理解され、受理された。

###リダイレクトメッセージ （300–399）

リクエストを完了させるために追加的な処理が必要。

###クライアントエラーレスポンス （400–499）

クライアントからのリクエストに誤りがあった。

###サーバエラーレスポンス （500–599）

サーバがリクエストの処理に失敗した。

##よく使われるステータスコード

2019年、[The Five Most Common HTTP Errors According to Google - Pingdom Royal](https://news.mynavi.jp/article/20190223-775646/)で、よく使われるステータスコードランキングが発表されたそうです。

<strong>・ランキングTOP5</strong>

####500（Internal Server Error）

Webサーバで何らかのエラーが発生したことを汎用的に使用できるエラーコード
最も一般的なエラーとなっている。

####403（Forbidden）

Webサイト上のアクセスが禁止されているディレクトリにアクセスを試みた場合などに発生するエラー
401エラーと似ているものの、ログインの結果表示されるエラーではなく、401エラーとは明確な違いがある

####404（Not Found）

存在しないWebサーバ上のリソースにアクセスしようとした時に発生するエラー
リンク切れやURLのタイプミス、管理者によってページが別の場所に移動させられた場合などに発生する

####400（Bad Request）

Webブラウザが誤ってアクセスした時やリクエストが途中で破棄された時などに表示されるエラー

####401（Unauthorized）

制限付きWebページにアクセスした場合に表示されるエラー
通常はログインに失敗した場合に表示される。

##まとめ

Webブラウザからのリクエストに誤りがあり、レスポンスを返せなかったことを表す400番台が一番使われている。

100番台のステータスコードは情報不足である。
200番台は正常である。
300番台は追加処理が必要である。
400番台はWebブラウザからのリクエストに誤りがある。
500番台はサーバーがリクエストの処理に失敗した状態。
シャノンの悪魔

#1 この記事は

「シャノンの悪魔」の投資方法について説明します。

#2 内容

## 2-1 簡単な例をあげてみます

「シャノンの悪魔」というポートフォリオ理論があります。一言でいうと、株式評価額と現金を常に1:1に保つ(リバランス)するように、株式を売ったり買ったりする手法とのこと。

例えば、下記の図1のように、
・2021/3/25に株価1000円の株を5000円保有し、現金を5000円保有します。
・次の日、2021/3/26終値にて株価が2000円になったので株式評価額は10000円、現金は5000円となります。そこで株式評価額と現金をリバランス(1:1)にするために、株式を2500円売却すると、株式評価額と現金は双方とも7500円になります。
・次の日、2021/3/27終値にて株価が1000円になったので、株式評価額は3750円、現金は7500円になります。そこで株式評価額と現金をリバランス(1:1)するために株式を1875円分購入すると、株式評価額と現金は双方とも5625円となります。
・2021/3/25では、株価1000円に対して株式評価額+現金=10000円でした。2021/3/27においては、株価1000円(3/25と同じ)に対し株式評価額+現金=11250円になっています。
・2021/3/25~2021/3/27において<b>株式を持たず現金のみ保有(なにもしない)の場合に比べ株式評価額+現金は1250円増えています。</b>
・これがシャノンの悪魔という投資方法です。

もちろん、株式は端数(1.5株など)では購入できまでんし、売買手数料もかかるので実際は紹介した例よりは複雑になりますが、説明を簡単にするため、株式を端数で購入できたり、手数料はかからないようにしています。


<b>(図1)シャノンの悪魔投資の具体例</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/ec57af3b-0641-3537-700a-4ef8a470968a.png)




## 2-2 一般化してみると

2-1では具体的な数値を用いて説明してみましたが、ここでは一般的に説明しています。
基準日を2021/3/25とし、基準日にて株式評価額+現金=aとします。また、基準日の株価はsとし、保有株価は基準日からr0,r1,r2,・・の割合で変動するとします。この条件のもと上記(図1)の計算を一般的に記載したのが下記の図2となります。


<b>(図2)シャノンの悪魔投資</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/c9a22d2f-c694-8d71-6f49-338dcbd96f34.png)

上記の(図2)の計算結果より、基準日からn日後の株式評価額＋現金=Pnは下記(1)で記載できることが分かります。

```math
\begin{align}
P_{n} &= \frac{a}{2^n}\prod_{i=0}^{n-1}(r_{i}+1)  \tag{1}   \\
\end{align}
```

よって、基準日からn日後の株式評価額＋現金=Pnが、基準日の「株式評価額＋現金」を超えているための条件は、下記(2)で記載することができる。

```math
\begin{align}
P_{n} &= \frac{a}{2^n}\prod_{i=0}^{n-1}(r_{i}+1)>a     \\
\end{align}
```

つまり、

```math
\begin{align}
\prod_{i=0}^{n-1}(r_{i}+1)>2^{n}   \tag{2}  \\
\end{align}
```
である。

言い換えると、シャノンの悪魔の投資手法によって、利益が出せる条件は、(2)の数式を満足するときであることが分かる。

シャノンの悪魔の投資手法は、定額配分ポートフォリオ戦略の一種ということなんだろうと思う。
スワップ（swap）領域の確保

AWS EC2 の低スペックを使っていると `composer update` でよくメモリ不足に悩まされるので一時的な回避策として スワップ（swap）領域 を作成する。

## 設定

#### 1. メモリの確認

```console:
$ free -m
             total       used       free     shared    buffers     cached
Mem:           959        450        508          0         35        134
-/+ buffers/cache:        280        678
Swap:            0          0          0
```

#### 2. ディスクの空き確認

```console:
$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         470M   68K  470M    1% /dev
tmpfs            480M     0  480M    0% /dev/shm
/dev/nvme0n1p1   7.8G  3.4G  4.3G   45% /
```

#### 3. Swap領域の確保

```console
$ sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile
$ sudo swapon -s
```

#### 4. メモリ および ディスクの確認

```console:
$ free -m
             total       used       free     shared    buffers
・・・　省略　・・・
Swap:         2047          0       2047

$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
・・・　省略　・・・
/dev/nvme0n1p1   7.8G  5.4G  2.3G   71% /
```


#### 5. Composer Update !!

```console:
$ /usr/local/bin/composer update
```

## 後始末

### Swap領域の削除

```console:
$ sudo swapoff /swapfile
$ sudo rm /swapfile
```

## 参考
- [スワップファイルを使用して、Amazon EC2 インスタンスのスワップ領域として機能するようにメモリを割り当てるにはどうすればよいですか?](https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-memory-swap-file/)
python　exeファイル実行時の「Failed to execute script --ファイル名--」エラーについて

##エラー内容

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/998522/6c631c6a-7c95-64d5-9033-7610589228b0.png)
折角つくったプログラムをいよいよ実行しようとしたその時、こんなのが出るとガッカリしますよね。:weary:

私もその一人でございます。
解決方法を色々とググってみましたが、ピンポイントで答えがみつからず、かなり苦労しました。

そこで、ここでは特定の条件下での解決方法ですが、まとめました。:paintbrush:

##前提条件
　■言語
　　python
　■利用ライブラリ
　　selenium

Jupyter Notebook上では動作していたものが、exeファイルにした時に動作しなくなるという状況でした。

##問題となったコーディング部分
下記の部分です。

```python:
from selenium import webdriver
browser = webdriver.Chrome()
```
##解決方法
chromedriver.exe（Google Chromeを起動させるために必要なファイル）のpathを明示したことで解決しました。

```python:
from selenium import webdriver
browser = webdriver.Chrome(executable_path=r'C:\Users\[ユーザ名]\chromedriver.exe')
```
##総括
調査の中で気づいたのですが、当該エラー（Failed to execute script）は大体何かしらのpathが通っていないことが原因のようです。

今回のケースにおいては、おそらくですがJupyter Notebook上でpipコマンドを利用しseleniumをインストールしたため、ソースファイルと同じ階層にchromedriver.exe（Google Chromeを起動させるために必要なファイル）が存在することでパス指定しなくても動作していた。
しかし、exeに変換した場合はpathを明示していないとchromedriver.exeを見つけられず、当該エラーが発生していたと推測しています
【zsh】zinitなるものを使ってみる

初書：2021/03/26

# 前書き

zshで補完機能を入れてみるかあとふと思い立ったので、入れてみることにした。
軽く調べてみると、zinitというものを使用するといいらしい。

# zinitとは

> Zinitは、GitHubや他のサイトからすべてをインストールできる柔軟で高速なZshellプラグインマネージャーです。

[GitHub - zdharma/zinit: Flexible and fast Zsh plugin manager with clean fpath, reports, completion management, Turbo, annexes, services, packages.](https://github.com/zdharma/zinit)より、google翻訳による日本語

つまり、Zshellに入れるプラグイン管理です。homebrewとかphpでいうcomposerとかそんな感じのやつ？

# インストール

公式サイトに書いてあるおすすめのやり方をそのまま実行してみる

```zsh
% sh -c " $（ curl -fsSL https://raw.githubusercontent.com/zdharma/zinit/master/doc/install.sh ） "

# 前略

▓▒░ Would you like to add 4 useful plugins - the most useful annexes (Zinit extensions that add new functions-features to the plugin manager) to the zshrc as well? It will be the following snippet:

# Load a few important annexes, without Turbo
# (this is currently required for annexes)
zinit light-mode for \
    zinit-zsh/z-a-rust \
    zinit-zsh/z-a-as-monitor \
    zinit-zsh/z-a-patch-dl \
    zinit-zsh/z-a-bin-gem-node

-n ▓▒░ Enter y/n and press Return:
```
途中で止まった。これは`.zshrc`に書き込んでもいいか？という内容なのでyにしておく。

インストールが完了したら、ターミナルを再起動する

最初に起動するときは何か色々出てくるが、２回目以降はなさそう。

# zinitを最新の状態にする

```zsh
% zinit self-update
```
これだけ。

# プラグインをインストールしてみる

結構色々な種類があるようなので、今回は最初の目標である補完機能系を入れてみる

## zsh-syntax-highlighting

コマンド入力で、色付けしてくれるプラグイン。不明なコマンドだと赤文字になるため、間違えていることが実行しなくてもわかるようになる。

[GitHub - zsh-users/zsh-syntax-highlighting: Fish shell like syntax highlighting for Zsh.](https://github.com/zsh-users/zsh-syntax-highlighting)

コマンドで入れるのかと思いきやそうではない。
`.zshrc`を直接編集し、以下の１行を入れる

```zsh:.zshrc
zinit light zsh-users/zsh-syntax-highlighting
```

保存したらターミナルを再びリロードする。そうするとダウンロードが入る。

## zsh-autosuggestions

コマンドの予測をして、灰色でお知らせしてくれるプラグイン。
予測通りのコマンドを入力するときは、十字キーの右を押せばそのまま入力される。

これも直接編集で入れる。

```zsh:.zshrc
zinit light zsh-users/zsh-autosuggestions
```

# 終わりに

記述時点では２つしかプラグインを入れていないが、これで今は物足りそう。
もし何か増える予定があれば増やすかも。

# 参考サイト

[zinitでzsh環境をいい感じにしたメモ - Qiita](https://qiita.com/crossroad0201/items/17270127732dc20fa8b2)

# 参考予定サイト

[Zplugin (zinit) を使ってみる - おのかちお's blog](https://blog.katio.net/page/zplugin)
[【zsh高速化】え～、そんなプラグインマネージャーがあるんだったらもっと早く教えてよ、と姉が怒り出した - Zinit (旧名Zplugin) - Qiita](https://qiita.com/9sako6/items/23b164a95b91c644aade)
子供の寝かしつけの自動化

# この記事をお勧めする人




* これから産休/育休を取る方
* お子様（１歳未満）の寝かしつけに困っている方 


# 寝かしつけとは？　最長で３時間・・・ただの苦行

寝かしつけとは、親が赤ちゃんが寝れるように環境を整えてあげることである。
赤ちゃんの特性にもよるが、生まれたばかりの赤ちゃんは自分でなかなか寝付けないこともおおく、
絵本を読んだり、歌を歌ったり、おんぶや抱っこでスクワット（腰や膝がやられる）、腕枕でお腹や背中をリズムよくトントンしたり（手首がやられる）、を毎日、複数回行うこともある行為のことを指す。

寝かしつけは良く育児の中で語られる苦行の一つだが、注目度をインスタグラムの投稿数で、調べてみた。
保育園落ちた日本死ねで有名な保活より1.5万件も多い。
 ![スクリーンショット 2021-03-26 22.01.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164146/44554487-6a60-9e8f-2af7-ea967553d4b2.png)
![スクリーンショット 2021-03-26 22.01.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164146/b755169e-4dcb-dae6-d730-4d8be3cde30d.png)



# 寝かしつけを楽にする、おすすめの方法を紹介


ぜひ紹介したいのは、
 [ジーナ式　カリスマ・ナニーが教える　赤ちゃんとおかあさんの快眠講座　改訂版]
(https://www.amazon.co.jp/dp/B0848LFN7Q/ref=cm_sw_em_r_mt_dp_FP4YKPH1GRC8CXMP8PNF)

海外では、ナニーという、産後、赤ちゃんを集中的に面倒見てくれる職業があるらしく、
そのベテランナニーのジーナさんが経験則から編み出した、情報をまとめてくれている本である。
赤ちゃんが欲しがったらミルクをあげる、という赤ちゃん主導のスケジュールではなく、赤ちゃんの月齢や成長の状況に応じたスケジュールで、赤ちゃんの食事や睡眠など生活リズムを整えていくサポートするのがジーナ式の目的である。

特徴的なところとして２点ある。

### 特徴1.保護者とは別の部屋で寝かす　

赤ちゃんの睡眠の質やSIDS予防も含めて保護者とは別の部屋においてあるベビーベッドで寝かすことを推奨している。
### 特徴2.分刻みのスケジュール

ジーナ式では生後一年間の生活スケジュールが分刻みで紹介されている。
例えば、生まれて一週目のスケジュールのうち、7時から10時までのTODOを抜粋したものである。


| 時間 |TODO |
|:-----------|:------------|
| 午前7時       | 授乳        |
| 午前8時まで     | 自分の朝食を食べ      |
| 午前8時15分       | 赤ちゃんを寝室に連れていきましょう        | 
| 午前8時30分| 赤ちゃんを寝かしましょう          | 
| 午前9時45分 |赤ちゃんが目を覚ますようにカーテンを開けておくるみをほどきましょう       | 
| 午前10時    | 赤ちゃんを完全に起こしましょう     |
　　　
さらに、本には詳しい授乳の仕方なども記載されている。
　　・片方の胸から25-35分授乳した後、もう片方の胸から90ml搾乳して、10-15分授乳、など


# ジーナ式を取り入れたメリット

### 子供がよく寝れてくれるので成長にいい気がする
我が家では子供が１ヶ月を過ぎた頃から徐々に取り入れ、４ヶ月ごろには夜通し寝てくれるようになった。
一歳半になったわが子は、ベビーベッドに入った後は、一人でねんねしてくれます。

### とにかく自分の時間が取れる！

時間は何より大切で、とにかく子供が小さいと睡眠不足になるので、親が寝る時間が確保できるのもありがたい。
時間があると、家事も趣味も、勉強もできる。
* 家事の時間も取れる苦手な英語を中学生の英文法からやり直した結果、TOEICのスコアUP
* 歯列矯正や脱毛をしてQOLが上がった（多分寝かしつけに苦労していたら、歯列矯正や脱毛という新たなストレスを加えようとは思わなかったと思う。）
* 大好きな漫画がいっぱい読める

### 夫婦の時間ができる

　パパママスイッチをOFFにして夫婦としてゆっくり会話する時間が取れた


# ジーナ式を取り入れ方のすすめ
　ジーナ式スケジュールは、かなりタイトなので、真剣にやろうとすると心が折れるはず。
　スケジュールを大まかに捉えてご家庭のスケジュールに落とし込むのが必要
　産後はこの本自体をゆっくり読む時間と気力がないはずなので、産前にパートナーと共に読んでおくことがお勧め。


### ジーナ式導入にあたり買い揃えて良かったもの

1.ベビーカメラ
子供の状況をカメラや音声で確認するために使用。
Amazonで売ってる見守り系の安いカメラで充分だ思う

2.ベビーセンス
それまで、すくすく育っていた赤ちゃんが、ある日突然、眠っている間に亡くなってしまう「乳幼児突然死症候群（SIDS：Sudden Infant Death Syndrome）」という病気がある。 
ベビーセンスとは、センサーが搭載されたパッドと本体（警報装置）がセットになった乳幼児用呼吸モニターで、敷き布団やマットの下に入れたパッドが赤ちゃんの呼吸による動きを検知し、赤ちゃんの動きが20秒間止まる、または1分間に10回以下になるとアラーム音と光で知らせてくれるという仕組み。海外製だが、日本国内の産院でも使われている評判の高い製品。

赤ちゃんが寝ているとき本当に静かすぎて息をしているかどうかも不安で寝れなかったことがあるので、親の快眠のためにもお勧めする。
ただ、赤ちゃんが寝返りなどでたくさん動き出し、センサーの感知しない位置に移動したことによるアラームが多発し、半年ほどで使わなくなった。

3.SwitchBot　温湿度計

ベビーカメラに温湿度計は付属していたが、信用ならない数値を叩き出していたので、
SwitchBotの温湿度計（Bluetooth）を購入し携帯からいつでも見れるようにした。
ウチは、暖房器具としてオイルフリーヒータを導入しており、細かい温度設定が難しかったため。
エアコンある方は必要ないかも。


### 引用


 [子どもの寝かしつけにかかる平均・最長時間はどのくらい? 対応方法は??](https://news.mynavi.jp/article/20170728-a326/)

[乳幼児突然死症候群の予防にも役立つ!? 「ベビーセンス」と「スヌーザ・ヒーロー」に新米ママ、感動！]
(https://kakakumag.com/houseware/?id=12527)
FCMで条件に送信する際に ! を使う。

###したいこと
FCMを送る際に、TopicAに登録されているtoken以外に送信したい。
###方法

```javascript
const condition: string = `!('TopicA' in topics )` 
//CloudFunctionsで送信することを想定
admin.messaging().sendToCondition(condition, message)
            .then((res) => {
                console.log(res)
            })
            .catch((err) => {
                console.error(err)
            })

```
で終わり。


これを使うことでブロックしているユーザーには通知が行かないということが実現できる。

###すぐ終わった内容をわざわざ書いた理由
Firebaseの[公式ドキュメント](https://firebase.google.com/docs/cloud-messaging/send-message?hl=ja#send-messages-to-topics)では &&、|| についてしか書かれていなかったから。
>条件式には最大 5 つのトピックを含めることができ、かっこを使用できます。 サポートされる演算子: &&、||。


[StackOverflowの質問](https://stackoverflow.com/questions/39276514/negation-in-condition-while-sending-fcm-message#answer-49313228)によると2018年3月16日時点では書かれてあったらしい。
ということでもしかしたらいつか無効になるかもしれない。
エンベデッドシステムスペシャリストってなんぞや？

## エンベデッドシステムスペシャリスト
エンベデッドシステムスペシャリスト試験（ - しけん、Embedded Systems Specialist Examination、略号ES）は、情報処理技術者試験の一区分である。試験制度のスキルレベル4（スキルレベルは1～4が設定されている。）に相当し、高度情報処理技術者試験に含まれる。対象者像は「組み込みシステム開発に関係する広い知識や技能を活用し、最適な組み込みシステム開発基盤の構築や組み込みシステムの設計・構築・製造を主導的に行う者」。

## エンベデッドシステムスペシャリストの取得メリット

#### 将来性が高い
エンベデッドシステムスペシャリストは将来性が高い資格です。

昨今、モノとインターネットがつながる『IoT化』が進んでいます。様々な電化製品や自動車などにもIT関連機器が取り入れられ、今後はさらにIoT化が進むでしょう。

そのような状況で、システムを組み込むエンジニアが多く必要とされています。特に、エンベデッドシステムスペシャリストのように専門知識を身につけているエンジニアは重宝されるのです。

世間を取り巻く環境と業界の現状を考えると、エンベデッドシステムスペシャリストの将来性は期待できるでしょう。

#### 転職、案件確保で優遇されやすい

エンベデッドシステムスペシャリストはハードウェアにソフトウェアを組み込む専門家です。自動車や家電などのものづくりメーカーやそれらに関連するシステムインテグレーター（SI）、産業機械メーカーなど、幅広い分野で活躍できる可能性があります。

また、近年はAI（人工知能）が各分野へ展開されています。AIロボットを制御するにはソフトウェアとハードウェアにまたがる知識が要求されます。

活躍できる範囲が広いエンベデッドスペシャリストは転職にも有利です。フリーランスとして活動するにしても、有資格者は知識と技術を証明できるため、案件の確保がしやすくなるでしょう。


#### 仕事の質を上げることにもつながる
エンベデッドシステムスペシャリスト資格の取得は、仕事の質を上げることにもつながります。

もともとエンジニアとして活躍していても、試験勉強をこなすことで知識が増え、ハードウェアを意識した開発の幅が広がるでしょう。

最近はPCの性能が向上し、クラウドシステムが積極的に導入されています。ソフトウェア系の技術者でも、今後はハードウェアにアウトプットするための仕様が要求される可能性もあります。

試験の合否も重要ですが、試験勉強をすることで領域を超えた知識を習得することで、結果的に仕事の質の向上につながると言えるでしょう。

## エンベデッドシステムスペシャリストの一部免除について[(公式ページからチェック)](https://www.jitec.ipa.go.jp/1_00topic/koudo_menjo.html)

**【情報処理技術者試験の高度試験、情報処理安全確保支援士試験の一部免除対象となる条件（いずれか一つでも満たせばOK）】
①応用情報技術者試験（AP）に合格
②情報処理技術者試験の高度試験、情報処理安全確保支援士試験のいずれかに合格
③情報処理技術者試験の高度試験、情報処理安全確保支援士試験の午前Ⅰ試験で基準点以上の成績をとる**


## まとめ
エンベデッドシステムスペシャリストは、ソフトウェアとハードウェアの両方に関する高度な知識が求められます。

ES試験を受けて、合格することで知識やスキルの証明が可能です。有資格者となれば、転職や案件獲得にも有利になります。試験は毎年1回、4月の第3日曜に実施されます。年に1度の機会になるので、試験勉強は計画的に行いましょう。

午後I試験には免除制度があります。先に他の情報処理技術者試験を受けて合格をするのも中間目標として有効です。各種参考書や公式HPの過去問を活用して、試験に向けて対策しましょう。

「Offers」は、時代の変化や環境にあわせてスキルを磨きたい、そんな人にぴったりのサービスです。

いくつもの転職媒体を使って、企業を探し回るのはもう終わり。「副業」から始まる新しい働き方を実現します！

本業では経験できない、新しい環境/開発スタイルを経験しよう！
(iOS Objective-C) ViewControllerのインスタンス変数にself.propでアクセス時に「Property not found on object of type ViewController」と出る


## ■問題：ViewControllerのインスタンス変数にself.propでアクセス時に「Property not found on object of type ViewController」と出る
下記のリンクと同じような状況で、ViewControllerのインスタンス変数にself.propでアクセス時に「Property not found on object of type ViewController」と出る状況でした。

https://stackoverflow.com/questions/22882345/ios-property-not-found-on-object-of-type-viewcontroller

```objc
@interface ViewController() {
    AVPlayer *player;
}
@end

@implementation ViewController
- (void) viwDidLoad {
    self.player = [AVPlayer alloc];  // エラー発生
}
```

## ■解決法：property の宣言方法

https://stackoverflow.com/questions/22882345/ios-property-not-found-on-object-of-type-viewcontroller

リンクを参考にして、`@property (nonatomic, assign) ` を使用するとエラーが消えました。

```objc
@interface ViewController();

@property (nonatomic, assign) AVPlayer *player;

@end

@implementation ViewController
- (void) viwDidLoad {
    self.player = [AVPlayer alloc];  // ビルドが通る
}
```

以上です。
zipと*で２次元配列の行と列を変換

leetcodeを解く時に、２次元配列の各列の値をlistにまとめたかったので、
調べてみました。

## 実例
例えば２次元配列 two_dimentional_array = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
が定義されている時、ゴールが[(1, 4, 7) (2, 5, 8) (3, 6, 9)]だとします。

```python
result = [i for i in zip(*two_dimentional_array)]
```

とすると結果は

```python
print(result)
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
```
になりました。

## *によるlistの展開とzipによる
*two_dimentional_arrayをピックアップしますと、*によって2次元配列が1次元配列に展開されます。

```python
print(*two_dimentional_array)
[1, 2, 3] [4, 5, 6] [7, 8, 9]
```

## zip関数によって、それぞれ展開されたリストをタプルにまとめる。
zip関数の引数に展開した３つのリストをそれぞれパラメータとして設定します。
上記のlistの要素をindexが0から同時に取得していき、タプルでまとめたzipオブジェクト（イテレータ)が
返却されます。

```python
i = zip(*tow_dimentional_array)
print(i)
<zip object at 0x7f241aa13300>
```

i(イテレータ)をfor文で回していくことで、行と列が変換されるタプルが返却され、
上述のようにリスト内包表記でlistで取得しました。
スーパー便利！nvmを使ってwindowsでNodeのバージョン管理を１秒で行う方法

皆さんこんちは！

ふと``npm i --save firebase``を実行したところ、今までは出来ていたのですが急にエラーが出てインストールが出来なくなりました。

どうやらNodeのバージョンが原因らしい。

```
node --version

v14.15.1
```

Firebaseがリクエストするバージョンは``12``である。

Nodeを再インストールしても良いのですが、またNodeの依存関係が出てきたとき面倒くさいので色々調べていたところ**nvm**と言うものに出会いました。

これはNodeのバージョン管理を行うパッケージです。

コマンドも例えば``nvm use 12``と打てばNodeのバージョンが１２の状態で実行されます。

早速インストールしましょう！

#scoopの導入#

Windowsではパッケージのバージョン管理を行う場合、「scoop」を使います。

Macで言うHomebrewみたいなものです。

まずはscoopをインストールしましょう。

<font color="red">※注意 scoopをインストールするには「PowerShell」を「管理者として実行」でコマンドを実行してください</font>

```powershell
Set-ExecutionPolicy RemoteSigned -scope CurrentUser
// 実行ポリシーの変更について聞かれるので「Y」を選択
iex (new-object net.webclient).downloadstring('https://get.scoop.sh')
```

また、scoopについて知りたい方は[こちら](https://qiita.com/akki-memo/items/44108e470c714cf7b7a4)の記事でも書いているので是非ご覧ください！

#nodeのインストール#

nvm、nodeのインストール

```powershell
scoop nvm

nvm install 12
```

nvmの環境変数を設定

```powershell
$ENV:Path="C:\Users\ご自身の名前\scoop\apps\nvm\current;"+$ENV:Path
```

バージョンが返ってくればOK！

```powershell
nvm version

1.1.7
```

後は使いたいときに下記のようにバージョンを指定。

```powershell
nvm use 12
```

``nvm``コマンドは環境変数を通したので、コマンドプロンプトで実行してもOK！

このようにしてNodeのバージョン再インストールをしなくてもバージョン管理を行うことができます！

以上、「スーパー便利！nvmを使ってwindowsでNodeのバージョン管理を１秒で行う方法」でした！

Thank you for reading
(徒然に)量子回路学習の所感

# この記事の立ち位置

- 量子回路学習をやってみて、所感です。
- 正確性は保証できないよ。

量子回路学習については、
https://dojo.qulacs.org/ja/latest/notebooks/5.2_Quantum_Circuit_Learning.html

## 量子回路学習

量子回路学習は、NISQ(Noisy Intermediate Scale Quantum)、すなわち近未来の雑音あり量子コンピューターで
動くことを目指した量子機械学習アルゴリズムです。

量子回路学習では、機械学習させるモデルとして量子ゲート回路を用います。
量子ゲート回路の各素子（量子ゲート）は、パラメータを持っており、このパラメータを学習させることで
望む出力を吐き出す量子ゲート回路を生成します。
例えば、量子状態に回転操作をするゲートは、回転角度がパラメータとなります。
学習には、勾配情報を必要としない最適化アルゴリズムを用いることが多い？ようですが、
勾配を効率的に計算する方法も知られており、そちらを使うことも可能（なはず）です。

- ざっくりいえば、パラメータをシフトさせた量子ゲート回路との差分（数値微分）を見ることで勾配がわかるという方法です。

 
### 量子回路学習における古典データ埋め込み

多くの量子機械学習アルゴリズムでは、古典データが理想的な形で量子状態に埋め込めることを
出発点とします。
例えば、量子状態の確率振幅に古典複素数データを埋め込めることを前提とします。
これを振幅エンコーディングといいます。
しかし振幅エンコーディングは、現在の量子コンピューターでは実行が難しいほど長いゲート回路を
必要としてしまいます。[^1]
https://qiita.com/notori48/items/383015c6529e8fae4e64


量子回路学習はNISQを対象としますので、振幅エンコーディングを回避する必要があります。
そこで、

- 古典データを$x$としたときに、$x$で決まる何らかの(1量子ビット)ゲート操作$U(x)$を行う

という方法で、「埋め込み」としています。
本当は振幅エンコーディングで$x$を量子状態の振幅にそのまま埋め込みたいのですが、それが難しいので、
$x$に依存した何かの値ならいいだろうということになっています。[^2]

###　量子回路学習におけるデータ埋め込みの問題

量子回路学習は確かに雑音下でも学習が進むという意味で画期的です。
しかし、問題もあります。
古典データ$x$が次元$N$のベクトルであったとします。
量子状態は、$n$qubitあれば$2^{n}$個の確率振幅を持ちます。
なので、理想的には$\log_{2}(N)$個のqubitがあれば、次元$N$の古典データを確率振幅に埋め込めます。

しかし量子回路学習の埋め込み方法では、$N$個の古典データを埋め込むには$N$qubitが必要です。
1量子ビット目に$U(x_{1})$を作用させ、2量子ビット目には$U(x_{2})$を作用させ・・・　という操作になるからです。

なので、入力データの次元が10, 20ぐらいになると、シミュレーターではなかなか計算できない計算量になります。
なぜならば、$K$qubitのシミュレーションには$2^{K} \times 2^{K}$の行列計算を何度も繰り返す必要があるためです。[^3]
シミュレーションができないと、なかなか作業が進みません。。

古典ニューラルネットワークでは、入力データの次元が$10^{1}$ではへっちゃらだと思いますので、
これは大きなディスアドバンテージです。

#まとめ

アルゴリズムの計算部分だけではなく、データの埋め込みにも注目することが大事。


[^1]: もちろんデータ次元が小さかったり、データが特別な構造を保つ場合は埋め込めますが、一般には難しいです。
[^2]: 実際にはここまでやっつけ仕事ではないですが・・・。論文参照。
[^3]: もちろん、実機ではこの計算が”量子アナログ計算”として半ば自動的に1 stepで終わりますので、問題になりません。