OmniAICreator/Qiita-1.07M huggingface dataset:
【Android-Codelabs】4/36 〜 アプリのアイコンをImageAssetを使って変更する 〜

2019年にGoogleから，Web上でAndroidを学べるコースが提供されました．([Android Kotlin Fundamentals Course](https://codelabs.developers.google.com/android-kotlin-fundamentals/))
この記事では，そのコースを実際にやってみてアウトプットしてみるといった内容です．
何かツッコミなどあれば編集リクエストかコメントかTwitterでいただければ修正いたします 

#今回学ぶこと
アプリのランチャーアイコンを変更する方法

#目指す成果物

まずシンプルなアプリを作成します．
そしてアプリのランチャーアイコンを，AndroidStudioで用意されているImageAsset（イメージアセット）に置き換えてみます．

![1-4-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249786/c60c5522-46ab-6e0b-d95b-057c83feed5d.png)


#ステップ
###1.　ランチャーアイコンの変更
ランチャーアイコンを変更するには，ImageAssetという機能が使われます．

まず，`res`フォルダをCtrl+クリックします．
[New]>[ImageAsset]を選択するとこのようなダイアログが表示されます．

![1-4-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249786/7cae021c-502b-7e73-8059-ff93fc21227f.png)


①Asset Typeを`Clip art`を選択して，②Clip Artを選択します．
するとこのようなダイアログが表示されるので，ここでは適当なデザインを選択して，`OK`をクリックしましょう．

![1-4-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249786/29d612cf-41a1-fe66-ae11-46b0e3951dc5.png)


`NEXT`をクリックして，アイコンファイルが上書きされるファイルが表示されます．
`Finish`をクリックします．

AVDエミュレーターまたはデバイスでアプリを実行してみましょう．

![1-4-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249786/f7e4ae05-aa34-e5c9-6b98-a8d4cf624a4d.png)


アプリが新しいアイコンになりました．

#参考資料
###CodeLabs by Google
https://codelabs.developers.google.com/android-kotlin-fundamentals/
<img width="1206" alt="スクリーンショット 2020-01-31 3.41.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249786/e3064461-649d-8535-4fc3-79a68f40709a.png">
Linuxで、特定ホスト・特定ポートへの通信を試みる (/dev/tcp/hostname/port編)

echo > /dev/tcp/\${HOSTNAME}/\${PORT}
で、対象ホストのTCPポートとの疎通確認が行える。
疎通OKの場合、何も返ってこないので、以下のように && echo "OK" のように、OKだった場合の応答を定義してあげるのがよいかもしれない。

```
sh-4.2$ echo > /dev/tcp/$DATABASE_SERVICE_NAME/3306 && echo "OK"
OK
sh-4.2$ echo > /dev/tcp/$DATABASE_SERVICE_NAME/3305 && echo "FAIL"
sh: connect: No route to host
sh: /dev/tcp/quotesdb/3305: No route to host
```


# 参考
参考というか、以下のリンクがあればこの記事要らない・・・(笑)
https://qiita.com/_oba23_/items/e3038d8f388aa435b7d8
JavascriptのDate.prototype.toString()系まとめ

new Date()からタイムスタンプを作ってファイル名にしたい時、どのフォーマットにするか毎回調べてるのでまとめる

| メソッド　　　　　　　　　　　　　　　                        | 出力される文字列　　　　　　　　　　　　　　　　　　　　　| 備考|
|:------------------------------------------------------|:-----------------------------------------------|:---
| new Date('2000-01-01 00:00:00').toString()            | "Sat Jan 01 2000 00:00:00 GMT+0900 (日本標準時)" |  |
| new Date('2000-01-01 00:00:00').toISOString()         | "1999-12-31T15:00:00.000Z"                     |  |
| new Date('2000-01-01 00:00:00').toLocaleString()      | "2000/1/1 0:00:00"                             |  |
| new Date('2000-01-01 00:00:00').toGMTString()         | "Fri, 31 Dec 1999 15:00:00 GMT"                |非推奨　.toUTCString()を使う|
| new Date('2000-01-01 00:00:00').toUTCString()         | "Fri, 31 Dec 1999 15:00:00 GMT"                |  |
| new Date('2000-01-01 00:00:00').toDateString()        | "Sat Jan 01 2000"                              |  |
| new Date('2000-01-01 00:00:00').toLocaleDateString()  | "2000/1/1"                                     |  |
| new Date('2000-01-01 00:00:00').toTimeString()        | "00:00:00 GMT+0900 (日本標準時)"                 |  |
| new Date('2000-01-01 00:00:00').toLocaleTimeString()  | "0:00:00"                                      |  |

おまけ
moment.jsでお手軽にタイムスタンプを作りたいとき(よくやる)

```js
// const moment = require('moment');
import moment from 'moment';
const now = moment().format('YYYY-MM-DD HH:mm:ss.SSS');
now; // 2000-01-01 00:00:00.000
```
hourを00~23で表したいときは、大文字でHH
小文字でhhだと1~12になってしまう
データサイエンティスト育成講座　Chapter4　1日目

少し油断をすると一気に間が開いてしまう。
なんとか、通常運行に戻さなければ！ということで、Chapter4に突入です。
Chapter3の演習問題で頭を抱えてしまった部分があったため、時間がかかりました。

※問題の答えに自信がもてない時に答え合わせが出来ないのは少々辛いであります。いい方法を知っている人は教えてくださいませ・・・

## 確率のお勉強

確率や集合に関する知識が問われるわけだが、正直全くと言って自信がない。
A ∩ B や A ∪ B
なんて、なんだったっけ。。って感じだった。Uみたいなやつが"または"だね。Unionと覚えればわかりそうだ。尤度とか全く覚えていないけれど。

### 練習問題1
コインの確率を求める問題。
これ自体は、先に出て来ている内容とほぼほぼ同じなので特に問題なし

```
coin = np.array([0, 1])
random.seed(0)
tos_count = 1000
coin_result = random.choice(coin, tos_count)
print("0が出る確率", len(coin_result[coin_result==0])/tos_count)
print("1が出る確率", len(coin_result[coin_result==1])/tos_count)
```
### 練習問題2
くじ引きの問題を考えます。1000本のくじの中に、100本のあたりがあるとします。AくんとBくんが順にくじを引き、AくんとBくんともにあたりを引く確率を求めてください。ただし、引いたくじは戻さないとして、それぞれ1回のみ引きます。（これは手計算でも大丈夫です。）

うーん、ひいたくじは戻さないということは、確率は常に変化し続けるということなのか。
とりあえず組んでみた

```
np.random.seed(0)
# 0を外れ、1をあたりとして配列を作成する
lott = np.array([0]*900+[1]*100)
result = np.array([])
while len(lott) >= 2:
    # くじ引き
    # あたりの場合は後ろから要素を削除。外れの場合は前から要素を削除
    result_a = np.random.choice(lott, 1)
    if result_a == 1:
        lott = np.delete(lott, len(lott)-1)
    else:
        lott = np.delete(lott, 0)
    
    result_b = np.random.choice(lott, 1)
    if result_b == 1:
        lott = np.delete(lott, len(lott)-1)
    else:
        lott = np.delete(lott, 0)
    
    # 二人ともあたりの場合はresultに1を追加。それ以外は0を追加
    if result_a == 1 and result_b == 1:
        result = np.append(result, 1)
    else:
        result = np.append(result, 0)

print("AとBがあたりが出る確率", len(result[result==1])/len(result))
```

結果からすると、多分間違ってはいないんだろうけれど、解き方としては間違っている気がする。
なんか、もう少しうまくエレガントな方法があるに違いないんだけれど、とりあえずPythonに慣れるという意味では解いた。

模範解答が欲しいです。。。
Kali Linux 2020.1をHyper-Vにインストールした際の初期設定(日本語化/画面サイズ)

## Kali Linux 2020.1をHyper-Vにインストールした際の初期設定(日本語化/画面サイズ)

Kali 2020.1をHyper-Vにインストールして日本語化してフルスクリーンで使えるようにするまで。
このバージョンからUIなど色々と変わっていたので下記の記事を参考にさせてもらい設定を行いました。

[Kali Linux ver2019.4の導入と日本語化](https://qiita.com/serion253/items/86a1d351462922c53846)
[Hyper-V上のUbuntuの解像度を変更する](https://qiita.com/12yzero/items/2469a97ff9242d7e153b)

### フォントの修正

インストール時に日本語を選択したにも関わらず起動したら文字化け状態なので
フォントを入れ直す必要がありました。

```shell
$sudo apt-get update
$sudo apt-get remove fonts-vlgothic
$sudo apt-get install fonts-vlgothic
```
上記コマンド後に再起動すれば、文字化けは解消されました。

### かな漢字変換をインストール

他にも使えると思いますが、上記の記事に倣ってibusをインストールします。

```shell
$sudo apt install ibus-anthy
$sudo apt install zenity
$sudo im-config
```

zenityが何かわかりませんが、これをインストールしないとim-configが利用できないので
何も考えずにインストールしています。
あとは、変換システムをibus-anthyに設定して再起動します。


### スクリーンサイズの変更

フルスクリーンで使用したいので、画面サイズを1920x1080に設定します。
Hyper-Vでは、ディスプレイ設定から変更ができないようです。

```shell
$ sudo vim /etc/default/grub
```
grubの設定ファイルを開き、下記の箇所を変更します。

`GRUB_CMDLINE_LINUX_DEFAULT="quiet"`
↑を↓に
`GRUB_CMDLINE_LINUX_DEFAULT="quiet splash video=hyperv_fb:1920x1080"`

こういう設定値はどこでわかるんだろう。

最後に、grubをアップデートしてから再起動します

```shell
$ sudo update-grub
```

これで使えるようになりました。
pixabay検索結果のnot found画像を非表示にする方法

#pixabayのnot found画像は本当に怖い
フォトバッシュの素材探しやブログ運営などでpixabayを利用している方ならわかって頂けると思います。本当に怖いんです。
<img width="560" alt="例の画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579213/7cb05106-e042-56b4-8d93-4605c5055ef9.png">

検索した際に不意に表示されて非常に怖いので、今回はこれを非表示にしたいと思います。

#実際の方法
ページ内の該当する画像をお使いのアドブロックでブロックすればOKです。

あの画像のURL(閲覧注意)

`https://pixabay.com/static/img/faces.jpg`

このURLをアドブロックのNGリストに追加してください。
自分の使っているUBlock Originでは「Myフィルター」がこれにあたります。
![2020-02-04_00h11_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579213/25681134-c941-e695-e9ab-be0e0df1a7a9.png)



すると、以下のようにnot found画面が表示されるようになります。これでスペルミスで検索してしまったりしても安心です。

<img width="560" alt="非表示後" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579213/e355dc05-cb91-c6c3-b487-2a5375061a10.png">
【Unity】ZenjectとADX2を導入すると初期化エラーが起きる問題の対処法【ADX】【Zenject】

# 概要
いくつかのプラグインを組み合わせると発生する特有の問題。
今回はADX2とZenjectを使っていて起きた問題とその対処法を紹介します。


# 結論
解決方法は2択
1. ScriptExecutionOrderの値をいじってZenjectより早く実行させてしまう（脳筋）
2. ProjectContext 内にCriWare ErrorHandler とCriWareInitializerコンポーネントを配置(多分こちらがスマート)


# 前提
UnityのサウンドミドルウェアといえばADX2 とWwiseだと思います。（FMODくん…ごめんな）
UnityのDIコンテナといえば「~~Extenject~~ Zenject [*1](#参考) 」ですね。

特にADX2と自分のアプリケーションの橋渡しとなる「オレオレAudioManager/SoundManager」。
このオレオレSoundManagerはアプリのどこからでもアクセス出来るようにSingletonパターン（俗にいうSingletonMonoBehaviour）で作ることが多いです。
Singletonパターンで作ると依存性や参照がいたるところにあって保守性や拡張性で問題が出てくる為、DIコンテナを導入して極力Singletonパターンをものを減らすのはよくあると思います。

そこで「プロジェクト全体でアクセスされる」要素であるオレオレSoundManagerをProjectContextでBindするのは至極当然の流れかと思います。

# 問題
ProjectContext以下でBindしたオレオレSoundManager。
このオレオレSoundManagerがADXを利用していて、ADXの初期化を行おうとすると以下のエラーが出ます。

<img width="745" alt="スクリーンショット 2020-02-03 19.54.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65257/ef83deb0-b57f-38dd-a3e6-998812d93f4b.png">


ざっくり説明すると「ADX2のプラグインが初期化されてません」ということです。
ちゃんとHierarchyには初期化のオブジェクトもありますが、このエラーは発生します。
<img width="284" alt="スクリーンショット 2020-02-03 19.56.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65257/5ad0e4b0-3483-5ed4-a100-b25a2a02ad7a.png">



# 解決方法
## ScriptExecutionOrder
そこでUnityのスクリプトの実行順であるScriptExecutionOrderを見てみると
初期設定は以下のようになっています。
<img width="520" alt="スクリーンショット 2020-02-03 19.44.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65257/a90c1b66-ebf7-c9d1-2e80-500d0b0ae1b4.png">

よくあるプラグイン同士の初期化順の取り合いによる問題です。
ADXの **初期化** に関しては別に早ければ早いほど良いので **Zenject の初期化より早く** 設定します。
ただ、通常動作に関してはそのままで良いので変更しないことをお勧めします。

結果、以下のように設定すると初期化の問題を解消できます。
<img width="516" alt="スクリーンショット 2020-02-03 19.57.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65257/749bba3e-08c2-52b2-590f-3b1aed21bde1.png">

## ProjectContext で頑張る
結局のところ初期化さえしてしまえばいいので、いっそのことProjectContextにCRIWAREの初期化コンポーネントを配置してしまう戦法です。
<img width="712" alt="スクリーンショット 2020-02-03 19.56.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65257/5ef0084c-7db8-89ce-f18e-370b53612b21.png">


# 最後に
外部のプラグインやミドルウェアを入れると開発効率が上がったり、車輪の再発明をしなくて良かったり恩恵は大きいです。
しかし、このようなプラグインの組み合わせ依存の問題は「やってみないとわからない」のが現実です。
このような現象に起きた時は「**まずエラー文を正しく読む**」ことが非常に重要です（初心者さんとかは英語読まないことが結構多いです）。
また、どうしても解決できない場合は、そのプラグインの提供者さんに質問やIssueをあげると良いかと思います。


# 参考

*1 Extenject は2020年1月現在、依然として裁判中のため、元であるZenjectを使うのが無難です(本家は全く更新されてませんが)
https://github.com/svermeulen/Extenject
ZipArchiveで突然"ZipArchive::addFromString(): Invalid or uninitialized Zip object"が出る様になった話

# はじまり
ZipArchiveで以下の様なコードを実行していたが、``yum update`` でPHP等のアップデートを行ってから急に``ZipArchive::addFromString(): Invalid or uninitialized Zip object`` が出て正常に動作しないようになった。

```php
<?php
$zip = new ZipArchive;
$zip->open(tempnam(sys_get_temp_dir(), 'foo-'), ZipArchive::CREATE);
$zip->addFromString('bar.txt', 'hogehoge');
$zip->close();
```

調べてみると ``$zip->open()`` の部分で失敗している様子。

# 原因の調査
## PHPの確認
アップデート前のサーバがたまたまあったので、適当なコードを書いて比較してみることにした。
CentOS 7でPHPはremi-php72でインストール。

``` php:検証用コード
<?php
$zip = new ZipArchive;
var_dump($zip->open(tempnam(sys_get_temp_dir(), 'foo-'), ZipArchive::CREATE));
var_dump($zip->open(sys_get_temp_dir().'foo.zip', ZipArchive::CREATE));
```

### PHP 7.2.26
```bash
$ php test.php
bool(true)
bool(true)
```
どちらも通る。

### PHP 7.2.27
```bash
$ php test.php
int(19) 
bool(true)
```

tempnam()を使っている方が通らなくなった。
**int(19)** はzip archiveでは無いファイルを開こうとした場合に返ってくるエラーコードの模様。しかし、そもそも空のファイルのはず…

PHPのソースコードでzip関連のコミットログを追いかけて見るも怪しい箇所は見つからず。PHPでは無くlibzipに原因があるのかもと思い確認してみる。

## libzipの確認
### PHP 7.2.26

```bash
# yum list installed php libzip5
libzip5.x86_64                   1.5.2-1.el7.remi                    @remi-safe
php.x86_64                       7.2.26-1.el7.remi                   @remi-php72
```

### PHP 7.2.27
```bash
# yum list installed php libzip5
libzip5.x86_64                   1.6.0-1.el7.remi                    @remi
php.x86_64                       7.2.27-1.el7.remi                   @remi-php72
```

GitHubのリポジトリで[変更内容](https://github.com/nih-at/libzip/blob/3abeb435075cb79da29f036175639c2ed4e59f01/NEWS.md)を確認する。

>1.6.0 [2020-01-24]
>
>    Avoid using umask() since it's not thread-safe.
>    Set close-on-exec flag when opening files.
>    Do not accept empty files as valid zip archives any longer.
>    Add support for XZ compressed files (using liblzma).
>    Add support for cancelling while closing zip archives.
>    Add support for setting the time in the on-disk format.

ん…？

> Do not accept empty files as valid zip archives any longer.
> Do not accept empty files as valid zip archives any longer.
> Do not accept empty files as valid zip archives any longer.

[該当部分の変更内容](
https://github.com/nih-at/libzip/commit/d10098634b790a2b696c73fefa3f391c5f8d28ac)を確認するかぎり、libzipの仕様が変更になったとわかる。

# まとめ
ZipArchiveの使い方によっては不具合が出る場合がある。ただしバグではなく仕様変更なので元に戻ることは期待できない。
…と思っていたら[PHP 7.4.5で対応された](https://bugs.php.net/bug.php?id=79296)ようだ。PHP 7.2系には現時点でバックポートされていないが、そのうち対応されるのかも。

ダメでした。PHP 8より後で正式に非対応となることが決まったようです。https://www.php.net/manual/ja/migration80.deprecated.php#migration80.deprecated.zip
Nuxt.jsに力技で（パッケージを使わずに）gaを導入する

# はじめに

ある日のできごと・・・

PM「おーい、今回のサービス、お客さんがGA取り入れたいらしいから実装してくれー」

ワイ「（パッケージ※入れれば楽勝なんで）いっすよ」
※https://note.com/koushikagawa/n/n7b8b1b86fab0 参照

PM「あ、ちなみにtoB向けのマルチテナントサービスだから、ドメインごとに違うトラッキングID適用できるようにしといてー」

ワイ「・・・ええええええええええええええええええええええええええええええええええええええええええええええええええええええええ！！！！！！！』


・・・てなわけで、ドメインごとにトラッキングIDを切り替えなければならないため、npmのパッケージを使わずにGAを実装することとなったワイ氏

正直結構苦戦したので、同じように苦しんでる人向けに実装方法を残します・・・

# 参考
Nuxt公式を参考に実装しました。
https://ja.nuxtjs.org/faq/google-analytics/

# やり方
\plugins配下に以下のファイルを作成

```javascript:ga.js

export default ({
  app,
  store,
  route
}) => {
　// 本番環境以外は無効
  if (process.env.name !== 'production') return

  // Google アナリティクスのスクリプトをインクルード
  (function (i, s, o, g, r, a, m) {
    i['GoogleAnalyticsObject'] = r;
    i[r] = i[r] || function () {
      (i[r].q = i[r].q || []).push(arguments)
    }, i[r].l = 1 * new Date();
    a = s.createElement(o),
      m = s.getElementsByTagName(o)[0];
    a.async = 1;
    a.src = g;
    m.parentNode.insertBefore(a, m)
  })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga')

  // ドメインに応じてトラッキングIDを設定
  const trackingId = app.$trackingId(window.location.host)

  // 現在のページをセット
  ga('create', trackingId, 'auto')

  // ルートが変更されるたびに毎回実行（初期化も実行される）
  app.router.afterEach((to, from) => {
    /*
     ** Google アナリティクスにページビューが追加されたことを伝える
     */
    ga('set', 'page', to.fullPath)
    ga('send', 'pageview')
  })
}

```

また上記コードの「app.$trackingId(window.location.host)」の元となるpulginも以下の通り作成し、\plugins配下に配置

```javascript:tracking_id.js

export default ({
  app,
}, inject) => {

  app.$trackingId = trackingId
  inject('trackingId', trackingId)

  function trackingId(domain) {

    const trackingCode = {
      aaaaa.jp : 'UA-xxxxxxxx-x',
      bbbbb.jp : 'UA-xxxxxxxx-x'
    }

    return trackingCode[domain]
  }
}

```



そしてnuxt.config.jsに以下の内容を追記

```javascript:nuxt.config.js

// ～～～上記省略～～～

  plugins: [
    '~/plugins/ga',
    '~/plugins/tracking_id',
  ],

```

これで、GAの実装は完了です。
こちらを応用すれば、タグ仕込んだりとかもできると思います。（できたら次回記事上げます）

間違っている点やもっと良い方法などありましたら、コメントいただけるとありがたいです。
ご鞭撻のほど、よろしくお願いします。
Oracle と MS SQL Serverの違い

初めて触ったのがSQL Serverという人がOracleを使い始めて戸惑った内容まとめ
(随時更新）
異なっている点などありましたらご指摘ください

# SQLの文末の";"

SQL Serverでは、文末のセミコロンは必須ではないのでつける習慣がなかったので。

```
select * from items D1 where D1.ItemCode = 'AAA';
select * from Address D1 where D1.StateCode = '001';
```

# Dualってなに

dualはダミーテーブル。自動作成されるので、自分で作らなくていい。

``` 
# SQL Server
select getdate()

# Oracle
select sysdate from dual;
```

# テーブルの結合

一番戸惑った、カンマ区切り。SQL Serverの時と同じように、`inner join` `left join` も使える。

```
select * from A, B where A.Code = B.Code 
=> Inner join 
select * from A, B where A.Code = B.Code (+)
=> left outer join
```
# 全件抽出時の ' * ' 

```
# SQL server 
SELECT Code, Name, * from TableA left join TableB on TableA.code = TableB.code
=> OK

# Oracle
SELECT Code, Name, * from TableA left join TableB on TableA.code = TableB.code
=> NG

SELECT T1.Code, T2.Name, T2.* from TableA T1 left join TableB T2 on T1.Code = T2.Code;
=> OK 

テーブルが２つ以上ある場合、＊で全件抽出時はテーブル指定が必須。

```
UnityでFMOD failed to initialize the output device エラーが出た時

# FMOD failed to initialize the output device : "Error initializing out put device. "(60) 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132034/b64173ed-ec89-03db-2860-8cb577ed2f15.png)

FMOD failed to initialize the output device : "Error initializing out put device. "(60) 

見かけないエラーが出ていたのでメモ。

**スピーカー、ヘッドホンなどの、対応出来るサウンド出力デバイスがないのが原因です。**

**ヘッドホンを差すだけで解決します。**
母比率の差の95%信頼区間をPythonで求めたいだけ

母比率の信頼区間ではなく、**母比率の差**の信頼区間。

# 母比率の差とは
ここでは詳しい説明は省略。
下記サイトがわかりやすい。

[母比率の差の信頼区間](https://bellcurve.jp/statistics/course/18452.html)

# なぜ求めたいのか
業務で「カイ二乗検定」や「母比率の差の検定」を行うことがしばしば。
**有意差があるか**という結論に注目するのはもちろん大事だけども、それに着目しているだけだと、**効果量やバラツキ等が捉えづらい**。
もう少し直感的にわかるようにしよう！という流れ。

母比率の信頼区間はライブラリで求められるようだけど、母比率の差の信頼区間はどうやらないみたい(1分調べ)。
[Pythonで母比率の95%信頼区間を区間推定し、妥当なサンプルサイズを決定する方法](https://tanuhack.com/estimate-pop-rate/)

計算式も複雑ではないので、さくっと実装する。

# 計算式
```math
(\hat{p_1} - \hat{p_2}) - z_\frac{\alpha}{2} \times \sqrt{\frac{\hat{p_1}(1 - \hat{p_1})}{n_1} + \frac{\hat{p_2}(1 - \hat{p_2})}{n_2}} \leq \hat{p_1} - \hat{p_2} \leq　\\ (\hat{p_1} - \hat{p_2}) + z_\frac{\alpha}{2} \times \sqrt{\frac{\hat{p_1}(1 - \hat{p_1})}{n_1} + \frac{\hat{p_2}(1 - \hat{p_2})}{n_2}}
```
詳しい説明は先に紹介した[サイト](https://bellcurve.jp/statistics/course/18452.html)で解説している。
左式をlower bound、右式をupper boundと言ったりする。

lower boundとupper boundが0を跨いでなければ、有意な差があるといえる。
[95%信頼区間の求め方とは？有意差との関連や1.96の意味と計算式まで](https://best-biostatistics.com/summary/95ci.html)

# ソースコード
動きゃええやん教なので、雑なのはご愛敬。

2×2のクロス集計表をcsvで食べさせるイメージ。

| | 購入 | 未購入 |
|:-:|:-:|:-:|
| 男 | 50 | 100 |
| 女 | 40 | 120 |

```python:main.py
import csv
import numpy as np

# パラメータ
z = 1.96

# テストデータ読み込み
with open('test.csv') as f:
    reader = csv.reader(f, quoting=csv.QUOTE_NONNUMERIC)
    d = [row for row in reader]

# 母比率を算出
p = [d[0][0]/sum(d[0]), d[1][0]/sum(d[1])]

# 95%信頼区間を算出
lb = (p[0]- p[1]) - z * np.sqrt(p[0] * (1 - p[0]) / sum(d[0]) + p[1] * (1 - p[1]) / sum(d[1]))
ub = (p[0]- p[1]) + z * np.sqrt(p[0] * (1 - p[0]) / sum(d[0]) + p[1] * (1 - p[1]) / sum(d[1]))

# 結果を出力
print('母比率の差の95%信頼区間: {:.3f} <= p1 - p2 <= {:.3f}'.format(lb, ub))
```

# おわりに
ニッチだったかもしれないけど、便利なはず...。
Mac,Windows に Python3 をインストールし環境構築する方法

## for Mac[1]
Mac にはデフォルトで Python2系 がインストールされていますが、ここではbrewによる3系のインストール方法．
まずpython3系が入っていないかを確認．

```
$python3 -V
```
何も出力がなければ，以下に従ってインストール．


### Python3 の導入手順

Python3 を homebrew でインストールします。

1.homebrew のインストール

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
2.Python3 のインストール

```
brew install python3
```
3.Python3 の確認

```
python3 -V
```
を実行してPython 3.7.3等が表示されればインストールの完了です。

------------------
## for Windows[2]

[ここ](https://www.python.jp/install/windows/install_py3.html)がわかりやすい．


#### 参考文献
[1]https://qiita.com/7110/items/1aa5968022373e99ae28
[2]https://www.python.jp/install/windows/install_py3.html
DataBindingとLiveDataのハマりどころ

layoutとLiveDataをbindingする際のはまりどころとチェックポイントをまとめる。
公式ドキュメントや人の解説をしっかり読んでいる人なら、はまらないレベル。
が、たまに新規アプリを作ると、いつもはまる。

FragmentのlayoutにViewModelのメンバLiveDataをbindingする場合を例にする。

## Bindingクラスが生成されないんだけど

FragmentXXXBindingが生成されないケース。

build.gradleに以下の記述をしているか?

```gradle
android {
...
    dataBinding {
        enabled = true
    }
}
```

layout XMLのルートを<layout>にしているか

```xml
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">
    <data>...</data>
    ...
</layout>
```

## LiveDataが全くbindされないんだけど
LiveDataに設定した初期値すら、Viewに反映されないケース。

bindingクラスにlifecycleOwnerを設定しているか?

```kotlin
binding = DataBindingUtil.inflate(layoutInflater, R.layout.fragment_xxx, container, false)
binding.viewModel = viewModel
binding.lifecycleOwner = viewLifecycleOwner // Activityならthisを設定
```

## 双方向バインディングされないんだけど?
LiveDataの初期値はViewに反映されるが、Viewの変化してもLiveDataの値が変わらないパターン。

"@"の後に"="をつけ忘れていないか?

```xml
<!-- NG -->
<EditText
    ...
    android:text="@{viewModel.liveData}" />

<!-- OK -->
<EditText
    ...
    android:text="@={viewModel.liveData}" />
```

## CoroutineのFlowをLiveDataに変換した時、値を取得してもnullなんだけど

こんなケース。

```kotlin
// Model層のIF
val boolChannel = ConflatedBroadcastChannel<Boolean>(false)
val boolFlow: Flow<Boolean> = boolChannel.asFlow()

...

// ViewModelの実装
val boolData = model.boolFlow.asLiveData()

fun foobar() {
    println(boolData.value) // null
}
```

ConflatedBroadcastChannelをasFlowとasLiveDataでLiveDataに変換した場合、そのLiveDataをobserveしないと値が取得できないらしい。
そもそもLiveDataをobserveしないならLiveDataにする意味なし。
LiveDataではなくFlowとして扱い、singleなりcolletなりで値を取得するのが適切。
Day18 リファクタリング

#ユーザー一覧パーシャル
ユーザー一覧機能では、下記のように管理者がみる非表示ユーザ含む一覧と、通常ユーザが見る公開ユーザのみの一覧画面が用意されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565105/6df82dbf-fd43-269e-b3ca-2f2fd775d229.png)
実際、一覧を表示するコード部分は二つとも全く一緒で、ビューファイルでは同じコードを書いており、上の画像のコードがビュー内で重複していた。そこで、下記のようにパーシャルを作り共有化することでコードの重複を解消した。

**パーシャル**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565105/7ea4a9f2-32df-f8e8-bf30-27d2dc286b36.png)
**ビュー**
<img width="818" alt="スクリーンショット 2020-02-03 18.19.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565105/63df6994-8d04-de11-cf50-e165e3ec9965.png">
ビューでパーシャルを呼ぶ時に、変数をパーシャル側に渡している。ここでは全ユーザーが入った@usersと@incpriusersという変数をusersという変数にいれてそれがパーシャル側で使えるようになっている。

参考：https://qiita.com/takannporo/items/a8ff93109afc3bc3bab4
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565105/ffc2e535-1d92-6fab-71f3-c420ddb27da2.png)

#ユーザーアイコンのパーシャル
運営や非表示アカウント、目標達成済のユーザにはアイコンがそれぞれつくが、どこも同じ処理を行っている。ここもパーシャルで共通化することでコードの保守性を高めることができた。
**パーシャル**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565105/66f3f621-edd9-ca4f-bb14-21b00adbc80d.png)
**ビュー**
<img width="607" alt="スクリーンショット 2020-02-03 20.39.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565105/b47ccee3-d2b6-2dd5-491f-203d08542298.png">
ユーザー一覧と同じく、プロフィールユーザのオブジェクトをパーシャルに渡している。userがパーシャルでの変数。userpがビューで定義された変数。中身はどちらも一緒。
#Likes Likedのヘルパー
送ったいいねと、送られたいいねの数を表示する処理はユーザー一覧やプロフィールページで使うため、ヘルパーメソッドで定義することにより簡略化させた。
**ヘルパー**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565105/0ab3faee-65b9-128a-eead-8768e1ee43ca.png)
**ビュー**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565105/434893d5-48e7-cb82-d5b2-8195bb379122.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565105/3e917d41-59ec-3df4-e33e-567d5b9dde79.png)
ここではどちらも引数にはparamsのID、プロフィールページなのでプロフィールユーザのIDを送り、ヘルパーメソッドの方ではそれを元に、そのIDが送ったいいね（コラムuser_id)と、そのIDが送られたいいね(コラムpro_id)のカウントを検索し、戻り値でその値を返している。return は明記する必要はないが、わかりやすくするために明記した。
#BMI登録のヘルパー
**ヘルパー**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565105/37779fcc-23d7-a5f5-7d02-3c9e4cd8fbd3.png)
**ビュー**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565105/b0488b84-6628-3b3c-a7c5-712d7f1bf20b.png)
リファクタリング前はビューでヘルパーの処理を全て書いていたので、ごちゃごちゃになってしまっていたが、ヘルパーを利用することで見やすくなった。
#graphのパーシャル
**パーシャル**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565105/7f862945-d42f-4717-902d-2df2d440864e.png)
**ビュー**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565105/12d9c671-6c73-345a-7283-2a4db8f97437.png)
こちらは表示の部分でもあり、さらに他のビューでも使われるのでパーシャルにした。
パーシャルで使う変数に、ビューの変数を変換できるのは便利すぎる。
あなたはまだGitを使いこなせていない

#はじめに
私事ですが、最近エンジニアに転職しました
入社後、色々学んできた中でGitについて改めて便利やな〜と感じたので、
そのことについてまとめてみようと思います

まず、入社前の私の状態について軽く説明します。
Gitをバージョン管理というよりは、ソースコードのバックアップのために使っていました
本当にpushとpull以外では使っていませんでした笑
なので、Gitについて基本的な概念を大雑把に理解している感じです
具体的には

- GitとGitHubって別物なんや！！
- リポジトリはリモートとローカルがあるんか〜
- addしたら変更履歴がインデックスに上がるんか〜　　などなど

こんな感じです笑

ですが、開発をしているとコンフリクトは起こるし、前のバージョンで確認したいことはあるしで、Gitを個人のバックアップ用に使っていると訳がわからないことになしました
そこでGoogle先生にはだいぶお世話になりました。
今回はそのときにGoogle大先生から教わったGitのことについてまとめようと思います。

#基本操作
まず、基本操作について説明します
大きな流れとしてはgit initからgit pushまでです

##ディレクトリをGitの監視下に置く
このコマンドでファイルの変更の監視を開始します

```:ターミナル
git init
```

##リモートリポジトリの追加
リモートリポジトリ（GitHubなど）を追加する
gitのプロトコル（通信方式）はLocal、HTTP、Secure Shell (SSH)、Gitがあるらしいです
今回はgitを使ったコマンドを例に記載しておきます
他のプロトコルについては他の記事をご参考ください。

```:ターミナル
git remote origin git@github.com:xxxxxx/xxxxx.git
```

##インデックスにファイルを追加する
ステージングと呼ばれる作業です。
インデックスにあるファイルがコミットの対象になります。

```:ターミナル
git add xxx.php
```

##コミット
インデックスにあるものをローカルリポジトリに反映させる
コミットメッセージが本当に大切だから意識して書くようにするといいと思います。

```:ターミナル
git commit -m "first commit"
```

##リモートリポジトリにローカルリポジトリを反映させる
リモートリポジトリoriginにローカルリポジトリbranch1を反映させます

```:ターミナル
git push origin branch1
```

以上がgit initからgit pushまでの一連の流れになります。

#チーム開発
次に、コンフリクトが起こった時の対処法について解説します。
コンフリクトとは同じファイルの同じ箇所を違う人が編集することがよく起こります
Gitがどちらの変更を反映させたらいいかわかりませんという状態です。
普段はGitがいい感じにやってくれるのですが、Gitでは判断出来ないものはコンフリクトとして報告してくれます
では、実際にコンフリクトが発生した時の対処法について解説します。

ソースコードの編集が終了し、pushしようとします。

```:ターミナル
git add
git commit -m "commit message"
git push
```

pushしようとするとコンフリクトが発生し、pushできません。
そうした時に変更された内容を吸収しないといけません。変更を吸収するためにpullします。

```:ターミナル
git pull
```

pullした後、コンフリクトが発生した箇所でこのような記述があります
この記述を参考に編集して再度pushします。

```
<<<<<<< HEAD

# 作業ブランチでの変更内容

=======

# hogebranchでの変更内容

>>>>>>>hogebranch
```

```:ターミナル
git push
```

するとリモートリポジトリに他の人の変更と自分の変更がいい感じにくっついて履歴として保存されます。
#ある時点のコミットした状態に戻る
Gitを使っているのであれば、あるコミットの時点に戻りたいということも可能です。
開発を進めていると原因がよくわからないバグが発生します。
その時にこのバグがいつからあったのかを調べないと原因の切り分けがしにくい時があります。
是非覚えておきたい手法です。

まず、あるコミットの時点にどういう名前で保存されているかを調べます

```:ターミナル
git reflog

// 実行結果
7ea6663 (HEAD -> master, origin/master, heroku/master) HEAD@{0}: commit: Update production.rb
16780b4 HEAD@{1}: pull --progress origin: Fast-forward
7843f1c HEAD@{2}: checkout: moving from pg-install to master
7863c5b HEAD@{3}: commit: add pg
```

上記のような結果が出てくると思います。

次に、戻るコマンドを叩きましょう
ここで注意ですが、戻ってしますとコミットしていない変更点は消えてしまいます
なので、消えて欲しくない変更はaddしてcommitしておきましょう

本題に戻ります。例えば、、、
HEAD@{3}に戻りたいときは以下のコマンドです
resetには`hard`,`mixed`,`soft`の３種類のオプションがあります
これらのオプションについてはまた興味がありましたら調べてみてください。
今回使用する--hardは簡単にいうと全部消えるので注意してください

```:ターミナル
git reset --hard HEAD@{3}
```

これでローカルのフォルダも変更されています。
慣れないうちはあまり触りすぎないことをオススメしますめんどくさいことになるので、、、

最後に、最新の状態に戻しましょう
やり方は同じです
`reflog`でコミットのハッシュを確認しましょう

```:ターミナル
git reset --hard HEAD@{0}
```

で元に戻りましょう

以上です！！！
**ここまで読んでいただきありがとうございました！！
疑問、気になるところがございましたら、質問、コメントよろしくお願いします！！！**
Docker-ToolboxでDockerを始めてみよう

## Dockerはもはや標準だぞといわれ焦る。
ポートフォリオの作成にはDocker入れたいな～と思っていたので早速
Udemyで購入した講座で始めてみる。

[ゼロからはじめる Dockerによるアプリケーション実行環境構築](https://www.udemy.com/share/1026SGCEIecldUQnw=/)

ちなみにこの記事を書く20分くらい前にインストールしたくらいなのでさっぱりわからん。
とりあえず悩むくらいなら始めよう。

## 導入環境
- Windows10 Home
- Git For Windows（済）
- VirtualBox（済）

## 今日やること
- Dockerアカウント作成
- DockerToolboxのインストール
- ```docker run hello-world```で動作確認

これだけである。
勉強進めたらまた違う記事でかきます。

「Docker for Windows（Mac）」は10Proじゃないと入らないみたいです。
（まぁ、だからTool-Boxのタイトルなんだけど）

実際やってみたけどダメでした。。

## Dockerアカウント登録
[ここからどうぞ。リンクです](https://www.docker.com/)
新規登録してメールの認証ボタンみたいなのをクリック。
アカウントでログイン出来ているはずなのでこれでひとまずここは終わり。

## Docker-Toolboxの登場です。
[Docker-Toolboxのリンク](https://github.com/docker/toolbox/releases)
ここから「DockerToolbox-19.03.1.exe」をDLしてください。
DLが終わったら早速設定します。ちなみに自分は<img width="379" alt="2020-02-03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493685/dcd28349-7658-d584-9200-223c50b9e034.png">

- Git For Windows
- VirtualBox

は持っていたのでチェック外してます。
持ってなければそのままでOK
気を付けるとしたらここら辺だけです。あとはNext連打で速攻Install。

## Docker起動
Installまで終わると勝手にウィンドウが開きます。（多分）
そのウィンドウ内のDocker QuickStart Terminal（のショートカット）かデスクトップにショートカットがあるのでそれをクリック。

## bash.exeの場所をさがしています的なメッセージ（俺だけ？）
これはGitbashのexeファイルを探しているだけなので参照先に指定してあげればOK
これは前述のGit For Windowsでチェック付けてなかったせいかな？
まぁ、難しい内容ではないのでとっとと片付けました。
何かしら出た人は参考にしてください。

## お待ちかねの"docker run hello-world"
見出しまんまである。
起動したターミナルに打ち込みましょう。
んで最終的に、
<img width="441" alt="2020-02-03 (1-2).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493685/86ec97a2-4ad3-551f-8d56-15ef05c33440.png">

これが出たら動作環境確認はひとまず終了（でいいよね？）

## Dockerはマスト
もはや当然使ってなきゃ。ってくらいごく普通に使われているので、今後はポートフォリオでDockerを使いこなしたいところです。
【Unity】YouTuberに電気ショックをお見舞いするシステムを考案した【Pavlok】

※この記事で紹介しているPAVLOKアプリは仕様が変更されたので、現在この手法は使えません

こんにちはっ🌟八ツ橋まろんです!


先日、ふとこんな面白いツイートを見かけました。
https://twitter.com/anzu_chaaaan/status/1217347317130416133?s=20
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/0d5dc279-1e28-878a-8987-b7bfa67de676.png)


いやいや、そんなサイコな機能付きのオモチャ世の中にないじゃろ、、、
と思ったんですが、世はまさに大IoT時代！VR元年(n回目)！すべてのモノがインターネッツに繋がるのだ！！ってことで探してみたら、Pavlokという生活改善の補助デバイスを見つけました🌟
![ダウンロード.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/b6e9b6c1-5c77-75da-e0df-99f5ee027c2d.jpeg)


「Pavlok Pro 2nd Shock Clock」　お値段なんと、3万円！！！！！
https://www.amazon.co.jp/Pavlok-Pro-2nd-Shock-Clock/dp/B07CXKLN6W

```

説明しよう‼‼

Pavlok Pro 2nd Shock Clock(以下Pavlok)とは‼‼

朝起きれないアナタを‼‼お手持ちのスマホと連動して‼‼

電撃⚡で起こしてくれるウェアラブルIoTっょっょデバイス⌚なのだっ✨‼‼


PavlokはスマホやiPhoneとBLE(Bluetooth Low Energy)で通信して、
専用のアプリを通してバイブレーション/ビープ音/zap(電撃)を与える腕時計型のデバイスです。
(時刻表示機能はありません。警告音や罰を与える機能をもつデバイスです)


あなたの悪い癖を直したいとき(噛み癖やタバコなど)、家族や友人にzap用のURLを教えておけば、
ネット経由で警告音を出したり、zapすることができ、生活の改善ができます。
```

「なるほど。これのネット経由の機能を上手く利用すればYouTubeコメント→電気ショックができそうだな💡」


と、いうことで、YouTube配信のコメントから配信者にお仕置きをするシステムの開発を始めました。

作り方
-
システムをこんな感じで組みます。

YouTube配信のコメントを取得
　⇨ スーパーチャットや特定の文字列でチャージor放電
　 ⇨ 放電の場合は特定のURLにアクセス
　　　(Pavlokアプリの機能の一つ「誰からでも電撃を受け取ることができるURLを発行」しておく)
　　⇨ アプリからPavlok本体にBLEで指令
　　　⇨ビリビリ
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/0841ba0c-a847-48cd-68e1-1bb9551442cb.png)

コメント取得→OSCの部分については、坪倉さんの作った超便利なアプリ【YTLiveOSC】があったので、使わせていただきました🌟(上の画像の赤色部分)
https://www.pixiv.net/fanbox/creator/5179544/post/222812

Unity部分(上の画像の緑色部分)のOSC受信の部分はhecomiさんの作ったuOSCを使わせていただきました🌟
https://github.com/hecomi/uOSC

OSC→充放電管理→URL叩く 部分は自作しました。

YTLiveOSC部分からzapまでだいたい1秒くらいで電撃がきます。

注意しなければいけないのは、Pavlokアプリで発行できるURLにアクセスするのではなく、直接電撃を与えるURLにアクセスしないといけません。(アプリで発行したURLでは以下のような画面になるので、電撃の強さを選んで送信ボタンを押さなければ電撃を与えられません。F12でHTMLのコードを見て、送信ボタンを押したときのアクセス先を直接開くのです)
![unknown (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/a6e54c48-fdae-b22e-ee4c-397cd95b0db6.png)


そんなこんなで出来上がったのがコチラ↓↓↓↓
(動画では、コメントで充電チャージ⇒試合に負けたら自分でボタンを押して全て放電、という使い方をしています)
https://twitter.com/Maron_Vtuber/status/1222898003574312960?s=20
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/f1afe6b5-62fe-f4d9-db46-f1e51ca76d34.png)





ということで、『配信中のYouTuberにPavlokで電気ショックを与える』でしたー🌟またねっ


八ツ橋まろん
Twitter
https://twitter.com/Maron_Vtuber

pixivFANBOX
https://www.pixiv.net/fanbox/creator/16717003

YouTube
https://www.youtube.com/channel/UCiIbLpncjzahHsp8cokG56g


```
(補足1)
ちなみに。。。Pavlokの100%出力は結構痛いっス💦
ヒトの皮膚への侵入の抵抗が約2.5kΩ、出るときも2.5kΩで計5kΩ
Pavlokの瞬間電圧は100%電撃で最大250V(オシロスコープで測った)、半減期は1msくらい
→電流の瞬間最大は50mA

(補足2)
実はPavlokのアプリはIFTTTというアプリと連携できるため、IFTTTを使って電撃を送るシステムを構成することもできます。
最初はこれでシステムを組みました。しかし、IFTTTと連携する場合に一番手っ取り早かったのは
ITFFFのアドレスにメールを送信することによる発火トリガーなのですが、それでも遅延が5～10秒と大きくなり、
しかも電撃の強さは大/中/小の三択しか選べないため、汎用性・安定性が低く、こちらのシステムになりました。
```
Redmineのプラグイン「view_customize」で書いたHTML、JavaScript、CSSのコードを自動整形させる


# 概要
Redmineのプラグイン「view_customize」ではHTML、JavaScript、CSSを使って画面を自由にカスタマイズすることができますが、
そのview_customizeを使ってview_customizeに書いたコードの整形（フォーマット）を行います。

このように書いたコードが、

<img width="1015" alt="スクリーンショット 2020-02-03 22.56.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227811/48dff04c-4ba6-d901-5f2b-2dbf8c991121.png">

このように整形された形になります。

<img width="999" alt="スクリーンショット 2020-02-03 22.57.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227811/70b230c0-cb37-09d0-22e7-2829e7c86fa2.png">

# view_customize設定

Redmineの構築とview_customizeの導入は完了済みとして進めます。

メニューの管理から表示のカスタマイズを選択して新規で追加します。

パスのパターン：/view_customizes/*

挿入位置：全ページのヘッダ

種別：HTML

コード：

``` html
<script src="https://cdnjs.cloudflare.com/ajax/libs/js-beautify/1.10.2/beautify.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/js-beautify/1.10.2/beautify-css.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/js-beautify/1.10.2/beautify-html.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/js-beautify/1.10.2/beautify.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/js-beautify/1.10.2/beautify-css.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/js-beautify/1.10.2/beautify-html.min.js"></script>

<script src="https://cdn.rawgit.com/beautify-web/js-beautify/v1.10.2/js/lib/beautify.js"></script>
<script src="https://cdn.rawgit.com/beautify-web/js-beautify/v1.10.2/js/lib/beautify-css.js"></script>
<script src="https://cdn.rawgit.com/beautify-web/js-beautify/v1.10.2/js/lib/beautify-html.js"></script>

<script>
    $(document).ready(function() {
        const code_text = $('#view_customize_code');
        if (code_text[0]) {
            code_text.blur(function() {
                const text = $(this).val();
                let format_text = '';
                const type = $('#view_customize_customize_type').val();
                if (type === 'javascript') {
                    $(this).val(js_beautify(text, {}));
                } else if (type === 'css') {
                    $(this).val(css_beautify(text, {}));
                } else if (type === 'html') {
                    $(this).val(html_beautify(text, {}));
                }
            });
        }
    });
</script>
```

こんな感じで設定を行なって保存します。

<img width="1176" alt="スクリーンショット 2020-02-03 23.07.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227811/f1954d5d-cff7-f0e3-b8d4-35db05458451.png">

これでコードの入力エリアからフォーカスが外れた時に、自動でコードの整形を行うようになります。

フォーマット処理はCDNで読み込んだjs-beautifyを使っています。
また、種別の値を確認してそれぞれの言語に合わせてフォーマットが行われるようにしています。
【暗記帳】確率統計の用語と数式

|用語|数式|
|---|---|
|平均値|```μ```|
|標準偏差|```ρ```|
|正規分布|```f(x) = 1 / ((√2π) * ρ) * np.exp( (x-μ)^2 / (2 * ρ^2) )```|
|情報量|```-log(P(x))```|
|エントロピー|```Σ-P(x) * log( P(x) )```|
|シャノンエントロピー|```ΣP(x)*(-log2(P(x)))```|
|KLダイバージェンス|```D_kl(P｜｜Q) = ΣP(x)log(P(x) / Q(x))```|
|ベイズ公式|```P(H｜D)=P(D｜H) * P(H) / P(D)```|
|正規化|```（平均=0、分散=1）```|
|u : 平均、r : 標準偏差|```X = (X - u) / r```|
VsCode & AntでJavaをコンパイルするやり方

#目的
Javaのビルドの仕組みについて深く学習し、ビルドツールを習得し、Eclipseなしでの軽量・簡素な学習環境を構築する。
対象者：Javaはわかるけど環境構築やデプロイが苦手な人、勤務先がAntを使っているので触れておきたい人。ちなみに私がこれ。
筆者の環境:macOS 
前提：JavaVMへのパスは通っていてjavacコマンドが動く。

#Antをインストールする
[Ant公式](http://ant.apache.org)でダウンロードできる。
![スクリーンショット 2020-02-03 22.43.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201982/b1d7a576-3c96-2e75-3b1a-11dc21218dc2.png)
ここから、zip形式の最新のものをダウンロードする。

そのままでもいいけど後で環境変数に記述するので短い名前に変えてもいい。
どこに配置してもいいけど、私はホームディレクトリに配置しました。
ここではapache-antにしました。

```
mv apache-ant ~/
```

#パスを通す

```
cd 
vim .bash_profile

```

でパス設定ファイルが開くので、（引数なしでCDコマンド打つとHOMEディレクトリに行きます)

```bash
ANT_HOME=~/apache-ant/bin
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/library/java/JavaVirtualMachines/jdk-12.0.1.jdk/contents/home/bin:$ANT_HOME
if [ -f ~/.bashrc ]; then
  . ~/.bashrc
fi
```
上記のような感じでパスを追加します。
ANT_HOME=~apache-ant/bin
:$ANT_HOME
が追加したところです。他は人によって違うのでこれを丸ごとコピペしたら他のコマンドが壊れるかもしれないので注意してください。

```
ant --version
```

で反応があったらインストール成功です。

#ソースを用意する

ディレクトリ構成

<img width="139" alt="スクリーンショット 2020-02-03 22.58.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201982/8bf1f962-bc72-00c1-969c-cb60f5f111b3.png">

binにビルド成果物を、srcにソースコードを入れます。
・・ということをbuild.xmlに記述します。

```xml:build.xml
<?xml version="1.0" encoding="UTF-8" ?>
<project name="HelloAnt" default="default" basedir=".">
  <target name="default">
    <javac srcdir="./src/" destdir="./bin/"/>
  </target>
</project>
```

<?xml version="1.0" encoding="UTF-8" ?>はおまじない。多分これを書かないと文字化けしたりするってことでしょう。慣れるまで
毎回コピペで良さそうHTMLのDOCTYPE宣言みたいなものだと思います。

\<project>のくくりでeclipseのプロジェクト一つ分だと思う。
\<target>に具体的な支持を書いていく。依存とかこの名前でしていくらしい。
\<javac>javacコマンドにパスが指定できるもの。さっきのbinとsrcはここで指定しています。
つまりこれを変えると好きなところにビルドできることに。
普通はbinとsrcって書くと思いますが。

```java:Main.java
class Main{

  public static void main(String args[]){
    System.out.println("hello ant");
  }
}
```

これをsrcディレクトリに配置したら準備完了です。

#ビルドする
build.xmlのあるディレクトリに移動して下のコマンドを打つだけです。

```
ant
```

BUILD SUCCESSFUL
と表示されたら成功です。binディレクトリにMain.classができているはず。
<img width="175" alt="スクリーンショット 2020-02-03 23.15.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201982/c0e7682d-44a7-0a12-f7d5-b15e077ac3ca.png">
Unityでボタンが押されたらEnumの値を送る(Inspector)

ソート種別のボタンにEnumの引数を渡したかったのですが、
できなかったので検索して見つけたものから記載しました。

下記URLの記事を参考に作りました。
※onPress メソッドの部分が理解できなかったのでPublicでボタンの参照をくっつけてます
https://gist.github.com/takahashisg/5926792

■ボタンと同じコンポーネントにアタッチするクラス

```

//メッセージを送る側（ボタンにコンポーネント付けする）
using UnityEngine;
using System.Collections;

public class GlobalDialogButton : MonoBehaviour
{

    //クラスをパブリック変数にすると、UnityのInspector画面で
    //「そのクラス（コンポーネント）を付けてあるGameObject」をドラッグドロップで指定できるようになる
    public GlobalDialogBase dialog;

    //ボタンの種類をenumで定義する
    public enum ButtonType
    {
        CLOSE,
        BUY_GOLD,
        BUY_COIN,
        MAX_BUYCOUNT,
    }

    //いまenum定義したボタン種類をpublic変数で用意する。
    //UnityのInspector画面でプルダウン選択できるようになる。
    public ButtonType buttonType;


    // ボタンクリック時に呼び出されるメソッド
    public void OnClickedButton()
    {
        Debug.Log("1234567890");
        dialog.DialogButtonClicked(buttonType);

    }


```


■ボタンとは別のゲームオブジェクトにアタッチされてるクラス

```

//メッセージを受ける側（ボタンを配置してるウインドウ等にコンポーネント付けする）
using UnityEngine;
using System.Collections;

public class GlobalDialogBase : MonoBehaviour
{

    //実際にボタンが押された事を受けるメソッド
    //GlobalDialogButton.ButtonTypeっていうのはGlobalDialogButton.csに書いておいたpublic enum ButtonTypeのこと
    public void DialogButtonClicked(GlobalDialogButton.ButtonType type)
    {

        Debug.Log("DialogButtonClicked:" + type.ToString());

        switch (type)
        {
            case GlobalDialogButton.ButtonType.CLOSE:
                //適当な処理を書く
                break;
        }
    }
}
```



・インスペクター上でpublic GlobalDialogBase dialog;　に
　GlobalDialogBase の参照をつけておく

![ボタン参照.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17904/70d934c7-83f2-244b-8e83-31da99d87594.png)



直接ボタンオブジェクトの引数に渡す方法が下記URLにあるが、
内容を理解してないので使わなかった。

・http://hoppoco.blogspot.com/2017/01/unitybuttononclick.html
・http://hoppoco.blogspot.com/2017/01/unitybuttononclick.html
新しい描画ライブラリ「HiPlot」が結構いい感じだった話

# はじめに
数日前、facebook researchからHiPlotという、
新しいデータ描画ライブラリが発表されました。

https://github.com/facebookresearch/hiplot

gitのReadMeが簡素だったので、どうかな？と思ったのですが、
実際に使ってみると将来性を感じたので共有します。


# 特徴
HiPlotはデータの相関やパターンを発見することに特化した描画ツールです。
よくわからないと思うので、次の動画を見てください。

![titanic_hiplot2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131499/6733f53f-225d-d09b-244d-d5f49e75f614.gif)

このように、データを描画するだけでなく、
インタラクティブにデータの選択、フィルタリング、除外をすることができます。

公式ドキュメントに動かせるサンプルがあるので触ってみてください。

[公式doc](https://facebookresearch.github.io/hiplot/)

# 使い方
pipからインストールできます。

```bash
pip install hiplot
```

使い方は、辞書型のデータか、CSVのファイルパスをHiPlotに渡すだけです。

```python
import pandas as pd
import hiplot as hip

# pandas → 辞書 → HiPlot
train = pd.read_csv('../input/titanic/train.csv')

# orient='records'で渡す必要があります。
import_dict = train.to_dict(orient='records')
dict_hip = hip.Experiment.from_iterable(import_dict)
dict_hip.display()

# csvから直接
csv_hip = hip.Experiment.from_csv('../input/titanic/train.csv')
csv_hip.display()
```
また、作成したグラフは、htmlとして保存することができます。

```python
dict_hip.to_html()
```

# 良い点
直観的で使いやすいので、初期のデータ解析だけでなく、
学習時のハイパーパラメータのチューニングなど、いろいろな面で使えると思います。

また、非常に軽量なので、ストレスなく使用できるという点も評価できます。

# 微妙な点
出たばかりなためか、まだ機能が出そろって無い印象です。
一つ前の動作に戻る、という機能がないのでちょっと面倒です。

# 終わりに
まだ、出たばかりのツールなので、機能的に不足な印象はありますが、
有用なツールかなと思います。

kaggleでEDAする際は、まずこのライブラリに突っ込んでみてはどうでしょうか。
投稿テスト

# Test

## ワーシャルフロイド法

## ダイクストラ法

## 
```
test
```

グラフの頂点数をV(Vertex。頂点)、辺数をE(Edge)として

| 方法名       |Right align        |    計算量    |備考|
|:----------------:|:-----------------:|:------------------:|:------------------:|
| ダイクストラ法  　 　|     This          |   二分ヒープの場合         *O([E+V]logV)*        |
|                     |                  |   フィボナッチヒープの場合  *O(E+VlogV)*| 二分ヒープより高速だがコードが複雑。グラフが疎(E=*O(V)*)なら二分ヒープと比べて計算量に違いはない
| ベルマンフォード法   |              will |        will        |
| ワーシャルフロイド法 |            column |       column       |

　※グラフが疎でなく密の場合とは、m=Θ(n^2)
[マニプロ]初めてのBrainfuck編

<b><a href="https://kyobankatu.hatenablog.com/about">はてなブログ</a>の記事をそのまま写しています</b>

マニアックプログラミング略してマニプロの２つ目の記事です！
マニプロでは不定期で、数日かけて有名では無いプログラミング言語の基礎の基礎を習得して皆さんに使いやすさなどを書いていこうと思ってます。
<b>注：ちょっと触ったくらいなので、誤った情報が混ざっている可能性があります</b>

#雑談(飛ばして構いません)
学校でシャトルランがあったのですが、自宅警備員の自分からするとかなりハードな競技です。
10回目：ここら辺は舐めすぎ
20回目：ちょっと苦しいかも、、
30回目：やっぱり苦しい、、
40回目：え？まだ40！？
50回目：もう無理かも；；
60回目：もう視界がぁ<span style="font-size: 20%">ぁ</span>
70回目：なんやかんや行ける
80回目：$\tiny{心の俺「あとたった10で90台だぞ！！行け！！」}\normalsize{現実}\Large{「無理」}$

てことで結果は80回。厳しい、、、

#本編
シャトルランの話はこれくらいにして、映えある２回目の言語はBrainf*ckです！！！

名前からしてヤバい。逐一、f*ckって書くのは面倒なのでそのままfuckって書きます。

#そもそもBrainfuckとは
完全にネタ言語です。
難解言語として知られています。(Hello World!を出力することすら困難です)
名前の通り、脳みそがfuckされます。

#Brainfuckの特徴

###超難解言語
要素が少なすぎて、逆にこれ以外の特徴が見当たらないです(笑)
初めから、初期値が全て０の長〜い配列が用意されており、そこを移動したり数を足したり出力したりします。
命令できるコマンドがたったの８個しか無いので全て表にしておきます。

|文字|役割|
|---|---|
|>|１つ右に動く|
|<|１つ左に動く|
|+|ポインタの値を１足す|
|-|ポインタの値を１引く|
|.|ポインタの値を出力|
|,|入力から1バイト読み込んで、ポインタが指す先に代入する|
|[|ポインタが指す値が0なら対応する ] の直後にジャンプする|
|]|ポインタが指す値が0でないなら対応する [ の直後にジャンプする|
[参考](https://ja.wikipedia.org/wiki/Brainfuck#%E6%B4%BE%E7%94%9F%E8%A8%80%E8%AA%9E)
"+"は"++"、"-"は"--"、"."は"print"、"[]"は"while"ってことです。

#Brainfuckを使ってみた

https://fatiherikli.github.io/ WEB上で動かせます。
http://web-apps.nbookmark.com/ascii-converter/ 文字列のASCIIコードがすぐ分かるので便利です。


###まずはAを出力
```brainfuck:Sample.bf
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.
```
+を65回打つことで値が65になり、.で出力するとAと出てきます。(ASCIIコードで65がA)

###次に掛け算
```brainfuck:Sample.bf
+++[->++++<]
//コメント:3*4
```
４を３回足して１２にしています。
なので、−１２にしたい時は、

```brainfuck:Sample.bf
---[->++++<]
//コメント:誤
+++[->----<]
//コメント:正
---[+>----<]
//コメント:正
```
Brainfuckの定石みたいなものです。これを使いこなせれば君もBrainfuck初心者卒業だ！

###ようやくHello World!
Helllo World!だけでも色々な書き方がある為、人によってbyte数が違ってきます。
なので、自分なりに一番byte数が少なくなったプログラムを載せておきます。

```brainfuck:Sample.bf
++++++[->+++<]>[->++++>++++++>++++++>++>+++++<<<<<]>.>-------.>..+++.>----.>---.<<.+++.------.<-.>>+.
//コメント:ASCIIコード:72 101 108 108 111 32 87 111 114 108 100 33
```
因みに101byteです。100を切れるように頑張ったんですが、自分には無理でした。。。
軽く説明すると、

```brainfuck:Sample.bf
++++++[->+++<]
```
この部分で6*3で18を作ります。

```brainfuck:Sample.bf
>[->++++>++++++>++++++>++>+++++<<<<<]
```
この部分で18*4,18*6・・・18*5を一気に作ります。
これらはASCIIコードを近い数字たちが集まった5グループ([32,33],[108,108,111,114]など)に分け、それらの数字に近い18の倍数の数字です。

そして、その後で数字を微調整して出力しています。

これよりも短く書けたぞ！って人は是非コメントお願いしますm(_ _)m

#Brainfuckを使ってみて
Brainfuckを使ってみました！
どうでしたか？ 自分は意外と楽しめた気がします(笑)
パズルを解いてる感覚でした。
一見単純なネタ言語に見えても、実は、同じ値を出力するにしても人によって大きくコードが変わるっていう奥深さもあるっていう点が凄く気に入りました👍

という事で今回はこれで終了！ 最後に評価を書いておきます。
記事を読んで頂きありがとうございましたm(_ _)m

#評価
習得のしやすさ★★★★★★★★★★(8つしか無いからリファレンスすら存在しない(多分))

理解のしやすさ★★★★★★★★★★(8つしか無いからサルでも分かる)

読みやすさ　　★☆☆☆☆☆☆☆☆☆(可読性は壊滅的)

書きやすさ　　★☆☆☆☆☆☆☆☆☆(途中でどこがどんな値か解らなくなって頭がfuckされる)

実用性　　　　☆☆☆☆☆☆☆☆☆☆(ある訳が無い)

面白いか　　　★★★★★★★★★★(ハマる)

またやるか　　★★★★★★★★★☆(頭の体操がてらやろうと思います)

#参考にしたサイト
https://qiita.com/TomoShiozawa/items/25dcce1540085df71053
Developing on AWS受講までの事前準備 in MacPC

# 概要
AWSトーニング受講にあたり、事前準備として自前のMac端末に色々導入した時のログを残す

# 目的
・最低限の開発環境をここで揃えるようにする
・開発の初歩の初歩で詰まる方向け
・アウトプットの練習

# 何ができればよいのか
まず、事前に用意すべき環境は
①RDPクライアントからWindowsサーバーへの接続
②Linuxサーバーへの接続

その他用意した方が良さそうなもの
③Homebrewのインストール

とりあえず上記３つができればよい事にする


# ①RDPクライアントからWindowsサーバーへの接続
こちらを参考にダウンロードと手順に従い、MacからWindowsへリモートデスクトップ接続をできるようにする。
https://pc-karuma.net/mac-app-microsoft-remote-desktop/

詰まりポイントは特にないはず。

# ②Linuxサーバーへの接続
こちらも、Windowsの場合はTeratermなどの専用のターミナルを用意する必要があるが、幸いMacには標準のターミナルが用意されている
そのため、以下を参考にsshログインができれば大丈夫
https://qiita.com/HonwakaDeveloper/items/d31e5c19751644129efc


# ③Homebrewのインストール
Mac上で様々なパッケージをインストールするには、Homebrewのインストールが必須である。（macのターミナルを使うのであれば、最低限これは入れておきましょう）
これが少しだけ事前準備に時間がかったのだが、まず、以下を参考にHomebrewのインストールを行う。
https://qiita.com/rabbit1013/items/1494cf345ff172c3b9cd

### Homebrewのインストール時にパスワードが通らない時の対処法

#### 原因①：Xcodeがインストールされていない
→Xcodeを以下を参考にインストールしましょう（初期状態だとこれは入っていないらしい）
 MacのOSのバージョンによっては、最新版が入らない可能性があるので注意
https://qiita.com/rabbit1013/items/edd6544653bb87858cde


#### 原因②：rootユーザが有効になっていない
→rootのパスワードが通らない場合は、そもそもrootユーザが有効になっていない場合があります。その場合は、以下を参考にrootのパスワードを設定します
https://pc-karuma.net/root-user-enable-disable/



# 終わりに
macとは言え、環境構築は慣れないと大変時間がかかるもので、今回は準備に２時間程かかってしまったが、今後は無駄を無くして構築にかける時間を少しでも短縮できるようにしていきたい。
Hueを使って照明の色で天気予報を認識する

## 1. 億劫なこと

毎日、テレビやスマホで天気予報を確認して服装の選択や傘の有無を考えるのがめんどくさい。  

## 2. やりたいこと

当日の天気予報をAPIで取得し、天気・温度に応じて室内照明（Hue）の色を点灯させたい。
想定する手順は以下の通り。

1. 気象情報APIによって、当日の情報（天候と気温）を取得する
1. 取得した天気の情報を元に、照明の色を変化させる

## 3. 環境

- node version ： v8.11.3
- Philips Hue Go + ブリッジ

## 4. 実装

### 4.1 準備

モジュールのインストール。

```
    $ npm install request
```

### 4.2 気象情報APIの利用

今回は無料のAPIを使いたかったため、[openweathermap](https://openweathermap.org/)を利用した。
HPから利用登録してAPPIDを入手。

天気の情報は以下のAPIによってGETできる。

```
    http://api.openweathermap.org/data/2.5/weather?zip=[郵便番号],JP&units=metric&APPID=[APPID]
```

コードは以下の感じ（郵便番号とAPPIDは任意に設定）。

```node:weather.js
    // ▼▼天気情報を取得(openweathermapのAPI)▼▼
    var request = require('request');
       
    // API情報(zip_codeとwAPPIDは任意)
    var wbaseurl = "http://api.openweathermap.org/data/2.5/weather";
    var zip_code = "100-0005,JP";   //東京駅の郵便番号
    var wAPPID = [任意のID];
    var openweather_api = wbaseurl + "?zip=" + zip_code + "&units=metric&APPID=" + wAPPID;
    var options_openweather = {uri: openweather_api, method: 'GET'};

    function openweather_get() {
        request(options_openweather, function (error, response, body) { 
            var temp_json = JSON.parse(body).main.temp;
            console.log("本日の気温：" + temp_json + "度");
            var weather_json = JSON.parse(body).weather[0].main;
            console.log("本日の天気：" + weather_json);
        });
        return
    }
    openweather_get()
```

### 4.3 Hueの制御

1. HueのAPIについて
Hueの登録とAPIは[公式ページ](https://developers.meethue.com/)を参考にして登録を行った。

1. HueのAPI制御
次に、HueのAPIを制御するために以下のようなコードを書いた(ipaddressとusernameは任意に設定)。

```node:hue.js
    // ▼▼Hueの制御▼▼
    var request = require('request');

    // HueのAPI情報(ipaddressとusernameは任意)
    var hue_uri = "http://[ipaddress]/api/[username]/lights/1/state";

    // Hueを「白」に光らせる
    var hue_headers = {"Content-type": "application/json"};
    var white = {"on":true, "bri":144, "hue": 22612, "xy":[0.3146,0.3303], "effect": "none", "sat":171};
    var options_W = {uri: hue_uri, method: 'PUT', headers: hue_headers, json: white};
    function white_hue() {
        request(options_W, function (error, response, body) { console.log(body);})
        return
    }
    white_hue()
```

色は「白」以外にも、条件に応じて様々なパターンを作成した。

### 4.4 条件の設定

#### 4.4.1 温度情報に応じて色を変化

温度ごとの条件は以下のように設定した。

```
   30度以上 → 赤色に点灯
   20度以上で30度未満 → 緑色に点灯
   10度以上で20度未満 → 水色に点灯
   10度未満 → 青色に点灯
```

#### 4.4.2 天気情報に応じて色を変化

APIで取得できる天気の条件は以下。

晴："Clear", 曇："Clouds", 雪："Snow", 雨：Rain, 雷雨："Thunderstorm", 霧雨："Drizzle"

これを元に、天気ごとの条件を設定した。

```
   晴れ or 曇り → 白色に点灯
   それ以外（雨や雪） → 紫色に点灯
```

### 4.5 実行

天気情報APIの取得コードとHueの制御コードを、条件設定に合わせて一部改修して実装した。

写真は温度が寒く、天候が晴れの時の様子。

<img width="1440" alt="clear.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214392/84bf03f8-5036-b860-0920-c1a1ae109f3b.png">

温度と天候の照明色は、30秒ごとに交互に点滅するようにした。
正常な動作を確認できたのでサーバーに実装し、毎日の外出時刻に合わせて点灯するように設置した。

## 5. まとめ

照明の色を見るだけで朝の支度ができるようになった。
理想は勝手に服や傘が準備されていることなのだが（笑）
でも、夕方の雨予報などはわからない、、、もっと良い使い方を検討してみたい。
【暗記帳】ギリシャ文字一覧をQiitaのMarkdown記法で整理してみる。

|大文字|小文字|読み方|使い方|
|---|---|---|---|
|Α|α|アルファ||
|Β|β|ベータ||
|Γ|γ|ガンマ||
|⊿|δ|デルタ||
|Ε|ε|イプシロン||
|Ζ|ζ|ゼータ||
|Η|η|イータ||
|Θ|θ|シータ||
|Ι|ι|イオタ||
|Κ|κ|カッパ||
|Λ|λ|ラムダ||
|Μ|μ|ミュー||
|Ν|ν|ニュー||
|Ξ|ξ|グザイ||
|Ο|ο|オミクロン||
|Π|π|パイ||
|Ρ|ρ|ロー||
|∑|σ|シグマ||
|Τ|τ|タウ||
|Υ|υ|ユプシロン||
|Φ|∮|ファイ||
|Χ|χ|カイ||
|Ψ|ψ|プサイ||
|Ω|ω|オメガ||