OmniAICreator/Qiita-1.07M huggingface dataset:
Mysql8系でパスワード変更

「MySQLにログインできない！」
MySQL5.6以前のバージョンを使っていた方は、少し戸惑うかもしれません。
実はMySQL5.7以降では、rootユーザーでログインする手順が少し変わっています。
これは、セキュリティに対してより厳しくなったことによる変更らしいです。

mysql5系でパスワードを変更する記事は多くありますが、mysql8系だとあまり見かけませんでしたので備忘録としてメモ

## 目的

mysql8系でパスワードを変更できるようになる

## 対象者

mysql8系で、

・パスワードを忘れて困っている人
・パスワードを変更したい人

## 参考
mysqlについては記事が多いですが、随時参考にすべき資料をアップデートしていきます。

[よく使うMySQLコマンド集](https://qiita.com/CyberMergina/items/f889519e6be19c46f5f4)


## 何故5系と違うか→関数が違うから

5系での記事を試して見るも
PASSWORD() 関数は、MySQL version 5.67 までで廃止されているらしいです。8系だとガラッと色々変わってますね

```
//失敗例１
mysql > update mysql.user set password=password('hogehoge') where user = 'root';

//失敗例２
mysql > SET PASSWORD FOR root@localhost=PASSWORD('hoge');

//結果
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'PASSWORD('root')' at line 1
```

## ログイン

``mysql -u ユーザー名 -D データベース名 -p``

-u オプションでは MySQL に接続するユーザー名を指定します。
-D オプションでは接続先のデータベース名を指定します。
-p オプションはパスワードを送信する場合に指定します。

例えば、root ユーザーで test というデータベースに接続する場合、下記のようにコマンドを実行します。
尚、root ユーザーにはパスワードを設定している場合は、-p オプションも付加します。

```
mysql -u root -D test -p
```
## パスワードリセット流れ

### 1 MySQLを止めます

```
$ mysql.server stop
```

### 2 MySQLをセーフモードで起動します。

```
$ mysqld_safe --skip-grant-tables &
```

### 3 別のターミナルを開き、rootユーザのパスワード無し状態でログインします。

```
$ mysql -u root
```
### 4 rootユーザーのパスワードを空に設定します。

```
mysql > UPDATE mysql.user SET authentication_string=null WHERE User='root';
```

### 5 セーフモードで開いたMySQLを閉じます

```
mysql > exit
```

### 6 killします
セーフモードでMySQLを起動させたターミナル(コマンド$ mysqld_safe --skip-grant-tables &を実行したターミナルで)が終了しない時(コマンドが打てるようにならない)は下記コマンドを実行して動いているMySQLをkillします。

※XXXXXは同じ数字が入りますので注意してください
※ . を忘れると、違うコマンドになりますので注意です

```
$ mysql.server status
>SUCCESS! MySQL running (XXXXX)
```

```
$ kill XXXXX
```

grepすると、grepした時のと併せて2つ以上になると思います。

```
$ ps aux | grep mysqld
taiga            28278   0.0  0.0  4277512    704 s003  S+    1:21PM   0:00.00 grep mysqld
taiga            XXXXX   0.0  0.0  4283208   1272 s003  S     1:14PM   0:00.02 /bin/sh /usr/local/Cellar/mysql/8.0.18_1/bin/mysqld_safe --datadir=/usr/local/var/mysql --pid-file=/usr/local/var/mysql/Taiga.local.pid
```

```
$ kill -9 XXXXX
```

### 8 今度は通常モードでMySQLを起動します
(aliasで msr で設定すると簡略化できていいですよ)

```
$ mysql.server restart
```

### 8 何も入力せずEnterを押下します。

```
$ mysql -u root -p 
```
### 9 パスワードを再設定する。※重要

```
mysql > use mysql;
mysql > ALTER USER 'root'@'localhost' identified BY '任意のパスワード';
```

何も設定したくない場合(空)は、空欄にします。

```
mysql > ALTER USER 'root'@'localhost' identified BY '';
```

### 10 一度MySQLから出ます。

```
mysql > exit
```

### 11 再設定した任意のパスワードを入力してEnterを押下しログインできるか確認します。

```
$ mysql -u root -p
```
ターミナルが下記のようになれば成功です！

```
mysql >
```

mysqlのパスワードを変えたりして、1~10を繰り返せば結構なれますので是非。
numpy備忘録1／np.pad

#1.はじめに
　**np.pad**の使い方が良くわからなかったので、調べた結果を備忘録として残します。

#2.1次元配列

```python
# 1次元配列
img = np.array([1, 2, 3])
print(img)
print('img.shape = ', img.shape)
img = np.pad(img, [(1,2)], 'constant')
print(img)
``` 
![スクリーンショット 2020-02-06 11.09.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209705/28ced4c3-a854-b6bc-b356-c1f88494ef03.png)
`img = np.pad(img, [(左0埋め数, 右0埋め数)], 'constant') `

#3.2次元配列

```python
# 2次元配列
img = np.array([[1, 2, 3], [4, 5, 6]])
print(img)
print('img.shape = ', img.shape)
img = np.pad(img, [(1,2), (3, 4)], 'constant')
print(img)
```
![スクリーンショット 2020-02-06 11.17.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209705/d7976c6c-3a3b-0813-dcdf-e95f491c3ab7.png)
`img = np.pad(img, [(上0埋め数, 下0埋め数), (左0埋め数, 右0埋め数)], 'constant') `

#4.3次元配列

```python
# 3次元配列
img = np.array( [[[1, 2, 3], [4, 5, 6]],  [[7, 8, 9], [0, 1, 2]]])    
print(img)
print('img.shape = ', img.shape)
img = np.pad(img, [(1,0), (1, 1), (1, 1)], 'constant')
print(img)
```
![スクリーンショット 2020-02-06 12.46.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209705/cf67f429-78fc-a70d-9896-de01be42e512.png)

　今までは画像のパディングだけでしたが、今度はその画像の前後に**0画像**（全て0で埋め尽くされたもの）を何枚入れるか指定します。ここでは、前に１枚入れています。つまり、

`img = np.pad(img, [(前0画像数, 後0画像数), (上0埋め数, 下0埋め数), (左0埋め数, 右0埋め数)], 'constant') `

#5.4次元配列

```python
# 4次元配列
img = np.array([[[[1, 2, 3], [4, 5, 6]], [[7, 8, 9],[0, 1, 2]]]])
print(img)
print('img.shape = ', img.shape)
img = np.pad(img, [(1,0), (1,0), (1, 1), (1, 1)], 'constant')
print(img)
```
![スクリーンショット 2020-02-06 12.51.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209705/b7414372-8c6e-1e90-942d-d1c4744fcbd9.png)

　今度は、今まで作成した画像（パディングした画像＋0画像）の枚数分の0画像を、さらに前後に指定セット分追加します。ここでは、前に1セット入れています。つまり、

`img = np.pad(img, [(前0画像セット数, 後0画像セット数), (前0画像数, 後0画像数), (上0埋め数, 下0埋め数), (左0埋め数, 右0埋め数)], 'constant') `

#6.実際の使い方例
　４次元配列 img (ミニバッチサイズ、チャンネル数、縦幅、横幅)のパディング処理をする場合を考えてみます。縦方向のパディングを **p_h**, 横方向のパディングを **p_w** とします。バッチ方向やチャンネル方向のパディングは不要なので、

**`img = np.pad(img, [(0, 0), (0, 0), (p_h, p_h), (p_w, p_w)], 'constant')`**
中間テーブルとは？？

##　プログラミング初学者が学習する中間テーブルについて
- Railsなどのフレームワークを学習していて『中間テーブル』という言葉がよくわからなかったので備忘録も兼ねて解説します！　（初投稿なので温かく見守ってください泣）


- [x]  中間テーブルってなんなの？？
- [x] 具体的な使い方



## 中間テーブルってなんなの？？
中間テーブルとは・・・データベースで、テーブルとテーブルの多対多の関係を表すテーブルのこと。

これだけ言われてもパッとしないかもしれません。イメージしてみましょう！


#### データベースにuserテーブルとgroupテーブルというのが存在すると仮定します。

*userテーブル*

|      id        |      name      |
|:--------------:|:--------------:|
|1|山田|
|2|佐藤|
|3|鈴木|
|4|田中|
|〜|〜|

*groupテーブル*

|  id  |  group-name  |
|:----:|:------------:|
|1|Aグループ|
|2|Bグループ|
|3|Cグループ|
|4|Dグループ|
|〜|〜|


以上二つのテーブルから誰がどのグループに属しているかを表現してみると、、

|id     |name     |group    |
|:-----:|:-------:|:-------:|
|1|山田|Bグループ
|2|佐藤|Cグループ
|3|鈴木|Aグループ
|4|田中|Cグループ
|〜|〜|〜|

このようにuserテーブルにgroupカラムを追加することで解決できます。

**しかし！**

userがいくつものgroupに所属できるようにしたい！と考えました
＊例えば通話アプリの『LINE』でも複数の『グループ』に所属できますよね！

すると、、


*userテーブル*

|id     |name   |group1    |group2    |group3    |group4    |
|:-----:|:-----:|:--------:|:--------:|:--------:|:--------:|
|1|山田|Bグループ|Cグループ|Aグループ|
|2|佐藤|Cグループ|Aグループ|Dグループ|Bグループ|
|3|鈴木|Aグループ
|4|田中|Cグループ|Bグループ|


###### これじゃ、空のカラムが大量発生するじゃないか！！！（親父ギャグ）
- カラムどんだけ追加しないとダメなんだ・・・
- DB設計時にどれだけカラムを用意しなければならないんだろう・・・予測できない・・
- 空のカラムはエラーの元じゃないか・・・





####ここで登場するのが　**中間テーブル**　です


##中間テーブルの具体的な使い方

*userテーブル*

|id      |name     |
|:------:|:-------:|
|1|山田|
|2|佐藤|
|3|鈴木|
|4|田中|
|〜|〜|

*groupテーブル*

|  id  |  group-name  |
|:----:|:------------:|
|1|Aグループ|
|2|Bグループ|
|3|Cグループ|
|4|Dグループ|
|〜|〜|




**新たに以下のテーブルを追加！**

*group_userテーブル*


|id    |user    |group    |
|:----:|:------:|:-------:|
|1|山田|Bグループ|
|2|山田|Cグループ
|3|山田|Aグループ
|4|佐藤|Cグループ
|5|佐藤|Aグループ
|6|佐藤|Dグループ
|7|佐藤|Bグループ
|8|鈴木|Aグループ
|〜|〜|〜

1. このように中間テーブルを追加することで空のカラムもなくなり、その都度追加する必要があったカラムも追加せずに済むことができます。さらに誰がどのグループに所属しているかが見やすくなりました。


2. データベースの設計をしていく際には空のカラムが発生しないか、チームとして開発を進めていく中で見やすいDBができているかを考える必要があると思うので覚えておきましょう！！！


初投稿となりましたが、何かわかりにくい点や誤って理解してしまっている点などあればご教授願います。では！
【HfP】カウンター越しに会話アクションを行う方法

このステージでは、(FCの)ドラクエ1やドラクエ2のように、カウンター越しに会話をすることができるステージを作ってあります。
ゆくゆくは、王様からもらったお金の使い方で、クリアの仕方を自分で考えることができるステージになる予定です。
https://www.hackforplay.xyz/works/TXSGGIuB57qmVErDh1WW

ゲーム画面はこんな感じ
<img width="717" alt="a01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/481feef8-c1a2-ba2c-4d53-9137e65a1abc.png">

炎の商人が、本来であればプレイヤーと会話することができない位置にいる。
<img width="243" alt="a03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/90182666-ee65-2e60-2bd5-e40f4838a13c.png">

炎の商人のスクリプトの中は、オープニングのテキストが記載されている。
<img width="678" alt="a02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/76424a03-5b5e-b005-a919-7f88e6730ce1.png">

それでは実際の会話スクリプトはどうなっているかというと、商人が透明化して、テーブルと重なっている。
<img width="159" alt="a06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/5fbed105-98ea-66d8-4aa3-0ea2edd781d1.png">

スクリプトのスクショはこんな感じ。
<img width="661" alt="a05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/ebc46fde-d47a-778d-bdfe-e9409573c819.png">

また、通常の商人は、お金を払うとりんごを召喚する。
プレイヤーはそのりんごを取得して体力を回復するが、ここでは、りんごの召喚を無くし、すぐに体力が回復すねようにしている。
スクリプトは下図スクショを参考。
<img width="627" alt="a07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/0a3d38ab-3e09-f397-e016-e244952fb5ad.png">
VBやVBAで使っていた16進数の色の値をC#で使う

出先で使用しているVB6で作成されたシステムでは、データベースに保存された色の値（16進数）を読み込んで表示に使用している。

C#で作成している新しいシステムでもその色の値を使おうと思ったら、なぜか違う色になった。

現在のシステムを稼働させながら新しいシステムの開発を行っており、同じデータベースのデータを読み込んでいるので、C#用に値を変えることは出来ないし、新しいシステム用に値を登録すると移行後に古いデータを消し忘れてゴミが残る可能性があるので、できれば古い値をそのまま使いたい。

その実現が少しだけ面倒だったのでメモを残す。
***
#前提
**データベースに入っている値：** &H0040C0
**VB6での色指定の記述例：** ctrl.BackColor = &H0040C0

#最初にやったこと
>string code = "&H0040C0"; //実際にはデータベースから値を読み込む
>string newcode = code.substring(2,6);
>ctrl.BackColor = ColorTranslator.FromHtml("#" + newcode ); 

色はついたけれど、思っていた色ではない。

#考えたこと
あれこれ調べてみると、C#でも「000000」が黒で「FFFFFF」が白なのは間違いないようだ。（当然）
「&H」はVB6の場合何色であっても付くので、色情報として後ろ6桁を使用するのは間違いないはず。
その場合、2桁ずつで<font color="red">赤</font>、<font color="green">緑</font>、<font color="blue">青</font>を表しているのも同じはず。
だとすると、<font color="red">赤</font>、<font color="green">緑</font>、<font color="blue">青</font>の並び順が違うのでは？

#試したこと
「00」「40」「C0」の順番を変えながら、何色が表示されるかを確認。
確認には下記サイトを利用した。

[RGBと16進数カラーコードの相互変換ツール - PEKO STEP](https://www.peko-step.com/tool/tfcolor.html)

#分かったこと（結果）
**VB6での「0040C0」は、C#では「C00040」**

C#では文字通り「<font color="red">R</font><font color="green">G</font><font color="blue">B</font>（<font color="red">赤</font><font color="green">緑</font><font color="blue">青</font>）」の順で表記されているが、VB6では「<font color="green">G</font><font color="blue">B</font><font color="red">R</font>（<font color="green">緑</font><font color="blue">青</font><font color="red">赤</font>）」の順で表記されていたようだ。

#そもそも
2020年にもなってVB6で作られたシステムが現役だというところに問題があry

なおこのシステムの開発は2010年頃で、その1つ前のシステムを1990年代に開発した会社に依頼したところ、その会社の都合でVB6になったらしい。

私は開発が始まってから関わるようになったので、遅々として開発が進まず、「入力欄にアポストロフィを入力するとエラーで強制終了」に代表される技術力のなさに愕然とし、最終的にはその会社から開発の権利を引き継いで、私が通常業務の片手間（と言いつつたくさんサービス残業した）で2年ほどかけ完成させたのであった。（ソースコードを初めて目にした時、あまりのひどさに目まいがした）
爆速でオブジェクトを動かすスクリプト

standardAssetsを入れる暇がない場合、
こんな感じのスクリプトを書けば、「とりあえず前後に移動して、左右に旋回する」ことができる。

マイクラとかみたいに、ジャンプなどは、とりあえずstandardAssetsを入れるか、
キャラクターコントローラーを使ったスクリプトが望ましい。

```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Move_player: MonoBehaviour
{

    public float MoveSpeed;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKey(KeyCode.UpArrow))
        {
            transform.position += transform.forward * MoveSpeed;
        }
        if (Input.GetKey(KeyCode.DownArrow))
        {
            transform.position += transform.forward * -1 * MoveSpeed;
        }
        if (Input.GetKey(KeyCode.RightArrow))
        {
            transform.Rotate(0, 5, 0);
        }
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            transform.Rotate(0, -5, 0);
        }
    }
}
```



[gitHubに置いたMove_playerのリンクはここから](https://github.com/sanpeita/unitytest/blob/master/Move_player.cs)
RailsにてPostgreSQL使用の共同アプリ開発の導入手順

共同開発用アプリを`git clone`、`bundle install`、`bundle exec rails db:create`した際に

```
could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
Couldn't create database for {"adapter"=>"postgresql", "encoding"=>"unicode", "pool"=>5, "database"=>"XXX"}
rails aborted!
PG::ConnectionBad: could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
```
のエラーが発生。ローカルで共同アプリ用のPostgreSQLを構築するため、以下対応が必要。

```
# PostgreSQLのインストール（PostgreSQLがインストールされていない場合 ）

brew install postgresql
```
```
# macに初期データが有る場合があるので一度削除、初期化

rm -rf /usr/local/var/postgres
initdb /usr/local/var/postgres -E utf8
```
```
# PostgreSQLの起動

brew services start postgresql
```
```
# PostgreSQLの動作確認

psql -l
```
問題なければ以下を実行し、完了。

```
bundle exec rails db:create
bundle exec rails db:migrate
```
##参考記事
・Railsのプロジェクトに途中から参加するとき
https://uncode.co.jp/web/rails%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AB%E9%80%94%E4%B8%AD%E3%81%8B%E3%82%89%E5%8F%82%E5%8A%A0%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D/

・macOS SierraへのPostgreSQLインストール
https://morizyun.github.io/database/postgresql-install-mac.html
HttpServletRequest のクラス・ファイルが見つかりません

##プロジェクトビルドでのエラー##

【メッセージ】
ビルド・パスが不完全であるため、プロジェクトはビルドされませんでした。
javax.servlet.http.HttpServletRequest のクラス・ファイルが見つかりません。

【対処】
Javaのビルドパス>ライブラリーで、Apache Tomcatが追加されていなかった。
Apache Tomcatをライブラリに追加したところ、エラーがなくなった。

(Eclipse)
開発環境の Ruby version を上げる

開発環境 (最近変なスペルになった macOS をここでは想定) に Ruby を入れるのは、よくある話だが、Ruby をバージョンアップする手順についてはもサッとできるようにまとめておく。

# 前提
- macOS にいれるミドルウェアのパッケージマネジメントは Homebrew で行っている
- Ruby は直接 Homebrew でいれるのではなく、rbenv を用いて管理している
- Ruby バージョンアップするのは久しい

つまり macOS > Homebrew > rbenv > bundler > 各フォルダごとに Gem file のような構成である。

# コマンド

rbenv にてインストール可能なバージョンは下記で確認できる。

```shell

$ rbenv install -l

2.6.0
2.6.1
2.6.2
2.6.3
2.6.4
2.6.5

```

もし、必要なバージョンが存在しない場合は rbenv 自体をバージョンアップしてあげる必要があるだろう。

```shell

# Homebrew 本体を更新
$ brew doctor
$ brew update

# ruby-build を更新
$ brew upgrade ruby-build

```

必要なバージョンがあるかどうか確認して、global と local の version を設定しておく。

```shell

# Ruby
$ rbenv install -l
$ rbenv install 2.6.X

$ rbenv global 2.6.X
$ cd /to/your/app/path
$ rbenv local 2.6.X

# Bundler は各バージョンの Ruby ごとにインストール。
$ rbenv versions
$ gem install bundler

```

# ふぅ
・・・ Docker 化しておいて構成まるごとごと差し替えるのがナウくてハマりづらい方法だとは思う。
XRPアドレスのreserved 20XRPについて(How to activate XRP Address)


# XRPのアクティベートまとめ
- XRPアドレスはリザーブ(20XRP)を持っていない場合は送受信ができない。
    - https://xrpl.org/reserves.html に書いてある
- ならば、そのXRPアドレスにとりあえず初回の20XRPを送ればアクティベートできる。と思っていたがprepareTransaction()を使った送金方法ではアクティベートができなかった。
    - account not foundのエラーになってしまう。
- ただしくはpreparePayment()を使ってアクティベートする必要があった。
    - https://xrpl.org/accounts.html#creating-accounts に書いてある

```
# "アカウント作成"というトランザクションは無い。
There is not a dedicated "create account" transaction. 

# ペイメントトランザクションは自動的に新アカウントを作るよ。まだアカウントがない有効なアドレスにリザーブ(20XRP)以上を送ればね。
The Payment transaction automatically creates a new account if the payment sends XRP equal to or greater than the account reserve to a mathematically-valid address that does not already have an account. 

# 他のトランザクションではアカウントは作れない。
No other transaction can create an account.
```

# ソース
- [ripple-libの該当箇所](https://github.com/ripple/ripple-lib/blob/develop/src/transaction/payment.ts#L241)

```typescript

function preparePayment(
  this: RippleAPI,
  address: string,
  payment: Payment,
  instructions: Instructions = {}
): Promise<Prepare> {
  try {
    validate.preparePayment({address, payment, instructions})
    const txJSON = createPaymentTransaction(address, payment)
    return utils.prepareTransaction(txJSON, this, instructions)
  } catch (e) {
    return Promise.reject(e)
  }
}
```

- preparePayment()でアクティベートするサンプルコード

```javascript

api.connect().then(() => {
  console.log('Connected...')
  api.preparePayment(senderAddress, payment, instructions).then(prepared => {
    const {signedTransaction, id} = api.sign(prepared.txJSON, senderSecret)
    console.log('Submitting payment...')
    console.log(id)
    api.submit(signedTransaction).then(result => {
      console.log(JSON.stringify(result, null, 2))
      api.disconnect()
    })
  })
}).catch(console.error)
```

- XRPアドレスのアクティベートはKYC/AMLの関係で取引所に送らないといけないのか？と思っていたけど全然違ったしドキュメントに書いてあったよ。という話でした。
- 反応があればもうちょっと書く。
Let's Encrypt certbot renew 自動更新エラー

Let's Encryptを使ってssl証明書を取得後、自動更新の設定をしたものの、エラーが出て自動更新されなかった時の解決法を一つ紹介します。

######前提
・Debian(GCP)
・Let's Encryptを使ってSSL証明書の取得、https化が完了している。

######目標
Let's EncryptのSSL証明書は有効期限が3ヶ月なのでnerewコマンドをcrontabで定期実行させて証明書を自動更新する。

######変更前の設定(実行スケジュールの部分は省略)
```Bash:crontab
certbot renew --post-hook "/etc/init.d/apache2 restart"
```

######更新エラー

portが使用中なので更新できないと言っています。起動中のwebサーバ(SSL証明書の更新対象サービス)を停止させてからrenewコマンドを実行させなければいけませんでした。

```Bash
WARNING:certbot.renewal:Attempting to renew cert from /etc/letsencrypt/renewal/SITE_URI.conf produced an unexpected error: At least one of the required ports is already taken.. Skipping.
```

######変更後の設定(実行スケジュールの部分は省略)
```Bash:crontab
certbot renew --pre-hook "/etc/init.d/apache2 stop" --post-hook "/etc/init.d/apache2 start"
```
変更前のコマンドに--pre-hookオプションを追加しました。

######補足

・"/etc/init.d/apache2 restart"、"/etc/init.d/apache2 start"、"/etc/init.d/apache2 stop"の箇所はwebサーバの停止、起動、再起動のコマンドです。環境によって読み替えてください。

・rootユーザのcrontabに追加するとコマンドはroot権限で実行されます。他ユーザのcrontabに追加する時は"sudo /etc/init.d/apache2 restart"のようにコマンドの前にsudoを付ける必要があります。

・certbot renewの箇所は環境によってcertbot-autoなどに読み替えてください。環境によってcertbotのディレクトリを明示する場合もあります。/home/user_name/certbot renew など。
Hatena Engineer Seminar #13 @ Tokyo

参加しました。
Twitterにも流しましたが、レポートを書きます。

# イベント詳細
[Hatena Engineer Seminar #13 を2月5日(水)に開催します！（2020年1月31日、2020年2月4日 追記）](https://developer.hatenastaff.com/entry/2020/01/22/180000)

# 出版社との共同開発の暮らし 〜エンジニア編〜
- ジャストアイディアが採用
- 編集部やデザイナーの実現したいこと.↔︎ それに対する技術的制約の調整がエンジニアの腕の見せ所
- 編集部とエンジニアチームは、同じSlackに入っているが、雑談的な会話は少ない
- 自社サービスでも共同開発でも、エンジニアからしたらユーザーに価値を提供するという目線では同じ
- カドカワの小説文化・活字文化の熱量に良い影響を受けている

# SREの異動と働き方 〜はてなブログ編〜
[発表スライド](ttps://speakerdeck.com/cohalz/hatena-engineer-seminar-number-13)

- SRE専門の部署→はてなブログのSREに
- オペミスは個人の責任ではなく、仕組みの問題として対策を練る文化
- PWG(Performance Working Group)というグループの運営をやった
    - パフォーマンスの監視
    - どのパラメータを見たら良いかを把握
- チームで運用を回していく
    - ドキュメント化→誰でもできるように
    - ミドルウェアの設定もチームでレビュー
    - 自動化
- やったこと
    - ドキュメント化: Scrapboxを活用
    - 健全化: アラートの精査
    - 自動化: 証明書の更新→検証環境でも本番と同じ仕組みにして、自動化の異常に気づけるようにした

Q. ポストモーテム書いてますか？　障害を出した人が批判されないよう対策している？
→ 書いてます。むしろ書くと称賛される文化があります。
　障害の報告書書くのは辛いことなので、書いてくれてありがとうな文化

Q.異動して働きかたを変えた点はありますか？
→ 異動する前のSRE部署とも連絡をとって、使えるネタがあれば今の部署に情報連携した

# ブログソーシャルボタン刷新大作戦
- AMP版のブログソーシャルボタンをカラフルな正方形に刷新した話
- 知らなかったけど、はてなブログMediaというオウンドメディアサービスをやっているらしい
- 考えたこととしては、現在ブログを見ているユーザー/管理しているユーザー/説明するスタッフ/開発者の負担を最小限にしたい
    - おもてなし
- いくつか作戦を考えたが、移行期間を設けて、クエリパラメータ（new_amp_social=1）を一つ増やすことで、本番環境で新しいソーシャルボタンを出せるように変更
    - 四方よし！
- 今振り返ると、移行期間なしでもよかったかも
    - ソーシャルボタンの表示が多少不具合起こっていても、そんなに気にならなかったかも……
    - チームで相談した結果、どこまで表示崩れするかわからないので、上記の方法をとった
- あるいはもっと手数をかける案も→状況による
- まとめ：おもてなしをどのぐらいやるかはチームとよく相談して、必要十分な程度を見極められるように！

# Mackerel のフロントエンドフレームワーク移行 序章
- レガシーフレームワーク脱却プロジェクト
- AngularJS（2021/6）脱却→React(TypeScript)
- 技術面/チーム内の開発者体験/車内の実績を考慮
    - Reactを採用
- スクリプト/テンプレートあわせて52,000行のコードベース
- 移行が間に合うかどうかをダッシュボードで可視化
- 複数人体制になって、情報共有をはかる
Terminal で直前の出力内容をキーボードからコピーしたいだけだった、、、

Terminal でなにかを実行したら、実行内容が出力されて、つぎの入力受付に移るだけど、直前の出力をキーボードからコピーしたかった． で色々調べて見たんだけど、なぜか、ぱっとショートカットキーが出てこなかったんで、ここに記す．

`⌘ Shift ↑`

[色々調べまくった末にたどり着いたサイト](http://osxdaily.com/2012/02/23/keyboard-shortcuts-to-navigate-select-text-mac-os-x/)
GCP Cloud Buildをつかうだけの話

# なにこれ？

すいません、Azure前提で書かれたチュートリアル的な本の内容をCGPに置き換えてやっているだけのメモです。引き返して下さい。

# コンテナのビルド（docker）

Azure Container Registry でのこれは

```shell

$ az acr build --registry $ACR_NAME --image image-name:v1 .
```

GCP Cloud Build でこうか？

```shell

$ gcloud builds submit --tag gcr.io/$PROJECT_ID/image-name .
```

いけてるっぽい。

```shell

$ gcloud container images list-tags gcr.io/$PROJECT_ID/image-name
DIGEST        TAGS    TIMESTAMP
9d615e5f9700  v1.2    2020-02-06T12:11:09
f365337aa141  v1.1    2020-02-06T12:06:22
0994cf70201e  latest  2020-02-06T12:02:56
```

`$PROJECT_ID` などの変数はよしなに置換してくれるっぽい。`export PROJECT_ID=$(gcloud config get-value project)` とかしなくても大丈夫。

# 参考

### Azure
- [チュートリアル:Azure Container Registry タスクを使用して、クラウドでコンテナー イメージをビルドしてデプロイする](https://docs.microsoft.com/ja-jp/azure/container-registry/container-registry-tutorial-quick-task)

### GCP

- [Docker のクイックスタート](https://cloud.google.com/cloud-build/docs/quickstart-docker?hl=ja)
- [変数値の置換](https://cloud.google.com/cloud-build/docs/configuring-builds/substitute-variable-values?hl=ja)
【Kubernetes】 Microsoft の Azure Vote App を動かしてみる

# YAML
```yaml:namespace.yml
apiVersion: v1
kind: Namespace
metadata:
  name: vote-app
```

```yaml:redis.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-deploy
  namespace: vote-app
spec:
  selector:
    matchLabels:
      app: redis-deploy
  template:
    metadata:
      labels:
        app: redis-deploy
    spec:
      containers:
        - name: redis-deploy
          image: redis
          resources:
            limits:
              memory: "128Mi"
              cpu: "100m"
          ports:
            - containerPort: 6379
---
apiVersion: v1
kind: Service
metadata:
  name: redis-svc
  namespace: vote-app
spec:
  selector:
    app: redis-deploy
  ports:
    - port: 6379
      targetPort: 6379
```

```yaml:app.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: vote-deploy
  namespace: vote-app
spec:
  selector:
    matchLabels:
      app: vote-deploy
  template:
    metadata:
      labels:
        app: vote-deploy
    spec:
      containers:
        - name: vote-deploy
          image: microsoft/azure-vote-front:v1
          resources:
            limits:
              memory: "128Mi"
              cpu: "100m"
          ports:
            - containerPort: 80
          env:
            - name: REDIS
              value: "redis-svc"
---
apiVersion: v1
kind: Service
metadata:
  name: vote-svc
  namespace: vote-app
spec:
  type: LoadBalancer
  selector:
    app: vote-deploy
  ports:
    - port: 80
      targetPort: 80
```

# 投入
```sh
$ kubectl apply -f .
namespace/vote-app created
deployment.apps/redis-deploy created
service/redis-svc created
deployment.apps/vote-deploy created
service/vote-svc created
```

# 動作確認
```sh
$ kubectl get svc -n vote-app
NAME        TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE     SELECTOR
redis-svc   ClusterIP      10.98.237.27   <none>        6379/TCP       3m25s   app=redis-deploy
vote-svc    LoadBalancer   10.96.230.52   10.0.0.200    80:31102/TCP   3m25s   app=vote-deploy
```

`LoadBalancer` にしたので `EXTERNAL-IP` に書かれている IP アドレスにアクセスします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204925/86546228-910d-a34c-1c08-9c4152a7db7b.png)

きちんと動作していることが確認できました
Jenkins Global Tool Configuration > JDK 自動インストールでエラー

エラー内容

Installing JDK jdk-8u221-oth-JPR
Downloading JDK from https://download.oracle.com/otn/java/jdk/8u221-b11/230deb18db3e4014bb8e3e8324f81b43/jdk-8u221-linux-x64.tar.gz
Your Oracle account doesn't appear valid. Please specify a valid username/password
ERROR: Unable to install JDK unless a valid username/password is provided.
Finished: FAILURE

## 手動インストール

```bash
yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
```
### 設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33237/a282537e-b5f2-5512-4d89-ed5b4f3011e5.png)

インストールしたけどパスを忘れたときはtools.jarのあるディレクトリを参考にする

```bash
find / -name tools.jar
```
WEMOS LOLIN32 の調査


# ESP32 WEMOS Lolin32

AKBONE Release 5 に採用して、いろいろ展開しようとしてある程度まとめて2017年に仕入れました。
AKBONE というのは、「日本Androidの会秋葉原支部ロボット部」で作っている電子工作とプログラミングのトレーニングキットです。
WEMOS Lolin 32 は安かったのだけれど、継続的な入手性がネックになり、2018年バージョンの AKBONE Release 6 ではこれではないボード(アオノドン)に乗り換えています。

## 本家サイト

https://www.wemos.cc/

回路図や寸法諸元などは、こちらにあります。
https://wiki.wemos.cc/products:lolin32:lolin32 


## パチもん？

本家ではないサイトでは、OLEDがついていたり、18650バッテリのホルダーがついていたり、いろいろとバリエーションがあります。
しかしながら、これらはどうやらパチもんらしく、品質がアレだという話も聞こえています。

## 入手性

2017年にまとめて購入できないかWEMOSに問い合わせた所、ネットショップなどで購入するように示されました。当時は公式ネットショップでは品切れになることもしばしばありました。

その後、2020年に確認した所上記公式サイトではLOLIN32 (Retired)となっています。また、公式サイトのURLは以下のように無効でした。

こちらは 「Sorry, This page you requested can not be found!:(」 という表示が出る。
https://lolin.aliexpress.com/
こちらは商品が登録されておらず。
https://lolin.aliexpress.com/store/1331105

しかしながらaliexpressやtaobaoにある、公式ページではない小売店では販売されています。
これらは流通在庫なのか、パチもんなのかは未確認。


# ESP32-DevKitC との違い 

espressif 公式の ESP32-DevKitC と WEMOS の Lolin32 はよく似ています。
![DAz9V_OVoAAWIdE (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/402ac017-9f72-73b0-23b9-51170f721462.jpeg)

## 比較

- ヘッダピン
 - ESP32-DevKitC はんだづけ済
 - Lolin32　ピンは自分ではんだづけ
 - ピン配列は微妙に異なる 
- 形状
  - ESP32-DevKitC はちょっと広い 
  - Lolin32 は 2.54mm だけ狭く、400Pのブレッドボードに刺した時に少し余裕ができる
- その他の付属機能
 - ESP32-DevKitC Bootスイッチ付いている 
 - Lolin32 LiPo充電ポート付いている
- 価格
 - ESP32-DevKitC ￥1480 (秋月電子)
 - Lolin32 約半額
- USBシリアル
 - ESP32-DevKitC は CP2102
 - Lolin32は CP2104 

![DAz_v9RU0AIEoqx.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/bac0304f-223b-8fd7-435b-3ab90635e965.jpeg)
![DAz_ydEU0AEfys-.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/279e6c3e-53aa-68f8-8487-a2c5dcedb1f4.jpeg)

# Arduino開発環境

普通のESP32開発の設定を行うと、ボード選択で「WEMOS LOLIN32」が選べるようになります。
![image](https://qiita-image-store.s3.amazonaws.com/0/139524/38b5e585-fa3b-beb1-a643-79a2b18ea454.png)

# 動作確認
![image](https://qiita-image-store.s3.amazonaws.com/0/139524/3d339393-08e8-1764-c4b3-91c010c59791.png)

BlinkでLチカできます。内蔵LEDは５番に割り当てられています。
Laravel/uiを入れたらnpmが通らない[apt-get等でnpmとnodeが古いケース+Docker環境]

ハマったので備忘録。
<h1>問題</h1>
Laravel/uiを入れた後には
npm installして必要なモジュールをインストールする。

自分の場合は開発環境でdocker越しにlaravelの環境を動かしていて、
npmは

```shell
apt-get install -y node npm
```
でインストールしていた。その後、

```shell
$ composer require laravel/ui
$ php artisan ui vue --auth
```
でlaravel/uiをインストールした後、

```shell
$ npm install
```
が途中で止まって進まない。
という問題に直面した。
IEEEなんたら
うろ覚え
というモジュールの近辺で静止する。

<h1>解決</h1>
ログを見ると実行した直後に警告が出ており、現在のnpmとnodeは対応してないという警告が出ていた。
どうもapt-getで得られていたnpmとnodeのバージョンが古いようで、
apt-getではなく、npmとnodeを公式のホームページから直接インストールすることで解決した。
(下のDockerfileの今回の解決手順の所を参考)

dockerのコンテナで動かしていたため、自分はアンインストールは不要だったが、
自動的にnpmとnodeのインストールが破棄されない場合は、
アンインストールの手順が必要になるかもしれない。


```docker:Dockerfile[参考]
FROM php:7.4.2-apache
RUN apt-get update

#composer install
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
&& php -r "if (hash_file('sha384', 'composer-setup.php') === 'c5b9b6d368201a9db6f74e2611495f369991b72d9c8cbd3ffbc63edff210eb73d46ffbfce88669ad33695ef77dc76976') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" \
&& php composer-setup.php \
&& php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer
RUN composer self-update

#node,npm install--今回の解決手順
#nodeのversionは必要に応じて変更すること。
#Dockerでない場合はnode npmのアンインストールがおそらく必要（手順未確認）。
#アンインストールが成功した場合は、RUN以下をlinuxコマンドに読み替えて実行する。
RUN apt-get install -y wget
&& wget https://nodejs.org/dist/v12.14.1/node-v12.14.1-linux-x64.tar.xz
&& tar -xf node-v12.14.1-linux-x64.tar.xz
&& mv node-v12.14.1-linux-x64/bin/* /usr/local/bin/
&& mv node-v12.14.1-linux-x64/lib/node_modules/ /usr/local/lib/

#php plugin install
RUN docker-php-ext-install pdo_mysql mysqli

#for Laravel rooting
#このコンテナのイメージ元のphp:7.4.2-apacheではrewirte.soが標準で読み込まれていない。
#Laravelのrootingには必要なモジュールなので読み込ませる。
RUN mv /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled/

#debug soft install
RUN apt-get -y install vim
```
追記：
本当はnpm、http、composerは別コンテナにしたり、
dockerのレイヤーを考えてapt等を一つに纏めた方が
良いのかもしれないけれども、参考までに。

追記2:
rootingが動かなかったので動くように参考のDockerfileを修正
SQL 基礎用語&文法　1

#はじめに
SQLを学んでいく上で、用語等を中心に整理していきます。
ターミナルにて入力する。もしくはSequelProのクエリにて入力するようにしております。
もうすでにご存知の方、省略の仕方等ご存知でしたら、ご教授願います。

#SQLとは
・　SQL(Structured Query Language）というプログラミング言語
・　リレーショナルデータベース（RDB)の操作を行う。
・　どんな種類のRDBに対しても、基本的に同じ文法で操作することができる。
　　→　ISO（国際標準化機構）で規格化している。




#RDBとは
データをテーブルという表形式の構造で管理するデータベース



#SQLがデータベースやテーブルに行う命令
###データを定義する　DDL（Data Definition Language)
データベースやテーブルに対してできること
・　CREATE 作成
・　ALTER  更新
・　DROP   削除

###データを操作する　DML（Data Manipulation Language)
データに対してできること
・　INSERT  登録
・　UPDATE  更新
・　DELETE　削除
・　SELECT　検索



#SQL基礎文法
##データベース構造の操作（ターミナルにて行います。）
####①mysqlにユーザー名がrootで接続する。
　　% mysql -u root
　　以下、mysql>の後に記載する。また、SQL文の後に　;　をつけること。

####②データベースを一覧で表示する。
　　SHOW DATABASES;

####③データベースやテーブルを作成する。
　　CREATE DATABASE データベース名; 

####④データベースを選択する。(USE文）
　　USE データベース名;

####⑤接続しているmysqlを終了する。
　　exit


##テーブル構造の操作（ターミナルにて行います。）
####①選択したデータベースに存在するテーブルを一覧で表示する。
　　SHOW TABLES;

####②選択したデータベースにテーブルを作成する。
　　CREATE TABLE テーブル名 (カラム名 カラム名の型, ...);
######②-1　型名/保存できる値
　　INT/数字　VARCHAR(M)/最大M文字の文字列
　　例）CREATE TABLE goods (id INT, name VARCHAR(255));

####③テーブル構造を確認する。
　　SHOW columns FROM テーブル名; 

####④テーブル構造を変更する。（カラムの追加、修正、削除）
　　ALTER TABLE　テーブル名　操作（追加、修正、削除）

######④-1　追加する操作　
- ④-1-1　カラムを1つだけ追加する。
　　ALTER TABLE テーブル名 ADD カラム名　カラム名の型;

- ④-1-2　カラムを複数追加する。
　　ALTER TABLE テーブル名 ADD (カラム名　カラムの型, ...);

######④-2　修正する操作
　　ALTER TABLE テーブル名 CHANGE 古いカラム名　新しいカラム名　新しいカラム名の型;

######④-3　削除する操作
　　ALTER TABLE テーブル名 DROP カラム名;

####⑤テーブルにあるレコードを全て表示する。
　　SELECT * FROM テーブル名;



##テーブルに保存するデータの操作（ターミナルにて行います。）
####①テーブルにデータを登録をする。

- ①-1　全てのカラムに値を入れる場合
　　INSERT INTO テーブル名　VALUES(値1,値2,値3);
- ①-2　特定のカラムに値を入れる場合
　　INSERT INTO テーブル名(カラム名1, カラム名2) VALUES(値1, 値2);

　
####②テーブル登録したデータを更新する。
　　UPDATE テーブル名 SET 変更内容 WHERE 条件;

####③テーブル登録したデータを削除する。
　　DELETE FROM テーブル名 WHERE 条件;




#さいごに
日々勉強中ですので、随時更新します。
皆様の復習にご活用頂けますと幸いです。
Rails　コーティング規約について　1

# はじめに
Ruby、Railsの基礎を学習中の方に向けて記載致します。
[Rubyのコーティング規約はコチラをクリック願います。](https://qiita.com/raigakun/items/80ba30671d7b2b18c44e)
私自身これからチーム開発を行う上で大事にしたい。知っておきたいことをOutputします。

#Routing
####ActiveRecordのモデル間の関連を表現するには、入れ子型でルートを定義する。


```ruby:qiita.rb
class Post < ActiveRecord::Base
  has_many :comments
end

class Comments < ActiveRecord::Base
  belongs_to :post
end

# routes.rb
resources :posts do
  resources :comments
end
```

#ActiveRecord
####なるべくhas_and_belongs_to_manyよりhas_many :throughを利用する。

```ruby:qiita.rb
# あまり良くない例
class User < ActiveRecord::Base
  has_and_belongs_to_many :groups
end

class Group < ActiveRecord::Base
  has_and_belongs_to_many :users
end

# 良い例
class User < ActiveRecord::Base
  has_many :memberships
  has_many :groups, through: :memberships
end

class Membership < ActiveRecord::Base
  belongs_to :user
  belongs_to :group
end

class Group < ActiveRecord::Base
  has_many :memberships
  has_many :users, through: :memberships
end
```

#さいごに
コーティング規約については毎日更新します。
皆様の復習等にご活用頂けますと幸いです。
[メモ] sbtがMavenにhttpでリクエストして依存関係を解決できない時の設定


業務でScalaやsbtを少しだけ触る機会があるのですが、先日今までビルドできていたプロジェクトが突然エラーになり、慌てて調べるとMavenが2020/01/15からHTTPをサポートしなくなったという事が分かりました。

> Effective January 15, 2020, The Central Repository no longer supports insecure communication over plain HTTP and requires that all requests to the repository are encrypted over HTTPS.

https://stackoverflow.com/questions/59764749/requests-to-http-repo1-maven-org-maven2-return-a-501-https-required-status-an
https://stackoverflow.com/questions/59763531/maven-dependencies-are-failing-with-a-501-error

原因は分かったけど直し方がよく分からんということで公式サイトを読んで一旦以下の設定を追加することで解決。
本当はバージョンをちゃんと上げるとよいと思うのだけど…。
https://www.scala-sbt.org/1.x/docs/Proxy-Repositories.html

`~/.sbt/repositories`

```shell
[repositories]
  local
  maven2: https://repo1.maven.org/maven2/
```

あまり詳しくないので突っ込みどころありましたら指摘お願いします。
AsRef & AsMut


### 用途

`std::convert::AsRef` 和 `std::convert::AsMut` 用于非常方便且低成本的将类型（types）转换为引用（references）。

比如有类型 `A` 和 `B` ，则

```rust
impl AsRef<B> for A
```

表示 `&A` 可以转换为 `&B`。


同样：

```rust
impl AsMut<B> for A
```

表示 `&mut A` 可以转换为 &mut B`。

这种方式可以在类型转换的时候，避免值的拷贝和移动。比如标准库里的 `std::fs::File.open()` 方法定义如下：

```rust
fn open<P: AsRef<Path>>(path: P) -> Result<File>
```

这种定义方式，`File.open()` 除了可以接收 `Path` 类型的参数，还可以接收 `OsStr`、 `OsString`、 `str`、 `String` 以及 `PathBuf` 等类型的参数，因为这些类型都实现了 `AsRef<Path>`， 都可以隐式转换为 `Path` 类型。

### 实现

`std::convert::AsRef` 是一个 [Trait](https://doc.rust-lang.org/std/convert/trait.AsRef.html)

比如 [为String类型实现AsRef\<Path\>](https://doc.rust-lang.org/src/std/path.rs.html#2662) 的代码如下：

```rust
impl AsRef<Path> for String {
    fn as_ref(&self) -> &Path {
        Path::new(self)
    }
}
```

看起来很简单。


### VS From Trait

AsRef 是引用到引用（reference-to-reference）的转换，因此成本低。与此相对， From 是值到值（value-to-value）的转换，因此成本会比较高。
自然言語処理Case Study：Word Frequency in 'Anne with an E'

この記事は自然言語処理を使って、小説の言葉使いを分析する実験である。パイプラインを作って、言葉の頻度を簡単に分析する。
I recently encountered this amazing Netflix series Anne with an E and was amazed by the story. It's hard to find high-quality movies that pass the Bechdel Test. The story is extremely empowering for girls. Inspired by Hugo Bowne-Anderson from Data Camp, I decided to apply my knowledge in web-scraping and basic Natural Language Processing knowledge to analyze the word frequency in the original book ANNE OF GREEN GABLES.

![anne-with-an-e.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485479/47821d98-e1aa-a9b2-f33b-06622420e602.jpeg)

In this project, I'll build a simple pipeline to visualize and analyze the word frequency in ANNE OF GREEN GABLES.

```python
from bs4 import BeautifulSoup
import requests
import nltk
```
____
If this is your first time using nltk, don't forget to include the following line to install nltk data as we'll need to use the stopwords file later to remove all the stopwords in English.

```python
nltk.download()
```
Simply run this line in your program and a GUI window will pop up. Follow the instructions to install all the data. The installation procedure would take a couple of minutes. After the installation, you'll be good to go.
____
```python
r = requests.get(‘http://www.gutenberg.org/files/45/45-h/45-h.htm')
r.encoding = ‘utf-8’
html = r.text
print(html[0:100])
```
Now we can fetch the html version of the book and print the first 100 characters to see if it's right. Before extracting all the text from the html document, we'll need to create a BeautifulSoup object.

```python
soup = BeautifulSoup(html)
text = soup.get_text()
print(html[10000:12000])
```
Then we'll use nltk and Regex to tokenize the text into words:

```python
tokenizer = nltk.tokenize.RegexpTokenizer('\w+')
tokens = tokenizer.tokenize(text)
print(tokens[:8])
```
Now we can turn all the words into lower-case for later frequency distribution calculation since it is case-sensitive.

```python
words = []

for word in tokens:
    words.append(word.lower())
print(words[:8])
```
One last step before we can visualize the distribution of frequency of words is to get rid of all the stop words in words list.

```python
sw = nltk.corpus.stopwords.words(‘english’)
print(sw[:8])
words_ns = []
for word in words:
    if word not in sw:
        words_ns.append(word)
print(words_ns[:5])
```
Finally, let's visualize the top dist plot and see what are the top 25 frequent words in the book.

```python
%matplotlib inline
freqdist = nltk.FreqDist(words_ns)
freqdist.plot(25)
```
![F3FC7F36-AB91-4C63-B5FE-02F9A04A8F5D.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485479/cdce9bc8-774b-f625-13ec-5be637db3b6b.jpeg)

Now we can see the top two supporting characters in the fiction are two females: Marilla and Diana. It's not surprising the name of the Netflix series renamed it as Anne With an ‘E’ as it is a name repeated over 1200 times.
UIViewのExtensionでフェードイン・アウトアニメーションを実装する


UIViewでフェードイン・アウトをExtensionとして実装しました。

## 環境

* Swift 5
* Xcode 11.2.1

## フェードイン・アウトを行うExtension

UIViewを継承しているクラスなら利用できるので案外便利

```Swift

extension UIView {

  // MARK: Animation 

  enum Fade {
    case `in`
    case out
  }
  
  /// フェードインアウトを行う
  /// - Parameters:
  ///   - type: fadeタイプ
  ///   - animation: アニメーションを実行するか
  func fade(type: Fade, animation: Bool = true) {
    switch type {
    case .in:
      isHidden = false
      UIView.animate(withDuration: 0.3) {
        self.alpha = 1.0
      }
    case .out:
      if animation {
        isHidden = true
        UIView.animate(withDuration: 0.3) {
          self.alpha = 0.0
        }
      } else {
        alpha = 0.0
        isHidden = true
      }
    }
  }

}
```

## あとがき

簡潔に分岐処理を書けてない気がするのでもっとこうしたらスマートになるよ！とかあったら教えてください
aaa

```java
Money.java
package LifeGame;

class Money {

    /*
     * Moneyクラスは各イベントによって賞金や所持金の増減が決まるので
     * 固有値は定義しません。
     * イベントクラスでそれぞれ定義してください。
     *
     * */


    //所持金変数
    private int myMoney;
    //論理値
    private boolean logic;

    //所持金セットゲット
    public int getMyMoney() {
        return myMoney;
    }

    public void setMyMoney1(int myMoney) {
        this.myMoney = myMoney;
    }

    //所持金増減セッター
    public void setMyMoney2(int myMoney) {
        if(getMyMoney() > Constant.MAXMONEY) {
            //所持金が上限値を超えたら所持金に上限値を代入
            setMyMoney1(Constant.MAXMONEY);
        }
        else if(getMyMoney() < Constant.MINMONEY) {
            //所持金が下限値を超えたら所持金に下限値を代入
            setMyMoney1(Constant.MINMONEY);
        }
        else {
            this.myMoney += myMoney;
        }
    }

    //論理値セットゲット
    public boolean getLogic() {
        return logic;
    }

    public void setLogic(boolean logic) {
        this.logic = logic;
    }

    //賞金メソッド
    public int prizeGet(int prize) {
        //各イベントごとに賞金の引数を定義し所持金に追加
        setMyMoney2(prize);
        return prize;
    }

    //所持金増減
    public void moneyVary(int vary) {
        if(getLogic() == true) {
            //論理値がtrueなら所持金増
            setMyMoney2(vary);
        }else {
            //論理値がfalseなら所持金減
            setMyMoney2(-vary);
        }
    }
}

0
oyoyo_oyoyo
@oyoyo_oyoyo
2020-02-06 10:59
Constant.java
package LifeGame;

public class Constant {
/*
*定数はこのクラスに追加してください
*/
    //所持金最大値
    static final int MAXMONEY = 999999999;

    //所持金最小値
    static final int MINMONEY = -999999999;
}


0
oyoyo_oyoyo
@oyoyo_oyoyo
2020-02-06 11:01
Character.java
package LifeGame;

public class Character {
    //名前
    private String name;
    //性別
    private boolean gender;
    //職業
    private String job;
    //年齢
    private int age;

    //プレイヤーナンバー
    public static int playerNum = 0;

    //セッターゲッター
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public boolean getGender() {
        return gender;
    }
    public void setGender(boolean gender) {
        this.gender = gender;
    }
    public String getJob() {
        return job;
    }
    public void setJob(String job) {
        this.job = job;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

    //コンストラクタ
    public Character(String name) {
        //インスタンス化した順にplayerナンバーを決定
        playerNum += 1;
        setName(name);
        System.out.println("こんにちわ\n"+name+"さんはplayer"+playerNum+"です");
    }
}

```
Docker環境にて、PHPのデバッグができるかどうか試しにやってみた


#はじめに
・今の職場にてPHPの開発をしているだが、デバッグができなくて困っている。苦肉の策でログを出しながら確認しているが、なんとかしたいと思い。
最近かじったDocker環境にてPHPのデバッグができる様なので、試しにやってみた。

#使用ツール
|項目  |バージョン  |
|---|---|
|PC|Razer Brade Pro 2019|
|OS|Ubuntu 18.04 LTS |
|Docker  |19.03.5|
|Docker-Compose  |1.17.1 |
|PHP  |php:7.2.7-apache (連携されているコンテナ)|
|Xdebug  |2.7.0 |
|Visual Studio Code|1.41.1 |




```dockerfile:Dockerfile
FROM php:7.2.7-apache

RUN apt-get update && \
    docker-php-ext-install mysqli && \
    pecl install xdebug
```





```yml:docker-compose.yml
version: '3'

services:
  php:
    build: ./php
    ports:
      - '80:80'
    volumes:
      - ./php/html:/var/www/html
      - ./php/conf/php.ini:/usr/local/etc/php/php.ini
      - ./php/log/xdebug:/var/log/xdebug
```



```ini:php.ini
[Date]
date.timezone = "Asia/Tokyo"

[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

[xdebug]
; xdebugのインストール先を指定(Dockerコンテナ内)
zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20170718/xdebug.so
xdebug.remote_enable=1
xdebug.remote_autostart=1
; デバッグで使用するポートを指定(デフォルト値)
xdebug.remote_port=9222
; Dockerコンテナ内部から見たホストを指定
xdebug.remote_host=host.docker.internal
; ログ出力先
xdebug.remote_log=/var/log/xdebug/xdebug.log
xdebug.remote_connect_back=1
```







```json:launch.json
{
  "version": "0.1.0",
  "configurations": [
    {
      "name": "Listen for XDebug",
      "type": "php",
      "request": "launch",
      "port": 9222,
      "pathMappings": {
        // Dockerコンテナのdocument root : 開発環境のdocument root
        "/var/www/html":"${workspaceFolder}/php/html" 
      }
    }
  ]
}
```







```php:index.php
<?php

echo 'Hello World<br>';
```

#はまった点
・Dockerの立ち上げから、HTTPへのアクセスまではすんなりいったが、ブレイクポイントで止まらなかった。結果、launch.jsonのポートの設定を自分の環境で使用しているものに変更したら動きました。
・xdebugのインストール先を指定(Dockerコンテナ内)をphp.iniファイルに記入するのが抜けていたため動かなかった。※環境によってパスが変わるようであり、Dockerを立ち上げたときにコマンド上でインストールされたパスが確認できる。


#参考にさせて頂いた記事
・Docker-composeのコマンド
https://qiita.com/okyk/items/a374ddb3f853d1688820
・構築方法
https://qiita.com/MasanoriIwakura/items/a310c75e6c5b347adf37
neovim + YouCompleteMe + neoterm

VS codeに以降する案もありましたが、やはりterminal + tmux + vim + neotermの便利さはまだ再現できない（多分）ので、引き続きvimをつかいます。

だいぶ混乱したので2020年2月時点でのMacでの環境構築についてまとめた。
neovim + YouCompleteMe + neoterm
がよさそう。YouCompleteMeがneovim対応したのがつよい

### neovim
brewでnvimを入れれば良い。pythonを利用するためにpynvimもインストールする。

```
brew install neovim
pip3 install pynvim
```

### Bundle

```
mkdir -p ~/.vim/bundle && cd ~/.vim/bundle
git clone https://github.com/VundleVim/Vundle.vim.git
```

### YouCompleteMe

1. YouCompleteMeをclone
2. 依存をダウンロード
3. install(この時python3のバイナリを指定すること)

```
cd ~/.vim/bundle
git clone https://github.com/ycm-core/YouCompleteMe.git
cd YouCompleteMe
git submodule update --init --recursive
/oreno/python3 install.py
```

なお、neovimでyoucompletemeを動作させるためには下記に従う必要がある
https://github.com/neovim/neovim/tree/master/contrib/YouCompleteMe

###  neoterm

```
cd ~/.vim/bundle
git clone https://github.com/kassio/neoterm.git
```

### ~/.config/nvim/init.vim

```
set rtp+=~/.vim/bundle/Vundle.vim
set rtp+=~/.vim/bundle/neoterm
filetype plugin on

call vundle#begin()
   Plugin 'VundleVim/Vundle.vim'
   Plugin 'file:///Users/oreno/.vim/bundle/YouCompleteMe'
   Plugin 'file:///Users/oreno/.vim/bundle/neoterm'
call vundle#end()

let g:ycm_auto_triger=1
let g:ycm_min_num_of_chars_for_completion=1
let g:ycm_autoclose_preview_window_after_insertion=1

let g:neoterm_autoscroll=1
let g:neoterm_default_mod='vertical'
tnoremap <silent> <ESC> <C-\><C-n><C-w>
nnoremap <silent> <C-e> V:TREPLSendLine<cr>j^
vnoremap <silent> <C-e> V:TREPLSendSelection<cr>'>j^
```

とりあえずanacondaとの共存は無理っぽい
iMAC 比較

iMACの調子がよくない。

再購入を検討している。

比較する事項を整理してみる。*印は27インチのみの仕様。

https://www.apple.com/jp/shop/buy-mac/imac
https://www.apple.com/jp/shop/buy-mac/imac/27インチ


mac miniに画面(display)、音響装置(speaker)、撮像装置(camera)を装着することを検討する。
ただし、最終利用者の手間を考えるとiMACの方に利便性を感じる。
mac miniにiMAC相当になる一揃えの道具類を検討する。

>mac miniはこの行のような表示にする。

# CPU

2.3GHzデュアルコアプロセッサ（Turbo Boost使用時最大3.6GHz） 
第7世代の2.3GHzデュアルコアIntel Core i5プロセッサ

3.6GHzクアッドコアプロセッサ 
3.6GHzクアッドコア第8世代Intel Core i3プロセッサ

3.0GHz 6コアプロセッサ（Turbo Boost使用時最大4.1GHz） 
3.0GHz 6コア第8世代Intel Core i5プロセッサ

3.1GHz 6コアプロセッサ（Turbo Boost使用時最大4.3GHz） *
3.1GHz 6コア第8世代Intel Core i5プロセッサ

3.7GHz 6コアプロセッサ（Turbo Boost使用時最大4.6GHz） *
3.7GHz 6コア第9世代Intel Core i5プロセッサ

>3.6GHzクアッドコアIntel Core i3 6MB共有L3キャッシュ
3.0GHz 6コアIntel Core i5 Turbo Boost使用時最大4.1GHz9MB共有L3キャッシュ

キャッシュの量の表示、インテルの世代の有無はなぜか不明。

## clock
大きい方が速い。

## core
コア数が大きいほど並列計算できる可能性がある。

## Turbo Boost

## 世代
インテルの開発の段階

## i3, i5, i7
数が大きいほど機能が上？

##まとめ
評価数値を出すのに、clockとcoreは乗算してもよい。他は、加算がいいのか乗算がいいのか迷う。知見を募集。

# memory

8GB 2,133MHzメモリ（オプションで16GBに変更可能）

8GB 2,400MHz DDR4メモリ（オプションで32GBに変更可能）

8GB 2,666MHz DDR4メモリ（オプションで最大32GBに変更可能）

8GB 2,666MHz DDR4メモリ（オプションで最大64GBに変更可能）*

> 8GB 2,666MHz DDR4 SO-DIMMメモリ(変更可能：16GB、32GB、64GB)

## 容量
大きい方が処理は速いか、システムが落ちにくい。発熱、消費電力は大きいと負担がかかる。処理が速い分、費用がかかってもいいかどうかという判断をする。

### 拡張性
開発で使う、画像処理などメモリを大量に使う処理が主な場合には、拡張性があった方がいいかもしれない。
特定の道具、応用では、大きなメモリが必要な場合がある。

## clock
速い方が速い

## DDR
数が大きい方が高機能の可能性がある。一つ表示がないのは意味不明。

## まとめ

容量とclockは乗算。DDRはどういう値を乗算するとよいかわかっていない。
実測が一番かも。

# 補助記録装置

1TBハードドライブ¹

1TB Fusion Drive¹

2TB Fusion Drive¹*

>128GB PCIeベースSSD
256GB PCIeベースSSD

## Fusion Drive

# グラフィックス

Intel Iris Plus Graphics 640

Radeon Pro 555X（2GB GDDR5メモリ搭載）

Radeon Pro 560X（4GB GDDR5メモリ搭載）

Radeon Pro 570X（4GB GDDR5メモリ搭載）*

Radeon Pro 575X（4GB GDDR5メモリ搭載）*

Radeon Pro 580X（8GB GDDR5メモリ搭載）*

> Intel UHD Graphics 630

## メモリ容量

## GDDR

## 機種

機種による能力、処理速度は実測を参照

# 表示

1,920 x 1,080ピクセル解像度のsRGBディスプレイ

4,096 x 2,304ピクセル解像度のRetina 4K P3ディスプレイ

5,120 x 2,880ピクセル解像度のRetina 5K P3ディスプレイ*

## 解像度
大きい方が綺麗に見える可能性がある。

## 4K対応


# 入出力
Thunderbolt 3ポート x 2


EthernetThunderbolt 3
（USB-C）HDMI 2.0USB 33.5mm

>4つのThunderbolt 3（USB-C

# 文書履歴(document history)
ver. 0.01 初稿 20200226
ver. 0.04 URL追記　20230302

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
Google Cloud Storage(GCS)のオブジェクトの公開URLが302でリダイレクトされる

## リンクURLではなくアクセスからコピーする

<img width="764" alt="スクリーンショット 2020-02-06 10.23.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532546/b9a40f67-986e-6093-4384-5486907a9b29.png">

`https://storage.cloud.google.com/(バケット名)`

ではなく

`https://storage.googleapis.com/(バケット名)`

となります。

`storage.cloud.google.com`でも一応アクセスできますが、IEで画像をXHRで取得したときにリダイレクトでエラーになり(Chromeは問題なし)、原因を調査したところリダイレクトがかかっていたため、変更しました。
ボタンタップ時の領域内タップ位置判定の愚考


## ボタンタップ時にどこをタップしたか知りたかった
iOSアプリ開発の駆け出しエンジニアが、
ボタンタップイベント発生時に、ボタン内のどこをタップしたかを取得する実装を愚考した。
今回は、ボタン内を三分割した場合の位置を`enum`で持つことにした。


## 実際に作成したenum
縦横方向それぞれのenumを持つenumを定義し、
initで位置を判定、失敗時は`none`。

``` swift:
/// ボタン内のタップ位置取得
public enum ButtonPointer {
    /// 縦方向
    enum Vertical {
        case none
        case top
        case middle
        case bottom
        
        init(of button: UIButton, for event: UIEvent) {
            if let location = event.touches(for: button)?.first?.location(in: button){
                if location.y < button.frame.size.height / 3 {
                    self = .top
                } else if location.y < button.frame.size.height / 3 * 2 {
                    self = .middle
                } else {
                    self = .bottom
                }
            } else {
                self = .none
            }
        }
    }
    
    /// 横方向
    enum Horizontal {
        case none
        case left
        case center
        case right
        
        init(of button: UIButton, for event: UIEvent) {
            if let location = event.touches(for: button)?.first?.location(in: button){
                if location.x < button.frame.size.width / 3 {
                    self = .left
                } else if location.x < button.frame.size.width / 3 * 2 {
                    self = .center
                } else {
                    self = .right
                }
            } else {
                self = .none
            }
        }
    }
}
```

## usage
```swift:
// addTargetでボタンにイベントを追加した場合
@objc func didTapButton(_ sender: UIButton, event: UIEvent) {
    print(ButtonPointer.Vertical(of: sender, for: event))
    // → top
}

// ボタンのイベントをIBActionで紐づけた場合
@IBAction func didTapButton(_ sender: Any, forEvent event: UIEvent) {
    guard let sender = sender as? UIButton else { return }
    print(ButtonPointer.Vertical(of: sender, for: event))
    // → left
}
```

## おわりに
駆け出しすぎて実装に不安が残るが、
とりあえずアウトプットすることが大事と信じることにする。
【Rails6】DEPRECATION WARNING: Uniqueness validator will no longer enforce case sensitive comparison in Rails 6.1.

# TL;DR
`uniqueness` で grep して、ひたすら `case_sensitive: true` を付けていきましょう。
※既存の動作を維持する場合はこれでOK。ただ、この機会に見直すことを推奨します。

# 環境
- Ruby: 2.6.3
- Rails: 5.2.4.1 => 6.0.2.1 へアップデート

# なんだこのWarning :thinking: 

```
DEPRECATION WARNING: Uniqueness validator will no longer enforce case sensitive comparison in Rails 6.1. To continue case sensitive comparison on the :destination_type attribute in PublicReference model, pass `case_sensitive: true` option explicitly to the uniqueness validator.
```

Uniqueness validator を使っているところでこんなWarningが出ました。

- Rails 6.0 までは `case_sensitive: true` （大文字小文字を区別する）がデフォルト
- Rails 6.1 からは `case_sensitive: false` （大文字小文字を区別しない）がデフォルト
- 今までのデフォルト通り、大文字小文字を区別したチェックにしたければ、 `case_sensitive: true` を明示的に指定してね

と言われています。

今まで通り、大文字小文字を区別したいケースが大半かなと思いますので、 `case_sensitive: true` を指定しておきましょう。

```ruby:修正例
class Post < ApplicationRecord
-  validates :uuid, uniqueness: true
+  validates :uuid, uniqueness: { case_sensitive: true }
end
```

これでWarningを解決できました。

# 参考
[Rails 6.0でDeprecatedになるActive Recordの振る舞い3つ - かみぽわーる](https://blog.kamipo.net/entry/2019/05/15/152652)
YOLOについて何も知らない人が読むやつ［物体検出］

#YOLOを体感できる動画を紹介するね。

松尾先生の講演でよく使われるYOLO v2の動画は下記になります。


[yolov2の動画](https://www.youtube.com/watch?v=VOC3huqHrss&feature=emb_title)


**YOLO(You Only Look Once)とは動画の物体検出手法になります。**
実はYOLOv2はもう古い！YOLOv3とかもっといい手法がどんどん出てますよ！

#【豆知識】
この技術は、

>**“Humans glance at an image and instantly know what objects are in the image, where they are, and how they interact. "
　「人間は画像を見ると、画像内のオブジェクト、その場所、およびそれらの相互作用を即座に把握します．」**

というコンセプトで提案された論文で、YOLOという名前も「You Only Look Once」”見るのは一度きり”という頭文字をとっています。
ちなみに、"You only live once”「人生一度きり」の頭文字をとったスラングをもじってこの名前を付けたと言われています。

#【概要】
映像の中に何が移っているのか読み取ることが出来るよ！
映像の中で四角く囲まれているところに、「cat」とか「person」とか、「phone」とか表示されてるよね。
これ、認識してるんです、すごくない？
しかも47fps、1秒間に47フレーム検知できるんだよ。やばいね！目押しできるね！

#【おすすめ】
YOLOのすごさを体感したい人は下記の動画も見てみてください。一番わかりやすいTED動画です。

[yoloを紹介するTEDの動画（英語）](https://www.ted.com/talks/joseph_redmon_how_computers_learn_to_recognize_objects_instantly?fbclid=IwAR2HCYVuuDAusOm96OdYFKCxN3beucObxD8c8sPSCPn1TgSj-ynETrPyJKM#t-168360)