OmniAICreator/Qiita-1.07M huggingface dataset:
#MacでLaravelの環境構築をした件

#MacでLaravelの環境構築をした件

MacでLaravelの環境構築をした際の内容をまとめます.

# 目次
* [動作環境](#動作環境)
* [構築手順](#構築手順)
  * [STEP1.Homebrewのインストール](#homebrewのインストール)
  * [STEP2.Composerのインストール](#composerのインストール)
  * [STEP3.PHPのインストール](#phpのインストール)
  * [STEP4.Laravelのインストール](#laravelのインストール)
* [おわりに](#おわりに)


## 動作環境
`OS : macOS Mojave 10.14.6`
`HOMEBREW_VERSION: 2.2.17`
`Composer version 1.10.6`
`Laravel Installer 2.3.0`
`PHP : 7.2.31`


# 構築手順

## homebrewのインストール
Homebrewはmacのパッケージマネージャです。
パスワードを求められたらMacのログインパスワードを適宜入力してください

```bash
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
インストールが完了したらアップデートをして完了です.

```bash
$ brew upgrade
```

## composerのインストール


```bash
brew install composer
```

インストールが完了したらPATHを追加し、インストールできているか確認します.

```bash:PATHの追加とバージョン確認
$ echo export PATH=\"$HOME/.composer/vendor/bin:\$PATH\" >> ~/.bash_profile
$ source .bash_profile
$ composer -V
Composer version 1.10.6 2020-05-06 10:28:10
```

## phpのインストール

PHPのバージョンを確認

```bash
$ php -v
PHP 7.1.23 (cli) (built: Feb 22 2019 22:19:32) ( NTS )
```
#### <font color="red">注意点</font>
7.1系でLaravel newを行うと以下のエラーが出たため7.2以上をインストールします.

```bash
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - This package requires php ^7.2.5 but your PHP version (7.1.23) does not satisfy that requirement.
```

#### 7.2系のインストール

```bash
brew install php@7.2
```

```bash:PATHの追加とバージョン確認
$ echo 'export PATH="/usr/local/opt/php@7.2/bin:$PATH"' >> ~/.bash_profile
$ echo 'export PATH="/usr/local/opt/php@7.2/sbin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile
$ php -v
PHP 7.2.31 (cli) (built: May 14 2020 10:55:21) ( NTS )
```
## laravelのインストール

```bash:laravelのインストール
$ composer global require "laravel/installer"
```

#### <font color="red">注意点</font>
WEBサイトで以下のコマンドを書いていることがありましたが、このコマンドではエラーになります.詳細は[こちら](https://qiita.com/jun1_san/items/81f39b3049b5df4b15fb)をご参考ください

```bash:誤
$ composer global require “laravel/install”
```

### 動作確認

最後にアプリを作成するディレクトリに移動し実行

```bash
$ laravel new dg_laravel_test
```

サーバーを起動

```bash
$ php artisan serve
Laravel development server started: http://127.0.0.1:8000
[Tue May 19 16:52:04 2020] 127.0.0.1:56892 [200]: /favicon.ico
```

ブラウザから`http://127.0.0.1:8000`にアクセス
以下の画面がでれば成功

![スクリーンショット 2020-05-19 16.56.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526570/1247a0e5-d2e2-9ae3-8c7b-e364b8a47336.png)





## おわりに

今回の件で以下のことを学びました。
1. Mac OSでのLaravelの環境構築
Pythonのバージョンを2→3に上げたけど、ubuntuターミナルを再起動する度に、バージョンが2のままになる

### 現状
pyenv を使って、pythonを2から3にアップデートした。
(アップデート方法は、https://nontitle.xyz/archives/135 などを参照)

その後、下記のコマンドでPath設定をした。

```
$ export PATH="/home/{{user名}}/.pyenv/bin:$PATH"
$ eval "$(pyenv init -)"
$ eval "$(pyenv virtualenv-init -)"
```

```
$ python --version
Python 3.7.6
```

しかし、今開いているターミナルを消して再起動させたら、

```
$ python --version
Python 2.7.6
```

と、pythonのバージョンが2に戻ってしまった。

### 解決策
**/.bashrcを編集して、再起動時にコマンドを自動的に実行するようにする**

```
$ vi ~/.bashrc
```
で bashrc ファイルを開いて編集する。

任意の場所に、

```
export PATH="/home/{{user名}}/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
```
を追加すればok
html学習がてらコードなどまとめてみた


# はじめに
今回は完全備忘録です。
## 階層構造について
この「〇〇ファイル」はここと決まっているらしい
以下表がその通り

| ファイル | Htmlファイル | 画像ファイル | CSSファイル | JavaScriptファイル |
|:-----------|------------:|------------:|------------:|------------:|
|フォルダ|階層トップ |images | styles | scripts |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397376/9ab24c31-54c4-7780-68d4-6d28e6495439.png)
[Web サイトのデイレクトリ構成参照](http://www.asahi-net.or.jp/~gx4s-kmgi/web05.html)
## コードについて
### ページのタイトル

```html:test.html
<title>Test</title>
```
### 段落タグ

```html:test.html
<p>Test表示</p>
```
### 単語の強調

```html:test.html
<p>これは<strong>テスト。</p></strong>
```
### 画像

```html:test.html
 <img src="images/freeicon.png" alt="Testimage">
```
### 見出し関連

```html:test.html
<h1>１番目に大きい</h1>
<h2>２番目に大きい</h2>
<h3>３番目に大きい</h3>
<h4>４番目に大きい</h4>
```
### リスト

```html:test.html
<ul> 
  <li>test1</li>
  <li>test2</li>
  <li>test3</li>
</ul>
```
### 文字埋め込みリンク

```html:test.html
<a href="https://www.google.com/">Google</a>

```
# 終わりに
個人的HTMLはマークダウンみたいに感じます。
動的にWebページが動くようになればさらに楽しくなります。
containすると全件表示されない。

DBを直接みると見れるデータが関連ターブルをcontainするとfindで取得できない時の解決法。


/src/Model/Table内の「****Table.php」を修正することで解決しました。
bakeを使ってモデルを生成したときに、joinTypeがINNERになっているのでLEFTに書き換え。

        $this->belongsTo('Authorities', [
            'foreignKey' => 'authority_id',
            'joinType' => 'INNSER',
        ]);

↓↓

        $this->belongsTo('Authorities', [
            'foreignKey' => 'authority_id',
            'joinType' => 'LEFT',
        ]);
IDEショートカット

## フロントもサーバーもアプリも別々のIDEでやってるとショートカット忘れるので、自分用のメモで、必要最低限です。

#### mac用です

### Android Studio
|ショートカット  |機能 |
|---|---|
|opt + F1 | Project viewでソースの場所を知りたい時 |
|opt + F7 | メソッドやクラスの使用箇所を一覧する |
|control + opt + o | 不必要なインポートの削除 |
|shift + command + F | 文字列検索 |
|shiftの連続2回押下 | メソッドやクラスの検索 |
|opt + command + ← | 戻る |

### VSCode
|ショートカット  |機能 |
|---|---|
|command + p | ファイルを名前で検索 |
|command + 0 | 開いているソースのサイドバーに移動 |
|command + shift + o | メソッド一覧 |
|opt + command + ← | 定義元に飛ぶ |
|shift + F12 | 飛んだ先から戻る|
|control + - | 飛んだ先から戻る|
|shift + command + p | コマンドパレットを開く |
|shift + command + ¥ | 開始、閉じかっこ移動 |
PlayframeworkでHikariCPのコネクション数をDataDogでモニタリング

## アプリケーション側の設定

### hikariCPのMbeansの設定を有効にする

```application.conf
    play.db.prototype.hikaricp.registerMbeans = true
```

###  ConnectionPoolにPoolNameを設定する

デフォルトだと HikariCP-1, HikariCP-2 みたいになってしまうので、わかりやすい名前をつける

```application.conf
    db.default.hikaricp.poolName = default
    db.default-ro.hikaricp.poolName = default-ro
    db.accesslog.hikaricp.poolName = accesslog
```

## DataDog-agentの設定

参考: https://docs.datadoghq.com/ja/integrations/java

### conf.d/jmx.d/conf.yaml を編集する

PoolごとにMBeanが登録されるので、 `bean_regex` で指定する

```yaml:conf.d/jmx.d/conf.yaml
    conf:
      - include:
          domain: com.zaxxer.hikari
          bean_regex:
            - com\.zaxxer\.hikari.*[,:]type=Pool.*
          attribute:
            - ActiveConnections
            - IdleConnections
            - ThreadsAwaitingConnection
            - TotalConnections
```




## 確認 👀

あとは Metrics Expoler とかでメトリクスが取れるか見てみればOK :+1: 

![スクリーンショット 2020-06-01 11.25.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55219/22de604b-d944-6b10-dad2-cd333e35f95d.png)
リモートデスクトップを開く Mac アプリを作成する

小ネタ。

## やりたいこと
ローカルネットワークに Mac mini があり、別の MacBook からこの Mac mini をリモートデスクトップで操作したい。

Finder の「サーバへ接続 (command + K)」を使えば接続できるが、頻繁に使うのでもっと簡単に起動できるようにしたく、デスクトップにあるアイコンをダブルクリックしたら接続できるようにしたい。

## やりかた
Automator でアプリケーションを作成し、「シェルスクリプトを実行」で `open vnc://<hostname>` を実行するように設定して保存する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16369/db8093d8-e536-cb9d-3270-5a545c65503d.png)

保存したコレをダブルクリックしたらリモートデスクトップが起動する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16369/062fa85b-f062-171f-38ef-81a2efc16450.png)

VNC によるリモートデスクトップだけでなく、 `smb://...` や `afp://...` を指定すれば Finder でファイルサーバを開くショートカットとかもできそう。
WSL2へ行こう

[WSL2へ行こう](https://xn--v6q832hwdkvom.com/post/wsl2%E3%81%B8%E8%A1%8C%E3%81%93%E3%81%86/)の抜粋版です

## Windows10 バージョン2004からWSL2が使用できるようになった

![p1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89027/7c09e9a4-41c8-5e5d-387a-e3ec699edb4e.png)

![p2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89027/60dae299-0af2-6e2e-a645-1e0c828b2827.png)

## 移行前の状態

```
PS C:\Users\user> wsl --list -v
  NAME            STATE           VERSION
* Ubuntu-18.04    Running         1
```

## 設定メモ

### Windowsの仮想マシンプラットフォーム機能を有効にする

```
PS C:\Users\user> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

展開イメージのサービスと管理ツール
バージョン: 10.0.19041.1

イメージのバージョン: 10.0.19041.264

機能を有効にしています
[==========================100.0%==========================]
操作は正常に完了しました。
```

### Linuxカーネル更新プログラムパッケージをダウンロードしてインストールする

[最新の WSL2 Linux カーネル更新プログラム パッケージ](https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi)

![p3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89027/6a796ec0-c978-3892-d194-4ce9ef245439.png)

![p4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89027/aa794562-344f-9ba9-d30c-c4e09758f86e.png)

### WSL2を既定のバージョンとして設定する

```
C:\Users\user>wsl --set-default-version 2
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
```

### 今まで使っていたものをWSL2に変換する

```
C:\Users\user>wsl --set-version Ubuntu-18.04 2
変換中です。この処理には数分かかることがあります...
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
変換が完了しました。
```

### できた

```
C:\Users\user>wsl --list -v
  NAME            STATE           VERSION
* Ubuntu-18.04    Stopped         2
```

## やってみたかったこと

### WSL2上のDockerでSQLServerを動作させてみる

```Shell
$ sudo docker run -e "ACCEPT_EULA=Y" \
>    -e "SA_PASSWORD=Password1!" \
>    -p 1433:1433 \
>    --name sql1 \
>    -d mcr.microsoft.com/mssql/server:2019-CU3-ubuntu-18.04
[sudo] password for administrator:
Unable to find image 'mcr.microsoft.com/mssql/server:2019-CU3-ubuntu-18.04' locally
2019-CU3-ubuntu-18.04: Pulling from mssql/server
5b7339215d1d: Pull complete
14ca88e9f672: Pull complete
a31c3b1caad4: Pull complete
b054a26005b7: Pull complete
59f979819d9b: Pull complete
29eb18117119: Pull complete
6de3c1cf897f: Pull complete
172ea0155639: Pull complete
Digest: sha256:e064843673f08f22192c044ffa6a594b0670a3eb3f9ff7568dd7a65a698fc4d6
Status: Downloaded newer image for mcr.microsoft.com/mssql/server:2019-CU3-ubuntu-18.04
e6a93f9a6df59a2acc48eacf77f826cb2c72e739f54637251412f686894c4813
```

```Shell
$ docker ps
CONTAINER ID        IMAGE                                                  COMMAND                  CREATED             STATUS              PORTS                    NAMES
e6a93f9a6df5        mcr.microsoft.com/mssql/server:2019-CU3-ubuntu-18.04   "/opt/mssql/bin/perm…"   30 seconds ago      Up 26 seconds       0.0.0.0:1433->1433/tcp   sql1
```

WSL1のときは起動さえもしなかったのが、とりあえず起動するようになった
【リファクタリング】ルーティングの書き方

# 概要
ルーティングをスッキリ書く方法です:relaxed:

**背景**
ルーティングの指定をする際、7つのアクションのうち６つを使用する場合、onlyで書いたらダラダラと長くなってしまって、個人的に自分ダサっ:weary:っとなったので備忘録として残します:bow_tone1:

# Railsの７つのアクション
まずは、Railsの７つのアクションについておさらい:writing_hand:

|    Action    |    役割             |
|:------------:|:------------------:|
|    index     |  一覧を表示する       |
|     new      |  追加する            |
|    create    |  追加内容を登録す     |
|     edit     |  編集する            |
|    update    |  編集内容を更新する    |
|    destroy   |  削除する            |
|     show     |  個別内容を表示する    |

# 書き方
:warning:ここでは「tweets」というリソースにルーティングを行います
#### 7つのアクション全てを実装する場合

```Ruby:routes.rb

  resources :tweets
```

#### 使用するアクションを限定する場合
:warning:ここでは「index」「new」「create」を使用することとします

```Ruby:routes.rb

  resources :tweets, only: [:index, :new, :create]
```

#### 不要なアクションを削除する場合
:warning:ここでは「show」以外のアクションを使用することとします

```Ruby:routes.rb

  resources :tweets, except: [:show]
```

# まとめ
ついつい、**only**で記入しがちですが、**except**を使用することでコードがスッキリし読みやすくなります:point_up:
私もスッキリ:sparkles:を心掛けてまいります:laughing:

# 参考
https://web-camp.io/magazine/archives/16815
Vuetifyをインストールした環境でJestを実行する設定

Vuetifyをインストールした環境で、Jestを利用するときにしておいた方がいい設定です。

それぞれの設定は、tests/unitディレクトリに作成したsetup.jsを書きます。tests/unit/setup.jsの設定を反映するには、jest.config.jsに、以下を設定します。

```js:jest.config.js
"setupFiles": ["./tests/unit/setup.js"]
```

## 警告を出力しない設定

### [Vue warn]: Unknown custom element:〜

VuetifyのコンポーネントをJestが認識しないために出力される警告です。tests/unit/setup.jsに以下を設定することで出力されなくなります。

```js:tests/unit/setup.js
import Vue from "vue";
import Vuetify from "vuetify";

Vue.use(Vuetify);
```
### Download the Vue Devtools extension for a better development experience:〜

ブラウザの場合にVue Devtoolsの拡張機能をインストールすることを勧めるメッセージのようですが、Jestの環境には意味のないメッセージです。tests/unit/setup.jsに以下の設定をすることで出力されなくなります。

```js:tests/unit/setup.js
Vue.config.devtools = false;
```

### You are running Vue in development mode.〜

production環境へデプロイするときにproduction modeに切り替えることを注意するメッセージのようですが、これもテストの実行中には意味のないメッセージです。

tests/unit/setup.jsに以下の設定をすることで出力されなくなります。

```js:tests/unit/setup.js
Vue.config.productionTip = false;
```

## ボタンの置き替え

Vuetifyをインストールした環境では、buttonの見た目が変わってしまいます。下の図のように、ボタンの枠がなくなって、立体的に見えなくなっています。

![vuetify-button.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145530/676cf97b-67e5-fc26-e9bf-ac16c34595c4.png)


以下のようにv-btnに置き換えることができます。

```html
<v-btn id="vBtnClick" @click="onVbtnClick">v-btn</v-btn>
```

クリックされた場合に、onVbtnClickメソッドを呼び出すように設定しています。

ブラウザで実行した場合には、onVbtnClickメソッドが呼び出されます。しかし、以下のテストではonVbtnClickメソッドが呼び出されないで失敗します。

```js
describe("v-btnがクリックしたときに、割り当てられたメソッドが呼び出されたことを確認する", () => {
  it("v-btnがクリックしたときに、割り当てられたメソッドが呼び出されたことを確認する", () => {
    const wrapper = shallowMount(SampleTextArea);
    const onVbtnClick = jest.fn();
    wrapper.setMethods({onVbtnClick});
    wrapper.find("#vBtnClick").trigger("click");
    expect(onVbtnClick).toHaveBeenCalledTimes(1);
  });
});
```

v-btnの設定を以下のように変えることでテストは成功します。

```html
<v-btn id="vBtnClick" @click.native="onVbtnClick">v-btn</v-btn>
```
AWS Update6/1

#AWS SAM が新たに AWS Step Functions をサポート
#CodePipeline が新しいアクションタイプでの Step Functions の呼び出しをサポート
#AWS Fargate がプラットフォームバージョン 1.4 においてデフォルトでエフェメラルストレージに保存されたデータの暗号化を開始
#Network Load Balancer が TLS ALPN ポリシーのサポートを開始
> Elastic Load Balancing の Network Load Balancer で、Application-Layer Protocol Negotiation (ALPN) ポリシーのサポートが開始されました。ALPN は、すべての主要ブラウザでサポートされている TLS 拡張であり、HTTP/2 などの TLS 接続確立後に使用されるプロトコルのネゴシエーションを可能にします。ALPN ポリシーを使用すれば、アプリケーションの TLS HTTP/2 トラフィックの復号/暗号化を Network Load Balancer にオフロードできるようになり、サービスのセキュリティ体制が向上し、運用上の複雑さも軽減されます。

ALPN ポリシーを Network Load Balancer の TLS リスナーにアタッチするだけで開始できます。ポリシーは、アプリケーションのプロトコル要件に応じていつでも表示、変更が可能です。ALPN を有効にすると、Network Load Balancer の TLS アクセスログを使用して、成功または失敗した ALPN ネゴシエーションの追跡、クライアントのプロトコル設定リストの表示、異常の識別、接続問題のデバッグを行えます。
#Amazon ECS が Spinnaker v1.20 でコンテナヘルスチェックとロードバランサービューをローンチ
Cloud Pak for DataのNotebookでmatplotlibのグラフ日本語文字化けを解消する

matplotlibやseabornでグラフを書いた時に、グラフの日本語が文字化けして以下のように豆腐（□□□)になることがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397277/98f0f714-5e1e-7739-d794-c13f8e8c6735.png)

これは環境に日本語フォントが入っていなかったり、適切に設定されていないことが原因で、matplotlib/seaborn固有の問題です。解決策は[他の記事](https://qiita.com/katuemon/items/5c4db01997ad9dc343e0)でも解説されていますが、これをCloud Pak for Data (以下CP4D)上で解決する方法です。

環境： CP4D v2.5, v3.0LA

CP4Dでは、Notebookで起動するPython環境は予め用意されており、かつランタイムを起動するたびに初期状態で起動するため、一度Python環境に設定すれば未来永劫OKというわけには行きません。
暫定策として、Notebook内で解決策（フォントのダウンロードと設定変更)を実施します。

# matplotlibの日本語文字化け対応策 (CP4D版)
以下のコードをNotebookの先頭で実行します。フォントは先の記事にもあったIPAのフォントを使った例です。

```python
# download and install a Japanese font
!cd /tmp; curl -O https://ipafont.ipa.go.jp/IPAexfont/ipaexg00401.zip
!unzip -jo /tmp/ipaexg00401.zip -d ~/.fonts
# register the font
!fc-cache -fv; fc-list
# reset the matplotlib cache
!rm -rf ~/.cache/matplotlib
```

（オプション） 上記の実行後、以下のコードでmatplotlibが認識できるフォントにIPAexGothicが追加されたことを確認します。これを見ると、元々CP4DのデフォルトPython環境ではDejaVu Sansしか無かったことが分かります。

```python
import matplotlib.font_manager;
[matplotlib.font_manager.FontProperties(fname=fname).get_name() for fname in matplotlib.font_manager.get_fontconfig_fonts()]
# -output-
#['DejaVu Sans',
# 'DejaVu Sans',
# 'DejaVu Sans',
# 'DejaVu Sans',
# 'DejaVu Sans',
# 'DejaVu Sans',
# 'DejaVu Sans',
# 'DejaVu Sans',
# 'DejaVu Sans',
# 'IPAexGothic']
```

グラフを書く前に、rcParamsでfont.familyを指定すればOKです。

```python
from matplotlib import pyplot as plt
from matplotlib import rcParams
plt.rcParams['font.family'] = 'IPAexGothic'
```

# 実行例

```python
# download and install a Japanese font
!cd /tmp; curl -O https://ipafont.ipa.go.jp/IPAexfont/ipaexg00401.zip
!unzip -jo /tmp/ipaexg00401.zip -d ~/.fonts
# register the font
!fc-cache -fv; fc-list
# reset the matplotlib cache
!rm -rf ~/.cache/matplotlib
# -output-
# 省略
```

```python:サンプルデータを用意
import pandas as pd
df = pd.DataFrame({
    'あいうえお' : [1,2,3,4,5],
    'カキクケコ' : [0.1,0.2,0.3,0.4,0.5],
    'ｻｼｽｾｿ' : [10,20,30,40,50],
    '漢字' : [100.1,100.2,100.3,100.4,100.5]
})
df
# -output-
#	あいうえお	カキクケコ	ｻｼｽｾｿ	漢字
# 0	1	0.1	10	100.1
# 1	2	0.2	20	100.2
# 2	3	0.3	30	100.3
# 3	4	0.4	40	100.4
# 4	5	0.5	50	100.5
```

```python:グラフを描画
%matplotlib inline
from matplotlib import pyplot as plt
from matplotlib import rcParams
import seaborn as sns

# Specify font
plt.rcParams['font.family'] = 'IPAexGothic'

sns.pairplot(df)
```

結果：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397277/c5915de2-dbf8-9704-0faa-0bea0c31aa0d.png)

---
（追記） CP4D v3.0.1からは、Python環境のカスタムイメージを作成することで、予めフォントを導入済みの環境を作ることができるようです。もしうまく行けば、それが恒久策として使えそうです。機会があればチャレンジします。
input type="text"からtextareaに変更した時のvalueどうするの問題解決メモ

表題の対応メモです。

```html
<input type="text" class="text" placeholder="hoge" name="hoge" value="ああああ">
```

こんな感じのを複数行の入力フィールドにしたい場合、textareaにするのが手っ取り早いですが、
\<textarea>タグにvalueは使えないので。


```html
<textarea placeholder="hoge" name="hoge">ああああ</textarea>
```

<textarea>タグで囲むことで解決出来ます。

##参考

http://www.htmq.com/html/textarea.shtml
統計検定2級に合格しました

先日、統計検定2級を受験し、合格しました！
その記録を残しておきます。

※私のこれまでの受験の記録（統計関係ないけど）
[AWS Certified Machine Learning – Specialty 合格しました](https://qiita.com/suzuki-navi/items/3664bfbc102052717426)
[AWS Certified Big Data - Specialty 合格しました](https://qiita.com/suzuki-navi/items/8b2fe5a35a4439013461)

統計に関しては、平均とか分散とか標準偏差とかはわかる、検定とかp値とかは必要ならば調べるよ、というぐらいの理解だったのですが、それを網羅的に勉強し、把握する機会を作ったことは満足です。

いままでこの領域のことをあまりわかっていないまま過ごしてきたことをとても後悔しています。もっと早くに勉強しておけばよかったです。

2級の出題範囲の説明を見ると「大学基礎課程（１・２年次学部共通）で習得すべきこと」と書かれているので、本来は学生のときに勉強すべきことでした。


# 勉強方法

私がやった勉強方法を3つ書いておきます。

統計検定の2級を受けようかなと思ったのは3月終わりごろで、4月から勉強するという意志を持ちはじめました。本当に勉強し始めたのは5月入ってからかも。過去問の書籍を買ったのも5月に入ってからで、過去問をまじめに解き始めたのは5月下旬になってからでした。


## 1. 統計学習サイトを読む

[統計学の時間 | 統計WEB](https://bellcurve.jp/statistics/course/)

このサイトで勉強しました。全部読みました、と言いたかったのですが、ちゃんとノート取りながら読んだのは最初の3分の1ぐらいです。用語を覚えるものが最初のほうが多かったので、それでもよかったとは思ってます。

中盤以降は理解が必要なものが増えてきます。いったん目次を眺めるだけにとどめ、後述の他の手段での勉強でわからないことが出てきたときににこのサイトで該当ページだけ読む、ということをしました。ググるとこのサイトが出てくることも多いです。


## 2. YouTubeで講義を受ける

YouTubeのヨビノリさんのチャンネルがとてもわかりやすいです。

[予備校のノリで学ぶ 推定・検定入門 - YouTube](https://www.youtube.com/playlist?list=PLDJfzGjtVLHmx7qMP410-9gx0weC9d90X)

点推定 → 区間推定 → 仮説検定の流れはこの動画を見てはじめてよく理解できました。いままでは、「区間推定」は知らない、仮説検定はなんとなくそういうのがある、ぐらいにしか知らないレベルでしたが、この動画のおかげでこれらの概念の意義がわかりました。

分布の種類や検定の手法の概要は動画を見るだけで十分ですが、一つ一つを使いこなすには見るだけではだめで、過去問をこなすなど演習が必要です。

（このヨビノリチャンネルは統計以外にも数学や物理の解説がたくさんあって、大変オススメです）

ほかのチャンネルとしては、以下の方の動画も大変参考にしていました。ヨビノリさんのような体系的な理解をするための講義ではなく、統計検定の試験問題を1つずつ丁寧に解説している動画でした。試験問題の雰囲気を感じ取るために流し見をしていました。残念ながら、統計検定の運営側の著作権を侵害していたということで、動画は5月中旬にすべて削除されてしまいました。

[Yuya.K_ASN - YouTube](https://www.youtube.com/channel/UCMQAtnp07Genb7egZNrmrLg)

6月1日現在、チャンネルを見ると、問題個別の解説という形からテーマごとの講義形式に形を変えて動画制作を復活されたようです。今後も楽しみです。


## 3. 過去問を解く

過去問を解きます。過去3年全6回分の過去問と解説が公式で出版されています。

私は6回分全部は時間がなくてできなくて、結局4回分を解いたのみでした。全部やっておいたほうがいいと思います。

最初、試験と同じようになにも参考にせずに電卓だけで解きます。解きながら、見直しフラグはメモしておきます。その後採点して、間違っていた問題と見直しフラグの問題だけ見直して、わからないところを解説を見たりネットで調べて理解を進めます。


# 試験の結果

試験直前にやった過去問が合格ラインに達していなくて、自信をなくしながら受験に臨みました。ところが、問題を解いていると過去問よりもずっと簡単に感じて、ほとんど正解なんじゃないかとまで思っちゃいました。けど、得点は70点で、そんなに余裕はなかったです。配点の大きい問題をたくさん間違えたのかもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/5ef1d308-4fac-0f5d-a1a4-0715f6ce0da8.png)


# 試験に関してTips

私はCBT方式で受験しました。試験会場にあるパソコンに問題が表示されて、マウスかキーボードで答えを選択していきます。

パソコン上に残り時間が表示されます。

問題ごとに「あとで見直す」というようなチェックボックスがあり、これにチェックしておくと、全部解き終わったあとの問題一覧画面でこのチェックを入れた問題がひと目で分かり、見直しがしやすいです。

過去にAWSの試験もパソコンを使って受験しましたが、AWSの試験と同じです。

AWSと違う点として、問題文は初めから日本語で作成されていて日本語のみで提供されています。なので問題文は読みやすいです（AWSと比較しての話なので、こっちのほうが普通なのかも）。試験の進行は会場にいるスタッフが指示してくれます。AWSはスタッフもパソコンの向こうの海外にいてリモート対応されましたので、この点もAWSよりもやりやすかったです。（AWSも統計検定も試験会場によってこのあたりの事情は違うかもしれないです）


# リンク

- [統計検定 2級｜統計検定：Japan Statistical Society Certificate](https://www.toukei-kentei.jp/about/grade2/)
ハッキング・ラボのつくりかたでつまったとこ1

## はじめに
以前から、情報セキュリティに興味があり、基礎知識は勉強していたものの、実践の方法がわからず、悶々とした日々を過ごしていました。そんなある日、ふらっと立ち寄った本屋さんでIPUSIRON氏著の[「ハッキング・ラボのつくりかた」](https://www.amazon.co.jp/%E3%83%8F%E3%83%83%E3%82%AD%E3%83%B3%E3%82%B0%E3%83%BB%E3%83%A9%E3%83%9C%E3%81%AE%E3%81%A4%E3%81%8F%E3%82%8A%E3%81%8B%E3%81%9F-%E4%BB%AE%E6%83%B3%E7%92%B0%E5%A2%83%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%8F%E3%83%83%E3%82%AB%E3%83%BC%E4%BD%93%E9%A8%93%E5%AD%A6%E7%BF%92-IPUSIRON-ebook/dp/B07JJKLZNW)という本を発見。Amazonレビューを見てみた感じ、少し古めだが初心者には良さげな印象を受けたので、購入を決意。
普段は時間が取れず、部屋の埃をかぶっていたが、コロナ渦で時間に余裕ができ、触ってみることに。その際に、全くもって初心者の自分が詰まった点を、つらつらと書き連ねていこうと思います。
記事は初めて書くので、温かい目で見てもらえると幸いです。

###自分の環境
- Windows10 Home (ver 1909)
- KaliLinux (ver 2020.2)
- VirtualBox (ver 6.1.8)


## 環境構築でつまったとこ
大前提として、Linuxの基本的操作ができることがありました。一応、本の中で補われてはいますが、自分で一度仮想環境を作るなりして、触ったことがない人だと、厳しいんじゃないかなと感じるところもありました。

###KaliLinuxのver問題
基本的に本に沿って環境構築から始めていくのですが、執筆から日数が経っていることもあり、KaliLinuxやVirtualBoxのverが違っていて、戸惑う場面が多かったです。

執筆当時のKaliLinuxは、デスクトップ環境がGNOMEだったみたいで、記載されている写真や操作がそれに準じて書かれていますが、最新verのKaliLinuxは軽量デスクトップ環境のXfce採用のようで、特にSettings周りが異なっていました。後々に本の[サポートページ](http://s-akademeia.sakura.ne.jp/main/books/lab/faq.html)の存在を知るのですが、当時は知らず、調べながらやっていました。
（サポートページで[「ハッキング・ラボの構築で困ったら読む本」](https://hack.booth.pm/items/1850777?registration=1)が紹介されており、Xfce版の環境構築も紹介されているみたいなのですが、存在を知ったのは終わった後でした）
![VirtualBox_Kali-Linux-2020.2-vbox-amd64_01_06_2020_08_08_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647226/f5a2d52d-46df-a898-08cd-59a415db325f.png)
諦めて英語のままの環境


言語は公式が配布しているovaファイルから生成した環境の場合、デフォルトで英語なのですが、GUIでの変え方がわからず、特に問題も感じなかったので、英語のままに。（検索窓でlanguageと打ってもヒットしなかった。その後、英語でも別に問題ないので、深く調べず放置に）
英語がしんどい人は、Terminalからlocaleをいじればできると思います。ほかのLinuxディストリビューションで遊んでいたときに、localeを変えていたような記憶が...。
###電源問題
![VirtualBox_Kali-Linux-2020.2-vbox-amd64_01_06_2020_09_08_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647226/87dc891c-6ce4-94b5-880f-12b65e078b21.png)
![VirtualBox_Kali-Linux-2020.2-vbox-amd64_01_06_2020_09_12_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647226/b22e0d11-6355-4ca6-4cc4-0e55bc93c1be.png)


勝手にスリーブになる問題だけ変えたかったので、Settings⇒Power Manager⇒DisplayにあるDisplay power managementにある項目を取り敢えず全てNeverに。Power Manager⇒SecurityにあるAutomatically lock the sessionもNeverに変更したら、放置していても画面がロックされることはなくなりました。

###LANアダプター設定問題
環境構築の中で、一番時間がかかったのが、LANアダプターの設定です。
LANアダプターがNATの時は、問題なく動作するのですが、片方をホストオンリーアダプターに変更した場合、KaliLinux自体が、起動しなくなる問題が発生しました。
![ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647226/a77ee773-6b4d-92a5-06ed-3e7101fe1546.png)
（アダプター1をNATからホストオンリーアダプターへ変更すると起動しなくなりました）

結果的には、VirtualBoxのverを最新ものにアップデートすることで問題が解決しました。ver6.1.2⇒ver6.1.8
理由はよくわかってませんが、同じverの人で動かない人は、アップデートすれば直ると思います。

ひとまず接続できるようになったと思ったら、次の問題が発生しました。
KaliLinuxのホストオンリーネットワークからホストOSへpingでアクセスが確認できない問題です。
```kali@kali:~# ping 10.0.0.1
```こいつが通らない問題です。これはホストOS側であるWin10のファイアウォールの問題でした。[この記事](https://qiita.com/paco_itengineer/items/3997b79170924ed79fb7)を参考に、試してみると動くようになりました。

##おわりに
今4章のwindows7のハッキングに取り組んでいます。win7の仮想マシンがなくて焦っていましたが、[サポートページ](http://s-akademeia.sakura.ne.jp/main/books/lab/faq.html)にリンクがあったので、そこから入手できました。
元気があれば記事の続きを書くかもしれません。
メディアクエリ

#レスポンシブWebデザインのメディアクエリについてのメモ

cssファイルやscssファイル内にてメディアクエリを指定することで、
タブレットやスマートフォン、または規定外の大画面にも対応できる様なcssを作成できる。
width等でのcssが切り替わる境目をブレイクポイントと呼ぶ。
ブレイクポイントは実際のビューが崩れそうなタイミングをとっても良いが、特に何もなければ、
1170pxと670px付近でブレイクポイントを取ると良い。

```ruby:scssファイル
@media (min-width: 1170px {
  h1 {
    color: pink;
  }
}
@media (min-width: 670px {
  h1 {
    color:white;
  }
}
@media (max-width 670px {
  h1 {
    color: blue;
  }
}
```

別件だが、width: 25%;　を4つ並べてビュー崩れが起こる場合は、
borderやpaddingも含まれているため、box-sizing: border-box;を与えてやると直る。
これは全てに与えてやることが推奨されている。

```ruby:scssファイル
* {
  box-sizing: border-box;
}
```
A-Frame: aframe-multisrc-componentの調査

### 困った

A-Frameでサイコロを作りたいのですが、標準の[マテリアルコンポーネント](https://aframe.io/docs/1.0.0/components/material.html#built_in_materials_sphericalenvmap)だと立方体の6面とも同じ画像が表示されてしまいます。
![cheat_dice.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/fb5dad33-da7a-7df7-d8ec-a4fc6e785928.gif)
[demo](https://k38.github.io/aframe/multisrc-component/cheat_dice.html)
これでは困る。

### いい感じになった

立方体の6面とも異なる画像を表示できるコンポーネントを調べてみると、良さそうなのがありました。
[aframe-multisrc-component](https://github.com/elbobo/aframe-multisrc-component)
![dice.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/7b981f15-99e0-a747-b120-13f518258028.gif)
[demo](https://k38.github.io/aframe/multisrc-component/dice.html?a=2)
いい感じになりました。
個々の面に対して色を指定したり、メタリックにしたりもできるようです。

### バグっぽい

使ってみて気づいたのですが、

- multisrcコンポーネントをエンティティから削除する
- multisrcコンポーネントを持つエンティティを削除する

のどちらかを実行すると、multisrcコンポーネントのremoveイベントが発火しますが、その中の処理にバグがあるっぽいです。

以下のようなエラーが発生します。

```
Cannot read property 'addEventListener' of undefined
```

ループの中からthisが参照できなくなっているようです。

```
remove: function(){
    var defaultMaterial = this.el.components.material.material 
    this.el.getObject3D('mesh').material = defaultMaterial
    this.el.removeEventListener('componentchanged', this.compChange);
    var animationEventsArray = ['animationbegin', 'animationstart', 'animationcomplete', 'animationend']
    animationEventsArray.forEach(function(event) {
      this.el.addEventListener(event, this.materialChangedByAnimation) // <- ここでthisがundefinedになる
    });
    this.reduceMaterialChangedThrottle(200);
}
```

このコードを追記してremove関数を上書きしてあげると、とりあえずうごきました。

```
AFRAME.components.multisrc.Component.prototype.remove = function () {
    var defaultMaterial = this.el.components.material.material;
    this.el.getObject3D('mesh').material = defaultMaterial;
    this.el.removeEventListener('componentchanged', this.compChange);
    var animationEventsArray = ['animationbegin', 'animationstart', 'animationcomplete', 'animationend'];
    var self = this; // <- thisをselfで保持してループの中からも参照できるようにした
    animationEventsArray.forEach(function (event) {
        self.el.addEventListener(event, self.materialChangedByAnimation); <- thisをselfに置き換えた
    });
    this.reduceMaterialChangedThrottle(200);
}
```
ScrapyのdupefilterからSpiderにアクセスする

Scrapyのカスタマイズとして、dupefilterからSpiderにアクセスする拡張を加えました。
実装にあたって検索した時は、日本語の記事が見当たらなかったので、後の人のために書き残しておきます。

「もっと楽な方法あるよ！」って方がいたらこっそり教えて下さい…

## 課題
Scrapyでクロールする際、重複したアイテムを除外するため、`RFPDupeFilter`を継承した独自フィルタを作ることがあります。

参考 : [Scrapyドキュメント](https://doc-ja-scrapy.readthedocs.io/ja/latest/topics/settings.html#dupefilter-class)

ですが、`RFPDupeFilter`からはSpiderにアクセスすることができません。
つまり、スパイダーしか知り得ない情報を元に重複除外したい場合に対応できないことになります。

## 対応
ScrapyのGitHub Issueに[類似の記載](https://github.com/scrapy/scrapy/issues/2940)がありました。

今回はこちらのIssue内容の通りに実装しています。

**やったこと**

- Schedulerを継承して`from_crawler`メソッドをオーバライド
- 独自スケジューラをsettings.pyの`SCHEDULER`に登録
- dupefilter側で`self.spider`を好きにする

### Schedulerを継承
dupefilterにspiderを差し込む部分以外は、元コードをまんまコピペしてます。

```python

class CustomScheduler(Scheduler):

    @classmethod
    def from_crawler(cls, crawler):
        settings = crawler.settings
        dupefilter_cls = load_object(settings['DUPEFILTER_CLASS'])
        dupefilter = create_instance(dupefilter_cls, settings, crawler)
        dupefilter.spider = crawler.spider ### ここだけ追加 ###
        pqclass = load_object(settings['SCHEDULER_PRIORITY_QUEUE'])
        if pqclass is PriorityQueue:
            warnings.warn("SCHEDULER_PRIORITY_QUEUE='queuelib.PriorityQueue'"
                          " is no longer supported because of API changes; "
                          "please use 'scrapy.pqueues.ScrapyPriorityQueue'",
                          ScrapyDeprecationWarning)
            from scrapy.pqueues import ScrapyPriorityQueue
            pqclass = ScrapyPriorityQueue

        dqclass = load_object(settings['SCHEDULER_DISK_QUEUE'])
        mqclass = load_object(settings['SCHEDULER_MEMORY_QUEUE'])
        logunser = settings.getbool('SCHEDULER_DEBUG')
        return cls(dupefilter, jobdir=job_dir(settings), logunser=logunser,
                   stats=crawler.stats, pqclass=pqclass, dqclass=dqclass,
                   mqclass=mqclass, crawler=crawler)


```

### 独自スケジューラを登録
settings.pyに独自スケジューラを登録します。
特定スパイダー限定にしたい場合は、スパイダークラスの`custom_settings`に書きます。

```settings.py
SCHEDULER = 'crawling.scheduler.CustomScheduler'
```

### dupefilter側でspiderを使う
あとは独自のdupefilter内で`self.spider`を触れますので、好きに情報抜き取ります。

以上！
Stringで指定した文字数を抜き出す

## Sample

```swift
var sampleText = "0123456789"

let targetStart = sampleText.index(sampleText.startIndex, offsetBy: 2)
let targetEnd   = sampleText.index(sampleText.startIndex, offsetBy: 5)
let substring   = sampleText[targetStart...targetEnd]
print(substring)  // 2345
```

## Reference

- [How can I use String slicing subscripts in Swift 4?](https://stackoverflow.com/questions/45562662/how-can-i-use-string-slicing-subscripts-in-swift-4)
  - Swift5で使える話
- [\#iOSDC でRangeとString\.Indexについて話しました](https://medium.com/@satoshi.nagasaka21/iosdc-%E3%81%A7range%E3%81%A8string-index%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E8%A9%B1%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F-946db0cd9e43)
  - 少し古い話ではあるが、正しく詳しいので詳細はここを参照したい

## Practice
- 前述の内容を基に、複数行のテキストを指定した行数に整形する関数を作りました。
    - ただしWord Wrapは考慮していません。

```swift
import Cocoa


/// テキストを指定した行数に整形する
/// - Parameters:
///   - text: 対象のテキスト
///   - maxLineNumber: 整形したテキストの最大行数
/// - Returns: 最大行数以下に整形されたテキスト
func createArrangedText(for text: String, maxLineNumber: Int) -> String {
    var lines = [String]()
    
    // 行ごとに分割する
    // また空行がある場合は削除する
    text.enumerateLines { (line, stop) -> () in
        let arranged_line = line.trimmingCharacters(in: NSCharacterSet.whitespacesAndNewlines)
        if arranged_line.count > 0 {
            lines.append(arranged_line)
        }
    }
    
    if maxLineNumber < lines.count && maxLineNumber > 0 {
        let oneLineText = lines.joined()
        lines = []
        
        let numberOfCharacterByLine = oneLineText.count / maxLineNumber  // 1行あたりの文字数
        
        var targetStart   = oneLineText.index(oneLineText.startIndex, offsetBy: 0)
        var targetEnd     = oneLineText.index(oneLineText.startIndex, offsetBy: numberOfCharacterByLine)
        let targetVeryEnd = oneLineText.index(oneLineText.endIndex,   offsetBy: 0)
        
        for i in 0..<maxLineNumber {
            let newLine: String
            if i == maxLineNumber - 1 {
                // 最終行は割り切れなかった字数文長くなる
                newLine = String(oneLineText[targetStart..<targetVeryEnd])
            } else {
                newLine = String(oneLineText[targetStart..<targetEnd])
                // 次のインデックス取得のために値を更新する
                targetStart = oneLineText.index(targetStart, offsetBy: numberOfCharacterByLine)
                targetEnd   = oneLineText.index(targetEnd,   offsetBy: numberOfCharacterByLine)
            }
            
            lines.append(newLine)
        }
    }
    
    return lines.joined(separator: "\r\n")
}

// from https://lipsum.sugutsukaeru.jp/index.cgi
let inputText =
"""
ここは場合常にその相違式というのの後よりするないな。
どうしても結果をお話者はたとい大した鑑定なでなどを認めるが致したがも参考ありますですながら、どうには片づけませあっないた。

自分をおらで事もけっしてその間のまあなますな。

とにかく嘉納さんに忠告個性そう講演に聞いなくこの世その例外だれか享有にとかいうご教育たうですですば、
こういうたくさんも私か西洋底でいるて、大森さんののの人の私に何でもかでもお相当となっで私鶴嘴にご発展よりするようにせっかくお話が勤まりましでしと、
"""

print(createArrangedText(for: inputText, maxLineNumber: 4))

/*
ここは場合常にその相違式というのの後よりするないな。どうしても結果をお話者はたとい大した鑑定なでなどを認めるが致した
がも参考ありますですながら、どうには片づけませあっないた。自分をおらで事もけっしてその間のまあなますな。とにかく嘉納
さんに忠告個性そう講演に聞いなくこの世その例外だれか享有にとかいうご教育たうですですば、こういうたくさんも私か西洋底
でいるて、大森さんののの人の私に何でもかでもお相当となっで私鶴嘴にご発展よりするようにせっかくお話が勤まりましでしと、
*/
```
FileMaker Pro 19でCoreMLを使う

### FileMakerから。CoreMLをじって見ました
使うのは非常に簡単でした。

転移学習(Transfer Learning)とは、ある領域で学習したこと(学習済みモデル)を別の領域に役立たせ、効率的に学習させる方法　
再学習はできないものでしたが

Vision(視覚)
CNN( Convolution Neural Network) の単物体識別　モバイル用に使われる物を
MobileNetV2, Resnet50. SqueezeNetで試してみた。

[Apple Core MLモデル](https://developer.apple.com/jp/machine-learning/models/#image)から入手出来ます。
Appleでは、[「トレーニング済みモデルのCore MLへの変換」](https://developer.apple.com/jp/documentation/coreml/converting_trained_models_to_core_ml/)というページもあるので独自モデルも可能性があります。

### 利用環境
- Claris FileMaker Pro 19以降
- Claris FileMaker Go 19
- Core ML をサポートしている、OS上

#### やり方と手順

FileMakerで機械学習をさせるには
1.  機械学習モデルをスクリプトステップで構成して、名前を付ける
2.  フィールド設定で結果を返す感じです、関数：ComputeModel を使う
3. 結果テキストのJSON処理

###「機械学習モデルを構成」スクリプトステップは 制御 分類にあります

```
機械学習モデルを構成 [ 処理 : 視覚 ; 名前 : "visionModel" ; 次から :  モデルのフィールド ]
```


US版では

```
Configure Machine Learning Model [ Name: visionModel ; Operation: Vision ; From: ModelContainerField ]
```

日本版とUS版では順番が違うが、FileMkerが、ユニバーサルのアプリなので自動変換してくれる

このスクリプトステップは、Core ML モデルを構成するステップで、読み込むフィールドと
次の引数を指定できる インスタンスを作る感じかな

##### 処理 (Operarion):

- [視覚(Vision)]  : 入力が単一のイメージで、分類(classifications)の配列を返す。返値には名前と信頼レベルの動小数点が変える
- [一般(General)] : 入力がひとつ以上の数値(scalar)で,有限の番号付きリストを返す
- [アンロード(Unload)] : モデルを構築するときに読み込んだリソースを開放  付けた名前で指定
注意：アンロードでは、モデルフィールド指定が無い、当然だが親切だが処理の他と違うので,次からは出ない、使わないモデルはなるべく、アンロードしておいた方がよい

##### 名前 (Name): 
このオブジェクトを利用するときの名称で重要
ルールはユニークなら良さそうだが、読み込んだモデルオブジェクトの名称にしておくのが無難
	
##### 次から(From)：
モデルを指定するフィールド
	
### ComputeModel 関数
CoreMLモデルを処理してJSONを返す関数

- 一般(Genersl)と視覚(Vision)モデルと構文が違う
- 一般(Genersl)モデル:
ComputeModel (モデル名 ; 名前1 ; 値1)

##### 視覚(Vision)モデル:

```
ComputeModel (モデル名 ; "image" ; 値1 ; "threshold" ; returnAtLeastOne)
```

##### 引数：
- モデル名(modelName) : モデルの名称　スクリプトステップ「機械学習モデルを構成」で付けた名前
- 指定モデルの引数 「視覚 {Vision}」モデルの場合だけだが
	- image : 評価されるデータ
	- threshold (閾値): 0.0 ~ 1.0の数値、結果をいくつ返すか制限
	- returnAtLeastOne  
             : 1 True　真の場合、最も高い結果が返される  
             : 0 False 偽の場合、空の文字列が返される

この関数はこんな感じに書く

```
ComputeModel ("MobileNet"; "image"; 対象データフィールド)
ComputeModel ( $$model ; "image"; 対象データフィールド ; "threshold"; .1 ; "returnAtLeastOne"; 1)
```

Filemakerの場合見た方が分かり易いのでサンプル作成
iOS 対応
CoreMLGo.fmp12
https://github.com/nmizojp/FileMaker

資料：
https://help.claris.com/ja/pro-help/#page/FMP_Help%2Fconfigure-machine-learning-model.html
https://help.claris.com/ja/pro-help/index.html#page/FMP_Help%2Fcompute-model.html%23ww1323604

英語マニュアル  私の機械学習の知識は英語マニュアルが理解しやすいので
https://help.claris.com/en/pro-help/#page/FMP_Help%2Fconfigure-machine-learning-model.html%23ww1282585
https://help.claris.com/en/pro-help/index.html#page/FMP_Help%2Fcompute-model.html%23ww1323604
Photshopでファビコン(.ico)を作成する(Mac)

Webサービスや何らかのWebページを作成する場合、せっかくなのでオリジナルのファビコンを作成して表示させたいですよね。
作成方法としては、ファビコンを作成できるサービスや.jpg,.png画像を変換する方法もありますが、せっかくなのでPhotshopで作成してみましょう。

#前提
Photshopを使用できる環境があること
オリジナルのファビコン画像を作成したい人
MacOS対象(Windowsでもほぼ手順は同じなので置き換えて進めることができると思います。)

#手順
##プラグインのインストール
Photshopにはデフォルトではファビコン用の画像に最適な「.ico」というファイル形式で保存することができません。
そのためプラグインを入れる必要があります。

下記サイトから対象のプラグインをダウンロードしましょう。
http://www.telegraphics.com.au/sw/

一覧が表示されますが「**ICO（Windows Icon）Format**」と記載されている一覧から対象のプラグインをインストール。
<img width="1440" alt="スクリーンショット 2020-06-01 6.53.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640274/3003e935-5a48-141a-300f-b5432ad90e5a.png">

ダウンロードしたプラグインファイルを解凍後
「**ICOFormat.plugin**」を**「Applications\Adobe Photoshop [Photoshop_バージョン]\Plug-ins\」**にコピー
※[Photoshop_バージョン]の部分はご使用のPhotsopのバージョンに合わせてください。


##Photshopを起動
新規作成で何かファイルを作成します。
[ファイル]>[別名で保存]>[フォーマット]のドロップダウンを開く>「ICO(Windows Icon)」というフォーマットが表示されていれば完了です。
<img width="795" alt="スクリーンショット 2020-06-01 9.32.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640274/07876e14-924b-eb3b-e789-51b540cbe113.png">
<img width="420" alt="スクリーンショット 2020-06-01 9.18.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640274/186078d8-7d64-5294-3370-e93b3b8480d7.png">

##その他
ファビコンの最適サイズは「**16pixel × 16pixel**」とのこと。
PythonのCelery、RabbitMQ（Docker）を動くところまで


メッセージブローカーとしてDockerで起動RabbitMQを使用し、Celeryを使った単純なプログラムが動作するところまでを書く。

内容はほぼ公式ドキュメントの通りだが、DockerのRabbitMQを使うように変えている。

## RabbitMQ

```shell
# 起動
docker run --rm -d --hostname my-rabbit --name rabbitmq -p 5672:5672 -p 8080:15672 rabbitmq:3-management

# 停止
docker stop rabbitmq
```

5672が使用するポート。8080（15672）ポートはブラウザから見れる管理画面。（今回はなくてもいい）


## ライブラリのインストール

```shell
pip install celery
```

バージョン4.4.2がインストールされた。


## プログラムの用意

```python:tasks.py
from celery import Celery

app = Celery('tasks', backend='amqp', broker='amqp://guest:guest@127.0.0.1:5672')


@app.task
def add(x, y):
    return x + y
```

`tasks.py`という名前で作成する。

準備ができたら実行する。

```shell
celery -A tasks worker --loglevel=info
```

## メッセージの投入、取得

```
>>> r = add.delay(4,4)
>>> r
<AsyncResult: 8a80f867-c2f4-47f6-b431-665c624f0ec2>
>>> r.ready()
True
>>> r.get()
8
```

動いていることが確認できた。

## リンク
* https://hub.docker.com/_/rabbitmq
* https://docs.celeryproject.org/en/stable/index.html
【初心者向け】【Javascrript】FizzBuzz問題


今回はFizzBuzz問題をHTMLのscriptタグ内に書きました。




# FizzBuzz問題とは？
1から30まで順に数えて出力して行き、3で割り切れる数は「Fizz」5で割り切れる数は「Buzz」両方で割り切れる数は「FizzBuzz」と出力する、ようにプログラムを書く問題です。

これが書けるか書けないかでプログラマー志願者を仕分けられるようになったようです。実際今でも使われていますから押さえておいて損はないと思います。[FizzBuzz詳細](https://ja.wikipedia.org/wiki/Fizz_Buzz)


# 私が書いたコード


```html:sample.html
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset=UTF-8>
        <title>loop</title>
    </head>
    <body>
        <script>
            
                var i = 0;
                for (i = 1; i <=100; i++) {
                if (i % 15 === 0 ) {
                        document.write("<p>" + "FizzBuzz" + "</p>");
                        
                    } else if(i % 3 === 0) {
                        document.write("<p>" + "Fizz" + "</p>");
                        
                    } else   if(i % 5 === 0 ) {
                        document.write("<p>" + "Buzz" + "</p>");
                    } else 
                    document.write("<p>" + i + "</p>");
            }
        </script>
    </body>
</html>
```

## 書く順番

ifは条件が厳しいものから順番に書いていった方が良いです。今回の問題だと"Fizz"や"Buzz"を表示させるifを先に書いてしまうと3と5の倍数の数字がif文を通過するとき、3の倍数をFizzに置き換えるところで条件を満たしてしまうのでその先の処理は行わないからです。
WordPressの固定ページ一覧を更新順に並べて表示する

WordPressの固定ページ一覧の並び順を更新順にしてみました。
![page-modified.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31643/58d7c60d-b399-7c5c-7253-03134756edbf.png)

## やりたいこと
WordPress管理画面の固定ページ一覧の表示順を変更する。

### URLで設定できる
WordPressの固定ページ一覧の並び順は、URLで設定できます。以下のように、GET引数を追加するだけでOKです。

```html:初期設定の固定ページ一覧
https://管理画面/edit.php?post_type=page
```

```html:更新順に変更
https://管理画面/edit.php?post_type=page&orderby=modified
```

https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/WP_Query の orderby の指定が使えるようです。(当方で検証したのは、``orderby=modified`` と ``orderby=ID`` のみ)

### 管理画面にリンクを追加したい
さて、更新順のページを表示するために、URLを毎回入力するのは大変ですね。なので、管理画面にリンクを追加します。

WordPressに用意されている``add_submenu_page``関数を使うと簡単です。

```php
// 固定ページの表示順
function ounziw_page_menu() {
	add_submenu_page( 'edit.php?post_type=page', '固定ページ(更新順)', '固定ページ(更新順)',
		'edit_pages', 'edit.php?post_type=page&orderby=modified' );
}
add_action( 'admin_menu', 'ounziw_page_menu' );
```

add_submenu_pageは、以下の引数をとります。
1. (必須)親メニューのスラッグ
2. (必須)ページのタイトル
3. (必須)メニューのタイトル
4. (必須)権限
5. (必須)リンクのスラッグ
6. (任意)コールバック関数
7. (任意)メニューの位置を数字で指定

今回はメニュー【固定ページ】（WPに標準で用意されている）の中に、サブメニューとして設定しています。なので、
親メニューのスラッグ : ``edit.php?post_type=page``
リンクのスラッグ : ``edit.php?post_type=page&orderby=modified``
としています。

こうすると、メニュー【固定ページ】に、**固定ページ(更新順)** というメニュー項目が追加されます。この項目のリンク先が ``edit.php?post_type=page&orderby=modified`` です。

### functions.phpに記述する
上記のコードを、お使いのテーマのfunctions.phpに記述すれば完成です。
EC2が最大72%割引になる柔軟な料金モデル『Savings Plans』勉強会に参加した

# 勉強会の基本情報

* 【日　時】 2020年5月27日 10:30~11:00
* 【会　場】 オンライン
* 【参加費】 無料
* 【主　催】 アマゾン ウェブ サービス ジャパン株式会社
* 【申し込み】 [リンク](https://pages.awscloud.com/event_JAPAN_Webinar_SavingsPlans_0527_LP.html?trk=event_webinar_page)


# 概要
* AWSのコスト最適化手法
* Savings Plansの概要と種類
* Savings Plans導入方法と推奨契約期間


# 内容
## AWSのコスト最適化手法
* いろいろなコスト最適化手法があるが、効果と構成変更のコストを考えないといけない

### インスタンスタイプとストレージタイプの最適化
* 効果： 大きいが、時期によっていつでも変更が必要で、作業も必要
* コスト： タイプ変更だけなので、特に大きい作業がいらない

### マネージドサービス活用
* 効果： 非常に大きい
* 構成変更： 一部必要
* 例えば、EC2上に構築したWebサービスをマネージドサービスへ変更すると、コード構成の変更を考えて、性能とかも考えないといけない。

### スポットインスタンス活用
* 効果： 非常に大きい
* 制限： 実行タイミングの制限があって、バッチ処理などがよく利用できる

### 割引オプッションの活用
* リザーブどインスタンス
* リザーブどキャバシティー
* [new] Saving Plans

## Savings Plansの概要と種類
### 概要
* EC2の定常的な利用を１年間または３年間利用コミット契約することで、”最大”72%のコスト削減できる新割引プラン、アーキテクチャを変更せずにすぐにコスト削減できる
* 以前のスタンダードリからの改善点
    * インスタンス単位の契約ではなく、合計利用金額のコミットに
    * 契約後のOSの変更が可能に
    * 契約後のテナンシーの変更が可能に

### 種類
* Compute Savings Plans
    * コミット金額を指定するだけ
    * 最大66%割引
* EC2 Instance Saving Plans
    * リージョンとインスタンスファミリーを指定する必要がある
    * コミット金額も指定する
    * 最大72%割引

## Savings Plans導入方法と推奨契約期間
* 管理画面に以下の項目を設定するだけ
    * Savings Plansのタイプ
    * 契約期間
    * コミット金額
    * 支払いオプッション(全額前支払い、一部支払い、前支払いなし)
* 契約期間が1年と３年
    * プロジェクトは１９ヶ月以上の継続的な利用が見込まれるなら、３年期間の検討が必要ある


# 感想
* 初めてのプロジェクトに対しての導入方法を考える
    * 運用のために、利用金額がいくらか
    * 本番にEC2利用された金額がいくらか
    * 上の２点より、コミット金額を決める
    * 前支払いの割引が大きいなので、プロジェクトリーダーと相談する
QiiTaでの著作権違法またはガイドライン違反の記事への対処法

# 著作権違法またはQiiTaガイドライン違反の記事への対処法

Qiitaに投稿された記事の著作権は、記事を投稿したユーザーにあります。記事に問題があると感じた場合は、お互い気持ちよくなれるよう適切に対処しましょう。

## 自分の記事が無断転載されたかも…？という場合
- 著作権侵害の申し立てを行う。（ [QiiTaの手順]
(https://help.qiita.com/ja/articles/about-unauthorized-reproduction)）
- 問題がある記事として報告する（右上の3点ボタンをクリック）
- 著作権侵害，またはQiiTaガイドライン違反の可能性を、該当記事のコメント欄もしくはDM等で本人に伝えてみる


## 著作権侵害，またはQiiTaガイドライン違反の可能性を、本人に伝える際のテンプレート
本投稿の【違法（違反）箇所】におけるスクリプトのうち、〇〇の箇所が
[サイト名](URL)
の〇〇の箇所から引用されたものであると思われます。

また、以上のURLに掲載されているコンテンツの全ては、このURLのサイトの執筆者に著作権があります。

以下のURLに明記されている規則により、当記事は、著作権もしくはQiiTaのガイドラインに違反した行為にあたる可能性があります。
[昭和四十五年法律第四十八号 著作権法](https://elaws.e-gov.go.jp/search/elawsSearch/elaws_search/lsg0500/detail?lawId=345AC0000000048)
[Qiita利用規約 第6条（投稿内容の利用）](https://qiita.com/terms)
[良い記事を書くためのガイドライン](https://help.qiita.com/ja/articles/qiita-article-guideline)

執筆時に参考した情報がある場合は、必ず参考文献等を明記してください。


以下は当方のスクリプト

```html:index.html
<!-- ここに著作権またはQiiTaガイドライン違反の記事のスクリプト -->
```

以下は以前に投稿されたスクリプト

```html:index.html
<!-- ここに転載（参考）元記事のスクリプト -->

```

##参考にした記事
[昭和四十五年法律第四十八号 著作権法](https://elaws.e-gov.go.jp/search/elawsSearch/elaws_search/lsg0500/detail?lawId=345AC0000000048)

[Qiita利用規約 第6条（投稿内容の利用）](https://qiita.com/terms)


[良い記事を書くためのガイドライン](https://help.qiita.com/ja/articles/qiita-article-guideline)

[自分の記事が無断転載されたかも…？という場合は](https://help.qiita.com/ja/articles/about-unauthorized-reproduction)

[Qiitaで記事を公開するときに気を付けるべきマナーについて 〜無断でネットや書籍の内容を丸写しするのはやめよう〜](https://qiita.com/jnchito/items/215c2d51599eb29adabc)
Pythonの開発環境をPoetryとDockerで作成してmatplotlibのグラフを描く

随時更新していくつもりです。

## 目的
pythonの開発環境をPoetryとDockerで構築し、データの可視化をmatplotlibで行えることを目指します。
1. Dockerfileを作る
2. Docker image をビルドする
3. コンテナを起動する
4. 動作を確認する

## 1.Dockerfileを作る
```Docker:Dockerfile
FROM python:3.8.3-buster

ENV DISPLAY=host.docker.internal:0.0
ENV PATH $PATH:/root/.poetry/bin

RUN mkdir -p /workspace

RUN apt-get update \
    && apt-get install -y git \
    curl \
    && curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python

WORKDIR /workspace

CMD ["/bin/bash"]
```

## 2.Docker image をビルドする
Dockerfileがあるディレクトリで以下のコマンドを実行します。

```
sudo docker build -t python3.8 .
```


## 3.コンテナを起動
macosxとubuntuで挙動が違ったため、以下のように書きました。windowsは未確認です。

```sh:build.sh
#!/bin/bash

if [[ "$OSTYPE" == "darwin"* ]]; then
    xhost +localhost:
    docker run -it --rm \
        -v /tmp/.X11-unix:/tmp/.X11-unix \
        python3.8 \
        /bin/bash
    xhost -localhost:
else
    xhost +local:
    docker run -it --rm \
        -v /tmp/.X11-unix:/tmp/.X11-unix \
        -e DISPLAY=$DISPLAY \
        python3.8 \
        /bin/bash
    xhost -local:
fi
```


## 4.動作確認
```sh
poetry --version
Poetry version 1.0.5
```

### プロジェクト作成
```sh
poetry new sample
Created package sample in sample
```
```sh
apt-get update && apt-get install tree
tree sample
sample
├── README.rst
├── pyproject.toml
├── sample
│   └── __init__.py
└── tests
    ├── __init__.py
    └── test_sample.py
```
### ライブラリのインストール
```sh
cd sample
poetry add matplotlib
Using version ^3.2.1 for matplotlib

Updating dependencies
Resolving dependencies... (19.2s)

Writing lock file


Package operations: 14 installs, 0 updates, 0 removals

  - Installing pyparsing (2.4.7)
  - Installing six (1.15.0)
  - Installing attrs (19.3.0)
  - Installing cycler (0.10.0)
  - Installing kiwisolver (1.2.0)
  - Installing more-itertools (8.3.0)
  - Installing numpy (1.18.4)
  - Installing packaging (20.4)
  - Installing pluggy (0.13.1)
  - Installing py (1.8.1)
  - Installing python-dateutil (2.8.1)
  - Installing wcwidth (0.1.9)
  - Installing matplotlib (3.2.1)
  - Installing pytest (5.4.2)
```

### サンプルを実行
```py:sample/sample.py
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-3.0, 3.0, 100)
y = x**2
plt.plot(x, y)
plt.show()
```

### 結果
![result_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642167/060b7aa0-9259-532a-7abb-541142218841.png)
MacにZoomをインストールする

# 最終更新日
2020年6月1日

検証を行ったmacOSのバージョンは下記です。

- macOS Catalina 10.15.5

Zoomのバージョンは下記です。

- Zoom 5.0.4

> この記事が古くなった場合、下記の手順は最新のインストール手順とは異なっている可能性があります。

# インストール手順
(1) https://zoom.us/download#client_4meeting にアクセスしてください。

(2) [ダウンロード]ボタンをクリックしてください。
![スクリーンショット 2020-06-01 8.47.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58650/354a6a25-fcfe-81cd-278d-5fdb0a72c4cb.png)

(3) [許可]をクリックしてください。
![スクリーンショット 2020-06-01 8.47.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58650/2057ccfc-ef6f-5102-1fd6-23736e96e0a1.png)

(4) Zoom.pkgをクリックしてください。
![スクリーンショット 2020-06-01 8.48.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58650/2a4b54a0-103d-1ca2-32f6-f23b60bd3c35.png)

(5) [続ける]をクリックしてください。
<img width="732" alt="スクリーンショット 2020-06-01 8.48.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58650/69360c49-2390-84a6-97b6-227625201694.png">

(6) [インストール]をクリックしてください。
<img width="732" alt="スクリーンショット 2020-06-01 8.48.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58650/f43c4803-52fd-8edf-7810-258d2c02ecd0.png">

(7) ①Touch IDを利用する、または②[パスワードを使用...]をクリックしてMacアカウントのパスワードを入力してください。
<img width="555" alt="スクリーンショット 2020-06-01 8.48.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58650/daabcf56-e771-4fa9-1630-686485068409.png">

(8) [閉じる]をクリックしてください。
<img width="732" alt="スクリーンショット 2020-06-01 8.49.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58650/1d6756a9-908e-6b6f-333d-44e15d383628.png">

(9) [ゴミ箱に入れる]をクリックしてください。
<img width="732" alt="スクリーンショット 2020-06-01 8.49.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58650/6691dd06-795f-40a8-21b9-ca65ca7a4349.png">

(10) 一番左上の赤い丸をクリックしてください。そうすると、Zoomが終了します。
<img width="650" alt="スクリーンショット 2020-06-01 8.49.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58650/76deda5c-9442-8436-1114-f613062bc734.png">

(11) [OK]をクリックしてください。
<img width="488" alt="スクリーンショット 2020-06-01 8.49.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58650/4052c51e-849c-a594-be7f-4456eab2bd7f.png">
【Rails】gretelを使ってパンくずリストを追加してみる。

# パンくずリストとは

パンくずリストとはWEBサイト上で自分がどこにいるかをわかりやすく表示しているものになります。
下記サイト参考
https://www.asobou.co.jp/blog/web/breadcrumb-list

パンくずリストを導入することで
・ユーザビリティが高くなる
・SEOに強くなる
というメリットがあります。

今回はrailsにてパンくずリストを導入する手順を書いていきます。

# 導入

railsでパンくずを導入するには「gretel」というgemを使うと便利です。
■gem gretelのGithub
https://github.com/lassebunk/gretel

まずはGemfileに追記して、bundle installを行う。

Gemfile

```
gem 'gretel'
```

```
$ bundle install
```

その後起動コマンドを入力

```
$ rails generate gretel:install
```

このコマンドを入力すると、config配下にbreadcrumb.rbというファイルが生成されます。
そのファイルにパンくずの定義を書いていきます。

書き方の例を下記に示します。

```breadcrumbs.rb
crumb :admin_dashboard do
  link '<i class="fa fa-dashboard"></i> Home'.html_safe, admin_dashboard_path
end

crumb :edit_admin_site do
  link '設定', edit_admin_site_path
  parent :admin_dashboard
end

crumb :admin_users do
  link 'ユーザー', admin_users_path
  parent :admin_dashboard
end
```

```
crumb crumsの名前を指定 do
  link '表示させたい文字', その文字のリンク先
  parent 親の指定
end
```
といった使い方になります。

ビュー側の表示は下記のように指定します。

```
<% breadcrumb :admin_users %>
```

slimの場合は

```
- breadcrumb :admin_users
```

# 参考
■パンくずリストについて参考にしたサイト
https://www.asobou.co.jp/blog/web/breadcrumb-list

■gem gretelのGithub
https://github.com/lassebunk/gretel