OmniAICreator/Qiita-1.07M huggingface dataset:
Sourcetreeを使って既存のリポジトリをgit-flowにする

## git-flowを初期化する
メニューバーより [リポジトリ] > [Git flow / Hg flow] > [リポジトリの初期化] をクリック
![スクリーンショット 2018-02-25 16.06.17.png](https://qiita-image-store.s3.amazonaws.com/0/237863/eb43f418-cbf0-21ff-a59e-4ea93e354590.png)

デフォルトのままで [OK] をクリック
![スクリーンショット 2018-02-25 16.08.07.png](https://qiita-image-store.s3.amazonaws.com/0/237863/579ea1f6-eff3-7a61-952f-edd2af7558ab.png)

ローカルリポジトリにdevelopブランチが作成される
![スクリーンショット 2018-02-25 16.09.03.png](https://qiita-image-store.s3.amazonaws.com/0/237863/c3e67564-93ab-eed4-b723-72610824de8b.png)

## 作業ブランチを作成・マージする
メニューバーより [リポジトリ] > [Git flow / Hg flow] > [新規フィーチャーを開始] をクリック
![スクリーンショット 2018-02-25 16.11.29.png](https://qiita-image-store.s3.amazonaws.com/0/237863/57a19227-e644-04e5-7e23-c188e1e10aa5.png)

フィーチャ名（ブランチ名）を入力して [OK] をクリック
![スクリーンショット 2018-02-25 16.15.15.png](https://qiita-image-store.s3.amazonaws.com/0/237863/091e97a8-b2ab-9c51-b526-410a49b45da1.png)
![スクリーンショット 2018-02-25 16.18.02.png](https://qiita-image-store.s3.amazonaws.com/0/237863/9ab4ab47-612b-5064-6323-5739f6e4c4c0.png)

フィーチャーブランチが作成される
![スクリーンショット 2018-02-25 16.19.55.png](https://qiita-image-store.s3.amazonaws.com/0/237863/1929ddbd-75ff-5442-c249-63c32e3bd89a.png)


適当にファイルを追加してコミット
![スクリーンショット 2018-02-25 16.21.47.png](https://qiita-image-store.s3.amazonaws.com/0/237863/58173507-d541-4984-3dc0-c9e42978b66b.png)
![スクリーンショット 2018-02-25 16.22.15.png](https://qiita-image-store.s3.amazonaws.com/0/237863/a6837052-15b0-2488-63ab-250db72dfe55.png)

メニューバーより [リポジトリ] > [Git flow / Hg flow] > [フィーチャーを終了] をクリック
![スクリーンショット 2018-02-25 16.24.17.png](https://qiita-image-store.s3.amazonaws.com/0/237863/97c7eaf1-5888-d00a-aaf8-76c91c1f81c6.png)

ブランチを削除するか残すかはお好みで [OK] をクリック
![スクリーンショット 2018-02-25 16.25.26.png](https://qiita-image-store.s3.amazonaws.com/0/237863/74b0d056-5023-7925-0ac8-cf03fbaa825b.png)
![スクリーンショット 2018-02-25 16.26.11.png](https://qiita-image-store.s3.amazonaws.com/0/237863/4ff8a7b2-a8df-50c3-e071-193c5a900c2e.png)

developブランチにマージされる
![スクリーンショット 2018-02-25 16.27.44.png](https://qiita-image-store.s3.amazonaws.com/0/237863/7b8b7b7e-c84d-2f3b-ab4b-ae8ecebb8649.png)

developブランチをリモートリポジトリにプッシュ
![スクリーンショット 2018-02-25 16.28.56.png](https://qiita-image-store.s3.amazonaws.com/0/237863/afc60b0a-c2cc-8bb8-421d-50b77ee46d82.png)
![スクリーンショット 2018-02-25 16.29.06.png](https://qiita-image-store.s3.amazonaws.com/0/237863/27a4fd93-672b-3000-b7c3-0a4af3a2f17f.png)
![スクリーンショット 2018-02-25 16.30.16.png](https://qiita-image-store.s3.amazonaws.com/0/237863/82ba1897-a6ea-9f88-7b43-e96647bb4f70.png)

## おわりに
基本的な流れはこんな感じ。
さらに別の機能追加をする際は再度developプランチからfeatureブランチを作成。
機能追加が一段落着いたらrelease作業へと移る。
アジャイル設計とは？

## 設計とは何か？
- ソフトウェアシステム設計の主要なドキュメントはソースコード自身である
- ソースコードの構造を表現するダイアグラムは設計の補助に過ぎず、設計そのものではない

## 設計がしっかりしていないと何が問題？
- 明確なシステムのイメージを持ってプロジェクトを開始すれば**最初は**うまくいく
- 運が良ければそのままリリースまで行ける
- ところが時間が経過するにつれ、どんどん保守しづらくなっていく
- そのうち些細な変更でも多大な労力を費やさなければならなくなる
- さらに酷くなると再設計を余儀なくされる
- しかし、こういった再設計はたいてい上手く行かない
- システムは常に変化し続けており、新しい設計もそれに追従しなければならず、至難の業


## 設計の悪臭 腐敗するソフトウェアの兆候
- 硬さ
  - 変更しにくいシステム。一箇所変更するだけであるにも関わらず、膨大な影響範囲が存在するソフトウェア 
- 脆さ
  - 一つの変更によって概念的に関係のない箇所まで影響が及び、その部分を改修しなければ不具合が発生するソフトウェア
- 移植性のなさ
  - 他のシステムでも再利用できる部分をモジュールとして切り離すことが困難なソフトウェア
- 扱いにくさ
  - 本来すべきことよりも逸脱したことを実施するほうが安易なソフトウェア
- 不必要な複雑さ
  - 本質的な意味を持たない構造を内包しているソフトウェア
- 不必要な繰り返し
  - 同じような構造を繰り返し含み、纏められる部分が纏まっていない([DRY原則](#dry%E5%8E%9F%E5%89%87%E3%81%A8%E3%81%AF)に則していない)ソフトウェア
- 不透明さ
  - 意図が伝わってこない、何を実施しているのかよくわからないソフトウェア

### ソフトウェア腐敗の主な要因
- 最初の設計時点では予想もしなかった仕様変更による劣化
- 最初の設計思想を知らない別の開発者による対応
 - こうした変更が少しずつ重なっていき違反が蓄積され、腐敗してくる

#### ※ソフトウェア開発者ならば・・・
- 設計の劣化を仕様変更のせいにしてはならない
- 仕様は変更されるものであるということは最初からわかっていなければならない
- 最も不確実な要素は仕様だということを認識すべき
- 頻繁に発生する仕様変更が原因で設計は劣化していくのであれば自分たちの設計に問題がある
- 変更に耐えれるようにする設計を見つけ、プロジェクトが腐敗しないようにする

### 優れたアジャイルチームはソフトウェアの腐敗を許容しない
- 優れたアジャイルチームは変化を喜んで受け入れる
- プロジェクトの初期には殆ど時間を割かない
- 歳月とともに劣化するような初期の設計に時間をかけても無駄
- 代わりにシステム設計を可能な限りクリーン且つシンプルに保つようにする
- できるだけ頻繁にユニットテストや受け入れテストを行うように心がける
- そのようにすることで設計を柔軟且つ変更しやすく保つ
- 優れたアジャイルチームはそういった柔軟性を利用して継続的に設計を改善する

## 可能な限り美しく設計を保つ
- アジャイル開発者は可能な限り適切且つクリーンに設計を保つことに身を捧げている
- アジャイル開発者の行う「クリーンアップ」は毎日、毎時、場合によっては毎分ソフトウェアを可能な限りクリーン、シンプル且つわかりやすく保つ努力を怠らない
- あとで直すというようなことをせず、腐敗が起こることを許容しない
- ソースコードは設計の最重要な表現形式であるのでクリーンに保たなければならない
- アジャイル開発者としてのプロ精神はコードが腐敗することを決して許さない

## まとめ
- アジャイルな設計とは「プロセス(流れ)」や「イベント(事象)」ではなく、**ソフトウェアの構造や可読性を向上させるために、原則、パターン、そしてプラクティスを継続的に適用する行為**である
  - またそれはシステムの設計を可能な限り、シンプル、クリーン且つわかりやすく保つための献身的な行為である


##### DRY原則とは？
- Ruby on Railsで採用されているソフトウェアの開発原則
  - **D**on't **R**epeat **Y**ourselfの略で「繰り返しを避ける」という意味
Ubuntu PCにWindows10をデュアルブートで入れる

世の中には、Windowが入ったPCにUbuntuを後から入れる記事があふれていますが
Ubuntuが入ったPCにWindowsを入れる記事が少なく、ヒットしたものも手順が異なっていたので
自分がうまくいったやり方を残しておきます。  
  
## windows→ubuntuとubuntu→windowsの違い
入れる順番によってブートローダー、UEFIの設定が異なってきます。
Windows→Ubuntuだと、後に入れたUbuntuがブートローダー更新、設定してくれるので、あまり難しくありません。
一方でUbuntu→windowsだと、UEFIがWindowsに乗っ取られてUbuntuが選択できなくなったり
UbuntuのブートメニューにWindowがなく、起動できないことがおきます。
なので、Ubuntuの方でブートローダーの設定を手動で行う必要がでてきます。  

## 必要なもの
* ubuntu インストールメディア
    * 適当な
* windows インストールメディア

## 手順
* ubuntu起動ディスクをBIOSの優先順位いじって起動
    * インストールされているUbuntuではなく、try ubuntu without installのUbuntuを起動すること
* gpartedでubuntu領域削減、空きを作る
    * [参考](https://kledgeb.blogspot.jp/2012/10/ubuntu-gparted-10.html)
    * 50Gくらいあけました
* 再起動、UbuntuUSBを抜く
* Windows10のインストールUSBを差し、起動、空けたディスク位置を指定してインストール
* 再起動後、ubuntuしか起動しない

* ここからブートローダーにwindowsを追加する作業
    * [参考](http://techeten.xyz/636)
* インストールされているUbuntuを起動
* Windowsをインストールしたデバイスを探す

```
$ sudo fdisk -l
デバイス       Start 最後から セクタ   Size タイプ
/dev/sda1       2048   1050623   1048576   512M EFI System
/dev/sda2    1050624 333027327 331976704 158.3G Linux filesystem
/dev/sda3  333027328 333060095     32768    16M Microsoft reserved
/dev/sda4  333060096 435427327 102367232  48.8G Microsoft basic data
/dev/sda5  435427328 468860927  33433600    16G Linux スワップ
```

* この場合/dev/sda4みたい
* UUIDを知る

```
$ sudo blkid /dev/sda4
/dev/sda4: UUID="828A62428A6603B1" TYPE="ntfs" PARTLABEL="Basic data partition" PARTUUID="18dbb2bc-b597-4b11-b430-95c26895475e20"
```

* grubにWindowを見つけてくれるように設定
/etc/grub.d/40_custom に以下を追加

```
menuentry “Microsoft Windows 10” {
search –fs-uuid –no-floppy –set=root {見つけたUUID} 
chainloader (${root})/efi/Microsoft/Boot/bootmgfw.efi
}
```
* 更新

```
sudo update-grub
```

* 再起動後、ブートメニューに、Windowが出現。
    * 初期設定のために、何度か再起動。

* もしブート優先順位を変えたかったら、Ubuntuで設定
    * [こちらの記事](https://qiita.com/bohemian916/items/7637b9b0b3494f447c03)の後半のGRUB_DEFAULTを変更することでできる。
【機械学習】 パーセプトロンの実装

パーセプトロンによる分類を実装します。
コーディングする上で参考にした図書は以下です。

>「機械学習を理解するための数学のきほん」　立石賢吾著


#分類とは
標本データを２値、あるいは多値に分類する手法。教師あり学習の一つ。

#パーセプトロンとは
>視覚と脳の機能をモデル化したものであり、パターン認識を行う。シンプルなネットワークでありながら学習能力を持つ。1960年代に爆発的なニューラルネットブームを巻き起こしたが、1969年に人工知能学者マービン・ミンスキーらによって線形分離可能なものしか学習できないことが指摘されたことによって下火となった。(Wikipedia)

パーセプトロンとは、複数の入力を受け取り、それぞれの値に重みを掛けて足しあげたものを出力するというモデル。
x１、x２　という変数が存在した場合に、それぞれに対応した重み　w１、w２　を設定し、x１＊w１　と　x２＊w２　を加算したものを出力する。
出力されたモデルから、標本データを分類する直線を生成できる。

パーセプトロンは直線しか表現できないため、線形に分離できない標本データに対しては効力をもたない。

#パーセプトロンの実装

##目的
パーセプトロンモデルの構築。
与えられた標本データを直線で分類することが最終目標

##手段
重みベクトル w を発見し、それに対する法線ベクトルを定義する。
重みベクトルwに対する法線ベクトルが、分類の境界となる。

##重みベクトルの発見に必要なもの

###識別関数 fw(x) 
変数xを受け取った時、パラメータwとの内積から正解データを求める関数。
正解データは分類値、変数は入力値なのでどちらも既に明らかとする。
（分類は教師あり学習であり、教師あり学習は標本に対する正解データの存在を前提とするため）

###重みベクトルの更新式 
現在の重みベクトルと入力値を掛け合わせた時正解データにたどり着けなければ、重みベクトルを更新する必要が生じる。
重みベクトルの更新は、現在の重みベクトルに入力値と正解値の積であるベクトルを加算することで実現できる。

#パーセプトロンの実装

##流れ
①標本データの用意及び重みベクトルの初期化（更新するので、初期値はなんでもいい）
②識別関数の実装
③重みベクトル更新式の実装
④識別関数と更新式を使用し、モデルに標本データを学習させる

```python:パーセプトロンの実装
import numpy as np
from matplotlib import pyplot as plt

# ① -----------


#別途用意したcsvからデータを読み込む
test = np.loadtxt('0225.csv',delimiter=',',skiprows=1)

#標本データの抽出。元データの２列を読み込み、以後ベクトルとして扱う
train_x = test[:,0:2]
#正解値の抽出
train_y = test[:,2]

#重みベクトルの初期化。ベクトルなので、１行２列のデータを設定。
w = np.random.rand(2)


#分類境界を示す関数の実装
#重みベクトル自体は境界とはならず、重みベクトルに対する法線ベクトルが境界となる
x_len = np.arange(-3, 3)
def validator(w):
    #重みベクトルに対する法線ベクトルの算出方法は、
    # w1x1 + w2x2 = 0  が成立するベクトル (x1,x2) を発見すること。
    # 移行して、 w2x2 = -w1x1
    #          x2 = -w1x1 / w2
    # よって、 -w1x1/w2 を (x,y)座標における y とする直線が法線ベクトルとなる
    x_2 = -w[0] * x_len / w[1]
    return [x_len, x_2]


#標準化関数の実装
mu = train_x.mean()
sigma = train_x.std()
def standardize(x):
    return (x - mu) / sigma

#標本データの標準化。標準化を行うことで、データの平均を０に、分散を１に慣らすことができる
train_x = standardize(train_x)


#② --------------------


#識別関数の実装
def f(x):
    #現在の重みベクトルと入力ベクトルの内積が正ならば
    if np.dot(w,x) >= 0:
        return 1
    #負ならば
    else:
        return -1


#③ --------------------


#重みベクトル更新式の実装
def wArange(w,x,y):
    #現在の重みベクトルと、入力値と正解値のベクトルを加算する
    w = w + y * x
    return w
 
    
#④ --------------------


#指定更新を行う
size  = 10
count = 0
            
print('初期状態の重みベクトルw：{}'.format(w))
for _ in range(size):
    
    #標本データと正解データを結合した上で、それぞれを取り出す
    for x, y in zip(train_x, train_y):

        #標本データを識別した時、現在の重みベクトルでは正解値を導けなかった場合、重みベクトルの更新を行う
        if f(x) != y:
            #更新の実行
            w = wArange(w,x,y)
            count += 1
            #ログの出力
            print('{}回目の更新　現在の重みベクトルw：{}'.format(count, w))
            
#標本データの可視化
##正解値が１のデータを'o'で可視化
plt.plot(train_x[train_y==1, 0],train_x[train_y==1,1],'o')
##正解値がー１のデータを'o'で可視化
plt.plot(train_x[train_y==-1, 0],train_x[train_y==-1,1],'x')

#重みベクトルの可視化
plt.plot(w, linestyle='dashed', label='w_vector')
#法線ベクトルの可視化
plt.plot(validator(w)[0],validator(w)[1],linestyle='solid', label='normal_vector')
plt.legend(loc='upper right')

plt.xlim(-2,2)
plt.ylim(-2,2)
plt.show()

```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184568/c279864d-9bc6-a66c-bc6d-cf38eba68d3d.png)



このように、重みベクトルを適切な形に更新したのちに、それに対する法線ベクトルを描画することでデータを分類することができる。

以上。
DBに接続できないときはpdo_mysql.default_socketを確認

CakePHPでローカルのDBに接続できるときにエラーが出たので備忘録として書いておきます。
対処方法はフレームワーク関係なくPHPであれば共通かと思います。

# **前提**
OS：macOS High Sierra 10.13.3
フレームワーク：CakePHP 3.5.12
データベース：MySQL(XAMPP 7.2.2)

データベースに接続できない
<img width="970" alt="スクリーンショット 2018-02-25 15.45.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/190055/0a0a7293-531b-6aa2-1995-beb953ffa283.png">

CakePHPではapp.phpというファイルにデータベース接続の情報を記述するが、特に問題はなさそう。

# **対処**
php.iniの下記の項目が空だったため、データベースに接続ができなかった。
<img width="648" alt="スクリーンショット 2018-02-25 15.59.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/190055/d97e30d2-f7b8-bb37-0cf0-01e9cf099557.png">

MySQLが使用しているsocket情報は以下。
<img width="651" alt="スクリーンショット 2018-02-25 16.05.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/190055/208dcce2-991f-b020-6eb4-a2737d8f58ef.png">

パスを合わせると接続できた。
<img width="651" alt="スクリーンショット 2018-02-25 16.00.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/190055/eef01d5f-3e69-3982-c147-01891db92d03.png">

<img width="988" alt="スクリーンショット 2018-02-25 16.02.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/190055/85770f2d-b0f0-3c8e-8d2c-96bf82ecb1a8.png">

# **その他**
## php.iniの見つけ方

```
php -i | grep php.ini
```

## socketのパスの見つけ方（XAMPPの場合）
/Applications/XAMPP/xamppfiles/etc/my.cnf
にsocketの情報が記載されている。php.iniに記載するパスと合わせれば良い

# 参考
[CakePHPでデータベースの連携 - http://www.aipacommander.com/entry/2014/05/20/130000][1]
[1]:http://www.aipacommander.com/entry/2014/05/20/130000

[【php】MySQLに接続するときにエラー発生 - https://www.softel.co.jp/blogs/tech/archives/2187][2]
[2]:https://www.softel.co.jp/blogs/tech/archives/2187
アコーディオンパネルの実装

# 概要
- jQueryを使って、開閉可能なアコーディオンパネルを実装する。

# 実装例
https://inoyoh.github.io/practice/accordion_js/

# 仕組み
- 初期状態(htmlとcssの状態)
    - 全部露出した状態
- jQueryでの処理
    - コンテンツ部分を一旦全て隠す
    - <font color="red">タイトルをクリック</font>した際に、<font color="red">クリックした次の要素を</font>表示する。

# コード
```html:html
<dl class="panel">
  <dt class="panel__title">一つ目</dt>
  <dd class="panel__content">ああああああああああああああああ</dd>
  <dt class="panel__title">二つ目</dt>
  <dd class="panel__content">いいいいいいいいいいいいいいいい</dd>
</dl>
```
```css:css
.panel{
  width : 800px;
}
.panel__title {
  border-bottom : 1px solid #ffffff;
  background : #000000;
  color : white;
  padding : 10px;
  font-weight : bold;
}
.panel__content {
  border : 1px solid #eee;
  margin : 0px;
  padding : 10px;
}
```
```javascript:jQuery
$(function(){
  // 一旦コンテンツを隠す
  $(`.panel__content`).hide();
  // タイトルをクリックした際の挙動
  $(`.panel__title`).click(function(){
    // this(タイトルをクリックした要素）の次の要素を表示する
    $(this).next().slideToggle(500);
  });
});
```

# 参考
- [【jQuery】開閉可能なアコーディオンパネルを作ってみよう](http://www.aiship.jp/knowhow/archives/22018)
- [コピペで簡単 jQuery でアコーディオンを実装する方法](https://hirashimatakumi.com/blog/5107.html)
    - nextを用いた方法
- [.slideToggle( )] (http://www.jquerystudy.info/reference/effects/slideToggle.html) 
    - 「.slideToggle()」 : 表示されている時は隠し、隠れている時は表示する
- [.next( )](http://www.jquerystudy.info/reference/traversing/next.html)
    - 「.next( )」 : 次の要素を選択。
- [jQueryの$(this)の使い方(どこを指してるのか？)](http://www.flatflag.nir87.com/this-1371)
    - this : イベントが発生した要素
MacにLaravel+Homesteadの環境を整える2018年2月時点

# この記事について
`Laravel`も`Homestead`も知らないので環境構築にあたり忘れないように手銃をメモ。Homesteadのインストールと、quickstartのTODOアプリ起動まで。2018年2月時点の最新と思われる情報を元にしている。

# 手順
## 前提
* Laravelは5.6
* Homesteadは7.1.2
* VirtualBoxとVagrantはインストール済み

## コマンド等
注：ほぼ https://readouble.com/laravel/5.6/ja/homestead.html の内容
### Homestead Vagrant Box のインストール
これはかなり時間がかかるのでどこかに出かけてても良いのでは :wink: 

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

### Homestead のインストール
↑で入れたHomestead Vagrant Boxとは異なるものなのでこれも入れる

```bash
$ git clone https://github.com/laravel/homestead.git ~/Homestead
$ cd Homestead/
$ git checkout v7.1.2
$ bash init.sh
```

最後の `bash init.sh` で `Homestead.yaml` ファイルが作成される。

## quickstartのアプリを起動させる
github.com で公開されている https://github.com/laravel/quickstart-basic のTODOリストを作成するアプリを試しに起動させるまで

### ソースのダウンロードとEclipseの設定

```bash
git clone https://github.com/laravel/quickstart-basic.git quickstart-basic
```

この後、Eclipseに綺麗に取り込む方法がわからなかったので　:cry: `.project` ファイルを手で作成。プロジェクト名は `laravel-quickstart-basic` にし、Eclipse上の既存プロジェクトのインポート機能でインポート。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
	<name>laravel-quickstart-basic</name>
	<comment></comment>
	<projects>
	</projects>
	<buildSpec>
		<buildCommand>
			<name>org.eclipse.php.composer.core.builder.buildPathManagementBuilder</name>
			<arguments>
			</arguments>
		</buildCommand>
		<buildCommand>
			<name>org.eclipse.wst.common.project.facet.core.builder</name>
			<arguments>
			</arguments>
		</buildCommand>
		<buildCommand>
			<name>org.eclipse.wst.validation.validationbuilder</name>
			<arguments>
			</arguments>
		</buildCommand>
		<buildCommand>
			<name>org.eclipse.dltk.core.scriptbuilder</name>
			<arguments>
			</arguments>
		</buildCommand>
	</buildSpec>
	<natures>
		<nature>org.eclipse.php.core.PHPNature</nature>
		<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
	</natures>
</projectDescription>
```

### Homestead の設定
`Homestead.yaml` ファイルを編集してTODOアプリを反映させる。`http://quickstart.test` でブラウザからアクセスできるように設定。当然 `hosts` ファイルにもエントリを追加

```yaml
folders:
    - map: ~/workspace/quickstart-basic
      to: /home/vagrant/quickstart-basic
sites:
    - map: quickstart.test
      to: /home/vagrant/quickstart-basic/public
```

`/etc/hosts` ファイルに以下エントリーを追加

```
192.168.10.10  quickstart.test
```

### Vagrantの起動とデータベースmigrate

```bash
$ vagrant up
```

仮想マシンが起動したらSSHでログインしてmigrateを実行

```bash
$ vagrant ssh
vagrant@homestead$ cd quickstart-basic/
vagrant@homestead$ php artisan migrate
```

ブラウザからアクセス `http://quickstart.test` して、TODOアプリ画面が表示されればOK
RubyのHashとArrayをdeep freezeするfreeezerというgemを書きました

RubyでHashとArrayをdeep freezeするための, [freeezer](https://github.com/shuheiktgw/freeezer)というgemを書きました.

## そもそもRubyのfreezeとは?
Rubyのfreezeはオブジェクトへの破壊的な変更を防ぐためのメソッドで, よく定数の定義とセットで使われます. 

Rubyはデフォルトで定数への破壊的変更を許可しているため, 例えば以下のような現象が起こりえます.

```rb
class Test
  SOME_CONST = 'some const'
end

Test::SOME_CONST.upcase!
Test::SOME_CONST # => 'SOME CONST'
```

これを防ぐために,定数にイミュータブルなオブジェクトを代入する場合は `freeze` して破壊的変更を禁止する場合があるわけです.

```rb
class Test
  SOME_CONST = 'some const'.freeze
end

Test::SOME_CONST.upcase!
Test::SOME_CONST # => raise RuntimeError: can't modify frozen String
```

## ArrayやHashオブジェクトの場合は中身までfreezeする必要がある
Stringをfreezeしたい場合などは上記の通り単純にfreezeすればいいのですが, ArrayやHashオブジェクトをfreezeしたい場合にはもう少し注意になります.

例えば以下のようにArrayをfreezeしてもArrayの参照しているオブジェクトまではfreezeされません.

```rb
SOME_ARRAY = ['one', 'two', 'three'].freeze

# Arrayへの破壊的変更は禁止される
SOME_ARRAY.push('four') # => raise RuntimeError: can't modify frozen Array

# Arrayが参照しているオブジェクトへの破壊的変更は許可される
SOME_ARRAY[0].upcase!
SOME_ARRAY # => ['ONE', 'two', 'three']
```

もし本当にArrayオブジェクトの参照しているオブジェクトまでイミュータブルにしたければ,以下のように各オブジェクトもfreezeする必要があります.

```rb
SOME_ARRAY = ['one'.freeze, 'two'.freeze, 'three'.freeze].freeze
SOME_ARRAY[0].upcase! # => raise RuntimeError: can't modify frozen String
```

## というわけでこれを一発でできるのがfreeezerというgem
壮大な前フリになってしまいましたが, 要するにArrayとHashの中身まで一発でイミュータブルにできるのが[freeezer](https://github.com/shuheiktgw/freeezer)というgemです.

```rb
using Freeezer
SOME_ARRAY = ['one', 'two', 'three'].deep_freeze

SOME_ARRAY.push('four') # => raise RuntimeError: can't modify frozen Array
SOME_ARRAY[0].upcase! # => raise RuntimeError: can't modify frozen String
```

上記のように `using Freezer` を呼んでもらえれば `deep_freeze` ※1 というメソッド一発で再帰的に中のオブジェクトまでfreezeしてくれます.

## 所感など
自分で書いておいてなんですが, 正直クラスにある1つか2つの定数をfreezeするためにこのgemを入れて `using Freeeze` って書くかと言われるとちょっと微妙かなーという気はしています.

あとたぶん定数でStringのArrayとかHashを使いたい場合がStringじゃなくてSymbolで定義すればいいのではという気もしています(Symbolはイミュータブル).

なのでもし使うとしたら `Constants` みたいな定数をまとめて定義しているファイルがプロジェクトにあって,そこで何度も中身をfreezeする処理を書く場合にはいいのかもしれません.

また,今回の `deep_freeze` の元ネタは[プロを目指すためのRuby入門](https://www.amazon.co.jp/dp/4774193976) の8章 "モジュールを理解する" で例題として紹介されていた `deep_freeze` です. こいつをもう少し真面目に書いたらどうなるかということをやってみたくてgemを作ってみました.

※1 本当は `deep_freeze` じゃなくて `freeeze` にしたかったんですが, 流石に怒られそうだし, `deep_freeze` のほうが意味が伝わりやすいので断念しました.
Alexa Skill 開発エンジニア からのお知らせです。

# 1. はじめまして
はじめまして、[TAKAHIRO NISHIZONO](https://twitter.com/zono_0)と申します。

2018年2月現在、独立系SIer会社にて、音声スキルの開発エンジニアをしております。
自分のお仕事である音声スキルの開発案件をお客様から頂戴すべく、日本での 音声スキル ／ 音声アプリ の普及に尽力し、Alexaスキル や Google Home アプリの開発手順をQiitaにて紹介していこうと考えております。

どうぞ、みなさま、よろしくお願い申し上げます。

土日限定となりますが、プライベートでよければ、簡単なAlexaスキルの開発ハンズオンや、Google Homeアプリ開発ハンズオンの勉強会講師を承ります。
みなさまと一緒に、音声スキル ／ 音声アプリ を盛り上げてゆきたいと思いますので、お声がけよろしくお願いいたします。

また、大変重要なお知らせとなりますが、
婚カツ始めました。
女性限定とはなりますが、なにとぞよろしく申し上げます。

2018/02/25 TAKAHIRO NISHIZONO
【pandas】DataFrameの部分的に重複している行を抽出する

DataFrameの部分的に重複している行を抽出する方法。

``` python:元データ
df=pd.DataFrame({'col1':['A1','A2','A1','A3','A3','A4'],
                 'col2':['B1','B2','B2','B2','B2','B4'],
                 'col3':['C1','C2','C3','C2','C3','C4']})
print(df)

# col1 col2 col3
#   A1   B1   C1
#   A2   B2   C2
#   A1   B2   C3
#   A3   B2   C2
#   A3   B2   C3
#   A4   B4   C4
```

col1列が重複している行を抽出。

``` python:col1で抽出
df1 = df[df.duplicated('col1',keep=False)]
print(df1)

# col1 col2 col3
#   A1   B1   C1
#   A1   B2   C3
#   A3   B2   C2
#   A3   B2   C3
```

col2列とcol3列が重複している行を抽出。

``` python:col2,col3で抽出
df2 = df[df.duplicated(['col2','col3'],keep=False)]
print(df2)

# col1 col2 col3
#   A2   B2   C2
#   A1   B2   C3
#   A3   B2   C2
#   A3   B2   C3
```

見やすくするためにソート。

``` python:df2をソート
df3 = df2.sort_values(by=["col2", "col3"], ascending=True)
print(df3)

# col1 col2 col3
#   A2   B2   C2
#   A1   B2   C3
#   A3   B2   C2
#   A3   B2   C3
```

ちなみに、違う方法でも同様の結果が得られる。

``` python:違う方法
df4 = df[df[['col2','col3']].duplicated(keep=False)]
df4 = df4.sort_values(by=["col2", "col3"], ascending=True)
print(df4)

# col1 col2 col3
#   A2   B2   C2
#   A1   B2   C3
#   A3   B2   C2
#   A3   B2   C3
```
viewからcontrollerのメソッドをhelper_methodで呼び出す

viewでもcontrollerのメソッドを使いたいときはhelper_methodを使う

# controllerでhelper_methodを定義

```ruby:application_controller.rb
class ApplicationController < ActionController::Base
  helper_method :current_user, :logged_in?

  private

  def current_user
    return unless session[:user_id]
    @current_user ||= User.find(session[:user_id])
  end

  def logged_in?
    !!session[:user_id]
  end
end

```

# viewで呼び出し

```ruby:home.html.erb
<%= current_user %>
```
Pythonを使ってHEICファイルをjpegに変換する

旅先で同行者から写真を共有してもらったときに、ファイル名がバラバラだと時系列に見れずに不便でした。
というわけで、EXIF情報から撮影日時をファイル名とし直すプログラムを作ったので先日早速使おうとしたところで困惑。
「.HEIC」？
最近のiPhoneでは、jpegではないんですね、知りませんでした。
jpeg専用でプログラムを作っていたので、「.HEIC」から「.jpeg」に変換するプログラムを作成した。
Mac限定です。

```py
import os
import subprocess
tmpdir = '' #「.HEIC」ファイルを保存したディレクトリ配下

files = os.listdir(tmpdir)

for f in files:
    command = 'sips --setProperty format jpeg ' + tmpdir + f +  ' --out ' + tmpdir + f.replace('.HEIC','.jpeg')
    subprocess.call(command, shell=True)
```
Error: Cannot find module 'internal/util/types'に関する対処法

#エラー内容
-2年ほど前に扱ったプロジェクトを立ち上げようとgulpコマンドを打ったら
`Error: Cannot find module 'internal/util/types'`
とエラーが。
1年以内でググってみてもめぼしいエラー対処記事は見つからず。

#対処法
-プロジェクトのバックアップをとる
-node_modulesをディレクトリ丸ごと削除
-sudo npm install
で解決。
defaultのgulpコマンドを叩いたら無事動いた。
jupyterでpythonを動かす！-Hacker Rankにpython3で挑みたい方向け！-

# Python3でHacker Rankに挑戦してぇ〜〜

python3でHacker Rankに挑戦するには、「Jupyter」っていうのが良いらしい。
早速インストールするか！

と思ったけど、anacondaっていうのをインストールするのが楽らしい

まずはjupyterのサイトへ
http://jupyter.org/


##インストール手順！！

英語かぁぁぁって思った方は、以下の通りにやるとできますよっ
---
1. installを押してください
![スクリーンショット 2018-02-25 13.21.23.png](https://qiita-image-store.s3.amazonaws.com/0/238739/82d75b6c-5553-197e-c395-6e6be619e612.png)

---
2.こんな画面にきます。青い文字で「anaconda」って書いているやつをクリック
![スクリーンショット 2018-02-25 13.21.47.png](https://qiita-image-store.s3.amazonaws.com/0/238739/aca189ab-32ea-935b-57f0-eac5ed792cd7.png)

---
3.Windowsの方は、Windows, MacOSの方はMacOS, Linuxの方はLinuxヘ！
僕はMacOSなので、MacOSをクリックします
![スクリーンショット 2018-02-25 13.22.19.png](https://qiita-image-store.s3.amazonaws.com/0/238739/310ad983-20a0-e109-47d3-ae082b3b3552.png)

---
4.どっちが良いかな〜〜〜
僕はpython3派なので、python3.6versionにしました！
python2派の方は、python2.7 versionへ
（versionは頻繁に更新されるので、ご注意を！！）
![スクリーンショット 2018-02-25 13.22.30.png](https://qiita-image-store.s3.amazonaws.com/0/238739/af9489b5-9a86-750a-95f1-0bcd3aa042c3.png)

---
5.こんなんが出たら「続ける」を押すやで〜〜
![スクリーンショット 2018-02-25 13.22.59.png](https://qiita-image-store.s3.amazonaws.com/0/238739/f34c708e-c305-f83d-7e84-7944d4871685.png)

---
6.これも「続ける」を押すやで〜〜
![スクリーンショット 2018-02-25 13.23.17.png](https://qiita-image-store.s3.amazonaws.com/0/238739/f7ac001a-b498-7ae5-fb4a-cb142b782a94.png)

---
7.保存したい方は保存、プリントしたい方はプリント、
僕はそのまま「続ける」を押しました！
次行っちゃいましょう！
![スクリーンショット 2018-02-25 13.23.35.png](https://qiita-image-store.s3.amazonaws.com/0/238739/d4c355d9-a5f4-7f86-d9e2-f3cdc1209df8.png)

---
8.まだまだ「続ける」で〜〜
![スクリーンショット 2018-02-25 13.23.45.png](https://qiita-image-store.s3.amazonaws.com/0/238739/3e6ee5a9-a8a9-8b0d-07c3-1e26c0d0db82.png)

---
9.同意しないと進めないので、同意しちゃいましょう！！
![スクリーンショット 2018-02-25 13.23.55.png](https://qiita-image-store.s3.amazonaws.com/0/238739/52fbb111-142e-a5cc-4c58-adfccbc52f5b.png)

---
10.インストールを押します！！
![スクリーンショット 2018-02-25 13.24.27.png](https://qiita-image-store.s3.amazonaws.com/0/238739/5ee50dc0-4e3e-f75d-a7a8-0d0f1b613909.png)

---
11.ちょっと時間かかるけど、待ってみると、こんなんが出てくる
「続ける」を押しましょ〜〜
![スクリーンショット 2018-02-25 13.42.52.png](https://qiita-image-store.s3.amazonaws.com/0/238739/768eb2bd-f0f1-ba6b-833c-b3486a066a53.png)

---
12.完了したらしい
閉じましょ！！
![スクリーンショット 2018-02-25 13.43.04.png](https://qiita-image-store.s3.amazonaws.com/0/238739/bd1436e1-5524-6a4a-dad5-5792ae7b11db.png)

---
13.終わったと思ったら、こんなん出てきた・・・
残しておいても良いけど、いらんやろ！ゴミ箱や！！！！
悩んでいる方、、、正直どっちでも良いよ！
![スクリーンショット 2018-02-25 13.43.14.png](https://qiita-image-store.s3.amazonaws.com/0/238739/535a2ead-6dbd-c28f-d67a-b6bf0b25b9ac.png)


---

##次こそjupyterをインストールするでぇ〜〜
さっきまでは、anacondaってやつをインストールしました。次に本命の「jupyter」や！

まずは、
Macの人は、「ターミナル」
Windowsの人は「コマンドプロンプト」を開きましょう〜〜


これ通りに打ち込んでくれ！！ちなみに、python3の人用やで！python2がやりたい方はjupyterのホームページへ！
まずはこれ
`python3 -m pip install --upgrade pip`
次にこれ
`python3 -m pip install jupyter`

そして、jupyterを立ち上げる
`jupyter notebook`

#完成！！！！
終わりや！
denite.nvimのvimfiler actionを作った

以下の設定

```vim:vimrc
call denite#custom#action('directory', 'vimfiler', 'my#denite#action#vimfiler')
```

```vim:~/.vim/autoload/my/denite/action.vim
function! my#denite#action#vimfiler(context)
  execute 'VimFiler ' . a:context.targets[0].action__path
endfunction
```

をするとkindがdirectoryの場合に、vimfiler actionが追加される。デフォルトアクションをvimfilerにしたい時は

```vim
:Denite directory_rec -default-action=vimfiler
```

で実行するなど。

作るにあたって、`context`の中身を知りたかったのでdebug actionも作った。

```
call denite#custom#action('directory', 'debug', {context -> execute('PP! context', '')})
```

[thinca/vim-prettyprint: Prettyprint vim variables.](https://github.com/thinca/vim-prettyprint)が必要。
Javaで【ゼロから作るDeep Learning】2.NumPyなんてものは、ない。

##はじめに
[Javaで【ゼロから作るDeep Learning】1.とりあえず、微分と偏微分](https://qiita.com/xaatw0/items/edb111d4ca764c1976b0)
からの続きです。
当然、JavaではNumPyは使用できません、多分。類似のJavaライブラリには、GPUも使えるND4Jがありますが、使用するとそちらが本題になりそうなので、使わず。そしてJavaには、配列がある。
ということで、配列の計算を足し算とかけ算を実装します。引き算はマイナスで足し、割り算は1を割って掛ければ良し~~(手抜き)~~。Deep Learning、ほぼ関係なし。

##二次元配列の検証
演算をする前に、引数の二次元配列を検証する。観点としては、要素数が0でないこと、2次元目(?)の配列の長さが全て同じこと。

```java:ArrayUtil.java
public void validate(double[][] x){

	if (x.length ==0 || x[0].length ==0){
		throw new IllegalArgumentException();
	}

	if (Arrays.stream(x).skip(1).anyMatch(p -> x[0].length != p.length)){
		throw new IllegalArgumentException();
	}
}
```

##二次元配列の足し算
数値を足す場合、二次元配列の全ての要素に足す

```java:ArrayUtil.java
public double[][] plus(double[][] x, double y){
	validate(x);

	final int resultRow = x.length;
	final int resultCol = x[0].length;

	double[][] result = new double[resultRow][resultCol];
	for (int i = 0; i < resultRow; i++){
		for (int j = 0; j < resultCol; j++){
			result[i][j] = x[i][j] + y;
		}
	}

	return result;
}
```

一次元配列を足す場合、二次元配列の1次元目が同じ要素に足す

```java:ArrayUtil.java
public double[][] plus(double[][] x, double[] y){
	validate(x);

	if (x[0].length != y.length){
		throw new IllegalArgumentException();
	}

	final int resultRow = x.length;
	final int resultCol = x[0].length;

	double[][] result = new double[resultRow][resultCol];
	for (int i = 0; i < resultRow; i++){
		for (int j = 0; j < resultCol; j++){
			result[i][j] = x[i][j] + y[j];
		}
	}

	return result;
}
```

一次元配列を足す場合、二次元配列の同じ要素に足す

```java:ArrayUtil.java
public double[][] plus(double[][] x, double[][] y){
	validate(x);
	validate(y);

	if (x.length != y.length || x[0].length != y[0].length){
		throw new IllegalArgumentException();
	}

	final int resultRow = x.length;
	final int resultCol = x[0].length;

	double[][] result = new double[resultRow][resultCol];
	for (int i = 0; i < resultRow; i++){
		for (int j = 0; j < resultCol; j++){
			result[i][j] = x[i][j] + y[i][j];
		}
	}

	return result;
}
```


##二次元配列の掛け算
数値を掛ける場合、二次元配列の全ての要素に掛ける

```java:ArrayUtil.java
public double[][] multi(double[][] x, double y){
	validate(x);

	double[][] result = new double[x.length][x[0].length];
	for (int i = 0; i < result.length; i++){
		for (int j = 0; j < result[i].length; j++){
			result[i][j] = x[i][j] * y;
		}
	}

	return result;
}
```

二次元配列を掛ける場合、掛けたり足したりする。
書籍のP54「3.3.2 行列の内積」、もしくは、「 [■行列の積　ＡＢの定義](http://www.geisya.or.jp/~mwm48961/kou2/matrix2.html)」を参照。

```java:ArrayUtil.java
public double[][] multi(double[][] x, double[][] y){

	validate(x);
	validate(y);

	int cntCalc = x[0].length;
	if (cntCalc != y.length){
		throw new IllegalArgumentException();
	}

	final int resultRow = x.length;
	final int resultCol = y[0].length;

	double[][] result = new double[resultRow][resultCol];
	for (int i = 0; i < resultRow; i++){
		for (int j = 0; j < resultCol; j++){
			final int row = i;
			final int col = j;
			result[row][col] = IntStream.range(0, cntCalc).mapToDouble(k -> x[row][k] * y[k][col]).sum();
		}
	}

	return result;
}
```

##おわりに
いまだディープラーニングには届かじ。
Atcoder Beginer Contest 073 A問題 解説

#問題
https://beta.atcoder.jp/contests/abc073/tasks/abc073_a

#考察
2桁の数のうち1桁でも「9」が含まれていればYesを出力，含まれなければNoを出力すればいいのでは？

#コード
```
+++++++++++
[->+++++<]
>++
>,
[-<->]
 
[-]+<[
  
>>>>>
+++++++++++
[->+++++<]
>++
>,
[-<->]
   
[-]+<[
>>>>>
+++++++++++++++
[->+++++<]
>+++
.
++++++++++
++++++++++
++++++++++
+++
.
<<<<<
   
>-+<[-]]>
    
[
>>>
++++++++++++++++
[->+++++<]
>+++++++++
.
++++++++++++
.
++++++++++++++
.
<<<
[-]
]
<<<<<
>-+<[-]]>
     
[
++++++++++++++++
[->+++++<]
>++++
.
++++++++++++
.
++++++++++++++
.
[-]
]
```

#解説
pn(n≧0) は先頭からnポインタ目のポインタを，*pnはその値を指す．


```
+++++++++++
[->+++++<]
>++
```

*pn0をASCIIコード57，'9'までインクリメントする．

```
>,
```

\*p1に入力の1文字目を格納．

```
[-<->]
```
\*p1が0になるまで，*p0と*p1の値をデクリメント．
つまり，*p0-=*p1.

```
[-]+<[
```
\*p1を0にして，1加算．\*p1=1
p0に移動し，*p0!=0のとき[]内の処理を行う.

if{f1}else{f2}については以下のコードで表すことができる.

```
>[-]+<[f1>-<[-]]>[f2[-]]
```

今回はf1に先ほどまでと同じ処理を書き,その中のtrueのときNoを出力,falseのときYesを出力する処理を,
f2にYesを出力する処理を当てはめた.

ただ,途中[-]の処理で*p1が-1になるバグ？が発生していたので微調整している.

#感想
バグに少々手間取ったが,それさえ分かれば問題なかった.
出力文字を予め用意しておくと楽かもしれないと思った.
精進したい.
GoogleHomeで「すみません、よくわかりません」と言われたら

奥さん用にGoogleHomeでメモを付ける機能をIFTTTで作ったのですが、
「メモ *********」でトリガーが動くようにしたが、あまり認識が良くないと顧客からクレームが（汗


GoogleAssistantが発話をどのように認識したかを、次のサイトでチェック。

https://myactivity.google.com

Googleアカウントに紐ついたすべての活動ログが、、、、恐ろしや。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/202646/f7f81cbd-bf43-f455-156b-ba353011ec87.png)

アシスタントを押すとGoogleHomeなどの認識結果だけ抽出されますよ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/202646/c1bc4fe2-2cef-f37e-0571-370243d02f6f.png)


「メモ 起きた」ではなく、「目も起きた」と認識されたわけですな。
キーワードを再考する必要あり。

## 後日

キーワードを「メモして」にしました。一息で「ねぇグーグル、メモして」が一連で言いやすい。
一拍置いて、メモしたいフレームも言いやすい。
VisualStudio Community 2017 での開発環境を整える雑記

## おうちのPCにいろいろ開発環境をつくっている

* いろいろと遊ぶために開発環境を作っている
* VSCode、nodejs、Pythonなんかはテキトーにやってても勝手にでき上がる
* Visual Studio Community はIDEで少し構えるので腰を据えてやる
* Xamarinなどいれてハローワールドしたい
* Windows環境だけどiPhone使ってるしiPhoneアプリやってみたい

## インストール

* VisualStudioCommunityってけんさくしてインストーラをDLすれ。

## Xamarin環境を作ろうとしたら鼻毛が出るほど簡単でした

環境自体はインストールするだけなので鼻毛が出るほど簡単でした

1. `Visual Studio Community 2017` をインストールする
    * `Visual Studio Enterprise` 持ってるぜっていう人はそっちでいいです
1. 最近のはても優しい感じでどんな環境がお望みですか？って聞いてくれる
    * `nodejs`で開発する？とか`Python`で開発する？みたいに
    * その中に`Xamarin`もあるのでチェックしてインストールする
1. そうするといい感じに必要なものをまとめてインストールしてくれる

ぼたんポチポチするだけなのでとっても簡単でした

## Xamarin、Cordova、Unityを選択してインストールすると30GB

* せっかくだしいれとこ

## msbuildのパスは通しておこう

* [コマンドでビルド](https://qiita.com/AyumuSuzuki/items/89113f4bcb0c2d09f468)できると便利なので通しておこう

## 画面が白くて目に刺さるので色を変える

* `ツール`から`拡張機能と更新プログラム`を開く
* `color`って検索して`Color Theme Editor for Visual Studio 2017`をインストールする
* `Dark`にしとこ

## フォントがMSゴシックで悲しいことになるのでConsolasにする

* `ツール`から`オプション`を開く
* `環境`ツリーの`フォントおよび色`をクリックして`テキストエディター`のフォントを`Consolas`にしてサイズを`12`にする

## ひとまずこんなもんか。

* すでにnodejsやらPythonやらCordovaやらRubyやらPHPやらなんやらごちゃごちゃ入っているためやることは少なめ？
* IDEなので若干重めだがツールやらなんやらもろもろそろっててそこはIDEやなあと思った。
* Xamarin使ってiPhoneでテストするのは煩雑な記事に混ぜるのはもったいないので次に記事します。
Qiitaの使い方確認&数値計算(Python)

###テスト
##目的
下記の3つの理解が目的（これは個人的な記事）
1.数式の書き方
2.Qiitaの記事の書き方
3.「2.」で理解した書き方により、pythonコードを添付

##数式の書き方
Qiitaでの数式の書き方はtexの書き方で、
$$の間に、e^{i\theta}=\cos{\theta}+i\sin{\theta}を書けば、

$e^{i\theta}=\cos{\theta}+i\sin{\theta}$

このように数式が書ける。

texの数式の書き方は以下を参照。
http://www1.kiy.jp/~yoka/LaTeX/latex.html

##Qiitaでの書き方
以降の書き方は下記のページを参考。
https://qiita.com/shizuma/items/8616bbe3ebe8ab0b6ca1

上記の添付より学んだことを活かして、以下のようにプログラムのソースコードを書いた。
内容は、「数値誤差」について。

##数値計算と誤差
数値計算する上で、避けることができないのが数値誤差である。
以下に代表的な数値誤差の例を一覧で示し、pythonコードで検証してみる。
検証例は「桁落ち」のみ示す。

|項目|説明|
|:--:|:--|
|桁落ち|値のほぼ等しいもの通しを減算するなどして、有効数字失われるなどによって生じる誤差。<br>例：$\sqrt{x+1}-\sqrt{x}$<br>下にpythonのプログラムで試行してみたので参考に。|
|丸め誤差|有限桁数の2進数で実数を表現することにより生じる誤差。<br>例：10進数での0.1$\longrightarrow$2進数では0.0001100110011$\cdot\cdot\cdot$|
|情報落ち|絶対値の大きく異なる数値同士の演算において、絶対値の小さな数値が演算に結果に反映されないために生じる誤差。<br>例：$10^{10}+10^{-8}+10^{-8}\cdot\cdot\cdot$|

###桁落ち検証
>$\sqrt{x+1}-\sqrt{x}=\frac{1}{\sqrt{x+1}+\sqrt{x}}$
とすることで数値計算上の桁落ち誤差を回避できる。

pythonを用いて実行してみる。
version:3.6.4
>pythonは下記よりインストールする。
https://www.python.org/downloads/

PC環境：windows10(64bit)
コマンドプロンプトで以下を打てば、test.py(下に示すコード)を実行できる。

```
python test.py
```


```python:test.py
import math
#main program
#case1:x=1e15
print("x=1e15の場合")
x=1e15
res_a=math.sqrt(x+1)-math.sqrt(x)
res_b=1/(math.sqrt(x+1)+math.sqrt(x))
#output result
print("通常通り計算した場合：",res_a)
print("式変形した場合：",res_b)

#case2:y=1e16
print("y=1e16の場合")
y=1e16
res_a=math.sqrt(y+1)-math.sqrt(y)
res_b=1/(math.sqrt(y+1)+math.sqrt(y))
#output result
print("通常通り計算した場合：",res_a)
print("式変形した場合：",res_b)
#end python
```
###結果
```
x=1e15の場合
通常通り計算した場合： 1.862645149230957e-08
式変形した場合： 1.5811388300841893e-08
y=1e16の場合
通常通り計算した場合： 0.0
式変形した場合： 5e-09
```
>値の差が小さいもの同士(case1の場合)での減算は通常通り計算すると0になってしまう。
式変形した場合は値が出力される。
この例のように、値の差が小さいもの同士での減算は避けるべきである。

###参考文献
[Pythonによる数値計算とシミュレーション](https://www.amazon.co.jp/Python%E3%81%AB%E3%82%88%E3%82%8B%E6%95%B0%E5%80%A4%E8%A8%88%E7%AE%97%E3%81%A8%E3%82%B7%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-%E5%B0%8F%E9%AB%98%E7%9F%A5%E5%AE%8F-ebook/dp/B079L18P3T/ref=pd_sim_351_1?_encoding=UTF8&psc=1&refRID=5R67DCHA983SG0YYASK8)
Eclipse小技メモ

Eclipseの小技をメモします。

###System.out.println();の補完
・sysout　＋ 補完キー
→System.out.println();

###getter/setterの自動生成
①コード上で、右クリック
②ソース→getter及びsetterの生成
<img width="644" alt="スクリーンショット 2018-02-25 12.05.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/229025/bd54137c-c968-e4f0-5245-b5e70cdc4a51.png">
今更ながら Ruby on Rails Tutorial をやってみた (その5)

## この記事について…

普段はRuby on Railsと無縁なプログラマなんですが、今更ながら**面白そう**という単純な理由から[**Ruby on Rails Tutorial**](https://railstutorial.jp/)をやってみようと思い立ちました。今回は[前回の記事](https://qiita.com/hideki0145/items/fecf5d16a90d937bd33e)の続きで第5章をやっていきます。
尚、Rails 5.1に対応した第4版を用いて、かつVagrantを使用した環境で進めていきます。

## 第5章 レイアウトを作成する
この章ではBootstrapを使用してアプリケーションの見た目の部分を作成していきます。Bootstrapというとお洒落というイメージがありますが実際はどうなんでしょうか。

今回はerbファイルを修正する機会が多そうです。現在Windows上のVSCodeを使用してコーディングを行っていますが、残念ながら未だAutoCompleteが効かない状況です。というのもWindows上にはRubyのインストールをしていないのです。
RubyInstallerであれやこれややると思うのですが、どうにも気が進まない。rbenvも使えないからuruを使うとか、Vagrant上で設定するときと知識を共有できないのがちょっとやだなぁと感じています。ThinkPad辺りにUbuntuデュアルブートしてやるのが一番いいのかなぁ…。

とかなんとかボヤキながらチュートリアルを進めていきます。
幸いHTML/CSSは多少わかるので特に詰まることなく進めました。時折出てくるBootstrapのクラスについては[ドキュメント](https://getbootstrap.com/docs/4.0/getting-started/introduction/)を逐一参照するのが良さそうです。そろそろ英語文献も恐れずに読まなきゃいけないと思う今日この頃。

サイトロゴにCSSを追加する節で、次のコードについて特に説明がなかったですが、

```scss:app/assets/stylesheets/custom.scss
#logo:hover {
  color: #fff;
  text-decoration: none;
}
```

:hover擬似クラスは「マウスカーソルが乗っているが、クリックしていない状態」を指すので、マウスカーソルを乗せたときにテキストに下線が表示されないように調整しているという意味です。下線が表示されると途端にダサくなりますもんね。

また、途中Sassについてのチュートリアルがありますが、これはRailsに限らずCSSファイルを記述する機会があるのであれば使用するべきだなと感じました。

```scss
footer {
  margin-top: 45px;
  padding-top: 5px;
  border-top: 1px solid #eaeaea;
  color: #777;
  a { /* ネストして記述できるのはやっぱり便利 */
    color: #555;
    &:hover { /* &は親属性であるaを表す */
      color: #222;
    }
  }
  .
  .
  .
}
```

Windows環境でもRuby gemのsaasを使用すればコンパイルできるので、使っていきたいですね。
(冒頭のWindows上にRubyのインストールをする話に戻る。)

さて、チュートリアルも約1/3を消化しました。以降はユーザ登録・ログイン処理・メッセージ投稿・フォローと続いて発展的な内容を学習できるようなので、どんどん先に進めていきたいと思います。

それでは、次回 第6章から再開したいと思います。
タブ切り替えの実装

# 概要
jQueryを使った、タブの切り替え実装方法をまとめる。

# 実装例
https://inoyoh.github.io/practice/tab_js/

# 仕組み
- 初期状態(htmlとcssの状態)
    - タブ：一つ目のタブだけ色を変えておく
    - コンテンツ：一つ目のコンテンツだけ「display : block;」（その他は「display : none;」）
- jQueryでの処理（クリックした時に以下の処理がなされるように関数でまとめる）
    - コンテンツ：
        - <font color="red">クリックされたタブの番号を取得</font>
        - 内容を、一旦全部非表示にする
        - <font color="red">クリックされた番号の</font>コンテンツを表示
    - タブ：
        - 一つ目のタブの色を変えているクラスを消す。
        - <font color="red">クリックされたタブのみ</font>に、タブの色を変えるクラスをつける。

# コード
```html:html
<ul class="tab cf">
  <li class="tab1 tab_current">1つめ</li>
  <li class="tab2">2つめ</li>
  <li class="tab3">3つめ</li>
<ul class="contents">
  <li class="content1 content_current">ああああああああああ</li>
  <li class="content2">いいいいいいいいいい</li>
  <li class="content3">うううううううううう</li>
</ul>
```
```css:css
.tab{
  list-style:none;
}
.cf{
  overflow : hidden;
}
.tab1, .tab2, .tab3 {
  float : left;
  background : #5f9ea0;
  padding : 5px 25px;
  margin-right : 1px;
}

.tab_current {
  background : #b0e0e6;
}
.content {
  list-style:none;
}

.content1, .content2, .content3 {
  display : none;
  background : #b0e0e6;
  padding : 20px;
  width : 500px;
}

.content_current {
  display : block;
}
```
```javascript:jQuery

$(function() {
  // クリックしたときの関数
  $('.tab li').click(function() {

    // 〜〜コンテンツについての処理〜〜
    //クリックされたタブの番号をindexに格納。
    var index = $('.tab li').index(this);
    //コンテンツを一旦全て非表示に。
    $('.content li').css('display','none');
    // クリックされた番号のコンテンツを表示。
    $('.content li').eq(index).css('display','block');


    // 〜〜タブについての処理〜〜
    // 一度タブについている'tab_current'を消し
    $('.tab li').removeClass('tab_current');
    //クリックされたタブのみに'tab_current'をつける。
    $(this).addClass('tab_current')
	});
});
```


# 参考
- [誰でも出来る！プラグインを使わずにjQueryで実装するタブ切り替え機能！](http://blog.three-co.jp/web/558/)
- （[jQueryとCSSでシンプルなタブ切り替え](https://qiita.com/Chinats/items/f947ec965175847bb858)）
はじめてのJupyter Notebook


pythonに触り始めてそろそろ1年。
素敵環境と評判のJupyter Notebookにもいっちょ手を出してみようかと。


## 〇参考 ##
https://pythondatascience.plavox.info/python%E3%81%AE%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83/jupyter-notebook%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86


## 〇環境構築 ##
まずは何はなくとも環境構築。
とりあえずAnacondaをインストール。
[Anaconda のダウンロードページ](https://www.anaconda.com/download/#_windows "Anaconda のダウンロードページ")

- とりあえず今回は64bit版の3.6の方をDL。
※2系のほうも使いたかったら後から追加するのか？

- Python 3.6 versionと書いているところからDLしたのに、
ファイル名は[Anaconda3-5.1.0-Windows-x86_64.exe]
割と意味不明なファイル名な気がする。
→自己レス：3.5.1はあくまでAnacondaのバージョン。
　[x86-64]の部分については意味不明なまま。

- インストール対象についてはどっちにしようかと悩んだけど、
　ユーザを仮に増やしたとしてもどうせ自分しか使わない端末なのでAlUsersに対してインストール
<img width="374" alt="キャプチャ_00.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/d64b8511-b2f5-1569-b856-0f21ebf58c6e.png">
→あとから考えるとここは[Just Me]のほうがよかったかもしれない。

- オプションについてはどちらもチェックせず。
※既存の環境をなるべく変えたくなかったため。
<img width="374" alt="キャプチャ_01.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/2995eb2b-58c0-d639-846e-637ab8b0f7d2.png">

これでInstallを押下したら、5分ぐらいでインストール完了。
<img width="374" alt="キャプチャ_02.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/02468cae-1cfe-3b3e-85e1-d825c06c2f8a.png">

と思ったら、VSCodeを入れませんか？と聞かれる。
<img width="374" alt="キャプチャ_03.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/f1321375-899f-3e8e-1df6-e0100b50f74b.png">

もう入れてるので、SKIP。
FINISH画面となるのでこれで終了。


**簡単やんけ。**

## 〇Jupyter Notebookの起動 ##
スタートメニューに[Jupyter Notebook]が追加されているので実行。
<img width="318" alt="キャプチャ_04.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/5d626bbc-c0a3-4c90-183a-8c912e057023.png">

ブラウザに表示される。
<img width="280" alt="キャプチャ_05.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/2061d60e-5d59-4572-82d0-e33c0cabcafb.png">

そして起動するAVAST。
毎度のことだがなかなかのウザさである。
<img width="450" alt="キャプチャ_06.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/413268f2-c16a-c343-d17c-f60fd5865734.png">

NewからPython3を選択したら以下のようなURLで別タブで表示。
http://localhost:8888/notebooks/Untitled.ipynb?kernel_name=python3


初心者なのでいつものようにHello Worldから。
マークダウンで説明なども記載できるみたいなので両方で。
<img width="572" alt="キャプチャ_07.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/8d6a9130-8cfa-8e55-cf05-c059005c5767.png">


## 〇感想 ##
**簡単やんけ。**
でもテストとかをモリモリするんだったら、
コマンドプロンプトとかで実行するほうが見やすいような気がするのは今までの慣習によるものなのかな。。
この辺は慣れてくるとうまく使い分けられるのかもしれない。
[VS Code]Haskell環境構築メモ


## Stackのインストール

```
$ curl -sSL https://get.haskellstack.org/ | sh
```

## Haskell IDE Engine のインストール

```
$ git clone https://github.com/haskell/haskell-ide-engine
$ cd haskell-ide-engine
$ stack install
$ hoogle generate
```

## VS Code に Haskell Language Server Client をインストール

[https://marketplace.visualstudio.com/items?itemName=alanz.vscode-hie-server](https://marketplace.visualstudio.com/items?itemName=alanz.vscode-hie-server)


## 補足：tasks.json

[[VS Code]Haskell(Stack)用tasks.json](https://qiita.com/JunSuzukiJapan/items/9b8555afb98ce273f4c0)
VisualStudioでデバッグするたびにavastにひっかかるのがうざい


以前はそんなことなかった気がするのだが、
PCを新調したらVisualStudioでデバッグするたびにAvastによるウィルスチェックが実行されるようになってた。
※一緒にAvastもバージョンアップされたからだとは思うが。

仕組み的によくわからんが、動きの雰囲気的にはAvast内で一回走った後にデバッグ用のプロセスが起動しているような感じ。
試したいからデバッグしているのに、先に一回実行されてしまうという意味のなさ。


〇対処
アバストの設定画面を表示し、「スキャンからの除外」にスキャンしたくないフォルダを追加しておけばよさそう。

<img width="592" alt="キャプチャ01.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/6efc5f47-2dcc-fb40-8e13-46e3c3f2f94c.png">


〇参考
https://majipon.jp/blog/?p=628
http://ossyaritoori.hatenablog.com/entry/2015/12/09/143742
TeXでepsファイルを挿入する際のコツ

#はじめに
[前回の記事](https://qiita.com/rebi/items/cfcbda25016fc8be9266)ではPowerPointを用いてepsファイルを作成しました。今回は作成したepsファイルを挿入する際のコツについていくつか書いてみたいと思います。

#BoundingBoxの調節
今回はこちらの画像をepsファイルに出力し、挿入してみたいと思います。
![pic0.png](https://qiita-image-store.s3.amazonaws.com/0/239294/a985921f-a761-2872-5d2f-34991eecbb8c.png)



はじめに、出力されたままの状態の画像（picture.eps）を挿入するとどうなるか見てみます。

```TeX:test.tex
\documentclass[a4paper]{jsarticle}

\usepackage[dvips]{graphicx}
\usepackage{float}

\begin{document}

\begin{figure}[h]
\centering
\includegraphics[width=12truecm]{picture.eps}
\caption{図の周囲に白い余白がある}
\end{figure}

\end{document}
```
としてできたpdfを見てみると![pic1.png](https://qiita-image-store.s3.amazonaws.com/0/239294/252d26c3-8fac-babb-279c-21cc42ea8999.png)

この上の図のようになります。ご覧のとおり、表示したい図の周囲に白い余白があり、図のキャプションとの間に距離があることがわかります。

これを解消するためには画像のBoundingBoxを調節する必要があります。これは画像を囲む四角形を表すパラメーターで
左下の点のx座標,左下の点のy座標,右上の点のx座標,右上の点のy座標
の順に数字を指定することで指定します。これらの値はメモ帳などでepsファイルを開くことで編集することができます。

私の場合ですとGSview を用いて、以下の図に示した左のウインドウのようにようにepsファイルを表示することができます。

![pic2.png](https://qiita-image-store.s3.amazonaws.com/0/239294/44d3ff18-da1e-4b61-e611-e0e718719bad.png)

このビューワー上でマウスカーソルを動かすと図の下の赤枠で囲ったように、見ている画像上の座標がわかります。このようにして左下と右上の座標を調べたら、メモ帳などでBoundingBoxの値を調節します。

また、epsファイルをメモ帳で開くと、右側の図のようになります。赤枠で囲った部分がBoundingBoxで私の環境だと、デフォルトが13 13 829 582 となっています。今回もそうですが、調節する際に画像の上部が切れていることがありますので、まずは右上のy座標に対応する、582の値を882に変えるなどした方がやりやすいと思います。

色々と書いてきましたが

ビューワー上で座標を調べる
↓
メモ帳などでBoundingBoxの値を変え、上書き保存する

これを何回か繰り返すと、以下の画像のように枠を挿入したい図に合わせることができます。

![pic3.png](https://qiita-image-store.s3.amazonaws.com/0/239294/09a6850c-3c20-0ac3-54c1-088adba34058.png)


#オプションにclipを追加

次に、この調節した画像をpicture2.epsとして、picture.epsと共に挿入します。

```TeX:test.tex
\documentclass[a4paper]{jsarticle}

\usepackage[dvips]{graphicx}
\usepackage{float}

\begin{document}

\begin{figure}[h]
\centering
\includegraphics[width=12truecm]{picture.eps}
\caption{図の周囲に白い余白がある}
\end{figure}


\begin{figure}[h]
\centering
\includegraphics[width=12truecm]{picture2.eps}
\caption{図1のキャプションが隠れてしまう}
\end{figure}

\end{document}
```
として、出力したのが、下の画像です。
![pic4.png](https://qiita-image-store.s3.amazonaws.com/0/239294/b691c88e-42b1-6f7d-0d91-7f8ee61b0ef0.png)

picture2.eps の方は余分な余白がなく、一見上手く挿入できてそうですが、picture.eps のキャプションを消してしまっています。こういった現象は\includegraphics のオプションに"clip"を追加すると解消できます。clipはBoundingBoxからはみ出した分を切り取るオプションです。

```TeX:test.tex
\documentclass[a4paper]{jsarticle}

\usepackage[dvips]{graphicx}
\usepackage{float}

\begin{document}

\begin{figure}[h]
\centering
\includegraphics[width=12truecm]{picture.eps}
\caption{図の周囲に白い余白がある}
\end{figure}


\begin{figure}[h]
\centering
\includegraphics[width=12truecm,clip]{picture2.eps}
\caption{clipを追加することで、はみ出た部分がカットされ図1のキャプションが見えるようになった}
\end{figure}

\end{document}
```
このようにオプションにclipを追加して出力した図がこちらになります。
![pic5.png](https://qiita-image-store.s3.amazonaws.com/0/239294/2bf92d55-cb6d-2200-3878-1f6407aab69e.png)
実際に図1のキャプションが見えていることがわかります。

このようなことを避けるために、オプションにclipは常につけておくと良いと思います。

#まとめ
epsファイルをTeXに挿入する際はコツとして

1.BoundingBoxの調節
2.オプションにclipを追加

を行うと上手くできると思います。epsファイルを挿入する際の参考になれば幸いです。読んでいただきありがとうございました。
PlantUMLで別ファイル内容を展開する

# PlantUMLで別ファイル内容を展開する

参考

* http://plantuml.com/

##方法
* `!include [ファイル名].pu`でファイルを呼び出します。


```:PlantUML定義（別ファイル内容を展開）
@startuml
state a
  !include state_a.pu

state c
  !include state_b.pu

[*] --> a
a --> b
b --> c
c -up-> b
c -up-> a
c --> [*]

@enduml
```

## 自動描画
![root.png](https://qiita-image-store.s3.amazonaws.com/0/125575/5eb0e5ea-279b-8fd3-d36c-644c86d295b5.png)

## 展開される側のファイル
### state_a.pu
```:PlantUML定義[state_a.pu]
@startuml
state a {
    state a1
    state a2
    state a3
    [*] --> a1
    a1 --> a2
    a1 --> a3
    a2 --> a3
    a3 --> [*]
}
@enduml
```
### state_a.pu 自動描画
![state_a.png](https://qiita-image-store.s3.amazonaws.com/0/125575/c4bf3e91-1d5b-a0b4-6400-9d0d01da0339.png)

### state_b.pu
```:PlantUML定義[state_b.pu]
@startuml
state b {
    state b1
    state b2
    [*] --> b1
    b1 -> b2
    b2 -> b1
    b2 --> [*]
}
@enduml
```
### state_b.pu 自動描画
![state_b.png](https://qiita-image-store.s3.amazonaws.com/0/125575/377fcb61-d3ca-10f4-46e2-abfe45ff484f.png)

## まとめ
状態遷移図で使用すると効果が高いと思います。

* 個別に定義するとプレビューで確認し易いので作業効率UP
* ボトムアップ・トップダウンを気にせず好きな所から記述しやすくなる
* DRY！
arduinoでシリアル

#概要
arduinoでシリアルやってみた。
デジタルオシロスコープで波形、撮ったので、真似してみた。
送信のみ、実装。

#シリアルの波形

tera termで「U」を送った。0x55。
9600ボー、パリティなし、ストップ1

![007.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/f83086ac-c48e-660c-927f-92a63225e139.jpeg)

#写真
unoのD13に、RXをつなぐ。

![MVC-008F.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/a92a8321-225f-0362-b973-9d5c42547c54.jpeg)

#結果
tera termで、受け取った。

![image](https://qiita-image-store.s3.amazonaws.com/0/18104/b28bed44-0700-0aba-36f6-9b1430760704.png)

#サンプルコード
start bit を送り、lsbからmsbへ、8個送って、stop bit送るを５００msで繰り返す。

```
void setup()
{
	pinMode(13, OUTPUT);
	digitalWrite(13, HIGH);
}
void loop()
{
	byte data = 'U';
	byte mask = 0x01;
	int i;
	delay(500);
	digitalWrite(13, LOW);
	delayMicroseconds(100);
	for (i = 0; i < 8; i++)
	{
		if (data & mask)
		{
			digitalWrite(13, HIGH);
		}
		else
		{
			digitalWrite(13, LOW);
		}
		delayMicroseconds(100);
		mask <<= 1;
	}
	digitalWrite(13, LOW);
	delayMicroseconds(100);
	digitalWrite(13, HIGH);
}
```

以上。
EclipseにPHP開発環境入れる2018年2月時点

# この記事について
Java開発に使っていたEclipse（Neon）にPHP開発環境が必要になって入れる話。色んな情報がネット上にあるので現時点（2018年2月）で可能な限り正確と思うものをメモ。プラグインにしろフレームワークにしろ色々進化してどんどん情報が古くなるよね :cry: 

# 手順
## 前提とか
ざっとネットで調べてわかったことをまとめる

* PHPStorm は有料なので手元のEclipseで構築することにした
* 使いたいフレームワークはLaravel
* Composerも使いたい
* EclipseのPHP開発環境用のプラグインはPDTを使う
    * 最新情報は2017年6月の公式の記事を読むべき↓
        *  https://www.eclipse.org/community/eclipse_newsletter/2017/june/article2.php
    * Neon3 用にはPDTの4.3が提供されている。4.3にはComposerは含まれていない。5.0には含まれている（はず。未確認）。
    * Eclipseでプラグインをインストールする時に表示される「PHP開発ツール Composerサポート」は必要。PDTの5.0ならComposerも統合されているらしいが、4.3では統合されていないっぽいのでPDTとComposerサポートの両方をイントールする。
        * https://marketplace.eclipse.org/content/composer-php-support
        * プロジェクトの新規作成から「ComposerパッケージらのPHPプロジェクト」が選択できるようになってれば成功

## Eclipseプラグイン追加とLaravelの新規プロジェクト

* `ヘルプ > 新規ソフトウェアのインストール` から「PDT」と「Composer サポート」の両方をインストール
* 新規プロジェクトから「ComposerパッケージらのPHPプロジェクト」でプロジェクトを作成し、途中でパッケージを選択するところでLaravelを選択する

これ以降はLaravelの話なので別にまとめる。学ぶこと多すぎ　:cry: この辺参考にする

* http://www.laravelbestpractices.com/
* https://qiita.com/slangsoft/items/21e5cc5015ff71e2f741
トランザクションの nonce は from アカウントの sequence である

## 問題
`web3.js` の `sendSignedTransaction` を使って同じアカウントから連続で複数回他のアカウントに送金しようとしたら、２目以降のトランザクションはどうしてもエラーでした。
`Error: Returned error: replacement transaction underpriced`

## 結論
- `sendSignedTransaction` の場合、トランザクションに `nonce` 項目を設定しないと行けない
- その値は、送金するアカウントごとのシーケンスでないと行けない
    - `シーケンス`という意味は、**ユニークかつ連続** の数値でないと行けないこと

## 対応方法
- `web3.eth.getTransactionCount(from)`で、`from`アカウントのトランザクション数を取得して、そのcountをnonceとして設定すれば、順番通りのシーケンスになる

## 課題
- ２回目以降の送信は、前の処理を完了して（ブロックに書き込まれた）からじゃないと、countが１回目の値と同じになってしまうので、２回目の送信は、１回目の送信がチェーンに書き込まれるまで待つ必要がある。
- １つのアカウントからの送金処理は並列にできないように見えるので、少しがっかりしました。

## 参考リンク
- [イーサリアムのトランザクション - Qiita](https://qiita.com/blueplanet/items/cac334133e252b50c2b0)
デジタルオシロスコープ

#概要
横河のデジタルオシロスコープ（古い）で、波形を画像にする。

#デジタルオシロスコープ

![MVC-007F.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/7be7055e-2c9e-faa4-7b44-41e082226a39.jpeg)


#手順
shiftキーを押して、copyキーを押す。
fileを押す、formatを押す、tiffを押す。
autofileをonにする。
波形を表示して、copyキーを押す。


#結果

![006.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/ac768a5f-146e-3177-d074-1e2166cd13c6.jpeg)

以上。