OmniAICreator/Qiita-1.07M huggingface dataset:
Laravelの環境構築

## なぜ投稿するのか
初心者なりに、Laravelの環境構築についてまとめます。
よくスタックしてしまうので、自分の備忘録用に。
基本的には公式ドキュメントを確認しましょう。
https://laradock.io

##　前提
- Mac OS Mojave ver10.14.4
- Docker for Mac インストール済
- gitを利用していること

## Laradockをプロジェクトのディレクトリにクローンする。
まずはディレクトリを作成する。今回のディレクトリの名前は「web_site」とする。ディレクトリ作成のコマンドは`mkdir`です。
` mkdir web_site `

そして、作成したディレクトリに移動。移動のコマンドは`cd`です。
` cd web_site `

そして、「web_site」直下にLaradockをクローンします。
` git clone https://github.com/LaraDock/laradock.git `

クローンできたら、「laradock」ディレクトリに移動する。
` cd laradock `

次に、`env-example`を`.env`にコピーし名前を変更する。
`cp env-example .env`

公式ではここで`docker-compose up -d nginx mysql phpmyadmin redis workspace`してコンテナを立ち上げるが、ここはグッとこらえてmysqlの設定を変更する。
「laradock」ディレクトリ内の`.env`ファイルを編集する。(恐らく220行目)

```
# MYSQL_VERSION=latest 最新版
MYSQL_VERSION=5.7
```

## コンテナを立ち上げる
設定が無事に完了したら、コンテナを立ち上げます。

```
docker-compose up -d nginx mysql phpmyadmin
```
念の為コンテナが立ち上がっているか確認する。

```
docker-compose ps

           Name                          Command               State                    Ports                  
---------------------------------------------------------------------------------------------------------------
laradock_docker-in-docker_1   dockerd-entrypoint.sh            Up      2375/tcp                                
laradock_mysql_1              docker-entrypoint.sh mysqld      Up      0.0.0.0:3306->3306/tcp, 33060/tcp       
laradock_nginx_1              /bin/bash /opt/startup.sh        Up      0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
laradock_php-fpm_1            docker-php-entrypoint php-fpm    Up      9000/tcp                                
laradock_phpmyadmin_1         /run.sh supervisord -n -j  ...   Up      0.0.0.0:8080->80/tcp, 9000/tcp          
laradock_workspace_1          /sbin/my_init                    Up      0.0.0.0:2222->22/tcp  
```

たまにmysqlが立ち上がっていなかったり、バージョンが5.7じゃない時があるので、確認してみましょう。

```
docker-compose exec mysql mysql --version
```
もし5.7じゃなかったら下記URLを参考にしてください。私もこちらで解決しました。
https://qiita.com/don-bu-rakko/items/cd8f96cc9087abf601e3
改めて`docker-compose exec mysql mysql --version`を入力し、mysqlのバージョンを確認する。

```
docker-compose exec mysql mysql --version
mysql  Ver 14.14 Distrib 5.7.26, for Linux (x86_64) using  EditLine wrapper
```
こうなっていれば問題ありません。
そしたらworkspace内に入って、プロジェクトを作成します。
rootで入ると怒られるので`--user=laradock`を指定します。

```
docker-compose exec --user=laradock workspace /bin/bash

laradock@58587972cc01:/var/www$ composer create-project laravel/laravel web
```

`composer create-project laravel/laravel web`は、composerでlaravelを作成しています。ファイル名は「web」にしていますが、任意の名前を入力してください。


### 「web」フォルダ内の`.env`ファイルの編集
少しややこしいですが、先ほど編集したのは「laradock」フォルダの`.env`ファイルです。要確認。

```
DB_HOST=mysql # 元は127.0.0.1
DB_DATABASE=default # 元はhomestead
DB_USERNAME=default # 元はhomestead 
```
次に、laradock内の`.env`ファイルの8行目を変更します。

```
APP_CODE_PATH_HOST=../web/
```

そのあとdockerを再起動します。

```
docker-compose stop

docker-compose up -d nginx mysql phpmyadmin
```

これで無事に完了するはずです。
php-master-changes 2019-04-30

今日は 不要コードの削除、preload された関数/クラスの JIT の修正、ZEND_ACC_PRELOADED の追加、typo の修正、opcache の実装の局所最適化があった！

# 2019-04-30
## petk: Remove TSRM configuration header
- https://github.com/php/php-src/commit/ce65d2354c95069685136db409cb9d85ebd25328
- [7.4~]
- 不要な TSRM/tsrm_config.h の生成/参照を削除

## dstogov: Fixed JIT for preloaded functions and classes
- https://github.com/php/php-src/commit/faf24142f3f58d0f4c99143b06d120fe8b853d47
- ext/opcache で、preload された関数/クラスの JIT を修正
- という話なんだけどぶっちゃけよく分かっておらず

## dstogov: Also, use ZEND_ACC_PRELOADED for classes
- https://github.com/php/php-src/commit/8cdd2158949994f110188818e84b54db9a0ed4d1
- [7.4~]
- preload された関数/クラス用のフラグ ZEND_ACC_PRELOADED の追加

## jhdxr: fix typo
- https://github.com/php/php-src/commit/e4ed2bf922c894fa771f9da0329f8edcce595dbe
- [7.4~]
- ext/opcache で、typo の修正

## dstogov: Use ZEND_HASH_FOREACH with direct callback, instead of callbacks
- https://github.com/php/php-src/commit/ec5f7df73283ec14cfea5f8a8378238726a71a59
- [7.4~]
- ext/opcache で、zend_hash_persist() 等へコールバックを渡す構造をやめ、ZEND_HASH_FOREACH で呼び出し元から直接コールバックを呼び出すよう修正
確率・統計・機械学習・ディープラーニング

確率・統計・機械学習・ディープラーニングに関する記事のインデックス


[ベクトルの共変成分と反変成分](https://qiita.com/sand/items/38b10ed4b6d2f22c3e72)
[テンソルの定義](https://qiita.com/sand/items/642ebc647cc5180ac5a9)

[【機械学習】誤差逆伝播法のコンパクトな説明](https://qiita.com/sand/items/2d783a12c575fb949c6e) 
[【機械学習 誤差逆伝播法】word2vecメモ (1)](https://qiita.com/sand/items/85ea76f9c26aabb849e7)
[【機械学習 誤差逆伝播法】word2vecメモ (2)](https://qiita.com/sand/items/85fcb31099cfa74cd0ae)


[Juliaをはじめてみる](https://qiita.com/sand/items/1ea73f148efd16d8ebc8)
[JuliaのPlotsでフォントが小さすぎる](https://qiita.com/sand/items/c4e82cc9e62921671af5)
[Julia のPlotsでエラー：could not load library "libGR.so"](https://qiita.com/sand/items/dc08a2498b27e76523ea)


[統計学入門のお供 Julia (1) - 標準得点、偏差値得点 - Qiita](https://qiita.com/sand/items/904271431a7809ce2066)
[統計学入門のお供 Julia (2) - ピアソンの積率相関係数 - Qiita](https://qiita.com/sand/items/06970a14ffc8cab69403)
[統計学入門のお供 Julia (3) - 順位相関係数と自己相関係数 - Qiita](https://qiita.com/sand/items/4f90e951bde8b318f232)
[統計学入門のお供 Julia (4) - 最小二乗法と決定係数 - Qiita](https://qiita.com/sand/items/38e7e08a50b82849a859)
[統計学入門のお供 Julia (5) - ベイズの定理 - Qiita](https://qiita.com/sand/items/439ecea5e825aa2cd9cb)
[統計学入門のお供 Julia (6) - ド・メレの問題 = Oiita](https://qiita.com/sand/items/e8bd52fa5560b7c81469)

[Juliaで学ぶ確率変数(1) - 確率変数の定義 - Qiita](https://qiita.com/sand/items/afb5976ad28120d216c4)
[Juliaで学ぶ確率変数(2) - ２項分布（離散型） - Qiita](https://qiita.com/sand/items/9eda536b4e8f9bad0055)
[Juliaで学ぶ確率変数(3) - 幾何分布（離散型） - Qiita](https://qiita.com/sand/items/04e4165e823625e0177a)
[Juliaで学ぶ確率変数(4) - ポアソン分布（離散型） - Oiita](https://qiita.com/sand/items/632ad1665ab522e6c619)
[Juliaで学ぶ確率変数(5) - 正規分布（連続型） - Qiita](https://qiita.com/sand/items/4c3ef0b0504704074681)
[Juliaで学ぶ確率変数(6) - 一様分布（連続型） - Qiita](https://qiita.com/sand/items/7c3c54ef82a1bf439cc4)
[Juliaで学ぶ確率変数(7) - 指数分布（連続型） - Qiita](https://qiita.com/sand/items/4d494a8d05d5c88cc5df)
[Juliaで学ぶ確率変数(8) - ガンマ分布（連続型） - Qiita](https://qiita.com/sand/items/744672a69bd6bc1c8f24)
[Juliaで学ぶ確率変数(9) - ベータ分布（連続型） - Qiita](https://qiita.com/sand/items/7443a5ba7be873e113d9)
[Juliaで学ぶ確率変数(10) - コーシー分布（連続型） - Qiita](https://qiita.com/sand/items/8916cf28ad1dd82d8deb)
[Juliaで学ぶ確率変数(11) - まとめ - Qiita](https://qiita.com/sand/items/e4b32f7cfd74dea40298)


[【２変数の確率変数１】独立性 - Qiita](https://qiita.com/sand/items/f6184426fbaf499c5a65)
[【２変数の確率変数２】平均と分散](https://qiita.com/sand/items/348a326fb640a28434c3)

[【確率統計】事象の独立性](https://qiita.com/sand/items/15b390ca71c8d62052fb)


[Pythonで「中心極限定理」を確かめてみる - Qiita](https://qiita.com/sand/items/5adfa593abe928bf266c)
[母平均の区間推定で「中心極限定理」を使う - Qiita](https://qiita.com/sand/items/924e072f92ab1ae419db)
[Pythonで「カイ２乗分布の定理」を確かめてみる - Qiita](https://qiita.com/sand/items/3672803c4212e034a4fa)
zshとperlで正規表現を使って複数のファイルをリネームする

# 目的
正規表現を使ってカレントディレクトリ内のすべてのファイルとディレクトリを一度にリネームするコマンド`regmv`を作る。
おまけとしてワンライナー版も紹介する。

# コマンドの使い方
perlの正規表現を引数に渡す。
(実際には正規表現以外にもperlとして解釈できる文字列であれば何でも動く)

### 使用例
ディレクトリ内に`a.txt`, `b.txt`, `ab.txt`がある状態で`regmv s/b/c/`とすると`a.txt`, `c.txt`, `ac.txt`になる。

#### オプション
 - `-t`, `--test`: 実行されるコマンドだけ表示して実際にはリネームしない
 - `-v`, `--verbose`: リネームの様子を出力する


# 方法
```zsh
function regmv () {
    local -A opthash  # オプション格納用のopthashという連想配列を作成
    # zparseoptsを使って[-t, --test, -v, --verbose]のオプションを受け取るように設定
    zparseopts -D -E -A opthash -- t -test v -verbose

    # [-v, --verbose]のどちらかがついていればmvに -v オプションを付加
    local mvopt=''
    if [[ -n "${opthash[(i)-v]}" ]] || [[ -n "${opthash[(i)--verbose]}" ]]; then
        local mvopt='-v'
    fi

    # [-t, --test]のどちらかがついていればテストモードに以降 (実行されるコマンドだけ表示して実際にはリネームしない)
    local act='print `mv '$mvopt' "$x" "$_" `'
    if [[ -n "${opthash[(i)-t]}" ]] || [[ -n "${opthash[(i)--test]}" ]]; then
        local act='print "mv $x $_\n"'
    fi

    rescmd='chomp; $x = $_; '$1'; '$act' if $_ ne $x'  # perlで実行。 正規表現で名前が変わらないやつはスキップ
    ls | perl -ne $rescmd
}
```

# 課題・今後の展望
- 正規表現を引数として渡すことを想定しているが、実際にはなんでも動くので危ない
- 正規表現を明示的に指定するオプションをつけてあげたい (現在は登録されていない引数の内一番最初に出てくるやつ)
- ファイル(or ディレクトリ)だけリネームするようなオプションが欲しい
- リネーム対象を変更するオプションが欲しい (現在はカレントディレクトリ内のすべて)

下2つは`ls`の部分をちょこちょこっと変えればできるけど面倒なのでだれかやってくれないかな。。。

# おまけ: ワンライナー版
zshのコマンド定義するとか面倒で今だけやりたいって人向け。
`-t`や`-v`のオプションはなくなるけどコピペで今すぐ動く。

``` zsh
ls | perl -ne 'chomp; $x = $_; s/これを/これに置換する/g; `mv "$x" "$_"` if $_ ne $x'
```

# 参考文献
- [zshで簡単にコマンドライン オプションを解析する](https://qiita.com/mollifier/items/eba71bc33bb7e3b76233)
- [zshmodules(1) - Linux man page](https://linux.die.net/man/1/zshmodules#zparseopts) (zparseoptsの説明)
Macでrbenv導入

# rbenvインストール
詳細は[公式のREADME](https://github.com/rbenv/rbenv)を参照

## インストール
```bash
$ brew install rbenv ruby-build

# 確認
$ rbenv -v
rbenv 1.1.2
```
## シェルにrbenvを設定
```bash
$ rbenv init
# Load rbenv automatically by appending
# the following to ~/.zshrc:

eval "$(rbenv init -)"
```
ここで指示された通り ~/.zshrc に eval "$(rbenv init -)" を追記する

## 変更内容を反映
ターミナルウィンドウを閉じて新しいウィンドウを開くと、変更内容が有効になります。

## rbenvの設定確認
rbenv-doctorスクリプトを使用して、rbenvが正しく設定されていることを確認します。

```bash
% curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-doctor | bash
Checking for `rbenv' in PATH: /usr/local/bin/rbenv
Checking for rbenv shims in PATH: OK
Checking `rbenv install' support: /usr/local/bin/rbenv-install (ruby-build 20190423)
Counting installed Ruby versions: none
  There aren't any Ruby versions installed under `/Users/naoki/.rbenv/versions'.
  You can install Ruby versions like so: rbenv install 2.2.4
Checking RubyGems settings: OK
Auditing installed plugins: OK
```

# 最新のRubyバージョンを使用するには
```bash
$ brew upgrade rbenv ruby-build

# すでに最新化されている場合は以下のようなエラーが出力される
Error: rbenv 1.1.2 already installed
Error: ruby-build 20190423 already installed
```
ルーター（1812j）1台のみでvlan間ルーティングできないときに確認したこと

# 使用機器、環境など

ホスト1：windows
ホスト2：windows

ホスト１（192.168.2.212）とホスト２（192.168.4.234）間でvlan間ルーティングされる
ように設定してあるがなぜかできない。


# pingがデフォルトゲートウェイに通るか確認

```
Router#ping 192.168.2.254
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.2.254, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/1 ms
```

**〇**

ホスト2のデフォルトゲートウェイも同じように確認

# インタフェースがupしているか確認
```
Router#show ip interface brief
Interface                  IP-Address      OK? Method Status                Protocol
------------------------------------略---------------------------------------------
FastEthernet3              unassigned      YES unset  up                    up                                                                                                               
FastEthernet4              unassigned      YES unset  up                    up

```

**〇**
※使用するインターフェースを確認

# メトリックを確認
※Windowsの確認方法を記載

```
C:\Users\test>route print
------------------------------------略---------------------------------------------
IPv4 ルート テーブル
===========================================================================
アクティブ ルート:
ネットワーク宛先        ネットマスク          ゲートウェイ       インターフェイス  メトリック
          0.0.0.0          0.0.0.0      192.168.10.1      192.168.10.22     55
          0.0.0.0          0.0.0.0    192.168.2.254    192.168.2.212    291
------------------------------------略---------------------------------------------
```

宛先１（192.168.10.22）が優先されてしまっているので、
宛先２（192.168.2.212）を優先させるように設定を変更する。

## メトリックの変更

1. 「コントロール パネル\ネットワークとインターネット\ネットワーク接続」
から該当するネットワークアダプタのプロパティをクリック

1. 「インターネットプロトコル バージョン 4」をダブルクリック

1. 「詳細設定」をクリック

1. インターフェースメトリックの値とデフォルトゲートウェイのメトリックの値を変更
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
よくわからないが、
インタフェースメトリックの値 + デフォルトゲートウェイの値
= route printで表示されるメトリックの値となる
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

## 再びメトリックを確認

```
C:\Users\test>route print
------------------------------------略---------------------------------------------
IPv4 ルート テーブル
===========================================================================
アクティブ ルート:
ネットワーク宛先        ネットマスク          ゲートウェイ       インターフェイス  メトリック
          0.0.0.0          0.0.0.0      192.168.10.1      192.168.10.22     55
          0.0.0.0          0.0.0.0    192.168.2.254    192.168.2.212    2
------------------------------------略---------------------------------------------
```

## vlan間ルーティングできるか確認

```
C:\Users\test>ping 192.168.4.234

192.168.4.234 に ping を送信しています 32 バイトのデータ:
192.168.4.234 からの応答: バイト数 =32 時間 <1ms TTL=127
192.168.4.234 からの応答: バイト数 =32 時間 <1ms TTL=127
192.168.4.234 からの応答: バイト数 =32 時間 <1ms TTL=127
192.168.4.234 からの応答: バイト数 =32 時間 <1ms TTL=127

192.168.4.234 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 0ms、最大 = 0ms、平均 = 0ms
```

**OK**

## 追記　2019/5/4

基本的にはデフォルトゲートウェイを2つ設定しない、もしくは2つのデフォルトゲートウェイが同じように機能するように
設定するそうです。
ですので、今回のような事象は私の環境独自の問題だと考えられます。

参考： [Windows OSのデフォルトゲートウェイは1つのみ有効](https://www.atmarkit.co.jp/ait/articles/0212/14/news002.html)
Gatsby の使い方

Gatsby のインストールから起動までです。
次のページとほぼ同じです。
[Quick Start](https://www.gatsbyjs.org/docs/quick-start)

1) インストール
私は、Arch Linux を使っているので次のようにしました。

```bash
yay nodejs-gatsby-cli
```

インストールが完了したらバージョンの確認

```text
$ gatsby --version
2.5.9
```

2) 新しいサイトの構築

```bash
gatsby new gatsby-site
```

3) 作業フォルダーの変更

```bash
cd gatsby-site
```

4) サーバーの起動
VPS で起動したので、外部からアクセスするようにします。

```bash
gatsby develop -H 0.0.0.0
```

5) http://hostname:8000 にアクセス
![gatsby_may0101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/ae1167c0-7aa4-0f83-8183-4f3d832802e6.png)

6) http://hostname:8000/___graphql にアクセス
![gatsby_may0102.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/1d1b4942-44d3-b50e-ad4d-4e1c1201d758.png)

7) src/pages/index.js を改造してみます。

```js:src/pages/index.js
import React from "react"
import { Link } from "gatsby"

import Layout from "../components/layout"
import Image from "../components/image"
import SEO from "../components/seo"

const IndexPage = () => (
  <Layout>
    <SEO title="ホーム" keywords={[`gatsby`, `application`, `react`]} />
    <h1>皆さん　こんにちは</h1>
    <p>新しいガッツビイのサイトへようこそ。</p>
    <p>さて、何かすばらしいものを作りましょう。</p>
    <div style={{ maxWidth: `300px`, marginBottom: `1.45rem` }}>
      <Image />
    </div>
    <Link to="/page-2/">Go to page 2</Link>
  </Layout>
)

export default IndexPage
```

>ブラウザーでアクセスして変更が反映されることを確認します。
![gatsby_may0401.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/dbf5d6a3-3612-171a-eac4-216642eced25.png)


8) 本番用のビルド

```bash
gatsby build
```

9) 本番用のサーバーの起動

```bash
gatsby serve -H 0.0.0.0
```

10) ブラウザーで、http://hostname:9000 にアクセス

>ポートが 9000 になります。
ジャンプする時colliderがはまらない＆Animationは重力に影響されない時の解決法

##　はまらないという状況は？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403926/315ed6cd-1287-23f0-4131-9cdda1c15e35.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403926/c991aadf-f5a9-8c8a-5f52-c9ca62d43c9b.png)
見てるとおり、YUKOちゃんがジャンプする時、体にあるコライダーがずれました。



##　なぜコライダーははまらない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403926/93f408bb-9203-e83f-c694-452053d6b082.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403926/628ba39c-af6d-7555-7909-4e288e1f3e6b.png)
原因は上の二つのパラメータ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403926/25cc4e94-6610-bc31-71d7-b38a5e902911.png)
キャラモデルは一つのemptyObjectと複数の子物体に構成されています。
Apply Root Motionにチャックを入れると、子物体のモーションが親物体のtransformを影響できます。
Bake into pose　にチャックを入れると、モーションは子物体しか影響できなくて、親物体の位置、回転などは変化しません。入れないと親の属性も影響されます。

一般的にはBake into poseにチェックを入れたまま、コードで物体を操作するが、ジャンプする場合は入れると親についてるコライダーも移動しない故、ずれが生じる。

**つまり正解はApply Root Motionにチェックを入れて、Y軸のBake into poseにチェックを入れない**

AnimationTabとrootMotationについて詳しいことは公式ドキュメンテーションで確認：
https://docs.unity3d.com/Manual/RootMotion.html
https://docs.unity3d.com/Manual/class-AnimationClip.html

**でも、問題は完全に解決されていない！**

##　Bake into poseに入れると、重力に影響されない！？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403926/a72d2b3b-0685-f924-b4bc-0d3f1fde094e.png)
↑↑↑↑↑アニメーションが完了しても、YUKOちゃんは空中に浮かんだままです。

その原因は**Bake into poseにチェックを入れると、アニメーションはObjectのTreansformを支配する**

影響力の高さ：
Animator > Update Method = Animate Physics

解決策：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403926/3ff79462-0aac-b6d9-2668-b718137efbd0.png)
Curvesにこういうものを入れましょう。
こうすると、アニメーションも重力に影響されるようになりました！
Railsで「いいね」機能を実装

GWに入ってからRailsで新しくアプリを作ってます。
今回は「いいね」機能を実装するにあたって自分の中できちんと整理すべくメモ。

# 参考にした記事
今回も沢山の方々の記事を参考にさせていただきました。ありがとうございます。
[【Rails】Twitterのいいね機能を非同期で実装する方法【Ajax】](https://qiita.com/mikan3rd/items/21d716026b51331e53a1)
[Railsで remote: true と js.erbを使って簡単にAjax(非同期通信)を実装しよう！(いいね機能のデモ付)](https://qiita.com/__tambo__/items/45211df065e0c037d032)
[[Rails]いいね機能の非同期での実装!!!](https://qiita.com/hayabusa3703/items/2b916e652a1dc85bb6e3)

# Likeモデル
今作っているのはユーザー（User）が食べ物（Food）に「いいね」できるという機能をつける、ということで両者を紐付ける役割としてLikeモデルを作ります。

```
rails g model like user_id:integer food_id:integer
```

UserとLikeは1対多、FoodとLikeも1対多なので、

```app/model/user.rb
has_many :likes
```

```app/model/food.rb
has_many :likes
```

```app/model/like.rb
belongs_to :user
belongs_to :food
```

とします。

# ルーティング
config/routes.rbに下記のように追記します。

```config/routes.rb
post "likes/:food_id/create", to: "likes#create", constraints: {food_id: /\d+/}, as: :likes_create
post "likes/:food_id/delete", to: "likes#delete", constraints: {food_id: /\d+/}, as: :likes_delete
```

# コントローラー
コントローラーも作成します。

```
rails g controller likes
```

設定したルーティングで呼び出すアクションをapp/controllers/likes_controller.rbに書きます。

```app/controllers/likes_controller.rb
def create
  @like = Like.new(user_id: @current_user.id, food_id: params[:food_id])
  @like.save
  @food = Food.find_by(id: @like.food_id)
  @like_count = Like.where(food_id: params[:food_id]).count
end

def delete
  @like = Like.find_by(user_id: @current_user.id, food_id: params[:food_id])
  @food = Food.find_by(id: @like.food_id)
  @like.destroy
  @like_count = Like.where(food_id: params[:food_id]).count
end
```

また、カウントの数字を表示するための一文をボタンを設置するビューのファイルにも書いておきます。

```ruby
@like_count = Like.where(food_id: params[:food_id]).count
```

# 部分テンプレート
今回は「いいね」ボタンを表示する部分テンプレートを作成して、ボタンを設置したいところに挿入するという形を取りました。
部分テンプレートのファイル名は_（アンダーバー）で始める必要があります。

```ruby:app/views/likes/_like.html.erb
<div class="like_button_on">
	<%= link_to "いいね済み", likes_delete_path(food_id: @food.id), {method: "post", remote: true} %>
	<%= @like_count %>
</div>
<div class="like_button">
	<%= link_to "いいね", likes_create_path(food_id: @food.id), {method: "post", remote: true} %>
	<%= @like_count %>
</div>
```

「remote: true」とすることでjs形式で送ることができます。これにより次に書く非同期での処理ができるようになります。

# 非同期処理
「いいね」ボタンを押すとボタンの色が変わり、カウントの数字も変わる仕様にするための処理を書いていきます。

```ruby:app/views/likes/create.js.erb
$('.buttons_<%= @food.id %>').html("<%= j(render partial: 'likes/like' ) %>");
```

```ruby:app/views/likes/delete.js.erb
$('.buttons_<%= @food.id %>').html("<%= j(render partial: 'likes/like' ) %>");
```

コントローラーで指定したアクションと同じ名前で.js.erbファイルを作ります。
こうすることでアクションが実行されるとこちらのファイルを読み込み、ボタンを押した箇所が再びレンダリングされます。

# 部分テンプレートの挿入
あとはボタンを設置したいところに、

```ruby
<div class="buttons_<%= @food.id %>"><%= render partial: 'likes/like' %></div>
```

と書けばOKです。
ボタンを押すと「いいね」の作成・削除が行われ、その都度指定したdivの中身が書き換えられます。

# CSS

```css
.like_button{
	background-color: #BDBDBD;
}

.like_button_on{
	background-color: #FE2E2E;
}
```

と指定してあげると押すたびにボタンの色が灰色⇔赤色と変わります。色はお好みでどうぞ。

# 最後に
実際に作ってみるまで部分テンプレートの使い方や仕組み等を全然理解できていませんでしたが、ほんの少しだけ理解が深まったような気がします。
まだまだ理解できていないことが多いので、今後も手を動かしながら実践していきたいと思います。
毎度のことながら、間違っている箇所等あればご指摘いただければ幸いです。
TemplateDoesNotExist  の対処法について

Djangoの最初の方で、つまずいたところを初心者向きに紹介します。

<h5>version</h5>
python 3.7.3
Django 2.1


views.pyで外部のテキストを読み込もうとした際にエラーが起きました。
<img width="376" alt="スクリーンショット 2019-05-01 19.42.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408781/2efcb764-50a4-6fb5-42d0-fe3eae69ce84.png">


<img width="886" alt="スクリーンショット 2019-05-01 18.40.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408781/604f77b6-2c4f-d3ce-f713-220bd130b7fe.png">

サーバーを起動した際にブラウザにこんなエラーが出てしまいました
テキストファイルが読み込めませんと書かれています。
エラーの解決策を調べていくと、以下の２つのうちどちらかだと書いてありました。

①ファイルが正常に読み込めていない
②ファイルが存在しない

自分の場合は②をしっかり確認し、誤字なども見つからなかったため①の解決策を調べました。
無事解決出来たので、流れを説明します。

<h4>1　プロジェクトフォルダの直下にある、settings.pyを開く</h4>
<h4>２　５５〜行目ぐらいにあるこの部分の、’DIRS’が空欄になっていることを確認する
<img width="583" alt="スクリーンショット 2019-05-01 19.58.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408781/697c2e74-188f-8345-1207-93d4f82d15b5.png">
<h4>3　’DIRS’の部分にos.path.join('アプリケーションフォルダ名','文章が書いてあるフォルダ名')を入れる</h4>
<img width="583" alt="スクリーンショット 2019-05-01 20.05.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408781/b1b4682f-3500-6039-9561-81fdaaa8398d.png">

以上を踏まえて実行した結果、ブラウザに表示されました。
Node.js で令和元年 (full-icu + toLocaleDateString)。

Node.js はデフォルトでは日本語関連の ICU データを持っていないので、別途インストールする必要があります。

```console
> npm i full-icu
```

で、これを指定して実行してあげましょう。

```console
> node -v
v12.1.0
> node --icu-data-dir=node_modules/full-icu -p "new Date().toLocaleDateString('ja-JP-u-ca-japanese', { era: 'long' })"
令和元年5月1日
```
WebSphere LibertyでHTTPSを有効化する

# やりたいこと
自作のWebアプリケーションをGoogleの[Lighthouse](https://developers.google.com/web/tools/lighthouse/?hl=ja)にかけてみようと思ったらHTTPS化することが必須のようだったので、LibertyでHTTPSを使う方法を試してみた。

# SANが必要
自己署名証明書を利用してHTTPS通信をすれば良いので難しくないと思ったのだが、昔はCommon Name(CN)が設定されていればOKだったが、Chrome 58以降は証明書にSubject Alternative Name(SAN)が登録されていることを要求するため、SANを含む証明書を作る必要がある。
![スクリーンショット 2019-05-01 17.56.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376039/d5b35c46-7333-5eda-3730-4d989fbec008.png)


# 試した環境
- AdoptOpenJDK HotSpot 11.0.3
- WebSphere Liberty 19.0.0.4
- macOS Mojave
- Chrome 74

# デフォルトで生成される証明書はどうなってる？
ssl-1.0またはtransportSecurity-1.0フィーチャーを有効化したWebSphere Libertyを起動すると`user/servers/(server-name)/resources/security`に`key.p12`というファイルが生成される。このファイルはPKCS12という形式のファイルで中に秘密鍵と公開鍵証明書が保存されている。ファイルにはパスワードがかかっていて`server.xml`の`<keyStore>`要素でパスワードを指定する。

内容の確認方法は以下の通り(パスワードは`<keyStore>`で指定したもの)。default という別名(alias)で証明書が登録されていることがわかる。パスワードを聞かれたくない場合は、`-storepass`で入力する。

```bash
keytool -v -list -storetype pkcs12　-keystore key.p12　
```

# SAN付き証明書の作成手順
秘密鍵を入手してそこからSAN付きの証明書を作っていく。秘密鍵はデフォルトで生成されるp12ファイルから取り出すこともできるようだが(後述)、ここではゼロから作ってみる。iTerm.appだとopensslコマンドの実行時にパスワードを求められた場合のキーボード入力がうまくいかないのでTerminal.appを使った。

```bash
# 秘密鍵を作成する
openssl genrsa 2048 > default.key

# Certificate Signing Request(CSR, 証明書署名要求)を作成する
# Country Nameなどを聞かれる。最低限Common Name(CN)はlocalhostとする必要がある
openssl req -new -key default.key > default.csr

# SANがlocalhostとなるように入力ファイルを作成する
echo subjectAltName=DNS:localhost > default-san.ext

# 証明書を作成する
openssl x509 -days 3650 -sha256 -req -signkey default.key < default.csr > default.crt -extfile default-san.ext

# PKCS12形式の鍵ストアを作成する
openssl pkcs12 -export -in default.crt -inkey default.key -out default.p12 -name default

# 作成したp12ファイル内の証明書にSubjectAlternativeNameが記載されていることを確認する
keytool -v -list -keystore default.p12 -storetype pkcs12
```

# Macのキーチェーンに証明書を登録する
キーチェーンアクセス.appを起動して、左ペインから「ログイン」、「証明書」を開く。右のペインに証明書の一覧が表示されるのでここに上記の手順で作成したdefault.crtをドラッグ＆ドロップで追加する。追加したらSSLの部分を「常に信頼する」に変更する。

![スクリーンショット 2019-05-01 17.58.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376039/410cd297-945b-df01-ce32-582c7e51586b.png)


Chromeでアクセスし直すと、自己署名証明書利用時の警告メッセージなくアクセスできる。
![スクリーンショット 2019-05-01 19.36.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376039/b4e6fe12-44f8-3c2b-7336-eb7284de94fa.png)

# 参考
## p12ファイルからの秘密鍵、証明書の取り出し方

以下のコマンドで取り出せる。前述の通りiTerm.appだとパスワード入力がうまくいかないのでTerminal.appを使った。

```bash
# 秘密鍵を取り出す
openssl pkcs12 -in key.p12 -nocerts -nodes -out privatekey
# 証明書を取り出す
openssl pkcs12 -in key.p12 -clcerts -nokeys -out default2.crt
```

## p12かjksか
昔はp12ではなくjks形式だった気がすると思ってOpenLibertyのIssueをのぞいてみたところ19.0.0.3から変わったのかもしれない。一般的にp12が推奨されているっぽい。
- https://github.com/OpenLiberty/open-liberty/issues/7041
Ruby on Railsの学習方法【GW連投企画】

# 前提条件
Ruby on Rails自体は何らかのウェブフレームワーク経験者からすると、
実は比較的扱うのが簡単な方なんですが、入門の方がいきなり挑むと覚えることが多いので
挫折する可能性が高いです。

挑戦する前に先に以下をDotInstallさん等で個別に予習しましょう
- html
- css
- java scripts
- database

# RailsじゃなくてSinatraから
時間のゆとりがあれば、さらにRailsよりシンプルなSinatraから入ると、
Railsのフォルダ・ファイルが多くてドン引きするということがないと思います。

[Rails入門：基礎をSinatraで理解しRailsで作れるようになる](https://www.udemy.com/sinatra_rails/)

# Rails Tutorial
間違いなく世界一有名なチュートリアルの[Ruby on Rails チュートリアル：実例を使って Rails を学ぼう](https://railstutorial.jp/)ですが、
もの凄いボリュームなので最初は避けましょう。Railsで簡単な掲示板やblogアプリとかを作れるようになってから挑みましょう。

# 進め方
[【3日でできる】はじめての Ruby on Rails 4 入門（Rubyから学べる）](https://www.udemy.com/5daysrails/)
Rails 4なので、少し古いのですが、これだけでウェブフレームワークやRailsがどういうものかを把握する事ができるので入門に最適です。

[はじめての「Ruby on Rails」5 (I・O BOOKS) ](https://www.amazon.co.jp/gp/product/4777519783/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1)
上記より発展したお弁当屋さんのアプリを作成します。大きくはないので入門の際の基礎固めとして丁度良いです。


[プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AERuby%E5%85%A5%E9%96%80-%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%83%BB%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E6%8A%80%E6%B3%95%E3%81%BE%E3%81%A7-Software-Design-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4774193976/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=ruby+on+rails&qid=1556706706&s=gateway&sr=8-2)
このあたりでRailsがどういうのかがわかったという前提で、詳しい文法の学習を行いましょう。

[現場で使える Ruby on Rails 5速習実践ガイド](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-Ruby-Rails-5%E9%80%9F%E7%BF%92%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E5%A4%A7%E5%A0%B4%E5%AF%A7%E5%AD%90/dp/4839962227/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=ruby+on+rails&qid=1556706706&s=gateway&sr=8-1)
今まで紹介してきた書籍より、グッとボリュームが増え本格的な内容になります。

[Ruby on Rails 5の上手な使い方 現場のエンジニアが教えるRailsアプリケーション開発の実践手法](https://www.amazon.co.jp/Rails-5%E3%81%AE%E4%B8%8A%E6%89%8B%E3%81%AA%E4%BD%BF%E3%81%84%E6%96%B9-%E7%8F%BE%E5%A0%B4%E3%81%AE%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%8C%E6%95%99%E3%81%88%E3%82%8BRails%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA%E3%81%AE%E5%AE%9F%E8%B7%B5%E6%89%8B%E6%B3%95-Engineers-Books/dp/4798153095/ref=sr_1_9?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=ruby+on+rails&qid=1556706706&s=gateway&sr=8-9)
特に運用面での手法等の高度な内容を学習できます。

[Professional Ruby on Rails Developer with Rails 5](https://www.udemy.com/pro-ruby-on-rails-rails5/)
20時間超えの大きな動画学習コース且つ、英語なので敷居は高いのですがものすごくレベルアップできると思います。

# 環境構築
Windowsの場合、RailsInstallerは古いことがあるので、RubyInstallerが無難です。
Cloud9にHomebrewをインストールする手順

Macにパッケージをインストールする時に使うHomebrewですが、2019/2/2のリリース(v2.0.0)で、Linuxbrewを統合し、これによりLinux上でもサポートされるようになっていました。
> Homebrew officially supports Linux and Windows 10 with Windows Subsystem for Linux (WSL). Homebrew on Linux was previously called “Linuxbrew”. You can install it in your home directory, so it does not require sudo, and use it to install software that your host distribution’s package manager does not provide. Homebrew on Linux uses its own repository for formulae: Homebrew/linuxbrew-core
引用: https://brew.sh/2019/02/02/homebrew-2.0.0/

さて、2019年4月にAWS東京リージョンに対応した「Cloud9」でHomebrewが使えると、[Terraformの準備](https://qiita.com/nasuvitz/items/ed2130fbea832d3e02b9)等が格段に楽になるだろうと思います。そこで、Cloud9にHomebrewをインストールして使えるようにするまでの手順を整理してみました。

# 1. Homebrewをインストール
コマンド1発です。rootではないユーザで実行します。

```bash
$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"
```

# 2. HomebrewにPATHを通す
1を実行すると、Terminalの最後に、PATHが通っていないと警告が表示されます。
そこで、以下コマンドを順に実行してPATHを通します。

```bash
$ test -d ~/.linuxbrew && PATH="$HOME/.linuxbrew/bin:$HOME/.linuxbrew/sbin:$PATH"
$ test -d /home/linuxbrew/.linuxbrew && PATH="/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin:$PATH"
$ test -r ~/.bash_profile && echo "export PATH='$(brew --prefix)/bin:$(brew --prefix)/sbin'":'"$PATH"' >>~/.bash_profile
$ echo "export PATH='$(brew --prefix)/bin:$(brew --prefix)/sbin'":'"$PATH"' >>~/.profile
```

# 3. 動作確認
新たにTerminalを開いて確認します。

```bash
$ brew
Example usage:
  brew search [TEXT|/REGEX/]
  brew info [FORMULA...]
  brew install FORMULA...
  brew update
  brew upgrade [FORMULA...]
  brew uninstall FORMULA...
  brew list [FORMULA...]

Troubleshooting:
  brew config
  brew doctor
  brew install --verbose --debug FORMULA

Contributing:
  brew create [URL [--no-fetch]]
  brew edit [FORMULA...]

Further help:
  brew commands
  brew help [COMMAND]
  man brew
  https://docs.brew.sh
```

簡単な手順でCloud9でもHomebrewを実行できるようになりました。
JAVAについて知っているとよいことかどうかわからない11項目

JAVAについての相談は、1995年頃から約24年間、定常的にいただいている。
2001年頃までは、JAVAのプログラミング研修を6年ほど実施していた。

当時の経験からすれば、現状のよくわからない情報は、当初のよくわからない情報と同じで、たいした違いは感じていない。

 
 <この項は書きかけです。順次追記します。>


# ポインタ不要
JAVAの一番の画期的なところは、C言語の記述で一番難しいポインタ処理を排除したことである。
この点以外に、C++に対する優位点は、その後の様々な改良の成果だと理解している。
当初設計でC/C++に対する優位性は、C言語のように書けるが、ポインタ処理をしなくても必要な機能を実現できることだ。

#文字コード対応
JAVAは当初から国際対応していて文字コード対応が万全だと言う方がいた。

日本語の表現は、１バイト２バイト混在のデータを文字コードを切り替えて表現する。
画面で左から右に表示している時に、右端から逆に辿ると、現在位置の文字コードはわからない。

この状態を回避するには、いくつか方法がある。
JAVAのシステムで文字コード対応がそれなりに安定したのは１−２年経過してからのような気がする。
これは、気がするだけである。
実際にどうだったかは、過去の資料を紐解いてみる。

# 画面周りの変更

描画用の仕組みは、当初からすこしづつ改定されている。

1.1 におけるAWT 、1.2におけるSwing など、目まぐるしく変化した。
画面は、さまざまな道具類の設計の変更により、どのような構造が適しているか変化していくものだという理解をしている。


# Visual J++
MicrosoftがVisual J++を発表した時には、すぐにセミナを開催した。
Visual J++のよいところは、GUIで記述したソースコードを生成するところだったと思う。
逆に、使うのをやめることにしたのは、生成したコードが読みにくいことだった。

ちょうど、C++がで始めた頃、C++のソースコードをCのコードに変換するプリプロセッサ(C Pre ProcessorでCPPという）を購入したことがある。使うのをやめたのは、マイクロソフト、ボーランンドから高速なC++が発売されたことと、生成されたCソースコードが読みにくいことだった。


# 国際規格投票でアメリカが反対

JAVAを国際規格になれば、write once move anywaereが実現できるはずだった。

アメリカがSUNのライセンスに対する不透明さから国際規格に反対投票し、結果としてJAVAの国際規格が否決された。
当時、別の国際規格のeditorをしていた。
ニュースを聞いて小踊りした。

本当にWrite Once move anywareなら、国際規格に誰も反対しない。
どこでも動くような状況を作るために、JAVAの技術者は、いろいろなCPUにVMを作られ、すごく努力された。
SUNが公開でこれらの努力にもっと経緯を払っていれば、アメリカが反対したとしても、圧倒的多数で国際規格になったはずである。

JAVAの閉鎖性は当初から、一貫して見え隠れしている。


# DBミドルウェア
JAVAプログラミング教育をしていて、
JAVAが一定の規模で利用されるようになり、一番大きな分野がネットワークを介したDB利用であった。

しかし、DBのミドルウェアは高価なものが次々に出てきて、
当方が教育から撤退したのは、有償のミドルウェアが購入できないため。

DBまわりの発展が、一時的とはいえ、高価な道具類を使わないと仕事にならなかったのは残念だった。

これ以降、JAVAの教育から撤退している。
それまでとは、JAVAに関して積極的に情報取得、情報発信は半分以下になった。

# Vertical Machineの淘汰
いろいろなVertical Machineが増えた。
小ささ、高速さをうたうものもあった。

Vertial Machineの興隆を計ってこそJAVAの発展が望めたはずである。

MacintoshでJAVAのVMを同梱しなくなった時点で、JAVAの理想が終わったと思った。


# C#の登場
C#は、Windows処理ではJAVAよりも便利な記述ができるところを売りにしていたのだろうか。

標準化も、ECMA, JISと順調に進んでいった。

Windows以外のOSへの展開に時間がかかっていて、当方が積極的に参入することができなかった。

CLIであるmonoの導入など、進捗を知るためにも何度か挑戦をしようとした。

# JavaからCOBOLへの移行

COBOLからJAVAへの移行案件は、何度か小耳にはさんだ。
半分くらいはJAVAに移行したらしい。残りはまたCOBOLに戻ったと聞いている。

そこで、JAVAで書いたプログラムをCOBOLに移行する方法を検討する。

COBOLはもともとオブジェクト指向言語であり、英語そのままでプログラムが動く。




# Open JDK
http://openjdk.java.net

# Oracle JDK 8 の公開アップデート終了
https://www.oracle.com/technetwork/jp/java/javase/overview/index.html
>オラクルは2019年1月を最後に、公開されたダウンロードサイトにおける商用利用向けのJava SE 8アップデートリリースを終了します。Java SE 8やそれ以前のバージョンに対する、バグ修正やセキュリティ修正などメンテナンスされたアップデートリリースが引き続き今後も必要な場合、Oracle Java SE Subscription または Oracle Java SE Desktop Subscriptionで提供される長期サポートで入手・利用が可能となります。Oracle JDK 8 の長期サポートに関するより詳しい情報は、Java SE サポート・ロードマップをご確認ください。
 

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
インデントをつける

```MainActivity.kt
        textView = findViewById<WrapTextView>(R.id.textView)
        val text = "あいうえお　かきくけこ　さし\nすせそ　たちつてと　なにぬねの　はひふへほ　まみ\nむめも　やいゆえよ　ら\n\nりるれろ　わいうえを　ん　あいうえお　\nかきくけこ　さしすせそ　たちつてと　なにぬねの　はひふへほ　まみむめも　やいゆえよ　らりるれろ　わいうえを　ん　あいうえお　かきくけこ　さしすせそ　たちつてと　なにぬねの　はひふへほ　まみむめも　やいゆえよ　らりるれろ　わいうえを　ん　あいうえお　かきくけこ　さしすせそ　たちつてと　なにぬねの　はひふへほ　まみむめも　やいゆえよ　らりるれろ　わいうえを　ん　あいうえお　かきくけこ　さしすせそ　たちつてと　なにぬねの　はひふへほ　まみむめも　やいゆえよ　らりるれろ　わいうえを　ん　あいうえお　かきくけこ　さしすせそ　たちつてと　なにぬねの　はひふへほ　まみむめも　やいゆえよ　らりるれろ　わいうえを　ん"
        val textList = text.split("\n\n")
        val spannableStringBuilder = SpannableStringBuilder()
        textList.forEachIndexed { indexed, text ->
            val spannableString = SpannableString(text).apply { setSpan(BulletSpan(), 0, text.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) }
            spannableStringBuilder.append(spannableString)
            if (indexed < textList.size - 1) spannableStringBuilder.append("\n")
        }
        textView?.text = spannableStringBuilder
```

![Screenshot_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104812/89d7eeb9-6ee7-44ad-012b-2fc00da665ba.png)
randomモジュールについてまとめる

#はじめに
標準ライブラリであるrandomモジュールを使うことが多いのですが, 生成する乱数が整数や小数の場合で使い分けする必要があるのでまとめてみることにしました. 

#乱数生成
|関数|使い方|
|:--:|:--:|
|random()|0.0以上1.0未満の浮動小数点数を生成|
|uniform()|任意の範囲の浮動小数点数を生成|
|randrange()|任意の範囲, ステップの整数を生成|
|randint()|任意の範囲の整数を生成|

###random()
0.0以上1.0未満の浮動小数点数が生成されます. 

```python
print([random.random() for i in range(5)])
#[0.4771975525622725, 0.6876604312377167, 0.6221870340760471, 0.18161004411536352, 0.27937966825312976]
```
###uniform()
引数をa以上b以下に設定すると, その間の浮動小数点数が生成されます.

```python
print([random.uniform(10,50) for i in range(5)])
#[30.755611303844862, 15.487989783227757, 13.013386711111226, 31.356856664548157, 26.50324863369832]
```
引数を同じ値に設定すると, その値が生成されます. 

```python
print([random.uniform(50,50) for i in range(5)])
#[50.0, 50.0, 50.0, 50.0, 50.0]
```
###randrange()
randrange(start, stop, step)は, range(start, stop, step)の要素からランダムな値（整数）を返します. 

```python
print([random.randrange(100,1000,50) for i in range(5)])
#[750, 250, 450, 700, 950]
```
引数のstart, stepを省略するとstart=0, step=1となります. 

```python
print([random.randrange(50) for i in range(5)])
#[45, 22, 6, 37, 19]
```
###randint()
引数をa以上b以下に設定すると, その間の整数が生成されます. 

```python
print([random.randint(10,50) for i in range(5)])
#[23, 50, 41, 31, 26]
```

#要素をランダムに選択
###choice()
choice()は, 引数のシーケンスオブジェクトからランダムに一つの要素を選択します. リストやタプル, 文字列で使用できます. 

```python
test = ['a', 'b', 'c', 'd', 'e']
print(random.choice(test))
#d
```
###sample()
sample()は, 引数のシーケンスオブジェクトからランダムに複数の要素を重複なしで選択します. 

```python
test = ['a', 'b', 'c', 'd', 'e']
print(random.sample(test,3))
#['e', 'c', 'b']
```

###choices()
choices()は, 引数のシーケンスオブジェクトからランダムに複数の要素を重複ありで選択します. 
引数kで取り出す要素数を指定する. デフォルトでは1になっています. 

```python
test = ['a', 'b', 'c', 'd', 'e']
print(random.choices(test,k=3))
#['a', 'e', 'e']
```

#ランダムにシャッフル
rand.shuffle()は引数のシーケンス型オブジェクトの要素をランダムにシャッフルします. 
戻り値はなく, オブジェクト自体をシャッフルします. 

```python
test = ['a', 'b', 'c', 'd', 'e']
random.shuffle(test)
print(test)
#['a', 'e', 'b', 'd', 'c']
```

#参考サイト
[【Python入門】randomモジュールの使い方まとめ](https://www.sejuku.net/blog/20915#randomchoicea)
[Pythonでランダムな小数・整数を生成するrandom, randrange, randintなど](https://note.nkmk.me/python-random-randrange-randint/)
便利ページ：元号を変換してみた

前回、なにかと便利なページを作成しました。

　[便利ページ：Javascriptでちょっとした便利な機能を作ってみた](https://qiita.com/poruruba/items/6c67c7eef34ed302feb3)
　[便利ページ：自分のQiita記事を一覧表示](https://qiita.com/poruruba/items/f68455b2d937d2f052f4)

今回は元号(和暦)を西暦に変換するページを追加しました。

元号は以下のWikiを参考にしています。
　https://ja.wikipedia.org/wiki/%E5%85%83%E5%8F%B7%E4%B8%80%E8%A6%A7_(%E6%97%A5%E6%9C%AC)

毎度の通り、デモページとGitHubです。

GitHub
　https://github.com/poruruba/utilities

デモページ
　https://poruruba.github.io/utilities/

# 元号一覧

このデータを作るのがすごくつらかったです。
こんな感じの元号データのjavascriptファイルです。
大化の改新から始まって、現在元年の令和までです。

```js:gengou.js

const gengou_list = [
    {"name":"大化","yomi":"たいか","start":645,"end":650,"extra":""},
    {"name":"白雉","yomi":"はくち","start":650,"end":654,"extra":""},

・・・

    {"name":"昭和","yomi":"しょうわ","start":1926,"end":1989,"extra":""},
    {"name":"平成","yomi":"へいせい","start":1989,"end":2019,"extra":""},
    {"name":"令和","yomi":"れいわ","start":2019,"extra":""},
];
```

# 変換ロジックを作成する

あとは、和暦から西暦、西暦から和暦に変換するスクリプトを書いていきます。
元号一覧から対象元号を検索します。

```js:start.js
        /* 元号 */
        gengou_search_era: function(era){
            for( var i = 0 ; i < this.gengou_list.length ; i++ ){
                if( this.gengou_list[i].name == era )
                    return this.gengou_list[i];
            }

            return null;
        },
        gengou_search_anno: function(anno){
            for( var i = 0 ; i < this.gengou_list.length ; i++ ){
                if( this.gengou_list[i].start <= anno && (this.gengou_list[i].end ? anno <= this.gengou_list[i].end : true ))
                    return this.gengou_list[i];
            }

            return null;
        },
        gengou_to_anno: function(){
            var era_name = (this.gengou_era_name == 'その他') ? this.gengou_era_other : this.gengou_era_name;
            var gengou = this.gengou_search_era(era_name);
            if( !gengou ){
                alert('入力が不正です。');
                return;
            }
        
            var year = Number(this.gengou_era_year);
            if( year <= 0 ){
                alert('入力が不正です。');
                return;
            }

            var anno_year = gengou.start + year - 1;
            if( gengou.end && anno_year > gengou.end ){
                alert('入力が不正です。');
                return;
            }
            this.gengou_anno_year = anno_year;
        },
        gengou_to_era: function(){
            var year = Number(this.gengou_anno_year);
            var gengou = this.gengou_search_anno(year);
            if( !gengou ){
                alert('入力が不正です。');
                return;
            }

            if( gengou.name == '令和' || gengou.name == '平成' || gengou.name == '昭和' || gengou.name == '大正' || gengou.name == '明治' ){
                this.gengou_era_name = gengou.name;
            }else{
                this.gengou_era_name = 'その他';
                this.gengou_era_other = gengou.name;
            }

            this.gengou_era_year = year - gengou.start + 1;
        },
```

#補足

ちなみに、元号は大化から全部入れているのですが、まあ、あまり使わないでしょう。
もし使う場合の注意点なのですが、途中複数の元号が同時に存在していた時期があるようです(1329年から1394年のあたり)。また、大化の後でも、元号が存在しない時期があるようです(654年、686年)。そういったところは、上記の変換ロジックは不十分です。（困る人はいなそうなので、このままにしています）

以上
インフラの勉強前に押さえておきたい最低限の基礎知識⑤〜ネットワークインターフェース層について〜

##ネットワークインターフェース層とは何か
ハードウェアを制御して、ネットワークのアプリをうまく動作させるための部分です。

####データリンク層・物理層
データリンク層・・・ソフトウェアやプロトコルなど。
物理層・・・ハードウェア

##MACアドレスとは
端末ごとに固有かつ固定の番号

####IPアドレスとMACアドレスの違い
IPアドレス→最終目的地
MACアドレス→次の目的地を示すもの

####プリアンブル
10101010...10101011
10の繰り返しで最後に11が来る、データが送られていることを示す初期信号。

電気信号をハードウェアから読み取らねばならないが、正しい場所から全て読み取らねばならない。

10101011で終わる部分から実際のデータが始まるので、10の最初の部分が消失しても可能となっており、データの転送が行われていることがわかる。

####LANケーブルについて
100BASE-lsという文字が書かれているケーブルがあった場合

100→１００Mbps（最大パケットサイズ）
BASE→ベース変調（信号の変調速度）
ls→光ケーブル（ケーブルの種類）

##L2スイッチ
俗にいうハブ。
ポートに繋がっているそれぞれのMACアドレスを記憶しておき、通信を別々にする。

####ブロードキャスト
ネットワーク内のすべての機器にデータを一斉配信すること。

ブロードキャストに使われる特殊なアドレスをブロードキャストドメインという。
L2スイッチでは、そこに所属する全ての機器がブロードキャストドメインとなる。

##無線LANについて
できることは基本的にL2スイッチと同じです。
正式な規格名はIEEE802.11です。

####周波数の違い
無線LANには2.4GHz帯と5.0GHz帯の二つが用意されている。
Hzは１秒間に何回波ができるのかの単位で、2.4GHzだと１秒間に2.4億回波ができることを示している。

2.4GHz帯・・・遠くまで安定して届けたいときに使用するのに向いた周波数
5.0GHz帯・・・近くで高速に通信するのに向いた周波数。

##ARPとは何か
イーサネットや無線LANで接続された機器のMACアドレスを取得するプロトコルです。

イーサネット・無線LANに対して、接続された機器が要求先のIPを格納した要求パケットをブロードキャストし、要求先のIPにある機器は要求パケットを受け取ると応答パケットを送り返しMACアドレスを知らせます。
SORACOM API　デバイスリストからCSV出力

# デバイスリストを取得
https://dev.soracom.io/jp/docs/api/
Subscriber
　「GET　Subscriber」を選ぶ→Try it Outクリック→Response Bodyをコピー
　　https://konklone.io/json/
　　このサイトにてペースト
　　CSVダウンロード！

#　所管
・ソラコムコンソールからデバイスリストをcsv出力希望。
・DataSpiderのSORACOMアダプタ作ってください！！
chromeのコンソールでパッケージを試す

### はじめに
今回は[deepmerge](https://www.npmjs.com/package/deepmerge)を使う

公式ページからUMDのURLをコピーする

### headにscriptタグを作って追加する関数を定義

```javascript
const _loadScript = function (path) {
  let script = document.createElement('script');
  script.src = path;
  document.head.appendChild(script);
}
```
### 実行

```javascript
_loadScript('https://unpkg.com/deepmerge@3.2.0/dist/umd.js');
```

<img width="620" alt="スクリーンショット 2019-05-01 18.19.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222453/ee952232-5a83-731f-1731-5f51f8b5a966.png">

### できないサイトもある

Githubではできなかった

<img width="620" alt="スクリーンショット 2019-05-01 18.20.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222453/210d7fd7-005d-16c9-7878-dca137f995bf.png">

## 参考記事
[Include JavaScript file in Chrome console
](https://stackoverflow.com/questions/5282228/include-javascript-file-in-chrome-console)
python manage.py runserver で開発環境でのサーバー起動時に出るSyntaxError エラーの対処法

#はじめに
python manage.py runserverコマンドを実行した時によくでる定型のSyntaxError エラーについて解説します。

#開発環境
OS:macOS Mojave(10.14.4)
Django==2.1.7

python manage.py runserverコマンドを実行した時に、以下のエラーが出たことはありませんか。

```python
$ python manage.py runserver
  File "manage.py", line 14
    ) from exc
         ^
SyntaxError: invalid syntax
```
このSyntaxError エラーはpythonのバージョンが2系だった場合に出るエラーになります。Django2系では、Python3系を使う必要があるのですが、python2系と3系をローカルでどちらもインストールしている場合、python３系で参照しているつもりが、python2系に切り替わってしまっている可能性があります。

まずは、以下のコマンドでバージョンを確認します。

```python
$ python --version
Python 2.7.10
```
ここでpythonのバージョンが2系であれば一安心です。後は以下の記事の手順に従って、pythonのバージョンを3系に切り替えた上で再度python manage.py runserverを実行してあげましょう。
[pyenvにより、pythonのバージョンを変更する](https://qiita.com/Kohey222/items/19eb9b3cbcec9b176625)

#参考記事
[HerokuにDjangoのプロジェクトをデプロイした時のエラーのメモ](https://qiita.com/jansnap/items/07a8701100a7a2387d7d)
vagrant sshは、素のsshで接続するより179倍待たされる

VagrantでゲストOSにログインするとき、`vagrant ssh`を使うが、普通に`ssh`するより体感的に遅い。頻繁にゲストOSに出入りするとちょっとストレスフル。

## `vagrant ssh`

```bash
$ time vagrant ssh -c exit
Connection to 127.0.0.1 closed.
vagrant ssh -c exit  1.79s user 0.23s system 75% cpu 2.683 total
```

`vagrant ssh` → 1.79秒かかる。

## 素のssh

素のSSHでゲストOSに入るために、SSH設定をキャッシュを作っておく:

```
vagrant ssh-config > ssh_config.cache
```

```
$ time ssh -F ssh_config.cache マシン名 exit
ssh -F ssh_config.cache linuxenv exit  0.01s user 0.01s system 12% cpu 0.161 total
```

素のSSH → 0.01秒。一瞬で入れる。

## 結論

よくログインするゲストOSはssh_config作っておくと快適。
node.jsでget,postのフォーム通信(express)

var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var ejs = require('ejs');

app.engine('ejs', ejs.renderFile);
app.use(bodyParser.urlencoded({
  extended:true
}));

app.get('/', (req, res) => {
  console.log('--get req--');
  console.log('name:' + req.query.name);
  console.log('age:' + req.query.age);
  res.render('temp.ejs', {});
});

app.post('/', (req, res) => {
  console.log('--post req--');
  console.log('name:' + req.body.name);
  console.log('age:' + req.body.age);
  res.render('temp.ejs', {});
});

var server = app.listen(1234, () => console.log('wakeUp'));
MacOS便利コマンド

キャプチャ：「Command」「Shift」「４」

Finderでのディレクトリ指定：Finderを開いた状態でcommand + Shift + Gを押すとファイルパスを入力するスペースが表示される

スーパーリロード：Cmd + Shift + R

すべてのウインドウを隠す（window＋D）：F11

挑戦したい技術
Phaser
python環境構築メモ

https://a2c.bitbucket.io/flask/installation.html#virtualenv
に書いてあることがうまくできない

https://www.python.org/downloads/
python-3.7.3-macosx10.9.pkg
↑を実行してphthonをインストール


/usr/local/bin
sudo ./pip3.7 install virtualenv
virtualenv env


cd /Users/~~~~~~/Study/myproject
. env/bin/activate
sudo easy_install Flask

あとで読む
https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/sample-python.html
RailsでPostgresqlを使用する

`rails new` したときのデフォルトDBは `sqlite` だけど、実務で使うことはあまりないと思うので`postgresql`に変更する。

### 環境

```
 $ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.2 LTS"
```

### Postgresqlのinstall

こちらを参考にinstallする
https://www.postgresql.org/download/linux/ubuntu/

```
$ sudo emacs /etc/apt/sources.list.d/pgdg.list

# 下記の一文を追加
`deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main`

$ wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
$ sudo apt-get update
$ sudo apt-get install postgresql-10
```

### Postgresqlのアカウントを作成

```
$ sudo -u postgres psql

# <username>、<password> は任意の値を設定する
postgres=# create role <username> with createdb login password '<password>';

# ロールの確認
postgres=# \du
```


### Postgresqlの接続設定を編集

`listen_addresses = '*'` に変更

```:/etc/postgresql/10/main/postgresql.conf
#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------

# - Connection Settings -

listen_addresses = '*'		# what IP address(es) to listen on;
```


### Gemfileの編集

https://rubygems.org/gems/pg

```
gem 'pg'
```

をGemfileに追記して、`bundle install`

※ 下記のようなエラーが出て失敗する場合は、

```
checking for libpq-fe.h... no
Can't find the 'libpq-fe.h header
```

```
$ sudo apt-get install libpq-dev
```

して、`bundle install`

### database.ymlの編集

```yml:config/database.yml
default: &default
  adapter: postgresql
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: <username>  # とりあえずベタで
  password: <password>  # とりあえずベタで
  host: localhost  # とりあえず
  timeout: 5000

development:
  <<: *default
  database: <project_name>_development

test:
  <<: *default
  database: <project_name>_test

production:
  <<: *default
  database: <project_name>
```

### DB作成

```
$ bundle exec rails db:create
Created database '<project_name>_development'
Created database '<project_name>_test'
```

実際にDBの中も確認する

```
$ sudo -u postgres psql

postgres=# \l
# <project_name>_development、<project_name>_test、が作成されていることを確認
```

#### 参考

https://qiita.com/taKassi/items/8e43171aeda300b67213
エントロピー符号化

数学的な知識を高めるために、ちょっくらエントロピーについて学びますかね！！

# エントロピーってそもそもなんだっけ？

https://ja.wikipedia.org/wiki/%E6%83%85%E5%A0%B1%E9%87%8F

>情報量（じょうほうりょう）やエントロピー（英: entropy）は、情報理論の概念で、あるできごと（事象）が起きた際、それがどれほど起こりにくいかを表す尺度である。

つまり、あるデータを表現するのに必要最低限な情報量は何か、ということですね。AとBの２パターンしかないならば、A=0,B=1を割り当ててある事がわかっていればABABは0101(bit)で、0x5(hex)で表現できます、とか。

人はエントロピーに基づいて、より少ないデータ量で情報を表現しようといろいろ試行錯誤してきた。

# シャノン符号化

https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%A3%E3%83%8E%E3%83%B3%E7%AC%A6%E5%8F%B7%E5%8C%96

一言でまとめると、累積出現確率がそのまま表現になると。

例えば、 以下テストデータで考える（スペースは見やすくするための区切り）。
- SRC = AABB ABAB ABAB CAAA 

A=00,B=01,C=10(bin) とすると、2bit × 16 = 32bit
- SRC = 00000101 00010001 00010001 10000000 (bin)

- P(A) = 9/16 = 0.5625(dec)
- P(B) = 6/16 = 0.375(dec)
- P(C) = 1/16 = 0.0625(dec) 
- li(A) = ceil ( ln( 0.5625) ) = ceil(0.830075) = 1
- li(B) = ceil ( ln( 0.375) ) = ceil(1.415037) = 2
- li(C) = ceil ( ln( 0.0625) ) = ceil(4) = 4
- 累積P(A) = 0.0 (dec) = 0.0(hex)
- 累積P(B) = 累積P(A) + P(A) = 0.0 + 0.5625 = 0.5625 = 0.101(hex)
- 累積P(C) = 累積P(N) + P(B) = 0.5625 + 0.375 = 0.9375 = 0.111(hex)
- a(A) = 0
- a(B) = 10
- a(C) = 1110
- SRC = 00000101 00010001 00010001 10000000 (32bit)
- DST = 001010 010010 010010 1110000　(25 bit)

# ハフマン符号化
出現頻度の高いものには、短いbitを割り当てましょう、というアイデア。

- P(A) = 9/16 = 0.5625(dec)
- P(B) = 6/16 = 0.375(dec)
- P(C) = 1/16 = 0.0625(dec) 

P(B)とP(C)が低い。そこで、ここにnode(B+C)を作る。

- P(A) = 0.5625
- P(B+C) = 0.4275

ここで、新しいnode(A+B+C)を作る。この時点で全部の要素を処理したので、結果としてはこのA+B+Cがrootになる。

で、符号化をしてみる。

- root(A+B+C) ⇒ A  ： a(A) = "0"
- root(A+B+C) ⇒ node(B+C) ⇒ B : a(B) ⇒ "1"+"0" = "10"
- root(A+B+C) ⇒ node(B+C) ⇒ C : a(C) ⇒ "1"+"1" = "11"

これに基づくと、なんと23bitまで小さくなりますね！

- SRC = 00000101 00010001 00010001 10000000 (32bit)
- DST = 001010 010010 010010 11000 (23bit) 

# ここまでの手段の弱点は？
例えば、再頻度たるAを表現するだけでも、1bitを使ってしまう！ということはこれ以上情報量は少なくすることはできない……　

そこで出てきたアイデアが「複数bitの記号でそれ以上の情報を表現してしまえ」と。

極端な言い方をすれば、「3.14」といったら「159265...」と続き、「1.732」といったら「0508...」と続く、とわかる。

こんな感じで「ある数列を表現する、もっとコンパクトな表現手段」という方向にストーリーは動いていきます。


# 算術符号化

http://fussy.web.fc2.com/algo/compress10_arithmetic.htm

0~1の間の区間を、データ出現頻度に応じて分割する。
次のデータがきたら、その小区間もまた分割する…を繰り返せば
複数のデータ列を１つの小数で表現できるよね、という手法。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89434/5f43d2be-01b2-5206-9a4c-9c9c85251eb1.png)

# レンジ符号化

http://fussy.web.fc2.com/algo/compress10_arithmetic.htm

https://ja.wikipedia.org/wiki/%E3%83%AC%E3%83%B3%E3%82%B8%E7%AC%A6%E5%8F%B7

「小数演算やだなあ」という人/システム向けに更に練りこまれた符号化手段。算術符号化では0~1の区間内の話だったが、これをdynamicに定数倍しながら処理する。バイト単位で入出力できるとか書いていたりするが、うーん・・・　とりあえず保留。

# 物語は Asymmetric numeral system へ続く

＜次回予告＞　https://arxiv.org/pdf/1311.2540.pdf を徐々に読み解いて、もう少し詳しくなるよ！