OmniAICreator/Qiita-1.07M huggingface dataset:
SQL基礎の基礎

データベースと言っても色々な仕組みのものがあるが、
その中でも広く使われているリレーショナルデータベース管理システムは、
データベース内の「テーブル」に入っているデータを「SQL」という言語を使って操作できます。

そしてここでは主に、検索・追加・更新・削除の簡単な書き方を記述します。

#検索
##基本構文
検索の基本構文は以下のように記述していきます。

```sql
select
from
where
order by      ;
```

select:    取得したい列名を羅列
from:      取得元のテーブル名
where:     抽出したい行に関する条件を指定
order by:  指定した順序に並べて取得

order byが必要ない時もありますが、基本的には;で終わります。


##selectとfrom
テーブル定義書を見てテーブル名を確認し、どのカラム（列）の情報を取りたいかを記述

Userテーブル
-id
-name
-email
-age
-state

ここでname,age,emailを取得したい場合は

```sql
select name, age, email
from user as u
```

のように記述する。fromのテーブル名にはasを付けて「以下〇〇と省略」とした方が便利です。
また、selectはテーブル定義の順でなくとも構いません。

##where
自分が欲しい行に関する条件を whereに記述しま
す。
例えば、nameは「伊藤」さんの中でageが「20~30」歳の人のデータが取りたい場合、以下のように記述します。

```sql
where name = "伊藤"
and age >= 20
and age <= 30
```

また、日付や数値など範囲を表す場合（値の下限と上限を含む形で）の範囲を指定する場合には、
BETWEENという特別な書き方もあります。

```sql
where name = "伊藤"
and age between 20 and 30
```

##order by
順序のない保存データから取り出したデータにも、当然、順序はありません。
取り出す度に変化する可能性がある「順不同」だと考えてください。
ですので、結果を得る際の順序を指定するためには、
最後に残った四角枠である「ORDER BY」句に、並び替えに使うカラム名を羅列します。

例えば、age順であれば、

```sql
order by age
```

このように記述し、通常は昇順ですので逆順にしたい場合は、以下のように記述します。

```sql
order by age desc
```

#まとめ
つまり、nameは「伊藤」さんの中でageが「20~30」歳の人のデータをageが高い順に取得したい場合は、
以下のように記述します。

```sql
select name, age, email
from user as u
where u.name = "伊藤"
and u.age between 20 and 30
order by u.age desc
```


#追加
##テーブルに新しいデータを追加する
テーブルにデータを追加するには INSERT 文を使います。
userテーブルにデータを追加。

```sql
insert into user
  [(col_name [, col_name] …)]
  {value | value} (value_list) [, (value_list)] …
```

テーブル名( tbl_name )を指定してデータを追加します。
テーブルに含まれる特定のカラムを指定してデータを追加する場合は次のように記述します。
(指定しなかったカラムにはデフォルトの値が格納されます)。カラム名の数と値の数は同じでなくてはなりません。

```sql
insert into user values(value1, value2, …)
```

例えば、userテーブルのカラムが
user
-id
-name
-age
であった場合、以下のように記述しデータを追加します。

```sql
insert into user value (1, "伊藤", 23);
```

また、ageを記述しなかった場合、nullが格納されます。

```sql
insert into user (id, name) value (1, "伊藤");

=> 1, "伊藤", null
```

##default値の使用
INSERT 文を実行するときに値を指定するのではなくデフォルトの値を使用したい場合には、 
値の代わりに DEFAULT と記述することができます。

```sql
insert into user value (1, "伊藤", default);
```

また、全てのカラムにデフォルトのデータを追加するには以下のように記述します。

```sql
insert into user () value ();
```

##数式を利用したデータの追加
testテーブルに名前、数学、国語、英語、総得点のカラムを作った際に総得点のカラムには数式を利用してデータを追加します。

test
-name
-math
-english
-japanese
-sum

```sql
insert into test value ("伊藤", 60, 40, 50, math + english + japanese);
```

##複数のデータをまとめて追加
user
-id
-name
-age

```sql
insert into user value (1, "伊藤", 23), (2, "佐藤", 30), (3, "加藤", 19);
```



#更新
where句を書き忘れると全ての情報が書き換えられます。更新をする際には、selectで一度検索し、
変更する点のみになっているかを確認する癖をつけるようにしましょう。

```sql
update users
set age = 24
where id = 1
```



#削除
更新と同様、where句を書き忘れると全ての情報が書き換えられます。更新をする際には、selectで一度検索し、
変更する点のみになっているかを確認する癖をつけるようにしましょう。

```sql
delete from users
where id = 1
```
jQueryの導入（HTML）

#jQueryのライブラリを読み込む

###jQueryをダウンロードする

▶︎[jQueryダウンロードはこちら](https://developers.google.com/speed/libraries/#jquery)

リンクへ飛んでjQueryの項目１番上の<script>〜</script>までをコピーする
※バージョンが更新されると少し表記変わっている場合もあります。
![スクリーンショット 2020-10-09 13.32.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661441/ab79c74e-3638-1caf-a6e7-b48c3c4099f6.png)


###コピーした物をindex.htmlのheadに貼り付けると読み込める


※jQueryは他のJavaScriptファイルよりも先に読み込まないとエラーが出る。
そのため他の全てのJavaScriptファイルよりも上に、jQueryの読み込み先を記述する。

```html:index.html
<head>
  <meta charset="utf-8">
  <link rel="stylesheet" type="text/css" href="stylesheet/style.css">
  <link rel="stylesheet" type="text/js" href="js/index.js">
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/fon/t-awesome/4.6.3/css/font-awesome.css"></script>
  //この行に貼り付け（今回は以下のmain.jsのJavascriptファイルより上）
  <script src="./main.js"></script>
  <title>appTitleSample</title>
</head>
```

これで導入は完了です。

#Memo
HTML取得はJavascriptと同じです。
上記で < script src="./main.js">< /script >と記述してあるので、
この場合main.jsのファイル内に取得したいクラス名などを記述していきます。

```javascript:main.js(自分で作成したファイル.jsに記述)
$(function() {
  console.log($(".クラス名"));
});
```
※ここにはクラス名だけではなく色々入れることができる。


#最後にひとこと
今回もまた理解不十分な点が浮かび上がりました。

####不明点 「①jQueryのリンク先タグをコピーする方法と②gemのインストールしてからの導入方法の違い」

JavaScriptのライブラリjQueryは導入する際に今回のように、
リンク先のscriptタグをコピーしてindexに貼り付ける方法がある。
また、hamlで非同期通信でのjQueryの導入はgemをbundle installしてindexに追記したのでけれど、その違いがまだわかっていません。

今回はHTMLを例に記録をに残していますが、
[hamlの場合を別で記録記事](https://qiita.com/kusaharajiji/items/1ade1ab0ed196bf2cf84)を残します。

①の方法はタグの切り替えを想定した物でhtmlを使用すものを参考にしました。
②はhamlを使用し非同期通信をすることを想定したものを参考にしています。

導入に関してもまだまだ未熟なので調べていきたいと思います。


ブラウザ情報だけだったら、①の方法で良いのかな
②の方法はデータ情報などを持ってこなければならないAjaxとか関係するのかな。
知りたいことがまだまだあります。
LXD で Alpine を使う

Ubuntu 23.04 にインストールされた lxd 5.14 に Alpine をインストールし設定する方法です。
インストールが完了してログインすると次のようになります。

```text
$ ssh alpine.local
Welcome to Alpine!

The Alpine Wiki contains a large amount of how-to guides and general
information about administrating Alpine systems.
See <https://wiki.alpinelinux.org/>.

You can setup the system with the command: setup-alpine

You may change this message by editing /etc/motd.

alpine:~$ uname -a
Linux alpine 5.15.0-50-generic #56-Ubuntu SMP Tue Sep 20 13:23:26 UTC 2022 x86_64 Linux
alpine:~$ cat /etc/os-release
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.16.2
PRETTY_NAME="Alpine Linux v3.16"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://gitlab.alpinelinux.org/alpine/aports/-/issues"
```

## OS のインストール

```bash
lxc launch images:alpine/edge alpine
```

root のパスワードを設定

```bash
lxc exec alpine -- passwd
```

login

```text
$ lxc console alpine
To detach from the console, press: <ctrl>+a q

Welcome to Alpine Linux 3.18
Kernel 6.2.0-20-generic on an x86_64 (/dev/console)

alpine login:
```


## login 後のインストールと設定

ユーザーの作成

```bash
adduser -u 1200 uchida
```

sudo

```bash
apk add sudo
addgroup uchida wheel
```

```text:/etc/sudoers.d/wheel
%wheel ALL=(ALL) ALL
```

sshd のインストール

```bash
sudo apk add openssh
sudo service sshd restart
sudo rc-update add sshd
```

avahi のインストール

```bash
sudo apk add avahi
sudo apk add dbus
sudo rc-update add dbus
sudo rc-update add avahi-daemon
sudo service avahi-daemon restart
```

avahi が動けば、次のようにしてログインが出来ます。

```bash
ssh alpine.local
```

## 追加情報

nginx のインストール

```bash
sudo apk add nginx
```

起動

```bash
sudo service nginx start
```

python のインストール

```bash
sudo apk add python3
```
Cloud Natural Language API で日本語感情解析

こんにちわ。
GCPの使い手、日本代表コロまるです。

今回は自然言語処理をしたい
cotoha さんもいいけど、高いよね
https://api.ce-cotoha.com/contents/index.html

ということで、Laravel で GCPを使ってみます。


[ 重要 ]
GCPの設定画面は横長にして最大化しておきましょう。
でないと、APIとサービスの有効化などのメニューが出ないので注意。

# インスコ

```

composer require google/cloud-core
composer require google/cloud-language

```

# APIとサービスより、Cloud Natural Language API の有効化

https://www.magellanic-clouds.com/blocks/guide/enable-google-apis/

# サービスアカウントを作成

https://cloud.google.com/iam/docs/creating-managing-service-account-keys?hl=ja


# プロジェクトを選択

サービスアカウントの詳細

サービスアカウントを作成
ロールとかは何も入力しなくて良い

サービスアカウントができるので、
操作、鍵を作成で鍵をダウンロード

![step1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/268f0b1d-6dcc-8b48-918c-52c25ef59059.png)

これで鍵ファイルが自動でダウンロードされる
この json を config フォルダにアップしましょう。


```HogeController.php

//HogeController.php の冒頭に
use Google\Cloud\Language\LanguageClient;



# Your Google Cloud Platform project ID
        $projectId = 'hoge2';


# Instantiates a client
        $language = new LanguageClient([
            'projectId' => $projectId,
            'keyFile' => json_decode(file_get_contents(config_path('hogehoge.json')), true)
        ]);



# The text to analyze
        $text = 'やりました！いけましたよ。よろしくおねがいします。';

# Detects the sentiment of the text
        $annotation = $language->analyzeSentiment($text);
        $sentiment = $annotation->sentiment();

        echo 'Text: ' . $text . '
Sentiment: ' . $sentiment['score'] . ', ' . $sentiment['magnitude'];


```

# 結果

```


Text: やりました！いけましたよ。よろしくおねがいします。 Sentiment: 0.6, 1.8


```


# さらに詳しく解析

感情やら芸能人やら色々解析できるたみたいだが、
今回は文章の感情に絞って解析。

・感情
analyzeSentiment

documentSentiment には、次のフィールドで構成されるドキュメントの全体的な感情が含まれます。
score: -1.0（ネガティブ）～1.0（ポジティブ）のスコアで感情が表されます。これは、テキストの全体的な感情の傾向に相当します。


magnitude は、そのドキュメントに感情的な内容がどのくらい含まれているか

```

明らかにポジティブ*	"score": 0.8, "magnitude": 3.0
明らかにネガティブ*	"score": -0.6, "magnitude": 4.0
ニュートラル	"score": 0.1, "magnitude": 0.0
混合	"score": 0.0, "magnitude": 4.0

```


#解析結果サンプル

いい感じですね

```

        $text = 'ラーメン食べた、美味しかったよ';//[magnitude] => 0.9 [score] => 0.9
        $text = 'ラーメン食べたら下痢になった';//[magnitude] => 0.1 [score] => -0.1

        $text = '台風で体しんどいけど、頑張るね！';//[magnitude] => 0 [score] => 0
        $text = '台風で体しんどいから何もできなかった！';//[magnitude] => 0.6 [score] => -0.6

```



# 料金は？

最低 1ユニット。
1,000文字を超える場合は 1,000文字 で 1ユニット。

たとえば、Natural Language に送信する 3 件のリクエストに、それぞれ 800 文字、1,500 文字、600 文字が含まれている場合、1 番目のリクエスト（800）が 1 ユニット、2 番目のリクエスト（1,500）が 2 ユニット、3 番目のリクエスト（600）が 1 ユニット、合計 4 ユニットとして課金されます。

Natural Language の使用料は、使用された API の機能とその機能を使用して評価されたユニットの数に基づいて、月単位で計算されます。次の表に、請求月に分析されたユニットの総数に基づく 1,000 ユニットあたりの料金を示します。

![step2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/66bfcbca-8866-4f14-df59-4dc2b41b4869.png)

単純に、
感情分析を 10,000回やった場合、
最初の 5,000回 は無料。
オーバーした分は
$1.00 x 5 (1000回) で日本円にして約600円で利用できるってわけね。
影響を与えたOS


- Unix

現在でも使われているOSで安定性が高い

影響を与えたOS:Linux,BSD,MacOS(OSX以降)

- BSD

現在は、Linux以外のOSでFreeBSDがUnix系OSで最も使われている。主にサーバー用途で使われることが多い。

影響を受けたOS:Unix
影響を与えたOS:Linux,MacOS(OSX以降)

- Linux

UnixっぽいOSのソースコードを無料で使うためにプログラマーのリーナス・トーバルズが作ったOS。安定性が高いため、サーバー用途で使われたりすることが多いが、CUIを使うことにより他のOSよりクリエイティブで細かい作業ができたりするので、オタクに好まれることが多い。

影響を受けたOS:Unix,BSD
影響を与えたOS:Android,ChromeOS

- 黎明期GUI OS(Alto+smalltalk)

アラン・ケイのDynabook構想を達成するためにAlto+smalltalkで作られたOS。たくさんのOSに影響を与えた。

Dynabook構想･･･「***対話型インターフェース（GUI）を搭載***し、***子供でも扱え***、***片手でも持ち運びが可能***であり、***低価格なパーソナルコンピュータ***」と想定され、ダイナミック（dynamic）なパーソナルメディアであり、***本のようなPC***(要はノートPCやタブレット端末)である。後に(21世紀になってから)、MacBookやAndroidやChromeBook等の普及で達成された。

影響を与えたOS:MacOS,Windows,ChromeOS

- Windows

PCといえばこのOS。GUIを備え、Officeソフトやブラウザ(IE)をバンドルすることでよく使われるようになった。Mirosoft社によって作られている。

影響を受けたOS:黎明期GUI OS,MSDos,Mac OS
影響を与えたOS:Mac OS,ChromeOS

- Mac OS

Apple社が作ったOS。Windowsが入っていない場合の多くがこのOSが入っていることが多い(但し、最近は、LinuxベースOSが伸ばしつつある)。現在はBSDベース。GUIを広めたOSであり、クリエーターやプログラマーに好まれる。

影響を受けたOS:黎明期GUI OS,Windows,iOS,Android
影響を与えたOS:Windows,iOS,Android,ChromeOS

- iOS

Apple社のスマートフォンやタブレット(但し現在は:iPad OS)に使われるOS。同社のMacOSの影響を受けている。AppStoreというアプリストアからアプリケーションをダウンロードする。

影響を受けたOS:MacOS,Android
影響を与えたOS:Android,MacOS

- Android

Google社が作ったOS。iOSが入っていないスマホ/タブレットはこのOSが必ず入っている。LinuxベースのOS。UIや機能等はiOSやMacOSの影響を強く受けている。GooglePlayというアプリストアからアプリケーションをダウンロードする。

影響を受けたOS:iOS,MacOS,Linux
影響を与えたOS:ChromeOS,iOS,MacOS

- ChromeOS

Google社が作ったOS。AndroidはどちらかというとMacのUIに近かったが、ChromeOSはWindowsに近い。Mac,Windowsが入っていないOSの多くはこれが入っている。LinuxベースのOS。Chrome(ブラウザやOfficeソフト)とAndroidアプリが使える。シンクライアントで他のOS(WindowsやMac OS)より直観的に使えるようにデザインされている。PCのスマートデバイス化を目指すOS(Internet of PC)でIoTデバイスを操作できる。

影響を受けたOS:Android,Windows,MacOS,Unix,Linux
影響を与えたOS:
LXD で CentOS Stream 9を使う

Ubuntu 22.04 にインストールされた lxd 5.6 に CentOS Stream 9 をインストールし設定する方法です。
インストールが完了してログインすると次のようになります。

```text
$ ssh centos.local
Last login: Wed Oct 12 08:40:36 2022 from 10.253.196.1
[uchida@centos ~]$ uname -a
Linux centos 5.15.0-50-generic #56-Ubuntu SMP Tue Sep 20 13:23:26 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
[uchida@centos ~]$ cat /etc/os-release 
NAME="CentOS Stream"
VERSION="9"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="9"
PLATFORM_ID="platform:el9"
PRETTY_NAME="CentOS Stream 9"
ANSI_COLOR="0;31"
LOGO="fedora-logo-icon"
CPE_NAME="cpe:/o:centos:centos:9"
HOME_URL="https://centos.org/"
BUG_REPORT_URL="https://bugzilla.redhat.com/"
REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux 9"
REDHAT_SUPPORT_PRODUCT_VERSION="CentOS Stream"
```

OS のインストール

```bash
lxc launch images:centos/9-Stream/amd64 centos
```

root のパスワードを設定

```bash
lxc exec centos bash
```

login

```text
$ lxc console centos
To detach from the console, press: <ctrl>+a q

centos login:
```

login 後の設定

 ユーザー、グループの追加、パスワードの設定

```bash
useradd -u 1200 -m -g wheel uchida
groupadd -g 1200 uchida
passwd uchida
```

sudo のインストール

```bash
yum install sudo
```

sshd のインストール

```bash
sudo yum -y install openssh-server
sudo systemctl start sshd
```

avahi のインストール

```bash
sudo yum -y install avahi
sudo systemctl start avahi-daemon
```

host の /mnt/iso を /mnt/iso にマウントする方法

```bash
lxc config device add centos iso disk source=/mnt/iso path=/mnt/iso
```

## 色々なインストール

パッケージのアップデート

```bash
sudo dnf update
```

 MariaDB のインストール

```bash
sudo dnf install mariadb mariadb-server
```

```bash
sudo systemctl start mariadb
```

which のインストール

```bash
sudo dnf install which
```

PHP のインストール

```bash
sudo dnf install php
```
LXD で Arch Linux を使う

Ubuntu 23.04 にインストールされた lxd 5.13 に Arch Linux をインストールし設定する方法です。
インストールが完了してログインすると次のようになります。

```text
$ ssh arch.local
Last login: Fri Aug 25 04:45:42 2023 from 10.112.67.1

[uchida@arch ~]$ uname -a
Linux arch 6.2.0-27-generic #28-Ubuntu SMP PREEMPT_DYNAMIC Wed Jul 12 22:39:51 UTC 2023 x86_64 GNU/Linux

[uchida@arch ~]$ cat /etc/os-release 
NAME="Arch Linux"
PRETTY_NAME="Arch Linux"
ID=arch
BUILD_ID=rolling
ANSI_COLOR="38;2;23;147;209"
HOME_URL="https://archlinux.org/"
DOCUMENTATION_URL="https://wiki.archlinux.org/"
SUPPORT_URL="https://bbs.archlinux.org/"
BUG_REPORT_URL="https://bugs.archlinux.org/"
PRIVACY_POLICY_URL="https://terms.archlinux.org/docs/privacy-policy/"
LOGO=archlinux-logo
IMAGE_ID=archlinux
IMAGE_VERSION=2023.08.01

[uchida@arch ~]$
```

インストール

```bash
sudo snap install lxd
```

lxd グループに加わることで、一般ユーザーで、lxc, lxd が使えるようになります。
os の再起動が必要です。

```bash
sudo usermod -a -G lxd uchida
```

バージョンの確認

```text
$ lxd --version
5.13
$ lxc --version
5.13
```

lxd を最初に使う時

```bash
lxd init
```

イメージのインストール

```bash
lxc launch images:archlinux/current/amd64 arch
```

root のパスワードを設定

```bash
lxc exec arch bash
```

login

```text
$ lxc console arch
To detach from the console, press: <ctrl>+a q

arch login:
```

login 後のインストールと設定

ユーザー、パスワードの設定

```bash
useradd -u 1200 -m -g wheel uchida
passwd uchida
```

sudo のインストール

```bash
pacman -S sudo
```

visudo で設定

>```text
>%wheel ALL=(ALL:ALL) ALL
>%wheel ALL=(ALL:ALL) NOPASSWD: ALL
>%sudo   ALL=(ALL:ALL) ALL
>```

sshd のインストール

```bash
sudo  pacman -S openssh
sudo systemctl start sshd
sudo systemctl enable sshd
```

avahi のインストール

```bash
sudo pacman -S avahi
sudo systemctl start avahi-daemon
sudo systemctl enable avahi-daemon
```

## インターネットに接続するには

ホストで、IP フォワードを有効にする必要があります。

```text:/etc/sysctl.conf
(省略)
net.ipv4.ip_forward = 1
(省略)
```

設定の反映

```bash
sudo sysctl -p
```

## コンテナの一覧

```text
$ lxc list
+------+---------+---------------------+-----------------------------------------------+-----------+-----------+
| NAME |  STATE  |        IPV4         |                     IPV6                      |   TYPE    | SNAPSHOTS |
+------+---------+---------------------+-----------------------------------------------+-----------+-----------+
| arch | RUNNING | 10.39.166.61 (eth0) | fd42:fdd5:f4c7:d428:216:3eff:fe07:6c40 (eth0) | CONTAINER | 0         |
+------+---------+---------------------+-----------------------------------------------+-----------+-----------+
```
LXD で Ubuntu を使う

Ubuntu 23.04 にインストールされた lxd 5.15 に Ubuntu 23.04 をインストールし設定する方法です。

インストールが完了してログインすると次のようになります。

```text
$ ssh ubuntu.local
Welcome to Ubuntu 23.04 (GNU/Linux 6.2.0-27-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Sun Aug 27 15:59:25 JST 2023

  System load:           0.34
  Usage of /home:        unknown
  Memory usage:          0%
  Swap usage:            0%
  Temperature:           49.0 C
  Processes:             23
  Users logged in:       0
  IPv4 address for eth0: 10.112.67.251
  IPv6 address for eth0: fd42:5645:8539:e52d:216:3eff:fe1e:e8cc


0 updates can be applied immediately.


Last login: Sun Aug 27 15:59:44 2023 from 10.112.67.1

uchida@ubuntu:~$ uname -a
Linux ubuntu 6.2.0-27-generic #28-Ubuntu SMP PREEMPT_DYNAMIC Wed Jul 12 22:39:51 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

uchida@ubuntu:~$ cat /etc/os-release 
PRETTY_NAME="Ubuntu 23.04"
NAME="Ubuntu"
VERSION_ID="23.04"
VERSION="23.04 (Lunar Lobster)"
VERSION_CODENAME=lunar
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=lunar
LOGO=ubuntu-logo

uchida@ubuntu:~$
```

OS のインストール

```bash
lxc launch ubuntu:23.04 ubuntu
```

root のパスワードを設定

```bash
lxc exec ubuntu  -- bash
```

login

```text
$ lxc console ubuntu
To detach from the console, press: <ctrl>+a q

ubuntu login:
```

## login 後の設定

ユーザーの作成

```bash
adduser --uid 1200 uchida
gpasswd -a uchida sudo
```

sshd の設定

```text:/etc/ssh/sshd_config
PasswordAuthentication yes
```

vi の調子が悪かったので、sed で変更しました。

```text:sed01
s/#PasswordAuthentication/PasswordAuthentication/
```

```bash
sed -f sed01 < sshd_config > tmp01
```

```bash
sudo systemctl restart ssh
```

.ssh/authorized_keys の作成

>クライアントのpublic key を登録

ip アドレスでログインできるようになります。
例えば、

```text
ssh 10.112.67.251
```
.ssh/authorized_keys がないと次のエラーが出ます。

```text
$ ssh 10.112.67.251
uchida@10.112.67.251: Permission denied (publickey).
```

avahi のインストール

```bash
sudo apt install avahi-daemon
```

avahi が動けば、次のようにしてログインができます。

```bash
ssh ubuntu.local
```

タイムゾーンの設定

```bash
sudo timedatectl set-timezone Asia/Tokyo
```

## 参考情報
仮想マシーン・コンテナの一覧

```bash
lxc list
```

コンテナの停止

```bash
lxc stop ubuntu
```

コンテナの削除

```bash
lxc delete ubuntu
```

## 関連情報
[LXD で Arch Linux を使う](https://qiita.com/ekzemplaro/items/aa4fd7d9ea99afb4980e)
[LXD で CentOS Stream 9 を使う](https://qiita.com/ekzemplaro/items/6cf95b2b79c55498b885)
[LXD で Alpine を使う](https://qiita.com/ekzemplaro/items/ee25b21d24127671108a)
[LXD で Gentoo を使う](https://qiita.com/ekzemplaro/items/9d63d0af9afada83a2fa)
簡単にiOSアプリのアイコンを設定する方法

# アイコンの設定
アプリが完成した！と思ったらアイコンの設定をし忘れてた！とやる気を削がれたことはありませんか？この記事では、アプリのアイコンを一瞬で設定する方法をまとめたいと思います。
**有名な内容なので、そんなの知ってるよ！と思われた方はそっとブラウザバックをしてください。**

## アイコンを作ろう！
この記事ではアイコンの作り方自体は書きませんが、僕が普段使っているおすすめのツールを紹介したいと思います。
**有料のものばかりになってしまいますが、許して、、、**

[Sketch](https://www.sketch.com/)
モックアップを作る際やアイコンを作るとき、ロゴを作る時など基本的にSketchを使って作業しています。

[Adobe CC](https://www.adobe.com/jp/creativecloud.html)
かの有名なAdobe Creative Cloudです。Sketchでは厳しいことなどはイラストレーターやフォトショップを使って作業しています。

## それでは本題
ここでようやく本題のアプリのアイコンを一瞬で設定する方法を説明したいと思います。
まず、作成したアプリのアイコンを1024*1024のpngやjpgなどに書き出してください。

[こちらのサイト](https://appicon.co/#app-icon)にアクセスして作成した写真を以下の部分にドラックアンドドロップしてください。
![スクリーンショット 2020-10-09 13.42.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367053/8518dab2-4c8b-84b6-05e9-47b4726a6f4c.png)

該当するアプリが対応するプラットフォーム（iPhone、iPadなど）にチェックが入っていることを確認して`Generate`を押してダウンロードしてダウンロードされたZipを解凍してください。

解凍できたら、中身がこのようになっていることを確認してください。

![スクリーンショット 2020-10-09 13.46.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367053/eae54722-2f27-9037-12a1-d1c2dbb3f471.png)

### Xcodeプロジェクトに実際に設定していく
まず、Xcodeプロジェクトを開いて左側にあるファイル一覧から`Assets.xcassets`を右クリックして`Show in Finder`を選択して下さい。
この時点で一度Xcodeを終了しておくと無難です。


![スクリーンショット 2020-10-09 13.48.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367053/071a9d5d-31a1-a7b5-0422-69f4c1df489c.png)

このような画面は表示されましたか？

![スクリーンショット 2020-10-09 13.49.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367053/113f34db-973c-ea28-ad61-06307e23ddc2.png)

このような画面が表示されたら、`AppIcon.appiconset`をフォルダーごと削除しましょう！（⌘+Delete）
削除ができたら、先ほどダウンロードしたフォルダーの中にある`Assets.xcassets`の中の`AppIcon.appiconset`を今削除したフォルダーがあった`Assets.xcassets`にドラック＆ドロップしましょう！

![スクリーンショット 2020-10-09 13.54.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367053/a075b187-0650-0cd8-92d6-7deaa9a70921.png)

ここまで完了したら、Xcodeのプロジェクトを再度開いてアイコンが設定されているか確認しましょう！

以上で完了です！お疲れ様でした！
やさしさアンチック (コミックで使われるフォント) を honkitのpdf出力で使う

## フォントな。無料日本語フリーフォント

* http://www.fontna.com/
* 優しい感じのフォントを配布してくれています。

## honkit 用の設定

* `07YasashisaAntique.ttf` を `/root/.local/share/fonts/`にコピー
* `fc-list` を実行すると `07やさしさアンチック`と認識されている。
* `/root/.config/fontconfig/`に以下fonts.conf を置く。

```xml:fonts.conf 
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
   <match target="pattern">
        <edit name="family" mode="assign" binding="strong">
           <string>07やさしさアンチック</string>
        </edit>
    </match>
</fontconfig>
```
[Docker] 特定のコンテナに紐づくボリュームのみ削除

## 特定のvolumeだけ削除したい
`$ docker volume prune` だと未使用のvolume全て削除してしまうし、 `$ docker volume ls`を見ても、どのvolumeが消したいコンテナのやつかわからない


## 削除したいvolumeをもつコンテナ名をセット
```sh
$ CONTAINER_NAME=hoge
```

#### コンテナ名が分からないとき
```sh
$ docker ps
CONTAINER ID        IMAGE           COMMAND                  CREATED             STATUS              PORTS                    NAMES
1fd9075c0f5d       my_project_app   "docker-entrypoint.s…"   59 minutes ago      Up 59 minutes       0.0.0.0:8080->8080/tcp   app
```
最後列のNAMESの値がコンテナ名

## ワンライナー削除コマンド
```sh
$ docker inspect $(docker ps -f name=${CONTAINER_NAME} -q) | jq -r '.[].Mounts[] | select(.Type == "volume").Name' | xargs docker volume rm
```

### 概要
- コンテナ名からコンテナIDを取得
- `docker inspect` と `jq` の組み合わせでvolume nameを取得
- `docker volume rm {volume name}` で削除

*jq がない場合は要インストール*

## もっとシンプルなケース
コンテナの削除と同時にvolumeも削除したいケースなら

```
docker-compose down -v $CONTAINER_NAME
```
docker-composeを使ってるとき限定だが、こちらのほうが簡単
Javaアプリデプロイ時の例外「ServletException: Error instantiating servlet class」の原因と対応策

#例外発生時の状況
Eclipseでサーブレットアプリを作成し、VPSにデプロイしたところ、以下のような例外が発生した。

```
javax.servlet.ServletException: Error instantiating servlet class [servlet.LoginServlet]
```


![error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673146/913f0360-e16c-9600-40a7-b5929a7c9238.png)


#原因
EclipseのJDKバージョンと、TomcatのJREバージョンが一致していないのが原因で、Tomcatがクラスファイルを実行できない状態になっていました。（コンパイル時のJavaバージョンが実行時のJavaバージョンを上回っていると、例外が発生するようです。）

＜エラーログ＞

```
根本原因

java.lang.UnsupportedClassVersionError: 
servlet/LoginServlet has been compiled by a more recent version of the Java Runtime (class file version 55.0), 
this version of the Java Runtime only recognizes class file versions up to 52.0 (unable to load class [servlet.LoginServlet])
　
～以下略～
```

※　ちなみに、クラスファイルのバージョンはJREのバージョンに対し、以下の様に対応しています。
　

| JREバージョン | クラスファイルバージョン | 
|:-----------|------------:|
| Java 8     | 52.0        | 
| Java 9     | 53.0        | 
| Java 10    | 54.0        |
| Java 11    | 55.0        | 
| Java 12    | 56.0        | 
| Java 13    | 57.0        |
| Java 14    | 58.0        | 
| Java 15    | 59.0        | 
　
今回のケースだと、アプリがバージョン55.0(Java 11)でコンパイルされているのにも関わらず、バージョン52.0(Java 8)で実行しようとしている、という状況になっていました。

#解決策
　Tomcat側のバージョンを最新にするか、Eclipse側のバージョンを下げる。（今回はEclipse側を変更することにした。）
　
　Eclipseウインドウから```ウィンドウ > 設定```と遷移すると設定画面が表示される。```Java > コンパイラー```ページへ遷移すると、JDKの```コンパイラー準拠レベル```という項目があるので、こちらを```1.8```に変更する。
![eclipse設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673146/af9aafe9-d304-d921-9421-7616b1e9ddb7.png)
　
※　既にプロジェクトを作成している場合、この設定変更は適用されない。作成済みのプロジェクトのバージョンを落としたい場合は、```プロジェクト名(右クリック) > プロパティ```で同じ画面が表示されるので、そちらで変更する。

#参考
https://stackoverflow.com/questions/47457105/class-has-been-compiled-by-a-more-recent-version-of-the-java-environment
http://www.ne.jp/asahi/hishidama/home/tech/java/version.html
https://jpn.itlibra.com/article?id=21118
Docker x Laravel めちゃくちゃ遅い Docker for Windows を爆速化する

[@ucan-lab](https://qiita.com/ucan-lab)さんの[Docker x Laravel めちゃくちゃ遅い Docker for Mac を爆速化する](https://qiita.com/ucan-lab/items/a88e2e5c2a79f2426163)の案４をWindows10で検証しました。

> 案4. ボリュームマウントを使う
>
> - [【JavaScript】Docker上でのnpm/yarnの操作を10倍早くする方法](https://tkkm.tokyo/post-495)
> - [Docker-compose: node_modules not present in a volume after npm install succeeds](https://stackoverflow.com/questions/30043872/docker-compose-node-modules-not-present-in-a-volume-after-npm-install-succeeds)
> 
> vendorやnode_modulesのデータを名前付きボリュームに格納して、ホスト側とコンテナ側と分離して管理する案。
> 同期処理が発生しないので、その分速くなる。

docker-compose.ymlにボリュームマウントの設定を追加して、composerとnpmのインストールを比較します。この記事ではなぜ早くなるかは触れません。

## 結果

`composer install`と`npm install`の速度をそれぞれ比較しています。

```sh
$ time composer install
real    6m26.446s  -> 0m57.445s  # 6.7倍
user    0m9.375s   -> 0m3.035s
sys     0m51.148s  -> 0m1.544s

$ time npm install
real    1m31.764s  -> 0m22.720s  # 4.0倍
user    0m46.022s  -> 0m23.705s
sys     0m32.465s  -> 0m13.917s
```

Windows10環境では4~7倍速くなりました！
参照元のMacのように20倍とはいきませんでしたが、数行の追加だけで十分早くなって満足です！


## 環境
### ホストOSの環境

- Windows 10 Home バージョン2004(OSビルド 19041.508)
- WSL2 (Ubuntu 20.04.1 LTS)
- Docker version 19.03.13, build 4484c46d9d
- docker-compose version 1.27.4, build 40524192

環境構築には下の記事が参考になります。
[Windows Subsystem for Linux Installation Guide for Windows 10](https://docs.microsoft.com/en-us/windows/wsl/install-win10#install-your-linux-distribution-of-choice)
[Windows 10 Home で WSL 2 + Docker を使う | Qiita](https://qiita.com/KoKeCross/items/a6365af2594a102a817b)

### コンテナ
Laravel + Nginx + MySQLの開発環境を使って検証します。
詳しくは[ブログ](https://www.suzu6.net/posts/254-laravel-docker-compose/)で公開しています。

- php (php-fpm) 7.4.1
  - composer 1.10.13
  - nodejs v12.18.4
  - npm 6.14.6
  - Laravel 8.8.0
- mysql 8.0
- nginx 1.19.2

composerとpackage.jsonは、プロジェクト作成から[laravel/jetstream](https://jetstream.laravel.com/1.x/introduction.html)のInertiaをインストールしたところまでの状態です。

## 検証するdocker-compose.yml

コメント`add`行の有無で速度を比較しています。

```conf

version: '3'

volumes: # add
  vendor-store: # add
  node_modules-store: # add

services:
  php:
    container_name: php
    build: ./docker/php
    volumes:
    - ./web:/var/www
    - vendor-store:/var/www/laravel/vendor # add
    - node_modules-store:/var/www/laravel/node_modules # add
    environment:
      TZ: Asia/Tokyo

  nginx:
    image: nginx
    container_name: nginx
    ports:
    - 80:80
    volumes:
    - ./web:/var/www
    - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
    - php

  db:
    image: mysql:8.0
    container_name: db
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: database
      MYSQL_USER: docker
      MYSQL_PASSWORD: docker
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
    - ./docker/db/data:/var/lib/mysql
    - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
    - ./docker/db/sql:/docker-entrypoint-initdb.d
    ports:
    - 3306:3306
```

実行手順は参照元と同等です。パスを読み替えてください。
メールの送信元とは別のメアドを返信先に設定したい

自分が知らなかっただけかもだけどメモ。

あるメールに対して返信するとき、デフォルトでは**From(送信元)** のメアドが返信先に設定される。
これを変更したい場合は、**ReplyTo(返信先)** をヘッダに追加してあげると送信元とは別のメールを指定することができる。

以下はLaravelの例

```php
Mail::send('emails.welcome', $data, function($message)
{
    $message->to('foo@example.com', 'John Smith')
        ->replyTo('reply@example.com', 'Reply Guy')
        ->subject('Welcome!');
});
```

参考：[php - "Reply-to" field in Laravel mail is not working - Stack Overflow](https://stackoverflow.com/questions/21633509/reply-to-field-in-laravel-mail-is-not-working)
参考：[メール 7.x Laravel](https://readouble.com/laravel/7.x/ja/mail.html)


そもそもメールヘッダにどんなものがあるか頭に入れておいた方が良さそう。後で読む。
[メール系の知識 - Qiita](https://qiita.com/kazuho39/items/c7136fde6f105a4f80ab)
useEffect 初回レンダリングで走るな!!!



useEffectって初回に走るんですよ、
これが面倒で面倒で....
かつてのcomponentWillmountやらcomponentDidUpdateやらを使ったclassコンポーネントを
functionコンポーネントに置き換えようとすると悲劇が起こりやすいです。。（今朝の話）

## デモンストレーション

```react
import React, { useEffect, useState } from "react";

export default function App() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    console.log("初回だけ走るよ〜");
  }, []);

  useEffect(() => {
    console.log("カウントが押されたとき走るよ〜");
  }, [count]);

  return (
    <div>
      <span>{count}回押された</span>
      <button onClick={() => setCount(count + 1)}>カウントアップ!</button>
    </div>
  );
}
```

ボタンが押されるとcountが1upするよくあるやつです。
2回目に出てくる`useEffect`は**カウントが押された時だけ**走って欲しいとします。
しかし、実際にコンソールをみてみると....![スクリーンショット 2020-10-09 13.10.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441432/3aacf96e-e721-6f31-d4a5-4ab12aff3315.png)


ボタンを一度しか押していないのに、
`console.log("カウントが押されたとき走るよ〜");`
が二回走ってしまっています。
`componentDidUpdate`と全く同じ挙動を期待するなら、一手間必要です。

## 解決作
フラグを持たせます。
この場合は無駄なレンダリングを避けるため`useRef`を使うのが適切でしょう。

```diff
- import React, { useEffect, useState } from "react";
+ import React, { useEffect, useState, useRef } from "react";

export default function App() {
  const [count, setCount] = useState(0);
+  const renderFlgRef = useRef(false)
  useEffect(() => {
    console.log("初回だけ走るよ〜");
  }, []);

  useEffect(() => {
+    if(renderFlgRef.current) {
      console.log("カウントが押されたとき走るよ〜");
+    } else {
+      renderFlgRef.current = true
+    }
  }, [count]);

  return (
    <div>
      <span>{count}回押された</span>
      <button onClick={() => setCount(count + 1)}>カウントアップ!</button>
    </div>

  );
}
```

![スクリーンショット 2020-10-09 13.19.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441432/b8261a75-b853-5aa3-f4b3-d9dc1d73c52e.png)


ちゃんとカウントアップ時のみ走らせることができました。


## 毎度フラグを作るのだるい~
useEffectがたくさんあるような場合は、その個数分フラグ処理が必要ですね。
正直面倒なのでカスタムフックにします。

```react:useEffectCustom
// 絶対に初回走るな
import { useEffect, useRef } from "react";

const useEffectCustom = (func, dependencyList) => {
  const fisrtFlgRef = useRef(true);

  useEffect(() => {
    if (!fisrtFlgRef.current) {
      func();
    } else {
      fisrtFlgRef.current = false;
    }
  }, dependencyList);
};

export default useEffectCustom;
```

```react:index
import React, { useEffect, useState } from "react";
import useEffectCustom from "./useEffectCustom";

export default function App() {
  const [count, setCount] = useState(0);
  useEffect(() => {
    console.log("初回だけ走るよ〜");
  }, []);

  useEffectCustom(() => {
      console.log("カウントが押されたとき走るよ〜");
  }, [count]);

  return (
    <div>
      <span>{count}回押された</span>
      <button onClick={() => setCount(count + 1)}>カウントアップ!</button>
    </div>
  );
}
```

これで毎度フラグ処理を実装せずに済みます!

## 参考資料
https://qiita.com/nishiurahiroki/items/7e9aa809abc655378682
【用語メモ】REST API

Heroku+Node.jsでLINEボットを作ろうとしたときにREST APIが何かわからなかったのでメモ。
#REST APIとは
__REST__という設計思想に基づいて作られたAPIのこと。()

##RESTとは
>
・Webの設計思想のこと
・「リソース」を扱うための考え方
・パラメータを指定して特定のURLにアクセスするとXML(またはJSON)で応答される
・セッションなどの状態管理は行わない
・同じURLからは同じ結果が得られる(状態やセッションに依存しない)

らしい。(引用元:https://www.subthread.co.jp/blog/20160506/)

__RE__presentational __S__tate __T__ransfer の略。

##RESTの設計思想
<details>
<summary>__セッションなどの状態管理を行わず、やり取りされる情報はそれ自体で完結して解釈することができる__こと。</summary>WebではHTTP自体にはセッション管理の機構はない
</details>

<details>
<summary>__情報を操作する命令の体系が予め定義・共有されている__こと。</summary>WebではHTTPメソッドに相当
</details>

<details>
<summary>__すべての情報は汎用的な構文で一意に識別される__こと。</summary>URL/URIに相当
</details>

<details>
<summary>__情報の一部として、別の状態や別の情報への参照を含めることができる__こと。</summary>HTMLやXMLに相当
</details>

(引用元:http://e-words.jp/w/REST.html)
AARI - Automation Anywhere Robotic Interface

#AARI - Automation Anywhere Robotic Interface
AARIがInnovation Dayにて発表されました。
日本国内向けのLaunchは今月下旬になるようです。
このAARIについての概要をまとめます。

##AARIに含まれるもの
まず、AARIには下記が含まれます。
- AARI for Web
- AARI for Desktop
- AARI for Applications
- AARI for Mobile
- AARI for Voice
これだけ見ても何ができるようになるのかイメージできませんので、それぞれ少し掘り下げます。

###AARI for Web
これは、v11の時にはHuman Bot Collaborationと呼ばれていた機能となります。
HumanとBotがCollaborationする。つまり、Botを実行する人とBotが協働する仕組みとなります。

v11の時との違いとしては、Control Roomに一体化されているという事です。
管理ツールやユーザーがアクセスする先もControl RoomのURLに統一されます。
また、オンプレミス導入時には、別建てのサーバーを立てなくて済むというのも利点です。

では、AARI for Webでは何が可能なのか。
まず、**複数のフォームやBotの実行を含むプロセスを定義する**ことが可能となります。
そのプロセスには、**承認やエスカレーション**を含めることが可能です。
（マネージャーへのタスク自動割当ては、次のバージョンで実装予定。）
そして、このプロセスの実行は、**Chrome等のブラウザから**行うことが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/dcbb3eab-e777-4e52-9b10-f1a4425a8dd1.png)
この図に出てくるユーザー2人の端末には、RPAの実行環境は不要というのも良い所。
Botは、Bot Runnerデバイス上でUnattended Botの形で動作しますので、
**プロセスを実行している間、ユーザーは別の作業をPC上で行うことも出来る**という事です。

###AARI for Desktop
AARI for Desktopは、Interactive Formsと呼ばれている機能になります。
Attended Bot。つまり、手元の環境でBotを稼働させている時に、フォームを利用することでBotとのやり取りが可能となります。

例えば、下記の様なときに使えます。

- Botの処理対象を指定する
    - 作成対象のレポートを選択し、日付範囲を指定するとか。
    - 処理対象のローカルのファイルを指定するとか。
- 複数システムからの情報をまとめて表示する
    - 顧客のIDを入力して検索すれば、顧客の基本情報や、サポートチケットの情報、出荷状況等の情報を一括表示するとか。
- フォームで情報を入力し、複数システムへ登録する
    - 修理の問い合わせに対して、ケースへの登録、代替品の送付を一気に行うとか。

詳しくは、以前記事にした下記を参照ください。
[Automation Anywhere A2019でメール配信用ボット](https://qiita.com/aaiso/items/eb7d103e1c9f61a22567)

尚、最新版（A2019.16）では、テーブル表示が可能となっていますので、
IQ Botで処理したデータを表示しつつ、横に元の帳票もDocument要素で表示して、内容の確認を行うAttended Botも作れますね。
（A2019.16では日本語表示に問題があるので、日本語UIでテーブルを使うにはA2019.17を待たないといけませんが・・・）

###AARI for Applications
ここに含まれるのは、各種アプリケーションまたはサービス用のプラグインまたはコネクタになります。
RPAのクライアントを立ち上げることなく、Botの実行が出来るのが、まず大きな利点となります。

- Excel Ribbon Plugin
    - ExcelのリボンからBotを実行できるようになります。
    - 実行時にシート上の範囲を指定して、Botにパラメータとして渡すことが出来たりしますので、Excelを中心に業務をされている方は使い勝手が良いかと思います。
- SFDC Plugin
    - SFDC(セールスフォースドットコム)のワークフローからBotを実行する事が出来ますので、特定のフィールドに入力があった等のイベントを拾って、自動的にBotを実行する事が出来ます。
- Google Sheet Plugin
    - Excel Ribbon PluginのGoogle Sheet版ですね。
- MuleSoft Connector
    - MuleSoftのワークフローからBotを実行する事が可能であり、逆に、BotからMuleSoftのワークフローを呼び出すことも可能です。
- ServiceNow Connector
    - ServiceNowのワークフローからBotの実行が可能になります。

###AARI for Mobile

将来、モバイルアプリからBotが実行できるようになるという事ですかね。
既に、Automation Anywhere用のモバイルアプリは、iOS / Android用で提供されていて、
Botの実行状況やBot Insightのレポート表示が出来るようになっていますので、
今後、ここからBotやプロセスの実行が可能となるのかと思います。
外出先からBotを実行して、欲しい情報をメールで届けてもらうといったことも出来るようになりそうですね。
尚、既にCitrix社のMicroAppからの呼び出し連携は可能なことが確認取れていますので、Citrix社ユーザーであればそちらも選択肢ですね。

###AARI for Voice

こちらもロードマップアイテムですね。
音声でBotを実行という事ですので、コールセンターのIVR（音声自動応答）であったり、モバイルアプリとかを利用したBot実行になるのでしょうか・・・

##まとめ

色々記載しましたが、
基本的には「Botを、社員誰でも、どこからでも使えるようにする。それも対話が可能な形で。」という事かと思います。
Botの活用範囲が広がりそうですね。
リクエストの形式(初学者用)



APIを使用する時にPOSTとGETが頭でフワフワしていたのでまとめました。

###Ajax
Javascriptからwebサーバーにアクセスしてリソースを取得


###GETメソッド
GETメソッドとは情報の取得を表すメソッド。
URIで指定されたリソース（＝情報）を取得する為に用いる。
GETを使ったアクセスでサーバー上のリソースが変更されることは基本的にない（既読機能/未読や最終アクセスなどGETによりリソースが参照されたこと自体を記録している場合などは例外）

![スクリーンショット 2020-10-09 12.24.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612179/7ed8b72b-bb76-31c1-3e08-b0aaae8c4478.png)

Google検索URI一部

mYAg&q=リソース&oq=


###POSTメソッド

指定したURIに属する新しいリソースを送信する。新しい情報(ブログの投稿など)を登録する為に利用する。


###PUTメソッド

URIが存在していた場合PUTはそれを修正することを意味する。
HTTPの定義的には指定したリソースがまだ存在していない場合でもPUTでデータをを送信し、新しいリソースを生成することは可能ですが、WebAPIではデータを修正するという場合にPUTを用い、新しいリソースを生成するのはPOSTを利用するのが一般的。


###PATCHメソッド

PUTと同じく指定したリソースを更新する為に利用するメソッドですが、
PUTは置き換えるものに対し、PATCHはその一部だけを更新したい場合に使う。
1MBあるデータの一部を変更する際にPUTで送信するのは非効率なのでPATCHで送ると小さなデータの送信で済む。



参考：Web API The Good Parts
rails simple formでbooleanのvalueをjQueryでgetする方法

jqueryでcheckされたかをどうやって実装するか悩んで調べましたが、あまり情報がなく自分で実装してみました



```
# rails form, idは"testBool"とします
= f.input :test_bool, as: :boolean
 
// jquery
$('#testBool').on('click', function() {
  console.log($(this)[0]['checked'])
})
 
-> 
false
true
 
```

この実装方法でいけば動的にtrue, falseを取得することができるのでjs側での制御がかなり楽になります


### 参考記事
なし
【Ruby on Rails】ページング機能導入

# 目標
ページング機能を作成し、
一覧表示時の画像読み込み速度低下を防ぐ

# 開発環境
ruby 2.5.7
Rails 5.2.4.3
OS: macOS Catalina

# 前提
※　▶◯◯　を選択すると、説明等が出てきますので、
　　よくわからない場合の参考にしていただければと思います。

今回はgem 'kaminari'を導入し、ページング機能実装します。

# kaminari導入までの流れ

```rb:Gemfile
gem 'kaminari','~> 1.2.1'
```
```:ターミナル
$ bundle install
$ rails g kaminari:config
$ rails g kaminari:views default
```

これで導入は完成です。

# 使い方
個人的によく使うものを紹介します。
https://github.com/kaminari/kaminari
こちらに詳しい使い方が記載されておりますので、
興味のある方はこちらをみてください。
ただし、全て英語です。

## 基本的なページング
ページングしたい場所に以下を設置。
この場所に1ページ目や2ページ、次へリンクも出てきます。

```erb:app/views/homes/index.html.erb
<%= paginate @posts %>
```

コントローラーをこのように記述することでページングが実装できます。

```rb:app/controllers/homes_controller.rb
@posts = posts.page(params[:page])
```
<details><summary>補足【page(params[:page])】</summary>
page(params[:page])　≒　all　と思って頂いて大丈夫です。</details>


## ページングの並び替え
コントローラーの記述に書きを追加することで逆の順番にすることが可能。

```rb:app/controllers/homes_controller.rb
@posts = posts.page(params[:page]).reverse_order
```

## 1ページあたりの表示件数を指定

```rb:config/initializers/kaminari_config.rb
  Kaminari.configure do |config|
    config.default_per_page = 5 # この数字でkaminariを使用したすべてのページの1ページあたりの表示上限件数を指定
  end
```

個別で表示1ページあたりの表示件数を指定する場合

```rb:app/controllers/homes_controller.rb
@posts = posts.page(params[:page]).per(10)
```
<details><summary>補足【表示の優先順位】</summary>
優先順位はkaminari_config.rbの数字が優先されるため、
kaminari_config.rb　>=　homes_controller.rb
このような数字の優劣をつけてください。</details>


## 表示を変更する
nextやlastなどを変更したい場合、

1 gem 'rails-i18n'を導入
2 config/locals/ja.ymlファイルを作成
3 ja.ymlを編集

上記を行えばOKです。
【ja.yamlの参考】

```yml:ja.yaml
ja
  views:
    pagination:
      first: "≪"
      previous: "<"
      next: ">"
      last: "≫"
```

## 配列に対して適用する場合
上記方法で実装する際に、値が配列の場合は表示されないため、
下記のように記述する必要があります。

```rb:app/controllers/homes_controller.rb
@posts = Kaminari.paginate_array(配列).page(params[:page])
```
実際の記述：[【Ruby on Rails】ランキング表示（合計、平均値）](https://qiita.com/japwork/items/e7675fac18c0e13172a2)

## その他機能
[【Rails】自動で次のページへ！！jscrollによるページネーションの無限スクロール](https://qiita.com/gyu_outputs/items/a4624b03939831831f81)

他にも多くあるので興味のある方はぜひ調べてみてください。


# まとめ
導入自体はそこまで難しくないものの、ページング機能がないと
サイトが成長したときに読み込みが遅く使い物にならないので、
なにかしらのページング機能は必須です。

またtwitterではQiitaにはアップしていない技術や考え方もアップしていますので、
よければフォローして頂けると嬉しいです。
詳しくはこちら　https://twitter.com/japwork
herokuでアプリのサーバにsshログイン

1 アプリのディレクトリに移動&&herokuログイン

```
$ cd app_name
$ heroku login --interactive
```

2 ssh接続したいアプリを指定

```
$ heroku git:remote --app app_name
```

3 sshでサーバに接続

```
$ heroku run bash
```


※ Herokuで"Run console" が実行できなくなってしまったときの対処法 


1 コマンド実行後、下記のように稼働中の one-off processesが確認できた場合、
該当プロセスを止める必要があります。

```
$ heroku ps
Free dyno hours quota remaining this month: 978h 53m (97%)
Free dyno usage for this app: 20h 4m (2%)
For more information on dyno sleeping and how to upgrade, see:
https://devcenter.heroku.com/articles/dyno-sleeping

=== run: one-off processes (1)
run.2767 (Free): up 2018/11/23 21:06:53 +0900 (~ 9m ago): bash

=== web (Free): node server.js (1)
web.1: up 2018/11/23 21:12:24 +0900 (~ 4m ago)
```

2 下記コマンドで、プロセスIDを指定して該当プロセスを終了します。

```
$ heroku ps:stop run.2767(プロセスID)
```
【MySQL】文字列比較で空白が無視される

## きっかけ
Oracleではユニークなのに、MySQLだとユニーク設定しようとするとエラーになる項目があり
原因を追究したところ、データ後ろの半角␣の有無の違いでユニーク扱いになっているデータが、MySQLだと重複データとして扱われているようだったので調べてみた

## 公式ドキュメントによると
[MySQL リファレンスマニュアル 4.1](http://download.nust.na/pub6/mysql/doc/refman/4.1/ja/comparison-operators.html)
>いずれかの標準演算子（= や <> など。LIKE は含まない）を使用してケース非依存文字列を比較する場合、後続の空白（スペース、タブ、改行復帰）は無視されます。（4.1のマニュアルより）

## 対処法
MySQLの根本仕様なので、空白のままユニークキーとすることは、まずあきらめ
半角␣を別の任意の文字列（-ハイフン等）に置き換えて格納することにした。

```mysql
REPLACE(問題の項目,' ','-')
```

該当の事象は、WHERE句、JOIN句で使用する際も同様の扱いになるため
注意が必要だ。

## 参考リンク
http://download.nust.na/pub6/mysql/doc/refman/4.1/ja/comparison-operators.html
ルーティングの基本(laravel,PHP)


```php:web.php
//特定のHTTPメソッドに対応する場合

Route:○○('viewのパスを記入','コントローラー@アクションメソッド');

//複数のHTTPメソッドに対応する場合

Route::match(['〇〇','〇〇'],'viewのパスを記入','コントローラー@アクションメソッド');
//※['〇〇','〇〇']に指定した複数のメソッドを対応させることが可能

//全てのHTTPメソッドに対応する場合

Route::any('viewのパスを記入','コントローラー@アクションメソッド');

```

ルーティング情報をコントローラから取得する場合（ルートパラメーター)

```php:web.php
#自動的に対応する値を引数に割り当ててる場合
Route::get('viewのパスを記入/{id}','コントローラ名@アクションメソッド');
#任意の値を引数に割り当てる場合
Route::get('viewのパスを記入/{id?}','コントローラ名@アクションメソッド');
#ルートパラメータを制限したい場合
Route::get('viewのパスを記入/{id}','コントローラ名@アクションメソッド')->where([id =>'[0-9],{2,3}'])
//[0-9]->0~9までの数値に対応
//{2,3} ->10桁から100桁の数値に対応
//定義済み関数のpreg_matchと同じ　
```

```php:〇〇controller.php
#自動的に対応する値を引数に割り当ててる場合
class Controller extends Controller
{
    public function param(int $id){ 
        return 'id:'.$id;
    
    }

//.....
```

````php:〇〇controller.php
#任意の値を引数に割り当てる場合
class Controller extends Controller
{
    public function param(int $id =任意の値){ 
        return 'id:'.$id;
    
    }

//.....
```


````php:〇〇controller.php
#正規表現の場合
class Controller extends Controller
{
    public function param(int $id =任意の値){ 
    //※任意の値はルートパラメータで制約しているため従う必要がある
    //例:現在は[0~9],{2-3}に指定しているので　０〜９の数値で尚且つ１００桁までの数値を定義する必要がある
     return 'id:'.$id;
    
    }

//.....

```

```php:web.php
//可変長パラメータ
Route::get('viewのパスを記入{keywd?}','コントローラ@アクションメソッド')>where('keywd','.*')
//('keywd','.*') ->任意の文字が0文字~~+∞という意味
//可変長は長さが決まっていないことを挿す
Sage 9 + Vue.JS を設置

#sage9を設置

1. [sage9をインストール](https://roots.io/sage/)
2. [sagajsを上書き](https://github.com/pixelcollective/SageJS)
3. Vue.jsをインストール `yarn add vue`
4. その他アプリ `yarn add --dev vue-loader vue-template-compiler eslint-plugin-vue vue-style-loader`
5. resources/assets/config.jsonにパスを通す `"resources/assets/scripts/vue/**/*.vue"`

コンパイルでエラーが出るのでcosmiconfigをアップデート`yarn add cosmiconfig`

[参考ページ](https://discourse.roots.io/t/adding-vue-js-to-sage-9-dependencies-and-approach/9644/11)
Optional(Wrapped)型を理解しよう！

Optional<Wrapped>型について学習したので、アウトプットしていきます
※以下の内容は、学習内容のアウトプット用のため、誤りがある場合があります。予めご了承ください

#Optional（Wrapped）型とは？
***Optional（Wrapped）型を一言でいうと、値があるか空かのいずれを表す型です。***
基本的に、swiftの変数や定数は基本的にnilを許容しないのですが、そのnilを用いる場合には
***Optional（Wrapped）型を使用します!***

例えば

```swift:qiita.rbvar 
1.var n: Int
2.
3.print(n)//エラー
```

上記のように、存在していない値を出力しようとするとエラーが起こります。
そこで登場するのが、Optional（Wrapped）型です

```swift:qiita.rbvar 
1.var n: Optional<Int>
2.
3.print(n)//nil
```

上記のように、Optional（Wrapped）型を使うとエラーにならず、nilが出力がされます。

このように、***「『Optional型』***でデータをラップしておくと値が存在しない場合は***『nil』***を返すようになる」という挙動になるためエラーを回避することができます。これが***『Optional型』***の基本的な使い方になります.


#Optional（Wrapped）型のアンラップとは？
Optional（Wrapped）型は値を持っていない可能性があるため、Wrapped型の変数や定数と同じように扱うことができない。
例えば、Int？型どうしの四則演算はエラーになります。

```swift:qiita.rbvar 
1.let a: Int? = 1
2.let b: Int? = 1
3.a+b//エラー
```
このエラーを回避するために、アンラップを行います。
アンラップの方法は以下の３つです。

○　***オプショナルバインディング***
○　***？？演算子***
○　***強制アンラップ***

一つずつ深堀りしていきましょう！


#オプショナルバインディングとは？
```swift:qiita.rbvar 
if let 定数名 = Optional(Wrapped)型{

//値が存在する場合に実行される文

}
```
上記の文のように、if-let文を用いてWrapped型の値をもつ場合は{}の文が実行されます。
次の例では、定数Aに値が存在するため、String型の定数aに値が代入され、実行文が実行されます！


```swift:qiita.rbvar 
1.let A: Optional("1") //Int型
2.if let A {
print(type(of:1))

//実行結果：Int

}
```

#　??演算子とは？

次の例では、？？演算子の左辺にString型の値"a"を持った、String型？の定数optionalStringを右辺にString型の値"b"を指定し、結果として左辺の値"a"を取得しています。

```swift:qiita.rbvar 
1.let optionalString:String? = "a"
2.if String = optionalString ?? "b"

//実行結果　a

```
#　強制アンラップとは？
強制アンラップは、Optional(Wrapped)型からWrapped型の値を強制的に取り出す方法です。
強制アンラップを行うには、！演算子を使用します。
上記では、Wrapped型の変数や定数と同じように扱うことができないと述べましたが、強制アンラップ使うことによって取り出すことができます。

```swift:qiita.rbvar 
let a : Int? = 1
let b : Int? = 1
a!+b! = //2
```
Slack（チャットツール系）をはじめて使う人へのガイドライン

本家の[初心者ガイドライン](https://slack.com/intl/ja-jp/help/categories/360000049043)が詳しすぎて、超初心者にはぱっと理解しにくいと感じたので利用頻度が高いアクションだけ抜粋。
利用ハードルを０にしたい。

# チャンネル編
チャンネルは部屋とかグループだと思って欲しい。
チャンネルに入ってチャットするのが基本となる。
パブリックチャンネルとプライベートチャンネルがあり、
前者は誰でも参加可能、後者は招待された人のみ参加可能という違いがある。
＜参考＞
[チャンネルを作成する](https://slack.com/intl/ja-jp/help/articles/201402297-%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)
[チャンネルに参加する](https://slack.com/intl/ja-jp/help/articles/205239967-%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%99%E3%82%8B)


# チャットしよう
[これは本家がわかりやすいので割愛](https://slack.com/intl/ja-jp/help/articles/360002063088-Slack-%E3%81%A7%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)
まぁ見たまんま。

# メンバーにメンションを送ろう
slackでは「@誰々」とすることで特定の人に話かける事ができる。特定の人に質問や対応をお願いしたい時に使おう。
（メールで例えるならばtoがメンションで、チェンネル内の人全員がccという認識が近いかも）
＜参考＞
[Slack でメンションを使用する](https://slack.com/intl/ja-jp/help/articles/205240127-Slack-%E3%81%A7%E3%83%A1%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B)

# 絵文字リアクションを使おう
読んだよーレベルのリアクションをしたい時とかは、
[絵文字リアクション](https://slack.com/intl/ja-jp/help/articles/206870317-%E7%B5%B5%E6%96%87%E5%AD%97%E3%83%AA%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E4%BD%BF%E3%81%86)を使おう。
画面もにぎやかになって楽しい！

# スレッドを使ってみよう
会話に返答する事でスレッドを作られる。
話題毎に整理されるので、チャンネルがぐちゃぐちゃにならなくて便利！
＜参考＞
[スレッドを使用して会話を整理する](https://slack.com/intl/ja-jp/help/articles/115000769927-%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E4%BC%9A%E8%A9%B1%E3%82%92%E6%95%B4%E7%90%86%E3%81%99%E3%82%8B-)


# おわりに
とりあえずこれだけわかっていればslackを利用することはできると思う。
slackでは色々な事があるので使い慣れてきたら[公式ガイド](https://slack.com/intl/ja-jp/help)を読んでみるのもいいかもしれない。自分好みにカスタマイズしたりできる。
では良いslackライフを。
VScode使用時にディレクトリ階層をまとめないようにする

今回は、VScodeを使っていて個人的に不便と感じていた自動でディレクトリをまとめる機能を外す方法についてご紹介します。

##結論
1. Command + , で設定画面を開く
2. Compactで検索する
3. Explorer: Compact Foldersをoffにする

このスリーステップで解除できます。

##最後に
ここまで記事を読んでいただきありがとうございました。
シンプルですが、今回はこちらで以上となります。同じ悩みを抱えていた方の助けになれたら幸いです。
[ServiceNow] デモデータ入りの環境でログイン画面のデフォルトが英語になる理由

System Properties > System Localization でインスタンスのデフォルト言語に「ja」と入れ、日本語と設定すると、デモデータが入っていない環境であれば、ログイン画面のデフォルトもインスタンスのデフォルト言語に従って、日本語になります。
但し、デモデータが入っている環境ですと、ログイン画面のデフォルトは英語のままです。
デモデータ入りの環境でログイン画面のデフォルトがインスタンスのデフォルト言語にかかわらず、英語になる理由は、デモデータの中には、「guest」という ID のユーザーが存在し、その言語が英語になっているためです。

ServiceNow では、ログインしていない状態ですと、「guest」ユーザーと認識され、「guest」ユーザーに設定された内容が反映されます。
デモデータでは、以下のように「guest」ユーザーが存在し、言語が英語に設定されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/756088/8626e75f-e19d-c48c-7a6b-9cbfa7cec63b.png)
この設定が反映され、ログイン画面のデフォルトは英語になります。
デモデータが入っていない環境ですと、「guest」ユーザーが存在しないため、インスタンスのデフォルト言語が反映されます。

デモデータ入りの環境で、「guest」ユーザーの言語を日本語と設定すると、ログイン画面のデフォルトも日本語になります。
インスタンスのデフォルト言語を英語にしたとしても、「guest」ユーザーの設定が優先されます。
「guest」ユーザーの言語を「System」にすれば、インスタンスのデフォルト言語がログイン画面のデフォルトにも反映されることになります。

以上です。
ファイル名一覧をテキスト（.txt）ファイルに書き込む【Python】

機械学習のデータセットのためのファイル名一覧などに。
![スクリーンショット 2020-10-09 12.20.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/a83d76f1-d702-76d1-0620-15433d5c6ed0.png)


```python

import os

path = "./datasets/train" # ファイル名一覧を取得したいディレクトリのパス
text_file = open("./datasets/train.txt", "w") # 書き込み先のテキストファイルを作る

files = os.listdir(path) # ファイル名一覧を取得

for f in files:
  basename_without_ext,ext = os.path.splitext(os.path.basename(f)) # 拡張子抜きのファイル名を取得
  text_file.write(basename_without_ext + "\n") # テキストファイルに書き込む

text_file.close() # テキストファイルを保存

```

>image0
image1
image2
image3
・
・
・

という感じで書き込まれます。
拡張子も書き込みたい場合は、

```python

 # basename_without_ext,ext = os.path.splitext(os.path.basename(f)) # 拡張子抜きのファイル名を取得
basename = os.path.basename(f) # 拡張子ありのファイル名を取得
```

>image0.jpg
image1.jpg
image2.jpg
image3.jpg
・
・
・

🐣
****
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
Prometheus vs. Nagios

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/de3d9a02-d961-4c58-bcb1-e39dc577d159.png)

#Prometheusとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/e34ecac2-4d45-026c-890a-2d0301fd7c63.png)

Prometheusは、時系列データベースを中心に構築されたオープンソースのサービス監視システムで、クエリ、グラフ、組み込みのアラートのサポートに加えて、データを受信して保存できます。 ターゲットエンドポイントに接続してHTTP経由でメトリクスをリクエストするPrometheusは、メトリクスを一意の時系列の一部として識別する名前やタグでメトリックを定義できる多次元データモデルを提供します。 Hosted Prometheus by MetricFireでは、データを最大2年間保存できますが、オープンソースのPrometheusメトリクスのデフォルトの保持期間は15日です。 その後、Prometheusクエリ言語（PromQL）を使用して、メメトリクスを探索し、単純なグラフを描画できます。

Prometheusの使用が適しているかどうか、またはご不明な点がございましたら、いつでも[デモを予約](https://www.metricfire.com/demo/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Prometheus%20vs.%20Nagios)して直接お問い合わせください。

#Nagiosとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/c947b6df-86b2-0af3-cf55-cf94a3cebcff.png)

Nagiosは、サーバー、ネットワーク、ログを監視するための専用ソフトウェアです。 アプリケーション、サービス、オペレーティングシステム、ネットワークプロトコル、システムメトリック、ネットワークインフラストラクチャなどのインフラストラクチャーのすべての部分を監視できます。 Nagiosは、何百ものサードパーティのプラグインと統合できるのも強みです。 また、非常に強力なサーバーパフォーマンスを備えており、高い稼働率でメトリクスの無制限のスケーラビリティを処理できます。 視覚化のためのWebインターフェイスと高度なダッシュボードもあります。 また、Nagiosを使用すると、ユーザーは容量計画、スナップショット構成を保存して再利用できるようになり、インフラストラクチャー管理を行うことができます。 ネットワークインフラストラクチャーまたはログを監視する場合は、さまざまな製品が必要ですがNagiosFusionと呼ばれる製品は、両方を結合します。

#[MetricFire](https://try.metricfire.com/japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Prometheus%20vs.%20Nagios)のHosted Prometheusの利用が適しているケース

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

- 時系列データベースの監視ソリューションが必要
- Prometheusメトリクスの長期保存がしたい
- メトリックにはタグ/ラベルを使用したい
- 異なるデータソース間でアラートを実行したい同じサービスの一部として、GraｆanaからPrometheusとGraphiteの両方を使用してクエリを実行したい

#Nagiosの使用が適している時

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

- サーバーを監視したい
- ネットワークを監視したい
- アプリケーションを監視したい
- WindowsまたはLinuxの監視が必要である
- ログ監視が必要です

#価格の比較

- Prometheusはオープンソースであり、無料です。
- Hosted Prometheus、Hosted Graphite、Grafanaなどの[MetricFire](https://try.metricfire.com/japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Prometheus%20vs.%20Nagios)によるビジネス対応のPrometheus as a Serviceは、月額99米ドルからです。
- Nagios Enterpriseは月額3495米ドルからです。

#重要なポイント

- Prometheusは、メトリックが組み込みのストレージ、グラフ化、およびアラートを備えたメトリック名とタグによって識別されるディメンションデータモデルを提供できます。
- Prometheusはオープンソースであり、無料です。
- Nagiosは、サーバー、ネットワーク、およびアプリケーションの監視に重点を置いたレガシーITインフラストラクチャ監視ツールです。

Hosted Prometheusをよりよく理解し、[MetricFire](https://try.metricfire.com/japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Prometheus%20vs.%20Nagios)が監視環境にどのように適合するかを確認してください。  Prometheusで何ができるかについて質問がある場合は、[デモを予約](https://www.metricfire.com/demo/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Prometheus%20vs.%20Nagios)しお問い合わせください。