OmniAICreator/Qiita-1.07M huggingface dataset:
GCPの無料枠でWordPressを構築

GCPと言ってもDebianのインスタンス立ち上げて
Docker Compose入れてWordPress立ち上げるだけなんだけどね:man_tone1:
私の場合は、WordPressをHeadlessCMSとしてのみ使おうとしていますので最小構成でもなんとかなるかなって思ってます。

## GCPの無料枠のインスタンス
![gcp_icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415529/13f2090b-01bb-5fc7-a235-0793ec3a1db7.png)

2年後もずっと無料枠のインスタンスは以下です。

- f1-micro インスタンス（1 か月あたり、北バージニア [us-east4] を除く米国リージョンのみ）
- 30 GB-月の HDD
- 5 GB-月のスナップショット（一部のリージョン）
- 1 GB の北米から全リージョン宛ての下りネットワーク（1 か月あたり、中国とオーストラリアを除く)

で構築します。
インスタンスのOSはデフォルトだったDebianにしました。
(UbuntuやRasbianよく触ってたしね:grin:)
あ、80番ポートは開けておいてね。

- [x]  HTTPトラフィックを許可する
- [x]  HTTPSトラフィックを許可する

## GCPのssh接続
GCPにログインしてハンバーガーメニューを押します。
「Compute Engine」 -> 「メタデータ」 -> 「ssh認証鍵」で自分の鍵を登録します。
鍵の一番最後は、接続するユーザ名になっているので接続したいユーザ名で登録してください。
(ブラウザのsshで接続した時と同じ名前がいいと思う。)

## Dockerのインストール
<img width="177" alt="docker.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415529/fed3c8bc-129c-147e-cf5e-6f7a2109cde8.png">

インストールはめちゃ簡単でした。

```bash
curl -fsSL https://get.docker.com/ | sh
docker --version
```

### sudo無しで実行できるようにする
このままだとsudoないと怒られます。
なので自分にdockerの権限を付与します。

```bash
sudo gpasswd -a $USER docker
newgrp docker
```

これで`docker`はsudo無しで行けるようになりました。

```bash
docker ps
```

## Docker Composeのインストール
![docker-compose.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415529/3abc8094-8e68-d586-b02e-93839a868ad1.png)

これまたDocker Composeもインストールめちゃ簡単でした。
公式を参考に`/usr/local/bin`に入れます。

```bash
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
```

終了!

## Docker ComposeでWordPress構築します。
![wordpress.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415529/a332fc5d-4d81-27ec-4e82-71e3bf694dd6.png)

作成するのは、

- docker-compose.yml
- .env

```yml:docker-compose.yml
version: "3"
services:
  wordpress:
    image: wordpress:5.2
    volumes:
      - ./wp-content:/var/www/html/wp-content
    container_name: wordpress
    ports:
      - "80:80"
    links:
      - mysql
    env_file: .env
  mysql:
    image: mariadb
    volumes:
      - ./db-data:/var/lib/mysql
    container_name: mysql
    env_file: .env
```

```env:.env
# WordPress
WORDPRESS_DB_NAME=wordpress
WORDPRESS_DB_USER=wp_user
WORDPRESS_DB_PASSWORD=secretpw0001
WORDPRESS_DB_HOST=mysql
# VIRTUAL_HOST=localhost

# MySQL
MYSQL_RANDOM_ROOT_PASSWORD=secretpw0002
MYSQL_DATABASE=wordpress
MYSQL_USER=wp_user
MYSQL_PASSWORD=secretpw0001
```

そして、WordPressが起動できました！！！
めでたしめでたし！

## 参考
- [GCPの無料枠 公式](https://cloud.google.com/free/?hl=ja)
- [Docker ComposeのInstall 公式](https://docs.docker.com/compose/install/)
ちゃんと動く

# 表示されるところだけ書き換えたら動いた
- サンプルコードで`main.go`を実行すると表示される箇所だけ内容を書き換えた
- そうしたら書き換えた内容の通り表示された

```
$ go run main.go 
superdry
kikumasamune
ardbeg
```

# 本丸は書き方の問題と判明

- 表示された内容を書いている構文に問題があると判明
- そのまま書くと問題になると思うので少しボカして書きます


- うまく動いたコード：

```
$ cat ******.go
package a*****
func ******() string {
    return "superdry"
}

```

- ダメだったコード：

```
$ cat beer.go 
package type 
func beerfamous() string {
    return "Superdry"
}
```

# う〜ん、違いが分からない（涙
- そんな訳で明日はサンプルコードの中身（構文）を部分的に書き換えて動くか試してみよう
- 眠たいので寝ます。お休みなさい（月
【編集中】スキーマ間のExport⇒Importでトリガーのエラーが...

# TODO
- [ ]  解決した情報を記載！！

# トリガー関連操作

```sql:triggerControl.sql
-- トリガー名を確認
SELECT trigger_name, status FROM user_triggers;

-- トリガーの内容を確認
SELECT line, text FROM user_source WHERE name = "SchemaName"."TriggerName" ORDER BY name, line;

-- トリガーの有効化/無効化
ALTER TRIGGER "SchemaName"."TriggerName" ENABLE;
ALTER TRIGGER "SchemaName"."TriggerName" DISABLE;

-- 対策
-- トリガー定義を確認して、再作成すればいけるんだろうな。。。後で試してみる

```

# 参考サイト
◆インポート操作上のスキーマおよびデータベース・トリガーの影響
　https://docs.oracle.com/cd/E57425_01/121/SUTIL/GUID-B4E12380-C676-46E8-B7AB-D0107606DEB5.htm
　　※多分、これが原因なんだろうな。。。
◆Oracleデータベーストリガーのインポート
　https://oshiete.goo.ne.jp/qa/487169.html
　　※この質問の現象と近い...
◆OracleのIMPについて
　https://qa.itmedia.co.jp/qa6511589.html
◆oracleでトリガー名を確認する、内容を確認する、有効化と無効化 
　http://te2u.hatenablog.jp/entry/2012/10/31/222302
◆ORACLE／TRIGGER編 - オラクルちょこっとリファレンス
　https://oracle-chokotto.com/ora_trigger.html
◆[データディクショナリ] トリガーの情報を取得する
　https://oracle.programmer-reference.com/datadictionary-triggers/
AutoHotkeyに実装したアレコレ　～括弧自動入力編～

# 但し書き
完全なオレオレ環境です。
クリップボード周りでトチっていそうだったら、Sleepを片っ端から100とか200とかにしてみると改善するかも。

# やっていること
「選択した文字列をクリップボードにコピーし、その前後を引数で挟んで返す」関数を用意した。
クリップボードへの登録はCtrl+Cで行う。
Ctrl+C後にクリップボードが0文字だったら(=無選択だったら)単に引数を返して**カーソルをひとつ前に送る**。
また、Ctrl+C後にクリップボード内に改行が入っていたら、無選択と同様の処理を行う。

```
WrapBracket(x,y){
  Backup := ClipboardAll
  Clipboard =
  Send, ^c
  Sleep,50
  IfInString, Clipboard, `r`n
  {
    Clipboard = 
    ClipStatus := 0 ;からっぽのカッコが送られるので0
  }Else if (Clipboard = ""){
    ClipStatus := 0
  }else{
    ClipStatus := 1 ;中身があるので1
    #if
  }
;  StringReplace, Clipboard, Clipboard, `r`n, , All
  Sleep,50
  Clipboard = %x%%Clipboard%%y%
  Sleep, 50
  Send,^v
  Sleep,50
  if (ClipStatus = 0){
    send,{Left}
  }Else{
    #If
  }
  Clipboard := Backup
  ClipStatus = 
}
```

呼び出しはこうする。

```
sc07B & k::
WrapBracket("「","」")
Return
```

# どうしてこんな処理をしているの?
AutoHotkeyの欠点のひとつとして、クリップボード周りの処理が遅い・不確実というのがある。
選択範囲を取得するのにクリップボードが不可欠だが、そのクリップボードを編集するためにリソースを食うのだ。

また、AutoHotkeyは日本語IMEをうまく扱えない。
IMEがONの状態で関数を発動させた場合、直接送り出した文字列は「日本語IMEをONにした状態で入力した」ものとなる。

```
OutputContents = autoHotkey

sc07B & w::
Send,%OutputContents%
Return
```

この状態の時、出力結果はこのようになる。

| IME OFF | IME ON |
| :------------------: | :------------------: |
| autoHotkey | あうとHotkey |

AutoHotkeyにおける文字列出力は、究極的にはプログラムくんがキーボードを叩いているだけのことだ。
IMEをONにした状態で叩かせれば、当然日本語が入力される。

ホットキーを入力した際にIMEをOFFにするという発想もある。
実際、[それを実現してくれる関数も公開されている](https://www6.atwiki.jp/eamat/pages/17.html)。
関数の機能を適切に用いれば、ホットキー処理終了後にIMEの状態を復元することも可能だ。

だが、結局はクリップボードの処理速度がボトルネックになる。
前にコピーした文字列がテキストファイルひとつ分だったとしたら、それがひたすらに垂れ流され続ける(実話)。
それがSkypeのチャットだったりして、クリップボードに改行が入ってなどいたりした日には(実話)。
あまつさえチャットの設定を「Enterキーで送信」などにしていた日には(実話)!

目も当てられない。
だから、速度を妥協してでも変数を触るという処理にしているのだ。

また、環境によってはIMEの状態を復元する処理が**AutoHotkeyによる入力途中に**発生する危険性がある。
文字列をそのまま送信しているだけなので、入力した文字列がそのまま変換候補に出てくるだけだ。
しかし、これを他の機能や入力と連携させるとなると……。

誰か、いい方法を教えて(懇願)

# 今後の展望
この記事は「括弧自動入力編」である。
当然、後方にはいろいろな記事が控えている。

電話番号や日付のフォーマット別自動入力だとか、Windowsの機能と絡めた『ボスが来た』機能実装のアレコレだとか。
我ながらニッチだと思うのは、小文字←→大文字変換スキームだ。
AutoHotkeyはなかなか便利な機能があるので飽きない。

興味が湧いたという物好きな人は[ここ](https://www.autohotkey.com/)からAutoHotkeyを落としてインストールしよう。
共に世界の支配構造を打ち砕こうではないか。
AtCoder ARC001 B - リモコン

AtCoder ARC001 B - リモコン を解きました。
簡単なんだけど、面白い問題だと思いました。

## 問題
> 高橋君は、エアコンの設定温度を変更しようとしています。現在の設定温度は A 度ですが、これを B 度に設定したいと思っています。
> エアコンのリモコンは 1 回ボタンを押すことで、
> * 1 度設定温度を下げる、もしくは上げる
> * 5 度設定温度を下げる、もしくは上げる
> * 10 度設定温度を下げる、もしくは上げる
> の、 6 種類の操作のいずれか 1 つを実行することが出来ます。
> 高橋君が設定温度を A 度から B 度に変更するために押すボタンの最小回数を求めなさい。
( https://atcoder.jp/contests/arc001/tasks/arc001_2 より引用)

## 制約
$0 \le A \le 40$
$0 \le B \le 40$

## 考え方

10度 → 5度 → 1度 の順に貪欲に押していけばいいだろ〜と思って実装したら、サンプルケース2で無事死亡。
DPかな？という考えが一瞬頭をよぎったけど、各温度の値が上下1度、5度、10度ずつの値と結ばれたグラフと考えれば、制約も小さいし幅優先探索でいけそうだな、と思って実装したら AC でした。

## 提出コード

次のようなコードを書きました（抜粋）。全体は[こちら](https://atcoder.jp/contests/arc001/submissions/5407560)
注意すべき点としては、A=9, B=0 のように、温度を一旦負の数にしてから戻すのが最適、というパターンも考えられるので、探索中に多少負の温度になっても大丈夫なように、全体を+10ほどシフトして計算しています。（差分の絶対値にしてから計算すれば、そのような工夫は不要）

```go
func main() {
	defer stdout.Flush()
	a := readInt() + 10
	b := readInt() + 10
	d := make([]int, 100)
	for i := range d {
		d[i] = 1000000
	}
	q := make([]int, 0)
	push := func(v int) {
		q = append(q, v)
	}
	pop := func() int {
		v := q[0]
		q = q[1:]
		return v
	}

	d[a] = 0
	push(a)
	for len(q) != 0 {
		t := pop()
		if t == b {
			println(d[b])
			return
		}
		for _, dt := range []int{-10, -5, -1, 1, 5, 10} {
			nt := t + dt
			if nt < 0 || len(d) <= nt {
				continue
			}
			if d[nt] <= d[t]+1 {
				continue
			}
			d[nt] = d[t] + 1
			push(nt)
		}
	}
}
```

## 追記

10未満の距離について予め表を持っておくことで計算を簡略化する方法を教えていただきました。これなら制約が大きくても大丈夫そう。

```go
func main() {
	defer stdout.Flush()
	a := readInt()
	b := readInt()
	d := b - a
	if d < 0 {
		d = -d
	}
	println(d/10 + []int{0, 1, 2, 3, 2, 1, 2, 3, 3, 2}[d%10])
}
```
まず絶対誤差 d を 10 で割って、何回10を押せばよいかをまずカウントします。
次に、残りの差分を飛ぶためにあと何回押せばよいかを、予め作っておいた表から取り出して足します。

$0,1,3,2,1,2,3,3,2$ という数字の並びは、10未満の差分へ飛ぶときに何回ボタンを押すか、という表です。
差分が0度なら0回ボタンを押せばいい、差分が1度なら1回ボタンをおせばいい、... というふうに考えて生成します。1回のボタン操作で飛ぶことができる差分である1度と5度と10度の値は1になり、その他の差分の値はそれらからの距離で最も小さい値になります。
10度差分のための1は d/10 の側でカウントされるので、この表には不要であり、↑には登場していない、というのが少しわかりにくいポイントでしょうか。
VB基本まとめ~条件分岐・ループ編~

#条件分岐
処理の分岐にはIfステートメント、Select Caseステートメントの他に、三項演算子に当たるIf演算子・IIf関数があります。
IfステートメントとSelect Caseの使い分けですが、特定の値にて複数に分岐をする場合はSelect Caseを、複数の条件を交えて分岐する場合はIfを使用します。

##Ifステートメント
```VB
If 条件1 Andalso 条件2 Orelse 条件3 Then
    '*** 処理(条件1かつ2に当てはまるか条件3に当てはまる場合)
ElseIf 条件4 And 条件5 Or 条件6 Then
    '*** 処理(条件4かつ5に当てはまるか条件6に当てはまる場合)
Else
    '*** 処理(上記条件に当てはまらない場合)
End If
```

##Select Caseステートメント
```VB
Select Case 調べる値
    Case 値1
        '*** 調べる値 = 値1の場合
    Case 値2, 値3, 値4
        '*** 調べる値が値2,値3,値4のいずれかの場合
    Case 値5 To 値7
        '*** 調べる値が値5~値7の場合
    Case Is > 値8
        '*** 調べる値が値8より大きい場合
    Case 値9, 値10 To 値12, Is > 値13
        '*** 組み合わせも可能
    Case Else
        '*** 上記のいずれにも当てはまらない場合
End Select
```

##三項演算子(If演算子,IIf関数)
```VB
If(条件, Trueの時の値, Falseの時の値)
IIf(条件, Trueの時の値, Falseの時の値)
```
IfとIIfの違いはIfが条件に当てはまる方のみの値を処理するのに対し、IIfは両方処理される違いがある。

#ループ
処理をループする方法として、Forステートメント、ForEachステートメント、Whileステートメント、Doステートメントがあります。
ループを途中で抜けたい場合はExitステートメントを使用することで現在のループを抜けることが出来ます。
また、For・ForEachステートメントはContinueステートメントを使用することで強制的に次のステップに進めることが出来ます。

##Forステートメント
```VB
For カウンタ = 開始値 To 終了値 Step 増減値
    '*** 処理
    If 途中で抜ける条件 Then
        '*** ループを抜ける
        Exit For
    End If
Next

'*** 逆順や跳び番でループする場合はStepを使用する
For i = 10 To 1 Step -1
    '*** 処理(10から1まで繰り返す)
    If 途中で抜ける条件 Then
        '*** 次のステップに
        Continue For
    End If
Next
```

##For Eachステートメント
```VB
For Each 要素 In コレクション
    '*** 処理
Next

For Each num In {1, 2, 3, 4, 5}
    '*** 処理(1,2,3,4,5を順に処理する)
Next
```

##Whileステートメント
```VB
While 条件
    '*** 条件を満たしている間ループ
    If 途中で抜ける条件 Then
        '*** ループを抜ける
        Exit While
    End If
End While
```

##Do Loopステートメント
```VB
Do While 条件
    '*** 条件を満たしている間ループ(Whileステートメントと同様)
    If 途中で抜ける条件 Then
        '*** ループを抜ける
        Exit Do
    End If
Loop

Do
    '*** 条件を満たしている間ループ(Do Whileと違い一回は通る)
Loop While 条件

Do Until 条件
    '*** 条件を満たすまでループ(Do Whileと逆の条件)
Loop

Do
    '*** 条件を満たすまでループ(Do Untilと違い一回は通る)
Loop Until 条件

```

##入れ子になったループからの脱出
先にふれたようにExitステートメントでループを抜けることが出来ますが、抜けられるのは一番内側のループになります。その為、ネストされたループも合わせて抜けたい場合そのままでは抜けることが出来ません。
ネストされたループから脱出する方法の例をあげますので参考にしてみてください。

```VB
'*** 例1：同じ条件やフラグを用いる
For i = 1 To 10
    For j = 1 To 10
        If 抜ける条件 Then
            Exit For
        End If
    Next
    If 抜ける条件1 Then
        Exit For
    End If
Next

'*** 例2：Gotoを使用
For i = 1 To 10
    For j = 1 To 10
        If 抜ける条件 Then
            Goto ExitFor
        End If
    Next
Next
ExitFor:

'*** 例3：大外のループに別のループを用い、そのExitステートメントを使用
Dim i = 1
Do While i <= 10
    For j = 1 To 10
        If 抜ける条件 Then
            Exit Do
        End If
    Next
    i += 1
Loop

'*** 例4：ループ処理を関数化し、関数から抜ける
Sub LoopMethod()
    For i = 1 To 10
        For j = 1 To 10
            If 抜ける条件 Then
                Exit Sub
            End If
        Next
    Next
End Sub
```
F値の事(F1,F2,F0.5)

#1.はじめに
H2Oという機械学習ライブラリの[DOC](http://docs.h2o.ai/h2o/latest-stable/h2o-docs/performance-and-prediction.html?highlight=performance)中に、機械学習の性能評価に用いる指標として以下の指標が載ってました。説明と注意点をまとめたら下記のような感じでした。
※ほんとはだめなんでしょうが各記号の説明等は略してますスミマセン。

#2.回帰問題

|指標　|説明|備考|
|---|---|---|
|R2|$$\frac{1}{N} \sum_{i=1}^{N}(y_i -\hat{y}_i)^2 $$|説明変数が目的変数をどれくらい説明しているか|
|MSE|$$\frac{1}{N}\sum_{i=1}^{n} (y_i-\hat{y}_i)^2$$ |外れ値の影響が大
|RMSE|$$\sqrt{\frac{1}{N} \sum_{i=1}^{N}(y_i -\hat{y}_i)^2 }$$|外れ値に敏感。※下のMAEは頑健|
|RMSELE|$$\sqrt{\frac{1}{N} \sum_{i=1}^{N} \big(ln \big(\frac{y_i +1} {\hat{y}_i +1}\big)\big)^2 }$$|過少予測が過大予測よりも問題となる場合にRMSEの代わりに使う。yiとy^iの値が大きく、その差が大きくなる場合もlogのおかげで影響を抑えられる。|
|MAE|$$\frac{1}{N} \sum_{i=1}^{N} \left\lvert x_i - x\right\lvert$$|外れ値に対して頑健。式見るとそりゃそうだ|
が紹介されており、



#3.分類問題
|指標　|説明|備考|
|---|---|---|
|Gini Coefficient|[ここ](http://docs.h2o.ai/h2o/latest-stable/h2o-docs/performance-and-prediction.html?highlight=performance)参照||
|Absolute MCC|$$\sqrt(\frac{\chi^2}{n})$$|[ここ](https://en.wikipedia.org/wiki/Matthews_correlation_coefficient)参照。  imbalanced data（正解/不正解など２値のラベルに偏りがあるデータ）に良い|
|F1|$$2\frac{(precision)(recall)}{precison+recall}$$|適合率と再現率の調和平均|
|<font color="red">F0.5</font>|$$1.25\frac{(precision)(recall)}{0.25precison+recall}$$|適合率重視の場合|
|<font color="red">F2</font>|$$5\frac{(precision)(recall)}{4precison+recall}$$|再現率重視の場合|
|Accuracy|$$\frac{TP+FN}{TP+TN+FP+FN}$$|解釈しやすい|
|Logloss|[ここ](http://docs.h2o.ai/h2o/latest-stable/h2o-docs/performance-and-prediction.html?highlight=performance)参照|情報利得みたいな式|
|AUC|[ここ](https://en.wikipedia.org/wiki/Receiver_operating_characteristic)参照|TPとFPをどれだけ区別できているかの指標|
|AUCPR|[ここ](https://en.wikipedia.org/wiki/Receiver_operating_characteristic)参照|imbalanced data(TNがFPと比較して多すぎる場合)に良い|



#4 F0.5とF2について調べてみた。
指標はだいたい知っていました（つもり）でした。
が、F0.5,F2ってなんだろうと思い、その部分のみ注目。混同行列からF1,F2,F0.5を出してみると
確かに再現率重視、適合率重視の指標であると納得。
![無題1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385220/055f240f-ea87-bed1-39a4-d3ee90d6a9b3.png)
![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385220/61870c5f-479a-09ea-b8dc-f0c19eb95a4e.png)


学習モデルの修正の際に、F2やF0.5を上げるのを目標にして修正していくような場面で使うんでしょうか？
できれば、どうやればF2,F0.5を上げられるか検討したいですね。
あと、多値分類は考えるのがつらくなってきたのでとりあえず辞めました。
正例／負例にかたよりがあるようなものも要注意と再認識もしました。
やったAccuracyが0.99、F値も０．８５もある。みたいな見せかけに注意しないとですね。
ちゃんとF0.5だと0.787まで下げて見せてくれてました。
![無題3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385220/367d246b-be8f-b3c8-f011-7d8f420fbb44.png)
Unity2DでSpriteを画面上の定位置に配置する方法

## Unity2DでSpriteを画面上の定位置に配置する方法
そのSpriteの親をMain Cameraにすることで実現できます。
ぜひ試してみてください。コメントもお待ちしております。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
【Elixir】paizaスキルチェックの値取得・出力サンプルコード

# Elixirのサンプルコードがない
興味を持った言語に触ってみる際、[paizaスキルチェック](https://paiza.jp/challenges)で問題を解いてみることが多いのだが、提出可能だがサンプルコードが載っていない言語がある…。

[ElixirでPaizaのD問題](https://qiita.com/ynishi2015/items/bab97069e19d0dc1f7bb)
[【doctestつき】AtCoder に登録したら解くべき精選過去問 10 問を"Elixir"で解いてみた](https://qiita.com/koyo-miyamura/items/9f224a3e56ea75939dca)

Elixirのサンプルコードを上げてくださってくれている方もいらっしゃるが、同じ問題を他言語と比較してみたい欲もあるので、paizaスキルチェックのサンプルコードに則ったコードを記載します。

## サンプルコード
参考: [値取得・出力サンプルコード](https://paiza.jp/guide/samplecode)

### 入力される値
```
2
2 5
3 4
```

### 期待される出力
```
hello = 2 , world = 5 
hello = 3 , world = 4
```

### Elixir

```
defmodule Hello do
  def loop(0) do
  end

  def loop(times) do
    [a, b] = IO.gets("") |> String.trim |> String.split
    
    IO.puts "hello = #{a} , world =  #{b}"
    loop(times - 1)
  end
end

n = IO.gets("") |> String.trim |> String.to_integer
Hello.loop n
```
AVRマイコンでいろいろやる①-2　開発環境構築

まだ送受信はいけませんでした。
ここでは以下を行います。
1. Arduino回路構築
2. Arduino ISP 書き込み
3. ライタ回路構築
4. hexファイル書き込み

# 1. Arduino回路構築
昔作った回路があったので流用しています。
画像だけのっけときます。
回路図書くのが面倒なので写真で保存しておきます。
![IMG_20190515_224435.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416780/a0e0e7a9-b3e8-e7b8-2ef4-48290e4b7ae1.jpeg)

Arduinoは右側のブレッドボードです。
左側は書き込み回路です。
抵抗値くらいは読み取れるんじゃないかと思います。
水晶は16MHzです。
ATmega328PはArduinoのブートローダ書き込み済みの物を買ってきます。
１個あればArduino ISPでターゲットマイコンをArduinoにできます。

# 2. Arduino ISP 書き込み
そしてArduino IDEのスケッチ例からArduino ISPを選択します。
![20190515_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416780/12742ce0-3284-bfd4-66d6-02c503dd8078.png)
適当に書き込んだら完成です。

# 3.ライタ回路構築
これは先の回路画像の左側です。
画像を見ていたら水晶くっつけてあるんですがコンデンサのGND側が浮いていますね。
水晶発振にしてあるのでつけてないとターゲットマイコンが動かないんですが、
コンデンサの反対側が浮いていてもなぜか動いています。
水晶発振の仕組みをあまり理解していないのも問題ですが、
まあ動いてるしいいか・・・。

# 4.hexファイル書き込み
最後にhexファイルを書き込みます。
まずhexファイルですが、Atmel Studioでビルドすると
ソリューションフォルダのReleaseフォルダに吐き出されます。
なのでコマンドプロンプトを開いたらcdでhexファイルがあるReleaseフォルダに移動します。
そして下記コマンドで書き込みます。
```avrdude -c avrisp -P COMn -b 19200 -p m328p -U flash:w:hoge.hex
```
[こちらのページ](http://blog.livedoor.jp/hymne333/archives/4710525.html)を参考にさせていただきました。

以上です。
とりあえずマイコンデータ送信の試験まではできているので次はそれを書きます。
PuTTY SSH Windowsで自動ログインのやり方(画像あり)

+ `putty.exe - ショートカット` をデスクトップに作成する

+ 上記のショートカットを右クリックして、リンク先を下記のように変更する

```
"C:\Program Files\PuTTY\putty.exe" user@xxx.xxx.xxx.xx -pw xxxxxxxxx
```

![putty-shortcut.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125746/c93c00c9-e0a3-e750-4dc6-bbd533e24fb1.png)
Magic Leap MagicScript Landscape Application. UiCircleConfirmation

**Prepare**
Magic Leap One
https://www.magicleap.com/magic-leap-one

mlsdk v.0.20.0
https://creator.magicleap.com/downloads/lumin-sdk/overview

magic-script-cli v2.0.1
https://www.npmjs.com/package/magic-script-cli

magic-script-polyfills v2.1.1
https://www.npmjs.com/package/magic-script-polyfills

**Create Project**

```
magic-script init my-cc org.magicscript.cc "Circle Confirmation"
cd my-cc
```

**Code**
Change app.js

```javascript
import { LandscapeApp, ui } from 'lumin';
const { 
    UiLinearLayout
  , UiCircleConfirmation
  , UiText
  , EclipseLabelType
  , Alignment} = ui;

export class App extends LandscapeApp {
  onAppStart () {
    const prism = this.requestNewPrism([0.5, 0.5, 0.5]);
    const layout = UiLinearLayout.Create(prism);
    layout.setAlignment(Alignment.CENTER_CENTER);

    const text = UiText.CreateEclipseLabel(
      prism,
      '0%',
      EclipseLabelType.kT7
    );
    
    const cc = UiCircleConfirmation.Create(prism, 0.1);
    cc.setAlignment(Alignment.TOP_CENTER);
    cc.onConfirmationUpdateSub(function(event)
    {
        let progress = (cc.getAngle() * 100) / 628;
        progress*=100;
        progress = Math.floor(progress);
        text.setTextColor([1.0, 1.0, 1.0 - progress / 100, 1.0]);
        text.setText(progress + "%");
    });
    cc.onConfirmationCompleteSub(function(event)
    {
        text.setTextColor([1.0, 1.0, 0.0, 1.0]);
        text.setText("100%");
    });
    layout.addItem(cc
      , [0.01, 0.01, 0.01, 0.01]
      , Alignment.TOP_CENTER);
    layout.addItem(text
      , [0.01, 0.01, 0.01, 0.01]
      , Alignment.BOTTOM_CENTER);
    prism.getRootNode().addChild(layout);
  }
}

```

**Build**

```
magic-script build -i
```

**Run**

```
magic-script run --port=10000
```

**Reference**
UiCircleConfirmation (MagicScript API)
https://docs.magicscript.org/lumin.ui.UiCircleConfirmation.html

magicscript
https://www.magicscript.org/

Thanks!
【Java】暗黙の継承メモ

#Objectクラス#
あらゆるクラスの祖先としてObjectクラスがある。しれっと継承されている。
以下のメソッドを持っている。

- `equals()`：あるインスタンスが自分自信と同じか調べる。
- `toString()`：自分自身の内容の文字列表現を返す。

Objectクラスがあることで、多態性を利用して「何型でもいいからインスタンスを渡せるメソッド」が作れたり、「すべてのクラスが最低限持っていて欲しいメソッド」が定義できたりする。

`System.out.println`なんかは引数にオブジェクトを受け取れる。
なので、

```Sub.java
public class Sub{
    // なんか内容書いてあるとして
}
```

```Main.java
public class Main
    public static void main(String[] args){
        Sub s = new Sub();

        System.out.println(s);            // (1)
        System.out.println(s.toString()); // (2)
}
```
`(1)`と`(2)`の出力結果は同じになる。

```実行結果.
test.Sub@5c8da962
test.Sub@5c8da962
```

##toStringメソッド##
オーバーライドして使っていく。さっきの例で行くと、

```Sub.java
public class Sub {
	String name = "本田未央";

	public String toString(){
		return this.name;
	}
}
```

```Main.java
public class Main
    public static void main(String[] args){
        Sub s = new Sub();
        System.out.println(s);            // (1)
        System.out.println(s.toString()); // (2)
}
```

```実行結果.
本田未央   // (1)
本田未央   // (2)
```
一体なんのプログラムなんだこれは。(雑すぎる)

なお、`String`クラスの`toString`メソッド自体は

```String.java
public class toString(){
    return this;
}
```

これだけらしい。EclipseでF3押して読んだが、2806行目にあった。

##equalsメソッド##
等価判断・等値判断に使われることがある。

- **等値**：参照しているアドレスが同じ。`==`演算子で判定。
- **等価**：参照しているアドレスは異なるが値は同じ。`equals`メソッドで判定。

という雑な認識。
素の`equals`メソッド自体は、

```String.java
    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String aString = (String)anObject;
            if (coder() == aString.coder()) {
                return isLatin1() ? StringLatin1.equals(value, aString.value)
                                  : StringUTF16.equals(value, aString.value);
            }
        }
        return false;
```
(1002行目にあった)
今これを詳しく見ていくと夜だし徹夜しそうなのだが。
でも、とても大雑把に言うと、実際は等値判定をやっている、ということだそう。
というわけで、実際使う時は**何を以って等価とするか**を決めておく。

ここでは仮に`name`フィールドが一緒だったらヨシ！ということで……

```Sub.java
public class Sub {
	String name = "本田未央";

	public boolean equals(Object o){
		// 等値だった場合(間違いなく等価)
		if (this == o) {
			return true;
		}
		
		// 等価だった場合
		if (o instanceof Sub) {
			Sub s = (Sub) o;
			if (this.name == s.name) {
				return true;
			}
		}
		
		// 等値でも等価でもなかった場合
		return false;
	}
}
```

```Main.java
public class Main {
	public static void main(String[] args) {
		// インスタンスを3個生成
		Sub s1 = new Sub();
		Sub s2 = new Sub();
		Sub s3 = new Sub();

		// それぞれのnameフィールドに値を入れる
		s1.name = "本田未央";
		s2.name = "本田未央";
		s3.name = "本田圭佑";

		// 等価判定の結果を出力
		System.out.pritln( s1.equals(s2) );
		System.out.pritln( s1.equals(s3) );
	}
}
```
```出力結果.
true
false
```

本当に雑なプログラムだ
まぁ、使い方の覚え書きだから何でもいいんだけど……

#参考書籍#
[スッキリわかるJava入門第二版]
(https://www.amazon.co.jp/%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8BJava%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%B8%AD%E5%B1%B1-%E6%B8%85%E5%96%AC/dp/484433638X)
Pp.541-551
dynamodb基本操作

##テーブル作成・テーブル検索

```
import boto3

dynamodbResource = boto3.resource(
    'dynamodb',
    region_name='ap-northeast-1.',
    endpoint_url="http://192.168.99.100:8000",
    aws_access_key_id='ACCESS_ID',
    aws_secret_access_key='ACCESS_KEY'
)

table = dynamodbResource.create_table(
    TableName='test',
    KeySchema=[
        {
            'AttributeName': 'id',
            'KeyType': 'HASH'
        }
    ],
    AttributeDefinitions=[
        {
            'AttributeName': 'id',
            'AttributeType': 'N'
        }
    ],
    ProvisionedThroughput={
        'ReadCapacityUnits': 1,
        'WriteCapacityUnits': 1
    }
)

dynamodbClient = boto3.client(
    'dynamodb',
    region_name='ap-northeast-1.',
    endpoint_url="http://192.168.99.100:8000",
    aws_access_key_id='ACCESS_ID',
    aws_secret_access_key='ACCESS_KEY'
)

tables = dynamodbClient.list_tables()

print('Tables List:',tables)

```

[Dynamodbの公式ページを見ると、](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html)resourceが高レベルのオブジェクト指向インタフェースで、
clientが低レベルな操作が可能なインターフェースとなっております。
resourceで接続して、<b>create_table</b>でテーブルを作成しています。
clientで接続して、<b>list_tables</b>でテーブル一覧を取得しております。

```:実行結果
Tables List: {'TableNames': ['test'], 'ResponseMetadata': {'RequestId': 'b3531c83-3c74-4df9-b187-c47dc43e1207', 'HTTPStatusCode': 200, 'HTTPHeaders': {'content-type': 'application/x-amz-json-1.0', 'x-amz-crc32': '2541094426', 'x-amzn-requestid': 'b3531c83-3c74-4df9-b187-c47dc43e1207', 'content-length': '83', 'server': 'Jetty(8.1.12.v20130726)'}, 'RetryAttempts': 0}}
```

TableNamesが欲しいときは、TableNamesだけを指定すれば取得できます。複数テーブルでも取得できます。

##データの追加

```
import boto3

dynamodbResource = boto3.resource(
    'dynamodb',
    region_name='ap-northeast-1.',
    endpoint_url="http://192.168.99.100:8000",
    aws_access_key_id='ACCESS_ID',
    aws_secret_access_key='ACCESS_KEY'
)

table = dynamodbResource.Table('test')
table.put_item(
    Item={
        'id': 1,
        'name': 'apple',
        'price': 30
    }
)

item = table.get_item(Key={'id': 1})

print(item['Item'])
```

resourceで接続して、put_itemで追加するデータを宣言して、追加します。
get_itemでkeyを指定して取得しています。

##データの更新

```
import boto3

dynamodbResource = boto3.resource(
    'dynamodb',
    region_name='ap-northeast-1.',
    endpoint_url="http://192.168.99.100:8000",
    aws_access_key_id='ACCESS_ID',
    aws_secret_access_key='ACCESS_KEY'
)

table = dynamodbResource.Table('test')
res = table.update_item(
    Key={
        'id': 1
    },
    ExpressionAttributeValues={
        ':p': 1,
    },
    UpdateExpression='set price = :p',
    ReturnValues="UPDATED_NEW"
)

item = table.get_item(Key={'id': 1})

print(item['Item'])
```

[データを更新しています公式参照](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/SQLtoNoSQL.UpdateData.html)

##データ削除

```
import boto3

dynamodbResource = boto3.resource(
    'dynamodb',
    region_name='ap-northeast-1.',
    endpoint_url="http://192.168.99.100:8000",
    aws_access_key_id='ACCESS_ID',
    aws_secret_access_key='ACCESS_KEY'
)

table = dynamodbResource.Table('test')

table.delete_item(Key={'id': 1})
print('delete_item done')
```
画面作成時にイメージが見えなくなるのを解消しよう

AndroidStudioでデザイン画面で画面を作成していてイメージが暗くなることがあります。
しかも、その画面に部品を入れても反映されているのかわからないくらい完成イメージが真っ暗になります。
ただ、実機に繋ぐと上手く画面が見えてます。
とにかく作りにくいのでエラーを解決しました。

今回は2つのエラーを解決したので、Qiitaに残したいと思います。

####①Failed to find style 'coordinatorlayoutstyle' in current theme

SDKのバージョンを28に設定していたのですが、27に下げると直りました。

```build.gradle
android {
    compileSdkVersion 27
    defaultConfig {
        targetSdkVersion 27

dependencies {
    implementation 'com.android.support:appcompat-v7:27.0.0'
    implementation 'com.android.support:support-v4:27.0.0'
    implementation 'com.android.support:design:27.0.0'
}
```

####②Failed to load AppCompat ActionBar with unknown error

プロジェクトを作成したときからこのエラーが出ていました。
res/values/style.xmlファイルを編集すると直りました。

```修正前
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
```

下記のように修正しました。

```修正前
<style name="AppTheme" parent="Base.Theme.AppCompat.Light.DarkActionBar">
```

デザイン画面で画面が見えなくなるのはパターンが決まってそうなので、覚えておくといいかもしれないですね。

####参照
[アプリ作成時にレイアウトファイルでRendering Problemsが出た時の対処](https://qiita.com/hisash1/items/ccf2973f6b5f9e6439dd)
[【トラブル】【Android】プロジェクト作成時のトラブル](https://blogs.yahoo.co.jp/dk521123/37714227.html)
Nexus7(2012) にAndroid 7をインストールする(TWRPが起動しない問題への対応)

# 重くなったNexus7(2012)を復活させたい

AndroidタブレットのNexus7を昔使っていましたが、AndroidのOSアップデートでAndroid5.1.1にしたところ死ぬほど重くなってしまったので使わなくなって放置していました。
その後アップデートが来ることなかったため、どうしようもないと思っていたのですが、こんな記事を見つけました。
[それ捨てちゃうの？AndroidタブレットNexus7(2012)編 | アニーの楽しい事だけ全力で！](https://codenm007.com/blog/?p=3698)
これによると新しいAndroidを入れることができ、動作も軽快になるとのことです。

# 手順

基本的には上記の記事を参考にしていきます。
コピペするのはアレなので、ポイントだけ解説します。

## ハマりポイント：TWRPが起動しない

上記記事通りにやってもうまくいきませんでした。
記事の手順4の以下

```bash:
$ fastboot flash recovery twrp-3.1.1-0-grouper.img
$ fastboot reboot
$ adb reboot bootloader
```

の2つめの `fastboot reboot` を実行するとタブレットが再起動しますが、その後**TWRP(カスタムリカバリツール)が起動しません**でした。1行目でTWRPの転送は成功したのに…
音量キー下を押しながら電源ONしてブートローダーで起動し、リカバリモードで起動してもTWRPではなく以前のリカバリツールが起動してしまいます。

## 原因と対処

いろいろ調べたところ、カスタムリカバリツールをインストールしても再起動するとAndroidのファイルシステムにある`system/recovery-from-boot.p`で上書きされてしまうそうです。
[カスタムリカバリが初回以降起動しない場合の対処法 | 琵琶湖で海釣り！-Season2-](https://ameblo.jp/yamame-32/entry-12076720586.html)
これの対処として、このファイルをリネームすれば良いそうです。

しかし、**システムファイルなのでroot権限がないとリネームできません。**
しかし、**root権限を得るためにはカスタムROMを入れる必要があります。**
**詰んだ＼(^o^)／**

これで諦めて一晩寝ました。( ˘ω˘)ｽﾔｧ

## 再チャレンジ

改めてTWRPが起動しない問題を調べたら以下の記事が見つかりました。
[SuperSUをインストールして、Android端末をroot化する方法 | POCHIRI.net](https://pochiri.net/supersu)
root化する記事ですが、その前にTWRPを導入する手順が記載されていました。

```bash:
$ fastboot flash recovery recovery.img
```

の後に

```bash:
$ fastboot boot recovery.img
```

コマンドを入力すると、無事TWRPが起動しました。**リブートの際に起動するイメージを指定**できるようですね。

その後は最初の記事の通り、あらかじめ入れておいたOSイメージとアプリをTWRPでインストールするだけです。
Android7導入後は、サクサク動くようになりました。感激です。
【Excel用】数字↔アルファベット変換

# やりたいこと

Excelの帳票作成時に、**n列目のExcelの横軸のアルファベットって何？**となった時に使用する変換です。
またその逆で**このアルファベットはn列目？**もあります。
組み合わせれば**A列からn番目の列のアルファベットは何？**が可能です。
Excelの帳票作成用なので0以下は考慮しません。
整数のみの前提です。


# 数値からアルファベットへ変換

|入力例|出力例|
|:-:|:-:|
|1|A|
|2|B|
|26|Z|
|27|AA|
|28|AB|
|52|AZ|
|53|BA|


```C#
private string ConvertAlphabet(int index)
{
    string result = string.Empty;

    //26より大きい場合は繰り返す
    do 
    {
        //対象を26で割った余り
        int amari = index % 26;
        //対象を26で割った商
        int sho = index / 26;

        //割り切れた時（Zを出すため）
        if (amari == 0)
        {
            amari = 26;
            sho--;
        }

        //余りの数のアルファベットを出力
        result = ((char)((int)'A' + amari - 1)).ToString() + result;

        //商を次の対象とする
        index = sho;

    }
    while (index > 26);

    //残りのアルファベットを出力
    result = ((char)((int)'A' + index - 1)).ToString() + result;

    return result;
}
```

# アルファベットから数値へ変換

|入力例|出力例|
|:-:|:-:|
|A|1|
|B|2|
|Z|26|
|AA|27|
|AB|28|
|AZ|52|
|BA|53|


```C#
private int ConvertInt(string alphabet)
{
    int index = 0;
    int length = 0;

    foreach (char c in value)
    {
        //最後の1文字は処理しない
        if (length == value.length - 1)
        {
            break;
        }

        index += 26 * ((int)c - (int)'A' + 1);
        length++;
    }

    index += (int)c - (int)'A' + 1;

    return index;
}
```

# 参考

[10進数をn進数に変換する計算式](https://www.peko-step.com/tool/nsin.html)
VirtualBoxでCentOSを使用する際の解像度を変更する方法

## はじめに

VirtualBoxにCentOS7をインストールした際ディスプレイの解像度が低い問題に遭遇したため、解像度の変更方法について備忘録を含めまとめたいと思います。


## 結論
`【①View】→【②Virtual Screen】→【③任意の解像度】`の順にクリックしてください。

<img width="1096" alt="スクリーンショット 2019-05-15 22.57.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226787/dfd0140b-5ddd-7531-10d8-d5ead4653fcf.png">

ご参考になれば幸いです。
基礎知識の補填　Python（リスト型）

# はじめに
Pythonエンジニアとしてデビューして早２ヶ月が経ち、だいぶ仕事の仕方や職場環境にも慣れた。

そこで今回は、日頃からPythonを触っているうちに自分の中で理解度の怪しい箇所や全く理解してなかったところなどがなんとなくわかってきたので、そろそろ知識の補填をしていきたいと思いさっそくアウトプットとして記念すべき初投稿をしたいと思う。

手始めにリストの復習で得た知識を書き残していく。

## ｎ個飛ばしで出力、後ろからｎ個ずつ出力
'a'という変数に1~8までの数値を入れ込み、a[::2]で出力する

```python

a = [1,2,3,4,5,6,7,8]
print(a[::2])

#出力結果
[1, 3, 5, 7]
```

後ろから-1ずつ表示

```python
a = [1,2,3,4,5,6,7,8]
print(a[::-1])

#出力結果
[8, 7, 6, 5, 4, 3, 2, 1]
```

## ネスト
xという変数へbとnをリストとして入れ込むことで、xというリストの中にbとnの２つのリストが入ることになる。

```python
b = ['a','b','c']
n = [1, 2, 3]
x = [b, n]
print(x)

#出力結果
[['a', 'b', 'c'], [1, 2, 3]]
```


bのリストのみを取り出して出力する場合

```python
b = ['a','b','c']
n = [1, 2, 3]
x = [b, n]

#bのみを出力させる(左から0から数えて1つ目のリスト)
print(x[0])

#出力結果
['a', 'b', 'c']
```
bのリストから'b'のみを取り出して出力する場合

```python
b = ['a','b','c']
n = [1, 2, 3]
x = [b, n]

#b内の'b'を出力させる(左から0から数えて1番目の値)
print(x[0][1])

#出力結果
b
```
nの場合も一緒

```python
b = ['a','b','c']
n = [1, 2, 3]
x = [b, n]

#nのみを出力させる(左から0から数えて1つ目のリスト)
print(x[1])

#n内の'n'を出力させる(左から0から数えて2番目の値)
print(x[1][2])

#出力結果
[1, 2, 3]
3
```
PythonとOpen CV 4でパノラマ写真を作る

投稿日2019/05/15

#やること
Open CVのStitcherクラスを使ってパノラマ写真を作ります。

#実行例

👇オリジナル画像
![hakodate.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216904/44cfcbff-2b62-56ca-4a85-740371b2178d.jpeg)

👇分割した画像
![hakodate-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216904/72af46bc-6edf-5812-7abb-104977c8e30c.jpeg)
![hakodate-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216904/0a6024b9-4c25-eab9-6ca7-f8453863390c.jpeg)

👇プログラムで生成した画像
![result.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216904/a2d6a1c2-b3ab-3bd6-078e-46bfe65c52e0.jpeg)

生成した画像の解像度はオリジナル画像より少し小さくなってしまっています。

👇ステッチが上手くいくとこんな感じにもなります。
![result.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216904/8d08d65e-2770-65fd-6a79-538090175c74.jpeg)


#実行環境
Python 3.7.2
Open CV 4.1.0

#プログラム
```join_picures.py
import cv2

print(cv2.__version__)#openCV 4.1.0で動作確認

if __name__ == "__main__":
    images = ['hakodate/hakodate-1.jpg', 'hakodate/hakodate-2.jpg']

    one = cv2.imread(images[0])
    two = cv2.imread(images[1])
    stitcher = cv2.Stitcher.create(False)
    result = stitcher.stitch((one,two))
    cv2.imwrite('hakodate/result.jpg', result[1])
    if result[0]==0:
        print("success")
    elif result[0]==1:
        print("failure")
```

#おまけ
旅行で行った函館、良いところでした。ラッキーピエロおいしかったです。

#参考
[How to use OpenCV Stitcher class with Python?](https://stackoverflow.com/questions/34362922/how-to-use-opencv-stitcher-class-with-python)
[作業メモ]Windows10 で dnscrypt-proxy を使う

### 概要

https://github.com/jedisct1/dnscrypt-proxy/wiki/Installation-Windows
にあるとおりに行っただけ。詳しくは上記 URL を参照のこと。

#### dnscrypt-proxy バイナリのダウンロード

dnscrypt-proxy-win64-2.0.23.zip をダウンロードする。

ダウンロードしたものを展開しておく。展開したら win64 ディレクトリができる。

C:\dnscrypt-proxy\ など適当なディレクトリを作って win64 を置く。

#### 設定ファイルの作成

PowerShell を起動して、指示されているとおり win64\example-dnscrypt-proxy.toml をコピーして win64\dnscrypt-proxy.toml を作る。

```shell-session
cd win64
cp example-dnscrypt-proxy.toml dnscrypt-proxy.toml
```

#### 試しに動かしてみる

管理者権限の PowerShell 上で実行してみる。エラーメッセージらしきものが出ずに動き続ければとりあえず OK。

```shell-session
cd win64
.\dnscrypt-proxy.exe
```

Ctrl-C で止めて、今度はサービスとして登録。

```shell-session
.\dnscrypt-proxy -service install
```

更にサービスを起動する。

```shell-session
.\dnscrypt-proxy -service start
```

#### dnscrypt-proxy を利用する
Windows10 のコントロールパネルで、DNS サーバを 127.0.0.1 に変更する。ウェブブラウザなどで名前が解決できることを確認できれば終わり。

dnscrypt-proxy を再起動しなくても dnscrypt-proxy.toml ファイルを書き換えるとそれに合わせて挙動が変化するので

```shell-session
.\dnscrypt-proxy -list
```
でリゾルバ一覧が出るかどうか、とか

```shell-session
.\dnscrypt-proxy -resolve www.google.com
```
で名前が解決できるかどうか、とか見ながら修正していけばよい。
Features of spring framework for java developers

Spring is a result of lacking fundamental resources into Java EE, like the glue between all those layers. So, some smart guys created and at that time was a huge achievement.

One of the most celebrated and successful frameworks and probably a complete platform for developing large scalable EE applications ever made. But there are some important things to know about it.

It adds complexity to your code, believes me, you don’t want to solve that bugs inside circular dependencies or having to realize where injection failed, it can take hours.

There are useless or bad designed modules you should avoid, I should cite the infamous Spring MVC, I mean really? I would advise never use that crap, stick with some other stuff for MVC like JSF or vaadin, etc, but avoid Spring MVC because it really sucks!

Spring batch was successful in most applications I’d seen but still sucks sometimes and can be very tricky.

Spring documentation is huge, it remembers me documentation from Apache or drafts for some complex OS. There are parts completely outdated and that could be stepping stone for you.

Spring moved fast, expect to find outdated tutorials and stack overflow answers, old solutions won’t help in new problems.

Spring is so huge that would take years to understand every detail, in most projects, it won’t be needed.

If you ask me I expect Spring dies, I mean really, a framework for injecting stuff inside classes? There is no other solution more elegant? Injecting all those infrastructure dependencies like data sources, other modules other stuff… I don’t know, I really dislike the framework for 2018 and beyond because it remembers me old pure Java 90’s, full of complex stuff without helping you build things focused on business but focused on intrinsic technology and it can’t add any value to the business you are trying to solve! Nothing, zero.

I hope we should stop using these things and focus on business solutions rather than architecture, in the end, we dig our own graves.

One thing you need to know about Spring Framework is that it’s not a single entity. It is divided into several modules which serve their own functionality like:

Mainly it’s used for JEE application development.
You can easily integrate your application with various other backend technologies.
You can use it to develop standalone applications
It’s helpful when you need distributed architecture.
It’s a very lightweight framework which reduces the complexity that was there while using EJBs.
Using Spring Security, you can make your applications more secure.
Using Spring Batch, you can efficiently manage long-running tasks
Inversion of Control and Dependency injection adds up to the flexibility and modularity of the application.

**Related blog:**

[MongoDB training in Chennai](http://candidjava.com/training/best-mongodb-training-in-chennai/)
エラーが出た時の対処メモUnable to verify Xcode and Simulator installation【React-Native】

macOSをMojaveに、Xcodeを10.2.1にアップデートしたら、ReactNativeでの開発時に困ったのでその時自分の環境で解決した対処法をメモします。

## 状況

```
react-native run-ios
```

でシミュレーターを起動しようとすると、下記のエラーが出るようになりました。

```
Unable to verify Xcode and Simulator installation
```

## 対処法

Xcodeの設定画面で、ComponentsタブにSimulatorsというのが何も入っていない状態だったので、選択してインストールしました。

<img width="912" alt="スクリーンショット 2019-05-15 22.30.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193724/125e552e-5558-cbf3-3713-7588f3bb9fdf.png">

最初は12.1のシミュレーターをインストールしてみたのですが、エラーが解消しなかったので1つ前のバージョンの11.4をインストールしたら、無事にコマンドでシミュレーターが起動するようになりました！
【Alibaba Cloud】アカウントの本人認証申請手順

## Alibaba Cloudでの本人認証申請
Alibaba Cloudでは、アカウント作成直後では機能が制限されており、本人認証を申請する事によって全機能（例えば、特大のインスタンスタイプを作成する）が利用可能となります。

## 1. アカウント管理画面への表示
ログイン後のコンソールで、右上のアイコンをクリックして、「User Info」をクリックします。
![WS000001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139731/b247e4ef-33bd-e794-dd78-f2a3dd16195e.jpeg)
## 2. 本人情報の入力
「Real-name Registration」をクリックします。
![WS000002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139731/64a203ef-a901-fd96-be52-32e33bf9a75f.jpeg)
Certification Typeで、PassportもしくはDriver's Licenseを選択して、その登録番号と名前、証明画像をアップロードします。
規約にチェックを入れて、「submit」をクリックします。
![WS000004.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139731/c48ac08f-7775-5dca-d64b-dd4d073f6f12.jpeg)
## 3. 申請後の確認
「submit」をクリックすると以下の画面が表示されます。数営業日後に、認証完了のメールが届きます。
![WS000005.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139731/1d5cdbd4-4a64-33d6-4229-2d43ce0c3ed8.jpeg)
Leetcode #45: Jump Game II

```swift
func jump(_ nums: [Int]) -> Int {
    if nums.count == 1 {
        return 0
    }
    var answer = 0
    var start = 0
    var end = 0
    while end < nums.count {
        var maximum = 0
        answer += 1
        for i in stride(from: start, through: end, by: 1) {
            if nums[i] + i >= nums.count - 1 {
                return answer
            }
            if nums[i] + i > maximum {
                maximum = nums[i] + i
            }
        }
        start = end+1
        end = maximum
    }
    return answer
}
```
Alibaba CloudでのNAT Gatewayの作成手順

## NAT Gatewayの作成
Alibaba Cloudで、Natgatewayを用いてプライベートネットワークを作成したいと思います。

##### 1. サービスの選択
ログイン後のコンソール画面で、[「NAT Gateway」](https://jp.alibabacloud.com/product/nat)をクリックします。
![WS000001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139731/4bd383be-dd72-1c20-00ef-84c58af56d76.jpeg)
##### 2. NAT Gatewayの作成
「NAT Gatwayの作成」をクリックします。
![WS000002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139731/4fb99544-6625-390e-87f7-f9b375bb53a6.jpeg)
NAT Gatewayを作成するリージョンとSpecification(インスタンスタイプ)を指定して、「今すぐ購入」をクリックします。
![WS000003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139731/83f30047-be9c-9b3b-d3ba-70e5765765ba.jpeg)
利用規約の同意にチェックをして、「有効化」をクリックします。
![WS000004.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139731/30be53f4-00ac-494c-13d1-2a7db9abbc3f.jpeg)
Order Completeが表示されるので、「Console」をクリックします。
![WS000005.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139731/1336eda2-0952-67fd-2e3c-7df4ac711985.jpeg)

##### 3. EIPの作成とNAT Gatewayへの紐づけ
Elastic IP アドレスをクリックします。
![WS000013.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139731/dff9c318-0bba-7884-f61f-7a9c71c85131.jpeg)
EIPの作成をクリックします。
![WS000014.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139731/c3ce73b4-22a4-417a-e207-36be1e92b88d.jpeg)
リージョンと利用する帯域幅、個数を指定して「今すぐ購入」をクリックします。
![WS000015.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139731/47a3ee36-50dd-5d43-c212-c4dd6d3316b0.jpeg)
利用規約の同意にチェックをして、「有効化」をクリックします。
![WS000016.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139731/39164208-858b-ca39-4114-981a427668f4.jpeg)
Order Completeが表示されるので、「Console」をクリックします。
![WS000017.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139731/4a7b8fd9-aa39-804d-d485-e4f261bb9d8b.jpeg)
作成されたEIPで、「バインド」をクリックします。
![WS000018.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139731/d30e3632-c81c-66f7-25bc-867a0137b23f.jpeg)
「インスタンスタイプ」から「NAT Gatewayインスタンス」を選択します。
![WS000019.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139731/a125e18b-7f7f-0c11-205b-8a5041afd682.jpeg)
「NAT Gatewayインスタンス」で先程作成したインスタンスを選択して「OK」をクリックします。
![WS000023.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139731/82eac4ea-ccae-3e5a-74fc-f809252a4d01.jpeg)
ステータスが割り当て済みになり、インスタンスタイプが「NAT Gateway」となっている事を確認します。
![WS000025.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139731/50143566-f96d-0d53-f2ed-b67750157869.jpeg)
##### 4. SNATエントリの追加
NAT Gatewayにコンソールに戻り、SNATテーブルのエントリ作成によって、NAT GatewayとVSwitch（サブネット）を紐づけます。
SNAPエントリの作成をクリックします。
![WS000026.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139731/066e47c6-57a6-0b60-5973-d347ec74736d.jpeg)
プライベートネットワークとして利用するVSwitchと、NATされるEIP、そのエントリの名前を入力して、「OK」をクリックします。
![WS000030.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139731/f9e321b5-2e39-ee17-07a6-bb00c2455f60.jpeg)
エントリが追加されたら、即時で当該VSWitch配下のECSインスタンスは、紐づけたEIPを通して、インターネットへアクセスできるようになります。
![WS000032.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139731/e332535a-28c9-3d00-0bc2-c92297fd6cab.jpeg)
Rを用いたデータの標準化

#データを正規化する関数を作成

###標準化とは
与えられたデータを平均が0で分散が1のデータに変換する操作のこと
各データ xi から平均 μ を引き，その値を標準偏差 σ で割ることで達成される　　　　　　　
**zi=(xi-μ)/σ**


###与えられたdata（行列）を列ごとにを標準化する関数　　standalizeを作成
```R
standalize <- function(data,ncol(data))
{ for(i in ncol(data))
  {
  x <- as.matrix(data[,i])
  y <- (x-mean(x)/sd(x))
  data[,i] <- y
 }
  return(data)
}
```
この関数はfor文を解除すると、指定列だけを標準化できます。
Record of the study(Ruby on Rails1)

#Ruby on Railsについて

**Ruby on Rails**
→Rubyを使って開発するwebアプリケーションの為のフレームワーク
**フレームワーク**
→開発においてよく使用する `処理` を `パッケージ化` したもの



#railsの基本構成は `MVCアーキテクチャ(MVCパターン)` に則り設計されている

`M` = **Model(モデル)**
→データベース(mysqlなど)のデータを扱う・やり取りをする部分

`V` = **View(ビュー)**
→webサイトの画面を構成(ブラウザに表示を行う部分)

`C` = **Controller(コントローラ)**
→クライアントからのリクエストの処理の振り分け部分


#【Webサービスの一連の流れ】
①ユーザー( `クライアント` )が必要な情報の要求( `リクエスト` )を行い、
② `ルーティング` (リクエストされたURLを解析して `どのコントローラー` の、`どのアクション` で処理をするか決める役割を担う)で処理内容を解析して `Controller(コントローラ)` へ渡す

③`Controller(コントローラ)` では `ルーティングで解析` された `アクション` が実行される

④解析された `アクション` を元に必要なデータを `Model(モデル)` から取り寄せたり、表示内容を `View(ビュー)`から取り寄せて `Controller(コントローラ)` から ユーザー( `クライアント` )へ `レスポンス` として返す。

**Railsアプリの処理の流れ**
`リクエスト` → `ルーティング` → `コントローラ(モデル/ビュー)`→ `コントローラ` → `レスポンス` 

#【アプリ立ち上げ】
まずは `gem install rails` をターミナルに入力してrailsをインストール(インストールしていたら不要)

初期画面の立ち上げ確認↓
①`rails new アプリケーション名` 
②`cdコマンドでアプリケーションファイルへ移動`
③ターミナルにて `bundle exec rake db :create` でデータベースを作成
④`rails saver` (サーバーを起動するコマンド)
⑤ブラウザで `http://localhost :3000` にアクセス

**rails new アプリケーション名** で開発に必要な `ディレクトリ(ファイル)` を作成
※作成されたディレクトリの中に開発に必要なディレクトリやファイルが自動で作成される。特に `app` `config` `db` はよく使用するディレクトリ。

`app` = **M・V・C**を管理 
`config` = **ルーティング**、 **データベース** などの設定管理
`db` = **マイグレーション** ・ **シードデータ** ファイルの管理
2つのn次元一様乱数ベクトルの距離の期待値

# はじめに
現在自分自身が行っているHyperParameters最適化において，評価した座標がどの程度近いのか知ることが重要になる．しかし，各次元の区間を $[0,1]$ に揃えたとき，$n$ 次元の点と点の距離はどの程度離れているべきかわからなければならない．よって，ここでは一般的に適当な2点を取ったときの距離を求めることを考える．

# A. 一様分布
まず，一様分布を以下の $f(x)$ によって定義する．

```math
\begin{eqnarray}
f(x)=\left\{ \begin{array}{ll}
1 & (0 \leq x \leq 1) \\
0 & (otherwise) \\
\end{array} \right.
\end{eqnarray}
```

# B. 2つの一様乱数の差の分布
次に2つの一様乱数の差が従う分布を求める．$g(x)$ は $x = a - b$ として，この $x$ が従う確率密度関数であるとする．

$a, b \sim f$ であるとすれば，$a$ もしくは $b$ の値を固定すれば，任意の $x$ におけるもう一方の値が決定する．したがって，$a$ を変数とし，$b$ を消去すれば，以下の式となり，それを解く．

```math
g(x) = \int_{x}^{1 + x}f(a)f(a - x)da \\

\begin{eqnarray}
g(x)=\left\{ \begin{array}{ll}
\int_{x}^{1}f(a)f(a - x)da = 1 - x & (x \geq 0) \\
\int_{0}^{1 + x}f(a)f(a - x)da = 1 + x & (x < 0) \\
\end{array} \right.
\end{eqnarray}

```

よって，$g(x)$ を積分することで以下のような $G(X \leq x)$ が得られる．

```math
\begin{eqnarray}
G(x) = G(X \leq x)=\left\{ \begin{array}{ll}
1 - \frac{(1 - x)^2}{2} & (x \geq 0) \\
\frac{(1 + x)^2}{2} & (x < 0) \\
\end{array} \right.
\end{eqnarray}
```

また，この分布の絶対値の期待値は $2\int_{0}^{1}xg(x)dx = \frac{1}{3}$

# C. 2つの一様乱数の差の2乗の分布
また，確率変数 $X$ は $g(x)$ に従うものとする．そのときの $X^2$ の分布 $p(x)$ を求めたい．

$P(X^2 \leq x)=P(-\sqrt{x} \leq X \leq \sqrt{x}) = G(-\sqrt{x} \leq X \leq \sqrt{x})=G(\sqrt{x}) - G(-\sqrt{x}) $ となるから，$p(x)=\frac{1}{\sqrt{x}} - 1$ となる．

この分布の絶対値の期待値は $\int_{0}^{1}xp(x)dx = \frac{1}{6}$

# 応用編
以下，$a_k, b_k \sim f,\ d = \sqrt{\frac{1}{n}\sum_{k = 1}^{n}(a_k - b_k) ^ 2}$ とする．
Bの分布から $n \to 1$ であれば，$d \to \frac{1}{3}$ となることがわかる．一方で，Cの分布から $n \to \infty$ であれば，$d \to \frac{1}{\sqrt{6}}$ に近づくことがわかる．

よって，抽象的ではあるが，これらの値を持って，近いか遠いか判断することになる．

# あとがき
一旦，ここでやめます．実際には $n$ に応じた $d$ の対応を知りたいが，現状，パッとわからないので中断．カイ2乗分布と正規分布の関係性の証明に近いようなことをすれば示せるのかもしれない．

```math
p_{n}(x) = \int_{max(x - n + 1,\ 0)}^{min(x,\ 1)}p_{n-1}(x-t)p_1(t)dt
```

上の式を見る限りつらそうな雰囲気．．．
Unexpected "○○" keyword after "@" character.Once inside code, you do not need to prefix constructs like "○○" with "@"と出る場合

要するに@いっぱい書くなと怒られています。

例）foreachを入れた場合
Unexpected "foreach" keyword after "@" character.  Once inside code, you do not need to prefix constructs like "foreach" with "@".


```html:test.cshtml
@using (@Html.BeginForm("Test", "Index"))
{
    @foreach (var item in @ViewBag.tes)
    {
        <input id="hiddata" type="hidden" value="@item" />
    }
}
```

とでます。
<span>@ Html,@ foreach</Span>の前の@は省略しても大丈夫です。

```html:test.cshtml
@using (Html.BeginForm("Test", "Index"))
{
    foreach (var item in @ViewBag.tes)
    {
        <input id="hiddata" type="hidden" value="@item" />
    }
}
```
RestTemplateでHostヘッダが無視される

# 現象
以下のように```RestTemplate```にURLのホストとは異なる```Host```ヘッダを指定するとそのヘッダが無視される。

```java
        HttpHeaders headers = new HttpHeaders();
        headers.set("Host", "www.example.com");

        RestTemplate restTemplate = new RestTemplate();

        ResponseEntity<String> responseEntity = restTemplate.exchange(
                "http://httpbin.org/headers", HttpMethod.GET,
                new HttpEntity<String>(null, headers), String.class);
```

# 原因
https://stackoverflow.com/questions/43223261/setting-host-header-for-spring-resttemplate-doesnt-work に書いてあるが、```RestTemplate```の基底実装が```HttpUrlConnection```の場合はこの挙動になる。詳しい事はリンク先に書いてあるが、セキュリティ上の理由というかRFC準拠でこうなっている（らしい）

# 対策
```java
System.setProperty("sun.net.http.allowRestrictedHeaders", "true")
```

あるいは

```
-Dsun.net.http.allowRestrictedHeaders=true
```

もしくは基底実装に[Apache HttpComponents](http://hc.apache.org/)を使用する。
Slack でカスタムステータスをラクにセットする

株式会社オズビジョンのユッコ (@terra_yucco) です。

先に断っておきますが、今日はプログラミングは登場しません。
なぜなら、コード書いて解決しようかと思ったら、Slack に既に機能があったからです。

# Slack でカスタムステータスをラクにセットする
## 結論

Slack の入力窓で：
`/status :seven: 7F`
これで絵文字 :seven: で `7F` というステータスがセットされます。

なお、設定しているステータスを解除したい場合には：
`/status clear`

この機能を知らなかったので当時は手で設定していましたし、今回はアプリを作ろうとしていましたが、スラッシュサジェスト使ったら 3 回目くらいで見つかりました。さすが Slack です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95030/3fd20f51-a4f4-6365-c209-551a62e46368.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95030/6d3982c1-5f31-7e6e-8863-90f5a3d6b0af.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95030/093b7522-f4a8-3695-e696-64da4f8890af.png)


ということで以下は蛇足になってしまいましたが、気になる方だけお読みください。

## 背景
オズビジョンは 2019-05 現在、新橋にある WeWork に入居しています。
この WeWork は全部で 9F まであるのですが、うち 3F 4F(オズビジョン) 8F 9F は一社占有フロアで他は立ち入り禁止。逆に言えば、オズビジョンメンバーは 1F 2F 4F 5F 6F 7F であれば自由に仕事をすることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95030/b6eb535c-8119-fa91-b22d-f7f5781962a5.png)
([wantedly](https://www.wantedly.com/companies/ozvisionrecruit) から引っ張ってきた写真。ここが 4F です)

もちろん、大半の時間は 4F の執務室内や、執務室外の開けたエリアにいることが多いのですが、「気分を変えたい」「チームで集中作業したい」などの理由で別フロアに行くことが一時期よくありました。

## 課題

ただし Google カレンダー上に表現されている Meeting などであればともかく、タスクの時間に執務室にいないと、用がある人は困ったりします。なので当時、自分がどこにいるかは Slack のステータスで表示するようにしていました。

:four: 4F
:seven: 7F
:x: In a meeting
:coffee: At a cafe
:house: At my home

といった具合です。
これを手動で設定するのは正直面倒だったのですが、当時このコマンド知ってたらよかったなあ。

## 使えそうだった Slack API

- [User presence and status](https://api.slack.com/docs/presence-and-status)

こちらの `POST /api/users.profile.set` は使えそうだと思っていました。
`/status` で大半のことはできそうでしたが、以下のような場合はこの API を使っていろいろやってみるのもありかもしれないな、と思っています。

- Slack のアプリ自体が何らかで使えない
    - Web サービスではありますが、社有デバイス以外で使ってはいけないケースなど…？
    - こっちは考えにくい
- ステータスの有効期限を付けない

>Your status is set! At midnight, it’ll be cleared automatically. To change that, first click your workspace name in the top left, then select *Edit status*.

と Slackbot が言ってくれるように `/status` でセットしたステータスは At midnight に解除されるようです。なので解除したくない場合には `status_expiration` で指定できる API リクエストが便利かと思います。
※なお、この midnight が JST なのか UTC なのか他のルールなのかは未確認です。
※設定側から確認すると Today となっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95030/f12426f6-57ff-9e6d-5719-ffd3cbb63eff.png)

## Conclusion

Slack の API を使って遊ぼうかと思いましたが、すでに公式に実装されていたというオチが付きました。ただし、細かくカスタムしたり、勤務時間に応じてステータスを変更したりということをする場合には API は使えそうです。
Slack は基本的にビジネス時間中ずっと使っているツールなので、また折を見て遊べる機能がないか見てみようと思います。