OmniAICreator/Qiita-1.07M huggingface dataset:
高速なのは Range#cover? or Range#include? or ActiveSupport::TimeWithZone#between? それとも？


`rubocop-performance` を確認していたら、

>  Performance/RangeInclude: Use Range#cover? instead of Range#include?.

が出たのでベンチマークを取ってみました。

```ruby
require 'bundler/setup'
require 'benchmark_driver'

Benchmark.driver do |x|
  x.prelude <<~RUBY
  require 'active_support/time'
  t = Time.current + 5.minutes
  RUBY

  x.report 'include?', %[ (Time.current..Float::INFINITY).include?(t) ]
  x.report 'cover?', %[ (Time.current..Float::INFINITY).cover?(t) ]
  x.report 'between?', %[ t.between?(Time.current, Float::INFINITY) ]
  x.report 'raw_function', %[ t >= Time.current && t <=  Float::INFINITY ]
end
```

結果

```
Warming up --------------------------------------
            include?    85.071k i/s -     86.456k times in 1.016282s (11.75μs/i)
              cover?   131.933k i/s -    135.600k times in 1.027793s (7.58μs/i)
            between?   276.108k i/s -    285.615k times in 1.034434s (3.62μs/i)
        raw_function   285.200k i/s -    291.396k times in 1.021725s (3.51μs/i)
Calculating -------------------------------------
            include?   125.985k i/s -    255.212k times in 2.025732s (7.94μs/i)
              cover?   133.774k i/s -    395.799k times in 2.958713s (7.48μs/i)
            between?   304.505k i/s -    828.322k times in 2.720227s (3.28μs/i)
        raw_function   304.348k i/s -    855.600k times in 2.811255s (3.29μs/i)

Comparison:
            between?:    304504.7 i/s
        raw_function:    304348.1 i/s - 1.00x  slower
              cover?:    133774.0 i/s - 2.28x  slower
            include?:    125985.1 i/s - 2.42x  slower
```

`include?` から `cover?` に変更したほうが早いが、`between?` や便利機能使わずに普通に書いた `raw_function` の方が早くなりました。 後者の2つは実行するタイミングで順位がわかりましたが、ほぼ誤差の範囲だと思います。


ちなみに `benchmark_driver` では、 ymlで入力することもサポートしているので、

```yaml
# range.yml
prelude: |
  require 'bundler/setup'
  require 'active_support/time'
  t = Time.current + 5.minutes

benchmark:
  include?: (Time.current..Float::INFINITY).include?(t)
  cover?: (Time.current..Float::INFINITY).cover?(t)
  between?: t.between?(Time.current, Float::INFINITY)
  raw_function: t >= Time.current && t <= Float::INFINITY
```

のようなファイルを用意して、

```bash
$ benchmark-driver range.yml
```

と書いても似たような結果を得られました。
Webスクレイピングで株価指数を取得してみた

####目的
銘柄コードによって、毎日の株価指数のデータを取得し、株式市場を分析します。
※収集したデータを不正に利用しないため、ご参考まで。
※サーバ過負荷にならないよう、アクセス間隔をある程度空けている。
####スクレイピングツールの概要
ScrapeStormには人工知能に基づき、Webスクレイピングツールです。プログラミングが必要なく、ほとんどのWebサイトからデータをスクレイピングします。強い機能を持つ、使いやすいです。URLを入力するだけで、自動的にWebサイト内容と次のページボタンを識別できます。1-ClickでWebサイトからデータを自動的に抽出します。
####抽出されたデータは下記のようにご覧ください。
![1抽出されたデータ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/1f8feef2-3394-1f63-edd3-380747bbf25d.png)
####1.タスクを新規作成する
今回はURLジェネレーター機能を利用して、各銘柄コードの詳細情報ページから株式情報を取得します。
**(1)URLをコピーする**
任意の銘柄コードを入力して、その検索結果ページのURLをコピーしてください。
![2URLをコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/acb12bbe-d650-9684-ee13-209b4adb3d5e.png)
**(2)URLを生成する**
URLジェネレーターでURLを入力して、パラメーターを追加画面にファイルから読み込むを選んでください。生成したURLはプレビュー画面でチェックしてください。
![3新規作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/0b0358fc-22b6-0aa7-6d2b-07fcbab2323d.png)
![4URLを入力.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/35ee2714-90c8-c675-c024-59959ac9efd3.png)
####2.タスクを構成する
**(1)事前操作機能**
株主優待、売買単位などの情報の収得には、事前操作機能を利用してください。右上の緑色ボタンをクリックして、事前操作画面を開けます。
注意：株価指標画面を開くには、二つの「クリック」コンポーネントを追加してください。
![5事前操作.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/de0ea7d1-89d8-dc00-b273-4565a9e78b0d.png)
**(2)ページタイプ**
今回生成したURLは全部詳細ページのURLですから、ページタイプを「詳細ページ」に変更します。また、ページングには「必要なし」に変更してください。
![6ページボタン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/3c458af0-a8ec-7fbd-83cb-ecd5341766a9.png)
**(3)フィールドの追加と編集**
フィールドの追加をクリックして、株主優待を選択すると、情報がソフトウェアの表に追加します。また、必要に応じてフィールドの名前の変更または削除、結合できます。
[抽出されたフィールドを配置する方法](https://jp.scrapestorm.com/tutorial/how-to-configure-the-extracted-field-in-smart-mode/)
![8フィールドの追加と編集.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/3ea92a35-0980-47f7-2270-3b54286a6cd8.png)
####3.タスクの設定と起動
**(1)起動の設定**
ソフトウェアは数多くの機能を提供します。タスクを毎日定時的に起動するために、スケジュール機能を利用してください。
[スクレイピングタスクを配置する方法](https://jp.scrapestorm.com/tutorial/how-to-configure-the-scraping-task-in-smart-mode/)
![10起動.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/0c658383-961d-3cc2-0b24-55b4f92fd40c.png)
**(2)しばらくすると、実行画面にデータのスクレイピングが見えます。**
![11データ抽出.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/0545fe76-208b-9c4f-2899-292a3ed0efde.png)
####4.抽出されたデータのエクスポートと表示
**(1)エクスポートをクリックして、データをダウンロードします。**
![12エクスポート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/964039ee-0d1f-441d-016f-774e21638b90.png)
**(2)必要に応じてエクスポートする形式を選択します。**
ScrapeStormは、Excel、csv、html、txt、データベース、ローカルなどさまざまなエクスポート方法を提供します。ライトプラン以上のユーザーは、WordPressに直接投稿することもできます。
[抽出されたデータのエクスポート方法](https://jp.scrapestorm.com/tutorial/how-to-export-the-result-of-extraction-in-smart-mode/)
![13ファイルの選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/ef8baef8-5c28-3bfb-0bcb-4b14f0fb9e99.png)
Azure Logic Apps の JSON 解析で nullable な型を定義する

Azure Logic Apps で JSON を扱う時に、こういう JSON があったとします。

```json
{
  "value": [
    {
      "foo": "bar"
    },
    {
      "foo": null
    }
  ]
}
```

これを Logic Apps の JSON 解析の `サンプルのペイロードを使用してスキーマを生成する` という機能を使って型定義を生成すると、以下のようになります。

```json
{
    "type": "object",
    "properties": {
        "value": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "foo": {
                        "type": "string"
                    }
                },
                "required": [
                    "foo"
                ]
            }
        }
    }
}
```

`foo` という key が必須の string 型の配列として判定されてしまいました。
これでは実際に JSON 解析を行った時に null な値が来ると、パースエラーになってしまいます。困りましたね。

`type` には型を表現する文字列だけではなく、配列も渡すことが出来るので、以下のように `["string", "null"]` として定義を修正してあげましょう

```json
{
    "type": "object",
    "properties": {
        "value": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "foo": {
                        "type": ["string", "null"]
                    }
                },
                "required": [
                    "foo"
                ]
            }
        }
    }
}
```

これで nullable な値を適切に JSON 解析することが出来ます。やりましたね！
【form_withのmodel:の意味】

##form_withに記述するmodel:の意味
いまいち理解できていなかったのですがようやく意味がわかったのでアウトプットとして記述していきます。

<img width="772" alt="model-.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673286/eb261284-f6f0-95d9-7c9a-45696d09b89b.png">

上の画像はツイートの詳細画面からコメントを投稿するためのフォームを表示させるためのコードを記述しているのですが、
form_withに続くmodel:@tweet, @commentの二つをなぜ使用しているのかいまいち理解できていませんでしたが解決できましたので以下に理由を記述します。

###1点目
今回の場合はツイートに対してコメントをするという状況でありコメントは一つのツイートに紐付いている状態なのでコメント単体でフォームの送信先に指定することはできないため@tweet, @commentと紐付いているものとセットにして送信先を指定しているという理由。

###2点目
@tweet,@commentという記述自体がルーティングを指定しているということ。
どういうことかといいますと、以下の画像を見てください。

<img width="1025" alt="model2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673286/0359038a-729e-0df0-8c23-da0f3e76b798.png">

今回の場合はコメントを作成したいので発動させたいアクションはcommentsコントローラーのcreateアクションです。
そして一番左のprefixの項目を見ると、tweet_commentsというパスが記述されています。
要するにフォームを送信してコメントを作成するのであればこのルーティングを指定しなければいけないということです。

そのルーティングを指定しているのがmodel: [@tweet,@comment]だというのが二点目の理由です。

以上です。
Git リポジトリ作成時のデフォルトブランチ名を main にする

## master -> main

`git init` でリポジトリを作成し *最初のコミット* をした場合、ブランチ名はデフォルトで **master** になります。
2020/07 時点では `git init` 時のこの挙動を変更するようなオプションは用意されていません。

デフォルトブランチ名を変更したい場合は、 *最初のコミット* の前に HEAD の参照先を移動しておく必要があります。

```shell
git init
git symbolic-ref HEAD refs/heads/main   # 参照先を main に移動
...
git commit -m 'Initial commit'
```

新規リポジトリ作成の度に上記のコマンドを思い出して実行するのは手間なので、エイリアスを作成しておきましょう。

```shell
git config --global alias.new '!git init && git symbolic-ref HEAD refs/heads/main'
```

今回は `new` にエイリアスを設定しました。

これで `git new` すると、デフォルトブランチが **main** のリポジトリを作成することができます。

## 参考

- https://www.hanselman.com/blog/EasilyRenameYourGitDefaultBranchFromMasterToMain.aspx
- https://stackoverflow.com/a/50880622
俺でもわかるAWS DMS CASTメモ(随時更新するとおもう)

俺です。

DMSを使う際は同機種または異機種間であってもソース/ターゲットでテーブルの型は一致させておく必要があります。
型が異なる場合は内部で多分CASTが行われていると思われる上に、Full LoadとCDCで挙動が異なります。

ただ型が違っても俺にはレプリしたい理由がそこにある。そういう俺のために無理やりねじ込んだらどうなるのか、DMSがサポートしてないことをAWSサポートに泣きつくことはできないのでメモを残しておきます。


こんな情報誰がほしいのかって？俺だよ!



# 移行方式

## Aurora PostgreSQL 10.X to Aurora MySQL 5.7

|レプリケーションタイプ|ソーステーブルの型|ターゲットの型|変換結果|dead or alive|対処方法|
|:---|:-----|:-------------|:-------------|:-------------|-------------|-----|
|Full Load|boolean|boolean(tinyint)|false('f')もtrue('t')も0が挿入される|('A`)|ドキュメント通りvarchar(1)に移行する|
|CDC|boolean|boolean(tinyint)|false => 102, true => 116|('A`)| |
|Full Load|int|datetime|0になる|('A`)| |
|Full Load|int|varchar|ロード可|J( 'ー`)し| |
|CDC|int|varchar|10進数の文字コードに変換される|('A`)| |

# 参考

[DMS内部データ型](https://docs.aws.amazon.com/ja_jp/dms/latest/userguide/CHAP_Reference.DataTypes.html)
[PostgreSQLの制限](https://docs.aws.amazon.com/ja_jp/dms/latest/userguide/CHAP_Source.PostgreSQL.html#CHAP_Source.PostgreSQL.Limitations)
[PostgreSQLのソースデータ型](https://docs.aws.amazon.com/ja_jp/dms/latest/userguide/CHAP_Source.PostgreSQL.html#CHAP_Source-PostgreSQL-DataTypes)
DockerでLaravelの環境構築した話

#この記事を参考にDocker環境構築

Dockerを使ってLaravel開発環境構築
https://qiita.com/A-Kira/items/1c55ef689c0f91420e81

#ハマるポイント１ phpのdockerfile記述
このままだと、Laravelのインストールがうまくいかない・・・(PHPのバージョンが7.3以上じゃないとだめみたい)
→バージョン7.2だったのを7.4へ変更

zlib1g-devで引っかかる
→libzip-devに変更

#ハマるポイント2 nginx 404
cloneして、
composer installして、
.env作って、

```
docker-compose exec php bash
php artisan migrate
```

一応、動くようになったけど・・・TOPページ以外、nginx 404になる
https://qiita.com/isaatsu0131/items/f1eafe7522f0bf0ff043

```
location / {
   try_files $uri $uri/ /index.php?$query_string;
 }
```

default.confのロケーションの記述を修正

#ハマるポイント3 storageへのシンボリックリンク
動作チェックしてみたけど・・・画像が表示されない

```
docker-compose exec php bash
php artisan storage:link
```

以上
Holy Grail Layout（聖杯レイアウト） を作る最短の HTML

# Holy Grail Layout（聖杯レイアウト） とは

このような5つの部分からなるレイアウトです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73493/8b4abc24-f2ab-b3ca-7fe4-ccdc37fd0d16.png)

# 実現

このレイアウトを実現する w3 の validator でエラーもワーニングも出ない最短の HTML を目指します。

* CSS Grid で 3 x 3 のグリッドを作って実現します。
* HEADER と FOOTER の高さは 32px にしてあります。
* NAV と ASIDE の幅は 300px にしてあります。

```html
<!DOCTYPE html>
<html lang=zxx>
<title>Title</title>

<style>
html {
	height					: 100%
}
body {
	height					: 100%
;	margin					: 0
;	display					: grid
;	grid-template-rows		: 32px 1fr 32px
;	grid-template-columns	: 300px 1fr 300px
}
header {
	grid-column				: 1 / 4
}
footer {
	grid-column				: 1 / 4
}
</style>

<header>	HEADER	</header>
<nav>		NAV		</nav>
<main>		MAIN	</main>
<aside>		ASIDE	</aside>
<footer>	FOOTER	</footer>
```

# 勘所

html 要素と body 要素の高さを 100% にします。

Grid 要素はその子要素を自動的に流し込んでくれます。なので、3カラムに跨がるheader 要素と footer 要素のみ指定すれば大丈夫です。

# 最後に

もっと違う方法があれば教えてください。興味をもっていただきありがとうございました。
「docker-compose [execとか] [サービス名] [コマンド可変]」ってタイプするのがだるい

「イメージでいうとサービス名web決め打ちにして dcw exec bashとかしたい。エイリアスだと引数の順番のせいでできないし…」
「それ独自関数できるよ」
「マジっすか」


# これがだるいので

```zsh
docker-compose exec web |本命のコマンド|
# docker-compose exec web bash とか
```




```zsh
# .zshrc にコピペ
dcw () { docker-compose $1 web "${@:2}" }
# .bashrcならこうらしい
dcw () {
 docker-compose $1 web "${@:2}"
}
```

```zsh
dcw exec bash
# docker-compose exec web bash になる！
```

**web** のところは自分のdocker-composeの定義に置き換えてくれよな！

## ついでにこれも見ていくといいんじゃない（私の記事ではないけど）
[世の中のエンジニアのalias設定 \- Qiita](https://qiita.com/reireias/items/d906ab086c3bc4c22147)

一部抜粋

```
alias d='docker'
alias dc='docker-compose'
```
Unicornを再起動する


#前提

RailsアプリをEC2にデプロイし、Unicornをアプリケーションサーバーとして使用しています。

開発環境でしたら、`rails s`で起動すれば良かったのですが、本番環境はサーバーの起動&停止方法が変わったので、メモとしてまとめました。

#サーバーを停止したい場合の手順

##Unicornの起動確認

```
ps -ef | grep unicorn | grep -v grep
```

```
vinaka     15533     1  0 08:02 ?        00:00:01 unicorn_rails master -c /var/www/rails/ShitsumonWa-/config/unicorn.conf.rb -D -E production                                                                                    
vinaka     15537 15533  0 08:03 ?        00:00:00 unicorn_rails worker[0] -c /var/www/rails/ShitsumonWa-/config/unicorn.conf.rb -D -E production                                                                                 
vinaka     15538 15533  0 08:03 ?        00:00:00 unicorn_rails worker[1] -c /var/www/rails/ShitsumonWa-/config/unicorn.conf.rb -D -E production 
```

``master、worker[0]、worker[1]``の
三つ出てきた場合、Unicornが起動しているようです。

##killする

今確認した、三つのうちの一番上の番号(master)``15533 ``を``killします``(毎回番号が変わるので都度**ps -ef | grep unicorn | grep -v grep**で番号を確認)

```
kill -9 15533
```

##Unicornの停止確認
```
ps -ef | grep unicorn | grep -v grep
```
```


```
すると何も表示されないはず。
表示されていないと、Unicornが停止しています。


#再度サーバーを立ち上げる時の手順

##Unicornの停止確認
```
ps -ef | grep unicorn | grep -v grep
```
```


```
##Unicorn起動！
```
 bundle exec unicorn_rails -c /var/www/rails/アプリ名/config/unicorn.conf.rb -D -E production 
```
```


```
何も出ないと、ちゃんと起動しているようです。

一応確認もする。

```
ps -ef | grep unicorn | grep -v grep
```

```
vinaka     15740     1  1 08:48 ?        00:00:01 unicorn_rails master -c /var/www/rails/ShitsumonWa-/config/unicorn.conf.rb -D -E production                                                                                    
vinaka     15744 15740  0 08:48 ?        00:00:00 unicorn_rails worker[0] -c /var/www/rails/ShitsumonWa-/config/unicorn.conf.rb -D -E production                                                                                 
vinaka    15745 15740  0 08:48 ?        00:00:00 unicorn_rails worker[1] -c /var/www/rails/ShitsumonWa-/config/unicorn.conf.rb -D -E production  
```

三つ表示されました！起動されている。
さっきと番号が変わっているはず！

**ちなみに**

```
master failed to start, check stderr log for details
```
とエラーが出た場合は

```
cat log/unicorn.log
```

でエラーの内容を確認する。
Unicornのバージョン(5.5以上だとエラーが出るみたいなので``Gem file``でバージョン指定するのが良いです。)

```:Gemfile
group :production, :staging do
    gem 'unicorn', '5.4.1'
end
```

**また**

```
unicorn_rails -c /var/www/rails/アプリ名/config/unicorn.conf.rb -D -E production
```

だと怒られることがあるので、``bundle exec``をつけてあげた方が無難。

```
bundle exec unicorn_rails -c /var/www/rails/アプリ名/config/unicorn.conf.rb -D -E production
```

#nginxも再起動

``Unicorn``が無事に立ち上がったら、nginxも再起動してあげて完了です。

```
sudo nginx -s reload
```




終わりです。
【AWS】ACMでDNS検証が検証保留中から変化しない

# 状況

terraformを使用してAWSの環境構築中、ACMを利用してSSL証明書の取得を試みたところ、証明書の発行状況が検証保留中から変化せず、エラーを吐かれたので備忘録として

# 原因
CNAME名前解決できていなかった。

# 対処内容
ホストゾーンのNSレコードに登録されているネームサーバーをdigコマンドで問い合わせた内容に変更して解決

# 詳細

```terminal
$ dig ドメイン名. +trace
```

[digコマンドの詳細はこちら](https://www.atmarkit.co.jp/ait/articles/1711/09/news020.html)

得られた結果
![スクリーンショット 2020-07-15 17.54.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630802/e95e235d-c117-df19-57e3-53ea735d15aa.png)


AWS Route53にて、値を上記内容に書き換え
![スクリーンショット 2020-07-15 17.53.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630802/58849261-f4f1-6d38-b011-7bac06354ccc.png)

# appendix

terraformでroute53処理とacm処理をまとめて実行すると、CNAMEが作成されないことがある。

実行順序を考えてあげる必要があるのかな。[公式リファレンス](https://www.terraform.io/docs/providers/aws/r/acm_certificate.html)

applyを2回実行すると解決する。1回で済ませる方法を模索中。

7/16追記
特にデメリットがないので、コンソールで予め証明書を発行しておくことにした。dataで引っ張る。

```terminal
data "aws_acm_certificate" "domain" {
  domain = "domain.com"
  statuses = ["ISSUED"]
}

data.aws_acm_certificate.domain.arn
```


# 参考

[AWS Certificate Managerにて、DNS 検証 が失敗](http://blog.livedoor.jp/harukisan7/archives/24272658.html)
ubuntu にpostgresqlを入れるのの初期設定。

先にpeer関連で弾かれることを書きましたが、初期設定のことも書いておきます。
とりあえず、postgres のパスワードから。

```
~ ❯❯❯ sudo passwd postgres
New password: 
Retype new password: 
passwd: password updated successfully
~ ❯❯❯ 
```

postgres でログインの後、psql。

```
 ❯❯❯ sudo -u postgres -i
[sudo] password for ma: 
postgres@local:~$ psql
psql (12.3 (Ubuntu 12.3-1.pgdg20.04+1))
Type "help" for help.

postgres=# 

```
あとは ALTER USER postgres with encrypted password 'my_password';

role を追加する場合

```
CREATE ROLE yourRoll WITH LOGIN PASSWORD 'somePass';
ALTER ROLE yourRoll WITH someRoll;
```
goのmigrateで複数クエリを1ファイルにまとめてマイグレーションしたい

ちょっとハマったのでメモ。

# 事象
[migrate](https://github.com/golang-migrate/migrate/tree/master/database/mysql)でこのsqlを1ファイルで流したかった。

```sql:20200715034115_create_samples.up.sql
BEGIN;

CREATE TABLE `samples` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `boo_id` bigint(20) NOT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`, `created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE `samples` PARTITION BY RANGE COLUMNS(`created_at`) (
  PARTITION p2020 VALUES LESS THAN ('2020-01-01 00:00:00'),
  PARTITION p2021 VALUES LESS THAN ('2021-01-01 00:00:00'),
  PARTITION p2022 VALUES LESS THAN ('2022-01-01 00:00:00'),
  PARTITION p2023 VALUES LESS THAN ('2023-01-01 00:00:00'),
  PARTITION p2024 VALUES LESS THAN ('2024-01-01 00:00:00')
);

create index samples_index on `samples` (`boo_id`);

COMMIT;
```

構文的には問題ないはずなのだが、なぜか `Error 1064: You have an error in your SQL syntax;` のエラーが出る。

# 対処
dsnに `multiStatements=true` をつける。こんなイメージ。
このオプションをつけていれば一つのsqlファイルで複数のクエリをサポートしてくれるようになる。

```golang
user := os.Getenv("DB_USERNAME")
pass := os.Getenv("DB_PASSWORD")
host := os.Getenv("DB_HOST")
port := os.Getenv("DB_PORT")
dbName := os.Getenv("DB_DATABASE")

dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?parseTime=true&multiStatements=true", user, pass, host, port, dbName)
```

この[プルリク](https://github.com/go-sql-driver/mysql/pull/411)がmultiStatementsの対応をした時のやつ。
migrateの話というより、[go-sql-driver/mysql](https://github.com/go-sql-driver/mysql/pull/411)の話だった。
Azure LogicAppsの発信IPを特定する

## はじめに
LogicAppsから他のサービスやシステムに接続する際に、接続先のセキュリティ設定やファイアーウォールでIP制限されているケースは多いかと思います。
そんな時はLogicAppsが使用するIPアドレスは決まっているのでその範囲でセキュリティ設定をしてやれば接続できるようになります。

## 確認方法
LogicAppsのメニューから「プロパティ」で確認できます。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/63ecc93b-f242-4d87-5d0e-3181dad9e665.png)
rbenvの使い方について

今回、伊藤淳一さんのRuby入門を購入し、学習を進めるにあたって
Rubyのバージョンを変更する必要があったため、rbenvについて調べてみました。

## rbenvとは
Rubyのバージョンを切り替えてくれるツールです。
まずは、rbenvをインストールしたいと思います。

## rbenvのインストール方法
```:ターミナル
# 初期化設定
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
# 初期化設定の反映
$ source ~/.bash_profile
# rbenvのインストール
$ brew install rbenv ruby-build
```
こちらでインストール完了です。
次に、指定したRubyのバージョンをインストールする方法を記載します。

## 指定したRubyのバージョンをインストールする方法
```:ターミナル
# インストール可能なRubyのバージョン一覧を表示する
$ rbenv install -l
# 一覧からインストールしたいRubｙのバージョンをインストール
$ rbenv install 2.4.1
# インストールしたRubyのバージョンを使用可能な状態にする
$ rbenv rehash
```
複数のバージョンをインストールしたい場合は、上記を繰り返すことで可能。

## rbenvのフォルダ構成
> ~/.rbenv/ （ルートフォルダ）
~/.rbenv/shims/ （rubyやgemがインストールしてくれるコマンドのラッパーを保存するフォルダ）
~/.rbenv/version （グローバルに設定しているRubyバージョンを記録するファイル）
~/.rbenv/versions/ （その他のインストールした各種Rubyバージョンをインストールするフォルダ）

引用元：[rbenvとは - Qiita](https://qiita.com/souichirou/items/d4196faa0df9e4bacf17)


## 使用するバージョンを指定
```:ターミナル
# PC全体で使用するRubyのバージョンを切り替える
$ rbenv global 2.4.1
# インストールできたか確認
$ ruby -v
```

## 参考にした記事
[rbenvの役割 - Qiita](https://qiita.com/souichirou/items/d4196faa0df9e4bacf17)
MySQLテーブル操作コマンドまとめ

MySQLのテーブル操作のコマンド備忘録。
※随時更新予定。

###設定
- テーブル名：table
- テーブル情報

| id(int)  | name(varchar) |  date(datetime)|
|:--------:|:-------------:|:--------------:|
| 1        |        Tanaka |  2020/07/15    |
| 2        |        Suzuki |  2020/07/15    |

####データ挿入
(例) id=3 name=Yamada date=今日 のデータ挿入

```php:
insert into table values( 3, 'Yamada', now());
```


####すでに作成してあるカラムにNULLを格納できないようにする

(例)idにnullが入力できないようにする

```php:
ALTER TABLE table MODIFY COLUMN id(カラム名) int(データ型) NOT NULL;
```

####特定の値を取得

(例)id=1のデータだけ取得

```php:
SELECT * FROM table WHERE id=1;
```

####特定のテーブルデータ削除

（例）id=1のデータを削除する場合

```php:
delete from table where id=1;
```

####特定のカラム削除

（例）カラム id を削除する場合

```php:
alter table table drop column id;
```

####既存データにプライマリーキーを設定

（例）カラムidにプライマリーキーを設定する場合

```php:
alter table table add primary key(id);
```

####既存データにAUTO_INCREMENTを設定

（例）カラムidにAUTO_INCREMENTを設定する場合

```php:
alter table table modify id int(11) NOT NULL AUTO_INCREMENT;
```
詳解UNIXプログラミング第三版のサンプルコードを、Macで動かす手順


Kindle本セールで半額になっていたので、[詳解UNIXプログラミング](https://amzn.to/30dfPso)という本を購入して読み始めました。

![51L6CwNG11L._SY346_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262745/70f20aae-1f3e-1398-c21c-450543bcfc4e.jpeg)


Macでサンプルコードを動かしてみようとしたところ、いろいろとつまずいたので、動作させるまでに行った手順を残しておきます。

## Macのバージョン

```
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.15.5
BuildVersion:	19F101
```

## コンパイラのインストール

```bash
$ brew install gcc
```

## ヘッダファイルのダウンロードからmakeまで

```bash
$ curl -O http://www.apuebook.com/src.3e.tar.gz
$ tar xvfz src.3e.tar.gz
$ cd apue.3e/
$ make
$ ls
DISCLAIMER           include
Make.defines.freebsd intro
Make.defines.linux   ipc1
Make.defines.macos   ipc2
Make.defines.solaris lib
Make.libapue.inc     printer
Makefile             proc
README               pty
advio                relation
daemons              signals
datafiles            sockets
db                   standards
environ              stdio
exercises            systype.sh
figlinks             termios
filedir              threadctl
fileio               threads
```

## ライブラリとヘッダの配置

```bash
$ cp include/apue.h /usr/local/include/
$ cp lib/libapue.a /usr/local/lib/
```

## サンプルコードのコンパイルと、ファイルの実行

```bash
$ cd 自分で書いたファイルが置かれているディレクトリのパス
# 今回は、myls.cというコードをコンパイルすると想定する
# apueライブラリを含めてコンパイルする
$ gcc -lapue myls.c
# a.outというファイルが生成されるので、実行できることを確認する
$ ./a.out
```
中華クラウドにつながるIoTに問題あり

#スマートプラグが突然動作しなくなった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/60c3e6a0-d93b-e3c1-94fb-dd1c771ee690.png)
##[昨年、私が書いた記事](https://qiita.com/hiratarich/items/e91adf0fb2c5c31fdd55)
###夏休みの工作特別企画 電気ポットをwifiにする
用いたこのwifiコンセント毎朝お茶を飲むためにポットに使っていた。
このスマートプラグは、eWelinkというクラウドサーバーに接続され、IFTTTなどで人気の高い製品である。
色々、デバイスも確認して、米国のハッカーの記事をGoogle検索すると、オリジナルのflushアプリに障害があることが分かった。
また、IFTTTからメールが届いた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/14241ea7-6fbd-0100-28e7-781b47b5f01b.png)

eWelinkにloginすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/4fa6e04b-fed6-1551-211a-39b52c7d13f5.png)

# Please upgrade to advanced plan to link with IFTTT.とは、何か!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/e862b415-4f6c-8661-034a-8f23bd90284a.png)

アカウントをアップグレードしてeWeLinkアプリの高度な機能をお楽しみください上級ユーザーの大きなニーズに応えるために、eWeLink Advancedサブスクリプションプランが正式に導入されました。 高度なプランにアップグレードすると、家、グループが増え、共有制限が高くなります。 さらに、より付加価値の高い機能にアクセスできます。 現在の無料プランが機能しなくなった場合は、お気軽に詳細プランにアップグレードしてください！
年間約1000円払えということだった。
##結局、無料では、IFTTTは、使えなくなった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/880915d6-34c6-65c3-3b8d-771f0720d0a1.png)

## アメリカやヨーロッパで100万台売れているIoTディバイスやはり中国製は、使うべきでない。
###私にIFTTTの存在を教えてくれたアメリカ人ハッカーの言葉が懐かししい。
##「もし、３日間晴れの天気が続いたなら夕方に45分スプリンクラーをつける。」
#これがIFTTTの基本だ。プログラム無しで$20で実現する。

# sonoffの見解は、
<b>So far, the only disadvantage of the free plan, is lack of access to IFTTT service which is disappointing. I know the service at IFTTT costs a couple of thousands of dollars a year to keep, but I would assume, these are just minor operational costs.</b>

<b>これまでのところ、無料プランの唯一の欠点は、残念なことにIFTTTサービスにアクセスできないことです。 IFTTTのサービスを維持するために年間数千ドルの費用がかかることは知っていますが、これらはわずかな運用コストであると思います。</b>

#iftttが無償でないから明日から有料にします。という意味。
#中華の理論ですね。

これは、一例です。<h1>中華を使うと痛い思いをする。一例です。
<p>付き合うのめんどくさいから別な商品使おう!</p></h1>
aws Amplify Cognito + ReactでwithAuthenticatorのスタイリングが反映されないときの対処法

aws Amplify Cognito + Reactで認証の実装をしていた時に遭遇したので共有しておきます。

# 本題
Cognito + Reactの情報を探していると、withAuthenticatorは以下のように、'aws-amplify-react'からインポートしている情報が殆どでした。

```javascript:App.js
import Amplify from 'aws-amplify';
import awsconfig from './aws-exports';
import { withAuthenticator } from 'aws-amplify-react';

Amplify.configure(awsconfig);

function App() {
  return (
    ...
  );
}

export default withAuthenticator(App); 
```
しかし、このままログイン画面を表示すると

![b36cce9bd137bb8ed9cf68942219cd08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181033/ea273fa6-4411-ef30-0577-5b189103fb50.png)
このようにスタイリングが反映されていないものになります。

# 対処法

[こちら](https://docs.amplify.aws/lib/auth/getting-started/q/platform/js#option-1-use-pre-built-ui-components)の公式ドキュメントにあるように'@aws-amplify/ui-react'からインポートしてあげましょう。

```bash
  yarn add @aws-amplify/ui-react
```

```javascript:App.js
import Amplify from 'aws-amplify';
import awsconfig from './aws-exports';
// '@aws-amplify/ui-react'に変更
import { withAuthenticator } from "@aws-amplify/ui-react";

Amplify.configure(awsconfig);

function App() {
  return (
    ...
  );
}

export default withAuthenticator(App); 
```

![スクリーンショット 2020-07-15 0.56.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181033/b56e05b0-25f5-d879-d4ca-2796c98da9e1.png)
表示されるようになりました。

UI Componentsが新しいバージョンになったため`@aws-amplify/ui-<framework>`を使うようにしましょう。

# リンク

[Amplify Framework announces new, rearchitected UI Component and modular JavaScript libraries](https://aws.amazon.com/jp/blogs/mobile/amplify-framework-announces-new-rearchitected-ui-component-and-modular-javascript-libraries/)
文系卒だけどいきなりRuby on Railsの勉強をはじめてみた #10 ユーザーの更新・表示・削除

前章では、ユーザーがログインでき、かつログイン状態を保持できるような仕組みをつくった。
本章では、ユーザーの更新・表示・削除をできるようにしていく。

#10.1 ユーザーを更新する
ユーザーを編集できるようにするために、編集するためのビューを作成する。
コードの中身はもう理解が追いつかないが、とりあえずユーザー情報は無事に更新できるようになった。
（なぜかプロフィール画像まで変わってしまった。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648931/0c5e20a5-ff1e-336d-562c-ce6e3ec098e2.png)

#10.2 認可
どうやらWebアプリケーションの界隈では、認証と認可は異なる概念を指すらしい。

認証 (authentication) はサイトのユーザーを識別すること
認可 (authorization) はそのユーザーが実行可能な操作を管理すること

よって、「認可」と称される本節においてはユーザーが実行可能な操作を管理する。
具体的にいうと、ユーザー編集は「ログイン済みユーザー」に限定するというものだ。

また、本節においては`フレンドリーフォワーディング`という概念がでてくる。
最初はなんのことかと思ったが、よく遭遇する現象のことだった。
例えば、ユーザー情報編集ページにアクセスした際にログインを求められたとする。
ログイン後にトップページなどに飛ばされずに開こうとしていたページ（ユーザー編集ページ）に遷移する、みたいなことをフレンドリーフォワーディングというらしい。
確かに、フレンドリーフォワーディングになっていないサイトは好きになれない。
細かいけど重要な要素だとは思う。

#10.3 すべてのユーザーを表示する
本節においては、すべてのユーザーの一覧ページを作成する。
たくさんともだちができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648931/ee2f3b4e-950e-7fc1-1e10-dabe34332ea5.png)

#10.4 ユーザーを削除する
管理権限を付与すると、そのユーザーは削除（`destroy`）ができるようになった。
Azure Logic AppsでSQL Serverのトリガーを使用する際の注意事項

Logic AppsにはSQL Severのコネクタが用意されていて、２つのトリガーを使用することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/f5a02ea4-88db-0536-d09e-55e47a9a597e.png)

- 項目が作成されたとき
- 項目が変更されたとき

これらは非常に便利ですが既存のテーブルにそのまま適用しようとすると動作しません。
それぞれ以下が条件となっています。

### 項目が作成されたとき
対象のテーブルに[IDENTITY列](https://docs.microsoft.com/ja-jp/sql/t-sql/statements/create-table-transact-sql-identity-property?view=sql-server-ver15)が必要

### 項目が変更されたとき
対象のテーブルに[ROWVERSION列](https://docs.microsoft.com/ja-jp/sql/t-sql/data-types/rowversion-transact-sql?view=sql-server-ver15)が必要

### 参考
その他の制限事項なども記載されています。
https://docs.microsoft.com/ja-jp/connectors/sql/
PRML 演習問題5.29(基本)　解答

<a id="eq:1.152"></a>
##はじめに
本記事は, 機械学習の教科書の決定版ともいえる, Christopher Bishop先生による『Pattern Recognition and Machine Learning （パターン認識と機械学習）』, 通称PRMLの演習問題のうち, 私が解いた問題の解答を記したものです

今回は演習5.29の証明です

<a id="eq:1.152"></a>

##問題

以下の式5.141の結果を確かめるという問題です


```math
\frac{\partial \widetilde{E}}{\partial w_{i}}=\frac{\partial E}{\partial w_{i}}+\sum_{j} \gamma_{j}\left(w_{i}\right) \frac{\left(w_{i}-\mu_{j}\right)}{\sigma_{j}^{2}}\quad(\text { 5.141 }) \\
```

##解答

教科書より

```math
\widetilde{E}(\mathbf{w})=E(\mathbf{w})+\Omega(\mathbf{w})\quad(\text { 5.139 }) \\
```

なのでこれを重み$w_{i}$で微分すると

```math
\frac{\partial \widetilde{E}}{\partial w_{i}}=\frac{\partial E}{\partial w_{i}}+ \frac{\partial \Omega}{\partial w_{i}}\quad(\text {!}) \\
```

となります。あとは右辺の第二項を書き換えれば良いことが分かります。5.138式より


```math
\Omega(\mathbf{w})=-\sum_{i} \ln \left(\sum_{j=1}^{M} \pi_{j} \mathcal{N}\left(w_{i} \mid \mu_{j}, \sigma_{j}^{2}\right)\right)\quad(\text { 5.138 }) \\
```
でありこれを微分すると


```math
\frac{\partial \Omega}{\partial w_{i}}=\frac{1}{\sum_{k} \pi_{k} \mathcal{N}\left(w_{i} \mid \mu_{k}, \sigma_{k}^{2}\right)} \sum_{j} \pi_{j} \mathcal{N}\left(w_{i} \mid \mu_{j}, \sigma_{j}^{2}\right) \frac{\left(w_{i}-\mu_{j}\right)}{\sigma^{2}}\quad(\text {!!}) \\
```
が得られます
<a id="eq:1.152"></a>
------------------------------

ここでは、一般に$\mathcal{N}\left(x \mid \mu, \sigma^{2}\right)$の$x$による微分は以下のようになることを用いています。

```math
\mathcal{N}\left(x \mid \mu, \sigma^{2}\right)=\frac{1}{\left(2 \pi \sigma^{2}\right)^{1 / 2}} \exp \left\{-\frac{1}{2 \sigma^{2}}(x-\mu)^{2}\right\}
```
のとき

```math
\frac{\partial \mathcal{N}}{\partial x}=-\frac{\left(x-\mu\right)}{\sigma^{2}}\mathcal{N}\left(x \mid \mu, \sigma^{2}\right) 
```

-----------------------------
<a id="eq:1.152"></a>
<a id="eq:1.152"></a>

5.140式を利用すると

```math
\gamma_{j}(w)=\frac{\pi_{j} \mathcal{N}\left(w \mid \mu_{j}, \sigma_{j}^{2}\right)}{\sum_{k} \pi_{k} \mathcal{N}\left(w \mid \mu_{k}, \sigma_{k}^{2}\right)}\quad(\text { 5.140 }) \\
```
(!!)は

```math
\frac{\partial \Omega}{\partial w_{i}}=\sum_{j} \gamma_{j}\left(w_{i}\right) \frac{\left(w_{i}-\mu_{j}\right)}{\sigma_{j}^{2}}
```
と書き換えられます

これを(!)に代入して

```math
\frac{\partial \widetilde{E}}{\partial w_{i}}=\frac{\partial E}{\partial w_{i}}+ \sum_{j} \gamma_{j}\left(w_{i}\right) \frac{\left(w_{i}-\mu_{j}\right)}{\sigma_{j}^{2}}\quad(\text { 5.141 }) \\
```
が示されます



参考:https://www.microsoft.com/en-us/research/wp-content/uploads/2016/05/prml-web-sol-2009-09-08.pdf
jQuery　セレクターの取得方法まとめ（位置で取得）

jqueryセレクターの取得方法まとめです。

#事前準備
以下のhtmlを使用して説明します

##HTMLファイル

```html
  <body>
    <div class="block sec1">
      <h1>見出し（h1タグ）</h1>
      <p>中身１（pタグ）</p>
      <p>中身２（pタグ）</p>
      <p>中身３（pタグ）</p>
    </div>
    <div class="block sec2">
      <p>中身4(pタグ)</p>
      <p>中身5(pタグ)</p>
      <p>中身6(pタグ)</p>
      <div>補足(divタグ)</div>
    </div>
    <div class="block sec3">
      <p>中身7（pタグ）</p>
      <p>中身8（pタグ）</p>
      <p>中身9（pタグ）</p>
    </div>
  </body>

```
##実行結果
※１部CSSで色付けしています
[![Image from Gyazo](https://i.gyazo.com/3f68f5d1a4f93f7177f60e778ebf9612.png)](https://gyazo.com/3f68f5d1a4f93f7177f60e778ebf9612)

#番号を指定して取得する
０が数える基準となります。0＝１番目、１＝２番目・・・・

##eq(equal)　等しい
$("p:eq(2)");
p要素の３番目を取得
「中身３」
##gt(greater than)　より大きい
$("p:gt(2)");
p要素の３番目より大きい要素を全て取得
「中身３」から「中身９」
##lt(less than)　より小さい
$("p:lt(2)");
p要素の３番目より小さい要素を全て取得
「中身１」「中身２」
##even　偶数
$("p:even");
p要素の偶数番号を取得
「中身１」「中身3」「中身5」「中身7」「中身9」
##odd　奇数
$("p:odd");
p要素の奇数番号を取得
「中身2」「中身4」「中身6」「中身8」

#先頭を取得する(first)
##first
$("p:first");　
p要素の最初の１つを取得
「中身１」
##first-child
$("p:first-child");
親が同一で最初のp要素を厳密に全て取得
「中身４」と「中身７」

「中身１」は\<div class="block sec1">の最初（０番目）が
divタグ(pタグではない)のため取得されない

##first-of-type
$("p:first-of-type");
親が同一の最初のp要素を全て取得
「中身１」「中身４」「中身７」

#最後を取得する(last)
##last
$("p:last");
p要素の最後の１つを取得
「中身９」

##last-child
$("p:last-child"); 
親が同一で最後のp要素を厳密に全て取得
「中身３」と「中身９」

「中身6」は\<div class="block sec2">の最後が
divタグ(pタグではない)のため取得されない

##last-of-type
$("p:last-of-type");
親が同一で最後のp要素を全て取得
「中身3」「中身6」「中身9」

#n番目を取得する(nth)
nthはCSS由来のため１番目は(1)になります

##nth-child()
$("p:nth-child(2)");
親が同一で２番目のp要素を厳密に全て取得
「中身１」「中身５」「中身８」

中身１が取れる理由は\<div class="block sec1">では
最初のh1タグが１番目とカウントされるため

()内では偶数奇数判定や数式も使用可能です
even  偶数番目
odd   奇数番目
3n+1　３の倍数＋１

##nth-of-type()
$("p:nth-of-type(2)");
親が同一で２番目のp要素を全て取得
「中身２」「中身5」「中身8」

##nth-last-child()
$("p:nth-last-child(2)");
親が同一で最後から２番目のp要素を厳密に全て取得
「中身2」「中身6」「中身８」

中身６が取れる理由は\<div class="block sec2">では
最後にdivタグ（補足）があるため１番目としてカウントされている

##nth-of-type()
$("p:nth-of-type(2)");
親が同一で２番目のp要素を全て取得
「中身2」「中身5」「中身8」

#後を取得する(+/~)
##+
$(".sec1 + div"); 
クラス.sec1の直後のdivを取得
\<div class="block sec2">全体

##~
$(".sec1 ~ div");
クラス.sec1以降のdivを全て取得

\<div class="block sec2">全体
\<div class="block sec3">全体

#子孫や子の取得
##半角スペース開け
$("body div")
body内全てのdiv要素を取得する(子孫)

\<div class="block sec1">全体
\<div class="block sec2">全体
\<div>補足(divタグ)</div>
\<div class="block sec3">全体

##>
$("body > div")
body内直下全てのdiv要素を取得する（子）
\<div class="block sec1">全体
\<div class="block sec2">全体
\<div class="block sec3">全体
Flutter+firebaseでアプリが起動しないときの対処法

# 問題

起動すると下記のような例外でアプリが起動しない

```
flutter run -d XXXXXXXXXXXXX
Launching lib/main.dart on iPhone 11 in debug mode...
Running pod install...                                             14.3s
Running Xcode build...
 └─Compiling, linking and signing...                        19.6s
Xcode build done.                                           205.3s
Configuring the default Firebase app...
*** First throw call stack:
(
        0   CoreFoundation                      0x00007fff23e3cf0e __exceptionPreprocess + 350
        1   libobjc.A.dylib                     0x00007fff50ba89b2 objc_exception_throw + 48
        2   CoreFoundation                      0x00007fff23e3cd4c +[NSException raise:format:] + 188
        3   Runner                              0x000000010ac7e602 +[FIRApp configure] + 130
        4   Runner                              0x000000010b1d9c89 -[FLTCloudFirestorePlugin init] + 217
        5   Runner                              0x000000010b1d9a96 +[FLTCloudFirestorePlugin registerWithRegistrar:] + 262
        6   Runner                              0x000000010ac7984c +[GeneratedPluginRegistrant registerWithRegistry:] + 204
        7   Runner                        <…>
This is taking longer than expected...
```

# 対策

FirebaseのコンソールでAppを予め作っておき、 `GoogleService-Info.plist` をプロジェクトに追加しておく

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9294/14d5164a-fc13-4900-76af-d3016af544a9.png)

これをちゃんと入れておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9294/ec737f59-6986-fee4-22eb-b713c63110af.png)

# その他

チュートリアルにはアプリ作ってから起動している風なこと書いてあるけど全然そんな事ありません
（あたりまえなのかもしれない）
https://codelabs.developers.google.com/codelabs/flutter-firebase/index.html

`pubspec.yaml` にfirebase系のdependencyを追加した瞬間からアプリが動かなくなるので、追加するときには作っておきましょう!(という学び)
PRML　演習問題 5.38（基礎）　解答 

## 問題
> 一般的な結果(2.115)を用いて、ベイズニューラルネットワークモデルのラプラス近似による予測分布(5.172)を導け。

## 参考
```math
\begin {align*}
p(\mathbf{x}) &=\mathcal{N}\left(\mathbf{x} \mid \boldsymbol{\mu}, \mathbf{\Lambda}^{-1}\right)
\tag{2.113}
\end {align*}
```

```math
\begin {align*}
p(\mathbf{y} \mid \mathbf{x}) &=\mathcal{N}\left(\mathbf{y} \mid \mathbf{A} \mathbf{x}+\mathbf{b}, \mathbf{L}^{-1}\right)
\tag{2.114}
\end {align*}
```

```math
\begin {align*}
p(\mathbf{y})=\mathcal{N}\left(\mathbf{y} \mid \mathbf{A} \mathbf{\mu}+\mathbf{b}, \mathbf{L}^{-1}+\mathbf{A} \mathbf{\Lambda}^{-1} \mathbf{A}^{\mathbf{T}}\right)
\tag{2.115}
\end {align*}
```

```math
\begin {align*}
p(t \mid \mathbf{x}, \mathcal{D}, \alpha, \beta)=\mathcal{N}\left(t \mid y\left(\mathbf{x}, \mathbf{w}_{\mathrm{MAP}}\right), \sigma^{2}(\mathbf{x})\right)
\tag{5.172}
\end {align*}
```

```math
\begin {align*}
\sigma^{2}(\mathbf{x})=\beta^{-1}+\mathbf{g}^{\mathrm{T}} \mathbf{A}^{-1} \mathbf{g}
\tag{5.173}
\end {align*}
```

## 方針
今回の問題においてはガウス分布の周辺化において成り立つ上記の(2.115)を利用して、丁寧に数式を追いながら(5.172)を導けばよい。

## 解答
(2.113)に相当する今回の事前分布はラプラス近似によって本文の(5.162)~(5.167)を用いて、

```math
\begin {align*}
p(\mathbf{w} \mid \mathcal{D}, \alpha, \beta) \simeq q(\mathbf{w} \mid \mathcal{D})=\mathcal{N}\left(\mathbf{w} \mid \mathbf{w}_{\mathrm{MAP}}, \mathbf{A}^{-1}\right)
\tag{2.113'}
\end {align*}
```

と書くことができる。
また、(2.114)に相当する今回の条件付き確率は(5.171)で与えられているため

```math
\begin {align*}
p(t \mid \mathbf{x}, \mathbf{w}, \beta) \simeq \mathcal{N}\left(t \mid y\left(\mathbf{x}, \mathbf{w}_{\mathrm{MAP}}\right)+\mathbf{g}^{\mathbf{T}}\left(\mathbf{w}-\mathbf{w}_{\mathrm{MAP}}\right), \beta^{-1}\right)
\tag{2.114'}
\end {align*}
```
とおく。

これらの(2.113')(2.114')を用いて変数の対応に注意しながら(2.115)で示される周辺化を行うと、

```math
\begin {align*}
p(t \mid \mathbf{x}, \mathcal{D}, \alpha, \beta)=\mathcal{N}\left(t \mid y\left(\mathbf{x}, \mathbf{w}_{\mathrm{MAP}}\right), \sigma^{2}(\mathbf{x})\right)
\tag{5.172}
\end {align*}
```

```math
\begin {align*}
\sigma^{2}(\mathbf{x})=\beta^{-1}+\mathbf{g}^{\mathrm{T}} \mathbf{A}^{-1} \mathbf{g}
\tag{5.173}
\end {align*}
```

を導くことができた。
さくらのVPSでディスク拡張

一般的なやり方は 公式のドキュメント [さくらのVPS スケールアップ](https://help.sakura.ad.jp/360000090562/) を参照してください。以下は一事例として。

今回、ちょっとした手違いで一気にディスクが満杯になってしまったVPSホストをスケールアップして一時凌ぎをしています。スケールアップはVPSのコントロールパネルから実施します（サーバを一旦落とす必要があります）。スケールアップ完了後に、sshログインしてディスク拡張を開始します。ディスクフルのエラーで`yum`も動かないので、まず、なんとか要らないファイルを探して1G程度空きを作った状態です。

まずはファイルシステムを作るところまで。

```bash
yum -y install gdisk
sgdisk -s /dev/vda
gdisk /dev/vda
# 全てデフォルト値でパーティションを追加 (公式ドキュメント参照)
reboot
mkfs.xfs /dev/vda5
```

それからマウントポイントを決めます。ここではたと気がつくのですが、ルートパーティションがそのまま広くなるのではなくて、大きくなったディスクをどのディレクトリに割り当てるか、という形でしか拡張が出来ません（lvextendとかは使えないものか…）。今回は悩んでいる時間もなかったので、ひとまず、一番容量を食ってしまっている`/opt`を新しいパーティションに割当てなおすことにしました。

```bash
cd /
mv opt opt.bak
mkdir opt
mount /dev/vda5 /opt
mv opt.bak/* /opt/
```

その場しのぎ感が凄いですが、とりあえずたっぷりスペースを手に入れました。

```bash
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda4       196G   57G  140G  29% /
devtmpfs        7.9G     0  7.9G   0% /dev
tmpfs           7.9G     0  7.9G   0% /dev/shm
tmpfs           7.9G  8.4M  7.9G   1% /run
tmpfs           7.9G     0  7.9G   0% /sys/fs/cgroup
/dev/vda2       497M  216M  281M  44% /boot
tmpfs           1.6G     0  1.6G   0% /run/user/1001
/dev/vda5       600G  136G  464G  23% /opt
```

再起動後もマウントされるようにfstabを編集します。

```bash:/etc/fstab
UUID=(blkidで調べたID) /opt xfs defaults 0 2
```

再起動して、問題がなければ完了です。

```bash
reboot
```

## 関連
- [さくらのクラウドでディスク増設](https://lumber-mill.co.jp/notes/tips/130816_linux.html)
Deno で HTML をパースし DOM を走査する

**Parsing HTML in Deno**

Deno は標準では DOM をサポートしていませんが、DOM を扱えるようにするライブラリが公開されています。

ところが、ドキュメントが Node.js 用のままであったり不親切だったので、初めて使うと戸惑いました… (汗) 。

# 1. 使うライブラリ

Deno 用：

- tbjgolden/[deno-htmlparser2](https://github.com/tbjgolden/deno-htmlparser2) - GitHub
- DenoBRComunitty/[domhandler](https://github.com/DenoBRComunitty/domhandler) - GitHub
- DenoBRComunitty/[domutils](https://github.com/DenoBRComunitty/domutils/) - GitHub

オリジナル：

- fb55/[htmlparser2](https://github.com/fb55/htmlparser2) - GitHub
- fb55/[domhandler](https://github.com/fb55/domhandler) - GitHub
- fb55/[domutils](https://github.com/fb55/domutils) - GitHub

# 2. ソースコード

いずれのライブラリも、Deno 用はしっかりした CDN では公開されていないため、GitHub からソースコードを直接ダウンロードするか、githack.com のような非公式の WEB サービスを利用して import します。

Deno では TypeScript を利用できますが、ここでは JavaScript で記述しています。

```js:main.js
import { Parser } from 'https://rawcdn.githack.com/tbjgolden/deno-htmlparser2/01b2d3da3911a9d3dc134f4b68b230da5c39c5f3/htmlparser2/index.ts';
import { DomHandler } from 'https://rawcdn.githack.com/DenoBRComunitty/domhandler/5562474d5bd8d78f932fdf1df3c0ebbba50de3c0/mod.ts';
import { getText, getElementById } from 'https://rawcdn.githack.com/DenoBRComunitty/domutils/581a32557fda430c0d9ebc167f0cb4cb7414f55d/mod.ts';

// 
const parse = html => new Promise((resolve, reject) => {

	const handler = new DomHandler((error, dom) => {
		if ( error ) {
			reject(error);
		} else {
			resolve(dom);
		}
	});

	const parser = new Parser(handler);
	parser.parseComplete(html);

});

// 
const dom = await parse('Xyz <script id="test">const foo=\'<<bar>>\';</script><!--<!-- Waah! -- -->');

console.log(getText(getElementById('test', dom)));

// 出力: const foo='<<bar>>';
```

DOM の走査は domutils を使用します。

domutils はオブジェクトのメソッドではなく静的な関数として機能が提供されているため、メソッドチェーンでなく括弧で囲っていく形になります (少し残念) 。

domutils で利用可能な関数は以下のページで確認できます。

参考「[fb55/domutils/docs/README.md - GitHub](https://github.com/fb55/domutils/blob/master/docs/README.md)」

Web API の全ての機能が利用できるわけではありません。
SQL Server: 大量のデータ更新をブロッキングを発生させずに高速に実施する方法

# 背景
テーブルに対して大量のデータ更新を実施する際、長時間ロックを獲得することになり、その間は他の更新系クエリをブロックしてしまうことになります。

例えば、以下のクエリなどです。

```sql
UPDATE Table1 SET Colmun1 = 1 WHERE Column2 = 2
```

Column2 = 2なレコード数が例えば1億レコードあった場合、ハイスペックなマシンでもそれなりに時間がかかることが予想されます。
また、トランザクションログの肥大も気になるところです。

一方で、カーソルを使ってループして1レコードずつUPDATEしていく方法も考えられます。

例えば、以下のクエリなどです。

```sql
DECLARE @PK INT
DECLARE Cursor1 CURSOR FOR
    SELECT ColumnPK FROM Table1 WHERE Column2 = 2

OPEN Cursor1

FETCH NEXT Cursor1
    INTO @PK

WHILE @@FETCH_STATUS = 0
BEGIN
    UPDATE Table1 SET Colmun1 = 1 WHERE ColumnPK = @PK

FETCH NEXT Cursor1
    INTO @PK
END
```

この方法だと、1行ずつ更新時にコミットしていくため、他の更新クエリとの競合を心配する必要はほぼありません。また、単純復旧モデルであったり、完全復旧モデルでもログバックアップが定期的に実施されている場合はトランザクションログ肥大についてもあまり気にする必要はありません。

一方で、対象レコード数が多くなるほど膨大な時間がかかるようになってしまいます。

ミック本では、前者の一括更新は「ガツン系」、後者の一行ずつの更新は「ぐるぐる系」と呼ばれています。海外だとぐるぐる系は「RBAR Processing(Row By Agonizing Row Processing」という用語で認識されているようです。

ある程度までのレコード数であれば、正直どちらで実行しても問題ない感はありますが、大量のレコードを更新する際には一工夫したほうが安全に更新を終えることができます。

本記事ではその方法についてご紹介します。

# 方法

以下のクエリが、大量のデータ更新をブロッキングを最小限にとどめつづ高速に完了させるためのテンプレです。

```sql
declare @DataCount int
declare @E int, @R int
declare @CommitCount int = 500    --ループで削除していくとき、1ループあたりの更新レコード数
declare @Start bigint
declare @End bigint

-- 扱いやすくするために、連番を付与しテーブルへ格納
select
	ColumnPK, rownum
into #UpdateTarget
from
(
	select
		ColumnPK
		,row_number() over (order by ColumnPK) as rownum
	from
        Table1
    where
        Column2 = 2
)
as a
order by rownum

create index IX_#UpdateTarget on #UpdateTarget
(rownum) include (ColumnPK)

-- 件数取得
select @DataCount = count(*) from #UpdateTarget

-- 初期値
set @Start = 1
set @End = @CommitCount

-- レコード単位でのロックエスカレーションを一時的に無効にすることでブロッキングを防止
-- dbcc traceon(1224) --sysadminロールに属するログインで実行する場合はこちらも実行

-- CommitCount単位で更新
while (@DataCount >= @Start)
begin
	update Table1 SET Column1 = 1
	where
		ColumnPK in
			(select ColumnPK from #UpdateTarget
				where @Start <= rownum and rownum <= @End
			)
	option (optimize for (@Start = 1, @End = 500)) -- 最大でも500件ずつの更新で確定なので、プラン固定させたい
	select @R = @@rowcount, @E = @@ERROR

	if @E <> 0
	begin
		select 'error', @E, @R, @Start, @End
		break
	end
	else
	begin
		set @Start = @Start + @CommitCount
		set @End = @End + @CommitCount
	end
end

--dbcc traceoff(1224) --sysadminロールに属するログインで実行する場合はこちらも実行
```

ガツン系とぐるぐる系の折衷案といったところで、数百行のコミット粒度でループして更新していきます。

500レコードずつくらいだと、まずロックエスカレーションが起きることもないと思いますが、一応トレースフラグで明示的にロックエスカレーションをOFFにしています。(トレースフラグの設定にはsysadminロールに属するログインで実行する必要があるため、デフォルトではコメントアウトしています）

コミット粒度を10万等に増やすのもありですが、1回の更新時間が長くなってしまうとブロッキングリスクを高めてしまうことになるため、コミット粒度が小さいに越したことはありません。
まずは小さい粒度からスタートし、遅すぎたらコミット粒度を増やしていくといいと思います。

# まとめ
大量のデータ更新をブロッキングを発生させずに高速に実施する方法についてご紹介しました。SQL Serverにおいてはプロダクション環境で十分に実績のある方法となりますので、似たようなことをやる必要がある方の参考になれば幸いです。
（ただし、メンテ時間とれるならそれだけで良い話ではあったりします。）
xargsを用いた連続処理とbashコマンド

#概要
findなどのコマンドを利用してファイルを検索して、xargsに渡して処理をさせたい
しかし、対象ファイルが複数になると処理が連続して行われるために期待する動作にならない場合がある

以下のコマンドではテキストファイルを検索して、ファイルの中身をxxdコマンドの第一引数として渡している
出力結果として期待するのはファイル毎の処理結果が改行されて出力されることだが、
xxdによって改行コードが取り除かれるため、全ての処理結果が一行につながって出力されてしまう。
※xxdコマンドは16進数dumpなどが可能なコマンド

```
find *.txt | xargs -L 1 -I{}　xxd -p -r {}
```

このような場合、bashコマンドを使用する
以下のようにbashコマンド使うと、その中でbashを立ち上げてコマンドを実行することができるため、
改行コードを挟むなどの操作が可能

```
find *.txt | xargs -L 1 -I{} bash -c 'xxd -p -r {}; printf "\n"'
Python 可変引数定義されたクラスを継承するときの覚書

PythonのGUI(Tkinter)を使ってプログラムを書いていると、GUI Class継承する場合に
もれなく可変引数も継承されます。
しかし、継承先のClassで引数を追加すると、継承元でエラーが発生して使いづらい状況です。

例えば、TkinterのCheckbuttonは初期値を設定する事ができません。
初期値を設定できるようなCheckbuttonを作った際の覚書。

普通に記述すると、下記のようになります。

```Python:NormalCheckbox
cv = tk.BooleanVar()
cb = tk.Checkbutton(self, parent, variable=cv)
cv.set(True)  #初期値設定
```

しかし、私はこういう風に書きたい。


```Python:ShimplCheckbox
cb = tk.Checkbutton(self, parent, check=True)
```

そこで、tk.Checkbuttonを継承して、SimpleCheckを作ってみます

```Python:SimpleCheckbox.py
# Initial value = check=True or False
class SimpleCheck(tk.Checkbutton):
    def __init__(self, parent, *args, **kw):
        self.flag = kw.pop('check')
        self.var =  tk.BooleanVar()
        if self.flag:
            self.var.set(True)
        self.txt = kw["text"]
        tk.Checkbutton.__init__(self, parent, *args, **kw, variable=self.var)

    def get(self):
        return self.var.get()
```

しかし、このコードには問題があります。
それは、引数"check"を指定しなければエラーが発生するという問題です

```Python:mainloop
if __name__ == '__main__':
    app  = tk.Tk()
    sc1 = SimpleCheck(app, check=True, text="hoge")
    sc1.pack()
    sc2 = SimpleCheck(app)
    sc2.pack()

    print(sc1.getText())    
    print(sc1.cget('text'))#same result
    app.mainloop()
```

```Text:error
Traceback (most recent call last):
  File "arg_test.py", line 24, in <module>
    sc2 = SimpleCheck(app)
  File "arg_test.py", line 7, in __init__
    self.flag = kw.pop('check')
KeyError: 'check'
```

そこで可変引数を使った継承における、引数の取り出し方法を覚書として示す。
![Check.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506495/221d303f-ee69-5eb7-e26a-cc21ab6a9251.png)
三項演算子を使った場合、"pass"を使うとエラーが出るようです。

```Python:SimpleCheck.py
import tkinter as tk

# Check value  :check=True or False (Default False)
# Label text   :text=Keword
class SimpleCheck(tk.Checkbutton):
    def __init__(self, parent, *args, **kw):
        self.flag = kw.pop('check') if('check' in kw) else False
        self.txt  = kw['text']      if('text' in kw) else ""
        self.var =  tk.BooleanVar()
        if self.flag:
            self.var.set(True)
        tk.Checkbutton.__init__(self, parent, *args, **kw, variable=self.var)

    def get(self):
        return self.var.get()

    def getText(self):
        return self.txt

if __name__ == '__main__':
    app  = tk.Tk()
    sc1 = SimpleCheck(app, check=True, text="hoge")
    sc1.pack()
    sc2 = SimpleCheck(app)
    sc2.pack()

    print(sc1.getText())    
    print(sc1.cget('text'))#same result
    app.mainloop()
```

追記@shiracamusさんからアドバイス頂きまして
三項演算子を使わなくてもDicのpop第二引数で初期値を設定できるようです。
アドバイスありがとうございました。

```Python:diff
    def __init__(self, parent, *args, **kw):
        self.flag = kw.pop('check', False)
        self.txt  = kw['text']  if('text' in kw) else ""
Git：リポジトリ単位で別のアカウント情報を設定する

リポジトリごとに別のアカウント情報を設定する方法

```bash
cd repo
git config --local user.name "リポジトリ用アカウント名"
git config --local user.email "リポジトリ用メールアドレス"
```

repo/config に user が追加されます

```
[user]
name = リポジトリ用アカウント名
email = リポジトリ用メールアドレス
```
Vueの動的コンポーネントで爆詰まりした

# Vueの\<component>コンポーネント

動的にコンポーネントを__切り替える必要__があったので、`vue dynamic component`と検索してヒットした[公式のガイド](https://jp.vuejs.org/v2/guide/components-dynamic-async.html)通り`<component>`を使ってみたが、プロパティの指定方法で詰まった挙句、別の方法で実装した。

## \<component\>の欠陥

`<component>`の`:is`でコンポーネントを指定したはいいものの、そのコンポーネントではプロパティを要求していた。もちろん`<component>`では細かな操作ができるはずもなく、[この記事](https://stackoverflow.com/questions/43929099/how-to-bind-dynamic-props-to-dynamic-components-in-vuejs-2)のように全くスマートではない方法で実装する必要がある。しかも当環境で実装してもやたらエラーが発生してろくに使えない。

## v-if

動的コンポーネントで検索して公式がああ言ってるのだから、これ以外じゃ方法がないと思い込んでたので、にっちもさっちもいかなくなった。仕方がないので後回しにして他のコンポーネントを実装していった。`v-if`ディレクティブを見つけた。

[条件付きレンダリング](https://jp.vuejs.org/v2/guide/conditional.html)

言うまでもないが、`v-if`で指定した理論値がtrueの場合、コンポーネントをレンダリングするディレクティブである。

```vue

<div>
      <hoge v-if="content === 'hoge'" :hoge="hoge"></hoge>
      <fuga v-if="content === 'fuga'" @fuga=”fuga"></fuga>
      <piyo v-if="content === 'piyo'"></piyo>
</div>
```

`content`が特定の文字列に一致した場合にのみコンポーネントが生成しレンダリング、一致しなくなったコンポーネントは破棄されるようになる。タブを使ったUIでも十分に機能するだろう。

## \<component\>はいつ使うのか

多分一生訪れない。`<component>`を使うケースあればコメントしてください。
フォームに特定の文字列を入力して別ページにジャンプする方法

#入力フォームで特定の文字列を入力するとあるページにジャンプする秘密の合言葉的な動きをさせたい！

##秘密の合言葉でページを開けたらかっこいいと思いません？
なおかついろいろ応用が利きそうだと感じたので共有させていただきます。

```
　　　　<form>
          <input type="text" id="input_message" value="">
          <input type="button" onclick="func1()" value="ジャンプ">
        </form>

        <script language="javascript" type="text/javascript">
        　　function func1() {
　　　　　　　var input_message = document.getElementById("input_message").value;
           　if(input_message == '自分が決めた言葉'){ 
          　　　window.location.href="飛んでほしいページのリンク";
         　　}　　
        　　}
        </script>

```
##スクリプトの説明
入力、送信フォームを作るformタグの中にinputタグで入力フォーム、ボタンを作成。

その下に、scriptタグでJavascritを作成
func1という関数をつくりまず入力された文字列を取得
次に、if文で入力された文字列と自分が決めた文字列を比較して
trueならwindow.location.hrefでURLを設定
すると、自分が決めた文字列を入力しジャンプボタンをクリックすると設定したリンクへジャンプすることができるようになる。

##別タブで開きたい場合
設定したリンクを別のタブで開きたい場合は

```
window.open('URL','_brank');
```
で別タブで開くことができる。


###最後に
コードの改良点がございましたらコメントしていただけるとありがたいです。