OmniAICreator/Qiita-1.07M huggingface dataset:
いまさら聞けないネットワークの基礎・基本 その１

## この記事は？
勉強しても忘れてしまいがちなので、ネットワーク周りの基礎・基本知識をまとめてみました。
間違いなどあれば指摘していただけると嬉しいです。

## ネットワークって？
>複数のコンピューターを接続して、相互に通信できるようにした状態。
https://kotobank.jp/word/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF-7058

コンピュータ同士をつなげて情報のやりとりができるようになった状態をネットワークあるいはコンピュータネットワークと言います。

家庭内や社内など近くにあるコンピュータをつなげたネットワークをLAN(Local Area Network)といい、遠くにあるコンピュータをつなげたネットワークをWAN(Wide Area Network)と言います。

またケータイやスマホをつなげるネットワークはモバイルネットワークと呼ばれます。

## インターネットって？
ネットワークの中でももっとも規模が大きいものがインターネットです。
世界中の企業のネットワーク、大学のネットワーク、家庭のネットワークなどをつないで自由に情報をやりとりすることができます。

## ネットワーク間の通信の仕組み
コンピュータネットワークでは情報の交換を「パケット」と呼ばれる小さな単位に分割してやりとりしています。
「パケット」には送信元と受信先のアドレス情報がついており、この情報を元に届けられます。
パケットに分割してやりとりしている理由として、データを少しずつ送ることで回線の占有を避け、複数の相手と並行して柔軟に通信するためというものがあげられます。

アナログ電話やケータイの3G回線などでは「パケット交換方式」とは違い「回線交換方式」という通信経路を占有する方式が取られています。


## コンピュータネットワークの階層モデル
ネットワーク通信を実現するためには様々なプログラムや機器が協力しながら動く必要がありますが、それらの役割を明確にしたものが「階層モデル」です。
階層モデルには「OSI参照モデル」と「TCP/IP 4階層モデル」がありますが、ここでは「TCP/IP 4階層モデル」を紹介します。

## TCP/IP 4階層モデルとは？
|階層名       | 役割 |    関連するキーワード   |
|:-----------------|:------------------|:------------------|
| アプリケーション層   |Webサービス、電子メールなどのサービスをユーザに提供します| HTTP, SMTP, POP3, FTP, SSHなど        |
| トランスポート層    |アプリケーション層とインターネット層を仲介し、データを正しく届けるための働きをします|TCP, UDP|
| インターネット層    |宛先のIPアドレスを元にコンピューターへデータを届けられるようにします。|        IPアドレス、IPv4, IPv6, ICMP, ルーティング|
| ネットワークインターフェース層|ネットワークアダプタなどの通信用ハードウェアを制御して実際にデータを転送します。| イーサネット, 無線LAN, MACアドレス, PPP など

上記のうち、アプリケーション層がサービスを提供し、それ以外の３つが通信機能を担当しています。

## プロトコルとは？
各階層の役割を知る前に知っておくべき大切なキーワードがあります。それが「プロトコル」です。

>コンピュータ・ネットワークでコンピュータどうしが情報を交換するための通信規約。
>https://kotobank.jp/word/%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB-8535#E6.97.A5.E6.9C.AC.E5.A4.A7.E7.99.BE.E7.A7.91.E5.85.A8.E6.9B.B8.28.E3.83.8B.E3.83.83.E3.83.9D.E3.83.8B.E3.82.AB.29

人間同士のやりとりでも状況によってやりとりに大まかなルールがあります。例えば、ビジネスの場だったら、「名刺交換 -> ちょっとした雑談 -> 本題」、友達と居酒屋にいるシチュエーションだったら「注文 -> 乾杯 -> 近況報告」など。
人間の場合、暗黙的なルールがありますが、コンピュータには厳密なルールが必要です。
このようなやりとりのルールが「プロトコル」です。
ネットワーク間の通信ではこのプロトコルが様々な場面で使用されています。

## 代表的なプロトコル
|層|プロトコル名|働き|
|:---|:---|:----|
|アプリケーション層|HTTP|Webページのデータをやりとりする|
||HTTPS|Webページのデータをセキュリティに対応した通信でやりとりする|
||POP3|サーバーに保管された受信メールを取り出す|
||SMTP|メールを送信する|
||FTP|ファイルを転送する|
||Telnet|コンピュータを遠隔操作する|
||SSH|セキュリティに対応した通信でコンピュータを遠隔操作する|
||DHCP|コンピュータにプライベートIPアドレスを割りあてる|
||DNS|URLとIPアドレスを相互変換する|
||SSL|セキュリティに対応した通信を行う|
|トランスポート層|TCP|確実さを優先してアプリケーションのデータを送受信する|
||UDP|速度を優先してアプリケーションのデータを送受信する|
|インターネット層|IP|パケットを目的地まで届ける|
||ICMP|IPでの通信エラーなどを通知する|
||IPsec|パケットを暗号化して届ける|
||ARP|ネットワーク機器のMACアドレスを調べる|
|ネットワークインターフェース層|イーサネット|メタルケーブルや光ファイバーケーブルでデータを伝送する|
||PPP|ユーザを認証して遠隔地の機器と通信する|

## 続き
各階層については後の記事にて紹介します。
随時アップデートしていきます。

## 参考資料
[スラスラわかるネットワーク&TCP/IPのきほん](https://www.amazon.co.jp/%E3%82%B9%E3%83%A9%E3%82%B9%E3%83%A9%E3%82%8F%E3%81%8B%E3%82%8B%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF-TCP-IP%E3%81%AE%E3%81%8D%E3%81%BB%E3%82%93-%E3%83%AA%E3%83%96%E3%83%AD%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%B9/dp/4797377038/ref=sr_1_1?ie=UTF8&qid=1505040046&sr=8-1&keywords=%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF+tcp+ip)
こちらの本をほとんど参考にして記事を書いています。絵や図が多いので初心者にとてもオススメです。
[Survey] Kaggle - Quora 3位解法まとめ

Kaggle - Quora Question Pairs[^1]の3位解法[^2]の調査記事です．

[3位] Overview Of 3rd Place Solution
Author: Jared Turkewitz
Discussion URL: https://www.kaggle.com/c/quora-question-pairs/discussion/34288


## アーキテクチャ

- ニューラルネット，LightGBM, XGBoostを利用
- Model Stackingの1層目は1300の特徴量
- LightGBMを利用(XGboostの5倍高速，やや正確さは落ちる)
- 15個のモデルのスタッキング
- 単一モデルだとXGBoostが最良(CV=0.185)

## 自然言語処理上の特徴量

- 自然言語処理上の特徴量: 単語の一致度，類似する単語の一致度など
- TI-IDFとLDAの距離
- 単語の共起性(自己相互情報量[^4])[^7]
- 単語の一致数
- ファジィ単語マッチング尺度(編集距離，文字N-gram距離)
- LDA
- Word2Vec距離
- 品詞と固有表現による特徴[^5]
- mirror features
- など

## グラフ構造上の特徴量

- 共通の単語数，頻度，質問1だけの質問頻度，質問2だけの質問頻度など
- Page Rank
- 次数
- 最短パス
- クリークサイズ

## ニューラルネット

- 双方向のLSTM
- 分散表現
	- 学習済みGloVe
	- part of speech embedding(品詞)
	- named entity embedding(固有表現)
	- dependency parse embedding(依存関係)[^6]
- siameseネットワーク[^3]
- Attention部分
	- Softmax Matching
	- Maxpool Matching

## その他の工夫

- 質問頻度で予測を選択的に調整

## References

[^1]: Kaggle, [Quora Question Pairs](https://www.kaggle.com/c/quora-question-pairs), 2017.
[^2]: Turkewitz, [Overview Of 3rd Place Solution](https://www.kaggle.com/c/quora-question-pairs/discussion/34288), 2017.
[^3]: Koch, [Siamese Neural Networks for One-Shot Image Recognition](http://www.cs.utoronto.ca/~gkoch/files/msc-thesis.pdf), 2015.
[^4]: [自然言語処理における自己相互情報量 (Pointwise Mutual Information, PMI)](http://camberbridge.github.io/2016/07/08/%E8%87%AA%E5%B7%B1%E7%9B%B8%E4%BA%92%E6%83%85%E5%A0%B1%E9%87%8F-Pointwise-Mutual-Information-PMI-%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/), 2016.
[^5]: Tkachenko, [Named Entity Recognition: Exploring Features](http://www.oegai.at/konvens2012/proceedings/17_tkachenko12o/17_tkachenko12o.pdf), 2012.
[^6]: [Dependency Parsing](https://web.stanford.edu/~jurafsky/slp3/14.pdf), 2017.
[^7]: ktr_skmt, [二つの文字列の類似度](http://d.hatena.ne.jp/ktr_skmt/20111214/1323835913), 2011.
Raspberry Pi3のSense HATをNode-REDでLチカさせる

# はじめに
Raspberry Pi3用のアドオンボードSense HATは、3Dジャイロ、加速度、磁力、温度、気圧、湿度の６センサーと8x8 RGB LEDマトリクス、5ボタンジョイスティックを搭載しています。

Raspberry Pi3のOSであるRaspbianにはNode-REDが搭載されています。RaspbianのNode-REDはSense HAT用のノードが登録されています。これを用いれば簡単にSense HATとの入出力を制御できそうです。まずは手始めにLチカからやってみます。

IoTの環境は以下の通りです。

| 環境 | バージョン |
|---|---|
| デバイス | Raspberry Pi 3 Model B |
| OS | Raspbian Stretch(September 2017) |
| センサー | Sense HAT |
| node.js | v6.11.3 |
| NodeRED | v0.17.5 |

#Raspberry Pi3でNode-REDを起動する
Raspberry Piのスタートボタンから、「プログラミング」->「Node-RED」で実行できます。
Node-REDはデフォルトで1880番ポートで動作するため、ブラウザでhttp\://[RaspberryPiのIPアドレス]:1880/にアクセスすれば、Node-REDのエディタが表示されます。

#さっそくLEDを点灯させてみよう
Node-REDを使ってSense HATのLEDを点灯させることは非常に簡単です。

入力ノードの「inject」とRaspberryPiノードの「Sense HAT」を配置して入出力を結合します。
![SenseHAT_LED_01.png](https://qiita-image-store.s3.amazonaws.com/0/187299/73e8bdc6-830a-171b-47e3-93e1e80abeb6.png)

「Sense HAT」ノードのペイロードを文字列に変更して、"Hello,World"を入力します。
![SenseHAT_LED_SimpleMessage_02.png](https://qiita-image-store.s3.amazonaws.com/0/187299/9f406171-4b8a-e0ec-09db-dec4debf45a9.png)


デプロイして、入力ノードのボタンを押下します。
![SenseHAT_LED_SimpleMessage_03.png](https://qiita-image-store.s3.amazonaws.com/0/187299/02d70db6-b8e2-9908-6c7e-40d6f9748c2f.png)

"Hello,World"という白色の文字列がスクロールしてLEDに表示されます。
![LED_HW.gif](https://qiita-image-store.s3.amazonaws.com/0/187299/a2ff8b3c-d1df-1129-4075-fa08faff0ba9.gif)

文字色を変えたい場合は入力値のmsgにcolorプロパティを追加し、HTMLカラー名、RGB、HEXなどで色を指定すればOKです。

![SenseHAT_LED_SimpleMessage_04.png](https://qiita-image-store.s3.amazonaws.com/0/187299/082f89c6-d766-8e8f-489a-2e33a5acaf20.png)

#座標指定でも点灯できます
SenseHATノードの入力に渡すmsg.payloadに、x座標,y座標,色というフォーマットの文字列を渡すと、指定した座標のLEDを任意の色に点灯することができます。
以下のようにカンマ区切りで複数の点灯をまとめて設定できます。座標はハイフンで範囲指定できます。

```
0-1,0-1,white,3-4,0-1,#FF69B4,6-7,0-1,#FFFF00,
0-1,3-4,#FFA500,3-4,3-4,blue,6-7,3-4,#FFB6C1,
0-1,6-7,#00FF00,3-4,6-7,red,6-7,6-7,#EE82EE
```
![SenseHAT_LED_coordinate_01.png](https://qiita-image-store.s3.amazonaws.com/0/187299/8e3d9f26-0849-cf83-b450-e3c8001e9da8.png)

#おわりに
このように、Node-REDを使えば簡単にSense HATでLチカできます。センサーや外部サービスと連携し、それらの状態をLEDで通知することも簡単にできそうです。
Powershell 指定したフォルダのすべてのJpegファイルの作成日時、更新日時、最終アクセス日時を撮影日時にする

#スクリプト

```powershell:GetPhotoTakenAndSetTimeStampLoop.ps1
#Set-ExecutionPolicy RemoteSigned -Scope Process -Force
$vbCrLf = "`n"
[void][System.Reflection.Assembly]::Load("Microsoft.VisualBasic, Version=8.0.0.0, Culture=Neutral, PublicKeyToken=b03f5f7f11d50a3a")

$provider = New-Object Microsoft.VisualBasic.VBCodeProvider
$params = New-Object System.CodeDom.Compiler.CompilerParameters
$refs = `
"System.dll","Microsoft.VisualBasic.dll","System.Data.DLL", `
"System.management.dll","System.DirectoryServices.dll"
$params.ReferencedAssemblies.AddRange($refs)
$input = [Microsoft.VisualBasic.Interaction]::InputBox("変換したいファイルのあるフォルダ名を入寮してください。例 C:\hoge\", "Visual Basic関数")
if( -not (test-path $input)){Break} #フォルダがなければ終了する
$files = Get-ChildItem $input -recurse -include *.jpg, *.Jpeg, *.JPEG, *.JPG #拡張子をJpegに指定、-recurseでサブフォルダまでファイルを列挙するよう指定
foreach($objfile in $files){
[string]$sFileName = $objfile.FullName
#GetTakenData($objfile)
Get-ExifData($sFileName)
Function Get-ExifData([string]$sFileName)
{
[Reflection.Assembly]::LoadFile('C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Drawing.dll') | Out-Null
# [Reflection.Assembly]::LoadFile('C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll') | Out-Null
$image = New-Object System.Drawing.Bitmap -ArgumentList $sFileName
try {
$DTCT=(Get-ItemProperty $sFileName).CreationTime
$DTMD=(Get-ItemProperty $sFileName).LastWriteTime
$DTAC=(Get-ItemProperty $sFileName).LastAccessTime
$takenData = GetTakenData($image)
if ($takenData -eq $null) {
return $null
}
$takenValue = [System.Text.Encoding]::Default.GetString($takenData, 0, $takenData.Length - 1)
$taken = [DateTime]::ParseExact($takenValue, 'yyyy:MM:dd HH:mm:ss', $null).ToString("yyyy/MM/dd HH:mm:ss",[System.Globalization.CultureInfo]::InvariantCulture)

return $taken
}
finally {
$image.Dispose()
(get-ItemProperty $sFileName).set_Creationtime($taken) #作成日時
(get-ItemProperty $sFileName).set_LastWritetime($taken) #更新日時
(get-ItemProperty $sFileName).set_lastaccessTime($taken) #最終アクセス日時
}
}

}

function GetTakenData([object]$image) {
try {
return $image.GetPropertyItem(36867).Value
}
catch {
return $null
}
}
```

#使用方法
すべてのプログラム> W の項目から、Windows　Powershell ＞PowershellISEを起動し、コピペする（32/64どちらでもよい）
このスクリプトをGetPhotoTakenAndSetTimeStampLoop.ps1として保存する。
Set-Exe...をいれる（そのために1行目に用意）
ファイルの拡張子はJpeg形式、そしてサブフォルダまで検索して列挙するようになっている。 -recurseオプションの部分。

作成日時、更新日時のうち変えたくないものは削除するか行頭にナンバー記号　#　をつけて注釈にして無効化するとよい。

#注意
撮影日時の取得は簡単な方法によっているのでWindowsがバージョンアップすると変わるかもしれない。
Go で TCPプロキシを作る

Goの勉強として、TCPプロキシを作りました。
任意のTCP接続の間にはさまって、通信ログを取ったりできます。

このようなイメージです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/10713/cfee1a3c-6524-1a2e-d850-70d05863e448.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/10713/6d78a025-52cb-3383-c78a-b768d88a5fc1.png)

## 構成要素


1. TCP接続を受け入れる
- 受け入れ後、本物のサーバーにつなぐ
- その後は 受け入れたSocketと本物のサーバーを双方向にリレーする

## TCP接続受け入れ
まずは外部からのTCP接続を受け入れる部分を作ります。
普通にTCPサーバーを作るときと同様です。

新しい接続がきたら handleConn 関数を goroutine で実行することで複数の接続を受け入れ可能にしています。

handleConn の中身はこの後に記述していきます。

```go
type Server struct {}

func (s *Server) Start(listenAddr *net.TCPAddr) error {
	lt, err := net.ListenTCP("tcp", listenAddr)
	if err != nil {
		return err
	}
	defer lt.Close()

	for {
		conn, err := lt.AcceptTCP()
		if err != nil {
			return err
		}
		go s.handleConn(conn)
	}
}

func (s *Server) handleConn(c *net.TCPConn) {
	...
}
```

## 受け入れ後の双方向リレー

クライアントから接続したあとは、本物のサーバーへ接続して、
クライアントとサーバーの通信内容をリレー（双方向につなげる）します。

双方向ということは、

- クライアント→サーバー
- サーバー→クライアント

の2方向なので、2つの goroutine を並列させて行います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/10713/9b2639db-40b0-aa50-6dea-d896eb2b3824.png)

```go
func (s *Server) handleConn(c *net.TCPConn) {
	defer c.Close()

	// 何らかの方法で本物のサーバーのアドレスを取得しておく
	serverAddr := ....

	// 本物のサーバーへ接続
	serverConn, err := net.DialTCP("tcp", nil, serverAddr)
	if err != nil {
		return err
	}
	defer serverConn.Close()

	// 双方向のリレーを作る
	p := &Proxy{}
	p.Start(c, serverConn)
}

// プロキシ本体
type Proxy struct{}

// プロキシの開始（双方向リレー開始）
func (p *Proxy) Start(clientConn, serverConn) error {
	defer clientConn.Close()
	defer serverConn.Close()

	var eg errGroup.Group

	eg.Go(func() error { return p.relay(&eg, clientConn, serverConn) })
	eg.Go(func() error { return p.relay(&eg, serverConn, clientConn) })

	// wait for stop
	return eg.Wait()
}

const (
	BUFFER_SIZE = 0xFFFF
)

// fromConn -> toConn へ通信内容をリレーする
func (p *Proxy) relay(eg *errGroup.Group, fromConn, toConn *net.TCPConn) error {
	buff := make([]byte, BUFFER_SIZE)
	for {
		n, err := fromConn.Read(buff)
		if err != nil {
			return err
		}
		b := buff[:n]

		// ここでログなどを取ることができる

		n, err = toConn.Write(b)
		if err != nil {
			return err
		}
	}
}
```

## まとめ

- サーバー部分とリレー部分で分けて考えるとわかりやすい
- goroutineをまたぐ通知は channel をつかう
- 複数のgoroutineの待機をしたい場合は [sync.WaitGroup](https://golang.org/pkg/sync/#WaitGroup) や [errGroup.Group](https://godoc.org/golang.org/x/sync/errgroup) を使うと良い（キャンセルなどもしたい場合は、context を使う？）

## 参考にしたページ

- [Simple TCP proxy in Golang](https://gist.github.com/vmihailenco/1380352)
Minecraft 1.12 上で ComputerCraft

# ComputerCraft 1.80pr0-build21

1.12 で ComputerCraft が動く
SquidDev-CC に感謝

https://cc.crzd.me/maven/dan200/computercraft/ComputerCraft-SquidDev-CC-ComputerCraft-feature-minecraft-1.12.2/1.80pr0-build21/ComputerCraft-SquidDev-CC-ComputerCraft-feature-minecraft-1.12.2-1.80pr0-build21.jar

## ComputerCraft + LuaRocks

ComputerCraft 上でも LuaRocks が使える
SquidDev-CC ありがとう

pastebin run LYAxmSby get 6ced21eb437a776444aacef4d597c0f7/bsrocks.min.lua bsrocks
身近で使えそうなワンライン

## ファイル探索 ##
カレントディレクトリからシンボリックリングを抽出。

```
ls -la | grep '^l'
```

逆に、パターン不一致のものを得るには、`v`オプションを使います。
シンボリックリンク以外の一覧を得るには、次のようにします。

```
ls -la | grep -vE '^l'
```

## 文字列探索 ##
あるディレクトリ以下の全.mdファイルから、特定の文字列とその周辺の行を探索
@jiro4989 さんからコメントして頂いたワンラインを、各ファイルの境界がわかるように少し加工してみました。
(表示されるパスが長いので、ファイル名のみ表示するように変更しました。)

```
find target/dir | grep -E ".md$" | xargs -J % grep "tips" % -3 | sed 's/.*\///g' | sed 's/\(\.md\)[-:]/\1  /g' | less -N
```

## 文字列置換 ##
以下は、カレントディレクトリ内の全texファイルの句読点をカンマとピリオドに置換します。

```
for file in *.tex; do sed -ie 's/\。/./g' $file; sed -ie 's/、/,/g' $file; done
```
逆の置換を行う際は、小数点が句点に置換されないように注意する必要があります。

## 不要ファイル削除 ##
以下は.texファイルと生成物のpdf以外をすべて削除します。
ディレクトリは対象外にしてあります。

```
find . -type f | grep -vE 'tex|pdf' | xargs rm
```

.DS_Storeを再帰的に削除

```
find . -name \.DS_Store | xargs rm
```


## rbenvでrubyの最新バージョンをインストール ##

```
rbenv install -l | grep -v - | tail -1 | xargs rbenv install
```

## pythonのモジュールを一括アップデート ##

```
pip freeze | cut -d = -f 1 | xargs pip install -U
```

## brewでパッケージ一括アップデート ##

```
brew list | xargs brew upgrade
```

## htmlタグの除去 ##

```
cat target.html | sed -e 's/<[^>]*>//g'
```

## gitで必要なブランチ以外を一掃する
masterブランチ以外のブランチを削除する例です。

```
git branch | grep -v master | xargs git branch -d
```

## カレントディレクトリに存在する全ファイルを拡張子ごとに分類 ##
[joを使ってファイル一覧のJSONをつくる](https://qiita.com/arabian9ts/items/41c5e7bff68d16def85c)
JSON形式にするために、joというコマンドを使用しています。

```
for type in $(ls -F | grep -v / | grep -oE '\..*' | sort | uniq);do echo $type=$(ls *$type | awk '{print $0,"=",$0}' | jo);done | jo -p
```

## Yahoo!天気予報をシェルで ##
[Linuxコマンドで天気予報を取得&表示するワンライン(on Mac)](https://qiita.com/arabian9ts/items/6d4c0f3ede699598ce75)

```
curl -s https://weather.yahoo.co.jp/weather/jp/40/8210/40133/8100001.html | tr '\n' ' ' | sed -e 's/<[^>]*>//g' | grep -oE ' - [0-9].*明日' | tr ' ' '\n' | grep -v '^$' | head -47 | tr '\n' '\t' | awk '{sub("時刻", "\n時刻 ");sub("天気", "\n天気 ");sub("気温（℃）", "\n気温（℃）");sub("湿度（％）", "\n湿度（％）");sub("降水量（mm/h）", "\n降水量（mm/h）");print}'
```


# おわりに #
macOSでのみ実行確認をしています。
他に便利そうなワンラインやリクエストがあったらコメントください。
Excelで「@」を文字として入力したい！

#概要

ExcelでJUnitの資料を作成しようとして、アノテーションの@の入力で詰まってしまったのでやり方を調べました。

#そのまま入力できない理由

「@」を先頭に入力すると、Excelのセル内では関数と見なされてしまいます。

#解決方法

Shiftキー+「'」を入力後、「@」を入力すると関数ではなく文字列として扱われます。
TypeScriptのArray#filterでType Guard(Like Smart Cast)する

# 普通に書く
```ts
let arr1:(number|string)[]=['a','b','c',1,2,3];
let arr2=arr1.filter(x=>typeof x==='string');
```
arr2にはstringしか入ってないはずなのに型は(number|string)[]になってしまいます。

# 型ガード
```ts
let arr2 = arr1.filter<string>((x): x is string => typeof x === 'string');
```
これでarr2はstring[]になります。

# 注意
```ts
let arr2=arr1.filter<number>((x): x is number => typeof x === 'string');
```
このような事をしてもコンパイルエラーにはなりません。
arr2の実際の型はstring[]なのにTypeScriptはnumber[]と認識します。
キャストと同じように危険な操作なので注意しましょう。

# 他のライブラリ
immutable.jsやrxjsでも似たような事を出来ます。
epc

# PGW(on epc)のHighAvailabilityについて
SGWとPGWのLayer2接続において、PGW側のエラー発生について考察する
この時、発生する障害には、次の二つが考えられ、これらのソリューションを定義した

+ PGWモジュール障害
+ mysqlデータベース障害

## 前提条件
前提として、PGW ControlPlaneは、ホストプロトコルスタック上に実装した一般的なBSD-Socketアプリケーションであり、例えば、CPU[10-14]の各コアに割り当てる
PGW DataPlaneは、netmap/dpdk等で実装したプロトコルスタックを介さない高速パケットプロセッシングアプリケーションであり、例えば一つのNIC-ringをCPU[28]に割り当てる

また、ControlPlaneとDataPlane間はデータ共有が必要であり、CPUコア間（スレッド共有）データは非ロック（mutex、semaphoreの同期waitを利用しないデータ同期プロトコル）データ共有とする[^1]

また、コア間データ共有には、http://qiita.com/l2nw/items/c0f7c5bb572cad31da3c
PGWシステム特性に特化した二面ロックフリー構造とする

## PGWモジュール障害
今回設計したPGWモジュールは、ControlPlaneとDataPlaneを１モジュールとしているので、PGWモジュール自体はエラー発生時にプロセスダウンさせることで（具体的には、例外をスローしてプロセスを終了させている）、SGWが別PGWグループに再接続することでfailoverが実現できる

## mysqlデータベース障害
mysql（筐体故障を含む）データベース障害発生時には、主に２パターンが考えられる

+ マスターデータベース障害
+ スレーブデータベース障害（マスター、スレーブ間接続障害含む）

## mysqlに注目した正常動作時イメージ

![w0120.png](https://qiita-image-store.s3.amazonaws.com/0/165490/a8237a48-2a42-06c8-5820-37a4cbf31ce9.png)

## 障害発生時（パターンA）
![w0122.png](https://qiita-image-store.s3.amazonaws.com/0/165490/c73dc4ff-5dde-b3fc-3d15-aa65525de23c.png)

パターンAは、PGWモジュールと、mysqlマスターデータベース間に何らかのエラーが発生し、その復旧には、mysqlへの再接続を必要とするパターンを表す
このケースでは、エラーを検知したPGWモジュールがサービス停止することにより、gtpv2プロトコルによって、SGWがバックアップPGWへ再接続する

## 障害発生時（パターンB）
![w0123.png](https://qiita-image-store.s3.amazonaws.com/0/165490/9dbd1fb7-c668-7f13-0350-14f21ed6206d.png)

パターンBは、定期的なSHOW SLAVE STATUSと、エラー判定を契機として、ステータス管理テーブルにactive=0(非アクティブ：GTPU-Echoに応答しない)を書き込む、その結果プライマリPGWはGTPU-Echoに応答せず、gtpv2プロトコルによって、バックアップPGWに再接続する

[^1] この例では、PGWの１パケット処理はCPUコア[28]スレッドで高速に連続実行させるため、１パケット処理毎にmutex-lock/unlock処理を行うと、高確率でContext-Switchを必要となる。40Gbps等50Mppsオーバーを必要とするパケットプロセッシングではContext-Switch発生を低く保たなければ到達できない

[^2]http://www.intel.com/content/dam/www/public/us/en/documents/white-papers/xeon-lock-scaling-analysis-paper.pdf

のロック・スケール章の記述通り、コア間をまたいだリソースはコスト高であった
実際に実装・評価してみて重要なコンフィグ、実装手法を以下に示す

+ NIC割り込み先のCPUコアをPCIEが直接接続されているコアに設定
+ ユーザランドアプリケーションの各スレッドは一つのコアで実行
+ 各スレッドは、そのコンテキスト毎にオペレーションに必要なデータ （例えばstd::map<xxxx,xxx>）を[スレッドの起動時に]インスタンシエートし、コンテキストをまたいだデータ領域は行わない）
+ ミューテクス、セマフォ等の同期オブジェクトが必要な処理としない
+ 広帯域でインスタンス化する変数を配列の形式で宣言しない(optimizeレベルで大きなパフォーマンス差異が発生する、CPU L2キャッシュを汚染）
WordPressのテーマをどうするかを考える

KUSANAGI on ConoHaでサーバー環境はイイ感じで構築できた。

- [KUSANAGI on ConoHa にチャレンジしているところのリンク集と考慮点のまとめ - Qiita](http://qiita.com/yamazaki/items/d40774529b206075fab9)
- [KUSANAGI on ConoHa セットアップ #1 サーバー設定編 - Qiita](http://qiita.com/yamazaki/items/190f4bac2d4c5e504d10)
- [KUSANAGI on ConoHa セットアップ #2 KUSANAGI&WordPress設定編 - Qiita](http://qiita.com/yamazaki/items/5483ec464ab726bc7ab1)

っで、これから本格的にWordPressを使っていきたいわけだけれど、テーマ(サイトの見た目)をどうするかで悩んでます。

クリッピングや記事を書くことに集中したいのでテーマを考えることがメインではないけれど、カスタマイズしたくなる気持ちもアリ〜ので... なかなか本格的にブログ生活がスタートできないw (本末転倒)

ということで、いくらか調べたことをココにメモして、頭の中を整理したいと思います。

# 有償のテーマ

兎にも角にも、まず初めにやったことはGoogle検索。
最初のキーワードは、「WordPress SEO テーマ」だったかな...

ブロガーだのアフィリエイターだのが数多いるので、この手のことを記事にしているところが多いこと...

有償だと最近は、以下のあたりがよく使われているっぽい、というか検索によくヒットする。

 1. [ストーク](https://px.a8.net/svt/ejp?a8mat=2TR4RF+33C2WI+3PSE+626XU)[](https://www11.a8.net/0.gif?a8mat=2TR4RF+33C2WI+3PSE+626XU)
 2. [STINGER PRO](https://www.infotop.jp/click.php?aid=347787&iid=71807)
 3. [AFFINGER4](https://www.infotop.jp/click.php?aid=347787&iid=68939)

上記のテーマを色々見たけれどなんか惹かれないw

これらを使ったサイトを見ると、どれも同じようにしか見えないし、見やすくもない。
もっとシンプルでイイ。

SEO対策がされていたり、管理画面からの設定でレイアウトやデザインを変更できるのは魅力的だけれど、なんか、「これじゃない感」がとてもした。

# WordPressのSEO対策

っで、やりたいことはSEOというか、本来あるべき掲示した情報を適切に検索エンジンに拾ってもらうためのウェブサイトのお作法的なことなので、それって自分でやれよな、ということで、WordPressでSEOのお作法について少し調べた。

以下のあたりに、参考になりそうな情報がまとまっていた。

- [WordPressのSEOを強化する！プロが教える7つの設定](https://www.cpi.ad.jp/column/column04/)
- [【SEO対策】WordPressのSEOを強化したい人が、まず試すべき基本設定10選｜MFクラウド 公式ブログ](https://biz.moneyforward.com/blog/business-hack/wordpress-seo-10/)
- [Wordpress（ワードプレス)のseo対策で、おすすめのプラグイン、テーマ・テンプレートと、やっておくべ設定](http://viral-community.com/seo/wordpress-seo-5212/)
- [【2017年4月最新】WordPress ブログを始めたら、導入すべきプラグイン 18選](https://tajuso.com/wordpress_plugin)
- [WordPressのおすすめプラグインは８つだけ。断言します](https://manablog.org/wordpress-plugin/)

# WordPressとBootstrap

ただ、ゼロからテーマを作成するのは、ちと大変だなぁ... とも思っていて...
基本的なところはアリ物でカバーできたら良いなぁ〜なんて思っちゃったりもしている。

で、無料のテーマを調べている時に、Bootstrapに対応しているテーマというのが、いくつか見つかり、なんだか、「これが良さそう」という直感が働き、少し深掘り。

直感を具体的に書くと、Bootstrapは、アレが出始めたことからプログラミングを現場でやらなくなってしまったので、経験値が少ないんだけど、そのあたりのキャッチアップにもなりそう、という感じがしている。

今の所、以下がイイんじゃないかと思っている。

- [Lightning - シンプルでカスタマイズしやすいBootstrapベースのWordPress公式テーマ - | ビジネスサイトにもブログにも最適。Bootstrapベースでカスタマイズも簡単！](https://lightning.nagoya/ja/)

上のLightningテーマを見つけるまでに参考にしたページ

- [【全部無料】BootstrapベースのWordPressのテーマ10選 | 侍エンジニア塾ブログ | プログラミング入門者向け学習情報サイト](http://www.sejuku.net/blog/7807)
- [bootstrap — 無料の WordPress テーマ](https://ja.wordpress.org/themes/search/bootstrap/)
- [WordPressのカスタマイズしやすいのBootStrapベースのスターターテーマ – Cntlog](https://blog.cntlog.net/?p=2072)
- [Bootstrap3でWordPressテーマを作成するのは悪なのか？ | 「売り上げをあげる方法」を研究するブログ](https://goodsystem.jp/wordpress/wordpress-21051216.html)
- [Bootstrapだけじゃない！おすすめCSSフレームワーク6選まとめ！ | クラウドット株式会社](http://www.cloudot.co.jp/blog/4124/)
- [頼りすぎ注意！便利なBootstrapの隠れたデメリット](http://cozaru.net/bootstrap-demerit/)

そんなわけで、Lightningあたりを少し試してみて、そのままいけるか判断しようと思います。
TypeScriptで型のオーバーライドをしたい

# spread operator
```ts
interface Tweet{
  id:string;
  user:string;
  body:string;
}

//tweetはTweet型、userはUser型とする
let tw={...tweet,...{user:user}};
```
この時の変数twの型を定義したい時どうしますか？
素直に書いてみましょう

```ts
interface Tweet2{
  id:string;
  user:User;
  body:string;
}
```

面倒ですね。プロパティが増えるともっと大変です。

# typelevel-ts
typelevel-tsという便利なライブラリがあります。
このライブラリを使うとこう書けます。

```ts
import {ObjectOverwrite} from 'typelevel-ts';
type Tweet2=ObjectOverwrite<Tweet,{user:User}>;
```
これだけです。

# 他のライブラリ
* type-zoo
* typical

というライブラリもあります。

# 中身を読んでみる
Conditional Types追加以前のこのライブラリは内部でかなり複雑な事をしていてそんな簡単に読めるものじゃなかったのですが、今はかなり読みやすくなりました。
Conditional Typesの勉強にもおすすめです。
https://github.com/gcanti/typelevel-ts/blob/master/src/index.ts
Visual StudioからGitHubを使う

Visual Studio 2017 CommunityからGitを使う

##git-hubのリポジトリからプロジェクトを作成
「clone」機能を使ってgit-hubからダウンロードする。
「https://github.com/<ユーザー名>/<リポジトリ名>」を開いて、「Clone or download」という緑色のボタンから、「Download ZIP」を選択する。

###ZIPを展開したら日本語が文字化けした場合
原因は、「githun側がUTF-8でエンコードし、Windows側がCP932でデコードするため」だと思われる。とりあえず「7-Zip」を使えば、文字化けしないで展開できた。

##ソリューションをgithubにコミット

１．ソリューションをソース管理に追加
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187121/92f468fe-228d-4276-2f4a-5a010586aa08.png)

２．チームエクスプローラ画面から[ホーム]-[設定]を選択。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187121/c110fd44-b2c2-0469-200c-ef842edf52dd.png)

３．[git]-[グローバル設定]を選択。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187121/75f1d945-34f4-75b3-6bc8-27ef61605dc5.png)

４．同期してプッシュ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187121/e492844e-781d-bb87-4f19-c4933d6216c8.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187121/2d637e07-c371-3744-b602-312b6e75071f.png)

###プッシュでエラーになる場合は
リモートoriginの編集で、
https://<ユーザー名>:<パスワード>@github.com/<ユーザー名>/<リポジトリ名>.git
になっているかを確認する。

##githubからリポジトリを削除
１．[Settings]から[Repositories]を選択し、リポジトリの一覧に遷移する。
２．削除したいリポジトリを選択し、リポジトリのページに遷移する。
３．「Settings」タブを選択。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187121/3fc5a9a5-9456-7f84-5860-f3ae11a945cf.png)
４．画面下部のDanger Zoneから「Delete this repository」ボタンをクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187121/6ae9083a-d4fc-e9c2-eb57-401219b0edb7.png)
５．「Are you ABSOLUTELY sure?」画面が表示されるので、リポジトリ名を入力して完了。
[C/C++] ポインタと配列メモ

私が
いつも考えることは基本に充実。
基本的なものをお大事に。:pizza:

#配列

1. arry[i] == *(arry + i)
2. arry[i] == *(i + arry)
3. **[]** は つまり[operator](https://en.wikipedia.org/wiki/Operator_(computer_programming))(オペレーター)になる。
4. **arry**と**i**は[operand](https://en.wikipedia.org/wiki/Operand)(オペランド)になる。

#EX

### :pizza:問題:pizza:

2[arry]は？

### :pizza:答え:pizza:
2[arry] == arry[2] == *(arry + 2) == *(2 + arry)
Mac で mysql-simple を cabal install するときにハマった

依存ライブラリである pcre-light のインストール時に`pcre.h`が無いと怒られる

<https://github.com/bos/mysql-simple/issues/15>

##対処法
まずは`pcre.h`をいれる

```bash
brew install pcre
```

次にcabalにpcreが入ってる場所を指定して cabal install する

```bash
$ cabal install mysql-simple --extra-include-dirs=/usr/local/include/
```

これで正常に入った
railsnewする時の初期設定

# この記事の目的

rails newする時にやることのチェックリスト

# rails new

```rails new アプリ名```

# git

https://qiita.com/you8/items/f91289d0f337f3244cd1

## bitbucketの設定

* bitbucketの画面でレポジトリ作成
* httpsのURLを用い
* ```git remote add origin https://[ユーザ名]@bitbucket.org/[ユーザ名]/[リポジトリ名].git```
Pythonで入力ファイルの文字列をフォルダから選べるようにする

###はじめに
　pythonでデータ分析してるときに、バッチ処理する前の適当に試行錯誤したい時に、いちいちファイル名を打ち込みなおすのが面倒なので、入力がファイル必要な時にフォルダを呼び出してくれる関数を作りました。
###環境
・Windows8
・Python3.6
・anaconda4.4.0
・下記サイトを参考にwxPythonをインストール
[Python] GUIアプリケーション作成ツールwxpython[準備編]
>http://qiita.com/Kodaira_/items/c073ddc400309d871150

###プログラム
　wxPythonを使うとこんな感じで書けます。クラスを宣言して、getfilenameを使用すると、getfilenameのたびにフォルダが開いてくれます。関数の返り値としても使えますし、クラスの要素である.nameにも格納するようにしました。

```
#!/usr/bin/env python
# coding:UTF-8
import wx

class FindFile():
    def getfilename(self):
        app = wx.App()
        dialog = wx.FileDialog(None, u'ファイルを選択してください')
        dialog.ShowModal()
        self.name = dialog.GetPath()
        return(dialog.GetPath())

if __name__ == "__main__":

    f = FindFile()
    f_ = f.getfilename()
    print('取得したファイルの名前は、',f.name,f_)
```

画像処理とかで、試行錯誤の時に使えそうですね。
WEBサイトの非機能要件を確認するためのサービスやツールの紹介

# 概要
WEBサイトの非機能要件を確認するためのサービスやツールを調べてみましたので、それぞれ概要の概要を紹介します。
# 内容
## ベンチマーク
### WebPagetest（WEBサービス）
[公式](http://www.webpagetest.org/)
URLを入力するだけでお手軽にWEBサイトの速度スコアを計測してくれます。
下記 ５ 項目を A 〜 F で評価されます。

- First Byte Time （リクエスからレスポンスまでの時間）
- Keep-alive Enabled （接続維持設定）
- Compress Transfer （画像、動画以外の圧縮）
- Compress Images （画像、動作データの圧縮）
- Cache static content （キャッシュ利用）

![スクリーンショット 2017-09-10 15.52.46.png](https://qiita-image-store.s3.amazonaws.com/0/132495/6d235ff9-ef9b-48af-cd01-9df7a8276a34.png)

### TestMySite（WEBサービス）
[公式](https://testmysite.withgoogle.com/intl/ja-jp)
Googleが提供しているサービスで、モバイルサイトの速度のテストができます。
同業界内のサイトとの速度比較や、改善のための修正点を教えてくれます。

![スクリーンショット 2017-09-10 15.53.00.png](https://qiita-image-store.s3.amazonaws.com/0/132495/44e8255f-ee78-587e-3f14-b02955a9757f.png)

## 負荷テスト
### JMeter（ツール）
[公式サイト](http://jmeter.apache.org/)
負荷テストツールといえばこれ!!と言っても過言ではないほど有名無料のツールです。
Javaでできているので、どのプラットフォームでも動作します。
細かな設定が可能で、負荷テストで必要な機能は、ほぼ完璧に網羅されています。

![スクリーンショット 2017-09-10 15.53.13.png](https://qiita-image-store.s3.amazonaws.com/0/132495/2dc40fb3-c9f3-e8f8-31e2-da1059916e2d.png)

### Load Impact（WEBサービス）
[公式サイト](https://loadimpact.com/)
WEBサービスであるため、項目を入力するだけで簡単に負荷テストが実行できます。
同時接続、実行時間以外に、アクセス元のリージョンを設定することができます。　
結果は下記のようなグラフで確認することができます。

**無料枠は下記の制限があり、利用に応じた月額費用が発生します。**

- 同時接続数: 50
- テスト回数: 5回 / month

![スクリーンショット 2017-09-10 15.53.24.png](https://qiita-image-store.s3.amazonaws.com/0/132495/4fe23f0f-f36e-d842-645c-de0e199912c5.png)

## 脆弱性
### OWASP ZAP(ツール）
[公式](https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project)
IPAで紹介された脆弱性診断ツールです。
SQLインジェクションなど、意図しないデータベースアクセスやサーバ処理が実行される可能性を検出してくれます。
GUIで操作が可能なことと、一部日本語化がされているため簡易に導入が可能です。

![スクリーンショット 2017-09-10 15.53.41.png](https://qiita-image-store.s3.amazonaws.com/0/132495/df3eb009-82e0-fb20-0f8a-bc7ed850a81a.png)

### skipfish（ツール）
[公式](https://code.google.com/archive/p/skipfish/)
Googleが開発した脆弱性診断ツールです。
こちらも、SQLインジェクションなど、意図しないデータベースアクセスやサーバ処理が実行される可能性を検出してくれます。

![スクリーンショット 2017-09-10 15.54.26.png](https://qiita-image-store.s3.amazonaws.com/0/132495/14aabd79-5236-6531-3be1-061bec2aca9c.png)
【Rails】モデル定義書(csv)からモデルとマイグレーションのコードを自動生成

プログラマの中には、「ソースコードがきちんとリーダブルに書かれていれば設計書など必要ない。ソースコードそのものが設計書なのだ」 という考え方があります。以下のような考え方です。


>「設計書」通りに作れば OK、が実践できている場合
>現実的にそんなことはあり得ないと思いますが、仮にあり得たとすればしかし、単純に無駄です。「設計書」を書く労力でソースコードを書けばいいのです。そんなことをいうと、それを書いた人がいなくなったらどうするのか、設計書は要らないのか、と返されるかと思いますが、違います。良く書かれたソースコードなら、それを自然言語に書き下す必要はなく、ソースコードを読むだけでこと足りるはずです。
> ※ [ソースコードは設計書であり、コーディングは設計作業である](http://qiita.com/mdstoy/items/5510f94c9ed981cfbb85)から引用

私もおおむね同意見なのですが、とはいえ最近、コードしかない状況を不便だと感じることが多くなってきました。

たとえば、コードしか無いとプログラミングスキルの浅い人がそれを読み解くに時間がかかったり、正しい理解ができていなかったり。また、自分が書いたコードを後から見直しても、複数のファイルを順繰りに読んでいって全体の構造を理解するのが大変…と、このような課題があることがわかりました。

※ソースコードが読めないということではなく、アプリの構造を理解していくのに労力が要るということです。したがって、仮に自然言語でプログラミングされていても、その構造を把握するための労力は同じようにかかると思います。

つまり、設計書にも、構造を一目でわかるようにしたり、スキルの浅い人の理解を助ける役割はあると思いました。

そこで、Railsのモデル定義書(csv)からモデルとマイグレーションのコードを自動生成できるようにしました。(`rails g`でよくね？と思ったら負け)
https://github.com/hirokoma/generate_rails_model_and_migrate

こんな感じ↓の定義書をcsv形式で書けば、その通りのモデルとマイグレーションができあがります。
![ss 2017-09-10 15.10.17.png](https://qiita-image-store.s3.amazonaws.com/0/80357/a3b6e4f4-7d3e-326d-72a8-ab08c6ca06dd.png)

これで、プログラマはモデル定義書を書くだけで、プログラミングをしたことと同義になります。コードは自動生成されるので、必ず設計書通りになります。また、後から見直したときに、いくつものコードを読み解く必要はなく、この定義書を見れば構造が一目でわかります。

まだ、あくまで自分が使えればいいや的なノリで最低限必要な機能しかないですが、今後、機能拡大して一般の人でも難なく使えるように整備したら改めて記事を書こうと思います★
VerilogのテストベンチをRubyで書けるようにした(Verilator + SWIG風味)

　みなさん、Verilog やってますか？　私も最近DNNの計算をFPGAでやりたくなり、押入れの中でホコリをかぶっていた Altera DE0 (nanoじゃないやつ) を引っ張り出してきました。

##動機・経緯

　Linux で Quartus II と ModelSim を動かし、Lチカと4bit×4bitの乗算器くらい作ったところで、テストベンチ(ソフト開発で言うユニットテストみたいなやつ)を Verilog で書くのがかったるくなってきました。回路の記述は Verilog でいいとしても、テストくらいは好きな言語で書きたいよね、でもそんな方法あるのか？などと思い始めたのが５日前(2017.9.5)。

　Google先生に尋ねたところ、「[Verilator](https://www.veripool.org/projects/verilator/wiki/Intro) というやつを使うと VerilogをC++に翻訳して、激速でシミュレーションできるらしい」ということがわかりました。ただし、テストベンチは C++ で書く必要があります。

　じゃーその生成されたC++を wrap して Ruby に 組み込めばいいんじゃね？と思いついたのも５日前。しかしながら、当方 SWIG も C++ も経験ない。。。CのライブラリをRubyに組み込んだことはありますけど。まあ勉強と思ってやってみっか、と決心しました。

　でまあ、仕事しながら調べては書き、試し、などしているうちに、どうやら所望のことができるようになったのが昨日。Rakeにするかextconf.rbベースにするか悩みつつ、結局 extconf.rb 崩れのようなコードになったのが今日。

　コード公開するなら github だべ、ということで初めて公開リポジトリ作ってみました。

## できたよー！

　つうわけで恥ずかしながらコード晒します。

　https://github.com/sin00b/VerilatorGen.rb

　コードってもRubyスクリプトがひとつだけです。中には SWIG のテンプレートがヒアドキュメントで入ってたりして、結構赤面モノですが、「美しいが動かないコードより、汚くても動くコード」ということで勘弁してください。

　サンプル的な使い方は README に書きましたので、それ見てもらえればわかると思いますが、Rubyで書いたテストベンチの例と実行結果を挙げておきます。fooはクロックの立ち上がりで1ずつインクリメントし、goo1は初期値を1として2倍していくカウンタです。内部レジスタは両方barという名前です。そこそこ直感的に書けていると思いますがどうでしょうか。

```ruby
require "./verilator"

top = Verilator::Vtest.new
(0..10).each do |i|
  clk = i % 2
  top.clk = clk
  top.eval
  puts "clk: #{clk} / top.foo.bar: #{top.foo.bar} / top.foo.goo1.bar #{top.foo.goo1.bar}"
end
```

```shell-session
$ ruby test.rb
clk: 0 / top.foo.bar: 0 / top.foo.goo1.bar 1
clk: 1 / top.foo.bar: 1 / top.foo.goo1.bar 2
clk: 0 / top.foo.bar: 1 / top.foo.goo1.bar 2
clk: 1 / top.foo.bar: 2 / top.foo.goo1.bar 4
clk: 0 / top.foo.bar: 2 / top.foo.goo1.bar 4
clk: 1 / top.foo.bar: 3 / top.foo.goo1.bar 8
clk: 0 / top.foo.bar: 3 / top.foo.goo1.bar 8
clk: 1 / top.foo.bar: 4 / top.foo.goo1.bar 16
clk: 0 / top.foo.bar: 4 / top.foo.goo1.bar 16
clk: 1 / top.foo.bar: 5 / top.foo.goo1.bar 32
clk: 0 / top.foo.bar: 5 / top.foo.goo1.bar 32
```

##言い訳

　自分で作ってて言うのもなんですが、よくわかってないところが多々あります。特に、これはVerilatorの仕様になるんでしょうが、ブロッキング代入(=)とノンブロッキング代入(<=)をどう書き分けるのかとか、全然わかってません。Verilogモジュールを解釈してクラスに変換するのはまるっきりVerilator任せですし、そのクラスをRubyから使うとこも、これまた SWIG 任せです。

　ちなみに32ビットのクロックポートが1つあり、内部レジスタでカウントする単純なカウンタのラッパーコードが1.5k行くらいになったりします。

##作ってみた感想など
　先ほども書いたようにSWIG使ってラッパー書くのは初めてで、Verilatorの仕様もC++自体もよくわかってない中でラッパーコードの正解を探るのは結構な修行でした。
　Verilator が吐くコードはコンピュータが生成してるわけですけど、それを（多少の手直しは必要とはいえ）解釈できるSWIGは賢い。
　SWIGが生成できるのはRubyはもちろん、Python、Perl、PHP、Goなど多岐にわたります。XMLを吐くオプションもありますし、ソースコードを静的解析したい、みたいな向きにも使えるんじゃないでしょうか。
　Pythonな人で興味のある方は、ハードコーディングされてる swig ソースを参照していただくといいと思います。
[覚え書きシリーズ]LinuxでソフトウェアによるRAID構成を組む際のメモ

# CentOS8.4・RockyLinux8.4・AlmaLinux8.4・MIRACLE Linux8.4でソフトウェアによるRAID構成を組む際のメモ

（当然だが作業にはルート権が必要）

## 必要パッケージを入れる
dnf install mdadm

## 構成したいディスクを初期化する
### GPTディスクとして構成
parted /dev/sdb mklabel gpt
（ディスクの分繰り返す）

### 全ての領域を使ってパーティション構成
parted /dev/sdb mkpart raid 0% 100%

### RAID用のフラグを立てる
parted /dev/sdb set 1 raid on

### RAID0を構成                          
mdadm --create /dev/md0 --level=0 --raid-devices=3 /dev/sd[bcd]1
今回は仮想マシン内で速度向上を狙ったのでRAID0、実際のハードウェアに構成する場合にはRAID5が良いと思われるがハードウェアがあるんなら素直にRAIDカードを用意してハードウェアRAIDにした方が絶対に良い。

### 構成の保存
mdadm --detail --scan >> /etc/mdadm.conf
これを忘れると再起動した後にデバイス名が変わってしまってエラいことになる。

7と違うのはyumがdnfに変わっただけで後は同じでございます。
express.jsでServer Sent Events

Server Sent Events(SSE)をexpressで扱ってみます。
SSEは何かというとだいたいweb socketみたいなものです。
ただ、SSEはサーバからクライアントへの単一方向通信であり、ただのHTTPストリーミングです。

> 伝統的に、Web ページが新たなデータを受け取るにはサーバにリクエストを送信しなければなりません。すなわち、ページがサーバからデータを要求します。Server-sent events によって、サーバが Web ページにメッセージをプッシュすることにより、サーバから Web ページへ新たなデータをいつでも送信できます。入ってくるメッセージは、Web ページ内のイベントおよびデータとして扱うことができます。
https://developer.mozilla.org/ja/docs/Server-sent_events

使い方は単純で数行で実装できます。クライアントサイドでは、`EventSource`を使うだけです。


```app.ts
import * as Express from 'express'

const app: Express.Application = Express()

const template = `
<!DOCTYPE html><html><body>
<h1>SSE Express</h1>
<script type="text/javascript">
const source = new EventSource("/events/");
source.onmessage = e => {
  console.log(JSON.parse(e.data))
  document.body.innerHTML += e.data + "<br>"
};
</script></body></html>`

const { PORT = 3000 } = process.env

let clientId = 0
let clients = {}

app.get('/', (req, res) => {
  res.send(template)
})

app.get('/events/', function(req, res) {
  req.socket.setTimeout(Number.MAX_VALUE)
  res.writeHead(200, {
    // text/event-stream を追加
    'Content-Type': 'text/event-stream',
    'Cache-Control': 'no-cache',
    Connection: 'keep-alive',
  })
  res.write('\n')
  ;(clientId => {
    clients[clientId] = res
    req.on('close', function() {
      delete clients[clientId]
    })
  })(++clientId)
})

setInterval(() => {
  const msg = Math.random()
  console.log('Clients: ' + Object.keys(clients) + ' <- ' + msg)
  for (let clientId in clients) {
    // メッセージの送信 \n\nが必要
    clients[clientId].write('data: ' + msg + '\n\n')
  }
}, 2000)

app.listen(PORT, () => {
  console.log(`listing port http://localhost:${PORT}`)
})

```

2秒ごとにブラウザにデータを送信する簡単なものです。

[![https://gyazo.com/9b3fc38d92851366c1a95a756a3cf812](https://i.gyazo.com/9b3fc38d92851366c1a95a756a3cf812.gif)](https://gyazo.com/9b3fc38d92851366c1a95a756a3cf812)

EdgeやIEでサポートされていないのが難点ですが、リアルタイム通知あたりなどを簡単に実装できるので使いみちはありそうです。
[Android Studio] buttonの配置が指定した場所にならない


# 問題
Android Studio開始初日
Buttonの場所がずっと左上になる
![before.png](https://qiita-image-store.s3.amazonaws.com/0/152224/73debf6a-493b-c7ac-ebc9-3c2242a00aa4.png "before.png")

# 解決方法
非常に簡単でした．

```xml
<Button
...
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
/>
```

この4つを指定したら，Designdで編集したレイアウトが反映されるので良かった．
![after.png](https://qiita-image-store.s3.amazonaws.com/0/152224/06021595-09e7-67c7-e330-5bfd16ceaa5b.png "after.png")

ただこの設定をすべての要素に記述しなければならないので，手間・・・
まとめて記述する方法はないんですかね・・・

# 参考文献
[teratail:Android Studio2.3でボタンの配置がズレる。](https://teratail.com/questions/70144)
Raspberry Pi3にRaspbianをインストールする

#はじめに
Raspberry Pi3にRaspbianをインストールし各種設定を行う手順を記します。いろいろ実験しては環境を作り直すことが多いので、備忘録的に手順をまとめておきます。

以下のものを使用します。

| デバイス等 |
|-----|
| Raspberry Pi3 Model B |
| Raspbian Stretch(September 2017) |
| Raspberry Pi Touch Display |
| Sense HAT |
| Raspberry Pi Camera V2 |

#SDカードにRaspianを書き込む

まずは以下のサイトからRaspbianのイメージを入手します。

http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/

続いて、Windows用のDDツールを入手し、SDカードにRaspbianのイメージを書き込みます。
[DD for Windows](http://www.si-linux.co.jp/techinfo/index.php?DDforWindows)

書き込み終わったら、Raspberry PiにSDカードを挿して起動します。

#液晶を反転させる
タッチスクリーン等を繋げている場合、液晶の上下が反転していることがあるため、その場合は上下を反転させます。

```
$ sudo vi /boot/config.txt
lcd_rotate=2

$ sudo reboot
```
#ロケール、タイムゾーン、キーボード、インタフェースの設定
RaspbianのGUIからスタートボタンから、「設定」「Raspberry Piの設定」を選択し、「システム」「インタフェース」「ローカライゼーション」の各タブで必要な設定を行います。
「インタフェース」ではSSHやカメラ、I2Cなど必要な項目を有効にしておきます。

#WiFi設定
WiFiを有効にして固定IPアドレスを割り当てます。ステルスモードのアクセスポイントにも対応します。

まずは無線LANの設定です。

```
$ sudo sh -c "wpa_passphrase [SSID] [PASSPHRASE] >> /etc/wpa_supplicant/wpa_supplicant.conf"

$ sudo vi /etc/wpa_supplicant/wpa_supplicant.conf

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=GB

network={
    ssid="home"
    #psk="password"
    psk=d04b98f48e8f8bcc15c6ae5ac050801cd6dcfd428fb5f9e65c4e16e7807340fa
    scan_ssid=1
}
```

続いて、IPアドレスの設定など。/etc/dhcpcd.confを編集します。

```
$ sudo vi /etc/dhcpcd.conf
interface wlan0
static ip_address=X.X.X.X/24
static routers=X.X.X.X
static domain_name_servers=X.X.X.X
```

終わったら再起動します。SSHを有効にしていれば、リモートからもWiFiでSSH接続可能となります。

# ソフトウェアのアップデート
ネットワークに繋がるようになったら、まずはソフトウェアのアップデートを行います。

```
$ sudo apt-get update
$ sudo apt-get dist-upgrade
$ sudo apt-get clean
```

なお、ファームウェアのアップデートは以下の通りです。

```
$ sudo apt-get install rpi-update
$ reboot
```

ファームウェアのバージョンは以下で確認できます。

```
$ vcgencmd version
Aug  8 2017 12:05:45
Copyright (c) 2012 Broadcom
version 196063438d7bb0769861c86f948ae653727adb7e (clean) (release)
```

#日本語フォントの設定
文字化けするため日本語フォントをインストールします。
Googleの[Note Sans CJK JP](https://www.google.com/get/noto/#sans-jpan)をインストールします。

[パッケージ](https://noto-website.storage.googleapis.com/pkgs/NotoSansCJKjp-hinted.zip)をダウンロードし、RaspberryPiにコピーします。

.fontsディレクトリを作成し、その中に解凍します。

RaspberryPiのスタートボタンから「設定」「Appearance Settings」を選択し、「システム」タブで「Noto Sans CJK JP」を選択します。

#日本語入力用FEPのインストール

```
sudo apt-get install uim uim-anthy
```

インストール後は半角/全角キーで切り替えられます。

#アプリケーションやドライバ等の設定
これまでで全体的な設定は完了となります。ここからは個別のアプリケーションやデバイス用の設定などを行います。

##Node-REDのバージョンアップ
各種デバイスやWeb APIの連携にNode-REDを使いたいため、最新版にバージョンアップします。

```
$ update-nodejs-and-nodered
```

##カメラモジュールの接続確認
接続しているカメラモジュールを認識しているか確認します。

```
$ vcgencmd get_camera
supported=1 detected=1
```
##Sense HATのソフトウェアインストール
2017年9月版のRaspbian StretchにはSense HATのソフトウェアは、通常は既にインストール済みですが、念のためインストール方法を記します。

```
sudo apt-get update
sudo apt-get install sense-hat
sudo reboot
```

#おわりに
以上で最低限の動作環境が整いました。
Raspberry Piは、いろいろ遊んで実験して、環境を壊してしまって作り直す・・・というトライアンドエラーを繰り返すには最適なデバイスです。環境の作り直しは毎回同じ手順となることが多いため、備忘録的に記しておきます。
gitlabでソースコード管理

#gitlabアカウント作成
〜省略〜

#project作成

![](https://i.gyazo.com/f1034f9c29286d5c51ec957a31ff8fcf.png)

# ssh key登録

![](https://i.gyazo.com/efba1b9791997221d71980a8322d737a.png)

＊sshkeyを作成後、macだと以下のコマンドで公開鍵の内容をクリップボードにコピーできます。

```
pbcopy < ~/.ssh/id_rsa.pub
```

# setup

さいごに、
「A:新しいリポジトリを作る場合」と「B:既存のフォルダがある場合」で違うので適宜

**A:新しいリポジトリを作る場合**

```
git clone git@gitlab.com:namitop/shortshortshort.git
cd shortshortshort
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master
```

**B:既存のフォルダがある場合**

```
cd existing_folder
git init
git remote add origin git@gitlab.com:namitop/shortshortshort.git
git add .
git commit -m "Initial commit"
git push -u origin master
```

#雑記

- githubからの移行とかも、それようのフローが示されていて簡単そう
- gitlab pagesが便利そう
tmux基本まとめ

tmuxとは
-------------------------------------------

ターミナルマルチプレクサとか呼ばれているターミナルの仮想化とかするやつ
これ以外表現する方法がない。超便利
configファイルは.tmux.conf


セッション、ウィンドウ、ペイン
-------------------------------------------
session > window > paneで覚えとけばいいと思うよ。
session
...tmuxの接続先

window
...session内でのタブみたいなもん

pane
...window内での作業できるスペースの単位、paneを分割することで一つのターミナルでも複数画面みたいなことができる

tmux操作の基本 prefixについて
-------------------------------------------

tmuxは基本(prefix) + (別のキー)で操作する。
デフォルトのprefixは< Ctrl-b >となっている。
prefixは頻繁に打つことになるのだが、bがちょっと打ちづらいのでtmux使いは良くprefixのキーバインドを変更している。

``` tmux.conf
# bind Ctrl-j to prefix
set -g prefix C-j

# unbind default prefix
unbind C-b

# press Ctrl-j*2 to send-prefix
bind C-j send-prefix
```

何のキーprefixにするかはその人次第だと思うが、vimの操作とかとエディターの操作のキーとかと被らないようにするのが理想。

キー操作基本
-------------------------------------------

```
< Prefix > + ?   キーバインド一覧
< Prefix > + :   コマンドプロンプト
< Prefix > + [   コピーモード
```

セッション操作
-------------------------------------------

```
# 新規セッション作成
tmux
tmux new -s (session名)

# アタッチ 
tmux a 
tmux a -t (session名)

# デタッチ
< Prefix > + d

# セッション名変更
tmux rename -t (旧session名) (新session名)
< Prefix > + $

# セッションの削除
tmux kill-session     
tmux kill-session -t (session名)
tmux kill-server      # 全部kill

# セッションの一覧選択
< Prefix > + s

```

ウインドウ操作
-------------------------------------------

```
c      新規ウインドウ作成
w      ウインドウの一覧選択
0-9    指定番号のウインドウへ移動
&      ウインドウの破棄
n      次のウインドウへ移動
p      前のウインドウへ移動
l      以前のウインドウへ移動
'      入力番号のウインドウへ移動
.      入力番号にウインドウ番号を変更
,      ウインドウの名前変更
f      ウインドウの検索
```

ペイン操作
-------------------------------------------

```
%            左右にペイン分割
"            上下にペイン分割
q            ペイン番号を表示
カーソル    　 指定方向のペインへ移動 ※連続押しでプレフィックス継続
Ctrl-カーソル  ペインのサイズを変更 ※連続押しでプレフィックス継続
!            ペインを解除してウインドウ化
x            ペインの破棄
o            ペインを順に移動
;            以前のペインへ移動
z            現在のペインを最大化/復帰
スペース      レイアウトを変更
Alt-1-5      レイウトを変更
{            ペインの入れ替え(前方向)
}            ペインの入れ替え(後方向)
ctrl+o       ペインの入れ替え(全体)
t            ペインに時計を表示
```

コマンドモード
-------------------------------------------

< Prefix > + :でtmux sessionの中でtmuxのコマンドが打てる
これを使わない場合にはCtrl-zでtmuxをサスペンドしてコマンドを打つことになる。
しかしだいたいキー操作でなんとかする感じなのであまり使わないかも


copy mode
-------------------------------------------

< Prefix > + [ でcopy modeに入る
copy modeではviのnormal modeみたいな感じでjkとかで画面スクロールできる。
またvi同様v,Vでvisual modeで選択範囲をコピーできる。
viと違う点は< C-v >で矩形選択できる訳ではなく、vの挙動を通常か矩形選択か切り替えることができるということ
reattach-to-user-namespaceを使用すると、システムクリップボードと連携することが可能

```tmux.conf
setw -g mode-keys vi
bind-key -t vi-copy v begin-selection
bind-key -t vi-copy V select-line
bind-key -t vi-copy C-v rectangle-toggle
bind-key -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"
bind-key -t vi-copy Escape clear-selection
bind-key -t vi-copy C-n page-up
bind-key -t vi-copy C-f page-down
bind-key -t vi-copy C-u scroll-up
bind-key -t vi-copy C-d scroll-down
```

vi-copyはversion2.2くらいまでで2.3以降はcopy-mode-viと変更があるので注意

その他
-------------------------------------------

後は.tmux.confでのカスタマイズくらいかな
画面上のステータスバーとかペインの境界のハイライトとか色々あるけどそれは時間ができたら
pandas 特定の文字を含む列の名称を取ってくる

### pandas 特定の文字を含む列の名称を取ってくる

```
この記事ではpandas 0.19.2を利用しています。
```
### はじめに
***

データ型の変換や、解析を行なう上で変数を整理したりなどで、
意に沿ったかたちで列名称を取ってきたいケースは意外と多いと思います。

方法はいろいろあると思うのですが、ここではfindを利用してます。


### データ
***

```py
# coding:utf-8

df = pd.DataFrame(
    {'id':['1001','1002','1003','1004'],
      'x01':[3,2,3,1],
      'x02':[1,2,1,1],
      'y01':[3,2,2,2],
      'y02':[1,1,1,2],
      'z01':[1,2,3,3],
     })

df
```


||id|x01|x02|y01|y02|z01|
|:-:|:--:|:---:|:---:|:---:|:---:|:----:|:--:|
|0|1001|3|1|3|1|1|
|1|1002|2|2|2|1|2|
|2|1003|3|1|2|1|3|
|3|1004|1|1|2|2|3|


### findを利用して特定の文字を含む列名称を取得
***

リスト内包表記とfindを利用して、条件に合うものを取得します。
関数 find は、その文字が最初に現れる位置を返します。なかった場合には -1 を返します。
ここでは'y'を含む変数を取ってきたいとします。

```py
temp_col = [item for item in df.columns if item.find('y') != -1]

print temp_col
```
```
['y01', 'y02']
```

OR を使って以下のようにもできます。

```py
temp_col_2 = [item for item in df.columns if item.find('y') != -1 or item.find('z') != -1]

print temp_col_2
```
```
['y01', 'y02', 'z01']
```

取得したリストを使って、以下のように特定の列に絞ったデータを取得できます。

```py
df[['id'] + temp_col]
```

||id|y01|y02|
|:-:|:--:|:---:|:---:|
|0|1001|3|1|
|1|1002|2|2|
|2|1003|3|1|
|3|1004|1|1|
Gitの管理ルール

# この記事の目的

Gitの管理方法をまとめる。

# ブランチの種類

## メインブランチ

### masterブランチ

リリース可能なもののみをあげるブランチ

### developブランチ

普段の開発で使うブランチでmasterよりも機能開発の細かい部分のコミットがある。

## ヒューチャーブランチ（トピックブランチ）

大きめの機能開発をする際にmasterとどけておく。例えば開発中にバグなどが発生した場合、masterでバグ修正し、後でヒューチャーブランチをマージする。

## リリースブランチ

リリースブランチでは、リリースの準備を行います。なお慣例として、ブランチ名の頭には release- をつけます。リリースブランチを作ることで、最終的な調整はこのブランチで行いながら、更に次のリリースに向けた開発をdevelopブランチ上ですすめることができます。

普段の開発はdevelopブランチ上で行なっているため、ほとんどリリース可能な状態が近づいてからリリースブランチを作成します。そして、リリースに向けた最終的なバグ修正などの開発を行います。

最終的に、リリースブランチがリリース可能な状態になったらmasterブランチにマージを行い、できたマージコミットに対してリリース番号のタグを追加します。

また、リリースブランチ上で行った修正を取り込むため、developブランチに対してもマージを行います。

## ホットフィックスブランチ

緊急のバグ修正を行う場合、developブランチからリリース状態まで持っていくのは時間かかるのでリリースブランチ、もしくはmasterからホットフィックスブランチをきる。通例ではhotfix-をつけてコミットする。
さくらVPS　SHH接続のポート番号を変えたら接続できなくなった時

さくらのVPS　CentOS6標準インストールでチュートリアルを見ながら初期設定を進めていて詰まったのでメモです。
（win10　ssh接続にはRLogin使用）

####●SSHの接続のポート番号を22から任意の番号に変更
ルート権限で

```
vim /etc/ssh/sshd_config
```
シャープを取って任意の数字に

```
　#Port 22
```
↓

```
Port 22222
```

sshdを再起動

```
service sshd restart
```


これでＯＫのはずですが、
ポート22222で接続しようとしても失敗。
ググりました。
http://javatechnology.net/service/ssh-port-change/
どうやらファイアウォールの設定が必要だそう。

###●ファイアウォールの設定を変更
```
vim /etc/sysconfig/iptables
```
許容のポート番号を変更

```
A INPUT -m state --state NEW -m tcp -p --dport 22 -j ACCEPT
```

　↓

```
A INPUT -m state --state NEW -m tcp -p --dport 22222 -j ACCEPT
```

iptablesを再起動

```
service iptables restart
```

iptablesの設定文言が上記サイトと若干違いますが、うまくいきました。
【Swift3】ランダムな英数字を生成する方法(桁数指定可)



# 本体
```.swift

func randomString(length: Int) -> String {
    
    let letters : NSString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
    let len = UInt32(letters.length)
    
    var randomString = ""
    
    for _ in 0 ..< length {
        let rand = arc4random_uniform(len)
        var nextChar = letters.character(at: Int(rand))
        randomString += NSString(characters: &nextChar, length: 1) as String
    }
    
    return randomString
}

```

# 使い方

```.swift
let randomString = randomString(length: 10) // 10桁のランダムな英数字を生成
print(randomString)
```

# 参考
・[Generate random alphanumeric string in Swift - Stack Overflow](https://stackoverflow.com/questions/26845307/generate-random-alphanumeric-string-in-swift)
Switch(QtQuick Controls 2)サンプル

#Switch(QtQuick Controls 2)のサンプル
##テスト用QML
```qml
import QtQuick 2.9
import QtQuick.Controls 2.2
import QtMultimedia 5.9

ApplicationWindow {
    id: root
    visible: true
    width: 640
    height: 480
    title: qsTr("Switchサンプル")

    Audio { id: clickSound1; source: "Sounds/btn01.mp3" }
    Audio { id: clickSound2; source: "Sounds/btn02.mp3" }

    Column {
        spacing: 2

        Rectangle { id: colorBox; width: root.width; height: root.height / 2; color: "red" }

        // Switch生成
        Switch {
            id: sw
            width: root.width
            height: root.height / 2
            onToggled: {
                if (checked == true) {      // 切り替えで colorBox の色を変える
                    clickSound1.play()
                    colorBox.color = "blue"
                } else {
                    clickSound2.play()
                    colorBox.color = "red"
                }
            }
        }
    }
}
```
##実行結果
[![SignalTransitionサンプル動画](http://img.youtube.com/vi/qoKr1nE7QSw/0.jpg)](http://www.youtube.com/watch?v=qoKr1nE7QSw)
※Linux Mint 18.2 & Qt 5.9.1使用
ProgressBarサンプル

#ProgressBar(QtQuick Controls 2)のサンプル
##テスト用QML
```qml
import QtQuick 2.9
import QtQuick.Controls 2.2
import QtMultimedia 5.9

ApplicationWindow {
    id: root
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Audio { id: clickSound; source: "Sounds/btn01.mp3" }
    Audio { id: finishSound; source: "Sounds/btn02.mp3" }

    // タイマ定義
    Timer {
        id: timer
        interval: 100
        repeat: true
        onTriggered: {
            if (progressBar.value < progressBar.to) {
                progressBar.value += 1
            } else {
                finishSound.play()
                stop()
                button.enabled = true
            }

            console.log("position = " + progressBar.position)
            console.log("value = " + progressBar.value)
            console.log("visualPosition = " + progressBar.visualPosition)
        }
    }

    Row {
        spacing: 2

        // indeterminate プログレスバー定義
        ProgressBar {
            width: root.width / 2
            height: root.height / 2
            indeterminate: true
        }

        Column {
            // 0〜100の範囲のプログレスバー定義
            ProgressBar {
                id: progressBar
                width: root.width / 2
                height: root.height /2
                from: 0
                to: 100
            }

            // プログレスバー更新開始用ボタン定義
            Button {
                id: button
                text: "Start"
                anchors.horizontalCenter: parent.horizontalCenter
                onClicked: { clickSound.play(); enabled = false; progressBar.value = 0; timer.start() }
            }
        }
    }
}
```
##実行結果
[![SignalTransitionサンプル動画](http://img.youtube.com/vi/KFkvHMPpJHo/0.jpg)](http://www.youtube.com/watch?v=KFkvHMPpJHo)
※Linux Mint 18.2 & Qt 5.9.1使用
Backbone.js メモ2

[Backbone.js アプリケーション開発ガイド](https://www.oreilly.co.jp/books/9784873116587/)

この本を買ったので読んだ内容で理解したものをまとめていく。

# 第3章 モデル、ビュー、コレクション

## モデル
- アプリケーションで利用されるデータとこれに関連するロジックが含まれる
- ゲッターとセッターがある
    - セッターを使うとchangeイベントが発生する
- モデルの変化の監視ができる
    - initialize関数の中でリスナー追加すると便利
- データの検証
    - save()メソッドでモデルが永続化されるときと、{validate: true}を指定しset()が呼び出された時に検証が行われる
    - Model.validate()

## ビュー
- モデルがどのように表示されるかを定義したロジックが記述される
- el
    - DOM要素への参照
    - tagnameでDOM要素指定（デフォルトdiv)
    - view.\$el = $(el.view)
    - view.\$(selector) = $(view.el).find(selector)
    - render()
        - 処理の終わりにthisを返すのが一般的
    - eventsオブジェクト
        - 要素でのイベントとリスナーとの対応わけができる
        - _bindを使えば自分でメソッドの関連付けができる
 
## コレクション
- モデルの集合
- add、remove
- idを指定してgetメソッドでモデルを取り出せる
- クライアント-サーバ型のアプリケーションではサーバから取得した値がコレクションにセットされる
- モデルのcid属性はモデル生成時にBackbone.jsが自動生成されるもの
- idAttributeはサーバから返されるモデルの中でどの属性を識別子として使うべきかをしてするために使われる
- イベント監視
    - モデル追加:addイベント
    - モデル削除:removeイベント
    - モデル変更:changeイベント
- Collection.resetでコレクション全体を置き換えられる（resetイベント発生)

## RESTに基づく永続化
- RESTに基づいたサーバとの動機処理を簡単なコードで実現できる
  - Collections.fetch()でサーバからコレクションのデータを取得できる
  - サーバから取得したモデルのsave()でPUT形式のHTTPリクエストが送信される
  - ブラウザ側で生成されたモデルのsave()ではPOST形式のHTTPリクエストが送信される
      - モデルのsave()は内部でvalidate()を呼び出す
  - destroy()でサーバからモデルの削除（DELETE形式のHTTPリクエスト送信）
  - オプションPATCH形式のHTTPリクエストを送りたい場合、コレクションをリセットしたい場合などオプション利用でいろいろコレクションの変更・削除方法が変えられる