OmniAICreator/Qiita-1.07M huggingface dataset:
適当な文字列を 0 から 1 までの実数に振り分けるロジック (PHP/TypeScript)

![PHP-7.2](https://img.shields.io/badge/PHP-7.2-brightgreen) ![TypeScript-3.7](https://img.shields.io/badge/TypeScript-3.7.x-brightgreen)

最近 A/B テストのように確率的な条件分岐を実現する文脈で、適当な入力文字列から区間 $ [0, 1] $ に含まれる数値を出力するようなハッシュ関数を実装する機会がありました。単に定められた範囲の数値を出力するだけでなく、出力される数値に偏りが出ないように（関数の出力値の分布が連続一様分布とみなせる [^mathematical_rigor] ように）するという要件もありました。

イメージとしては以下のコードのようになります。

```php
// 同じ文字列を入力に取ると同じ数値が出力される
strToNumberBetweenZeroAndOne('abc');        // output: 0.7283949105904
strToNumberBetweenZeroAndOne('abc');        // output: 0.7283949105904

// 別の文字列を入力に取ると別の数値が出力される
strToNumberBetweenZeroAndOne('Hello');      // output: 0.095208030923864
strToNumberBetweenZeroAndOne('World!');     // output: 0.31755707966684
strToNumberBetweenZeroAndOne('0123456789'); // output: 0.51892998626938

// 色々な文字列に対して出力値をプロットしていくと、数値の確率分布が区間 [0, 1] の一様分布に近づく。
```

このような関数を PHP と TypeScript で実装したので紹介します。

## 実装

### PHP

PHP の場合は以下のように実装できます。

```php
function strToNumberBetweenZeroAndOne(string $message): float
{
    // 1
    $hashHex = hash('sha256', $message);

    // 2
    $maxHex = str_repeat("f", 64);
    return hexdec($hashHex) / hexdec($maxHex);
}
```

1 の部分では `hash('sha256', $string)` で入力文字列を SHA256 [^hash_function] で64桁の固定長16進数に変換し、 `hexdec()` でその10進数表現を得ています。文字列から16進数への変換は [bin2hex](https://www.php.net/manual/ja/function.bin2hex.php) で行うこともできますが、文字列のサイズが大きすぎると桁あふれを起こしてしまうので使用を避けています。

2 の部分では 1 で得られた10進数を64桁の16進数の最大値 `str_repeat("f", 64)` の10進数表現で割ることで数値を算出しています。

### TypeScript

```ts
import CryptoJS from 'crypto-js'

const strToNumberBetweenZeroAndOne = (message: string): number => {
  const hashHex = CryptoJS.SHA256(message).toString()

  const maxHex = 'f'.repeat(64)
  return parseInt(hashHex, 16) / parseInt(maxHex, 16)
}
```

内容は PHP と特に変わりませんが、 SHA256 のハッシュ化を行うために [crypto-js](https://github.com/brix/crypto-js) というライブラリを利用しています。

## 検証

実際にランダムな文字列を入力にメソッドの出力値 [^for_histogram] を集計してヒストグラムを作成してみると、おおよそ一様分布になっていることが分かります。

<img width="900" alt="メソッドの出力値を集計して作成したヒストグラム" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179455/eea7edf8-7a72-f1df-f635-e9ffd96256ac.png" />



[^mathematical_rigor]: 統計学に関しては門外漢なので、数学的に厳密な連続一様分布がどう表されるべきかは特に考慮しておらず、 A/B テストのような用途で実用性を損なわない精度の出力が得られることを目指しています。また統計学の用語の使い方が誤っている等あれば編集リクエストをいただけると助かります！
[^hash_function]: 単に強度や処理速度などの要件に応じて他のハッシュ関数を用いても構いません。
[^for_histogram]: ここではヒストグラムの作成用に出力値を100倍して小数点を切り捨てています。
gitを使ってアプリケーションの雛形を作る

まずgit,github,について。

gitとは？
ソースコードの変更履歴、バージョンなどを記録するツール。

誰かと共同で開発していた際、保存をしてしまったが、前に戻したい…
共同製作者に意図なく変換されてしまった…

そうなってしまうと、取り返しがつかない。
そこでgitは、全ての変更履歴を含む完全なリポジトリの複製が作成されるということです。

githubとは？
このGitの仕組みを利用して、世界中の人々が自分の作品(プログラムコードやデザインデータなど)を保存、公開することができるようにしたウェブサービスの名称です。

#外部サーバーにあるgitで管理されたソースコードを自分のパソコンにダウンロードする
```
git clone リポジトリURL ディレクトリ名
```

※カレントディレクトリにダウンロードする際は、ディレクトリ名は不要


#その後にしなければならないこと
今の状態は、rails newコマンドでrailsのアプリケーションを新規作成した時のような状態。
つまりこのままサーバーを立ち上げてもエラーが出る。
・bundle install
・DBの作成
・アプリとDBの接続
・サーバーの立ち上げ

の４つをしなくてはならない


bundle install 
すでにダウンロードしたもののgem　fileにgemが入っているため、変更がない場合は、bundle install

DBの作成
rails db:createでDBを作成

アプリとDBの接続
sudo service httpd start　（phpMyAdminを起動する）
※phpMyAdminをダウンロードしている前提

サーバーを立ち上げる
その後に、リンクをコピーし、
URLで検索。
語尾に:8081をつけエンター

その後
/phpmyadminを語尾につけエンター

最後に
https://を先頭につけエンターを押すと、phpMyAdminが更新される
Warning: Calling brew cask list is deprecated! Use brew list --cask instead.とかError: Calling brew cask install is disabled! Use brew install [--cask] instead.となった時の対応方法

# 事象 : CaskでインストールしようとしたらError: Calling brew cask install is disabled! Use brew install [--cask] instead.
- 環境
    - macOS Big Sur バージョン11.1
    - Homebrew 2.7.1

```zsh
% brew cask install sourcetree 
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 2 taps (homebrew/core and homebrew/cask).
==> Updated Formulae
Updated 6 formulae.
==> Updated Casks
Updated 1 cask.

Error: Calling brew cask install is disabled! Use brew install [--cask] instead.
```

## 原因 : Caskのインストール方法が変わったから
```text:メッセージのざっくり日本語
エラー:brew cask installの呼び出しは無効です!代わりに、brew install [--cask] を使用します。
```

### 対応 : 普通のHomebewと同じようにインストールする
```zsh
% brew install sourcetree 
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/cask).
==> Updated Casks
Updated 1 cask.

==> Downloading https://product-downloads.atlassian.com/software/sourcetree/ga/Sourcetree_4.0.2_236.zip
######################################################################## 100.0%
==> Installing Cask sourcetree
==> Moving App 'Sourcetree.app' to '/Applications/Sourcetree.app'.
==> Linking Binary 'stree' to '/usr/local/bin/stree'.
🍺  sourcetree was successfully installed!
```

# 事象 : Caskでインストールしたアプリの一覧をみようと思ったら怒られた
- 環境
    - macOS Catalina バージョン10.15.6
    - Homebrew 2.5.2

```bash
% brew cask list | grep -i ricty
Warning: Calling brew cask list is deprecated! Use brew list --cask instead.
```

## 原因 : コマンドが変わったから
[Caskはインストールしなくて良くなったりといろいろ世の中変わったらしい](https://qiita.com/ponsuke0531/items/73f540391aa3827130d8)

```text:メッセージのざっくり日本語
警告:brew cask listの呼び出しは推奨されていません!代わりに、brew list --caskを使用してください。
```

### 対応 : 新しいコマンドを使う

```bash
% brew list --cask
```
Macのキーリピート速度を爆速にする

# はじめに
すでに色々な方々が使っている方法ですが 「あれ、コマンド何だっけ」 となるので備忘録がわりに書いておきます。

# リピート入力認識の速度をあげる
リピート入力認識とは、キーを長押ししてからパソコンが 「あ、連続で入力しなきゃ」 となるまでの時間です。

現在の設定は以下のコマンドで確認できます。

```
$ defaults read -g InitialKeyRepeat
```

では、爆速に書き換えてみましょう。


```
$ defaults write -g InitialKeyRepeat -int 11
```

`write` は書き込みを表します。
`-g` と言うオプションは `NSGlobalDomain` と言う領域を表しているそうです。

`InitialKeyRepeat` リピート入力認識までの速度を表します。
`- int 11` のように実際の速度の数値を入れます。
`1 = 15ms` を指しています。

古い記事だと `- float 11` のように書いている物もありますが、現在だとOSによっては誤作動を引き起こすそうです。

システム環境設定の上限値は`15`らしいです。

# キーリピートの速度を上げる
キーリピートとはキーを連続して実際に入力するスピードのことです。
現在の設定は以下のコマンドで確認できます。

```
$ defaults read -g KeyRepeat
```

では、実際に爆速にしてみましょう。
基本的な記法は前述したものと同じです。

```
$ defaults write -g KeyRepeat -int 1
```

こちらの上限値は `2` らしいです。

# 再起動は必須
コマンドを入力しただけでは反映されないので、必ずMacを再起動するようにしましょう。

#元に戻したい場合
設定した値を元に戻したい場合は以下のコマンドで戻せます。
リピート入力認識速度を初期化

```
$ defaults delete -g InitialKeyRepeat
```

キーリピート速度を初期化

```
$ defaults delete -g KeyRepeat
```

#まとめ
お好きな値を設定して、ノンストレスな爆速コーディングライフをお過ごしください。

#参考記事
[キーボードの反応速度を速くする方法 2](https://dev.classmethod.jp/articles/mac-keyboard-speed-2/)
[Mac / キーリピート速度の変更](https://scrapbox.io/nomnel/Mac_%2F_%E3%82%AD%E3%83%BC%E3%83%AA%E3%83%94%E3%83%BC%E3%83%88%E9%80%9F%E5%BA%A6%E3%81%AE%E5%A4%89%E6%9B%B4)
Firestoreのエラー "Converting circular structure to JSON Firebase"

## エラーの原因
document内で, referenceタイプのフィールドを使っている場合に発生します.

## 筆者のアプローチ
referenceタイプのフィールドが他のドキュメントを指すことで再帰的になっている為, そのドキュメントのパスを文字列型に変換してあげればいいと思います.
他の方法があればご教授いただきたいです.🙇‍♂️

## 具体的な方法
下記は取得したいドキュメントの `DocumentReference `を引数として与えてあげるとそのドキュメントをオブジェクトとして返してあげる関数です.

```js
const resolveCirculations = (documentRef) => {
  const data = documentRef.data();
  const circlerRefResolved = Object.keys(data).reduce((ret, key) => {
    ret[key] = has(data[key], 'path') ? data[key].path : data[key];
    return ret;
  }, {});
  return { ...circlerRefResolved, id: documentRef.id };
};
```

ドキュメントの一件取得は下記のように使ってあげます.

```js
const postRef = await db.collection('posts').doc(id).get();
const post = resolveCirculations(postRef);
```

ドキュメントを複数(コレクションで)取得したい場合は以下で, `CollectionReference` 用に関数を用意してあげます.先程の`resolveCirculations`を使います.

```js
const getDocs = (collectionRef) =>
collectionRef.docs.map(resolveCirculations);
```

上記を使うと, 複数件は以下で取得できます.

```js
const usersRef = await db.collection('users').get();
const users = getDocs(usersRef);
```

以上になります.
Error: caskroom/cask was moved. Tap homebrew/cask instead.となった時の対応方法

- 環境
    - macOS Catalina バージョン10.15.6
    - Homebrew 2.5.2

# 事象 : Homebrew Caskをインストールしようとしたら怒られた

```bash
% brew tap caskroom/cask
Error: caskroom/cask was moved. Tap homebrew/cask instead.
```

# 原因 : Homebrewに含まれるようになったから
今はもう何もしなくてもcaskは使えるということ。

```bash
# 試しにインストール対象を指定しないで打ってみた
% brew cask
==> Tapping homebrew/cask
Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask'...
# ...省略...クローンだけしてサブコマンド(installとか)がないって怒られた
Error: Invalid usage: No subcommand given.

# caskのバージョンは表示されるようになった
% brew -v                  
Homebrew 2.5.2
Homebrew/homebrew-core (git revision 2aea6b; last commit 2020-09-22)
Homebrew/homebrew-cask (git revision 7b828; last commit 2020-09-22)
```

## 対応 : 見なかったことにして何もしない
Docker x Laravel phpMyAdmin のコンテナを構築する

以前の記事([最強のLaravel開発環境をDockerを使って構築する【新編集版】](https://qiita.com/ucan-lab/items/5fc1281cd8076c8ac9f4))の[コメント](https://qiita.com/ucan-lab/items/5fc1281cd8076c8ac9f4#comment-6cb955aac0bed2872261)にてphpMyAdminを使用したいという要望がありましたので補足の記事を作成させていただきます。

## 手順

https://github.com/ucan-lab/docker-laravel

### docker-compose.yml に phpMyAdmin のサービスを追加

```yml:docker-compose.yml
volumes:
  # 追記
  pma-session-store:

services:
  # 追記
  pma:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_HOST=db
      - PMA_USER=phper
      - PMA_PASSWORD=secret
    ports:
      - 8080:80
    volumes:
      - pma-session-store:/sessions
```

### Dockerコンテナの構築

```
$ docker-compose up -d
```

### phpMyAdmin へアクセス

http://127.0.0.1:8080

上記のURLへアクセスし、phpMyAdminの画面が表示されればokです。

![ScreenShot 2020-09-22 19.11.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52879/29633d31-e598-456c-1adf-c03d76dd340b.png)

![ScreenShot 2020-09-22 19.11.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52879/74399120-6899-c2e7-352d-8567709350ca.png)

## 補足

### MySQL新認証プラグイン caching_sha2_password

私のdbコンテナの設定でMySQL8.0系で認証方式を新しいcaching_sha2_passwordに設定しています。phpMyAdminは5.0.1以降でないとcaching_sha2_passwordに対応していないのでタグで新しいバージョンを明示的に指定してます。latestが5系を指すようになったら外してもいいかもです。

## 蛇足

(MySQLのCLIやSequel Ace等のクライアントツールで特に不便がないのでがあるので個人的にはphpMyAdminは入れなくてもいいかなと思ってます)
apacheとは

アパッチとは、ウェブサーバのソフトであり、世界的に普及しているものである。

ホームページを見るとき、まず、ホームページを見るときに使うソフト（Webブラウザ）からホームページのファイルが置いてあるコンピュータ（Webサーバ）に対して「このページをおくれ」なお願いが出される。

これに対してウェブサーバーからブラウザへ、ページが送られます。

そして、返事を受け取ったウェブブラウザは受け取った内容（ホームページのファイル）を表示してくれる。
これが一連の流れ。


ここでウェブサーバーに注目。
実はウェブサーバー単体では、この見つけ出す行為をすることができない。
「Webサーバのソフトを入れることによって、Webサーバとしてのお仕事ができるコンピュータになる」

そのウェブサーバーのソフトで世界的に有名なのがapacheである。
MacとArduinoでC言語プログラミングするための準備

<p>「Arduino UNOをC言語で動かしたい！でもMACでどうやるのか分からない！」って悩んでたので、ネットで調べてみたら見つけました。</p>
<p>Homebrewをインストール後にターミナル上で、コマンドを順序よく実行すればいいです。</p>
<h3>準備すること</h3>
<p>Homebrewを正しくインストールする必要があります。</p>
<h3>インストール方法</h3>
<!-- <p>まずHomebrewのインストール。既にインストールしている人は、このコマンドは実行不要。
</p><pre  class="prettyprint lang-bash ">$/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"</pre>
--><p>Homebrewを使って、avr-gccとavrdudeのインストール。これだけです。
</p><pre  class="prettyprint lang-bash">$brew tap osx-cross/avr
$brew update
$brew install avr-gcc
$brew install avrdude
</pre>

<h3>ビルドと書き込み方法</h3>
<p>ここでは<b>main.c</b>というCのソースコードを<b>test.hex</b>にビルドし、Arduinoが接続されたポート<b>/dev/cu.usbmodem14101</b>に書き込んでおります。コマンド内のファイル名は、適宜書き換えてください。
</p><pre  class="prettyprint lang-bash">$avr-gcc -Os -Wall -mmcu=atmega328P main.c -o test.elf
$avr-objcopy -I elf32-avr -O ihex test.elf test.hex
$avrdude -c arduino -P /dev/cu.usbmodem14101 -b 115200 -p m328p -U flash:w:test.hex
</pre>

<h3>参考</h3><ul>
<li><a  href="https://github.com/osx-cross/homebrew-avr/" target="_blank">GitHub - osx-cross/homebrew-avr: Homebrew AVR Toolchain</a></li>
<li><a  href="https://auxin01.wordpress.com/2012/12/10/install-avr-gcc-from-homebrew/" target="_blank">avr-gccなどをHomebrewでインストールする | Ukkari blog</a></li>
<li><a  href="http://kemarin-tech.blog.jp/archives/23415917.html" target="_blank">kemarin-tech : avrdudeでAVRにバイナリコードを書き込む（Arduinoボードで書き込み）</a></li>
</ul>
ディレクトリ内の全ファイルを shred する方法

# ディレクトリを shred することはできない
ファイルやディスクを完全消去するコマンドとして `shred` コマンドというものがありますが、ディレクトリに対しては使用できません。

```shell
$ shred dir
shred: dir: failed to open for writing: Is a directory
```

`rm` や `cp` では `-r` オプションを付ければディレクトリを操作することができますが、`shred` にはそのようなオプションは存在しません。

では、ディレクトリ内に存在するすべてのファイルを完全消去したい場合にはどうしたら良いでしょうか。その方法を紹介します。

## Tips: rm コマンドが「完全消去」ではない理由について
`rm` コマンドでは完全消去にはならない理由については [こちら](https://ja.developers.noraworld.blog/delete-data-in-hdd-completely#rm-%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E3%81%AF%E3%83%80%E3%83%A1%E3%81%AA%E3%81%AE%E3%81%8B) を参照してください。

# 解決法
`dir` というディレクトリを完全消去したい場合、以下のコマンドを実行するだけです。

```shell
$ find dir -type f -print0 | xargs -0 shred -uvz
$ rm -rf dir
```

## 解説
### find dir -type f -print0
`find` コマンドで `dir` ディレクトリ内のファイルのみを相対パスで一覧表示します。`-type f` は「ファイルのみ」を表示するオプションです。

### xargs -0 shred -uvz
`xargs` コマンドを使って `shred` にファイル一覧を渡します。

`shred` のオプション `-uvz` はそれぞれ、shred 後にファイルを削除、進捗表示、ランダム値書き込み後に `0` 埋めをするオプションです。

### -print0 と -0 について
`find` コマンドの `-print0` と `xargs` コマンドの `-0` については以下を参照してください。

[findとxargsコマンドで-print0オプションを使う理由(改)](https://qiita.com/maskedw/items/2dfdf6fa7eee991ddc45)

### rm -rf dir
最後に結局 `rm` 使ってるんですが、これは空のディレクトリとシンボリックリンクを削除するためです。`shred` コマンドではあくまでディレクトリ内のすべてのファイル (シンボリックリンクを除く) を完全消去しただけで、残った空のディレクトリとシンボリックリンクまでは削除してくれません。なので `rm` コマンドで空のディレクトリとシンボリックリンクを削除します。

`rm` コマンドではなく、本当にファイルが `shred` コマンドで消えたのか不安な場合は `rm` 実行前に `tree` コマンドなどを利用して空のディレクトリとシンボリックリンクのみのツリーになっていることを確認すると良いでしょう。

# 参考
- [ファイル・ディスクの中身を完全消去](http://yang.amp.i.kyoto-u.ac.jp/~yyama/Ubuntu/strage/shred.html)
- [xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option](https://askubuntu.com/questions/1106805/xargs-unmatched-single-quote-by-default-quotes-are-special-to-xargs-unless-you)
Powershellで-Credentialにセキュアなファイルで資格情報を渡す方法

## はじめに
前回記事の続きで、Powershellでinvokeを使ってリモートでコマンドを実行するときにID/PWの情報をcredentialで渡す必要がある。
Get-Credential localhost\administratorでプロンプトが表示されてPWを入力するとID/PWが読み込まれるが、何度も入力（※）するのは面倒。
※Windowが開いてる間はキャッシュされています。

なので、ファイルでパスワードを読み込んでそれをcredentialに渡したい。ただ、PWを平文で渡すのは気が引ける…。
ということでなるべくセキュアな方法を調べました。

## 1.セキュアなパスワードファイルの作成
ConvertTo-SecureStringで平文からSecureStringに変換します。


```powershell
PS C:\windows\system32> $Pass = "ZAQ!2wsx"
PS C:\windows\system32> $Securepass = $Pass | ConvertTo-SecureString -AsPlaintext -force
PS C:\windows\system32> $Securepass
System.Security.SecureString

```
これだとファイルから読み出すことができないので、ConvertFrom-SecureStringでSecurestringから暗号化された文字列に変換します。

```powershell
PS C:\windows\system32> $encrypt = ConvertFrom-SecureString -SecureString $SecurePassword
PS C:\windows\system32> $encrypt
01000000d08c9ddf0115d1118c7a00c04fc…（割愛）
PS C:\windows\system32> $encrypt | Out-File C:\temp\encrypt.txt
```

これでセキュアなパスワードファイルができました。

## 2.credentialに渡してみる
Credentialに渡すときはSecureStringじゃないとだめなので、パスワードファイルをConvertTo-SecureStringで変換する。
変換したらCredentialに渡して使ってみる！

```powershell
PS C:\windows\system32> $encrypt = Get-Content C:\temp\encrypt.txt
PS C:\windows\system32> $pass = ConvertTo-SecureString -String $encrypt
PS C:\windows\system32> $cre =New-Object System.Management.Automation.PSCredential "administrator",$SecurePassword
PS C:\windows\system32> Invoke-Command 192.168.1.10 -credential $cre -scriptBlock {Get-NetFirewallProfile |select-object name,enabled}

name           : Domain
Enabled        : False
PSComputerName : 192.168.1.10
RunspaceId     : 75f9bf5a-7ec7-4a68-a56d-ca5f7b7694b3

name           : Private
Enabled        : False
PSComputerName : 192.168.1.10
RunspaceId     : 75f9bf5a-7ec7-4a68-a56d-ca5f7b7694b3

name           : Public
Enabled        : False
PSComputerName : 192.168.1.10
RunspaceId     : 75f9bf5a-7ec7-4a68-a56d-ca5f7b7694b3

```
できた！

## 3.複合してみる
本当に平文にできるかやってみた。SecureStringからSecureStringToBSTRをかましてPtrToStringBSTRで複合できた！

```powershell
PS C:\windows\system32> $encrypt = Get-Content C:\temp\encrypt.txt
PS C:\windows\system32> $pass = ConvertTo-SecureString -String $encrypt
PS C:\windows\system32> $pass
System.Security.SecureString
PS C:\windows\system32> $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pass)
PS C:\windows\system32> $BSTR
2674194756680
PS C:\windows\system32> $plaintext=[System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($BSTR)
PS C:\windows\system32> $plaintext
ZAQ!2wsx
```

## 参考URL
大変参考になりました！
https://www.vwnet.jp/Windows/WS08R2/PSPassword/SecurePassword.htm
pythonでプログラムを開始した時点からの時刻を出力する


pythonでプログラムを開始した時点からの時刻を出力するだけです。

```python:test.py
#-*- using:utf-8 -*-
import time

if __name__ == '__main__':
    start_time = time.time()

    while True:
        time.sleep(1);
        elapsed_time = time.time() - start_time
        print ("elapsed_time:{0}".format(elapsed_time) + "[sec]")
```

実行結果

```
$ python3 test.py
elapsed_time:1.0001800060272217[sec]
elapsed_time:2.0004279613494873[sec]
elapsed_time:3.0007290840148926[sec]
elapsed_time:4.001792907714844[sec]
elapsed_time:5.0019917488098145[sec]
```

# 参考
[time --- 時刻データへのアクセスと変換](https://docs.python.org/ja/3/library/time.html?highlight=sleep)
Homebewをインストールする方法

- 環境 : macOS Catalina バージョン10.15.6

# Homebrewをインストールする
1. [macOS（またはLinux）用パッケージマネージャー — Homebrew](https://brew.sh/index_ja)を表示する
1. [インストール]にあるコマンドをコピーしてターミナルに貼り付けて実行する
2. [GUI系のアプリも管理してくれるバッケージマネージャHomebrewCaskはもうインストールしなくても入ってるらしい](https://qiita.com/ponsuke0531/items/73f540391aa3827130d8)

```bash
% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
Password: {Macのログインパスワードを入力してEnter}
==> This script will install:
# ...省略...↓Enter↓
Press RETURN to continue or any other key to abort
==> /usr/bin/sudo /bin/mkdir -p /usr/local/bin /usr/local/etc /usr/local/include /usr/local/lib /usr/local/sbin /usr/local/share /usr/local/var /usr/local/opt /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var/homebrew /usr/local/var/homebrew/linked /usr/local/Cellar /usr/local/Caskroom /usr/local/Homebrew /usr/local/Frameworks
# Xcodeのコマンドツールが必要になるけれど自動でインストールしてくれる
Downloading Command Line Tools for Xcode
Downloaded Command Line Tools for Xcode
Installing Command Line Tools for Xcode
Done with Command Line Tools for Xcode
Done.
==> /usr/bin/sudo /bin/rm -f /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress
# ...省略...↓これが出たら完了！
==> Installation successful!
# ...省略...あとは寄付のお願いとか情報がお知らせされる
```

# あとはやりたいことをやる
[Homebrewを使う時に参考になりたいリンク集 - Qiita](https://qiita.com/ponsuke0531/items/c72911a37dedc7a45b5a)
RandomForestのサイズ・処理時間比較

#概要
ランダムフォレストを使った予測の精度に関する記事はよく出てくるがモデルのサイズや学習時・予測時の時間について載っている記事が見当たらなかったので比較してみた。
今回はscikit-learnに入っているbostonデータ（レコード数：506、カラム数：13）を使って学習・予測を行う。
RandomForestでよく扱われるパラメータのn_estimators(木の数)とmax_depth(最大の木の深さ)、レコード数を変化させて測定した。
なお、レコード数をn=506, 5060, 50600と元々の件数から増やしているが、かさ増しする際には各値をランダムに10%増減させて極力重複データを作らないようにしている。

#モデルのサイズ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259220/b44ff5a3-d3ba-73d2-1d30-d1eb715e7c8c.png)

ランダムフォレストの木の数とモデルのサイズは単純に比例していることがわかる。
最大の木の深さとモデルサイズに関しては深さが1つ大きくなるごとにおよそ1.5倍～2倍になっていることが分かった。
これは二分木の最大深さが1つ深くなるごとにノードの数が高々2倍になることと、レコード数が多くなるほど分岐が増えることからも予想できる。

#モデル作成時の処理時間
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259220/4880ec2e-b683-a054-2d9d-bd7fb0a4c07b.png)
モデル作成の処理時間に関しては木の数、最大深さ、学習データサイズそれぞれに対して比例しているようだ。


#予測時の処理時間
予測時はn=5060で作成した学習モデルを使用し、predict関数を使ってデータを予測する際の時間を計測した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259220/150f810b-8276-7f36-f302-b9dc1db9493d.png)
予測時の処理時間に関しても木の数と木の深さに対して処理時間は比例していることがわかる。
一方で意外なことに予測をさせるレコード数に関しては一切増加せず、試しに１億データ程で予測を行っても処理時間は変わらなかった。


#最後に
本当はカラム数も変化させたかったがうまいやり方が見つからなかったので今回はスルーした。
この結果は当然データの傾向よっても変わってくると思うので参考までにしてほしい。
Prism コードサンプル学習：03-CustomRegions

# Prism コードサンプル学習：03-CustomRegions

## はじめに

以下の記事の続きです。
<https://qiita.com/mngreen/items/14ad9c89fef988d7c4e5>

## 03-CustomRegions

本サンプルではRegionAdapterBaseクラスを用いて、既存のコントロールに領域の名称を与えるサンプルのようです。

```xml
<Window x:Class="Regions.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:prism="http://prismlibrary.com/"
        Title="Shell" Height="350" Width="525">
    <Grid>
        <StackPanel prism:RegionManager.RegionName="ContentRegion" />
    </Grid>
</Window>
```

```csharp
    public class StackPanelRegionAdapter : RegionAdapterBase<StackPanel>
    {
        public StackPanelRegionAdapter(IRegionBehaviorFactory regionBehaviorFactory)
            : base(regionBehaviorFactory)
        {

        }

        protected override void Adapt(IRegion region, StackPanel regionTarget)
        {
            region.Views.CollectionChanged += (s, e) =>
            {
                if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
                {
                    foreach (FrameworkElement element in e.NewItems)
                    {
                        regionTarget.Children.Add(element);
                    }
                }

                //handle remove
            };
        }

        protected override IRegion CreateRegion()
        {
            return new AllActiveRegion();
        }
    }

    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : PrismApplication
    {
        ... (省略) ...

        protected override void ConfigureRegionAdapterMappings(RegionAdapterMappings regionAdapterMappings)
        {
            base.ConfigureRegionAdapterMappings(regionAdapterMappings);
            regionAdapterMappings.RegisterMapping(typeof(StackPanel), Container.Resolve<StackPanelRegionAdapter>());
        }
    }
```

- ConfigureRegionAdapterMappingsメソッドで、領域のマッピングが登録される
  - ConfigureRegionAdapterMappingsメソッドはBootstrap.Runメソッド内で呼び出される
- RegionAdapterBase\<T\>クラスは[こちら](https://github.com/PrismLibrary/Prism/blob/master/src/Wpf/Prism.Wpf/Regions/RegionAdapterBase.cs)
  - AdaptメソッドはInitializeメソッドの中で呼び出される
  - AdaptメソッドでViewに追加された子要素に対して、追加・削除時の処理を実装できそう
  - IRegionAdapter.Initializeメソッドの中でこのクラスで実装されているInitializeメソッドで呼び出される。
    - 上記のインターフェース+メソッド名で定義されるのは[明示的なインターフェースの実装](https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/interfaces/explicit-interface-implementation)
  - CreateRegionメソッドも同様にInitialilzeメソッドの中で呼び出される。
    - AllActiveRegionクラスは[こちら](https://github.com/PrismLibrary/Prism/blob/master/src/Wpf/Prism.Wpf/Regions/AllActiveRegion.cs)
    - Regionはアクティブである状態と非アクティブである状態を持つ
      - プロパティの意味が[定義先](https://github.com/PrismLibrary/Prism/blob/master/src/Wpf/Prism.Wpf/Regions/ItemMetadata.cs)を見ても分からなかった。ただ、字面から推測する限り、アクティブなRegionであるか状態を管理することで、パフォーマンスを向上させられたりできる？と思われる。

## おわりに

今回はRegionAdapterBaseクラスのソースコードを中心に読みました。
一部現段階ではわからない実装もあるため、それを明らかにできるように引き続き読んでいきます。
次回、04-ViewDiscoveryについて見ていこうと思います。
クロージャのイメージ図

# はじめに

今回の質問（Qiitaでの質問ではありません）

> クロージャで外側の変数が参照できるというのは理解できるが納得はできない。関数内の変数[^1]（引数含む）は関数が終了したら消えるのではないか？変数はどこかに保持されてるのだろうけど具体的にどこにあるのか。

[^1]: 正確には変数が参照しているオブジェクト

これに対して

「まずはそういうものだと思わないといけない。それ以上知りたいのならPythonのソースを読まないといけない。ちなみに関数（クロージャ）に結び付けられている」

と答えたのですが、もう少し考えたところ、

「そもそも関数が終了したら変数が消えるという概念自体どこから学んだのか（消えるけど）。なお言語実装に関する知識（つまりスタック上に変数が確保される[^2]という知識）はないものとする」

[^2]: ここら辺の詳しい話は[こちら](https://qiita.com/junjis0203/items/7d3e63253a3d291a04c6#%E9%96%A2%E6%95%B0%E3%81%AE%E5%AE%9F%E8%A1%8C%E6%96%B9%E6%B3%95%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E5%A4%89%E6%95%B0)もご参照ください

ということが気になりました。
そんなわけで今回はここら辺の概念を絵で説明しようと思います。

# 関数と変数と関数の終わり

クロージャの前にまず普通の関数です。

```py:普通の関数
def add(a, b):
    return a + b

add(2, 3)
```

最終行では`a`を2、`b`を3としての`add`の呼び出しが行われます。これを図に描くと以下のようになります。

![func_exec_state1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141091/4fbd0b39-8cdf-8a15-f32b-bfa49ad4ae60.png)

「addの実行状態」としているのはこの後で説明する「関数が終了する際の動作」のためですが（「add」とすると話が正確でなくなります）、ともかく「2」というオブジェクトに対して実行状態から`a`の矢印、「3」というオブジェクトに対して`b`の矢印が出ています。a, bが上下逆なのはこの後で描く図に合わせるためなのであまり気にしないでください。

`add`が終了するときには「addの実行状態」が消えます。すると当然実行状態から出ている`a`, `b`の矢印も消えます。これが「関数が終了すると変数が消える」状況です。

![func_exec_state2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141091/fcd948b7-d10f-7438-cd0f-6d5968f645f8.png)

# クロージャと変数

さてここまでで「関数が実行されるときの変数のイメージ」、「関数が終了するときの変数のイメージ」を説明してきました。これを踏まえてクロージャに進みましょう。なお無駄な`b`変数がいますが話の都合です。

```py:クロージャ
def make_adder(a, b):
    def adder(x):
        return x + a
    return adder

adder3 = make_adder(2, 3)
adder3(4)
```

`make_adder(2, 3)`呼び出しが行われ、`make_adder`の`return`手前（つまり`adder`が定義された後）時点を図に描くと以下のようになります。つまり、`a`が指している「2」は`make_adder`（の実行状態）からも`adder`からも参照されていることになります。[^3]

![func_exec_state3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141091/5aa86045-23cb-023f-3162-0401f98c2c3d.png)

[^3]: 「make_adder実行状態」から出ている矢印も指されているものも`adder`となっていますがこれは「関数自体にadderという名前が付いている」ので誤りではありません。

`make_adder`が終了するときには普通の変数と同様に実行状態が消えます。ただし、青で書いている`adder`本体はreturnされているので消えません。そして、`adder`から参照されている`a`（が指す「2」）も消えません。

![func_exec_state4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141091/864e2fa3-7eca-cb4e-9e6d-b467ba03a0be.png)

このようにして`a`（が参照しているもの）が残るため、その後に`adder3(4)`と呼び出されると保存されていた「2」を取り出して使うことが可能になります。

![closure_exec_state.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141091/a519439b-d987-c434-5d7b-f0884f1c033b.png)

おしまい。
あっ、nonlocalは多分もう少しめんどくさいことしてると思いますが調べたことないので省きます。

# 参考

[【Python】クロージャ(関数閉方)とは](https://qiita.com/naomi7325/items/57d141f2e56d644bdf5f)
変数がどう保存されているのか等について詳しく書かれています。

[Pythonを読む/クロージャ](http://dzeta.jp/~junjis/code_reading/index.php?Python%2F%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%B8%E3%83%A3)
2年半ほど前に「クロージャの実装詳細」を読んだ時のメモです。
BigQuery - 制限事項

# はじめに
Bigqueryのデフォルト制限に関して記載します。

# テーブル関連
- 1 日あたりのテーブルあたり読み込みジョブ数
    - 1,500 個（失敗を含む）
- １ 日あたりの１テーブルあたりのupdate制限
    - １０００
PHPでconfigファイルをオートロードで呼び出す方法

Laravelをやっているとconfigから値を呼ぶことがあります。
同様に素のPHPでも使いたいなと思ったのでやり方を書いておきます

```Config.php
<?php
class Config {
	protected static $directory;
	public static function setConfigDirectory($directory) {
		self::$directory = $directory;
	}

	public static function getConfigDirectory() {
		return rtrim(self::$directory, '/\\');
	}

	public static function get($s) {
		$values = preg_split('/\./', $s, -1, PREG_SPLIT_NO_EMPTY);
		$key = array_pop($values);
		$file = 'common.php';
		$path = (!empty($values)) ? implode(DIRECTORY_SEPARATOR, $values) .
			DIRECTORY_SEPARATOR : '';
		$base_dir = self::getConfigDirectory() . DIRECTORY_SEPARATOR;
		$config = include($base_dir . $path . $file);
		return $config[$key];
	}
}
```
これの他に``config/common.php``を作ってください

```common.php
<?php
return [
    'STRIPEKEY' => 'abc',
    'ZOOMKEY' => '123',
];
```
読み込みたいファイルで

```example.php
<?php
require_once 'Config.php';
Config::setConfigDirectory(__DIR__ . '/config');
```
これを追記してください

蛇足ですが、``require``, ``include``の違いは

```
ファイルが読み込めなかった場合
require文の場合はFatalエラーで処理が終了するが
include文の場合はWarnigエラーで処理が継続されることです
```
require_once, include_onceの違いは

```
同じファイルを読み込んだ場合に
_once文は一度しかファイルを読み込まないが
require, include文は何度でも読み込むことです
```
``つまりほとんどの場合はrequire_onceでいいですね``

gitにpushするときは

```php:.gitignore
config/
Config.php #任意
```
を追記すればいいでしょう

```example.php
<?php
require_once 'Config.php';
Config::setConfigDirectory(__DIR__ . '/config');
echo Config::get('STRIPEKEY'); //abc
echo Config::get('ZOOMKEY'); //123
```

読み込むのがめんどくさいときはオートロードしましょう
オートロードはクラスを利用する際に自動的にそのクラスが定義されているファイルを読み込む機能です
処理上のオーバーヘッドを防ぐために使うといいですね！
``spl_autoload_register()``関数を使う
オートロードの処理をコールバック関数として任意のタイミングで登録できて
``__autoload()``関数と違って複数のオートロード関数を登録しておくこともできる

```lib/autoload.php
<?php
spl_autoload_register(
    function($class_name)
    {
        $filepath = __DIR__ . '/' . $class_name . '.php';
        if (is_readable($filepath)) require $filepath;
        if ($class_name == 'Config') Config::setConfigDirectory(__DIR__ . '/config');
    }
);
#複数作ると必要なクラスの定義が見つかるまで登録した順にコールバック関数が実行される
```
それを読み込もう

```example.php
<?php
require 'lib/autoload.php';
echo Config::get('ZOOMKEY'); //123
```

これでおっけい！
マネジメントコンソールの呼び方は？

# 呼び方は？
みなさん、AWS（アマゾン ウェブ サービス）使ってますか？
使っている方はおなじみの **マネジメントコンソール** ですが、何と呼んでいるでしょうか。

略さず、 **マネジメントコンソール**
略して、 **マネコン**
のどちらかが多いのではないでしょうか。

# 私の職場では
私の職場では、前者の「マネジメントコンソール」と呼ぶメンバーばかりです。
実は、私もずっと「マネジメントコンソール」と略さずに呼んでいたのですが、
半年（？）ほど前に「マネコン」と略すのをネットで見かけて、
これは言いやすいと「マネコン」に鞍替えしたのですが、なかなか浸透せず。。。
誰も「マネコン」と言わないので、ちょっと恥ずかしくもあり。。。

Windowsの「コントロールパネル」を「コンパネ」と呼ぶのと同じ感じなんですけどね。
レビューで大事にしたいリーダブルコードのポイント

# はじめに
「リーダブルコード読んだことありますか？」 と聞かれれば、多くのプログラマが「YES」と答える（であろう）名著。
「リーダブルコードどれくらい覚えてますか？」 と聞かれれば、自分は「はて？」となる名著。

完全に独断と偏見ですが、一度自分が大切にしたいこと・伝えていきたいことを
まとめてみようと思います。

特に業務の中でレビューアになることが多いので、
レビューアとして大事にしてきたこと、これから大事にしていきたいことをまとめてみたいと思います。

# レビューで大事にしたいポイントベスト16

|No.|ポイント|部/章|選定理由|
|--:|:--|:--|:--|
|1|コードは他の人が最短時間で理解できるように書かなければいけない|1部1章 理解しやすいコード|理解しやすいコードの冒頭、鍵となる考えの一文ですが、良いコードの根幹となる考えだと思います||
|2|明確な単語を選ぶ|1部2章 名前に情報を詰め込む|非常に大事ですが、実はシステムや業務に対する深い理解が問われていると思います、ここで明確な単語をチョイスできているかがそのままシステムや業務への理解度を表す気がします|
|3|tmpやretvalなどの汎用的な名前を避ける|1部2章 名前に情報を詰め込む|迷うとやりがちですが、本当に避けられないのかあるいはこの場面では妥当なのかレビューではよく見るポイントにしています|
|4|最善の名前とは、誤解されない名前である|1部3章 誤解されない名前|読んで誤解しないか、明確な名前をつけ間違えていないかに気をつけてみています|
|5|限界値を含めるときは min と max を使う|1部3章 誤解されない名前|min/maxに限らないですが、よく使う事象の対比があると意味を推測しやすくなります。似た単語も多いので矛盾が生じていないか気を付ける箇所でもあります|
|6|コメントのためのコメントは書かない|1部5章 コメントすべきことを知る|コメントは書くことで将来（近くも遠くも）の助けになりますが、単純にコストにもなります。ルールや義務感、前例に習うコメントではないか、書かない方が良いかも考えさせられる一言です||
|7|入出力のコーナーケースに実例を使う|1部6章 コメントは正確で簡潔に|これは実際入出力がある関数、特に切り捨て・切り上げを複雑に行っている場合などはすごく助かります..テストコードも一つの解決法ですが、テストコードができない理由がある場合はコメントにあるだけでもとても助かります..|
|8|コードの意図を書く|1部6章 コメントは正確で簡潔に|No.6 の反対かなと個人的には思いますが、意図を示してくれたコメントは積極的に残しておけば良いと思います|
|9|関数から早く返す|2部7章 制御フローを読みやすくする|本の中では短く記載されていますが、現実でも真っ先に考えて実践するものだと思います、Swiftだとguardもありますが、言語全般で意識するものだと思います|
|10|ネストを浅くする|2部7章 制御フローを読みやすくする|関数から早く返すと通じますが、ネストを浅くすることがそもそも意識することです|
|11|説明変数|2部8章 巨大な式を分割する|有名なプログラマである中嶋聡さんのメルマガかブログを読んでいたときにこの話があり、非常に納得したのですが、一度変数に出すことでわかりやすさが上がるので意識するようにしています。反対にループの中の変数などは気を付けるようにしていますが..|
|12|ド・モルガンの法則を使う|2部8章 巨大な式を分割する|ちょっと違いますが、「否定の否定は使うな」と言われたことを思い出します。表現でどちらか一方の概念で読めるようにする。頭を使う回数を減らす条件式にできないか気をつけています|
|13|巨大な文を分割する|2部8章 巨大な式を分割する|処理をまとめられないか、意味のある一つにできないかをレビューの中では見るようにしています|
|14|変数のスコープを縮める|2部9章 変数と読みやすさ|状態を持つ変数が増えるのは該当機能を理解することの難易度を上げます、もちろん状態を消すことに力を入れてもしょうがないですが、消せるものは消す方が良いです。。大体不具合の温床になるので。。|
|15|プロジェクト固有のコードから汎用コードを分離するということ|3部10章 無関係の下位問題を抽出する|まとめで太文字になっている部分ですが、「安定している場所と安定しない場所を見極める」とよく言われました。業務から遠くてシステムに近い部分は安定する場所に該当します。そこはコードを分離できます。|
|16|コードを小さく保つ|3部13章 短いコードを書く|13.3 のタイトルそのままですが、短いコードになるようコードを整えられないか、実例も記載されているので実践するようにしています|

# まとめ
中身はだいぶグダグダになりましたが、少なくとも自分自身が今何を大事に思っていて、
またどこを体験し切れていないのか（多分、上がってるのが少ないのがそう..）を整理することにはつながりました。

名著なので自分でもまた振り返ることがあると思いますが、次はもっと綺麗に整理したいです..
時価総額を上げるには、特許を取れば良い？

![時価総額 と 特許.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76072/4dbdbc5e-5d49-d641-c452-e0af37265004.png)
##０．結論
（１）時価総額と特許数の間には、相関関係が見られる。

（２）因果関係とは言いにくいが、特許数に象徴される高い技術力が市場で評価されて、結果的に時価総額が高くなっていると考えたい。
##１．問題意識
　IT関連の企業は、技術力と収益性が評価され、高い時価総額を達成していると考えている。GAFAと言われるGoogle,Apple,Facebook,Amazonは、その典型だ。これらの企業は、コロナに苦しむ非IT系企業とは対照的に、高い時価総額を達成している。

　技術力の高さの評価は難しいところだが、分かりやすい指標として、出願した特許数で考えると、特許数と時価総額には、正の相関関係があるものと推測している。

　その仮説が正しいのか否か、検証してみることとした。
##２．事前準備
　コロナで外出が制限され、モノを買うときに、Amazonや楽天、ヤフーに頼ることが加速した。そこで、今回、検証に使う銘柄は、Amazon、楽天、ヤフージャパン、メルカリの４社とした。

　実を言うと、Amazonは時価総額が異次元に高すぎて、比較対象にするのは適切とは言い難かったが、まあ、トレンド的には間違っていなかったので、その特殊性も含めて、正直に結果を記載しよう。

　時価総額は、[Yahoo!ファイナンス（日本株）](https://info.finance.yahoo.co.jp/ranking/?kd=4)や[Yahoo!ファイナンス（米国株）](https://stocks.finance.yahoo.co.jp/us/ranking/?kd=4&tm=d)から取得させて頂いた。この場を借りて、御礼　申し上げます。ありがとうございました。

　特許については、[Google Patents](https://patents.google.com/)で、米国、日本、PCT（国際出願）において、優先日が2015年以降である出願数を出願人名を基に調べてみた。
##３．調査結果
![時価総額と特許.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76072/861a6f5b-a2f2-a0b7-ee26-65817d2f416f.png)

　数字は、本日（2020年9月22日）現在です。但し、Amazonの時価総額はザックリです(笑)。Amazonの時価総額の上昇は、正直、信じられない勢いです。2015年にウォールマートを抜いて世界最大の小売業になったのだけど、その時の時価総額は33兆円です。わずか５年で時価総額が５倍　:scream:[（参考記事）](https://www.bloomberg.co.jp/news/articles/2015-07-24/--icgy295o)
##４．見える化
　数字だけだと、良く分からないので、グラフにしよう。まずは、Amazonを含んだグラフ。これは、予想通り、異次元を含むので、勝負にならない。
![時価総額 と 特許 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76072/904f0ce4-7c92-0859-7576-92ff355fb094.png)
　相関係数は９割近いので、時価総額と特許出願数に明確な「正の相関関係」は認められるけど、グラフとしては美しくない。

　と、言うことで、世界企業と比較することは諦めて、国内リーグを見てみよう。グラフは冒頭と同じだけど、再掲する。
![時価総額 と 特許.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76072/26dd75ab-7639-a813-e0f9-c003d203100c.png)

　相関係数が0.985と非常に高くなっている。楽天が、特許出願数に比べて、時価総額が高くなっている。個人的には、もっと特許出願を増やせる企業だと思うし、それにつれて、時価総額もアップするのかもしれない。
##５．最後に
　企業にとって、大切なのは収益や時価総額だと思うけど、それは結果論。それら、大切な収益や時価総額を左右するのが、企業戦略であり、戦略に基づいた知財戦略（どんな特許を取得するか）だと思う。この考え方を表にまとめてみた。参考になれば、幸甚だ。
![時価総額と特許 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76072/d8aab3be-06f3-80d1-5c6f-093efb786bea.png)
redirect_toの使用方法

#はじめに
redirect_toはリダイレクト先をURLの他にも指定する場合に使用する。決められたコントローラーのアクション以外のアクションなどを実行させ、選択したビューファイルを表示させることが可能。

#URLで指定
URLを指定してリダイレクトする

```
redirect_to "URL名"

#Qiitaトップページへのリダイレクト
redirect_to "https://qiita.com/"
```

#アクションで指定
同一コントローラのアクションを指定してリダイレクトする

```
redirect_to action: :アクション名

# indexアクションへリダイレクト
redirect_to action: :index
```

#指定コントローラのアクションで指定
コントローラとそのアクションを指定してリダイレクトする

```
redirect_to  controller: :コントローラー名, action: :アクション名

# usersコントローラーのnewアクションへリダイレクト
redirect_to  controller: :users, action: :new
```
#前のページを指定
一つ前のページにリダイレクトする

```
redirect_to :back
```

#pathを指定
routeのpathの指定先にリダイレクトする

```
redirect_to パス名

redirect_to user_session_path
```
爆速でWindows10の環境を用意する

ヤフオクでリースアップマシンを探すと色々と出てきます。
幾つか探して見つけたのは、Dell OptiPlex 3020 のマシン。

Core i3 4170/SSD120GB/RAM4GB/OS付き/office付き
2020年4月時点で約1万円で購入はなかなか素敵。


本当は FUJITSU Server PRIMERGY TX1310 M3 がお奨めと知り合いからお聞きしましたが丁度良い品物が見つからず。
ひとまずもう少し様子を見ることになります。

メーカーサイトで仕様を見てみると、とても魅力的ですね。

https://jp.fujitsu.com/platform/server/primergy/products/lineup/tx1310m3/product.html
Vue 3 の Composition API の勉強のため TODO List のハンズオンを更新してみた

Vue 3 が出たみたいなので、昔軽く作ってた TODO List を表示して追加・更新できる簡単なサンプルを作る手順を書いたハンズオンを Composition API に更新してみました。

https://github.com/runceel/VueJSCRUDHandsOn

出来上がりは ↓ のような感じになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70288/0804cb6f-92dd-8548-056a-c326a94942a6.png)

とりあえずドキュメント軽くみて雰囲気で作ったので何かおかしいところがあるかもしれないので、あったら何か教えてください。
Goでinterface引数の型がポインタのときに、ポインタの先が示す型を判別する

`reflect.ValueOf`, `reflect.Value.Elem` を組み合わせるとできる。
（この方法はユーザー定義の型ではなく、言語がデフォルトで用意する型を判別するもの）

```go
package main

import (
    "fmt"
    "reflect"
)

func check(i interface{}) {
    // interfaceのValueインスタンスを取得
    v1 := reflect.ValueOf(i)

    // ポインタの場合、さらにその先にある型を取得する処理に進む
    if v1.Kind() == reflect.Ptr {
        // Elemを利用して、ポインタの先のValueインスタンスを取得
        v2 := reflect.ValueOf(v1.Elem())
        // Kindを呼ぶと、ポインタの先にある型情報が得られる
        fmt.Println(v2.Kind())
    }
}

type Foo struct {}

func main() {
    s := Foo{}
    check(&s) // struct
}
```
【物体検出】Window Base物体検出

window baseのobject detectionに関してwindowをスライドするのか〜ぐらいにしか理解していなかったので、まとめてみた。

<h1>処理手順</h1>
1. 様々なサイズや縦横比(aspect ratio)のwindowを定義する

2. 1で定義したwindowをそれぞれ画像の左端から右端まで少しずつスライドさせていく

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/64e2682b-543e-e6ea-15d8-bf6ca466fdb4.png)
3. windowでくり抜いた画像をfixしたサイズにresizeする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/5371bec1-2526-8ddc-13ee-2feed39ecfc9.png)
4. 画像分類器を用いて物体が何であるかを推定すれば、車や人などwindow内の物体が何であるか判別出来る。
画像分類器に関しては良ければ参考に
https://qiita.com/minh33/items/a8b77d7fb809385632ea

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/f999a594-ba0f-02be-0546-f4a3176dbc8c.png)
=> CARってClassifyされば正解！

プログラムで書くとわかりやすい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/9726e6bb-ecbf-4dd6-0980-9bf3773402a7.png)



<h1>参考文献</h1>
What do we learn from region based object detectors (Faster R-CNN, R-FCN, FPN)?
https://medium.com/@jonathan_hui/what-do-we-learn-from-region-based-object-detectors-faster-r-cnn-r-fcn-fpn-7e354377a7c9
Window Based Object Detection
https://www.youtube.com/watch?v=jgACj-1zbQw
C4W3L03 Object Detection
https://www.youtube.com/watch?v=5e5pjeojznk
【Chrome デベロッパーツール】ライトモードとダークモードの切替方法

#はじめに

私は常時ダークモードにてブラウジングをしています。
最近ではダークモードに対応したWebサイトも多いのですが、それ故にライトモードでのWebサイトのデザインを拝見する際に、私はOSからその都度ダークモードの設定を解除していたため、煩わしさを感じていました。

ライトモードでのデザインが見たい！　→　OSの設定からライトモードへ切替　→　閲覧　→　再び元の設定に戻す

を繰り返さなければならず面倒でした。

しかしChromeのデベロッパーツールで簡単に切り替えが可能だということを知ったのでこちらにその手順を記載させていただきました。

手順は以下の通りです。


##1.Chromeデベロッパーツール（検証）を開く

閲覧したいページ上でダブルタップや右クリック等で”検証”を開きます。

![スクリーンショット 2020-09-22 17.30.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691642/1561818a-f4f1-a611-2fdf-d8f904987d28.png)
(表示中のページに"Webクリエイターボックス"をお借りしています。こちらのページではダークモード対応だけではなく切替バーなども実装されているようです。）


##2.Renderingパネルを開く

(1)Ctrl+Shift+P（macOSはcommand+shift+P）を押してツール内検索画面を開きます。

(2)"Show Rendering"を入力し、候補から選択します。

![スクリーンショット 2020-09-22 17.31.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691642/c3a1d00d-5ef6-5d35-3a49-c4896980cc32.png)

##3.表示の切替をする

”Emulate CSS media feature prefers-color-scheme”からモードの切替を行い、ページを確認します。
![スクリーンショット 2020-09-22 17.43.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691642/b227743a-4e4a-a229-9d03-7b37570df9a9.png)


#さいごに
ダークモードは、視覚に過敏性を持つ人にとっては優しいデザインだと言われています。
私も明るいところが苦手でPCの輝度も可能な限り下げて作業していることが多いですが、ダークモードにしていると画面から受けるストレスや目の疲れなんかもいくらかは楽な気がします。

一般的に言われている、バッテリーの劣化を抑制する効果だとか睡眠の妨げになりにくいということについては詳しくないのですが、ダークモードに限らずみんながストレスなく閲覧できるデザインのWebサイト・サービスがこれからもっと増えればいいなと願っています。
Gitコマンド

#リポジトリを作成

- [GitHubでリポジトリ作成](https://github.com/new)

作成後に表示されるURLをメモしておく

- 作業フォルダを作成し、移動する

（後のローカルリポジトリなので、1で作成したリポジトリ名に合わせると良い）


```
$ mkdir work

$ cd work
```

- ローカルリポジトリとして初期化する

```
$ git init
```

- ファイルをインデックスと呼ばれる領域に登録する(ステージングという)

```
$ git add ファイル名
```

- ステージングしたファイルをコミットする

mオプションでコミットにメッセージを付与

```
$ git commit -m "first commit"
```

- リモートリポジトリに登録

```
$ git remote add origin メモしたURL

$ git push origin master
```

#リモートブランチを取り込む

- リモートブランチの変更を取り込む

```
$ git pull origin ブランチ名
```

- ローカルリポジトリにローカルブランチを作成

```
$ git checkout -b ブランチ名 origin/ブランチ名
```
seleniumでスクレイピング

# 動的に書かれたサイトをseleniumでスクレイピング

JS等で書かれたサイトだとただBeautifulSoupとかでスクレイピングしようとしても出来ない場合があります。
そんな場合に使えるのがseleniumです。

## chrome driverを入手
#### まずchrome のバージョンを調べます。
(Macの場合）
1. chromeを開いた状態で、画面左上の「chrome」をクリック
2. 「Google chromeについて」をクリック
3. 「設定-Chromeについて」というページが開かれるので、そこに表示される
　　バージョン: 8？.〜〜〜〜という部分を確認します。

#### ダウンロードページでChrome Driverを入手します。
[ダウンロードページ](https://chromedriver.chromium.org/downloads) で、

以下の部分から、上で調べたバージョンに合致するchrome driverをダウンロードします。
（ページリンク先でOSを選択します。）
![スクリーンショット 2020-09-22 17.43.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287296/a692797b-ddde-fbd8-9319-fe4013cb0e01.png)

## 使い方

```.py
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time

url="~~~~~~"#ここに開きたいURL
options = Options()
options.add_argument('--headless') #ヘッドレスモードを有効
Driver_path="~~~~~~"　#ダウンロードしたchromeドライバーを置いた場所を指定
driver = webdriver.Chrome(Driver_path,options=options)
driver.get(url)
time.sleep(2)
html = driver.page_source.encode('utf-8')
soup = BeautifulSoup(html, 'lxml')
#この後は普通にBeautiful Soupの文法通り使える。
```

optionをつけることによって、driver.getするたびにページが開かれてしまうことを防いでいます。
（これによって、処理速度が多少早くなります。）

参考
-
[Seleniumを安定稼働させるために行うべき３つの設定(Headlessモードにも対応)](https://tanuhack.com/stable-selenium/)
SQLite3からPostgreSQLに変更

## 背景
プロジェクトの作成時に

```
rails new sample_app -d postgresql
```
とするところを

```
rails new sample_app -D postgresql
```
としていたので、ポスグレが設定されていたなかった。

Gemfileで

```
# Use postgresql as the database for Active Record
gem 'pg'
```
となっていてほしいところが、

```
# Use sqlite3 as the database for Active Record
gem 'sqlite3'
```
となっていた。

sqlite3ってのがデフォルトのやつなのかな。

## SQLite3からPostgreSQLに変更

https://qiita.com/rubys8arks/items/0749d6fa73e88d3d381c
これを参考に変更していこう。

ポスグレ自体はインストールされているので、
Gemfileの`sqlite3`のところを

```
# Use postgresql as the database for Active Record
gem 'pg', '>= 0.18', '< 2.0'
```

に変更して、`bundle install`する。

この状態だと、`rails db:create`できない

```
bin/rails db:create
rails aborted!
LoadError: Error loading the 'sqlite3' Active Record adapter. Missing a gem it depends on? sqlite3 is not part of the bundle. Add it to your Gemfile.
```

## database.ymlの編集
before

```
# SQLite version 3.x
#   gem install sqlite3
#
#   Ensure the SQLite 3 gem is defined in your Gemfile
#   gem 'sqlite3'
#
default: &default
  adapter: sqlite3
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000

development:
  <<: *default
  database: db/development.sqlite3

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: db/test.sqlite3

production:
  <<: *default
  database: db/production.sqlite3
```
after

```
default: &default
  adapter: postgresql
  encoding: unicode
  # For details on connection pooling, see Rails configuration guide
  # https://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

development:
  <<: *default
  database: sample_app_development

test:
  <<: *default
  database: sample_app_test

production:
  <<: *default
  database: sample_app_production
  username: sample_app
  password: <%= ENV['SAMPLE_APP_DATABASE_PASSWORD'] %>
```

## .envにパスワード
ここは省略

## データベースの作成

```
-> % bin/rails db:create
Created database 'sample_app_development'
Created database 'sample_app_test'
```
AWS SAA対策 IAMまとめ

# はじめに
初投稿です。
AWS SAAに合格するためにUdemyでAWSの各サービスについて学習し、各サービスの特徴を要約してみました。
今回はIAMについての要約になります。

## IAMとは
- IAMの主要トピックはユーザ、グループ、ポリシー、ロールの4つ
## ルートユーザー
- AWSアカウント作成時に作られるIDアカウント
- 全てのAWSサービスとリソースを使用できる権限を有する
- 日常的なタスクはルートユーザーを使用しないことが強く推奨される
- (パワーユーザはIAMユーザやグループの管理以外の全てのAWSサービスにフルアクセス権限を有する物で別のもの)
- ルートユーザにしかできない操作権限が存在する
1. AWSルートアカウントのメールアドレスやパスワードの変更
2. IAMユーザの課金情報にアクセスに関するactivate/deactivate
3. 他のAWSアカウントへのRoute53のドメイン登録の移行
4. CloudFrontのキーペアの作成
5. AWSサービス(サポートなど)のキャンセル
6. アカウントの停止
7. コンソリデイテッドビリングの設定
8. 脆弱性診断フォームの提出
9. 逆引きDNS申請

## IAMユーザー
- IAMポリシー内でAWSサービスを利用するユーザ。基本操作はIAMユーザで実施する
- 一アカウントで5000ユーザーまで作成可能
- 設計内容
1. ユーザー名
2. パス(オプション)
3. 所属グループ(最大10グループまで設定可能)
4. パーミッション(AWSサービスへのアクセス制限)

## IAMグループ
- 一アカウントで100グループまで作成可能
- 設計内容
1. グループ名
2. パス(オプション)
3. パーミッション(グループに設定したパーミッションはIAMユーザーに付与したパーミッションと同時に評価する)

## IAMロール
- AWSリソースに対してアクセス権限をロールとして付与できる

- ルートユーザーのアクセスキーを極力使わずに個々のIAMユーザを作る
- ルートユーザや強い権限をもつIAMユーザにはMFAを有効化し、通常利用しないようにする

## IAMポリシー
- IAMポリシーを作成してユーザーなどへのアクセス権限を付与
- 管理ポリシー
1. AWS管理ポリシー → AWSが作成及管理する管理ポリシー
2. カスタム管理ポリシー → AWSアカウントで作成・管理する管理ポリシー。同じポリシーを複数のIAMエンティティにアタッチできる
- インラインポリシーは自身で作成、管理する管理ポリシー
1. 一つのプリンシパルエンティティ(ユーザ、グループ、ロール)に埋め込まれた固有ポリシーで、プリンシパルエンティティにアタッチすることができる
- JSON形式
- ユーザーベースとリソースベースのポリシー適用がある
- AWSリソースに対してアクセス権限をロールとして付与できる

## ポリシードキュメント
PARKが大切
* Principal　... AWSリソースへのアクセスが許可/拒否されるIAMエンティティを指定する
* Action  
    1. 許可／拒否される特定のアクションを指定する
    2. AWSサービスで行うことができるタスクを記述する独自のアクションセットを記述
* Resource
    1. ステートメントで取り扱う一連のオブジェクトを指定する
* Condition 
    1. ポリシーが有効になるタイミングの条件を指定する

* ポリシーを作成するためのジェネレータがあるから使うと良い

## ルートユーザー
* MFA認証とか、課金情報など大事な作業以外では使わないようにする
* CloudFrontのキーペアの作成
## IAMユーザー
## IAMグループ
## IAMポリシー
1. ユーザーベースのポリシー適用
2. リソースベースのポリシー適用
が存在する
3. IAMロールはサービスにアタッチできる
4. アクセス権限の一時付与もできる

# IAM設計
## <b>ベストプラクティスにそったIAM設計をすることが望ましい</b>

## IAMユーザ or IAMグループどちらを設定するのが良いか
* 少数利用がずっと継続する場合をのぞいて、少数利用を含めて最初からIAMグループで設定する方が良い
* 組織別または個人単位にAWS利用者とその役割別の利用範囲を整理してグループ設計を実施する

## IAMグループへのポリシー適用
### Q.それぞれにどのような権限を付与するか
* IT管理者
    1. フルアクセスの管理者権限の付与
* 運用管理者
    1. 運用ツール全般と開発環境へのアクセスも付与し、DevOpsに参加できるように
* アプリ開発者
    1. 担当しているアプリの開発範囲でのみアクセス権限を付与する
C# UDPブロードキャスト送受信

# ソース

ソースコードは以下の丸パクリで、ソースコードにコメントを入れたものになります。
https://www.it-swarm-ja.tech/ja/c%23/udp%E3%83%96%E3%83%AD%E3%83%BC%E3%83%89%E3%82%AD%E3%83%A3%E3%82%B9%E3%83%88%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E6%A4%9C%E5%87%BA%E3%82%92%E8%A1%8C%E3%81%86%E6%96%B9%E6%B3%95/1046508993/

# IPEndPoint / UdpClient

- IPEndPoint  
エンドポイント（通信する口）の情報（IP アドレス / ポート番号）
- UdpClient  
UDPの各種制御を行うためのコントローラのようなモノ

# サーバ

クライアントからのリクエストをポート番号8888で待ち受け、
リクエスト受信が発生すると、送信元エンドポイントに対してレスポンスを返します。

```C#
static void Main(string[] args)
{
    var Server = new UdpClient(8888);                                       // 待ち受けポートを指定してUdpClient生成
    var ResponseData = Encoding.ASCII.GetBytes("SomeResponseData");         // 適当なレスポンスデータ

    while (true)
    {
        var ClientEp = new IPEndPoint(IPAddress.Any, 0);                    // クライアント（通信相手）のエンドポイントClientEp作成（IP/Port未指定）
        var ClientRequestData = Server.Receive(ref ClientEp);               // クライアントからのパケット受信、ClientEpにクライアントのエンドポイント情報が入る
        var ClientRequest = Encoding.ASCII.GetString(ClientRequestData);

        Console.WriteLine("Recived {0} from {1}, sending response", ClientRequest, ClientEp.Address.ToString());    // ClientEp.Address：クライアントIP
        Server.Send(ResponseData, ResponseData.Length, ClientEp);           // クライアント情報の入ったClientEpに対してパケット送信
    }
}
```

# クライアント

ポート番号8888に対してリクエストをブロードキャスト送信し、
自身にレスポンスが返ってくるのを待ちます。

```C#
static void Main(string[] args)
{
    var Client = new UdpClient();                           // UdpClient作成（ポート番号は適当に割当）
    var RequestData = Encoding.ASCII.GetBytes("Request");   // 適当なリクエストデータ
    var ServerEp = new IPEndPoint(IPAddress.Any, 0);        // サーバ（通信相手）のエンドポイントServerEp作成（IP/Port未指定）

    Client.EnableBroadcast = true;                          // ブロードキャスト有効化
    Client.Send(RequestData, RequestData.Length, new IPEndPoint(IPAddress.Broadcast, 8888)); // ポート8888にブロードキャスト送信

    // 送信データを受信した相手は、自分（クライアント）のエンドポイント情報を知ったはずなので、
    // そこに対してパケットを送信してくれるのを待つ
    var ServerResponseData = Client.Receive(ref ServerEp);  // サーバからのパケット受信、ServerEpにサーバのエンドポイント情報が入る
    var ServerResponse = Encoding.ASCII.GetString(ServerResponseData);
    // ServerEp.Address / ServerEp.Port でサーバのIP/ポート番号を取得
    Console.WriteLine("Recived {0} from {1}:{2}", ServerResponse, ServerEp.Address.ToString(), ServerEp.Port.ToString());

    Client.Close();
}
```
Gitプロジェクトの容量削減

#概要
ローカルで開発していたgitプロジェクトをgithubにあげようとしたらpushに失敗しました。
ログを見ると、ファイルサイズが100MBを超えていてrejectされたとのことでした。
容量が大きいファイルは主に`.git/objects`であり、これはcommitなどの差分ログなどを管理している場所らしいです。

以下の通り、不要な履歴を削除したところ、無事pushできました。

git_find_big.shをダウンロードし、対象のgitディレクトリに移動。自分も移動し、実行。
ファイルサイズの大きいログを特定します。

```
$ sh git_find_big.sh
All sizes are in kB's. The pack column is the size of the object, compressed, inside the pack file.
-e      size    pack                                      SHA                                                                                location
875768  184789  561b02bb28c310f6967f392e7364f08f860a20cd  mecab/dic/mecab-ipadic-neologd/sys.dic
3382    1636    79ac3475574d2b3374156ca9ec4db9e31744d0f7  mecab/dic/mecab-ipadic-neologd/matrix.bin
1407    289     4f457bb9b0cd43c8aacc7db27c15c8447134c280  lib/python3.8/site-packages/MeCab/_MeCab.cpython-38-darwin.so
275     148     0fd855f46465b1ba48d8490c912196ce0590bfb3  lib/python3.8/site-packages/certifi/cacert.pem
266     62      7ebc7eb994bba9ed32f30d557af93627cae4d543  lib/python3.8/site-packages/pip/_vendor/pyparsing.py
256     0       09451e3eabee98e979fed8494bef8d2087e23dca  mecab/dic/mecab-ipadic-neologd/char.bin
235     84      ccf658ba558769b21c78158d4897766fabde3420  lib/python3.8/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-38.pyc
197     37      3766dd49f6d6172a497c40a5d74c6e3f1ff85b05  lib/python3.8/site-packages/idna/uts46data.py
173     37      ab8fd4d23761f29252da7d7083df93eb3224c4c2  lib/python3.8/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-38.pyc
119     23      0cdcd12021a349d69e238fdb79d1afdc12248552  faq/botanswer.json
```

MeCab関係の差分ログが大きかった模様です。これらの履歴を削除していきます。

```
$ git filter-branch --index-filter "git rm -r --cached --ignore-unmatch ファイル名" -- --all
```

その後整理をします。無事容量が削減されました。

```
$ git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
$ git reflog expire --expire=now --all
$ git gc --prune=now
$ du -sh .git/objects
7.6M	.git/objects
```



参考
[LAN内専用のGitリポジトリを減量したい | すたらブログ](https://livingdead0812.hatenablog.com/entry/2019/10/18/180033)
[巨大なファイルを含んだリポジトリの履歴を改変して GitHub にインポートする方法]
(https://qiita.com/osakiy/items/cf59c7a535f2fb1c0f90)
パスワード管理アプリを1か月使ってみて

#はじめに
仕事でセキュリティを多少気にするようになり、自分のパスワードもさすがにちゃんと管理したほうが良いのでは？と思いアプリを使い始めてひと月経ったので感想です。私は1passwordというアプリを使いました。

#良かった点
##管理が楽
chromeの拡張機能を入れておけば、マスターパスワードさえ覚えておくだけでパスワードを自分で入力する必要がなくなります。
また、スマホアプリもあるので、スマホでも同様にログインできます。
##パスワードを考える必要がなくなる
自分は暗記できる4つほどのパスワードを使いまわしていたのですが、新しくパスワードを設定する際にも適当にパスワードを考えてくれるので、自分で決める必要がなくなります。
##各社のセキュリティに対する意識が垣間見える
パスワードだけでセキュリティがわかるわけではないですが、「この会社は何文字まででこういった文字もパスワードに使えるんだ」みたいな新しい発見がありました。

#人によっては...な点
##お金がかかる
フリーのアプリもあるようですが、たいていはお金がかかります。と言っても月数ドル程度なので払う価値は非常にあると思います。
##問い合わせに英語が必要な場合も
セキュリティ意識が日本は海外に比べて低いのか、有名なパスワード管理アプリは海外の会社のものが多いです。自分はアカウント作成のときに問題が起きて英語で問い合わせしました。

#さいごに
最近スマホで簡単に決済できるアプリが徐々に日本になじんできていることもあり、セキュリティに対する意識はより必要になってきていると思います。これを使えば万事OKというわけではないでしょうが、同じパスワードを使いまわすよりははるかに安全だと思うので、使うべきだと考えます。私は使い続けます。

また何か思いついたり感じたりしたら追記していきます。