OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu に Spacemacs をインストールする

普段は Emacs を利用しているが、[spacemacsについて ~~spacemacsが最強で最高で神エディタであると思い始めた件~~](https://qiita.com/nobkz/items/994c6b3e6f42a0e33fef)を読んで Spacemacs に惹かれたので、インストールして使い始めてみようと思った。

インストールするときにハマった部分もあるので、インストール手順としてまとめてみた。
Spacemacs の GitHub のドキュメントの[一部](https://github.com/syl20bnr/spacemacs#install)がベースになっている。

## インストール環境

* Ubuntu 19.04
* Emacs 26.1

## インストール手順

### .emacs.d のバックアップを取得する

```bash
cd ~
mv .emacs.d .emacs.d.bak
mv .emacs .emacs.bak
```

###  Spacemacs のリポジトリをクローンする

```bash
git clone https://github.com/syl20bnr/spacemacs ~/.emacs.d
```

更新メカニズムが破壊されてしまうので、master ブランチには変更を加えてはならない。
変更を加えたいのであれば、develop ブランチをフォークして行うこと。

### (任意) Source Code Pro フォントをインストールする

```bash
mkdir <download>  # フォントをダウンロードしたいディレクトリに置き換える
cd <download>
wget https://github.com/adobe-fonts/source-code-pro/archive/2.010R-ro/1.030R-it.zip
unzip 1.030R-it.zip
mkdir -p ~/.fonts
cp source-code-pro-2.010R-ro-1.030R-it/OTF/*.otf ~/.fonts/
fc-cache -f -v
```

### Emacs を起動する

Spacemacs は自動的に必要なパッケージをインストールする。
もしパッケージのダウンロード中にエラーが発生したら、その時は emacs --insecure で Emacs を起動する、もしくは、.spacemacs ファイルの86行目の`dotspacemacs-elpa-https`を`t`から`nil`に変更してから Emacs を起動する。

なお、エラーが発生した場合は、パッケージが破損しているかもしれないので、`.emacs.d/elpa`ディレクトリをクリアして、パッケージが再インストールされるようにする。

私の環境では、公開鍵がないということでパッケージのインストールに失敗し、Spacemacs を正常に起動することができなかった([issue-#8984](https://github.com/syl20bnr/spacemacs/issues/8984#issuecomment-534482249))。
そのような場合は、`gpg --homedir ~/.emacs.d/elpa/gnupg --receive-keys 066DAFCB81E42C40` を実行する。

```bash
mkdir -p ~/.emacs.d/elpa/gnupg
gpg --homedir ~/.emacs.d/elpa/gnupg --receive-keys 066DAFCB81E42C40
emacs
```

### Emacs を再起動してインストールを完了する

Emacs を起動しパッケージのダウンロードが完了した時点で既に Spacemacs になっている気がするが。。。
特に大きな手間でもないので、公式のインストール手順に従っておく。

## 参考

* [syl20bnr/spacemacs](https://github.com/syl20bnr/spacemacs)
* [ubuntuにsourcecodeProを入れる](https://kurenaif.hatenablog.com/entry/2016/10/28/193238)
* [File error: Cannot open load file, No such file or directory, bind-map #8984](https://github.com/syl20bnr/spacemacs/issues/8984)
* [Macへのspacemacsインストールメモ](https://qiita.com/crossroad0201/items/ca419e4dc2646667e669)
Mac で圧縮ファイル を解凍する[gzip -d,unzip,tar xzfv,tar xjfv]

いつもgzip,unzip などがわからなくてググるのでメモ
https://dekirukigasuru.com/blog/2017/05/27/archiver/ を参考

## .gzの解凍
### unzip を使う

```bash:gzファイルを解凍
gzip -d ~/path/to/~~.gz 
```

gzipに`-d`オプションを付けます。


## .tar.gzの解凍
### tar xzfv

```bash:tar.gzの解凍
tar xzfv ~~.tar.gz
```

## tar.bz2の解凍
### tar xjfv

```bash:tar xzfv
tar xzfv ~~.tar.bz2
```

コマンドの意味もあとで記載したい
bonding のテスト

#bonding のテスト
以下にあるように、RHEL で bonding のテスト (正常に failover するかとかのテスト) をする時は ifdown とかのコマンドは使わず、LAN ケーブルの抜線や NW 装置側の操作でテストしましょうねというだけの話。

How do I properly test bonding failover?
https://access.redhat.com/solutions/656113

そもそも、bonding 自体が物理インターフェースの問題に備える機構なので。

#おまけ
bonding の設定手順は以下を参考にすること。

How do I configure a bonding device on Red Hat Enterprise Linux (RHEL)?
https://access.redhat.com/articles/172483

障害検知 (ARP 監視 or MII 監視) は以下を参考にすること。
While using bonding, what are the link failure detection methods available in RHEL ?
https://access.redhat.com/solutions/281063

以下は ARP 監視のパラメータ (arp_validate) は以下を参考にすること。
What does the arp_validate bonding module option do and do I need to set it?
https://access.redhat.com/solutions/30732

RHEL7 のネットワークガイドは以下。
第7章 ネットワークボンディングの設定
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/networking_guide/ch-configure_network_bonding
DockerイメージにAlpineLinuxを使うとセキュリティも向上する

先日リリースされたECRのセキュリティスキャンをかけたところ、
Alpineから作ったイメージは脆弱性なしで、公式のamazonlinuxから作ったイメージは多くの脆弱性が検出されました。
[Image Scanning for Amazon ECR](https://aws.amazon.com/jp/about-aws/whats-new/2019/10/announcing-image-scanning-for-amazon-ecr/)

下図において、上がAplineから作ったイメージで、下がamazonlinuxから作ったイメージです。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285150/b072248b-6709-b6ab-9272-9cd82588c260.png)


Alpineはサイズの小ささ自体もメリットですが、その小ささ故に機能も最小限に絞られているためセキュリティ的にもメリットが大きいと言えます。
ABC135のメモ

クソ記事でもいいから取り合えずたくさん書いて後から修正しようキャンペーンの第２弾なので質は。。です。
以前書いて、下書きに残っていたものをそのまま投稿しています。（なので古いです）

# 結果
a,b,cの3問正解に終わった。
d,eを考えたが、eは方針が微妙にたったが、詰めれず。
dは全く方針が思いつかなかった。（DPと言われたら確かにDPで解けそうだったので、これは発想力よりは自分の演習不足）
また、b,cの方針はすぐにたったものの実装で苦労していたので、（bは（Ｙｅs,No）の大文字、小文字に気つかなかったというだけなのでしょうもない間違えだったが早く気づけるようになりたい）そこも改善点。

# 解説をみながら復習
## D: Digits Parade
 問題：?と数字のみから構成される文字列を受け取り、?を任意の数字0〜9に置換するときに、13で割った余りが5になる組み合わせの数をこたえる。
 
 ナイーブに考えると、$10^{(?の数)}$ のパターンがあるので、１つ１つ検証すると間に合わない。
　そこから、まったくアイデアが浮かばなかった。
　
　解説:
>dp[i][j] := 先頭 i 文字として考えられるもののうち，13 で割ったあまりが j であるものの数
 このとき i の昇順に dp テーブルを見ると，i − 1 文字目までを 13 で割ったあまり (dp[i − 1][j] の j) と
s[i] としてあり得る数字を全て試すことで dp[i][0] ∼ dp[i][12] の値がわかります

ということです。要するに先頭から13*|s|のサイズのdpの表を埋めていきます。
 

　確かに、余りは各桁ごとにを１３で割った余りの和であり、複雑な計算でない（前後の値などによって変化しない）ので、先頭からi文字目までの和をdp[i][j]とおけば、

```math
dp[i+1][k] = \sum_{j}^{0-12}{(dp[i][j]*10+s[i+1])mod13)}
```

で表現できる。
 ここで、頭がいいな、と思ったのは、僕は、dpと聞いて、s[i+1]$10^{(|s|-i)}$mod13
を足す処理を毎回しようとしたのですが、解説では先頭からi文字目までを数字にした時のあまりをi+1の時に１０倍することで、計算を簡単にしています。（わかりにくくてすみません。。）
vim でcopy and pastする[備忘録][vim]

dd -> p ぐらいしか使ってなかったが、１行単位ではなく、もっと細かくコピーしたい
そのためにvimでの色々な削除の仕方を調べたのでメモ。

参考　https://qiita.com/FBH9999/items/a8ec99bed08592a9d69a

## 削除
x 一文字消す
X カーソルの左一文字の消去
dw カーソル位置から１単語を消去
de カーソル位置の単語の最後まで削除 便利！
diw カーソル位置にある単語を１単語を消去
df<文字> カーソル位置から<文字>の位置まで削除　便利！
d^ カーソルから左を削除
d$ カーソルから右を削除
rbenv で make test を追加する方法

Ruby 1.8.7-p385 を GCC8.2.1(CentOS8標準)でコンパイルするとmake testが通らなかった。

## make testが失敗する

![スクリーンショット_2019-10-30_07-43-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/6d8bb05a-d441-7517-5821-3b8d949ff03b.png)


![スクリーンショット_2019-10-30_07-41-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/e074f6ea-067b-57f0-7fca-2d621922ebbc.png)

## 動作確認

### make test 成功

CentOS 7 の compat-gcc-44 でビルドしたもの 

```ruby
b = 10**80
```

```ruby:正常
p b
100000000000000000000000000000000000000000000000000000000000000000000000000000000
```

### make test 失敗

* CentOS 8 の GCC8.2.1 (CentOS8標準)

```ruby
b = 10**80
```

```ruby:0になる・・・
p b
0
```

```ruby:0除算エラー
a = b * 9 * 7
p a.modulo(b)
-:4:in `modulo': divided by 0 (ZeroDivisionError)
        from -:4
```

### make test 失敗 その2

* GCC 6.5.0 でビルドした場合、core dump吐いて終了

```sh
# ./ruby -v
ruby 1.8.7 (2013-06-27 patchlevel 374) [x86_64-linux]
# ./ruby
b = 10**80
p b
Floating point exception (core dumped)
```


## rbenvメモ

* rbenv でインストールすると `make test` がされないので注意。

```sh
# -k を付けて rbenv install を実行すると ソースが残る。
/root/.rbenv/bin/rbenv install 1.8.7-p375 -k

cd /root/.rbenv/sources/1.8.7-p375/ruby-1.8.7-p375/

make test
```

rbenvについて

```sh
cd /root/.rbenv/plugins/ruby-build/bin/

# インストールスクリプト
rbenv-install

# rbenv-install が ruby-buildを呼ぶ。ここで make される
ruby-build
```

ここで make が行われる

![スクリーンショット_2019-10-30_08-09-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/d7453d0c-c223-7f0f-75f3-12eb5416c241.png)

## 修正

```diff:ruby-build
@@ -592,6 +592,8 @@
 
   { "$MAKE" $MAKE_OPTS ${!PACKAGE_MAKE_OPTS} "${!PACKAGE_MAKE_OPTS_ARRAY}"
   } >&4 2>&1
+
+  "$MAKE" test >&4 2>&1
 }
 
 build_package_standard_install() {
```
【Unity】【環境】UnityプロジェクトでGit管理すべきファイル一覧

# 管理不要ファイルについて
・各フォルダの役割はまだ調査していないが、
いったんはそういうものかと割り切っておく。(調べると泥沼化するため。)
・見たところほとんどのディレクトリが管理不要のようだ。

# .metaファイルとは　(おまけ)
・.metaファイルはAssetと必ず1対1対応するファイルである。
・.metaファイルは以下のような情報を保持する。
　- インスペクタビュの設定情報(画像ならPixel Per Unitの値など)
　- GUID (すべてのAssetを一意に識別する番号)

# .gitignoreの記法
``` csharp
  // 拡張子での除外
  *.sln
  // フォルダと配下のファイルの除外
  FolderName/
```



# 各ファイルの説明
## 不要なファイル
### vs フォルダ
・各プロジェクトごとに以下の一式のファイルがある。
　・v15/Server/sqlite3/db.lock
　・v15/erver/sqlite3/storage.ide
　・v15/Server/sqlite3/storage.ide-shm
　・v15/Server/sqlite3/storage.ide-wal
　・.suo (Solution User Options)
・.vsは自動生成ファイルなのでソース管理に含める必要はないという記載を確認。
#### sqlite3
・sqliteはリレーショナルデータベースシステムのこと
・このファイルの役割は調べたがよくわからなかった。
#### .suo
・自動生成ファイル
・VisualStudioに関するユーザ設定ファイル
> ソリューション ユーザー オプション (.suo) ファイルには、ユーザーごとにソリューションのオプションが含まれています。 このファイルは、ソース コード管理にないチェックする必要があります。


# 参考サイト
[Unity を Gitでバージョン管理する](https://qiita.com/hkomo746/items/432ed5b3a3395a804f5f)

[Unityの.metaファイルとは何なのか？](https://qiita.com/4_mio_11/items/91ebcdd30398af607373)

[Unityのmetaファイルについての勉強会を行いました](https://developer.aiming-inc.com/study/unity-meta-study/)

・vsフォルダ
[ソリューション ユーザー オプション (.Suo) ファイル](https://docs.microsoft.com/ja-jp/visualstudio/extensibility/internals/solution-user-options-dot-suo-file?view=vs-2015&redirectedfrom=MSDN)
【Unity】【画像】Sprite, Texture, Texture2D, Imageの違い


# 各クラスの用途まとめ
公式リファレンスをざっと読んでまとめただけなので類推多めです。
![A Star-Based LAN (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/91f992d1-5dc5-1b62-5970-814fb0bb7b65.png)

### Sprite
　画像データ + 画像のどの領域を表示対象とするするかを保持する。(分割ロードの際に利用すると思われる。)

### Texture2D
　画像の情報を保持する。
　おそらく2Dゲーム専用のクラス

### RenderTexture
  画像の情報を保持する。
　おそらく3Dゲーム専用のクラス

### Texture
　2D,3D共通の画像の情報を保持する。
  
### Image
　名前空間「UnityEngine.UI」に含まれるため、UI表示専用の画像表示に利用すると推測。

# Spriteのパックについて
### パックとアトラス
　パック : 複数の画像を一つにまとめること。
　アトラス : 複数の画像が1枚にまとめられた画像のこと
　パックする方法として、「SpritePacker」と「SpriteAtlas」がある。
　パック化に伴うスクリプトの修正は不要。(エディタ上でのみ完結する。)
### SpritePacker
　手順は[参考サイト](https://www.cg-method.com/entry/uGUI-Sprite-Packer/#SpritePacker)参照
　メリット : Unityの処理が軽減する。⇒ 処理の指標(SetPass Calls)の値が減る。
　デメリット : パック対象のファイルはResourcesフォルダ外に配置しなければならない。⇒フォルダ体系の煩雑化。
### SpriteAtlas　
　手順は[参考サイト](http://kan-kikuchi.hatenablog.com/entry/SpriteAtlas)を参照。
  メリット : SpritePackerのデメリット解消。(Resourcesは以下にファイルを配置できる。)

#参考サイト
[Sprite](https://docs.unity3d.com/ja/2019.1/ScriptReference/Sprite.html)
[Texture]
(https://docs.unity3d.com/ja/2019.1/ScriptReference/Texture.html)
[Image]
(https://docs.unity3d.com/ja/2018.1/ScriptReference/Experimental.UIElements.Image.html)
[無料でUMLを作成できるブラウザツール](https://online.visual-paradigm.com/drive/#diagramlist:proj=0&new=ClassDiagram)
[【Unity】スプライトパッカー（SpritePacker）の作成方法](https://www.cg-method.com/entry/uGUI-Sprite-Packer/#SpritePacker)
[Spriteをパックする新しい仕組み、SpriteAtlasを使ってみた【Unity】【SpriteAtlas】](http://kan-kikuchi.hatenablog.com/entry/SpriteAtlas)
QGISプラグインの設定情報を保存

## はじめに
QGISでプラグインの設定情報を保持したい場合があります。
そして、プロジェクトファイルごとに設定を変更したいことがありました。
公式ドキュメントを見て使い方の把握

## QGIS本体に情報を保存する場合
```python

setting = QSetting()
key = 'text'

# 書き込み
settings.setValue(key, 'hello')
# 読み込み
value = settings.value(key, defaultValue='hoge')
print(value)
```

## QGISプロジェクトに情報を保存する場合
```python

# -*- coding: utf-8 -*-
proj = QgsProject.instance()

# 書き込み
proj.writeEntry('testplugin', 'text', 'hello world')
proj.writeEntry('testplugin', 'bool', True)
proj.writeEntry('testplugin', 'num', 127)
proj.writeEntry('testplugin', 'double', 127.1)
# listはテキストのみ
proj.writeEntry('testplugin', 'list', ['a',  'b'])

# 読み込み
# 返り値は、格納されている値とNullかどうか
t, _ = proj.readEntry('testplugin', 'text')
b, _ = proj.readBoolEntry('testplugin', 'bool')
n, _ = proj.readNumEntry('testplugin', 'num')
d, _ = proj.readDoubleEntry('testplugin', 'double')
l, _ = proj.readListEntry('testplugin', 'list')

print(t, b, n, d, l)
# 'hello world', True, 127, 127.0, ['a', 'b']
```

## Layerに情報を保存する場合
Layerに保存した場合もプロジェクトに情報が保存されます

```python

layer = iface.activeLayer()

# 書き込み
layer.setCustomProperty('text', 'hello')
# 読み込み
text = layer.customProperty('text' ,defaultValue='hoge')
print(text)
```

## 参考
[QGIS API Documentation: QgsProject](https://qgis.org/api/classQgsProject.html)
[PyQGIS Cookbook 3.4](https://docs.qgis.org/3.4/en/docs/pyqgis_developer_cookbook/settings.html)
[PyQGIS Cookbook 2.18](https://docs.qgis.org/2.18/ja/docs/pyqgis_developer_cookbook/settings.html)
emmetで０からの連番をつける方法

# emmetで０からの連番をつける方法、、どうやるの？
分からなかったので調べてみました。

例えば、htmlで

```
<ul>
    <li>item 1</li>
    <li>item 2</li>
    <li>item 3</li>
    <li>item 4</li>
</ul>
```
をemmetで記述するには、
`ul>li.item$*４`ですよね。

## 連番を好きな数字から始めるには
0からなら`ul>li.item$@0*４`で

```
<ul>
    <li>item 0</li>
    <li>item 1</li>
    <li>item 2</li>
    <li>item 3</li>
</ul>
```

@の後を始めたい数字にすればいいのですね。

学び！
はじめまして

##こんにちは！

TreeFrogCodeです。
Python３とlinux(linuxMint)を使っています。
Qiitaに投稿するのが初めてなので、(Markdownもあまりつかったことがないです。)
まだまだわからないことだらけですが暖かく見守っていただけると幸いです。
【Unity】【フォント】日本語表示されない問題

#問題点
  WebGLでフォントの一部(おそらく日本語)が表示されないため、原因調査

Platform : PC
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/030e1365-ebcc-42a5-789d-bbab9a1040cd.png" width=50%/>

Platform : WebGL(対応前)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/d12db4e2-6797-995c-5d5d-54ff24f74672.png" width=50%/>

#原因
　デフォルトのFontは「Arial」であり、これは日本語に対応していないため。

#対応
- フォントファイルをダウンロードする。<br>
  フォントファイルには下記2種類がある。　<br>
　 TrueType Fonts( .ttf　.dfont ) <br>
　 OpenType Fonts (.otf)
- プロジェクトビューにフォントファイルを追加する。
- インスペクタビューからUIのfont属性をArialから追加したものに変更する。

Platform : WebGL(対応後)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/17d75709-05a6-cc6c-65ad-d47f07e49006.png" width=50%/>

#参考サイト
  [Unityで日本語フォントを使う](http://unityleaning.blog.fc2.com/blog-entry-3.html)
Pycharmの設定メモ　自分用

とりあえず

# 設定
- [https://qiita.com/tetsu0831/items/46873120e64d819f26ec](https://qiita.com/tetsu0831/items/46873120e64d819f26ec)（日本語化）
- [https://akiyoko.hatenablog.jp/entry/2017/03/10/082912](https://akiyoko.hatenablog.jp/entry/2017/03/10/082912)
- [https://techinfo-ilsole.com/setup-pycharm/](https://techinfo-ilsole.com/setup-pycharm/)
- [https://www.youtube.com/watch?v=0Rh04vwYItQ](https://www.youtube.com/watch?v=0Rh04vwYItQ)（動画）
- [https://nagacya.com/pycharm/](https://nagacya.com/pycharm/)（使い方も）
何もわからなくても多分大丈夫！VRCHATer向けのUnityを使った超初心者向け3Dゲーム開発！_000

# 概要

この記事で伝えたいことはタイトルの通りです。冗長なタイトルもまま役に立つ！

この記事は長々と書かれていますが、全部前置きなので読み飛ばして一番下だけ読んでも、なんなら次の記事から読んでもいいです。

私自身がゲームバリバリ作れるぜ！ってワケではないのですが、まあ、自身に向けた備忘録と、ついでにUnityでの開発に興味がある人に向けてと、あと何よりこうやって書いておけばUnity開発つよつよの誰かからマサカリ（ようするに指摘）が飛んできて勉強になったりするかもしれない、という期待を込めて。

ちなみにVRCHATer向けとは書いていますが、別に関係なく初心者向けでもあるので、VRCHATやっていなくてこの記事にたどり着いた初心者の方がいたとしても、大丈夫です、多分。

あとこれはVRCHAT内で遊べるゲームを作るわけ**ではない**です。ワールドとか関係なしに、完全に現実世界で遊ぶやつですね。そこのところはよろしくお願いします。

むしろ誰かワールド制作の初心者向け記事まとめてくだしあ。



# Unityはプログラマだけのものではない

Unityに関して、どういったイメージを持っていますか？プログラマが使うツール？よくわからない？

この記事を読んでいる方がVRCHATを普段から利用している人であれば、9割5分の方はUnityを利用したことがあると思います。アバターをアップロードしたりとか。
そのとき例えばアバターに小物をつけるとして、W,E,Rキーを使って3Dシーン上で小物を動かしたり、あるいはInspector（デフォルトの配置だと右側？にズラーって数値とかいろいろ並んでるところ）のTransformの数値をいじったりして、小物の位置を調整したりとか、多分したことあると思います。

Unityの強みっていうのはこういうところで、プログラムを介さずに直感的に物を触れるということですね。
いちいちプログラムを開いて、コードの処理を見て、現状と完成形をイメージしながら数値を変えて……みたいなことをやらなくていい、ということです。
これはプログラマにも非プログラマにもうれしいことで、例えばアーティストが持ってきた3Dモデルやそのアニメーションを、本来ならプログラマがゲーム側に入れてテストしなければならないところ、アーティストが操作をある程度さえ覚えておけば自分でテストが出来るんですよね。

こうなると
プログラマ→自分の作業に集中できてうれしい！
アーティスト→いちいちプログラマに頼まなくても手元で作業できてうれしい！
と、なります。

なのでアーティストの人でも、むしろそういう人にこそUnityを利用して欲しいんですね！
みんなも、やろう！



# ゲームをつくるときに考える、考えてること

ここはUnityの操作とかには何の関係もなく、ゲームのデザインとかそういう話になると思うので~~マサカリ投げに来た~~技術的なところを早く読みたい、って方は読み飛ばして次の記事行っても全然問題ないです。


ゲームって何なんでしょうね。
多分人によっていろいろゲームに対する認識があると思いますが……
私は**何かしらの競争や試行を経て成功や失敗が存在するもの**だと考えています。
例えばかくれんぼは、『どこかにかくれる』という試行の結果、『鬼に見つからない』あるいは『鬼に見つかってしまう』という成功と失敗がありますね。
こういう風に『何かをして何かが返ってくる』ならそれはもうゲームと呼んでも差し支えないと思っています。面白いかどうかはともかくとして。

### じゃあ『面白い』ってどうやって作るの？
ここで「知らねー！そんなもん個人個人で違うわ！」って言うのは簡単ですけど、個人からもっと主語を大きくしちゃいましょう。この際だし人類くらいまで。

で、話を戻して、人類に対して面白いって思わせる方法はいくつかあって、そのうちのひとつは、リスクとリターンを設定することですね。要するにギャンブルをさせるということ。
例えばDQのまじんぎりなんかは分かりやすいですかね？
当たりづらいけど、当たったら確実に会心の一撃が出てとーっても気持ちがいい！みたいなの。
人類、ワンチャンスがキマればだいたい気持ちよくなれますし、楽しくなれます。交代読みふいうちは気持ちいいし、それを読めたらもっと気持ちいい。
……でもこればっかりやってると運ゲーなんですよね。それはそれで楽しいですけども。

そこでもうひとつ面白くする方法、それはユーザーに**『あっ、なるほど！』**って思わせることです。これは謎解き系のゲームとかをプレイしたことがある、あるいはRPGとかをやっていて謎を解くシーンがあったなら、おそらく思ったことがあるはずです。
自分で考えて→試して→成功する。何かをやって報酬が出るとうれしい！もっとやりたくなる！
……分かりやすいですね。人類は動物なので報酬を絡めた本能にはまあだいたい勝てません。ユーザーを気持ちいいで殴ろう！

あとは『プレイしていて爽快』、を突き詰めるだけでも面白いゲームっていうのは出来たりしますね。相当な発想と努力が必要だと思いますけども。

この項目、いろいろ書きましたが、まだまだかけることは山ほどあります。けど書いてたら枠が足りないし記事の本質から外れるからこの辺りで。
もっと知りたいってなったらゲームデザインの勉強をするのもいいかもしれませんね。

……まあこの項目、ほとんど恩師の受け売りなんですけどね。



# で、結局何が重要なの？

ここまで書いておいてアレですけど、ゲーム（というか創作全般）なんて好きなように作ればいいと思います。

Unityやプログラムの勉強するためだけに作るもよし、自分の作った絵や3Dモデルを動かして宣伝したいから作るもよし、波の挙動とレンダリング死ぬほど頑張ったからそれを見せるためだけに作るなんてのもよし、もちろん面白いゲームを作るために作るもよし

みんな**やりたいことのためにやれ**ばいいと思います。それおそらく一番身につく勉強方法ですしね。


長くなりすぎたので今回の記事はこの辺で。次の記事からはちゃんと実際にUnity触りましょう。

次
https://qiita.com/VRCjonmyon34/items/d44302d4c84af44323cf
authorized_keysのオプションとForceCommand的なサンプルとSSH_ORIGINAL_COMMANDに空白が含まれてもいい感じに扱う

タイトル詰め込みすぎ。

SSH公開鍵を登録するときにしばしば`authorized_keys`を設定します。
最近知ったのですが結構色々オプションが指定できます。詳しくは[ドキュメント](https://man.openbsd.org/sshd#AUTHORIZED_KEYS_FILE_FORMAT)をお読みください。 

今回は**特定の公開鍵**でログインしたときに実行するコマンドを指定するオプションを紹介します。

例えば、サーバの再起動だけ行えるようにしておいて、ある運用者にその秘密鍵を共有することで、再起動以外の余計な操作をできないようにすることができ、気持ちセキュアに運用を組めます。


### 例

たとえばログインしたらlsを実行して終了するようにしてみます。
ただ、lsだけではかわいそうなので、引数を指定できるようにします。

あらかじめ秘密鍵と公開鍵を用意しておき、リモートのauthorized_keysに公開鍵を以下のように書きます。

``` ~/.ssh/authorized_keys
command="ls $SSH_ORIGINAL_COMMAND" ssh-rsa AAAAB3...
```

SSH_ORIGINAL_COMMANDはsshコマンドの引数の情報が入った環境変数です。

試してみましょう。
あくまでsshコマンドなので、`--`を入れないと、`-l`がsshのオプションとして処理されてしまいます。

```
ssh USER@HOST -- -l /tmp
```

ここまでは簡単ですね。

（ちなみに、`sshd_config`の`ForceCommand`が設定されていればそちらが優先されます。）


### 引数の扱いが難しい問題

引数を処理してましたが、上記のとおり、`$@`ではなく、環境変数 `SSH_ORIGINAL_COMMAND`を使う必要があります。これは普通の環境変数なので文字列です。

なので、空白の扱いに困ることになります。

例えば以下の場合、引数は2つとして処理してほしいものですが、うまくいきません。

```
$ ssh USER@HOST a "b c"
ls: cannot access a: No such file or directory
ls: cannot access b: No such file or directory
ls: cannot access c: No such file or directory
```

というわけで、今回はこれをどうにかします。（本題）

authorized_keysは以下のようにします。ログイン時のシェルがbashならこんな感じにかけます。

``` ~/.ssh/authorized_keys
command="read -a ssh_args <<< \"$SSH_ORIGINAL_COMMAND\" && ls \"${ssh_args[@]}\"" ssh-rsa AAAAB3...
```

使うときはこうします。

```
$ ssh USER@HOST "$(printf "%q " a "b c")"
ls: cannot access a: No such file or directory
ls: cannot access b c: No such file or directory
```

`printf "%q "` でいい感じにエスケープがかかるので、それをリモート側のbashの`read -a aname` 入力として使い、いい感じに処理できます。

### おまけ：醜さ軽減

`authorized_keys`がエスケープだらけで醜い場合はスクリプト化するとよいでしょう。

``` ~/.ssh/authorized_keys
command="/path/to/script.sh" ssh-rsa AAAAB3...
```

``` /path/to/script.sh
#!/bin/bash
read -a ssh_args <<< "$SSH_ORIGINAL_COMMAND"
ls "${ssh_args[@]}"
```

また、実行側のsshコマンドもつらいですね。
ホスト決め打ち、sshのオプションとSSH_ORIGINAL_COMMANDを厳密に区別しなくて良いのであれば、functionなりシェルスクリプトなりにしておくと良いでしょう。

``` bash
function ssh_1(){
  ssh USER@HOST -- "$(printf "%q " "$@")"
}
```

```
$ ssh_1 a "b c"
ls: cannot access a: No such file or directory
ls: cannot access b c: No such file or directory
```
AtCoder ABC 144 E Gluttony

#　AtCoder YouTubeの言語化
https://www.youtube.com/watch?v=JYLI4mZH-p8&t=3074s
#　問題

https://atcoder.jp/contests/abc144/tasks/abc144_e

# 考え方
食べ物F 消化コストF
前処理　消化コストを昇順、食べ物を降順にソート
1 とりえる最長時間と最短時間の真ん中が最短時間とおく。（最短時間をl, 最長時間をrとして、仮の最短時間をCとする。）
2 次にその時間でそれぞれの人間が食事したとして、それぞれの人間の消化コストを求める。この時消化コストが0以下の時は0とする。 $$ a'_i =C/F_i 
 \quad or\quad0$$
3 そしてもともとの消化コストから仮の最短時間での消化コストを引いたものの和をとる。$$\sum a_i - (C/F_i) $$ 
4 その和がKを超えればCは最短時間として更新する(l = c)。超えなければ最長時間として更新する(r = c)。
5 1-3を繰り返し二分探索で最短時間を求める。
　(最短時間+1) = (最長時間)となった時の最長時間が修行回数がKを超えない範囲での最短時間となる。

#　回答
```c++
#include <bits/stdc++.h>
 
#define rep(i, n) for(int i = 0; i < (n); ++i)
using namespace std;
typedef long long ll;
int main(void){
    // Your code here!
    int n;
    ll k; 
    cin >> n >> k;
    vector<int> a(n);
    vector<int> f(n);
    rep(i, n) cin >> a[i];
    rep(i, n) cin >> f[i];
    sort(a.begin(), a.end());
    sort(f.rbegin(), f.rend());
    ll l = -1, r = 1e12;
    while(l+1 < r){
        ll c = (l+r) / 2;
        ll sum = 0;
        rep(i,n)sum += max(0ll, (a[i] - c/f[i]));
        if(sum <= k)r = c;
        else l = c;
    }
    cout << r << endl;
}
```
Macで標準のファンクションキーを使用する

1. Appleメニューから「システム環境設定」を選択する
2. 「システム環境設定」の「キーボード」を選択する
3. 「キーボード」の「F1、F2 などのすべてのキーを標準のファンクションキーとして使用」にチェックを入力する

- 上記の設定を行った場合、画面の明るさや音量調整をする際はfnキーとF1、F2などのキーを同時に押下する
Vueのcomputedとwatchの違いを実装例を用いて紹介

computedとwatchの使い方、２つの使い分けについて説明します。
公式サイトにも説明がありますが、実装例を用いて紹介します。

[算出プロパティとウォッチャ — Vue.js](https://jp.vuejs.org/v2/guide/computed.html)

## computedについて

- テンプレート式より宣言的にかける
- 算出プロパティはリアクティブな依存関係にもとづきキャッシュされる

## watchについて

- インスタンス上のデータの変更を監視し反応させることができる（computedと同じ）
- 非同期やコストの高い処理を実行したいときに最も便利です。

## computedの実装例

https://github.com/matometaru/vue-study/blob/a6c388d1715ab59fa6ed69ef89613741df807acd/src/components/Computed.vue

![スクリーンショット 2019-10-28 22.26.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510204/30a9d4e5-248b-643d-ac3f-3c936c54befd.png)

- computedのfilteredItemsがフィルターやソートしたあとの配列です。
- 参照されているthis.itemsとthis.queryが変化したときのみ、filteredItemsの値が変わります。
- computed内で使用している[sort](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)は破壊的なので`slice`をはさんでるのもポイントです。
- 複合条件をcomputedで書くとロジックが太りすぎるので、内部でメソッドを使用しています。


### おまけ

アイテムモデルクラスを作ることでさらにコンポーネント内のロジックを整理することが出来ます。コンポーネント間でロジックの重複がなくなり修正も1箇所で済みますね。
https://github.com/matometaru/vue-study/blob/32990e64dc1ceb2c710177291ecfe6a2b3d339a7/src/components/Computed.vue

## watchの実装例

https://github.com/matometaru/vue-study/blob/766ca89dd8035f137022658e1096fe4c6cc31113/src/components/Watch.vue

リアクティブなデータの変更が発生時に非同期処理を実行したい場合に使います。
非同期処理を実行しない場合はcomputedが向いています。

watchには`deep`や`immediate`のようなオプションもあります。
[watch — Vue.js](https://jp.vuejs.org/v2/api/#watch)

`immediate`オプションは初めて使ったのですが、mountedのように初期化処理に使えました。`immediate`は`mounted`より先に実行されます。

## さいごに

複雑なロジックがある場合はwatchで書きたくなるんですが、それはcomputedに分解できませんか？
分解出来ない場合や、非同期処理がある場合はwatchで書きましょう。
Eloquent JavaScript 2章読んだ 

# 前振り
Eloquent JavaScriptの1から4章まで読んでいるのでその記録にメモを残していく。
 - https://eloquentjavascript.net/


# 2. Program Structure
 実際にプログラムと呼ぶものを扱う

 - バインディング
   - プログラムがどのように内部情報を保持するか？ 
    - jsはbindingまたはvariableと呼ぶものを提供する
        - `let catch = 5 * 5`
        - バインディングが上記のように値を示す場合、それは `=` で新たに別の値を保持することができる
        - バインディングは箱ではなく触手のようなものを想像するとイメージしやすい。

 - バインド名
    - 任意の単語を使用可能。ただし以下の制約がある
        - 先頭文字を数字で始めることはできない
        - `$`や`_`を含めることは可能だが他の特殊文字は使用できない
        - 以下のコードブロック記載の単語は予約語であり、バインド名には使用できない。（一部のみ記載。予約語は他にもある）
        
```
break case catch class const continue debugger default
delete do else enum export extends false finally for
function if implements import interface in instanceof let
new package private protected public return static super
switch this throw true try typeof var void while with yield
```
 - 環境
    - 特定の時間に存在するバインディングとその値のコレクションは環境と呼ばれる
    - プログラム起動時にもからではなく、言語標準の一部であるバインディングが含まれている状態である

 - 関数
    - 関数名の後にカッコ()を入れることで呼び出しが可能
    - 例：　`prompt("test", 4)`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274134/1859466d-822c-7f7e-676a-bff7878e7229.png)
    - arguments
        - 関数に与えられる値。prompt関数の("test", 4)の部分

 - 戻り値
    - 関数が値を生成するとその値を返す。

 - 制御フロー
    - 基本的に上から下に向けて順次実行する。ただし以下のような例外もある
    - 条件付き実行
        - if分岐
    - ループ
        - while
        - do
        - for
        - switch文での値のディスパッチ

 - インデントコード
    - 必須ではないがコードの構造をに安くするために有用
        - インデントコードは半角スペース2つを用いる人がいれば4つを用いる人もいる。

 - 大文字
    - 
 - コメント
    - 以下の文字列の後ろはコメントになる
        - //

## 演習
  - Looping a triangle

```js
// Your code here.
for( step=0; step < 8; step++){
	console.log("#".repeat(step));
}
```

 - FizzBuzz

```js
// Your code here.
for (step=1; step < 101; step++ ){
  if(step % 15 == 0) {
    console.log('step: FizzBuzz', step);
  }
  else if( step % 3 == 0 ){
    console.log('step: fizz', step);
  }
  else if(step % 5 == 0) {
    console.log('step: buzz', step);
  }
}
```

 - Chessboard

```js
// Your code here.
for (step=1; step < 9; step++ ){
  if(step % 2 == 0) {
    console.log('# # # #');
  }
  else {
    console.log(' # # # #');
  }
}
```
 
#参考文書
 - https://eloquentjavascript.net/02_program_structure.html
【Python】Seleniumでエラー、スクレイピングできなくなったが、、、

スクレイピング用にPythonで作成したものを実行したところ、、、

`selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 76`

こんなエラーがでて実行できません。（フツウに先週までできてたのに。。）
このエラー、「今インストールされているChromeDrierだと、Chromeのバージョンは「76」までだよ」ってことらしい。

ChromeDriverのバージョンは自動バージョンアップしないだろうし、、、となると、GoogleChromeのバージョンか？

Chromeのバージョンをしらべたところ、、、
![chromeバージョン.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/0fcf1be5-a513-ffe6-11d6-02347a03964f.png)


ちなみに、ChromeDriverのバージョンは「76.***」でした。

なるほど、バージョンが異なるから実行してくれないわけね。
真っ先に思ったのが、「じゃあ、Chromeのバージョン戻すかー」でした。
早速、
1. ChromeのVersion76をダウンロード
2. Chromeのアンインストール
3. ChromeのVersion76をインストール

念のため、Chromeを開いてバージョン確認すると、、、

いきなし自動バージョンアップ開始して、息つく暇もなく最新バージョンになりました。（はいダメー）

じゃあ、自動バージョンアップを停止するしかないね、、と設定画面を探すも「？？？」。

Windows10 Homeはできないみたい。（はいダメー）

ほな、ChormeDriverをChrome側のバージョンに合わせるしかないか。（っていうか普通コレを最初に試すべき？）

アンインストール後、再度インストールしてみる。

    pip uninstall Chromedriver-binary
    pip install Chromedriver-binary

ChromeもChromeDriverも同じ最新のバージョンになったところで、再度、スクレイピング実行。

エラーになることなく実行してくれました、よかった、よかった。

## （追記）
Chromeのバージョンに合わせてDriverをインストールするようにしたほうが確実っぽいです。

```python
for /f "tokens=1" %V in ('dir /B /O-N "C:\Program Files (x86)\Google\Chrome\Application" ^|findstr "^[0-9].*" ') do pip install chromedriver-binary^<^=%V
```

※「C:\Program Files (x86)\Google\Chrome\Application」は自PCにChromeが入っているパスです。
ドキュメンテーションについてのメモ

エンジニアのドキュメンテーションについてのメモ

###なぜドキュメントを整備する必要があるのか

システムや機器を作成する際にドキュメントを整備していないと、自分がそれらを使う分には問題ないが、他の人はそれの使い方が分からない状態になる。
すると、他の人はそれを使って仕事できなくなる上、他の人が仕事できない分、自分の仕事が増えてしまう。
それを防ぐため、システムや機器を作成する際には、誰にでも使えるようにドキュメントを整備する必要がある。

###どのようなドキュメントが使われているのか

使われるドキュメントとして、主に以下のものがある。

- 要件定義書

クライアントの要求について、何をどのようにするのかを明確にして整理した文書。
クライアントと開発者がシステムの全体像を共有するために必要。

- 基本設計書

抽象的な要件を、より具体的にまとめた文書。
実際のシステム上ではどのように動作させるのかなどを書く。
クライアントと開発者が具体的な要件を共有するのに必要となる。

- 詳細設計書

基本設計で設計したシステムに、フローや入出力などを書き加え、システム全体の流れをまとめた書類。
開発者がプログラムを書く際の設計図として必要。

- マニュアル

ユーザー向けに、システムの操作の仕方をまとめた文書。


##参考文献

- http://tech.innovation.co.jp/2018/02/05/Think-About-Documents.html
- https://infrasenavi.com/shigoto/1563
- http://gihyo.jp/dev/serial/01/agile/0004?page=2
Vueでのtextareaの自動拡縮を行うメソッドの書き方と、つまづいたところ

#まえがき
先日投稿した [対象要素までヌルッと自動スクロールするメソッドの書き方！](https://qiita.com/allein-s/items/6dc21c1fdfab72f7d11a)
と同様に、先人が語り尽くしたところではあるのですが、調べて出てこないところで微妙に詰まったのでアウトプットします。

#コード
コンポーネントとしてtextareaが使われることを想定しております。

```html:template側
<textarea
    :value="value"
    @input="$emit('input', $event.target.value)"
    id="comment-area"
    style="min-height: 20px; overflow: hidden;"
    rows="1"
    @keydown="autoExpandTextarea"
/>
<button
  @click="$emit('input', '')"
>キャンセル
</button>
```

ここでのポイントは

- `rows="1"`としないと、デフォルトでは`rows="２"`となっているため、１文字目入力時の自動拡縮でガクッとするおそれがあります。
- `min-height`で1行分の高さを指定しておいてください。
- 自動拡縮時に一瞬スクロールバーが表示されることへの対策で、`overflow: hidden;`となっております。

```js:script側
props: {
  value: {
    type: String,
    required: true
  },
}
watch: {
  value() {
    this.autoExpandTextarea()
  }
}
methods: {
  autoExpandTextarea() {
    const element = document.getElementById("comment-area")
    element.style.height = 'auto'
    if(this.value !== '') {
      element.style.height = element.scrollHeight + 'px'
    } else {
      element.style.height = '0'
    }
  }
}
```
`element.style.height = 'auto'`でいったん既存heightを上書き、その後
`element.style.height = element.scrollHeight + 'px'`で値を再設定することで自動拡縮しています。

#つまづいたところ
当初、watchでvalueを監視して、都度autoExpandTextareaを呼んでいたが、
かな入力時、未確定の文字が行を跨いだ際に、自動拡縮が行われなかった。
→`@keydown="autoExpandTextarea"`を設定で解決

`@keydown`から自動拡縮を呼び出すのであれば、`watch`は不要では？と思い消してしまったら、今度は、バックスペースやエンターなどに反応しなくなってしまった。
→`@keydown`と`watch`を併用することに。

キャンセルボタンでフォームをクリア時に、`element.scrollHeight`が更新されず、テキストエリアが縮まなかった
→原因は不明のままだが、valueが空文字の際は`element.style.height = '0'`としてmin-heightまで縮小することで解決（ゴリ押し感）

#あとがき
今回のコードでは、実際の物からだいぶ多くの部分を省いた物なので、つまづいたところでご紹介したキャンセルボタンでの不具合などは発生しないかもしれませんが、同様の問題に直面した方の参考になれば幸いです。
バッチファイル　基礎編　表示・コメント・画面保持(pause)

# はじめに
バッチファイルを作成して、コマンドプロンプトの学習・業務効率化につなげようと思い、学習を始めました。アドバイス大歓迎です。15分あれば学習できる内容にしていくつもりです。

#コマンドプロンプト起動方法
①Windowsボタン
②cmdを入力
③Enter
以上で開くことが可能。
cmdと入力することすら面倒なので、何かいい方法があれば、教えてください。

#バッチファイルを作ろう
バッチファイルの拡張子は2通り。①を使うのが無難。
①.bat
cmdと違い、昔のWindows OSでも使用可能。
なんでcmdという拡張子を作っちゃったの。。。
②.cmd
WindowsNT系(Windows10とか)には使用可能。
Windows 98など、使えないものがある割にメリットは特になし。

#文字列表示(echoコマンド)
echoコマンドというものを使います。
使い方は以下の通り。
echo hogehoge
これを.batで保存し、そのファイルを開くと
一瞬だけecho hogehogeと表示されたコマンドプロンプトが表示されます。
一瞬すぎて何を書いているかわからないので、
次節の一時停止コマンドを利用します。

#一時停止コマンド(pauseコマンド)
前節「文字列表示」だけで保存したファイルの場合、
コマンドプロンプトがあまりに一瞬で消えてしまうため、
バッチファイルがちゃんと動いているか確認ができないです。

そこで、コマンドプロンプトを開いた状態で一時停止する方法があります。
**pauseコマンド**である。

echo hogehoge
の下に
pause
と差し込んで保存し、ファイルを動かすと
echo hogehoge
pause
とコマンドプロンプトがポップアップするでしょう。
基本的には、pauseコマンドは最後に残しておくと、後々楽です。

#表示がすっきり!(@ echo off)
※@のあとすぐにechoと入力してください。このブログでは、だれかを指してしまうため、@とechoの間にスペースはいりません。
@ echo offは非常に便利である。
ディレクトリの表示、コマンドの余計な表示がなくなり、
かなり見やすくなったでしょう。
@を抜かしても、表示はすっきりするが、echo offだけ出てきてしまう。
@を付けておくのが無難です。

@ echo off
echo hogehoge
pause
これで、コマンドプロンプトにhogehogeと表示されるでしょう。

ちなみに、
pause >null
とすれば、「続行するには何かキーを押してください」
を非表示にできます。

#コメント(::コマンド、remコマンド)
コメントしたい場合は「::〇〇」
「rem〇〇」でもコメントできます。
後々修正するときに「これなんだっけ」ってなるのを防ぐことができます。

#3つ学びました
・表示する
・コメントする
・ウィンドウを一時停止状態にして保持
を学びました。

次はifなどの条件分岐に入ります。
毎日ブログ2日間

今現在書き始めた、時刻が23:50分早めに書き終えるようにします。

昨日のTo　Do　List　で実践できたことは

①Progate中級道場　

これは3回目ということもあり、2時間弱で終えれました。

containrはいじらない方が良くて、幅とmargin:0 auto;だけにしといた方がよさそう。
それに、container p とか hはしない方がよい。後半でもcontainer pとか出てくると、そこにスタイルが反映されてしまうので。

各要素の一番上に高さを設定すること。これは当たり前かもしれないけど、メモしながら進めていたら、気づいた。

pタグはブロックタグなのでtext-align:center;が適用されないことに気づいた。
なので、display:inline-block;にする必要があると気づいた。

②ドットインストール　Boostrap4 8～14

最後までできませんでした。

覚えることが多すぎるので、メモしてからアウトプットするやり方だと、すごい時間かかりますね。たぶん一つので15分くらいかかりますね。

btnを大きくするときはlg 小さくするときはsm

グリッドレイアウトにするときは、colとrowを使う。colは一行が12分割でこれを振り分けられる。

一番難しかったのが、レスポンシブレイアウトである程度の幅で非表示にする方法。これは、d-md-noneとするみたい。
これに加えて、ある程度の幅で表示するには、d-noneにしつつ、d-md-blockでカラムについてはcol-md-2とすればメディアム以上では2で表示できるみたいだ。
もう一度、復習しよう。

h1とかのタグを大きくしたかったら、display-数字とすればよいことを忘れていた。

pyは上下、pxが左右というのも忘れていた。

丸くしたかったら、rounded-circleとすればよい。

カラムに順序をつけるには、orderを使う。




ここまでしか今日はできませんでした。昨日は上級道場もやろうと思ったのですが、You Tubeとか見ちゃうとできませんね。ほんまに減らしていきたい。

昨日は、すごい就活に悩んでいましたが今日はだいぶ和らぎました。

Twitterを見ていると、就活専用アカウントという文化があることには驚きました。見てみると、今の時期は遅いみたいなこと言っている人がいて次元が違うというか、意識の持ちようが全然違いすぎてありえねーと思いました。インターンの締め切りもあり、そろそろ、どの分野で就職するか考えないとですね。IT系に進みたいけど、就活大変そうで勇気がでませんね。でも、就職したくない分野で就職しても人生後悔しそうですし、IT系を狙っていきますかー。

また大学ではそろそろ研究室配属が決まりそうです。
一番、ホワイトな研究室通ってくれ。

昨日は、です、ます、口調じゃなくて実験レポートみたいな感じでしたが今日はです、ます、ぽい感じにしたけど、殴り書きだから適当になっている所が多すぎですね。本当に文章能力がないし、語彙力もないしやばいですよね。

他の人のブログの感想については休みの日にじっくり書きますね。

明日のTo　Do　List
・上級道場
・ドットインストール　15～22までで全て終わらす。
・できれば+αしたいですね

書き終えた時刻0:46

約１時間かかってしましました。多少は昨日より早く打てているなと実感していますが、どうも下をむいて確認しちゃいますね。明日は一度もキーを見ずにブログを書き終えることを目標にしますね。

明日も一日頑張りましょう！！！
text_fieldでtime型データの表示

railsのform_forで、text_fieldにtime型のデータを表示させたい時にうまく時間だけを表示できなかったのでその対策です。

## 環境
Rails 5.2.3

## 留意点
htmlはhamlで記述しています。

## コード

```◯◯.html.haml
= form_for @schedule do |f|
　= f.text_field :next_time, placeholder: "クリックしてください", value: "#{@schedule.next_time.strftime('%H:%M')}"
```
valueを設定してあげればよかったんですね。
next_timeがtime型で保存しているデータになります。
これにstrftime('%H:%M')をつければ万事解決。
ちなみに、このvalueがないと・・・
![](https://gyazo.com/ce47318585fd8a405b37ba1b0b789709.png)
こうなります。

**（補足1）UTC**
「UTC」は「協定世界時」のことで、英語だとCoordinated Universal Timeらしいです。
セシウム原子の振動数をもとに導き出す時間で、今の世界で標準時として使っている時間のことらしいですが、ざっくり言えば日本時間から9時間引いた時間のことみたいです。

これを時間だけの表示にしたかったので、先ほどのvalueを設定してあげると・・・
![](https://gyazo.com/cd8880d28172beccc9fe7674133267b7.png)
こうなります。
結構単純でしたね。

**（補足2）value属性**
この問題にぶち当たった時に改めてvalue属性ってなんぞや？となったので記載しておきます。
[HTML5入門](http://html5.cyberlab.info/elements/forms/input-value.html)より
>input要素のvalue属性は、input要素の値を指定する属性。テキスト入力欄などにおいては初期入力値、チェックボックスやラジオボタンにおいては選択した時にだけ送信する値、送信ボタンなどにおいてはボタン名を表す。

なるほど、テキスト入力では初期値ですか。
そう考えればスッキリします。
LaravelのwhereHasでの条件指定でクエリスコープが使える

## はじめに
Controller内での条件指定が複雑になり読みにくくなってしまったので、勢いで試してみたらできたのでそのメモです
(検証環境はver6.4)

## やってみた
前提として[公式のドキュメントあるある](https://readouble.com/laravel/6.0/ja/eloquent-relationships.html)のブログシステムで関連した多くのPostモデルを持つUserモデルでやってみる
(下記みたいなやつ)

```php:\App\User.php
/**
 * ユーザーの全ポストの取得
 */
public function posts()
{
    return $this->hasMany('App\Post');
}
```

### よくあるパターン

```php:下書きの記事(post.status=0)があるユーザーであるか
\App\User::find(1)->whereHas('post', function (Builder $query) {
    $query->where('status', 0);
})->exists();
```

`post.status = 0`ってなんだ？っとなり可読性がよろしくない
`POST::DRAFT` みたいに定数化したら読みやすいが余計な依存関係ができて微妙・・・

### スコープを使ってみる

事前にPostモデルにスコープを定義しておいて、呼び出してみると同じように絞り込みができる

```php:\App\Post.php
public function scopeDraft(Builder $query): Builder
{
    return $query->where('status', 0);
}
```

```php:下書きの記事があるユーザーであるか
\App\User::find(1)->whereHas('post', function (Builder $query) {
    $query->draft();
})->exists();
```

よみやすい！！

## おわりに
実際はもっといろいろな条件が入り混じって大変読みづらいものが、スコープ名から一発でわかるようになるのはとても楽
error: There was a problem with the editor 'atom --wait'.が出たら、git config core.editorの設定を直そう

## 問題
ターミナルで`git commit`を実行したところ、以下のエラーが発生しました。

```
git commit
hint: Waiting for your editor to close the file... atom --wait: atom: command not found
error: There was a problem with the editor 'atom --wait'.
Please supply the message using either -m or -F option.
```
エディターが開かない…

ちなみに使用しているGitのバージョンは次の通りです。

```
git version 2.17.2 (Apple Git-113)
```

## 原因
現在エディターはVSCodeを使っているのですが、VSCodeに乗り換える前はAtomを使っていました。
Atomをアンインストールしているにも関わらず、`git config core.editor`が`atom --wait`のため、Atomを開けずエラーが起きていました。

## 解決
以下のコマンドを実行して、`git commit`をしたときに、VSCodeを開くように設定しました。

```
$ git config --global core.editor 'code --wait'
```

## 参考
[GitのEditorをVSCodeに変更する](https://qiita.com/takeo-asai/items/9bc7e25cd94cd8c9adee)
Juliaで返り値を返さないことを明示する

# モチベーション
Juliaはfunctionの最後の式の評価結果を返すが、返したくないときもある。
C/C++でいうところのvoid的な。

# 結論
末尾にnothingを書こう

```julia
function hoge()
    # nanika
    nothing
end
```

#出典
このへん
https://github.com/JuliaLang/julia/blob/c6da87ff4bc7a855e217856757ad3413cf6d1f79/base/channels.jl#L401
SESがＷebエンジニアになるための計画

# 経歴 
・国際関係学部出身
・新卒でSlerベンチャー企業に入社。現在2年目。
・出向先はメガベンチャーで自社サービスの運用保守を担当。

#どうなりたいか
ゴリゴリの文系です・・・
去年独学で勉強しようと試みましたが、挫折。
しかし心残りなのでもう一度奮起して今年中までにポートフォリオ作成し
WEB業界に転職しようと考えております。
PCは業務上触っていますがプログラミングは全くもっての未経験です。

 
# 現在
只今Rails、Rubyを学習中
Progate←NOW！！、Ruby on Rails、Udemy


今週の勉強内容
Progate Lesson1,2,3,4
インスタンスメソッド
クラスとインスタンス
Total:8.5h
G検定メモ⑱　掟破りの数学問題編

G検定の勉強をしていて気づいたんだけど、高校の時数学の授業にあんまし聞いてなかったんだよね。
数学は好きだから明日から本気で頑張ろう！そのためにも今日は早く寝て英気を養おう！みたいな感じで気づいたらG検定試験の前日でした。

でもG検定の試験には2問くらい数学の問題が出るっぽい。
2問なら選択問題だし適当でもいいかなと思っていたんだけど、やっぱりそれじゃ駄目だ、
ここで頑張らないと俺は一生やらないぞと奮起しました。

G検定試験で出る数学問題は簡単な微分と行列っぽいという事で、
何とかこの短い時間で確実に結果を出していこうと努力に努力を重ね、ついに最短時間で正解にたどり着く事が出来ました。

微分電卓
https://ja.numberempire.com/derivativecalculator.php

行列計算機
https://matrixcalc.org/ja/


ありがとう、インターネット。
インターネットは僕の拡張頭脳です。

微分電卓のサイトの計算機貼り付けツールを使って、
電卓をまとめたページを作りました。
https://www.ndl-net.org/calculator/

※自分で計算して解いて、答え合わせに使ってくださいね。
あとG検定で出る問題は自分で計算したほうが早いかも。
リポジトリ名を変えてみた！

ローカルで作成したアプリケーションをherokuに移そうとしたところ、「プロジェクト名にherokuで使用できない文字が使われている」という旨のエラーを弾かれたので、プロジェクト名を変更することにしました。

#ツール
OS:Windows10
エディタ：Visual Studio Code
GIT for WindowsとGIT BASHはインストール済み

#GITHUB上
対象のリポジトリに入り、「Settings」をクリック。
「Repository name」の欄に変えたい名前を入力し、「Rename」をクリックすると、リポジトリ名の変更が完了！
意外と簡単でした。


#ローカル上
GITHUBだけ変更して終わりではありません。
ローカルリポジトリなど複数の所と連携している場合は、全て変更しなければなりません。
今回はローカルで作ったものなので、ローカルリポジトリだけ変更します。

Visual Studio Codeで対象のフォルダのターミナルを開き、以下のコードでgit configを確認します。

```
$ git config -l
```

こちらを打ち込むと、ターミナルにそのリポジトリに関する情報が現れます。
今回の場合は、以下の部分を変えます。

```
remote.origin.url=https://github.com/username/repositoryname.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
```

確認したら「Q」でリストを閉じ、以下のコマンドでgit configを直接編集します。

```
$ git config -e
```

すると、エディタ上でgit configを編集できるようになりますので、remote.origin.urlのリポジトリ名（.gitの部分）をGITHUB上で変更したものと同じ名前に変更します。

#まとめ
今回はリポジトリ名を変更するだけでしたが、調べながらやった為、ノートとしてこちらの記事を寄稿させていただきました。

#参考文献
・[GitHubのリポジトリをリネームする]
(http://dotnsf.blog.jp/archives/1071287129.html)

・[.gitconfigファイルを直接いじってみる（設定関係メモ）]
(https://qiita.com/KTakata/items/470da16b9e53799dcb65)
【第1話】Flutterでwebゲーム作ろっかなって思った 【Hello F*****g World】

#とりあえずインストールとか
flutter と　dartをインストールとか設定とかする
https://flutter.dev/docs/get-started/install
https://dart.dev/get-dart

#推奨エディタがヤダ
Android Studio嫌いというかAndoroid用のアプリ作ろうと思っているわけではない（現状
IntelliJ嫌い
Eclipseはイイやつだけどくっそ重いからあんま好きじゃない
Visual Studio Code使おうかな　最近使ってる先生がyoutubeに多いし

#Visual Studio Codeのマーケットプレイスを漁る
とりあえず、初めての世界なのでオススメ設定を教えてくれる誰かをグーグル先生に聞いたが、誰もいなかった。
こういうときは星5のやつで、英語読んで雰囲気で良さそうなやつをごっそり入れる。
明示的にコレを使っているぞーって感じではないけど一応環境を同じにしたい人のためにリストを出しておきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173892/a351a291-ed51-794b-00df-be1f709f6d28.png)



#テストアプリを作ってみる
テストアプリを作ってみます。
experimentalフォルダを適当な場所に作ってその中でごちゃごちゃやっていきます。

#実行してみる
https://flutter.dev/docs/get-started/web
上記の手順を踏んで実行しよう！（記事書いてから数ヶ月したらやり方変わる可能性大なので注意な！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173892/e211d689-c9c3-cafb-04a7-e0455522a556.png)

runくっそ重い。かつてのactionscript flex環境を思い出すくらい重いと思うんだけど気のせいか？いや気の所為だやつは実行するまでに5分以上掛かったな・・・

いやまてよ、俺はweb以外のビルドはまじで無駄なわけだ、つまりflutter configで見えているビルド先オプションをweb関係以外は全てoffにすれば早くなるのでは。
flutter config --no-enable-android-embedding-v2
flutter config --no-enable-linux-desktop
flutter config --no-enable-macos-desktop
flutter config --no-enable-windows-desktop

変わってないよーな気がする。そりゃそうかflutter run -d chromeってクロームって指定してるものね。そうだよね？

#ということで

ほーん、できたやんけ

さてさて、
lib/main.dartを開いていじってみると表示が変わるよだそうです。

ほーん、つまりエントリーポイントはここなのかな？

よし、大体わかったぞ、コレで30分でゲームができるとうそぶいたあのページが試せるのだな！
やったるでー

...to be continued
Eloquent JavaScript 1章読んだ 

# 前振り
Eloquent JavaScriptの1から4章まで読んでいるのでその記録にメモを残していく。
 - https://eloquentjavascript.net/


# 1. Values, Types, and Operators
 この章では値型とそれに作用する演算子を紹介する
 
 - 数値型
    - 算術演算子
        - +
        - -
        - %
            - mod
 - 文字列型
    - 以下で囲むことで文字列として利用可能
        - ""
        - ''
        - ``
    - 演算子
        - + 
        - &
    - バックスラッシュでエスケープができる
        - \n
            - 改行
        - \t
            - タブ
    - テンプレートリテラル (${})
        - バッククウォート内のJavascriptを${}で囲むことで計算結果を文字列表示できる
            - `half of 100 is ${100 / 2}` => "half of 100 is 50"

 - ブーリアン型
    - true
    - false

 - 型の自動変換
    - Javascriptは利用者が与えるほとんど全てのプログラムを受け入れる
    - 以下は演算子が、型に対して誤った用法をされても型変換を行い処理を続行する例
        - `console.log(8 * null)` => 0
        - `console.log("five" * 2)` => NaN
        - `console.log(false == 0)` => true
    - これは型強制と呼ばれ、多くの場合に期待しないルールを適用する
        - 異なる型同士を比較する場合、比較演算子は以下のようにすることを進める
            - ===
            - !==

#参考文書
 - https://eloquentjavascript.net/01_values.html
OpenVpnのsystemdユニットファイル

OpenVpnをインストールするとsystemdファイルが、3つ配置される。

それぞれのファイルの内容ついて記載する。

## openvpn@.service

/etc/openvpn/配下のconfファイルをロードして、実行する。

現在は非推奨となっている。

* ファイルパス : /usr/lib/systemd/system/openvpn@.service

```bash
　　ExecStart=/usr/sbin/openvpn --cd /etc/openvpn/ --config %i.conf
```

* 実行形式

```bash
systemctl start openvpn@server.service
```

## openvpn-server@.service

/etc/openvpn/server配下のconfファイルをロードして、実行する。


* ファイルパス : /usr/lib/systemd/system/openvpn-server@.service

```bash
WorkingDirectory=/etc/openvpn/server
ExecStart=/usr/sbin/openvpn --status %t/openvpn-server/status-%i.log --status-version 2 --suppress-timestamps --config %i.conf
```

* 実行形式

```bash
systemctl start openvpn-server@server.service
```

## openvpn-client@.service

/etc/openvpn/clientにあるconfファイルをロードして、openvpnを起動する

* ファイルパス : /usr/lib/systemd/system/openvpn-client@.service

```bash
WorkingDirectory=/etc/openvpn/client
ExecStart=/usr/sbin/openvpn --suppress-timestamps --nobind --config %i.conf
```


* 実行形式

```bash
systemctl start openvpn-client@client.service
```

---

## アットマークについて

各ユニットファイルに@がついてる。

@がついたユニットファイルはsystemctlの実行時に@の後ろに文字列を指定すると、ユニットファイルに定義した%iを@の後ろに設定した文字列で置換できる。

```bash
# 下記を実行すると
systemctl start openvpn-server@server.service

# %iがserverに設定される
ExecStart=/usr/sbin/openvpn --status %t/openvpn-server/status-%i.log --status-version 2 --suppress-timestamps --config %i.conf
```

---

## 参考

https://community.openvpn.net/openvpn/wiki/Systemd
【第0話】Flutterでwebゲーム作ろっかなって思った 【飛ばし推奨】

#注意
具体的なコード書いたりなんとかしたりは次話から始まります。

#とりあえずやってみよ
ネットの広大な海を泳いでいたらこんなページに辿り着いた。
https://medium.com/flutter-community/from-zero-to-a-multiplatform-flutter-game-in-a-week-8245da931c7e

それとflutterでできたゲーム
https://www.nytimes.com/games/prototype/kenken#/
kenken面白いねkenken

ほほーん、面白そうやん、やってみよってことでやってみる。
https://flutter.dev/docs/get-started/install/windows

ふーん、色々バツがでるけど、web開発には別にいらんのね、ほうほう、Chromeあればいいんですね。

とりあえず完成しているゲームがあるらしいのでそれを走らせてみようとする
https://github.com/spritewidget/spaceblast

あれ、だめだ　flutter run　しないぞ。
ああ、先にflutter createか！うごかんやん・・・

https://flutter.dev/docs/get-started/web
デフォルトoffなんかい！しかもガチンコの超最新版使ってほしいんですね！わかりました設定します。

あれ、変なエラー出るなんでなん？
そして動かない。ぬぬぬ・・・
https://github.com/flutter/flutter/issues/41470

要約
<font color='blue'>質問者：最近flutterさん頑張っててweb版もビルドで吐き出してくれるらしいから試したけど動かんやんけ。エラー意味不明なんやけど。</font>
<font color='red'>対応者A：ゴメンムリ、最新版でプロジェクトのイニシャライズして、ソースコードガッツリもってきてそっちでビルドしてね。</font>
<font color='red'>対応者A：想定通りの動きなのでケースクローズします。</font>
<font color='blue'>質問者：ほーん、まぁ動いたからそれでええわ。</font>
<font color='green'>開発者B：おいそしたらなんかバグあったときのトラッキングがぶった切れるやんけ、ふざけんな！</font>
<font color='teal'>おれおれ：おいせめてエラーのメッセージどうにかしろよｗ　ああでもエラーメッセージ変更だとここにたどり着きにくくなるのか。初期エラーコメント無能罪は重いな。</font>
<font color='teal'>おれおれ：あれ、俺コレAngular 1 -> 2 のときのゴタゴタで似たようなこと聞いたよーなきがしなくもないよーな・・・</font>

ということで何も動かせてません。
困った僕はとりあえず簡単なゲームを作ることにしました。

結論として：なんかサクッと始めにくいけど調べれば調べるほど雰囲気は伝わった、とりあえずなんか作るよ。

#引っかかったポイント
- Dart入れてる間にFlutterDLしてたんだけど、なんかFlutterも設定した気持ちになってしまった。なんで動かんのやーって10分ほどもにょってDiablo3して戻ってきてFlutterのsdk置き場確保とpath設定した。
- flutter create . どっと必須です。　どっと見えないよドット

#あとがき（経緯
なんか色々触って、良さそうなwebゲーム作る道具を探しておりました。
私が昔ようつかっておったFlashくんは完全に死滅しましたのでな！
ゲームを作るのであれば、unity,webゲームならphaser(pixi)とかでいいと思うのですが、私が目指したいのは見た目amazonとかgmailなんだけど、これゲームやんみたいなやつです。
なぜなら、転職とかするときに、こんなのサクッと作れますよって見せやすいからです。（ゲームゲームしてるのは作り出すと終わりがなくなっちゃうし・・・

そいで、javascriptちょくで作るとかありえないと思い、React Angular Vueなどなどうろついて見たのですが、なんかうーんもっとこうお手軽感がほしいのである。
本当ならhbox vbox canvas ﾄﾞｶﾄﾞｶﾄﾞｰﾝみたいな感じでサクッと作りたいのだけれど、うーんどうなんだろうないのかなあるのかな
そもそももうhbox vbox canvasみたいなのじゃなくてモバイル重視みたいなのが多いのかなって。
そんなながれでFlutterにたどり着きました。割と良さそう。最近googleさんに推してもらってるみたい。
でもモバイルの方をむしろ重視しててweb開発は後回しみたい。

一応動くみたい（1話にて動作するのを確認してあります）

to be continued...
標本分散の期待値が母分散×(標本サイズ-1)/標本サイズとなることを数値実験で確認する

# 背景
[標本平均の分散が母分散/標本サイズとなることを数値実験で確認する](https://qiita.com/jajagacchi/items/ddf58418c566183206d4)の続編です。
今回は標本分散の期待値が$\sigma^2\times(n-1)/n$となることを数値実験で確認します($\sigma^2$:母分散、$n$:標本サイズ)。

# 数値実験
言語はC++を用います。確率分布関数は一次元の一様分布[-1,+1)とします。標本サイズは10とし、3000回抽出を繰り返し、標本分散の平均値が収束することを確認しました。

```c++
#include <iostream>
#include <random>

int main(int argc, char **argv)
{
        std::mt19937 mt(0);
        double a = -1, b = 1;
        std::uniform_real_distribution<double> r(a, b);

        int num_of_sample = atoi(argv[1]);//標本サイズ
        int Iter = 3000;//試行回数

        double sum = 0;
        for (int iter = 0; iter < Iter; iter++)
        {
                double avr = 0;//標本平均
                double avr2 = 0;//二乗平均
                for (int n = 0; n < num_of_sample; n++)
                {
                        double val = r(mt);
                        avr += val / (double)num_of_sample;
                        avr2 += val*val / (double)num_of_sample;
                }
                sum += avr2 - avr*avr;
                std::cout << iter << " " << sum/(double)(iter+1) << std::endl;
        }

        return 0;
}
```
![plot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520857/1a313db4-ceeb-c6df-3309-3680c862fde8.png)
一様分布の母分散は$\sigma^2 = (b-a)^2/12=1/3$、標本分散の期待値はこれに$(10-1)/10$倍したものとなるはずであり、正しい値に収束している様子が確認できました。

# まとめ
標本分散の期待値が母分散×(標本サイズ-1)/標本サイズとなることを数値実験で確認しました。つまり標本分散の期待値は母分散よりも小さい値となります。標本分散の値から母分散の値を推定する場合は注意が必要であり、ここから不偏分散という概念があらわれます。
Mac ローカル環境の MySQL 8.x のrootパスワードを忘れた時のリセット方法

## 〜宣伝〜

:::note info
個人開発でエンジニア専門マッチングサービスを開発しましたので、是非未経験からエンジニア目指している人！現役エンジニアで教えたい人！使ってみてください！

β版リリース記念キャンペーン中です！

10名様限定、抽選でお好きな技術本1冊プレゼント！
🎉当選者にはメッセージ差し上げます(送付の際に住所はお聞きしません)
詳しくはこちらから↓

https://x.com/dokupro01/status/1796837336145436846
:::
https://dokupro.dev/

## 目的

- MySQLのrootパスワードを再設定する方法をまとめる。

## 実施方法

1. 下記コマンドを実行してMySQLを止める

    ```
    $ mysql.server stop
    ```

1. 下記コマンドを実行してMySQLをセーフモードで起動する。

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

1. 別のターミナルを開き、書きコマンドを実行してrootユーザのパスワード無し状態でログインする。

    ```
    $ mysql -u root
    ```

1. 下記コマンドを実行してrootユーザーのパスワードを空に設定する。

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

1. 下記コマンドを実行してセーフモードで開いたMySQLを閉じる

    ```
    mysql> exit
    ```

1. セーフモードでMySQLを起動させたターミナル(コマンド`$ mysqld_safe --skip-grant-tables &`を実行したターミナルで)が終了しない時(コマンドが打てるようにならない)は下記コマンドを実行して動いているMySQLをkillする。  
※XXXXXは同じ数字が入る。必ず５桁とは限らない。

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

    $ ps aux| grep mysqld
    >ユーザ名            XXXXX   0.0  0.0  4271424   1376 s001  S    12:21AM   0:00.03 /bin/sh /usr/local/Cellar/mysql/8.0.18_1/bin/mysqld_safe --datadir=/usr/local/var/mysql --pid-file=/usr/local/var/mysql/MacBook-miriwo.local.pid

    $ kill XXXXX
    ```

1. 下記コマンドを実行して通常モードでMySQLを起動する。

    ```
    $ mysql.server restart
    ```

1. 下記コマンドを実行した後に何も入力せずEnterを押下する。

    ```
    $ mysql -u root -p 
    ```

1. 下記コマンドを実行してパスワードを再設定する。

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

1. 下記コマンドを実行して一度MySQLから出る。

    ```
    mysql> exit
    ```

1. 下記コマンドを実行した後に再設定した任意のパスワードを入力してEnterを押下しログインできるか確認する。

    ```
    $ mysql -u root -p
    ```

1. ターミナルが下記のようになれば成功

    ```
    mysql>
    ```

## Ruby on Rails を使用していて前述の作業を行なった方

- 下記作業を実施いてrailsアプリの設定ファイルに記載されているMySQLのアカウントのパスワードを再設定する。

1. `アプリ名ディレクトリ/config`に存在する`database.yml`ファイルをエディタで開く。
1. mysql2のパスワードを再設定したものに修正する。

    ```
    default: &default
       adapter: mysql2
       encoding: utf8mb4
       pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
       username: root
       # 下記を先ほど再設定したものに書き換える
       password: 
       socket: /tmp/mysql.sock
   ```
RyzenマシンにUbuntu Server 18.04をインストールする

# はじめに
[この記事](https://computational-chemistry.com/top/blog/2019/09/05/zen2-linux/)とか[この記事](https://linux.srad.jp/story/19/07/17/1633219/)にある通りRyzenシリーズでLinuxディストリを導入しようとすると
例えばRDRAND命令とかで不具合があってインストールがうまくいかなかったりする。
やってみると簡単に対策できたのでなんとなく記事にした。

# インストールと初回起動時
ポイントはブートオプションに`nomodeset`を追加するだけ。

一番最初に表示される「GNU GRUB」ブートローダー画面で例えば「Install Ubuntu Server」にカーソルを合わせる。
キーボードの`e`キーを押しGRUBの編集画面へ。
`linux /boot/vmlinuz`から始まる行の最後に`nomodeset`を追加、Ctrl-xで設定が適用される。

# HWEカーネルに変更する
Ryzen+Linuxでの不具合はLinux 5以降で解消されているのでカーネルの変更を行う。
Linux 5カーネルへの簡単なアップデート方法としてHWEカーネルのインストールを行う。

```sh
$ sudo apt-get install --install-recommends linux-generic-hwe-18.04
```

インストール後再起動を行う。以降はブートオプションを変更する必要はない。

# 参考
不具合関係
[Ryzen 3000 シリーズに Linux をインストール【AMD Zen2】](https://computational-chemistry.com/top/blog/2019/09/05/zen2-linux/)
[AMDのCPUにおけるRDRAND命令に不具合、Systemdが影響を受ける](https://linux.srad.jp/story/19/07/17/1633219/)

対策関係
[Linux起動用の手動「nomodeset」カーネル ブート ライン オプション](https://www.dell.com/support/article/jp/ja/jpbsd1/sln306327/linux%E8%B5%B7%E5%8B%95%E7%94%A8%E3%81%AE%E6%89%8B%E5%8B%95-nomodeset-%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB-%E3%83%96%E3%83%BC%E3%83%88-%E3%83%A9%E3%82%A4%E3%83%B3-%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3?lang=ja)
[Ubuntu18.04にカーネル 5.0 をインストールする手順](https://www.virment.com/how-to-update-kernel-5-in-ubuntu/)