OmniAICreator/Qiita-1.07M huggingface dataset:
Python3入門①~データ型について

##Pythonのデータ型について理解を深める

今回データ型について学んだので記事にしたいと思いました。
(既に先人の方々の記事が沢山あるけどアウトプットを兼ねて)


##Pythonのデータ型(オブジェクト)における各データ型利用時の注意点
まずPythonには、**Mutable**な型と**Immutable**な型がある。
どういうことかというと。。。まずは意味から。
**Immutable** => ***不変***なデータ(Pythonではオブジェクト)
**Mutable**   => ***可変***なデータ(Pythonではオブジェクト)
##Ex.
**[Immutable]**

```python
tmp_str="JoJo"
tmp_str[3]="i" 
#TypeError: 'str' object does not support item assignment
tmp_tuple=("Dominator","Paralyzer")
tmp_tuple[1]="Eliminator" 
# TypeError: 'tuple' object does not support item assignment
```


**[Mutable]**

```python
tmp_list=["Dominator","Paralyzer"] 
tmp_list[1]=["Eliminator"]
```
**※Mutableな型は関数の引数としてデフォルト定義すると、参照渡しになるので注意が必要**


##Pythonのデータ型(Standard)には何がある??
| Type | Mutable | Immutable|
|:-:|:-:|:-:|
| String |   | ○ |
| Int    |   | ○ |
| Tuple  |   | ○ |
| List   | ○ |   |
| Dict   | ○ |   |
| Set    | ○ |   |
| Boolean  |   | ○ |
|   |   |   |

##色々試してみた

```python
# Mutable objects can be put in Immutable object
tmp_list = ['Ichinokata','Ninokata']
tmp_tuple = ('Mizunokokyu',tmp_list)
# OK
tmp_tuple[1].append('Sannokata')
# NG
tmp_tuple[0]='Zenshuuchunokokyu'

# List comprehension
tmp_kokyu_list = list(tmp_tuple)
kokyu_list=[tmp_kokyu_list[i] for i in range(0,len(tmp_kokyu_list))]

# Target dictionary data
persons={
   0: {
        "name":"Rouis lit",
        "age":41,
        "Position":"Corporate Attorney",
    },
   1: {
        "name":"Harvey Spector",
        "age":41,
        "Position":"Assistant District Attorney",
    }, 
   2: {
        "name":"Rachel Zane",
        "age":33,
        "Position":"Corporate Attorney",
    }, 
   3: {
        "name":"Mike Ross",
        "age":37,
        "Position":"Junior Partner",
    },     
}

persons_list_length=len(persons)
base_index=0
def swap_value(data, index, index_plus_one):
    swap = data[index]
    data[index] = data[index_plus_one]
    data[index_plus_one] = swap

# Pass by reference and sort data (Just test)
for i in range(base_index,persons_list_length-1):
    for j in range(base_index,persons_list_length-i-1):
        if persons[j]["age"] > persons[j+1]["age"]:
            swap_value(persons, j, j+1)

print(persons)

# If persons type is "list"
# Just call below and you'll see same result
persons.sort(key=lambda x: x['age'])

```

##ひとまずまとめ
・データ型を学ぶだけでも沢山の知見を得られる
・公式のリファレンスはちゃんと読む
~~・関数の仮引数にMutableな型を指定すると参照渡しになるので注意する~~

>参照渡しそれ自体はありません。

・Pythonには便利な機能が沢山
＊個人的には、ImmutableとかMutableは新しい概念だったので内部的にどのようにメモリ/アドレス確保したり書き込みをできなくしているのか気になった
SQLその2 データベース登録・更新・削除

 テーブルに保存するデータの操作について書きます。
 ちなみにmysqlを使用です。

# 基本準備
 ターミナルから前提の準備をします。

```bash
   $ mysql -u root
     mysqlに接続

   $ USE データベース名;
     データベースを選択
```

# データの操作　登録・更新・削除
　基本はこの3要素です先にまとめた一覧です。

```bash
$ INSERT INTO テーブル名 VALUES(値1, 値2, 値3);
  登録
$ UPDATE テーブル名 SET 変更内容 WHERE 条件;
  更新
$ DELETE FROM テーブル名 WHERE 条件;
  削除
```

## データの登録(INSERT)

```bash
   $ INSERT INTO テーブル名 VALUES(値1, 値2, 値3);
     全てのカラムに値を入れる場合

　　　仮にid,name,ageの順番でカラムがある場合
　　　順番に　idに値1,nameに値2,ageに値3が入ります。
 
   $ INSERT INTO テーブル名(カラム名1, カラム名2) VALUES(値1, 値2);
     特定のカラムのみに値を入れる場合
```



## データの更新(UPDATE)

```bash
$ UPDATE テーブル名 SET 変更内容 WHERE 条件;

例
$ UPDATE reidai SET money = 100 WHERE id = 2;

これでidが2のレコードのmoneyを100に更新される。
```

## データの削除(DELETE)

```bash
$ DELETE FROM テーブル名 WHERE 条件;

例
$ DELETE FROM redai WHERE id = 2;
```

















# データの確認
```bash
SELECT * FROM テーブル名;
これで*によって全選択され全てが見れます。
```
ER図の書き方を詳しく教えてくれる記事と書くのに便利なサイトを紹介

Webアプリ開発初期段階で作成するER図の書き方を詳しく教えてくれた記事と、書くのに便利だったサイトを紹介します。

##ER図の書き方を詳しく教えてくれた記事

[若手プログラマー必読！５分で理解できるER図の書き方５ステップ](https://it-koala.com/entity-relationship-diagram-1897)

##ER図を書くのに便利だったサイト

[cacoo](https://cacoo.com/)

どちらとも自分のようなプログラミング初学者にとってありがたい存在でした。
命名規則について

# 目的

- 自分の中で若干不明瞭な命名規則についてまとめる。
- 自分の命名規則が曖昧すぎてコードの品質が悪いので正しい使用用途をまとめる。

### キャメルケース(camelCase)

- 単語の頭文字を大文字にする。
- 全ての単語の頭文字を大文字にするものをアッパーキャメルケース(パスカルケース)という。(例: FirstName)クラス名で使用する。
- 最初の単語の頭文字を大文字にしないものをローワーキャメルケースという。(例: firstName)インスタンス化した変数や関数で使用する。

### スネークケース(snake_case)

- 単語と単語の間にアンダーバーを入れる。(例: first_name)データベース系で使用する。
- 全ての英字を大文字にするものをコンスタントケースという。(例: FIRST_NAME)定数やグローバル変数など特別な値を格納する変数名などに使用する。

### ケバブケース(kebab-case)

- 単語と単語の間にハイフンを入れる。(例: first-name)
- HTMLの属性やクラスの命名時に使用する。

# 前述の内容のまとめ

- アッパーキャメルケースはクラス名で使用する。
- ローワーキャメルケースはインスタンス化した変数や関数で使用する。
- スネークケースはデータベース系の内容で使用する。
- コンスタンスケースは定数やグローバル変数など特別な変数で使用する。
- ケバブケースはHTMLの属性やクラス命名時に使用する。

# 大切だと感じること

- 各ケースのルールを混成して命名しない。
- 変数なら格納される値や使用用途によって命名規則を使い分ける必要がある。
- 命名規則をうまく使い分け、可読性の高いコードを心がけよう。

# 参考にしたサイト

- [https://html-coding.co.jp/knowhow/tips/naming-rule/](https://html-coding.co.jp/knowhow/tips/naming-rule/)
512byteを超えたブートローダをvirtual boxで動かす

[作って理解するOS x86系コンピュータを動かす理論と実装の実装](https://www.amazon.co.jp/dp/429710847X/ref=cm_sw_r_tw_dp_U_x_6gb0DbBSTQP01)を読んでてvirtualboxで動かすのに詰まったので

2nd stageに入ったブートローダは512byteを超えるのでフロッピーとして追加できなかった。
ggって出てくるisoにするやつはなんか動かなかった。objdumpしても511と512byte目は0x55aaだったけど。セクタの大きさが違うのかな？とか思ったけどどうなんだろ(だれか・・・)

仮想ハードディスクにしたら動いた。

```
$ sudo dnf install -y qemu
$ qemu-img  convert -p -f raw main.img -O vdi a.vdi
```

でa.vdiをマシンに追加する。main.imgは適宜名前が変わると思います

ただこれだとa.vdiを更新するたびになんか(多分UUIDが変わるのでなんとかかんとか)動かなくなって再読込しないといけない。なんとかなりませんか・・・(だれか・・・)
配列に要素を追加

#配列に要素を追加

```php:index.php
$text = [];
$array = ["hoge", "piyo"];
```

`$text`に`$array`の要素を追加するという処理を書いていきます。

私が当初考えていた処理が次の処理です。

```php:index.php
$text = [];
$array = ["hoge", "piyo"];
foreach ($array as $str) {
    $text[] = array_push($text, $str);
}
```

こちらを実行し`$text`を`var_dump()`すると

```php:index.php
array(4) {
  [0]=>
  string(9) "hoge"
  [1]=>
  int(1)
  [2]=>
  string(9) "piyo"
  [3]=>
  int(3)
}
```

このような結果が返ってきます。
`$text`の[1]と[3]に何やら謎の要素が入ってしまっています。
実はarray_pushは返り値を返すのです。
返り値の値は、`array_push`した段階での配列の要素数になります。

```php:index.php
array(4) {
  [0]=>    // ---------------->①
  string(9) "hoge"
  [1]=>
  int(1)
  [2]=>    // ---------------->②
  string(9) "piyo"
  [3]=>
  int(3)
}
```

`'hoge'`を①、`'piyo'`を②とします。

`array_push`で`'hoge'`を追加した時点では`'hoge'`のみが`$text`配列に入っているので、要素数は`1`となり、返り値として、`1`を返します。

次に`'piyo'`を追加した時点では、`$text`配列には`'hoge'`と`1`と`'piyo'`が入っており要素数は`3`となり返り値として`3`を返します。

こちらの処理を想定通りに動作させる為のコードとしては、

```php:index.php
$text = [];
$array = ["hoge", "piyo"];
foreach ($array as $str) {
    array_push($text, $str);
}
```

または、

```php:index.php
$text = [];
$array = ["hoge", "piyo"];
foreach ($array as $str) {
    $text[] += $str;
}
```

とすると良いです。

実行結果を確認すると、

```php:index.php
array(2) {
  [0]=>
  string(4) "hoge"
  [1]=>
  string(4) "piyo"
}
```

きちんと表示されました。

以上、配列に要素を追加するでした。

ご閲覧ありがとうございました。
SQLその1  データベース構造


SQLで使われるコード一覧について書こうと思います。
チートシートの要領で使えれるのを前提で書きます。


# データベース構造の操作

```bash
   $ mysql -u root
     mysqlへ接続
   
   $ SHOW DATABASES;
     データベースの確認

　　$ CREATE DATABASE データベース名;
     データベースの作成

   $ USE データベース名;
     データベースの選択

```

# テーブル構造の操作

```bash
   $ SHOW TABLES;
     選択したデータベースに存在するテーブルを一覧で表示する

   $ CREATE TABLE テーブル名 (カラム名 カラム名の型, ……);
     テーブルを作成

   $ SHOW columns FROM テーブル名;
     テーブル構造を確認

   $ ALTER TABLE テーブル名 操作
     カラムの追加・修正・削除
    
    具体例は

    ALTER TABLE テーブル名 ADD カラム名 カラムの型;
      カラムを1つだけ追加する場合

    ALTER TABLE テーブル名 ADD (カラム名 カラムの型, ……);
      カラムを複数追加する場合

    ALTER TABLE テーブル名 CHANGE 古いカラム名 新しいカラム名 新しいカラムの型;
      カラムの修正

    ALTER TABLE テーブル名 DROP カラム名;
      カラムを削除
```
background-image  で背景画像が表示されない

## 相対パスを用いて表示されない時の対処法

HTML・CSSを覚えたての私が、`CSS` 内で `background-image` を使って背景画像を表示させようとしたところ、うまく表示されない...:sweat_smile: 


調べてみたところ、次のことが分かりました。

- `絶対パス`と`相対パス`というものが存在するらしい。
- `相対パス`を用いる際は階層に注意する必要がある。

絶対パスというのは、URLなどでページやファイルを直接指定する方法ですね。
今回は相対パスを用いて背景画像を指定する際のポイントについてまとめます。

初歩的な内容ですが、自分の学習記録としてまとめてみました。

---

### 失敗の原因　　どこから見たパスなのか？
今回使っていたファイルの階層構造は下記の通り。

- 親フォルダ
 - index.html
 - CSSフォルダ  →　styles.css（ここから画像ファイルを指定）
 - imgフォルダ  →　pic1.png（背景に表示したいやつ）
 

このような階層構造のとき、今までHTML内で `<img src="〜">`で画像ファイルを指定していた経験から、
今回のようにCSS内で背景画像を指定する際も単純に img ディレクトリ内の pic1 を指定すれば良いものだと思っていました。

▼具体的にはこんな感じ

```CSS:styles.css
/* 略 */
.top-wrapper {
  background-image: url("img/pic1.png");
  background-size: cover;
}
/* 略 */
```
これが失敗の原因でした。

というのも、相対パスでURLを指定する際は**HTMLファイルからではなく、CSSファイルから見たパスを指定する**必要があるようです。

---

というわけで。

1. styles.css ファイルから一つ上の階層にある CSS フォルダに戻り（../）、
2. CSS フォルダと同階層にある img フォルダ内の、pic1.png ファイルを指定する（img/pic1.png）


```CSS:styles.css
/* 略 */
.top-wrapper {
  background-image: url("../img/pic1.png");
  background-size: cover;
}
/* 略 */
```
解決しました:slight_smile:
たったこれだけですが、パスの意味を知るきっかけになり良かったです！

---

▼参考にさせていただいたサイト
>
- [background-imageが表示されない！絶対パスと相対パスを理解する](https://miiini.com/background-image-miss/)
- [cssで背景に指定した画像だけが表示されない]
(https://ja.wordpress.org/support/topic/css%E3%81%A7%E8%83%8C%E6%99%AF%E3%81%AB%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%9F%E7%94%BB%E5%83%8F%E3%81%A0%E3%81%91%E3%81%8C%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84/)

また、表示したい画像の大きさによっては、width や height を設定しないと十分なスペースが確保されずに画像が切れてしまうこともあるようです。
> - [< body > 内でbackground-imageが効かないことに関して]
(https://teratail.com/questions/19088)
[Julia] 型にはまって、最適に計算しよう。~関数における型と型安定について~

# 前置き
　Juliaは「型システムを柔軟に適用できる」ことが強味とされているそうです。今回は型をどのように計算の中に適応するのかと、その柔軟さゆえに気を付けなければならない「型安定でない」場合について簡単に説明します。

# 「型システムを柔軟に適応できる」とは
　「型システムを柔軟に適応できる」ことの一例としては、関数に型を引数として与えられることが挙げられます。Float64などの数値型自体を関数の引数とすることができるのです。例えば以下のようなコードを作製することができます。

```julia

#iが偶数の時のみ1/iを足し合わせる。Tは型を指定する引数。
function test1(n,T)
    f = zero(T)
    for i::T in 1:n
        #i%2==0の時1/iを足し、そうでなければ0を足す
        f += ifelse(i%2==0, one(T)/i, zero(T))
    end
    f
end
```

　ここではTに型を入れることになります。zero(T)やone(T)は型Tの0と1を与え、また、i::Tとすることで、変数iが型Tの値となるようにしています。結果として、関数内部の計算は全て型Tで表された数値で行われることとなります。

コードの実行例は以下のようになります。

```julia
[In］
#Tに型を引数として与える
@show test1(5,Float16)
@show typeof(test(5,Float16))
@show test1(5,Float32)
@show typeof(test(5,Float32))
@show test1(5,Float64)
@show typeof(test(5,Float64))
@show test1(5,BigFloat)
@show typeof(test(5,BigFloat))
```

```julia
[Out]
test1(5, Float16) = Float16(0.75)
typeof(test(5, Float16)) = Float16
test1(5, Float32) = 0.75f0
typeof(test(5, Float32)) = Float32
test1(5, Float64) = 0.75
typeof(test(5, Float64)) = Float64
test1(5, BigFloat) = 0.75
typeof(test(5, BigFloat)) = BigFloat

```

　typeof関数は引数の型を表示してくれる関数です。同じ型Tの数値どうしの計算結果として、実行結果の型もまた、型Tと一致していることが分かります。

　Juliaの数値型に関しては[こちら](https://hshindo.github.io/julia-doc-ja-v0.6/manual/integers-and-floating-point-numbers.html#%E6%95%B4%E6%95%B0%E3%81%A8%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0-1)を参照ください。

# 「型安定」とは

　Juliaの計算において、変数の型を常に一致させることがコードの性能に大きく関わってきます。コードの進行上で変数の型が一意でない場合を「変数が型安定でない」といい、このような時はコードの性能が大きく低下することが分かっています。

　「変数が型安定でない」例として、先ほどのtest1コードと一見同じように見えるtest2コードを以下に示します。

```julia

function test2(n,T)
    f = 0
    for i::T in 1:n
        f += ifelse(i%2==0, one(T)/i, 0)
    end
    f
end

```
　ここでは、fが始めはInt型の0である上に、ifelse関数の返す値がInt型の0とT型の1/iのどちらかとなっており、コンパイラがfの型を一意に決めることができず、「型安定でない」場合となっています。

　さて、test1とtest2の性能を、パッケージBenchmarkToolsを用いて比較してみましょう。(BenchmarkToolsの詳細については[こちら](https://github.com/JuliaCI/BenchmarkTools.jl/blob/master/doc/manual.md)を参照ください。) 

```julia
using BenchmarkTools
@btime test1(5,Float64)
  3.099 ns (0 allocations: 0 bytes)
```

```julia
using BenchmarkTools
@btime test2(5,Float64)
  95.684 ns (0 allocations: 0 bytes)
```

　結果として、test1とtest2の間では最小実行時間におよそ30倍もの差があり、型安定でないコードは性能が大きく低下してしまうことがよく分かります。コード作製時にはそれぞれの変数の型について注意深くある必要があります。

#まとめ

　今回はJuliaでは型を関数の引数として用いることができること、コードの性能において型安定が重要であることを示しました。間違いなどがありましたらご連絡いただければ幸いです。


［参考書籍・ウェブ］
　Bogumil Kaminski, Premyslaw Szufel(2019)『Juliaプログラミングクックブック』(中田秀基 訳) オライリー・ジャパン
　https://hshindo.github.io/julia-doc-ja-v0.6/manual/integers-and-floating-point-numbers.html#%E6%95%B4%E6%95%B0%E3%81%A8%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0-1
　https://github.com/JuliaCI/BenchmarkTools.jl/blob/master/doc/manual.md
dockerでMysql+Pythonの環境構築

#前提知識
###Dockerとは何者か
仮想環境を扱う場合にVirtualBoxなdの仮想マシンはホストマシン上でハイパーバイザを利用しゲストosを動かし、その上でミドルウェアを動かしますが、Dockerの場合は、コンテナというものを使用しております。コンテナはホストマシンのkernelを利用し、プロセスやユーザなどを隔離することで、まるで別のマシンが動いているかのように動かせます。ですので、軽量化つ高速で動かせることができます。
ただもちろんですが仮想環境と行っても容量は自分のpcから割かないといけないので、空き容量には余裕を持っておきましょう。
![スクリーンショット 2019-11-17 17.30.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305525/30a7679d-742b-4991-a958-47ace33f6212.png)
(参考記事1より抜粋)

###MySQLとは何者か
MySQLはOracle社が開発したリレーショナル型データベースです。(リレーショナル型とは端的に言えばexelのような形式ということ)
基本的な操作はプログラミング言語、SQLを用いて操作します。
MySQLの特徴としてはUNIX系各種OSやWindowsなどの多様なプラットフォームに対応しているのに加えて、アクセスできるプログラミング言語も豊富ということです。シンプルで早く、PHPとの相性も良いです。
データベースの種類について詳しく知りたい方はこちらの記事が分かりやすいです。
[データベースとは？その種類、特徴、メリットを詳しく解説します！](https://engineer-club.jp/type-of-database)

#DockerでPython+MySQLの環境構築
仮想環境としてubuntuを導入
ちなみにイメージとはそのコンテナを扱う上で必要なパッケージが入っていて、今回だとUbuntuとMySQLがそれに当たります。
コンテナはそのイメージを利用して実行できる環境です。

```bash
#Dockerにubuntuのイメージを導入
$ docker pull ubuntu:16.04
#Ubuntuを実行しシェルにログイン
$ docker run -it ubuntu:16.04
```

pythonとmysql-serverをインストール(mysqldの代わりにmysql-server)

```bash
$ apt-get update
$ apt-get install -y python3 python3-pip
$ apt-get install -y mysql-server
```

PythonでMySQLに接続する為にmysqlclientのインストール

```bash
$ apt-get install -y libmysqlclient-dev
$ pip3 install mysqlclient
```

このコンテナをubuntu-mysqlという名前で保存

```bash
$ docker ps -a
$ docker commit (コンテナID) ubuntu-mysql
```

ローカルから実行したいファイルがあるフォルダをマウントしつつ、実行。

```bash
$ docker run -it -v <ローカルからマウントしたいフォルダのパス>:<仮想環境上でのパス> ubuntu-mysql /bin/bash
```


[参考記事]
1. [Docker入門（第一回）～Dockerとは何か、何が良いのか～](https://knowledge.sakura.ad.jp/13265/)
2. [MySQLとは一体どんなシステム？　MySQLの使用例と大きな特徴](https://type.jp/s/itips/network/i_20140219.html)

[関連記事]
[Ubuntu 16.04にMySQLをダウンロードする際に起こりがちなエラー](https://qiita.com/jackdaniel1999/items/0b4df61eed329c714750)
Python BottleのWebAPIでクラスインスタンスのメソッドを叩く

Python初心者です．

Bottleで簡単にWebアプリが作れる，ということで作り始めたところ，インスタンスのメソッドを叩く段になってハマりました．

解説サイトなんかだと，たいてい以下のように書いてあります．

```python
@route('/api')
def api_action():
    ...
```

この，api_action内で特定のクラスインスタンスのメソッドを叩きたかったのですが，初心者はここでハマりました．

具体的には，DB接続のインスタンスを叩きたかったのです．

いろいろググった結果，以下のように落ち着きました．

```python
from bottle import route


class Sample:
    def __init__(self, dbcon):
        self.dbcon = dbcon
        route('/api/<arg>')(self.instance_method)

    def instance_method(self, arg):
        # <self.dbcon>を使った処理とか
```

デコレータを使わず，直接bottleのrouteメソッドを叩くのですね．
Reactの要素に外部からsetStateしたい（黒魔術）！

説明の必要はないかと思いますがプロダクションコードに利用しないようにしましょう。

# 結論
```shell
npm i react-singleton-component
```

した上で

```tsx
import { createSingletonComponent } from "react-singleton-component";

const MyComponent = createSingletonComponent(
    {hoge: 1},
    props => <div>{props.hoge}</div>
);
ReactDOM.render(<MyComponent />, container);
MyComponent.setState({hoge: 2});
```
してください。
https://www.npmjs.com/package/react-singleton-component

# はじめに
無性にウェブアプリを殴り書きたくなる日はありませんか？しかしながら、素のJavaScriptでやるのはあまりにも辛すぎる。私はちょっとリスト構造が入ってくるだけですぐReactやVueの手を借りたくなります。ゆとり世代ですね。

Reactを使う場合は大抵の場合TypeScriptも導入することになると思いますが、結構コード量が増えてきてキツイ。Reactのメリットを最大限享受するためにはHTMLを捨ててすべてReactで構成するのがベストですが、そうすると静的な部分にまでReactの厳しさに縛られ、フラストレーションがたまります。

というわけで、動的に変更する可能性のある部分だけReactの管理下に置いていくわけですが、**状態管理どうしよう？**ということになるわけです。少しでもラクがしたいので**Reduxとか論外**ですね。MobXはいい線行っていると思うのですが殴り書きのためのライブラリとしてはいささか大げさすぎる気がします。

というわけで以下のようなコードが爆誕することになるわけです。

```tsx
class MyComponent extends React.Component<{}, {hoge: number}> {
    public static instance: MyComponent;
    componentDidMount() {
        MyComponent.instance = this;
    }
    state = {hoge: 1};
    render() {
        return <p>{this.state.hoge}</p>
    }
}
```

こうすれば

```tsx
MyComponent.instance.setState({hoge: 2});
```

などとすることができるようになりますね。**つらい。**

# 静的フィールドでインスタンスを公開する
上記コードを毎回書くのは大変なので、この部分だけを抽象化してみます。

```tsx
function createComponent<P, S>(Component: React.ComponentClass<P, S>) {
    return class CreatedComponent extends Component {
        public static instance: CreatedComponent;
        componentDidMount() {
            CreatedComponent.instance = this;
        }
    }
}

const MyComponent = createComponent(class extends React.Component<{}, {hoge: number}> {
    state = {hoge: 1};
    render() {
        return <p>{this.state.hoge}</p>
    }
});
```

これで`MyComponent.instance.setState()`のようにアクセスできるようになりました。

# さらなる利便性を目指して

このままでもかなり楽になっていると思うのですが、まだクラス定義あたりが面倒くさい。せっかくなら記述量の極端に少ないFunction Componentを使用したいですね。そこで、Function Componentのpropsをstateとして利用できないか考えてみました。

```tsx
function createComponent<P>(defaultState: P, Component: React.ComponentType<P>) {
    return class CreatedComponent extends React.Component<{}, P> {
        static instance: CreatedComponent;
        componentDidMount() {
            CreatedComponent.instance = this;
        }
        state = defaultState;
        render() {
            return <Component {...this.state} />
        }
    }
}
```

これにより、

```tsx
const MyComponent = createComponent(
    {hoge: 1},
    props => <p>{props.hoge}</p>
);
MyComponent.instance.setState({hoge: 2});
```

のように非常にシンプルに記述できるようになりました。Function Componentは型推論が強力で非常に便利ですね！使用する側では型定義が一切必要ありません。

以上の成果に加え、安全性を高め、instanceを経由せず直接stateやsetStateを読めるようにしたものをパッケージ化して公開しました。冒頭で紹介しているので、ぜひご利用ください！
正規表現

# 正規表現
何か
→パターンマッチ

何に使うか
→文字列の抽出、検索に利用

例えば
http://www.xxx.jp のxxxの部分を抽出したいなど

VSCodeの「大文字と小文字を区別する」をON、「正規表現を使用する」をON
### 題材1
```
,abAB12あい,
,abAB12あい,
```

##### 小文字のアルファベット
`[a-z]`

##### 大文字のアルファベット
`[A-Z]`

##### アルファベット
`[a-zA-Z]`

##### 数字
`[0-9]`

##### アルファベットと数字
`[a-zA-Z0-9]`

##### 最初のカンマ
`^,`

##### 最後のカンマ
`,$`

### 題材2
```
ab	AB	12	あい
```
##### タブ
`\t`

#### 改行
`\n`
Linuxのディレクトリ構造

#ルートディレクトリ直下のディレクトリ
Linuxのファイルシステムは、`/`で表されるルートディレクトリを最上位とした階層構造になっています。

ルートディレクトリ直下のディレクトリは名前が流用されることが多く、覚えておくと割と役に立ちます。

```
bin  -> 一般ユーザが実行できる基本的なコマンド群
boot -> システムの起動に必要なファイル
home -> ユーザーのホームディレクトリ
etc  -> システム設定ファイルや起動スクリプト
lib  -> ライブラリ
root -> rootユーザー用ホームディレクトリ
sbin -> rootユーザーが実行できるシステム管理コマンド
usr  -> 様々なプログラムやライブラリにドキュメントなど
```

ちなみに
`/`がルートディレクトリ
`~`がホームディレクトリ
を表します。
Ubuntu 16.04にMySQLをダウンロードする際に起こりがちなエラー

#MySQLのsocketファイルが見つからない
mysqlを起動させる為に以下の命令を実行

```bash
$ service mysql start
$ mysql -u root -p
```

すると、エラーとして以下が表示される

```
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'
```

socketファイルが'/var/run/mysqld'になくて怒っている模様...

#解決策
以下のコマンドを実行したら一発OKでした！

```bash
$ touch /var/run/mysqld/mysqld.sock
$ chown mysql:mysql /var/run/mysqld/
$ /etc/init.d/mysql restart
```
やっていることとしてはmysqld.sockという名前の空ファイルを作ってあげて、
chownコマンドでディレクトリ'/var/run/mysqldの権限を変更。
使い方としては

```bash
$ chown <[所有者]or[所有者：グループ]> <ファイルorディレクトリのパス>
```
です。

[参考記事]
[chmod? chown? よくわからんって人のための、ファイル権限系まとめ](https://qiita.com/t-a-run/items/239ed690ece7a011804a)
[Ubuntu 16.04におけるmysqlのインストールと設定、エラー対応のまとめ](https://qiita.com/donaldchi/items/afeabaffc8be39577ef0)
macOSでのDockerを利用したElixir 環境の構築

# Elixir environment for Docker in macOS

## Docker IDの登録
まずは下記のURLにアクセス
[https://hub.docker.com/editions/community/docker-ce-desktop-mac](https://hub.docker.com/editions/community/docker-ce-desktop-mac)

1. 「Sign In」をクリック
<img width="720" alt="docker-singup-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72962/dc143ad5-c0a4-d09b-5967-66eea4b920a1.png">

2. 「Sign Up」をクリック
<img width="561" alt="docker-signup-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72962/b04490cd-4772-1c19-78c3-4f79e43b6b31.png">

3. Docker IDとパスワードとメールアドレスを登録します
<img width="720" alt="docker-signup-3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72962/ac93ab50-f100-93a5-37c4-9cd119ef7be5.png">

4. 「名と姓と組織名と国」を入力し、選択肢を選びます。」
<img width="720" alt="Docker-signUp-4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72962/b5450da8-0c39-f69b-f631-912e21840389.png">

5. 成功したら、次の画面になります。メールが届いているか確認しましょう。
<img width="720" alt="docker-signup-5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72962/5023d4c0-6fd1-abfc-aba1-118c7cf88c32.png">

6. メールを確認して、ボタンをクリックしてください。
<img width="711" alt="dokcer-signup-6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72962/be33e279-6d80-9117-d51e-ae8cf97292d4.png">

## Docker のインストール

1. 無事にSignUpが終わると、アクセス先に「Get Docker」ボタンがありますのでこちらをクリックして[Docker.dmg]ファイルをダウンロードします。

<img width="720" alt="Docker-install-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72962/5d7ce038-cd96-098d-eecb-95c4655b21b8.png">

2.無事にダウンロードが終わったら、ダウンロードファイルの中にある「Docker.dmg」をダブルクリックしてください。
<img width="282" alt="Docker-install-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72962/5484d5fd-e955-2e99-6997-624ae4f514f7.png">

3. 次の画面が立ち上がるので、[Docker]と書かれたアイコンを隣りにある

<img width="720" alt="Docker-install-3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72962/9b1f4092-fce3-88b9-7da9-cec1da24c9ef.png">

4.Applicationsに入れたら、[Docker]のアイコンをクリックして起動します。
もしかしたら、以下のようなアラートが表示されるかもしれません。「OK」を選んで下さい。
<img width="601" alt="Docker-install-4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72962/2906b893-54a0-3543-ee96-0bc32f25686b.png">

5.macOSにログインする際のユーザー名と、パスワードを入力します。（macOS起動する時に入力するものと同じです）
<img width="420" alt="Docker-install-5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72962/d1f6d30e-ec0d-e8b0-24ea-3eac2f42fbf6.png">

6.無事に動くとメニューバーに、Dockerのアイコンが表示されます。
<img width="720" alt="Docker-install-6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72962/982a3cfd-3fcb-b903-a905-b5736ce13431.png">

## Dockerの起動

1. Dockerが無事にインストールされたので、ターミナルを開いて次のコマンドを入力します。

```docker
docker pull elixir
```

2. 無事に動いたら、以下のコマンドを入力します。

```
docker run -p 4000:4000 -i -t elixir /bin/bash
```

3. 無事に動いたら、```iex```を入力してElixirのREPLを起動します。次のように動いたら成功です。

<img width="966" alt="Doker-pull-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72962/1c108b45-e3e3-a537-5734-e37afe1e1049.png">

お疲れ様でした。
ReButtonを分解してみた

#部品
| 部品         |型格      |メーカー|
| :-:          |:-:       |:-:|
| MPU+WiFi     | EMW3166  |MXChip|
| 電源IC(昇圧) | TPS61201 |TexasInstruments|

#写真
外観
![DSC_0441.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/a64114f4-18fa-db8c-a533-6fc1f5d86030.jpeg)

裏面のフタを開けたところ（プラスネジが２か所なのですぐに開けれます）
![DSC_0442.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/949ec2f1-0545-5b06-43b3-af18abec7bf6.jpeg)

内部構造（LEDの導光部とボタン部分が分かる）
![DSC_0445.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/fc83e143-aa96-a7fe-8d3f-954f2873f2c6.jpeg)


基板（基板と筐体はねじ止めされておらず、電池金具のはんだ付けて固定されています）
＊SWD (Serial Wire Debug)で開発したいとき、はんだ付けがしにくいかも
（追記）SWDに関しては以下のサイトのケーブル利用を想定しているそうです。
http://www.tag-connect.com/TC2030-CTX

![DSC_0444.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/640ca1ed-45fd-fd8b-5271-f2e9849af2eb.jpeg)

###本家のSeeedStudioの[サイト](https://seeedjp.github.io/ReButton/README-ja.html)も分かりやすくまとまってます
【Firebase+swift】学習記録（３）登録・ログイン機能を作る

Firebaseを使って簡単にユーザー登録とログイン機能が作れました。
今回は[サインアップ画面を作ってみよう(Firebase)](http://sasakura-company.com/2018/06/12/%e3%82%b5%e3%82%a4%e3%83%b3%e3%82%a2%e3%83%83%e3%83%97%e7%94%bb%e9%9d%a2%e3%82%92%e4%bd%9c%e3%81%a3%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86/)
を参考にして、ユーザー登録とログイン機能を兼ね備えたアプリを作成しました。

GitHubは[こちら](https://github.com/NAKAMURAAAAAAAAAA/signup-login-firebase-swift-)

##ユーザー登録について
```swift:signup.swift
@IBAction func signupTapped(_ sender: Any) {
        //AuthのcreateUserでユーザー登録保存
        Auth.auth().createUser(withEmail: email.text!, password: password.text!) { (user, error) in
            if error != nil {
                print("登録できませんでした")
            }
                
            else {
                print("登録できました")
        }
    }
```

##ログインについて
```swift:login.swift
@IBAction func loginTapped(_ sender: Any) {
        //ログイン用はsignIn
        Auth.auth().signIn(withEmail: email.text!, password: password.text!) { (user, error) in
            if error != nil {
                print("ログインできませんでした") 
            }
            else {
                print("ログインできました")
            }
        }
    }
```

画面遷移を付け加えれば、これだけでユーザー登録とログイン機能が作れます。
わーい

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Firebase+swiftでユーザー登録とログイン機能を作れたよ<br>これでみんなで交流できるアプリが作れるぜい♪<br>キャホーー <a href="https://t.co/LElZJ7JXbo">pic.twitter.com/LElZJ7JXbo</a></p>&mdash; なかむら (@nakamurasssey) <a href="https://twitter.com/nakamurasssey/status/1196000494340100096?ref_src=twsrc%5Etfw">November 17, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
git command 使い方

# この記事について
この記事は, git, 特にコマンドの使い方について説明しています。ネット上にgitで調べると多くの記事が載っていますがgitの実際の使い方を説明しているものは少ないです。というか, とても分かりにくいです。まじでふざけんなって感じなのでこの記事書きます。まぁ自分のメモ的にもね.....🐈

## すでにリモートにあるプロジェクトをローカルに
```
 git clone リモートのURL
```
リーモートのURLは**https**だったり**ssh**だったりするけど, どっちにするかはそのプロジェクト担当してる人に聞いてね🐈

## リモートのbranch 〇〇にローカルブランチを合わせたい!
リモートには最初から**master**ブランチというのがあるのですが, 場合によっては他のブランチもあったりするわけで...

```
 git fetch 〇〇
 git checkout origin/〇〇
```
checkoutする前にリモートリポジトリの〇〇をfetchしないといけませんね。🐈
`fetch`の時は, `origin`を付けなくても自動的にリモートにあるブランチを指してくれます。リモートに〇〇ブランチがない時はまぁどんまい...
この〇〇っていうのはリモートに存在しているブランチ名で, `origin/`を`〇〇`の前につけることで, その〇〇がリモートのbranchであることを表しています。
`origin` がつけば, リモートのことをさしていると考えていいです。

## ローカルでブランチを変える時
```
 git checkout -b hello
```
上のようなコマンドをした時には, 自分が今いるブランチからhelloというブランチに移ります。`-b` とすることでcheckoutする時に自動で, helloというブランチを作ってくれます。
そうしない時は

```
 git branch hello                  // helloというブランチができる
 git checkout hello                // helloというブランチに切り替える
```

また「今自分がいるブランチって?」と思われた方がいるかもしればせんが, そんな時は !

```
 $ git branch
   *master
    hello
    world
```
**git branch**とした時に`*`がついているブランチが今いるブランチです。

## リモートにpushする時
```
 git push origin 〇〇
```
〇〇というのは, ローカルにある自分のブランチのことです。
`origin 〇〇`とすることで, リモートに〇〇ブランチが自動でできます。
つまり, ローカルにある自分と同じブランチがリモートにもできるということですね。

また

```
 git push origin master
```
というのをよく使っている人も多いと思います。これが何を意味するのかというと, ローカルの**master** ブランチをリモートに作る, また**リモートのmasterブランチをローカルのmasterブランチに合わせる**ということをしています。

## おわりに
なんとなく記事を書くのが面倒になってきたので, また機会があれば書きます。
ネコがすきです。東京在住ですが, 久々にノラネコをみました。かわいかったです。byebye🐈
AdMobのAdaptive Bannerの実装メモ

GADBannerViewのStoryboardでの制約で少し迷ったのでメモ

AdMobの[公式ドキュメント](https://developers.google.com/admob/ios/banner/adaptive)を見ながら実装してたけど、Stroryboardの制約の付け方がわからなかった。
なので[AdaptiveBannerExample(GitHub)](https://github.com/googleads/googleads-mobile-ios-examples/tree/master/Swift/admob/AdaptiveBannerExample)のプロジェクトをXcodeで開いて確認。
すると **Intrinsic Content Size = Placeholder**　という見慣れない設定があった。
これは一時的に設定できるようです。[こちら](https://qiita.com/shtnkgm/items/f0b189e4184fe6c90707#intrinsic-content-size%E3%81%AFstoryboardxib%E3%81%A7%E4%B8%80%E6%99%82%E7%9A%84%E3%81%AB%E8%A8%AD%E5%AE%9A%E3%81%A7%E3%81%8D%E3%82%8B)を参考にさせていただきました。
ITエンジニアの基礎　正規表現編


正規表現は平たくいうと、登録されるデータのフォーマットを調整する処理のこと。

文字列に特定の文字が含まれているかを確認することや
特定の文字を取り除くなどの操作を行うための技術が正規表現です。

具体例をあげると
アカウントの登録でパスワードが10文字未満だったり、メールアドレスに@が入っていなかったりすると
ユーザー登録ができなくなる、又は電話番号の登録で-入りで登録すると
-が抜かれた別のフォーマットで登録される処理のことです。

# 正規表現メソッド

* subメソッド(置き換えメソッド)
* matchメソッド
　

## subメソッド
文字列の指定した部分を別の文字列に置き換えるためのメソッドです。
第一引数に置き換えたい文字列を指定し、第２引数に変換後の文字列を指定します。
また、操作したい文字列は/で囲みます。

具体例はこちら

```ruby:irb
   irb(main):001:0> str = "ラーメンを食べる"
=> "ラーメンを食べる"

irb(main):002:0> str.sub(/ラーメン/,"蕎麦")
=> "蕎麦を食べる"
```

## matchメソッド
　　引数に指定した文字列がレシーバの文字列に含まれているか否かをチェックするためのメソッドです。

```ruby:irb

# 例1 単純使用で、nilが返すか返されないか

irb(main):001:0> str = "Hello, World"
=> "Hello, World"

irb(main):002:0> str.match(/Hello/)
=> #<MatchData "Hello">

irb(main):003:0> str.match(/Good/)
=> nil

# 例2 含まれたのを確認した上で出力する場合

   irb(main):001:0> rei = "Hello, World"
=> "Hello, World"

irb(main):002:0> kekka = rei.match(/Hello/)
=> #<MatchData "Hello">

irb(main):003:0> kekka[0]
=> "Hello"
```

### MatchDataオブジェクト
マッチした文字列等はMatchDataオブジェクトで返されます。
MatchDataオブジェクトから文字列等を取り出す際は 「kekka[0]」のように指定して出力します。


#具体使用例

## 電話番号のハイフンを取り除く
ここではハイフンを取り除く処理を書いてみます。
ただしsunとgsubでは使用に違いがあるので注意が必要です。

```ruby:irb
   irb(main):001:0> tel = '090-1234-5678'
=> "090-1234-5678"

irb(main):002:0> tel.sub(/-/,'')
=> "0901234-5678"
# 最初のハイフンしか置換されない


irb(main):003:0> tel.gsub(/-/,'')
=> "09012345678"
# 全ての対象に
```

### subメソッド,gsubメソッドの違い

* subメソッド・・・最初の一文字のみ
* gsubメソッド・・・全ての対象に

## パスワードに英数字10文字以上という制約を設定する

```ruby:irb
   irb(main):001:0> pass = 'Hoge1234'
=> "Hoge1234"

irb(main):002:0> pass.match(/[a-z\d]{10,}/i)
=> #<MatchData "Hoge1234">
```

### matchメソッドのポイント1

* [a-z]: 角括弧で囲まれた文字のいずれか 1 個にマッチ
* \d: 数字にマッチ
* {n, m}: 直前の文字が少なくとも n 回、多くても m 回出現するものにマッチ
* i: 大文字・小文字を区別しない検索

## メールアドレスからドメインの部分のみ抽出する

```ruby:irb
   irb(main):001:0> mail = 'rei@camp.com'
=> "rei@camp.com"

irb(main):002:0> mail.match(/@.+/)
=> #<MatchData "@camp.com">
```

### matchメソッドのポイント2

* 「.」どの1 文字にもマッチ
* 「+」直前の文字の 1 回以上の繰り返しにマッチ

## パターン表記

| パターン | 意味 |
|:-:|:-:|
| [a-z] | 角括弧で囲まれた文字のいずれか 1 個にマッチ |
| \d | 数字にマッチ |
| {n, m} | 直前の文字が少なくとも n 回、多くても m 回出現するものにマッチ |
| . | どの1 文字にもマッチ |
| + | 直前の文字の 1 回以上の繰り返しにマッチ |
ローカルでRails 6,Ruby 2.6.2のアプリ起動までの手順(mac)

**ローカル環境にrubyやmysqlがインストールしてあることが前提です。**

```
$ mkdir sample-app
$ cd sample-app
$ bundle init
```

```:Gemfile
# frozen_string_literal: true
source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem "rails", "~>6"
```

```
bundle install --path vendor/bundle
```

```
bundle exec rails new . -B -d mysql --skip-turbolinks
```
- -Bはbundle installを行わないようにする
- -dはデータベースの指定(今回はmysql)

必要なgemをgemfileに追記
```
$ bundle install
```

## このエラーが発生した場合
![https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_260982_7ed57a06-27e3-f631-9e80-f2479099a24b.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260982/f2017f90-093d-5818-2d47-263b1b6b1891.jpeg)


```
$ bundle config --local build.mysql2 "--with-cppflags=-I/usr/local/opt/openssl/include"
$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib"
```

それでもダメな場合

```
$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include"
$ bundle install --path=vendor/bundle
```
正しいかはわからないが、これでひとまずいけた。

## webpackerを導入する場合(vueバージョン)
```
$ rails webpacker:install
$ rails webpacker:install:vue
```

```
$ rails s -p 3000
```
localhost:3000でrails初期画面表示されれば完了！！
<img width="751" alt="Screen Shot 2019-11-17 at 18.13.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260982/0558b62d-2682-2858-ae80-afec2298f2e9.png">
動画の倍速を変更して見る方法

#### 倍速機能がなかったり、倍速をもっと上げたかったので、とりあえずメモ


```javascript:開発者ツールのコンソール画面
// videoタグにidがない場合
// videoタグを取得
video = document.getElementsByTagName('video');

// videoタグにidがある場合
// videoタグに付与されているidを取得
video = document.getElementById('id名');


video.playbackRate = 2.0; // 2倍速で再生
video.playbackRate = 4.0; // 4倍速で再生
```
SWTアプリでダークモードしたい

どれだけ需要があるかわからないけど．

自作したSWTアプリでMacのダークモードしたい．

Eclipse IDE 2019-06 (4.12) から可能になっていたので．

参考: https://www.eclipse.org/eclipse/news/4.12/platform_isv.php#dark-theme-mac

VM引数に以下を指定して実行

`-Dorg.eclipse.swt.display.useSystemTheme=true`

## ダークモードかどうかの判定

```Java
"Dark".equals(execCommand("defaults read -g AppleInterfaceStyle"));
```
KubeView動かしてみた

# Kubernetesのリソースをビジュアライズしてくれる[Kubeview](https://github.com/benc-uk/kubeview)を見つけた
Kubernetesクラスタに突っ込でおくと、クラスタないのPodやsvcやPVなどの関連をビジュアライズしてくれる
誰かが作った、K8s上のアプリケーションの構造を読み解く際に大いに活用できそう(今までは１つずつmanifest開けて見てた...)


実際に動かしてみるとこんな感じ

![kubeview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94861/2dab2b4d-7ede-d5ee-4515-32c51adecb69.png)




# Prerequirement
HelmとKubernetesが設定済み

# Install
```
git clone https://github.com/benc-uk/kubeview
cd deployments/helm
cp myvalues-sample.yaml myvalues.yaml
helm install ./kubeview kubeview -f myvalues.yaml --generate-name

SVC_NAME=$(kubectl get svc  -o jsonpath={".items[0].metadata.name"})
kubectl port-forward svc/${SVC_NAME}  8080:80  
```
Rustでconrodを使って赤い円をアニメーションさせる

はじめに
========

[前回: RustでWindowに円を描く](https://qiita.com/mokemokechicken/items/47de50b8f30f206b2748) からの続きです。今回は、簡単なアニメーションをさせようと思います。

コード全体は[こちら](https://github.com/mokemokechicken/rust_gui_sandbox/tree/5eb95597a3c752772e5b87cb0997cd2646805d70/src)になります。

Rustでconrodを使って赤い円をアニメーションさせる
=========

## Waitを入れながらUI Eventを処理する
アニメーションさせるポイントの一つは、Main Loopの中でWaitを入れつつUI系Eventも処理することです。
元のサンプルにそういう処理があったので、[似たような感じ]((https://github.com/mokemokechicken/rust_gui_sandbox/blob/5eb95597a3c752772e5b87cb0997cd2646805d70/src/event.rs) )で下記のようにしています。

```rust:event.rs
    pub fn next(&mut self, events_loop: &mut glium::glutin::EventsLoop, interval_ms: u64) -> Vec<glium::glutin::Event> {
        let last_update = self.last_update;
        let frame_interval_ms = std::time::Duration::from_millis(interval_ms);
        let duration_since_last_update = std::time::Instant::now().duration_since(last_update);
        if duration_since_last_update < frame_interval_ms {
            std::thread::sleep(frame_interval_ms - duration_since_last_update);
        }

        // Collect all pending events.
        let mut events = Vec::new();
        events_loop.poll_events(|event| events.push(event));

        self.last_update = std::time::Instant::now();
        events
    }
```

これを使って、

```rust:main.rs
    let mut animation_loop = event::AnimationLoop::new();

    'render: loop {
        for event in animation_loop.next(&mut events_loop, 
                                         1000 / constants::FPS as u64) {
            ...
```

という感じでWaitを入れつつ、そのWaitしている間に発生した events を取り出すようになっています。

## アニメーション処理を切り出しておく
今後、色々なアニメーションをやりたいので、おまじないだらけの `main.rs` と分離しておくと気分が良さそうです。

```rust:animation.rs
use conrod_core;
use conrod_core::{widget, Positionable, Colorable, Widget};

widget_ids! {
    struct Ids {
        circle,
    }
}

pub struct Animation {
    n_frame: u64,
    ids: Ids,
}

impl Animation {
    pub fn new(ui: &mut conrod_core::Ui) -> Self {
        Animation {
            n_frame: 0,
            ids: Ids::new(ui.widget_id_generator()),
        }
    }

    pub fn next_frame(&mut self, ref mut ui: conrod_core::UiCell) {
        self.n_frame += 1;

        widget::Circle::fill(10.)
            // 単に左から右に赤い円が動く
            .xy([(((self.n_frame as i64) % 400)-200) as f64, 0.])
            .color(conrod_core::color::RED)
            .set(self.ids.circle, ui);
    }
}
```

として、

```rust:main.rs
    let mut anim = animation::Animation::new(&mut ui);
    ...

        anim.next_frame(ui.set_widgets());
```    

と使うようにしました。
今後アニメーション系の処理を変えたい場合は、 `animation.rs` を変更するだけで良くなります（たぶん...)。

さいごに
======

大したことしてないですが、新しいものに触れるのは楽しいですね。
iOSシミュレーターのステータスバーを変更する

記事の内容はこちらを参照してください。
https://mishimay.github.io/6fb3054f12a3dbeedee9/
<!--



App Store Connect 用のスクリーンショットを用意するときにiOSシミュレーターのステータスバーをカスタマイズして好きな時間にしたいなどということがあると思います。

ライブラリで [SimulatorStatusMagic](https://github.com/shinydevelopment/SimulatorStatusMagic) というものもありますが、Xcode 11 からはコマンドから変更できるようになりました。

## 使い方
`$ xcrun simctl help status_bar` で詳細が見れます。

## コマンド例

`$ xcrun simctl status_bar "iPhone 11 Pro" override --time 9:41 --dataNetwork wifi --wifiMode active --wifiBars 3 --cellularMode active --cellularBars 4 --batteryState charged --batteryLevel 100`

![Simulator Screen Shot - iPhone 11 Pro - 2019-11-17 at 18.02.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23679/8ad95d30-925e-0a72-d3a2-4cbcbe47e399.png)


## 参考

https://www.jessesquires.com/blog/overriding-status-bar-settings-ios-simulator 
https://developer.apple.com/documentation/xcode_release_notes/xcode_11_release_notes 


-->
画像圧縮フォルダの作成方法

画像をアップロードする時、毎回TinyPngなどで圧縮するのは面倒なので、画像圧縮フォルダを作りました。
フォルダにjpg、pngの画像を入れると、自動で圧縮されます。

JPEGminiなど画像圧縮ツールもいくつか試したのですが、圧縮率や処理速度、アプリを起動する手間、拡張子ごとにアプリを変えないといけいなどの理由から納得のいくものがなく、画像圧縮フォルダという形に落ち着きました。便利です。

##全体の流れ
・画像圧縮フォルダを作成
・jpegoptimをインストール
・pngquantをインストール
・automatorでフォルダアクションを作成

##画像圧縮フォルダを作成
各自、お好きな場所に画像圧縮フォルダを作成してください。

##imageoptimをインストール
コマンドラインからHomebrewを使ってインストールします。

```
$ brew install jpegoptim
```
動作確認

```
//image.jpgの部分をjpg画像のパスに置き換える
$ jpegoptim image.jpg
```

##pngquantをインストール
コマンドラインからHomebrewを使ってインストールします。

```
$ brew install pngquant
```
動作確認

```
//image.pngの部分をpng画像のパスに置き換える
$ pngquant image.png
```

##Automatorでフォルダアクションを作成
Macに標準搭載されているRPA的なことを実現するソフト「Automator」を使って、特定のフォルダに画像が追加された時に圧縮処理のスクリプトを走らせる設定を行います。
Automatorの使い方は、詳しく紹介されている記事がたくさんありますのでここでは割愛します。
####jpg圧縮の設定
<img width="995" alt=" 2019-11-17 17.46.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244893/6910f3a7-5201-88f7-87bf-762c30d7289c.png">
スクリプト

```
for f in "$@"
do
	echo "$f"
done
/usr/local/bin/jpegoptim --strip-all --max=70 "$@"
```
####png圧縮の設定
<img width="995" alt=" 2019-11-17 17.48.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244893/dc1d4d9a-5dfc-9c4a-a887-afc3c32d7729.png">
スクリプト

```
/usr/local/bin/pngquant --ext .png --force "$@"
```

以上で設定は終了です。
<img width="763" alt=" 2019-11-17 17.53.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244893/6227bfb3-9511-a36e-74f3-2ed5deeab0f7.png">
<img width="763" alt=" 2019-11-17 17.53.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244893/68aa86d6-9c9f-6ef3-4a75-96433ae8605a.png">

##注意点
・Automatorの設定画面内「シェル」の部分のパスを正しく設定しないと、動きません。
私は「/bin/zsh」を設定していますが、「/bin/bash」の方が多くの環境で動く気がします。

・jpgoptimとpngquantで、シェルスクリプトの長さが違います。問題なく動くので放置していますが、もっと良い書き方があったら教えてください。
1クリックでLODの設定からVertsの削減までしてくれる、Automatic LOD を使ってみた

LOD を設定してパフォーマンス改善したいときにありますよね。オブジェクト作ったり、設定したり、いろいろ手間だと思います。そんなときに有用な Asset の [Automatic LOD](https://assetstore.unity.com/packages/tools/modeling/automatic-lod-43652) を使ってみました。

# TL;DR
1. **自動** で
2. Verts をある程度削減したオブジェクトを
3. LOD に設定してくれる

簡単、便利な有償 Asset です。

# Automatic LOD とはどういう Asset ？
見た目が悪くなっても問題ていどに遠くなった時には、LOD を設定することがあると思います。LOD に設定するために、そのためのオブジェクトも準備しないといけませが、その設定、オブジェクトの準備の両方を実行することができる Asset です。使い方もボタン一つで、簡単です。

# 使い方
## すごい簡単
![2019-11-17_14h46_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/a2c01c45-afb1-9bba-bd53-157fc6d69e2a.png)

1. Automatic LOD を Add component 
2. Generate LODs ボタンを押す

ほんとこれだけで、Verts が削減されたオブジェクトがLODに自動で設定されます。子にぶらさがっているオブジェクトも対象になります。

# 実際に使ってみた
## 自動で何ができて設定されるのか

これが、
![2019-10-25_13h21_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/f28b7e14-7206-6516-3615-fbac5dbfbf01.png)

こうなりました。
![2019-11-17_14h59_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/19fdcca1-9757-56e3-c1fd-4402138d501e.png)

LOD も設定されています。
![2019-11-17_14h59_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/f1e1d30c-2ce4-b361-2a80-ba0e2a0125e4.png)

## カメラを移動してみてみると
![giphy.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/7d9b0ed0-9291-aaf1-52c1-683478b340d2.gif)

## どのぐらい削減されているのか？
LOD が作成されたMeshを選択すると、自動でAutomatic LOD が追加されていて、そこに削減率が出ています。
![2019-11-17_17h37_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/1d7a9e72-d95a-acc0-d4c0-906c4206ab69.png)

ここでは

* LOD 0 100%
* LOD 1 66.67%
* LOD 2 33.33%

となっています。

この Asset には Mesh Simplify という Asset も含まれていて、Verts の削減などはそちらでもっと丁寧に行うこともできます。（その記事 "[有償ゆえにかゆいところに手が届く、ローポリ化 Asset の Mesh Simplify を使ってみた](https://qiita.com/matchyy/items/17870e79478c85a0f55f)" もあるのでよかったどうぞ。）

# まとめ
有償ということもあり、とても便利な Asset です。

* **自動** で LOD に削減した Verts を設定しくれます
  * 削減した値も確認することができます
* 付属の Mesh Simplify を使えば削減の度合いなどを調整することも可能です

設定してくれる Asset です。
go langで超簡単な本の感想投稿機能を作成した

```
番号を選んでください!
[1]レビューを書く
[2]レビューをみる
[3]アプリ終了

```

ターミナルでこんな表示が出てきて
1を押すと、本のtitle,genre,revieを書く。
2を押すと、保存した本のtitleなどがみれる仕様。

完成コード

```go
package main
import (
	"fmt"
	"bufio"
	"os"
	"strconv"
	"log"
)

func input()(result string) {
	//scannerを使う
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Scan()
	result = scanner.Text()
	return result
}

type R1 struct {
	title string
	genre string
	review string
}



func write_review() map[string]string{

	fmt.Println("本のタイトルを入力")
	title := input()
	fmt.Println("本のジャンルを入力")
	genre := input()
	fmt.Println("本の感想を入力")
	review := input()

	r1 := map[string]string{
			"title":title,
			"genre":genre,
			"review":review,
		}


	return r1

}


func read_review(s []map[string]string) {
	for num := range s {
		fmt.Println(num,"titleは",s[num]["title"])
	}
	fmt.Println("みたい番号を取得")
	number := scan()

	if len(s) <= number { //打ち込んだnumがlength以上であれば
		log.Fatal("存在しない番号やんか、あかんで")
	}
	display:= s[number]

	fmt.Println("タイトルは ",display["title"],"\nジャンルは",display["genre"],"\n感想は",display["review"])
}


func scan()(conv_num int) { //打ち込んだ文字を取得しintに変換
	scanner := bufio.NewScanner(os.Stdin)
		scanner.Scan() //入力待ち
		num := scanner.Text()
		
		conv_num,_	= strconv.Atoi(num)
		return conv_num
}


func main() {
	var slice []map[string]string
	forbun_label: //labelをfor文に対して宣言
	//forの中にswitchを入れ子にしているのでlabelを宣言すべき

	for {

		fmt.Println("番号を選んでください!")
		fmt.Println("[1]レビューを書く\n[2]レビューをみる\n[3]アプリ終了")

		conv_num := scan()
		switch conv_num {
		case 1:
			fmt.Println("1を選んだね")
			slice = append(slice, write_review())
		case 2:
			fmt.Println("2を選んだね")
			read_review(slice)
	    case 3:
			fmt.Println("3を選んだね")
			break forbun_label  //labelのbreak
		default:
			fmt.Println("もう一度選んでや")
	  }
  }
}

```


これを作るに当たって使用した、概念は
slice,map,struct,for,label辺りでしょうか。

初心者の自分には難しかったですが、色々な概念を使用して作るので良いoutputになるのでは無いかと思います。

少し応用で、funcのreturnの指定や、mapをどう返すかなど考えるのが難しかったことを覚えています。

もっと良いコードがあるとは思いますが、goは記述量が多くなってしまいがちですね。
Vue-Cli 3で開発したアプリケーションをGithub Pagesにデプロイする

Vue.jsでSPAアプリケーションを開発した後にGitHub Pagesにデプロイする際に詰まってしまったのでメモ。

# vue.config.jsファイルを作成

プロジェクトのルートディレクトリに**vue.config.js**ファイルを作成します。
このファイルにデプロイするVueアプリケーションのURLの構成を設定します。
以下のように記述してください。[^1]

```javascript
module.exports = {
  publicPath: '/project-name/',
  outputDir: 'docs'
}
```

GitHub Pagesにデプロイする際はプロジェクトディレクトリ直下または`/docs`に`index.html`などのビルドしたファイルを配置する必要があります。今回は`outputDir: docs`にで`docs`以下に指定します。
また`publicPath: /project-name/`を指定しないとcssなどのアセットファイルへの参照が絶対パスとなってしまいますので、こちらも併せて指定します。

# ビルド

`vue.config.js`を作成したら一度`npm run build`でビルドを行います。
ビルド後のファイルが`/docs`以下に配置されていることを確認します。

# masterブランチにpush

ここまでの変更をコミットしmasterブランチにpushします。[^2]

# GitHubの設定を変更する

pushしたGitHubリポジトリを開き、`Settings`タブを選択します。

![2019-11-17 15.24.19 github.com cc32ec6b4929.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534443/1b5138e5-efbf-f3e2-c5e6-0c6fad655ec2.png)

下にスクロールしていくと、`GitHub Pages`というセクションが見つかります。

![2019-11-17 17.24.52 github.com 839fd6cb94c1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534443/c57b1ed1-618d-aa37-3399-0b3f57a09acb.png)

`Source`の箇所が`None`になっているので、`master branch /docs folder`に変更します。
GitHub PageにアクセスするURLが表示されます。

![2019-11-17 17.26.38 github.com 219af300d751.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534443/eee11cde-f68e-e3fa-95a5-3e304deb1fc8.png)

URLにアクセスするとデプロイしたアプリケーションが動作しています🎉🎉🎉

<img width="1312" alt="Screen Shot 2019-11-17 at 17.32.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534443/aeaba0a4-e0fd-1029-5693-dcce5d91d9fa.png">

# おわりに

GitHub Pages、サーバー処理を行わない静的ページを公開するならかなり便利ですね。

# 参考

- https://medium.com/@abdullahicap/deploy-vue-cli-3-project-to-github-229e1a9a4d67

[^1]: `project-name`はご自身のプロジェクトに合わせて適宜書き換えてください。
[^2]: `.gitignore`の設定で`/docs`を無視している場合は設定を変更し、`/docs`以下がコミットの対象に含まれるようにしてください。
読書メモ：知識ゼロから学ぶソフトウェアテスト 【改訂版】

# 読んだ本：知識ゼロから学ぶソフトウェアテスト 【改訂版】   高橋 寿一

## 第1章
　・三角形判定のテスト、11個も思いつかなかった…
## 第2章
　・すでに動いているソフトウエアに対して正確なカバレッジを図ることは可能なのか？
　・すでに動いているソフトウエアの正確なカバレッジを、高コストをかけて求めることは必要か？
　・これから手を入れる部分、新しく作る部分については、カバレッジを測定する仕組みを入れることはできそう
　・ＴＤＤやその類いの仕組みは変更に強いソフトウエア開発には絶対に必要（実体験）
　→それをやる時間を与えられない現場も多い
　→開発工数にＴＤＤの為の作業も計上できれば良いんだけど…
## 第3章
　・テストするべき振る舞いは4つだけ
　　入力
　　出力
　　計算
　　保存
　・同値分析、境界値分析、正直なんとなくでやってしまってる
　・ＧＵＩのテストは状態遷移のテスト
## 第4章
　・探索的テスト
　　・製品を”学習しながら”行う、という部分は誤解していた。現場では製品知識を持つ人間が、属人的な能力で行うことが多い
　　・テストケースを書いてからテストするより、ソフトウエアをテストしながら考えて（探索して）実行した方が効率が良い
　　　→その通りかもしれないけど、エビデンスの残し方はルール化する必要あるし、テスト密度はどう測るんだろう？
　　・テストケース作成とメンテナンスに時間を取られるのが嫌だという主旨は参道
## 第5章
　・信頼度成長曲線→うむ、わからん
## 第6章
　・「できない」を通せる環境をどう構築するか
　　→ただ「できない」ではＱＡ不要論に繋がってしまう
## 第7章
　・メトリクスを計るにも、バグを分析するには、インシデント情報が大事
　　→入力パラメータが多すぎるとめんどくさがって入力して貰えなかったり、適当に入力されてしまう
## 第8章
　・それでもテストの自動化からは逃れられない…
　　→メンテナンスコストの高さがなあ…
## 第9章
　・モジュールを叩くという発想
　　→モジュールと紐付いた機能を叩く
　　　→物によっては「中味がカオスすぎてそれすらわからん」場合もあるけど、分かる部分だけでもやると良さそう
AWS CLIを用いてEC2インスタンスを起動停止させる（windows）

#目的
コンソールにいちいちログインして起動停止するのが面倒なため
自動で起動停止させたい。

#事前準備
windows環境の場合、事前にインストーラーをダウンロードしていないと
CLIを実行出来ないため、以下からダウンロードを行う。
[・Windows に AWS CLI をインストールする](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-windows.html)

※因みに上記インストーラはwinSV2008の場合使用出来ないので、
winSV2008にてAWS CLIを使用したい場合はpipを使ってください。
[・Windows で Python と pip を使用して AWS CLI をインストールする](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-windows.html#awscli-install-windows-pip)

#初期設定

```:セットアップ
aws configure
```
```:各項目にを入力していく
AWS Access Key ID [None]: *************ID
AWS Secret Access Key [None]: ******************************KEY
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

※AccessKeyID、SecretAccessKeyは実行したい環境のものを入れる。
　regionについては実行環境のリージョンを設定する（東京ならap-northeast-1）
　outputは基本的にjsonで問題ない。

```:設定確認
aws configure list
```
アクセスキー、シークレットキー、リージョンの情報が誤っていた場合は
aws configureを実行して再設定を行う。
※因みにAWS configureのファイルは ".aws"にあるのでそこでも現在の設定を確認出来る。


#インスタンス起動/停止
**起動**

```:インスタンス起動コマンド
aws configure list
```
※"i-XXXXXXXX"の部分に起動させたいインスタンスのIDを入れる。


```:OSが立ち上がるまでチェックしたい場合
#waitを使う
aws ec2 wait instance-status-ok --instance-ids i-XXXXXXXX
```

**停止**

```:インスタンス停止コマンド
aws ec2 stop-instances --instance-ids i-XXXXXXXX
```

```:完全に停止するのを見たい場合もwaitが使える
aws ec2 wait instance-stopped --instance-ids i-XXXXXXXX
```

上記内容のコマンドをbatchとして作成しておいてタスクスケジューラに登録しておけば
インスタンスの起動、停止の自動化も可能です。

#参考情報

[AWS CLI エラーのトラブルシューティング]
(https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-troubleshooting.html)
[コマンドラインオプション]
(https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-options.html)
[AWS Command Line Interface ユーザーガイド]
(https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/aws-cli.pdf)
Python初心者（中学生）のコードをオブジェクト指向バリバリに魔改造してみた

中学生のK君が作った[プログラム](https://qiita.com/GeekMasahiro/items/b8912626ec4a8618f4b1)に再登場再登場してもらいます。
実行結果はこんな感じ
![コメント 2019-11-17 160125.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/f06dc5ab-320b-e1af-3563-21369edd5071.png)
ボタンを押すと数値がカウントアップしていきます。
初めてのtk使ったプログラム、よくできてますね。
思った動作をするプログラムを実現できていて、よいと思います。

```python:K君作
import tkinter as tk

count = 0

def dispLabel():
    global count
    count = count + 1
    lbl.configure(text = str(count) + "回押しました")


root = tk.Tk()
root.geometry("300x80")

lbl = tk.Label(text="数えるボタン")
btn = tk.Button(text="押してね", command = dispLabel)

lbl.pack()
btn.pack()
tk.mainloop()
```

しかし、カウンターの値を、global変数で保存していて、初心者のお手本のようなプログラム。

実際のプログラムでは、処理内容がもっと複雑だったり、同じ様な処理が何個もでてきたりします。オブジェクト指向を導入すると、プログラムを効率よく作れます。
K君のプログラムは数字がカウントアップしていくボタンがあるだけでしたが、これに、他のボタンを追加することを想定して、オブジェクト指向のプログラムに魔改造してみます

K君のプログラム方式だと、ボタン追加で問題になるのは、ボタン追加に、count1, count2などのglobal変数を追加していく必要がある点。
TKで表示する処理とカウントアップの処理が一体になっていて分離されてない事。
数を数えるオブジェクトを作って、このオブジェクトの中に、count変数を持たせるのが良さそうです。

```python
class Counter():
    def __init__(self):
        self.count = 0
    
    def get_next_value(self):
        self.count +=1
        return str(self.count)
```
\_\_init__()でcountを初期化して、get_next_value()を呼びさす度に、カウントアップします。

DownCounterとCounterAlphabetも作ってみました。
Applicationクラスはボタンやラベルを表示や、ボタンが押された時の表示を更新するオブジェクトにしました。
Applicationクラスは、[Tcl/Tkcl/Tkの説明](https://docs.python.org/ja/3/library/tkinter.html)を参考にしてマネしてみました。

```python
import tkinter as tk
    
class Counter():
    def __init__(self):
        self.count = 0
    
    def get_next_value(self):
        self.count +=1
        return str(self.count)

class DownCounter(Counter):
    def __init__(self):
        self.count = 99
    
    def get_next_value(self):
        self.count -=1
        return str(self.count)

class CounterAlphabet(Counter):
    word_list = ["zero", "one", "two", "three"]
    def get_next_value(self):
        self.count +=1
        try:
            return self.word_list[self.count]
        except IndexError:
            return "many"

class Application(tk.Frame):
    def __init__(self, master):
        super().__init__(master)
        self.master = master
        self.master.geometry("300x160")
        self.pack() 
            
    def add_button(self, counter, label="数えるボタン", msg="回押しました"):
        lbl = tk.Label(text=label)
        def update_label():
            str = counter.get_next_value()
            lbl.configure(text = str + msg )
        btn = tk.Button(text="押してね", command = update_label)
        lbl.pack()
        btn.pack()
    
root = tk.Tk()
app = Application(root)
counter1 = Counter()
counter2 = DownCounter()
counter3 = CounterAlphabet()
app.add_button(counter1, "数えるボタン")
app.add_button(counter2, "カウントダウンボタン","回")
app.add_button(counter3, "数えるボタン(英語)"," times")
app.mainloop()
```
実行結果
![コメント 実行結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/85be1a97-3ab0-f590-8af4-f7ee5b510d9c.png)

K君、プログラム提供してくれてありがとう。

# コメントにいただいたプログラム

shiracamusさんから、より洗練された例をコメントいただきました。
コメント欄をご参照下さい。
さらなる魔改造も歓迎です。