OmniAICreator/Qiita-1.07M huggingface dataset:
Ruby on Rails の環境を Docker で構築して RubyMine でコーディング (Mac Book Pro)

#Ruby on Rails の環境を Docker で構築して RubyMine でコーディング (Mac Book Pro)
前回の記事のDocker設定はbundle専用のコンテナを用意してGemのインストールの効率化をしていたのですが、この設定だとRubyMineの『Gemをリモートでインストールする機能』が上手く働かないため、Dockerの設定を変更してコーディングに特化した環境にします。

bundle専用コンテナと『Gemをリモートでインストールする機能』を両立する方法が見つかった場合は更新しようと考えています。


## 前回の記事
* http://qiita.com/kojima4twt/items/7995a09ac7d1b307b48b

## Dockerの設定、実行
* 前回のDockerfileの以下をコメントにします。
<br> ENV BUNDLE_JOBS=4 \
<br>     BUNDLE_PATH=/bundle

```docker:Dockerfile
FROM ruby:2.3.3
RUN apt-get update -qq && \
    apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile .
ADD Gemfile.lock .
#ENV BUNDLE_JOBS=4 \
#    BUNDLE_PATH=/bundle
RUN bundle install
ADD . .

```

* 前回のdocker-compose.ymlの以下をコメントにします。
<br>    volumes_from:
<br>      - bundle
<br>  bundle:
<br>    image: busybox
<br>    volumes:
<br>      - /bundle

```docker:docker-compose.yml
version: '2'
services:
  web:
    build: .
    #command: bundle exec rails s -p 3000 -b 0.0.0.0
    command: bundle exec rdebug-ide --port 1234 --dispatcher-port 26162 --host 0.0.0.0 -- bin/rails s -b 0.0.0.0 -p 3000
    container_name: web
    depends_on:
      - db
    ports:
      - "127.0.0.1:3000:3000"
      - "127.0.0.1:1234:1234"
      - "127.0.0.1:26162:26162"
    stdin_open: true
    tty: true
    volumes:
      - .:/myapp
#    volumes_from:
#      - bundle
  db:
    image: postgres
#  bundle:
#    image: busybox
#    volumes:
#      - /bundle

```

* Dockerfileを 再ビルドします。

```
$ docker-compose stop

$ docker-compose build
```

* データベースを再作成します。

```
$ docker-compose run web rake db:create
$ docker-compose run web rake db:migrate
```

* dockerのコンテナを起動します。

```
$ docker-compose up
```

## RubyMineでDockerのGemをリモートインストールして、コーディング開始
* Dockerのイメージの中から [プロジェクトのフォルダ名]_web を選択します。
<img width="792" alt="スクリーンショット 2017-08-26 15.57.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/198055/8906339f-e1fa-9b48-a40f-0b2bc14e988e.png">

* Gemがインストールされているのを確認して選択します。
RubyMineのメイン画面にソースを表示して『Cannot find 'クラス名' more...』で黄色表示されていた箇所がなくなりオールグリーンになれば成功です。
<img width="1134" alt="スクリーンショット 2017-08-26 15.57.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/198055/5fd9eb8f-395a-fa4b-a3ab-db3b3a490380.png">

左下のDockerコンテナの起動状況を確認できるツールが便利で良いですね。
<img width="1372" alt="スクリーンショット 2017-08-26 16.18.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/198055/710a8870-dac7-64e7-d39c-b46a7e2e4574.png">
Xamarin.Forms(Prism)でTabbedPage

MainPageがタブ画面のホストだとした場合、MainPageで↓のようにタブに表示する各ViewをImportするだけでOK。

```MainPage.xaml
<?xml version="1.0" encoding="utf-8" ?>
<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
            xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
            xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
            xmlns:Views="clr-namespace:XF_TabApp.Views"
            prism:ViewModelLocator.AutowireViewModel="True"
            x:Class="XF_TabApp.Views.MainPage"
            Title="MainPage">
    <Views:HomePage />
    <Views:AboutPage />
</TabbedPage>
```

HomePage,AboutPageに自分がタブの一部ということを意識させることは一切ない。
Androidのタブより簡単かも。
Go管理画面テンプレート

# Go管理画面

Goで管理画面を作った。

その時の記事はこちら。
[Goで管理画面を作る](http://qiita.com/courage-liberty/items/83fc6882b4b140ac808d)

管理画面はヘッダーやメニュー
ログイン情報など共通部分が多い。

全部のテンプレートに書くのは
あとから変える時に大変なので
まとめて共通テンプレートで作ることにした。

---

# テンプレートをそれぞれ作る

共通で以下のテンプレートを作成。
中身は普通のHTML／CSS（bootstrap）

・menu.html
・login.html
・header.html
・footer.html
・get.html

---

# テンプレートの中身

・menu.html

```
{{define "menu"}}
<div class="panel panel-primary">
	<div class="panel-heading">
		メニュー
	</div>
	<ul class="nav nav-pills nav-stacked">
		{{with .Menu}}
			<li><a href="/report"><i class="glyphicon glyphicon-duplicate"></i> レポート</a></li>
			<li><a href="/message"><i class="glyphicon glyphicon-comment"></i> メッセージ</a></li>
		{{end}}
	</ui>
</div>
{{end}}
```

---

# 各ページから指定する

ページから共通テンプレートを読む。
{{ template ～ }} を指定すればOK。

指定する名前は
{{define ～}} で定義したもの。

```
{{define "index"}}<!doctype html>
<html>
	<head>
		{{ template "header" . }}
	</head>
	<body>
		{{ template "login" . }}
		<div class="container">
			<div class="row">
				<div class="col-md-3">
					{{ template "menu" . }}
	  			</div>
　　　　　　　　　　　　　　・
　　　　　　　　　　　　　　・
　　　　　　　　　　　　　　・

　　　　　　　　　　　　　以下省略
```

---

# テンプレートをまとめて読む

あとは読む時に全部まとめて読めばOK。
大体こんな感じ。

```
tfs := []string{"header.html", "login.html", "menu.html"}

ms.templates["dashboard.html"] = template.Must(template.New("").ParseFiles("dashboard.html", tfs...))

```

（だいぶ省略しています。
　全部見たい方がいたらコメントください！）

---

# これでOK

これで共通部が変更になっても
全ページ変えずに済むので楽ですね (^^)

フロントはあまり得意じゃないのですが
そうも言ってられないので
もっと勉強していい管理画面を作っていきます。
Vim で全角スペースの強調

vim で全角スペースを強調する設定をしたので、メモ。

以下のように `highlight` を利用し、全角スペースのハイライトを試みた。
しかし、環境によっては `colorsheme` によってハイライトが上書きされてしまう。
(`colorscheme` が vim 実行中に動的に呼び出され続けるのだろうか？)
`colorscheme` を使わなければ解決するのだが、`colorscheme`は使いたい。

```text:.vimrc(失敗例1)
" 全角スペースの背景を白に変更
highlight FullWidthSpace ctermbg=white
match FullWidthSpace /　/ " ← 見えないけど全角スペースがあります
" カラースキームの設定
colorscheme desert 
```

そこで、`autocmd` を使う。
そうすると `colorsheme` の呼び出し時に
ハイライトの状態を上書きすることができる。

```text:.vimrc
" 全角スペースの背景を白に変更
autocmd Colorscheme * highlight FullWidthSpace ctermbg=white
autocmd VimEnter * match FullWidthSpace /　/
" カラースキームの設定
colorscheme desert 
```
これで全角スペースが強調されるようになった。

ちなみに、以下のように `colorscheme ~` と `autocmd Colorscheme * ~` 
の順番を入れ替えると、vim 起動時にエラーが出る。

```text:.vimrc(失敗例2)
" カラースキームの設定
colorscheme desert 
" 全角スペースの背景を白に変更
autocmd Colorscheme * highlight FullWidthSpace ctermbg=white
autocmd VimEnter * match FullWidthSpace /　/
```

どうやら .vimrc の内容は上から順番に実行されるようだ。
MIDIスイッチをリファクタリングしてみた


Ableton Liveのトランスポート用のスイッチ。
![P_20170817_210543.jpg](https://qiita-image-store.s3.amazonaws.com/0/61597/beb7dc06-af4a-ee74-7304-cbf28a5ac0db.jpeg "P_20170817_210543.jpg")
ボタンを押すと、決められたコントロールチェンジを送信します。それだけです。
いくつか作っていますが、これは一番古いタイプ。Arduino duemilanoveがはいっています。

特に動作に不満はないのですが、新しいっぽい書き方を試してみました。

#こんなプログラムにしたい
ボタンが四つあるので、これをなにかオブジェクトの配列にして、

```C++:

void loop() {
  // forループ。BUTTONSの要素 b について：
  for (auto&& b : BUTTONS ){
 // データによって何かする <- デバウンスする <- bのピンを読む 
    doByData( b     ,     debounce( b ,   digitalRead( b.PIN ) 
    ) );
  }
  delay( 1 );
}
```
もしくは：

```C++:
void loop() {
  // forループ。BUTTONSの要素 b について：
  for (auto&& b : BUTTONS ){
 // データが上がったときに何かする <- データが下がったときに何かする <- デバウンスする <- bのピンを読む
    doWhenRaised( b      ,       doWhenDropped( b      ,      b.debounce(    digitalRead( b.PIN ) 
    ) ) );
  }
  delay( 1 );
}
```
みたいな感じにしたいな...

#選択肢...
##関数をラムダ式で作る
メリット：書きやすい。
デメリット： オブジェクトのメンバにできない。

スケッチの全体は[こうなりました。](https://gist.github.com/ttatsf/d81ae3adf0aab8230907e81f67bea8ac)
クロージャをバラして履歴の変数だけオブジェクトに持たせているのでちょっと変な感じです。
##関数を関数オブジェクトで作る
メリット：メンバにできる
デメリット：書くのが面倒。

スケッチの全体は[こうなりました。](https://gist.github.com/ttatsf/c6f99551ff5e14836637ff23b9bf59de)

どちらもちゃんと動きました。
#最終調整
これに使ってるスイッチは安物で結構チャタリングが酷いので、delayとdebounceのRATEで調整。
チャタリングは抑えるけど、動作にはついてくるギリギリを狙います。
delay( 2 )、RATE = 12でいい感じになりました。
Rubyの&.とRailsの#tryの違いについて

Rubyの&.とRailsのActiveSupportで提供されている#tryの違いについてメモ。

##両者の共通点
レシーバーが nil のとき，NoMethodErrorを投げずにnilを返してくれる機能。

コードでみてみると、

```rb:&.について
10&.to_s  # => "10"
nil&.to_s # nil
```

```rb:tryについて
10.try(:to_s)   # => "10"
nil.try(:to_s)  # => nil
```

どちらもレシーバがnilの場合にnilを返せる。

##違いはなんなのか
両方とも **レシーバがnilではない場合にメソッドを呼び出す** という目的は同じであるが、 `#try` は **メソッドが呼び出すことができるときに、メソッドを呼び出す**。

コードで見てみると、

```rb:
10.try(:hoge) # => nil
#10にはhogeメソッドが定義されていない場合、nilを返す

10&.hoge # => Error: undefined method `hoge' for 10:Fixnum (NoMethodError)
```


定義されていないものを呼び出そうとした時、`#try` はnilを返してくれますが、 `&.` はエラーを吐く。
go言語でchannelを利用してメモリリークさせてみた

今回の記事ではメモリリークを意図的に起こしてみました。（意図的にやっているのでメモリリークという表現が正しいか微妙ですが、ここではメモリリークと言います）

## 出題

以下のコードを実行したらどうなるかわかりますか？（危険なので実行しないでください）

```main.go
package main

func main() {
	for i := 0; i < 10000000; i++ {
		c := make(chan int)
		defer close(c)
		go goroutine(c)
	}
}

func goroutine(c chan int) {
	select {
	case <-c:
		return
	}
}
```

## 解答

正解は、タイトル通りメモリリークします（というかメモリを大量に使います）。1000万回のループで40GBくらい使うはず？

正確に言うと、コードの意図通りに、使用されることのない1000万個のチャネルとgoroutineが生成され、forループを抜けるまでメモリを占拠し続けます。

## どうしてこうなった？

今回利用した性質は、

* goroutineはガベージコレクションの対象ではない
* deferは宣言した__関数__を抜けるときに実行される

この２つの挙動です。

特に注意が必要なのがdeferで、宣言した関数を抜けるときにdefer語が実装されます。forループの一周が終わった時ではないため、for文の中で知らずに使うとひどい目に遭います。

よくわからずに使うと変な場所で宣言しがちなdefer文です。

## まとめ

* goroutineはGCの対象ではない
* deferは__関数__を抜けるときに実行される
参照ファイルを用いて、複数のテキスト置換を一括で行う

**※プログラミングレベルは高くないので、より良い方法があれば教えてください**

#概要
複数のサンプルのfasta/fastqを１つのファイルにまとめてしまった後に、ヘッダーを修正したいときのためのシェルスクリプト。
テキストの置換件数が多いため、参照となるリストファイルを作成し、一度に複数のテキスト置換を行う。

参考：FASTQ Filesのフォーマット
http://support.illumina.com/content/dam/illumina-support/help/BaseSpaceHelp_v2/Content/Vault/Informatics/Sequencing_Analysis/BS/swSEQ_mBS_FASTQFiles.htm


#コマンド
xargsを用いたワンライナーを教えてもらいました（2017/9/2更新）

```
sed 's/\([^\t]*\)\t\(.*\)/s|\1|\2|g/' rename.list | xargs -I{} sed -i '{}' test.fna
```

旧シェルスクリプト

```
#!/bin/bash

list="rename.list"
file="test.fna"

# 行数分のループを回す
seq=`cat $list | wc -l`

for i in `seq $seq`
do
	name=`cat $list | awk -F'\t' "NR==${i}" | cut -f1`;
	rename=`cat $list | awk -F'\t' "NR==${i}" | cut -f2 `;
	sed -i "s/$name/$rename/g" $file
done
```

#ファイル
##rename.list

```
AAA-BBB-CCC_S1	AAA-BBB-CCC-1_S1
AAA-BBB-CCC_S2	AAA-BBB-CCC-2_S2

```
Windowsのhostsファイルの変更がめんどくさい人のためのbat

Windowsのhostsファイルの変更がめんどくさい人のためのbatです。

```bat
@echo off
start powershell.exe -Command "Start-Process -Verb RUNAS notepad C:\Windows\System32\drivers\etc\hosts"
```

管理者権限でメモ帳を立ち上げて、hostsを渡してるだけですが、個人的にはめちゃ重宝してます。
世界一簡単なBash on Ubuntu on Windowsのインストール手順

##### 「ファイル名を指定して実行 ( <kbd>Windows</kbd>+<kbd>R</kbd> ) 」で、以下実行。

```PowerShell
powershell.exe -Command "Start-Process -FilePath powershell.exe -Verb RUNAS"
```

##### 以下一連のコマンドを実行。

```PowerShell
# Windows機能の有効化 => Microsoft-Windows-Subsystem-Linux
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

# 開発者モード オン
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock" /t REG_DWORD /f /v "AllowDevelopmentWithoutDevLicense" /d "1"

# インストール
lxrun /install /y
```

##### おわり。
「実験してみなきゃ分からない」は最小限に

ソフトウェアの開発でコードの改善をしているときに、
実は「実験してみなきゃわからない」部分はそんなに多くはない。


明快な指導原理にしたがって設計できることがある。
あるいは、明快な指導原理を設定しないと、きちんとした設計はできない。

その場しのぎのアルゴリズムを組みあわせたものではなく、明快な指導原理にしたがったアルゴリズムが増えてきていて、コンピュータの性能向上のおかげで、それがいい結果を出すようになってきている。勉強会や論文などで読むアルゴリズムはそうだ。

アルゴリズムの多くは、最小化問題であって、そこに束縛条件がつく。その束縛条件を満たすと０になり、外れるほど値が大きくなる項を最小化する元々の関数に追加する。


そうすると、束縛条件付の最小化問題が解ける。その束縛条件付の最小化問題をどうやって速く解くかという問題になる。

そういったことのために、その場しのぎの改良よりは、明快な指導原理にもとづくアルゴリズムが増えてきているように思う。

解こうとする問題に対して、何に着目してどう定式化するのか、その部分で既に勝負はついていると言ってもいいのではないかと思う。
なんでもかんでも「実験してみなきゃわからない」だったら、勝負をするのは無理だ。
明快な指導原理にしたがってできることを増やしておいて、
「実験は、自分の予想があたっていたかの検証」となることを目指すべきだ。

すべての項目に対して「実験してみなきゃわからない」を乱発すると何もできなくなる。


---
## 付記: ラグランジュの未定定数法について
[ラグランジュの未定乗数法](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%B0%E3%83%A9%E3%83%B3%E3%82%B8%E3%83%A5%E3%81%AE%E6%9C%AA%E5%AE%9A%E4%B9%97%E6%95%B0%E6%B3%95)は、束縛条件付きの最小化問題を解く代数的な手法である。ただ、コンピュータを用いた最小化問題では、何も偏微分方程式を解く必要はない。
Rustのマクロ中で定シンボルを繰り返す

# Introduction
Rustのマクロ中の変数繰り返し`$( $val ),*`で、`$val`でなく定シンボルを`$val`と同じ数だけ繰り返したいことがあったのですが、[The book](https://doc.rust-lang.org/book/first-edition/macros.html#repetition)によるとそのままではできないようでした。
そこでうまくやるためのワークアラウンドを考えてみました。

# ソース例
例えば、以下のようなマクロを書きたいわけです。

```rust
macro_rules! def_func {
    ( $name:ident, $( $x:expr ),* ) => {
        fn $name<T: Fn($( i64 ),*) -> i64> (f: T) -> i64 {
            f($( $x ),*)
        }
    };
}

fn main() {
    def_func!(foo, 1i64);
    println!("{}", foo(|x| x + 2i64));
}
```

これをやると、`Fn($( i64 ),*) -> i64`の`$(),*`中にマクロ変数を含まないのでコンパイルエラーになります。

# 対策

マクロのオーバーロードを活用します。

```rust
macro_rules! def_func {
    ( $name:ident, $( $x:expr ),* ) => {
        def_func!($name, $( $x; i64 ),*);
    };

    ( $name:ident, $( $x:expr; $i64:ty ),* ) => {
        fn $name<T: Fn($( $i64 ),*) -> i64> (f: T) -> i64 {
            f($( $x ),*)
        }
    };
}

fn main() {
    def_func!(foo, 1i64);
    println!("{}", foo(|x| x + 2i64));
}
```

まあ、言われてみればかなり自明です。

# 結論

もしもっとまともな方法がありそうでしたら教えてください。

この他にもマクロのオーバーロードを使えば表現力を増すことができそうですね。

[自分のブログ](http://0x90.hatenablog.jp/entry/2017/08/26/130553)からの転載
OS X でmongoDBクイックスタート

# 環境
OS X Sierra 10.12.5

# 導入方法

1,インストール

```
$ brew install mongodb
```
2,データ格納用ディレクトリ作成

```
$ sudo mkdir /var/lib/mongodb
```
3,ログファイル作成

```
$ sudo touch /var/log/mongodb.log
```
# 使用方法

1,起動
```
$ sudo mongod --dbpath /var/lib/mongodb --logpath /var/log/mongodb.log
```
2,mongoシェル起動
別ターミナルにて以下コマンド

```
$ sudo mongod --dbpath /var/lib/mongodb --logpath /var/log/mongodb.log
```
3,DB新規作成作成&接続

```
> use DB名
switched to db DB名
> 
```
4,コレクション作成&インサート

```
> db.コレクション名.insert({name:'A', email:'A.com'});
```
「初心者」VisualStudio,Windowsフォームアプリケーションで作りたいものがある

タイトルがわかりづらくて申し訳ございません。

###質問
https://www.youtube.com/watch?v=lhikdD6Hf2M
上の動画はAlanBeckerさんの動画なのですが、

動画のように、デスクトップ上に棒人間をだしたいです。
(もちろん動画では合成であることは知っています。)

windowsフォームアプリケーション(C#)で
どうすれば実現できるでしょうか？
###腕前
VisualStudioはインストールしてから7日目です。
【簡単！】ProjectEulerの問題をJavascript1行で解いてみる

# ProjectEulerとは

> プログラムで解く数学の問題集です。[^q]

---
# せっかくなのでJavascript1行で解いてみる
---
# Q1

> 10未満の自然数のうち, 3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり, これらの合計は 23 になる.
> 同じようにして, 1000 未満の 3 か 5 の倍数になっている数字の合計を求めよ.[^1]

https://projecteuler.net/problem=1

---
# Q1

> 10未満の自然数のうち, 3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり, これらの合計は 23 になる.
> 同じようにして, 1000 未満の 3 か 5 の倍数になっている数字の合計を求めよ.[^1]

https://projecteuler.net/problem=1

```js
[...Array(1000)]
.map((v,i) => i)
.filter((v) => !(v%3) || !(v%5))
.reduce((s, v) => s + v , 0)
```

---
# Q2

> フィボナッチ数列の項は前の2つの項の和である. 最初の2項を 1, 2 とすれば, 最初の10項は以下の通りである.
> 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
> 数列の項の値が400万以下の, 偶数値の項の総和を求めよ.[^2]

https://projecteuler.net/problem=2

---
# Q2

> フィボナッチ数列の項は前の2つの項の和である. 最初の2項を 1, 2 とすれば, 最初の10項は以下の通りである.
> 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
> 数列の項の値が400万以下の, 偶数値の項の総和を求めよ.[^2]

https://projecteuler.net/problem=2


```js
(
　　　　(f = (a) => !a ? 
　　　　　　　　f([ 1, 2 ]) : 
　　　　　　　　a[a.length-2] + a[a.length-1] > 4000000 ? 
　　　　　　　　a : 
　　　　　　　　f([...a, a[a.length-2] + a[a.length-1]])
　　　　) => f()
　　　　　　　　.filter((v) => !(v%2))
　　　　　　　　.reduce((s, v) => s +v , 0)
).call()
```

---
# Q4

> 左右どちらから読んでも同じ値になる数を回文数という. 2桁の数の積で表される回文数のうち, 最大のものは 9009 = 91 × 99 である.
> では, 3桁の数の積で表される回文数の最大値を求めよ.[^4]

https://projecteuler.net/problem=4

---
# Q4

> 左右どちらから読んでも同じ値になる数を回文数という. 2桁の数の積で表される回文数のうち, 最大のものは 9009 = 91 × 99 である.
> では, 3桁の数の積で表される回文数の最大値を求めよ.[^4]

https://projecteuler.net/problem=4

```js
[...Array(1000)]
.map((v,i) => i)
.filter((v) => v > 99)
.map((v,i,a) => 
    a
    .map((b) => b * v)
    .filter((v) => `${v}` === `${v}`.split("").reverse().join(""))
)
.reduce((p,a) => [...p, ...a], [])
.sort((a,b) => a - b)
.pop();
```
---

# 参考資料

- Project Euler - PukiWiki  
http://odz.sakura.ne.jp/projecteuler/index.php?Project%20Euler

<br />

- About - Project Euler  
https://projecteuler.net/



[^q]: http://odz.sakura.ne.jp/projecteuler/index.php?Project%20Euler#daab6db0

[^1]: http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%201

[^2]: http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%202

[^4]: http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%204
Pythonオブジェクトをシリアライズして保存する小さなメモ

# コード

```python:test.py
# -*- coding: utf-8 -*-
import pickle

class Test:
        def __init__(self, name):
                print("hoge")

test = Test("name")

with open("test.pickle", 'wb') as f:
        pickle.dump(test, f)

with open("test.pickle", 'rb') as f:
        opened = pickle.load(f)
print(opened)
```

ファイルtest.pickleに保存
意味なしコード
リストもいけた
Scapy入門②（Scapyを使ったICMP、HTTP(TCP)送信） 

# Scapy入門（Scapyを使ったICMP、HTTP(TCP)送信） 

## はじめに
こんにちは。あかこうです。
前回に引き続き、今回はScapyを作ったパケット送信までをまとめたいと思います。

## 環境・Scapyの説明等
[前回の記事](http://qiita.com/akakou/items/f17cc50b9891d8105d86)をご覧ください。
今回もscapyを直接起動したインタラクティブシェル上で、一行ずつ実行することを前提としてます。

## パケットの作成から送信まで
### ICMP(PING)
```py3
# googleのサーバに向けたICMPパケットの作成
# IPパケットの上にICMPを積んでいるイメージ
packet = IP(dst='www.google.com')/ICMP()

# パケットの中身を表示
packet.show()

# パケットを送信
# ＆ 返ってきたパケットの表示
sr1(packet)
```

### TCP(HTTP)
#### コネクションから送信まで
```py3
'''TCPにおけるコネクションの流れ'''

'''基本パケットの作成'''
# IPパケットの作成
ip = IP(dst='www.google.com')

# TCP(HTTP)パケットの作成
# sport, seqは適当 
# dportは標準である80版ポート, flagは'S'
tcp = TCP(sport=50000,dport=80,flags='S',seq=100)


'''3ハンドシェイクの実装'''
# SYNパケットの作成
syn= ip/tcp
# SYNパケットの送信
# ＆ SYN ACKの受取
syn_ack = sr1(syn)

'''HTTPリクエストの作成(ACKパケットの作成)'''
# ACKパケットの設定
tcp.seq += 1
tcp.ack = syn_ack.seq + 1
# ACKパケットのflagは'A'
tcp.flags = 'A'
# ACKパケット送信
ack = ip/tcp
send(ack)

# HTTP GETのパケットを乗っける
get = 'GET / HTTP/1.1\r\nHost: www.google.com\r\n\r\n' 
http = ip/tcp/get
# リクエスト送信
response = sr(http, multi=1, timeout=1)
tcp.seq += len(get)

# レスポンスの表示
response[0][1][1]["Raw"].load
```

#### コネクションを切る
```py3
'''コネクションを切る'''
# 上記のコードの続き
 
# FAフラグを持ったFINACKパケットの送信
tcp.flags = 'FA'
fin_ack = sr1(ip/tcp)
tcp.seq += 1

# 最後にACKを返す
tcp.ack = fin_ack.seq + 1
tcp.flags = 'A'
send(ip/tcp)
```
openFrameworksでマルチウィンドウ、マルチディスプレイの実装方法

当記事は、macOS 10.12.5 ,openFrameworks 0.9.8,Xcode8.3.3の開発環境を想定したものとなります。
尚、[こちらの記事](http://qiita.com/y_UM4/items/aa13f2ad4dc2a9896f79　)を参考にしています。
#マルチウィンドウを実装するには
 こちらについてはoFが提供している以下のexampleを参考にすることで実装できます。
・events/multiWindowExample
・events/multiWindowOneAppExample
具体的に記述すると以下のようになります。

```main.cpp
int main( ){
    ofGLFWWindowSettings settings;

    //メインウィンドウの情報を記述
    //ウィンドウの幅、高さ
    settings.width = 500;
    settings.height = 900;
    //ウィンドウを表示する座標（左上の座標を指定）
    settings.setPosition(ofVec2f(0,0));
    shared_ptr<ofAppBaseWindow> mainWindow = ofCreateWindow(settings);
    
    //サブウィンドウの情報を記述
    settings.width = 700;
    settings.height = 800;
    settings.setPosition(ofVec2f(ofGetWidth()/2,0));
    shared_ptr<ofAppBaseWindow> subWindow = ofCreateWindow(settings);
    
    //Appの生成
    shared_ptr<ofApp> mainApp(new ofApp);
    shared_ptr<SubApp> subApp(new SubApp);
    ofRunApp(mainWindow,mainApp);
    ofRunApp(subWindow,subApp);
    
    ofRunMainLoop();
}    
```

ここで使用しているSubAppクラスは`ofBaseApp`を継承したクラスを新たに作成したものです。こちらを実行すると、2つのウィンドウが表示されるはずです。SubAppクラスの`include`を忘れずに。
#マルチディスプレイの実装方法
こちらについても`ofGLFWWindowSettings`のインスタンスのプロパティを変更することで実現できます。また、それぞれのウィンドウをフルスクリーンにしたかったのですが、色々ハマったので備忘録として残しておきます。

```main.cpp
    ofGLFWWindowSettings settings;

    //メインウィンドウの情報を記述
    //ウィンドウの幅、高さを画面サイズに合わせる
    settings.width = 1440;
    settings.height = 900;
    //ウィンドウを表示する座標（左上の座標を指定）
    settings.setPosition(ofVec2f(0,0));
    shared_ptr<ofAppBaseWindow> mainWindow = ofCreateWindow(settings);
    
    //サブウィンドウの情報を記述
    settings.width = 1440;
    settings.height = 900;
    //ウィンドウを表示する座標
    settings.setPosition(ofVec2f(1440,0));
    shared_ptr<ofAppBaseWindow> subWindow = ofCreateWindow(settings);
```
先程のコードとの相違点は2つです。
・ウィンドウのサイズをディスプレイと同じサイズにすること。
・サブウィンドウの表示位置をメインウィンドウとサブウィンドウの境に設定したこと。

1つ目の変更についてはサブウィンドウ側も表示したいディスプレイと同じサイズにする必要があります。ちなみに`ofSetFullScreen`などを用いてフルスクリーンにしようとすると、座標の設定が無効となってしまうのか、全てメインディスプレイで表示されるようになってしまうのでご注意ください。
2つ目については、サブウィンドウが少しでもメインディスプレイの表示域に入ってしまうとメインディスプレイで表示されてしまうので、このような対応が必要です。座標は定数化しておくと後々わかりやすいかもしれません。
#ofGLFWWindowSettingsのプロパティ
最後にその他`ofGLFWWindowSettings`のプロパティが持つ意味を一部のみではありますが紹介いたします。筆者もまだまだ調査中ですのでご了承ください。

`decorated` :
 bool型のプロパティ。trueにするとメニューバーが表示され、falseにすると非表示になるようです。上記で実装したウィンドウは擬似的なフルスクリーンのため、メニューバーが表示されており残念でしたが、こちらをfalseにすると非表示にすることができました！

`multiMonitorFullScreen` :　
同じくbool型のプロパティ。trueを指定するとディスプレイ間を跨いでウィンドウを表示できるようになります。例えば、ウィンドウの左半分がメインディスプレイ、右半分がサブディスプレイに投影されるといったようになるようです。
Android 4 系で android:actionOverflowButtonStyle や android:homeAsUpIndicator が反映されない

テーマでツールバー上にあるアイコンを変えたければ以下のような感じで android:actionOverflowButtonStyle と android:homeAsUpIndicator を設定します。が、これだけだと古い端末で問題があります。

# 問題について
```xml
<style name="orenoActionBarOverflow" parent="android:style/Widget.Holo.ActionButton.Overflow">
  <item name="android:src">@drawable/oreno_overflow_icon</item>
</style>

<style name="OrenoTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:actionOverflowButtonStyle">@style/orenoActionBarOverflow</item>
  <item name="android:actionButtonStyle">@style/orenoActionBarOverflow</item>
  <item name="android:homeAsUpIndicator">@drawable/oreno_back_button</item>
</style>
```

これだけだと Android 4.0 ～ Android 4.4 までの端末で xml で指定したアイコンが設定されずデフォルトのものが使用されてしまいます。

# 対処方法
Android 4 系でも反映されるようにするには android: を外した設定も入れる必要があるそうです。以下のような感じです。

```xml
<style name="orenoActionBarOverflow" parent="android:style/Widget.Holo.ActionButton.Overflow">
  <item name="android:src">@drawable/oreno_overflow_icon</item>
</style>

<style name="OrenoTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:actionOverflowButtonStyle">@style/orenoActionBarOverflow</item>
  <item name="android:actionButtonStyle">@style/orenoActionBarOverflow</item>
  <item name="android:homeAsUpIndicator">@drawable/oreno_back_button</item>

  <!-- Android 4.0 ～ 4.4 向けにこれが必要！ -->
  <item name="actionOverflowButtonStyle">@style/orenoActionBarOverflow</item>
  <item name="homeAsUpIndicator">@drawable/oreno_back_button</item>
</style>
```
# 参考文献
* https://stackoverflow.com/questions/32114528/overflow-icon-kitkat-4-4-2
* https://stackoverflow.com/questions/13168843/actionbarsherlock-changing-homeasupindicator-doesnt-work
Gatsbyに関する調査メモ


ドキュメントを呼んで分からない範囲を調べたことのメモ

リポジトリは複数のパッケージで構成されている。
処理を追うには[packages/packages/gatsby](https://github.com/gatsbyjs/gatsby/tree/v1.6.3/packages/gatsby)あたりから追えばよい。

cliの各コマンドのエントリーポイント

* [develop](https://github.com/gatsbyjs/gatsby/blob/v1.6.3/packages/gatsby/src/bin/cli.js#L34)
	* [実際の処理の読み込み](https://github.com/gatsbyjs/gatsby/blob/v1.6.3/packages/gatsby/src/bin/cli.js#L56)
	* [実際の処理](https://github.com/gatsbyjs/gatsby/blob/v1.6.3/packages/gatsby/src/utils/develop.js)
* [build](https://github.com/gatsbyjs/gatsby/blob/v1.6.3/packages/gatsby/src/bin/cli.js#L60)
	* [実際の処理の読み込み](https://github.com/gatsbyjs/gatsby/blob/v1.6.3/packages/gatsby/src/bin/cli.js#L95)
	* [実際の処理](https://github.com/gatsbyjs/gatsby/blob/v1.6.3/packages/gatsby/src/utils/build.js)
* [serve](https://github.com/gatsbyjs/gatsby/blob/v1.6.3/packages/gatsby/src/bin/cli.js#L85)


# ビルド時はステップ別にwebpackを実行してる

* https://github.com/gatsbyjs/gatsby/blob/v1.6.3/packages/gatsby/src/utils/build-css.js#L13
* https://github.com/gatsbyjs/gatsby/blob/v1.6.3/packages/gatsby/src/utils/build-html.js#L27
* https://github.com/gatsbyjs/gatsby/blob/v1.6.3/packages/gatsby/src/utils/build-javascript.js#L16
*
Enumerable#maxの罠

配列から最大値を求めたい場合数値であれば

```rb
[1, 5, 3, 2].max
=> 5
```

のようにEnumerable#maxメソッド
を使えば簡単に最大値を求めることができます。

でこんどはブロックを渡して戻り値の最大値を求めようと思って以下のように書くと

```rb
["hoge", "foobar", "baz"].max{|s| s.size}
=> "baz"
```

意図した結果と違い、あれ？なんでや？となります

[ドキュメント](https://docs.ruby-lang.org/ja/2.4.0/method/Enumerable/i/max.html)を見ると
> ブロックの評価結果で各要素の大小判定を行い、最大の要素、もしくは最小の n 要素を返します。 引数を指定しない形式では要素が存在しなければ nil を返します。 引数を指定する形式では、空の配列を返します。ブロックの値は、a > b のとき正、 a == b のとき 0、a < b のとき負の整数を、期待しています。該当する要素が複数存在する場合、どの要素を返すかは不定です。

つまりブロックの戻り値の最大値を比較しているのでなくブロックの戻り値を<=>演算子の結果として利用しているということです。

```rb
["hoge", "foobar", "baz"].max{|s| p s.size; s.size}
6 # "hoge" < "foobar"
3 # "foobar" < "baz"
```

なので戻り値がマイナスとなるようにすれば結果は逆になります

```rb
["hoge", "foobar", "baz"].max{|s| p -s.size; -s.size}
-6 # "hoge" > "foobar"
-3 # "foobar" > "baz"
=> "hoge"
```

Enumerable#maxメソッドを使って意図した動作をさせるためにはブロックに引数を2つ渡してブロック内で <=> 演算子で比較する必要があります

```rb
["hoge", "foobar", "baz"].max{|a, b| p a.size <=> b.size; a.size <=> b.size}
1  # "hoge" < "foobar"
-1 # "foobar" > "baz" 
=> "foobar"
```

となり正しい結果が返ってきました。

また、こんな面倒なことをしなくても[Enumerable#max_byメソッド](https://docs.ruby-lang.org/ja/2.4.0/method/Enumerable/i/max_by.html)
を使えばブロックの戻り値が最大のものを返す元々maxで期待していた動作をします。
また、maxの際は比較ごとにsizeメソッドが呼ばれるのに対し、max_byでは各要素のsizeメソッドは1度ずつしか呼ばれないため処理効率からみてもこちらの方が良いコードです。
(@scivola さんのコメントより)

```rb
["hoge", "foobar", "baz"].max_by{|s| s.size}
=> "foobar"
```

たまたまmaxが正しい結果を返したりして気づかない場合もあるので、このmax, max_byの挙動は注意した方が良さそうです

その他min, minmax(こんなメソッドあるんですね)についても同様です。リンクを貼っておきます。

[Enumerable#min](https://docs.ruby-lang.org/ja/2.4.0/method/Enumerable/i/min.html)
[Enumerable#min_by](https://docs.ruby-lang.org/ja/2.4.0/method/Enumerable/i/min_by.html)
[Enumerable#minmax](https://docs.ruby-lang.org/ja/2.4.0/method/Enumerable/i/minmax.html)
[Enumerable#minmax](https://docs.ruby-lang.org/ja/2.4.0/method/Enumerable/i/minmax_by.html)
GoでWebクローラー作ってみた

キーワードを入力すると、そのワードでオーガニック検索した際の1ページ目のページURLを取得できるコマンドラインツールを作りました。
詳しくは下記のリポジトリを見て下さい。

https://github.com/ryonakao/WebCrawlerForSerps

## 参考
http://blog.kechako.com/entry/2016/03/09/225345
大変参考になりました。

## コード全貌

```main.go
package main

import (
	"flag"
	"log"
	"net/http"
	"net/url"
	"strings"

	"github.com/PuerkitoBio/goquery"
)

func Crawl(url string, depth int, m *message) {
	defer func() { m.quit <- 0 }()

	// WebページからURLを取得
	urls, err := Fetch(url)

	// 結果送信
	m.res <- &respons{
		url: url,
		err: err,
	}

	if err == nil {
		for _, url := range urls {
			// 新しいリクエスト送信
			m.req <- &request{
				url:   url,
				depth: depth - 1,
			}
		}
	}
}

func Fetch(u string) (urls []string, err error) {
	baseUrl, err := url.Parse(u)
	if err != nil {
		return
	}

	resp, err := http.Get(baseUrl.String())
	if err != nil {
		return
	}
	defer resp.Body.Close()

	// 取得したhtmlを文字列で確認したい時はこれ
	//body, err := ioutil.ReadAll(resp.Body)
	//buf := bytes.NewBuffer(body)
	//html := buf.String()
	//fmt.Println(html)
	// ---------------

	doc, err := goquery.NewDocumentFromReader(resp.Body)
	if err != nil {
		return
	}

	urls = make([]string, 0)
	doc.Find(".r").Each(func(_ int, srg *goquery.Selection) {
		srg.Find("a").Each(func(_ int, s *goquery.Selection) {
			href, exists := s.Attr("href")
			if exists {
				reqUrl, err := baseUrl.Parse(href)
				if err == nil {
					urls = append(urls, reqUrl.String())
				}
			}
		})
	})

	return
}

func main() {
	var word = flag.String("w", " ", "検索ワードを入力して下さい")
	flag.Parse()
	log.Println("検索ワード：", *word)
	*word = strings.Replace(*word, " ", "+", -1)
	firstURL := "https://www.google.co.jp/search?rlz=1C5CHFA_enJP693JP693&q=" + string(*word)
	log.Println("検索URL：", firstURL)
	m := newMessage()
	go m.execute()
	m.req <- &request{
		url:   firstURL,
		depth: 2,
	}

	if err := http.ListenAndServe(":8080", nil); err != nil {
		log.Fatal("ListenAndSearver:", err)
	}
}

```

```message.go
package main

import (
	"fmt"
	"log"
	"os"
)

type message struct {
	res  chan *respons
	req  chan *request
	quit chan int
}
type respons struct {
	url string
	err interface{}
}
type request struct {
	url   string
	depth int
}

func newMessage() *message {
	return &message{
		res:  make(chan *respons),
		req:  make(chan *request),
		quit: make(chan int),
	}
}

func (m *message) execute() {
	// ワーカーの数
	wc := 0
	urlMap := make(map[string]bool, 100)
	done := false
	for !done {
		select {
		case res := <-m.res:
			if res.err == nil {
				fmt.Printf("%s\n", res.url)
			} else {
				fmt.Fprintf(os.Stderr, "Error %s\n%v\n", res.url, res.err)
			}
		case req := <-m.req:
			if req.depth == 0 {
				break
			}

			if urlMap[req.url] {
				// 取得済み
				break
			}
			urlMap[req.url] = true

			wc++
			go Crawl(req.url, req.depth, m)
		case <-m.quit:
			wc--
			if wc == 0 {
				done = true
			}
		}
	}
	log.Println("スクレイピング完了")
	os.Exit(0)
}

```
Link > Accurately computing running variance > サンプルが到着するに連れ標準偏差を計算するには | np.append()よりはlist追加が速い

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
```

[TensorFlow > TFRecords > Queue and Threadsでの読込み > 読込みを進めるに連れ、読込み時間が増加する > 犯人はnp.append()](http://qiita.com/7of9/items/761049a8bd5c830a395a)
においてnp.append()を繰返すにつれ、処理時間が増加していく状態である。

np.append()を使わない方法として以下が考えられる。

1. ファイル出力 (or 標準出力のリダイレクト)
2. 逐次的なmean, stddev計算
3. np.append()でなくPython listを使う
   - https://stackoverflow.com/questions/7133885/fastest-way-to-grow-a-numpy-numeric-array

2に関しては、以下を見つけた。
https://www.johndcook.com/blog/standard_deviation/

1の方が簡単そう。
と思ったが3でもいいかもしれない。
[Ruby] 配列から入れ子のブロックを生成

一発ネタです

```rb
do_something_with array[0] do
  do_something_with array[1] do
    do_something_with array[2] do
      # ...
    end
  end
end
```

が欲しい！

```rb
array.reverse.reduce(Proc.new do
  # 一番内側のブロック
end) do |block, item|
  Proc.new do
    do_something_with item, &block
  end
end.call
```

別解：

```rb
array.reduce(:call.to_proc) do |block, item|
  Proc.new do |blk|
    block.call(Proc.new do
      do_something_with item, &blk
    end)
  end
end.call(Proc.new do
  # 一番内側のブロック
end)
```

ブロックにブロックを渡せないので厳しい
ErgoDox EZ の分解

#ErgoDox EZを分解してみよう
ErgoDox EZを購入したものの、分厚くてイマイチ使いづらい。
とりあえず裏蓋を外してみて、薄くならないか試してみよう。
あれ？裏蓋、外せないよ？
と言うことで、この記事を書きました。
##用意するもの
-プラスドライバ
-カッターナイフ
##ネジを外そう!
ErgoDox EZを裏返すと、見えているネジが7つあります。それらを全て取り外します。
これだけで裏蓋が外れればいいのですが、もう１つ見えていないネジがありました。

![IMG_6390.JPG](https://qiita-image-store.s3.amazonaws.com/0/164944/f6f3675c-944a-c80d-081b-13c60236fd77.jpeg)

ここの部分に、見えていないネジがあるので、カッターナイフでラベルを切り取ります。
そのネジを外せば、裏蓋を取り外すことができます。
各ViewControllerのStatusBarStyle変更

・iOSのステータスバーの種類は２つしかありません。
UIStatusBarStyleLightContent :white
UIStatusBarStyleDefault      :black

1. Info.plistに以下のKey追加
  -Key  : View controller-based status bar appearance
  -Type : Boolean
  -Value: NO

2.  各ViewControllerのviewDidLoadに以下を追加
　　[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
symbolicateを使わずにクラッシュログを(部分的に)解析する

最近、Appleのアプリ審査にmacOS用アプリをサブミットしましたが、残念ながらアプリがクラッシュしたらしく、クラッシュログが送られてきました。なんとも扱いに困ったもので、色々試した上で上手くいった結果を書こうと思います。

## 概要 ##
* クラッシュログ(.crashファイル)を解析する準備をする
* クラッシュログが与えられた状況で、そのアプリがクラッシュしたときの原因ファイルとその行番号を取得する

## 準備 ##
<ol>
<li>分かり易くするため、解析用のディレクトリ(今回はcrashというディレクトリを作った想定)をどこでもいいので作っておきます。</li>
<li>クラッシュログをiTunes　Connectからダウンロードして、crashディレクトリに入れます。</li>
<li>次に、クラッシュしたアプリ(提出したバージョン)をXcodeから掘り起こします。</li><br>

WindowのOrganizerを開きます。

<p><img width="707" alt="スクリーンショット 2017-08-26 7.02.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/175434/0b7ff6c3-2759-58b0-cae9-5bb6dfda63f2.png"></p>

Archiveしたときの画面がでてくるので、自分が提出したバージョンを選びます。
<p><img width="1199" alt="スクリーンショット 2017-08-26 7.01.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/175434/0dd2afa2-c80a-7947-12d6-d01b9aa672bc.png"></p>

Finderで表示します。
<p><img width="414" alt="スクリーンショット 2017-08-26 7.01.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/175434/e166600c-021e-7b80-3990-20704443deb2.png"></p>

パッケージの内容を表示して、Products/Applications/にある自分のアプリをcrashディレクトリにつっこみます。
<p><img width="589" alt="スクリーンショット 2017-08-26 7.02.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/175434/4e6aef17-19f3-6a10-c16c-4b003f420a1d.png"></p>

<li>クラッシュログを開いて、こんな感じに書かれている部分を探します。(アドレスがいっぱいのところ)
そのなかで、自分のアプリの識別子があると思うので、その後に続くアドレス2つを使います。</li>
<p><img width="756" alt="スクリーンショット 2017-08-26 7.14.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/175434/b37aef34-eae3-462b-e1b4-d60b87ce886c.png"></p>

<li>最後に、次のコマンドを実行します。ターミナルでの操作になります。crashディレクトリに移動してから実行してください。</li>
<pre><code>atos -o &lt;アプリ名&gt;.app/Contents/MacOS/&lt;アプリ名&gt; -arch x86_64 -l &lt;短い方のアドレス&gt; &lt;長い方のアドレス&gt;</code></pre>
今回の例なら、<br>
<pre><code>atos -o Welemfine.app/Contents/MacOS/Welemfine -arch x86_64 -l 0x102abf000 0x0000000102ac2878</code></pre>
となります。
</ol>

## 実行結果 ##
<p><img width="837" alt="スクリーンショット 2017-08-26 7.52.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/175434/7031c3c8-8a57-c487-d3ef-8d98ffff2463.png"></p>
なにやらWeatherViewController.swiftの73行目(NSCollectionViewのコールバック関数内)でクラッシュしたようです。デバッグせねばっ...!!!

## まとめ ##
本当はsymbolicateを使ってうまい具合に解析できれば良かったんですが、クラッシュレポートのバージョンが合わないとエラーが出て、一筋縄ではいきませんでした。また、すぐに対応する必要があったためこのような手法をとりました。あと、iOSのクラッシュログ解析の情報は割とありますね。

## 参考 ##
https://gist.github.com/bmatcuk/c55a0dd4f8775a3a2c5a
cisco 管理vlanの変更

# 趣旨
今回自宅にWAN向けルータとして、下記ciscoルータを導入した。
■cicsoルータ
- 名称：cisco 800M
- 型番：C841M-4X-JAIS/K9 
- OS:IOS15.5

デフォルトの管理vlanとしては1を使用している。
デフォルトをその儘使用するのは気分的に気持ち悪い。
その為、管理vlanを変更したいと思い変更時の備忘録的に
ここに記す。

# 環境
【現状】
WAN
|
[800M]
|
[vlan1]
|        |      |       |
[G0/0]  [G0/1]  [G0/2]  [G0/3]
|　      |　     |　     |
[Catalyst2650TL]
|       　　　|
[PC1]    [PC2]

【変更後】
WAN
|
[800M]
|
[管理vlan]   [プライベートvlan]
|　　　       　　  |  　　　 |　　　      |
[G0/0]  　　　[G0/1]  [G0/2]  [G0/3]
|　       　　　　　    |　　　     |　　     |
[Catalyst2650TL]
| 　　　　　　　　            |
[PC1]========[PC2]
         ↑疎通不可

# 終着点
設定完了後下記構成となっている事
■完了基準
- デフォルトvlan1は使用不可となる。
- 管理vlanにトランクされたインターフェイス内環境PCよりSSHが可能
- [PC1],[PC2]間の通信は不可となる。
- [管理vlan]以外の所属端末からは接続不可とする。
- [PC1],[PC2]はWANへ接続が可能である。

# 前提条件
本作業を実施する前提として下記が設定されている事
-ローカル端末より対象ルータへtelnet,ssh接続が可能である事
-pppoe設定は完了している事(WANへ接続しない環境なら不要)
-コンソール接続が可能である環境である事(失敗した際、電源落とすもしくはコンソールによる直接操作が必要となるため)

=================================================
※以下については随時更新

# 使用コマンド[設定]

# 使用コマンド[確認]
　[LC1]show interface
  インターフェイスの状態を確認する。
  特権モードにて実行可能

  [LC2]show vlan-swich
  作成されているvlanの現状を表にて表示
　特権モードにて実行可能
　
# 共通手順
[C1]リモート接続
　[C1-1]ターミナルアプリを起動
　[C1-2]ターミナルアプリよりsshもしくはtelnet接続
　
]
# 手順
[1]管理vlanの作成
　[1-1][C1]により対象ルータへ接続
  [1-2]現在の状態を確認
     [LC1]を実行
     [LC2]を実行
　　＞作成するvlanがいない事を確認
　　＞設定するインターフェイスにIP等の設定がされていない事を確認

[2]対象インターフェイスの設定
[3]デフォルトvlanの停止
[4]結線の変更
[5]確認
TensorFlow (GPU) > v1.1.0からv1.2.1への変更 | protobufがC++実装かどうか確認

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.1.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
```

TensorFlowをv1.1.0からv1.2.1に変更した。

参考: [Tensorflowのアップデート方法](http://qiita.com/pocute_physics/items/7021cd6abc0f31966af7)
参考: https://github.com/tensorflow/tensorflow/issues/10085


```
$pip3 uninstall tensorflow
```

```
$sudo pip3 install --upgrade tensorflow==1.2.1
```


```
$ pip3 list | grep tensor
DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
tensorflow (1.2.1)
```

### protobuf

protobufがcpp実装かどうかは以下で確認した。

```
$ python3 -c "from google.protobuf.internal import api_implementation; print(api_implementation._default_implementation_type)"
cpp
```

参考: https://stackoverflow.com/questions/41647784/tfrecordreader-seems-extremely-slow-and-multi-threads-reading-not-working/41688401
bundle installしたらrubyのバージョン古いよってエラーになる

新しいPCにRailsの環境を作っている時のお話。

新しいPCなので当然Rubyは入ってないので、いろいろ設定した。

```
$ brew install rbenv
$ rbenv install 2.4.1
$ rbenv global 2.4.1
$ ruby -v
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin15]
```

で、自分のgithubレポジトリにある勉強中のRailsチュートリアル14章をcloneして、`bundle install`するとエラーになる。

```
$ bundle install
Fetching gem metadata from https://rubygems.org/.........
Fetching version metadata from https://rubygems.org/..
Fetching dependency metadata from https://rubygems.org/.
activesupport-5.0.0.1 requires ruby version >= 2.2.2, which is incompatible with the current version, ruby 2.0.0p645
```

エラーの内容は、rubyのバージョン2.2.2以上を使えよって言ってるんだけど2.4.1になってる。
なんか変なところ見に行ってるとかなのかなと思ったんだけど、違う。

```
$ which ruby
/Users/opiyo0804/.rbenv/shims/ruby
```

確かにrbenvを使ってinstallする前は`/usr/....`みたいなところを参照していてはまった記憶がある。
それをきっと見に行ってる？

ってことは`bundle install`する時だけはそっちを参照しちゃってる。
それを解消すれば良いのかなーと思って調べてると、あったあった！
解決方法はこれだー

```
$ rbenv rehash
```

これが何してるかだけど。
rubyをrbenv使ってインストールすると、そのバージョン配下に色々インストールされる。
これをパスが通ってる場所にコピーしてくれるのがrehashの役目？
なんか違う気がするが、ようは使えるようにしてくれる魔法の言葉なのだろう。
だから、新しいrubyをインストールした時はrehashすればOKってことにする。
ノークリックの世界を広げるためにした簡単な試行錯誤

9月の新製品発表でLTEの機能がつく予測がありますApple Watchですが、初代発売時の期待とは裏腹に今つけている人はどれくらいなのだろうといった感じです。

そんなApple Watchですが、一つ私が気に入っている機能があります。Hey Siriです。
この機能を使えば、ノークリックで、こんなことができます(Apple Watchを顔の前に持ってくる必要がありますが)。

- 即席麺のタイマーにする
- タスクを追加する(場所や時間の条件をつけることもできる)
- 予定を追加する
- 知らない土地でここはどこか確認する
- iPhoneで聞いている曲にラブをつける、次の曲にする
- 猫画像をWebから表示させる

これらの機能はとても便利なのですが、メモが取れなかったり、メールが送れなかったりします。

## モチベーション

わたしは超忘れっぽい性格です。ですから、一瞬で簡単なメモが取れることは相当な生産性を上げることになります。

メモを取る、さらにメモをとるを実行するためにメールを送ることについて私が試したことをこのブログに残しておきます。

## ボイスメモをApple Watchで取る

### アプリを使う
メモアプリを使うことを最初考えました。しかし、すぐに使わななくなりました。

AppleWatchアプリの特性として、**必要なのはスピードです**。私はできれば**腕時計の作業など、ほぼ一瞬で行いたい**のです（腕あげてて疲れるし)。

### IFTTT経由でメモをとれないか
次に考えたのはAppleWatchからメールを送ることです。
次のフローを考えました。

```
AppleWatch → メール → IFTTT → Dropbox
```

しかし、Apple WatchのHey Siriではメールを送れません。ここで詰まりました。

### Apple Watchでメールを送る方法

何か突破口はないかとApple WatchのHey Siri機能の一覧を見ていると、メッセージを送るがあることに気づきました。

メッセージ.appはSMSとMMSとiMessageを送るソフトです。
この中にMMSがありました。
これは昔のezwebメール(auの場合)で、ガラケー時代にはこれでEメールを送っていました。つまり、機能としてはこれは単なるメール機能なのです。
LINEが普及した現在、近年使うこともありませんでした。私はこの機能に毎月数百円を払っていましたがすっかり塩漬けになっていました。

これをうまく利用すれば、Apple Watchからメールを送信できることに気づきました。

これで下記のワークフローが実行可能になります。

```
AppleWatch → メール → IFTTT → Dropbox(別にEvernoteなどでも良い)
```

## 例

iPhoneのアドレスブックにIFTTTのアドレスを"メモ"とニックネーム登録しておき、

```
Hey Siri, 〇〇とメモにメッセージ
```

と呟くことでボイスメモが作れることになります。

### Gmailを利用する(追加)
ここで欲がでました。

*「もっといろんな機能をキックしたい」*

すると、gmailでエイリアス機能があることを思い出しました(アカウントの後ろに+をつけて無限にアドレスを増やす機能です)。あとはこれとgmailのラベル機能を組み合わせることで特定の人にメッセージが送れるワークフローができることに気づきました。これは、LINEなどと合わせるとさらに便利なんじゃないでしょうか。

1. gmailでMAILTO/誰々ラベルを作る
2. gmailのルールで`xxx+mail.to.yyy@gmail.com`宛へのメールは1.で作ったラベルをつけるようにする
3. IFTTTでThisにGMailを選択、"new email in inbox labeled"を選択、1.のラベルを指定
4. IFFTTでThenにGMailを選択、"Send an email"を選択、送信したい相手のアドレスを選択

みたいなことができます。

他に私は体重の記録なども面倒くさいのでこのフローでHealthKitに登録しています。

## 感想
IFTTTを使いこなせている方なら、なんとなく、この便利さがわかっていただけるのではないでしょうか。
アクションのキックをノークリックでできるこの世界、なかなかいいと思いませんか?
浮動小数点数のビット数と有効桁数

# はじめに
浮動小数点数のビット数と有効桁数の一覧を記載します。

# 対応表
10進数有効桁数とCの対応表を次に示します。

| type | bit length | (A) | (B) |
|:--|:-:|:-:|:-:|
| float | 32 | 24 | 7.22 |
| double | 64 | 53 | 15.95 |
| long double | 80 | 64 | 19.26 |

(A) : 有効桁のビット長
(B) : 10進数有効桁数 = $log_{10} 2^{(A)}$
[メモ] ASUS TinkerBoard : シリアルコンソールを使う

ASUS Tinker Board でシリアルコンソール使う場合、`/boot/extlinux/extlinux.conf` を書き換える。

- 電源投入直後 (5秒のカウンダウン。そのあいだにキー入力すると、u-bootのコンソールへいく)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/75594/14f918b0-8a6b-7b91-559d-6e250b293e71.png)

- login:　　(loglevel=3 アリ)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/75594/39908d21-8587-0b4f-b877-263610cd8be0.png)

- ケーブルの色は、メーカーによって違うかもしれないので、気をつけるように<br>![TInkerBoard-UART.jpg](https://qiita-image-store.s3.amazonaws.com/0/75594/75df54ad-6c80-a7f3-6a68-e88f8b1b84cc.jpeg)


## 概要

- USB-UARTケーブルで、シリアルコンソールを使用する。
- TinkerOS 2.0.1以前だと、電源オンで、rootで自動ログインしてた。<br>TinkerOS 2.0.1のリリースノート > `6. For security reasons, we disabled serial console auto login.`
- `extlinux/extlinux.conf`は、FATパーティションにあるので、Windowsで編集可能。

## 環境
- ASUS Tinker Board 
- TinkerOS 2.0.1 beta : `20170817-tinker-board-linaro-stretch-alip-v2.0.1.img.zip`
- UART-USBケーブル
- 参考: Windows : TeraTerm

## 手順
1. `/boot/extlinux/extlinux.conf`の`console=tty1` を `console=ttyS1,115200n8`に置き換える

	```bash:コピペ
	# バックアップ 
	[ ! -e ${HOME}/extlinux.conf.org ] && cp  -v -i /boot/extlinux/extlinux.conf ${HOME}/extlinux.conf.org
	# 置換
	sudo sed -i -e 's/console=tty1/console=ttyS1,115200n8/' /boot/extlinux/extlinux.conf
	```
\# メッセージがうざい場合は、`loglevel=3` もいれる。
	- 参考:

		```txt:変更前-extlinux.conf
		label kernel-4.4
			kernel /zImage
			fdt /rk3288-miniarm.dtb
			append earlyprintk quiet splash plymouth.ignore-serial-consoles console=tty1 root=/dev/mmcblk0p2 rw init=/sbin/init
		```

		```txt:変更後-extlinux.conf
		label kernel-4.4
			kernel /zImage
			fdt /rk3288-miniarm.dtb
			append earlyprintk quiet splash plymouth.ignore-serial-consoles console=ttyS1,115200n8 loglevel=3 root=/dev/mmcblk0p2 rw init=/sbin/init
		```



2. USB-UARTケーブルをつなぐ
	1. TinkerBoard側

		6,8,10番ピンに挿す。
		- 6 (GND)
		- 8 (**TX**: TinkerBoardからみて送信)
		- 10 (**RX**: TinkerBoardからみて受信)
[<img src='https://www.asus.com/us/Single-Board-Computer/Tinker-Board/websites/global/products/UUSx6FPuqP3uZrhv/images/pic_gpio.png' alt="ASUS Tinker Board - Pin Mapping"/>](https://www.asus.com/us/Single-Board-Computer/Tinker-Board/websites/global/products/UUSx6FPuqP3uZrhv/images/pic_gpio.png)

	2. Windows
		- USBにざくっと挿して、必要あればドライバをインストール<br>=> `COM24` という感じで、認識されるので、デバイスマネージャでみて確認。<br>![image.png](https://qiita-image-store.s3.amazonaws.com/0/75594/2b68d499-7f4c-649c-35cd-d77605d59819.png)
		- Teraterm
			- ALT+N (新規接続)にて<br>![image.png](https://qiita-image-store.s3.amazonaws.com/0/75594/0ab07944-dcd8-c8da-1526-f417c0cf65b4.png)
			- 接続後、ALT+S E にて、通信速度設定 **115200**bpsへ<br>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/75594/ab080cd6-1755-53c4-790e-b1e742ebc54b.png)








<!-- 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/75594/7d241f0f-f1b6-7e2e-7234-4906c00c4e42.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/75594/9a0fc90b-9c51-e2ae-0028-a9c623e0cbe5.png)
![pic_gpio[1].png](https://qiita-image-store.s3.amazonaws.com/0/75594/8c276d52-6867-98b9-7d48-e7c66c161421.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/75594/2963b623-39e5-fa1e-bc3f-883cc02ab71c.png)
-->
Atomを完全に取り除くシェルスクリプト

#### 概要

単純な`rm -rf`の繰り返しでAtom関連のものを根こそぎ消し去るシェルスクリプト.
使用にはくれぐれも注意を.
(使用環境:MacOS 10.12.1)

```bash:eliminate_atom.sh
rm -rf ~/.atom
rm -rf /usr/local/bin/atom
rm -rf /usr/local/bin/apm
rm -rf /Applications/Atom.app
rm -rf ~/Library/Preferences/com.github.atom.plist
rm -rf ~/Library/Application\ Support/com.github.atom.ShipIt
rm -rf ~/Library/Application\ Support/Atom
rm -rf ~/Library/Saved\ Application\ State/com.github.atom.savedState
rm -rf ~/Library/Caches/com.github.atom
rm -rf ~/Library/Caches/Atom
```

#### 使い方

`touch eliminate_atom.sh`などで空のシェルスクリプトを作成して上記の内容を貼り付ける.
`chmod u+x eliminate_atom.sh`で実行可能にする.
`./eliminate_atom.sh`でAtomとお別れする.

###### Atomと再会する日のために

事前に`apm list > atom_package_list`などでパッケージ一覧を書き出しておく.
そうすればAtomと再会したときに入れるパッケージ一覧がわかる.
【ASP】半角1バイト・全角2バイト換算で文字列の桁数を取得する

# はじめに
別システムとの桁数が一致しないことでエラーが発生するというのを防ぐために、桁数を一致させる改修作業を行いました。
CSV(Shift-JIS)ファイルを経由してASPにパラメーターが渡ってきます。

実際にテストしてみると想定した桁数を超えてもエラーになってくれませんでした、この原因を探ってみました。

# 文字数の取得関数
ASPで言語はVBScriptでコードページは65001でUTF-8を使用しています。
※レガシーASPを使用しています。ASP.NETではありません。

## Len関数
指定した文字列の文字数を返します。

## LenB関数
指定した文字列のバイト数を返します。
ASPでは内部でUNICODEを使用しているため、LenBは半角でも2バイトとして扱います。

## ユーザー関数
標準の関数では、想定した半角1バイト・全角2バイトで返してくれないため、ユーザー関数を作成することになります。

引用：[VBScript でシフト JIS の文字列のバイト数を数える (unibon)](http://www.geocities.co.jp/SiliconValley/4334/unibon/asp/len.html)

```vb
Dim s
s = "abcあい"
Call MsgBox("MyLen = " & MyLen(s))  ' 結果 MyLen = 7

Function MyLen(ByVal a)
    Dim c
    c = 0
    Dim i
    For i = 0 To Len(a) - 1
        Dim k
        k = Mid(a, i + 1, 1)
        If (Asc(k) And &HFF00) = 0 Then
            c = c + 1
        Else
            c = c + 2
        End If
    Next
    MyLen = c
End Function
```

# 落とし穴
ユーザー関数を使うと確かに想定した結果を返してくれたのですが、これには落とし穴がありました。
それが上述した「実際にテストしてみると想定した桁数を超えてもエラーになってくれなかった」の原因でもあります。

ASPファイルをShift-JISで保存していた時は想定した結果を返してくれていましたが、この処理を組み込んだASPファイルはUTF-8(BOM付き)で保存されていたため、全て1バイトとして結果を返してくるようになったのです。

ソースリストをgitで管理する際に文字化けを避けるためにUTF-8(BOM付き)に保存形式を変えたのですが、ここに影響するとは思ってなかったです。

# 対応
当初は、ADODB.Streamを使って文字列をShift-JISに変換を試みるも上手くいかなくて、いろいろ模索した中で最終的に出来たのが下記コードになります。
半角カタカナは2バイト圏なので、1バイトに補正して件数をカウントしています。

参考：[文字コード関係で遊ぶ ASC関数とASCW関数](http://www.ken3.org/cgi-bin/test/test097-1.asp?DATA=%82%A0)
参考サイトはShift-JISで保存されて運用されているので、UTF-8(BOM付き)で保存してローカル上のIIS上で確認しました。

```vb
Dim s
s = "abcあい"
Call MsgBox("LenByte = " & LenByte(s))  ' 結果 LenByte = 7

Function LenByte(value)
	Dim i, str
	Dim bytes, code
	LenByte = 0

	If Trim(value) <> "" Then
		For i = 1 To Len(value)
			str = Mid(value, i, 1)
			bytes = 1
			code = AscW(str)
			If (code And &HFF00) <> 0 Then
				'半角カタカナ以外は、2バイト
				If code < &HFF61 or code > &HFF9F Then bytes = 2
			End If
			LenByte = LenByte + bytes
		Next
	End If

End Function
```
## サロゲートペア
𩸽(ホッケ)は、サロゲートペアで4バイトの文字となり、Len関数でも2文字分(0xD867,0xDE3D)として扱われます。

参考:[連載! とことん VB: 第 5 回 4 バイト長の文字 (サロゲート ペア) の文字列操作の方法 ～ホッケが仲間はずれの理由～](https://code.msdn.microsoft.com/5-4-d6f2a627/)

```vb
Dim s
s = "𩸽"
Call MsgBox("LenByte = " & LenByte(s))  ' 結果 LenByte = 4
```

ユーザが入力した値にサロゲートペアが含まれていたらエラーにしてしまうでもいいかも知れません。そうすると𠮷野屋の「𠮷」もサロゲートペアなので入力できなくなりますね。

* [サロゲートペアをJavaScriptで検出する方法](http://webdev.seesaa.net/article/33141943.html)
* [サロゲートペアをJavaScriptでチェックする](http://glasses-se-note.com/surrogate1/)
* [JavaScript における文字コードと「文字数」の数え方](https://blog.jxck.io/entries/2017-03-02/unicode-in-javascript.html)

# 最後に
データベース(Oracle)では、桁数の3倍の領域を確保しています。桁数チェックをShift-JIS扱いで換算しておけば、企業で使用する上では運用上は超えることはないでしょう。
個人向けサイトではきっちり桁数チェックしておかないと危ういですが、そもそもレガシーASPを使用してないですよね。


仕様で文字数なのか文字数(バイト)とするのか決めておかないと、あとあと問題になるので、設計段階で確認しておきましょう。
Xcode8でmacOS向けのアプリでのLabelの使い方？

この記事では[xcode8.3.3],[swift3.1]を使っています。
まとめが一番後ろにあるのでたぶんそこだけ見れば大丈夫です。
## 想像してたやつ
```iOSViewController.swift
import UIKit

class iOSViewController: UIViewController {
    @IBOutlet var label:UILabel!
    count:Int = 0
    override func viewDidLoad() {
        super.viewDidLoad()
        label.text = String(count)
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
```
##書いたやつ
```ViewController.swift
import Cocoa

class ViewController: NSViewController {
    @IBOutlet var label: NSTextField!
    var count:Int = 0
    override func viewDidLoad() {
        super.viewDidLoad()
        label.intValue = Int32(count)
    }
    override var representedObject: Any? {
        didSet {
        }
    }
}
```
#違ったところまとめ
- UILabel -> NSTextField
- .textではなく.{型(ex. Int,String,...)}Valueと書く
- ただしintValueで指定される型はInt32
世界一簡単なVirtualBoxのインストール手順 (Windows10, AMD64)

##### 「ファイル名を指定して実行 ( <kbd>Windows</kbd>+<kbd>R</kbd> ) 」で、以下実行。
```PowerShell
powershell.exe -Command "Start-Process -FilePath powershell.exe -Args '-Command "Invoke-RestMethod -Uri https://koginoadm.github.io/ps1/install-virtualbox.ps1 | powershell.exe -"' -Verb RUNAS"
```

##### おわり。

~~実体は[こちら](https://github.com/koginoadm/ps1/blob/master/install-virtualbox.ps1)~~
クロージャ～関数内のスコープにある引数以外の変数を参照できる関数～

## クロージャーとは
　関数内の変数の参照は通常、引数を介して行います。ところが引数を介さずにある関数のスコープ内の変数を参照できる関数を定義することができます。これを **クロージャー** といいます。
　引数を介さずに関数内の変数を参照するためには通常はアクセッサメソッドである**getter()**を使います。しかし、**クロージャー**はアクセッサメソッドを介さずに関数内のある変数を参照することができるのです。
## クロージャーのコード例
　それでは、クロージャーの具体例をサンプルでみてみましょう。
####関数**ストップウォッチ()**の定義
　以下のコード例では、引数のない関数 **ストップウォッチ()** を定義しています。この関数内のスコープに可変変数**カウンター**を宣言し、初期値として 0 を格納しています。この**カウンター**は外部から参照することはできません。
　しかし、この関数は**引数のない無名関数を返す**処理を行っています。この無名関数が**クロージャ**です。
####**クロージャ**の定義
　具体的にはこの**クロージャ**には名前がなくて引数もないので「**()**」のように記述しています。そうして、このクロージャの処理を「**⇒**」記号の右辺に記述しています。処理は可変変数 **カウンター** の値を１インクリメントすることです。
　さらに、この**クロージャ**の戻り値は可変変数 **カウンタ** になります。Scalaでは関数の最後の式や値が評価されてそのまま戻り値になります。したがって、この**クロージャ**の戻り値は可変変数 **カウンタ** になります。
　これで、関数**ストップウォッチ()**内の可変変数 **カウンタ** が参照できました。
####関数を利用して可変変数 **カウンタ** の参照
　まず、関数 **ストップウォッチ()** を不変変数**計測**に代入します。不変変数**計測**のクロージャー**()**を呼び出すたびに可変変数 **カウンター** がインクリメントされて１づつ値が増えていきます。実行結果は以下のようになります。
####クロージャーのコード例(ストップウォッチ.scala)
```ストップウォッチ.scala
object Main extends App {
  def ストップウォッチ() = {
    var カウンタ = 0
    () ⇒ カウンタ += 1 ; カウンタ
  }
  
  val 計測 = ストップウォッチ()
  print( 計測() + "秒 : " )
  print( 計測() + "秒 : " )
  print( 計測() + "秒 : " )
  print( 計測() + "秒 : " )
  print( 計測() + "秒 : " )
}
```
### 実行方法

```bash
$ scala ストップウォッチ.scala
```

### 実行結果

```bash
1秒 : 2秒 : 3秒 : 4秒 : 5秒 :  
```

### コード例(ストップウォッチ.scala)のソースコードと動作
　以下のWebサービスで動作を確認してみてください。
>https://paiza.io/projects/X-nwb6dyTrfhjfLfecK-EQ