OmniAICreator/Qiita-1.07M huggingface dataset:
doctoc コマンドで Markdown に目次を作成する

doctocとは、markdownファイルの目次を自動的に生成するCLIです。
Node.jsで記載されています。

https://github.com/thlorenz/doctoc

## インストール

npmでインストールする場合

```bash
npm install -g doctoc
```

## 使い方

### Sample

```doctoc.md
# doctoc test

## test1

### test1-1

### test1-2

#### test1-2-1

## test2

### test2-1

```

上記の`doctoc.md`に以下のコマンドで目次を作成します。

```bash
$ doctoc doctoc.md

DocToccing single file "doctoc.md" for github.com.

==================

"doctoc.md" will be updated

Everything is OK.
```

`Everything is OK.`と出力されると、ファイルに目次が追記されています。

```markdown:doctoc.md
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
**Table of Contents**  *generated with [DocToc](https://github.com/thlorenz/doctoc)*

- [doctoc test](#doctoc-test)
  - [test1](#test1)
    - [test1-1](#test1-1)
    - [test1-2](#test1-2)
      - [test1-2-1](#test1-2-1)
  - [test2](#test2)
    - [test2-1](#test2-1)

<!-- END doctoc generated TOC please keep comment here to allow auto update -->

# doctoc test

## test1

### test1-1

### test1-2

#### test1-2-1

## test2

### test2-1
```

`<!-- START doctoc generated TOC please keep comment here to allow auto update -->`から
`<!-- END doctoc generated TOC please keep comment here to allow auto update -->`までが
doctocによって自動的に追加された目次になります。

2行目に警告が記載されてますが、**doctocで追記された部分は編集しないように**してください。

markdownの内容を更新して、doctocを再実行したときにうまく作成されない恐れがあります。

### オプションについて

よく使うのは以下のオプションです。

| オプション                      | 内容                                                  |
| ---------------------------- | ----------------------------------------------------- |
| `[--notitle, --title title]` | `**Table of Contents**`の行の有無、もしくは名前の指定 |
| `[--maxlevel level]`         | 追記する目次の深さ                                    |
| `[-s, --stdout]`              | 作成時のコマンド出力に目次を表示する                          |

使用するサイトの markdown 形式に合わせたオプションを使用することができます。

```txt
--bitbucket bitbucket.org
--nodejs    nodejs.org
--github    github.com
--gitlab    gitlab.com
--ghost     ghost.org
```

### 特定ファイルをSkipしたい場合

公式サイトによると markdown ファイルの先頭に`<!-- DOCTOC SKIP -->`と記載します。

```markdown:skip.md
<!-- DOCTOC SKIP -->
# doctoc test

## test1

### test1-1

### test1-2

#### test1-2-1

## test2

### test2-1

```

次に以下のコマンドを実行します。`ack` コマンドをインストールする必要があります。

```bash
ack -L 'DOCTOC SKIP' | xargs doctoc
```

単純に、`DOCTOC SKIP` という文字列が入っていないファイルに対して目次を作成しているだけの動作になります。
[Python] bit全探索 ZONE2021

#[ZONE2021C](https://atcoder.jp/contests/zone2021/tasks/zone2021_c)

チームメンバーの選び方を全探索すると、選び方が最大で $4.5×10^9$ 個になるため TLE してしまいます。

最大値の最小値のような形の問題では、答えを二分探索し、「答えが x 以上になるか？」という判定問題に持ち込むと簡単になることがあります。
この判定問題について考えましょう。

各能力値は、x 以上かどうかにしか興味がないので、x 以上なら1 、x 未満なら 0 とデータ圧縮することができます。すると、能力値の組としてあり得るものが $2^5=32$ 種類しかなくなるので、重複を取り除いた後 3 人の選び方を全探索することができます。

計算量は、能力値の種類を M 、採用する人数を K 、二分探索の上限を X として、$O((NM+2^{MK})logX)$ です。

個人的には、解法の方向性までは検討が付いたのだが、実装は歯が立たなかった。C問題としてはちょっと難しすぎる気がするが・・・。

```python:サンプルコード
N = int(input())
A = [tuple(map(int, input().split())) for i in range(N)]

# x以上check
def check(x):
    s = set()
    for a in A:
        # x以上なら1を記録
        s.add(sum(1 << i for i in range(5) if a[i] >= x))
    for x in s:
        for y in s:
            for z in s:
                # 11111と等しいか、つまり各能力値がx以上か
                if x | y | z == 31:
                    return True
    return False

# 二分探索
ok = 0
ng = 10**9 + 1
while ng - ok > 1:
    cen = (ok + ng) // 2
    if check(cen):
        ok = cen
    else:
        ng = cen
print(ok)

```
InsomniaでGithubのGraphqlAPIを叩いてみる

# InsomniaでGithubのGraphqlAPIを叩いてみる



## 前提

- macOS Big Sur 11.1
- Insomnia 2021.3.0



## 手順

- [Githubドキュメント](https://docs.github.com/en/graphql/guides/using-the-explorer)と[Insomniaドキュメント](https://support.insomnia.rest/article/176-graphql-queries)通りに進めるよ
- アクセストークンの作成
  - GitHub > Settings > Developer settings > Personal access tokens から作成
    - プライベートリポジトリへのアクセスには、`[ ]repo Full control of private repositories`をチェックする

![スクリーンショット 2021-05-05 9.12.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267662/d981b4c9-88c6-1897-de79-94677468b123.png)



- Insomniaを起動し、+New Requestを開く

![スクリーンショット 2021-05-05 9.17.47-0173870.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267662/6970973e-8ecf-ffca-9fa2-2c4cead0fd2c.png)


- Request内容を決定する
  - Nameは任意
  - MethodはPOST
  - ボディはGraphQL

![スクリーンショット 2021-05-05 9.19.57-0174177.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267662/8e5defb2-3922-f509-62f6-85ba5264bdce.png)


- キーに`Authorization`、値に`Bearer <作成したトークン>`を設定
  - この場合、環境変数に`access_token`設定済み
- `GraphQL Endpoint`に`https://api.github.com/graphql`を入力
  - この場合、環境変数に`base_url`設定済み

![スクリーンショット 2021-05-05 9.36.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267662/935d0fac-6a13-0424-f875-e6475d02616f.png)


- queryを設定する

```
query {
  viewer {
    login
  }
}
```

![スクリーンショット 2021-05-05 9.36.44-0175007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267662/e990c61a-abf9-1afd-2a2b-b067a8706dbc.png)


- Sendを押すとレスポンスが返ってくる

![スクリーンショット 2021-05-05 9.37.15-0175038.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267662/33853a0f-063d-de9b-18e5-978d890baa99.png)


- 最近作成したリポジトリは？というqueryだとこういうレスポンス

```
query($number_of_repos:Int!){
  viewer {
    name
     repositories(last: $number_of_repos) {
       nodes {
         name
       }
     }
   }
}
```

- query variablesはこうする
  - 10個

```
{
	"number_of_repos": 10
}
```

![スクリーンショット 2021-05-05 9.44.51-0175583.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267662/8e245259-d864-5c90-8ecb-2054409d3019.png)


## 補足

- 環境変数はここで設定するよ
    - フィールドに `base`と入力すると、候補が表示されるので選択する

![スクリーンショット 2021-05-05 9.24.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267662/289a9b43-d886-cbb2-6e5f-094731629693.png)

![スクリーンショット 2021-05-05 9.25.07-0174342.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267662/376ef835-af44-26d9-c705-38d7b28227be.png)
yahoo_finance_api2で株価を取得し、グラフに描いて、保存する

yahoo_finance_api2で株価を取得し、グラフに描いて、保存するコードです
参考にさせていただいたページ
https://myfrankblog.com/stock_price_with_yahoo_finance_api2/


```python
import matplotlib.pyplot as plt
import japanize_matplotlib
%matplotlib inline
import pandas as pd
pd.core.common.is_list_like = pd.api.types.is_list_like
import sys
from yahoo_finance_api2 import share
from yahoo_finance_api2.exceptions import YahooFinanceError
```


```python
#銘柄コード ひとまずテレビ朝日の9409を入れてみた
company_code = 9409
#銘柄コードに.Tをつける
company_code = str(company_code) + ".T"
my_share=share.Share(company_code)
finance_data=None

#株価を取得
try:
    symbol_data=my_share.get_historical(
        #週足
        share.PERIOD_TYPE_WEEK,30,
        #1日ごと
        share.FREQUENCY_TYPE_DAY,1)
except YahooFinanceError as e:
    print(e.message)

#データフレーム形式に変換してdfに格納する
df=pd.DataFrame(symbol_data)

#timestampはマイクロ秒まで含んだ時間になっている
#       timestamp    open    high     low   close  volume
#0  1602028800000  1691.0  1692.0  1671.0  1680.0  111000

```


```python
#タイムスタンプを整形する
#dfのtimestamp列をdatetime形式に変換する
df['datetime']=pd.to_datetime(df['timestamp'],unit='ms')

#1602028800000 →　2020-10-07

```


```python
#横軸をdatetime、縦軸close(終値)でプロットしてみる
plt.plot(df["datetime"],df["close"],label='Close',color='#99b898')
plt.title('テレビ朝日')
#プロットしたグラフを保存する
#保存するファイル名はkabuka.jpg
plt.savefig('kabuka.jpg')
plt.show()
```
![output_4_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315540/a4d93c91-96aa-0e2a-8c05-f735e2cb77b5.png)
【AWS】PuTTyを使ってEC2に接続する方法 no.9

![AWS (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/470efe8f-e68a-08b6-a270-de228d53309e.png)


こんにちは、まゆみです。

AWSについての記事をシリーズで書いています。

今回は第9回目になります。

[第7回目の記事](https://qiita.com/Mayumi_Pythonista/items/6913fa857f5b75d3db8e#ec2%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%82%92%E5%AE%9F%E9%9A%9B%E3%81%AB%E4%BD%9C%E3%82%8B)では、実際にEC2インスタンスを作る方法を解説させていただきました。

今回の記事では、そのEC2インスタンス(Linux)に接続する方法を解説していこうと思います

ではさっそく始めていきますね。

![2021-05-05_8-10-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/255470b2-2026-8d9a-48d7-164ce54d4a76.png)

>注意
EC2インスタンスを作る際、AMI(普段のパソコンで言えばOSのようなもの)に<font color="Red">Linuxを選択したインスタンスへの接続方法</font>を書いています。Windowsを選んだインスタンスではこの記事の内容は適応できませんので注意です。

#EC2(Linuxインスタンス)接続方法、早見表

| |SSH  |Putty  |EC2 Instance Connect|
|---|---|---|---|
|Mac |OK  |  |OK|
|Linux |OK   | |OK|
|Windows(10以前)  |  |OK  |OK |
|Windows(10以降)  |OK  |OK  |OK|


#PuTTyを使った接続方法

![本文を追加 (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/a9239c02-c080-6e10-fc8a-d9c2da241602.png)


上記の早見表のようにEC2インスタンス(Linux)に接続する方法はいくつかあるのですが、今回はPuTTyを使った接続方法に的を絞って解説してきます

PuTTyを使ってインスタンスに接続するには

>①PuTTygen を使って、pemファイルをppkファイルに変更する
>②ppkファイルのプライベートキーを使ってSSHで接続する

##PuTTyのインストール

PuTTyをインストールしていない方は、[こちらから](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html)どうぞ

下記のようなページにアクセスできますので、赤で囲んだところから選択してクリックして、そのまま『Next』をクリックし続けて、インストールを終えてくださいね。

##PuTTygenを起動させる
![2021-05-05_8-40-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/e4fa9cdf-5377-e765-9156-f11bb0b8dc8d.png)

Windowsのスタートメニューに『putty』と入力すると、PuTTygenというのが表示されるので、それをクリックして起動させます

Loadをクリックする
![2021-05-05_8-43-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/2910e95e-422e-b663-263b-e83092e8623b.png)

>①All Files に変え
　
>②pkkファイルに変更したいpemファイルを選択します

![2021-05-05_8-44-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/ecc5168a-d5a6-e5ac-54aa-d3c07efaa601.png)

Save Private Key をクリックします

![2021-05-05_8-48-42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/be48662c-029c-9bcf-46bd-f427c54adc1f.png)

ppkファイルとして保存し、PuTTygen を閉じます

![2021-05-05_8-52-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/92452dc5-4aa7-53bb-dd02-8ac8eeb40671.png)

##PuTTyを起動させる

PuTTy　Configuration の

Connection > SSH > Auth をクリックし、先ほど作ったppkファイルを探します


![2021-05-05_8-56-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/257bcd67-c484-dcc2-76ab-bd924089d951.png)


>①Session をクリックして

>②『ec2-user@』の後にパブリックIPアドレスを入力し

>③Open をクリックします

![2021-05-05_9-02-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/f67cbb97-ee74-064c-ca32-7ba76f68de66.png)


下記のようになれば、成功しています


![2021-05-05_9-10-51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/a84540a5-6f64-eca8-5873-4c10f615768a.png)


#まとめ

今回の記事は以上で締めくくります。

インスタンスのOSや、あなたの使っているOSによってEC2インスタンスへの接続方法も変わってきますので、そこを注意深く見ながらAWSの情報を集めてみてくださいね。
Pythonによる拡散方程式の数値計算

下記の拡散方程式をPythonで数値計算します．

$$ 
\cfrac{\partial f}{\partial t} = D \cfrac{\partial^2 f}{\partial x^2}
\tag{1}
$$

ここで, $f$は拡散する量，$x$は流下方向，$t$は時間, $D$は拡散係数です．
$x$軸方向に$\Delta x$で区切って上流から下流に向かって$1,2,3,....,n_x$と番号をつけ，ある時刻$t$における$i$番目の$f$の値を$f(i,j)$とします．
ただし，$j$は時間方向の番号で, 時刻が$t$のときは$j$, $t+\Delta t$の時は$j+1$となります．

拡散方程式直観的に中央差分が最適で，差分式は次式で表わされます.
$$
f(i,j+1)=f(i,j)+\cfrac{D \Delta t}{{\Delta x}^2}
\left[ f(i+1,j)-2f(i,j)+f(i-1,j) \right] \tag{2}
$$


ただ，(2)式のような差分式にすると$(i,j)$の2次元配列になり，特に$j$方向の配列が$\Delta t$毎に必要になるので，使用するメモリーがどんどん大きくなってしまいます．
そこで，メモリー節約のために，時間方向$j$方向の古い値は直前のもの以外は必要ないのでどんどん捨てて行く方式を採用し，下記の差分式とします．

$$
f_{new}(i+1)=f_{old}(i)+\cfrac{D \Delta t}{{\Delta x}^2}
\left[ f_{old}(i+1)-2f_{old}(i)+f_{old}(i-1) \right] \tag{3}
$$

この(3)式を$i=1 \sim n_x$で計算し，その後に

$$
f_{old}(i)=f_{new}(i) \tag{4}
$$

を$i=1 \sim n_x $で計算し，(3)式と(4)式を計算後に時刻を$\Delta t$だけ進めていくと，1次元のメモリーで時間発展の計算をどんどん進めることが可能となります．

ではこれをPythonで計算してみましょう．
初期条件は以前にやった移流方程式の時と同じく三角形分布としますが，拡散方程式の場合は影響が上流・下流の両方に及ぶので，初期三角形分布の頂点は対象領域の中央に置きます．また，拡散係数は任意に与えることが可能ですが，この例では$D=0.01$とします．

```
# coding: shift_jis

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from matplotlib.animation import PillowWriter
from matplotlib._version import get_versions as mplv
from scipy.stats import gaussian_kde

fig=plt.figure()

xl=100; nx=201; d=0.01
xb=5;xp=50;fp=0.5
etime=1000;dt=5

x=np.linspace(0,xl,nx)
dx=x[2]-x[1]
f=[0]*nx; fn=[0]*nx
ims=[]

for i in range(0,nx):
    if(x[i]>=(xp-xb) and x[i]<=xp):
        f[i]=fp/xb*(x[i]-xp+xb)
    elif(x[i]>xp and x[i]<(xp+xb)):
        f[i]=fp/xb*(xp+xb-x[i])
    else:
        f[i]=0

im=plt.title("Diffusion")
im=plt.xlabel("x")
im=plt.ylabel("f")

time=0
while(time<=etime):
    for i in range(1,nx-1):
        fn[i]=f[i]+d*(f[i+1]-2*f[i]+f[i-1])*dt/dx**2

    f=fn
    time=time+dt
    im=plt.plot(x,f,'r');
    ims.append(im)

ani = animation.ArtistAnimation(fig, ims, interval=10)
#plt.show()
ani.save('diffusion.gif',writer='imagemagick')
#ani.save('diffusion.mp4',writer='ffmpeg')


```

このコードを実行すると出来るgifアニメはこちらです．
https://i-ric.org/yasu/qiita/diffusion.gif"
Vue.jsを理解するために

＃概要
Vueの構成要素を理解するためにVueの構成要素とディレクティブ、算出プロパティ、メソッドについてわかりやすく記載しました。

#Vue.jsの構成
基本的な、Vue.jsの構成についての復習です。

```main.js
let app = new Vue({
  el:'#app',
  data:{
    message:'こんにちわ！'
  }
});
```

1,インスタンス化

```main.js
let app =new Vue
```
Vue.jsを起動するためには、Vueクラスをインスタンス化する必要があります。
letで宣言していますが、生成したインスタンスを後から参照する必要がなければ必要ありません。

2,動作オプション
Vue(オプション)動作オプション
HTMLから参照できる値を格納オブジェクトです。プロパティ名:値とします。
el:Vueの適用要素
data:データオブジェクト
message:dataオブジェクトのmessageプロパティです。データは上記ではこんにちわです。

#HTMLの構成

```index.html
<div id="app">
  <h1>{{ message }}</h1>
</div>
```

id属性▶Vueの適用範囲です。
{{}}▶マスタッシュ構文。テンプレートからデータオブジェクトをにアクセスします。複雑な条件分岐などは出来ません。

#Vuejsを理解するために

#①ディレクティブ
イベントを表します。[v-]から始まります。

マスタッシュ構文は式の値を埋め込むことが出来ません。
そこで、属性値の操作はv-bindを使用します。

```main.js
data:{
  url:'https://qiita.com/akari_0618/items/5a9e9d565b47c5de2e4d'
}
```

データオブジェクトにurlプロパティを追加します。

```index.html
<div id="app">
  <a v-bind:href="url">GO</a>
</div>
```
v-bind:属性名=値　ディレクティブ名と属性名はコロンで区切ります。
コロンの後方はディレクティブの引数です。

#②ブール属性
属性名を指定するだけで意味がある属性のことを論理属性またはブール属性といいます。これらの値を紐付けるためにはtrue,falseで表します。

```index.html
<input type="button" value="クリック" v-bind:disabled="flag">
```

```main.js
flag:false
```

#③算出プロパティ

算出プロパティとは、既存のプロパティを演算した結果を取得するためです。
算出プロパティの元では、[this.プロパティ名]でアクセスすることができます。
定義側はメソッドですが、参照はプロパティです。

```index.html
<p>{{loEmail}}</p>
```

```main.js
data:{
  email:'suzuki-r.e @ddddd.ne.jp'
},
computed:{
  loEmail:function(){
  return this.email.split('@')[0].toLowerCase();
  }
}
```

*split(r)
正規表現が一致する場所で文字列を分割して配列にします。

#④メソッド

上記の算出プロパティはメソッドでも表すことが出来ます。
ただし、methodで表した場合は

```index.html
<p>{{loEmail()}}</p>
```
プロパティでは無いため、()で呼び出します。
methodとは、Vue内で扱える機能を定義する場所です。
他の関数から呼び出したり、HTML内で呼び出すことが出来ます。
line-height

■　line - height とは

行の高さを指定するプロパティを指します。

簡単に説明をすると文字の大きさは変わりません。　ですが、ノートで言うA行のノートからB行のノートに変わったと思ってもらえればいいと思います。

こちらがイメージ図です⬇️

https://gyazo.com/d1fa3445a7b2556b0f8cabe5f02a1b99


■　記述の仕方:writing_hand_tone3:

 line-height: 20px,


■　おまけ

上下中央揃えにしたいときは line-height を使う事もできます！



投稿は以上です！
数理計画～半正定値計画をPythonで実装～

# 0. はじめに
「21世紀の線形計画」といわれる半正定値計画(SDP)を実装し理解を深めようと思います。多くの教科書では半正定値計画の理論的なところを触れているので、実装例を備忘録の連載という形で書いていきます。21世紀の皆様に少しでもお役に立てれば幸いです。

# 1.半正定値計画

　半正定値計画は次の標準式で記述される。

```math
\begin{eqnarray}
\min &  & C \bullet X\\

s.t. &  & \ \ A_{i}\bullet X = b_{i}\ \ \ (i=1,2,...,m)\\
     &  & \ \ X\succeq 0
\end{eqnarray}
\tag{1}
```

　半正定値計画は様々な数値解法が提案されているが、本記事では主双対内点法に焦点を当てる。線形計画の主双対内点法とは異なり、半正定値計画の主双対内点法では相補性条件に対して設計の自由度がある。
　探索方向としてHRVW/KSH/M方向や NT方向あるいは AHO方向など提案されている。これらの探索方向は、MZ方向族として統一的にまとめられている。本記事ではAHO方向のみ取り扱い実装例を紹介する。


|数値解法|スケーリング方向|詳細|
|---|---|---|
|主双対内点法||XZ method|
|主双対内点法|MZ方向族|XZ+ZX method(AHO方向)|
|主双対内点法|MZ方向族|HRVW/KSH/M方向|
|主双対内点法|MZ方向族|NT方向|

参照

- [半正定値計画問題に対する主双対内点法](http://www.me.titech.ac.jp/~nakata/SDP_IPM/SDP_IPM.html)
- F. Alizadeh, J.-P. A. Haeberly and M. L. Overton, Primal-dual interior-point methods for semidefinite programming: Convergence rates, stability and numerical results, SIAM Journal on Optimization 8 (1998) 746-768.
- [On the Kronecker](https://www.math.uwaterloo.ca/~hwolkowi/henry/reports/kronthesisschaecke04.pdf)

# 2.実装

半正定値計画のAHO方向による主双対パス追跡法のコードを下記に置きます。よかったら参照ください。

https://github.com/Hideki105/semidefinite_programming

半正定値計画の適用例は下記の記事を参考にしました。

参照

- [Python による数理最適化モデリングツール CVXPY の初歩](https://mirucacule.hatenablog.com/entry/2019/10/22/163106)

# 3.おわりに
　実装したことでSDPの理解が深まりました。半正定値計画を実装する際に躓いた点としては、クロネッカー積とか対称クロネッカー積とはなんぞや？という点でした。対称クロネッカー積については下記の文献が参考になりました。

- [On the Kronecker](https://www.math.uwaterloo.ca/~hwolkowi/henry/reports/kronthesisschaecke04.pdf)

基本的には線形計画と同じ流れで理論も展開されており、大幅な変更もなく実装もできました。今後は、SDPの産業応用の例で有名なLMIについて理解を深めていこうと思います。
C++の資源をDLLを介してC#から使う(メモ)

# 概要

C++ 側と c# 側とで可変長文字列をやり取りする際のメモリの扱いが異なり、癖があるのでメモ。


# C++ 側に文字列を引数で渡し、【戻り値】で受け取る方法

```cs:DllTest.cs(C#)
[TestClass]
public class DllTest
{
    [DllImport("MyDLL.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
    [return: MarshalAs(UnmanagedType.LPStr)]
    static extern string DllTestMethod(string hoge);

    [TestMethod]
    public void CanPassAndReceiveStringToDll()
    {
        string output = DllTestMethod("ああ");
        Assert.AreEqual("ああてすと", output);
    }
}
```

```cpp:API.h(C++)
#pragma once

#define DllExport __declspec( dllexport )

extern "C"
{
    DllExport int __stdcall DllTestMethod(char* hoge);
}
```

```cpp:API.cpp(C++)
#include "stdafx.h"
#include <iostream>
#include "API.h"


char* CStringToChar(LPCWSTR pStr) {
	// 変換後に必要なメモリサイズ取得
	int iByte = WideCharToMultiByte(CP_ACP, 0, pStr, -1, NULL, 0, NULL, NULL);

	// 文字列格納領域確保
	char* pszReturn = (char*)::CoTaskMemAlloc(iByte);

	// 変換
	WideCharToMultiByte(CP_ACP, 0, pStr, -1, pszReturn, iByte, NULL, NULL);

	return pszReturn;
}


char* CStringToChar(CString str) {
	// 変換元取得
	LPCWSTR pStr = str.GetString();
	return CStringToChar(pStr);
}


char* __stdcall DllTestMethod(char* hoge)
{
	std::cout << "Call C DLL!! - [" << hoge << "]" << std::endl;
	return CStringToChar(CString(hoge) + _T("てすと"));
}
```


# C++ 側に文字列を引数で渡し、【引数】で受け取る方法


```cs:DllTest.cs(C#)
[TestClass]
public class DllTest
{
    [DllImport("MyDLL.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
    static extern int DllTestMethod(string hoge, [MarshalAs(UnmanagedType.LPStr), Out] out string output);

    [TestMethod]
    public void CanPassAndReceiveStringViaDll()
    {
        int res = CanPassAndReceiveStringToDll("ああ", out string output);
        Assert.AreEqual(res, 123);
        Assert.AreEqual(output, "ああてすと");
    }
}
```

```cpp:API.h(C++)
#pragma once

#define DllExport __declspec( dllexport )

extern "C"
{
    DllExport int __stdcall DllTestMethod(char* hoge, const char** output);
}
```

```cpp:API.cpp(C++)
#include "stdafx.h"
#include <iostream>
#include "API.h"


char* CStringToChar(LPCWSTR pStr) {
	// 変換後に必要なメモリサイズ取得
	int iByte = WideCharToMultiByte(CP_ACP, 0, pStr, -1, NULL, 0, NULL, NULL);

	// 文字列格納領域確保
	char* pszReturn = (char*)::CoTaskMemAlloc(iByte);

	// 変換
	WideCharToMultiByte(CP_ACP, 0, pStr, -1, pszReturn, iByte, NULL, NULL);

	return pszReturn;
}


char* CStringToChar(CString str) {
	// 変換元取得
	LPCWSTR pStr = str.GetString();
	return CStringToChar(pStr);
}


int __stdcall DllTestMethod(char* hoge, const char** output)
{
	std::cout << "Call C DLL!! - [" << hoge << "]" << std::endl;
	*output = CStringToChar(CString(hoge) + _T("てすと"));
	return 123;
}
```
Singletonパターン Python実装 メモ

* Pythonとデザインパターンの学習記録。今回はSingletonパターンについてメモする。

## Singleton パターンとは

* デザインパターンの1つ。
* オブジェクト指向では、一般的に1つのクラスから複数のインスタンスを作成することができる。
* Singletonはアプリケーション全体でインスタンスを1つしか生成されないよう保証する仕組みを指す。

### クラス図と条件

![singleton_pattern.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/6f81b199-10c4-f61c-8874-7defc71d66d5.png)


1. 同じ型のインスタンスをprivate なクラス変数として定義する。

2. コンストラクタの可視性をprivateとする。

3. 同じ型の同じ型のインスタンスを返す `getInstance()` クラスメソッドを定義する。

※[Wiki](https://ja.wikipedia.org/wiki/Singleton_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)より

## サンプルプログラム

* `singleton.py`

  ※スレッド制御は未考慮。

```python
class Singleton:

    # 条件1. 同じ型のインスタンスをprivate なクラス変数として定義する。
    ## 1インスタンスしか生成しないことを保証するために利用する。
    _unique_instance = None

    # 条件2. コンストラクタの可視性をprivateとする。
    ## pythonの場合、コンストラクタをprivate定義できない。
    ## コンストラクタ呼び出しさせず、インスタンス取得をget_instanceに限定する。
    ## get_instanceからインスタンス取得を可能にするため、__init__は使用しない。
    ## 初期化時に、__new__が__init__よりも先に呼び出される。
    def __new__(cls):
        raise NotImplementedError('Cannot Generate Instance By Constructor')

    # インスタンス生成
    @classmethod
    def __internal_new__(cls):
        return super().__new__(cls)

    # 条件3:同じ型のインスタンスを返す `getInstance()` クラスメソッドを定義する。
    @classmethod
    def get_instance(cls):
        # インスタンス未生成の場合
        if not cls._unique_instance:
            cls._unique_instance = cls.__internal_new__()
        return cls._unique_instance


if __name__ == '__main__':
    ins1 = Singleton.get_instance()
    print(ins1)
    ins2 = Singleton.get_instance()
    print(ins2)
    # 同一インスタンスであることの確認
    print(ins1 == ins2)

```



### 動作確認

```shell
python singleton.py
<__main__.Singleton object at 0x00000292A08B31C0>
<__main__.Singleton object at 0x00000292A08B31C0>
True
```



## 参考情報

* [Singleton パターン](https://ja.wikipedia.org/wiki/Singleton_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)
* [Pythonでシングルトン(Singleton)を実装してみる](http://www.denzow.me/entry/2018/01/28/171416)
Ubuntuの次はmacでRuby on Railsを触ろうとしている備忘録

これまでwindowsユーザーでrails触るならlinux環境が良いよと言われ、当方金が無くUbuntuでrailsを触ってきましたが、ついに（？）macが格安で手に入ったので、準備することにしました。
専門家では無いので、間違い等あったら申し訳ないです；；

#導入環境
MacBook Air (13-inch, Early 2015)
プロセッサ　1.6 GHz デュアルコアIntel Core i5
メモリ　8 GB 1600 MHz DDR3
グラフィックス　Intel HD Graphics 6000 1536 MB
macOS Big Sur バージョン 11.3


#手順
今回は、過去の失敗を活かしてスムーズに構築出来るように以下手順を踏むことにした。


1. command line toolを使う（？）ようなので、xcodeをインストール
2. 必要なソフトウェアをインストールするためにHomebrewをインストール
3. RubyはHomebrew経由rbenvにてインストール
4. railsはgem経由でインストール
5. MySQLをHomebrew経由でインストール　（これまではSQLiteのみで製作してました）
6. PATHを通す
7. 新しいプロジェクトを作成する
8. エラー吐き出しまくってたので以下を導入
9. MySQLはスタートしないと動かないよ！


#1. Xcodeのインストール
iOSアプリとか開発するのに使うようですが、command Line Toolを使う過程でインストールを求められた為インストールしてます。



#2. Homebrewインストール
Homebrewのサイト
https://brew.sh/index_ja
以下コマンドを入力しHomebrewを導入（時間かかります）

```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

#3. rbenv インストール
超簡単に言うと、rbenvはRubyのバージョン管理ツールです。　　※簡単にしか言えない←
一緒にruby-buildも一緒にインストールします。

```
brew install rbenv ruby-build
```

#Rubyのインストール

```
rbenv install ruby - *.*.*
```

*.*.*には、
rbenv install --list
コマンドでインストール可能なリストを取得し、好きなバージョン入れてください。
今回は、初めてruby 3.0.1を導入してみました。
```


#今どのrubyが実行されるようになっているか確認

```
rbenv global 
```

今回インストールしたのが3.0.1だったので、

```
rbenv global 3.0.1 
```

として指定


#4. rails インストール
gem経由でインストールします

```
gem install rails -v 5.2.3 
```

#5. MySQL インストール
SQLiteを卒業したくて導入してみました。（悲劇の始まり、、、）

```
brew install mysql 
```

ここまでは
何も悩まず導入。
導入時のバージョンは
Ruby 3.0.1
Rails 5.2.3
MySQL　8.0.23


#6. PATHを通す

```
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

設定を反映
source ~/.bash_profile
```


#7. 新しいプロジェクトを作成する

```
rails new . -d mysql --skip-bundle
bundle install
```

#8. エラー吐き出しまくってたので以下を導入

```
brew install node
brew install yarn
rails webpacker:install
```

#9. MySQLはスタートしないと動かないよ！
実はここが一番盲点でして、、、
当たり前のことのようですがSQLiteはrails sコマンド打てば作動してたので、、、
また、それでも動かなかったので、エラーコード読み解くと、DB作成されてないよ！とのことでしたので以下コマンドも追加

```
mysql.server start
rails db:create
```



ここまでやってURLを叩くと、ようやくいつもの画面出ました！

```
http://localhost:3000
```


#以下参考とさせて頂いたサイト
先人達の知恵・知識に感謝しかありません
https://qiita.com/NaokiIshimura/items/8203f74f8dfd5f6b87a0
https://rails-ambassador.herokuapp.com/debugs/NoDatabaseError
https://qiita.com/hujuu/items/3d600f2b2384c145ad12
https://qiita.com/rokumura7/items/b270acb9550efddd5fe5
ISLispにElixir風の拡張シンタックスマクロ(2)

#はじめに
ISLispにElixir風のパターンマッチングを追加するマクロについてです。機能拡張し、ほぼElixirと同程度の記述を可能としました。数式処理、定理証明などで便利だろうと思います。

#具体例
下記は微分公式をパターンマッチで記述したものです。高校程度の微分公式を与えています。


```common-lisp

(defpattern derive
    (((^ _x _n) _x) `(* ,_n (^ ,_x ,(- _n 1))))
    (((/ 1 _x) _x)  `(/ -1 (^ ,_x 2)))
    (((sqrt _x) _x) `(/ 1 (* 2 sqrt(,_x))))
    (((sin _x) _x)  `(cos ,_x))
    (((cos _x) _x)  `(- (sin ,_x)))
    (((tan _x) _x)  `(/ 1 (^ (cos ,_x) 2)))
    (((exp _x) _x)  `(exp ,_x))
    (((^ _a _x) _x) `(* (^ ,_a ,_x) (log ,_a)))
    (((log _x) _x)  `(/ 1 ,_x))
    (((log _a _x) _x)   `(/ 1 (* ,_x (log ,_a))))
    (((* _k (_f _x)) _x)(when (numberp _k)) (let ((d (derive `(,_f ,_x) `,_x)))
                                              `(* ,_k ,d)))
    (((+ (_f _x) (_g _x)) _x)  (let ((d1 (derive `(,_f ,_x) `,_x))
                                     (d2 (derive `(,_g ,_x) `,_x)))
                                 `(+ ,d1 ,d2)))
    (((* (_f _x) (_g _x)) _x)  (let ((d1 (derive `(,_f ,_x) `,_x))
                                     (d2 (derive `(,_g ,_x) `,_x)))
                                  `(+ (* ,d1 (,_g ,_x)) (* (,_f ,_x) ,d2))))
    (((/ (_f _x) (_g _x)) _x)  (let ((d1 (derive `(,_f ,_x) `,_x))
                                     (d2 (derive `(,_g ,_x) `,_x)))
                                  `(/ (+ (* ,d1 (,_g ,_x)) (* (,_f ,_x) ,d2 (^ (,_g ,_x) 2)))))))
    

```

#改良点
- すべての引数についてパターンマッチングをするようにした。
- when構文を追加し、各要素につき限定を加えることとした。

上記の微分公式の例ではderiveは2引数です。(derive '(xin x) 'x) のように使います。第二引数もパターンマッチされますので、記述が簡単になります。

また、上述の例で定数倍の公式につきwhen構文を与えています。パターン変数である_kは数である必要があります。それを表しています。これがないとその後に出現する積の公式とぶつかってしまいます。whenにより変数の型を与えます。これは複数指定することができます。


数式処理はLispで記述すると数式を判別、要素を取り出すためにcar/cdrを多く使用せざるを得ず、記述は冗長になりがちでした。defpattern構文によりこれを解消しました。

実装は下記においてあります。
ドキュメントにライブラリの使用方法を記述してあります。
https://github.com/sasagawa888/eisl
【Rails】マイグレーション実行時にMysql2::Error: Duplicate entry for key..が出た

Railsでテーブルのデータに対して一意性制約を付与するマイグレーションファイルを実行しようとした際に上記エラーが発生

```ruby
class AddIndexToUserBooks < ActiveRecord::Migration[6.0]
  def change
    add_index :user_books, [:user_id, :book_id], unique: true
  end
end
```

マイグレーションの内容としては中間テーブルのデータの組み合わせに対して一意性制約を設けるもの。

## 原因と解決策

すでにテーブルに存在しているデータが一意性制約に反していた。
上記例でいれば、同じuserとbookの組み合わせがすでにテーブルに挿入されていることが原因で一意性制約を付与できない状態だった。
これをテーブルから直接削除して解決

## 所感

Duplicate entryはマイグレーション実行時には発生しないと思っていたので一瞬焦りました。
マイグレーションが実行される場合はすでにテーブルに存在しているデータとの整合性も判定されているということですね。
【アルゴリズム】文字列から一番出力された文字を探す

```

#一番出力された文字は何？？
#input this is a pen. this is an apple. applepen!
#output ('p',6)

def count_check(str)
  #1.メソッドを探す
  #2.配列のループからハッシュのキーとバリューに保存していく。最終的にkey、valueを出力する。
  str_list = str.split('')
  str_list.delete(" ")
  result = Hash.new
  str_list.each do |str|
    #もうすでにハッシュの中にあるのかを確かめる
    if result.key?(str)
      print str
      # result[:str]
      result[str] += 1
    else
      result.store(str,1)
    end
  end
  # #キーが最大の文字列を探す。
  max = 0
  ans = []
  result.each{|key,value|
  if value > max
    ans.pop(2)
    ans.push(key,value)
    max = value
  end
  }
  return ans
end

print(count_check("this is a pen. this is an apple. applepen!"))

```
はんだごてを使う時はこて台も使うことをおすすめします

ハードウェアエンジニアをしていますが、趣味ではんだ付けをしている人を見えていると恐ろしい使い方を平気でしている人を見るのでびっくりします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1397694/966bebf1-8956-5a26-8e6b-613dff104155.png)
こんな感じで熱いままのはんだごてを机の上にそのままおいて放置される方は火災の心配などしないのでしょうか？


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1397694/93bbdf43-0369-48e5-843c-ef502fa1aec3.png)
はんだごてを使用する時には必ず『こて台』も使用するべきです。危なすぎます。

こちらの記事が勉強になるので、はんだ付けをされる方は一読されることをおすすめします。
https://uma-shi.com/archives/8490
openweather map(気象情報の提供サイト)から屋外の温度・湿度情報を5分おきに取得

部屋の中の温度・湿度は取得できるようになったのですが、屋外のデータも取得したいなと思って外部の気象情報提供サイトを探したところ、無料で使えるopenweathermapというものを見つけました。
そのopenweathermapのデータを以下ページで実施した室内の温湿度データの横に記載しています。

https://qiita.com/tosshie/items/0b6a93a8e351cd801321

#### 前提

- googleのアカウントを持っていること

#### openweathermapの準備
- 基本的に以下のページを参照して実施しました

https://qiita.com/Mikenerian/items/a009bff20b4543e3a5fc

- openweathermapのアカウント作成
    - 以下のページからSign in → Create an Accountで登録
    - Sign in → API keys で API keyが発行できます。複数も発行できます。
    - APIをたたけるようになるまで一晩かかった気がします

https://openweathermap.org/

- APIのテスト
    - 以下のURLにブラウザでアクセスして表示されることを確認

```
https://api.openweathermap.org/data/2.5/weather?lang=en&q=tokyo&appid={API key}&units=metric
```

#### google spread sheetの設定
- google spread sheetで1個ファイルを作成
    - ファイル名は自由に設定、シート名は"test1"とします

- ツール→スクリプトエディタからgoogle apps scriptを開き、以下を貼り付ける
    - 一番上の行にはspreadsheetのIDを入力
        - urlのhttps://docs.google.com/spreadsheets/d/spreadsheetのIDはここです/edit
    - 3行目の{API key}にはopenweathermapのAPI keyを入力
    - 私は以前のエディタを使用ボタンを押して、旧バージョンのUIでやっています
    - 参照元のコードをほとんどそのまま使っています

```
var spreadsheetId = 'スプレッドシートのIDを入れる'

function getWeatherOfTokyo() {
 const response = UrlFetchApp.fetch('https://api.openweathermap.org/data/2.5/weather?lang=en&q=tokyo&appid={API key}&units=metric')
 const forecast = JSON.parse(response.getContentText())
 const date = new Date()
 const mySheet = SpreadsheetApp.getActiveSheet()
 const lastRow = mySheet.getLastRow()
 mySheet.getRange(lastRow, 15).setValue(Utilities.formatDate(date, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm:ss'))

 mySheet.getRange(lastRow, 16).setValue(forecast.main.temp)
 mySheet.getRange(lastRow, 17).setValue(forecast.main.humidity)
 mySheet.getRange(lastRow, 18).setValue(forecast.main.pressure)
 mySheet.getRange(lastRow, 19).setValue(forecast.weather[0].main)
 mySheet.getRange(lastRow, 20).setValue(forecast.weather[0].description)
 mySheet.getRange(lastRow, 21).setValue(forecast.rain) 
}
```

- ちなみに、私はraspberry piから取得している部屋の中の温湿度データに追記したいので、last rowの15列目以降に追記するやり方をしていますが、このスクリプトだけで動かすなら、lastrow+1にしないと上書きされてしまいます。
- raspberry piから取得する方法はこちら↓を参照

https://qiita.com/tosshie/private/0b6a93a8e351cd801321
 
#### トリガーの設定
- 旧エディタなら時計マーク、新しいエディタなら左メニューからトリガーを選択 → トリガーを追加 → 
    - 実行する関数：作った関数（getWeatherOfTokyo）
    - 実行するデプロイ：Head
    - イベントのソース：時間主導型
    - 時間ベースのトリガーのタイプ：分ベースのタイマー
    - 時間の間隔：5分おき
        - 1日1000リクエストの上限があるので(無料だと)、5分おきがいいと思います


-------

データをGoogle Data Portalで表示できるようにしています

https://qiita.com/tosshie/items/6e9ee9e291b2f63330a2

https://qiita.com/tosshie/items/a94a109dae282cc939ca


2021年3月から始めたスマートホーム化はこちらに一覧化しています（2021年5月時点）

https://qiita.com/tosshie/private/738a85184d6cdaf20b3e
10分たらずでGitHubプロフィールをカッコ良くしたが

[Beautify your GitHub! - DEV Community 👩‍💻👨‍💻](https://dev.to/philiphaines/beautify-your-github-40hh)



というのを読んだ。

## User/User リポジトリ を作る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/72beec63-56f6-5ac4-1659-ac9574384890.png)

するとその `Readme.md` が自らのReadmeになるという。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/0b8d03de-6ef1-2319-a367-74cfe9732d96.png)

### 例えばこのような要領でこうなる

https://github.com/e99h2121/e99h2121/blob/main/README.md

https://github.com/e99h2121

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/b4997ecc-396a-8923-ecc3-c8b29edd4b7f.png)

## 便利なツール

### Beautify GitHub Profile

字のごとし、
[rzashakeri/beautify-github-profile: This repository helps you to have a more beautiful and attractive github profile, and you can access a set of tools and guides for beautifying your github profile. 🚩](https://github.com/rzashakeri/beautify-github-profile)


### カバーフォト
[Canva：無料デザインツール：プレゼンテーション、動画、SNSなどをデザインして作成できます](https://www.canva.com/ja_jp/)

https://www.fotor.com/jp/

https://crello.com/ja/


### スキルセット表示用アイコン等
https://simpleicons.org/

https://shields.io/

### GitHub Profile Summery Cards

https://github.com/vn7n24fzkq/github-profile-summary-cards

### Readme generator

https://rahuldkjain.github.io/gh-profile-readme-generator/



## 参考

### プロフィール例
https://github.com/jlengstorf

https://github.com/bdougie

https://github.com/sindresorhus

### 参考記事
https://qiita.com/katot/items/c7eab8c4470610ac83bc

https://qiita.com/Hassan/items/134009209f5709f892b1

https://qiita.com/koinori/items/5bfed284fab04b5fee16

https://dev.to/philiphaines/beautify-your-github-40hh

https://dev.to/supritha/how-to-have-an-awesome-github-profile-1969

https://dev.to/saritchaethudis/make-your-github-profile-stand-out-19b2

盛るのはもちろん楽しい。


### とはいえ

GitHubに普段から芝を生やすことがもっとも、真に、プロフィールをカッコ良くする方法であろう...。

https://qiita.com/sta/items/2c1f0252a6a9ce5e2087

https://qiita.com/pekepek/items/a334ab9e201c486aed3f

[芝生の画像化ができるサービス](https://grass-graph.moshimo.works/)
[芝生をかっこよくスカイラインな立体にしてくれるもの](https://skyline.github.com/) 等

ということで、10分たらずでGitHubプロフィールをカッコ良くしたが、また日々コツコツと頑張ろうというメモでした。以上お楽しみいただければさいわいです。
Wordpressでheaderで遷移できない時。

ググって出てくる事を試して全く改善されなかったので書いておきます。

①前後にhtmlやechoでの出力はないか？
②Location前後にスペースはないか？
③exit;の記載

上記３点を確認しても改善されなくて途方にくれてたら上の方に...


```
get_header();
```
こいつのせいでした。
こいつを遷移させるコードの
後ろに持ってきたら正常に動作しました。
Eclipseの初期設定についての備忘録

C#、VisualStudioの村の民だったのですが
次回参画のプロジェクトが初めてのJava/Springのシステムなので
軽く予習もかねてEclipseでSpringのプロジェクト作って動かしてみました。

ということでEclipseの初期設定を備忘録。
まぁVisualStudio入れたときにいつもしてたやつのEclipse版って感じです。
この程度のことはデフォルトで設定していてほしいんですけどね。。。

#####STS(SpringToolSuite)のインストール
ヘルプ＞Eclipseマーケットプレースより、
・Springと検索しインストール

#####ダークテーマの設定
ウインドウ＞設定＞一般＞外観より、
・テーマ：ダークを選択

#####エディタの設定
設定＞一般＞エディター＞テキスト・エディターより、
・以下にチェック
　・行番号の表示
　・タブでスペースを挿入
　・空白文字を表示

#####UTF-8エンコーディングの設定
ウインドウ＞設定＞一般＞ワークスペースより、
・テキスト・ファイル・エンコードを「その他」：```UTF-8```

#####コンテンツ・アシストの設定
VisualStudioのインテリセンスみたくする方法。
ウインドウ＞設定＞Java＞エディター＞コンテンツ・アシストより、
・自動有効化を使用可能　へチェック
・自動有効化遅延の値を```80```
・Javaの自動有効化トリガーに```.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_```

#####保存アクションの設定
保存時にコードの自動整形してくれる。
ウインドウ＞設定＞Java＞エディター＞保存・アクションより、
・保存時に選択したアクションを実行　へチェック
・すべての行をフォーマット　へチェック
・インポートの編成　へチェック


参考
---
https://qiita.com/yuukieiu/items/bc8179873b859e3c7741

http://ser1zw.hatenablog.com/entry/20110130/1296393620
[AWS_単語]オブジェクト、サービス等

###アベイラビリティゾーン(AZ)
AWSのデータセンター。
同じAZでしかできないことがある。

###リージョン
AZを複数まとめた範囲。

例：
東京リージョン:　ap-northeast-1
　AZ 1:　ap-northeast-1a
　AZ 2:　ap-northeast-1c
　AZ 3:　ap-northeast-1d

大阪リージョン:　ap-northeast-3
　AZ 1:　...

###VPC
仮想NW。

##ユーザー
###IAM
AWSの権限管理サービス。

###ルートユーザー
全権限を持つユーザー。
ログイン方法は、メールアドレスとパスワード。

###IAMユーザー
個別のユーザー。
運用する際は、管理者権限を持たせたIAMユーザーを用いることが推奨されている。
ログイン方法は、アクセスキーやパスワードを複合的に使用できる。

###EC2

###RDS
phoenixframework で BasicAuth するメモ

# At First

最近の Elixir(手元のバージョンは Elixir 1.11.3, phoenix 1.5.8) だと Plug でかんたんにできますよ というのをメモしておきます．
最近，書くネタがなかったので苦し紛れに・・とかそういうのじゃないですタブン．

hex に `basic_auth` というモジュールがあるっちゃあるんですが

```
DEPRECATED

Plug.BasicAuth is now part of Plug.
```

だそうです．
https://hexdocs.pm/basic_auth/readme.html

# Phoenix Framework の場合

Plug のドキュメントには Phoenix だとどう使うの？ が書かれていないので，そこだけ以下に補足します．
https://hexdocs.pm/plug/Plug.BasicAuth.html#content

~~たぶん，適当に書いても動くけど~~

`phx.gen.html` で生成した Web アプリに Basic 認証をかけたい場合， Router の pipeline に設定しちゃいましょう．
`router.ex` に以下のように指定します． phoenix 使って API 作ってる人は適宜読み替えてください．

```elixir
  pipeline :browser do
    (略)
    plug :basic_auth,
      username: "user",
      password: "pass"
```
Production 公開時にこれはさすがにまずいので， 実際には環境変数化してガードするとかしましょう． 


あと， `Plug.BasicAuth` を有効にしないといけないので， `router` 向けに import します．

```elixir
  def router do
    quote do
      (略)
      import Plug.BasicAuth
    end
```

これだけです．
なんちゃってセキュリティをかけたい，という要望がこの時代にどこまであるのかは正直，非常に謎ですが，なにかの参考になれば幸いです．
MySQL RouterにUnixドメインソケットで繋ごうとした

[MySQL InnoDB Cluster練習 \- Qiita](https://qiita.com/k8uwall/items/47f16357f9d1005888ed)
前回の続き

## 概要

- MySQL routerは冗長構成にするのではなく、アプリケーションサーバー上でローカルUNIXドメインソケット接続するのが推奨らしい
- 引き続きRedhat系のAlmaLinux8での検証

## 結果

- `--conf-use-sockets `を付けてbootstrapすることでrouter起動時にsocketファイルが出来上がる
- ただしそのままだとsocketファイルのパスはsystemdのprivate-tmp内になってしまう
- mysqlrouterの`--directory`オプションで変更は可能だが、設定ファイル等も移動してしまうのでsystemdのmysqlrouterユニットファイル変更が必要になってしまう
- bootstrap後に`/etc/mysqlrouter/mysqlrouter.conf`を書き換えるのが現状の良さげな解か？
- `config_generator.cc`に`socketsdir`というオプションがあり、これが使えれば書き換えしなくて済みそうだが、引数を受け付ける実装が無いため使えなかった。

## 設定

`--conf-use-sockets `を付けてbootstrapすることでsocketファイルが出来上がる

```sh
// router
# mysqlrouter --bootstrap root@node1 --user=mysqlrouter --conf-use-sockets 
# cat /etc/mysqlrouter/mysqlrouter.conf  | grep sock
socket=/tmp/mysql.sock
socket=/tmp/mysqlro.sock
socket=/tmp/mysqlx.sock
socket=/tmp/mysqlxro.sock
# systemctl start mysqlrouter

// systemdのprivate-tmpにより実体は以下になる
# ll /tmp/systemd-private-2a0d5074208b46fdbb4fad9862a4b0c4-mysqlrouter.service-WHFHbS/tmp/
total 0
srwxrwxrwx 1 mysqlrouter mysqlrouter 0 May  4 17:35 mysqlro.sock
srwxrwxrwx 1 mysqlrouter mysqlrouter 0 May  4 17:35 mysql.sock
srwxrwxrwx 1 mysqlrouter mysqlrouter 0 May  4 17:35 mysqlxro.sock
srwxrwxrwx 1 mysqlrouter mysqlrouter 0 May  4 17:35 mysqlx.sock

// Unixドメインソケットで接続可だが期待したパスではない
# mysql -u root -p -S /tmp/systemd-private-2a0d5074208b46fdbb4fad9862a4b0c4-mysqlrouter.service-WHFHbS/tmp/mysql.sock
mysql> 

// パスを書き換えてみる
# vi /etc/mysqlrouter/mysqlrouter.conf
-socket=/tmp/mysql.sock
+socket=/var/lib/mysqlrouter/mysql.sock
-socket=/tmp/mysqlro.sock
+socket=/var/lib/mysqlrouter/mysqlro.sock
-socket=/tmp/mysqlx.sock
+socket/var/lib/mysqlrouter/mysqlx.sock
-socket=/tmp/mysqlxro.sock
+socket=/var/lib/mysqlrouter/mysqlxro.sock

# systemctl retart mysqlrouter

# mysql -u root -p -S /var/lib/mysqlrouter/mysql.sock
```

bootstrap時に変更するオプションがあるようだが、引数を受け付ける実装が無かった。

```cc:mysql-8.0.24/router/src/router/src/config_generator.cc
  if (user_options.find("socketsdir") == user_options.end())
    options["socketsdir"] = "/tmp";
```

[MySQL Routerの冗長化について \- 2000秒後の私へ](https://puan.hatenadiary.jp/entry/2020/04/03/020927)
[MySQL Routerを使用して、InnoDB Clusterを構成する（MySQL Routerの設定主体） \- CLOVER🍀](https://kazuhira-r.hatenablog.com/entry/2019/08/31/012059)
[MySQL :: MySQL Router 8\.0 :: 3 Deploying MySQL Router](https://dev.mysql.com/doc/mysql-router/8.0/en/mysql-router-general-using-deploying.html)
【本番環境】【備忘録】rails db:create RAILS_ENV=production でrails aborted! Mysql2::Error::ConnectionError: Access denied for user 'root'@'localhost' (using password: NO)とエラーが出る問題の対処法

AWSのサービスである、EC２とRDSを用いてローカルで作成したRailsのアプリをデプロイしようと作業を進めています。

https://qiita.com/naoki_mochizuki/items/5a1757d222806cbe0cd1
上記記事に従って
rails db:create RAILS_ENV=production
rails db:migrate RAILS_ENV=production
を行ったのですがタイトルのエラーが発生・・・

# エラー文

```
rails aborted!
Mysql2::Error::ConnectionError: Access denied for user 'root'@'localhost' (using password: NO)
/var/www/rails/アプリ名/bin/rails:9:in `<top (required)>'
/var/www/rails/アプリ名/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'
Tasks: TOP => db:create
(See full trace by running task with --trace)
```

# 試したこと
①$ mysql -u root -p の実行

```ruby:MySQL
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.7.34 MySQL Community Server (GPL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
```
特に問題なく入れた。

②config/database.ymlを開き、パスワードを記載
いつも使っているのがVSコードなので、VSコードにてdatabase.ymlを開く。
本番環境用のパスワードの欄が空欄だったため、記載する。
![スクリーンショット 2021-05-05 1.05.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985164/3b45c3a3-1e4e-51da-d430-8e4897f241a8.png)
しかし全く同じエラー。どうして・・・・・？

# 結論
ローカル環境ではなく、「本番環境（EC2）」にてconfig/database.ymlを開き、パスワードを記載すると解決します！
（ローカル環境にてdatabase.ymlを編集していたので、本番環境への影響がなく、全く意味のないことをしていたようです。。）

# 手順（注意：すべて本番環境の中で実行する）

```ruby:asami|アプリ名
$ vi config/database.yml
```

```ruby:database.yml
production:
  <<: *default
  database: アプリ名_production
  username: root
  password: XXXXX #　←ここに記述 
```

無事に通りました！
本当に単純すぎる間違いでかなり時間をロスしました・・・・・
Webカメラとラズパイで、あれ？コンロの火消したっけ？解消


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/807289/0a072545-dc53-037f-7319-c4aadd4e21c9.png)

### 作ったもの
コンロの様子をスマホに送る仕組み

### 使い方
- 家の玄関に貼ったNFCタグにスマホでタッチ
- LINEにコンロの様子が届く

### 使ったツール
- Raspberry Pi zero W
- Webカメラ [ロジクール C270n](https://amzn.to/2PNMUKh)
- iPhone (NFC連携はiPhone11以降の模様, 「ショートカットのボタン押す」で良いならNFC不要)
- [NFCタグ](https://amzn.to/33dO5FT)
- Node-RED
- iOS ショートカット
- LINE Notify


### 仕組みの大枠
![Untitled Diagram (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/807289/e3ac6f55-f400-0486-d5d6-d2441951c91d.png)



実際に使っているのは、外出先からでも確認できるように、Beebotteを経由しているが(下図)、長くなるので省略
![Untitled Diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/807289/533d950c-bd8f-2539-7dd8-09e78dfde79b.png)



### 作り方

1. こちらの記事を参考に、LINEのアクセストークンを入手
[[超簡単]LINE notify を使ってみる](https://qiita.com/iitenkida7/items/576a8226ba6584864d95)

1. Raspberry PiにWebカメラを接続

1. Raspberry Pi に fswebcam をインストール

    ``` bash
    $ sudo apt install -y fswebcam
    ```

1. Raspberry Pi上で、以下のようなシェルスクリプト(fire.sh)を準備 (Node-REDで完結させる方がおしゃれとは思いながらも逃避)

    ``` bash
    #!/bin/bash
    ACCESS_TOKEN="<LINEのアクセストークン>"
    PICTURE_PATH="/home/pi/fire.jpg"

    # 解像度は1280x720, 日付が見やすいようfont sizeを60に, 文字化けする場合は、sudo apt-get install fonts-noto
    fswebcam -d /dev/video0 -r 1280x720 --font ':60' $PICTURE_PATH

    curl -X POST https://notify-api.line.me/api/notify -H "Authorization: Bearer $ACCESS_TOKEN" -F "message=fire monitor" -F 
    "imageFile=@$PICTURE_PATH" 
    ```

1. シェルスクリプトに実行権限付与

    ```
    $ chmod +x fire.sh
    ```

1. Node-REDで、以下のようなフローを作成
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/807289/9fac036e-b903-2347-43ef-5ccecad2f594.png)



1. iPhoneのショートカット作成
    1. ショートカットの「オートメーション」を選択
    1. 「＋」で新規作成
    1. 「NFC」を選び、「スキャン」を押して、玄関に貼るNFCタグを読み込み、適当な名前を付ける
    1. 「行う」の部分に、「デバイスを振動させる振動」を追加
    1. 更に、「URL」を追加し、URLに「Raspberry piのアドレス:1880/fire」を記載
        (1880は、Node-REDのデフォルトポート fireは上で作ったフローにおける[get]のアドレス)

### 感想&プラスアルファの工夫
- これで、火を消したか不安になって引き返す必要がなくなった。
- コンロのスイッチ?に[蓄光シール](https://amzn.to/33dO5FT)を貼って、付いているか否かを見やすくした
- 食器棚にWebカメラを固定するため、3Dプリンターでマウンターを作った
- カメラの首が可動式になっていたが、動かないようにグルーガンで固定した
- 今回を家周りトリオロジーの最後にして、次は違う系統を作ろうかなぁ　[No.1](https://qiita.com/quantum_cpa/items/2b50b0167f73252a7233), [No.2](https://qiita.com/quantum_cpa/items/adf29b802f4758712c3b)

### Disclaimer
- 当初、前から持っているRaspberry Piを使い回していたら、何度か撮影するうちに、撮影がコケる現象が発生。
エラー処理をまじめにやっていないため、前に撮影した写真が送られて来た。
- 火が消えている、安心。と思っていたら実は火がついていたとかあり得るので、利用は自己責任でお願いします。
Rubocup導入

![Rubocop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1210417/308a0dc0-b01c-affc-8bd6-2d067de3e438.png)

##Rubocopとは
Rubocop（ルボコップ）はRubyの静的コード解析ツール(Gem)です。
「インデントが揃っていない」「余分な改行・スペースがある」などの指摘をRubyStyleGuideに基づいて行ってくれます。

Rubocopを導入することにより、レビューに掛かる時間を減らし、コードの品質を担保できるようになります。
Rubocopの指摘は設定で変更が可能です。(下記は一例)

##インストール

```ruby:Gemfile
group :development do
  gem 'rubocop', require: false
end
```

```ruby:ターミナル
bundle install
```

上記コマンドで、Rubocopを導入できました。

##Rubocopの設定
アプリ直下(Gemfileなどと同じ場所)に
「.rubocop.yml」　ファイルを作ります。

```ruby:ターミナル
touch .rubocop.yml
```

ここでは対象から除外するファイル・ディレクトリの指定だったり、無視するエラーの指定だったりのカスタマイズをします。

```ruby:.rubocop.yml
AllCops:
# 除外するディレクトリ（自動生成されたファイル）
# デフォルト設定にある"vendor/**/*"が無効化されないように記述
 Exclude:
   - "vendor/**/*" # rubocop config/default.yml
   - "db/**/*"
   - "config/**/*"
   - "bin/*"
   - "node_modules/**/*"
   - "Gemfile"


# 1行あたりの文字数をチェックする
Layout/LineLength:
 Max: 130
# 下記ファイルはチェックの対象から外す
 Exclude:
   - "Rakefile"
   - "spec/rails_helper.rb"
   - "spec/spec_helper.rb"

# RSpecは1つのブロックあたりの行数が多くなるため、チェックの除外から外す
# ブロック内の行数をチェックする
Metrics/BlockLength:
 Exclude:
   - "spec/**/*"

# Assignment: 変数への代入
# Branch: メソッド呼び出し
# Condition: 条件文
# 上記項目をRubocopが計算して基準値を超えると警告を出す（上記頭文字をとって'Abc'）
Metrics/AbcSize:
 Max: 50

# メソッドの中身が複雑になっていないか、Rubocopが計算して基準値を超えると警告を出す
Metrics/PerceivedComplexity:
 Max: 8

# 循環的複雑度が高すぎないかをチェック（ifやforなどを1メソッド内で使いすぎている）
Metrics/CyclomaticComplexity:
 Max: 10

# メソッドの行数が多すぎないかをチェック
Metrics/MethodLength:
 Max: 30

# ネストが深すぎないかをチェック（if文のネストもチェック）
Metrics/BlockNesting:
 Max: 5

# クラスの行数をチェック（無効）
Metrics/ClassLength:
 Enabled: false

# 空メソッドの場合に、1行のスタイルにしない　NG例：def style1; end
Style/EmptyMethod:
 EnforcedStyle: expanded

# クラス内にクラスが定義されていないかチェック（無効）
Style/ClassAndModuleChildren:
 Enabled: false

# 日本語でのコメントを許可
Style/AsciiComments:
 Enabled: false

# クラスやモジュール定義前に、それらの説明書きがあるかをチェック（無効）
Style/Documentation:
 Enabled: false

# ％i（）構文を使用していないシンボルで構成される配列リテラルをチェック（無効）
Style/SymbolArray:
 Enabled: false

# 文字列に値が代入されて変わっていないかチェック（無効）
Style/FrozenStringLiteralComment:
 Enabled: false

# メソッドパラメータ名の最小文字数を設定
Naming/MethodParameterName:
 MinNameLength: 1
```
Rubocopには、他にも以下のような標準設定がしてあります

| Rubocop | 標準設定	 | 備考 |
|:-----------:|:------------:|:------------:|
| 文字列	       | シングルクォーテーション	        | 式展開や文字列内にシングルクォーテーションがある場合はダブルクォーテーションを使う　|
| 変数名とメソッド名	     | キャメルケースで定義する	      |       |


##修正の流れ

```ruby:ターミナル
#修正内容を確認
bundle exec rubocop
```

```ruby:ターミナル
# 修正内容を自動修正
bundle exec rubocop -a
# または
bundle exec rubocop --auto-correct 
```

以上で、Rubocopが自動でチェックしながらコードを勝手に綺麗にしてくれます。
とてもありがたい機能ですね！！

##参考
https://techtechmedia.com/rubocop-installation/
STM32L010のシリアルでHello Worldと出力


目的
動きそうだから動かしてみた
容量不足でほぼ何もできなかった。

x mbedのリビジョンは、125

ソフトウェアシリアルもあるよ
STM32L010のソフトウェアシリアルでHello Worldと出力 9600bps TX PA2


https://qiita.com/caa45040/items/aa19dba04945f95c2674


STM32L010のソフトウェアシリアルで文字を受信する STM32 RX 9600bps


https://qiita.com/caa45040/items/91bc4665095d65eb971b


忙しい人よう


https://os.mbed.com/users/caa45040/code/serial_test_010/


```c++

#include "mbed.h"

//Serial pc(USBTX, USBRX); // tx, rx
//Serial pc(SERIAL_TX, SERIAL_RX); //767
Serial pc(PA_2, PA_3); //010

int main() {

    char *ss1; //文字のポインター
    int ii; //ループカウンター

    //無限ループ
    while(1) {

        ss1="Hello World !\r\n";
        ii=0; //ループカウンター
        while(ss1[ii]!=0){
            
            //一文字出力
            pc.putc(ss1[ii]);ii++;
                        
        } //while

        //1秒の待ち
        wait_ms(1000);
        
    } //while
} //main

//容量削減
void error(const char* format, ...){}


```

![serial_test_010.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/bcce4b1a-1739-06fc-c6c7-de95cb98e4c2.jpeg)

![serial_test_010_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/6e161d21-1cf0-51ef-ca88-ba257b2e1989.jpeg)

![serial_test_010_2_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/203c6cc6-7782-de35-6774-c99d456d987a.jpeg)

![serial_test_010_2_4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/7c3e2b71-4368-fa6a-989f-f88439dad154.jpeg)

![serial_test_010_2_5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/4ded5cd5-5708-0808-c05d-47371b59ae0a.jpeg)

![serial_test_p1_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/6ac0b398-7308-6ef2-70a6-1e1739203a67.jpeg)
【Kotlin】unsigned integers/inline class引数のコンパイル結果がJavaのプリミティブ型に該当するか確認する

確認は`Kotlin 1.4.32`で行いました。

# TL;DR
- `KType.javaType`プロパティから取得できるクラスはコンパイル後の型になっている
  - [`KType.classifier`からキャスト](https://qiita.com/wrongwrong/items/ef5aa2743789815e545d)したり、`KType.jvmErasure`で取得を行うと`Kotlin`の型が取れてしまう
- `Java`の`Constructor`/`Method`からパラメータを取得する形でも確認できる

# 問題になること
以下のような、`Kotlin`の`unsigned integers`や`inline class`を含むコンストラクタが有ったとします。

```kotlin
inline class InlineInt(val i: Int)
inline class InlineString(val str: String)

data class Temp @ExperimentalUnsignedTypes constructor(
    val uByte: UByte,
    val uShort: UShort,
    val uInt: UInt,
    val uLong: ULong,
    val inlineInt: InlineInt,
    val inlineString: InlineString
)
```

このコンパイル結果は以下のようになります（抜粋）。
注目して頂きたいのは、`non-null`な`unsigned integers`や`inline class`はプリミティブ型として取り扱われている点です。

```java
// $FF: synthetic method
@ExperimentalUnsignedTypes
public Temp(byte uByte, short uShort, int uInt, long uLong, int inlineInt, String inlineString, DefaultConstructorMarker $constructor_marker) {
  this(uByte, uShort, uInt, uLong, inlineInt, inlineString);
}
```

一方で、`Kotlin`のリフレクションでパラメータを取得すると、`unsigned integers`/`inline class`がそのまま取得されています。

```kotlin
empConstructor: KFunction<Temp> = ::Temp
val parameters = tempConstructor.parameters
val types = parameters.map { it.type }

// -> [kotlin.UByte, kotlin.UShort, kotlin.UInt, kotlin.ULong, com.wrongwrong.factory.InlineInt, com.wrongwrong.factory.InlineString]
println(types)
```

この差異は、主に既存の`Java`ベースプログラムで文字列からデシリアライズする時や`Java`の`Constructor`/`Method`を直接呼び出す場合に問題になります。

# 対処法
冒頭で書いた通り、`KType.javaType`を呼び出すか、`Java`の`Constructor`/`Method`からパラメータ情報を取得することで対応が可能です。
`KType.javaType`を呼び出す例は以下の通りです。

```kotlin:KType.javaTypeを呼び出す例
val parameters = (::Temp as KFunction<Temp>).parameters

val javaTypes: List<Class<*>> = parameters.map { it.type.javaType as Class<*> }
```

`KType.classifier`や`KType.jvmErasure`を使った場合、以下の通り`Kotlin`の型が取れています。

```kotlin
val classifiers = parameters.map { (it.type.classifier as KClass<*>) }
// -> [class kotlin.UByte, class kotlin.UShort, class kotlin.UInt, class kotlin.ULong, class com.wrongwrong.factory.InlineInt, class com.wrongwrong.factory.InlineString]
println(classifiers.map { it.java })
// -> [null, null, null, null, null, null]
println(classifiers.map { it.javaPrimitiveType })

// -> [class kotlin.UByte, class kotlin.UShort, class kotlin.UInt, class kotlin.ULong, class com.wrongwrong.factory.InlineInt, class com.wrongwrong.factory.InlineString]
println(parameters.map { it.type.jvmErasure.java })
```