OmniAICreator/Qiita-1.07M huggingface dataset:
SeachView の使い方 - kotlin

# 概要
テキストを入力すると検索結果がリアルタイムに変わる UI。
RecyclerView と一緒に使う。

[RecyclerView の使い方 - kotlin](https://qiita.com/aki_design_1988/items/42efa57aa4d83d3aa850)

# seach.xml
ヘッダーに使う menu を作る。

```xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto">
<item
        android:id="@+id/menu_search"
        android:title="search"
        android:icon="@drawable/ic_search_24dp"
        app:showAsAction="always|collapseActionView"
        app:actionViewClass="androidx.appcompat.widget.SearchView"/>
</menu>
```

# MainActivity.kt

- 先ほどの menu を紐づける
- 検索バーの処理を書く

```kotlin

import androidx.appcompat.widget.SearchView

class MainActivity : AppCompatActivity() {
    var items:MutableList<String> = ArrayList()
    var seach_list:MutableList<String> = ArrayList()
    fun loadData(){
        items.add("item1")
        items.add("item2")
        items.add("item3")
        items.add("item4")
        seach_list.addAll(items)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // RecyclerView のコードを書く
        
        loadData()
    }

    // メニューを紐付け
    override fun onCreateOptionsMenu(menu: Menu):Boolean{
        menuInflater.inflate(R.menu.search,menu)

        // 検索 UI のコード
        val seachItem = menu.findItem(R.id.menu_search)
        val searchView = seachItem.actionView as SearchView
        searchView.setOnQueryTextListener(object :SearchView.OnQueryTextListener{
            override fun onQueryTextSubmit(query: String?): Boolean {
                return true
            }

            override fun onQueryTextChange(newText: String?): Boolean {
                if (newText!!.isNotEmpty()){
                    seach_list.clear()
                    val searchText = newText.toLowerCase()
                    items.forEach {
                        if (it.toLowerCase().contains(searchText))
                            seach_list.add(it)
                    }
                    item_list.adapter!!.notifyDataSetChanged()
                }else{
                    seach_list.clear()
                    seach_list.addAll(items)
                    item_list.adapter!!.notifyDataSetChanged()
                }
                return true
            }
        })
        return super.onCreateOptionsMenu(menu)
    }
}

```

# 参考
https://www.youtube.com/watch?v=vqh6TPLQ5-Q
Leetcode #73: Set Matrix Zeroes

Time Complexity: O(m * n)
Space Complexity: O(1)

```swift
func setZeroes(_ matrix: inout [[Int]]) {
    let row = matrix.count
    let column = matrix.first!.count
    if column == 0 {
        return
    }
    var rowFlag = false
    var columnFlag = false
    for i in 0..<column {
        if matrix[0][i] == 0 {
            rowFlag = true
            break
        }
    }
    for j in 0..<row {
        if matrix[j][0] == 0 {
            columnFlag = true
            break
        }
    }
    for i in 1..<row {
        for j in 1..<column {
            if matrix[i][j] == 0 {
                matrix[i][0] = 0
                matrix[0][j] = 0
            }
        }
    }
    for i in 1..<row {
        for j in 1..<column {
            if matrix[i][0] == 0 || matrix[0][j] == 0 {
                matrix[i][j] = 0
            }
        }
    }
    if rowFlag {
        for i in 0..<column {
            matrix[0][i] = 0
        }
    }
    if columnFlag {
        for j in 0..<row {
            matrix[j][0] = 0
        }
    }
}
```
Clean Architectureの３つの図を、一枚にまとめてみる

## 3つの図の対応がわかりにくい？
Clean Architectureを理解する上で、以下の３つの図が登場します。

1. ４つの同心円(書籍版の**図22-1**)
2. Flow of control(４つの同心円の**右下の図**)
3. 典型的なシナリオ図（書籍版の**図22-2**）

![clean.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189790/fb90b4b5-cd31-4ec0-fa61-4b90b0e0cc2c.jpeg)
![senario.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189790/6b6969d3-1d27-61f0-963f-289f46c9e53c.jpeg)

実際のコードに落とし込もうとしたとき、２や３の図がとても有用なのですが、個人的にそれらの要素とレイヤーの対応がわかりにくかったので、一枚の図に無理やりまとめてみました。

## ３つの図を一枚にまとめた図
おそらく、以下のようになるのではないかと思います。

![todo-mvp-clean-nrslib.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189790/646b7946-5281-f6af-06a8-484362dc2438.png)


##　補足、注意点など
- 同心円が巨大になりすぎるので、四方をトリミングしています。
- Flow of controlの矢印の向きは、ControllerとPresenterの位置がシナリオ図ベースなので、逆になっていることに注意してください。
- DS[^1]については、本図では２レイヤーにまたがる存在と捉え、色を塗っていません。
- DataAccess関連が、インターフェースアダプターのレイヤーに登場しないのが不思議です。もしかすると、なにか読み違いがあるかもしれません。

## 参考記事
[実装クリーンアーキテクチャ \- Qiita](https://qiita.com/nrslib/items/a5f902c4defc83bd46b8)
C#の実際のコードが例示されていて、具体的な実装を理解する上でとても役立ちました。

[^1]: Data Structureの略らしいです。
Rubyをはじめる

## はじめに
Rubyの勉強をしてみようとおもい、自分の勉強と合わせてまとめてみました。
公式の　[20分ではじめるRuby](https://www.ruby-lang.org/ja/documentation/quickstart/)　に沿っいます。


## ターミナルを起動してirbを立ち上げる
Rubyの処理系には、入力したRubyの文を実行して結果を出力するプログラムが付属しています。 
このように対話的にプログラムを実行するプログラムのことをインタプリタと言います。RubyにはIRB(IRBはInteractive Rubyの略です)が付属しているので、それを使用して実行していきます。

```
$ irb
irb(main):001:0> 
```

## Hello Worldを実行する
```
irb(main):001:0> "Hello World"
=> "Hello World"
```

## 計算をしてみる
```
irb(main):002:0> 5+3
=> 8
irb(main):003:0> 3*2
=> 6
irb(main):004:0> 3**2
=> 9
irb(main):005:0> Math.sqrt(9)
=> 3.0
```

## メソッドを利用する
何度も利用する処理はメソッドとして定義して、再利用できるようにします。

ここでは、`Hello World!` を出力するメソッド `say_hello` について
まず、メソッドを定義するには `def [メソッド名]`で定義を開始します。

```
irb(main):006:0> def say_hello
```

次に処理を記載していきます。ここでは　`Hello World!` を出力する処理を記載します。

```
irb(main):007:1> puts "Hello World!"
```

最後に、`end` でメソッドの定義を終了します。

```
irb(main):008:1> end
=> :hi
```

以上で、メソッドの定義が完了となります。

## メソッドの呼び出し
定義したメソッドを利用すには、以下のようにメソッド名を指定することで呼び出すことができます。

```
irb(main):009:0> hi
Hello World!
=> nil
irb(main):010:0> hi()
Hello World!
=> nil
```

## メソッドにパラメータを渡す
メソッドにパラメータを渡す場合には以下のように定義する。

```
irb(main):010:0> def hi(name = "World")
irb(main):011:1> puts "Hello #{name}!"
irb(main):012:1> end
=> :hi
```

nameがパラメータ名となります。
`name = "World"` は、メソッドの呼び出し時にパラメータを指定しなかった場合の、
デフォルト値として `"World"`が指定されています。
メソッド実行時にパラメータを指定されなければデフォルト値が使用されます。
次に処理部分で `puts "Hello #{name}!"` と定義されていますが、
`#{name}`は変数を文字列に埋め込む方法になります。
呼び出す時は、パラメータを指定して呼び出す。

```
irb(main):013:0> hi "chris"
Hello chris!
=> nil
irb(main):014:0> hi("chris")
Hello chris!
=> nil
irb(main):018:0> hi
Hello World!
=> nil
```

## クラスの定義
クラスを定義する時には、以下のように記載します。

```
irb(main):013:0> class Greeter
irb(main):014:1>  def initialize(name = "World")
irb(main):011:2>    @name = name
irb(main):012:2>  end
irb(main):013:1>  def say_hi
irb(main):014:2>    puts "Hi #{@name}!"
irb(main):015:2>  end
irb(main):016:1>  def say_bye
irb(main):017:2>    puts "Bye #{@name}, come back soon."
irb(main):018:2>  end
irb(main):019:1> end
=> :say_bye
```

定義したクラスからオブジェクトを作成し使用するには以下のようにします。

```
irb(main):030:0> greeter = Greeter.new("Pat")
=> #<Greeter:0x00007fd15d9029d8 @name="Pat">
irb(main):031:0> greeter.say_hi
Hi Pat!
=> nil
irb(main):032:0> greeter.say_bye
Bye Pat, come back soon.
=> nil

```

## ファイルに書いて実行してみる
クラス定義で書いたものをそのまま `sample.rb` ファイルへ保存します。

```ruby
#!/usr/bin/env ruby

class Greeter
  def initialize(name = "World")
    @name = name
  end
  def say_hi
    puts "Hi #{@name}!"
  end
  def say_bye
    puts "Bye #{@name}, come back soon."
  end
end

if __FILE__ == $0
  greeter = Greeter.new("Pat")
  greeter.say_hi
  greeter.say_bye
end
```

実行するときは以下のようにコマンドを実行します。

```
$ ruby sample.rb
Hi Pat!
Bye Pat, come back soon.
```
rbenvのインストール

## rbenvとは
Rubyのバージョン管理をするためのツールです。
開発環境や本番環境、開発メンバーの各環境でマニュアルでRubyをインストールして管理するのは手間になります。
rbenvを利用することで複数のバージョンのRubyを管理することができます。


## rbenvのインストール

ターミナルを起動し[Homebrew][homebrew]をインストール

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

rbenvをインストール

```
$ brew install rbenv
```

シェルにrbenvの初期設定をします。
rbenv インストール時に表示された `eval "$(rbenv init -)"`を `~/.zshrc`に追記します。
 ※ `~/.zshrc` は使用しているシェルによって変わるので読み替えてください。MacのターミナルのデフォルトのシェルはBashですが、Bashの場合は　`~/.bashrc`になります。

```
$ rbenv init
# Load rbenv automatically by appending
# the following to ~/.zshrc:

eval "$(rbenv init -)"
```

ターミナルウィンドウを閉じて新しいウィンドウを開くと、変更内容が有効になります。
rbenvが正しく設定されていることを確認します。

```
$ curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-doctor | bash
Checking for `rbenv' in PATH: /usr/local/bin/rbenv
Checking for rbenv shims in PATH: OK
Checking `rbenv install' support: /usr/local/bin/rbenv-install (ruby-build 20190423)
Counting installed Ruby versions: none
  There aren't any Ruby versions installed under `/Users/[username]/.rbenv/versions'.
  You can install Ruby versions like so: rbenv install 2.2.4
Checking RubyGems settings: OK
Auditing installed plugins: OK
```

## rbenvの使用方法
### インストールできるバージョン一覧を確認

```
$ rbenv install -l
  1.8.5-p52
  1.8.5-p113
  1.8.5-p114
  ・
  ・
  ・
```

### バージョンを指定してインストール

```
$ rbenv install 2.6.3
```
※ 2019/05/03時点での最新の安定板

### インストールしたバージョンを実行可能にする
新しいバージョンのRubyをインストールした後、またはコマンドを提供するgemをインストールした後にこのコマンドを実行してください。

```
$ rbenv rehash
```

rbenv-rehash をインストールしておくと、gemをアン/インストールした後に自動的に`rbenv rehash`を実行します。

```
$ gem install rbenv-rehash
```

### インストールされているバージョンの確認
```
$ rbenv versions                                           * system (set by /Users/[username]/.rbenv/version)
  2.6.3
```
`system` はデフォルトでインストールされているRubyになります。
`*` が付いているものが現在のバージョンです。

### 使用するバージョンをを変更
```
$ rbenv global 2.6.3
$ rbenv versions
  system
* 2.6.3 (set by /Users/[username]/.rbenv/version)
```

### カレントディレクトリのみバージョンを変更
```
$ rbenv local 2.6.3
```
カレントディレクトリの `.ruby-version` ファイル　にバージョン情報が保存されます。


[homebrew]: https://brew.sh/index_ja
無料で試せて月額固定ならHerokuがおすすめ（廃止）

:::note alert
2022/11/19 追記
残念ながらHerokuの無料プランは廃止されたようですので、こちらの記事の内容はすでに適用されません。
:::

# 無料で試せて月額固定ならHerokuがおすすめ

最近、Herokuを使って趣味のアプリ開発をしています。
Herokuは無料プランがあり、どれだけ利用できるのかやその制限について調べてみました。

私の場合、趣味レベルの話ですが、企業で製品開発されている方の参考にもなればいいなと思っています。

また、Node.jsで利用できるレンタルサーバーがなかなか無い為（VPSとかになってしまう）
実は、貴重なのではないかなと思っています。

主に利用するDynoは、GitまたはDockerで簡単に自動デプロイができますし、
別のクラウドに移行する際も、コードベースはそのまま使いやすいです。

Dynoとは、アプリケーションを動かすことができるコンテナプラットフォームで、いくつかタイプがあります。

- web dyno - Webアプリケーションを動かせるコンテナ
- worker dyno - web dynoなどが受けたリクエストを流したりして、処理を行ったりするコンテナ
- one-off dyno - バッチ処理など、1度きりの処理のためのコンテナ

趣味のブログなどであれば、web dynoのみで十分です。

では、プラン（2019年5月4日現在）を紹介させて頂きます。

## Freeプラン

### Dynoの場合

まずは、Dynoのフリープランです。

[Free Dyno Hours](https://devcenter.heroku.com/articles/free-dyno-hours)

#### 無料枠

クレジットカード登録なしで550時間/月、登録した場合は1000時間/月の分だけ無料で利用できます。
無料で利用できる時間は、１アカウントに対して割り当てされます。
その為、１アカウントで２個アプリケーションを運用する場合は、合算になることに注意してください。

#### 時間の消費とスリープモード

web dynoは、30分以上アクセスが無いとスリープ状態になります。
有難いことに、スリープ状態の間は、**無料枠は減りません**。
そのあとアクセスが来た場合にコンテナが立ち上がるので、多少時間がかかります。
常時起動したいのであれば、Webモニタリングサービスで、30分毎にリクエストを送ったりする方法がとれます。
[UptimeRobot](https://uptimerobot.com/)は、5分ごとであれば無料で利用できるようなので、オススメです。

worker dynoに関しては、常時立ち上がる仕様なので、月まるごと動かすと24*31=744時間の利用になります。
単体で利用する用途はないかもしれませんが、要注意です。

one-off dynoは、処理が流れている間のみとなります。

#### アプリの停止はできない模様

使っていないDynoを無課金のまま停止させる方法は、見つかりませんでした。
メンテナンスモードがありますが、それを利用した場合でもアクセスがあれば課金は発生してしまいます。
（メンテナンスページのホスティングは続いているイメージです。）
なのでアプリを増やす際は、気を付けましょう。

#### 無料枠を超えた場合

無料枠を超えると、アプリは停止し、利用できなくなります。
なので、クレジットカードを登録しても、勝手に課金はされないので安心してください。
また80%と100%で、メールによる通知が来るので、それに応じてプランの変更を検討しましょう。

### 無料で始められる製品

無料のプランが用意されている製品を一部リストアップしました。

- [Postgres](https://elements.heroku.com/addons/heroku-postgresql)
- [Redis](https://elements.heroku.com/addons/heroku-redis)
- [Kafka](https://elements.heroku.com/addons/cloudkarafka)

これらは、すべて[Add-on](https://elements.heroku.com/addons)という形で提供されていて、簡単に追加することができます。
基本的に、環境変数にURL等がセットされるようなので、
ローカルはDockerコンテナを利用し、開発・ステージング・本番とDynoを分けることで、
いちいち環境ごとに設定を分ける必要が無くて楽です。

## その他のプランの場合

無料プラン以外についても少し説明します。

### 課金計算

基本的に、月額固定の**秒割り**になります。
そして、稼働時間の定義は、CPUが使われている時間ではなく、Dyno等のリソースが立ち上がっている時間になります。
例えば6月10日にアプリを削除した場合、月額料金の3分の1が費用になります。
（秒割りなので、もう少し細かいかとは思いますが）

**基本的に**というのは、[Heroku Enterprise](https://jp.heroku.com/enterprise)には適用されないという点です。
プライベートクラウドなどの利用については、別の料金体系となります。

詳しい情報は、[こちら](https://devcenter.heroku.com/articles/usage-and-billing)にあります。

### スケールについて

Standard以上であれば、スケールアウトが可能になります。
ただ、Standard以下はマルチテナントの為、スケールアップはProfessional以上になります。

## 最後に

無料で始められるのは、社内で始める分にも強味が大きいですよね。
またHerokuの場合、面倒なインフラやアプリのデプロイは、オートメーション化されているため、開発に注力しやすいです。
公共サービスや金融でも使われているSalesForceによって運用されていることも大きな強みです。
東京リージョンも用意されています。

また、さくらのレンタルサーバーから、Herokuに切り替えた方がいるようなので、その記事を紹介させて頂きます。
[AnosideをさくらのVPSからHerokuに移した話](https://qiita.com/shimbaco/items/0db36919f3aaae27a88d)

Herokuの回し者みたいになってしまいました（笑）が、非常におすすめです。
ぜひ、これを機に利用を検討してみてはいかがでしょうか。
コミットメッセージにつけたいprefix絵文字を選択して簡単にcommitできるシェルスクリプトを書いた

## 背景
コミットメッセージにprefix絵文字がついていると、PR見るときにちょっと楽しくなります。
だけど、つけようと思っても忘れがちだし、どの絵文字使おうか〜うん〜っていう時間こそ無駄だったので、「prefixにしたい絵文字が選んでcommitできる」コマンドを作りました😄
ちなみにaddからcommitまで一貫してこのコマンド一つで完結します。

repositoryはこちら👉[github-convs](https://github.com/natsumisawa/github-convs)

## どんなコマンドか
今回作成したコマンド [git-add-cmt](https://github.com/natsumisawa/github-convs/blob/0c15f517f59a1179207396f0029604e119db65a9/github.zsh#L52) をターミナルで入力すると以下のようなことができます。

![rvkj9-egbmb.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137322/06340798-931f-53fc-6609-ea0a2d51dd5b.gif)

1. addしたいファイルを選択
2. prefixとしてつけたいemojiを選択
3. commitメッセージを入力

これで無事commitされました🎉
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137322/6d53bdc7-9eb6-e55c-e8f5-9730a455452d.png)

## コード紹介
コード紹介といっても、たったこれだけ🎉

※ ターミナル上で「選択させる」ために[fzf](https://github.com/junegunn/fzf) を使っています

```github-convs.zsh
git-add-cmt(){
  LF=$'\\\x0A' #改行
  git diff --color-words
  FILES=$(git status --short | sed '1s/^/ALL .'"$LF"'/' | fzf -m --prompt="SELECT_ADD_FILES (multi:tab) > " | tr '\n' ' ')
  EMOJI=$(echo $EMOJI_LIST | fzf -m --prompt="SELECT_PREFIX_EMOJI> " | cut -d ' ' -f 1)
  echo "\U1F4DD write commit message (quit ctr+C) >"
  read MSG
  git add $(echo $FILES | awk '{print $2}') && \
    echo $FILES && \
    echo "::::::::::::::::  add\U1F374  ::::::::::::::::" && \
    git commit -m $EMOJI$MSG && \
    echo ":::::::::::::::: commit\U1F35D ::::::::::::::::"
}
```
git statusから抽出した変更ファイルをfzfに食わせて、ユーザーに選択させるようにします。（fzf便利！）
emojiも同様に食わせて、cutコマンドでコミットメッセージにくっつけるときに必要な箇所のみ切り取っています。

emojiのテンプレートは [こちら](https://gist.github.com/mfks17/a2332594d4a7646e6bfa12fd66e33a6f) を参考にさせていただきました。

```
EMOJI_LIST="
🐛 バグ修正 
👍 機能改善
✨ 部分的な機能追加
🎉 盛大に祝うべき大きな機能追加
♻️ リファクタリング
🚿 不要な機能・使われなくなった機能の削除
💚 テストやCIの修正・改善
👕 Lintエラーの修正やコードスタイルの修正
🚀 パフォーマンス改善
🆙 依存パッケージなどのアップデート
🔒 新機能の公開範囲の制限
👮 セキュリティ関連の改善"
```

そしてそれらをaddしてcommit、といった要領です。

面倒なgitコマンド操作を自動でやってくれるし、emojiも簡単につけれちゃうよ💝というコマンドでした。
ちなみに他にもcheckoutとかPR一発で開けるのとか[たくさんのコマンド](https://github.com/natsumisawa/github-convs])作ってます😊
【Laravel初心者メモ】Laravelとは

プログラミング初心者です。
現在、Laravelにて簡単なアプリを作成練習中。
簡単にメモとして記録します。

##【Laravelとは】
PHPで書かれたWEBアプリケーションフレームワーク。「Model」、「View」、「Controller」の３つに分割されて実装するMVCフレームワークになります。


##フレームワークとは
「枠組み」という意味となり、開発の土台となるもの。
大人数で開発を行う際、ある程度基礎土台の上に乗せて実装していくことでコードや実装方法のムラを失くす。


##MVCの３要素
＊MODEL
データの処理全般を担当。データベースアクセスに関する処理全般。

＊VIEW
画面表示を担当。主にHTMLで書く。

＊CONTROLLER
MODELとVIEWを仲介する役目。
サーブレットの動き

## 参考文献

この記事は以下の情報を参考にして執筆しました。
- [基礎からのサーブレット／JSP 新版
](https://www.sbcr.jp/products/4797389456.html)

# サーブレットの動き

サーブレットの起動時には、アプリケーションサーバがサーブレットのクラスファイルを読み込み、サーブレットのインスタンスをメモリ上に作成して、サーブレットを実行する。
一度サーブレットを起動したら、起動済みのサーブレットを再利用する。

**ポイント**
**・各ユーザに対してインスタンスを生成するのではなく、1つのインスタンスを再利用する。**
**・各ユーザのリクエストを、マルチスレッドを使って並行処理する。**

つまり
変数などの資源を、複数のスレッドが同時に操作する可能性がある。

以下、変数毎のメモリ管理イメージ

|変数|ヒープ領域|スレッド間で共有|
|:-----------------|:------------------|:------------------|
|クラス変数|インスタンス|◯ される|
|インスタンス変数|インスタンス|◯ される|
|ローカル変数|JAVAスタック(スレッド固有領域)|× されない|


★覚えておくこと
**インスタンス変数やクラス変数を操作する場合には、同時操作の問題を考慮する必要がある。**
Windows で nfcpy のセットアップ

# セットアップ

## ドライバ のインストール

参考: https://nfcpy.readthedocs.io/en/latest/topics/get-started.html

1. [Zadig](https://zadig.akeo.ie/)をダウンロードして実行します
2. Option > List All Devices にチェックを入れます
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100313/7aa18a38-a0e0-a4b1-7f2e-3ba221b25eac.png)

3. ドロップダウンから USB 接続している NFC リーダーを選択します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100313/9651f9e1-dc21-01d0-0d8c-60f9579ea7a2.png)

4. WinUSB を選択して、 Install Driver をクリックしてインストールを実行します

## libusb のインストール

1. [libusb](https://libusb.info/)をダウンロードします
2. ダウンロードしたアーカイブを解凍します。7z 形式なので展開できるソフトが無ければ [7zip](https://www.7-zip.org/) を使うと良いでしょう
3. 64bit 環境の場合、
    `MS64\dll\libusb-1.0.dll` を `C:\Windows\System32` に
    `MS32\dll\libusb-1.0.dll` を `C:\Windows\SysWOW64` に
    移動します


## python のインストール

scoop 等の選択肢もありますが、個人的には Windows の Python 環境はトラブルに遭いがちなので、
公式インストーラを使う方法をおすすめします。
nfcpy は現時点(2019年5月)で残念ながら python2 系にしか対応しておらず python3 系では使用できません。
[Python 2.7のインストール](https://www.python.jp/install/windows/install_py2.7.html) に従い python 2.7 をインストールします。
pip は `py -2 -m pip install hoge` というように使います。

環境によっては `LookupError: unknown encoding: cp65001` というようなエラーが表示される場合があります。
これはコンソールを utf-8 に設定している場合に発生します。
このときは `PYTHONIOENCODING` という環境変数 に `utf-8` を設定します。

```powershell
> [System.Environment]::SetEnvironmentVariable("PYTHONIOENCODING", "utf-8", [System.EnvironmentVariableTarget]::User)
```

## nfcpy のインストール

`pip` 経由でインストールします

```python
> py -2 -m pip install -U nfcpy
```

# 実行

[nfcpy](https://github.com/nfcpy/nfcpy) のリポジトリをクローンします

```shell
> git clone https://github.com/nfcpy/nfcpy.git
```

クローンしたリポジトリ直下の examples の `tagtool.py` を実行します

```py
> py -2 .\examples\tagtool.py
```

`waiting for a tag` と表示され読み取り待ちになるのでSuicaか何かしら読み取らせてみます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100313/937b1485-82a7-7d2f-f630-9c22d1e4c9ee.png)

そうしてカードあるいはタグの情報が表示されていれば完璧です。
Leetcode #71: Simplify Path

```swift
func simplifyPath(_ path: String) -> String {
    var components = path.split(separator: "/").filter { $0.count != 0 }.map { Array($0) }
    var stack = [Character]()
    for component in components {
        if component == ["."] {
            continue
        } else if component == [".", "."] {
            while !stack.isEmpty {
                stack.removeLast()
                if let top = stack.last, top == "/" {
                    break
                }
            }
        } else {
            stack.append(contentsOf: component)
            stack.append("/")
        }
    }
    if let top = stack.last, top == "/" {
        stack.removeLast()
    }
    return "/" + String(stack)
}
```
Range variants (rANS) and streamingの紹介

この記事は、<a href="http://creativecommons.org/licenses/by-sa/3.0/">クリエイティブ・コモンズ・表示・継承ライセンス3.0</a>のもとで公表されたウィキペディアの項目<a href="https://en.wikipedia.org/wiki/Asymmetric_numeral_systems">「Asymmetric_numeral_systems」</a>を素材として二次利用しています。

https://en.wikipedia.org/wiki/Asymmetric_numeral_systems

- [前回] introduction
- [前回] Entropy coding
- [前回] Basic concepts of ANS
- [前回] Uniform binary variant(uABS)
- Range variants(rANS) and streaming
- [次回] Tabled variant(tANS)
- [次回] Remark

# Range variants (rANS) and streaming

Range variantも計算式を用いる、しかし、大きなalphabetに対しる処理を許容している。直感的に自然数の集合を $2^{n}$ rangeに分割し、与えられた想定された確率分布の割合に対する部分範囲に、それぞれを割り当てる。

We start with quantization of probability distribution to $2^{n}$ denominator, where $n$ is chosen (usually 8-12 bits): $ p_{s}\approx f[s]/2^{n} $ for some natural $ f[s] $ numbers (sizes of subranges).

$2^{n}$ での分母となる、確率分布の量子化から始める。ここで、$n$は、（多くの場合は8-12bit)。  $ f[s] $に対して、$ p_{s}\approx f[s]/2^{n} $ が選択される（部分集合のサイズ）。

- mask = 2^{n}-1
- 累積分布関数: $ { CDF[s]=\sum _{i<s}f[i]=f[0]+\cdots +f[s-1].}\ For\ y\in [0,2^{n}-1] $ 

- function (usually tabled) : $$ symbol(y) = s such that CDF[s] <= y < CDF[s+1] .$$

ここで、符号関数は、

```math
C(x,s) = (floor(x / f[s]) << n) + (x % f[s]) + CDF[s] 
```

復号関数は、

```math
$s = symbol(x ＆ mask) \\
D(x) = (f[s] * (x >> n) + (x ＆ mask ) - CDF[s], s)
```

この方法では、symbolsのシーケンスを、大きな自然数 $x$に符号化することができる。巨大な整数での演算を用いることを回避するために、stream variantsが用いられる。renomalizationしたことで、$ x\in [L,b\cdot L-1] $ となった場合に、$x$の最終に位置するbitsをbitstream から/へ、送信する（通常、$L$と$b$は2のべき乗である）。

rANS variantでは、$x$は令として32bitを用いている。16bit recomalizationするためには、 $x\in [2^{16},2^{32}-1]$ decoderは必要に応じてbitstreamから最終の重要なbitでredfillする。

$$ if(x < (1 << 16)) x = (x << 16) + read16bits() $$
今年の言語はRust その５１

# 今年の言語はRust その５１

Rustを学びます

Rustの日本語ドキュメント 2nd Edition
https://doc.rust-jp.rs/book/second-edition/

オリジナル(英語)
https://doc.rust-lang.org/book/


## 実行環境

```sh
$ cargo -V
cargo 1.33.0 (f099fe94b 2019-02-12)

$ rustup -V
rustup 1.17.0 (069c88ed6 2019-03-05)

$ rustc --version
rustc 1.33.0 (2aa4c46cf 2019-02-28)

$  cat /proc/version
Linux version 4.14.97-74.72.amzn1.x86_64 (mockbuild@gobi-build-64002) 
(gcc version 7.2.1 20170915 (Red Hat 7.2.1-2) (GCC)) 
#1 SMP Tue Feb 5 20:59:30 UTC 2019

$ uname -a
Linux ip-10-100-0-8 4.14.97-74.72.amzn1.x86_64 
#1 SMP Tue Feb 5 20:59:30 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/\*release
NAME="Amazon Linux AMI"
VERSION="2018.03"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2018.03"
PRETTY_NAME="Amazon Linux AMI 2018.03"
ANSI_COLOR="0;33"
CPE_NAME="cpe:/o:amazon:linux:2018.03:ga"
HOME_URL="http://aws.amazon.com/amazon-linux-ami/"
Amazon Linux AMI release 2018.03

```

## 18. パターンは値の構造に合致する

### 18.1 パターンが使用されることのある個所全部

#### matchアーム

```rust
match VALUE {
  PATTERN => EXPRESSION,
  PATTERN => EXPRESSION,
  PATTERN => EXPRESSION,
}
```

#### 条件分岐 __if let__ 式

第六章の復習をします。リスト6-6, 6-7では、__if let__ を使用して同じ実装を実現しています。

**some_u8_value**が**Some(3)**と同値である場合の

```rust

fn main() {

  let some_u8_value = Some(0u8);

  match some_u8_value {
    Some(3) => println!("three"),
    _ => (),
  }
}


fn main() {}

  if let Some(3) = some_u8_value {
    println!("three");
  }

}

```

#### 条件分岐 __if let__ 式

```rust
fn main() {

  let favorite_color: Option<&str> = None;
  let is_tuesday = false;
  let age: Result<u8, _> = "34".parse();

  if let Some(color) = favorite_color {

    println!("Using your favorite color, {:?}, as the background", color);

  } else if is_tuesday {

    println!("Tuesday is green day!");

  } else if let Ok(age) = age {

    if age > 30 {
      println!("Using purple as the background color");
    } else {
      println!("Using orange as the background color");
    }
    
  } else {
    println!("Using blue as the background color");
  }
}

```

追記

```rust
let a_value = Option::Some(3);

if let Some(x) = a_value {
	println!("{:?}", x);
}

```


#### **while let**条件分岐ループ

```rust
fn main() {

  let mut stack = Vec::new();

  stack.push(1);
  stack.push(2);
  stack.push(3);

  while let Some(top) = stack.pop() {
    println!("{:?}", top);
  }
}
```

> whileループはpopがSomeを返す限り、ブロックのコードを実行し続けます。

__top__ がなにかはわかりませんでした。

#### **for**ループ

```rust
fn main() {

  let v = vec!['a', 'b', 'c'];

  for (index, value) in v.iter().enumerate() {
    println!("{:?} is at index {}", value, index);
  }

}
```


#### **let**文

```rust

fn main() {

  let x = 5;

  let (x, y, z) = (1, 2, 3);

}
```

#### 関数の引数

関数の引数もパターンにできる.

```rust
fn print_coordinates(&(x, y): &(i32, i32)) {
  println!("{:?}, {:?}", x, y);
}

fn main() {
  let point = (3, 5);
  print_coordinates(&point);

}
```


イエス！
Vue.js(イベント修飾子・バインディング)(Laravel使用)

##◆イベント修飾子
単純なクリックイベントなどを少し変更できる。
[イベント修飾子一覧](https://qiita.com/Yorinton/items/f7eb54f05609750da7f5)

```
<body>
    <div id="sample">
        <div @click.right="right">右クリック</div>
        <div @click.left="left">左クリック</div>
    </div>
</body>
<script src=" {{ asset('js/app.js') }} "></script>
<script>
    const sample = new Vue({
        el: '#sample',
        methods:{
            right: function () {
                alert('右クリックしました。');
            },
            left: function () {
                alert('左クリックしました。')
            }
        }
    });
</script>
```

このように、左クリックと右クリックを別で検知できたりします。
イベント修飾子でよくつかう.stopと.preventについて[参考記事](https://techblog.scouter.co.jp/entry/2019/02/08/122914)をもとに学習しようと思います。

###.stop
.stopをつけると、JavaScriptのstopPropagationを呼び出して、親要素への伝搬をとめてくれます。

```
<body>
    <div id="sample">
        <div @click="parent">
            <button @click="child">クリック(stopなし)</button>
        </div>
        <div @click="parent">
            <button @click.stop="child">クリック(stopあり)</button>
        </div>
    </div>
</body>
<script src=" {{ asset('js/app.js') }} "></script>
<script>
    const sample = new Vue({
        el: '#sample',
        methods:{
            parent:function () {
                alert('親要素をクリックしました。')
            },
            child: function () {
                alert('子要素をクリックしました。')
            }
        }
    });
</script>
```

stopなしの場合、childメソッドの後にparentメソッドが呼ばれます。
stopありの場合、childメソッドのみ呼ばれます。

###.prevent
.preventをつけると、JavaScriptのEvent.preventDefaultを呼び出して、意図しない画面遷移を防いでくれます。

```
<body>
    <div id="sample">
        <form @submit.prevent="submitPrevent">
            <input type="text" v-model="keepText">
            <button type="submit">submitPrevent</button>
        </form>

        <form  @submit="submit">
            <input type="text" v-model="text">
            <button type="submit">submit</button>
        </form>
    </div>
</body>
<script src=" {{ asset('js/app.js') }} "></script>
<script>
    const sample = new Vue({
        el: '#sample',
        data: {
            keepText: '',
            text: ''
        },
        methods:{
            submitPrevent() {
                alert(this.keepText);
            },
            submit() {
                alert(this.text);
            }
        }
    });
</script>
```

.preventなしのほうは送信されてしまって入力値がなくなるが、.preventがあるほうは送信されずに値は残る。

##◆複数要素のバインディング

```
<body>
    <div id="sample">
        <label><input type="checkbox" v-model="val" value="1">1</label>
        <label><input type="checkbox" v-model="val" value="2">2</label>
        <label><input type="checkbox" v-model="val" value="3">3</label>
        @{{ val }}
    </div>
</body>
<script src=" {{ asset('js/app.js') }} "></script>
<script>
    const sample = new Vue({
        el: '#sample',
        data: {
            val: []
        }
    });
</script>
```

入力値の同期にはv-modelを使用します。今回の場合ですと、セレクトボックスが複数ですので、valの初期値を空配列にしております。[参考記事](https://cr-vue.mio3io.com/guide/chapter3.html#%E3%82%BB%E3%83%AC%E3%82%AF%E3%83%88%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9)

##マウント要素外のイベント
windowやbodyはマウント要素外のため、addEventListenerを使って指定する必要がある。

```
window.addEventListener('動作', vueアプリ内メソッド)
```
プログラミング学習記録77〜タイピングゲーム〜

##今日やったこと
- ドットインストール「JavaScriptでタイピングゲームを作ろう」の動画に沿ってタイピングゲームを作ってみる

＃１１あたりからちょっとわからなくなってしまったのですが、なんとかタイピングゲームを完成させました。

タイマーを設置したり、正解の文字が入力されると次の文字に進めるようにするのもJavaScriptだけで実装できるのはすごいなと思いました。
index.htmlには、pタグ2つしか記述していないので、ほとんどがJavaScriptです。

とは言っても、そこまで長い記述ではありません。

今回は講義の最後の方があまり理解できませんでしたが、おそらく「基礎文法編」や「オブジェクト編」を進めていけば理解できると思うので、明日やってみたいと思います。

実際にゲームを2つ作ってみて、JavaScriptは環境構築せずにブラウザで動かせていいな〜と改めて思いました。

ということで、明日も頑張ります。
<br>
おわり
Rubyのnil?とempty?とblank?の違いとpresent?

nil?はnilだけtrue、empty?よりblank?の方が幅広く使える、present?はblank?の否定

Rubyのメソッドでnil?とempty?とblank?の違いが分からなかったのでまとめました

テストコードのバリデーションで、「リクエストパラメータが空白とかnilとかの場合に、このバリデーションをかけたい！」という判定にはblank?メソッドを使うといいと思います！

# nil?メソッド

nil?はnilの時だけtrue

```ruby

nil.nil?
=> true

[].nil?
=> false

{}.nil?
=> false

"".nil?
=> false

false.nil?
=> false
```

# empty?メソッド

empty?は入れ物はあるが中身がない時true

```ruby

nil.empty?
=> NoMethodError: undefined method 'empty?' for nil:NilClass

[].empty?
=> true

{}.empty?
=> true

"".empty?
=> true

"       ".empty?
=> false

false.empty?
NoMethodError: undefined method `empty?' for false:FalseClass
```

# blank?メソッド

blank?はempty?より範囲が広い

Railsでは使えるけど、rubyだけでは使えない

```ruby

nil.blank?
=> true

[].blank?

=> true

{}.blank?
=> true

"".blank?
=> true

"       ".blank?
=> true

false.blank?
=> true
```

present?はblank?の否定

参考
http://railsdoc.com/references/blank

# おわりに
最後まで読んでいただきありがとうございました。
QiitaやTwitterなどにコメントをしてもらったり、SNSでシェアしてもらえるとうれしいです！
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Rubyのメソッドでnil?とempty?とblank?の違いが分からなかったのでまとめました！<br><br>リクエストパラメータが空白とかnilとかの場合に、このバリデーションをかけたいという判定にはblank?メソッドを使うといいと思います！<br><br>Rubyのnil?とempty?とblank?の違いとpresent? <a href="https://t.co/ejM7gca0KF">https://t.co/ejM7gca0KF</a> <a href="https://twitter.com/hashtag/Qiita?src=hash&amp;ref_src=twsrc%5Etfw">#Qiita</a></p>&mdash; ITのんびり@V字回復エンジニア (@it31415) <a href="https://twitter.com/it31415/status/1124634855348682752?ref_src=twsrc%5Etfw">2019年5月4日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
35歳＋営業職＋プログラミング経験なしがプログラミングをはじめた理由

***この投稿は、プログラミングに携わる仕事をしている人、過去にプログラミングをはじめて挫折した人、これからプログラミングをはじめたいと思っている人など、プログラミングに興味をもっているすべての人に読んでほしい。***

# 結論（プログラミングををはじめた理由）
① プログラミング教育が義務化になるから
② 45歳以上がリストラ対象になるから
③ AIに関する人材・技術力が求められているから
④ プログラミングで業務を効率化できるから

## 背景
プログラミングを始めるきっかけは人それぞれかもしれない。プログラミングは興味をもってはじめる人は多いが、途中で挫折してしまう人も多い。

***プログラミングを挫折してしまった、プログラミングに興味をもっているのにはじめられていない人がいるならばもったいない。***

私はプログラミングをはじめて一ヶ月くらいだが、プログラミングのすばらしさ、おもしろさ、可能性を感じている。

結論のところに書かれているとおり、今後プログラミングの重要性、必要性が求められていることがよくわかると思う。私がプログラミングをはじめた理由を共有することで、プログラミングを挫折してしまった人は、またプログラミングをはじめるきっかけにしてほしい、プログラミングに興味をもっている人はすぐにプログラミングをはじめてほしい、と思い投稿することにした。

## 理由
① プログラミング教育が義務化になるから
私には子供がいる。***2020年からプログラミング教育が小学校で必修化される。***子供からプログラミングのことについて質問されたり、一緒に勉強をする際に自分がプログラミングについて理解していないと子供とコミュニケーションがとれない不安を感じた。
ただ、文科省の「小学校プログラミング教育に関する概要資料」を見るとプログラミング言語を覚えたり、プログラミングの技能を習得することが目標ではないことが記載されている。いずれにしても私自身がプログラミングに触れていることが重要だと思う。

② 45歳以上がリストラ対象になるから
35歳の私としてはショッキングなニュースがある時飛び込んできた。会社名は伏せるが大手の会社だ。もしかすると、10年後には自分もその環境におかれるとなると不安でしょうがない。45歳は一番の働き盛りである。現在営業職で働いているが、***他に自分の武器になるようなスキルを身につける必要がある***と、このニュースを見たときに感じた。世の中・会社にとって必要な人材であり続けなければクビを切られてしまう。

③ AIに関する人材・技術力が求められているから
***政府が2019年3月29日にAI戦略を発表した。***AI戦略にはAI時代に対応した人材の育成、産業のAI化を促進、AI技術力の強化、国際的AI研究などが盛り込まれていた。この内容をみても今後AIが台頭し、AIに関する人材、技術力が求められていることがわかる。そこで、AIに便利なライブラリや環境が整っているPythonをプログラム言語として選択した。

④ プログラミングで業務を効率化できるから
営業をしていると、同じ作業、二度手間をやらされることことが多い。たとえば、営業資料・帳票関連だ。会社のシステムから帳票が出てくるのに、別の帳票をExcelで作る。報告業務をCRMに入力しているのに、メールで報告させられる。もし、プログラミングができればこのようなことを改善できるのではないかと思った。

例えばこんなこと↓
[【Python】35歳＋営業職＋プログラミング経験なしが2週間でPythonを使って営業日報を効率化した話](https://qiita.com/1-row/items/9306f638b1f1ad426956)

## まとめ
実際のところは世の中が今後どうなるかはわからない。ただ、世の中がこのような流れになってきているのは間違いないはずだ。***私はプログラミングをはじめて一ヶ月くらいだが、プログラミングのすばらしさ、おもしろさ、可能性を感じている。***プログラミングを挫折してしまった、プログラミングに興味をもっているのにはじめられていない人がいるならばもったいない。

もし、この投稿を見て共感できる部分が少しでもあるのであれば、すぐにプログラミングをはじめてほしい。また、すでにプログラミングをやっている人はよりプログラミングの学習に力を入れてほしいと思う。
***その努力はきっと無駄にはならないはずだから。***

## 参考サイト
[小学校プログラミング教育に関する概要資料](http://www.mext.go.jp/component/a_menu/education/micro_detail/__icsFiles/afieldfile/2018/03/30/1375607_01.pdf)
[AI戦略(有識者提案)及び 人間中心のAI社会原則(案) について](https://www.kantei.go.jp/jp/singi/tougou-innovation/dai4/siryo1-1.pdf)
[]()
[]()
TriggerとKinematicについて[VCIアドカレ#8]

#はじめに
この記事はGWアドベントカレンダーという企画の「[VCIアドベントカレンダー GW ver](https://gw-advent.9wick.com/calendars/49)」8日目の記事です
今日はTriggerとKinematicの挙動と衝突検出について説明します。
(TriggerとKinematicに密接な関係があるわけじゃないですがまとめて説明します。ごちゃごちゃしてすみません。。。)

#TriggerとKinematicの挙動
###Trigger
![trigger.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64877/779b9a0c-0dbd-1912-7eba-10ab67f28c5e.gif)
(青がTriggerがOFF，赤がTriggerがOn)
TriggerをOnにすると上記画像のように物理衝突の影響を受けないようにする(すり抜けるようにする)ことが出来ます。
useGravityをOnにしてる場合は重力の影響は受けますが、衝突の影響を受けないため床も盛大にすり抜けます。

Utity上の以下の部分の「Is Trigger」にチェックを入れるとこで設定出来ます。
![IsTrigger.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64877/14b412bf-28b7-1ea3-2f71-9c01218034c3.jpeg)

TriggerをOnにしても衝突判定自体は有効なため、何かとぶつかったときに検知したいが他の物体に影響を及ぼしたくないときに使用します。
いろいろなことをやろうとすると割と使う設定だと思います

###Kinematic
![kinematic.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64877/7c460fb3-83ea-083f-475d-739a37202f7b.gif)
(向かって左がkinematicがon、右がkinematicがOff)
KinematicをOnにすると上記画像のようにオブジェクトを空中に固定することが出来ます。他のオブジェクトで叩いても影響を受けません。


Utity上の以下の部分の「Is Kinematic」にチェックを入れるとこで設定出来ます。
![kinematic.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64877/37ac40c2-3ac8-48d4-5f50-f90f61abe15c.jpeg)

チェックを付けない場合はふわふわ飛んでいく状態となるため、掴みやスクリプトでのみ移動させたいVCISubItemを作りたい時に、ここにチェックを入れて使用します。
いろいろなことをやろうとすると割と使う設定だと思います

　



#衝突時の判定関数
Triggerとkinematicに関する衝突判定関数の取扱についてトピックを2つ紹介します

### Triggerオブジェクトと非Triggerオブジェクトの衝突判定関数
Triggerと非Triggerの衝突時の実行関数は以下の通りとなります

| item側trigger  |  hit側trigger |   発火関数         |
|:--------------:|:-------------:|:------------------|
| off            | off           |   onCollision～   |
| on             | off           | **onTrigger～**   |
| off            | on            | **onTrigger～**   |
| on             | on            |   onTrigger～     |

気をつける点として、いずれかがtriggerがonであればもう一方がoffであってもitem・hit側とも両方onTriggerが発火します。
自分のtriggerがoffであればonCollisionになるわけではないので注意です。

### Kinematicとtriggerとボーンの衝突判定関数
~~Kinematicとボーンの衝突時の発火関数は以下の通りとなってます。~~
こちらは結構複雑でした。

|   kinematic　  |    trigger    | grab状態    |   発火関数      |
|:--------------:|:-------------:|:----------:|:----------------|
| off            | on            |     －     |   onTrigger～   |
| off            | off           |     －     |   onCollision～<br>(**掴んでから1回だけ**)   |
| on             | on            |     －     |   onTrigger～   |
| on             | off           | grab中     |   onCollision～<br>(**掴んでから1回だけ**)  |
| on             | off           | 非grab中   |   発火しない     |
[2020/12/16 追記] ※ルームだと掴んでから1回という制限はないみたいです(確認時点)

kinematicがon，triggerがoffの時はgrab中かどうかで動作が変わり、更にgrab中の時はonclissionが1回だけ走るようになっていました
(いろいろ試しましたが詳細条件あまり自信がないです。間違っていたら指摘いただけるとありがたいです)
とりあえずほかオブジェクトに干渉しなくていい場合はontriggerをonにして置けば問題ないかと思います。

#おわりに
今回はTriggerとKinematic、及び衝突時の発火関数について紹介しました。
正直書いてる途中で間違っていることが判明して書い直したりもしたのであっているか自信がないです。
ただ、調べた範囲のことは書きましたので参考になればと思います(・ω・)
rbenv install でほしいverがない場合

## rbenvのverがない時
`brew update && brew upgrade ruby-build` をしてまず `rbenv install -l` で欲しいverを使えるようにしておく
これでない場合ヒントみたいなのが出ているので、その場所に `cd` を使って移動 `git pull` をする
↓参照

```terminal

ruby-build: definition not found: 2.4.5

See all available versions with `rbenv install --list'.

If the version you need is missing, try upgrading ruby-build:

  cd /Users/macpro/.rbenv/plugins/ruby-build && git pull && cd -
```

`cd /Users/macpro/.rbenv/plugins/ruby-build/`
`git pull`
って感じ

`rbenv install -l`
をすると欲しいverが入っている（あくまで今回2.4.5が欲しくてなかったときにやったもの）

## 開発環境を作る際
rbenvで簡単にver管理できるのでものすごい便利だが
ちょっとしたことで困ることがあった今回のような例のときは注意が必要だと思った

英語読めるようにしなければ、、、、笑

という個人的メモでしたとさ。
静的（スタティック）メンバについて解説！


# 静的（スタティック）メンバとは
- インスタンスを生成しなくても、クラス内に定義されているプロパティやメソッド（メンバ）にアクセスができること。

## 静的（スタティック）メンバの使い方
- クラスのプロパティまたはメソッドに`static`という修飾子を付けます。
- staticが付いているプロパティを`静的プロパティ`と呼びます。
- staticが付いているメソッドを`静的メソッド`と呼びます。

## 静的（スタティック）メンバの書き方

```php:
<?php

class クラス名 {

    アクセス修飾子 static $プロパティ名;

    アクセス修飾子 static function メソッド名(引数) {
        //ここに処理が入ります
    }

?>
```

# 静的（スタティック）メンバにアクセスする方法
- `静的プロパティ`または`静的メソッド`にアクセスするには`スコープ定義演算子 「::」`を使います。

## スコープ定義演算子 「::」とは
- `静的プロパティ`または`静的メソッド`にアクセスするために使う演算子です。

### スコープ定義演算子 「::」の書き方
```php
クラス名::アクセスしたいプロパティ
クラス名::アクセスしたいメソッド
```

# オブジェクト演算子「->」とスコープ定義演算子 「::」の違いについて
- どちらもプロパティやメソッドにアクセスするために使いますが、2つの演算子の違いについて紹介します。

## オブジェクト演算子「->」のアクセス方法
- `インスタンスプロパティ`と`インスタントメソッド`にアクセスできます。
- インスタンスプロパティまたはインスタントメソッドとは`staticを宣言していない`プロパティまたはメソッドです。

### オブジェクト演算子「->」の書き方

```php
$インスタンスを代入した変数->アクセスしたいインスタンスプロパティまたはインスタンスメソッド
```

### コード例
```php
<?php

class Products
{
	
	private $name = "テーブル";

	public function getName(){
		return $this->name;
	}
}

$product = new Products();

echo $product->getName();

?>
```
```php:出力結果
テーブル
```

## スコープ定義演算子 「::」のアクセス方法
- `静的プロパティ`または`静的メソッド`にアクセスします。
- `staticを宣言している`プロパティまたはメソッドにアクセスできます。

### コード例
```php
<?php

class Products
{
	
	public static $name = "テーブル";

	public static function price($price){
		return $price;
	}
}

echo Products::$name . "の金額は" . Products::price(3000) . "円です";

```
```php:コード例
テーブルの金額は3000円です
```
【2019年5月版】Mac+nvm環境で brew install yarn

# Mac の nvm 環境に Homebrew で yarn をインストール

## 対象環境

OS: macOS High Sierra 10.13.6
Homebrew : 2.1.1
nvm: 0.34.0

## 手順

以下のコマンドを打つだけ。

```
$ brew install yarn
```
ただし、以下を注意。

## 注意事項

こちらの公式サイトの[macOSでの yarn のインストール方法](https://yarnpkg.com/en/docs/install#mac-stable)にある通り、

> If you use nvm or similar, you should ensure that your PATH lists nvm’s shims before the version of Node.js installed by Homebrew.

'nvm で作成した node のエイリアスが brew で install する node より前に PATHに入っているようにしてね〜'ということなので念のため `PATH` をチェックしましょう！

## さらに注意

nvm のインストール時に".bashrcにパス追加してね！"というコメントがありますが、macOSでは一筋縄では行きません。

詳しくはこちらの「[macOSのターミナル(bash)のプロンプトを変えました。](https://qiita.com/eytyet/items/96ef67ec6fb3876aa3d8)」にありますが、要はデフォルトでは mac のターミナルの起動時には `.bashrc` が `source` されないってことです。

上記の記事にある通り、`.bash_profile`で`.bashrc`を`source`しておくのを忘れずに！ということで〜
VBSからPowerShellへ　(1)変数定義の強制

VBS(VBScript)からPowershellへの移行に関して、作業用の備忘録。

# 変数定義の強制
VBSでよく出てくる未定義の変数を禁止するための
**Option Explicit**

これはPowershellの場合は
**Set-StrictMode -Version 2.0**
となる。

ただし、**Option Explicit**と**Set-StrictMode**は方向性として完全一致というわけでなく、さらに1.0と2.0ではチェック対象の厳格さが異なるが、通常は**Set-StrictMode -Version 2.0**を使えばいいかと。


・参考にさせていただいたページ
Set-StrictModeについてちょっとだけ詳しく説明してみる[https://blog.shibata.tech/entry/2015/11/10/233858]
WSL 環境で標準出力をクリップボードにコピーする

#背景
Windows10 から Windows Subsystem for Linux (WSL) が利用できるようになり、Ubuntu などの Linux ディストリビューションを利用した開発が手軽にできるようになりました。
しかし、Mac でいうところの pbcopy などのコマンドは標準で用意されておらず、ファイル内のテキストをコピーして利用するのに手間がかかります。
上記操作をしたい時、cat で表示した文字列をマウスでのドラッグ後に右クリックしていた人もいるのでは？（私もそうでした）
これらの操作をキーボードだけで完結できるような環境を整えたいと思います。

#インストール
##xsel
Linux ディストリビューションによりますが、Ubuntu ならば apt に xsel があります。それをインストールしましょう。

```
sudo apt install xsel
```

##Xming
クリップボードへコピーする際、受け取る先が必要になります。何でもよいのですが、例えば Xming をインストールしておけば良いです。
https://sourceforge.net/projects/xming/

#環境設定
出力先となる環境変数 DISPLAY を設定します。.bashrc や .zshrc に以下のように書いておきましょう。

```~/.zshrc
export DISPLAY=localhost:0.0
```

#使用例
Xming を起動します。
filename.txt 内を全てコピーしたい時は以下のコマンドを実行します。必要に応じてオプションは選択してください。

```
cat filename.txt | xsel --clipboard --input
```

これで別の場所に Ctrl+V などでペーストできるようになりました。

#その他
必要であれば、alias を設定しておくと良いです。マウス操作からどんどん脱却していきましょう。
AWS　耐障害性と高可用性

##耐障害性の向上1##
別リージョンや別AZにバックアップを取得保管する。
![スクリーンショット 2019-05-04 19.13.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/0cc93375-f532-5d8e-6fa5-0951c274a44f.png)


##耐障害性の向上2##
別リージョンや別AZにスタンバイ構成をとっておき、即座にフェイルオーバーできるようにする。
![スクリーンショット 2019-05-04 19.14.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/d1460c0c-c0ed-4108-de0b-02fcabe49d2d.png)


##高可用性の設計を考えるポイント##
**目標復旧時間（RTO: RecoveryTime Objective）**
「どれくらいの時間で復旧できれば影響が少ない？」の目安
**目標復旧時点（RPO: RecoveryPoint Objective）**
「いつ時点のデータを復旧できれば何とかなる？」

**耐障害性**
アプリケーションに組み込まれた冗長性
**復元可能性**
障害、災害発生時におけるサービス復旧にかかる機能など
**拡張性**
設計において、スケーラビリティを以下に確保するのか

**トレードオフ**
可用性を高めると、コストは高くなり、構成も複雑になるので、うまくバランスを調整する。


##単一障害点の排除1##
ELBを利用したマルチAZ構成にする
![スクリーンショット 2019-05-04 19.31.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/95c25134-f209-e1b7-b1f4-e559dea34b57.png)

##単一障害点の排除2##
マルチAZでマスタースレーブ構成にし、リードレプリカで軽減する。
![スクリーンショット 2019-05-04 19.33.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/e794e2e4-386a-0362-5223-0a1621486ba1.png)


##障害復旧モデル##

|DR構成|説明|
|---|---|
|バックアップ＆リストア|バックアップデータを別リージョンに保存しておき、DRサイト側レプリケーション。DR時はバックアップからシステムを復旧する。|
|パイロットライト|DRサイト側でスペックの低いスタンバイDBをたて、通常時はデータ同期のみ行う。DR時はDRサイト側でAPを起動、DBをスケールアップし、復旧する。|
|ウォームスタンバイ|DRサイトでスペックの低い構成を常時起動。DR時はサーバーをスケールアップし、DNSの名前解決先をDRサイト側に切り替え、復旧する。|
|マルチサイト|DRサイトで完全に同スペックの構成を常時起動。DR時はDNSの名前解決先をDRサイト側に切り替えるのみで、短時間で業務復旧。|



上記のような例があげられますが、重要な要件をどこにおくかによる。
例えば、コスト最適化に重点をおくのであれば、「バックアップ＆リストア」になるだろう。
ダウンタイムをもっとも短くするのであれば、「マルチサイト」となる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/2dfcf3cf-9ed7-8502-409c-27da3a98c76e.png)
create-react-app-typescriptからcreate-react-app v2への移行とpolyfillについて

## はじめに
create-react-app-typescriptからcreate-react-app v2に移行しましたので、
その手順について共有いたします。

## create-react-app v2への移行
https://vincenttunru.com/migrate-create-react-app-typescript-to-create-react-app
に記載されています。下記のほとんどの記載内容は引用です。

##### STEP1: react-scripts-tsを削除し、react-scriptsをdependenciesに加える(yarnの場合) 

```ruby:
yarn remove react-scripts-ts
yarn add react-scripts
```

##### STEP2: node scriptsを書き換える
package.jsonのscriptsを先程インストールしたreact-scriptsに修正する
(react-scripts-tsから「-ts」を消す)

変更前

```json:package.json
"scripts": {
    "start": "react-scripts-ts start",
    "build": "react-scripts-ts build",
    "test": "react-scripts-ts test --env=jsdom",
    "eject": "react-scripts-ts eject"
  },
```

変更後

```json:package.json
"scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject"
  },
```

##### STEP3: configファイルの削除
- tsconfig.json 
- tsconfig.prod.json
- tsconfig.test.json
を削除する

##### STEP4: 開発サーバの実行

```ruby:
yarn start
```

アプリケーションを実行すると、自動的に
新しいtsconfig.jsonと新規にreact-app-env.d.tsがルートディレクトリ配下に作成されます。

##### V2移行時の注意点
1. 新しいtsconfig.jsonではデフォルトでstrict modeになっているので、
   必要に応じてcompilerOptionsを変更する。勿論strict modeの方が望ましい。
2. Import文のパスが相対パスしか受け付けないため、絶対パスになっている箇所を相対パスに修正する

※上記の参考サイトではStoryBook使用時の注意点が記載されています。私はStoryBookをプロダクトで使用していないため、本記事では省きますが、使用されている方は参照してください。

## Polyfill
既存の記事と重複しますが、V2標準ではIEのサポートを打ち切っています。
ただし、それだと現実問題困るため、CRA公式のpolyfillが公開されてます。
本記事ではIE11への対応を記載しますが、全て公式サイト
(https://facebook.github.io/create-react-app/docs/supported-browsers-features)
(https://github.com/facebook/create-react-app/blob/master/packages/react-app-polyfill/README.md)
に記載済みの内容です。

##### STEP1: polyfillの追加
本記事では、CRA公式のpolifillのを追加します。
JSファイルを見るとcore-jsをインポートしている為、babel-polyfill等でも問題ないような気がします。


```ruby:
yarn add react-app-polyfill
```

##### STEP2: polyfillのインポート
アプリケーションのエントリファイル、index.tsx
の最初に下記2文を追加します。

```typescript:src/index.tsx
import 'react-app-polyfill/ie11'
import 'react-app-polyfill/stable'
```

##### STEP3: (option)package.jsonの修正
このままでも、buildしたアプリケーションなら、問題無く動作しますが
ローカル環境で実行した場合、polyfillが適用されません。

ローカルでもpolyfillを適用するには、
上のSTEP4実行時に追記されたpackage.jsonのbrowserslistを更に修正します。
developmentの一番下に"IE 11"を追加します。

```json:package.json
"browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version",
      "ie 11"
    ]
  }
```
上記、追加後もpolyfillが適用されない場合は、
node_moduleを全て削除後、もう一度`yarn install or npm install` してから確認してみてください。
language-vueでhtmlの補完機能が効かない場合の対処法

Atomでlanguage-vueでのHTMLのオートコンプリートがうまくいかない時の情報を見つけられなかったのでメモ

# 動機
https://qiita.com/mrmr/items/f6927eb2fe5aa13a2f90
ここを参考に1通り入れたがオートコンプリートが効かなかった。

#対処法
`~/.atom/packages/language-vue/grammars/vue.cson`
の`patterns`のはじめを

```javascript
patterns: [
  {
    'include': 'text.html.basic'
  },
//...
]
```

このように書き換える。

# あとがき
Atomを再起動したら治ったのでなんだったのかはわからん。
ただ一応治らなかった時のために。
応用数学(情報理論)

※以下、個人的な勉強のためのレポートです。
※間違い多々あると存じますが、現在の理解レベルのスナップショットのようなものです。
※勉強のためWebサイトや書籍からとても参考になったものを引用させていただいております。

# 情報理論
情報理論（Information theory）は、情報・通信を数学的に論じる学問。応用数学の中でもデータの定量化に関する分野であり、可能な限り多くのデータを媒体に格納したり通信路で送ったりすることを目的としている。あいまいな概念である「情報」を定量的に扱えるよう定義し、情報エントロピーとして知られるデータの尺度は、データの格納や通信に必要とされる平均ビット数で表現される。
クロード・エルウッド・シャノン（Claude Elwood Shannon, 1916年4月30日 - 2001年2月24日）が情報理論を学問分野として確立。

アナログ情報の扱いに長けた人間と違い、機械はそれを苦手としいる(A/DコンバータD/Aコンバータを使用することで粒度によっては可能)。よって機械は「0か1か」というデジタル情報を内部で取り扱っている。スイッチの働きをするトランジスタを用い、トランジスタのON状態とOFF状態をそれぞれ0と1として、デジタル情報を扱う。つまりスイッチ一つがONかOFFか,0/1の2通りの状態を格納することができる。スイッチが2個あった場合は、00/01/10/11の4通りの状態を格納することができる。

シャノンは情報の最小単位をスイッチ一つとして、ビット(binary digit)とした。

## 情報の価値
非常に確率の高い事象を事前に知りうることと、発生確率が低い事象について事前に知りうることでは同じ情報でも価値が異なる。これを数式化したのが情報エントロピーの概念である。

# 自己情報量
シャノンは、ある事柄Xが起こる確率をP(X)としたとき、これが与える情報量H(X)を次の数式で定義した
$I(X)=\log_2 \frac{1}{P(X)}=-\log_2 P(X)$ (単位はbit)

さきほどの情報の価値という観点から値を代入してみると、コインの表が出るか裏が出るかは50%ずつなので、
$I(X)=-\log_2 0.5 = 1$(bit)
一方、明日の天気が晴れ/雨/曇り/雪の4択だとしたら、それぞれ25%のなので、
$I(X)=-\log_2 0.25 = 2$(bit)
となり、前者より後者の方が情報の価値が大きいことが式からも示される。

# シャノンエントロピー
情報源全体の価値、情報源の期待値を考察する概念。
$H(x)=E(I(x))=-E(\log(p(x)))
=-\sum(p(x)\log(P(x)))$(bit)

起こった事象の情報量に起こる確率を掛け期待値を求める。この値をプロットすると釣鐘上のグラフが現れる。このグラフから読み取れることは・・・、①起こる確率ほぼ100%の事象が起きたとしてもあまりありがたみがなく、逆に起こる確率ほぼ0%の事象が起こらなかったとしても、こちらもありがたみがない。つまり情報エントロピーは0。一方、確率5o%で事象が拮抗している場合には、どちらが起こるの知れるということの情報価値は高く、情報エントロピーは1。

すなわち、情報エントロピーが大きい状態とは、状況が予測しにくい状態を示し、情報エントロピーが小さい状態とは、状況を予測しやすい状態を示す。

# カルバックライブラーダイバージェンス
2つの確率分布の「差異」を計る尺度。
「ある確率分布と別の確率分布のズレ」。

# 交差エントロピー
符号化方式が、真の確率分布 p(x) ではなく、ある所定の確率分布 q(x) に基づいている場合に、とりうる複数の事象の中からひとつの事象を特定するために必要となるビット数の平均値。
※現状の理解では、例えば・・・ノイズを受けて届いた情報(受信データ)から真に送ろうとした情報(送信データ)を正確に復元できる「予測困難さ」という理解でいます。シャノンの情報理論では相互情報量という概念も登場。シャノンの情報理論における根幹である「価値ある情報を高速に、正確に送る」テーマに非常に深くかかわる概念であると考える。

**引用**
「シャノンの情報理論入門」高岡詠子
あれっ、エントロピーってなんだっけ？https://qiita.com/katsu1110/items/c733a1184b789c511739
エントロピー・KL divergenceの復習htps://qiita.com/kento1109/items/10026d96f2634ba36362
Amazon S3 との外部接続

AWS Storage Gateway　と　Snowball の概要について記載します。


#AWS Storage Gateway とは#

AWSのストレージサービス（S3）などとオンプレミス環境との外部接続を実現する。


##ユースケース##

- オンプレミスからS3にバックアップを置いておきたい
- システム移行のため、一時的にデータを移動させておきたい


##ファイルゲートウェイ##

- S3へのNFSやSMBなどのプロトコルによるインターフェースを提供する。オンプレミスのサーバーから直接S3のファイルにアクセスできる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/967d8997-25a4-cc95-e9d1-d2fc35396f87.png)


##ボリュームゲートウェイ##

###ストレージボリューム###

- オンプレミスのデータのスナップショットを非同期にS3にバックアップする。データセット全体への低レイテンシーアクセスが必要な場合には、保管型のボリュームゲートウェイを利用する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/699db997-ce9d-3c8f-08df-b8aa7709b151.png)

###キャッシュボリューム###

- データセット全体をS3に保存し、頻繁にアクセスするデータサブセットのコピーをオンプレミス側に保存する。オンプレミスのストレージの拡張コストを抑えることができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/01615593-80ee-e9b7-34d2-fd17f3c2567a.png)

纏め。。。

||gateway cached volumes|gateway stored volumes|
|---|---|---|
|概要|	ローカル に頻繁に使用されるデータをキャッシュする。その他はS3/EBS/Glacierストレージに保存する。|ローカルにすべてのデータをキャッシュし、一定周期でS3/EBS/Glacierストレージ にスナップショットを保存する。|
|メリット|	頻繁に使用するデータへの遅延が少ない。|すべてのデータへの遅延が少ない。|


##テープゲートウェイ##

- 物理テープライブラリの代替えとして使用する。VTL対応バックアップウェアを利用し、Storage Gateway を経由して、バックアップをS3およびGlacierに保存する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/5c649a0f-b8dd-6ccf-8561-49a5d6d4c850.png)


##FSx ファイルゲートウェイ##

- オンプレミスから Amazon FSx for Windows への SMB プロトコルによる接続を可能にするゲートウェイです。最大のメリットは、オンプレミスから低レイテンシーで Amazon FSx for Windows に接続できる点です。


##iSCSI イニシエータの接続##
CHAPを使用して、ゲートウェイと iSCSI イニシエータの間の認証を行うことができます。 
CHAP は、ボリュームと VTL デバイスターゲットへのアクセスの認証時に、iSCSI イニシエータのアイデンティティを定期的に確認することにより、プレイバック攻撃から保護します。

https://docs.aws.amazon.com/ja_jp/storagegateway/latest/userguide/initiator-connection-common.html#ConfiguringiSCSIClientInitiatorCHAP


#Snowball とは#

- 物理ストレージデバイスを使用し、AWSとの大容量データ転送を高速化するサービスです。
- AWSに大幅に移行したい場合、インターネット回線などを利用指定していると間に合わない場合などに利用する。
- AWSに依頼することで物理ストレージデバイスを借りることができる。
link_toで作ったリンクの　下線部を消したい

#link_toで作ったリンクの下線部をどうしてもを消したい

<img width="123" alt="EDIT.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373045/9700b6e9-70e4-b4c2-7757-fcf496543739.png">
#haml 
<img width="409" alt="h1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373045/44f29266-c947-b870-53e2-f20a552a9f51.png">

#scss
<img width="373" alt="c1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373045/3c3c8ba9-20da-ec34-99a4-3eea5cac3b6c.png">

#検証
<img width="380" alt="１.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373045/22027682-2baf-1c67-0f7c-8165ad017753.png">

#解決法　
**link_to　にクラスをつけて　scss　で　text-decoration: none;**　

#haml 

<img width="575" alt="h2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373045/c79df4b1-9b9f-aaef-625c-875d4a4469f8.png">

#scss
<img width="335" alt="c2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373045/840176ca-ac67-d585-26c2-2a564fa1d3c1.png">

#結果
<img width="140" alt="2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373045/75eecee4-6945-f708-1bb3-180add201c82.png">
#検証
<img width="612" alt="4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373045/688be9b3-66ec-9c75-e619-ba4bcb08eafb.png">
#その他
html cssでも対応出来る