OmniAICreator/Qiita-1.07M huggingface dataset:
OneMax問題を例に遺伝的アルゴリズムを見る（概要編）

# はじめに
[前回](https://qiita.com/ruemura3/items/67c93a30b7a43dc02eef)、キリンを例に遺伝的アルゴリズムを見てみました。

今回はOneMax問題という簡単な数学的問題を例に見ることで、プログラムに寄せた観点から説明しようと思います。

# OneMax問題とは
まずはOneMax問題とは何かについて説明します。非常に簡単なので敬遠しないでください😄

OneMax問題とは、例えば10個の0と1の数字からなる、[1, 0, 1, 0, 0, 1, 1, 1, 0, 1]の様な数列の和を最大化するにはどうすればいいかという問題です。

人間からするとあまりに簡単ですよね。全部を1にして[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]となればこの数列の和は最大になります。

この超簡単な問題を敢えて遺伝的アルゴリズムを使って解いてみようというのがこの記事の主旨です。

#vOneMax問題を遺伝的アルゴリズムで解く流れ
前回の記事「[キリンを例に遺伝的アルゴリズムを見る](https://qiita.com/ruemura3/items/67c93a30b7a43dc02eef)」と同じ流れで説明していきますので適宜見比べてみてください。

## ① 個体集団の作成
まずは個体集団を作ります。

ランダムに0と1を持つ配列をたくさん作成します。
本当はもっとたくさん作りますが、今回は説明の都合上6個としましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574728/6c52e92d-a18f-d30f-c2da-5d1af63f561c.png)

## ② 個体の評価
それぞれの個体を評価して点数をつけます。

今回の評価ポイントは数列の合計ですので、それぞれの数列の合計を算出した値を点数とします。例えば、[0, 0, 0, 1, 0, 0, 0, 0, 0, 1]の点数は2点です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574728/f2857543-be7a-1e40-78b6-04df9816bb04.png)

## ③ 個体の選択
評価の高いものを次の世代へ受け継ぐために残します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574728/feec5df3-173a-7314-ac6b-e8a55c97aa2d.png)

## ④ 交叉
③で選択された個体から子供を作ります。

2つの個体をある場所で2つに分け、それらの後半同士を交換します。
分ける場所はランダムに選びます。

最初に6個の個体を作ったので同じく6個の個体を作ります。
一部の個体に関しては敢えて交叉させずに③で選択された個体をそのまま残すのもありです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574728/af906a91-89b8-7a53-9ffc-50607f7d5f41.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574728/b628961d-2c52-919b-1a4d-08aee7534a49.png)

交叉によってできたのがこちら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574728/219f00e3-b49f-fb26-c12e-e9d26e0bbfea.png)
## ⑤ 突然変異
進化の多様性を保つために一部の個体に対して突然変異を起こします。
突然変異が起きる場所も変異後の値もランダムです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574728/6e839176-d9dc-bd1a-d260-440f87a095d9.png)

これで次の世代の個体集団ができました。
最初に比べて1が多くなっているのがわかると思います。↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574728/bac00baa-db93-1c49-51d7-2ab650268d73.png)

## ⑥ ②〜⑤を繰り返す
新しくできた個体集団に②から⑤までを繰り返し行います。

もう一度②から⑤をやるとこんな感じになります。↓（ランダム要素が多いためあくまでもイメージです。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574728/044fa170-cbb7-2982-e5c8-ec7cca6dde25.png)

最初の個体集団と比べてだんだん1が多くなってきましたね。

あと10世代も繰り返せばこんな感じになるんじゃないでしょうか。↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574728/7b5b5fe8-fd7e-9630-ec5d-e4491b9db87d.png)

こうするとほとんどの個体が10点や9点となり、これ以上点数が上がることがなくなります。

そして最後の世代で最も良い個体を最適解として導き出します。

こうして[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]が答えとなるんですね。

# まとめ
人間からしたら「いや全部1にすればいいやん」て話なんですが、敢えて遺伝的アルゴリズムを使って解くとこの様な流れになります。

遺伝的アルゴリズムのすごいところは、**これと同じ手順を踏むだけで人間には到底計算できない様な問題も答えが出せてしまう**ところです。

実装が簡単というところが遺伝的アルゴリズムの最大のメリットと言えます。

[Twitter@ruemura3](https://twitter.com/ruemura3)
Jリーグの勝ち点推移がグラフで見れるよ！

# 概要
## 記事概要
今回作ったサービスの紹介をしつつ開発の流れやつまずきポイントを紹介します。

## アプリ概要
- Jリーグのチームの勝ち点推移がグラフで見れる
- [こちら](https://yuta97.github.io/j-result-front-nuxt/)からサービスに飛べます。
- Jリーグのデータサイトからスクレイピングしてデータをためて、APIとして配信してフロントから表示させています。
![スクリーンショット 2021-01-08 19.01.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432257/988e1750-77c3-6847-493a-762da7963115.png)

# アプリ作成理由
- 川崎フロンターレの圧倒的な結果を視覚的にみたくなったから。


# 全体の構成
[フロント](https://github.com/yuta97/j-result-front-nuxt)のソースコードはGitHubにあげています。
## 構成図
![J勝ち点推移サービス構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432257/cf9771e3-9f0d-c164-944c-df93c100d624.png)




## 使用技術
- Python 
- AWS(Lambda,APIGateway,DaynamoDB)
- JavaScript(Nuxt.js,Chart.js)

# 作成の流れ＆つまづきポイント
## 流れ

1. [Jリーグのデータサイト](https://data.j-league.or.jp/SFTP01/)をAWS LambdaでスクレイピングしてAWS DaynamoDBに蓄積
2. AWS DaynamoDBのデータをAPIGateway&LambdaでAPIを作る
3. Nuxt.jsでAPIを受け取りChart.jsで表示
4. GitHubpagesでデプロイ

## 流れの詳細 
参考にしたサイトなどを紹介しつつ開発の流れを説明します。

### 1.Lambdaでスクレイピング
スクレイピングは`requests`と`beautifulsoup`を使っています。
Lambdaでサードパーティーのライブラリを使うには以下のサイトを参考にしました

[LambdaでスクレイピングするならDockerイメージを使おう【Python】](https://torahack.com/python-scraping-docker-for-lambda/)

さらにスクレイピングしたデータをDaynamoDBに送るにはPython Boto3という公式のライブラリで操作できます

・参考
[公式のドキュメント](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/GettingStarted.Python.03.html#GettingStarted.Python.03.01)
[AWS LambdaからPython Boto3を使用してDynamoDBを操作してみた](https://qiita.com/shimajiri/items/cc2f633b2a55b364d4c3#%E7%99%BB%E9%8C%B2%E5%87%A6%E7%90%86)


### 2.Lambda+APIGateway でAPI作成
DaynamoDBからデータをとってくるLambda関数とAPIGatewayを作ります。
かなり簡単です。
DaynamoDBからソートしてデータを取るのが難しかったので、Lambdaでソートし直すことにしました。辞書のリストを並べ替えるのもライブラリで簡単にできます。


・参考
[API Gateway + Lambda + DynamoDB](https://qiita.com/leomaro7/items/314a80b6d91f9e6b4060)
[Pythonの辞書のリストを並び替える](https://qiita.com/yousuke_yamaguchi/items/23014a3c8d8beb8ba073)

### 3.Nuxt.js ✖️　Chart.js
Nuxtでchart.jsを扱うのは以下を参考にしました。
APIをchart.jsで扱うには公式にサンプルがあるのでそれを参考に！
・参考

[Nuxt.jsでvue-chart.jsを使って簡単グラフ作成](https://reffect.co.jp/vue/nuxt-js-vue-chartjs-easy-to-use)
[公式](https://vue-chartjs.org/ja/guide/#api%E3%81%8B%E3%82%89%E5%8F%96%E5%BE%97%E3%81%97%E3%81%9F%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E3%83%81%E3%83%A3%E3%83%BC%E3%83%88)

# 感想
感想をだらだらと書きます。

- やっぱりLambda楽しい手軽に開発できて便利〜
- Chart.jsでも簡単にグラフ表示できていいね！
- JS力もUPさせたい！

# 今後の展望
今後やりたいことをだらだらと列挙していきます。


- セキュリティーの強化（APIkey入れるとか）
- APIテスト
- APIのドキュメント作成
- UIの改善
- CICD
よく使うQiitaのマークダウン記法

# メモとしてQiitaのマークダウン記法をまとめる。

#見出し

># これはH１タグです

```
# これはH１タグです
```
---
>## これはH２タグです

```
## これはH２タグです
```
---
>###これはH３タグです

```
###H３タグになるとアンダーバーがなくなります
```
---
>######H6で限界です

```
######H6で限界です
```

#引用とフォント変更

>引用　　~~訂正線~~
>>引用　　**太字で強調**
>>>引用　　*斜体*

```
>引用　　~~訂正線~~
>>引用 　　**太字で強調**
>>>引用 　　*斜体*
```

---
#箇条書きと番号付きリスト
>
* 箇条書き中はタブでインデントを下げられます
 * 半角スペース１つでも可
    * 箇条書き　こっちはTABキー1回
- 書き方は二通り
    - ハイフンでも可能
    - Enterで改行すると自動で次の項目が用意される

```
* 箇条書き中はタブでインデントを下げられます
 * 半角スペース１つでも可
    * 箇条書き　こっちはTABキー1回
- 書き方は二通り
    - ハイフンでも可能
    - Enterで改行すると自動で次の項目が用意される
```
***
>
1. 番号付きリストもタブでインデントを下げられます
 1. 半角スペース１つでも可
    1. こっちはTABキー1回
1. 入力数字は全部１でも表示はオートで変わる
2. Enterで改行すると自動で次の番号が用意される

```
1. 番号付きリストもタブでインデントを下げられます
 1. 半角スペース１つでも可
   　1. こっちはTABキー1回
1. 先頭の数字は全部１でも表示はオートで変わる
2. Enterで改行すると自動で次の番号が用意される
```

#水平線
>
***

```
*** 上記の水平線
--- こっちでも可
```
***

#コードの挿入
>
```ruby:items_controller.rb
def new
  @item = Item.new
end
```

\`\`\`言語:タイトル
コード
\`\`\`

***

#リンクの挿入
>[Qiita](http://qiita.com/)

```
[Qiita](http://qiita.com/)
```
---

#インライン表示
>
`インライン表示`　することも可能です

```
`コードをインライン表示`　することも可能です
```

---
PDFへのいくつかの画像

📚いくつかの画像をPDFに変換する方法。
画像をPDFファイルとしてすばやく簡単に無料で保存する方法をご覧ください
「ファイルを選択」をクリックするか、画像を選択フィールドにドラッグして、コンピューターからアップロードします。または、Googleドライブ、Dropbox、またはOneDriveから直接画像をインポートすることもできます。
写真がアップロードされたら、「生成」ボタンをクリックします。画像は数秒でPDF形式に変更されます。
変換が完了すると、PDFファイルをダウンロードできるようになります。
💻ドライブ、Dropbox、OneDrive。
このツールを使用すると、ブラウザで直接画像をPDF形式に変換できます。デバイスから必要な画像をアップロードするか、Googleドライブ、Dropbox、またはOneDriveから画像を選択します。

💲無料のコンバーター。
無料のPDF変換サービスを提供します。画像をPDFファイルに変換してお金を節約しましょう！ファイルサイズや変換数に制限はありません。私たちはあなたのために最善を尽くします！

📧メールはありません。
アカウントを作成したり、個人情報を提供したりする必要はありません。写真をPDFファイルに変換するために必要なのは、安定したインターネット接続だけです。

📑画像フォーマット。
このオンライン画像からPDFへのコンバーターは、IMG、PNG、JPG、BMP、GIF、TIFFなどのすべての基本的な画像ファイル形式と互換性があります。変換ツールはプラットフォームに依存しないため、必要なときにいつでも、どのオペレーティングシステムやデバイスでも簡単に使用できます。

🚂すばやく簡単。
画像のPDFをすばやく簡単に作成してください！手順の説明に従って、3つの簡単な手順を実行するだけです。 PDFへの画像変換には1分もかかりません。変換の速度は、画像のサイズとサーバーの過負荷によって異なる場合があることを考慮してください。
nuxt.jsでプロジェクトを起動したらerror clear vue/comment-directiveというエラーが発生したときの解決方法

# 概要

nuxt.jsで新規にプロジェクトを作成し、作成直後に起動したときエラーが発生した。
その解決方法を記載する。

# プロジェクト作成
以下コマンドでプロジェクトを作成する。
途中の設定などは割愛。

```
npm init nuxt-app <project-name>
```

# サーバー実行
プロジェクト作成完了後、以下コマンドでプロジェクトを起動する。

```
cd <project-name>
npm run dev
```

# エラー内容
プロジェクトを起動すると以下のようなエラーが発生する。

```
error  clear  vue/comment-directive
```

# 解決方法
プロジェクト内の`.eslintrc.js`に`overrides:`を追記する。

```
module.exports = {
　// 省略
  overrides: [
    {
      files: ["*.vue"],
      processor: "vue/.vue"
    }
  ]
}
```
RedashでPythonデータソースを追加する

# はじめに

RedashでPythonデータソースを使えるようにするための設定の備忘録。

# 環境

```bash

$sw_vers
ProductName:	Mac OS X
ProductVersion:	10.13.6
BuildVersion:	17G14042

$docker --version
Docker version 20.10.0, build 7287ab3

```

DockerベースでローカルにRedashをインストールしました。
Redashのバージョンは```v8.0.0```を使用しています。
インストール方法は[こちら](https://qiita.com/dyamaguc/items/a7a16f8ca9b562c33090)

# Pythonデータソースを使うために必要な設定

デフォルトではPythonデータソースを使えないので、使えるようにするために
```redash/settings/__init__.py``` に記載されている```default_query_runners``` に
```"redash.query_runner.python"``` を追加します。

```redash/settings/__init__.py

(省略)

322 
323 # Query Runners
324 default_query_runners = [                                                                                                                                   
325     "redash.query_runner.python",
326     "redash.query_runner.athena",
327     "redash.query_runner.big_query",
328     "redash.query_runner.google_spreadsheets",
329     "redash.query_runner.graphite",
330     "redash.query_runner.mongodb",
 
```

その後、```docker-compose up``` を実行。
すでに実行している場合は```docker-compose restart``` 。

# 確認

ブラウザで```localhost:5000``` にアクセスして、Redashの画面を開いたあと、
Settings → Data Sources タブ → + New Data Source。  
検索窓で「Python」と打つとPythonデータソースが選択できるようになりました。

![python_datasource.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329888/72793c0b-27c6-8f00-89d3-1f1419e4bc92.png)
低スペのMacBook Pro late 2013にmacOS 11入れて意外とどうにかなっている話

Zennと同時投稿 https://zenn.dev/k_u_0615/articles/3e3ca49e7d1cd5



## TL;DR
- OS更新時に発生していたバグは修正済みなので問題なし
- パフォーマンスをあげる設定をしたり、使うアプリに気をつけていれば案外使える
- Web開発ぐらいならいけるけど、dockerでバックエンド動かしているとキツくなる

## スペック

![スクリーンショット 2021-01-04 6.36.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137148/34b15d64-8c55-71ce-499a-088cec8fee01.png)


メモリ4GB！！！！😭

## 文鎮化するバグについて

- [2013~2014年製の古いMacBook ProがmacOS 11 Big Surアップグレード後に起動しなくなる不具合が報告される。 | AAPL Ch.](https://applech2.com/archives/20201116-macbook-pro-bricked-after-failed-big-sur-update.html)

上記の記事では、古いMBPではmacOS 11を入れると文鎮化してしまうと書かれていますが、こちらのバグはmacOS 11.1にて解決しているようです。


## パフォーマンスをあげる設定

1. システム環境設定を開く
2. アクセシビリティ→ディスプレイをクリック
3. 以下2つの設定を有効にする

- 透明度を下げる (必須)
  - dockの背景色などを透かせる機能だが、オフにするとパフォーマンスが劇的に良くなる
- 視差効果を減らす (好みで)
  - 仮想デスクトップの切り替えやMission Controlなどの動き(視差効果)がフェードになり、パフォーマンスが少し良くなる
  - 個人的に視差効果は結構好きなので、有効にしていません

![スクリーンショット 2021-01-08 21.11.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137148/689d019c-9f0a-abb2-fb8d-6f9ecf588baf.png)

## 運用のコツ

- できるだけChromeではなくSafariを使う
- Electron系のアプリはできるだけ使わない
  - メモやmarkdownぐらいならvscodeではなくネイティブのテキストエディタ(CotEditorなど)を使用する
  - チャットアプリはSafariで頑張るか、スマホで対応する
- vscodeを使用する際、使わない拡張は無効化するかアンインストールする

## 使ってみた感想
諸用でcorei7 MBP late2020という贅沢なものから7年前のMBPになってしまいました。
MBP late2020のときに使用していたBigSurの新しいUIに見慣れてしまい、一か八かでアップグレードしましたが、びっくりするほど普通に使えていて驚いています。
外先でも数時間作業できますし、Web開発ぐらいならserveコマンドを動かしながらブラウザで確認してもギリギリどうにかなってます。
ただ、メモリがカツカツなので使わないアプリやタブ、拡張などはこまめに確認しないといけません。
また、dockerでなにかをさせたら流石にキツいです。
そこまでヘビーな開発は求められていないのもあり、これで仕事しても全然いけそうです。

ただ、騙し騙し使っているのは事実なので、お金に余裕ができたらM1 MacBookAirが早く欲しいです、、
Flutter (Android) で、 任意のpluginをApplication.ktに読み込む

### やりたいこと
```Application.kt
import io.flutter.app.FlutterApplication
import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback
import io.flutter.plugins.GeneratedPluginRegistrant
import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService
...
```
みたいな、Application.kt のimportの部分を、任意のプラグインに対して定義したい

### 解決策
```Application.kt
import io.flutter.plugins.firebase.firestore.FlutterFirebaseFirestorePlugin
```

該当するパッケージのgithub repoをみる。
cloud firestoreの場合、[ここ](https://github.com/FirebaseExtended/flutterfire/tree/master/packages/cloud_firestore/cloud_firestore/android/src/main/java/io/flutter/plugins/firebase/firestore)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557811/bdcde48c-1ec0-101c-b866-3e939a9b410c.png)

`cloud_firestore/android/src/main/java` 以下の、`io/flutter/plugins/firebase/firestore` のところがそれになる。
【初心者でもわかる】nth-of-typeはクラス名基準でx番目指定できない・・・からjsでなんとかする方法

#どうも7noteです。初心者が陥りやすい、nth-of-typeの罠。


「x番目の要素にだけCSSを適応」

このようにある特定の要素にだけCSSを適応したい時によく使われるのが

・nth-child()
・nth-of-type()

ですが、今回はこのnth-of-type()についての罠の話です。

## 「クラス名（.hogehoge）のx番目」という指定はできない！

**うまくいかない例**

```index.html
<div class="asa">おはよう</div>
<div class="asa">おはよう</div>
<div class="yoru">おやすみ</div>
<div class="yoru">おやすみ</div>
<div class="yoru">おやすみ</div>
```

```style.css
.yoru:nth-of-type(2) {
  color: red;
}
```

イメージでは、*「クラス[yoru]がついているの2つ目が赤色になる！」*と思いますが、実際にはどれも色は変わりません。

**うまくいかなかった結果**

おはよう
おはよう
おやすみ
おやすみ
おやすみ


## 思った通りにいかない理由

そもそも、、、


***「クラス名を基準にしてx番目の指定」はできない！！！***


訂正→***「同一要素(div)のx番目が特定のクラス（.yoru）の場合」にしか効かない***

意外と気付きにくいものです。
私もずっと上手くいかなくて調べてもnth-childとnth-of-typeの比較記事しかでなくて原因の調査に時間がかかりました。。。

追記：コメントでnth-of-type()について更に詳しく教えていただきましたのでそちらもご覧ください。↓↓↓

つまりは、

***「nth-of-type()は、クラス名ではなく要素そのものを基準に何番目かを計算して動いている」***

ということになります。

**nth-of-typeの使い方例**

```index.html
<div>おはよう</div>
<div>おはよう</div>
<p>おやすみ</p>
<p>おやすみ</p>
<p>おやすみ</p>
```

```style.css
p:nth-of-type(2) {
  color: red;
}
```

**結果**

おはよう
おはよう
おやすみ
<font color="red">おやすみ</font>
おやすみ



## じゃあクラス名基準でx番目の要素にCSSを当てるには？

**javascriptの`eq`を使ってx番目の要素を取得することができます。**

クラス名基準でx番目の要素に任意のクラス（.hoge）を付与して、そのクラス専用のCSSを予めCSSで用意する方法が良いかなと思います。

※eqは0からカウントが始まるので、「2番目の要素」にしたいときは「eq(1)」と書かなければなりません！

```style.css
/* .hogeのクラスがついているものにだけ追加のCSSを用意 */
.hoge {
  color: red;
}
```

```script.js
$('.yoru:eq(1)').addClass('hoge');
//もしくは
$('.yoru').eq(1).addClass('hoge');
//もしくは
$($('.yoru').get(1)).addClass('hoge');
```


## まとめ

実はsafariにのみ、ofフィルターと呼ばれるようなものがあり特定の条件を満たす要素のみカウントさせることができるようです。
ただsafariだけなので、実用的ではないので現状クラス名基準でx番目を指定するのであればjavascriptを使うのが一番最適な方法です。

クラス名を沢山つけすぎてもややこしくなる場合があり開発が困難になるのであれば、div要素を増やすなどでしっかりと住み分けできるものは住み分けさせる方が一番理想的な形かもしれませんね。

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)

参考
https://pisuke-code.com/css-nth-child-class-not-working/
https://teratail.com/questions/9634
SQLの基礎について学ぶ＃０４


今回はSQLを用いた操作する行の絞り込みについて、まとめていきたいと思います。
### 過去の関連投稿
「[SQLの基礎について学ぶ＃０１](https://qiita.com/TAISEI-050523/items/31dd74cd386fe4dc46bf "Qiita")」
「[SQLの基礎について学ぶ＃０２](https://qiita.com/TAISEI-050523/items/75265fba015879bd3bf8 "Qiita")」
「[SQLの基礎について学ぶ＃０３](https://qiita.com/TAISEI-050523/items/2d87b30fa3de353af159 "Qiita")」




## 1. 複数条件を組み合わせる
ここでは以下のテーブルを使用していきます。
### listテーブル
|    category（分類）    |    name（名称）       |    store(販売店）     |
|:-----------:|:------------:|:------------:|
| 野菜 |　にんじん  　 | 販売店A         |
| 果物 |　みかん 　 | 販売店A         |
| 野菜 |　きゅうり  　 | 販売店B         |
| 果物 |　りんご  　 | 販売店B        |
| 肉類 |　牛肉 　 | 販売店B         |
| 野菜 |　キャベツ  　 | 販売店B         |
| 野菜 |　トマト 　 | 販売店A         |
| 肉類 |　豚肉 　 | 販売店A         |
###論理演算子
代表的な演算子としてAND演算子OR演算子があります。
▶ ２つの条件式の両方が真の場合のみ、真となる（AかつB）
<b>条件式1 AND 条件式2</b>
▶ ２つの条件式のどちらかが真の場合のみ、真となる（AまたはB）
<b>条件式1 OR 条件式2</b>

```SQL
/* AND演算子　販売店がAかつ分類が野菜の行を取得する */
SELECT *
FROM list
WHERE store = '販売店A'
  AND category = "野菜"
```
###結果
|    category（分類）    |    name（名称）       |    store(販売店）     |
|:-----------:|:------------:|:------------:|
| 野菜 |　にんじん  　 | 販売店A         |
| 野菜 |　トマト 　 | 販売店A         |

```SQL
/* OR演算子　販売店がAまたは分類が肉類の行を取得する */
SELECT *
FROM list
WHERE store = '販売店A'
  OR category = "肉類"
```
###結果
|    category（分類）    |    name（名称）       |    store(販売店）     |
|:-----------:|:------------:|:------------:|
| 野菜 |　にんじん  　 | 販売店A         |
| 果物 |　みかん 　 | 販売店A         |
| 肉類 |　牛肉 　 | 販売店B         |
| 野菜 |　トマト 　 | 販売店A         |
| 肉類 |　豚肉 　 | 販売店A         |

### 論理演算子の優先度
複数の論理演算子が使用されている場合は<br>(1)NOT、(2)AND、(3)ORの<b>優先順位</b>によって処理が行われます。
よって複数の論理演算子を使用する場合は以下のSQL文ように<b>（）括弧</b>を用いて、その評価の優先順位を上げる必要があります。

```SQL
SELECT *
FROM account
WHERE (store = '販売店A' OR store = '販売店B')
  AND (category = '果物' OR category = '肉類')
```
###結果
|    category（分類）    |    name（名称）       |    store(販売店）     |
|:-----------:|:------------:|:------------:|
| 果物 |　みかん 　 | 販売店A         |
| 果物 |　りんご  　 | 販売店B        |
| 肉類 |　牛肉 　 | 販売店B         |
| 肉類 |　豚肉 　 | 販売店A         |



## ２. 主キーの必要性について
次はこのテーブルを使用して説明します。
###accountテーブル
|    date（日付）    |    name（項目名）       |    price（金額）     |
|:-----------:|:------------:|:------------:|
| 2020-12-03 |　お茶  　 | 100         |
| 2020-12-03 |　お茶 　 | 100         |
| 2021-01-02 |　電車代  　 | 2000         |

上記のテーブルで、１行目のお茶だけ削除したい場合には、どうすればよいのでしょうか？

```SQL
DELETE FROM account 
WHERE name = '2020-12-03' AND price = 100
```
これでは２行目のお茶も削除してしまいます。データとしては２つの行は全く同じものであるためそれぞれを区別する手段がありません。つまり、ある特定の行だけを区別して操作することができないことを意味します。
▶ 重複するデータが存在してしまうテーブルは構造自体に問題がある！！
▶ これを解決するため主キーという考え方がある。
###主キーとなる列を作成する
主キーとは
▶ 主キーによって、テーブル内の１つ１つのデータが識別可能。
▶ 主キーには必ず何らかのデータが格納される。（NULLではない）
▶ 他の行と値が重複しない。
▶ 複数の列を組みわせて複合主キーを構成して、行を識別することもできる。
改善したテーブル⬇⬇⬇

| id |    date（日付）    |    name（項目名）       |    price（金額）     |
|:---:|:-----------:|:------------:|:------------:|
|1| 2020-12-03 |　お茶  　 | 100         |
|2| 2020-12-03 |　お茶 　 | 100         |
|3| 2021-01-02 |　電車代  　 | 2000         |

▶ 重複しないIDをデータ毎につけることで、複数の行が絶対重複しないようにする。（例： 会員番号、社員番号など）


# まとめ
今回はここまでです！SQLについて引き続き学び、また次回投稿していきたいと思います！！
コンピューター基礎知識②

##前書き
前回に引き続き用語について整理する。

##コンピューターの５大装置
コンピューターのハードウェアには「制御装置」「演算装置」「記憶装置」「入力装置」「出力装置」の５つがある。

###制御装置
制御装置はソフトウェアに記述されている命令に対して他の装置を制御する役割がある。

###演算装置
演算装置はソフトウェアに記述されている命令に応じて計算する役割がある。

###記憶装置
記憶装置はソフトウェアのデータや表計算の計算結果などを保持する役割がある。
記憶装置には「主記憶装置」と「補助記憶装置」がある。

主記憶装置はCPUが直接読み書きをする記憶装置でメモリと呼ばれる。
メモリはデータの読み書きは高速だが補助記憶装置に比べると容量が小さく電源を切るとデータは消去される。

補助記憶装置はデータを長期的に保存するときに使われている。HDDやSSD,DVD-ROMが該当しストレージと呼ばれる。
読み書きは低速だがコンピューターの電源を切っても消去されないため大容量のデータの保持に向いている。

###入力装置
入力装置はコンピューターに情報やデータを入力したり指示を与える役割がある。
マイクやタッチパネルキーボードなどが該当する。

###出力装置
出力装置はコンピューターのデータや計算結果を外部に出力する役割がある。
スピーカーやプリンタなどが該当する。



##終わりに
エンジニアになるためにはプログラミング以前にこういった知識も必要になってくると思う。これからも気になる用語や技術仕組みがあればアウトプットを継続していく。
Progate Ruby 学習コースⅢ 修了

##今日の感想
Rubyというかプログラミングをきちんと勉強し始めてまだほんの数日です。
コードをシンプルに・読みやすくするために異なる書き方があって、なーんとなく便利そうだなということはわかるけど、これがどのようにアプリケーションの制作作業を楽にするのかは全くイメージが湧かない…。まあまともなプログラミングをしたことがないのでイメージが湧かないなんて当然といえば当然ですが…
Rubyの学習をはじめたばかりだってことはわかっているものの、以前少しかじったPythonより若干書き方が複雑な印象があります、なんとなく…（現時点で）
レッスンごとに壁にぶち当たりながら学習を進めていると、海外の大学院に進学することを決意してから苦手だった英文法を基礎の基礎から学び直した時の感覚を思い出します。今では笑っちゃうけど、最初は一般動詞とBe動詞の違いすら合点がいかずウンウン唸ってました…

##学んだこと
- メソッドの使い方
    - メソッドの定義→メソッドの呼び出し
    - メソッドの定義は「def メソッド名」
    - メソッドの呼び出しはメソッド名を直接タイプ
- 引数（ひきすう）の利用
    - 引数は複数受け取ることも可能
    - 戻り値の使用・return
    - 戻り値で真偽値を返すメソッドはメソッド名の末尾に？をつける（慣習として）
- Returnによってメソッド処理を終了させる機能
- キーワード引数を持つメソッドの書き方
【Ruby】閏年判定プログラム

## 概要

西暦と月を出力するプログラムを書きました。そのときに閏年を考慮する必要があります。

## 目次

- 閏年(うるう年)

- 実践
    - 問題
        - 条件

    - 解答

- 補足

- 参考文献

## 閏年(うるう年)

閏年は次の条件で判定することができます。

- ①西暦が4で割り切れる時
- ②ただし、100で割り切れるときは平年
- ③ただし、400で割り切れるときは閏年

## 実践

#### 問題

>西暦と月を入力し、その月の日数を求めるプログラムを書いてください。

**条件**

- 閏年を考慮してください

#### 解答

```ruby
def leap_year?(year, month)
  # 各月の日数
  month_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
  # 配列から日数を取得
  days = month_days[month - 1]

  # 2月
  if month == 2
    # 条件① 4で割り切れるとき
    if year % 4 == 0
      # 条件②,③ 西暦が100で割り切れるとき かつ 400で割り切れないとき
      if year % 100 == 0 && year % 400 != 0
        days      # うるう年ではない
      else
        days + 1  # 28日に +1 すると29日になる
      end
    # 4で割り切れないときはうるう年ではない
    else
      days
    end

  # 2月以外のとき
  else
    days
  end
end

# 西暦を入力
p '年を入力してください'
year = gets.to_i

# 月を入力
p '月を入力してください'
month = gets.to_i

# メソッド呼び出し
days = leap_year?(year, month)
p "#{year}年#{month}月は#{days}日間あります"
```

## 補足
>②ただし、100で割り切れるときは平年
>③ただし、400で割り切れるときは閏年

このような条件を上記解答では

```ruby
year % 100 == 0 && year % 400 != 0
```

このように記述しています。

**400で割り切れるときに閏年** ならば、 **400で割り切れないときは平年** になります。
これを利用して **else(それ以外のとき)は閏年** が成り立つようになります。


## 参考文献

- [フリー百科事典『ウィキペディア（Wikipedia）』 (閏年)](https://ja.wikipedia.org/wiki/%E9%96%8F%E5%B9%B4)

- [Ruby 3.0.0 リファレンスマニュアル(Date#leap?)](https://docs.ruby-lang.org/ja/latest/method/Date/i/leap=3f.html)
【JavaScript】Babelとは何か

#プログラミング勉強日記
2021年1月8日
TwitterでBabelの存在を知ったので、Babelとはいったい何なのか気になり調べてみた。

#Babelとは
　Babel(読み方：「バベル」)は、次の世代のJavaScriptの標準機能をブラウザのサポートを待たずに使えるようにするNode.js製のツールである。次の世代の標準機能を使って書かれたコードを、それらの機能をサポートしないブラウザでも動くコードに変換する。
　簡単に言うと、JavaScriptのコードを新しい書き方から古い書き方に変換するツールである。具体的には、JavaScriptの言語仕様であるES2015以上の仕様のJavaScriptで記述すると、Internet Explorer11といった古いブラウザでは動作しない。そこで、Babelを使ってES2015・ES2016といった仕様で記述したJavaScriptファイルを互換性のあるEXMAScript5に変換する。

#環境構築
　[Babelの公式サイト](https://babeljs.io/)で変換の確認ができる。

##1. インストール
　package.jsonがある場所で以下のコマンドを実行する。babel-cliはbabelをcliで実行するための本体モジュールで、babel-preset-envはES6の内容をES5に変換する情報のようなもの。

```
npm install —save–dev babel–cli

npm install –save-dev babel-preset-env
```

##2. `.babelrc`ファイルの作成
　babel-preset-envを使用するための設定として、`.babelrc`ファイルを作成して下記の内容を記述する。

```:.babelrc
{
"presets": ["env"]
}
```

##3. 実行
　下記コマンドで実行する。　

```
./node_modules/.bin/babel sample.js
```




#参考文献
[最新版で学ぶwebpack 5入門　Babel 7でES2020環境の構築](https://ics.media/entry/16028/)
[Babelとは](https://www.codegrid.net/articles/2015-babel-1/)
[BabelでモダンなJavaScript開発環境を作る方法を現役エンジニアが解説【初心者向け】](https://techacademy.jp/magazine/37162)
コンピューター基礎知識①

##前書き
プログラミングを学んできて数ヶ月が経ち今までなんとなくの理解で進んできた用語や仕組みを整理してみようと思った。用語が分かってないといちいち調べないといけなかったり効率が悪い。

##コンピューター

そもそもの話だがコンピューターがどのように構成されているのかよくわかっていなかった。

簡単に言うと
コンピューターはハードウェアとソフトウェアで構成されていて
ハードウェアは「電子機器や電子回路」の集まり
ソフトウェアは「命令」の集まり
なのだそうだ。

例えばユーザーがパソコンというハードウェアを通して入力やクリックをする→入力を解釈しCPU（コンピューターの頭脳）が表計算やメールソフトなどのソフトウェアを動かしているイメージ。


##プログラミングの役割

コンピューターは１と０の二進数によってあらゆる処理を表現している。
しかし人間の目では１と０の数字の羅列だけでは理解できないためプログラミング言語を挟んで人間もコンピューターもお互いに理解できる言語に翻訳して命令をしている。

##終わりに
基礎中の基礎だが正直ちゃんと調べるまでわかってなかった。。特にコンピューターを構成するハードウェアとソフトウェアについてはなんとなくの理解でしかなかったので改めて勉強になった。次はコンピューターの構造についてより詳しく掘り下げて行こうと思う。
ChangeFinder（変化点検知）を実装してみた

* 製造業出身のデータサイエンティストがお送りする記事
* 今回は時系列データの変化点を検知する異常検知手法のChangeFinderを実装（サンプルコード）しました。

##はじめに
過去に異常検知手法や時系列データの解析手法を整理しておりますので、興味ある方はそちらも参照して頂けますと幸いです。

* [多変量統計的プロセス管理（MSPC)](https://qiita.com/DS27/items/165363158273e441e877)
* [疎構造学習による異常検知](https://qiita.com/DS27/items/279306656d0b41918846)
* [時系列解析](https://qiita.com/DS27/items/1e998a58488e76bfcbdc)
* [状態空間モデル](https://qiita.com/DS27/items/cd0e11c2b9eb097c606b)
* [隠れマルコフモデルを用いた異常検知](https://qiita.com/DS27/items/55a90c9791347d7622e5)

##ChangeFinderとは
自己回帰モデル（ARモデル）の学習に「オンライン学習」と「忘却機能」を追加したSDARアルゴリズムを活用した手法が「ChangeFinder」です。山西先生がNEC在籍時代に発明した手法だそうです。詳細は[データマイニングによる異常検知](https://www.amazon.co.jp/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%9E%E3%82%A4%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%AB%E3%82%88%E3%82%8B%E7%95%B0%E5%B8%B8%E6%A4%9C%E7%9F%A5-%E5%B1%B1%E8%A5%BF-%E5%81%A5%E5%8F%B8/dp/4320018826)に詳しく書かれておりますのでご参照ください。

下記に簡単にアルゴリズムを整理しておきます。

1. SDARで確率密度を学習（第一段階）
2. 各時点での変化点スコアを算出
3. 変化点スコアを平準化
4. SDARで確率密度を学習（第二段階）
5. 各時点での変化点スコアを算出

![SDAR.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743453/4b907b33-61a8-24fd-89ce-709ca385b7f7.png)

##ChangeFinderの実装
今回はchangefinderのライブラリーにサンプルコードがありましたので、そちらを活用しました。

pythonのコードは下記の通りです。

```php
# 必要なライブラリーのインポート
import numpy as np
import changefinder
import matplotlib.pyplot as plt
%matplotlib inline
```

最初に必要なライブラリーをimportします。
次に今回使用する3種類の正規分布に従う乱数を発生しさせます。

```php
data=np.concatenate([np.random.normal(0.7, 0.05, 300),
                     np.random.normal(1.5, 0.05, 300),
                     np.random.normal(0.6, 0.05, 300),
                     np.random.normal(1.3, 0.05, 300)])
```

次にChangeFinderで変化点スコアを算出します。

```php
cf = changefinder.ChangeFinder(r=0.01, order=1, smooth=7)

ret = []
for i in data:
    score = cf.update(i)
    ret.append(score)
```

最後に結果を可視化します。
赤線が元のデータ、青線が変化点スコアです。

```php
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(ret)
ax2 = ax.twinx()
ax2.plot(data,'r')
plt.show()
```

![changefinder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743453/3665539f-e625-a1e6-741b-1e24e0f242b2.png)

今回、ChangeFinderで設定したパラメータは下記3つです。

* r：忘却パラメータ（小さくすると過去の影響が大きくなり、変化点のバラツキが大きくなります）
* order：ARモデルの次数
* smooth：平滑化の範囲（長くすれば長くするほど外れ値ではなく「変化」が捉えられますが、大きくしすぎるとそもそも変化そのものが捉えづらくなります）

今回のデータセットでは、変化点が顕著に分かるため上手く検知できているように見えますが、実際私が現場のデータで使った時はパラメータチューニングに苦労しました。

##さいごに
最後まで読んで頂き、ありがとうございました。
今回は、時系列データの変化点を検知する異常検知手法のChangeFinderについてサンプルコードを確認しました。

訂正要望がありましたら、ご連絡頂けますと幸いです。
JavaScriptのテストフレームワークJasmine

##Jasmineとは？
- JavaScriptのテストフレームワーク
- RailsでいうRSpecのようなもの
- 簡単にテストを記述することができます

##そもそも何?
- JavaScriptのフレームワークテスト

##何のために?
- JavaScriptのテストコードを書くために

##メリットは?
- 簡単にJavaScriptのテストを書ける

##Jasmineの基本的な使い方
- Jasmineを利用したテストスイートは、 describe という関数から始まります。 describe には引数にテストのタイトル（文字列）と実際に実行するコードブロック（関数）を渡すことができます。


##導入方法
- 

参考にした記事（いつもありがとうございます。）
---

[JavaScriptのテストフレームワークJasmineでできる基本的なこと
](https://medium.com/@shichisan/jasmine-%E5%9F%BA%E6%9C%AC-777e765ac661)
setTimeout(func(), delay) とsetTimeout(() => func(), delay) の違い

つまづいたのでメモ

## これの違い

```js
setTimeout(func(), delay)
```

```js
setTimeout(() => func(), delay)
```

## 説明

```js
const log = () => console.log('aaa')
setTimeout(log(), 5000) // => 5sまたずに、 aaa 出力
```

ブラウザが左から解釈していくとします。
第一引数の`log()`つまり`connsole.log`を実行して、5秒後に tsでいう void、つまり何も返さずに実行されて終わります。

```js
const log = () => console.log('aaa')
setTimeout(() => log(), 5000); // => 5s待って、 aaa 出力
```

ブラウザが左から解釈していくとします。
第一引数の`() => log()`つまり`connsole.log`を実行することを定義された無名関数がセットされ、その関数が5秒後に実行されます。

## 参考

[WindowOrWorkerGlobalScope\.setTimeout\(\) \- Web API \| MDN](https://developer.mozilla.org/ja/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout)
SFINAE が使えるのは同名関数のオーバーロードに限らない

次のようなコードでキャストができず困っていたら @yaito3014 さんに教えてもらったので、メモ。

```cpp
#include <stdio.h>
class Class1 {
	lint value;

  public:
	template <typename T>
	Class1(T v = 0) : value(v) {}
	operator int() const { return value; }
};
class Class2 {
	using T = Class1;

  public:
	operator T() const { return T(334); }
};
int main() {
	Class2 ist1;
	Class2 ist2;
	if ((Class1)ist1 == (Class1)ist2) printf("Something");
	return 0;
}
```

このコードをコンパイルすると、`ist1` を `Class1` にキャストする過程で `template<typename T>Class1::Class1(T)` が呼ばれて、`Class1::value` が初期化できないので怒られる。
ここで、次のようにするとちゃんと `operator int() const` が呼ばれる。

```cpp
#include <stdio.h>
class Class1 {
	lint value;

  public:
	template <typename T, std::enable_if_t<!std::is_convertible_v<T, Class1>,
										   std::nullptr_t> = nullptr>
	Class1(T v = 0) : value(v) {}
	operator int() const { return value; }
};
class Class2 {
	using T = Class1;

  public:
	operator T() const { return T(334); }
};
int main() {
	Class2 ist1;
	Class2 ist2;
	if ((Class1)ist1 == (Class1)ist2) printf("Something");
	return 0;
}
```
こうすると `std::enable_if_t` で SFINAE が効くようになる。

SFINAE は同名関数のオーバーロード解決だけでなく、キャスト演算子とコンストラクタのオーバーロードでも効く。
tf.kerasのplot_modelをカスタマイズして情報量を増やしてみた

#はじめに
tf.kerasでモデルの可視化に使うplot_modelだが、いまいち表示される情報が少ないのでカスタマイズしてみた。ついでにクラスごとの色付けも実装。

##環境
TensoFlow : 2.2.0
tf.keras : 2.4.0
pydot : 1.4.1

#比較

オリジナルのplot_modelと比較。
本来はデフォルトでは縦にグラフができるが、記事にはまりやすいように横向きに描画してある。

##最小構成

###Before

![before.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/824193/49f30576-29c0-c225-8a31-a60082afbcdb.png)

###After

![after.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/824193/e1a76624-5cce-cb71-5b74-1f923a08391a.png)

##最大構成

###Before
![before_full.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/824193/de2d7afe-392f-a11f-c1b9-fd9d6bc2e38b.png)


###After

デフォルト
![after_full.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/824193/881a7ad6-71dc-e235-ea77-64908d600127.png)

色や付加情報のカスタイマイズ例
![after_customized.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/824193/b1484371-9bff-9330-d1b0-0b3a69beadcb.png)

##使い方

plot_modelとmodel_to_dotをカスタマイズしてあるが、一部機能を削ったり引数名を変えたりしているので、完全互換ではないが、大体同じ感じで使用できる。


引数の意味等は、Google Colabでの動作サンプルを作ったので、そちらを見てもらいたい。
クラスに対する色の割り当てや、付加情報の種類も引数で変更できるが、この辺はコードを見れば大体わかるはずなので説明は省略。

[ノートブック](https://colab.research.google.com/gist/T-STAR-LTD/3ec2bcfb20e8ce3fa5c8a337b793875c/extended-model_to_dot-plot_model.ipynb)
isTypedArrayの実装をいくつか


JavaScriptでTypedArrayかどうかを判定する方法をまとめました。
意外とどうしたらいいのかわからなくて困りましたからね。

## 1. 正規表現

正規表現を使う方法です。
babelのランタイム関数 *_unsupportedIterableToArray* でも似たような正規表現が使われていたりします。[^1]
[^1]: <https://babeljs.io/repl>で`[...""]`とか書くと確認できると思います。

この方法は今後この正規表現でカバーできないTypedArrayが追加された場合、更新する必要があります。
流石にもうない気がしますが。

また、`Object.prototype.toString`と正規表現に依存しているので、`@@toStringTag`に正規表現にマッチする文字列が入っていたら誤判定します。

```js
const toString = Object.prototype.toString;
const regexp = /^(Big)?(Uin|In|Floa)t(8|16|32|64)(Clamped)?Array$/;
const isTypedArray = (value) => (
    regexp.test(toString.call(value))
);

// 誤判定するケース
isTypedArray({
    [Symbol.toStringTag]: "BigFloat8ClampedArray"
}); // > true
```

## 2. %TypedArray%

全てのTypedArrayは`%TypedArray%`を継承しているので、`%TypedArray%`のインスタンスかを調べる方法です。
有効でない`%TypedArray%`のインスタンスもtrueなんですが、`%TypedArray%`はそもそもエラーで呼べないので`Object.create(%TypedArray%.prototype)`でないと作れません。このくらい許しましょう。

```js
const $TypedArray$ = Object.getPrototypeOf(Int8Array);
const isTypedArray = (value) => (
    value instanceof $TypedArray$
);

// 誤判定するケース
isTypedArray(Object.create($TypedArray$.prototype));
```

## 3. ArrayBuffer.isView

`ArrayBuffer.isView`を使っています。
ネイティブで\[[ViewedArrayBuffer]]を持っているか確認しているので、一番堅牢な方法だと思います。
TypedArrayとDataView以外に`ArrayBuffer.isView`がtrueを返すオブジェクトが追加されたら更新しないといけませんが、まあないでしょう。
仕様書:<https://tc39.es/ecma262/#sec-arraybuffer.isview>

```js
const isTypedArray = (value) => (
    ArrayBuffer.isView(value) && !(value instanceof DataView)
);
// 誤判定するケースは思いつきませんでした。多分ないと思います。
```

## 4. constructor

TypedArrayの配列を作ってconstructorと比較する方法です。
これだとconstructorが上書きされていたりTypedArrayを継承したクラスを判定できません。[^2]
それぞれにinstanceofするように変えてもそれ[2番目の](#2-typedarray)でよくね?となります。
[^2]: TypedArrayを継承して使うことなんてあるんでしょうかね？

また、BigInt64Arrayなどの最近の仕様にしか存在しないものは、対応していないブラウザなどでエラーが出ます。
他のを使いましょう。

```js
const typedArrays = [
    Int8Array,
    Uint8Array,
    Uint8ClampedArray,
    Int16Array,
    Uint16Array,
    Int32Array,
    Uint32Array,
    Float32Array,
    Float64Array,
    BigInt64Array,
    BigUint64Array,
];
const isTypedArray = (value) => (
    typedArrays.includes(value.constructor)
);

// 誤判定するケース
isTypedArray({
    constructor: Int8Array
}); // > true

class MyTypedArray extends Int8Array {}
isTypedArray(new MyTypedArray); // > false

// 代替案
const isTypedArray = (value) => (
    typedArrays.some(ctor => value instanceof ctor)
);
```

## typescript

最後におまけとしてTSの型を置いておきます。

```ts
type TypedArray = (
    | Int8Array
    | Uint8Array
    | Uint8ClampedArray
    | Int16Array
    | Uint16Array
    | Int32Array
    | Uint32Array
    | Float32Array
    | Float64Array
    | BigInt64Array
    | BigUint64Array
);

const isTypedArray = (value: unknown): value is TypedArray => (
    // 実装
);
```

## 参考

<https://tc39.es/ecma262/>
<https://stackoverflow.com/questions/58280379/how-to-find-the-type-of-a-typedarray>
【iOS】iOS14でSand Boxアカウントの場所が変わった

iOS13まで`設定 -> AppleID -> iTunes StoreとApp Store`にあったはずのSandBoxのアカウントの場所がiOS14から変わっていて迷いました。

#### iOS13までの場所
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305854/aa24597f-0467-1064-215f-ef134ea51dce.png" width=30%>

#### iOS14以降の場所
`設定 -> App Stpre`に移動していました！
一度アプリ経由でSandBoxにログインしないとこちらには表示されないので注意です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305854/c37afe28-e545-1648-081e-173725506d32.png" width=30%>
heroku-postgresをSSLエラーが阻む問題の解決

qlita初投稿（ボソッ）
まだまだ初心者なので至らない点があれば、すみません。
その証拠に「？」が付いている部分は用語すら怪しい部分となっております。
<small>※消せないタブ消化と自分用メモ的側面含む</small>

自己紹介すると、業務未経験独学でフロントエンド系への就職を目指しています。
最近はVueをいじっています。(NuxtやWebpackも触りたい)

初めてのexpress+Vueアプリでherokuにデプロイしようと思い、データベースもherokuに付随するHeroku Postgresを使用することにした。合わせる形でSQLもpostgreSQL。

作業し、ローカルでのSQLは成功したがHeroku Postgresに繋げようとすると<b>エラーに。</b>

`error: no pg_hba.conf ~~~~~~~~`

色々調べるに、「データベースサーバー側でpgモジュール？のpg_hba.confにSSL設定がありません。」というようなエラーらしいのだが、もちろんHeroku Postgresのサーバーファイルなんていじれるはずもない。

更に言えばheroku自体が定期的にインスタンス？が変わりアプリの動いているサーバーが変わるとのこと、（待ち受けするportもheroku指定の環境変数で動かさなければならない。）

少し調べると、「SQLのオプションでSSL通信をオフにすればいい！！」や、
真逆の「SQLを有効化してあげればいい！！」があったので試したが、変わらない。

詳しくは、SSLを有効化してしまうとエラー内容が
`error: self signed certificate`
になる。

直訳で「SSL証明書が自己証明です。」みたいな。
OFFにするとSSLにしろと言われ、ONにするとちゃんとした証明書持って来いと言われる。ただアプリ動かしたいだけなのに.....
かといってちゃんとした証明書作ってまで動かしたいとは思わなかったので、半ばあきらめていた時にようやく解決した。

<strong>----原因はまた単純でsequelizeを使用していないからだった。</strong>

素のSQLはherokuは対応していないのか、どこかで専用オプションと言われていた
`rejectUnauthorized: false`
も効かなかった。

ちょうどexpress勉強に使っていた教本にsequelizeの使用もあったのでSQLを変えるのが少し面倒だったが、やると出来た。

<strong>最終的なコード：config.json(Sequelize使うと生成される)</strong>

```config.json
"production": {
    "use_env_variable": "DATABASE_URL",
    "ssl": true,
    "dialectOptions": {
      "ssl": {
        "require": true,
        "rejectUnauthorized": false
      }
    }
  }
```

あとはごく普通に普通にSequelizeで通信を行う。
モデルの概念が面倒だったが、慣れてしまえば素のSQLより管理は簡単なのかなと思った。

・参考ページ(heroku関連のもの全て)：
https://python5.com/q/rkexxice
https://www.366service.com/jp/qa/2e5f350d001278273877ce86e68acecf
https://stackoverflow.com/questions/25000183/node-js-postgresql-error-no-pg-hba-conf-entry-for-host
https://neos21.hatenablog.com/entry/2020/08/05/080000

・Sequelize移行の為の参考
https://qiita.com/KoKeCross/items/144949ba03e5138fc6d5
https://qiita.com/cobot00/items/0bc0da1095e09bcd0d5f





あとがき：初投稿読んでくださりありがとうございました。やはり何かを初めて触る時には変にいじったから初体験するのではなく、まずサンプルのまま動かしてみるのが大事だと強く思いました.....。
Raspberry Pi にUSBマイク・スピーカーを繋ぐ

Raspberry Pi 4 Model B に　USBマイク・スピーカーを繋いでみた。
https://www.amazon.co.jp/s?k=B08CR93V6W

arecord -D plughw:2,0 test.wav

aplay -D plughw:2,0 test.wav
Cannot convert value of type 'DocumentSnapshot' to expected argument type 'QueryDocumentSnapshot'

QueryDocumentSnapshotからモデルをインスタンス化していたので、DocumentSnapshotから生成しようとするとエラーが出た。

## DocumentSnapshotとQueryDocumentSnapshotの違い
こちらの記事が分かりやすい。
https://note.com/shion_consul/n/nd45e9f385696

DocumentSnapshotは`.getDocument()`で取得する単一のデータ。ただし存在の保証はない。
QuerySnapshotは`db.collection("posts").addEventLitener()`などで取得してきたドキュメントの塊で、その一つ一つがQueryDocumentSnapshotである。QueryDocumentSnapshotはQueySnapshotの子なので存在の保証がされているっぽい。

## 本題
私のケースですとQueryDocumentSnapshotを使ってModelからインスタンスを生成していたのですが、QueryDocumentSnapshotはDocumentSnapshotを継承したクラスだったので以下のようにするとエラーは消えました。

```swift
struct Post {
   var name: String?

   init(document: DocumentSnapshot) {
        guard let data = document.data() else { return } // ここはあまり良くない書き方だと思う
        if let name = data["name"] as? String {
            self.name = name
        }
    }
}
Magic Leap Oneでハンドジェスチャーを認識する

## やること
サムズアップした手をMagicLeapが認識したら、Unityエディタ上にログが出るようにします。
動作の確認はMagicLeapとPCを繋いでZeroIterationを使って行います。

## 環境
PC : Windows10
Unity : 2019.3.7f1
Lumin SDK : v.0.24.1

## 実装

まずはGestureTrackingManagerクラスを作成します。

```c#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.MagicLeap;

  public class GestureTrackingManager : MonoBehaviour
  {
      private void Start()
      {
      }
      private void Update()
      {
      }
  }
```

使用するジェスチャーを定義し、Startで登録します。使用するジェスチャーが複数ある場合はリストにして登録しておきます。
今回はサムズアップのみ使用します。


```c#
/// <summary>使用するジェスチャー</summary>
private MLHandTracking.HandKeyPose _gesture;

private void Start()
{
    MLHandTracking.Start();

    // トラッキングするジェスチャーを登録
    _gesture = new MLHandTracking.HandKeyPose.Thumb;

    // 登録したジェスチャーのトラッキングを有効にする
    MLHandTracking.KeyPoseManager.EnableKeyPoses(_gesture, true, false);
        }
```

次は実際に認識する処理です。
下記GetGestureメソッドは指定したジェスチャーを認識したらtrueを返します。

```c#
bool GetGesture(MLHandTracking.Hand hand)
{
    if (hand != null)
    {
        if (hand.KeyPose == MLHandTracking.HandKeyPose.Thumb && hand.HandKeyPoseConfidence > 0.9f)
        {
            return true;
        }
    }
    return false;
}
```

左右どちらかの手でサムズアップしたらログを出します。

```c#
public void TrackGesture()
{
    if(GetGesture(MLHandTracking.Left) || GetGesture(MLHandTracking.Right))
    {
        Debug.Log("Hand gesture Thumb was detected.");
    }
}
```

TrackGestureメソッドをUpdateで呼び出します。
クラス全体は下記です。

```c#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.MagicLeap;

namespace Manager
{
    public class GestureTrackingManager : MonoBehaviour
    {
        /// <summary>使用するジェスチャーリスト</summary>
        private MLHandTracking.HandKeyPose[] _gestures;

        private void Start()
        {
            MLHandTracking.Start();

            // トラッキングするジェスチャーを登録
            _gestures = new MLHandTracking.HandKeyPose[2];
            _gestures[0] = MLHandTracking.HandKeyPose.Ok;
            _gestures[1] = MLHandTracking.HandKeyPose.Thumb;

            // 登録したジェスチャーのトラッキングを有効にする
            MLHandTracking.KeyPoseManager.EnableKeyPoses(_gestures, true, false);
        }

        private void Update()
        {
            TrackGesture();
        }

        private void OnDestroy()
        {
            MLHandTracking.Stop();
        }

        public void TrackGesture()
        {
            if (GetGesture(MLHandTracking.Left) || GetGesture(MLHandTracking.Right))
            {
                Debug.Log("Hand gesture Thumb was detected.");
            }
        }

        bool GetGesture(MLHandTracking.Hand hand)
        {
            if (hand != null)
            {
                if (hand.KeyPose == MLHandTracking.HandKeyPose.Thumb && hand.HandKeyPoseConfidence > 0.9f)
                {
                    return true;
                }
            }
            return false;
        }
    }
}
```

コンソールに以下のようなログが出ます。
![スクリーンショット 2021-01-08 195648.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626158/94ec8fd1-fd6b-5fc3-7722-6bd58ae54775.png)
Unityエンジンに表示される頂点が多すぎるのはなぜですか？

今回の主な話題：UVの継ぎ目の解決する方法、Unityにインポートした後に頂点/面の数が変更された原因、アニメーションオブジェクトのスムーズさを改善する方法、Socketを使用してネットワークプロトコルの送受信戦略を処理する方法。

---
###エディター
Q1: 同じモデルがUnityに表示される頂点と面の数は、3dsMAXに表示される頂点/面の数よりはるかに多くなりますが、これがなぜですか？
>問題主はUnity公式のドキュメントを参照できます。
https://docs.unity3d.com/Manual/FBXImporter-Model.html
https://docs.unity3d.com/Manual/class-Mesh.html

>最後の段落に、

>``The Unity Editor shows too many vertices or triangles (compared to what my 3D app says)
This is correct. What you are looking at is the number of vertices/triangles actually being sent to the GPU for rendering. In addition to the case where the material requires them to be sent twice, other things like hard-normals and non-contiguous UVs increase vertex/triangle counts significantly compared to what a modeling app tells you. Triangles need to be contiguous in both 3D and UV space to form a strip, so when you have UV seams, degenerate triangles have to be made to form strips – this bumps up the count.``
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/c6349134-dda1-162e-8b9e-ade5ad375b70.png)

---
###制作
Q2: 3DモデルをUnityにインポートした後、UVの継ぎ目は明らかに見えましたが、モデリングソフトでの表示は正常であり、UV展開が正しいことを確認できます。これはなぜですか？
>これはMipmapが原因である可能性があります。 テクスチャは自動的にスケーリングされるため、エッジの情報が不足しているため、継ぎ目が明らかになります。 インポート設定でMipmapを閉じて、まだ問題があるかどうかを確認できます。

>別の方法は、UVエッジの外側に数ピクセル拡張することです。たとえば、1024 * 1024のテクスチャエッジは8ピクセル外側に拡張します。

---
###レンダリング
Q3: アニメーションオブジェクトのエッジを滑らかにしたいので、設定は次とおります。MSAAはもうオンになっていて、Rendering設定で8xアンチエイリアスを使いました。ただし、シーン内の静的オブジェクトのエッジは比較的滑らかですが、アニメーションオブジェクトは明らかなギザギザのエッジがあります。 滑らかさを改善し続ける方法は？
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/071a06fb-7ef6-19b8-b6c4-158fa1e52323.png)
>問題主はHDRをオフにして、改善するかどうかを確認できます。 Intel GPUで、HDRとMSAAをともに使用する場合、いくつかの問題を引き起こす可能性があります。 さらに、MSAAの代わりに[Post Processing Stack](https://docs.unity3d.com/Manual/PostProcessing-Stack.html)を使用できます。

---
###アセット管理
Q4: CommandBuffer.DrawMeshを使用してもSetPass Callsを減らすことができません。Renderで直接レンダリングすることと異なり、同じマテリアルを使用しても、SetPass Callsを減らすことはできません。Unityはマテリアルによって並べ替える機能を開けますか？
>メッシュは単なる仮想概念であり、本質的には点、三角形、およびその他の属性です。Rendererも「直接レンダリング」ではありません、StaticBatchingもDynamicBatchingも、Unity自体が複数のMeshを合併し、一緒にDraw Callすることであります。
したがって、問題主の質問に対して、マテリアルの同じMeshを合併し、CommandBuffer.DrawMeshをコールすれば大丈夫はずです。

---
###ロジックコード
Q5: UnityでC#のSocketを使用してネットワークプロトコルの送受信を処理する場合、独立スレッド処理、または非同期メソッド（BeginReceiveなど）を使用することのどちらが効率的ですか？
>一般的な方法は、独立スレッド+非同期です。メインスレッドに配置せれば必ず他の論理シーケンスによって制限され、処理は遅延になります。非同期性も同じで、繁な読み取りを減らし、最下層に処理により簡単な状態を与えます。

>Writeは通常、メインスレッド+非同期の方法で行います。Writeにはタイムリーな処理の問題がなく、単独にスレッドを設定する必要はありません、データのメンテナンスを減らすこともできます。非同期は、異常な状況がメインスレッドで妨害するのを防ぐことができます。

---
UWA Technologyは、モバイル/VRなど様々なゲーム開発者向け、**パフォーマンス分析**と**最適化ソリューション**及び**コンサルティングサービス**を提供している会社でございます。

UWA公式サイト：https://jp.uwa4d.com
UWA公式ブログ：https://blog.jp.uwa4d.com
【Ruby On Rails】update_columnを使って、計算した結果をinteger型のカラムへ更新する方法

備忘録です。

# updateとupdate_columnについて
テーブル内の情報を更新する際に、レコードを更新したい場合はupdateメソッドを使います。
しかし、特定のカラムだけを更新したい場合は、updateは使えません。
そこで、update_columnを使用します。



# 使用例

前提として、usersテーブル：post_countという投稿回数をカウントするinteger型のカラムがあることとします。

ユーザーが投稿する度に、投稿回数（=post_count）が加算されていくものは以下の通りです。

```ruby
    sum = current_user.post_count.to_i + 1
    current_user.update_column(:post_count, sum.to_i)
```

初期値がnilの場合もしっかりと足し算ができるように、to_iを付けています。
カラムがnilの状態で、to_iを付けずに実行すると以下のようなエラーが出ます。


undefined method `+' for nil:NilClass
![スクリーンショット 2021-01-08 19.27.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/770386/5a809e56-3756-076e-ee89-e632ef4f9d14.png)

to_iをしてあげることで、nilを0という数字として認識させることができ、計算ができます。


# 参考記事
https://qiita.com/lemtosh469/items/371544fa4fd3c333adf1
https://teratail.com/questions/19963
【PHP】mb_substr()はなぜ遅いのか

# 簡単なまとめ
* PHPの `mb_substr()` はあんまり速くない
* 長い文字列を与えて末尾の方を取り出そうとするとすげー遅い
  * 先頭部分を取り出すなら別に問題ない
* どうしても長い文字列をカットしたければ別の方法を使おう
* 無理やり分割するときは文字の境界に気をつけてね

検証環境: PHP 8.0.1

# 検証
65万文字（ASCII文字のみ）の文字列を用意して、 `mb_substr($文字列, 開始位置, 1)` が要する処理時間を計測しました。（使ったコードは[Gist](https://gist.github.com/netebakari/88bc4db8a39180626d9b3023740daa2d)に置いてあります）
ところどころに怪しいぴょこぴょこが見えますが、見事に線形になっています。終わりの方ではたかが **文字列から1文字取り出すだけ** の処理1回が1msを超えてしまいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618258/fbd12110-1041-c9cf-f232-6e6d874d039e.png)

つまり「任意の文字列を先頭から末尾まで1文字ずつ切り出して文字種をチェックする」という処理に `mb_substr()` を使うと、かかる時間は **文字数の2乗** に比例します。10,000文字の文字列を処理するには1,000文字のときの**100倍**の時間がかかるということです。

# なんで？
PHPは文字列をただのバイト配列として[保持します](https://www.php.net/manual/ja/language.types.string.php#language.types.string.details)。そしてUTF-8では1文字のバイト長が可変なのでした。そこで次の例題を考えます。

【Q】 `ABCあいうαβγかきく` という文字列から「10 **文字**目以降（`かきく`）」が欲しいとします。何**バイト**目から切り出せばいいでしょうか？　文字列のエンコーディングはUTF-8だとします。
【A】 先頭から順に数えていくしかありません。`ABC`は1文字1バイト、`あいう`は1文字3バイト、`αβγ`は1文字2バイトですから、先頭18バイトを除いて19バイト目から取り出します。これは面倒くさい！

したがって、 `mb_substr()` に「50万文字目」という無茶な値を突っ込むと、 `mb_substr()` は内部[^1]で `mbfl_string()` という関数[^2][^3]を呼び出して愚直に先頭から文字数とバイト数のカウントを始めます。 `mb_substr()` を1,000回呼ぶと同じ処理が1,000回走ります。そりゃー遅いよね、という話でした。

# どうすればいいのか
## 文字数を制限する、文字列を分割する
長さ制限を加えてしまうというのが一つの手です。
改行もデリミタもない、ながーーーーーい文字列をPHPで処理しなくてはならないという状況は割とレアでしょうから（Webアプリの場合それはDoSアタックの可能性があります）、適当に制限をかけるなり、 `explode()` するなりでだいたいの問題は解決するはずです。

改行やデリミタのような手がかりがないなら一定サイズごとに無理やり分割することになりますが、たとえば「あ」（UTF-8では `0xE3 0x81 0x82`）の真ん中で切ってしまったりすると困ります。切り方には気をつけないといけません。

## 特定の文字種・エンコーディングを前提に処理を書く
処理対象の文字列がASCII文字だけで構成されていることが確実なのであれば（正規表現を使ってチェックしましょう） `substr()` で同じ結果を得られます。

## preg_splitで分解する
「任意の文字列を先頭から末尾まで1文字ずつ切り出す」をやりたいなら、

```php
$arr = preg_split('//u', $str, -1, PREG_SPLIT_NO_EMPTY);
```
で文字列を1文字ずつにバラして配列にできます。こちらの方が圧倒的に高速です。

## 長さ固定のエンコーディングを使う
ここまでで分かった通り、1文字の長さが可変であるUTF-8を使うから時間がかかるわけです。1文字の長さが固定[^4]のエンコーディング、たとえばUTF-32を使えば爆速になります（文字種をチェックしなくても `文字数×定数` でバイト長が直接出せるため）。

```php
$longString_utf8 = "...."; // なんか長い文字列
$longString_utf32 = mb_convert_encoding($longString_utf8, "UTF-32");
$len = mb_strlen($longString_utf8); // mb_strlen($longString_utf32, "UTF-32") でも同じ
for($i = 0; $i < $len; $i++) {
    $char_utf32 = mb_substr($longString_utf32, $i, 1, "UTF-32"); // エンコーディングを明示的に指定する
    $char_utf8 = mb_convert_encoding($char_utf32, "UTF-8", "UTF-32"); // これで1文字ずつが取れる
    // あとはchar_utf8 を使って好きなことをやる
}
```

なお、こうするとお手軽に高速になりますがおそらく地獄のような状況を招きます（やめましょう）

```php
mb_internal_encoding("UTF-32");
```

# 補足
何か間違いなどあればコメントで教えてください。よろしくお願いします。


[^1]: https://github.com/php/php-src/blob/PHP-8.0.1/ext/mbstring/mbstring.c#L2123
[^2]: https://github.com/php/php-src/blob/PHP-8.0.1/ext/mbstring/libmbfl/mbfl/mbfilter.c#L919
[^3]: この関数は `mb_strlen()` も使っています
[^4]: 結合文字や異体字セレクタを考えると全然固定ではないのですが、ここでは説明を省きます……
「Pythonで連立一次方程式を解く(掃き出し法と分数表現)」を参考にWolframAlphaでやってみた。

(オリジナルポスト)

https://qiita.com/asana_yui/items/89832a2435408223ace2

##WolframAlphaで
###mat1.txt
####入力解釈:

https://www.wolframalpha.com/input/?i=%E6%8E%83%E3%81%8D%E5%87%BA%E3%81%97%E6%B3%95%E8%A8%88%E7%AE%97%E6%A9%9F&assumption=%7B%22F%22%2C+%22ReducedRowEchelon%22%2C+%22theMatrix%22%7D+-%3E%22%7B%7B4%2C+2%2C+1%2C+26%7D%2C+%7B1%2C+6%2C+3%2C+48%7D%2C+%284%2C+1%2C+5%2C+34%29%7D%22&lang=ja

(4 | 2 | 1 | 26
1 | 6 | 3 | 48
4 | 1 | 5 | 34)
####結果:
(1 | 0 | 0 | 30/11
0 | 1 | 0 | 64/11
0 | 0 | 1 | 38/11)

近似値
(1 | 0 | 0 | 2.72727
0 | 1 | 0 | 5.81818
0 | 0 | 1 | 3.45455)

###mat2.txt 何かおかしいですね？
####入力解釈:

https://www.wolframalpha.com/input/?i=%E6%8E%83%E3%81%8D%E5%87%BA%E3%81%97%E6%B3%95%E8%A8%88%E7%AE%97%E6%A9%9F&assumption=%7B%22F%22%2C+%22ReducedRowEchelon%22%2C+%22theMatrix%22%7D+-%3E%22%7B%7B3%2C6%2C9%7D%2C+%7B6%2C12%2C18%7D%7D%22&lang=ja

(3 | 6 | 9
6 | 12 | 18)
####結果:
(1 | 2 | 3
0 | 0 | 0)

###mat3.txt 何かおかしいですね？
####入力解釈

https://www.wolframalpha.com/input/?i=%E6%8E%83%E3%81%8D%E5%87%BA%E3%81%97%E6%B3%95%E8%A8%88%E7%AE%97%E6%A9%9F&assumption=%7B%22F%22%2C+%22ReducedRowEchelon%22%2C+%22theMatrix%22%7D+-%3E%22%7B%7B1.0%2C+2.0%2C+3.0%7D%2C+%7B0%2C+0%2C+0%7D%7D%22&lang=ja

(1 | 2 | 3
0 | 0 | 0)
####出力
(1 | 2 | 3
0 | 0 | 0)
自分的"よく使うけど覚えられない"Dockerコマンドまとめ

よく使うけどなぜかすぐ忘れる（個人的見解）dockerコマンドのコピペ用記録です。

###ポートを指定してコンテナ起動

iは標準入力、tはtty割り当て、dはバックグラウンド実行のオプション

```
docker run -it --name <コンテナ名> -d -p 80:80 <イメージ名>
```

###コンテナのIPアドレスを取得

```
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <コンテナ名>
```

###コンテナの状態を確認
９割方コンテナのボリュームマウント状態を見るために使うけど、それならきっとマウントのみ確認するオプションがあるんだろうな。（調べるの面倒でgrepしてる）

```
docker inspect <コンテナ名>
```

###コンテナ一括削除

$()の中身を変更して代用もでき便利（なのにすぐ忘れる）

```
docker rm $(docker ps -aq)
```

###今あるコンテナのイメージ化
コンテナ起動を失敗した時の切り分けに役立つ。

```
docker commit <コンテナID> <任意のイメージ名>
```
Clojure の競プロ等での入力周り

# 概要
　競プロだと、主に文字列の入力や数の入力、文字の入力等が多いと思います。そのときに split したり等いろいろで迷うことが多いので簡単にまとめてみました。

# 数
　数の入力には `(read)` がそのまま使えます。

#### 入力

```
1 2
```

#### コード

```clojure
(prn (read))
(prn (read))
```

#### 出力

```
1
2
```

# 文字列
　単純に `(read)` するとシンボルになってしまいます。
## 一行に一つの文字列
　一行まるごと読むのであれば `(read-line)` でできます。

#### 入力

```
Hello
Good Bye
```

#### コード

```clojure
(prn (read-line))
(prn (read-line))
```

#### 出力

```
"Hello"
"Good Bye"
```

## 一行に複数の文字列
　先程の `Good Bye` を `"Good"` と `"Bye"` に分けて入力したい場合は split します。split して帰ってきたシーケンスは分配束縛するとよいでしょう。

#### 入力

```
CL Clojure Scheme Arc
C C++ C#
```

#### コード

```clojure
;clojure.string から split をインポート
(use '[clojure.string :only (split)])

(let [[a b c d] (split (read-line) #"\s+")]
  (prn a)
  (prn b)
  (prn c)
  (prn d))

(println "")

(let [[a b c] (split (read-line) #"\s+")]
  (prn a)
  (prn b)
  (prn c))
```

#### 出力

```
"CL"
"Clojure"
"Scheme"
"Arc"

"C"
"C++"
"C#"
```

#### 説明
　`split` は `(split s re)` のように使います。 `s` には対象となる文字列、 `re` には区切りにマッチする正規表現を引数とします。 `#"\s+"` は一文字以上の任意の長さの空白列にマッチする正規表現です。

# その他
## 文字列と整数が同じ行にある
　`split` してから、整数であるものを `Integer.` で文字列から整数に変えます。

#### 入力

```
Galaxy Express 999
```

#### コード

```clojure
;clojure.string から split をインポート
(use '[clojure.string :only (split)])

(let [[a b c] (split (read-line) #"\s+")
       d (Integer. c)]
  (prn a)
  (prn b)
  (prn d))
```

#### 出力

```
"Galaxy"
"Express"
999
```

# おわりに
　Clojure 遅いしメモリ食うなぁと思っています。 ABC の A とかでも制限がきついと MLE 等をしたりするので、 AtCoder でハンデをつけるなり、高速化するなりしてほしいなと思っています。誤っているところや改善点などがあれば、編集リクエストやコメントなどをしてくれると幸いです。
EKSにhelmでPrometheusをデプロイする


## パッケージダウンロード
https://github.com/prometheus-community/helm-charts

```
git clone git@github.com:prometheus-community/helm-charts.git
```

## リポジトリ登録

```
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
```

## リポジトリ登録確認
```
helm repo list
```

出力

```
prometheus-community    https://prometheus-community.github.io/helm-charts
```

## ディレクトリ移動
```
cd helm-charts/charts/prometheus
```

## デプロイ
- value.yamlでNodeExportの設定が`true`になっているので、デフォルトでNodeExporterも構成される


```
helm install prometheus prometheus-community/prometheus
```

## 接続
```
export POD_NAME=$(kubectl get pods --namespace default -l "app=prometheus,component=server" -o jsonpath="{.items[0].metadata.name}")
kubectl --namespace default port-forward $POD_NAME 9090
```

## 動作確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/d798b2ae-c063-cbae-4e17-4a30274bed7c.png)