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

#はじめに
こちらではphp構築〜Laraval構築まで紹介したいと思います。

最近Qiitaに投稿し始めましたが構築関連の記事が伸びますね・・・


#前提環境
[VirtualBox](https://www.virtualbox.org/)
[Vagrant](https://www.vagrantup.com/)
[Apache](https://httpd.apache.org/)
[MySQL](https://www.mysql.com/jp/)
[Cent0S7](https://www.centos.org/)

[こちら](https://qiita.com/I_S-657/items/63528d09995138c9e46d)で構築の紹介をさせていただいてます参考にどうぞ
[MySQL](https://qiita.com/I_S-657/items/8e2eb94367c418000fd9)
[Apache](https://qiita.com/I_S-657/items/11a1b17c87878cee380a)

#手順
###PHP
まずPHPをインストール
CentOS7は標準リポジトリにはPHP７が提供されていないようなので
Remiのyumリポジトリを追加してインストールしましょう。

```
# yum -y install epel-release
```

[公式](http://rpms.remirepo.net/)よりRemiのリポジトリのインストール

```
# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```

phpインストール

```
# yum -y install --enablerepo=remi,remi-php73 php php-devel php-mbstring php-pdo php-gd php-zip php-xml  php-mysqlnd
```

###Composer
こんどはComposerのインストール
公式より

```
# curl https://getcomposer.org/installer | php
```
コマンドが実施できるようにbinの中に移動

```
# mv -i composer.phar /usr/local/bin/composer
```
プロジェクト制作

```
# composer create-project --prefer-dist laravel/laravel [任意のプロジェクト名]
```


```
#　cd [プロジェクト名]
```
キーの生成

```
# php artisan key:generate
```
権限の変更

```
# chown -R root:apache storage
```

```
# chmod -R 0775 storage
```

```
# chcon -R -t httpd_sys_rw_content_t /var/www/html/[プロジェクト名]/storage
```
Apacheドキュメントルートの変更

```conf:httpd.conf
DocumentRoot "/var/www/html/[プロジェクト名]/public"
```


Apacheの再起動

```
# systemctl restart httpd
```
アクセスしてトップ画面がでたら成功！！

#まとめ
いかがだったでしょうか
次はLaravalの操作について書いていきたいとおもいます。
Docker入門(3)/忘備録(Nginxサーバを起動)

Dockerデーモンをインストール
https://qiita.com/Uenrio/items/27355170e09da650cf48

Docker compose をインストール

```
$sudo curl -L https://github.com/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
```


Docker compose の実行権限を与える

```
$sudo chmod +x /usr/local/bin/docker-compose
```

インストール確認

```
$docker-compose --version
	docker-compose version 1.25.4, build 8d51620a
```

コンテナをインストールする。

```
$ vi docker-compose.yml
```

下記を記述。

```ruby:docker-compose.yml
version: "3"
services:
    web-server:
        image: nginx:alpine
        ports:
            - "80:80"

```

```
$docker-compose up -d
```
※-dオプションをつけるとバックグラウンドで実行する


```
Pulling web-server (nginx:alpine)...
alpine: Pulling from library/nginx
4167d3e14976: Pull complete
bb292c78f105: Pull complete
Digest: sha256:abe5ce652eb78d9c793df34453fddde12bb4d93d9fbf2c363d0992726e4d2cad
Status: Downloaded newer image for nginx:alpine
Creating docker-practice_web-server_1 ... done

```

成功！

立てたサーバーにアクセスした後にログを確認
http://localhost/
https://gyazo.com/dbfe9880c40be3ccfd4ba020565340de
上リンクのようなページが表示されれば完了！
↓

```
$docker logs docker-practice_web-server_1 -f
```
※docker-practice_web-server_1はコンテナ名


アクセスした結果のログ

```
192.168.176.1 - - [10/Apr/2020:04:10:55 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36" "-"
192.168.176.1 - - [10/Apr/2020:04:10:55 +0000] "GET /favicon.ico HTTP/1.1" 404 555 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36" "-"
2020/04/10 04:10:55 [error] 7#7: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.176.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "localhost", referrer: "http://localhost/"
192.168.176.1 - - [10/Apr/2020:04:11:59 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36" "-"
```

構築完了！

コンテナを落としたい時

```
$ docker-compose down
```
(自動でコンテナも消してくれる)
当然、 http://localhost/
にアクセスしてもページは表示されない
fatal: repository 'git@github.com/hoge/fuga.git' does not existとなった時の対応方法

- 環境
    - CentOS Linux release 7.6.1810 (Core)
    - git version 1.8.3.1

# 事象 : GutHubにDeploy keyを登録してパスワードなしでリポジトリをクローンしようとしたら怒られた

```bash
# .ssh配下に鍵は配置されている
$ ls -la .ssh/id_rsa
-rw-------. 1 ponsuke ponsuke 1675 Apr 10 10:28 id_rsa

# クローンしようとしたら怒られた
$ git clone git@github.com/hoge/fuga.git
fatal: repository 'git@github.com/hoge/fuga.git' does not exist
```

# 原因 : リポジトリの指定方法を間違えているから
- Deploy keyを使用しない場合 : `https://github.com/hoge/fuga.git`
- Deploy keyを使用する場合 : `git@github.com:hoge/fuga.git`

`github.com`の次が`:`じゃなくて`/`。
コピーしてきたリポジトリのURLをちょこっと直して使ったら失敗しました・・・。

## 対応 : リポジトリを正しく指定する

```bash:うまくいった
$ git clone git@github.com:hoge/fuga.git
Cloning into 'fuga'...
remote: Enumerating objects: 55, done.
remote: Counting objects: 100% (55/55), done.
remote: Compressing objects: 100% (47/47), done.
remote: Total 7617 (delta 29), reused 21 (delta 8), pack-reused 7562
...省略...
Checking out files: 100% (5895/5895), done.
```


# ほかの原因
今回は違ったけどまた同じことになった時のために・・・

## GitHubへのSSHアクセスできない
[Error: Repository not found - GitHub ヘルプ](https://help.github.com/ja/github/creating-cloning-and-archiving-repositories/error-repository-not-found#check-your-ssh-access)

```bash:SSH接続できるとこうなる
# 仮想端末の割り当てをしない(-T)でSSH接続する
$ ssh -T git@github.com
The authenticity of host 'github.com (52.xxx.xx.xx)' can't be established.
...省略...
Hi hoge/fuga! You've successfully authenticated, but GitHub does not provide shell access.
```

## ログインユーザーが誤っている
[gitの複数アカウント管理で詰まった「ERROR: Repository not found. fatal: Could not read from remote repository.」 - 仮想サーファーの日常](https://www.virtual-surfer.com/entry/2018/04/21/212704)
[git cloneしたらERROR: Repository not found. - ls [internet]](http://ls.hateblo.jp/entry/git-clone-failed-github)
Docker入門(2)/忘備録

Docker 入門(2)

Docker Compose

・Docker-compose.ymlファイルで複数のコンテナを一気に管理(定義)できる
・環境変数、ポート番号などこのDocker-compose.yml内で定義出来る
・複数のコンテナが自動で同じネットワークに繋がる(めっちゃ楽！)

Docker Composeの見本

```
version: “3”
services:
	reverse-proxy:
		image: nginx
		volumes:
			./config:/etc/nginx/nginx.conf.d
		ports:
			“80:80”
		restart: always

	web-server:
		image: nginx
		volumes: 
			./docs:/usr/share/nginx/html

```


※二つのコンテナ(ここではnginxが二つ)を管理。reverse-proxy,web-serverといった具合に同じnginxでも
名前解決できる。
※二つのコンテナは同じネットワークに繋がる。

・version => docker-compose.ymlの書式のバージョン
・services => この中にコンテナ(複数)を記述する
・reverse-proxy,web-server => コンテナ名
・image => 使いたいイメージ
・volumes => イメージのマウント先
・restart: always => Dockerデーモンが立ち上がった時には自動で起動されると言う意味
※docker run コマンドのオプションをymlファイルの中に記述する感じ



Dockerコマンド
・$ docker ps
	=> 現在立っているコンテナが表示される

```
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
1fe2d5b1d4dc        rails_web           "bundle exec rails s…"   4 weeks ago         Up 4 weeks          0.0.0.0:3000->3000/tcp   rails_web_1
c4caa0dcfef7        mysql:5.7           "docker-entrypoint.s…"   4 weeks ago         Up 4 weeks          3306/tcp, 33060/tcp      rails_db_1	

```


オプション
・ -a : 現在立っている、いないに関わらず全てのコンテナを表示する

```
docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                   PORTS                    NAMES
1fe2d5b1d4dc        rails_web           "bundle exec rails s…"   4 weeks ago         Up 4 weeks               0.0.0.0:3000->3000/tcp   rails_web_1
c4caa0dcfef7        mysql:5.7           "docker-entrypoint.s…"   4 weeks ago         Up 4 weeks               3306/tcp, 33060/tcp      rails_db_1
05a5015ccaab        hello-world         "/hello"                 7 weeks ago         Exited (0) 7 weeks ago                            charming_austin
56692f71fe8c        hello-world         "/hello"                 7 weeks ago         Exited (0) 7 weeks ago                            silly_montalcini

```
Action text インストールでwebpackerとyarnでエラー

リッチテキストエディタを使いたかったので、
恐々としながら、rails6にアップデート。

当然色々とエラーが出た😢

知ってればしょーもないことがあったので、メモしておきます。

#１、webpackerとyarnをいれろと言われるが、yarnはgemではない！

これが、実にくだらない話なのですが・・・
yarnはgemではないので、気を付けて下さい！
windowsに限るのかもしれませんが、そのままinstall yarn とすると、gemになります。

gemのyarnは2011年から更新が止まっている別物。
https://rubygems.org/gems/yarn

今回求められているのは、2016年以降にできたNode.jsにまつわる全くの別物。

最初にgemで入れてしまい、何が何だか分からなくなってしまった。

とにかく、gemではないので、gemでinstallしないでください！
自動で入ったのが次の方法。

#2、webpackerは、gemだけじゃインストールされない

まだまだ、初心者なので、違うかもしれませんが、
https://rubygems.org/gems/webpacker
こちらから、webpackerの最新版をgemファイルに記載し、bundle installしたものの、
なぜか、webpacker -v でもバージョンが出てこない。

そこで、よくよく調べると、
```
rails webpacker:install
```
で、インストールが必要だった。

これにより、上記のyarnも無事最新版が自動でinstall。

最後にもう一度、

```
rails action_text:install
```

こちらで、ＯＫ！
自分用snippetsファイル雛形

{
    "snippets" : [
        {
            "name" : "pd.set_option",
            "code" : [
                "import pandas as pd",
                "pd.set_option('max_rows',1)",
                "pd.set_option('max_columns',100)"
                
            ]
        },
        {
            "name" : "matplotlib",
            "code" : [
                "import matplotlib.pyplot as plt",
                "import japanize_matplotlib"
            ]
        },
        {
            "name" : "初期",
            "code" : [
                "import pandas as pd",
                "import numpy as np",
                "import warnings",
                "warnings.filterwarnings('ignore')",
                "import matplotlib.pyplot as plt",
                "%matplotlib inline",
                "import seaborn as sns",
                "import datetime",
                "from tqdm import tqdm_notebook as tqdm",
                "import japanize_matplotlib",
                "sns.set(font='Yu Gothic')",
                "import math"
            ]
        },
        {
            "name" : "seaborn",
            "code" : [
                "def sns_countplot(df,columns_name):",
                "    plt.figure(figsize=(20, 10))",
                "    sns.countplot(x='{}'.format(columns_name), data = df);",
                "",
                "def sns_distplot(series):",
                "    plt.figure(figsize=(20, 10))",
                "    sns.distplot(series);",
                "",
                "def sns_regplot(df,series_x,series_y):",
                "    plt.figure(figsize=(20, 10))",
                "    sns.regplot(x=series_x, y=series_y);",
                "#https://qiita.com/ryo111/items/bf24c8cf508ad90cfe2e",
                "def sns_pairplot(df,series_name):",
                "    sns.pairplot(df,",
                "    hue='{}'.format(series_name),",
                "    diag_kind='hist'",
                "    )",
                "    plt.grid(True)"
            ]
        },
        {
            "name" : "DataFrameを綺麗に",
            "code" : [
                "display(df.style.background_gradient(cmap='summer',low=6.))",
                "df.bar(subset=[], color='#d65f5f')",
                "#http://sinhrks.hatenablog.com/entry/2015/11/22/202640"
            ]
        }
    ]
}
【COBOL】初めての人でも簡単に開発環境（OpenCOBOL）を構築し、Hello Worldのプログラムを作成・実行出来るようにするまで

#概要
COBOL初心者の方向けに、Ubuntu上で開発環境(OpenCOBOL)を構築し、Hello Worldのプログラムを作成・実行するまでの手法を記載しました。

#前提条件
Ubuntu上で作業を行います。
Windows環境のみで、Ubuntu環境を持っていない方は[こちらの記事](https://qiita.com/yut-nagase/items/391462e365a135d91b6f)を参考にして作成してください。

#構築手順

##OpenCOBOLをインストールする

- ターミナル上で以下のコマンドを実行します。

    ```shell
    sudo apt-get install open-cobol
    ```


#Hello Worldのプログラムを作成、実行する

1. pwdコマンドを実行。現在のディレクトリを確認

    ```shell
    $ pwd
    /home/user1 
    ```

2. 任意のディレクトリを作成。ここでは、dev という名前のディレクトリを作成しました。

    ```shell
    $ mkdir dev
    $ cd dev
    $ pwd
    /home/user1 /dev
    ```

3. 以下のコマンドで、COBOLのソースファイルを作成。ここでは、Hello.cbl を作成しました。

    ```shell
    $ vi Hello.cbl
    ```

4. 以下のソースコードを入力して保存

    ```
    000010 IDENTIFICATION                   DIVISION.
    000020 PROGRAM-ID.                      HELLO-WLD.
    000030 ENVIRONMENT                      DIVISION.
    000040 DATA                             DIVISION.
    000050 PROCEDURE                        DIVISION.
    000060 MAIN.
    000070     DISPLAY "HELLO WORLD"  UPON CONSOLE.
    000080     STOP RUN.
    ```

5. 以下のコマンドでプログラムをコンパイルします。

    ```shell
    $ cobc -x ./Hello.cbl
    ```

6. 実行ファイルとして"Hello"という名前のファイルが作成されます。

    ```shell
    $ ls
    Hello  Hello.cbl
    ```

7. 以下のコマンドでプログラムを実行します。結果が出力されました。

    ```shell
    $ ./Hello
    HELLO WORLD
    ```
LINE@

#LINE@

・プッシュ通知ができる

LINE Nofity経由の通知受信
・LINE@にきたメッセージ通知を受け取りたいLINEアカウント
・通知の頻度
を設定。

連携が完了すると、LINENofityが友達に追加され、通知が受信できるようになる。

LINE＠のアプリ通知を受け取ることも可能。
個人のLINEアカウントで通知を受け取りたい場合、LINENofityが必要。
CentOS8のnginxでユーザディレクトリ(public_html)作成

# nginxのインストール

```
 dnf install nginx
```

# ユーザディレクトリの設定

```
 cd /etc/nginx
 vi nginx.conf
```

ユーザディレクトリのロケーションを書き込む

```
  # for UserDir
  location ~ ^/~(.+?)(/.*)?$ {
    alias /home/$1/public_html$2;
  }
```

再起動

```
 systemctl restart nginx
```

# ユーザディレクトリでphpを有効にする
## phpのインストール
### インストール

```
 dnf install php php-mbstring php-xml php-xmlrpc php-gd php-pdo php-mysqlnd php-json
```

### 確認

```
 php -v
```

## nginxでphpを有効化
再起動

```
 systemctl restart nginx
```

有効になったことを確認する

```
 cd /usr/share/nginx/html
 echo '<?php phpinfo(); ?>' > /usr/share/nginx/html/info.php
```

ブラウザからも下記のアドレスにアクセスして確認する
http://localhost/info.php


## ユーザディレクトリの設定を変更する

```
 cd /etc/nginx
 vi nginx.conf
```

```
 location ~ ^/~([^/]+)/(.+\.php)$ {
 #    fastcgi_split_path_info ^(.+\.(?:php|phar))(/.*)$;
 #
     alias /home/$1/public_html/$2;
     fastcgi_intercept_errors on;
     fastcgi_index  index.php;
     include        fastcgi_params;
     fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
     fastcgi_param  PATH_INFO $fastcgi_path_info;
     fastcgi_pass   php-fpm;
 }
```
angular+wijimo+api(python)でシステム構成

- 開発ツール
Visual Studio Code
- 拡張機能
Wijmo Designer
- 参照：
-
 https://www.grapecity.co.jp/developer/wijmo?utm_medium=link&utm_source=tools-top-section
 https://www.grapecity.com/blogs/build-angular-apps-with-wijmo-and-npm/
 https://qiita.com/koronpo/items/0e982da69182694741b8
【Ubuntu】apt-getで、ファイルロックの為失敗。解決した時のメモ

#概要
Ubuntu上でapt-getコマンドを実行した際に、ファイルロックの為、失敗しました。
その際の解決メモです。

#環境
Ubuntu19.10

#エラー発生時の手順

- ターミナル上で以下のコマンドを実行しました。

```shell
sudo apt-get install open-cobol
```

- 以下のエラーメッセージが表示されました。

```
Could not get lock /var/lib/dpkg/lock-frontend.
It is held by process 2118
Resource temporarily unavailable.
Be aware that removing the lock file is not a solution and may break your system.
Unable to acqure the dpkg frontend lock
```

- エラーメッセージにも記載されている通り、「ロックファイルを削除することは解決策ではなく、システムを破壊する可能性があることに注意してください。」と有るので、ロックファイルを削除する事はやめましょう。

- topコマンドを実行してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235774/51c72390-2f6c-03ec-f7bf-22ab8877ca23.png)

- unattendeのプロセスが起動しているようです。そういえば、OS起動時にアップデートに失敗したとかなんかのエラーメッセージが出ていました。
- 再起動します。
- 以下、再起動中の画面ですが「Unattended-upgrade in progress during shutdown, please don't turn off the computer」メッセージが表示されています。アップデート処理が走っているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235774/f1568d39-3af1-62d1-923c-326a99ddad24.png)

- 途中、中座したので正確ではありませんが、20分以上はアップデートに時間がかかりました。
- 改めて実行したら、コマンド実行に成功しました。
docker volumeの中身を確認してみました

# まずはvolumeの一覧を表示

```list.sh

$ docker volume ls
du667382djcn・・・
hy66557738mj・・・
examplevolume
examplevolume2

```

ここで表示されたdu6673のような乱数の
volumeがなぜか自動生成されることがあります。
自分の認識範囲ではコンテナをプル、スタートなどした際に
回線が切れたり、マウントやイメージ内のファイルを直でいじったりなど
何らかの原因で起こることが多い気がしています。
（こんな時に自動生成されるよ〜という経験談などありましたらコメントいただけたら嬉しいです）
【2022.2追記】docker-compose.ymlファイルがないディレクトリでdocker compose up -dでコンテナを走らせたら
自分の環境では乱数volumeが生成されました。
他にも発見したら追記します。

# 自動生成されたボリュームをマウントしてテストコンテナを立ててみる

```run.sh

$ docker run -itd --name testvolume -v du667382djcn:/du667382djcn busybox

```

コマンド構成としては
docker run -itd --name コンテナ名をここに -v ボリューム名をここに:/コンテナ内にボリュームをアタッチする際のコンテナ内のディレクトリ名を自由に設定 busybox（←イメージ。busyboxは軽量なリナックスコマンド群のイメージ）

のような形になります。

注）:/のスラッシュが抜けるとエラーになるので注意です。

# いざコンテナ内ボリュームディレクトリへ

```exec.sh

$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
a23fd4z8ks2d        busybox             "sh"                8 seconds ago       Up 7 seconds                            testvolume

$ docker exec -it a23fd4z8ks2d /bin/ash
/ # ls -la
total 48
drwxr-xr-x    1 root     root          4096 Apr 10 03:19 .
drwxr-xr-x    1 root     root          4096 Apr 10 03:19 ..
-rwxr-xr-x    1 root     root             0 Apr 10 03:19 .dockerenv
drwxr-xr-x    2 root     root         12288 Jul 16  2019 bin
drwxr-xr-x    5 root     root           360 Apr 10 03:19 dev

drwxr-xr-x    2 root     root          4096 Nov 11 10:03 du667382djcn

drwxr-xr-x    1 root     root          4096 Apr 10 03:19 etc
drwxr-xr-x    2 nobody   nogroup       4096 Jul 16  2019 home
dr-xr-xr-x  190 root     root             0 Apr 10 03:19 proc
drwx------    1 root     root          4096 Apr 10 03:20 root
dr-xr-xr-x   13 root     root             0 Apr 10 03:19 sys
drwxrwxrwt    2 root     root          4096 Jul 16  2019 tmp
drwxr-xr-x    3 root     root          4096 Jul 16  2019 usr
drwxr-xr-x    4 root     root          4096 Jul 16  2019 var

$ls -la /du667382djcn

```

これでマウントされたディレクトリ内の一覧が表示されます。

# 未解決な疑問点

少し前の情報を参考に以下のやり方を試したのですがうまくいきませんでした。

```error.sh

$ docker volume ls
du667382djcn・・・
hy66557738mj・・・
examplevolume
examplevolume2

$ docker volume inspect du667382djcn
[
    {
        "CreatedAt": "2017-11-11T10:１3:４５Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/du667382djcn・・・/_data",
        "Name": "du667382djcn・・・",
        "Options": null,
        "Scope": "local"
    }
]

$ sudo ls -la /var/lib/docker/volumes/du667382djcn・・・/_data
ls: /var/lib/docker/volumes/du667382djcn・・・/_data: No such file or directory

```

このやり方ができればこちらの方が楽なのですが
上記間違いや似たようなやり方がありましたらコメントいただければ嬉しく思います。
Google Colaboratoryで作成したcsvファイルをダウンロードする

Google Colaboratoryにファイルをアップロードするのはドラッグ＆ドロップでできますが、ダウンロードはドラッグ＆ドロップではできなったので、メモ。

```python
from google.colab import files

filename = 'hoge.csv'
files.download(filename)
```

これでOK
【Rails】本番環境とローカル環境のGemのインストール

ちょっと詰まったので備忘録
ローカルでunicornのgemを入れたけど本番では入ってないことに

```
bundle exec unicorn_rails -c config/unicorn.rb -E production -D
```

をしてから気付く
あれーおかしいなぁと思って調べたら[こちら](https://qiita.com/KONTA2019/items/46474bab52a9d6d0b3bc)で載っていたので参考に

#Githubのmasterを反映しないといけない
masterブランチで作業してたんで反映させないと本番環境にも反映されないっぽいですね。
解説の通りmasterをpushして反映→本番環境で

```
git pull origin master
```

これで反映されたので

```
bundle install
```

いっぱいgemが入ってきてunicornも確認出来ました。
いやー詰まってたところが解消されるとやっぱ気持ちいいもんですね。
目的と手段

プログラミングを勉強し始めて一番感じたこと。


それは
「目的」と「手段」を明確化です。
（→目的を達成するための手段であると言うこと）



（例）サッカー
自分は、小学校から大学までサッカーをしていました。

サッカーの目的は「試合で勝つことです」
そのための手段として、様々な練習があります。（パス練習や対人練習etc）

しかし、目的を見失って練習している選手がほとんどだと思います。
これは、指導者にも言えることです。

つまり、「目の前の練習をミスなく行うことが目的になっている」と言うことです。
俗に言う、練習のための練習です。
（指導者が「なぜこの練習を行うのか」を考えさせることが重要かもしれませんね）



話を戻すと…
要はプログラミングだけでなく、全てに同じことが言えます。

プログラミングも「これを作る」と言う目的があり
そのために、必要な言語であり
そのために、必要な色んな要素を使うことです。

言語を学ぶにも、要素や色んなことを勉強するにも、
なんの「目的」のために行うか。
を常に頭に入れて、進めていくことが大切と感じました。

以上
自分用メモ: 論理学

TaPLを読めたり、色んな恩恵がありそうなので、論理学を学んでみる

## 命題論理

### 論理定数(又は命題定数)

"q", "r", "hoge_hoge" 等の記号

### 論理記号

論理記号は以下の５種類

```
¬ :not
(¬φ)

φ | ¬φ
- | -
1 0
0 1

∧ :and
(φ ∧ ψ)

φ ψ | φ ∧ ψ
- - | -
1 1 | 1
1 0 | 0
0 1 | 0
0 0 | 0

∨ :or
(φ ∨ ψ)

φ ψ | φ ∨ ψ
- - | -
1 1 | 1
1 0 | 0
0 1 | 0
0 0 | 0

⇒ :A then B
(φ ⇒ ψ)

φ ψ | φ ⇒ ψ
- - | -
1 1 | 1
1 0 | 0
0 1 | 1
0 0 | 1


⇔ :(A then B) and (B then A)
(φ ⇔ ψ)

φ ψ | φ ⇔ ψ
- - | -
1 1 | 1
1 0 | 0
0 1 | 0
0 0 | 1
```

### 演算子の優先順位
()で毎回くくると()が煩いので、演算子に優先順位を付ける

上が優先順位高く、下が低い

```
High

¬
∧
∨
⇒
⇔

Low
```

**※1** これは http://intrologic.stanford.edu/coursera で提案された手法で、一般的かはわからない

### 命題語彙

命題語彙は命題定数の集合

### 命題言語

命題言語は、命題語彙から形成できるすべての命題文の集合

### 呼び方知らない演算子群

Σっぽいやつ
<img width="93" alt="スクリーンショット 2020-04-10 18.32.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141711/2a46c0d5-8fd4-f767-2d2c-c88512e683e1.png">

意味は`A_1 and A_2 and ..... and A_n`

出典元: https://wiis.info/math/logic/predicate-logic/inference-rule/

## 述語論理
述語論理は命題論理を拡張したもの。

### 話の世界

話の世界は有限集合でなければならない

例
話の世界: `U = { a, b, c, d, e }`

### 論理記号

論理記号は命題論理の論理記号に２つの限量記号、"全称記号 ∀"と"存在記号 ∃"が追加される

全称記号の意味は話の世界の集合の要素全てに当てはまるってことで、こんな感じ。 (詳しくは"よくわかる記号論理の159ページあたりを参照

```
A_1 and A_2 and ..... and A_n
```

### 束縛変項

使いそうな用語カタログ的な奴

例

```
∃yF(x, y)
```

1. 右のF(x, y)のyは∃yのyを照応している
1. 右のF(x, y)のyも∃yのyも束縛されている
    1. このように束縛されている変項を束縛変項と言う
    2. 限量記号は変項(例 x, y)と共に必ず使われる。そのため、誤解が生じない限り、変項まで含め、"∀x"や"∃y"を限量記号と呼べば、"限量記号に照応する変項は束縛されている"と言える
1. xは束縛されていないので、自由変項と言う

### n項述語と変項への代入

1項述語の例
xはそそっかしい

2項述語の例
xはyが好き

このxやyの変項へ代入する方法には２通りある。
単純代入と同時代入
単純代入はxを代入してから、yを代入する
同時代入は、xとyを同時に代入する

２項述語に単純代入をした場合、１回目は１項述語になり、２回めは0項述語になる

### 述語言語

述語言語（Predicate Language）はPrLと呼ばれる


...やる気ある時に随時更新する
[Mac]ローカル開発環境構築方法[Vagrant]

#VirtualBoxとVagrantを使ってローカル開発環境を構築していく
まず、ローカル開発環境とは、`手元のPCにインターネットサーバと同じ環境がある`ことをいいます。
アプリやサービスを開発した時には、インターネット上にアップしたくなると思いますが、手元のPCを24時間インターネットに繋いておくのはあまり良くないので、
普段はサーバ会社が提供しているサーバに入れておく必要があります。
このサーバを手元のPC内に作ってしまおうというのが、ローカル開発環境なのです。

今回はVirtualBoxとVagrantを使ってMacにローカル開発環境を作っていきます。

#VirtualBox
まずVitualBoxをダウンロードします。難しい手順はないので、指示される通りに進めばOKです。
途中でパスワードを求められますが、これはMacのパスワードを入れればいいです。
ダウンロードをクリックして、OS X hostsを選んでください。
[VirtualBox](https://www.virtualbox.org)
<img width="1428" alt="スクリーンショット 2020-04-10 12.00.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601125/85cf0569-b7e7-61b6-cf4f-5ccdb55d8188.png">
<img width="1422" alt="スクリーンショット 2020-04-10 12.02.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601125/57dd7fe0-0317-7541-7969-490d65b10991.png">

このVirtualBoxがあれば、何個でも手元のPCにサーバを作ることができます。
しかし、このVirtualBoxは操作がややこしいとのことなので、それを簡単にするために次のものをインストールします。

#Vagrant
VirtualBoxのコマンドを簡単にするためのツールです。
これもダウンロードは難しくないので、手順通りに進めてください。
[vagrant](https://vagrantup.com)
<img width="1435" alt="スクリーンショット 2020-04-10 12.07.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601125/c8573fe7-55fb-798f-a09e-d36259b71f69.png">

#Vagrantでサーバを立ち上げるまで
サーバ１つにつき、１つのフォルダが必要です。ですが、バラバラに管理するのは面倒なので、管理用のフォルダを作成して、その中に複数のフォルダを作っていきましょう。
`例）　「MyVagrant」」フォルダの中に「Mytest」や「Myapp」を作る`
そして、このフォルダ内で、サーバを立ち上げていくのですが、サーバの設定ファイルをVagrantで作ります。サーバ設定ファイルのことをVagrantfileといいます。このVagrantfileを読み込んで、VirtualBoxが起動し、サーバを立ち上げてくれます。
以下コマンドです。（ドットインストールさんを参考にさせていただいています）

```
# 今後複数の仮想マシンを作ることを想定して、それらをまとめるフォルダ（MyVagrant）を作る
mkdir MyVagrant

# MyVagrantに移動する
cd MyVagrant

# 仮想マシンを作るフォルダを作る（Mytest）
mkdir Mytest

# MyCentOSに移動する
cd Mytest

# 仮想マシン設定用のVagrantfileを作る
vagrant init bento/centos-6.8

# Vagrantfileを編集して仮想マシンのIPアドレスを192.168.33.10にする(ここは他のマシンと被らなければ大丈夫です)
sed -i '' -e 's/# config.vm.network "private_network", ip: "192.168.33.10"/config.vm.network "private_network", ip: "192.168.33.10"/' Vagrantfile

# 仮想マシンを起動する（少し時間かかります）
vagrant up

# 仮想マシンの状態を確認する(runningとなっていればOKです)
vagrant status
```

#仮想マシンにアプリケーションをインストールする


```
#vagrantファイルがあるところで実行(仮想マシンにログインする)
$ vagrant ssh

# OSを最新状態にアップデート（時間かかります）
sudo yum -y update

# スクリプトを入手するためのgitをインストール
sudo yum -y install git

# gitを使ってアプリケーション設定用のスクリプトをダウンロード
git clone https://github.com/dotinstallres/centos6.git

# centos6フォルダができるのでそちらに移動
cd centos6

# スクリプトを実行（時間かかります）
./run.sh

# もろもろの設定を反映
exec $SHELL -l
```

#仮想マシン上のファイルを簡単に転送するためのツールを導入
ここでは、Cyberduckというツールを使用します。
<img width="1414" alt="スクリーンショット 2020-04-10 12.32.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601125/5c855ce4-7631-cec9-922c-eed628fbf8ea.png">

Mac用のダウンロードボタンからダウンロードしてください。

#仮想マシンにアクセスする
Cyberduckを開いて、新規接続をクリックします。
プロトコルを選択する必要があるのですが、ここは**「SFTP」**を選択してください。
サーバ名は先ほどvagrantfileに設定した **192.168.33.10**　を入力します。（自身で決めたものでだいじょうぶです。）
ユーザ名・パスワード名はどちらも　**vagrant** としてください。

これでローカル開発環境の設定が完了しました！

#まとめ
昨日はこれがなかなかできなくて、1日中調べたりしてました…。基本的にはドットインストールさんを見ればできるとは思いますが、環境によってはできなかったりするみたいなので、あしからず...

#参考
[ドットインストール/ローカル開発環境の構築 [macOS編]](https://dotinstall.com/lessons/basic_localdev_mac_v2)
Zoomをショートカットキーから起動する（Mac編）

毎日３回以上zoomを使うようになったので、ショートカットで起動する方法を書きました。

環境：macOS Catalina (バージョン10.15.4)

## Automatorを設定
Automatorというアプリを使用します。Macに最初からインストールされています。
LaunchpadでAutomatorと検索すると次のようなロボットアイコンのアプリが表示されるので、これを起動します。
<img width="365" alt="スクリーンショット 2020-04-10 12.05.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563351/24b2084a-b966-ba3e-c00b-db32777dcb1d.png">

新規作成でクイックアクションを選択します。
<img width="540" alt="スクリーンショット 2020-04-10 11.55.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563351/dc3c9b3c-ef73-856c-3d10-e5744d9b1078.png">

ライブラリ>アプリケーションの起動を選択し、右のスペースへドラッグ＆ドロップします。
<img width="1552" alt="スクリーンショット 2020-04-10 12.14.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563351/b3329792-95b7-f47b-b471-4eea75520183.png">

アプリケーションの起動の連絡帳の部分を選択し、zoom.usに変更します。
<img width="689" alt="スクリーンショット 2020-04-10 12.14.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563351/4a016d1c-3ce7-90a3-1893-92c36c9ae1ab.png">

リストからその他を選択します。
<img width="198" alt="スクリーンショット 2020-04-10 12.15.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563351/467fad6c-bcb4-ce11-7f9e-d3b330109b25.png">

アプリケーションフォルダにあるzoom.usを選び、選択をクリックします。
<img width="911" alt="スクリーンショット 2020-04-10 12.16.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563351/adc689ea-a513-5fd1-38e4-ada45298f512.png">

このようになったら、ファイル>保存　します。
<img width="1552" alt="スクリーンショット 2020-04-10 12.08.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563351/44ea84d1-fa34-2347-cf6a-e40a36696595.png">

ファイルから保存を選択
<img width="270" alt="スクリーンショット 2020-04-10 12.18.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563351/9b870d30-723e-4024-0816-946ad80cf231.png">

わかりやすいように[zoomを起動する] と名前をつけます。
<img width="447" alt="スクリーンショット 2020-04-10 12.19.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563351/0def1aaa-eb97-3a91-4f43-a8d320b25160.png">

#キーボードショートカットを作成する
システム環境設定を開きます
<img width="265" alt="スクリーンショット 2020-04-10 12.20.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563351/5a88b17e-40d8-af9a-a7d4-8b8a33952ef7.png">

キーボード＞ショートカットタブを開き、左のメニューからサービスを選択します。
<img width="780" alt="スクリーンショット 2020-04-10 12.21.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563351/bed696cc-e946-b3a7-9d6b-db8090ab286c.png">
右のメニューに先ほど作った[zoomを起動する]があるので、これにショートカットキーを割り当てます。
今回は、Command(⌘)+Option (⌥)+Shift(⇧)+1
をショートカットキーとして割り当てします。

これからは以下を同時に押すだけでいつでも1秒でzoomが起動できます!　（パチパチ）
Command(⌘)+Option (⌥)+Shift(⇧)+1

##おまけ
印刷して手元に置いておきたくて
[zoom起動後のショートカットキー](https://qiita.com/Nattokin/items/0b441543ba2c47d86ec0)もQiitaに書きました。よろしければご参考にしてください。

オンライン会議が続きますが、時間短縮してもっと快適に過ごしていきましょう。
[Rails]Bootstrap3の導入方法

# 開発環境
・Ruby: 2.5.7
・Rails: 5.2.4
・Vagrant: 2.2.7
・VirtualBox: 6.1
・OS: macOS Catalina

#1.gemを導入

```rb:Gemfile
gem 'bootstrap-sass'
gem 'jquery-rails'
```

```terminal:ターミナル
$ bundle
```

#2.「application.css」ファイルをscss形式に変更

```terminal:ターミナル
$ mv app/assets/stylesheets/application.css app/assets/stylesheets/application.scss
```

#3.「application.scss」ファイルを編集

```scss:application.scss
// 追記
@import "bootstrap-sprockets";
@import "bootstrap"; 
```

#3.「application.js」ファイルを編集

```js:application.js
//= require rails-ujs
//= require turbolinks
//= require jquery // 追記
//= require bootstrap-sprockets //追記
//= require_tree .
```
Google VisionのOCR機能を試してみる

AutomationAnywhereの[IQ Bot](https://qiita.com/IQBotter/items/fab5f59230ff38a98bbd)のV11系統の最新版であるV11.3.4では、OCRの選択肢にGoogle Visionが加わりました。

この Google VisionのOCR機能は、インターネット上で誰でも簡単に試すことができます。

やりかたをこちらにまとめます。

#Google VisionのOCRを試す！

##Webサイトにアクセス

こちら↓のページにアクセスします。
https://cloud.google.com/vision/

##「TRY API」に画像をドラッグ（JPG,GIF,PNG）

上記のページをちょっと下の方にスクロールして、以下の点線の中に画像をスクロールします。
アップロードする形式は、JPG、GIF、PNGならOKで、PDFとTiffはエラーになります[^1]。
![TRYAPI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/64219616-ea6b-160a-a743-b82eda57a43e.jpeg)

##私はロボットではありませんにチェック

画像をアップロードすると、その下に「私はロボットではありません」というチェックボックスが出てきますので、チェックを入れます。
（スクロールしないと出てこない位置にあるので見落としがちです。スクロールしましょう）

![下の方にチェック_絵つき_整形.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/3c313d2c-a64e-b750-ac8e-18b47095fed7.jpeg)

##「Text」タブを選択

このような画面が出てくるので、「Text」タブをクリック。
![Textをクリック_整形.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/3abb8d5a-27a1-da63-3c54-f8d7d266cf62.jpeg)


##できあがり

するとこのように、画像の中に埋め込まれているテキストの情報をGoogleVisionが読み取ったとおりに表示してくれます。
![結果_整形.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/89d0894b-e980-11db-3a2f-440c428923b2.jpeg)

#まとめ

以上の流れで、誰でも簡単にGoogle VisionのOCRを試すことができます。

IQ BotをGoogleで処理した場合の結果が知りたい！　でも設定とかする前に、まずOCRの結果だけざっくり知りたい！　という場合はここで直接試すと便利です。

[^1]: IQ BotからGoogle Visionを呼ぶときは、PDFやTiffでも処理可能です（IQ Bot内部でGoogle Visionが処理可能な形式に変換しているため）。
recommend engineとは？　その種類まとめ

## recommend engineとは
例えばNetflixを開くと、「あなたにお勧め」
という欄がトップ画面にある。
この「あなたにお勧め」
を抽出するエンジンのこと。

recommend engineの制度によってサイト全体の売り上げが大きく変わるため、データサイエンティストの活躍の場の一つとなっている。
recommend engineを作るフレームワークとしてsurpriseなどがある。


## recommend engineの種類
大体３種類ほどあるようだ。

### Simple engine
単純に評価が高いものをお勧めする。
個別ユーザーの好みは評価しない。
例えば、「君の名は」の評価が星５の時、
それを全てのユーザーにお勧めする。

利点
とてもシンプルで実装が簡単

欠点
個別のユーザー毎の好みを反映してレコメンドしていない。
そのため女性に対しSF、男性には女性人気の恋愛映画をレコメンドしたり精度が低い

### Content-based engine
単純に似ている内容の商品をレコメンドする。
例えばプレデターとエイリアンは内容が似ている。
あなたがプレデターが好きならエイリアンを勧める。

利点
実装が非確定簡単な事、人に説明しやすい。
映画をジャンル分けしてレコメンドする時に強い（SF、恋愛など）

欠点
流行に対応できないため、古い映画をレコメンドしがち。内容が似たものをレコメンドするだけのため、低評価、高評価に関係なくお勧めしてしまう。

### Collaborative Filtering engine
あなたに似たユーザーが好きなものをあなたにお勧めする。

例えば、あなたが崖の上のポニョ（ジブリ作品全般）が好きだとする。
あなた以外の崖の上のポニョ（ジブリ作品全般）が好きなユーザーは、なぜか「君の名は」も好きだ
なのでrecommend engineは、あなたに「君の名は」をお勧めする。

利点
個別のユーザーの好みに対しレコメンドするので精度が高い。

欠点
実装がやや難しく、人に説明しづらい。
大量のデータが無いと精度が低い。

## まとめ
Netflixなどデータに強い会社はcollaborative Filtering engineを採用している。
上から下へ行くほど実装難易度は上がるが、精度も上がっていく印象
SolitonNKは結果の表示だけじゃない。スクリプトを使って解析結果を基にアクションさせよう。（３／３）　異常DNSクエリをウェブに書き出すサンプルスクリプト

SolitonNKでankoスクリプトを用いて、解析結果を基にアクションさせるための解説記事、いよいよ最終回はスクリプトサンプルです。

ankoの`net/http`パッケージを用いて、引数`DATA`を受取って、ウェブAPIにポストするスクリプトのコア部分は次のようになります。

    body = strings.NewReader(DATA)
    req, _ = http.NewRequest("POST", url, body)
    req.Header.Add("Content-Type", "application/octet-stream")
    resp, _ = http.DefaultClient.Do(req)
    setEnum("Status", resp.Status)
    return true

これを用いて、[Winevent インジェスターを用いたDNSクエリ―分析](https://qiita.com/kakawai/items/938f8205625d0f68efc1) の発展形として、DNSクエリ―が異常ステータスになった場合を抽出し、`QueryStatus`と`QueryName`を `http://www.example.com` にポストするというサンプルスクリプトを作ると次のようになります。

	var http = import("net/http")
	var strings = import("strings")

	var url = "http://www.example.com"

	func Process() {
	    body = strings.NewReader(QueryStatus+","+QueryName)
	    req, _ = http.NewRequest("POST", url, body)
	    req.Header.Add("Content-Type", "application/octet-stream")
	    resp, _ = http.DefaultClient.Do(req)
	    setEnum("Status", resp.Status)
	    return true
	}

この anko スクリプトを `postapi` というリソースネームでSolitonNKに登録しておき、検索として

	tag=sysmon winlog EventID Image QueryName QueryResults QueryStatus!=0 | limit 5 | anko postapi | table

<img width="400" alt="SolitonNK-異常ステータスのDNSクエリ一覧2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480441/cd6ae927-2d88-62b0-6c41-5f02b2f53545.png">


などとすると、異常ステータスを示した５件分だけをウェブAPIにポストすることができます。なおWindowsのSyslogにおいて、`QueryStatus`は正常の際は0になり、何らかのエラーがある場合は0以外の値となることから、検索例では`QueryStatus`が0以外になった場合を抽出しています。[`QueryStatus`の値とその意味の一覧](https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--9000-11999-)を見ると分かるように、例えば`QueryResult`が無い場合には`QueryStatus`は9701になります。

検索でヒットしたDNSクエリ―の`QueryStatus`と`QueryName`は、ウェブAPIにポストされますので、ウェブサーバーのアクセスログは次のようになります。

<img width="436" alt="SolitonNK-異常ステータスのDNSクエリ一覧-webサーバログ2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480441/35374132-34f7-d4be-e30b-98097c0d5742.png">




Soliton NKを評価するための無償ダウンロードは以下のSoliton NK 公式サポートサイトでお申し込み下さい。

https://www.solitonnk.com/

Soliton NKによってさらに高度なログ分析をする方法の詳細について、今後記事を追加していく予定です。
JSON から C#、TypeScript、Swift、Go などの型定義を生成してくれる VS Code 拡張機能

いつも、https://quicktype.io を使ってたのですが、VS Code 拡張機能があることにさっき気づきました。

[Paste JSON as Code](https://marketplace.visualstudio.com/items?itemName=quicktype.quicktype)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70288/6c31afd8-1b2f-7fff-e031-1e0c8c2d38af.png)

例えば OpenWeather のレスポンスの JSON をクリップボードに格納してる状態で VS Code のコードパレットから `Paste JSON as Code` を選択すると…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70288/eb9fb42e-f3f5-6507-6a7c-1e568bab264f.png)

トップレベルの型名を入れるように言われるので適当に入れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70288/a7a5dcc3-6054-102b-a0d0-d43d6a255dde.png)

そうすると、こんな感じのコードを生成してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70288/958aff68-db57-c978-6746-9e80f9ffa721.png)

ファイルタイプから言語を認識してくれるみたいで、上の例では `.cs` のファイルに対して張り付けた結果になります。試しに `.swift` の拡張子のファイルに貼ると以下のようなコードが生成されました。Swift だ…。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70288/3a5ad7d7-7a27-843d-8ddc-96c99d2ed8ea.png)

`.ts` でやると TypeScript になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70288/f5597117-70ed-338e-734f-6f04c97b0482.png)

JSON ファイルが手元にある場合はコマンドパレットで `Open quicktype for JSON` とやると…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70288/30d667d4-5ee9-4ff4-7af4-fbef4511d08f.png)

以下のようにリアルタイムで JSON からコードにしてくれます。途中で `Set quicktype target language` で変換先言語も変えることが出来ます。

![quicktype.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70288/c21f3760-5da7-4c8d-8423-ea3eaed5de5c.gif)

対応言語は拡張機能のページに書いてある以下の言語に対応しているようです。

```
Supports TypeScript, Python, Go, Ruby, C#, Java, Swift, 
Rust, Kotlin, C++, Flow, Objective-C, JavaScript, Elm, and JSON Schema.
```

## まとめ

今まで quicktype.io のサイトにいってたけど、これからは VS Code でやれるね。
Swagger とか Open API とかみたいに API 定義がきちんとある Web API は、そっちから生成するツールでやったほうがいいけど、そういうのが無かったり単に JSON をパースしたいときは、こっちが便利そう。

## 追記

Visual Studio 2019 用拡張機能が無かったので作りました。

[JSON からクラスを生成してくれる quicktype の Visual Studio 2019 用拡張機能作りました](https://qiita.com/okazuki/items/3303400e3c731f47cbc9)
全ての約数を列挙する `Prime#each_divisor` を実装

Rubyの [**`Prime` クラス**](https://docs.ruby-lang.org/ja/latest/class/Prime.html)には、素数を判定・列挙したり**素因数分解**するメソッドが実装されている。しかし素因数分解までであり、**約数に関する操作は無い**。約数を列挙したり、その個数を数えたりしたかったので、素因数分解のメソッドを利用して追加実装してみた。

```ruby:実装
require 'prime'

class Prime
	def each_divisor(n, &block)
		pf = prime_division(n)
		num = -> { pf.inject(1) { |prod, (_, exp)| prod * exp.succ } }
		Enumerator.new(num) { |y| __each_divisor__(1, pf, &y.method(:<<)) }
		          .tap { |enum| enum.each(&block) }
	end
  
	private def __each_divisor__(d, ary, &block)
		return yield(d) if ary.empty?

		ary = ary.dup
		prime, exp = ary.pop
		0.upto(exp) { __each_divisor__(d, ary, &block); d *= prime }
	end
end
```

```ruby:使用例
prime = Prime.instance

# 約数の個数
prime.each_divisor(60).size
#=> 12

# 約数でループ（ソートはされない）
prime.each_divisor(60) { |d| print d, ' ' }; print "\n"
#=> 1 2 4 3 6 12 5 10 20 15 30 60 

# Enumerableなメソッドを作用
prime.each_divisor(60).select { |d| d * d <= 60 }
#=> [1, 2, 4, 3, 6, 5]

# 1でも正しく動作
prime.each_divisor(1).to_a
#=> [1]
```

なお、メソッド定義はインスタンスメソッドとして実施したが、 `Prime` クラスの計らいでクラスメソッドとしても呼び出せる。（ `Prime.each_divisor(60)` といった感じ）
MagicaVoxelのインストール方法[Windows版]

#はじめに
3Dのボクセルアートが作れるMagicaVoxelのインストール方法を(Windows版)を紹介していきます。
#インストール手順
下記のURLからMagicaVoxelをダウンロードします。
###[Magica Voxel](https://ephtracy.github.io/)

赤線で囲われているところをクリックするとGitHubのページが表示されます。
![MagicaVoxelDownload.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482043/11c534cb-4fc0-fc14-71cb-5813f93b0dba.png)

###「MagicaVoxel-0.99.4-alpha-win32.zip」をクリックしてダウンロードします。
![ShowGitHub.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482043/10fe21bf-a211-a6b3-0ebd-cf9437cdeee1.png)

###フォルダのダウンロードフォルダを開きダブルクリックでzipフォルダを解凍します。
![コメント 2020-04-10 111111.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482043/cf28869d-56b5-f025-f1b4-4f0dd1ceea69.jpeg)


###解凍されたファイルを開き、「MagicaVoxel.exe」を開きます。
![コメント 2020-04-10 111111.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482043/229bd21d-94ed-79a2-c25d-e89a5e3489e7.jpeg)

###この画面が出てきたら成功です。
![コメント 2020-04-10 112651.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482043/7a739d37-7e22-a130-9f93-30f8c98f52ec.png)
複数人使うサーバでパスワードなしでGitHubを使う方法

この方法をやった環境

|OS|Git|
|:-:|:-:|
|Debian GNU/Linux 10 (buster)|2.23.0|
|macOS Catalina ver.10.15.5|2.21.0|
|CentOS Linux release 7.8.2003 (Core)|1.8.3.1|

参考 : [GitHubのリポジトリにDeploy keysを登録してパスワードなしでアクセスする | CodeLab](https://codelab.website/github-deploy-keys/)

# 秘密鍵と公開鍵を作成します。
鍵を作成する際にパスフレーズを設定するとリポジトリをクローンだけでなくフェッチするときにも毎回パスフレーズの入力が必要になってしまうため、今回パスフレーズは設定しません。
※. パスフレーズの設定および解除は自己責任で実施してください。

```bash
# 1. RSA鍵のペアを作成します。
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): <<<< Enter(鍵を作成する場所)
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): <<<< Enter(パスフレーズ)
Enter same passphrase again: <<<< Enter(パスフレーズ)
...省略...

# 2. 公開鍵を表示してコピーします。
$ cat /root/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAA...
```
## 鍵の名前をしていする場合は`-f`を使うと便利
```bash
# -f {鍵のファイルパス}で指定できる
$ ssh-keygen -t rsa -f ~/.ssh/gitHub
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
#...省略...
$ ls -la ~/.ssh/gitHub*
-rw-------  1 mana  staff  2622  7 13 19:27 /Users/ponsuke/.ssh/gitHub
-rw-r--r--  1 mana  staff   581  7 13 19:27 /Users/ponsuke/.ssh/gitHub.pub
```

# GitHubのリポジトリのDeploy keysに公開鍵を登録します。
1. GitHubにログインします。
1. クローンするリポジトリ > [Settings]タブ > [Deploy key] > [Add deploy key]ボタン
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/907e553a-bd86-5d4f-0ed8-c4b1ccb79c18.png)
1. タイトルをつけてコピーした公開鍵を登録します。
    - クローンしたリポジトリを更新(プッシュ)できるようにするかを[Allow write access]チェックボックスで選択
        - [Allow write access]チェックボックスを間違えると後で変更できない。いったん削除して再登録する必要がある
        - 読み取り専用にする : チェックOFF
    - ![スクリーンショット 2020-07-13 19.35.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/ece419ae-3f98-dc5f-cb72-9849f49af114.png)


# GitHub上のソースをクローンします。
1. [Code] > [Use SSH]で表示されたURLでクローンします。
    - うっかりHTTPSのURLを使うと[fatal: repository 'git@github.com/hoge/fuga.git' does not exist](https://qiita.com/ponsuke0531/items/4d947f24d305048d8ff1)みたいになります。
    - ![スクリーンショット 2020-07-13 19.57.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/70297622-4f1e-c4ea-c28b-c1e78ee6dd57.png)

```bash
# 1. リポジトリのクローン先用にディレクトリを作成します。
$ mkdir git

# 2. 作成したディレクトリに移動します。
$ cd git/

# 3. リポジトリをクローンします。
$ git clone git@github.com:ponta/hoge.git
Cloning into bare repository 'hoge.git'...
...省略...
```

## 何の鍵か忘れそうなときはconfigファイルに書くと便利
```bash
$ vi ~/.ssh/config
# configにドメインと鍵を書いておくと便利
$ cat ~/.ssh/config
Host github
    HostName github.com
    IdentityFile ~/.ssh/gitHub

$ git clone git@github:ponta/hoge.git
Cloning into 'hoge'...
#...省略...
Resolving deltas: 100% (2/2), done.
```
【比較 Zabbix vs. Grafana】必要性に見合った監視ツールを選ぼう

![5db94b4473588358f4dcdfbd_Graphana vs Zabbix.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/c3e3030e-10b8-f6bb-070c-a030e81647d6.jpeg)

#Grafanaとは

Grafanaは、1つの統合されたダッシュボードですべてのメトリックを表示および分析できる視覚化ツールです。 GraphiteやPrometheusなどの任意のソースからメトリックをデータをプルし、そのデータを表示して、ダッシュボードで直接データに注釈を付けて理解することができます。 Grafanaのダッシュボードは、ヒストグラムやヒートマップから世界地図まで、さまざまな方法で情報を視覚化できるように設計されています。 Grafanaには、Slack、PagerDutyなどを介してユーザーと通信できるアラート機能もあります。 ダッシュボードは、分析を容易にするいくつものプラグインで共有、ダウンロード、または拡張できます。 Grafanaはオープンソースであり、サービスとしてのGrafanaは[MetricFire](https://try.metricfire.com/japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Grafana%20vs.%20Zabbix)を通じて利用できます。
 
[無料トライアル](https://www.hostedgraphite.com/accounts/signup-metricfire/?signup=japan&utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Grafana%20vs.%20Zabbix)に参加して、数分でGrafanaダッシュボードの作成を開始してください。 あなたにとって、Grafanaの利用が適切かどうかを確認できます。 ご不明な点がございましたら、[デモを予約](https://calendly.com/metricfire-chatwithus/chat?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Grafana%20vs.%20Zabbix)して直接お問い合わせください。

#Zabbixとは

![5db94b5d5d754873913b3568_8RZnITo7WbWJpCQkbV8bDfvdsW-iTYsIoo8FMXVdj6PzviblUWyQ-dRx-Bv8OxC9TExd9xBrvpEAqg_5rJsmmbt1lnAGc7YUGjVVIikH0BZm6gpLf-N5QQE4dZ7bb6YnH-0Cca0t (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/ebbda79b-2506-9140-87e2-88c3719b98d0.png)

Zabbixは、ネットワーク、サーバ、仮想マシン、クラウドサービスなどのITシステムを監視するオープすることができます。アプリケーションを監視する機能も搭載されています。Zabbixは数台から1,000台の端末で構成される小規模な環境向けに設計されています。また、簡単な分散モニタリングを実現することで、接続とオープンポート数を低く保つことを可能としています。大規模向けのインストールが行われている事例もありますが、多くのカスタマイズが必要となります。Zabbix自身はデータを保存しませんが、幅広い種類のデータベースを利用することができます。ZabbixのバックエンドはC言語で書かれており、WebフロントエンドはPHPで書かれています。Zabbixの企業向けプランはZabbixのウェブサイトから入手でき、価格設定には5段階あります。ンソースのツールです。メトリクスを収集し、問題を検出、可視化、通知、そして通知内容を送信
 
#Grafanaの利用が適しているケース

以下の要件を満たしたい場合、Graphiteの利用が適しています

- 美しくシンプルな注釈付きグラフが必要
- メトリクスまたはログのソースが複数あり、それらを1か所で確認する必要
- ダッシュボードを組織全体で共有する必要
- 特定のチームのニーズに基づいて情報を再編成する必要
- 使いやすいクエリビルダーが必要
- イベントのアラートが必要

#Zabbix の利用が適しているケース
以下の要件を満たしたい場合、Zabbixの利用が適しています

- バックエンドがC言語でフロントエンドがPHPのオープンソースのソフトウェアが必要
- データの保存に、MySQL、MariaDB、PostgreSQL、SQLite、Oracle や IBM DB2を利用したい
- 1,000台以下の端末で構成される小規模な環境である
- 監視の必要はあるが、優れた可視化／サポートやドキュメントを必要としない


#価格の比較

- Grafana はオープンソースで無料
- ホスト型のPrometheusとGrafanaを含むMetricFireが提供している
- ビジネス対応のサービスとしてのGrafana Graphite は月額 99USDから
- Zabbixはオープンソースで無料
- Zabbix EnterpriseはZabbixから入手可能

#重要なポイント
- Grafanaは、さまざまなコレクター、エージェント、ストレージエンジンと統合可能
- Grafanaはオープンソースで無料
- Zabbixはオープンソースで無料です。
- Zabbixは監視用であり、視覚化用ではありません。

[MetricFire](https://try.metricfire.com/japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Grafana%20vs.%20Zabbix)が提供するGrafanaのサービスをよく理解し、あなたの会社のモニタリング環境にどのように適合するかを確認してください！ [無料試用版](https://www.hostedgraphite.com/accounts/signup-metricfire/?signup=japan&utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Grafana%20vs.%20Zabbix)を入手して、すぐにGrafanaダッシュボードの作成を開始してください。 Grafanaの機能について質問がある場合は、[デモを予約](https://calendly.com/metricfire-chatwithus/chat?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Grafana%20vs.%20Zabbix)してください。
Postgresをupgradeしたときに遭遇したエラー



## 事の発端

```zsh

 $ postgres -D /usr/local/var/postgres
dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.63.dylib
  Referenced from: /usr/local/bin/postgres
  Reason: image not found
zsh: abort      postgres -D /usr/local/var/postgres
```

起動できなくなった。

ので、

```zsh

$ brew upgrade postgresql
```

した。

再度起動を試してみる


```zsh

 $ postgres -D /usr/local/var/postgres
waiting for server to start....2020-04-10 10:54:23.161 JST FATAL:  database files are incompatible with server
2020-04-10 10:54:23.161 JST DETAIL:  The data directory was initialized by PostgreSQL version 11, which is not compatible with this version 12.2.
 stopped waiting
pg_ctl: could not start server
Examine the log output.
```


なるほど。versionがあってない、と。
何か説明は書いてないか、upgradeした時の返事を確認してみる。 :eye: 

```zsh

$ brew upgrade postgresql

中略


To migrate existing data from a previous major version of PostgreSQL run:
  brew postgresql-upgrade-database

To have launchd start postgresql now and restart at login:
  brew services start postgresql
Or, if you don't want/need a background service you can just run:
  pg_ctl -D /usr/local/var/postgres start

```


> To migrate existing data from a previous major version of PostgreSQL run:
  brew postgresql-upgrade-database

これだ。。

試してみる。
 
```zsh
$ brew postgresql-upgrade-database

中略

Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade so,
once you start the new server, consider running:
    ./analyze_new_cluster.sh

Running this script will delete the old cluster's data files:
    ./delete_old_cluster.sh
==> Upgraded postgresql data from 11 to 12!
==> Your postgresql 11 data remains at /usr/local/var/postgres.old

```

古いデータのケアまできちんと教えてくれている。 


無事起動できました。🙌🏻

```zsh

 $ postgres -D /usr/local/var/postgres
```
コンフリクトの解消

##コンフリクト
複数人での並行作業(チーム開発)で、同じ箇所を変えてしまった時などに発生します。
・同じ箇所を変えてしまう
・別々のブランチでコードを記述してしまう
・別々の変更をかけてしまっている
・マージする
この場合、二つの分岐で不整合が起きてしまい、履歴としてその状態から進ませることができなくなります。
##コンフリクトの解消
1、リポジトリ名の下にある Pull requests（プルリクエスト）をクリックしてください。
2、[Pull Requests] リストで、解決するマージ コンフリクトを起こしている Pull Request をクリックします。
3、指定した Pull Request の下部周辺で、[Resolve conflicts] をクリックします。
4、自分のブランチの変更だけを保持したいか、他のブランチの変更だけを保持したいか、あるいは両方のブランチからの変更を取り入れられる新しい変更を作成するかを決めます。 コンフリクトマーカーの<<<<<<<、=======、>>>>>>>を削除して、最終のマージに入れたい変更を作成してください。
5、ファイルに複数のマージ コンフリクトがある場合は、次の一連のコンフリクト マーカーまで下にスクロールし、4 と 5 を繰り返してマージ コンフリクトを解決します。
6、ファイル内のコンフリクトをすべて解決したら、[Mark as resolved] をクリックします。
7、コンフリクトしているファイルが複数ある場合は、[conflicting files] の下のページの左側で編集する次のファイルを選択し、Pull Request のマージ コンフリクトをすべて解決するまで4 から 7 を繰り返します。
8、マージ コンフリクトをすべて解決したら、[Commit merge] をクリックします。 これにより、Base ブランチ全体が Head ブランチにマージされます。
9、プロンプトに従い、コミット先のブランチをレビューします。 このブランチにコミットする場合は [I understand, update BRANCH] をクリックします。
10、Pull Request をマージするには、[Merge pull request] をクリックします。
参考サイト
[GitHub でのマージ コンフリクトを解決](https://help.github.com/ja/github/collaborating-with-issues-and-pull-requests/resolving-a-merge-conflict-on-github)
#javascript の some / every の挙動を #node で確認する

```
$ node
```

# some

```js
// 配列の中の一つでも値が1であればtrue
> [1,2,3].some(value => value == 1)
true
> [3,4,5].some(value => value == 1)
false
```

複数条件をつなげることも出来る

```js
// 配列の中の一つでも値が1または2の要素があればtrue

> [1,2,3].some(value => value == 1 || value == 2)
true
> [2,3,4].some(value => value == 1 || value == 2)
true
> [3,4,5].some(value => value == 1 || value == 2)
false
```

# every

```js
// 配列の全ての値が1または2または3であればtrue
> [1,2,3].every(value => value == 1 || value == 2 || value == 3)
true
> [2,3,4].every(value => value == 1 || value == 2 || value == 3)
false
```

複数行 + return + ブロック句で書いてみる例

```js
// 配列のすべてが
// 10-20の範囲で、2の倍数かどうか

const result1 = [20,22].every(
  value => {
    if(value < 10) { return false; }
    if(value >20) { return false; }
    if(value % 2 == 0) { return true; }
  }
)

console.log(result1) // false

const result2 = [10,14,18].every(
  value => {
    if(value < 10) { return false; }
    if(value > 20) { return false; }
    if(value % 2 == 0) { return true; }
  }
)

console.log(result2) // true
```

# 参考

[JavaScriptのsomeとeveryがすごく便利 - Qiita](https://qiita.com/i_am_master_yoda/items/224ff73443b4566ec8e8)


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Docker Toolboxでマウントするディレクトリを追加する

## 概要
Docker Toolboxでマウントする際に、本来であれば、C:\Users配下しかマウントができない。
VirtualBoxに設定を追加することで、C:\Users以外のディレクトリもマウントできるようにする


## 環境
Windows 10 home
Docker Toolbox

## 発生した問題
Docker Toolbox上で下記コマンド実行したときにホスト(Windows)側にContainer内のファイルが表示されなかった

```
> docker run -it -d -p 8181:8080 -v /c/workspace/docker-study-sakura/tomcat-container/logs:/share/logs --name tomcat centos:7
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182296/acbd06ff-cdf4-7149-88f1-878c1da28309.png)

参考：https://knowledge.sakura.ad.jp/14427/


## 原因
Docker Toolboxはデフォルトではc:\Usersフォルダしかマウントしてくれない。
[Docker Toolbox利用時においてホストのディレクトリをマウントできない](https://qiita.com/gisuyama7/items/e2ed9e76cdbef798b48a)
[Docker Toolboxでvolumesでマウントができない場合の対策](https://qiita.com/hotaimo/items/0a028480c94f003977ff)

## 対応
マウントするディレクトリを変えるか、マウントできるディレクトリを追加しちゃう。
ディレクトリの追加手順は↓
1. VirtualBoxを起動
2. defaultを右クリック > 設定 > 共有フォルダ
3. 右の追加ボタンをクリック
4. フォルダのパスにwindowsのディレクトリを入力(例:C:\workspace\docker-study-sakura)
5. フォルダー名にdocker toolboxのディレクトリを入れる(例:c/workspace/docker-study-sakura)
6. Docker Toolboxを再起動

```
> docker-machine.exe stop
> exit
```