OmniAICreator/Qiita-1.07M huggingface dataset:
CSSで書いたやつをobj化？したい

CSSで書いたやつをobj化？を楽にしたくて強引なの作ったけど使えるんか使えんのかよくわからん、、

```js
const CSStoObj = css => {
  const obj = {};

  const lines = css.split(/\r\n|\r|\n/);
  const changedLines = lines.map(v => v.replace(/;| /g, "").split(":"));

  changedLines.map(v => {
    if (!v[0]) return;
    if (v[0].indexOf('/*') !== -1) return;
    obj[v[0]] = v[1];
  });

  return JSON.stringify(obj);
};
```
Batファイルの変数でハマる

完全に自分用の覚え書きです。
下書きたまって上限になっちゃったから、とりあえず押し出しです。あらら。

数年に一回しか作らないBatファイル。
そういえば、こんなのありましたね、遅延環境変数。
for文でハマっていたのですが・・・

>遅延環境変数
>https://blog.natade.net/2018/10/06/windows-bat-%E9%81%85%E5%BB%B6%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0-for-if/

>ONにすること忘れない
>`setlocal EnableDelayedExpansion`

でも/lはいけるが/fはいけない

どちらかというと、
遅延環境変数の展開を行わずforループ内で変数を参照する方がやりやすいと発覚。


でも結局、動かない動かないと苦しんでいた原因は文法を忘れていたせいだった・・・というオチ。

```
set listname = list_%*.txt
echo %listname%
```

`(半角スペース)= (半角スペース)`

.netに慣れて半角スペース明けが当たり前になってたよ・・・。
そうかBatファイルは受け付けないのか・・・。


あと、このへんも便利

>テキストファイルの任意の行を読み込む
https://oshiete.goo.ne.jp/qa/7487016.html

>ファイルの行数を数える
https://www.atmarkit.co.jp/ait/articles/1809/20/news031.html

>コマンドを変数に入れる
https://hacknote.jp/archives/12683/
複素関数を解析接続してゴリゴリに数値積分する方法 (1) ~物理学の視点から~

#自己紹介
筆者は現在大学院の修士2年です。専攻は物理学で、特に複素作用のある系における数値積分手法の改良・開発的な研究をしています。

タイトルに「~物理学の視点から〜」とありますが、あくまで僕が専攻している分野でのお話であるので、注意してください。

#物理と積分の関係
　物理学は何かしらの物理量(エネルギーやポテンシャル)の期待値を計算します。「期待値」とは高校数学の確率で習う「期待値」とほとんど意味は同じだと考えても良いと思います。

高校数学における確率変数$X$の期待値$E(X)$は、$X$がとりうる値$x_i$にその値が観測される確率$p_i$をかけて、和をとったものとされます。
$$E(X) = \sum_{i=1}^n x_i p_i$$

物理学における観測量$O(x)$の期待値は、一般に$\langle O(x) \rangle$のように書きます。ただし、$x$は実数とします。この時、対応する「確率」$p(x)$は$S(x)$を用いて
$$p(x) = \frac{e^{-S(x)}}{\int_{-\infty}^{\infty} dx e^{-S(x)}}$$
と書き表されます。よって、期待値$\langle O(x) \rangle$は
$$\langle O(x) \rangle = \frac{\int_{-\infty}^{\infty} dx O(x)e^{-S(x)}}{\int_{-\infty}^{\infty} dx e^{-S(x)}}$$
とかけます。高校数学の確率の期待値とほとんど同じ式になっていることがわかると思います。

関数$S(x)$は「作用」と呼ばれ、物理学では1番重要といっても過言ではない(汎)関数です。この作用を用いて積分を実行してやれば、物理量が計算できたことになります。このとき、積分に大きな寄与がある$x$は作用$S(x)$を最小にする値です。(最小作用の原理)

と....ここまではあくまで**作用$S(x)$が実数の場合の話**です。

様々な系でこの作用が複素数になることがわかっています。このような系では先ほどの**「確率」とみなせていた量が「確率」と解釈できなくなります。なぜなら、確率は正の実数でないといけませんが、$S(x) \in \mathbb C$だと「確率」が複素数になってしまうからです。**



#問題の本質は何か?
　先ほど**「確率」と解釈したい量が「確率」と解釈できない**と述べました。一方で、こういった見方もあります。もう一度「確率」の式に戻ります。
$$p(x) = \frac{e^{-S(x)}}{\int_{-\infty}^{\infty} dx e^{-S(x)}}$$
もし、**分母が激しく振動する複素関数で、ナイーブな離散化で数値積分を行った時、計算結果が0になる**という状況もありえなくもないです。

このような系に対しては、未だに有効な数値積分の方法が見つかっていないというのが現状です。(少なくとも僕が専攻している分野では)

以下では、振動する複素関数に対して有限な意味のある値を得る数値計算手法を解説します。

#解析接続という解決策
　答えはいたってシンプルで、「$x \rightarrow z \in \mathbb C$に解析接続し、Im$S(z)=$ constとなる経路に沿って積分をしてやろう」という話です。もちろん作用$S(x)$の正則性は仮定してます。Im$S(z)=$ const であれば、複素関数は振動しないので、積分できるだろうというお話です。

##解析的にやってみる
具体例を示した方が分かりやすいので、解析的にできる積分を考えます。作用は
$$ S(x) = \frac{i}{2} x^2 $$
を用いて、以下の積分$I$を考えます。
$$ I = \int_{-\infty}^{\infty} dx e^{-S(x)}$$
ナイーブに離散化 (例えば、台形公式) だとうまくできないです。

解析接続して積分をやってみます。
$$S(x) = \frac{i}{2} x^2 \rightarrow S(z) = \frac{i}{2} z^2$$
積分経路を決める条件「Im$S(z)=$ const」ですが、作用に寄与が大きい$z$での虚部の値で経路を決めてやります。寄与が大きい$z$を$z_\sigma$とおきます。$z_\sigma$は、作用の一回微分をとれば分かります。
$$ \frac{\partial S}{\partial z} = 0$$
つまり、$z_\sigma=0$です。よって、経路を決める条件は
$$\text{Im} S(z) = \text{Im} S(z_\sigma) = 0$$
です。

具体的にどんな経路をとれば良いか見てみます。$z = x+iy$ とおきます。もちろん$x, y$は実数です。
$$\text{Im} \left[ i (x+iy)(x+iy)\right ] =0 \\
\leftrightarrow y^2 - x^2 = 0$$
虚部が一定の値(ここでは0)の経路は、$y=\pm x$の2通りあるということです。この経路に沿って積分してやれば、良いことになります。

2つの経路のどちらが正しい経路なのでしょうか？

(i) $y=+x$の経路
$z = x+iy = (1+i)x$なので、Jacobianを考慮すれば、積分$I$は

```math
\begin{align}
I &= \int_{-\infty}^{\infty} dx e^{-S(x)}\\
&= \int_{-\infty}^{\infty} dx e^{x^2} (1+i)
\end{align}
```

となります。これは収束しない積分なので、この経路は不適切、ということになります。

(ii) $y=-x$の経路
$z = x+iy = (1ーi)x$なので、Jacobianを考慮すれば、積分$I$は

```math
\begin{align}
I &= \int_{-\infty}^{\infty} dx e^{-S(x)}\\
  &=\int_{-\infty}^{\infty} dx e^{-x^2} (1-i)
\end{align}
```

これは普通のガウス積分なので、積分できます。答えは、

```math
I = (1-i) \sqrt{\pi}
```

です。1次元のガウス積分だと「Im$S(z)=$ const」にとって積分する、というありがたみがよく分からないですね...

#まとめ
僕の専攻分野では、積分を複素平面に解析接続し、「Im$S(z)=$ const」となる経路に沿って積分を実行してやろう、という試みが最近話題です。

実際には、積分をモンテカルロやハイブリッドモンテカルロで実行します。この時、空間3次元、時間1次元の4次元空間で積分を行いたいのですが、そもそも全ての経路を見つけ出せるのか、など様々な問題が未解決な状態です。(だから、研究テーマとしてやりがいがあるわけですが...)

そこらへんについては、また次の記事で非ガウス型の積分を例に解説したいと思います！
javascriptのブックマークレットが動作しない



下記のような形に、**クラスの値を変更するためのブックマークレットを作成したい**と考えております。

```css
 .result_headline {
    display: block!important;
}

 #resultBox{
    height:1000px!important;
}
```

試したのは、以下のコードです。
ブックマーク内の記述を下記に致しました。

```js
javascript:(function show(){
        var e = document.getElementsByClassName("result_headline");
        e.style.display = "block";
    })
```

　#resultBoxの場合、getElementById
　を使うことまでは、分かりましたが、実際の記述の仕方は分かりませんでした。

お詳しい方に、アドバイスなど頂けますと幸いです。
何卒どうぞよろしくお願い致します。
getline()で文字列分割する方法

C++で文字列を分割する場合は，find系統の関数を使って自作のsplit関数を実装することが一般的なのかと思います．

今回は，もっと簡単に文字列分割する方法を紹介します．

ずばり，「getline()」を使います．

この関数は元々「getline(cin, str)」のように，標準入力cinで文字列を1行取得して，既に宣言されている文字列strに代入するという処理によく使われます．

ただし，1行の中にスペースやカンマなどのデリミタが含まれており，それらを用いた分割を行いたい場合にも，実は使用可能です．（ということを最近知りました）

##標準的な方法

今回，分割対象の文字列を以下とします．
1行だけで，スペースによって区切られています．

```C++:分割対象の文字列
A B C D E
```

スペースで分割し，vectorに格納します．

```C++:標準的な方法
#include <iostream>
#include <sstream>
#include <vector>
using namespace std;

int main(void){
    vector<string> v;                  // 分割した文字列を格納するvector
    string str, s;                      

    str = "A B C D E"                  // 分割対象の文字列str

    stringstream ss{str};              // 入出力可能なsstreamに変換

    while ( getline(ss, s, ' ') ){     // スペース（' '）で区切って，格納
        v.push_back(s);
    }
    
    for (const string& s : v){         // vの中身を出力
        cout << s << endl;
    }
}
```

実行結果は以下の通りです．
しっかり分割できていますね．

```C++:実行結果
A
B
C
D
E
```

ポイントは，stringstreamを使うことです．

分割対象の文字列を，stringstreamに変換します．

while ( getline(ss, s, ' ') ) の部分で，ssの中からスペース（' '）手前までの文字列をsとして取得し，それをvに代入しています．

##標準入力から取得した文字列の分割

通常の「getline(cin,str)」で対象文字列を一旦取得しておき，それをstringstream(ss)に変換してから，「getline(ss,s,' ')」を実行します．

```C++:標準入力から取得した文字列を分割する方法
#include <iostream>
#include <sstream>
#include <vector>
using namespace std;

int main(void){
    vector<string> v;                  
    string str, s;                      

    getline(cin,str);               

    stringstream ss{str};             

    while ( getline(ss, s, ' ') ){    
        v.push_back(s);
    }

    for (const string& s : v){        
        cout << s << endl;
    }
}
```

標準的な方法における「str = "A B C D E"」を，「getline(cin,str)」に変えただけですね．

これを見て，2回もgetline()呼ぶ必要なくない？
「getline(cin,str,' ')」でいいんでないの？
と思われるかもしれません．

しかし，以下のような例ではうまくいきません．

```C++:ダメな例1
#include <iostream>
#include <vector>
using namespace std;

int main(void){
    vector<string> v;                  
    string str, s;                      

    while (getline(cin, str, ' ')){
        v.push_back(str);
    };          
            
    for (const string& s : v){
        cout << s << endl;
    }
}
```
これを実行すると，シェルで文字列を打ち込み，Enterを押しても改行されるだけで，入力を求められ続けます．
つまり，whileのおかげで入力が終わりません（笑）

だからといって，whileを取り除いた以下の例もうまくいきません．

```C++:ダメな例2
#include <iostream>
using namespace std;

int main(void){
    vector<string> v;                  
    string str;                      

    getline(cin, str, ' '));

    cout << str << endl;
}
```
この場合，仮に「A B C D」と入力しても，最初の「A」しか取得できません．

##おわりに
split関数を自作するのが面倒な方は，getline()を使ってみてはいかがでしょうか？
gitでsshkeyを登録する流れ

gitを始める時にひっかかりがちなsshkeyを作る際の流れを紹介します。
(https://employment.en-japan.com/engineerhub/entry/2017/01/31/110000#GitHub%E3%81%B8%E3%81%AESSH%E6%8E%A5%E7%B6%9A%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B)
↑参考にしたサイトです。



#git --versionできちんと動作するか確認する。
```git
git --version
```
と入力し、動作確認をします。
git version 2.22.0.windows.1と出ればOKです。



#git config　--listで自分のuser.nameと、user.emailを確認する。
もし登録が完了した場合はこのコマンドで自分のusernameとuseremailを確認できます。
もし登録していない場合は

```git
git config --global user.name ユーザー名
git config --global user.emailメールアドレス
```
と入力して、作成します。



#ssh-keygenでカギを作成し、パスフレーズを作成する。
```git
ssh-keygen -t rsa -b 4096 -C 先ほど登録したメールアドレス
```
を入力します。
そうすると、

```git
Enter file in which to save the key (/Users/hoge/.ssh/id_rsa): 
```

このように出てくるのでEnterキーで進みます。

```git
Enter passphrase (empty for no passphrase):
Enter same passphrase again: 
```

その後このような文字が出てくるので自分の好きなパスワードを設定します。
この時自分の打った文字は表示されないので注意が必要です。



#作成したsshkeyを確認する。

```git
$ cat .ssh/id_rsa.pub
```
と入力します。
これでssh-rsaの後に出力されたものが、次のステップに必要になります。


#git hubにssh keyを登録する。
上の作業で出力されたものをgit hubに登録します。
git hubのホーム画面右上のアイコンをクリックします。
そうすると、下から二つ目にsettingsがあるので、それをクリックします。
次の画面で左の欄にある、SSH and GPG keysをクリックします。
そこで右上にあるNEW SSH keyをクリックし、
Keyのところに先ほどの出力されたものをpasteし、titleをお好きなものに設定すれば完了です。

以上です。
間違いや指摘があればお願いします。
Rails6 のちょい足しな新機能を試す48（Duration編）

# はじめに

Rails 6 に追加されそうな新機能を試す第48段。 今回は、 `Duration` 編です。
Rails 6 では、 `Duration` の計算で小数点以下が丸められることが無くなりました。

Ruby 2.6.3, Rails 6.0.0.rc1, Rails 5.2.3 で確認しました。Rails 6.0.0.rc1 は `gem install rails --prerelease` でインストールできます。

```shell
$ rails --version
Rails 6.0.0.rc1
```

# 簡単なスクリプトを作る

今回は、動作確認用の簡単なスクリプトを書いて確認します。


```bin/duration.rb
duration = 0.4.seconds

d = DateTime.parse('2019-01-01')

d += duration
d += duration
d += duration
d += duration
d += duration

p d > DateTime.parse('2019-01-01')
p d == DateTime.parse('2019-01-01')
```

# Rails 5 では

`0.4.seconds` を足すとき 整数に丸められて 0.seconds として加算されてしまいます。

結果、 `0.4.seconds` を5回足す前も後も変化がありません。

```shell
$ bin/rails runner bin/duration.rb
false
true
```

# Rails 6 では

整数に丸められることが無くなったので、より正確な値が得られるようになります。


```shell
$ bin/rails runner bin/duration.rb
true
false
```

# 試したソース

試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try048_duration


# 参考情報

* [What is new in Rails 6.0](https://bogdanvlviv.com/posts/ruby/rails/what-is-new-in-rails-6_0.html)
* [Fix issue where duration where always rounded up to a second](https://github.com/rails/rails/pull/34135)
Rails 5 でWebpackerのwebpack.config.jsの設定を確認する方法

## はじめに
Webpackerは内部でWebpackをどういう設定でつかっているのか？

これがわかっていないと設定のカスタマイズが難しい。

config/webpacker.ymlだけでは物足りない、config/webpack/配下のjsに設定追加してカスタマイズすることができると言われても、もともとどうなっているのか？がやっぱりわかりづらい、といった方は一度確認すると参考になるかと思います。

## 確認方法

```console
$ node
> wp = require('@rails/webpacker')
> wp_env = new wp.Environment
> console.log(JSON.stringify(wp_env.toWebpackConfig(), null, '\t'))
```

## 参考URL
- https://inside.pixiv.blog/subal/4615
- https://tech.misoca.jp/entry/2019/02/22/110000
Explain the working principle of the rechargeable LED desk lamp circuit

Nowadays, many cheap rechargeable LED desk lamps use a small 4V battery as the power source. The simple resistor-capacitor step-down circuit is charged, and the circuit has a high failure rate. This article describes in detail the working principle of this rechargeable LED table lamp circuit, in order to facilitate the reference for maintenance.



The circuit is shown above. After the power is turned on, the AC 220V voltage is stepped down by the capacitor C1, the rectifier bridge bridge rectifier and the capacitor C2 filter, and a DC voltage is generated to charge the 4V battery through the diode VD. The charging current of the battery is mainly determined by the capacitor C1. When C1 uses a capacitor of 1μF, the charging current of the battery is about 69mA. LED1 is the charging indicator and resistor R1 is the bleeder resistor.

![29be4b258e8ec8e27a776f1ba733762a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454145/07ecc49a-6d74-195f-df96-acdb830cc3a8.jpeg)


In the figure, LEDs 2 to 20 (not all of which are shown in the figure) are a plurality of parallel white LED lamp beads, each of which is connected in series with a 51 Ω chip current limiting resistor. K is the <a href="https://www.censtry.com">power switch</a> of the desk lamp, and K is closed, and LED2~LED20 can be lit. Need to say here, because the voltage at both ends of the battery is high during charging, do not close the switch K during charging, otherwise it will easily damage the LED lamp bead.


The rectifier bridge in the circuit generally uses a rectifier bridge with a chip package. The commonly used models are MB6S and DB107S.

Detailed explanation of the working principle of the rechargeable LED desk lamp circuit ▲ In-line white LED lamp bead for LED desk lamp.

The white LED lamp bead shown in the above figure has an operating voltage of about 3V and a maximum operating current of 20mA.

Explain the working principle of the rechargeable LED desk lamp circuit ▲ 4V battery for LED desk lamp.

Many cheap rechargeable LED desk lamps use 4V batteries as the power source. Because the charging circuit is simple and there is no protection circuit, some batteries of the desk lamp are easily damaged by overcharging. If the battery is damaged or the storage capacity is deteriorated, you can replace the battery of the same specification after confirming that the circuit is not faulty.
Pimaxのことをザラザラ書く

PiVR Partyというイベントに行ってきました

Pimaxが日本で行うイベント、ということでしたが、
Twitterでひっそりと告知、申し込んだら英語でメールが届き、
それに返事をすると参加できるという中々ハードルの高いイベントです。

会場も事務室の一室という、想像しているものとぜんぜん違うイベントではありましたが、
現状のPimax製品を全部試せたり、今後の展開とか聞けたので個人的には満足度が高いです。

#Pimaxについて

VR機器の中で珍しい水平150度(※)という視野角を実現したハードです。
一般的なVR機は110度程度です。
正直、110度もあれば困ることはない視野ではないですし、
その分グラフィックボードへの負担も増えるので、完全にオーバースペックです。

また、8kというモデルは4kモニタを2つ贅沢に使ったもので、
おそらく今民生用で手に入る中では、最高の解像度をもったVR機器だと思います。

※公式では200度と書いているものの、水平の180度超えているとは思えない
　おそらく水平150度＋垂直50度で200度ではないかと予想

#種類に関して

現在は5k plus, 5k XR, 8kが販売されており、8kxに関しては開発中です。

||Pimax 5k plus| Pimax 5k XR|Pimax 8k|Pimax 8k X(開発中)|
|:-----|:-----|:-----|:-----|:-----|
|解像度|2560×1440×2|2560×1440×2|3840x2160×2|3840x2160×2|
|画面|液晶(RGBストライプ)|有機EL(ペンタイル)|液晶(ペンタイル)|有機EL(RGBストライプ)|
|価格|699ドル|899ドル|899ドル|(不明)|
|リフレッシュレート|90Hz|85Hz|80Hz|(不明)|
|備考||若干の遅延あり|内部解像度は2560×1440||

3つを試した結果、最もおすすめできるなと思ったのが5k plusです。
値段が安い上に、他の2つが上位互換ではない、というのが主な理由です。
[ちなみに、Amazonでも買えます。](https://www.amazon.co.jp/dp/B07JZL5QK3)

5k XRの利点は有機ELを採用しているため、黒がはっきりしています。
しかし、MTP=15msとなっていて、1フレーム程度の遅延があるようです。
はっきりと遅延している感じはしないが違和感は残る、という感覚を持ちました。

8kの利点は、4kパネル2枚という圧倒的解像度なのですが、
実は内部的には2.5kのデータであり、それを拡大して表示しています。
そして、リフレッシュレートも80Hzと最も低い値になっています。
これはDisplayPortの速度が8k出ないのが原因っぽいですが、
くっきり見えるわけではないので、なんのための4kの解像度なのか、という気がします。

加えて、5k XR,8kに共通するのがペンタイル配置です。
使うサブピクセルを従来の2/3に減らした配置なのですが、
明るさにムラがあるので、明るいシーンだと黒い模様が若干ながら見えてしまいます。

そういうことで、5k XR,8kは試作品、という印象を強く受けます。
有機ELを使いつつ、内部解像度も4kで、RGBストライプ配置だと最強と思うのですが、
それを目指したのが開発中の8k Xです。

元々DisplayPortが2本使う予定でしたが、1本になったようです。
DisplayPort 2.0に対応するのかなと思います。
~~1本になるってわかってたら8kxバックしたのに…~~

#オプションパーツについて
Pimaxの注目点としては、オプションパーツの充実もあります。
初期の頃の動画で、本体も試作品時代ですがこんな動画があります。
[動画](
https://v.kickstarter.com/1562216985_6fb3b03c478f97f088596fae25a63d71c9b04c9b/assets/018/583/010/209c2ea33141eecdf54175dd26691b6f_h264_high.mp4)

##コントローラ
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985/a4c93d6c-523c-6174-879a-12a2a922d993.png">


コントローラはトラックパッドとジョイスティックの2バージョンがあるそうです。
Oculus Touchからメニューボタンをなくして、薬指、小指にも接触センサーを持つ、
Valve Index Controllerっぽい挙動みたいです。
10月頃という話でした。~~(また遅れるんだろうなぁ…)~~

##デラックスオーディオストラップ
ヘッドホンがついているRiftのようなストラップが開発中だそうです。
PSVRのようなハチマキの位置で固定するタイプっぽいのも良さそうです。
7月にはできると聞いてますが、まぁ予定通りにできるのかはさておき…

##ハンドトラッキング
手の形、LeapMotionを取り付けることができます。
ただ、LeapMotion社は買収されたため、買収先の会社と改めて交渉をやり直しているそうです。
対応ソフトさえ増えてくれば、コントローラを持たなくてもいいので便利そうですが、
取り付け位置から考えると、バンザイみたいなことをすると取ってくれなさそう…。

##無線ユニット
技適がどうにかならないと日本では出せないということだそうです。
ただ、技適もいろいろ変わるみたいなので、出ると嬉しいですね。
動画で見るモジュールはやたら小型なのですが、バッテリーは別につけるっぽいです。

##視線トラッキング
Vive Pro Eyeに搭載された、今どこを見ているのかを取得するモジュールです。
Kickstarterで投資した人にはストレッチゴールとして、無料でついてくるのですが、
今のところはそちらは守られる方針と聞きました。

無料でつけられるってことは、意外に安価なのかもしれません。
実際、こういうモジュールはソフト側の対応も必要なので、
大勢が持ってくれることのほうがメリットが大きいんですよね。

#まとめ

[以前にも書きました](https://qiita.com/izmktr/items/b9deccdd2c9fc113b4c1)が、今の所ヘッドセットだけしか出てないので
VIVEから買い替えという形でないとほとんどのコンテンツが遊べません。

しかし、最近はソフトウェアのアップデートも頻繁に行っていてどんどん良くなっています。
コントローラセットが発売されれば、おすすめの一つにはなるんじゃないかと思ってます。

＃ただ、思った以上にValve Indexのヘッドセット側も出来が良さそうなので、これが本命になるかも…
TypeScript でつくる Google Apps Script ツール

みなさん、Google Apps Script(GAS) は使っていますか?

私は、数年前に GAS を使ってから今まで触っておらず。Google Docs などでちょっとしたスクリクプトを、変な言語でかけるツールという印象を引きずっていました。

しかし、最近 GAS を触る機会があり、その非常に進化した環境に驚きました。

# G Suite Developer Hub

昔の印象では、GAS はいずれ使われなくなるツールだと思っていました。

しかしそんなことは全く無く、最近は G Suite Developer Hub というものが作られており、GAS での自動化を推進しています。

機能も非常に充実しており、Google のほとんどのサービスを、簡単なスクリプトで操作することができます。もちろん REST API や SDK などで操作できる部分も多いですが、簡単さで GAS に勝るものはないと言う印象です。

# clasp

Google Apps Script の特徴として、JavaScript のような謎の言語がありました。非技術者がちょっとしたスクリプトを書くには良いかもしれませんが、普段から他の言語を使っているエンジニア、とくに JavaScript に慣れているエンジニアにとっては、非常につらい環境でした。

clasp は、JavaScript を GAS にトランスパイルしてくれるツールです。これにより、JavaScript 風言語ではなく、本物の JavaScript を使用して GAS がかけるようになります。また、clasp は TypeScript にも対応しています。

## clasp ハマりポイント

clasp はあくまで **トランスパイラ** であり、import/export などを使用するためには webpack 等のツールが必要です。また、TypeScript サポートについても、基本的にはトランスパイルのみであり、型定義が提供等はありません。

また、トランスパイルについても、最低限のことしかやってくれません。トランスパイルが通っても動作しないコードが出力されることがありますし、型チェックが通らないコードもトランスパイルが通ります（これによって、SpreadsheetApp 等の型定義がなくてもトランスパイルが通るというメリットもあります。


# GAS でもテストがしたい

clasp はトランスパイラなので、テストを作るにも工夫が必要です。

今回は、テストのためのランタイムとして [Deno](https://github.com/denoland/deno) を使用します。[Deno](https://github.com/denoland/deno) とは、セキュアな TypeScript ランタイムです。


## なぜ Deno なのか

GAS に最低限必要なのは clasp のみであり、clasp のみを使用する場合には npm のパッケージを作る必要はありません。しかし、テストを行うためには npm でテスト環境を作る必要が発生してしまいます。

もちろん、npm を使用してテスト環境を作っても良いのですが、面倒に感じたため、前々から興味のあった Deno を使用することにしました。

Deno を導入して TypeScript を直接動かすことによって、clasp と deno のみのシンプルな開発環境にできるというのは、大きなメリットだと思います。

Deno は安定版ではないため、本番で使用するべきではありませんが、今回はローカルでのテストのための簡単な TypeScript 実行環境としてのみに限定して導入しています。


## deno でのテスト

deno には標準のテストライブラリ 'https://deno.land/std/testing/mod.ts' が用意されており、以下のように簡単にテストが書けます。

```ts
import { test, runIfMain } from 'https://deno.land/std/testing/mod.ts'
import { assertEquals } from 'https://deno.land/std/testing/asserts.ts'

test('test', () => {
  assertEquals(1, 1)
})
```

## スタブをつくる

clasp では型定義がないままトランスパイルしていましたが、deno ではエラーが出てしまいます。そのため、何らかの方法で型定義を作らなければなりません。

@types/google-apps-script を使用したところ、console を上書きしようとしており、deno ではエラーとなってしまいます。

なので一旦、今回は単純に any でスタブすることにしました。

```stub.ts
declare var SpreadsheetApp: any;
```

このように使用する App を any でスタブし、このファイルを必要な部分で import します。

# さいごに

TypeScript(clasp + deno) で Google Apps Script のツールを作る方法を簡単に紹介しました。

今回は周辺ツールの紹介であり、実際にどのようなスクリプト書くのかについては触れませんでしたが、それについてはいろいろな他にドキュメントがあるので、それに説明を委ねます。

TypeScript で GAS を書ければ、もっと楽しく、より強力なツールを簡単に作れるようになるはずです。
JFreeChart-時系列チャート/TimeSeriesCollection


目次 ⇒ [JFreeChartサンプル](https://qiita.com/artery/items/3e9c63e5c14a9e965c97)

```java
package jp.avaj.lib.chart;

import java.util.Random;

import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.DateTickUnit;
import org.jfree.chart.axis.DateTickUnitType;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.time.Day;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.time.TimeSeriesDataItem;

import jp.avaj.lib.algo.ArDate;

/**
■ JFreeChart-時系列チャート/TimeSeriesCollection
・X値は日時のデータで、その基底クラスはRegularTimePeriod.
・X軸はDateAxisを使用する
・DatasetはTimeSeriesCollectionなどを使用する.注、名称がDatasetではないが、Datasetを実装.

 */
public class Chart16_00 {
  // 目次-時系列データの表示.
  A_Chart15 a_Chart15;
  // 目次-Artery-JFreeChart用のライブラリ
  A_Chart00 a_LibChartSampeContents;

  public static void main(String[] args) {
    // 表示データを作成する
    TimeSeriesCollection ds = createData();
    // レンダラ
    // 最初の引数はラインを引くかどうか⇒今回はラインは引く
    // 次の引数はデータの場所に形を表示するか否か⇒今回は形を表示する.
    XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer(true,true);
    // X軸はDateAxis
    DateAxis xAxis = new DateAxis();
    // 軸の表示単位を設定する,1は一日単位の意味,2にすれば二日ごとに表示する.
    xAxis.setTickUnit(new DateTickUnit(DateTickUnitType.DAY,1));
    NumberAxis yAxis = new NumberAxis();
    // Plotを作成してチャートを表示する
    XYPlot xyPlot = new XYPlot(ds,xAxis,yAxis,(XYItemRenderer)renderer);
    JFreeChart jfreeChart = new JFreeChart("売上推移",(Plot)xyPlot);
    ChartFrame cFrame = new ChartFrame("売上推移",(JFreeChart)jfreeChart);  // (1)
    cFrame.pack();
    cFrame.setVisible(true);
  }
  // 表示データを作成する
  private static TimeSeriesCollection createData() {
    // 商品名の定義
    final String[] items = new String[]{"A","B","C"};
    // 最初の日
    final ArDate startDate = new ArDate(2030,7,1);
    Random ran = new Random();
    TimeSeriesCollection ds = new TimeSeriesCollection();
    for (int item=0; item<items.length; item++) {
      ArDate arDate = (ArDate)startDate.clone();
      // 商品名でTimeSeriesを作成する
      TimeSeries series = new TimeSeries(items[item]);
      for (int day=0; day<5; day++) {
        // 日付をRegularTimePeriodに変換する,RegularTimePeriodの派生クラスはいろいろある.
        Day date = ArcDay.fromArDate(arDate); // DateやCalendarやlongでも可能
        // 売上 ⇒ サンプルなので適当.
        int sales = item*10+ran.nextInt(10);
        // 売上データを作成してSeriesに追加する
        TimeSeriesDataItem dataItem = new TimeSeriesDataItem(date,sales);
        series.add(dataItem);
        // 次の日
        arDate.forward(1);
      }
      // TimeSeriesをTimeSeriesCollectionに追加.
      ds.addSeries(series);
    }
    return ds;
  }
}

```

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278568/052b0691-cf5b-125e-40c0-54f3a718882b.png)
VSCodeのSourceControlが５kと表示された時の対処法と今後の対策

![vscode_git_5k_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429297/cc3774dc-b259-a986-3b3c-59407f146d1a.png)
突然VSCodeのSourceControlが５kと表示されるようになり、色々と調べたのでここに記載しておきます。
##2つの症状
【１】VSCodeでファイルを立ち上げると下の画像の警告が表示され、SourceControlが５kと表示される。
![vscode_git_5k_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429297/42cc07be-fb3a-452f-52ac-91c2e89fcfe2.png)
【２】新規フォルダをVSCodeの新規ウインドウに入れると、上記の警告にプラスして、そのファイルではまだgithubを使っていないのに何故かmasterブランチにいる。
<img width="308" alt="スクリーンショット 2019-07-08 10.57.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429297/d02cb40f-bd3f-42bc-1ee8-1ec97749564f.png">

##解決策
**ホームディレクトリに作られてしまった.gitフォルダを削除する**

【原因】
何らかの拍子にホームディレクトリに.gitのファイルが作られてしまった為、大量にSourceControlの表示が増え、いきなりmasterブランチにいたものと考えられます。

【削除の仕方】
Finderでホームディレクトリを表示し、.gitフォルダを消せば良いのですが、.gitフォルダは隠しフォルダになっている為、可視化されていません。
手順はこう。
（１）Finderを開く
（２）隠しフォルダを開く（[command] + [shift] + [.(ドット)]を同時押し）
（３）下記の状態になります。
<img width="765" alt="スクリーンショット 2019-07-08 11.17.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429297/e707952c-aae0-1ba6-5d3a-8aa7ef718672.png">
半透明になっている「ゴミ箱」「ライブラリ」などがが隠しフォルダです。
これと同じく半透明で.gitフォルダがあるので、右クリックから削除（パスワード入力）。

これで解決です。

##今後の為に
今回はホームディレクトリに.gitを作ってしまった事が原因ですが、gitで開発を行っていると、gitの管理下に置きたくない(無視したい)ファイルが出てきます。
そのファイルが貯まっていくとまたいつかSourceControlに５kと表示されてしまいます。

・プロジェクトのmetaデータ（開発環境で自動作成されるデータ）
・コンパイル、ビルドした時に作成されるデータや実行形式ファイル
・その端末固有の設定情報が記載された環境変数などのファイル
・セキュリティ上、共有したくないファイル

などが対象です。
必要ないmetaデータやコンパイルデータをコミットしてしまうと、目当てのソースコードを見つけにくくなります。また、環境変数などのファイルをコミットしてしまうと、セキュリティ上良くないことになりかねません。

##対策
###git ignore
git ignoreというファイルを作って、そこに無視したいファイルを書いていくことで解決できます。
[git ignoreを使ってファイルを無視する方法【初心者向け】](https://techacademy.jp/magazine/10179)
この記事に初心者向けの使い方が載っています。

ですがもっと簡単な方法見つけました。
###gibo
[Gitの無視ファイルgitignoreを一瞬で作る方法](http://www.aizulab.com/blog/gibo-gitignore/)
この記事に書いてある方法がすごく簡単で取り入れやすかったです。
今後gitを使う事が多くなると思うので、あらかじめこのような予備知識を持っておくと対処に困らずにすみますね。

---
今回は以上です。
訂正や補足などありましたらご教授お願いできればと思います。
最後まで読んでいただきありがとうございました。
[Firebase Cloud Functions] Error: The default Firebase app does not exist. と出る問題

# 概要
Firebase Cloud Functionsで、意外なところでちょっと詰まったのでメモ。

# 問題
例えば以下のようにTriggerを設定したとする。

``` index.ts
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
import { myFunc } from './myFunc';

admin.initializeApp();
exports.myTrigger = functions.https
  .onRequest(async (req, res) => {
    await myFunc();
  });
```

``` myFunc.ts
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';

const db = functions.firestore();

export async function myFunc() { /* 処理 */ }
```
このとき、 `$ firebase serve --only functions` すると

```
Error: The default Firebase app does not exist. Make sure you call initializeApp() before using any of the Firebase services.
```

なるエラー。はて、ちゃんと `admin.initializeApp();` してあるのに、なぜだろう...

# 解決策
`initializeApp()` してから `import` しないとだめだったようだ。

``` index.ts
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp();

import { myFunc } from './myFunc';
exports.myTrigger = functions.https
  .onRequest(async (req, res) => {
    await myFunc();
  });
```

# 教訓
先に `initializeApp()` しよう！
Certificates.command for python on macOS

#機材の環境
Mac OS 10.12.6
brewをbrew_managerというIDで導入。
Administratorという管理者IDで実行中

#StackOverflow

How to make Python use CA certificates from Mac OS TrustStore?
https://stackoverflow.com/questions/40684543/how-to-make-python-use-ca-certificates-from-mac-os-truststore


urllib and “SSL: CERTIFICATE_VERIFY_FAILED” Error
https://stackoverflow.com/questions/27835619/urllib-and-ssl-certificate-verify-failed-error


#Anaconda
を入れてある。

```shell-session:macOS
$ /Applications/Python\ 3.6/Install\ Certificates.command
```
ではうまく入らない。pipで入るらしい。

```shell-session:macOS
$ sudo pip install certifi
Password:
WARNING: The directory '/Users/administrator/Library/Caches/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
WARNING: The directory '/Users/administrator/Library/Caches/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
Requirement already satisfied: certifi in /Users/administrator/.pyenv/versions/anaconda3-4.3.0/lib/python3.6/site-packages (2019.6.16)
```

もう入って要るらしい。
modを使った平方数の効率的な判定と可視化

# 概要
平方数の判定を `mod` を使うと効率よくできるという記事 を5年くらい前に @hnw が [ブログでまとめてた](https://hnw.hatenablog.com/entry/20140503) 。私は 数論をあまり知らないので、手を動かしながら確かめたい(Python3 on Google Colab)。

「平方数の `mod 256` の値は 44 種類しかない」という性質がある。

これを逆に使う。「ある数 `N` を `mod 256` してみて 結果が 44 種類のどれにも該当しないなら `N`は平方数でない」を判定の先頭に配置すると、 (256-44)/256 ≒ 83% くらいの確率で 平方数でないと早めに判定ができる。 `mod 256` って結局 `0xff との AND`というビット演算なので、高速で嬉しい。

# 44種類？
`mod 256`だと 44種類だし `mod 100` だと 22種類だし(出典:[Wikipedia](https://ja.wikipedia.org/wiki/%E5%B9%B3%E6%96%B9%E6%95%B0))、`mod 19` だと 10種類らしい。これを確かめよう。

全ての自然数について調べる必要はない。`mod 256` で `k` となる数は、二乗したときに同じ値になるから（なぜなら $(Q\cdot 256+k)^2$ を 256 で割った余りは $k^2$ を256で割った余り となり $k$のみに依存し$Q$に依存しない）。つまり、0..255 の整数について二乗したときの余りを調べれば十分:


```Python3でのワンライナー.py
>>> set(map(lambda x: x * x % 256,  range(0,256)))
{0, 1, 129, 4, 132, 9, 137, 16, 144, 17, 145, 25, 153, 33, 161, 36, 164, 169, 41,
 49, 177, 185, 57, 64, 193, 65, 196, 68, 73, 201, 81, 209, 217, 89, 225, 97, 100,
 228, 249, 105, 233, 113, 241, 121}
```

上記ワンライナーにより 確かに 44 種類しかないことがわかる。mod100についても同様に 22 種類だとわかる:

```py
>>> set(map(lambda x: x * x % 100,  range(0,100)))
{0, 1, 4, 9, 16, 21, 24, 25, 29, 36, 41, 44, 49, 56, 61, 64, 69, 76, 81, 84, 89, 96}
```

こうなると 色々な数について、この方法での効率を調べたくなってくる。

# 効率性の可視化
前章では `mod 256` と `mod 100` のみを調べた。そして `mod 256` での効率がおおよそ 83% であることを見た。このパーセンテージは 高めたり低めたりすることができるのだろうか？というのを Google Colab で可視化してみた:

```可視化.py
def efficiency (n):
  L = len(set(map(lambda x: x * x % n,  range(0,n))))
  return float(n - L)/n

xs = list(range(2, 1024))
ys = list(map(efficiency, range(2, 1024)))

import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
plt.plot(xs,ys)
```

チャートは以下のようになる:

![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127424/174380ca-b9fa-fe9f-4433-1746938ec249.png)

ここから言えそうなのは

- `mod 256` の 83% っていうのはまあ悪くない数字
- 数によって振れ幅があるけど 50% くらいに下限がある

ということくらいなので、以下若干の考察

## 83%→94%
どうも 1024 まで調べた範囲だと `mod 1008` が一番高効率になり、そのときのパーセンテージは 94% 程度になった。

```py
print (max(ys), ys.index(max(ys)))
print efficiency(1008)

# 0.9365079365079365 1006
# 0.9365079365079365
```

## 50%弱が下限で 素数だと下限に近い
これは hnw の記事でも指摘していた事象だと思う。つまり、`mod 素数`の時は、ちょうど半分が候補から外れることを反映している。以下より、たしかに 全ての素数の効率が 50% 以下であることがわかる:

```py
def is_prime (n):
  return all(map((lambda m: n % m != 0), range(2,n)))

zs = [ i+2 for i, y in enumerate(ys) if y < 0.5]  
primes = list(filter(is_prime, range(3,1024)))
all(list(map(lambda p: p in zs, primes))) # true
```

逆に効率が低いからといって素数というわけではない

```py
print (list(map(is_prime, zs)).count(True)) # 172
print (list(map(is_prime, zs)).count(False)) # 96
```

# まとめ
平方数の判定に `mod 256` を使うことで効率が上がりそうだということを確かめた。
Jetson Nano に Wi-Fiドングルを使用してみる。

Jetson NanoにBAFFALO WI-U2-433DMS(rtl8812au or 8821au) のWi-Fiドングルを使う際に少しこけたのでメモしておく。

```
$ sudo su -
```

コンパイルに必要なライブラリをインストール

```
$ apt install linux-headers-generic gcc dkms build-essential git
```

各種PATHを通す。

```
$ export PATH=${PATH}:/usr/local/cuda/bin
```

```
$ export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/cuda/lib64
```

```
$ export ARCH=arm64
```
ソースをダウンロードする。

```
$ git clone https://github.com/scrivy/rtl8812AU_8821AU_linux.git
```
ダウンロードしたディレクトリに移動。

```
$ cd rtl8812AU_8821AU_linux
```

インストール

```
$ make
$ make install
$ modprobe -v rtl8812au
$ systemctl restart network-manager
```

再起動が必要かもしれません。
以上で完了です。
element ui validate number

以下でできる。

`v-model.number` ってのが味噌。

```

<el-form-item label="料金" prop="price">
     <el-input v-model.number="form.price"></el-input>
</el-form-item>

```

validate

```

price: [
    { type: 'number',required: true, min: 1000,max:100000, message: '1000円以上、100000円未満で、半角数字で入力してください', trigger: 'change' }
],

```
CentOS7で最新バージョンのgitをインストール

## 目的

GitLab CI環境を構築するところで、gitのバージョンが古すぎてdeployが失敗するケースが発生した。
CentOS7で設置されるgitのバージョンは1.8.xなので、2.xに上げないと行けない。
source compileしてインストールすることよりできればyumでインストールしたい。

## git 2.x系をインストール

色々とググって見たけど、qiitaとか他の日本語のWEBで見つけたやり方では様々な依存性の問題が発生した。

* https://computingforgeeks.com/how-to-install-latest-version-of-git-git-2-x-on-centos-7/

ここのやり方では一発で行けたので、紹介する。

```sh
$ sudo yum remove git*
$ sudo yum -y install https://repo.ius.io/ius-release-el7.rpm
$ sudo yum-config-manager --disable ius
$ sudo yum -y install git2u-all --enablerepo=ius
```

Ansibleで既存のplaybookを修正した。

```sh
- name: install development yum packages
  yum: name={{ item }} state=present
  with_items:
    - gcc
    - gcc-c++
#    - git
    - openssl-devel
    - readline-devel
    - unzip
    - yum-utils

# - name: install yum packages in order to install the newest git
#   yum: name={{ item }} state=present
#   with_items:
#     - emacs-filesystem
#     - libsecret
#     - pcre

- name: install yum repository in order to install the newest git
  yum:
    name: 'https://repo.ius.io/ius-release-el7.rpm'
    state: present
  register: ius_repository

- name: disable ius repository
  shell: yum-config-manager --disable ius
  when: ius_repository.changed

- name: install the newest git
  yum:
    name: git2u-all
    enablerepo: ius
    # disablerepo: base,epel,extras,updates
    state: present
```

依存性の問題を解決する為にエラーで指摘されたpackageをインストールして見たけど、切りがない。
次々と他の問題が出てくる。
それでコメントアウトしておいた。

最新バージョンのgitを設置する時、他のrepositoryをdisableにしたら、また失敗した。
他のrepositoryから必要なpackageもあるみたいなので、その部分もコメントアウトした。

```sh
$ git --version
git version 2.16.5
$ sudo cat /etc/yum.repos.d/ius.repo
[ius]
name = IUS for Enterprise Linux 7 - $basearch
baseurl = https://repo.ius.io/7/$basearch/
enabled = 0
repo_gpgcheck = 0
gpgcheck = 1
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-IUS-7

[ius-debuginfo]
name = IUS for Enterprise Linux 7 - $basearch - Debug
baseurl = https://repo.ius.io/7/$basearch/debug/
enabled = 0
repo_gpgcheck = 0
gpgcheck = 1
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-IUS-7

[ius-source]
name = IUS for Enterprise Linux 7 - Source
baseurl = https://repo.ius.io/7/src/
enabled = 0
repo_gpgcheck = 0
gpgcheck = 1
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-IUS-7
```

これでOK。意外と最新バージョンのgitのインストールって難しいね。
XML 要素名が可変の Unmarshal

要素名が可変かつ複数だがその中の属性などはわかっている場合の Unmarshal の方法です。

具体的にはこんな感じ。

```xml
<NAMES>
  <!-- 画面ごとの表示名のリスト。プログラムとしては、ProgramX、CustName、お名前や顧客名が欲しい情報 -->
  <Program1 ID="CustName" Name="お名前" />
  <Program2 ID="CustName" Name="顧客名" />
</NAMES>
```

それを処理するのが以下のコード。

```go
type ItemNames struct {
	Defs []Def `xml:",any"` // ★
}

type Def struct {
	XMLName xml.Name
	ID      string `xml:"ID,attr"`
	Name    string `xml:"Name,attr"`
}

func hoge() error {
	if _, err := os.Stat("itemNames.xml"); err == nil {
		fd, err := os.Open("itemNames.xml")
		if err != nil {
			return err
		}

		content, err := ioutil.ReadAll(fd)
		if err != nil {
			return err
		}
		fd.Close()

		var itemNames ItemNames
		err = xml.Unmarshal(content, &itemNames)
		if err != nil {
			return err
		}

		for _, d := range itemNames.Defs {
			// よしなに
			// d.XMLName.Local
			// d.ID
			// d.Name
		}
}
```
t分布と中心極限定理

#t分布
20-1. 標本とt分布　統計WEB
https://bellcurve.jp/statistics/course/8968.html

正規分布・t 分布・χ2 分布・F 分布とは何か? 分散分析第1回講義:資料1 土居正明
http://www012.upp.so-net.ne.jp/doi/biostat/CT39/distribution.pdf

第5講:正規分布からの標本抽出: t 分布 平成16年11月12日 Jinfang Wang
http://www.math.s.chiba-u.ac.jp/~wang/teaching/b20405.pdf

標本 n が「十分に大きい」の大きさは？（正規分布・t分布） あぱーブログ.
https://blog.apar.jp/data-analysis/4722/


#中心極限定理
中心極限定理の例とメリットをわかりやすく解説 全人類がわかる統計学について 
https://to-kei.net/basic/central-limit-theorem/

中心極限定理と区間推定
樋口さぶろお 龍谷大学理工学部数理情報学科
https://www.a.math.ryukoku.ac.jp/~hig/course/probstat1_2014/w10.pdf


#t分布と中心極限定理
#Ruby の pry のドルマークで元のコードを読む的なアレはなんなのか？ show-source ですよ。

#What is the purpose of reading the original code at Ruby's pry's dollar mark? It is a show-source.


```rb
[3] pry(main)> $ Class

From: /Users/yumainaura/.rbenv/versions/2.6.1/lib/ruby/2.6.0/json/common.rb @ line 448:
Class name: Class
Number of lines: 9

class ::Class
  # Returns true if this class can be used to create an instance
  # from a serialised JSON string. The class has to implement a class
  # method _json_create_ that expects a hash as first parameter. The hash
  # should include the required data.
  def json_creatable?
    respond_to?(:json_create)
  end
end
```

```rb
[2] pry(main)> show-source Class

From: /Users/yumainaura/.rbenv/versions/2.6.1/lib/ruby/2.6.0/json/common.rb @ line 448:
Class name: Class
Number of lines: 9

class ::Class
  # Returns true if this class can be used to create an instance
  # from a serialised JSON string. The class has to implement a class
  # method _json_create_ that expects a hash as first parameter. The hash
  # should include the required data.
  def json_creatable?
    respond_to?(:json_create)
  end
end
```


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2256








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Laravelの開発環境を構築してみる(Windows 8.1 + Homestead)

## はじめに

最近Laravelの勉強を始めました。Laravelを使いこなせるようになるまでの足跡を残していきたいと思います。

## 開発環境について

開発環境は「Homestead」を使って構築します。
OSは「Windows 8.1」を使用します。

## ツールのインストール

以下のツールを公式サイトからダウンロードしてインストールします。

|名前|説明|
|:--|:--|
|Git|分散型バージョン管理システム|
|VirtualBox|OS上で仮想サーバを使うことができる|
|Vagrant|仮想化ソフトウェアの操作を支援する|

### Gitのインストール

[公式サイト](https://git-scm.com/)からインストーラをダウンロードします。インストーラを実行し、画面の指示に従ってインストールします。「Git BASH」を起動して、以下のコマンドでインストールの確認をします。

```
$ git --version
git version 2.21.0.windows.1
```



### VirtualBoxのインストール

[公式サイト]()からインストーラをダウンロードします。インストーラを実行し、画面の指示に従ってインストールします。

### Vagrantのインストール

[公式サイト]()からインストーラをダウンロードします。インストーラを実行し、画面の指示に従ってインストールします。
「Git BASH」を起動して、以下のコマンドでインストールの確認をします。

```
$ vagrant --version
Vagrant 2.2.4
```

## ディレクトリ構成

実際に構築する開発環境のディレクトリ構成は次の通りとします。プロジェクト名はtestappとします。

### ローカル環境

|説明|パス|
|:--|:--|
|仮想環境との共有ディレクトリ|(ユーザディレクトリ)/code|
|Laravelプロジェクト|(ユーザディレクトリ)/code/testapp|
|Homesteadダウンロード先|(ユーザディレクトリ)/Homestead|

### 仮想環境

|説明|パス|
|:--|:--|
|物理環境との共有ディレクトリ|/home/vagrant/code|
|Laravelプロジェクト|/home/vagrant/code/testapp|
|nginxドキュメントルート|/home/vagrant/code/testapp/public|

## Homesteadのダウンロード

以下のコマンドを実行してHomesteadをダウンロードします。

```
$ vagrant box add laravel/homestead
```

入力を求められたら、virtualboxの3を入力します。ダウンロードが完了するまで気長に待ちます。

```
1) hyperv
2) parallels
3) virtualbox
4) vmware_desktop

Enter your choice: 3
```

次の通り表示されたら完了です。

```
==> box: Successfully added box 'laravel/homestead' (v7.1.0) for 'virtualbox'!
```

続いて、以下のコマンドでHomesteadの設定をダウンロードします。

```
$ cd
$ git clone https://github.com/laravel/homestead.git Homestead
```

## Homesteadの初期化

以下のコマンドでHomesteadの初期化をします。

```
$ cd ~/Homestead
$ bash init.sh
Homestead initialized!
```

## SSH鍵ファイルの作成

SSH鍵がない場合は作成します。パスフレーズの有無は自由です。

```
$ cd
$ mkdir .ssh && cd $_
$ ssh-keygen -t rsa
```

## Homesteadの設定

Homestead.yamlファイルをディレクトリ構成に合わせて編集します。以下は編集後（コメント行除く）です。

```:Homestead.yaml
---
ip: "192.168.10.10"
memory: 2048
cpus: 1
provider: virtualbox

authorize: ~/.ssh/id_rsa.pub

keys:
    - ~/.ssh/id_rsa

folders:
    - map: ~/code
      to: /home/vagrant/code

sites:
    - map: homestead.test
      to: /home/vagrant/code/testapp/public

databases:
    - homestead
```

物理環境の共有ディレクトリを作成します。

```
$ cd
$ mkdir code
```

hostsの設定をします。hostsファイルに以下の設定を追加し、ホスト名(homestead.test)でアクセスできるようにします。

C:\Windows\System32\drivers\etc\hosts

```
192.168.10.10   homestead.test
```

## Vagrantの起動

```
$ cd ~/Homestead
$ vagrant up
```

使いそうなvagrantのコマンドは次の通りです。

|コマンド|説明|
|:--|:--|
|vagrant start|仮想マシンを起動する|
|vagrant halt|仮想マシンを停止する|
|vagrant reload --provision|Homestead.yamlの変更を反映させる|
|vagrant status|仮想マシンのステータスを表示する|
|vagrant destroy|仮想マシンを破棄する|
|vagrant ssh|仮想マシンにssh接続する|

## Laravelプロジェクトの作成

仮想環境へログインします。

```
$ vagrant ssh
```

composerを使用して、以下のコマンドでプロジェクトを作成します。

```
$ cd ~/code/
$ composer create-project laravel/laravel testapp --prefer-dist "5.5.*"
```

ブラウザで`http://homestead.test`へアクセスして、Laravelのwelcome画面が表示されれば成功です。

## 参考

 - [Laravel Document](https://readouble.com/laravel/)
 - 竹澤勇貴・栗生和明・新原雅司・大村創太郎(2018)『PHPフレームワーク Laravel Webアプリケーション開発　バージョン5.5LTS対応』ソシム
Re:ゼロから始めて rust を完全に理解する　その２

## ここを見て0からrustを勉強し始めた
~~https://doc.rust-jp.rs/the-rust-programming-language-ja/1.6/book/README.html~~
↑古かった
↓こっちが新しい
https://doc.rust-jp.rs/book/second-edition/ch02-00-guessing-game-tutorial.html


### [前回](https://qiita.com/dynamiteore/items/25825b8347a15d02a4bb) の続きからソースを見ていく

``` rust
extern crate rand;

use std::io;
use std::cmp::Ordering;
use rand::Rng;

fn main() {
    println!("Guess the number!");

    let secret_number = rand::thread_rng().gen_range(1, 101);

    loop {
        println!("Please input your guess.");

        let mut guess = String::new();

        io::stdin().read_line(&mut guess)
            .expect("Failed to read line");

        let guess: u32 = match guess.trim().parse() {
            Ok(num) => num,
            Err(_) => continue,
        };

        println!("You guessed: {}", guess);

        match guess.cmp(&secret_number) {
            Ordering::Less => println!("Too small!"),
            Ordering::Greater => println!("Too big!"),
            Ordering::Equal => {
                println!("You win!");
                break;
            }
        }
    }
}
```

#### ①
.expect(...) の部分、read_lineの戻り値がResult型でenum でOkかErrが返ってくる。
Errが返ってきた場合、expectでプログラムをクラッシュさせて、文字列を表示する。
expectを付けないでコンパイルした場合、Errが返ってくる可能性に対してハンドルしてないよ！！の警告を食らう、rustの世界厳しいっすね。

```rust
io::stdin().read_line(&mut guess)
            .expect("Failed to read line");
```

#### ②
 let guess: u32 = ...　guess変数をunsigned 32bit 数値型で再定義している。
入れる内容は、read_lineで読み取った文字列型のguessを数値型にparseで変換をかける。
parseの戻り値もResult型なので、Errに対するハンドルをしないとワーニングがでてしまう。
matchを使って戻り値判定を行い、返ってきたEnumの列挙型ごとに処理を分岐させる。
Err(_)の場合、_は包括値で全てのエラーにマッチするらしい、他での応用も含めてもう少し調査が必要、ひとまずは文字列⇒数値へのパースに失敗したらcontiune。

```rust
        let guess: u32 = match guess.trim().parse() {
            Ok(num) => num,
            Err(_) => continue,
        };
```
#### ③
最初に定義した乱数secret_numberをcmpに借用で渡す、戻り値がEnum型なのでmatchで判定して処理分岐。ここは直感的に理解できるな。

```rust
        match guess.cmp(&secret_number) {
            Ordering::Less    => println!("Too small!"),
            Ordering::Greater => println!("Too big!"),
            Ordering::Equal   => {
                println!("You win!");
                break;
            }
        }
```

まずはここまで完全に理解した。
Uncaught TypeError: Cannot read property 'nodeType' of null（in Elm）

# まとめ

とりあえず全部のscriptタグにdeferでもつけてみる

# 問題

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74093/cc56d37b-492a-e40b-a868-a97e62f842b9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74093/38489aa6-2715-b0e1-71f6-ad532820c4ca.png)

画面がまっしろで開発者ツールのコンソールに`Uncaught TypeError: Cannot read property 'nodeType' of null`って出る

## 状況

```html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <script type="text/javascript" src="/elm.js"></script><!-- elm makeで生成したやつ -->
    <script type="text/javascript" src="/index.js"></script><!-- この中でElm.Main.initしてる -->
  </head>
  <body></body>
</html>
```

あんまりないと思うけどこんな状況
ElmのコードをJS側にくっつけてても一緒

# 解決法

1 deferったりする

```html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <script type="text/javascript" src="/elm.js" defer></script>
    <script type="text/javascript" src="/index.js" defer></script>
  </head>
  <body></body>
</html>
```

最低限`Elm.main.init`してるほうにはdefer付ける必要があります

2 下の方に置く

```html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <script type="text/javascript" src="/elm.js"></script>
  </head>
  <body><script type="text/javascript" src="/index.js"></script></body>
</html>
```

deferなんて知らないってひとにおすすめ

# 原因

別にElm関係ない。DOMをマウントするときにちゃんと対象のDOMが存在するかどうかって話

jsのパースとかDOMのできるタイミングとかいろいろあるけど詳しくは他で調べてください。大事なのはDOMができたあとで`init`するってことです

deferはjsの実行をDOMができたあとにするのでそれで通ります
詳細を気にしなければ何も難しいことはないですね
閲覧専用のGoogle CalendarをMacのカレンダーに表示させたい！！！

Qiitaに書くほどでもないしょーもない話ですが、結構悩んだので。

# 何に困ったか
Google CalendarをMacのカレンダーに表示するためには、普通にGoogleアカウントを追加してやればOKです。
しかし自分以外のユーザーが作ったGoogle Calendarを追加すると、
WebのGoogle Calendar見ると見られるんですが、Macのカレンダーアプリには表示されません。
これはデフォルト設定だと、Google Calendarは「マイカレンダー」に登録されてるやつしか表示しない仕様だからみたいです。
Appleの縛りなのか、Googleの縛りなのかわかりませんが、まあまあ不便です。

# どうしたら表示できるか
Google Calendarの設定ページを割と隅から隅まで探したんですが、表示する項目はないように見えます。
ただググってみたら、直接下記のリンクに飛ぶと、同期設定を変更することが可能でした。

[同期設定](https://calendar.google.com/calendar/syncselect)

古めのデザインのページなので、Googleのアップデートが追いついてない画面なのかもしれません。
ちょっとした隠しコマンドみたいになってますね。。。

# 参考
[他のユーザーと共有したGoogleカレンダーをMacやiPhoneの「Appleカレンダー」で同期する方法](https://ischool.co.jp/2018-03-22/)
ERC721にリセット機能を追加することを考える

# はじめに（背景・課題）
ERC721規格のTokenを使ったシステムを開発していると、
「1回発行したTokenを全部リセットしたいなー」と考えることがある。
特にTokenの値をオフチェーンのDBと紐づけている場合は、「DBリセットするタイミングでTokenもリセットしたいなー。デプロイし直すとアドレス変わるから、アドレスはそのままでリセットできるといいなー。」と考える。
そこで、Reset関数を実装したERC721Resettableなるものを真剣に考えてみたので、その考察についてメモを残す。

# 結論
ERC721にリセット関数はいらない。
リセットしたいならコントラクトをデプロイし直すのがいい。
![](https://img.gifmagazine.net/gifmagazine/images/3014792/original.gif)
参照：https://gifmagazine.net/post_images/3014792

# 理由
色々書いておいて元も子もない結論だが、真剣に考察した上でそう思ったので、その理由を述べていく。

### 1.Eventの履歴は消せない
まず、Eventの履歴を消せないことが挙げられる。
Storageの値を全て消したとしても、Eventの履歴を消すことはできない。
ERC721は、mintやtransferといったタイミングでEventをemitしており、サーバーも絡んだシステムでは、これらの値を使ったシステムを組んでいることがほとんどである。
そのため、実際の実装としては、「Token側はリセット時点でResetイベントをemitするようにする。サーバー側ではResetイベントも監視し、最新のResetイベント以降のイベントしか見ないようにする。」といった工夫が必要になってくる。
開発しやすくするためのリセット機能のはずが、複雑な処理を生んでしまい、モヤモヤした気持ちになる。

### 2. 消すべきstorageがprivate
ERC721規格のTokenを開発する場合、[OpenZeppelinのERC721](https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/token/ERC721/ERC721.sol)を継承するのが慣例になっている。
これを継承していない場合、監査の段階で「OpenZeppelinのERC721を継承してください」と言われてしまう。（継承していないと、ERC721自体の実装にも監査が必要なのでコストがかさむ。）
そこで、[OpenZeppelinのERC721](https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/token/ERC721/ERC721.sol)を見ていくのだが、リセットしたいstorage変数がprivateで宣言されている(例えば_tokenOwner)。
このため、「継承した上でリセット関数を追加する」のではなく、「継承元のERC721自体にリセット関数を追加する」必要が出てくる。private変数をinternalに書き換える方法もあるが、どちらにせよERC721自体を書き換える必要が出てくる。
「開発で使うだけなんだから、別にいいんじゃない？」と思うかもしれないが、これだと、最新のOpenZeppelinによる変更が反映されないファイルを使い続けることになってしまい、ときどき手動でメンテナンスする必要が出てくるため、使い勝手が悪い。

### 3. mappingはdeleteできない
mapping型の変数は、それ自体をdeleteすることができない。
https://solidity.readthedocs.io/en/develop/types.html#delete
mappingに追加した値のkeyを保存しておけば、１つ１つ要素をdeleteしていけるが、大変。
大変が嫌で始めたので、モヤモヤする。

### 4. Truffleからのデプロイが改善されている
以前は、Truffle内部のWeb3.jsが0.x系だったため、globalなtestnet(rinkebyやropstenなど)に対する、transactionを含むコマンドが連続して実行できなかった。（awaitできないので、jsのスクリプトもshellスクリプトも連続的に回すのが難しく、工夫がいる状態だった。）
しかし、内部にweb3の1.x系が組み込まれ、この問題が解決した。スクリプトを書けば、複雑なデプロイ時の処理も１つのコマンドで実行できる。

# まとめ
このように、
「ERC721にリセット関数があれば便利だなー」と考え、
実装を試みた結果、
「(開発効率を考えると)リセット関数はいらない」という結論に至った。
コントラクトをデプロイし直して、変更されたアドレスをサーバー側にも渡すほうが効率が良い。
同じように考えている人の参考になれば幸いです。
JetsonNanoでUSBメモリ暗号化

# はじめに
JetsonNanoでUSBを暗号化する必要があったので、メモ書き
#準備
cryptsetupを用いて暗号化していきます。

```
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install cryptsetup
```

以下では/dev/sda1のDiskを暗号化する前提で説明します。
毎回sudoをつけるのが面倒なのでrootで行います。

```
sudo su -
```
デバイスの確認

```
fdisk -l /dev/sda1
```

## パーティションの初期化
最初にUSBは自動でマウントされると思いますので、マウントを解除し、パーティションの初期化を行います。

```
umount /dev/sda1
cryptsetup luksFormat /dev/sda1
```
Are you sure? (Type uppercase yes):と聞かれるので、大文字でYESと入力してください。小文字は出来ません。

## 初期化済みのLUKSパーティションをマッピング

```
cryptsetup open /dev/sda1 luks
```
マッピングされたかを一応確認

```
ls /dev/mapper/
```

## 暗号化されたパーティションをex4にマウント

```
mkfs.ext4 /dev/mapper/luks
```

パーティションにマウントします。

```
mount -t ext4 /dev/mapper/luks /mnt
```

マウントの確認

```
df -h
```
```
/dev/mapper/luks           20G   45M   19G    1% /mnt
```
このように出力されれば、暗号化の完了です。

# 自動マウント

自動で暗号化されたUSBをマウントしたかったので、設定します。

## keyfileの設定
keyfileは暗号化や複合化に使うファイルになります。今回は平文でパスワードをファイルに保存します。平文のパスワードではなくバイナリファイルも登録できます。

```
echo -n 'password' > /root/luks_keyfile
```
パスフレーズをファイルに書き出します。実際に'pasword'にはパーティションのマッピングで入力したパスワードを記入してください。

```
chmod 600 /root/luks_keyfile
```
所有者以外読み込みできないようにしてください。

##keyfileをKeyスロットに登録

```
cryptsetup luksAddKey /dev/sda1 /root/luks_keyfile
```

## Keyスロット登録の確認

Keyスロットが登録されていることを確認します。

```
cryptsetup luksDump /dev/sda1
```
## 暗号デバイス自動接続設定
/etc/crypttabファイルに暗号デバイス自動接続設定を追加

```
echo "luks /dev/sda1 /root/luks_keyfile luks,timeout=5" >> /etc/crypttab
```

## 自動マウント設定
/etc/fstabにマウント設定を追加

```
echo "/dev/mapper/luks /mnt ext4 rw,nofail,seclabel,relatime,data=ordered 0 0" >> /etc/fstab
```
マウントオプションは適宜設定してください。ただし、nofailを設定しないと自動接続やマウントできないときに起動しない恐れがあるので設定しましょう。
Kubernetesで始めるHCI（第二回　〜Kubernetes Cluster Setup編〜）

#Kubernetesとは
[公式](https://kubernetes.io/)はこちら。今更説明するまでもないだろうが、Container Orchestration の Defacto Standard 
説明し出すと終わらなくなってしまいそうなので、個人的に思うところを書き記しておこう。
私は長らくVMwareやOpenStackを利用した仮想環境を作ってきた。Cloudが台頭してきて幾度と無く比較し、比較されOn Premiseでの限界を感じはじめたのは６年前くらいからだろうか。今でも細々と仮想環境でPrivate Cloudなるものを作ってみたりしてはいるが、時代の流れには到底逆らうことはできないようだ。そこで、着目したのがKubernetes。何故か、Cloudとの親和性、透過性の高さを謳った物だからだ。On PremiseとかAWSとかGCPとか、囚われることなくDeploy可能な環境を作り出すことができる。まぁ、実際にはそんなに簡単なものでは無いがとにかく今、熱を帯びているProjectであることは皆が感じていることだろう。と言うわけで私もそれに相乗りしてこの記事を書くに至ったわけだ。

#kubeadm
Kubernetes Clusterを作る方法は色々存在するが、今はkubeadmを利用した、Setup方法が主流にあると言える。まぁ、Managedなサービスを利用する方が多いだろうから、Setup方法にこだわりを持つのはナンセンスな考え方だと思う。と言うわけで、サクッとKubeadmを利用したSetup方法を紹介していく。[公式](https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/)はこちら。

#検証環境構成
[構成図](https://docs.google.com/drawings/d/1yvBCkEf98vzagdvKZY7_LVQaXC2qnOm14RrigdALens/edit?usp=sharing)
こちらの環境で作成している。こちらは上記公式にあるUbuntu OSをKVMの仮想環境で作成してDocker Runtimeで構成している。特筆すべき点はNICが２NIC構成になっていることとWorker NodeにTier用のDiskがつけられていることだろう。性能の厳密な計測はできないが、Networkをスケールアウトできていることの確認とHDDでTierで構成できることの確認が出来れば検証としてはかなり有用と言えるだろう。
詳細については今後更新していく予定だ。