OmniAICreator/Qiita-1.07M huggingface dataset:
プライマリーカテゴリーが同じ記事の一覧を作成する

最近の記事一覧があり、さらに任意のプライマリーカテゴリーに属する記事のリンク10件を一覧を表示させる。
ただし、任意のプライマリーカテゴリーのリンクには、すでに最近の記事一覧に既出の記事は含めない。
下記の例は任意のプライマリーカテゴリーを「MovableType Tips」とする場合。

```
<ul>

//任意のプライマリーカテゴリーに属する記事10件をカウントするためのカウンター
<mt:SetVar name="counter" value="1">

//モディファイアunique="1"を設定してページ内でリンクが重複しないようにする
<mt:Entries include_blogs="3" lastn="0" unique="1">

//カウンターが10以内の場合に処理をする条件分岐
<mt:If name="counter" le="10">

//対象のカテゴリーを「MovableType Tips」、対象の範囲をプライマリーカテゴリーにする
<mt:IfCategory name="MovableType Tips" type="primary">

    <li class="menu_item"><mt:EntryTitle></li>

//処理が1件終わるごとにカウンターに1を足す
    <mt:SetVar name="counter" op="+" value="1">
</mt:IfCategory>
</mt:If>
</mt:Entries>
</ul>
```

※こちらは下記の記事を再編集したものです。
「プライマリーカテゴリーが同じ記事の一覧を作成する」
https://www.drivemenuts.com/blog/archives/2020/03/post-533.html
Django2におけるカスタムテーンプレートタグ（フィルタ）の設定方法

## 実行環境
python=3.8.2
Django=2.2.5
PC = Mac(catalina)

## フォルダ作成
ここではアプリ名が__'myapp'__であると仮定します。

まずアプリ内に`templatetags`フォルダを作り、
その中に\_\_init\_\_.pyと任意のカスタムフィルタファイル(ここではcalc.py)を作る。
ただし、\_\_init\_\_.pyには何も書かなくて大丈夫です。

```
myapp/
    __init__.py
    models.py
    templatetags/
        __init__.py
        calc.py
    views.py
```

## テンプレートフィルタ作成

次にいcalc.pyにテンプレートフィルタを作っていきます。
テンプレートフィルタでは１つか２つの引数を受け取ることができます。

今回は与えられた数を２倍にするという簡単なテンプレートフィルタを作成します。

```python:calc.py
from django import template

register = template.Library()

@register.filter
def multiply(value1):
    return value1 * 2
```
## setting.pyの変更


setting.pyの変更も行っていきます。
次のようにsettings.pyを変更してください。

```django:settings,py
INSTALLED_APPS = [
    ・・・
    'myapp',
    'myapp.templatetags.calc', {% <- ここを追加 %}
]

```

```django:settings,py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [TEMPLATE_DIR, ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
            'libraries': {　
                'markdown': 'myapp.templatetags.calc', {% <- ここを追加 %}
            }
        },
    },
]

```

## テンプレートファイルでカスタムフィルタを適用

最後に、templateファイルに`{% load ファイル名 %}`を追加することで、
カスタムテンプレートフィルタを使えるようになります。

```django

{% load calc %}

<!-- num1=3のとき、HTML上には6が表示される -->
<span>掛け算:{{ num1 | multiply }}</span>
```

## 参考
- https://teratail.com/questions/185606
- https://stackoverflow.com/questions/40686201/django-1-10-1-my-templatetag-is-not-a-registered-tag-library-must-be-one-of/42881074
- https://qiita.com/Thort/items/88ed3150339090ef0c98
- https://djangobrothers.com/blogs/custom_template_tags_filters/
- https://qiita.com/ragnar1904/items/1c87d31178f178088a94#%E6%A6%82%E8%A6%81
- https://docs.djangoproject.com/en/3.0/howto/custom-template-tags/
別リージョンからのPaaS接続検証(SQLDatabase)

東日本リージョンのFunctionsから東西両リージョンのSQL Databaseにアクセスしようと思ったら盛大に躓いたので、その共有デス

## 1. システム構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355390/da59f533-a025-b027-5500-c98bc19fa5cb.png)
※SEP：サービスエンドポイントの略

## 2. 検証目的
東西両方のFunctionsからSQLDatabaseに書き込みを行う。

## 3. 検証内容
FucntionsからDBに書き込む処理を用意するのがめんどくさかったので、手元にあったVMにSqlcmdをインストールして、connectできることを確認する。

## 4-1. 検証結果（サービスエンドポイント編）
* SQLDatabaseのFW設定から既存仮想ネットワークを選択し、サービスエンドポイントを作成して追加する流れなんだが、そもそもSQLDatabaseと異なるリージョンの仮想ネットワークが選択できない。
* もしかすると、グローバルピアリングすれば広報されてできるようになるかもと一抹の期待を持ってやってみたが、結果変わらず。

## 4-2. 検証結果（プライベートリンク編）
プライベートリンクなるものがあることが判明し、サービスエンドポイントを諦めて、プライベートリンクで検証実施。プライベートリンクを作成するときにPaaSとサブネットを選択すると、選択したサブネット内にPaaSに接続するIPアドレスが1つ払い出されて、そこから接続することになるようです。（CNAMEがプライベートエンドポイントを示すようになります）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355390/c9c8205d-5879-58ff-7b11-ae99ccadd5e8.png)
※P-EP：プライベートエンドポイントの略

▼サービスエンドポイント接続時のホスト名は以下の通りですが、

```bash

[root@rg01-jaea-vm01 ~]# sqlcmd -S rg01-jaea-sqlsrv01.database.windows.net -U sqlsrv01 -P 'xxxxxxxxxx'
```

▼一方、プライベートリンク接続時のホスト名は以下の通りとなります。

```bash

[root@rg01-jaea-vm01 ~]# sqlcmd -S rg01-jaea-sqlsrv01.database.windows.net -U sqlsrv01 -P 'xxxxxxxxxx'
[root@rg01-jaea-vm01 ~]# nslookup rg01-jaea-sqlsrv01.database.windows.net
Server:		168.63.129.16
Address:	168.63.129.16#53

Non-authoritative answer:
rg01-jaea-sqlsrv01.database.windows.net	canonical name = rg01-jaea-sqlsrv01.privatelink.database.windows.net.
Name:	rg01-jaea-sqlsrv01.privatelink.database.windows.net
Address: 10.0.0.8

[root@rg01-jaea-vm01 ~]# 
```


## 当検証の際に利用した参考サイト
* [PaaSにプライベート接続！Azure Private Linkを試してみた](https://www.michikusayan.com/entry/20190919/1568899206 )
* [SQLCMDのインストール手順](https://docs.microsoft.com/ja-jp/sql/linux/sql-server-linux-setup-tools?view=sql-server-ver15)
* [Azure Private Linkとは何ですか？](https://docs.microsoft.com/en-us/azure/private-link/private-link-overview#availability)
* [Azure SQL Database と Data Warehouse の Private Link](https://docs.microsoft.com/ja-jp/azure/sql-database/sql-database-private-endpoint-overview)

SQLDatabaseのプライベートリンクは一般提供（GA）しているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355390/9a746dd6-078b-ecdc-35f1-dab59c17ae7b.png)
n進数という名前が出てくると「うっ頭が…」ってなる人のn進数講座（2）〜2進数の足し算、引き算について〜

基本情報技術を学んだ事がある人、学んでいる最中の人がいずれも悩んだ事があるだろうn進数の計算。
自分もその一人でした…。ですが、その状態から脱却すべく必死になって勉強した結果ある程度はわかる様になったので自分なりにわかりやすく解釈したものをここに残そうと思います。

今回は第２段ということで前回の続きになります。前回の記事は以下の通りになります。

[n進数という名前が出てくると「うっ頭が…」ってなる人のn進数講座（１）〜n進数の基本変換について〜](https://qiita.com/waka-ken/items/5658706c43303297784f)

#■n進数の足し算引き算について

##【足し算】

ぶっちゃけ足し算は余裕です。繰り上がりのタイミングさえ気をつければ１０進数と同じ考え方でいけます。

例）２進数の足し算

繰り上げのタイミングが２進数の場合２になるタイミングで次の桁にいく感じ

|   | 1 | 1 | 0 | 1 |
|:-:|:-:|:-:|:-:|:-:|
|  + | 1 | 0| 1 | 1 |
|  1 |  1 |  0 |  0 | 0 |

##【引き算】

これがややこしい…。なぜかというと補数という考え方が出てくるためです。

補数・・・「**先頭の１ビットは符号とする考え方**」

例）３と−３を表現する場合

| (3)| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|(-3)| 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
|sum| 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |

ふむふむ…。では、もしこの二つを足し算すると答えは**１００００１１０**つまり**１３４**ね！
…いやいや計算できてないやないかーい！

実はこれ−3の表記方法に間違いがあります。正解は１１１１１０１となります。

計算方法（考え方は）は以下の通り

３・・・００００００１１←まずこれに足すと９桁目に繰り上がる数を出すと、**１１１１１１００**となる。この１１１１１１００に＋１した数つまり**１１１１１１０１**←これが2の補数で表した−３になります！

はあ…。でも説明してもわかりにくいですよね…。
ってことで自分がどう考えているかというと

「２の補数＝**正の数を表記したものを全部反転させた後最後に＋１した数**」って覚えています。
　　
よって最後に例の計算はどのようになるかというと…。

| (3)| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|(-3)| 0 | 1 | 1 | 1 |1 | 1 | 1 | 1 | 0 | 1 |
|sum| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
↑最後9桁目の数は表記しないため結果**00000000=0**となるわけです。

#■次回は…

以上が２進数における足し算、引き算の計算方法についてでした。

どうでしょう？頭痛くなってきませんか？

次回は掛け算、割り算をやっていきたいと思います。

では次回まで〜〜
isEmpty の方が count==0 よりも良い理由

## 前置き
[Mediam](https://medium.com/better-programming/strings-comparison-isempty-vs-count-0-be80d701901b) から送られてきた Daily Digest の記事を理解の為に和訳して投稿します.
![スクリーンショット 2020-04-18 12.16.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233118/e8fa4a39-249b-d297-a3cf-40516df752ca.png)
isEmpty の方が count==0 の方が良いというものです.

これはApple自体が推奨しているもので、この記事は実際に何でなのかを紐解いてます.

## 実行速度が早い
isEmptyはO(1)で実行されるのに対し、countはO(n)、つまり文字サイズに応じて実行速度が発生します.（n:stringの数）

実際の実行結果は

![スクリーンショット 2020-04-18 12.19.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233118/d6e317f5-dfec-f717-9b3a-597ae26ae960.png)

isEmptyは文字サイズに依存せず、実行速度もほとんど変化がないのに対して、countは文字数の増加と共に実行速度が上がっています.

## 可読性が高い

```isEmptyVsCount.swift

let text: String = ""

if text.isEmpty {
  // 何かしらの処理
}

if text.count == 0 {
  // 何かしらの処理
}

```

と見比べた際に isEmpty の方が直感的に理解出来ます。

実際、文章にした際には

「もし文字列textが空白の場合」

と

「もし文字列textの文字数が0の場合」

という説明になり、日本語に落とし込んだ時に、前者の方が明らかに捻くれてないです.

可読性が高いですね。

## isEmptyはOptional型のstringの際には注意

文字列がoptional型で指定されている場合にはisEmptyの利用に気をつけなくてはいけません.

※[optional型で僕が過去に読んだ記事](https://qiita.com/mokumoku/items/5fef496f4e97a053e53e)

countの場合、そのまま利用出来ます

```countExample.swift

let text: String? = ""

text?.count == 0 {
  print("処理成功（コンパイル通ります）")
}

```


isEmptyの場合は

```wrong.swift

let text: String? = ""

if text?.isEmpty {
  //処理失敗（コンパイル通らない）
}

```

```correct.swift

let text: String? = ""

//#1
//真偽を判定
if text?.isEmpty == true {
  print("処理成功（コンパイル通ります）")
}

//#2
if text?isEmpty ?? true {
  print("処理成功（コンパイル通ります）")
}

//#3
//強制アンラップ
//個人的に非推奨
//強制アンラップはoptional使ってる意味があまりなくなるので極力避けたいところ
if text!.isEmpty {
  print("処理成功（コンパイル通ります）")
}

//#4
//guard let で optionalの中身がnilじゃ無い場合returnされる
guard let nonNilText = text else {return}
//returnされた文字列が空かを確認する
if nonNiltext.isEmpty? {
  print("処理成功（コンパイル通ります）")
  print("nilでも空でもない時にprintされます")
}

```

[引用元](https://medium.com/better-programming/strings-comparison-isempty-vs-count-0-be80d701901b)の著者は3番の強制アンラップを推奨していますが、僕はあんまり使いたくないです.


## 関数定義

isEmptyは「文字列の文字の有無をBooleanで返す」

countは「文字列に含まれる文字数（int）を返す」

ということで、空白を判定する場合にはcountを使うと遠回りになります.（実行速度の話と類似）


## SwiftLintでこの構文避けれる

[SwiftLint](https://github.com/realm/SwiftLint)でisEmptyが最適な場合にERRORやWARNINGを出してくれます.

![1_UOQql9WE_ATvnB3P54y4xA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233118/a46f7624-2e51-970b-26c0-0704f7fa94bd.png)

[引用]（https://medium.com/better-programming/strings-comparison-isempty-vs-count-0-be80d701901b）

isEmptyの利用を統一させる上で Best Practice だそう.


##まとめ

`isEmpty` は `count==0` よりも Apple では良いとされており、その理由は

- 実行速度が速い
- 可読性が高い
- 関数の定義に準じている

といった理由になります.注意点としては

- Stringがoptional型の場合はアンラップしてからじゃないとisEmptyは使えない

ということでした.

筆者もこれまで通り、isEmptyを意識してswiftを書いていこうと思う土曜日でした.
ちょっと古いバージョンのgit(2.16.6)を(2.26)にアップデートしようとしてハマった

yumで何気なく入れたgitのバージョンが2.16で、それが原因と思われる不具合があったので（結果的にはこのバージョンの不具合ではなくgitが複数入っていたせい？）、最新のgitをインストールしようとしたらいろいろハマったので共有。

Vagrant Sandbox で元に戻して作業しながらメモする。

#現在のバージョンを確認
```
$ git --version
git version 2.16.6
```
とりあえず、これはyumで入れたのでサクッと削除する。

```
$ sudo yum -y remove git
complete!
```
終わり。
一応確認。

```
$ git --version
git version 2.16.6
```
あら？？？まだgitコマンドは使える。

消え切っていない。

#インストール済みのパッケージの一覧を見てみる

```
$ yum list installed | grep git
crontabs.noarch                    1.11-6.20121102git.el7     @anaconda
git216-core.x86_64                 2.16.6-2.el7.ius           @ius
git216-core-doc.noarch             2.16.6-2.el7.ius           @ius
linux-firmware.noarch              20190429-72.gitddde598.el7 @base
net-tools.x86_64                   2.0-0.25.20131004git.el7   @base
```
git216おる・・・？
なんで？とりあえず消えていただく。。

```
$ sudo yum -y remove git216-core.x86_64
complete!
```

再度確認。

```
$ yum list installed | grep git
crontabs.noarch                    1.11-6.20121102git.el7     @anaconda
linux-firmware.noarch              20190429-72.gitddde598.el7 @base
net-tools.x86_64                   2.0-0.25.20131004git.el7   @base
```

いなくなった。

#gcc等のインストール

```
$ sudo yum install -y gcc curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker
Comlete!
```

実はこの状態で先に進めていくと、インストールは正常に終了するが、完了後gitのバージョンが「1.8.3」になるという現象に遭遇し、なんでやろう？と悩んだ。

現段階で再びインストール済のパッケージを見ると

```
$ yum list installed | grep git
crontabs.noarch                    1.11-6.20121102git.el7     @anaconda
git.x86_64                         1.8.3.1-21.el7_7           @updates
linux-firmware.noarch              20190429-72.gitddde598.el7 @base
net-tools.x86_64                   2.0-0.25.20131004git.el7   @base
```

となぜか「git.x86_64」が入っている。おそらく依存関係で必要なのだと思うが、それがあると2.26が入らない、、、のか、入るのだがこの「1.8.3」が優先されて、意味が分からない状態になる。（分かる人が見れば全然意味が分からなく無いのかもしれないが・・・）

ということで消す。

```
$ sudo yum -y remove git.x86_64

Complete!
```

再度確認

```
$ yum list installed | grep git
crontabs.noarch                    1.11-6.20121102git.el7     @anaconda
linux-firmware.noarch              20190429-72.gitddde598.el7 @base
net-tools.x86_64                   2.0-0.25.20131004git.el7   @base
```
消えた。
あとは、他記事にたくさん出てくる通り。

#git(2.26)をソースからインストール
```
$ wget https://www.kernel.org/pub/software/scm/git/git-2.26.1.tar.gz
$ tar -zxf git-2.26.1.tar.gz
$ cd git-2.26.1
$ make prefix=/usr/local all
$ sudo make prefix=/usr/local install
$ sudo ln -s /usr/local/bin/git /usr/bin/git
$ git --version
git version 2.26.1
```
GJ！＞自分
Bashで簡単にechoに色付けをする関数

## 使い方
以下の関数を何かしらの方法で使えるようにして下さい。

```
echo_color [Option] Text
```

オプションは以下のとおりです

オプション | 使い方
--- | ---
-d [数字] | デコレーションの種類
-b [色] | 背景色
-t [色]| 文字色
-n | 改行しない

## 一行で複数の色を使う

```bash
echo "$(echo_color -n -d 1 -t "green" "==>") $(echo_color -n -t "cyan" "こんな感じ")"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234470/2fa69794-9cb8-b56a-4315-7ccceb1d105e.png)


## 色
コメントにもありますが、以下の色を使用できます。

色 | 文字列
--- | ---
黒 | black
赤 | red
緑 | green
黄色 | yellow
青 | blue
マゼンタ | maganta
シアン | cyan
白 | white



## コード

```bash
#!/usr/bin/bash

# Color echo
# usage: echo_color -b <backcolor> -t <textcolor> -d <decoration> [Text]
#
# Text Color
# 30 or Black
# 31 or Red
# 32 or Green
# 33 or Yellow
# 34 or Blue
# 35 or Magenta
# 36 or Cyan
# 37 or White
#
# Background color
# 40 or Black
# 41 or Red
# 42 or Green
# 43 or Yellow
# 44 or Blue
# 45 or Magenta
# 46 or Cyan
# 47 or White
#
# Text decoration
# 0 => All attributs off (ノーマル)
# 1 => Bold on (太字)
# 4 => Underscore (下線)
# 5 => Blink on (点滅)
# 7 => Reverse video on (色反転)
# 8 => Concealed on


echo_color() {
    local backcolor
    local textcolor
    local decotypes
    local echo_opts

    echo_opts="-e"

    while getopts 'b:t:d:n' arg; do
        case "${arg}" in
            b) backcolor="${OPTARG}" ;;
            t) textcolor="${OPTARG}" ;;
            d) decotypes="${OPTARG}" ;;
            n) echo_opts="-n -e"     ;;
        esac
    done

    shift $((OPTIND - 1))

    case "${backcolor}" in
        "black"   | "Black"   ) backcolor="40" ;;
        "Red"     | "red"     ) backcolor="41" ;;
        "Green"   | "green"   ) backcolor="42" ;;
        "Yellow"  | "yellow"  ) backcolor="43" ;;
        "Blue"    | "blue"    ) backcolor="44" ;;
        "Maganta" | "maganta" ) backcolor="45" ;;
        "Cyan"    | "cyan"    ) backcolor="46" ;;
        "White"   | "white"   ) backcolor="47" ;;
        "40" | "41" | "42" | "43" | "44" | "45" | "46" | "47" ) : ;;
    esac

    case "${textcolor}" in
        "black"   | "Black"   ) textcolor="30" ;;
        "Red"     | "red"     ) textcolor="31" ;;
        "Green"   | "green"   ) textcolor="32" ;;
        "Yellow"  | "yellow"  ) textcolor="33" ;;
        "Blue"    | "blue"    ) textcolor="34" ;;
        "Maganta" | "maganta" ) textcolor="35" ;;
        "Cyan"    | "cyan"    ) textcolor="36" ;;
        "White"   | "white"   ) textcolor="37" ;;
        "30" | "31" | "32" | "33" | "34" | "35" | "36" | "37" ) : ;;
    esac


    echo ${echo_opts} "\e[$([[ -v backcolor ]] && echo -n "${backcolor}"; [[ -v textcolor ]] && echo -n ";${textcolor}"; [[ -v decotypes ]] && echo -n ";${decotypes}")m${@}\e[m"
}
```
LANケーブル挿してもポートのLEDがピカピカ光らない件

# 何が起きたのか？
WindowsPCとルータをLANケーブルで接続してもポートのLEDがピカピカ光らない！

# 故障？
WindowsPCを別のハブと同じLANケーブルで接続したら通信できる。
ルータを別のPCと同じLANケーブルで接続したら通信できる。

# 故障じゃない！！
じゃあ何が起きてんだよ...🤔

# 予想していなかった原因
これのせいだった...
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567239/ea3c8712-de43-2c0e-73fc-94dbe867c0d3.png)


ルータのLANポートが対応しているのは
「**10BASE-T**」と「**100BASE-TX**」のみ！

# 解決策
「**オートネゴシエーション**」に変更したら直った！
![2無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567239/8fb53868-b941-a8c9-d662-96644d800f96.png)


# 教訓
やっぱり物理層に近い側から調べていかないとダメだね！
ルーティングの順番について (Progateにて)

```ruby:routes.rb
  get "posts/:id" => "posts#show"
  get "posts/new" => "posts#new"
```
これは問題ないのに、、、

```ruby:routes.rb
  get "posts/new" => "posts#show"
  get "posts/:id" => "posts#new"
```

**どうしてこれはエラーになるのか？**

なぜなら、**「posts/:id」**の**「:id」**は、**変数**であり、
###変数を含むことで、あらゆるURLと合致してしまうから！

↓
ブラウザからリクエストされたURLが、**一致してほしいURLのルーティング**へと辿り着く前に、**あらゆるURLを含むルーティング**と合致してしまうため、このようなエラーが起こる。

##具体的に解説
####今回のルーティングエラーを理解するために、下記の２つのポイントを抑えておく。

- ルーティングは書かれたコードを、**上から順に**一致するか調べていく。

- プログラムの指示には以下のような流れがある。
  **1.****ブラウザ**がURLに一致するHTMLファイルを**ルーティング**に要求
  **2.**一致する**ルーティング**が存在した場合、対応する**コントローラ**へと道を作る
  **3.**その**コントローラ**のアクションと一致するHTMLファイルを**ブラウザ**へと返す
  **4.**受け取ったHTMLファイルを**ブラウザ**が表示する


###〜解決法〜
変数を含んだルーティングのURLを、似たようなルーティングのURLの一番下に移動してしまえばいい。

get "posts"、"posts/〇〇"の〇〇にはどんな値だろうと、ルーティング内の"posts/:id"と合致してしまう。なぜなら変数だから。
例えば、、、
**"localhosut:8000/posts/abcdefz/"**
このようなURLでも、ルーティングにデータ取得方法としての**get**、URLに**/posts/**が書かれていれば、否応なく**"posts/:id"**が合致してしまい、**"posts#show"**が実行されてしまう。

このルーティングエラーに関する解説はネットでもいくらか散見したが、どれも言葉足らずな気がした。同じ状況に陥った人の一助になれるよう、ここに残します。
DIとDIコンテの説明が解りずらいので例を参考に説明します(びぼうろく


````
●springMVCによるDIのテスト

DIとDIコンテナの説明が解りずらいので例を参考に説明します

簡潔に話すとDIとは、NEWしなくても


★注入する側


import org.springframework.stereotype.Service;

@Service
public class AutowiredTest {
	public String atai;

	AutowiredTest(){

		System.out.println("ロードされた");
		atai="あああ";
	}

}

★注入される側


import org.apache.commons.mail.EmailException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;


@Repository
@Controller
public class LoginController {

	//JAVACLASSが呼び出されてログインコントローラーのオブジェクトが生成された時にアウトライドされる。
	@Autowired
	private AutowiredTest autowiredTest;

	//ページが呼ばれた時に実行される
	@RequestMapping(value="/Login", method = RequestMethod.GET)
	public String Login() throws EmailException {

		//自動的にインスタンスを生成してくれるているので、直接値を参照してもエラーにならない。
		System.out.println(autowiredTest.atai);
		autowiredTest.atai="変更されたシングルトンのテスト";

		return "Login";
	}
}

●流れ

その１　サーバー起動したときにLoginControllerのインスタンスが生成される
その２　インスタンス過程で@Autowiredが付いた、下記のクラスのインスタンスが生成される

	private AutowiredTest autowiredTest;

その３　@Autowiredがついているので注入される側だと解る、＠サービスアノテーション（コンフィグやコンポーネンと）
	が付いているのクラスから、AutowiredTestのクラスを探す（DIコンテナ）見つけたらコンストラクタを実行する。
　　　　例として、値に初期値を入力する

その４　ページを遷移させると、NEWしていないのに値の中に初期値が入っている！

その５　補足として、初回は初期値としての値だが値を入れ替えるとインスタンスが保持されている（シングルトン）されているので
　　　　"変更されたシングルトンのテスト"と出力される。

活用方法としては
クラス変数の初期化や、メソッド引数の初期化（その際にはメソッドにアノテーション付ける）などが良い利用方法

●結果
クラスの中に定義してしまうと結合度が高くなるため（LoginControllerのLOGINメソッドの中にNEWしてしまうと、
毎回よばなければ行けなくなる）、外部から注入してあげると結合度も低くなり、毎回NEWする事もない。


参考資料
アプリケーションコンフィグ定義
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@ComponentScan("G_T.OfficeSystem.*")
public class ApplicationContextConfig {

    @Bean(name = "viewResolver")
    public InternalResourceViewResolver getViewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/pages/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }


    @Bean(name = "tests")
    public String tests() {

        return "baka";
    }

}


package G_T.OfficeSystem.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class AutowiredTest {
	public String atai;

	@Autowired
	AutowiredTest(String tests){
		
		//コンストラクタの呼び出しと同時にアプリケーションコンテキストで定義された
		//Beanを呼び出している（tests）と比較をしている。
		System.out.println("Bean定義"+tests);
		
		
		System.out.println("ロードされた");
		atai="shimizu";
	}


}
言語処理100本ノック 2020を「Google Colaboratory」で楽々学習

# 言語処理100本ノック 2020とは
[言語処理100本ノック 2020](https://nlp100.github.io/ja/)

　上記サイトにある問題集です。サイトから説明文引用します。

> 言語処理100本ノックは，実用的でワクワクするような課題に取り組みながら，プログラミング，データ分析，研究のスキルを楽しく習得することを目指した問題集です．

　こんな素晴らしいものを無料で公開してくださること、大変ありがたいですね。少しでも貢献するため、この記事ではPython初心者の方が、環境構築しなくても、ブラウザで気軽に言語処理100本ノックを試せる記事を書いてみたいと思います。

　具体的には、Googleが提供している環境構築不要・無料でPythonの開発が可能なWebサービス「Google Colaboratory」を使います。

# 「Google Colaboratory」で言語処理100本ノックを学習する
　Google Colaboratory自体で何ができるか、便利な使い方TIPS等に関しては、以下記事参照ください。

[Google Colaboratoryを使えば環境構築不要・無料でPythonの機械学習ができて最高](https://karaage.hatenadiary.jp/entry/2018/03/21/073000)

[Google Colaboratoryを便利に使うためのTIPSまとめ](https://karaage.hatenadiary.jp/entry/2018/12/17/073000)

　第1章は、特にライブラリとか不要でそのまま解いていけそうです。

　第2章は、Unixコマンドを使った問題です。Google ColabはLinux(Ubuntu）で動いているので、マジックコマンドを使うことで解くことができると思います。具体的には、以下のように最初に!（エクスクラメーションマーク）をつけて、コマンドを実行します。

```sh
! ls
```

　もしくは、UnixコマンドにこだわらずにPythonを使って実現するというのも練習になると思います。

 自分のノートブックは以下です。全然途中です（笑）最後までいけるように頑張ります。

[nlp100v2020.ipynb](https://colab.research.google.com/drive/1FSn0MARkvDXKXfZWEOMcHhKFOzwV-mmy)

# 役に立つ関連サイト
## u++ さんの解法
　本職のデータサイエンティストu++さんが、言語処理100本ノックに取り組んでいて、既に大半の問題を解き終えています。ブログとGitHubで解法のコードを公開、解説しています。
　自分一人の力ではどうしても解けないという人は参考にしてみましょう。私も既に参考にしました（笑）

[「言語処理100本ノック 2020」をPythonで解く](https://upura.hatenablog.com/entry/2020/04/14/024948)

<a href="https://github.com/upura/nlp100v2020"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/upura/nlp100v2020.png" width="460px"></a>


## takapy さんの解法

[Python-機械学習-自然言語処理-言語処理100本ノック 2020](https://www.takapy.work/archive/category/Python-%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92-%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E5%87%A6%E7%90%86-%E8%A8%80%E8%AA%9E%E5%87%A6%E7%90%86100%E6%9C%AC%E3%83%8E%E3%83%83%E3%82%AF%202020)


## プログラミング素人さんの解法
[「言語処理10本ノック 2020」をC++で](https://s51517765.hatenadiary.jp/entry/2020/06/01/073000)

　1章だけですが、C++で解くという意欲的な内容です。

## yamaruさんの解法
[【言語処理100本ノック 2020】Pythonによる回答例まとめ](https://qiita.com/yamaru/items/0cac24710626333bd693)

## python_kenichiさんの解法
[Pythonで自然言語処理100本ノック 2020を解いたついでに死ぬほど詳しく解説を書いていく[第1章 準備運動]](https://qiita.com/python_kenichi/items/b1fcecc4274511e4c26e)

# まとめ
　言語処理100本ノック 2020を紹介してみました。言語処理に興味ある方。少しレベルアップしてみたい方にはぴったりの内容だと思います。毎日少しずつコツコツ解くも良し、一気に解くも良し、自分なりの学習方法で進めていきましょう。

# 関連記事
[Python関係の「○○100本ノック」のまとめ](https://qiita.com/karaage0703/items/7b5d54223d06e4b6ef0f)

[画像処理100本ノックを「Google Colaboratory」で楽々学習](https://qiita.com/karaage0703/items/e0b57b63dbebed908b2f)

[Google Colaboratoryを使ってブラウザでRAW現像](https://karaage.hatenadiary.jp/entry/2018/11/07/073000)

# 変更履歴
- 2020/06/13 python_kenichiさんの解法を追記
- 2020/06/08 yamaruさんの解法を追記
- 2020/05/01 プログラミング素人さんの解法を追記
深層学習／バッチ正規化

#1.はじめに
　今回は、バッチ正規化についてまとめます。

#2.バッチ正規化 (Batch Normalization)
　バッチ正規化は、学習時のミニバッチ毎に各チャンネルを平均０分散１になるように正規化することで、学習の安定化や速度アップが出来る必須のテクニックです。
![スクリーンショット 2020-04-16 17.32.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209705/49537720-9634-b3e6-2500-ed0e5cb3778d.png)
　しかし、以下の弱点もあります。
1)高解像度の画像を扱うことでメモリが不足しバッチサイズが小さくなると、平均・分散の推定が不安定になり上手く学習が進まない。
2)1)の対策として複数のGPUで対応すると、高価なハードウエアが必要で実装や最適化が複雑になる。
3)ビデオの隣接フレームといった相関がある画像の場合、平均・分散の推定が不安定になり上手く学習が進まない。
　そのため、これらの弱点を補う様々なバリエーションが登場しています。

#3.バッチ正規化のバリエーション
![スクリーンショット 2020-04-16 17.20.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209705/184c637f-c817-40aa-ca7c-cdfe19c107bc.png)
**1) Layer Normalization**
　全チャンネルにまたがって平均・分散をとる方法。大局的すぎて、特に重要ではないチャンネルが画像全体に渡って高い値を示した場合に他のチャンネルが抑制されてしまう問題点あり。

**2)Instance Normalization**
　各チャンネル独立に画像の縦横方向についてのみ平均・分散をとる方法。複数のチャンネルの組み合わせによって表現される特徴を歪めてしまう問題点あり。

**3)Group Normalization**
　チャンネルをG個にグルーピングして Layer Normalization と Instance Normalization の中間的な処理をする方法。画像分類などのタスクで Batch Normalization に匹敵する精度を実現しています。

#4.バッチ正規化を入れる場所
1)全結合層
![スクリーンショット 2020-04-16 18.14.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209705/72390941-4b93-a1d2-3d20-3c880577bf5a.png)
2)畳み込み層
![スクリーンショット 2020-04-16 18.14.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209705/ffbbe2e4-91ec-6f0f-4362-d4c8f4cb0976.png)
Django Heroku デプロイ１

#前提
フレームワークでDjangoを使用しHerokuでデプロイします。

python-3.7.3
django 2.2

Homebrew・pyenv・Pipenv・Python・Djangoのインストール済み

#Herokuとは
簡単にwebアプリケーションをアップロードして公開できるプラットフォームサービス。
環境構築がすでにできている状態で使えるため、作ったアプリをHerokuでアップロードするだけで簡単にweb上に公開することができる。


#本題
https://signup.heroku.com/jp
上記のURLからHerokuのユーザー登録をします。（無料）

##Heroku Toolbeltの設定
Heroku ToolbeltをインストールすることでHeroku専用のコマンドを使えるようになります。
下記のコマンドをターミナルに入力。（macの場合）

```command
$ brew tap heroku/brew && brew install heroku
```
※参考サイト
https://devcenter.heroku.com/articles/heroku-cli

##ターミナルからHerokuにログイン
Heroku Toolbeltをインストールしたので、ターミナル上でHerokuのコマンドが使えるようになりました。
では、早速ターミナルからHerokuにログインします。

```command
$ heroku login

heroku: Press any key to open up the browser to login or q to exit: # Enter等押します
Opening browser to https://cli-auth.heroku.com/auth/browser/xxxxxxxxxxxxxxxxxxxxxxxx
Logging in... done
Logged in as sample@example.com # メールアドレスが表示されます
```

##Herokuでアプリ作成
下記、コマンドでHeroku上でアプリケーションを作成することができます。

```command
$ heroku create アプリ名
```
【注意！】
アプリ名は、Heroku全体でユニークなものでないと下記のように跳ね返されます！
↓↓例

```command
$ heroku create banban
Creating ⬢ banban... !
 ▸    Name banban is already taken
```
※例えばこの場合だと、ユニークでないため、跳ね返されます。
そのため、<code>banban-2020</code>など数字をつけるなどしてユニークなものに設定しましょう！

うまくいくと下記のようになります。

```command
$ heroku create banban-2020

Creating ⬢ banban-2020... done
https://banban-2020.herokuapp.com/ | https://git.heroku.com/banban-2020.git
```

・デプロイ
ここまでで、アプリをデプロイする領域を確保できました。

Herokuへのデプロイは下記に記述しております。
「Django Heroku デプロイ２」
https://qiita.com/yusuke_mrmt/items/a540ba5b04a1fd6dbdb7
【Swift】他クラスのデリゲートを自分のメソッドで使用する方法

１、自分のクラスで使えるように宣言をする
`class ViewController: UIViewController, WKNavigationDelegate { `

2、自分のクラスで使えるように設定する
`webView.navigationDelegate = self`

3、記述する
//        ロードが開始された時
        `func webView(_ webView: WKWebView, didCommit navigation: WKNavigation){
           print("読み込み開始")
           indicator.startAnimating()
           }`
        
//        ロードが完了した時
        `func webView(_ webView: WKWebView, didFinish navigation: WKNavigation){
             print("読み込み終了")
            indicator.stopAnimating()
            }`


※単語はそれぞれ名前を書く必要あり
ASP.NET　ＭＶＣのトラブルシューティング その１

ASP.NET　ＭＶＣのトラブルシューティング その１

````
①新しくMYSQLを参照変更した場合の注意点
重大度レベル	コード	説明	プロジェクト	ファイル	行	抑制状態
警告		プライマリ参照 "MySql.Data, Version=8.0.19.0, Culture=neutral, 
PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL" は、
".NETFramework,Version=v4.5.2" フレームワークに対して作成されたアセンブリ 
"Ubiety.Dns.Core, Version=2.2.1.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" 
に間接的に依存するため、解決できませんでした。これは現在ターゲットされているフレームワーク 
".NETFramework,Version=v4.5" よりも新しいバージョンです

↓対策方法

プロジェクト→ドットネットフレームワークのバージョンを.NETFramework,Version=v4.5.2に変更すする。

②MYSQLを最新にした場合

.netの参照設定も変更する。
CodeIQ：マイナー・ゲームの解答

問題紹介と解答例->https://sw-logic.com/Portfolio/Programing/CodeIQ/2837.php
みんなのコード->https://togetter.com/li/982368

n人のゲームでn=1,n=2なら終了、n>2ではターン数が1増えて
カードAが0枚、n枚、そしてnが偶数の時はn/2枚の場合最初と同じ状態、
その他はnが減った状態でゲームを続行しますので
n人のゲームの期待値をf(n)、n人からk人がカードAを選ぶ確率をp(n,k)とすると、p(n,k)=nCk/2^n
f(1)=f(2)=0,
n>2->f(n)=Σ(0<k<n,k !=n-k),p(n,k)\*(f(k)+1)+(p(n,k1=n-k1)+p(n,0)+p(n,n))\*(f(n)+1)
x=p(n,k1=n-k1)+p(n,0)+p(n,n)とすると
式を変形してf(n)=(Σ(0<k<div(n-1,2)),p(n,k)\*2*(f(k)+1)+x)/(1-x)

CodeIQの問題は時間制限があるようですので、最初Juliaで解くことが多いです。
この問題もJuliaで解いて、コードにするところまでは比較的容易でしたが、
nが大きくなると値が違ってしまい、別解を考えて時間を無駄にしたあげく、
デフォルトで多倍数整数が使えるswi-Prologにうつしてみたところうまくいきました。

大雑把に言うと、g45/3で~~Σ(0<k<div(n-1,2))\*2*p(n,k)*(f(k)+1)~~(2020.5.3修正)
Σ(0<k<div(n-1,2)),p(n,k)\*2*(f(k)+1)を扱い、f45/2でそれをまとめてf(n)を出しています。
2^Nの乗除は相殺可能です。

```Prolog
%:-initialization(start).%ideone

ncr(N,0,1):-!.
ncr(N,R,X):-R1 is R-1,N1 is N-1,ncr(N1,R1,X1),X is X1*N/R.

f45(1,0):-!.
f45(2,0):-!.
f45(N,R):-         
     M is (N-1) div 2,g45(N,M,Sum),F is N mod 2,
     (F==0->(N1 is N div 2,ncr(N,N1,X1),X is X1+2);X=2),
     R is (Sum+X/2^N)/(2^N-X)*2^N.
g45(_,0,0).
g45(N,M,R):-M1 is M-1,g45(N,M1,R1),f45(M,X),ncr(N,M,Y),R is R1+(X+1)*Y*2/2^N.

solve([]).
solve([[N,A]|T]):- 
     solve(T),f45(N,R1),R is floor(R1*10^6),writeln(N:R:A).

start:-A5 is floor(16/15*10^6),
     Dat=[[3,1333333],[4,2000000],[5,A5],[7,1756613],[8,2202898],[10,2836363],[100,5395462]],
     solve(Dat),!.     
```
その後Juliaでもbig(BigInt)の使い方(pow=big(2)..やbig(2^n)ではなく2^big(n))を再学習し、
それを使ったら答が合いました。
n=100ならメモ化なしでok,nが500台でも辞書を使ってメモ化すれば1s前後で解けます。
2^nの乗除は省いています。

```Julia
#Julia 1.1.0,1.3.1
function solve(n0)
    function ncr(n,r)
      if r==0
          return 1
      else
          ret=big(1)
          for i in 1:r
              ret=div(ret*(n-i+1),i)
          end
          return ret
      end
    end
    function f(n)
        if haskey(dic,n)
            return dic[n]
        elseif n<=2 return 0
        else
            pow=2^big(n)
            sum=0  
            for i in 1: div(n-1,2)
                sum+=(f(i)+1)*ncr(n,i)*2
            end
            x=ifelse(iseven(n),ncr(n,div(n,2))+2,2)
            ex=(sum+x)/(pow-x)
        end
        return dic[n]=ex
    end
    dic=Dict()
    print(n0," ",Int(floor(f(n0)*10^6))," " )
end
@time solve(10) #10->2836363,
@time solve(100) #100->5395462
@time solve(526) #526->7682324
@time solve(562) #562->7727954
```
VBA×Python最速仕事術を読んだ内容メモーchapter１

### ■概要

特徴１　pythonは予約語が少ないので便利なため、覚えなくてもOK
特徴２　インデントで記述した文章はifなどのブロック内としてみなされる
特徴３　ライブラリが豊富なので汎用的に使える(excelやWEBなど・・)

VBAとpythonの違いは
VBAはexcel上でしか使えないのと、主にwin上で扱うものでもあるので
縛りがある。
WEBやデータ分析などで使う上でもpythonであれば広範囲にも使えるので
今後としてはpythonを扱っていくほうが将来的に役立つ。

#### ※メモ＝anaconda
「データサイエンス」や「機械学習関連アプリケーション」のためのPythonおよびR言語用のディストリビューション
python本体＋ライブラリなどが一式そろっている

python3.8.2 shell
コマンドを直接入力、実行するためのソフトウェア
">>>"がプロンプトと呼ばれるもの

```:pythoncd
>>>print("hello, python")
```

#### ※メモ＝Visual Studio Code
2015年にリリースされたマイクロソフトによって開発されているソースコードエディタ。Mac OS、Linux上でも動作するよになっている。
P5.js 日本語リファレンス(alpha)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の alpha関数を説明します。

## alpha() 

### 説明文
指定した色からアルファ値(透明度)を取得します。

### 構文
alpha(color)

### パラメタ

- color  
p5.Color | Number[ ] | String：p5.Colorオブジェクト、カラーコンポーネント、CSSカラー

### 戻り値

Number：アルファ値

### 例

```javascript
function draw() {
  background(220);
  noStroke();

  colorMode(RGB, 255); // カラーモードをRGBに設定
  let c1 = color(0, 255, 0, 180); // RGBで緑色を設定
  fill(c1);
  rect(15, 15, 35, 70);
  let val1 = alpha(c1); // アルファ値180を取得する
  fill(val1);
  rect(50, 15, 35, 70);

  colorMode(HSB, 100); // カラーモードをHSBに設定
  let c2 = color(100, 100, 100, 70); // HSBで赤色を設定
  fill(c2);
  rect(100, 15, 35, 70);
  let val2 = alpha(c2); // アルファ値70を取得する
  fill(val2);
  rect(135, 15, 35, 70);
}
```

### 実行結果
![alpha.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43467/2e9bab9e-b041-9309-278f-edeec3b5f29e.jpeg)

### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
IQ Bot：マッピング学習画面_⑦抽出結果を表示する

このページは[「IQ Bot：マッピング設定の画面でできること」](https://qiita.com/IQBotter/private/2c5a6e77d6059b968a74)のサブカテゴリです。

##⑦：抽出結果を表示する

マッピング設定の画面の⑦に「抽出結果を表示」というボタンがあります。
![画像.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/7de2de49-9d61-2094-0648-f5349407fe21.jpeg)


![抽出結果を表示.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/a1b43f80-6d67-7511-443f-0256ba80eaa2.jpeg)ボタンを押すと、以下のような画面が表示されます。
ここで、設定したマッピングをもとに正しく結果を取得できているかを確認し、マッピングが正しくなければまた戻って学習をやり直します。
![07_抽出結果を表示.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/0577d46f-e5ef-5cb7-eb1f-1418b475b5dd.jpeg)

###a：結果の表示
設定したマッピングをもとに、IQ Botが読み取った結果が表示されます。
この画面はあくまでも結果の**表示**画面なので、**読み取った文字をここで修正したりすることはできません。**

確認する内容はあくまでも、IQ Botが帳票上の正しい**場所**から項目を引っ張って来られているかどうかです。

[カスタムロジック](https://qiita.com/IQBotter/items/1d8e7c77ad47e838476c)を使っている場合は、カスタムロジック適用後の値が表示されます。
（カスタムロジックがエラーになった場合は、カスタムロジック適用前の値が表示されます）

###b：ドキュメントの遷移

小さいですが、以下のボタンを使って同じグループに分類された他の帳票の抽出結果を参照することができます。

![08_抽出結果を確認_ドキュメントを遷移.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/23e31f4a-6d86-b8c8-135b-76ccb0c1300b.jpeg)

###c：CSVにエクスポート

今開いている帳票を、RPAからIQ Botを自動処理したときと同じフォーマットでCSVに出力することができます。
ここでエクスポートしたCSVをExcelで開くとバージョンによって文字化けする場合があるのですが、[こちら](https://qiita.com/IQ_Bocchi/items/7c64b301f92b3c569b73)の方法で対処ができます。

###d：トレーニングに戻る

もとの画面（[こちら](https://qiita.com/IQBotter/private/2c5a6e77d6059b968a74)）に戻ります。
EagleのライブラリをKiCadにインポートする方法

# Draginoのlora miniをKiCadで使いたいので調べました
　RSコンポーネンツから取り込む方法とか割と簡単に見つかりましたが
lora miniは今のところEagleのライブラリしか見つからず、しばらく
時間がかかってしまったので自己ログとして書き留めます。

## 環境
Windows 10 Home 1903
AutoDesk Eagle v9.4.1 無償版
KiCad v5.1.3

## 変換対象と変換ツールの用意
今回はlora miniのEagleライブラリと変換ツールをGitからCloneしています。

・lora mini
https://github.com/dragino/Lora.git

・変換ツール(Eagle user script file)
https://github.com/lachlanA/eagle-to-kicad-libs.git

## インポート手順

1.変換ツールをEagleのuplsフォルダに配置
C:\Users\'Windowsログインユーザー名'\Documents\EAGLE\ulps に
eagle-lbr2kicad-1.0.ulp
eagle_to_kicad_include.inc
を配置する

2.Eagleでlora miniライブラリファイルを開く
　lora miniの場合~\Lora\LoRa mini\v1.3\draginoにLoRa Mini v1.3.lbr
Eagleライブラリファイルがあります。
通常はダブルクリックでEagleライブラリエディタが起動するはずです。

3.uplを実行
　Eagleライブラリエディタのファイルメニューもしくはツールバーの[Run upl]を選択
[Select UPL Directory]ドロップダウンから 1. で配置したuplsフォルダを選択し
[eagle-lbr2kicad]を選択して[OK]を押下します

4.出力先、条件を指定
　eagle-lbr2kicadの設定画面が開きます。　今回は特に指定する項目は無かったので
そのまま[OK]を押下しました。　出力先などの指定が必要な場合は設定してください。

5.KiCadにライブラリを追加
　KiCadを立ち上げて[シンボルエディタ]を開き、ファイルメニューから[ライブラリを追加]
を選択します。　ファイルダイアログが開くので 4. で指定した出力先から変換後の
.libファイルを開くとKiCadライブラリに追加されれます

※補足
KiCadのライブラリを削除する場合は設定メニューから[シンボル ライブラリを管理]を選択して
消すことが出来ます。
表示されるリストすべてにチェックがついてますが削除ボタンは選択行だけ削除してます。
Node.jsについて調査とまとめ（自分用。編集中）

このたび、仕事（Not 個人の開発）でNode.jsを利用して開発することになったので、その調査を行う。
ポイントとしては「開発者は自分だけではない」ということか。自分だけなら理想を求めて翻訳資料が少なかったりまだ不安定だったりするライブラリも利用できるが、組織でとなるとそうはいかない。

※注意：　自分がわかればいいや、というメモ書きレベルです。丁寧な解説はありません。

## フレームワーク（Express）
今回は有名であり、日本語資料が最も多い（ここ決定打）の「Express」を利用する。
自分一人なら性能や対応状況を見比べて検討するが、今回は他の人も利用するので「調査しやすい」ものを優先する。
（英語の書き、聞き取りは無理でも読むのはやってほしい……）

Expressは割と薄いフレームワーク（フレームワーク側で）

### TypeScript対応
Node.js、Express に TypeScriptでAPIサーバを作成する例
https://qiita.com/pochopocho13/items/79a4735031ce11a91df7


### ルーター機能

https://qiita.com/ngmr_mo/items/73cc7160d002a4989416

### 非同期処理対応
はいはいPromise……と思ったら今は「async / await」というものがある

https://qiita.com/soarflat/items/1a9613e023200bbebcb3


### バリデーション機能
express-validatorを利用して管理可能。
ただし、サンプルのまま利用するとちょっと見づらい（管理も少しし辛い）ので、ミドルウェアで分離すると整理しやすい。
https://qiita.com/bellcrud/items/59722c80c562d6c1d3e3
IQ Bot：マッピング学習画面_⑥各グループのドキュメントを表示する

このページは[「IQ Bot：マッピング設定の画面でできること」](https://qiita.com/IQBotter/private/2c5a6e77d6059b968a74)のサブカテゴリです。

#⑥：各グループのドキュメントを表示する

「各グループ「xx」のドキュメントを表示する」のリンクを押すと、以下のようにグレーの画面が表示され、そのグループに分類された学習用帳票を参照できます。

![06_各ドキュメント.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/b3612da6-d9fe-cc66-c1fd-8c1c6bba2f97.jpeg)

#この機能の活用方法

後日記載します。
IQ Bot：マッピング学習画面_⑤パンくずリスト

このページは[「IQ Bot：マッピング設定の画面でできること」](https://qiita.com/IQBotter/private/2c5a6e77d6059b968a74)のサブカテゴリです。

##⑤：パンくずリスト

「パンくずリスト」という名前になじみがない方向けに、わかりやすい解説記事をリンクしておきます（[こちら](https://www.asobou.co.jp/blog/web/breadcrumb-list)）。

フォームフィールドの項目一覧は図中の①にあたり……
![画像.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/7de2de49-9d61-2094-0648-f5349407fe21.jpeg)

以下がその拡大図です。



パンくずリストと画面遷移については、ベンダー（AutomationAnywhere）がやっていたハンズオンで配布していた資料がわかりやすかった＆公開してOKとのことなので載せておきます。
![05_パンくず.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/b4eee356-8638-e100-885b-de6983dc4361.jpeg)

ひとつだけ補足すると、上記の図の右側に出ている「Botを作成」というボタンは、「Botを編集」になっている場合もあります。

一度マッピングの設定を進めたことがあるグループに対しては「Botを編集」が表示され、まだマッピングの設定をしたことがないグループに対しては「Botを作成」が表示されます。
[Rails]DMリストの表示順をjoinsを使用してソートする

# はじめに
前回の記事で作成したDMリストを、上からやりとりの新しい順に表示させます。
前回作成したコントローラーの記述を編集するだけで、すごい簡単に出来ます。
仕様などは以下を参考にしてください。
[[Rails]DMユーザーリストを表示](https://qiita.com/Masanori_N/items/3520358139c2d2ad2973)

## コントローラーの編集
orderを使用して、messagesテーブルのcreated_atで基準に並べ替えたいのですが、orderで他のテーブルを使う場合は、joinsでINNER JOINをしてあげないと探せないため、以下のように書きます。

````rooms_controller.rb
  def index
    @rooms = current_user.rooms.joins(:messages).includes(:messages).order("messages.created_at DESC")
  end
````
これだけで新しい順に並べることができます。

## つまずき

````NG.rb
@rooms = current_user.rooms.joins(:messages).includes(:messages).order("created_at DESC")
````

と最初書いていたのですが、これではどのテーブルの created_at を参照するのかがわからずエラーとなりました。
ということで以下のように編集したところ、直すことができました。

````OK.rb
@rooms = current_user.rooms.joins(:messages).includes(:messages).order("messages.created_at DESC")
````

# おわり
最後まで読んでいただき、ありがとうございました。
エクセルで投資信託の基準価額から下落率（ドローダウン）を求める

こんにちは、東北投信を運営しているみらいです。

https://blog.tacos-heaven.xyz/

今回は投資信託の下落率（ドローダウン）を求めて、その投信の過去の下落幅がどれほど大きいものなのかを検証しようというお話です。

ドローダウンとは過去のピークからどの程度下落したか、を示すものです。

>ドローダウンとは、一時的に最大資産から落ち込んだ場合の下落率を表します。簡単に言うと、口座に入っている資産からどれぐらいの損失が出たか、ということです。
>例えば、資産がその時点で100万あり、ドローダウンが10％の場合は一時的に資産が90万まで落ち込んだということになります。

https://www.fxordersystem.com/systemtrade04.html

これを使うことで、投資信託の価格推移から「価格の下落した分」だけを取り出すことができます。

以下がその下落率のグラフの一例です。

![20200228b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317345/c81a0950-c177-55d8-c572-ef75b3220cf6.png)

上記グラフは、以下の基準価額の推移を指数化したものから、下落率だけを取り出しています。

![20200228a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317345/e82f899a-cd7d-3676-d767-52186e90f089.png)

というわけで、今回は投資信託の基準価額を用いて、過去の最高値から何％値段が落ちたかを求める方法を紹介します。

## 計算式

```
ドローダウン = （1 - （当日の基準価額 ÷ 過去の最も高い基準価額））　* -100
```

例えば、当日の基準価額が10500で、過去の最も高い基準価額が10000だった場合、5％と求まります。しかし、0より大きい数値は必要ないので、IF関数でゼロに置き換えます。

一方、当日の基準価額が9500で、過去の最も高い基準価額が10000だった場合、下落率は-5％と求まります。

実際には、過去の最も高い基準価額を探さなければいけないため、MAX関数も併用し、以下のような形に書き換えます。

```
ドローダウン = IF（（1 - （当日の基準価額 ÷ MAX（開始点の基準価額：当日の基準価額）））　* -100 > 0, 0, （1 - （当日の基準価額 ÷ MAX（開始点の基準価額：当日の基準価額）））　* -100）
```

あとはMIN関数を使うことで、最も大きく下落した率（マックスドローダウン）も求まります。

## 応用

ドローダウンの計算だけならセルに手入力だけでも求まりますが、VBAで組んでしまったほうがより便利です。

例えば、日経平均株価とダウ工業株価について、ドローダウンの継続日数とマックスドローダウンの関係を求めると以下のような図が求まります。

![20200330b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317345/535627e6-6f08-ba49-abe2-b6fe8b01e283.png)

データ出典：https://www.macrotrends.net/

これは2020年3月のベア相場がどのぐらいの期間で終了するかを想定すべく、過去の日経平均株価とダウ工業株価について下落率と最高値回復までの営業日数を求めたものです。

2020年3月のベア相場はだいたい40％ほどの下落でした。過去の同じような相場ではだいたい500営業日から1000営業日かかっていたことがわかります。

もちろん将来も同じになるとは限りませんが、全く見通しも何もないよりはマシだと思います。

実際、筆者はドローダウンや騰落率、ソルティノレシオ等、手計算で求められるけども、毎回セルに入力するのはめんどいものはすべてVBA化し、ボタン1つで求められるようにしています。

思考だけは自分の頭で行い、機械に任せられるところは任せてしまったほうが効率的だと思います。

## おしまい

投資信託の商品選びはなんとなく儲けのイメージやら雰囲気やらで選ばれてしまって、下落相場でどれだけ苦しい思いをするかが置き去りにされていることが多いように感じます。

しかし、過去の相場の特徴などをあらかじめ検証しておけば、もっと堅実で強固なポートフォリオを作れるのではないか？と思うところです。
IQ Bot：マッピング学習画面_②テーブルフィールドの項目一覧

このページは[「IQ Bot：マッピング設定の画面でできること」](https://qiita.com/IQBotter/private/2c5a6e77d6059b968a74)のサブカテゴリです。

##テーブルフィールドの項目一覧

フォームフィールドの項目一覧は図中の②にあたり……
![画像.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/7de2de49-9d61-2094-0648-f5349407fe21.jpeg)

以下がその拡大図です。

![02_テーブルフィールド.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/5d2ed1e9-8d94-1517-3f50-3c791f08efd0.jpeg)

aにはテーブルフィールドとして指定した項目名が並んでいます。
bとcの表示要領は[フォームフィールドの項目一覧](https://qiita.com/IQBotter/items/97d35a8d60932b36bfb8)と同様です。

###d：Table/section settings

ここを選択すると、テーブル全体に関わる設定を行う欄が表示されます。

![02_d_テーブル全体設定_編集済み.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/e80fee57-db41-64c7-b5de-e1d91f616426.jpeg)

テーブル全体に関わる設定でできることの詳細については、後日別途記事を作成します。

###e：テーブル/セクションを追加

ひとつの帳票に２種類以上のテーブルがある場合に、ここを使ってテーブルの数を増やします。
その後、テーブルフィールドの項目をテーブルの種類ごとに整理していきます。

この場合の設定方法については、後日別途記事を作成します。
IQ Bot：マッピング学習画面_①フォームフィールドの項目一覧

このページは[「IQ Bot：マッピング設定の画面でできること」](https://qiita.com/IQBotter/private/2c5a6e77d6059b968a74)のサブカテゴリです。

##フォームフィールドの項目一覧

フォームフィールドの項目一覧は図中の①にあたり……
![画像.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/7de2de49-9d61-2094-0648-f5349407fe21.jpeg)

以下がその拡大図です。以下、a～cにそって詳述します。
![01_フォームフィールド一覧.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/1743f4bd-f235-7d18-1e57-d16aa012ac7d.jpeg)

###a：フォームフィールドの項目名一覧

フォームフィールドとして指定した項目名が並んでいます。

###b：型のアイコン

「③：設定中のフィールドの詳細」の画面で指定した型に応じてアイコンが変わります。

![01_xx型.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/b952a9b8-78ec-ce9c-cd00-0aca6709f0f1.jpeg)

###c：設定済みかどうかのチェック

該当項目が設定済みかどうかを表示するアイコンです。
![01_c_設定済み.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/7f3cdd54-392a-6a65-ff56-a6a35408eca1.jpeg)

フィールドオプションが「任意」の項目は無条件で「設定済み」として扱われます。
フィールドオプションが「必須」の項目は、マッピングの設定が完了していれば「設定済み」として扱われます。

**すべての項目が「設定済み」になっていることが、マッピング学習完了の条件になります。**
**（未設定の項目が残っていると、マッピング設定画面で「保存して閉じる」を押せません。）**
Laravel 7.4でデバッグバーを使用する方法


- [barryvdh/laravel-debugbar](https://github.com/barryvdh/laravel-debugbar)というパッケージがあるのでこれを使用する。

## barryvdh/laravel-debugbarをインストール

- compose

```console
cd your/laravel/project/path
composer require barryvdh/laravel-debugbar
```

## config値を設定

### config/debugbar.phpを作成。

- 下記のコマンドを叩くと、`config/debugbar.php` が作成される。

    ```console
    cd your/laravel/project/path
    php artisan vendor:publish --provider="Barryvdh\Debugbar\ServiceProvider"
    ```

### config/app.php

- config/app.phpの'debug'項目値をtrueに設定する。
- ~~また、providersとaliasesに下記を追加~~ Laravel 5.5以降は不要になったらしい。

    ```config/app.php
    	...

    	/*
    	|--------------------------------------------------------------------------
    	| Application Debug Mode
    	|--------------------------------------------------------------------------
    	|
    	| When your application is in debug mode, detailed error messages with
    	| stack traces will be shown on every error that occurs within your
    	| application. If disabled, a simple generic error page is shown.
    	|
    	*/

    	'debug'           => env('APP_DEBUG', false),

    	...
    ```

- 上記のようになっているので、.env.xxxxで設定。

    ```.env.xxxxx
    APP_DEBUG=true
    ```

## 結果

- デバッグバーが表示されるようになった！
  ![LaravelDebugbar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102123/afa23d3d-49ea-fcb4-7e38-53984d299915.png)
IQ Bot：マッピング設定の画面でできること

[IQ Bot](https://qiita.com/IQ_Bocchi/items/fab5f59230ff38a98bbd)のマッピング設定を初めてやる人向けに、マッピング設定の画面でできることをまとめてみます。

#IQ Botのマッピング設定画面

IQ Botのマッピング設定画面は以下の画面です。この画面への入り方は、[こちらの記事](https://qiita.com/IQBotter/items/3697a05cbd04e41b2ae9)をご覧ください。

![画像.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/7de2de49-9d61-2094-0648-f5349407fe21.jpeg)

以下、図中の番号別に機能を説明したリンクです。

###**[①フォームフィールドの項目一覧](https://qiita.com/IQBotter/items/97d35a8d60932b36bfb8)**
###**[②テーブルフィールドの項目一覧](https://qiita.com/IQBotter/items/e8073a0abde1a98cbfdc)**
###**[③設定中のフィールドの詳細](https://qiita.com/IQ_Bocchi/items/72e8395feac0c6c19066)**
###**[④イメージ表示画面](https://qiita.com/IQ_Bocchi/items/1e0a36fb69393106d025)**
###**[⑤パンくずリスト](https://qiita.com/IQBotter/items/8fd21ff79be115fc44d9)**
###**[⑥各グループのドキュメントを表示する](https://qiita.com/IQBotter/items/3e7b4d7553bf89cd7cca)**
###**[⑦抽出結果を表示する](https://qiita.com/IQBotter/items/13720aee5ddc1770afe1)**
###**⑧保存して閉じる（工事中、完成次第リンクを貼ります）**
###**⑨ページ遷移（工事中、完成次第リンクを貼ります）**
###**⑩画面のズーム（工事中、完成次第リンクを貼ります）**
Chromo拡張  バックグランドの persistent設定の挙動

【不明点あればコメントからご質問ください】
 "persistent": false　にすると

```元の.js
    "background": {
        "scripts": ["js/jquery-3.2.1.min.js","js/firebase-app.js","js/firebase-database.js","js/background.js"],
        "persistent": false
    },
```

下図のように一定時間処理なしだと無効になる
![拡張.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596059/c23a9675-b43c-cd23-c2a7-db5778f9de43.png)

"persistent": true　にすると

```
    "background": {
        "scripts": ["js/jquery-3.2.1.min.js","js/firebase-app.js","js/firebase-database.js","js/background.js"],
        "persistent": true
    },
 ```
![拡張２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596059/0d3b5db3-82cf-9659-3ccb-5a0dda403118.png)
【PHP】『メモ』３項演算子(長い恐竜名はどっち？)


###０．はじめに

この3項演算子、何かの暗号みたいですよね。
２つのプルダウンに表示される恐竜名のうち
各プルダウンで1匹を選んで、恐竜名の長さが長い方を\$max_strとする。
一つ目のプルダウンで選択した恐竜、2つ目のプルダウンで選択した恐竜、max_strを表示する
(中途半端な意味のない)プログラム。
3項演算子を使いたいために作成したプログラム。

```
３項演算子の書式

(条件) ? (条件が真のときの処理) : (条件が偽の時の処理); 
```

###１．コード例(選択画面)

```php:3kou_enzan.php
<!DOCTYPE html>
<html lang="ja">
<meta charset="utf-8">
<title>dinosor</title>
<h1>３項演算子　恐竜選択</h1>
<p>好きな恐竜を選んでね。</p>

<?php
	$array_dino=['Tyrannosaurus','Velociraptor','Stegosaurus','Indoraptor','IndominusRex'];
 ?>
<form action="3kou_result.php" method="post">

一匹目
<select name="str0">
<?php 
	for($i=0;$i<count($array_dino);$i++){
		echo "<option>".$array_dino[$i]."</option>";
	}
 ?>
 </select><br>
二匹目
<select name="str1">
<?php 
	for($i=0;$i<count($array_dino);$i++){
		echo "<option>".$array_dino[$i]."</option>";
	}
 ?>

</select>
<input type="submit" value="確定" name="btn2">
</form>
</html>
```

###２．コード例(3項演算子結果)

```php:3kou_result.php
<!DOCTYPE html>
<html lang="ja">
<meta charset="utf-8">
<title>dinosor</title>
<h1>3項演算子結果</h1>

<?php 
	$str0_select=isset($_POST['str0'])?htmlspecialchars($_POST['str0']):null;
	$str1_select=isset($_POST['str1'])?htmlspecialchars($_POST['str1']):null;
	$max_str = (strlen($str0_select)>strlen($str1_select)) ? $str0_select : $str1_select;	
	echo $str0_select.",".$str1_select."<br>";
	echo "長い恐竜名は".$max_str."<br>";
 ?>
	<form action="3kou_enzan.php" method="post">
	<input type="submit" value="戻る">
	</form>
</html>

```

###３．実行結果

![3kou_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494408/c48c9304-54e6-e8ec-117d-df09ba2f9261.jpeg)

![3kou_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494408/05e0fe7e-d459-4ea4-b24b-377e2b3d6e2d.jpeg)
C++でgnuplotを使う時に詰まった時

#　状況
大学でC++でグラフを描画する課題がでた。gnuplotを使うといいらしくてそれでやってみようということにした。自分の実行環境はmac os Mojave
brewでgnuplot自体はすぐにインストールできたものの、ターミナルからコマンドで使うのではなくてC++で書いて呼び出して使いたい。だけどそこからがめっちゃ大変だった。。。。

# エラーポイント
## ①aquatermとxquartzとかいうのをインストールしてからgnuplotをインストールできない
まず、いろいろgnuplotのインスト方法を調べているとどうやらaquatermとxquartzをインストールしてからgnuplotをインストールする記事が多かった。なぜそうするのかはよくわからん。そこでこれらをインストールしてから

```
$ brew install gnuplot　--with aqua
```
などとやると、aquatermなんてねえよと言われる。

```
brew list
```


として確認してもaquatermなどどこにもない。つまり認識されていないということらしい。
そこでどうすればいいかを書いてる記事もあったが何だかめんどくさそうだった。
そこで。

```
brew install gnuplot
```
で普通にインストールできた。
なんだよaquatermとかいらねえのかよ、でも後からこのせいでエラーでたら怖いなとは思いつつとりあえずターミナルから実行できるようになった。



で下のようにパイプを通して描画したいというのが本題

##②duplicate symbol　問題


```

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   FILE *gp;

   gp=popen("gnuplot -persist","w");

   fprintf(gp,"plot sin(x)\n");

   pclose(gp);
   return 0;
}
```



これを実行してうまく行けばグラフが出力される。はずだが。。。

```
duplicate symbol '_main' in:
    /var/folders/q3/y699mygx6qqg53lzw8ls14_r0000gn/T//cc9moxpo.o
    /var/folders/q3/y699mygx6qqg53lzw8ls14_r0000gn/T//ccbmRw03.o
duplicate symbol '_main' in:
    /var/folders/q3/y699mygx6qqg53lzw8ls14_r0000gn/T//cc9moxpo.o
    /var/folders/q3/y699mygx6qqg53lzw8ls14_r0000gn/T//cc9moxpo.o
ld: 2 duplicate symbols for architecture x86_64
collect2: error: ld returned 1 exit status

```
というエラーがでた。
つまりシンボルが重複しているということらしい。/var/folders/q3/y699mygx6qqg53lzw8ls14_r0000gn/T//cc9moxpo.oと     /var/folders/q3/y699mygx6qqg53lzw8ls14_r0000gn/T//ccbmRw03.o
で被ってるからだめだと。
で、いろいろ調べてもいろいろ試してみて結局わかったのは結局他のC++のファイルと同じディレクトリで実行していることが原因だった（gnuplot使ってないC++のファイルも同じエラーがでたので気づいた）
新たにディレクトリを作成して実行するとできた。

##まとめ
gnuplotは別にaquatermとか使わなくていいぞ
MySQLのパスワードポリシーを変更する方法

#MySQLのパスワードポリシーを変更する方法

パスワードを変更しようとしたら以下のエラーが出た。そんな時の対処法を記載。
`ERROR 1819 (HY000): Your password does not satisfy the current policy requirements`

デフォルトだと
8文字以上、長さ; 数字、小文字/大文字、および特殊文字が必要です。

```
mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+-------+
| Variable_name                        | Value |
+--------------------------------------+-------+
| validate_password_check_user_name    | OFF   |
| validate_password_dictionary_file    |       |
| validate_password_length             | 8     |
| validate_password_mixed_case_count   | 1     |
| validate_password_number_count       | 1     |
| validate_password_policy             | MEDIUM|
| validate_password_special_char_count | 1     |
+--------------------------------------+-------+
7 rows in set (0.00 sec)
```

そこで以下のコマンドで修正

```
mysql> set global validate_password_length=4; # 文字列の長さを変更
mysql> set global validate_password_policy=LOW;　# ポリシーを変更
mysql> show variables like 'validate_password%';
+--------------------------------------+-------+
| Variable_name                        | Value |
+--------------------------------------+-------+
| validate_password_check_user_name    | OFF   |
| validate_password_dictionary_file    |       |
| validate_password_length             | 6     |
| validate_password_mixed_case_count   | 1     |
| validate_password_number_count       | 1     |
| validate_password_policy             | LOW   |
| validate_password_special_char_count | 1     |
+--------------------------------------+-------+
7 rows in set (0.00 sec)
```

引用元：
https://qiita.com/keisukeYamagishi/items/d897e5c52fe9fd8d9273
#Ruby の #正規表現 で 末尾が数字でない行の改行コードだけを削除する例 ( ruby remove with regexp not newline last of line match )

- `?<!` 否定の先読み
- `$` 末尾
- `\\1` キャプチャを置換後に利用

```rb
"あいうえお\n123\nABC\n".gsub(/(?<![0-9])$\n/, "")
=> "あいうえお123\nABC"
```

```rb
"XY23\n123\nABC\n12DD\n333".gsub(/(?<![0-9])$\n/, "")
=> "XY23\n123\nABC12DD333"
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3079








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->