OmniAICreator/Qiita-1.07M huggingface dataset:
Git初級者が集まってGit&Githubを勉強する時に使うメモ

#はじめに
初心者が集まってGitを勉強する内容をまとめたページです｡

##目標
チーム開発で必要なGitとGithubに関する最低限の知識を習得する

##このページで学ぶ内容
- Gitとは?　GitHubとは?　まずは何なのか知る｡
- HTTPS通信を利用して、フォーク､コミット､プッシュができるようになる。
- ブランチの概念を理解する｡
- プルリクエストできるようになる｡
- GUIでの操作を知る｡

#準備
##GitHubアカウント作成
GitHubのアカウント作成をお願いします｡

https://github.com/

##Gitのインストール
こちらもインストールお願いします｡

Windowsの方
https://qiita.com/toshi-click/items/dcf3dd48fdc74c91b409

Macの方
http://tracpath.com/bootcamp/git-install-to-mac.html

###インストールの確認
versionコマンド打ち込んで返ってきたら、OKです｡

Windows : GitBash

```
  $ git --version
  git version 2.**.*.
```

Mac : ターミナル

 ```
   省略(リンク先にもあるので)
```
#Gitの設定
ターミナルで下記コマンドを打ち込みます｡

```
git config --global user.name githubのusername       //Gitの設定1
git config --global user.email githubのmailaddress   //Gitの設定2
```
```
$ git config --global user.name　　　　　　　 　　　　　　　　　　　　　　　    　　　//設定の確認1
=>　自分のgithubのユーザー名が表示されればOK

$ git config --global user.email     　　　　　　　　　　　　　　　　　　　　 　//設定の確認2
=>　sample@gmail.com とかgithubに登録したメールアドレス表示されればOK
``` 

#目次とリンク

- [【第1回】Gitってなに？ 基本的なコマンド 〜commit push pull〜](https://qiita.com/kumegoon/items/9ffa48f990a2fb18697b)

- [【第2回】branchと切替方法　〜fork〜pull request〜](https://qiita.com/kumegoon/items/5027e6d7f4a60f9f0663)

- [【第3回】GitFlow GitHubFlowについて](https://qiita.com/kumegoon/items/63b8b6d283f6eeb67fb6)

- [【第4回】SourceTreeを使用したGUIでのGit操作](https://qiita.com/kumegoon/items/fded712eae7bd9fa608b)

#参照リンク
色々参照しているので､まとめてリンクを貼ります｡
[サルでもわかるGit入門](https://backlog.com/ja/git-tutorial/?gclid=Cj0KCQjw_7HdBRDPARIsAN_ltcIFVZK2XS2Rvy10A9_n52n-ym42JTGKZSeY_bQ1K-pzcuVLAtpG6nUaAiBaEALw_wcB)　←有名､わかりやすい｡
[いつやるの?　Git入門](https://www.slideshare.net/matsukaz/git-28304397)　←こちらもオススメ
[こわくない　Git](https://www.slideshare.net/kotas/git-15276118)　←こちらもオススメ②
[デザイナのためのGit入門](https://www.slideshare.net/dsuket/git-16343460?from_m_app=ios) ←こちらもオススメ③
[introduction-to-git](https://github.com/Shinpeim/introduction-to-git)　←詳しく書いてあります｡
[Pro Git](https://git-scm.com/book/ja/v2)　←これはかなり詳しく書いてあります｡

#(PC慣れてない人向け)勉強会で質問する時に便利
[スクショのとり方](https://qiita.com/kumegoon/items/c0c01a7008915fb94fff)

以上
スクショのとり方

#スクショをとろう
わからない時は､チャット画面にスクショを貼っちゃって下さい｡
「エラーメッセージをそのまま貼る」でも､OKです。

##スクショのとり方
#### Windows
[Alt]+[PrtScreen] でカレントウィンドウ
[PrtScreen]で画面全体

【限定】Windows10のcreators updateを適応した環境
[Win+Shift+S]で選択範囲

#### Mac
「⌘  shift 3」で画面全体
「⌘  shift 4」で選択範囲

以上
ESP-32とMicroPythonでCO2センサを読んでみた+α

#初めに
ESP32がお好き？けっこう．ではMicroPythonを使ってみるとますます好きになりますよ．

#きっかけ
講義中眠くなるのはCO2濃度が高いからって古事記に書いてあったからとりあえずCO2濃度が基準値超えたらアラートを出して換気を促すSomeThingを作ってみたい．それと温度と湿度も測れるようにして，ついでにWifiのAP立ててWEBから濃度とか見れるようにしたい．

#制作
環境はUbuntu18.04．部品はAliExpressで．

##主に参考にしたところ
https://kokensha.xyz/electronics/try-micropython-on-esp32/
http://ken5owata.hatenablog.com/entry/2017/10/21/003706
##検品
Aliexpressから買ったのでとりあえず検品してみた．
とりあえず，文献が豊富なArduinoとしてのESP32で読んでみた．
以下参考．
https://blog2.creativeflake.com/2017/04/22/オフィス換気のため-co2-センサー作り-ー-arduino-bme280-mh-z19編/
http://toccho.xsrv.jp/2018/05/05/esp-wroom02-mh-z19-measurement/
途中，配線を間違えて2000円と2週間を水泡に帰すところだったが，なんとかUARTで読むことに成功した．MH-Z19の電源電圧が3.3Vじゃ足りなくて困ってたらESP32ボードのVinから5Vが出ていることに気が付けて良かった．
![Screenshot from 2018-10-05 22-33-34.png](https://qiita-image-store.s3.amazonaws.com/0/238384/193721d9-9b2c-4297-d6d7-35f1cc9d4ee6.png)


が，しかし開けてある窓の近くに置いてるのにCO2濃度が高すぎやしないか？と思って調べてみたらキャリブレーションをすればリセットされて400ppmになるらしい．まだやらないけど．

##MicroPythonをESP32へ
さて，いよいよESP32にMicroPythonを入れる時がやってきました．
参考↓
http://ken5owata.hatenablog.com/entry/2017/10/21/003706
適当なコマンドなりソフトでシリアルを覗いたら
![Screenshot from 2018-10-05 23-03-16.png](https://qiita-image-store.s3.amazonaws.com/0/238384/dc4d8e51-125f-eb79-ef0e-921f0bad07d5.png)

成功してました．(繋いだらリセットスイッチとか押さないとこの画面は出力されない)
エラーが出てるけど気にしたら負け．
##MicropythonでUART
そのままやろうとしたけど，Micropythonでデフォルトのやつ以外でUARTってどうしたらできるんだ？と悩みつつ見つけた救世主↓
https://github.com/micropython/micropython-esp32/issues/78

```
>>>import machine
>>>u1=machine.UART(1,baudrate=9600,rx=5,tx=4)
>>>b=bytearray([0xff, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79])
>>>u1.write(b)
>>>n=u1.read()
>>>f=n[2]*256+n[3]
>>>print(f)
```
をすると
`1791`
と出てきてくれたのでMicropythonでもCO2センサが読めた．

##ディスプレイの実装
###とりあえずArduinoで
情報を表示するのはAliexprerssで買ったSSD1306搭載のOLED．とりあえずサンプルがあるAruduinoとして検品してみた．
参考↓
https://qiita.com/jakalada/items/8f83d07291d984a31633
![IMG_20181006_135746.jpg](https://qiita-image-store.s3.amazonaws.com/0/238384/5d5d426a-6229-d5cb-f637-b487fcbb7d71.jpeg)
動いた．

###Micropythonで
https://qiita.com/inachi/items/ceb3e8e12022a7cbdf7b
を参考にやってみた．
ピン配置はSCLが22で，SDAが21にした．
![IMG_20181006_143928.jpg](https://qiita-image-store.s3.amazonaws.com/0/238384/41b3c52a-09fa-43b4-bc41-9d1d8a65a921.jpeg)
表示はできたようだ．


##温湿度計
DHT22というセンサを使いました．
ライブラリはこれを使いました．
https://github.com/micropython/micropython/tree/master/drivers/dht
使い方はコード読めばわかるはずです．
配線はプルアップし忘れなければ問題ないです．
ついでに不快指数も出してみました．
![P_20181222_221229_vHDR_Auto.jpg](https://qiita-image-store.s3.amazonaws.com/0/238384/c4af6b64-10b4-4b9d-0ca9-521456510db4.jpeg)

##回路
雑ですがこんな感じになりました．
![page1.png](https://qiita-image-store.s3.amazonaws.com/0/238384/5c9763a0-6be2-fe02-8280-686682067cbe.png)

いつかこれをユニ基で実装します．


##最後に
BaaSにデータを送ってグラフ化したいのでこんど_threadモジュールを使ってきれいに実装し直します．
AWS入門 Elastic IPを使った独自ドメインでのサイト運用

前 [AWS入門 ELBを使った負荷分散（ロードバランサー）](https://qiita.com/tseno/items/2041e82a7f2f8e721a18)
次 [AWS入門 CloudFrontを使ったデータ配信](https://qiita.com/tseno/items/d75d7909cb3a9da40a6a)

# Elastic IPを使った独自ドメインでのサイト運用

## 固定IPアドレス（Elastic IP）の割り当て

- EC2はインスタンスを起動すると、パブリックIPアドレスとパブリックホスト名が割り当てられるが、停止／起動するとIPアドレスは変更されてしまう。
- そこで、インスタンスにElastic IPを割り当てることで、常に固定のIPアドレスを利用できるようになる。

### 1/4.Elastic IPの設定

- AWSマネジメントコンソールから、`EC2` → `Elastic IP` → `新しいアドレスの割り当て`をクリックする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/88686/d4841586-e60e-ed20-0410-6167412f2ff0.png)

### 2/4.アドレスの割り当て

- 割り当てをクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/88686/bf41aa3d-1ec2-29ae-b889-342f5cdf6713.png)

- 固定IPが割り当てられた。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/88686/25654ce0-b6d6-4a53-6202-e3d7d811bd4d.png)

### 3/4.アドレスの関連付け

- 右クリック → アドレスの関連付けをクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/88686/a357e1e4-ca1c-5b9b-520d-69e981878d14.png)

- インスタンスを選択 → EC2インスタンスIDを選択 → プライベートIPを選択 → 関連付けをクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/88686/cf549282-75c9-69b2-b43d-f35ce047ae3f.png)

### 4/4.動作確認

- 割り当てられた固定IPアドレスで、ブラウザから開く。停止／起動しても固定IPアドレスからアクセスできることを確認できた。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/88686/8be96680-e2e4-59ff-f5c8-5ce07dcd8e76.png)


## Route 53によるDNSサーバー設定

Route 53には以下のような機能がある。

- ドメインの登録・・・ドメイン名を購入及び管理。
- ドメインネームシステム（DNS）サービス・・・www.example.comのようなドメイン名を、192.0.2.1のようなIPアドレスに変換する。
- ヘルスチェック・・・リクエストをアプリに送ってヘルスチェックができる。障害が発生しているサーバーがあれば、別のサーバーにフェールオーバーさせることができる。

### 1/4.Route 53の起動

- AWSマネジメントコンソールから、Route 53を起動する。DNS managementを選択。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/88686/acdd4778-d707-3e07-8557-36ac41c61612.png)

- `Create Hosted Zone`をクリックする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/88686/64705f69-98eb-9965-002c-e29ca5eaa344.png)

### 2/4.レコード設定

- `Create Record Set` → `www`を入力 → `A-IPv4 address`を選択 → Elastic IP(固定IPアドレス)を入力 → Createを押す。
- 同様の手順で、逆引き用の`PTRレコード`も登録する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/88686/645832fe-ee5d-3712-3bf6-15b59f114eda.png)

- Aレコード、PTRレコードが追加されていることを確認。（画面ではAレコードのみしか追加していない）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/88686/380857eb-1765-785f-d9e6-b5ffbdd08dda.png)

### 3/4.レジストラへの登録

- Route 53で登録したドメインのネームサーバーを、レジストラのネームサーバーに指定する。今回は、画面のns-から始まる4つのネームサーバーを登録する。（登録方法は本には書いていない。ドメインを購入した時に追記する。）
- 反映までにしばらく時間がかかる。

### 4/4.動作確認

-　`www.asa.yokohama`にアクセスすると、画面が表示されればOK。（実際に登録していないので未確認）


参考
[Amazon Web Servicesではじめる新米プログラマのためのクラウド超入門](https://www.shoeisha.co.jp/book/detail/9784798144696)
動画操作ソフト ffmpeg のエラー "width not divisible by 2" への対処

##環境
<font color="DimGray">・Ubuntu 16.04</font>
<font color="DimGray">・ffmpeg 3.4</font>

<font color="DimGray">ffmpegは以下でインストールできる</font>
[参考サイト](URL "http://ubuntuhandbook.org/index.php/2017/10/ffmpeg-3-4-released-install-ubuntu-16-04/")


```
$ sudo add-apt-repository ppa:jonathonf/ffmpeg-3
$ sudo apt update && sudo apt upgrade
$ sudo apt install ppa-purge && ppa-purge ppa:jonathonf/ffmpeg-3
```

##問題のエラー

<font color="DimGray">ffmpegでimage_0000.jpgから始まる連番画像を動画に変換する際に現れたエラー</font>

```
$ ffmpeg -r 12 -i image_%04d.jpg -vcodec libx264 -pix_fmt yuv420p -r 24 out.mp4
```


<font color="DimGray">実行するとエラーが出る</font>

```
width not divisible by 2 (993x758)
```
<font color="DimGray">縦、横の各ピクセル数が2の倍数でないのが原因</font>


## ピクセル数を2の倍数に変換


<font color="DimGray">以下のオプションを追記すれば良い</font>

```
-vf "scale=trunc(iw/2)*2:trunc(ih/2)*2"
```

<font color="DimGray">オプションを追加して実行</font>

```
$ ffmpeg -r 12 -i image_%04d.jpg -vcodec libx264 -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" -r 24 out.mp4
```

<font color="DimGray">変換に成功した</font>
Python __init__.pyの書き方

# Python `__init__.py`の書き方
Pythonのパッケージを作るのに欠かせない`__init__.py`。

正直自分にとって面倒でイライラする存在でした。  
もしかしたらみんな知っているかもしれないけど、
`__init__.py`作り方についてご紹介します。

***
## 初心者にとって面倒な`__init__.py`
まず、`__init__.py`って何?という話ですよね。


>`__init__.py`とは  
>`__init__.py`は2つの意味がある  
>1つはPythonディレクトリを表す役割を担う  
>1つはモジュールをimportするときの初期化処理を行う

...僕は最初のうち、この説明ではよくわかりませんでした。

やっていけば分かるはずなのでここではこれ以上この説明に突っ込みません。

***
## import ~ と from ~ import ~ の違い
`__init__.py`の説明の前にまず、importとfromについての説明を少々。

### import
***import モジュール名 [as 別名]***  
*あるモジュールの機能を追加する*

機能を利用するときは  
(モジュール名 もしくは 別名).(機能名)と入力します。

```Python:例1
#randomというパッケージをimport
import random

#random内のrandintという関数を使う
A=random.randint(0,100)
print(A)
```
```Python:例2
A=[1,2,3,4,5]

#matplotlib内にあるpyplot.pyをimport
import matplotlib.pyplot as plt

#pyplot.pyのplotという関数を使う
plt.plot(A)
plt.show()
```

### from import
***from モジュール名 import 機能名***  
*あるモジュールのある機能を追加する*

ある機能のみを追加したいとき、モジュール名を書かずに使うことができます。

```Python:例
A=[1,2,3,4,5]

#matplotlibパッケージ内のpyplot.py内にあるplot関数とshow関数の２つのみをimport
from matplotlib.pyplot import plot,show

plot(A)
show()
```
  
この２つはあまり大きな違いはありませんが`__init__.py`では意味が変わります。
  
***
## `__init__.py`の書き方
では、`__init__.py`の書き方についてご紹介。  
まず、パッケージの例を挙げます。

↓パッケージ“test_imt”の構成

📁test_imt  
├──📄`__init__.py`  
├──📄`main.py`  
└──📄`sub.py`  


```Python:main.pyの中身
import test_imt.sub as ts
def chkprint2():
 ts.chkprint()
 print("You use main.py!")
```  
```Python:sub.pyの中身
def chkprint():
 print("You use sub.py!")
```  
注意ですが、パッケージにするときの同じディレクトリ内のモジュールのimportはパッケージ名から書いた方がいいです。
import (パッケージ名).(モジュール名)  
***
### `__init__.py`の中身がからのとき
`__init__.py`は実は何も書かなくてもいいのです。
ただし、importして関数を使いたい時、多少面倒です。
例えば`main.py`の`chkprint2`関数を使いたいときに次のように入力します。

```Python:test.py
import test_imt as ti
ti.main.chkprint2()

#結果
#You use sub.py!
#You use main.py!
```

“main”とモジュール名を間に入れることになります。
それでもいいと言うならいいですが、公開するとき、使う相手はモジュール名を確認しなければならないかもしれません。  
ちなみにモジュール名を書かないと次のようになります。

```Python:test.py
import test_imt as ti
ti.chkprint2()

#結果
#test.py, line 2, in <module>
#    ti.chkprint2()
#AttributeError: module 'test_imt' has no attribute 'chkprint2'
```

> 意味:`test_imt`には`chkprint2`なんて関数は無いよ!

***
### `__init__.py`でモジュール名をカット
では、モジュール名をカットする方法は...?
例えば`main.py`の`chkprint2`関数をモジュール名をカットして使いたいときには次のようにします。  

`__init__.py`の中身

```Python:__init__.py
from test_imt.main import *
```
import時

```Python:test.py
import test_imt as ti
ti.chkprint2()

#結果
#You use sub.py!
#You use main.py!
```

ここでは`from ~ import *`を利用します。
`import ~`を利用するとモジュール名をカットして関数を使うと先程のエラーが発生します。  
このような性質があるのなら
• モジュール名をカットして使いたいときは`from ~ import *`を使って書く
• ただ単に準備の為に作ったモジュールで、公開するとき必要性が無いものは`import ~`を使って書く
と使い分けできます。

例えば、
`main.py`の中身を主に使用するなら`from test_imt.main import *`と書く。  
`sub.py`をプログラム内に取り込むだけで主要な関数が無いなら`import test_imt.sub`と書く。  

ちなみにiPhone上でPythonができるPythonista3では予測変換があり、さらにsite-package3に自作パッケージを入れて実際にパッケージとしてチェックできます。

あ、あと、`__init__.py`内で関数を定義できます。`__init__.py`で定義した関数はモジュール名を書く必要がないです。
***
最後まで見てくれて本当にありがとうございます!
もしかしたら、わかりにくかったかもしれません...もしそうだったら、すみませでした...
Promiseは毎回受け取らないといけない

# はじめに
Promiseで非同期を順番に実行する場合は以下のようにすると思います。

```js:普通にチェーンで書く
Promise.resolve()
  .then(() => {
    return new Promise((resolve) => {
      window.setTimeout(() => {
        console.log('1');
        resolve();
      }, 1000);
    });
  })
  .then(() => {
    console.log('2');
  });
```

基本的にはチェーンで書けば問題ないですが、ループで書かなくちゃいけなくなった場合はチェーンで書けないので、うまく書かないといけません。

# 失敗例
失敗例が以下のようになります。Promiseオブジェクトさえ持って入れば問題ないと思っていたので`Promise.resolve()`したあと順番にセットしていけば裏でよしなにやってくれるものだと思っていました。

```js:失敗例
const promise = Promise.resolve();
// 1回設定して
promise
  .then(() => {
    return new Promise((resolve) => {
      window.setTimeout(() => {
        // 最初に1を出力
        console.log('1');
        resolve();
      }, 1000);
    });
  });

// また設定する
promise
  .then(() => {
    // 次に２を出したい
    console.log('2');
  });
```

実際は2が先に出てしまいました。どうやら2を出す方も`Promise.resolve()`が解決した時の設定になったようです。この挙動は逆に言えばあるPromiseが解決した時に並列して実行することができそうですね（並列実行は`Promise.all`でいいですが）

```:実行結果
2
1
```

# 成功例
チェーンでうまくいっていたのは、毎回新しいPromiseオブジェクトを受け取っていたからのようです。
なので、毎回promiseを受け取っておけばきちんと動作します。

```js:成功例
let promise = Promise.resolve();
// キチンと実行結果を受け取る
promise = promise
  .then(() => {
    return new Promise((resolve) => {
      window.setTimeout(() => {
        console.log('1');
        resolve();
      }, 1000);
    });
  });
promise
  .then(() => {
    console.log('2');
  });
```

```:実行結果
1
2
```

## ループを綺麗に書く
上でキチンと動くようになりましたが、毎回代入しないといけなくて、あんまりいい感じがしません。
これを解決する方法として、reduceがあります。第一引数がreturnされたものになるため、毎回Promiseを更新するのにちょうどいいです。

```js:reduceでPromiseの直列処理を綺麗に書く
[1, 0].reduce((promise, waitTime, index) => {
  return promise
    .then(() => {
      return new Promise((resolve) => {
        window.setTimeout(() => {
          console.log(index + 1);
          resolve();
        }, waitTime * 1000);        
      });
    });
}, Promise.resolve());
```

# 終わりに
thenでPromiseが返ってくるのは知っていましたが、チェーンで書くためにただ返していたものだと思っていました。実際は新しいPromiseを返していて意外と引っかかったので記事にしました。
一応サンプルコードも以下に置いておきました。画面には何も表示されないのでターミナルで見てもらえると幸いです。
https://jsfiddle.net/wintyo/6bvrsx1w/23/
digitsでランダムフォレストと主成分分析の寄与率を比較してみる 

##初めに
またdigitsネタ、一回目は[こちら](https://qiita.com/koryor/items/930f1e516280a856fbc0)。同じデータをいろいろな方法を使用して、ごちゃごちゃ分析するのはデータ分析の基本中の基本(?)なので…。<br>Random Forestは、パラメータの寄与率まで出せるという利点があります。今回はdigitsをRandom Forestで学習させてみて、一回目で分析したPCAと比較していきたいと思います。

### Random Forestを使ってみる

```python
# -*- coding: utf-8 -*-
from sklearn import datasets 
from sklearn import ensemble
from sklearn import metrics
from sklearn import decomposition
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import numpy as np

digits = datasets.load_digits()
#画像データとtargetデータを取得
data,target = digits["data"],digits["target"]
data /=16

#テストデータを0.75,0.25に分割
data_train,data_test,target_train,target_test =\
train_test_split(data,target,test_size=0.25, random_state=0)

#random forest
clf = ensemble.RandomForestClassifier()
clf.fit(data_train,target_train)

predict = clf.predict(data_test)
print("accuracy_score:", metrics.accuracy_score(predict,target_test))
```

accuracy_score: 0.9511111111111111

特にパラメータチューニングを行っていませんが、それなりの正答率ではないでしょうか？<br>sklearnは機械学習のアルゴリズムが変化しても、同じ書き方ができるので使いやすいですね。<br>次にRandom Forestで変数毎に特徴量を出してみます。

```python
plt.imshow(clf.feature_importances_.reshape(8,8),cmap=plt.cm.Reds)
plt.show()
```
「clf.feature_importances_」でそれぞれの特徴量の重要度を出すことができます。digitsが64次元の画像データなので、clf.feature_importances_も64次元の数字が排出されます。<br>そのままですと分かりにくいので、reshapeして8×8の2次元配列に直し、画像データとして可視化しました。

![RF.png](https://qiita-image-store.s3.amazonaws.com/0/141993/ae2e1a84-d577-d24c-672d-e898d625905a.png)

濃い赤の場所が寄与率が高い場所。すなわちRandom Forestが画像を見分けるのに使用した場所になります。一番左の行と右の行は存在してもしなくても、機械学習的には必要ないデータということになります。<br>


###主成分分析

次に主成分分析を使って、第一主成分に使用されている変数を見ていきたいと思います。

```python
#主成分分析
pca = decomposition.PCA(n_components=1)
pca.fit_transform(data)

#主成分の変数のヒストグラムをとる
plt.hist(pca.components_.T, bins=15)
plt.xlim(-0.4,0.4)
plt.show()
```

pca.components_で変数を出力することができます。しかしながら、pca.components_ではデータのサイズが(1,64)になってしまっているので、「.T」で転置させてヒストグラムを描画しています。ヒストグラムは
![hits.png](https://qiita-image-store.s3.amazonaws.com/0/141993/56f6f933-0e0a-e72f-890a-21f8203ee9c6.png)
となります。0付近の変数は主成分にあまり含まれていない変数で、0から離れるほど、主成分中に多く含まれている変数となります。

主成分に含まれている変数を可視化すると

```python

#主成分の変数の絶対値をreshapeして、8×8にする
plt.imshow(np.abs(pca.components_.reshape(8,8)),cmap=plt.cm.Reds)
plt.show()
```

結果は

![ｐca.png](https://qiita-image-store.s3.amazonaws.com/0/141993/cb8ac720-c761-bb70-e88f-1faad4652e81.png)

一番濃い赤の部分で0.3ぐらい。例えば一番左上の画素では4.9e-17ぐらいで、その差は歴然としています。
random forestと同様に一番左端と右端がほとんど寄与していないという結果がえられました。<br>第一主成分だけなので、第二主成分、第三主成分まで考えるとまた結果は変わって来るかもしれませんが、ざっと数字を確認してみたところ、やっぱり一番左端と右端はほとんど含まれていませんでした。
Rubyの基本記述の仕方〜その8〜　クラスの継承



## クラスの継承
前回の記事でクラスとインスタンスについてまとめました。
設計図として定義したクラスの
・ 一部分だけ変更したい
・ 一度書いた記述を複数再利用したい
時に、「クラスの継承」が便利です。

```ruby.qiita.rb
class Apple < Fruits
```
上の例では、fruirsというクラス（親クラス）をappleというクラス（子クラス）が継承しています。

```ruby.qiita.rb
class 子クラス　< 親クラス
```
のように記述します

## オーバーライド

親クラスと同じ名前の子クラスを作成すると、
子クラスで定義された内容が優先して呼び出されます。
上書きされたようなこの挙動を指してオーバーライドと呼びます。


```ruby.qiita.rb
class Fruits
〜
〜
class Fruits < Fruits　　　#　←　ここで定義された内容に上書きされる
・・・
・・・
```

## 入力を受け取る
なにかの入力を受け取る際には、変数名から書き始め、

```ruby.qiita.rb
morikuma = gets.to_s (文字として受け取る）
morikuma = gets.to_i　　　　（数として受け取る）
morikuma = gets.chomp  (文字として表示させた時、改行を防ぐ）
```
と書きます。

gets.chompだけを記述した際には文字列として入力されるので、数値として計算処理したい場合は

```ruby.qiita.rb
morikuma = gets.chomp.to_i
```

と繋げて書きます。

今日はこのあたりで失礼します。
ScalaでNukkitプラグイン

#前置き
Nukkit [^nukkit] のプラグインがkotlinで作成できると聞き「Scalaでもできるのでは？」と思い、試してみたら出来たのでメモ

[^nukkit]: nukkitとはMinecraft Be向けのサーバーソフトウェアです。[nukkitの公式サイト](https://nukkitx.com/)


完成品はこちらに
https://github.com/suinua/nukkit_scala_plugin
#環境
scala:2.12.7
sbt:1.2.3

#前提条件
nukkitでサーバーが建てられる

scalaの環境構築済み
intellij IDEをインストール済み
intellij IDEのScalaプラグインをインストール済み

#プロジェクトの作成

intellijを開き、scala→sbt→next
![new project](https://i.gyazo.com/d0a8fbbe259a6c52a5224e5b2b93657d.png,"new project")

今回は`Sample`というプラグインを作ります。
nameをsampleに
locationは好きなディレクトリを選択してください
![new project2](https://gyazo.com/35040d683e5ba67826d1f0b1eae10c9f.png,"new project2")

# Nukkitの読み込み
intellijのロードが終わったら、ファイルマネージャーを開き`Sample/libs`ディレクトリを作成し、`nukkit-1.0-SNAPSHOT.jar`をコピーして持ってきます。
![nukkit load](https://gyazo.com/2b8efd626a80f71e08a47c9adb956988.png,"nukkit load")

Project Structure→models→Sample(プロジェクト名)→Dependencies→＋ボタン→JARs or directories→nukkit-1.0-SNAPSHOT.jar
![mdaar-bbrfs.gif](https://qiita-image-store.s3.amazonaws.com/0/241492/c56013d4-9afd-e15e-e536-97c359d6019d.gif)

#SBTの準備
`Sample/build.sbt`に

```scala:Sample/build.sbt
unmanagedBase := baseDirectory.value / "libs"
```

を書き足します。

`Sample/project/plugins.sbt`を作成し

```scala:Sample/project/plugins.sbt
resolvers += Resolver.url("artifactory", url("http://scalasbt.artifactoryonline.com/scalasbt/sbt-plugin-releases"))(Resolver.ivyStylePatterns)
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.7")
```
と書き込みます。

#nukkitプラグインのための準備
`Sample\src\main\resources\plugin.yml`を作成下のコードをコピペします。

```yml:Sample\src\main\resources\plugin.yml

name: Sample #プラグインの名前
main: my.plugin.Sample #Mainクラスの場所
version: 0.0.1
author: suinua
api: ["1.0.0"]
```

`Sample\src\main\scala`を右クリック→new→Package
`plugin.yml`に書いた`main:my.plugin.Sample`より`my.plugin`を入力
![nukkit plugin prepare](https://i.gyazo.com/5c4934b0c91d15ec7f1d0d96a51d3e71.png,"nukkit plugin prepare")

作成した`my.plugin`を左クリック→Scala Class
`plugin.yml`に書いた`main:my.plugin.Sample`より`Sample`を入力
![nukkit plugin prepare2](https://i.gyazo.com/0030961b861d942e5b75e6c1b1688d57.png,nukkit plugin prepare2")


`Sample.scala`に以下をコピペ

```scala:Sample\src\main\scala\my\plugin\Sample.scala
package my.plugin


import cn.nukkit.event.EventHandler
import cn.nukkit.event.Listener
import cn.nukkit.event.player.PlayerJoinEvent
import cn.nukkit.plugin.PluginBase


class Sample extends PluginBase with Listener{

  override def onEnable(): Unit = {
    this.getServer.getPluginManager.registerEvents(this, this)
  }

  @EventHandler def onPlayerJoin(event: PlayerJoinEvent): Unit = {
    event.getPlayer.sendMessage("Hello, World.")
  }
}
```

# jarにコンパイル
ターミナルを開き`sbt assembly`を実行
場合によっては10分ぐらいかかります(最初だけかな？)
`[success] Total time: ** s, completed ****/**/** **:**:**`とでたら成功です。

`Sample\target\scala-2.12`に`Sample-assembly-0.1.jar`が生成されます。
`Sample-assembly-0.1.jar`をコピーしnukkitのpluginsフォルダにぶちこみ
サーバーを起動します。


チャット欄に`Hello,World`と表示されれば成功です👍
![nukkit_sample.png](https://qiita-image-store.s3.amazonaws.com/0/241492/86c8421f-a7fc-bd1d-1502-15e86a68931f.png)
Linuxでデーモンプロセスを作ってみた

最近デーモンについて学んだのでメモ代わりに書いてみました。

# デーモンって？？

デーモン (daemon)とはLinuxやUNIXにおいてメモリ上に常駐してるプロセス。
デーモンの意味は，悪魔の「demon」ではなく守護神の「daemon」。ここ大事

詳しくはwikiを読むのがベストだと思います。
[デーモン (ソフトウェア)](https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%BC%E3%83%A2%E3%83%B3)

ぶっちゃけて言えば無限ループのプログラム。
ループ中に要求があればそれに答えるといったイメージです。

ちょっと細かく書くと

* (通常は)親プロセスのプロセスID (PID) が 1 (init)
* 制御端末 (tty) を持たない

# 寄り道

ちょっと横道に反れます。
プロセスの話になるとよく聞くゾンビプロセスと孤児プロセスについてちょっと解説

* 孤児プロセス
子プロセスよりも先に親プロセスが死んだとき、その子プロセスは道連れにはされません。
孤児となった子プロセスは init プロセスによって引き取られ、親が死んでも子は生き続けます。

* ゾンビプロセス
親プロセスが子プロセスの終了情報をキューから取り出さない限り、子プロセスの情報はシステムに残り続けます。
psコマンドでのゾンビプロセスの場合、STAT に Z と表示されます。

# ソース

では、具体的なソースを記載します。
プロセス生成といえばfork(2)が有名ですがここでは手軽にデーモン化する関数があるので、
daemon(3)を利用します(POSIX標準ではな無いのが注意点)。

daemnをがっつり作るなら下記のような作りこみが必要です。

* プロセスを端末から切り離す
* 入出力を一度閉じる(使うなら明示的にオープンしたものを使おう)
* chdir(2) によりカレントワーキングディレクトリをシステムルート ("/") にする
* umask(2) によりファイル作成モードマスクに 0 をセットする．
* SYSLOGなり何がしかの出力ファイルに動作を出力する
* SIGNALを受け取る
* PIDファイルを作る

今回はさっくと手軽にデーモン作成を作成ってことで省略します。

``` c:daemon.c
#include <stdio.h>
#include <unistd.h>

void mainLoop() {
    while(1) {
        // ループさせたい処理
        sleep(3); 
    }
}


int main(void) {
    //ここで子プロセスを生成し親は終了
    if(daemon(0, 0) == 0) {
        mainLoop();
    } else {
        printf("error\n");
    }
    return 0;
}
```

上記をコンパイルしてプロセスを確認してみましょう
自身のPIDは164で親は1でinitとなっています。

``` bash
$ ./daemon
$ ps -ef | grep -E "datemon|PID"
UID        PID  PPID  C STIME TTY          TIME CMD
daemon+    164     1  0 21:42 ?        00:00:00 ./daemon
```

上記はperlスクリプトなどもデーモンとして動かすことができます。
実際自作デーモンするくらいなら優秀なスケジューラにjobを設定すればいい話ですが
今回はちょっと踏み込んで調べてみました。

間違い等あればご指摘お願いします。

#### おまけソース

``` c
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/fs.h>

int main(int argc, char **argv)
{
  pid_t pid;
  int i;

  /* create new process */
  pid = fork();
  if (pid == -1)
    return -1;
  else if (pid != 0)
    exit(EXIT_SUCCESS);

  /* create new session and process group */
  if (setsid() == -1)
    return -1;

  /* set the working directory */
  if (chdir("/") == -1)
    return -1;

  /* close all open files*/
  for (i = 0; i < NR_OPNE; i++)
    close(i);

  /* redirect stdout,stdin,stderr */
  opne("/dev/null", O_RDWR);
  dup(0)
  dup(0)

  return 0;
}
```
なんでExcelの列名ってZの次はBAじゃなくてAAなん？

って疑問が湧いたので、~~健闘~~検討してみました。

# ぼくの疑問
A=0の26進数と捉えると辻褄が合わない箇所が出てくる。

A: 0
B: 1
︙
Y: 24
Z: 25
AA: 26？？？？？！！！！！BAじゃないと辻褄合わねえぞ？AAは0じゃねえの？

# 検討してみた内容
## 1. A=0の26進数と素直に捉えた場合

A: 0
B: 1
︙
Y: 24
Z: 25
BA: 26

これが一番しっくりくるんだけどなあ…。でもZの次はBAじゃなくAAなんですね…。

## 2. 1の位だけはA=0でそれ以外はA=1というトリッキーな表記法として捉えてみた

どういうことかというと、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/196806/1c3de9bb-0722-8c8a-d19b-e425dfc3db0a.png)
赤枠で囲った位だけはA=1と捉えるというご都合主義的？な解釈。
A: 0
AA: 26*1 + 0
となる。
位によって1はじまりか0はじまりかが変わるというトリッキーなのが難点

## 3. 0の無いワールドとして捉えてみた
A=1です。
A: 1
︙
Z: 26
AA: 26*1 + 1 = 27
A0: 26*1 + 0 = 26※Zと同じ結果になる

## 4. 0の無いワールドとして捉えた後に-1したパターン
だってA=0で0はじまりじゃないとApachePOIとかで困るじゃん…。
A: 1 - 1 = 0
︙
Z: 26 - 1 = 25
AA: 26*1 + 1 - 1 = 26
A0: 26*1 + 0 - 1 = 25※Zと同じ結果になる

結果的には[2. 1の位だけはA=0でそれ以外はA=1というトリッキーな表記法として捉えてみた](#2-1の位だけはa0でそれ以外はa1というトリッキーな表記法として捉えてみた)と同じ計算結果になるんですが、
考え方が違うっすね…。

# 「検討してみた内容」をプログラム組んでみた！
<p data-height="530" data-theme-id="0" data-slug-hash="zmBJbv" data-default-tab="js,result" data-user="momosetkn" data-pen-title="エクセル進数検討" class="codepen">See the Pen <a href="https://codepen.io/momosetkn/pen/zmBJbv/">エクセル進数検討</a> by momosetkn (<a href="https://codepen.io/momosetkn">@momosetkn</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# 結論
エクセル進数（と呼ぶべきなのか？）は
0の無いワールドとして捉える[3. 0の無いワールドとして捉えてみた](#3-0の無いワールドとして捉えてみた)か、
[4. 0の無いワールドとして捉えた後に-1したパターン](#4-0の無いワールドとして捉えた後に-1したパターン)が妥当そうですね。
[2. 1の位だけはA=0でそれ以外はA=1というトリッキーな表記法として捉えてみた](#2-1の位だけはa0でそれ以外はa1というトリッキーな表記法として捉えてみた)はエクセル進数になってますがトリッキーですし…。

# おまけ（１０進数で例えると？）

一,二,三,四,五,六,七,八,九,十しかないワールドとします。
そうすると一十は20ということになります。

一: 1
︙
十: 10
一一 = 10 * 1 + 1 = 11
︙
一十 = 10 * 1 + 10 = 20
となります…。

0無し世界はこういう性質を持っているようです。

- 繰り上がるタイミングが0有り世界よりも1個上にズレている。
- そして、繰り上がったら1の位は1になる

0があったほうが繰り上がるだけなので、計算的には単純ですね。
エクセルってめんどう… :thinking:
ガベージコレクタ（GC）はゴミ収集車

ガベージコレクタ（GC）はゴミ収集車をイメージしましょう。
garbage collector の直訳は「ゴミを収集する人」ですからそのままですね。

## ゴミの廃棄ルール ##

* ゴミとして捨てるものはゴミ捨て場に置きましょう。ゴミ収集車が集めて持って行ってくれます。

> いらなくなったオブジェクトは解放しましょう。GC が発生したタイミングで回収してくれます。GC をいつ発生させるかはランタイムが制御しています。プログラムコードで GC を発生させることもできますが、そうしなくてもよいように実装するのがベターです。

* ゴミ捨て場に置くときにはルールを守りましょう。曜日を守る。分別する。廃棄シールを貼るなど。ルールを守らない場合、収集してくれません。

> IDisposable インターフェースを実装する型（ざっくり言うと Dispose メソッドが定義されている型）の場合、Dispose メソッドを呼び出しておきましょう。Dispose メソッドを呼び出しておかないと肝心の中身が回収されずにメモリリークが発生します。回収させたいオブジェクトを格納しているフィールドには null をセットして参照をクリアしましょう。参照されているオブジェクトは「まだ必要」と判断されて回収が遅れます。

* 一度に多くのゴミが捨てられると、ゴミ収集車が来るまでの間、ゴミ捨て場がゴミで溢れかえります。

> オブジェクトを生成しては捨て、生成しては捨てを短時間で繰り返すと、使用メモリサイズは増加します。Dispose メソッドを呼び出したり参照をクリアしたりした瞬間にメモリが解放されるわけではありません。GC が発生して回収されたタイミングで使用メモリサイズが減少します。

* 3R（Reduce ゴミを減らす／Reuse 再利用／Recycle 資源リサイクル）が大切です。

> 3R（Reduce 必要のないオブジェクトを無駄に生成しない／Reuse 何度も使用するオブジェクトは最初に生成して保持して使いまわす／Recycle いらなくなったオブジェクトは適切に解放してメモリをOSに返す）のが大切です。キャッシュすべきか必要に応じて生成すべきかなど、これらは相反します。要件に応じてどうするのが良いかを考え、どうしてそう考えたかをドキュメントなどに残しましょう。そしてレビューしてもらいましょう。
LambdaにAPI Gatewayから値を渡す

簡単にできるかなと思ったら意外とハマったのでメモ

## やりたいこと
`/test?id=aaa`にアクセスしたらaaaを返す

## 用意するもの
- Lambda
- API Gateway

### Lambda 関数
関数名：apigateway(Python2.7)

```python
def lambda_handler(event, context):
    return {
        "statusCode": 200,
        "body": event['id']
    }
```

`{"id": "aaa"}`を渡したときのテスト結果は以下

```json
{
  "status": 200
  "body": "aaa"
}
```

ここまではすごく簡単にできた

ロールは割愛しますがちゃんと設定しましょう（まだよくわかっていない）

### API Gateway
- 新しいAPIの作成：API名`test`
- メソッドの作成：`get`
- 統合タイプ：Lambda関数
- Lambda関数：apigateway

指定できるんだ！簡単！と思っていましたが。。。

設定されたGETメソッドを選択し、クエリ文字列にid=aaaと入力しテストを実行すると

```json
{
  "stackTrace": [
    [
      "/var/task/lambda_function.py",
      7,
      "lambda_handler",
      "\"body\": event['id']"
    ]
  ],
  "errorType": "KeyError",
  "errorMessage": "'id'"
}
```

おや。キーがない・・・？

## 解決策
API Gatewayでは値をマッピングする必要がある

GET - メソッドの実行から以下2つに設定をします

- メソッドリクエスト
- 統合リクエスト

### メソッドリクエスト
URLクエリ文字列パラメータに`id`というクエリ文字列を追加します

### 統合リクエスト
マッピングテンプレートに`Content-Type:application/json`として以下のテンプレートを追加します

```json
{
  "id": "$input.params('id')"
}
```

## 結果
テストを実行

```json
{
  "body": "aaa",
  "statusCode": 200
}
```

やったね！！！

リソースのアクションタブからAPIのデプロイを選択するとリクエストできるURLが表示されるのでidパラメータ付きでブラウザからアクセスするとjsonレスポンスが確認できます

## その他
- APIデプロイ時にステージを設定できる
- `/test/aaa`でパラメータを取得したかったらリソース作成時にリソースパスに中括弧で`/{id}`と指定する
    - その場合メソッドリクエストにはマッピングテンプレートに加え、リソースパスの追加をする
Firebase Authentication + SPA(React/TypeScript) でユーザ登録／ログイン／ログアウト (1:サンプル起動まで)

<font color="Red">※2018/10/29</font>
[Firebase Authentication + SPA(React/TypeScript) でサンプル作り直してみた](https://qiita.com/katsu-o/items/728812f5d7f682e80fc3)としてサンプルを作り直して記事を書きました。

----

Firebase Authentication によるユーザ認証周りについて理解しておきたく、実際に自分が普段作っている SPA(React/TypeScript) に組み込むとどんな感じになるかということもあったので試しに作ってみました。なおちょっと面倒なのは承知の上、リダイレクトモードでやります[^1]。

それから、説明まで書くと長くなりそうなので 2 回に分け~~ようと思います~~ました(2018/10/11)。

1. サンプル起動まで(この記事)
2. [要点の説明](https://qiita.com/katsu-o/items/b786601b49c50e50cdb9)

~~という感じで考えています。~~

※[ソースコード一式](https://github.com/katsu-o/firebase-auth-spa) は GitHub に置いています。

# 起動方法
###### 前提条件
- Firebase プロジェクトを 1 つ用意する。
    - そのプロジェクトの Authentication で **メール / パスワード** と **Google** を有効にしておくこと。また、**1 つのメールアドレスにつき 1 つのアカウント** (デフォルト)としておくこと。
    - Facebook, Twitter, GitHub への連携も可能(ただしその場合は各プロバイダ側での設定も必要)[^2]。

###### 必要な環境
(バージョンは動作確認済バージョン)

- Node >= 10.7.0
- npm >= 6.1.0
- yarn >= 1.10.1 (npm を使う場合は適宜読み替えて下さい)
- firebase-tools >= 4.2.1

###### インストールから起動まで
```sh
# 1. GitHub からクローン
$ git clone git@github.com:katsu-o/firebase-auth-spa.git
$ cd firebase-auth-spa

# 2. 依存パッケージのインストール
$ yarn install

# 3. .env ファイルを作成
$ mv .env.sample .env

# 4. .env ファイルの中身を埋める
# Firebase コンソールの Authentication にある「ウェブ設定」をクリックすると表示される
# config を当該箇所にセットして下さい。
# .env ファイルへの設定文字列にクォートは不要です。=の後に余計な空白もつけないでください。

# 5. Firebase へログイン
$ firebase login

# 6. Firebase プロジェクトの選択
$ firebase use --add

# 7. サンプル起動
$ yarn start

以上です。
Hosting URL へアクセスして下さい。
```

※[GitHub: README.md](https://github.com/katsu-o/firebase-auth-spa/blob/master/README.md) に書いておいたのでそちらの方が分かり易いかも知れません。

# 使い方
どうやって説明しようかと思ったのですが、やってること自体は単純なので動画にしました。
実際の操作に加えて、Firebase Console の Authentication でユーザーリストを見ると状態が分かります。

###### case 1: Email & Password で Sign up
![firebase-auth-spa-new-1.gif](https://qiita-image-store.s3.amazonaws.com/0/209550/672cad49-acae-3409-40ba-65b2ac1b9540.gif)


###### case 2: Facebook で Sign in 後、その Email アカウントで Sign up(パスワード認証の追加)
![firebase-auth-spa-new-21.gif](https://qiita-image-store.s3.amazonaws.com/0/209550/e93d511b-9a1f-5bb4-c451-6940cbee922b.gif)

ほかにもいろいろ試せます。Facebook + Email + GitHub なども可能です。特に既存アカウントに対し新たに Google 認証で Sign in すると既存アカウントに紐づけられている認証プロバイダ情報が消されてしまうことが確認できます(ハマりました)[^3]。

# 実装について
- create-react-app で scaffolding して redux/saga + material-ui で作りました。

※近いうちに説明を書く予定ですが、ひとまず要点だけ。

- src/conatainers/ApplicationManager.tsx
  - Firebase Auth の認証状態変更検知処理(onAuthStateChanged())
  - 前画面からリダイレクトされてきたときの処理(getRedirectResult())

- src/utilities/linkProvider.ts
  - 既存ユーザアカウントへの認証プロバイダ追加のための前処理(プロンプトダイアログ)

- src/sagas/auth.ts
  - Email & Password でのユーザ登録処理(ユーザ既存の場合、パスワード認証の追加処理へ)
  - Email & Password もしくはその他プロバイダ認証によるサインイン処理

以上です。時間取れ次第説明書きます。

[^1]: [Google ログインと JavaScript を使用して認証する](https://firebase.google.com/docs/auth/web/google-signin?hl=ja)に、「モバイル端末ではリダイレクトすることをおすすめします。」となっているので(実装は複雑になりますが)。
[^2]: いろいろ他で詳しく説明されてるので詳細はそちらを参考にして下さい。ちなみに Twitter の開発者アカウントの取得には承認までちょっと時間がかかります(私は 10 日ほどかかりました)
[^3]: ここ参考になりました -> [Firebase Authentication を使って得られた知見まとめ - トークンの仕様や注意点など](https://slideship.com/users/@iktakahiro/docs/2018/01/JnhLGehLsRw4dcZ42EY3Jf/)
sourcemap を本番環境にも置け！または置くな！


## Q. sourcemap を本番環境に置くべきか？

__A. どちらともいえない。__

## 置いてはいけない派の意見

- 開発者用のファイルを本番環境に置くのは無駄が多い。
- 脆弱性が万一存在した場合に攻撃者が気付きやすくなる。
- 自分の汚いコードを見せたくない気持ちは分かる。

## 置いてもいい派の意見

- 普通のユーザはソースコードを読まないから関係ない。
- ソースコードを読もうとする人に対しては難読化は抑止力にならない。

## 置くべき派の意見

- 脆弱性が万一存在した場合に友好的で技術に優れた他人が教えてくれる場合がある。
- 開発者が本番環境に残った問題を解決しやすくなる。
- 自分の書いたコードに自信を持て。見せつけろ。世界のプログラマの模範となれ。

# 結論

世界が悪意にあふれていると思うなら、
または自分の書いたコードに自信がないなら置くな。

そうでないならば
あなたの書いた __美しいコード__ を世界に見せつけてやれ。
他人のプログラミングに良い影響を与えるだろう。

## 補足

`sourcemap` を作らないようにするとビルドが速くなるぞ。
VB.NETで日付文字列を変換

VB.NETで日付文字列をDate型に変換したい。どうやらこんなものを扱わねばならぬようだ。
`2018OCT05 13:45:30`

日付書式的にはこうなる
`yyyyMMMdd HH:mm:ss`
ポイントは月名が3文字で入っていること。
こいつをうまいことDate型に取り込み、プログラムで扱えるようにしたいのである。

やれやれ。僕は検索した。

-----
### 検索結果

基本の処理
[**日時を表す文字列をDateTimeオブジェクトに変換する**](https://dobon.net/vb/dotnet/string/datetimeparse.html)

カルチャ関連
[**IFormatProvider Interface**](https://docs.microsoft.com/ja-jp/dotnet/api/system.iformatprovider?view=netframework-4.7.2)
[**[.net] CultureInfo.InvariantCultureとはどういう意味ですか？**](https://code.i-harness.com/ja/q/94eded)

書式
[**カスタム日時書式指定文字列**](https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/custom-date-and-time-format-strings)

-----
### 実行結果

実装はこんな感じ。

```vb
Dim timeStr = "2018OCT05 13:45:30"
Dim date As DateTime

If DateTime.TryParseExact(timeStr,
                          "yyyyMMMdd HH:mm:ss",
                          System.Globalization.CultureInfo.InvariantCulture,
                          System.Globalization.DateTimeStyles.None,
                          date) Then
    Console.WriteLine(date.ToString)
Else
    Console.WriteLine("Error!")
End If
```

`TryParse()`はパースできたらTrueを返し、5番目の引数`date`に変換結果を入れてくれる。
3番目の引数(`provider`)として指定してる`System.Globalization.CultureInfo.InvariantCulture`が、国や地域の差をうまいことごにょごにょやって適切なアレにしてくれるおまじない。
逆にここに日本とかドイツとかの指定を入れることでその文化圏に応じた処理をしてくれる。らしい。よく知らない。
実行するとこうなる

```console
2018/10/05 13:45:30
```

なお、このコードで`provider`に`Nothing`を指定するとElseのエラー処理に飛ぶ。
はてなブログにGithubコードを埋め込む

# 問題
gist-it.appspot.comの[公式](http://gist-it.appspot.com/)を元にgithubのソースコードを埋め込みたいが埋め込めない

# Gist-itとは
Robert Krimen さんによるGitHubリポジトリからファイルを取得し、任意のWebページに埋め込むことができるサービス。
> 
Description
gist-it.appspot.com lets you take a file from your GitHub repository and embed it into any webpage, just like a gist Syntax highlighting by google-code-prettify

# 解決策
プロトコルの指定が間違ってる。HTTPではなくHTTPSじゃないとだめ。

#検証
はてなブログのmarkdownによる投稿で検証してみる。
下記画像がmarkdownの文章。
![スクリーンショット 2018-10-05 20.17.21.png](https://qiita-image-store.s3.amazonaws.com/0/131659/3597d174-76fe-c088-bccb-dead8d1c66c7.png)

これをプレビューでみてみると
![スクリーンショット 2018-10-05 20.17.55.png](https://qiita-image-store.s3.amazonaws.com/0/131659/47573a38-8a14-2630-3f73-1dcf8891c43b.png)

HTTPの方は表示がされておらず、HTTPSの方はきちんと表示されている。

# おわりに
わざわざ既存コードをGistにあげるのは面倒なので良かった。

# 参考
* [GitHubのコードをブログに貼る時の注意点【gist-it】](https://sun0range.com/information-technology/gist-it)
pipコマンドの備忘録

##pipとは
非常にわかりやすいので、こちらの記事 https://www.sejuku.net/blog/50417#pip-2 よりそのまま抜粋させていただきます。
>pipはPythonのパッケージを管理するためのツールになります。
パッケージには、
公式が配布しているもの
サードパーティが配布しているもの
と大きく分けて2つがあります。
サードパーティのパッケージはPyPIというサイトで配布されています。
https://pypi.org/
公式が配布しているものはたいていPythonをインストールする時点で自動的にインストールされますが、サードパーティが配布しているパッケージは別にインストールをする必要があります。
このサードパーティが配布しているパッケージをインストールするために、pipを使います。
pipを使うことでパッケージの管理が楽になります。
Pythonのパッケージ管理ツールは他に、easy_installやcondaなどがあります。
pipはeasy_installの強化版として、condaはAnacondaと呼ばれる科学技術計算を扱うためのPythonで使われるパッケージマネージャとして考えて良いでしょう。


###インストールとアンインストール
```
$ pip install hogehoge
$ pip uninstall hogehoge
```

###インストールしたパッケージのlist表示
```
$ pip list
$ pip freeze
```


###パッケージのアップグレード
pipにはパッケージをアップグレードするコマンドはない。installコマンドに「–upgrade」オプションを付け加えることでパッケージをアップグレードする。「-U」でもいい。

```
$ pip install --upgrade hogehoge
$ pip install -U hogehoge
```
###pipそのもののupgrade
```
$ pip install --upgrade pip
```

###バージョンを指定してインストール
```
$ pip install hogehoge==2.4.5
```
ropsten testnetにerc20 tokenをtruffleでdeployする

## 概要
web上の情報をあちこち探すのがめんどくさいので（しかもバージョンの違いで若干仕様が異なったりするので）、自分用のメモがわりに、テストネット上でのERC20トークンの発行を簡潔にまとめておきます。

## 動作環境

MacOS High Sierra 10.13.6
Truffle v4.1.14
Python 2.7.9
node v9.3.0
solc Version: 0.4.24

事前に必要なもの

- Infuraのアクセストークン取得
- Metamaskのニーモニック取得
- ropstenのETH

## 作業ディレクトリにパッケージの準備をする
```bash
$ mkdir mytoken
$ cd mytoken
$ truffle init
```

続いて、truffleの初期化が終わったら、`OpenZeppelin`の神パッケージをインストールします。

```bash
$ npm init -f
$ npm install zeppelin-solidity --save
```
`node_modules`フォルダに`zeppelin-solidity`のフォルダがあることが確認できるはずです。

## contractの記述
ERC20トークンに必要な、`name`, `symbol`, `decimals`を適当に決めます。`decimals`は小数点以下何桁あるのかを表しています。

```bash:MyToken.sol
pragma solidity ^0.4.24;
import "zeppelin-solidity/contracts/token/ERC20/StandardToken.sol";

contract MyToken is StandardToken {
  string public name = "MyToken";
  string public symbol = "MYT";
  uint public decimals = 18;

   constructor(uint initialSupply) public {
   	totalSupply_ = initialSupply;
    balances[msg.sender] = initialSupply;
  }
}
```
`OpenZeppelin`のパッケージを継承しているので楽チンですね。

※solidityのコンパイラのバージョンが、`0.4.23`以前は、contractの名前と同じ関数が、一番最初に実行されていましたが、`0.4.23`以降は、`constructor`がその役割を果たすようになりました。

コントラクトの名前と、ファイルの名前が一致するようにして、`contracts`フォルダ下に配置します。


## migration fileの作成
`migrations`フォルダ下に`2_deploy_contracts.js`を設置します。migrationsフォルダ下にあるファイルは、1から順に読み込まれることになるので、2から始まるファイル名にします。

このファイルでは、`deploy`するコントラクトとそのコントラクトの`constructor`に渡す引数を指定します。この場合は、総発行量を引数にとりますので、任意の数字を設定します。

```javascript:2_deploy_contracts.js
const MyToken = artifacts.require('./MyToken.sol')

module.exports = (deployer) => {
  const initialSupply = 100000e18
  deployer.deploy(MyToken, initialSupply)
}
```

## truffle.jsの作成

ニーモニック（秘密鍵）は、12個の英単語で、そのニーモニックを元にして公開鍵が生成されているほか、トランザクションの署名にも使用されます。

[インフラ](https://infura.io/)は、はEthereumのフルノードの代理で担ってくれるサービスで、指定されたエンドポイントに対してWeb3のJSON-RPCのリクエストを送信することでEtehreumネットワークに対するコール、トランザクションの処理を行うことが可能になります。非常に便利！

```javascript:truffle.js
const HDWalletProvider = require("truffle-hdwallet-provider");
const mnemonic = "ニーモニックを入力";
const infura_url = "https://ropsten.infura.io/アクセストークンを入力";
module.exports = {
  networks: {
    ropsten: {
      provider: function () {
        return new HDWalletProvider(mnemonic, infura_url)
      },
    network_id: 3,
    gas: 4700000 //Gasは、Gas limit最大値の4700000に設定しておきましょう。
    }
  }
};
```

## truffle-hdwallet-providerのインストール
```bash
$ npm install truffle-hdwallet-provider
```
Truffleでウォレットを扱うために必要なパッケージです（この場合、Metamask）。
インストールする際にエラーが発生した場合、こちらを参考にしてみてください。

[truffle開発時に発生したエラー npm install truffle-hdwallet-provider](https://qiita.com/____easy/items/f15f2084926496382c09)

## deploy
さて、整いました！
ropstenに`deploy`しましょう。

```bash
$ truffle migrate --network ropsten
```

`deploy`できたら、[ropstenのetherscan](https://ropsten.etherscan.io/)でコントラクトアドレスを確認して、自分のmetamaskにtokenをimportしましょう。
ubuntu 18.04 LTS のサーバーに公開鍵認証でssh接続

自分の備忘録でもあり、研究室の皆様向けにも公開。
初めての投稿なので色々指摘していただけると幸いです。

なお、クライアント側で使用するPCのOSがUnix系統(Mac OS X, Linux)であるときの解説です。

以下のサイトを参考にしました。
>sshで公開鍵認証を使ってアクセスする
https://qiita.com/mountcedar/items/43157ff1225c56500655


#単語解説
覚えておいてほしい単語を解説します。
混ざらぬよう定義しておきます。

<b>サーバ</b>：これから接続するubuntu 18.04 LTSのPC
<b>サーバ側アカウント名</b>:サーバの接続したいアカウント名のこと
<b>クライアント</b>:自分のPC
<b>クライアント側アカウント名</b>:自分のアカウント名のこと

説明のため、サーバーのIPアドレスなどを定義しておきます。
Ubutnu 18.04 LTSのサーバーでは「設定→ネットワーク→歯車マーク→詳細タブ」に記載があります。

```
サーバIPアドレス: 123.456.78.91
サーバ側アカウント名: hogehoge
```

#クライアント側
## 　鍵の作成
秘密鍵と公開鍵を作成します。

作成場所は「 /home/<クライアント側アカウント名>/.ssh 」です。
まずは移動します。

```
$ cd /home/<クライアント側アカウント名>/.ssh　#「cd ~/.ssh」でも可
```

鍵を作成します。

任意の名前をつけてください。
研究室の方は、鍵の名前を「is_rsa_<自分の名字>」にして下さると助かります。

以下、例として鍵の名前を「is_rsa_tanaka」にします。

```
$ ssh-keygen -t rsa -f is_rsa_tanaka
$ ls
id_rsa_tanaka  id_rsa_tanaka.pub
```

lsコマンドで確認すると、2つの鍵が作成されたことが分かります。

<b>id_rsa_tanaka</b>：秘密鍵
<b>id_rsa_tanaka.pub</b> :公開鍵

このようになっています。

## 　公開鍵をサーバに送信

アクセスするサーバに公開鍵を送信します。

「hogehoge@123.456.78.91」は「サーバ側アカウント名@サーバIPアドレス」という意味です。
送信先は「/home/<サーバ側アカウント名>/.ssh」ですので、「/home/hogehoge/.ssh」となっています。

```
$ scp id_rsa_tanaka.pub hogehoge@123.456.78.91:/home/hogehoge/.ssh
```

ただ、サーバーのポートを変更している/変更されている方もいるはずです。
その場合、上記を実行してもエラーがでるはずです。

その方はポートの指定が必要です。

```
$ scp -P <ポート番号> id_rsa_tanaka.pub hogehoge@123.456.78.91:/home/hogehoge/.ssh
```

研究室ではポート番号を指定していますので、聞きに来てください。


## 　秘密鍵の管理

すでに「 /home/<クライアント側アカウント名>/.ssh 」に「id_rsa」が存在する人もいると思います。
複数のサーバーにアクセスする可能性も踏まえてconfigファイルを作成します。

>参考： .ssh/configファイルでSSH接続を管理する
https://qiita.com/0084ken/items/2e4e9ae44ec5e01328f1

```
$ touch ~/.ssh/config #configファイル新規作成
```

今回の場合は以下を書き込みます。
「#」のコメントは消してください

```
# hogehoge@123.456.78.91サーバー
Host hogehoge #ホスト名
    HostName 123.456.78.91 #IPアドレス
    User hogehoge #ログインユーザー
    IdentityFile ~/.ssh/id_rsa_tanaka #秘密鍵のパス
    Port 22 #ポート番号。初期は22ですが変更している場合は各自で確認してください。
```

## 　接続確認

サーバーに接続できるか確認します。

```
$ ssh hogehoge
```

終了は「exit」です。

```
$ exit
Connection to 123.456.78.91 closed.
```



#最後に

ubuntu 18.04 LTSのサーバー立ち上げ方法については、後日時間があれば.....
findコマンドで更新時間が30日前のファイルを削除する

GNU系のfindコマンドの話です。

```
# カレントディレクトリ内に存在する全てのファイルから、30日前のファイルを表示
find ./ -mtime +30 -type f

# カレントディレクトリ内に存在する全てのファイルから、30日前のファイルをrmコマンドで削除
find ./ -mtime +30 -type f -exec rm {} \;
```

もちろん、カレントディレクトリの部分は好きに置き換えられます。 `/var/log` とか。

なお、`+`と`-`を間違えて顔面ブルースクリーンになる事例もありましたので、
必ず `-exec rm {} \;` を外して1度試し打ちしてから実行しましょう。
リモートデバッガー


# リモートデバッガーの場所
Visual Studioをインストールすると、下記にRemoteDebuggerが配置される。

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\Remote Debugger

x86: アプリケーションが32ビットの場合
x64: アプリケーションが64ビットの場合
※OSのビット数は関係ない

# VirtualBox上のアプリケーションをデバッグ
## ブリッジ
■ゲスト：
・「Windowsファイアウォールを介したアプリまたは機能を許可」に
　msvsmon.exe(リモートデバッガー)を追加する。
・ゲストNICをブリッジに変更する。
・リモートデバッガーを起動する。
・アプリケーションを起動する。

■ホスト：
・ホストNICにLANケーブルを接続しておく。(ゲストと通信するため)
・VisualStudioの「プロセスにアタッチ」で、ゲストのリモートデバッガーに接続する。

※ゲストとホストが同一ネットワークにいる必要がある。

## ホストオンリーアダプター
■ゲスト：
・ゲストNICに「ホストオンリーアダプター」を追加する。
・ホストオンリーアダプターのDHCPサーバーを有効にする。
・リモートデバッガーを起動する。
・アプリケーションを起動する。

https://bitwave.showcase-tv.com/%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%ABpc%E3%81%A8virtual-box%E3%81%AE%E4%BB%AE%E6%83%B3%E3%83%9E%E3%82%B7%E3%83%B3%E3%81%A8%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E6%8E%A5/
Rubocop実行待ちの辛さを和らげるコマンド

私はRubocopが大好きです！！

`Gemfile` に `gem 'rubocop'`を無いRubyプロジェクトなど、福神漬けの無いライスカレーのようなものだと思います [^1]。

[^1]: 僕はラッキョウが嫌いです。

しかし、**Rubocopの実行をじっと待つ**のはあまり楽しくはありません。5秒10秒ならまだしも、ファイル数が増えて1分を超えてくると、フロー状態が途切れてしまいます。

そこで「開発中のGitブランチで変更があったファイルのみRubocopでチェックする」スクリプトを作りました。必要なファイルだけ検査するので、実行時間が大幅短縮できます。

以下のコマンドを適当な名前（私は`~/bin/rubo`）で保存してください。

```bash
#!/bin/bash
valid_file() {
  while read -r f; do
    if [ -e "$f" ]; then
      echo "$f"
    fi
  done
}

git diff --name-only origin/master | valid_file | xargs rubocop --auto-correct "$@"
```
Git リモートブランチの持ってきかた　更新しました

#リモートブランチ持ってきて、ブランチ移動
```$ git checkout -b new-branch origin/new-branch```

これで持ってきてブランチまでできる。

#できなかった。というかリモートリポジトリにない？

```$git branch -a```
これでリモートブランチ確認したら、持ってきたいブランチがない？
gitlabをみるとあるのに。


#普通にブランチを作って、pullしたらいけた
```$git checkout -b 持ってきたいブランチ名```

```$git pull origin 持ってきたいブランチ名```

上記実行したら持ってこれた。


###rails db:migrateを忘れずに
そのまま開こうとしたらエラー。
自分のDBにないテーブルがあるので、マイグレートしてテーブル反映させろ！てことね。
エラー文にあるようにそのまま入力

```$bin/rake db:migrate```

でアプリ起動できました。


#補足＆訂正10/9
上記のやり方で持ってきていたブランチを、最新のものにしようと
```$git pull origin 持ってきたいブランチ名```したけど持ってこれない。
というか
```$git branch -a```でリモートのブランチ含めて確認すると存在がない。

なので
```$git pull```とだけやってみたら色々とローカルとリモートに持ってこれた！
で、また
```$git pull origin 持ってきたいブランチ名```したら持ってこれました。
findコマンドで-execオプションを使用する時の最後の「{} ;」ってなんだっけ？

# `find`コマンドで`-exec`オプションを使用する時の最後の`{} ;`ってなんだっけ？

私は、`-exec`じゃなく殆ど`xargs`を使ってますが、シェル改修で`-exec`を久々に見ました。
過去、`-exec`オプションも使ってましたが最後の`{} ;`ってなんだっけ？
と素朴に思いました。
まあ、`man`を見ろって話なんですが。

## `find`の`man`

```console:man抜粋
-exec command ;
すべてコマンドに対する引き数と見なされる。文字列 `{}` は、
それがコマンドの引き数中に現れるすべての場所で、現在処理中のファイル名に
置き換えられる。
```

パイプ(`|`)処理における展開(`-`)は`find`内だと`{}`になるってことなんですかね。

`man`を更に読み進めると`-exec {} +`ってのもあったんですね。

```console:man抜粋
選択したファイルに対して指定したコマンドを実行するが、
コマンドラインを形成するとき、選択した各ファイル名をコマンドラインの末尾に
追加して行くという方法を取る
```

`-exec {} ;`と`-exec {} +`の違いは、ググったら[^1]
>「-exec {} +」はファイルをまとめて実行する（グループ実行）
>全ファイルのパスに置き換えられる。
>「-exec {} ;」はファイルを１つずつ実行する（単体実行）
>ファイルパスにならない

[^1]: [[コマンド]findの[ -exec {} \; ]オプション と [ -exec {} + ] オプションは何？ | Coffee Breakにプログラミング備忘録](http://to-developer.com/blog/?p=1275)

ただし、`-exec {} ;`より`xargs`が推奨みたいですね。
理由は、「`find`の`-exec`では1つのファイルに対して1回コマンドを実行するが、
`xargs`ならカーネルが許す限り長いコマンドを作って実行するため、
`-exec`より`xargs`の方が`fork`&`exec`の回数が少なくなって効率的なはず」[^2]だそうです。

[^2]: [古いファイルやディレクトリを消したい（Linux） -Linux で不要な古い- UNIX・Linux | 教えて!goo](https://oshiete.goo.ne.jp/qa/4323602.html)

実際ファイル数が数万個ともなると実行時間に差異が出てくるので分かると思います。

## `find`比較

### `exec`と`xargs`との比較

```bash:Terminal
[root@server ~]# time find /var -type f -exec ls -l {} ; > /dev/null
real    0m23.684s
user    0m6.679s
sys     0m15.602s

[root@server ~]# time find /var -type f | xargs ls -l > /dev/null
real    0m0.441s
user    0m0.345s
sys     0m0.160s
```
### キャッシュによる影響確認

明らかに`xargs`の方が早いですね。
ちなみにキャッシュの関係性もあるかもしれないので
キャッシュをクリア。

```bash:Terminal
[root@server ~]# sync && sysctl -w vm.drop_caches=3
[root@server ~]# free
             total       used       free     shared    buffers     cached
Mem:       1034564    1003368      31196          0     123764     761776
-/+ buffers/cache:     117828     916736
Swap:      2031608     107724    1923884
[root@server ~]# sync
[root@server ~]# echo 3 > /proc/sys/vm/drop_caches
[root@server ~]# free
             total       used       free     shared    buffers     cached
Mem:       1034564     240196     794368          0        664     150404
-/+ buffers/cache:      89128     945436
Swap:      2031608     107724    1923884
```

キャッシュをクリアして何度か実施しましたが
ほぼ、変わらず。

```bash:Terminal
[root@server ~]# time find /var -type f | xargs ls -l  > /dev/null

real    0m0.526s
user    0m0.344s
sys     0m0.182s
[root@server ~]# time find /var -type f | xargs ls -l  > /dev/null

real    0m0.443s
user    0m0.326s
sys     0m0.180s
```

### `find`に`-ls`オプションでは？

ちなみにLinuxでは`find`に`-ls`というオプションがあるので
同様に計測してみましたが、`xargs`とほぼ同じ性能でした。

```bash:Terminal
[root@server ~]# time find /var -type f -ls > /dev/null

real    0m0.914s
user    0m0.237s
sys     0m0.280s
```

更にキャッシュクリアしても、あまり差はないですね。

```bash:Terminal
[root@server ~]# time find /var -type f -ls > /dev/null

real    0m0.154s
user    0m0.100s
sys     0m0.054s
```

まあ、スクリプトでそんなに`cp`や`mv`することはあっても
大量に`ls`することはないんでしょうけど。
Gitのブランチ名に絵文字が使えたので遊んでみた✨✨

確かに使えないことはなさそうだけれども、まさか本当に使えるとは思わなかった。
のでGithubで遊んで見る。

# 砂場ッ！
https://github.com/fumihiko-hidaka/emoji-branch

# お遊びの結果ッ！
https://github.com/fumihiko-hidaka/emoji-branch/branches

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235100/dea70c48-3486-1a8e-b3da-745db990de76.png)

# 実験ッ！

## まずはシンプルに

```bash
git checkout -b 💩🚽
Switched to a new branch '💩🚽'
```

https://github.com/fumihiko-hidaka/emoji-branch/tree/%F0%9F%92%A9%F0%9F%9A%BD

世にもバッチいブランチが誕生してしまった:relaxed:

## 釣りをしてみる

```bash
git checkout -b 🌊🎣😆
Switched to a new branch '🌊🎣😆'
```

https://github.com/fumihiko-hidaka/emoji-branch/tree/%F0%9F%8C%8A%F0%9F%8E%A3%F0%9F%98%86

ちなみに自分は特に釣りに興味はないです。

## 改行してみる

```bash
git checkout -b 🤪\
> 🤪
Switched to a new branch '🤪'
```

そもそもとしてgit自体が改行に対応していないっぽい？
反映されませんでした:sob:

https://github.com/fumihiko-hidaka/emoji-branch/tree/%F0%9F%A4%AA

## タグを入れてみる

```bash
git checkout -b '⚰️<br/>🧟‍♂️'
Switched to a new branch '⚰️<br/>🧟‍♂️'
```

https://github.com/fumihiko-hidaka/emoji-branch/tree/%E2%9A%B0%EF%B8%8F%3Cbr/%3E%F0%9F%A7%9F%E2%80%8D%E2%99%82%EF%B8%8F

まぁちゃんと出てくるみたい？

## :runner:メロスは激怒した:rage:

```bash
git checkout -b "メロスは激怒した。"
Switched to a new branch 'メロスは激怒した。'
```

これは想定内。

## 必ず、かの邪智暴虐の王を除かなければならぬと決意した。:punch:

```bash
git checkout -b "メロスは激怒した。必ず、かの邪智暴虐じゃちぼうぎゃくの王を除かなければならぬと決意した。メロスには政治がわからぬ。メロスは、村の牧人である。笛を吹き、羊と遊んで暮して来た。けれども邪悪に対しては、人一倍に敏感であった。きょう未明メロスは村を出発し、野を越え山越え、十里はなれた此このシラクスの市にやって来た。メロスには父も、母も無い。女房も無い。十六の、内気な妹と二人暮しだ。この妹は、村の或る律気な一牧人を、近々、花婿はなむことして迎える事になっていた。結婚式も間近かなのである。"
Switched to a new branch 'メロスは激怒した。必ず、かの邪智暴虐じゃちぼうぎゃくの王を除かなければならぬと決意した。メロスには政治がわからぬ。メロスは、村の牧人である。笛を吹き、羊と遊んで暮して来た。けれども邪悪に対しては、人一倍に敏感であった。きょう未明メロスは村を出発し、野を越え山越え、十里はなれた此このシラクスの市にやって来た。メロスには父も、母も無い。女房も無い。十六の、内気な妹と二人暮しだ。この妹は、村の或る律気な一牧人を、近々、花婿はなむことして迎える事になっていた。結婚式も間近かなのである。'
```

これ以上、ブランチ名を長くするとそもそもとしてエラーになってしまった。
そしてpushしてみる。

### 初めてのエラー

```bash
error: failed to push some refs to 'git@github.com:fumihiko-hidaka/emoji-branch.git'
```

おぉぉぉぉ……始めてエラーが発生した！
ちょっとGithubさんよ〜:rage:
localのgitではブランチを作れるのにpushできないってどういうことですかね〜〜〜:thumbsdown:

Githubではあまりにも長いブランチ名だとエラーになるみたい。

~~そもそもとして、そんなブランチを作るなと言われたら何も言えない~~

# 感想ッ！

電子の世界のストレージをまた無駄遣いしてしまった。
後続のCI処理とかでめっちゃエラーになりそう。