OmniAICreator/Qiita-1.07M huggingface dataset:
ＥＭアルゴリズムの詳しい流れ

ＥＭアルゴリズムは、クラスター分析の一種で教師無し学習に分類されます。単純なk-平均法とは違い、どのクラスターに属しているか確率を考慮しています。

#仮定
・（入力データ）データを確率変数$x$で表します。
・（クラスターの数）データをＫ個に分類。Ｋは定数で分析者が決めます。
・（隠れ変数）データがどのクラスターに属しているかを表した確率変数$z_i$（i=1~K）を導入します。属しているクラスターの番号のときだけ１で他は０をとるとします。さらに下記条件を満たすと仮定します。
　条件１．$P(z_i=1)=\pi_i$,$P(z_i=0)=1-\pi_i$
　条件２．$\sum_{i=1}^{K}\pi_i=1$
$z_i$たちを$K$までまとめた確率変数の組み合わせを$z=(z_1,・・・,z_K)$と書くことにすると、あるデータが2つ目のクラスターに属しているときは$z=(0,1,0,0,・・・,0)$となります。
・（クラスターごとの分布）属するクラスターが決まったときの、データの密度関数$f_i(x|z_i=1)$は平均$μ_i$、分散$\Sigma_i$の正規分布$N(x|μ_i,\Sigma_i)$に従うとします。ただしこの正規分布の次元はデータの特徴量の次元と等しいとします。

#アルゴリズムの準備
・$\pi_i$と$z$の仮定より$z$の確率関数は、$h(z)=\prod_{i=1}^K\pi_i^{z_i}$となります。$z$の中である１つの$z_j$だけ１になるので、$\pi_j$だけ残りこの等号が成立します。

・クラスターごとの分布の仮定より、$f(x|z)=\prod_{i=1}^{K}N(x|\mu_i,\Sigma_i)^{z_i}$となります。

・$x$と$z$の同時分布は代入して$g(x,z)=h(z)f(x|z)=\prod_{i=1}^K\pi_i^{z_i}$ ×$\prod_{i=1}^{K}N(x|μ_i,\Sigma_i)^{z_i}$となります。

・上記の周辺化によりデータ$x$の分布は$f(x)=\sum_{zのﾊﾟﾀｰﾝ全て}　g(x,z)$であり、$z$のパターンは$z=(1,0,・・・,0)～(0,0,・・・,0,1)$しかないので、最終的に$$f(x)=\sum_{i=1}^K\pi_{i}N(x|\mu_i,\Sigma_i)$$となる。これを混合ガウス分布といいます。これでデータの分布モデルができました。



・$x$の分布を設定できたので、最尤法により実際の入力データ$x_1,・・・,x_N$が独立で同分布の密度関数$f(x)$に従うとして対数尤度$L(\pi,\mu,Σ)=\ln\prod_{n=1}^Nf(x_n)$をとると
　　$L(\pi,\mu,Σ)=\sum_{n=1}^N\ln f(x_n)$
　　　　　　 　$=\sum_{n=1}^N\ln \sum_{i=1}^K \pi_{i} N(x_n,\mu_i,\Sigma_i)$.

これを最大にするパラメータ$\pi_i$ , $\mu_i$ , $Σ_i(i=1～K)$を求めたいわけです。

#パラメータの最適化
対数尤度にした後は、それぞれのパラメータで偏微分した式を０とおいて、連立方程式を解くことになります。この記事で計算は省略しますが、実際にそうして計算すると下記のようになります。
　　$\mu_i=\frac{\sum_{n=1}^Nγ(z_{ni})x_n}{\sum_{n=1}^Nγ(z_{ni})}$
　　$\Sigma_i=\frac{1}{\sum_{n=1}^Nγ(z_{ni})}\sum_{n=1}^Nγ(z_{ni})(x_n-\mu_i)(x_n-\mu_i)^{T}$
　　$\pi_i=\frac{\sum_{n=1}^Nγ(z_{ni})}{N}$
　　※ただし、$γ(z_{ni})=\frac{\pi_iN(x_n|\mu_i,\Sigma_i)}{\sum_{i=1}^K\pi_iN(x_n|\mu_i,\Sigma_i)}$　とおいています。これを負担率といいます。

このようにパラメータを計算しましたが、$\pi_i$ , $\mu_i$ , $\Sigma_i(i=1～K)$の全てに$γ(z_{ni})$が入っており、$γ(z_{ni})$自身が$\pi_i$ , $\mu_i$ , $\Sigma_i(i=1～K)$によって決まるため、堂々巡りとなります。そこで、先にまずランダムでパラメータ$\pi_i$ , $\mu_i$ , $\Sigma_i(i=1～K)$から決めてやって、そこから負担率を算出して、その負担率から２回目のパラメータを求めるといった繰り返し処理によって最適なパラメータに近づくようにします。

#ＥＭアルゴリズム
１．（初期化）パラメータ$\pi_i$ , $\mu_i$ , $\Sigma_i(i=1～K)$を初期化する。

　　　－ループ開始－

２．（負担率の計算）パラメータ$\pi_i$ , $\mu_i$ , $\Sigma_i(i=1～K)$を用いて負担率を計算する。

３．上記のパラメータ最適化の計算から、２の負担率を使ってパラメータ$\pi_i$ , $\mu_i$ , $\Sigma_i(i=1～K)$を算出する。

４．対数尤度の式に３で求めたパラメータを代入する。前回の対数尤度と比較して変化無しまたは設定しておいた差よりも小さくなったところでアルゴリズムを終了する。そうでなければ２に戻る。

　　－ループ終了－

◆大事な事
・パラメータを更新するごとに最適解に近づくことが数学的に知られています。
・条件付き分布は正規分布でなくてもよく、もっと一般的な理論が展開されています。

参考
・はじめてのパターン認識（平井 有三）
・http://seetheworld1992.hatenablog.com/entry/2018/10/01/002958
PHP 三項演算子について

#概要
仕事で三項演算子を使ったのでアウトプット。

##三項演算子とは

```
条件 ? 出力1 : 出力2
```
条件に書き込んだ処理が真であれば出力1を、偽であれば出力2が処理される演算子です。

###実行例1
「sankou.php」というファイルに三項演算子を使用したコードを書きました。

```
<?php
$var = 1;
$var1 = 2;

echo $var<1 ? $var : $var1,PHP_EOL;
```

実行すると、2が出力されます。

```
$ php sankou.php
2
```

条件に当たる部分が`$var<1`です。変数$varには1が格納されているので、偽で判定されます。偽であるので、出力2に当たる`$var1`が処理され、その変数の値である2がechoで出力されます。

##三項演算子省略記法

```
条件 ?: 出力2
```

先ほどの`出力1`を省略する記載方法です。

偽の時の処理は同じですが、真であった場合の処理が先ほどと変わり`条件`が処理されます。

###実行例2

次は「sankou_shoryaku.php」というファイルにコードを書きました。

```
<?php
$var = 1;
$var1 = 2;

echo $var ?: $var1,PHP_EOL;
```

実行すると、1が出力されます。

```
$ php sankou_shoryaku.php
1
```

条件`$var`は、値が格納されていれば真と判定されます。今回`$var`には値を格納しているので真になります。

`出力1`に当たる部分が省略されているので`$var`が処理されます。
よって、`$var`がechoで処理される為、1が出力されます。


##使い道

今回の例だと何の為に使うか使えるかがわからないかと思いますが、
変数に特定の値が格納されていれば別の処理メソッドを呼び出したい、などの時に有用です。
Markdown で ページ内リンク付き の 目次 を 作成 する 方法

## 〜宣伝〜

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

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

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

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

## 目的

- Markdownでのリンクが有る目次の描き方を知る  
※本投稿で紹介する内容はMarkdown記法だけではなく、HTMLの記法も活用します。  
※おそらく本記載方法はQiitaのMarkdown では使えないと思います。。。すいません。。。

## 押さえるポイント

- この作成法はHTML記法のリンク作成タグの`<a>`を使用したものである
- リンクをクリックして飛ぶ先をidで指定する。
- idを用いて飛ぶ先の識別子を定義する。
- idで識別子を定義するときは下記のルールに従う。
    - 識別子は重複不可能。
    - 使用できる文字は半角英数字、ハイフン、アンダーバー、コロン、ピリオド。
    - 数字や記号で始められない。
    - 大文字小文字の区別がある。  
※リンク先の関係など理解しにくい部分もあると思うので書き方の例に記載された内容をそのままテンプレートとしてお使いください。

## 書き方の例

- 下記にMarkdownファイルのリンク付き目次のテンプレートを記載したファイルの内容を記載する。

``` markdown 
<!-- 目次部分(リンクになるところ) -->
1. [概要](#anchor1)
1. [フロー](#anchor2)
1. [詳細](#anchor3)

〜〜〜〜〜中略〜〜〜〜〜

<!-- リンク先(目次部分のリンクの飛び先) -->
<a id="anchor1"></a>

1. 概要

〜〜〜〜〜中略〜〜〜〜〜

<a id="anchor2"></a>

1. フロー

〜〜〜〜〜中略〜〜〜〜〜

<a id="anchor3"></a>

1. 詳細

〜〜〜〜〜中略〜〜〜〜〜
```

## より具体的な例

- 前述の描き方の例を元にもう少し実践的な記載例を記す。
- 日本の挨拶について紹介するMarkdownファイルを下記に記載する

``` markdown
# 目次
1. [概要](#anchor1)
1. [順序](#anchor2)
1. [詳細](#anchor3)

<a id="anchor1"></a>

1. 概要
    - 日本の挨拶についてまとめる

<a id="anchor2"></a>

1. 挨拶の順序
    1. おはようございます。
    1. こんにちは。
    1. こんばんは。

<a id="anchor3"></a>

1. 詳細
    1. 「おはようございます」とは  
    起床時、あるいは朝人に会った時の挨拶。
    1. 「こんにちは」とは  
    語源は「今日は、ご機嫌いかがですか？」が省略されたもの
    1. 「こんばんは」とは  
    語源は「今晩は〇〇ですね。」の後半部分が省略されたもの

```
↓プレビュー(Markdownファイルならリンクとして扱われている目次の各項目をクリックするとリンクするドキュメント内のaタグの位置にジャンプする。下記プレビューはQiitaの記事として記載されているのでジャンプはしない。)

# 目次
1. [概要](#anchor1)
1. [順序](#anchor2)
1. [詳細](#anchor3)

<a id="anchor1"></a>

1. 概要
    - 日本の挨拶についてまとめる

<a id="anchor2"></a>

1. 挨拶の順序
    1. おはようございます。
    1. こんにちは。
    1. こんばんは。

<a id="anchor3"></a>

1. 詳細
    1. 「おはようございます」とは  
    起床時、あるいは朝人に会った時の挨拶。
    1. 「こんにちは」とは  
    語源は「今日は、ご機嫌いかがですか？」が省略されたもの
    1. 「こんばんは」とは  
    語源は「今晩は〇〇ですね。」の後半部分が省略されたもの
【トラブルシューティング】VirtualBoxが使えくなった

##症状

VirtualBoxを開いて，Arch等を起動しようとすると，以下のエラーが出て起動できない．

```
VMSetError: Call to WHvSetupPartition failed: ERROR_SUCCESS (Last=0xc000000d/87)
VERR_NEM_VM_CREATE_FAILED
```


##解決策
1. VirtualBoxが入っていたらアンインストールしてOSを再起動
2. デバイスマネージャーのネットワークアダプターからHyper-V Virtual Ethernet Adapterを削除
3. OSを再起動
4. 念のため、管理者権限のコマンドプロンプトから以下を実行

```
bcdedit /set hypervisorlaunchtype off
```

5. OSを再起動
6. VirtualBoxをインストール
7. https://download.virtualbox.org/virtualbox/6.0.10/Oracle_VM_VirtualBox_Extension_Pack-6.0.10.vbox-extpack からExtention PackをDL
8. VirtualBoxの環境設定→拡張機能でDLしたファイルをインストール
以上

参考先
[1] : https://www.takosuke.net/windows10%E3%81%A7virtualbox%E4%B8%8A%E3%81%AE%E4%BB%AE%E6%83%B3%E3%83%9E%E3%82%B7%E3%83%B3%E3%81%8C%E5%8B%95%E3%81%8B%E3%81%AA%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%97%E3%81%BE%E3%81%A3%E3%81%9F/

[2] : https://alginplus.blogspot.com/2011/05/implementation-of-usb-20-controller-not.html
IPアドレスを調べる方法のまとめ

RaspberryPiにsshなどで他のPCから接続する場合にIPアドレスが必要だ。しかし、DHCPを利用している場合にはIPアドレスが起動する度に変わってしまう。この記事ではraspberry piでipアドレスを取得する方法をいくつか紹介する。RaspberryPiをインストールするとき、MACアドレスを調べてメモしておくと役に立つ。

#方法0 ディスプレイやキーボードがある場合

```ip a```コマンドを実行する。

#方法1 raspberrypi.local

mDNSを使って解決する。Windowsの場合はiTunesをLinuxの場合はavahiをインストールすればmDNSが使える。raspberrypi.localにpingしてみてIPアドレスを確認できれば、mDNSが使用できている。この方法は複数のRaspberryPiを識別することができない。

#方法2 MACアドレス

arpコマンドを使用すると、ipアドレスとMACアドレスの対応であるarpテーブル参照することができる。これを利用しIPアドレスを調べる方法もある。RaspberryPiの有線ポートのMACアドレスは次の形式になっている。

```
B8:27:EB:XX:XX:XX (XXは任意の16進数)
```

このMACアドレスはアメリカ合衆国Raspberry Pi Foundationが取得したもので、同団体の製品であることを示している。このMACアドレスとIPアドレスの関係を調べることで、RaspberryPiのIPアドレスを特定できる。


##Linux
Linuxでは、下のスクリプトでIPアドレスを調べることができる。192.168.0.0/24の場合、192.168.0.1-192.168.0.254にpingする。ping -b 192.168.0.255でも動作しそうなものだが、標準設定では、ブロードキャストに応答しないようだ。なお、192.168.0.0/24の場合、192.168.0.0はネットワークアドレス、192.168.0.255はブロードキャストアドレスになるので通常使用できない。

```bash:scan.sh
#/bin/bash
echo "scan start"
for i in {1..254} ; do
  (ping   -c 1 192.168.0.$i >/dev/null &)
done
sleep 2
arp -na | grep "at b8:27:eb" --color=auto
```

実行例

```
user@ubuntu:~$ sudo arp -d 192.168.0.107
user@ubuntu:~$ . scan.sh
scan start
? (192.168.0.107) at b8:27:eb:xx:xx:xx [ether] on enp1s0
```
RaspberryPiのIPアドレスが192.168.0.107であることがわかる。


##Windows
windowsでは、次のコマンドプロンプトより下コマンドを実行すると、
arpテーブルが出力されるのでb8-27-eb:を探す。

```
for /l %i in (1,1,254) do @start /b ping  -n1 192.168.0.%i > nul
arp -a
```

実行例

```
c:\Windows\system32>for /l %i in (1,1,254) do @start /b ping -n1 192.168.0.%i > nul

c:\Windows\system32>
c:\Windows\system32>arp -a

インターフェイス: 192.168.0.100 --- 0xb
 インターネット アドレス      物理アドレス      種類
 192.168.0.107         b8-27-eb-xx-xx-xx     動的
```

#まとめ
方法0が使えない場合、raspberrypi.localが使えるのであれば、方法1で確認するのが早い。無理なら方法2を使おう。rapsbianがブロードキャストに応答しない点に注意する。
Create React App で test coverage が出力されない時の対処

# はじめに

Create React Appで作成したプロジェクトの test coverage がうまく表示されない際の対処法についてメモ。

対象となるバージョンは `react-scripts@3.0.0` で、[公式ドキュメント](https://create-react-app.dev/docs/running-tests)に記載されているコマンド `npm test -- --coverage` を利用し、test covarageを表示しようとしたところ出力された結果が以下のような空の状態になってしまい、うまく出力されませんでした。

```
----------|----------|----------|----------|----------|-------------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files |        0 |        0 |        0 |        0 |                   |
----------|----------|----------|----------|----------|-------------------|
```

こちらの [github の issue](https://github.com/facebook/create-react-app/issues/6888) がドンピシャで解決してくれたので、その方法についてシェアします。

# 対処方法

以下のコマンドで対処可能です。

```
npm test -- --coverage --watchAll=false
```
yarnの場合は同様に以下のようになります。

```
yarn test --coverage --watchAll=false
```

オプションで `--watchAll=false` を追加し、 watch モードを取り除いてあげると正しく test coverage が表示されます。

`react-scripts test`はデフォルトで watch モードで Jest を実行するので、watch モードを取り除くためには `--watchAll=false`を明示的に指定する必要があります。

# 参考
[Create React App ドキュメント](https://create-react-app.dev/docs/running-tests)
[github issue (test coverage is empty - v3.0.0 #6888)](https://github.com/facebook/create-react-app/issues/6888)
オライリー本を立ち読みしたくなってScrapyで取扱店を探した記録

## プロローグ

最近、久しぶりに「プログラミングをがんばってみよう欲」が高まってきた。
形から入るタイプの僕は、オライリーの技術書が欲しくなった。

「よし、まずは立ち読みだ！」

オライリー本の取扱店を探してみる。
居住地[^1]にある本屋にないことはわかっている。
素直に池袋のジュンク堂書店に行くべきではあるが、いかんせん、暑い。

少しでも近くにないものか？

そんな疑問を解決するためにScrapyを触ってみたお話。

ちなみに、python触るのは4年ぶりくらいで文法もあやふやですが、10分そこそこで動きました。めちゃ簡単。

[^1]: 東京都東久留米市(2019/8/10にアド街で紹介されました！)

## 成果物

[オライリー本が買える書店リスト(β)](https://drive.google.com/open?id=1t-iHAEgojWvcjwG0ZmsoWLVzkVBln_w3&usp=sharing)
![2019-08-14 19.09.05 www.google.com bc9da4d758d3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82307/6df2fc6e-6ba4-cabd-c806-4b7a9dee7dff.png)

## やったこと

### 手順１．pythonのインストール(3.7.4)

インストーラ叩いてインストール

### 手順２．Scrapyのインストール

PowerShellでコマンド実行

```
pip install scrapy
```

### 手順３．Scrapyのプロジェクト作成

PowerShellでコマンド実行

```
scrapy startproject GetOreilly
````

### 手順４．Scrapyのスパイダー作成

PowerShellでコマンド実行

```
cd GetOreilly
scrapy genspider bookstore www.ohmsha.co.jp
```

### 手順５．itemクラスの実装

実質6行

```python:items.py
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class GetoreillyItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    書店名称 = scrapy.Field()
    郵便番号 = scrapy.Field()
    住所 = scrapy.Field()
    電話番号 = scrapy.Field()
    url = scrapy.Field()
    都道府県 = scrapy.Field()
```

### 手順６．spiderクラスの実装

実質22行

```python:bookstore.py
# -*- coding: utf-8 -*-
import scrapy
from GetOreilly.items import GetoreillyItem
import re

class BookstoreSpider(scrapy.Spider):
    name = 'bookstore'
    allowed_domains = ['www.ohmsha.co.jp']
    start_urls = ['https://www.ohmsha.co.jp/bookstore/?catid=70&cmid=748#dnn_ctr748_ModuleContent']

    def parse(self, response):
        prefectures_pattern = '(東京都|北海道|(?:京都|大阪)府|.{2,3}県)*'
        for bookstore in response.css('.ViewProductList .storeBox'):
            yield GetoreillyItem(
                書店名称 = bookstore.css('H3::text').get(),
                郵便番号 = bookstore.css('.firstLine .post::text').get(),
                住所 = bookstore.css('.firstLine .address::text').get(),
                電話番号 = bookstore.css('.secondLine .tel .spTel::text').get(),
                url = bookstore.css('.secondLine .shopMapBtn span a.externalLink::attr(href)').get(),
                都道府県 = re.match(prefectures_pattern, bookstore.css('.firstLine .address::text').get()).group(),
                )
        next_link = response.css('#dnn_ctr747_ModuleContent div ul li.Next a::attr(href)').get()
        if next_link is None:
            print("END OF LIST")
            return
        yield scrapy.Request(next_link, callback=self.parse)
```

### 手順７．実行

PowerShellでコマンド実行

```
scrapy crawl bookstore -o shoplist.csv
```

### 手順８．GoogleMapのマイマップにCSVをインポート

ブラウザでshoplist.csvをインポート

## 感想

たった10分そこそこで、アウトプットがちゃんと作れるってすごい！！
**実装行数28行、8つの手順**で公開までできちゃうのは感動しました。
ていうか、もっと凝ったサービス作れそうなので、引き続き、研究してみる予定。

## オチ

我が家から最も近い取扱店は、「くまざわ書店武蔵小金井店」らしいのですが、
サクッとプログラムできた喜びで祝杯をあげ、昼寝して、結局、行ってません（おい）
docker-composeでserverless-golang

# 概要
serverless frameworkをgolangで使って見ようと思いました。一旦、サンプルのdeployまで。

# 環境構築＆deploy

docker-compose.yml

```yaml
version: '3'                                                                                                                                                  
services:
  sls:
    build: .
    volumes:
      - ./:/app
    working_dir: /app
  builder:  # 面倒だったので、ビルドは別サービス
    build:
      context: .
      dockerfile: Dockerfile.builder
    volumes:
      - ./:/go/src/app
    working_dir: /go/src/app                                                        
```

Dockerfile

```dockerfile
FROM node
# この間にDockerのインストール(https://docs.docker.com/install/linux/docker-ce/debian/)
RUN npm install serverless -g
```

Dockerfile.builder

```dockerfile
FROM golang                                                                                                                                                   
RUN apt-get update && apt-get install go-dep
```

```bash
$ docker-compose build
# プロジェクト作成。2つ関数が元から入ってます（hello,world）
$ docker-compose run --rm sls sls create -t aws-go-dep
# ビルド。プロジェクト作成時にMakefileが作られているのでそれを使います。
$ docker-compose run --rm builder make build
# デプロイ
$ docker-compose run --rm sls sls deploy
```

# ローカル実行
これが実は厄介で、golangを使った場合docker経由での実行しかサポートしていないっぽいのです（[参考](https://github.com/serverless/serverless/issues/4746)）。。。

docker-compose.ymlに変更を加えると実行はできました。

```yaml
version: '3'                                                                                                                                                  
services:
  sls:
    build: .
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock # hostのdockerを使う。
      - ./:/path/to/host/directory # hostのdockerを使うので、pathを合わせておかないとvolumeのマウントでおかしなことになる。
    working_dir: /app
  builder:
    build:
      context: .
      dockerfile: Dockerfile.builder
    volumes:
      - ./:/go/src/app
    working_dir: /go/src/app
```

`/path/to/host/directory`の部分が環境ごとに変わってしまうのが辛い。。。
何かいい方法ないんでしょうかね。。
デモクリトスとACID特性

# デモクリトスとACID特性
データベースを語る上で重要な概念として、ACIDがあります。
原子性(Atomicity)、一貫性(Consistency)、独立性(Isolation)、永続性(Durability)の4つです。
それぞれの細かい内容については立派な解説記事がいくらでもあるので置いておくとして、
今回注目したいのは原子性(Atomicity)です。

いわゆるトランザクション管理で実現されるもので、
一連の処理が``全て実行される``か``全く実行されない``かのいずれかで、
中途半端に一部だけ実行されないという特性です。

ただ、この原子性ですが名前がよく分かりません。
一般に原子と聞くと、水素原子とか酸素原子とか化学的な概念が思い浮かぶかと思います。
何で物質を構成する要素の性質が処理の不可分性と結びつくのでしょうか。

## そもそも原子(Atom)とはどういう言葉なのか？
実は、``atom``という単語は現在我々が「原子」と呼んでいるものが発見された際に名付けられたものではありません。
古代ギリシャの哲学者レウキッポスやデモクリトスが唱えた原子論に端を発するものです。
この原子論と言うのは、乱暴に言ってしまえば「どんな物質でも分解して行ったらいつか分解できない最小単位にたどり着くはず。」という理論です。
当然古代ギリシャには実際にそれを観察するための器材は存在しなかったので思考実験に過ぎなかったわけですが、とにかくその限界まで分解していった結果を「atom」と呼ぼうということにしたわけです。

この理論はその後ほとんど忘れ去られてせいぜいイスラーム圏にちょっと伝わるくらいになっていたわけですが、
近代科学が発達することで、どうやらそれっぽい極小の単位(今日我々が原子と呼んでいるもの)が存在することが明らかになりました。
これはいわゆる「原子」なんじゃないか？ということになりまして、「不可分なもの」という意味だったatomはこれの名前になりました。
が、その「原子」の存在が科学的に証明されたほぼ同時期に既に人類はより小さい単位である「電子」を発見してしまっていました。
「原子」と名付けられたこの構成単位はすぐに元々の意味とは乖離してしまったのです。
そして、こちらの使い方の方が有名になってしまったので、元々の意味はどんどん薄れていきました。
まして、近代科学と西洋哲学が同時に入ってきた日本においては、Atomについて後者のイメージを持つ人はほぼいないのではないかと思います。

## ACIDのAは化学的なAではなくデモクリトス的なA
さて、ここで翻ってACID特性のAですが、「原子」を「不可分な最小単位」という語源通りに捉えれば、実にすっきりします。
トランザクションはそれ以上に分割されえないということです。

## まとめ
* 原子性の「原子」は化学的概念ではなくギリシア哲学の「原子」
* 元々の「原子」は「分割できない最小単位」
Visual Studio Code おすすめ設定！

# Visual Studio Code 設定まとめ
バージョンアップをして、設定を再考したので一旦まとめる。
2021.2.20 情報送信を停止する設定項目を追加

## 前提
- バージョン：1.37.0 以上
- 設定は初期値からの変更点

## 日本語化
バージョン1.25.0から、日本語化にはEXTENSIONSのランゲージパックが必要。
インストールして、再起動する。
`ms-ceintl.vscode-language-pack-ja`

## 表示・操作関連の設定
- フォントサイズを変更
`"editor.fontSize": 14`

- 保存時に最終行以降の空白行を削除
`"files.trimFinalNewlines": true`

- 保存時に最終行の空白を削除
`"files.trimTrailingWhitespace": true`

- ミニマップを非表示にする
`"editor.minimap.enabled": false`

- ターミナルのスクロールバッファを増やす
`"terminal.integrated.scrollback": 10000`

- 貼り付け時自動フォーマット
`"editor.formatOnPaste": true`

- 保存時自動フォーマット
`"editor.formatOnSave": true`

- 入力時自動フォーマット
`"editor.formatOnType": true`

- エクスプローラーでファイルを選択したときに、新しいタブで開く
`"workbench.editor.enablePreview": false`

- 起動時に何も表示しない
`"workbench.startupEditor": "none"`

## レポート送信系を停止する設定
会社で使う場合は、予期しない情報公開を避けるため、設定したほうがいいと思う。

- クラッシュレポートを送信しない
`"telemetry.enableCrashReporter": false`

- 利用状況データを送信しない
`"telemetry.enableTelemetry": false`

## EXTENSIONS
ファイルアイコンやフォーマッターも準備されて、必要なEXTENSIONSは少ない。

- Git Lens
Gitの履歴や差分を見るのが超便利になる。
`eamodio.gitlens`

- Visual Studio IntelliCode
Microsoft製のIntelliCode。
`visualstudioexptteam.vscodeintellicode`

## 設定の初期化方法
アンインストール後、下記のフォルダを削除する。
`%APPDATA%\Code`
`%USERPROFILE%\.vscode`
mvn deployで認証エラー(Unauthorized)を解消する ~ デプロイ例と共に

# はじめに
ローカルのサードパーティライブラリーを、自分で構築したNexusにdeployしたときに認証エラーにひっかかったので、参考になればとデプロイの過程を説明しながら記載しておきます。

# SpringFrameworkのライブラリをデプロイする例

例えば、SpringFrameworkを利用していて、以下のSpringFrameworkのjarを自分のNexusにDeployしたいケースです。

```xml
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-web</artifactId>
  <version>5.1.9.RELEASE</version>
</dependency>
```

## アップロード先のnexusリポジトリを確認
今回、例示用のNexusはdockerを利用してローカルに構築しました（使い捨てって便利）。
https://hub.docker.com/r/sonatype/nexus/

サードパーティーのライブラリなので、**thirdparty**のリポジトリに上げることにします。
![Selection_918.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81962/b4e069f1-ca64-3129-265d-4503e32f6a02.png)

## ローカルにjarを用意
spring-web-5.1.9.RELEASE.jarをローカルに用意します。
好きな場所からダウンロードしてきましょう。
今回はこちらからダウンロードしました。
https://search.maven.org/artifact/org.springframework/spring-web/5.1.9.RELEASE/jar

## settings.xmlを用意
Nexusをmvnコマンドで操作するためには認証が必要です。でないと誰でもアップロードしたり、削除したりできてしまいすから。
そのために以下のようなsettings.xmlファイルを用意します。場所はホームディレクトリ配下にある.m2ディレクトリ以下です（任意の場所に置いたとしてもmvn実行時に指定できます）。

このserversのところで認証情報を指定します。idはNexusのリポジトリIDです。今回は**thirdparty**というIDのリポジトリにアップロードするので、idを合わせてあります（ここが一番ひっかかりました）。
usernameとpasswordですが、`deployment/deployment123`というのはNexusにデフォルトで用意されているデプロイ用のユーザーです。本運用する際には、パスワードの変更などをしておきましょう。

```xml:settings.xml
<?xml version="1.0" encoding="UTF-8"?>
<settings>
  <servers>
    <server>
     <id>thirdparty</id>
     <username>deployment</username>
     <password>deployment123</password>
    </server>
  </servers>
</settings>
```

この際にidが異なっていたり、アカウントが間違えていたりすると以下のように認証エラーが発生します。

```
Return code is: 401, ReasonPhrase: Unauthorized.
```

```bash:エラー文を改行して例示
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7:
deploy-file (default-cli) on project standalone-pom: Failed to deploy artifacts: 
Could not transfer artifact org.springframework:spring-web:jar:5.1.9.RELEASE 
from/to thirdparty (http://localhost:8081/nexus/content/repositories/thirdparty/): 
Failed to transfer file: http://localhost:8081/nexus/content/repositories/thirdparty/org/springframework/spring-web/5.1.9.RELEASE/spring-web-5.1.9.RELEASE.jar.
Return code is: 401, ReasonPhrase: Unauthorized. -> [Help 1]

```

## デプロイしてみる

mvnのバージョンは3.3.1を利用しています。

Deployの仕方の詳細は公式をご覧下さい。
https://maven.apache.org/plugins/maven-deploy-plugin/usage.html

```bash
mvn -s ~/.m2/settings.xml deploy:deploy-file \
  -DgroupId=org.springframework -DartifactId=spring-web \
  -Dversion=5.1.9.RELEASE -Dpackaging=jar 
  -Dfile=/path/to/spring-web-5.1.9.RELEASE.jar -DrepositoryId=thirdparty \
  -Durl=http://localhost:8081/nexus/content/repositories/thirdparty/
```

実行結果
![Selection_919.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81962/1a561037-0146-4035-534f-db8e21df1c8b.png)

![Selection_920.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81962/466f4622-f8ab-8a25-c02c-7036b966aa0f.png)

このようにNexusにデプロイすることができました。

# 最後に
権限を持っていればNexusの画面からも手動でアップロードは可能ですが、オペミスが発生することを考えるとオススメできません。
またsettings.xmlにパスワードの平文を記載したままでの本運用もオススメできないので、mavenが用意している暗号化も導入しましょう。
http://maven.apache.org/guides/mini/guide-encryption.html


以上
LeetCode / Valid Palindrome

（[ブログ記事](https://mhiro216.hatenablog.com/entry/2019/08/14/194139)からの転載）

終日頭が重い@mhiro216です。
気象病ってやつなんだろうか。全部台風のせいだ。

[https://www.d-yutaka.co.jp/blog/health_and_beauty/health_info201906/:embed:cite]

さて、軽い問題で頭をほぐします。

[https://leetcode.com/problems/valid-palindrome/]

Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.

Note: For the purpose of this problem, we define empty string as valid palindrome.

Example 1:
Input: "A man, a plan, a canal: Panama"
Output: true

Example 2:
Input: "race a car"
Output: false

問題を解くことよりも英語を正確に理解する方が難しいくらいかも？

英数字のみを抜き出し、大文字小文字の違いを無視して、回文（始めから読んでも、終わりから読んでも同じ）になっているかを判定する問題です。

#### 解答・解説

##### 解法1
私のsubmitしたコード。
正規表現を使い慣れている人なら、とりあえずreライブラリを使うこの解法は思いつくかと。

```python
import re
class Solution:
    def isPalindrome(self, s: str) -> bool:
        new_s = re.sub(r'[^a-z0-9]', '', s.lower())
        return new_s == new_s[::-1]
```

##### 解法2
私は初めて知りましたが、isalnumという、英数字かどうかを判定する関数（戻り値はbool型）があるんですね。これを使うと以下の通りです。

```python
class Solution:
    def isPalindrome(self, s: str) -> bool:
        s = ''.join(e for e in s if e.isalnum()).lower()
        return s==s[::-1]
```

ちなみに文字列を同様に判定する関数には、以下３種類があるようです。ご参考まで。

- isdecimal　：　数字かどうか
- isalpha　　：　英字かどうか
- isalnum　　：　英数字かどうか
Ansibleもくもく会 （サーバ編 & NW編）8月度　参加感想

#概要
8月度のAnsibleもくもく会にブログ枠で参加したので感想をQiita記事で書いていきます。


##もくもく会の内容
Githubに上がっている課題をサーバ、NW編で分かれて実施します。
AWSに環境が用意されているのでそこに対してコマンド実行して試していきます。

私はサーバ編で参加しました。参加は2回目で前回もサーバ編でしたが、バージョンアップされたらしいので始めからまた課題を実施してました。

Githubに上がった手順がアップデートされたらしく、NW編は英語版しかまだ無かったみたいです。サーバ編は日本語が間に合ったみたいですが、所々間違えてるところがあってスムーズには出来ない箇所がありました。ただ、前回は特にそういったケースは無かったので、次回以降は修正されてるんじゃないかなと思います。

もしわからないところがあったらメンターに質問しに行ったり、質問コーナーで質問書き込めばリアルタイムで回答が来るので、声かけるのが躊躇われる人にも優しい感じになってます。

##感想
私は現場でAnsibleを急に使うことになって何となくでAnsibleは使っていたので解説見てると色々気づきがあって良かったです。
人気のもくもく会ですがブログ枠は前回、今回と応募した人がいなかったみたいなので、抽選に外れて参加出来たことが無い人は、ブログ枠も検討してはいかがでしょうか。

私はNW編もやってみたいのでまた参加しようと思います。流石にブログ枠連続で応募はまずいと思うので一般枠で当たることを祈って参加しようと思います。
Xcode11でのPush通知用トークン取得方法

Objective-Cのアプリをデバッグしていて気づいたのですが、Xcode10まではPush通知用のdevice tokenをこう書いていました。が、これだとうまく動かなくて、

```
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{	
  NSString *tokenString = [[[[deviceToken description] 
    stringByReplacingOccurrencesOfString:@"<"withString:@""] 
    stringByReplacingOccurrencesOfString:@">" withString:@""] 
    stringByReplacingOccurrencesOfString: @" " withString: @""];

    ・・・

```

developer forum覗いたところ、descriptionではもうダメで

```
  const unsigned *tokenBytes = [deviceToken bytes];
  NSString *tokenString = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x",
    ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]),
    ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]),
    ntohl(tokenBytes[6]), ntohl(tokenBytes[7])];

    ・・・

```

こうするそうです。
もしもっといけてる方法があれば教えてください。
マークアップエンジニアがフロンエンドエンジニアになるために、学ぶべきこと・活かせること

静的なWebサイトを作るマークアップから、動的なWebアプリを作るフロントエンドに仕事が変わって、今までのスキルでは足りなかったところや、逆に使えた部分等をまとめてみました。

マークアップからフロンエンドの領域へ来られる方の参考になれば幸いです。

## マークアップエンジニア時代に身に着けたこと

ざっくりと、マークアップエンジニア時代に、身に着けたことをリストアップします。

- セマンティックなHTMLのマークアップ
 - Pug、EJSよる効率的な開発
- WAI-ARIAによるアクセシビリティ対応
- デザインカンプになるべく近づけていくCSSの表現力
  - SCSSによる効率的な開発
- アニメーションや動的な部分をJavaScriptで実装
  - ECMAScript2015+をbabelでトランスパイル
- Gitによるバージョン管理
- Gulpやwebpackでのタスク管理

細かいところは、以下を御覧ください。

[マークアップエンジニアに必要な技術](https://qiita.com/otsukayuhi/items/8630994796c5823ea782)

## 学ぶ必要があったこと

- React（Next.js）
- TypeScript
- Atomic Design
- 3階層システム

### React

現場によっては他のフレームワークかもしれませんが、私がアサインされたプロジェクトではReactを採用していました。`JSX`や`Props`、`Hooks`あたりを押さえると、とりあえずですがReactが触れるようになるかと思います。

今でも、公式ドキュメントをとにかくずっと開いています。

- [React Getting Started](https://ja.reactjs.org/docs/getting-started.html)
- [フック早わかり](https://ja.reactjs.org/docs/hooks-overview.html)

Next.jsはチュートリアルを、ひととおりやりました。

[Next.js Getting Started](https://nextjs.org/learn/basics/getting-started)

### TypeScript

たとえば、`Props`に`interface`で型をつければ、以下のようなコンポーネントで受け取る値を間違えづらくなります。

```jsx
import React from 'react'

interface FooProps {
  text: string;
}

const Foo: React.FC<FooProps> = ({ text }) => <p>{text}</p>

export default Foo
```

上記ように書けば、Fooコンポーネントの`text`プロップスは文字列以外を受け取ることができなくなります。

基本的な型の書き方や、React.FC<FooProps>あたりが意味するところはこちらで学びました。

[実践TypeScript ~ BFFとNext.js&Nuxt.jsの型定義 ~](https://amzn.to/2YOUK9F)

こちらも、macOS用のKindleで基本開きっぱなしです。

### Atomic Design

静的なWebサイトでは、ページのデザインカンプから共通部分を見出してコンポーネントを作ることが多いと思いますが、私がアサインされたWebアプリケーションのプロジェクトでは、Atomic Design的なアプローチでパーツから作っていき、その組み合わせでページを作っていきました。

Atomic Designでは`Atoms`、`Molecules`、`Organisms`、`Templates`、`Pages`とどんどんスケールが大きくなっていきます。たとえば、最小の`Atoms`の段階で`div`のような[フローコンテンツ](https://developer.mozilla.org/ja/docs/Web/Guide/HTML/Content_categories#Flow_content)の要素を使ってしまうと、それより上位のレイヤーでHTML的にNGなマークアップになってしまうことがあります。

```html
<!-- button要素の中にdivを入れてはいけない -->
<!-- Molecules -->
<button>
  <!-- Atoms -->
  <div>テキスト</div>
</button>
```

このような場合は、`Atoms`のような最小単位のコンポーネントでは、[記述コンテンツ](https://developer.mozilla.org/ja/docs/Web/Guide/HTML/Content_categories#Phrasing_content)をメインにマークアップをしたほうが、後々楽になるでしょう。

ページとして組まれるときに、セマンティックなマークアップになるよう、意識して作っていくことが大切です。

ReactでAtomic Designとなると、こちらの書籍が役に立ちました。

[Atomic Design ~堅牢で使いやすいUIを効率良く設計する](https://amzn.to/2Z0Fdis)

### 3階層システム

静的なWebサイト制作ではあまり気にすることがなかった、[3階層システム](http://e-words.jp/w/3%E9%9A%8E%E5%B1%A4%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0.html)への理解にとても苦労しました（していますｗ）。

今までごっちゃになんとなく書いていましたが、`見た目（View）とビジネスロジックを分ける`という考え方を身につける必要がありました。

（そもそも、ビジネスロジックってなに？レベルからのスタートだったので苦労しました。。。）

## 経験を活かせたこと

- セマンティックなHTMLのマークアップ
- WAI-ARIAによるアクセシビリティ対応
- デザインカンプになるべく近づけていくCSSの表現力
  - SCSSによる効率的な開発

ほぼすべての経験が活きていますが、これらがとくに自分の強みとして前に出せた部分でした。プログラマー側の方は苦手な人が多いようです。

[Emotion](https://emotion.sh/docs/introduction)という、CSS in JSのライブラリを使っています。SCSSの記法も使えたりするので、そこまで苦労せずに使えました。

逆に、SCSSの`@function`を使わずにJavaScriptで書けますし、スタイルがスコープされるので正直SCSSより書きやすいです。BEMみたいな命名規則を使うこともなくなりました。

まあ、定数や変数の名前を考えないといけないので、命名規則の悩みは終わりませんが。

<hr>

これ以外にも、学ばなければいけないことがたくさんあります。

一緒に頑張りましょう！！

以上でございます。
uruでRubyを切り替えできるようにする

使い方から何もわからなかったのでとりあえずメモ。
困った人の役に立ったらいいな。

環境：Windows10

## Rubyのインストール
RubyInstallerからRubyをインストールしました。

⇒[RubyInstaller](https://rubyinstaller.org/)

RubyInstallerをダウンロードしたら実行してRubyをインストールする。
**Pathは通さない。**

## uruのインストール
### uru_rtをダウンロード
⇒[uru](https://bitbucket.org/jonforums/uru/wiki/Downloads)

7zipされてるから解凍。

### ダウンロードしたファイルを配置
解凍したら中のexeファイルをC直下に作ったフォルダに入れます。

私はC:\ruby_uru\uruという感じに置きました。
そしたらここにPathを通します。

ついでにRubyもC:\ruby_uru\Ruby26-64という感じで置きました。これが良いか悪いかは知らない。

### uruをインストール
cdでuruのあるところに移動後、以下のコマンドを実行します。

```
uru_rt admin install
```

これでuru.batやらが出来ていることを確認。

## uruの設定
### uruにRubyの登録
以下コマンドを実行します。

```
uru admin add C:\ruby_uru\Ruby26-x64\bin --tag Ruby26
```

オプションのtagは切り替えるときに使う名前らしいです。

登録できたか確認するには、以下コマンド

```
uru ls
```

登録したRubyが出てくればOK

### Rubyの切り替えコマンド
Rubyのバージョンを切り替えるときは以下コマンド

```
uru Ruby26
```

ここでさっきのtagが使える

これで指定したRubyが動かせるようになるはず。
yarn とは何か

JS初心者の備忘録

一言でいうと　**npmにかわるパッケージマネージャ**

そもそも　パッケージマネージャ,
ライブラリの追加やインストールを容易にしてくれるやつ
そもそも　npmとは、Node.jsのパッケージマネージャ
正式名称　Node package Manager => npm
npmは、Node.jsをインストールすることで自動的にインストールされている。

主なコマンド
インストール

```
npm install <package name> / npm i <package name>
```
インストールされているパッケージの確認

```
npm list -g
```

※-gをつけることで、PC内のすべてのパッケージを表示をします。-gがない場合、現在いるディレクトリ内にインストールされているぱっけーじを表示する。



####Yarn
一言でいうと、

”npmを**パワーアップ**したやつ”


下記　公式ページ[https://yarnpkg.com/lang/ja/]から部分引用

インストール済み=>インターネット接続なしで再インストールできる
同じ依存関係ももっていれば、インストール中所に関係などのマシンでもインストールが行われる
ネットワーク :: yarnは、効率的にリクエストをキューを追加している=>パフォーマンス。継続性もあり１つのリクエストが失敗してもインストール全体が失敗したことにはならない。

まとめると

npmよりも断然インスコ速度があり使い勝手も良い。
使わない**デメリットがない**

下記からインスコ可能
https://yarnpkg.com/lang/en/docs/install/#windows-stable

コマンドや挙動　npmと似ている。

下記からインスコ可能
https://yarnpkg.com/lang/en/docs/install/#windows-stable

####コマンド例

```
npm init
```

```
yarn init
```

```
npm install [package]
```

```
yarn add [package]
```
chartjs tooltipのラベルをカスタマイズ

# 背景
- datasetsには数値があるけど、tooltipには '%'をつけたい

# 方法
- optionsのtooltipに以下を設定

```javascript
tooltips: {
  mode: "label",
  callbacks: {
    label: function(tooltipItem, data) {
      return data.datasets[tooltipItem.datasetIndex].label + ': ' + Math.round(tooltipItem.xLabel) + '%'
    }
  }
}
```

# 参考
https://kotaeta.com/60501920
https://tr.you84815.space/chartjs/configuration/tooltip.html
https://tr.you84815.space/chartjs/configuration/tooltip.html#tooltip-callbacks
マルチキャスト通信できない原因はrp_filterの設定方法でした。最大を取るなんて

ルータ越しの通信において、受信プログラム（アプリ層）がマルチキャスト・パケットを受信できない問題に遭遇しました。当初からReverse Path Filter（以降、RPFと言う）が怪しいことは当たりをつけていたのですが、なんかしっくりこない現象の説明ができず悶々としていたのですが、先程ようやく解決しました。

# 問題

`C7_1`から配布されたマルチキャスト・パケットが`C7_2`で受けられません。`C7_2`のLANポートには届いている（tcpdump及びWireSharkで確認）。

`net.ipv4.conf.eth2.rp_filter = 0`とRPFを無効（パケット・フィルタリングを無効）にしたつもりでも受けられません。

`net.ipv4.conf.all.rp_filter = 0`とした場合でも同様に受けられません。

ちなみに、`net.ipv4.conf.eth2.rp_filter = 2`だと受けられます。

# 環境

 * GNS3 2.1.21
 * ホストOS: Ubuntu 18.04
 * ゲストOS： CentOS 7.4 1708(図中のC7_1とC7_2)

## ネットワーク・トポロジ

![ss_20190814_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72237/778bc02c-572b-3847-ab24-1a2a14eb80e2.png)

 * 両端末にファイアウォールは設定していない
 * 両端末（C7_1とC7_2）の間にルーティングは無し（pingは通らない）
 * ルータ（R1とR2）ではip pim dense-mode

# 解決

[piyolianさんのウェブページ](http://piyolian.blogspot.com/2012/09/rhel6-multi-nic-in-same-subnet.html)にヒント（というか答え）がありました。

`net.ipv4.conf.eth2.rp_filter`と`net.ipv4.conf.all.rp_filter`は、両者の **最大値** を取るようです。つまり、どちらか一方をゼロにしても、CentOS 7の初期値は1なので1、つまり厳格モードとなって受信できなかったようです。

蛇足ですが、[piyolianさんのウェブページ](http://piyolian.blogspot.com/2012/09/rhel6-multi-nic-in-same-subnet.html)によると、CentOS 6時代はAND（論理積）だったそうです。

# おまけ

両端末（C7_1とC7_2）の間がルーティングされている（pingされている場合）は、`net.ipv4.conf.*.rp_filter`を設定（変更）しなくても受信できます。

# 参考

 * [piyolian - RHEL6: multi NIC in the same subnet](http://piyolian.blogspot.com/2012/09/rhel6-multi-nic-in-same-subnet.html)
コピペで使うFirebase【CircleCI編】


## 概要
firebaseを使用する際に、コピペで動かしたいと思い設定手順を投稿しようと思いました。
前回：[Firebase【テスト編】](https://qiita.com/ovama-koffee/items/f6569bb45ab51e40c39e)

[CircleCI / アカウント登録](https://circleci.com/signup/)

## CircleCIの設定
### 環境変数の登録
Firebaseトークンを取得

```bash
firebase login:ci
...
✔  Success! Use this token to login on a CI server:

xxxxxxxxxxxxxxxxxxxxx

Example: firebase deploy --token "$FIREBASE_TOKEN"
```

CircleCI > JOBS > 該当プロジェクトの設定（歯車アイコン） > Enviroment Variables > Add Variable
へ取得したトークンを登録する。

### 設定ファイルを作成
```bash
$ mkdir .circleci
$ cd .circleci
$ touch config.yml
```


```.circleci/config.yml
version: 2
jobs:
  build:
    docker:
      - image: circleci/openjdk:11-jdk-sid-node
    # 対象のブランチはmasterのみ
    branches:
      only:
        - master

    working_directory: ~/repo

    steps:
      # ソースコードのチェックアウト
      - checkout
      # キャッシュのリストア処理。
      - restore_cache:
          keys:
            - v1-dependencies-{{ checksum "functions/package.json" }}
            - v1-dependencies-
      # ルートのパッケージをインストール
      - run:
          name: package install
          command: npm install
      # rulesのテストに使用するエミュレーターのセットアップ
      - run:
          name: emulators install
          command: ./node_modules/.bin/firebase setup:emulators:firestore
      # functionsのパッケージのインストール
      - run:
          name: functions package install
          command: cd functions/ && npm install
      # キャッシュの保存処理。
      - save_cache:
          paths:
            - node_modules
            - functions/node_modules
          key: v1-dependencies-{{ checksum "functions/package.json" }}
      # functions内にfirebase-toolsのインストール
      - run:
          name: firebase-tools install
          command: cd functions/ && npm install -D firebase-tools
      # functions内のテストの実行
      - run:
          name: run test
          command: cd functions/ && npm run test
      #　デプロイの実行
      - run:
          name: deploy to Firebase Hosting
          command: ./node_modules/.bin/firebase --project default deploy --token=$FIREBASE_TOKEN
```

## 備考
```bash
$ npm run test
# functions/package.json内の "test": "npm run serve-firestore & jest"
```
このコマンド実行時にテストがよく失敗していた。
以下を追加・修正することでテストが成功するようになった。
※原因は不明

```diff:functions/package.json
  "scripts": {
   ...
-    "test": "npm run serve-firestore & jest"
+    "jest": "jest",
+    "test": "npm run serve-firestore & npm run jest"
  },
```


## 最後に
以上でGIthubにプッシュ後にCircleCIでテスト→デプロイまでできるようになりました。

ルートのpackage.jsonとfunctions/package.jsonをまとめればもっと簡単になりますが、
本記事ではできるだけ自動生成されたディレクトリー構造のままでやっています。
WindowsでDorcker環境をVirtualBoxを使って簡単に構築する

# WindowsでDorcker環境をVirtualBoxを使って簡単に構築する

Dockerが公開しているDocker Desktopの場合、Hyper-Vを使用しないとDocker環境をつくれません。
自分の場合、それでは不都合があるのでVirtualBoxを使用して構築していきます。

## やりたいこと

* 使うツール(テキストエディタ、Officeなど)は、基本的にWindows上で動作させたい。
* 開発するアプリケーションは、Linux上で動作させるので実行はLinux上で行いたい。
* アプリケーションは、Dockerコンテナで動作させたい。

## 前提条件

1. ホストOS(Windows)
2. VirtualBoxを予めインストールする
2. Vagrantを予めインストールしておく
3. Vagrantプラグインをインストールしておく
   * vagrant-vbguest

## 環境構築

1. Ansibleを使って、Dockerホスト環境を作成する
2. アプリケーションのソースをDockerコンテナに共有する

## ディレクトリ構成

```Text
\DockerHost  Docker環境を作成するためのルートディレ鵜鳥
  \public
    \provision  AnsibleでDocker環境を作成するための設定ファイル群
      playbook.yml等
      :
  Vagrantfile  VagrantでVirtualBoxにLinux環境を作成する為のファイル
```

## Vagrantfileの設定の説明

### Ansible環境を作成する

Vagrantをprovisionオプションを付けて実行すると自動的にAnsibleの環境を準備します。

**server.vm.provision** に記載されている設定で、Ansibleをインストールし、Dockerの環境までを作成します。

### ホストOSのディレクトリを共有

Vagrantのsynced_folderにホストOSのディレクトリを指定することで、簡単にVirtualBox上のLinuxと共有できます。

**server.vm.synced_folder**にホストOSと共有するディレクトリをします。

以下の例の**server.vm.synced_folder**の3行は、3つのフォルダをvagrantのホームディレクトリのdevelopディレクトリに共有しているます。もちろんいくつ指定しても良いです。

"../app1"は、ホストOSのディレクトリを相対パス、絶対パスのいづれでも指定できます(これ重要)。

### Vagrantfileの例

```ruby:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|
    # docker-base
    config.vm.define "docker-base" do |server|
        server.vm.box = "ubuntu/bionic64"
        config.vm.network :public_network, :ip => "192.168.3.148", :netmask=>"255.255.255.0", :bridge => "Intel(R) 82583V Gigabit Network Connection"

        server.vm.synced_folder "./public", "/vagrant_public"
        # 開発アプリケーションのフォルダを共有する
        server.vm.synced_folder "../app1", "/home/vagrant/develop/app1"
        server.vm.synced_folder "c:/Users/hoge/develop//app2", "/home/vagrant/develop/app2"
        server.vm.hostname = "vm-docker"
        server.vm.provider "virtualbox" do |vb|
            vb.gui = false
            vb.memory = "2048"
            vb.name = "DockerBase"
        end
        # Andibleのインストール
        server.vm.provision "shell", inline: <<-SHELL
            sudo apt-get update
            sudo apt-get install -y software-properties-common
            sudo apt-add-repository ppa:ansible/ansible
            sudo apt-get update
            sudo apt-get install -y ansible
            cd /vagrant_public/provision/
            sudo ansible-playbook -i hosts playbook.yml --connection=local
        SHELL
    end
end
```

### Docker環境を作成と実行をする(通常一回だけ)

Vagrantfileファイルがあるディレクトリで以下のコマンド実行します。

**--provision**オプションを付けることで、server.vm.provisionで設定したコマンドが実行され、Docker環境が作成されます。

数分かかるのでエラーが出ていないか見ながら待ちましょう。

```bash
   vagrant up --provision
```

### Docker環境を実行する(通常)

```bash
   vagrant up
```

## Docker環境(Ansibleのplayabookの設定)構築
**--provision**オプションを付けて実行すると以下のことが行われます。

1. DokcerをインストールするOS(Ubuntu 18.04)の準備
   * OSの日本語化、タイムゾーンの設定
   * Vimのインストール
   * Gitのインストール
2. Dokcer環境のインストール


### Docker環境のパラメータ調整


### 変数説明

roles/docker/vars/main.yml

#### docker-composeのインストールバージョン

* /roles/docker/vars/main.yml
  * docker_compose_version=**1.24.0**

---
設定ファイルの公開
[dockerEnv](https://github.com/KoukiTakai/dockerEnv)
Cloud Composer の DAG ファイルの print デバッグ

BashOperator なら echo すれば良いし、PythonOperator なら普通に print して、 `test` 実行すれば良いが、DAG 自体はどう print デバッグするか。

```
raise Exception("foo")
```

のように例外を投げれば airflow の Web UI に例外メッセージがポップアップ表示されるので、それで print デバグできる。

もっとやりやすい方法があれば是非教えてください :bow:
Macスクリーンショットの備忘録

#0. はじめに
- Mac環境の勉強がてらスクリーンショットの方法を調べたので自分用の備忘録としてまとめました。

#1. 画面全体→ファイルに保存
- `Command` + `Shift` + `3`の同時押下。
- デフォルトでは`Desktop`に`.png`で保存される。

#2. 画面全体→クリップボードに保存
- `Command` + `Shift` + `3` + `Control`の同時押下。
- クリップボードに画面キャプチャーが保存される。

#3. 指定ウインドウ→ファイルに保存
- `Command` + `Shift` + `4`の同時押下(マウスカーソルが十字アイコンに)。 `Space`押下でカーソルがカメラアイコンに変わるので、キャプチャしたいウインドウをクリックする。
- デフォルトでは`Desktop`に`.png`で保存される。

#4. 指定ウインドウ→クリップボードに保存
- `Command` + `Shift` + `4` + `Control`の同時押下(マウスカーソルが十字アイコンに)。 `Space`押下でカーソルがカメラアイコンに変わるので、キャプチャしたいウインドウをクリックする。
- クリップボードに画面キャプチャーが保存される。

#5. 矩形選択→ファイルに保存
- `Command` + `Shift` + `4`の同時押下(マウスカーソルが十字アイコンに)。キャプチャしたい領域をドラック指定してクリックする。
- デフォルトでは`Desktop`に`.png`で保存される。

#6. 矩形選択→クリップボードに保存
- `Command` + `Shift` + `4` + `Control`の同時押下(マウスカーソルが十字アイコンに)。キャプチャしたい領域をドラック指定してクリックする。
- クリップボードに画面キャプチャーが保存される。

#7. 備忘録
##7-1. 保存場所の変更
- デフォルトでは`Desktop`に保存されますが、ターミナルから任意のディレクトリに変更可能です。

```sh:bash
# 保存先を~/Pictures/に変更
$ defaults write com.apple.screencapture location ~/Pictures/　
# サービス再起動で変更が反映
$ killall SystemUIServer
# デフォルトに戻す
$ defaults delete com.apple.screencapture location
```

##7-2. 保存形式の変更
- デフォルトでは`.png`で保存されますが、ターミナルから任意のファイル形式に変更可能です。

```sh:bash
# BMP
$ defaults write com.apple.screencapture type bmp
# GIF
$ defaults write com.apple.screencapture type gif
# JPEG
$ defaults write com.apple.screencapture type jpg
# PDF
$ defaults write com.apple.screencapture type pdf
# TIFF
$ defaults write com.apple.screencapture type tiff
# PNG(デフォルト)
$ defaults write com.apple.screencapture type png
# サービス再起動で変更が反映
$ killall SystemUIServer
```
ロジスティック回帰分析の式の導出動機について

$m$次元の入力データ$x=(x_1,x_2,・・・,x_m)$に対する線形回帰モデル$y=b^{T}x($成分ごとに書くと$y=b_{1}x_{1}+b_{2}x_{2}+・・・+b_{m}x_{m})$を応用したモデルとして、ロジスティック回帰モデルがあります。これはある事象が発生する確率を表現したモデルです。

ロジスティック回帰分析の実用例として、様々な因子$x$に対して病気になるかどうかの判定に使われています。この場合、$x$には例えばアルコール量、たばこの本数、血圧などがあり、これらの因子から分析して病気が発症するか否か判定するわけです。

#線形回帰の場合
$x_1～x_m$：データの説明変数でデータの特徴量をここに入力します。
$b_1～b_m$：モデルのパラメータです。最適な予測ができるように調整する部分です。
$y$：データの出力結果です。新たなデータ$x$を入力した時に予測される数値です。

※このときの$y$は入力の値$x_1～x_n$によって際限なく大きくなります。取りうる範囲は$(-\infty,\infty)$です。

#ロジスティック回帰分析のモデル構築
予測したいのは確率なので、先ほどの$y$のところを$p$と置くことにします。まず線形回帰分析のように$p=b^{T}x$とします。そうすると、この$p$は$(-\infty,\infty)$を取りうるので確率の表現として不適合です。そこで線形回帰分析の式を少し変形します。

◆オッズにする
$p$→$\frac{p}{1-p}$を$p$のオッズといいます。これは発生する確率が発生しない確率の何倍あるかを示しています。$\frac{p}{1-p}=b^{T}x$として$p$について解くと、$p=\frac{b^{T}x}{1+b^{T}x}$となります。
しかし、$p$の範囲は特異点$-1$を除いて$(-\infty,\infty)$となるので、これでもまだ不適合です。そこで更に対数をとってみます。
$p$→$\log(\frac{p}{1-p})$とします。これをロジット変換といいます。これで$p$について解くと、$$p=\frac{\exp(b^{T}x)}{1+\exp(b^{T}x)}$$となります。これで$p$の範囲が$(0,1)$に収まります。$p$は両端の$0$と$1$はとらないですが、どれくらいの確率かが知りたいわけで、その中で絶対起きる、絶対起きないという判断は必要ない（というよりトレーニングデータは全事象を網羅していないので判断するべきではない）ため、範囲はこれで適切です。

学習に使う教師データの出力は結果のみの情報なので、その裏にある確率は分かりません。つまり結果情報は発生したか（1を出力）、発生していないか（0を出力）の２値データであると仮定します。ただし、確率$p$があり、そのもとで起こったかどうかの結果です。
$$（学習時の入力データ）x→（出力）1　or　0$$$$最適な予測確率pが出力されるようにパラメータbを推定する$$$$※ただし出力は確率pのもとで起こっていると設定する$$
確率$p$のもとで$1$や$0$をとるものだとすると、パラメータ$p$のベルヌーイ分布による推定が適合します。確率変数$Y$をパラメータ$p$のベルヌーイ分布に従うとするときに分布は
$$f(y|p)=p^{y}(1-p)^{1-y}$$となります。Ｎ個のデータ$x_1,x_2,・・・x_N$があって、i番目のデータ$x_i=(x_{i1},x_{i2},・・・,x_{im})$に対する確率変数$Y_i$の反応を$p_i$とするとき、
$$f(y_i|p_i)=p_i^{y_i}(1-p_i)^{1-y_i}$$となります。データ群の予測結果$Y_1～Y_N$が独立として最尤法に当てはめれば尤度関数$L$は
$$L(p_1,・・・,p_N)=\prod_{i=1}^{N}p_i^{y_i}(1-p_i)^{1-y_i}$$とできます。ここで$p_i$はロジスティック回帰モデルに従うという前提で$$p_i=\frac{exp(b^{T}x_i)}{1+exp(b^{T}x_i)}$$となり上記の尤度の式に代入すると
$$L(b_1,・・・,b_N)=\prod_{i=1}^{N}\exp(y_ib^{T}x_i)\frac{1}{1+exp(b^{T}x_i)}$$となります。ここから最尤解$\hat{b}$が簡単に導ければいいのですが、$b=〇〇$のように方程式を解くことが難しい為、数値解析の手法で段々と最適解に近づくようにすることが一般的です。

ニュートン法などで$\hat{b}$を求めたら、新たなデータ$x^{'}$に対する確率を予測したいとき$x^{'}$を代入して$$\hat{p}=\frac{\exp(\hat{b}^{T}x^{'})}{1+\exp(\hat{b}^{T}x^{'})}$$として、$x$に対する推定の確率$p^{'}$を求めることができます。

#その他のこと
・最後の推定は、最尤法以外にも最小二乗法でも可能ですが、ロジスティック回帰では最尤法で解くことが主流のようです。
・$x$の部分には非線形関数を$f(x)$として、$b^{T}f(x)$でモデルを作ることも可能で、その時は尤度関数も$x$のところに$f(x)$が入り、数値解析で解くことができます。


参考・引用
・多変量解析入門――線形から非線形へ（小西 貞則）
他のIAMで作られたEKSクラスターに EC2 のロールをアタッチしてkubectlできるようにする

EKS はデフォルトで作成したときの IAM 情報と紐付いて作成されます。
自分の環境では AWSではロールを使って運用しており、1時間でセッションが切れるようになっています。
そのため、ローカルから(`kubectl`)叩く際、
1時間ごとに認証エラーが起きてしまい、長時間触ることが出来ません。
そこで、ロールを使い EC2 から kubectl を時間無制限に操作できるようにしたので
参考までにどうぞ

###  ポリシーを作成
EKS のクラスターにつなぐのに必要なポリシーを作成します

- 必要な権限は`eks:DescribeCluster` だけでした

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "eks:DescribeCluster"
            ],
            "Resource": "*"
        }
    ]
}
```

### ロールを作成
- 先ほど作成したポリシーをアタッチしたロールを作成します。
- ポリシーで頑張りたかったんですが、eks(k8s?) ではユーザーか、ロール単位でしか認証できませんでした
   - 調査不足の可能性もあります

### ConfigMap を修正して適用
事前に `system:masters` の権限を持っているユーザーか、クラスターを作成したときのアカウント/ロールに切り替えます
`aws-auth-cm.yaml` もしくは、ConfigMap が書かれているyamlを以下のように書き加えます
\<AWS_ACCOUNT_ID\> と \<ROLE-NAME\> は適宜書き換えてください

- \<AWS_ACCOUNT_ID\>: AWSのアカウント番号です。ロールARNに書いてあります
- \<ROLE-NAME\>: 先ほど作成したロールの名前です

```yaml:
  mapRoles: |
    # 中略
    - rolearn: arn:aws:iam::<AWS_ACCOUNT_ID>:role/<ROLE-NAME>
      username: <ROLE-NAME>
      groups:
      - system:masters
```
あとは、 `kubectl apply -f aws-auth-cm.yaml` と叩いて終わりです。

### 補足 ロールをアタッチしたEC2からEKSつなぐ
現在(2019-08-14)提供されている AmazonLinux2のaws-cli が古いためバージョンを上げる必要があります。
参考情報: 
[\[アップデート\]EKSを使う際にaws-iam-authenticatorが不要になりました! ｜ DevelopersIO\]](https://dev.classmethod.jp/cloud/aws/eks-update-get-token-cmd/)
`aws-cli/1.16.156`以上が必要みたいです
[Linux に AWS CLI をインストールする - AWS Command Line Interface](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-linux.html)
を参考にして最新バージョンを入れてください
終わったら

```shell
 aws eks update-kubeconfig --region ap-northeast-1 --name cluster-name
```
と叩いて上げれば連携完了です。
あとは `kubectl` を入れてお好きにどうぞ
### 余談
- 本当は k8s側(RABC?)でもっと権限絞ったほうがいいのでしょうが、今回はやっていません
- k8s は沼が深いと思いました
GONEなViewに対してstartAnimationが動かない(時がある)


自分用備忘録です。

下の様に、ContainerというViewをタッチするとその子ViewであるgonableViewがフェードイン・アウトするようなものを作ろうとしました。（フェードアウトの方は特に問題なかったので省略しています。）

gonableViewがGONEにContainerをタッチすれば、本来ならばstartAnimationのonAnimationStart内のgonableView.setVisibility(View.VISIBLE)が動き、ヒョコッとフェードインするというものです。


```java:Container.java

public class Container extends LinearLayout {

    public Container(Context context){
        super(context);
        this.setOnClickListener(new myOnClickListener());
    }

}

    private class myOnClickListener implements View.OnClickListener {
        
        final LinearLayout gonableView
                           = (LinearLayout) v.findViewById(R.id.gonableview);

        @Override
        public void onClick(final View v) {

            Animation OutAnimation
             = AnimationUtils.loadAnimation(getContext(),R.anim.out_animation);

            OutAnimation.setAnimationListener(new Animation.AnimationListener() {
                @Override
                public void onAnimationStart(Animation animation) {
                    gonableView.setVisibility(View.VISIBLE);
                }
                @Override
                public void onAnimationEnd(Animation animation) {
                }
                @Override
                public void onAnimationRepeat(Animation animation) {
                }
            });

            if(gonableView.getVisibility()!=View.VISIBLE){
                gonableView.startAnimation(OutAnimation);
            }
        }
    }

```

途中までこれで動いていたのですが、急に動かなくなり、色々コードを見てみるものの、特に改変した部分は無く…
色々苦戦した後、何となく最後のifブロックに

```java:
gonableView.setVisibility(View.VISIBLE);
```

を入れてみると問題なく動きました。
onAnimationStartは呼ばれたり呼ばれなかったりする…？
【Oracle】初期化パラメータpga_aggregate_limitとは

# PGA（プログラム・グローバル領域）とは
* プロセス固有のメモリ領域
* 主にソート処理などで使われる
 
# 初期化パラメータ pga_aggregate_limitとは
* 12cからの新機能
* インスタンス全体で獲得可能な PGA の上限値を設定するパラメータ
* 上限値を超えたメモリを獲得しようとした場合、ORA-04036などのエラーが発生する
* エラーを発生させないようにするため、設定値を「0」にすることも多い
    - 0 =   インスタンスによって消費される集計PGAメモリーに制限がない（上限値がない）

# 参考
[Oracle Database 12c の新パラメータ「PGA_AGGREGATE_LIMIT」](http://www.intellilink.co.jp/article/column/ora-report20140120.html)
[PGA_AGGREGATE_LIMIT](https://docs.oracle.com/cd/E57425_01/121/REFRN/GUID-E364D0E5-19F2-4081-B55E-131DF09CFDB3.htm)
Salesforceエラーメッセージ表示

Salesforceエラーメッセージ表示
Javascript to select all checkboxes in visualforce page

xxController.js
saveSelectedRows : function (component, event, helper) {
    if (confirm($A.get("$Label.c.PJ_MSG_ConfirmToSaveTask"))) {

メッセージボックスの表示
https://developer.salesforce.com/forums/?id=906F00000009BnlIAE

Visualforceの小ネタ：確認ダイアログ
https://www.terrasky.co.jp/blog/2013/131018_001311.php
docker-compose upコマンドで謎の乱数volumeが生成される時

#imageから作り直したら生成されなくなった

私の個人的な体験談でかなりピンポイントですが
docker image lsしたらIDが同じイメージがありました(苦笑

色々検証を繰り返している時にたまにネットワークが切断されたりすると
謎イメージ、謎ボリューム、謎コンテナが自動生成されます。

これらをしっかり管理しかつクリーンな状態から作成し直すと
謎volumeは生成されなくなりました。

イメージがバグっているとvolumeに影響が出たというお話でした。

# 謎volumeが気になったので中身を確認してみました
気になったのでできる範囲で検証してみました。
[>>docker volumeの中身を確認してみました](https://qiita.com/SwuBHj8aKGqBKHet/items/0f2377fdd61b692efe84)
SCSSで画像をサイズ調整してアイコンとして組み込む方法

テンプレートっぽいのに
いつまで経っても覚えないのでメモとして書きました。

```scss:icon.scss
//普通の組み込み
.icon {
  background-image: url('../images/icon.png');
  width: 32px;
  height: 32px;
  background-position: center;
  background-size: contain; //width, heightと同じになる
  background-repeat: no-repeat;
}

//擬似要素の場合
.icon-with-text {
  //つらつら
  &:before {
    content: '';
     display: inline-block; //重要
     width: 32px; 
     height: 32px;
     background-image: url('../images/icon.png');
     background-size: contain; //width, heightと同じになる
     background-repeat: no-repeat;
     vertical-align: middle; //文字に合わせて中央ぞろえになる
  }
}

```

とりあえずdisplay:inline-blockが大事。
【RDS for Oracle】Hugepagesの有効化

# はじめに
- RDS for OracleでもHugePagesが使える

# HugePagesとは
- ページテーブルのページサイズはデフォルトは4 KB
- HugePage は、それよりも大きなページサイズ (デフォルトで 2 MB) で管理する機能
- 大規模な物理メモリを搭載したサーバなどでは、主にパフォーマンス面でのメリットがある
- 詳しくは[こちら](http://www.intellilink.co.jp/article/column/ora-report20190403.html)

# HugePagesのメリット
- ページのテーブルを小さくし、メモリ管理の CPU 経過時間を減少することで、大規模なデータベースインスタンスのパフォーマンスを向上できます

# HugePagesのデメリット
- MEMORY_MAX_TARGET/MEMORY_TARGETが使えなくなる

# HugePages有効時の注意点
- DB再起動が伴う

# HugePagesがデフォルト有効でないDBインスタンスクラス
↓から確認可能
[Oracle DB インスタンスで huge pages を使用する](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/CHAP_Oracle.html)

# 初期化パラメータ use_large_pages
- Huge pagesの有効／無効を制御する初期化パラメータ
- デフォルト値：{DBInstanceClassHugePagesDefault} 
- 設定値：ONLY、FALSE、 {DBInstanceClassHugePagesDefault} 

|メモリ     |{DBInstanceClassHugePagesDefault} |
|:-----------------|------------------|
| インスタンスクラスのメモリが 14 GiB 以下|FALSE。手動で有効化可能。 |
| インスタンスクラスのメモリが 14 GiB 以上、100 GiB 以下|TRUE（ONLY）。手動で無効化可能。 |
|インスタンスクラスのメモリが 100 GiB 以上|TRUE（ONLY）。無効にはできない。|

# HugePagesの有効化の方法
## １）パラメータグループの編集
次の初期化パラメータを設定する(設定例)

|初期化パラメータ       | 設定値|
|:-----------------|------------------|
| memory_target             |              0 |
| memory_max_target           |            0 |
| pga_aggregate_target           |            0 |
| memory_max_target           | {DBInstanceClassMemory*1/8} |
|sga_target           | {DBInstanceClassMemory*3/4} |
|sga_max_size           | {DBInstanceClassMemory*3/4} |
|use_large_pages           | ONLY |


## ２）DB再起動

## ３）アラートログの確認

<img width="1564" alt="CloudWatch_Management_Console.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/637e152d-1132-b824-cee8-6b8be308c037.png">

# その他
[Oracle RDSでメモリ使用率が常に高くても心配しなくてよい理由](http://blog.serverworks.co.jp/tech/2019/01/08/post-68487/)
PHPでMP3ファイルのID3タグを操作する

#はじめに
MP3ファイルを再生したり管理したりするアプリを製作した際ID3タグの
扱いで色々試したのでメモ


#ID3タグとは

iTunesなど一度は目にしたことがある目にする「曲名」、「アーティスト」、「アルバム」などの音源ファイルに紐付けられたデータのことである。これは通常、iTunesなどの再生用アプリのほか、様々なフリーソフトを活用して編集することができる。

以下ID3タグWikiより引用
ID3タグはMP3ファイルに元々組み込まれていた仕様ではなく、1996年に公開された「Studio3」というソフトウェアに組み込まれたのが始まりである。以後、様々なバージョンの規格が作られた。

ID3を追加したり、書き換えたりするソフトウェアはいくつか存在する。代表的な物はWinamp、SuperTagEditorシリーズ、mp3infp、Mp3tag等。

参考：[ID3タグWikiPedia](https://ja.wikipedia.org/wiki/ID3%E3%82%BF%E3%82%B0)



#PHPでID3タグを取り扱う方法その１


PHPでID3タグを扱う方法としてPECL拡張モジュールをインストールする方法がある。
一度設定してしまえばID3関数として呼び出しが可能なため、利用できる環境であれば
お勧めの方法。


参考：[PHPリファレンス ID3インストール]
(https://www.php.net/manual/ja/id3.installation.php)


よく使う関数

・id3_get_tag — ID3 タグに含まれるすべての情報を取得する


例1 id3_get_tag() の例

```
<?php
$tag = id3_get_tag( "path/to/sample.mp3" );
print_r($tag);
?>
```

上の例の出力は、 たとえば以下のようになる。

```
Array
(
    [title] => DN-38416
    [artist] => Re:\Legion
    [album] => Reflections
    [year] => 2019
    [genre] => 21
)
```

・id3_set_tag — ID3 タグに格納されている情報を更新する


例）

```
<?php
$data = array(
              "title" => "Re:Start",
              "artist" => "Re:\Legion",
              "comment" => "rock is dead..."
             );
$result = id3_set_tag( "path/to/sample.mp3", $data, ID3_V1_0 );
if ($result === true) {
    echo "タグが正常に更新されました\n";
}
?>
```

#PHPでID3タグを取り扱う方法その２

また、単にID3タグを取得したいだけであれば、
単独の機能のみダウンロードして利用する方法もある。

例）[getID3()]
(http://getid3.sourceforge.net/)

また、composerを使うなら、id3で検索すると様々なパッケージがヒットするので、
評価が高いものを試してみても楽しいかと！
[Packagistでのサーチ]
(https://packagist.org/search/?query=getid3)