OmniAICreator/Qiita-1.07M huggingface dataset:
Db2 Warehouse on Cloud (旧dashDB) チュートリアル：(2) テーブルやディスクの運用管理

Db2 Warehouse on Cloudを簡単に使ってみるための方法をご案内します。これは第二回目です。

## ご参考情報とおことわり

前回はデータロードの方法をご紹介しました。詳細は[こちら](https://qiita.com/azzeten/items/e993bb3954c2c9a98dab)をご覧ください。

本チュートリアルでご紹介するのは容量が1TBや4TBなどの「Enterprise Edition」のDb2 Warehouse on Cloudです。
Entryプランの方には無い機能となりますのでご注意ください。

## ストレージの使用方法を見るには？


### 概略を見る場合
- てっとり速いのは、ログイン後のホーム画面で上部に出てくる「Storage」と書かれたところにカーソルを合わせる方法です。このようにどれくらい使われているかが表示されます。
- この場合ですと、約4TBの領域に対して38%、1,471GB使用中だということがわかります。

　  ![image.png](https://qiita-image-store.s3.amazonaws.com/0/119378/4b35d027-a287-cff7-8784-7aa625d375a0.png)

###もっと詳しく見る場合
- 左上のアイコンをクリックしてメニューを表示させます。
- MONITORの中にあるStorageをクリックします。

　　　![image.png](https://qiita-image-store.s3.amazonaws.com/0/119378/526e6c44-df2a-17bf-3830-8706e6a1d042.png)



- このようにスキーマ毎（ユーザ毎）の使用量が確認できます。

　　　![image.png](https://qiita-image-store.s3.amazonaws.com/0/119378/40e701bc-d4a2-6b93-8ff6-4cda8d22b773.png)


- 「一番大きいテーブルは？」などテーブルごとに容量を確認したい場合は、「スキーマ」と書かれているところを「表」に変更してください。

　　　![image.png](https://qiita-image-store.s3.amazonaws.com/0/119378/ef3bc755-50ed-a682-a902-b0e1c628baf8.png)


- このように上位から順番に表示されます

　　　![image.png](https://qiita-image-store.s3.amazonaws.com/0/119378/7c8d3365-c5f0-5ccb-24a8-b01ab5e55353.png)


## 各表に対するアクセス数やDisk IO等を確認するには？

- これまで説明してきた画面と同じ画面で確認することができます。

- 右上の目玉マークをクリックするとどのような項目を表示させたいかが表示されます。
- 表示させたい項目のチェックボックスにチェックを入れて、OKをクリックします

　　　![image.png](https://qiita-image-store.s3.amazonaws.com/0/119378/6a33481b-8e6d-b523-7859-ef9bad1b24ee.png)



- サンプルはこちら。物理読み込み数等を表示させてみました。

　　　![image.png](https://qiita-image-store.s3.amazonaws.com/0/119378/06e0928d-0f99-89e2-053f-2a080a8ef4e4.png)
VSCodeで制御文字を表示する

技術書典のテンプレからpdfを作ろうと`npm run pdf` を走らせたところ次のエラーになってしまい。

```
./preface.tex:7: Package inputenc Error: Unicode character ^^H (U+0008)
(inputenc)                not set up for use with LaTeX.
```
[macで制御文字(�)が入力されてしまう問題](http://fridles.xyz/articles/6)  にハマっていたようなので記録します。 

Macの場合ですが、`⌘,`で設定を開き、Userタブ -> Extensions -> Edit in settings.jsonから開くか、

コマンドパレットで `Open Settings(JSON)` を検索してsettings.jsonを開いて次の設定を追加します。

```
 "editor.renderControlCharacters": true,
```

すると制御文字が表示されるようになります。
<img width="249" alt="スクリーンショット 2018-04-29 17.59.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/9628/006504b8-c4a2-977b-1c5c-7f169fe5b4ef.png">
フルスクリーンページ作成の復習

# 作成したもの

　[こちらのWebページ](https://y2yamanaka.github.io/kouzi_pg.github.io/)が今回作成したもの。

# 復習

## ・width
　ボックスの幅を指定する。レスポンシブデザイン対応のWebサイトデザインでは%で指定し、端末のサイズに合わせて伸縮するように記述します。

## ・height
　ボックスの高さを指定する。

## ・margin
　ボックスの外側の余白を指定する。4辺一度に指定する場合、上→右→下→左の順で記載する。

## ・padding
　ボックスの内側の余白を指定する。基本的な記述はmarginと同じ。

## ・vertical-align
　テキストや画像などの垂直方向の位置揃えを指定する。

## ・border-radius
　ボーダーの角を丸める。

## ・background-image
　要素の背景画像を指定する。書式はbackground-image: url(画像ファイルへのパス)。

## ・background-repeat
　背景画像の繰り返しパターンを指定する。

## ・background-position
　背景画像の表示位置を指定する。書式はbackground-position: 左右方向、 上下方向の順に半角スペースで区切る。

## ・background-attachment
　背景画像のスクロールを指定する。

## ・background-size
　背景画像の大きさを指定する。幅と高さを個別に指定する時は、幅、高さの順に半角スペースで区切る。
【Laravel入門】コントローラの作成とビュー表示

# コントローラの作成

今回は、コントローラの作成からビューへの変数・配列の受け渡しまでやってみる。

ますはコントローラを作成しよう。お決まりの``"Hello,World!"``を表示させたいので、名前は``HelloController``にする。

```
$ php artisan make:controller HelloController
Controller created successfully.
```

成功すると、``app/Http/Controllers``に``HelloController.php``が作成されているはずだ。そこに``public function index ()``以下の部分を追記する。 

```HelloController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelloController extends Controller
{
    public function index () 
    {
        $hello = 'Hello,World!';
        $hello_array = ['Hello', 'こんにちは', 'ニーハオ'];

        return view('index', compact('hello', 'hello_array'));
    }

}
```

動作の流れはこうだ。``compactメソッド``を使えば、ビューに変数と配列を渡すことができる。この場合、変数や配列であっても``$``を表記しないことに注意しよう。

- ``indexアクション``を作成する。
- ``変数$hello``と``配列$hello_array``を定義する。
- ``viewメソッド``で、``compactメソッド``で渡された内容を含んだ``index.blade.php``を表示する。

# ルーティングの設定

次はルーティングの設定だ。次の一文を追記する。

```routes/web.php
Route::get('/index', 'HelloController@index');
```

これで``/index``でアクセスされた時に、``HelloControllerのindexアクション``が実行される。

# Bladeビューの作成

今回は動作確認をするだけなので、おさらいも兼ねて``layout.blade.php``を親ビューとする``index.blade.php``を作成することにする。

[【Laravel入門】ビューとBladeと継承](https://qiita.com/33yuki/items/86ccd3f72ecf943825a6)

```resources/views/index.blade.php
@extends('common.layout')

@section('index')
    <p>{{ $hello }}</p>
    @foreach ($hello_array as $hello_word)
        {{ $hello_word }}<br>
    @endforeach
@endsection
```

親ビューへの記載もお忘れなく。

```resources/views/common/layout.blade.php
@yield('index')
```

BladeはHTMLの書き方がベースにあるが、PHPの記述も直接可能だ。そのため、２つの記法がごちゃ混ぜにならないように注意したい。

## 変数の記述
``{{ $変数名 }}``で出力が可能だ。変数を``{{ }}``で括る理由もちゃんとある。

公式ドキュメントより（一部抜粋）

>Bladeの{{ }}記法はXSS攻撃を防ぐため、自動的にPHPのhtmlspecialchars関数を通されます。

とっても便利。

## 配列の記述
ここで一例として``@foreachディレクティブ``を使ってみる。

まず、PHPの``foreach文``なら通常こう記述するだろう。

```example.php
<?php
foreach ($hello_array as $hello_word) {
    echo $hello_word."<br>";
}
?>
```

上記の構文を``@foreachディレクティブとしてBladeビューに記述``する時は、ここが違う。

- 変数の出力に``echo``はいらない。
- 変数は``{{ $変数名 }}``で記述する。
- 改行する場合は``."<br>"``ではなく直接``<br>``と記述する。
- 末尾の``;``はいらない。
- ``{}``ではなく、``@foreach〜@endforeach``で括る。

しかし、実際書いてみるとHTMLファイルの中で``<?php〜?>``と括って記述していた時よりも、ずっと楽だった。

ディレクティブには様々な種類があるそうので、随時活用していきたい。

今回はここまで。
【python】apacheのログ分析

#経緯
　業務上でよくapacheなどWEBサーバのアクセスログを分析することがある。通常はsplunkにログを転送しているので、すぐ調査できるが、中にはsplunkにログを転送していないものもあり、数百MBのログだけ渡されて分析してね☆ってときもある。そんなときに接続元IPアドレスとアクセス数くらいパっと見れると詳細に分析するあたりがついて便利だなって感じた。excelで分析する手段も考えたがログの量が多いときはexcelで開けないときも考慮してpythonで書いてみた。簡素な分析なのであまり役に立つ頻度は高くない(笑)

#構築環境について
PC:MacBookPro2016
IDE:pycharm
version:3.6.2

#仕様
・解析できるファイルはapacheのaccess.logとerror.logの2種類
・IPアドレス毎のアクセス回数をカウントする
・カウントしたIPアドレスの降順でソートする
・logのフォーマットは以下参照
https://ossec-docs.readthedocs.io/en/latest/log_samples/apache/apache.html
・サンプルファイルは以下からDL
http://www.monitorware.com/en/logsamples/apache.php

#メインファイル
```python:Log_Parser.py
#-*-coding:utf-8-*-

import codecs
import re

def create_dict(type):
    log_dict = {}
    pattarn = re.compile('.*client.*')
    if type==1:
        filename='access_log'
        with codecs.open(filename) as f:
            for i, line in enumerate(f.readlines()):
                log_data = line.rstrip('\n').split(' ')
                tmp = {i: log_data}
                log_dict.update(tmp)
    elif type==2:
        filename='error_log'
        with codecs.open(filename) as f:
            for i, line in enumerate(f.readlines()):
                if pattarn.match(line):
                    log_data = line.rstrip().split('client')
                    tmp = {i: log_data[1].split(']')}
                    log_dict.update(tmp)
    return log_dict

def key_count(log_dict):
    count_dict = {}
    for v in log_dict.values():
        if v[0] not in count_dict.keys():
            i=1
            update_data = {v[0]:i}
            count_dict.update(update_data)
        else:
            count_dict[v[0]]+=1
    return count_dict

if __name__ == "__main__":
    type = int(input("access_log=1,error_log=2:"))
    log_dict = create_dict(type)
    count_dict=key_count(log_dict)
    for k,v in sorted(count_dict.items(),key=lambda x:x[1],reverse=True):
        print("host:",k,"count:",v)
```

```text:result(access.log)
access_log=1,error_log=2:1
host: 64.242.88.10 count: 452
host: 10.0.0.153 count: 270
host: h24-71-236-129.ca.shawcable.net count: 51
host: cr020r01-3.sac.overture.com count: 44
host: h24-70-69-74.ca.shawcable.net count: 32
host: market-mail.panduit.com count: 29
host: ts04-ip92.hevanet.com count: 28
```

```text:result(error_log)
access_log=1,error_log=2:2
host:  64.242.88.10 count: 96
host:  200.174.151.3 count: 2
host:  140.113.179.131 count: 2
host:  61.9.4.61 count: 2
host:  24.70.56.49 count: 1
host:  81.226.63.194 count: 1
host:  24.71.236.129 count: 1
```
VSCodeのLaTeX Workshop 5.3.1でTeXをコンパイルできなくなったときの対処法

# コンパイルできなくなった原因
LaTeX Workshopの最近のアップデートで`"latex-workshop.latex.toolchain"`という設定項目がなくなり，`"latex-workshop.latex.recipes"`と`"latex-workshop.latex.tools"`という新しい設定項目になったのが原因でした．
# 対処法
ユーザー設定の

```
"latex-workshop.latex.toolchain": [
    {
        "command": "ptex2pdf",
        "args": [
            "-l",
            "-ot",
            "-kanji=utf8 -synctex=1",
            "%DOC%"
        ]
    }
],
```
を

```
"latex-workshop.latex.recipes": [
    {
        "name": "ptex2pdf",
        "tools": [
            "ptex2pdf",
        ]
    }
],
"latex-workshop.latex.tools": [
    {
        "name": "ptex2pdf",
        "command": "ptex2pdf",
        "args": [
            "-l",
            "-ot",
            "-kanji=utf8 -synctex=1",
            "%DOC%"
        ]
    }
],
```
に書き換えます．
postfix でバーチャルメールボックスから任意のアドレスへ転送する

`virtual_alias_maps` というものがあるので、そちらに map 情報を書いたファイルへの参照と追記し転送できるようにする

(参考) Postfix でバーチャルドメインで受けたメールを指定アドレスに転送するには
http://tilfin.hatenablog.com/entry/20120205/1328501873

```bash
# /etc/postfix/main.cf

virtual_alias_maps = hash:/etc/aliases, regexp:/etc/postfix/virtual-aliases.regexp
```

```bash
# /etc/postfix/virtual-aliases.regexp

/^test([^@]+)(@test.domain)?$/    test$1@new.domain
```

作成した map 情報が正しいかをチェックするには、postmap を使うと良い

```bash
$ postmap -q test1234@test.domain regexp:virtual-aliases.regexp
test1234@new.domain
```

設定を書いたら postmap して reload (必要なら sudo つけて)

```bash
$ service postfix reload
```
Gradle hello world

# gradleでHello world


## gradle install

```
$ brew install gradle 4.7
```

## version 確認

```
$ gradle -version
```

```terminal:実行結果
------------------------------------------------------------
Gradle 4.7
------------------------------------------------------------

Build time:   2018-04-18 09:09:12 UTC
Revision:     b9a962bf70638332300e7f810689cb2febbd4a6c

Groovy:       2.4.12
Ant:          Apache Ant(TM) version 1.9.9 compiled on February 2 2017
JVM:          1.8.0_51 (Oracle Corporation 25.51-b03)
OS:           Mac OS X 10.13.4 x86_64
```

# Create Project(IntelliJ)

1.File → new → project
2.Gradle → Next →　省略
3.Finish

# import 

# gradle 編集

```
Task helloWorld << {
    println "Hello, world"
}
```

# 実行(Terminal上) ※option + F12 + fn で開ける
```
$ gradle :helloWorld
```
Macターミナルのプロンプト表示変更


ターミナルを小さいウィンドウサイズで使いたいのに、余計な情報表示ために改行されて見辛い。
Linuxと同様に、.bashrc か .bash_profileにプロンプト表示の変更が記述できます。

* ファイルをvimで開く

```bash
vim ~/.bashrc
```

* 以下のように編集

```bash
# \h:ホスト名（最初の.まで）
# \H:ホスト名
# \t:時間（24時間表記）
# \T:時間（12時間表記）
# \u:ユーザ名
# \w:現在のディレクトリ（フルパス）
# \W:現在のディレクトリ
PS1="$ "
```

* 編集結果を反映

```bash
source ~/.bashrc
```
rails migration テーブルのカラム(名前や型)変更する時のrollbackの考慮 

# 既存のカラム名や型を変更したい

migration実施の際、downを書いていないとrollbakできないと思っていたが、changeメソッドを利用すれば、勝手にやってくれる。ただし、サポートしているメソッドのみ。カラム名の変更と型変更の例を以下に記載。 

## カラム名の変更
  
want_listsテーブルのカラム名を変更(name⇨user_id)

```ruby:以下を実行して雛形を作成
rails g migration rename_name_to_user_id_wantlists
```

```ruby:生成されるファイルを以下のように編集する
class RenameNameToUserIdWantlists < ActiveRecord::Migration[5.1]
  def change
    rename_column :want_lists, :name, :user_id
  end

# change メソッドの場合はdownは不要
end
```

rename_columnメソッドは、changeメソッドに対応しているので、ロールバックを実施すると自動でrollback文を発行してくれる。

## カラムの型変更

want_listsテーブルのnameカラムの型を変更(string⇨integer)

```ruby:以下を実行して雛形を作成
rails g migration change_type_string_to_int_wantlists
```

```ruby
class ChangeTypeStringToIntWantlists < ActiveRecord::Migration[5.1]
  def change
    change_column :want_lists, :name, :integer
  end
# これで問題なく型を変更できる。しかしロールバックを実施するとエラーになる。
end
```
change_columnメソッドはchangeメソッドの対象外。rollbackするとエラーになる。ロールバックできるように記述したい時はup、downで記載する必要がある。changeメソッドの対応は以下参照
https://railsguides.jp/active_record_migrations.html#change%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B

```ruby:カラム型変更ロールバック対応版
class ChangeTypeStringToIntWantlists < ActiveRecord::Migration[5.1]
  def up
    change_column :want_lists, :name, :integer
  end

  def down
    change_column :want_lists, :name, :string
  end
```
カラムの型を変更した後に元に戻すことなどはあまりないと思うので、この辺は手動でリカバリでも問題ないと思う。
Canvasを使ってボールを自由落下させる


![Apr-29-2018 14-40-42.gif](https://qiita-image-store.s3.amazonaws.com/0/121228/1cb18b3a-c370-ffe6-a2a5-0a252ed7cb3a.gif)


##ボールの自由落下のHTML
```html

<canvas id="myCanvas" width="480" height="320"></canvas>
```
`<canvas>`要素内に全てを描画します。

##描画の準備をする
```javascript
var canvas = document.getElementById("myCanvas");
var ctx = canvas.getContext("2d");
var y = 30;  //距離
var g = 9.8;  //重力加速度
var v = 0.0;  //速度 
var t = 0.15;  //時間
var e = -0.7;  //反発係数
```
`getElementById`を使って要素を取得します。また、2D描画コンテキストを`ctx`変数に保存します。


##ボールを描画する
```javascript

function drawBall() { 

  ctx.beginPath();
  ctx.arc(canvas.width/2, y , 30, 0, Math.PI*2, false);
  ctx.fillStyle = "rgba(240, 240, 240, 0.8)";
  ctx.fill();
  ctx.closePath();

}
```
ボールを描くときは`beginPath()`メソッドと`closePath()`メソッドの間に書きます。
`arc()`メソッドのパラメーターは次の通りです。
**`arc(円の中心のx座標, 円の中心のy座標, 半径, 円の開始角度, 円の終了角度, 描く方向)`**
ボールを自由落下させる為、y座標を変数`y`としています。
`y`の初期値が30なのは、`arc()`メソッドは円の中心のy座標を指定するため、ボールが全て表示されるように半径分ずらしています。
`fillStyle`プロパティで指定した色を`fill()`メソッドを用いて塗りつぶしています。


##ボールを自由落下させる

```javascript

function draw() { 

  ctx.clearRect(0, 0, canvas.width, canvas.height);

  drawBall();

  v += g * t;
  y += v * t; 

  if (y > canvas.height - 30) {
    y = canvas.height - 30;
    v *= e;
  }

  requestAnimationFrame(draw);

}
```
重力加速度の公式を使います。
>g = 9.8m/s2
>v = g * t

つまり、tの値を大きくすればするほど落下速度は速くなります。

if文は、ボールの位置の`y`座標がcanvasの高さより高かったら、速度に反発係数を掛けてボールを跳ね返らせます。
`canvas.height`からは円の半径分30を引いてボールが全て表示されるようにしています。

`ctx.clearRect(0, 0, canvas.width, canvas.height);`はフレーム後に描画を削除しています。
`clearRect()`メソッドのパラメーターは次の通りです。
**`clearRect(四角形の左上端のx座標, 四角形の左端のy座標, 四角形の右下端のx座標, 四角形の右下端のy座標)`**
このメソッドを書かないとボールの軌跡が残ってしまいます。
IntelliJ ショートカット一覧 windows & mac

# IntelliJ ショートカット一覧 (迷ったら追加)

## Terminalを開く
|  windows |    mac    |
|:------------------:|:------------------:|
|  Alt + F12 | option + F12 + fn        |

## 同じ単語を選択する
|  windows |    mac    |
|:------------------:|:------------------:|
|  ？ | Ctrl + g        |

## タブを移動する
|  windows |    mac    |
|:------------------:|:------------------:|
|  ？ | control + <- or ->       |
※Macスクリーンが変わる場合は、Mission Controlで左(右)の操作スペースに移動のチェックを外す
プログラミング初学者が研修を受ける時に

#このテーマの目的
最近ITの会社に就職したところ、初学者の同期と共に、研修を受けることになった。
その中で、初学者の人が陥りやすい考え方、のようなものを発見したので、自分もかつてそうだったなぁなどと過去を振り返りつつ、このように考えてみては？と提案をしたいと思う。
まあ、あくまで提案なので、悩みがあればぜひ周りの先輩方に相談してみてほしい。きっと優しく教えてくれるはずだから。

#モチベーションが上がるやり方で勉強する
正直、プログラミングは学び始めが一番しんどいと思う。
教材には何やら呪文のような物がたくさん書いてあるし、教材の呪文を書き写したはずなのに、何故かエラーを吐くし。
モチベーションは下がるし、勉強していて辛い。

そこで、勉強する時は、ぜひ自分のモチベーションを上げること意識してほしい。
例えば一区切り付く度にご褒美があってもいいし、お気に入りの音楽を書けながら勉強してもいい。
スタバでやると落ち着くならスタバでやればいいし、自室でやったっていい。

#段階を踏んで学習を進める
いきなりその言語の全てをマスターしようとすると、精神衛生上、非常によろしくない。
一歩ずつ、着実にやっていこう。
だいたいどんな言語でも、

- 条件分岐（ifとか）
- 繰り返し（forとか）
- 配列(hoge[]みたいなやつ)

が一通りかけるようになれば、基本（fizz-buzzとかじゃんけんとか）は書けるようになるはずだ。
まずは、とにかく上の構文を使い倒して、自作のコードをいろいろ書いてみるといい。これだけでもプログラムの楽しさの、その片鱗はうかがい知ることが出来るから。

そこから、例えばjavaなら、

- オブジェクト指向
- 例外処理
- ...etc

と発展させていくと良いと思う。

#コードを無理に覚えようとしない
段階を踏んで学習する上で、大事なことは、構文を無理に覚えようとしないことだと思う。
これは特に、新卒の人に見られる傾向で、時には写経までしてコードを覚えようとさえしていた。

全く無駄な努力とまでは言わないけれど、そこまでしているプログラマはたぶんほとんどいないんじゃないかな。たくさんコードを書く中で自然と覚えてしまうものだから、あまり気にしなくても良い。

構文が分からない時はどうするかって？
あなたは今、何を使ってこの記事を読んでいるんだい？

#とにかく書く
これは、一見非効率に見えて、近道じゃないだろうか。
プログラムって、どのように使うとどのような挙動をするか、が慣れないとイメージできない。
だから、失敗を恐れず、とにかく書いて試してみるか、位の心持ちで、いろいろとやってほしい。
###※プログラムを書いているソフトの止め方を知る
初心者のうちは意図せず無限ループを発生させてしまうことがある。
そんな時に止め方がわからないと焦ってしまうし、いろいろ試すのにためらってしまうことだってある。だからまずは、困ったときにこれを押す、というボタンを知っておけば、いろいろ試せるんじゃないかな。


#課題は複数回やるように心がける
これは、課題の量が多すぎなくて、時間のめどが付く人にオススメするやり方。

複数回繰り返すことで、その課題で身につけてほしいことが身につくし、そこで身についたことは必ず次の役にたつ。

やり方はいろいろあるだろうけれど、例えば以下のやり方を提案しておこう。

1.教材のコードを見ながらコピペして実行する（結果を知る）
2.教科書を参照しながら自分で書く（その結果を出力させる方法を考えながら書く）
3.細かい構文で覚えてないところだけ調べる（教科書は使わないで）他は自分で書く
4.今書いているものをもっと短くわかりやすく書けないかちょっと考えてみる（じっくり考えなくても大丈夫）

あるいは学習範囲が進む度に、昔のコードを見返してみるのも良い方法かも知れない。
例えば

```java:Sample1.java
hoge[0]=1;
hoge[1]=2;
hoge[2]=3;
.......
```
と全部書いてやっていたのをもっと楽に書けないか？、とか。
（いや、上記のコードにツッコミどころがあるのは認めるけど、大学生の時に友達を教えていて実際経験したことなんだ。初心者あるあるだと思うんだけれど。）

#わからない所はためらわずに経験者に聞く
プログラミングしている中で、自分で調べても分からないとか、何が分からないかが分からないとか、必ずこういう場面に出くわすと思うのだけれど、こういう時はさっさと経験者に聞いてしまうのが良い。
講義中なら講師の人に聞けばいいし、自習してる時でも、同じクラスの経験者に聞けばいいと思う。もちろん相手が忙しい時は即対応は期待出来ないのだけど、slackにコード投げといて、とか言ってくれるんじゃないだろうか。

#書いたコードは必ず経験者に見せる
さて、そうやって書いた自信のコードは必ず経験者の人に見せてほしい。
アルゴリズムやコードの中身は、上級者に近づくほど、短く、分かりやすく、見やすくなっている物だし、言語によって暗黙のルールとがあったりするんだ。（例えば変数の宣言をまとめて先頭に書くかどうか、とか）そうしてどんどん自分のコードをアップグレードしていくと良い。

#まとめ
本当は、変数名とかコメントとか、初心者の人に意識してほしいことはあるのだけれど、まずはここまで意識してくれると、自分でプログラミングを勉強する、コツが掴めるんじゃないかと思う。
何度も言うけれど、初学者にとって最初が一番辛いんだから、モチベーションが下がった時はサボってもいいし、周りに相談してみると良いと思う。
そうやって、ある程度身につけば、いろいろ自作できるようになって楽しいよ。
Android端末同士でNFCで通信するための手段メモ

#概要
端末同士をかざして通信、ってなんか未来感ありますよね。
Android端末自体にAndroid Beamという端末間の通信機能はありますが、色々と検討してみたのでそのメモです。

#注意
+ 実装したわけではありません。単なる検討です
+ 多分に誤りを含んでいる可能性があります。
+ NFCでの(特に容量の大きな)データ交換は、多くの場合非現実的です。
+ BLE等を使ったほうがより良い結果を得られる場合の方が多いでしょう

#手段
+ Android Beam (NFC-DEP, SNEP)
+ R/W + HCE(ISO-DEP)

#Android Beam
NFC規格の本来の目的のP2Pモードで通信する。お互いが対等に振る舞う。
NFC-DEP, LLCP, SNEPの3層を用いて通信する。

LLCPはTCP/UDPのような通信を提供し、SNEPはそれを用いてシンプルなNDEFメッセージの交換を行う。
Android Beamという名前はついているが、単なるURLの送信などの場合はSNEPを用いているため、
実はWindowsなどでも受信できる(PaSoRiで確認)

Android Beamはアプリから利用でき、OS管理下なので比較的容易に使うことができる。
アプリがなくてもデータ共有から送信・受信することができる。
**注意:ファイルの転送においては、BluetoothにハンドオーバーするBTSSPを用いている**

なお、NFC-DEPはAndroid Beamが掴んでいるため、アプリ独自に利用できないようである。
ちなみに通信には、高速なType-Fが優先して使われ、対応していない機器はType-Aなどで接続される。

参考: https://hiro99ma.blogspot.jp/2012/07/android-beam.html
http://lnovel.diary.to/archives/65844081.html
http://www.atmarkit.co.jp/ait/articles/1301/07/news014_2.html


#R/W + HCE
NFC技術の本来の目的のカード間モードで通信する。
片方がカードとして振る舞い、片方がカードリーダーとして振る舞う。

ISO-DEP(or FeliCa)による通信となり、一定の定められた手順以降は自由な手順で通信できる。
当然ながら、きちんと実装すればAndroid以外とも通信できる。

互換性や利便性を求めるならHCE(Android 4.4以降)を。
利便性を捨てて速度を求めるならばHCE-F(Android 7以降のみ)を。

読み取る側も、Reader Mode(Android 4.4以降)を使う必要がある。
(使わないとAndroid Beamで通信を確立しようとしてしまうため)

HCEを使った場合、ロック画面でも通信できるのが利点。

参考: http://tongarism.com/2700
Visual Studio でユニットテストをデバッグ実行する方法

備忘録。環境は Visual Studio 2017 version 15.6.6

ユニットテストがどうしてもうまくいかない時、デバッグでステップ実行したい時があります。
しかし、ブレークポイントを張ってテストを実行しても止まってくれません。

そんな時は、

1. いつも通り、ブレークポイントを張る
2. `テスト(S)` > `デバッグ` > `選択したテスト` または `全てのテスト`

もしくはショートカットキーで `Ctrl + R` + `Ctrl + T` でもＯＫです。


ちゃんと止まってくれます。:relaxed:
![image.png](https://qiita-image-store.s3.amazonaws.com/0/195024/e6842b14-0fac-4e18-1c36-0438e8beb774.png)
IoUの0.1～0.9を図にしてみた

# はじめに

物体検出とかではIoU(Intersection over Union、Jaccard index)をよく使いますが、どのくらいの数値でどのくらいの重なり具合なのかがよくわからなかったので図にしてみました。

# 図

## IoU == 0.9
![#1 iou=0.90, offset=0.03.png](https://qiita-image-store.s3.amazonaws.com/0/24930/4e880373-e919-d866-be69-0c91db9297e1.png)

## IoU == 0.8
![#2 iou=0.80, offset=0.06.png](https://qiita-image-store.s3.amazonaws.com/0/24930/1fad11f1-8a87-f44d-a8e3-11eef5ced714.png)

## IoU == 0.7
![#3 iou=0.70, offset=0.09.png](https://qiita-image-store.s3.amazonaws.com/0/24930/3c45f1ce-c597-4701-40bb-ff766037268b.png)

## IoU == 0.6
![#4 iou=0.60, offset=0.13.png](https://qiita-image-store.s3.amazonaws.com/0/24930/cbb54fea-e663-2f3c-8c86-d08bc0dc7ed6.png)

## IoU == 0.5
![#5 iou=0.50, offset=0.18.png](https://qiita-image-store.s3.amazonaws.com/0/24930/60102b07-e69d-a90d-881b-255dab9374f4.png)

## IoU == 0.4
![#6 iou=0.40, offset=0.24.png](https://qiita-image-store.s3.amazonaws.com/0/24930/0954e14a-6a5e-f7a7-997b-fe41312778de.png)

## IoU == 0.3
![#7 iou=0.30, offset=0.32.png](https://qiita-image-store.s3.amazonaws.com/0/24930/712110e5-3568-fee5-5f0f-a5253144ce8b.png)

## IoU == 0.2
![#8 iou=0.20, offset=0.42.png](https://qiita-image-store.s3.amazonaws.com/0/24930/8dc35f9f-6190-8e45-25c8-a12459e3bc4f.png)

## IoU == 0.1
![#9 iou=0.10, offset=0.57.png](https://qiita-image-store.s3.amazonaws.com/0/24930/bb00f548-61df-d8cb-a3f6-ae2a63d9190f.png)


# コード

```plot_iou.py
import matplotlib
import matplotlib.pyplot as plt

import numpy as np

for i, iou in enumerate(np.linspace(1, 0, 11)):
    # 　 ↓t
    # □□□
    # □□□
    # □□■□□
    # 　　□□□
    # 　　□□□

    # inter = (1 - t) ** 2
    # union = 2 - inter
    # iou = inter / union
    # https://www.wolframalpha.com/input/?dataset=&i=Solve%5Bu+%3D%3D+(1+-+t)%5E2+%2F+(2+-+(1+-+t)%5E2)+%26%26+0+<%3D+t+%26%26+t+<%3D+1+%26%26+0+<%3D+u+%26%26+u+<%3D+1,+t%5D
    # → t = 1 - sqrt(2) sqrt(u/(1 + u))
    t = 1 - np.sqrt(2 * iou / (1 + iou))
    print(f'#{i} iou={iou:.2f}, offset={t:.2f}')

    fig = plt.figure()
    ax = plt.axes()
    ax.add_patch(matplotlib.patches.Rectangle(xy=(0 / 2, 0.5 + 0 / 2), width=0.5, height=0.5, color='#9999ff77'))
    ax.add_patch(matplotlib.patches.Rectangle(xy=(t / 2, 0.5 - t / 2), width=0.5, height=0.5, color='#99ff9977'))
    ax.set_aspect('equal')
    plt.savefig(f'#{i} iou={iou:.2f}, offset={t:.2f}.png')
    plt.close()
```
ハンドメータを作る（テキサスホールデム ）

# 1. ハンドメータとは
これ。どっちが勝ちやすいかの数値化。
![meter1.png](https://qiita-image-store.s3.amazonaws.com/0/127424/9476ead5-a9e4-8826-e9a9-42e690ac4762.png)

作った結果は↓。計算時間は 数秒程度なので十分実用的。

```js
$ node 06-handmeter.js
[ '74%', '26%' ]
[ '84%', '16%' ]
[ '93%', '7%' ]
```

# 2. 作り方
全ての組み合わせを計算し、どちらのハンドが勝つかの統計値をとり、100％で規格化する（合計値が100となるようにする）。なお、ドローの場合は、両者勝ちとして計算した。

計算量が問題となる。プリフロップでのハンドメーターは、組み合わせとして `C(48, 5) = 1712304 `通りの可能性がある。これは大きすぎるほどの量ではないが、ナイーブにポーカーの実装をすると、数分～数十分程度の計算時間がかかってしまう。（参考値: ナイーブ: `1,000～10,000回/sec`, 専用アルゴ: `100,000～/sec`)。なお、フロップ後（`C(45, 2)= 440通り`）、ターン後（`C(44, 1)=44通り`）のハンドメーターの計算は一瞬で終わる。

# 3. 実装
そんなに難しくはない。

- コミュニティカードと手札のカードを 52枚のデッキから取り除き、
- あと何枚引くか？を計算して(`numDraw`)
- 全ての場合を持ってくる(`combinations` ジェネレータ)
- それぞれの場合に、各人のハンドのスコアを計算し(`handval`)
- 勝者のカウンタをインクリメントする（ドローの場合は勝者が複数いるとして計算）
- 最後に、規格化して終了

```js
const handmeter = (board, hands) => {
  let deck = range(52).filter(c => !board.includes(c));
  hands.map((hand) => { deck = deck.filter(c => !hand.includes(c)); });

  const counter = hands.map(() => 0);
  const numDraw = 5 - board.length;
  for (const cards of combinations(numDraw, deck)) { // really big loop
    const values = hands.map(h => [...board, ...cards, ...h]).map(handval);
    const winval = values.reduce((acc, x) => (acc > x ? x : acc), 9999);
    // draw will result in multiple winners
    values.forEach((val, i) => { if (val === winval) counter[i] += 1; });
  }
  const sum = counter.reduce((acc, x) => acc + x, 0);
  return counter.map(x => x / sum * 100.0);
};
```

全ての場合を持ってくる部分は、`C(n, k)` 通りの全ての場合を生成するという、比較的一般的なユースケースである。メモリを抑えるためジェネレータを使って実装したが、一度に作ってしまった方が早いかもしれない。

```js
function* combinations(size, arr) {
  if (size === 1) {
    for (const x of arr) yield [x];
    return;
  }
  for (const fst of arr) {
    const filtered = arr.filter(x => x > fst);
    const ite = combinations(size - 1, filtered);
    for (const snd of ite) yield [fst, ...snd];
  }
}
```

スコア計算(`handval`)は、高速化のための工夫がいるが、[前に書いた記事](https://qiita.com/41semicolon/items/13d4b61703f4dd876ce4) に記載したように、"PokerHandEvaluator" by Henry Lee　のアルゴリズムを使った。

# 4. ボトルネック
明らかにジェネレータの実装が遅い。まとめて作った方が良いかもしれない。

```
ジェネレータで値の生成のみ C(48, 5): 3.317s
上記 + ハンド評価: 6.689s
```

# 5. 次のアクション
ハンドメータはしょせんテレビショー向けの機能である。実際には、相手の手がわからない。相手の手がわからない状態で、自身の2 枚のハンドと場に出ている `n = 0, 3, 4` 枚のカードから、自身のハンドの強さを数値化することができるだろうか？

答えはできる。特に 2-players フロップ後の場合の数は`C(47, 2) * C(45, 2) = 1070190通り` なので全数チェックが可能である。ただ、プリフロップでは `C(50, 5) * C(45, 2) = 2097572400通り`の計算は難しいのでシミュレーションを利用する必要がある。もちろん、3人以上の場合にもシミュレーションが必要だ。後日実施するかもしれない。
MacTeX がインストールする ghostscript 関係ファイル一覧を確認

こんにちは。
[MacTeX](http://www.tug.org/mactex/) （のパッケージファイル）がインストールする ghostscript 関係ファイルの一覧を表示しました[^1]。

[^1]: 参考："[Uninstall Ghostscript that comes with MacTex](https://gist.github.com/gwerbin/dcba755b0484423e9e45)" (GitHubGist)

```mactex_ghostscript.sh
#!/bin/sh
pkg=/usr/local/Caskroom/mactex/20170524/mactex-20170524.pkg
[ -n "$1" ] && pkg="$1"
bom_usr_local=$(pkgutil --bom $pkg | fgrep local.pkg)
files=( $(lsbom -s -f $bom_usr_local | fgrep -v ghostscript | sed 's_^\._/usr/local_') )
for item in ${files[@]}; do
    echo $item
done
```

```console
$ ./mactex_ghostscript.sh
/usr/local/bin/dvipdf
/usr/local/bin/eps2eps
/usr/local/bin/font2c
/usr/local/bin/gs-X11
/usr/local/bin/gs-noX11
/usr/local/bin/gsbj
/usr/local/bin/gsdj
/usr/local/bin/gsdj500
/usr/local/bin/gslj
/usr/local/bin/gslp
/usr/local/bin/gsnd
/usr/local/bin/lprsetup.sh
/usr/local/bin/pdf2dsc
/usr/local/bin/pdf2ps
/usr/local/bin/pf2afm
/usr/local/bin/pfbtopfa
/usr/local/bin/pphs
/usr/local/bin/printafm
/usr/local/bin/ps2ascii
/usr/local/bin/ps2epsi
/usr/local/bin/ps2pdf
/usr/local/bin/ps2pdf12
/usr/local/bin/ps2pdf13
/usr/local/bin/ps2pdf14
/usr/local/bin/ps2pdfwr
/usr/local/bin/ps2ps
/usr/local/bin/ps2ps2
/usr/local/bin/unix-lpr.sh
/usr/local/bin/wftopfa
/usr/local/share/man/de/man1/dvipdf.1
/usr/local/share/man/de/man1/font2c.1
/usr/local/share/man/de/man1/gsnd.1
/usr/local/share/man/de/man1/pdf2dsc.1
/usr/local/share/man/de/man1/pdf2ps.1
/usr/local/share/man/de/man1/printafm.1
/usr/local/share/man/de/man1/ps2ascii.1
/usr/local/share/man/de/man1/ps2pdf.1
/usr/local/share/man/de/man1/ps2ps.1
/usr/local/share/man/de/man1/wftopfa.1
/usr/local/share/man/man1/dvipdf.1
/usr/local/share/man/man1/font2c.1
/usr/local/share/man/man1/gs.1
/usr/local/share/man/man1/gslp.1
/usr/local/share/man/man1/gsnd.1
/usr/local/share/man/man1/pdf2dsc.1
/usr/local/share/man/man1/pdf2ps.1
/usr/local/share/man/man1/pf2afm.1
/usr/local/share/man/man1/pfbtopfa.1
/usr/local/share/man/man1/printafm.1
/usr/local/share/man/man1/ps2ascii.1
/usr/local/share/man/man1/ps2epsi.1
/usr/local/share/man/man1/ps2pdf.1
/usr/local/share/man/man1/ps2pdfwr.1
/usr/local/share/man/man1/ps2ps.1
/usr/local/share/man/man1/wftopfa.1
```
micro:bit+超音波距離センサー用パッケージ pxt-uds

# はじめに

「人がXXcmまで近づいたらxxxをする」を実現するため超音波距離センサーHC-SR04をmicro:bitに接続してみました。

![IMG_2364.jpg](https://qiita-image-store.s3.amazonaws.com/0/44523/ab407cec-19bb-fcd0-0919-31099f163c1c.jpeg)


# 用意するもの

- micro:bit 本体
- 超音波距離センサーHC-SR04
- HC-SR04用電池ボックス
    - HC-SR04の定格は5Vなので別電源が必要です。ただ、HC-SR04にはいくつかバージョンがあり水晶発信が表側に無いタイプはmicro:bitの3V出力でも動作するようです。（非推奨）


# 配線

![ir2.jpg](https://qiita-image-store.s3.amazonaws.com/0/44523/7b05f109-1413-c686-a15c-28ae1f0cbb76.jpeg)

#プログラム

オフィシャルで提供されているパッケージ
pxt-sonar
https://github.com/Microsoft/pxt-sonar
を使いプログラムを動かしてみた
https://makecode.microbit.org/_Ac96a2McuJk7
のですが手元にあるHC-SR04では測定値がずれてしまいました。

そこで、Grove のプログラムを参考にして作ったパッケージが
https://github.com/mbitfun/pxt-uds
です。

このパッケージを使ったサンプルプログラムが
https://makecode.microbit.org/_Fw4Mrti41DMw
![microbit-画面コピー (31).png](https://qiita-image-store.s3.amazonaws.com/0/44523/42a1c58d-a7dd-6569-160d-7df23a477f3e.png)

こちらは正しい数字が表示されました。（数値の表示には[WhaleySansFont](https://qiita.com/asondemita/items/a9a4c8b78e268955724b)を使っています）

測定値を比較してみると、オフィシャルのpxt-sonarパッケージはかなりズレている事が判ります。

![kyori-hikaku.jpg](https://qiita-image-store.s3.amazonaws.com/0/44523/093304d0-8c14-35d6-ea7b-b61856f1f975.jpeg)

HC-SR04はいろんなバージョンがあるようなので、オフィシャルで検証に使われたHC-SR04と秋月で売っている物は違うのかもしれません。
ブロックチェーン x 位置情報(e.g. Proof of location, Proof of presense) について調べる(2018 年 4 月 22 日時点)

ブロックチェーンの技術と位置情報を組み合わせ, 実物資産の存在証明をしたり, 特定の場所でイベントを起こす, 物流を管理する, が流行り始めています.

## 背景

ブロックチェーン.

GPS 情報は騙しやすい(?)ので, 確実性がない。

## Goal

ブロックチェーンで非中央集権的かつプライベートに位置情報を trustless でいい感じに扱う.

## FOAM

https://foam.space/

Introduction to Proof of Location
https://blog.foam.space/introduction-to-proof-of-location-6b4c77928022

とりあえず beta 版ですが API とかあります.

## Platin

https://platin.io/

2018 年 3 月終わりに white paper 出ました. 
開発はこれからかな?

## Sikorka

Ethereum ベース. 位置情報と絡めたスマートコントラクトを実現したりする.

Proof of Presense
http://sikorka.io/

2 年ほど前からあるようだが, 開発がボランティアベースのためかゆったり.

## Stratumn

ビジネスプロセスをブロックチェーンで行い(Proof of Process), その一要素として proof of location がある模様。

ゼロ知識証明で Proof of location.

http://blog.stratumn.com/zero-knowledge-proof-of-location/

コーヒー豆の流通のデモ


## 課題点

### GPS

どれも GPS はやばい, みたいな記述があるが, どう GPS はやばいのか検証したい.

時刻同期

ビーコン系はみんなが使い始める(or 各所に IoT センサーをばらまく)必要がありそう.
 
ビーコンのハードウェア化 -> 耐タンパー性をどう実現するか?

考えることは多いですね!
Angular CLI コマンドまとめ

まだ、使い始めですが 使った Angular CLI のコマンドをまとめて行きます。
というわけで *随時更新中*

##新規プロジェクト作成
```ng new [プロジェクト名]```
カレントディレクトリにプロジェクト名で指定したフォルダを作成しその中にプロジェクトのファイルを展開します。

##コンポーネントの作成
```ng generate component [コンポーネント名]```
[プロジェクト名]/src/app/[コンポーネント名]/ に
コンポーネントに関する４つのファイルを作成します。
カレントディレクトリをプロジェクトのルートフォルダに移動してから実行します。
[Swift]アクセス修飾子

## アクセス修飾子

- Swiftのアクセス修飾子をすぐに確認できるようまとめておく

| アクセス修飾子     | 説明           　 　　                |
| ----------- | -------------------------------- |
| open        | 別モジュールから呼び出せる。継承やオーバーライドが**可能**  |
| public      | 別モジュールから呼び出せるが継承やオーバーライドが**不可能** |
| internal    | 同モジュール内からのみ呼び出せる                 |
| fileprivate | 同ファイル内からのみ呼び出せる                  |
| private     | 同スコープ内からのみ呼び出せる                  |

## 参考
[Access Control — The Swift Programming Language (Swift 5.3)](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AccessControl.html)
Gitコマンド備忘録①コミットするまで。

## Gitコマンド、コミットするまでのメモ備忘録です。

参考にしたページ　
N予備校【2017年度】プログラミング入門 Webアプリ準備しよう　　
14 GitHub への push
https://www.nnn.ed.nico/

## 　手順

①リポジトリを作成する

```
$　git init
```
②ステージする

```
$　git add ファイル名
```
※ディレクトリファイル全てステージする方法
```
$　git add -A
```

③ステージングの状態を知る
※省略しても良い。ただ、最初のうちは勉強のため確認する。

```
$ git status
```

④コミットする

```
$ git commit -m "コメントメッセージ"
```
⑤履歴をみる

```
$ git log
```

## 　終わりに
試しに機能を作成してみたがうまくいかずに戻す手順、コマンドについての理解を深めたく書いているので、これ以降は次回以降で書こうと思います。
Webアプリケーションを開発してみたいけど技術力が不安な人、初めて作る人に作ってみて欲しい例題を用意してみた


# 開発するもの
## Lonely Twitter
### 概要
ローカルな環境下で動作し、
ユーザー登録、ログインを管理者が独りで行い、独りでユーザーを切り替えて心の闇をつぶやくWebアプリケーション

まさにダークウェブ(ローカル)

## 身につけたい技術
- 言語の基本文法
- フォーム送信(GET, POST)
- データベース連携
- セッション・クッキー
- ログイン認証
- ググり力

### 追加で身につけたい技術
- HTML/CSS(簡単なデザイン)
- セキュアな設計
- 美しいコーディング(今後の追記に備える)

# 仕様
## 機能
### ユーザー登録
- ユーザーIDは半角英数字1文字以上,10文字以内
- メールアドレス登録必須
- ユーザー名は未記入を許可、その場合はIDを表示する
- 自己紹介文を50文字、未記入可
- 非公開設定をすると自分以外tweetを見れない

### ユーザー認証
- ログイン機能
- セッションでログイン状態を維持
- tweetには必ずユーザーを紐付ける

### ユーザーページ(マイページ)
- ユーザー毎のプロフィールページを表示
- 自分のページの場合は編集可能

### Tweet機能
- 投稿
  - tweetは140文字まで、未記入不可
  - 非公開設定で自分以外には非表示(1tweet単位で設定可能)
- 編集
- 削除
- 閲覧
  - 特定ユーザーのタイムライン
  - すべてのタイムライン(非公開設定を除く)

## DB設計
### Users Table

|カラム名  |型             |NULL | KEY |
|   ---   |    ---       | --- | --- |
| user_id | varchar  | No  | PRI |
| password| varchar| No  |     |
| email   | varchar | No  | UNI |
| name    | varchar  | Yes |     |
| intro   | varchar  | Yes |     |
| private | boolean      | No  |     |


### Tweets Table
|カラム名  |型             |NULL | KEY |
|   ---   |    ---       | --- | --- |
| tweet_id| int          | No  | PRI |
| user_id | varchar | No  | MUL |
| content | varchar | No  |     |
| private | boolean      | No  |     |


## プラスアルファ
- パスワードはハッシュ化して保存
- フォロー機能
- Tweet公開範囲の設定
- クロスサイトスクリプティング防止
pip 10.0.1 から、Pythonインストール後のpip書き換えは不要になった模様

## 概要
Pythonを新規インストール、または仮想環境作成時、`Windows`環境の場合、`pip`関連のファイル書き換えが必要だった。

しかし、`pip 10.0.1`をインストールする場合、その作業は不要になった。

## 前提バージョン
|ツール等|バージョン|
|---|---|
|OS|Windows 10 Pro 1709(Fall Creators Update)|
|Python|3.6.5|
|pip(VerUp前）|9.0.3|
|pip(VerUp後）|10.0.1|

## pipの書き換えについて
仮想環境作成等作成直後に、`pip`を使ってパッケージをインストールしようとすると、`Windows`だとエンコードのエラーが発生します。

例；`pylint`のインストール
![pip_error.PNG](https://qiita-image-store.s3.amazonaws.com/0/15429/32b99ff2-907c-a04b-f779-068f9f164ea7.png)

これを回避するには、[ここ](http://www.mlab.im.dendai.ac.jp/~tomoriya/wiki/index.php?Windows%A4%CEVisualStudioCode%A4%C7Python#h8b77dee)にあるようなファイル書き換えを行う必要がありました。

## 新たな回避方法：pipのバージョンアップ
上の画像の、エラーメッセージ直後のメッセージにもありますが、`pip`のバージョンアップが行われ、記載時点で`10.0.1`が公開されています。

これをインストールすると、上に書いた書き換えを行わずとも、`pip`を普通に利用できます。

### pipバージョンアップ方法
仮想環境等を起動した状態で、コマンドライン、PowerShell等で

> python -m pip install --upgrade pip

と入力し、実行すると、バージョンアップが行われます。

### バージョン確認
仮想環境等を起動した状態で、コマンドライン、PowerShell等で

> pip --version

で、バージョンを確認できます。

## 手順の変更
`Windows`で、`Python`の仮想環境を作成した場合です。

### 旧手順
1. `venv`で仮想環境を作成する
2. `pip`のファイルを書き換える
3. `pip`を使って必要なモジュールをインストールする

### 新手順
1. `venv`で仮想環境を作成する
2. **`pip`のバージョンを上げる**
3. `pip`を使って必要なモジュールをインストールする

新手順のほうが、手作業を排除でき、楽になったと思います。

## 必要なくなるとき
`Python`にインクルードされる`pip`のバージョンが`10.0.1`になったとき、この記事にある内容自体、不要になると想定されます。


それまでは、`pip`のバージョンアップを実施して、回避するほうが安全で楽だと思います。
【Laravel入門】ビューとBladeと継承

# Laravelのビュー〜Bladeとは

Laravelのビュー作成にはHTMLではなく``Blade``が使われる。書き方のベースはHTMLなのだが、加えてBlade固有の様々な機能が使えるらしい。

公式ドキュメントより（一部抜粋）

> BladeはシンプルながらパワフルなLaravelのテンプレートエンジンです。他の人気のあるPHPテンプレートエンジンとは異なり、ビューの中にPHPを直接記述することを許しています。全BladeビューはPHPへコンパイルされ、変更があるまでキャッシュされます。つまりアプリケーションのオーバーヘッドは基本的に０です。Bladeビューには.blade.phpファイル拡張子を付け、通常はresources/viewsディレクトリの中に設置します。

つまり

- Laravelのビュー作成にはBladeテンプレートエンジンが使われ、結果Bladeビューとなる。
- ビューの中にPHPが直接記述できる。
- Laravelのビューは``resources/viewsディレクトリ``にある。
- 拡張子は``.blade.php``となる。

特に、``ビューの中にPHPが直接記述できる``のは魅力的だ。

Bladeの記述には``ディレクティブ``と呼ばれる機能が使われる。ほんの一部ではあるが、ビューに関するディレクディブをこれから紹介していく。

# ビューの継承

ビューの作成には、主に``継承``が使われるようだ。``親の持っている機能を子が使う``というイメージである。

公式ドキュメントより（一部抜粋）

>Bladeを使用する主な利点は、テンプレートの継承とセクションです。

>ご覧の通り、典型的なHTMLマークアップで構成されたファイルです。しかし、@sectionや@yieldディレクティブに注目です。@sectionディレクティブは名前が示す通りにコンテンツのセクションを定義し、一方の@yieldディレクティブは指定したセッションの内容を表示するために使用します。

>子のビューを定義するには、「継承」するレイアウトを指定する、Blade @extendsディレクティブを使用します。Bladeレイアウトを拡張するビューは、@sectionディレクティブを使用し、レイアウトのセクションに内容を挿入します。前例にあるようにレイアウトでセクションを表示するには@yieldを使用します。

ここで登場した``@extends``、``@section``、``@yield``がディレクティブと呼ばれる機能だ。ビューの作成では主にこれらが使われる。具体的な流れと各ビューで必要なディレクティブはこうだ。

- 各ページで共通して使用したいレイアウトがあるが、固有の部分を継ぎ足しながらそれぞれ作成するのは大変だ。
- なので、共通レイアウトを``親ビュー``として、各ページで異なる部分だけを``子ビュー``として作成すれば良いじゃないか。
- 子ビューに``今から親ビューを継承するよ、と宣言``させれば、親ビューの持っているレイアウトがそのまま反映される。
- 子ビューには、親ビューの中で使いたい``自分固有のパーツ``を書いておく。
- 親ビューでは``各子ビュー固有のパーツをどこで反映させたいか``を書いておく。
- これで、各ページにアクセスがあれば``親ビューをベースとした各子ビュー固有の画面``が表示される！

## 親ビューですべきこと
- ``@yield``で``各子ビュー固有のパーツをどこで反映させたいか``を記述する。

## 子ビューですべきこと

- ``@extends``で``今から親ビューを継承するよ、と宣言``する。
- ``@section``で``自分固有のパーツ``を定義する。

これらが「基本のキ」となる。

# ルーティングとビュー

少し話題が逸れるが、[先日紹介したルーティング](https://qiita.com/33yuki/items/0af932cc38ddab42edc2)では下記のような記述がされていた。

```routes/web.php
<?php

Route::get('/', function () {
    return view('welcome');
});
```

そして公式ドキュメント（一部抜粋）
>Bladeビューはグローバルなviewヘルパを使用し、ルートから返すことができます。

ルーティングで``viewヘルパ``が使われていたので、``view('welcome')``の記述で``welcome.blade.php``が表示されていたのだ。

# 実演

現在トップページにアクセスすると``welcome.blade.php``が表示されるが、これを親ビューと子ビューに分けたいと思う。

実際に表示されるのは子ビューなので、これを``welcome.blade.php``とする。親ビューは``resources/viewsディレクトリ内``に``commonディレクトリ``を作成し、その中に``layout.blade.php``を作成することにした。

まずは``welcome.blade.php``の内容を全て``layout.blade.php``にコピーする。これが親ビューとしての土台となる。

そして``welcome.blade.php``の記述を、下記の内容だけにする。たったこれだけである。

```welcome.blade.php
@extends('common.layout')

@section('child')
    <p>表示したい内容<p>
@endsection
```

１つ１つ構文を説明する。

- ``@extends('common.layout')``で、``commonディレクトリのlayout.blade.php``を親ビューとして継承する。
- ``@section('child')``で、``welcome.blade.php``固有のパーツを``child``という名前で定義する。
- ``@endsection``で、セクションの定義を終了する。

次に``layout.blade.php``だが、こちらは先程子ビューで定義したセクション``<p>表示したい内容<p>``を表示したい位置に、以下の内容を記述する。``@yield('child')``を記述した場所に``@section('child')``の内容がそのまま反映される仕組みだ。

```layout.blade.php
@yield('child')
```

以上の記述があれば、``welcome.blade.php``にアクセスされた時、``layout.blade.php``をベースとしたレイアウトに``welcome.blade.php``固有のパーツが組み込まれて表示される。

# Bladeのコメントアウト

Bladeのコメントは``{{-- コメントの内容 --}}``と記述しよう。

今回はここまで。
swift, iOSにおけるMixpanelを使ったイベントトラッキング管理の例

iOSでイベントトラッキングを管理する時に作ったクラスの例を紹介します。

Mixpanelを使った例ですが、他の例でも簡単に応用できると思います。

## EventのProtocolを作る

```swift
import Mixpanel

protocol Event {
    var eventName: String { get }
    var properties: [String: Any] { get }
    func track()
    func timeEvent()
}

extension Event {
    
    func track() {
        Mixpanel.sharedInstance()?.track(eventName, properties: properties)
    }
    
    func timeEvent() {
        Mixpanel.sharedInstance()?.timeEvent(eventName)
    }
}
```

## Eventに準拠した各カテゴリのログ送信クラスを作成

```swift
enum SignupEvent: Event {
    case signupButton
    case permitNotificationButton(granted: Bool)
    
    var eventName: String {
        switch self {
        case .signupButton:
            return "signup_btn"
        case .permitNotificationButton:
            return "signup_permit_notification_btn"
    }
    
    var properties: [String: Any] {
        switch self {
        case .permitNotificationButton(let granted),
            return ["granted": granted]
        default:
            return [:]
        }
    }
}
```

swiftのcaseは**camelCase**で書きたいし、logは**snake_case**で送りたいので、eventNameで変換してます。CodableのCodingKeysのイメージです。

また、enumの引数でproperties情報を渡すのも、必要なものだけに限定できるので、良いなと思っています。


## 使い方

```swift
SignupEvent.signupButton.track()
```

```swift
SignupEvent.permitNotificationButton(granted: true).track()
```

##　所感

* 呼び出す時に記述が直感的。
* ViewControllerなどでStringを引数に書かなかったりするから安全。
* イベントグループ(ファネル)ごとにまとめたりしとくと、探しやすいし、直しやすい
* protocol Extensionによって`import Mixpanel`をprotocolしかしないのも良い。他のライブラリに変える時に楽そう

ログ、イベントトラッキングで消耗しないために、保守性、可読性、拡張性の高いクラス管理をしたいものです。

## 参考

https://qiita.com/H_Crane/items/15b93a4403a10426627a#firebase-analitics (ほぼ同じです。参考にさせていただきました :bow: )
[Android] DatePickerDialogで年から選ばせるようにする方法

# この記事について
この記事では、DatePickerDialogの初期表示が月日の選択であることによる問題と、DatePickerDialogで年から選ばせるようにする方法について書きます。

# DatePickerDialogの初期表示は月日の選択
まず、以下のようなDatePickerDialogを使ったDialogFragmentの表示を考えます。

```
class DatePickerDialogFragment : DialogFragment() {
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        return DatePickerDialog(activity, null, 2018, 3, 29)
    }
}
```

このDialogFragmentは、APIレベル21（Lollipop）以降の端末で以下のように表示されます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/98669/3f075304-cb65-47c9-1394-fcf4230c14c8.png" width=300>

ここで、皆さんに問題です。たとえば「2000/4/29」という生年月日を入力する場合、2018年となっているところを2000年に変えたいですよね。年を変えたい時、ユーザーはどこをタップすれば良いでしょうか？

正解は、ここです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/98669/1547acdc-610f-7c53-cf60-98fd58faf838.png" width=300>


水色の枠で囲んでいる年表示の部分をタップすると、以下のスクショのように年の選択モードになります。年を選択すると、月日の選択モードに戻ります。

<img src="https://qiita-image-store.s3.amazonaws.com/0/98669/332aa261-8c52-4e73-b62a-a4a275766cbe.png" width=300>


**めっちゃ、わかりにくくないですか？**
ユーザーによっては年表示に切り替えられることに気づかずに、頑張って2000年までスワイプしてしまうかもしれません。

# DatePickerDialogで年から選ばせる
そこで、最初から年選択の状態にしておけば、ユーザーは迷わず年を入力できると考えました。DatePickerDialogに選択モードを切り替えるメソッドは残念ながら提供されていませんでしたが、StackOverFlowに解決策がありました。
https://stackoverflow.com/a/46223200

以下のように年表示の部分をクリックするコードを書いてやれば、最初から年選択モードで表示できます。

```
class DatePickerDialogFragment : DialogFragment() {
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val datePickerDialog = DatePickerDialog(activity, null, 2018, 3, 29)

        // 年の選択モードにする
        // Lollipop以前はspinnerモードなのでこの処理は不要
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            datePickerDialog.datePicker.touchables[0].performClick()
        }
        return datePickerDialog
    }
}
```

ただし、OSバージョンアップなどでDatePickerDialogの仕様が変わって、年表示のViewの位置が変わってしまった場合は、この方法は使えなくなると思われるので注意してください。

以上です。
ruby 動的メソッド 練習

#ruby 動的メソッド 練習

##環境
ruby 2.4.1
##概要
メタプログラミングの技術をリファクタリングに当てたらソースコードが
どうなるのかを検証しました。

メタプログラミング勉強して２日目のガチ初心者なので変なことやってたら
許してください。

### 動的メソッドにするソースコード
リファクタリングするソースコードは下記の物となります。
色々と被っていて嫌な感じです。

```ruby:
class TestClass
  def num1(num)
    tmp = get_num1(num)
    num + tmp
  end

  def get_num1(num) 10 * num; end

  def num2(num)
    tmp = get_num2(num)
    num + tmp
  end

  def get_num2(num) 20 * num; end

  def num3(num)
   tmp = get_num3(num)
   num + tmp
  end

  def get_num3(num) 30 * num; end
end

obj = TestClass.new
puts obj.num1(5)   --->  55
puts obj.num2(5)   --->  105
puts obj.num3(5)   --->  155
```

※　--->の場所は出力結果です。コードじゃないので注意。

### １回目
sendを使ってメソッドを動的に呼び出すようにして被ってる部分をまとめました。
多少マシになった気がします。

```ruby:
class TestClass
  def num1(num); summarize_method(:num1, 5) end
  def get_num1(num) 10 * num; end

  def num2(num); summarize_method(:num2, 5) end
  def get_num2(num) 20 *num; end

  def num3(num); summarize_method(:num3, 5) end
  def get_num3(num) 30 * num; end


  def summarize_method(name, num)
    tmp = send "get_#{name}", num
    num + tmp
  end
end

obj = TestClass.new
puts obj.num1(5)
puts obj.num2(5)
puts obj.num3(5)
```

### ２回目

メソッドを動的に定義するようにしました。
結構コンパクトになってきました。

```ruby:
class TestClass

  def get_num1(num) 10 * num; end
  def get_num2(num) 20 * num; end
  def get_num3(num) 30 * num; end

  def self.summarize_method(name)
    define_method(name) do |num|
      tmp = send "get_#{name}", num
      num + tmp
    end
  end

  summarize_method :num1
  summarize_method :num2
  summarize_method :num3
end

obj = TestClass.new
puts obj.num1(5)
puts obj.num2(5)
puts obj.num3(5)
```

### 3回目
initializeを使ってメソッドを動的に定義している場所を一行にまとめてみました。

```ruby:
class TestClass
    
  def initialize
    val_names = [:num1, :num2, :num3]
    val_names.map{|t| TestClass.summarize_method t}
  end

  def get_num1(num) 10 * num; end
  def get_num2(num) 20 * num; end
  def get_num3(num) 30 * num; end

  def self.summarize_method(name)
    define_method(name) do |num|
      tmp = send "get_#{name}", num
      num + tmp
    end
  end

end

obj = TestClass.new
puts obj.num1(5)
puts obj.num2(5)
puts obj.num3(5)
```

### 4回目
evalを使ってget_num系をループで動的に定義するようにしました。
これでnum4とかnum5が出てきても、val_namesいじるだけでOKです。

```ruby:
class TestClass
    
  def initialize
    val_names = [:num1, :num2, :num3]
    val_names.map{|t| TestClass.summarize_method t}
  end

  val_names = [:get_num1, :get_num2, :get_num3]
  val_names.each_with_index do |val_name, i|
    weight = (i + 1) * 10
    eval <<-END_OF_DEF
      def #{val_name}(num)
        #{weight} * num
      end
    END_OF_DEF
  end

  def self.summarize_method(name)
    define_method(name) do |num|
      tmp = send "get_#{name}", num
      num + tmp
    end
  end

end

obj = TestClass.new
puts obj.num1(5)
puts obj.num2(5)
puts obj.num3(5)
```
pythonのimportに関する使用に関して

#開発環境

python 3.6.5
pyenv 1.2.3
keras 2.1.6
h5py 2.7.1
Darwin 16.7.0 Darwin Kernel Version 16.7.0: Tue Jan 30 11:27:06 PST 2018; root:xnu-3789.73.11~1/RELEASE_X86_64 x86_64

#起こったこと
フォルダの中身は次のようになっていました。
- keras.py
- base64.py

keras.pyの中身は次のようになっていました。

``` keras.py
from keras.models import Sequential
from keras.layers import Dense, Activation
```

これを実行しようとしたところ、以下のようなエラーが出てきました。

```
Traceback (most recent call last):
  File "keras.py", line 1, in <module>
    from keras.models import Sequential
  File "keras.py", line 1, in <module>
    from keras.models import Sequential
ModuleNotFoundError: No module named 'keras.models'; 'keras' is not a package
```

原因を調べたところ、keras.pyは自分自身をimportしていました。このkeras.pyをlearn.pyに名前を変更してこの問題は解決しましたが、次にkeras.pyを実行したところ次のエラー最後の行に文字が出てきました。

```
ImportError: cannot import name 'b64encode'
```

kerasはh5pyというライブラリを使っています。このh5pyの中でbase64をimportしています。これはlearn.pyと同じフォルダにあるbase64.pyをimportしようとしているために出るエラーだということが発覚しました。なのでこのbase64.pyを消してこの問題は解決しました。

#余談
ローカルのフォルダにあるファイルをインポートする方法はきちんとあるので、デフォルトでグローバルな場所を探すようにしてもらえたら嬉しいんですが。~~これは仕様がバグとしか言いようがないですよね。~~
セキュリティを考慮した内部サーバからのインターネット接続に関して

##◆初めに
システム構築において、内部サーバからのインターネット接続は、セキュリティ的に注意が必要となる部分ではありますが、内部サーバからのインターネット接続をすべて拒否した場合、メンテナンス性が損なわれます。

今回は、内部サーバからのインターネット接続を可能としつつ、セキュリティにも考慮したシステムを構築してみました。

【用語集】

|略語|名称|
|---|---|
|web・ap　　　|webサーバ・アプリケーションサーバ|
|db          |データベースサーバ|
|squid       |squidサーバ|
|内部サーバ　|「web・ap」、「db」、「squid」|
|fw　　　　　 |ファイヤーウォール機器|

【登場するセグメント】

|略語|名称|
|---|---|
|vpn seg　　|外部DCと繋ぐセグメント|
|dmz seg          |web公開セグメント|
|internal seg       |web・apとdb、外部DCとdbを接続するセグメント|
|squid seg　|「内部からのインターネット接続セグメント|
![Network diagram.png](https://qiita-image-store.s3.amazonaws.com/0/160993/b39b6815-565a-61c3-81b8-3f6b6869d902.png)

【要件】
・インターネットからの接続は、dmz segに対して送信元anyで宛先80・443のみ許可とする。
・内部サーバからのインターネット接続。
　・yum update。
　・ウイルス対策セキュリティパターンファイルの取得。
・外部DCからdbに対してデータ送信をする。

##◆インターネット接続構成
①インターネットに抜けられるのは、squidサーバのみとする。
 他セグメントは、内部からのインターネット接続は拒否とする。
![Network diagram1.png](https://qiita-image-store.s3.amazonaws.com/0/160993/c9178b5b-0990-040b-c2c3-b4d32ab11f45.png)


②内部サーバからのインターネット接続は、squidサーバ経由とする。
![Network diagram 2.png](https://qiita-image-store.s3.amazonaws.com/0/160993/f7a50b29-4834-c077-11c5-8bad75e6ee2d.png)


##◆fw設定
**vpn seg設定**
internal segへのみ通信許可。


**dmz seg設定**
squid seg、vpn segへの通信はすべて拒否。
internal segへの通信は、使用する特定ポートのみ許可する。

**internal seg設定**
squid segへの通信はすべて拒否。
dmz seg、vpn segへの通信は許可する。

**squid seg設定**
dmz seg、internal seg、vpn segへの通信はすべて拒否。
squid segからのインターネットアクセスはsquidサーバからのみ許可とする。
squid seg→インターネットの許可ポートは、80(tcp),443(tcp),53(tcp/upd)

##◆squid設定
**①ローカルネットワークの定義**
　指定したセグメントから受付許可とする。

```
acl localnet src "squid seg"
```
**②squidが使用するポート**


```
http_port 8080
```

**③ホワイトリスト方式でのアクセス先の制御**

今回の要件では、下記ドメインのみを許可とする。
　・リポジトリサイト
　・セキュリティパターン取得元サイト

- ホワイトリスト作成<br>
許可するドメインを記載します。
".ドメイン名"とすることでサブドメインも許可とする。

```
/etc/squid/whitelist

.許可するドメイン名
```

- ホワイトリストの適用<br>
ホワイトリストは上に書かれたものから有効となる為、最後にdeny allをいれる必要がある。


```
/etc/squid/squid.conf

acl whitelist dstdomain "/etc/squid/whitelist"
  http_access allow localhost
  http_access allow whitelist
  http_access deny all
```
#◆まとめ
squidを利用することで、内部サーバからインターネット接続を可能としつつ、セキュリティ的にも考慮された構成が可能となりました。
【数式アレルギー治療】総和の記号Σ(シグマ)　初診

# <font color="009F8C">**まえがき**</font>
どうも、数式アレルギーのデブです。

- 技術系の記事を読んでいて数式がでると「うっ。。。」ってなる
- 脳が理解することを拒否する

そんな数式アレルギーなデブですが
今回はそんな厄介なアレルギーのうちの一つ
**シグマアレルギー**を克服したいと思います。

# <font color="009F8C">**総和の記号、シグマ**</font>

```math
\sum_{i=1}^5i
```

こいつです、こいつを克服していきます。
この記号(Σ)はシグマと言います。

# <font color="009F8C">**先生、私シグマアレルギーなんです。。。**</font>

先生「まずはアレルギーの原因であるシグマを使わないようにしてみましょう」

```math
\sum_{i=1}^5i
```

これはシグマを使わないとこうなります。

```math
1+2+3+4+5
```


# <font color="009F8C">**アレルギー治療開始**</font>

```math
\sum_{i=1}^5i
```

## **シグマの下を治療**

**i = 1**のところ

これは<font color="red">**iが1から始まるよ**</font>と訴えています。

## **シグマの上を治療**

**5**のところ

これは<font color="red">**iは5まであるよ**</font>と訴えています。

## **シグマの右を治療**

**i**のところ

これは<font color="red">**iを全部足してね**</font>と訴えています。

## **全体的な治療**

iは1から5まであり、そのiを全て足せと言われているので
このようにしてあげればよいのです。

```math
1 + 2 + 3 + 4 + 5
```

アレルギーの症状は治まりましたか？

# <font color="009F8C">**先生、シグマの右側が少し変なんです**</font>

```math
\sum_{i=1}^5i+1
```

先生「んー、これはシグマの右側が**i+1**になってますねぇ」

iが1から5までというのは変わらないですが
**i+1**を全部足しなさいと訴えています。

こちらが症状をまとめたカルテになります。

|i  |i+1(右側)|備考|
|---|---|---|
|1  |1+1|iは最初は1|
|2  |2+1||
|3  |3+1||
|4  |4+1||
|5  |5+1|iは5が最後|

シグマを使わないとこうなる。

```math
(1+1) + (2+1) + (3+1) + (4+1) + (5+1)
```

どうですか？楽になりましたか？


# <font color="009F8C">**プログラマー向けの治療**</font>

シグマはfor文だ

```math
\sum_{i=1}^5i+1
```

これは、こういうfor文

```javascript
var sum = 0;

for(var i = 1; i <= 5; i++){
  sum += (i + 1);
}
```
# <font color="009F8C">**おわり**</font>
はい、初診終わりです。
お大事になさってください。
cesiumで衛星確認

#概要
　まずは、TLEから衛星の航跡を見てみましょう

#方法
　まあ、今回は単純にczmlをtleから作って表示するだけです。
##TLE
　TLE(Two Line Element)ってのは
<pre>
ISS (ZARYA)             
1 25544U 98067A   18046.55817189  .00001353  00000-0  27714-4 0  9990
2 25544  51.6417 265.0608 0003589 103.0964 344.3049 15.54096060 99608
</pre>
 こんな感じで、最初の行がISSつまり国際宇宙ステーションですね。
次の２行が衛星の軌道を表現している公開情報なわけです。

　これを、tle2czmlというpythonライブラリを持ってきて、ceciumで表示すれば
おしまいなわけです。
　tle2czmlはpip tle2czmlでインストールできます。
　[gitはここ](https://github.com/kujosHeist/tle2czml)

##ちょっとトラブル
　[ここ](http://irishspacehacker.blogspot.jp/2018/02/tle2czml-released-on-pypi.html)にほとんどかいてあるんだけど、
<pre>
AGGIESAT 4              
1 41313U 98067HP  18046.57341670  .00209614  31071-4  29378-3 0  9994
2 41313  51.6292 173.0661 0005230 335.8780  24.1986 16.05344224117524
</pre>
って３行は抜いて計算した方がいい。
なんだかエラーがでて、表示されなかった。

#成功！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/60225/4d75ecfc-5278-dd47-e6ab-19063e09c683.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/60225/2a41ea7e-7bbf-42a3-5384-6051f0b4b82d.png)

#今後
cesiumにUIを作って、TLEを選択できるようにしようかなあ・・と思っている。
まあ、webにはあるんだけどね
anyenv update

## アップデート前

```:
% pyenv install --list | egrep ' 3\.6'        
  3.6.0
  3.6-dev
% rbenv install --list | egrep ' 2\.5'  
  2.5.0-dev
% phpenv install --list | egrep ' 7\.2'  
% 
% scalaenv install --list | egrep '\-2\.12'
scala-2.12.0
scala-2.12.0-M1
scala-2.12.0-M2
scala-2.12.0-M3
scala-2.12.0-M4
scala-2.12.0-M5
scala-2.12.0-RC1
scala-2.12.0-RC2
% goenv install --list | egrep '1\.10'   
% 
```

## プラグインのインストール & アップデート

```:
% mkdir ~/.anyenv/plugins                     
% git clone https://github.com/znz/anyenv-update.git ~/.anyenv/plugins/anyenv-update
% anyenv update
```

## アップデート後

```:
% pyenv install --list | egrep ' 3\.6'        
  3.6.0
  3.6-dev
  3.6.1
  3.6.2
  3.6.3
  3.6.4
  3.6.5
% rbenv install --list | egrep ' 2\.5'  
  2.5.0-dev
  2.5.0-preview1
  2.5.0-rc1
  2.5.0
  2.5.1
% phpenv install --list | egrep ' 7\.2'  
  7.2.0
  7.2.1
  7.2.2
  7.2.3
  7.2.4
  7.2.5
  7.2snapshot
% scalaenv install --list | egrep '\-2\.12'
  scala-2.12.0-M1
  scala-2.12.0-M2
  scala-2.12.0-M3
  scala-2.12.0-M4
  scala-2.12.0-M5
  scala-2.12.0-RC1
  scala-2.12.0-RC2
  scala-2.12.0
  scala-2.12.1
  scala-2.12.2
  scala-2.12.3
  scala-2.12.4
  scala-2.12.5
% goenv install --list | egrep '1\.10'   
1.10.1
1.10
```
micro:bit で2桁の数字をスクロール無しで表示する WhaleySansFont

#解決する課題

micro:bitの5x5のLEDで2桁の数字を表示しようとするとスクロールしてしまい、

- スクロールが終わるまで次の数値が表示出来ないため、リアルタイムに数字が変わる場合に追従出来ない
- スクロールは見落とすとアウト

という問題があります。
WhaleySansFontを使えば一度に2桁の数字がスクロール無しで表示が出来ます。

#使い方

パッケージの追加で

https://github.com/microbit-makecode-packages/WhaleySansFont

を貼り付けてWhalySansFontをクリックします。
![font.jpg](https://qiita-image-store.s3.amazonaws.com/0/44523/1ae044c2-dc71-068d-d64e-538888aa7216.jpeg)

あとは、whaleysans number ブロックに2桁の数字を渡せば表示してれます。

![waleysans.jpg](https://qiita-image-store.s3.amazonaws.com/0/44523/0eff6b60-abcd-1004-6a70-fb6dc620cb86.jpeg)


リアルタイムにセンサーの値を表示したい時はとっても便利です。