OmniAICreator/Qiita-1.07M huggingface dataset:
SSHしかつなげない・外部通信もできないサーバーでyumするメモ

VPN構成や、できたての仮想マシン等で、アウトバウンドまで制限され、外部（グローバル）ネットワークに接続できないセキュアなLINUX(RedHat系)サーバーにSSH接続している場合にyumしたい場合の対応。
あくまで、メンテナンス時の刹那に行った事のまとめなので、もっと良い方法あるかもしれません。１つの手法として見てください。
３種類全てのフォワードを利用しているところが特徴なので、SSHポートフォワーディングの応用として利用できるかもしれません。

#条件

- パソコンから外部ネットワークにつながるSSHサーバーがある事
- あくまでメンテナンス時の「一時的対応する場合」等、なるべく対象を絞って実施する
- SSHトンネル内の通信なので遅い

#図解

![2018-05-16_211051.png](https://qiita-image-store.s3.amazonaws.com/0/65983/15e0831a-1a55-4973-2f75-b8b4d2922393.png)


「オレンジ矢印」の様にSSH接続し、「黒矢印」のソケット通信(更にSSH)経由で外部通信。

**登場人物**
① パソコン - 敏腕ネゴシエーター
② セキュアサーバー - 外部接続できないカゴの鳥
③ SSHサーバー - そしてyumへ

#「①パソコン」でやる事
2つのSSH接続を行います。

##■ 1.「①パソコン」から「③SSHサーバー」へSSH接続（ローカルフォワード）

**新しいターミナルで接続**

```
ssh -L 19922:localhost:22 【③SSHサーバーのhost】
```
ポートフォワーディングのトンネルを作ります。「源ポート＝19922」「送り先＝localhost:22」「ローカル」を設定

- 接続向けのオプションは省略しています。
- 「19922」は任意の使っていないポート番号
- コンソールがリモートに移るが嫌なら「-f」「-N」オプションをつけてバックグラウンドにしても良いが、終わった後に接続を確実に切断する為、ターミナルを複数立ち上げる事をお勧めする。

##■ 2.「①パソコン」 から「②セキュアサーバー」へSSH接続（リモートフォワード）

**新しいターミナルで接続**

```
ssh -R 19922:localhost:19922 【②セキュアサーバーのhost】
```
ポートフォワーディングのトンネルを作ります。「源ポート＝19922」「送り先＝localhost:19922」「リモート」

- 接続向けのオプションは省略しています。
- 「19922」は任意の使っていないポート番号（■ 1と同じに）
- パソコンにSSHサーバーが建てられている場合はこの工程は必要ない（ポート番号は合わせましょう）。
- コンソールがリモートに移るのが嫌なら〃

#「②セキュアサーバー」でやる事
1つのSSH接続を行い、yumのプロキシ設定を変更する。

##■ 3.「②セキュアサーバー」から「③SSHサーバー」へSSH接続（ダイナミックフォワード）

**新しいターミナル（「②セキュアサーバー」）上で実行**

```
ssh -D 8801 -p 19922 localhost
```

- 認証向けのオプションは省略しています。
- 「19922」は任意の使っていないポート番号（■ 1と同じに）
- 「8801」は②セキュアサーバー上で利用していない任意のポート
- コンソールがリモートに移るのが嫌なら〃

##■ 4.「②セキュアサーバー」のyum設定を変更

**新しいターミナル（「②セキュアサーバー」）上で実行**

```
$ sudo vi /etc/yum.conf
```

```/etc/yum.conf

【最後の行に追加】

proxy=socks5://localhost:8801

```

- 「8801」は②セキュアサーバー上で利用していない任意のポート■ 3.と同じに


その後、いっぱいyumする。

終わったら行を削除して戻しておく。（どうせグローバル接続することがなければいいか・）

■ 4.の工程を変えれば、プロキシ設定できるアプリやミドルウェアに応用できます。

今回は「メンテナンス時」「yumのアプリケーションのみ」といった限定的な対応でしたが、実運用環境などの場合はアウトバウンドを遮断している状態には意味があるので、それを尊重して対応するよう気をつけてください。

以上
Android開発、RGBカラーからHSVでの明度(Bright)調整、

私は今までの業務はiOSを担当してきましたが今の現場ではエンジニアが少ないからかAndroidの開発にも携わっています。
これからのキャリア形成において非常に貴重な経験なので若輩者ですがJavaの勉強をしています。
(トレンド的にはKotlinなんでしょうけど)
そこで実務で詰まってしまったメソッドについて残しておこうと思います。


# Colorから明度の調整

```bright.java

    public int convertColorFromHSV(final int color, final float brightness) {
        final float[] hsv = new float[3];
        Color.colorToHSV(color, hsv);
        hsv[2] -= brightness;
        return Color.HSVToColor(hsv);
    }

```

これで明度を調整することができます。
明度のMaxは1(100%)なので1から何％を暗くするかの調整となります。
例えば、明度を元のカラーから15%落としたい場合には
元のカラーに`color`を`brightness` に 0.15 を代入してやればいいです。

(参考) Android ドキュメント Color
https://developer.android.com/reference/android/graphics/Color

ちなみに
明度というのはHSV色空間の１種です。
HSV空間は、コンピュータグラフィックスで扱う色空間の１つで、
色相(Hue)、
彩度(Saturation Chroma)、
明度(Brightness Lightness Value) 
の3成分から構成されてます。

ColorクラスはRGB色空間、もしくはARGB 色空間です。

上記のメソッドで

```
Color.colorToHSV(color, hsv);
```

を叩くと　float[] hsvの配列に
hsv 配列のインデクス 0, 1, 2 に対応して、色相、彩度、明度が格納されます。
hsv[0] : 色相
hsv[1] : 彩度
hsv[2] : 明度
です。

色相に関しては 0.0 ~ 360.0 の値が格納されています。
彩度、
明度に関しては 0.0 ~ 1.0 の値が格納されています。

これのcolorToHSVのメソッドの使い方がわからずに小１時間ほどハマっておりました。
気持ち悪いjQuery.Deferred()の挙動

なんでタイプエラーにならないの。。。

```js

$.Deferred().resolve()
.then(null)
.then(function(){
    alert('hoge');
});
```

確かにjQuery内部の処理を見ると、nullでも次のpromiseを見るようになっていた。。
このため、外部関数をnullになっている箇所でコールするのに失敗してもスルーするようになってしまっていた。。
うーむ。。

```js
//※これはjQuery2.1.3のソース。
jQuery.extend({
	Deferred: function( func ) {
		var tuples = [
				// action, add listener, listener list, final state
				[ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
				[ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
				[ "notify", "progress", jQuery.Callbacks("memory") ]
			],
			state = "pending",
			promise = {
				then: function( /* fnDone, fnFail, fnProgress */ ) {
					var fns = arguments; //ここにnullがはいる
					return jQuery.Deferred(function( newDefer ) {
						jQuery.each( tuples, function( i, tuple ) {
							var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; //fnはfalse
							// deferred[ done | fail | progress ] for forwarding actions to newDefer
							deferred[ tuple[1] ](function() {
								var returned = fn && fn.apply( this, arguments ); //returnedもfalse
								if ( returned && jQuery.isFunction( returned.promise ) ) {
									returned.promise()
										.done( newDefer.resolve )
										.fail( newDefer.reject )
										.progress( newDefer.notify );
								} else { //新しいDeferredをresolvedで返す。
									newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
								}
							});
						});
						fns = null;
					}).promise();
				},
                      ～略～
			},
Perl5でファイルの読み書き

CPANには色々なファイル操作系のライブラリがあって、いつも「どれ使ってたっけ？」って悩んで時間を浪費するので、よく使うライブラリを書いとく。

用途によって色々選べるとおもうけど、ここでは軽い気持ちで使いたい奴のメモとする。

# まとめ

* [File::Slurp](http://search.cpan.org/~uri/File-Slurp-9999.19/lib/File/Slurp.pm) ... 読み書き
* [File::Spec](http://search.cpan.org/~xsawyerx/PathTools-3.74/lib/File/Spec.pm) ... パス整形
* [File::Basename](http://search.cpan.org/~shay/perl-5.26.2/lib/File/Basename.pm) ... 今いるファイルからパスを取得したり

# ファイルの読み書き

[File::Slurp](http://search.cpan.org/~uri/File-Slurp-9999.19/lib/File/Slurp.pm)を使うとお手軽。

```perl
use File::Slurp;

# 書き込み
write_file($file_path, +{ binmode => ':utf8' }, $content);

# 読み込み
read_file($file_path, binmode => ':utf8');
```

# パス整形

[File::Spec](http://search.cpan.org/~xsawyerx/PathTools-3.74/lib/File/Spec.pm)を使うと環境に依存しないパス整形をしてくれる。

```perl
my $file_path = File::Spec->catfile('/usr/local/bin', 'perl');
```

# 実行ファイルを基準にパスを取得

[File::Basename](http://search.cpan.org/~shay/perl-5.26.2/lib/File/Basename.pm)

```perl
use File::Basename;
my $dirname = dirname(__FILE__);

use lib File::Spec->catdir(dirname(__FILE__), '../lib');
```
ProMicroのモゲ防止ついでにQMK_Firmwareを書き込む

#Micro USB コネクタをエポキシ接着剤で固定する
　ご存知の通りProMicroのUSBコネクタは、とてもとてもモゲやすいので、USBケーブルの挿抜を行う前に**モゲ防止**を施しておくことが重要です。
　本記事ではエポキシ接着剤によるモゲ防止処置を施しつつ、ProMicroの動作チェックも兼ねて予めQMK Firmwareを書き込んでおくという用意周到な手法について解説します。
##用意するもの
* ProMicro
* 導電できるピンセット等
* ダイソーで売ってる２液混合タイプのエポキシ接着剤
* つまようじ

##手順
![a.jpg](https://qiita-image-store.s3.amazonaws.com/0/257828/66bb8b50-0690-ca2c-8397-151d120f52bd.jpeg)
　ProMicroを袋から取り出して、ざっと目視で問題なさそうなことを確認します。

![b.jpg](https://qiita-image-store.s3.amazonaws.com/0/257828/fc78dff5-c5ce-5dac-221d-0c1f5166945d.jpeg)
　適当な段ボールの切れ端等に、エポキシ接着剤のA液とB液を同量くらい出して、つまようじの先でしっかりと混ぜ合わせます。

![c.jpg](https://qiita-image-store.s3.amazonaws.com/0/257828/3dcb5fd9-3559-e8f1-b8d8-2982da007776.jpeg)
　USBコネクタ内に侵入しないように気をつけて、コネクタの周囲に接着剤を盛っていきます。

![d.jpg](https://qiita-image-store.s3.amazonaws.com/0/257828/eaf2dae1-f261-0e3c-db9f-57dca3fc825e.jpeg)
　盛っていきます。

![e.jpg](https://qiita-image-store.s3.amazonaws.com/0/257828/14404a0c-9079-ddd4-8bb6-a4e3a5eda1ac.jpeg)
　盛れました。
　この接着剤の場合、約10分で硬化するらしいので、念を入れて2時間くらい硬化を待ちます。
　手で触ってみて硬そう、爪を立てても痕が付く程度になっていればモゲの心配は無いので、QMK Firmware を書き込みます。

![f.jpg](https://qiita-image-store.s3.amazonaws.com/0/257828/f2626bba-b2f5-55b8-a56c-cb9557fdc874.jpeg)
　PCに繋いだUSBケーブルをProMicroに挿し込んで認識されたら、画像の赤丸で囲んだ2番と3番のピンをピンセットなどで短絡させて、その隙を突いてQMK Firmwareを書き込みます。

> ProMicroへの書き込み方法は、riv_mkさんの下記記事がとても参考になりますので、ご参照ください。
> [Pro Micro & QMK Firmware のセットアップガイド (Let's Split編)](http://riv-mk.hateblo.jp/entry/pro_micro_and_qmk)

(2018/11/24追記)
　[AVRDUDESSで書き込みしている動画](https://twitter.com/hdbx/status/1066278857286737923)
　↑設定項目とかもわかりやすいかと思います。

　以上の手順を実施後、基板にProMicroをはんだ付けすると、はんだ付け後にProMicroが不良品だったために泣く、という悲劇を防ぐことができますし、より楽しい自作キーボードライフを送れること間違いなしです。
開発者だから知ってほしいプロトツールのいろいろ


# プロトツールはデザイナーのためのもの？

近年ではUXという単語が増えてきたため、
画面デザイン自体はデザイナーが専任して行うことが多いかと思います。

それでも、エンジニアが自ら画面設計を含めすべて行うことも沢山あります。
エンジニアの皆様は脳内で大体の画面内容や画面遷移・アニメーションなどが目に浮かぶことも多いかと思いますが、
それを人に説明したりするのって難しいですよね。

そんな場合に簡単に使えるプロトツールと、
実際の画面デザインでも使えるデザインツールを紹介します。


# 様々なプロトツール

### 共通の特徴
スマホで撮影した画像、または画像をアップロードして
画面遷移を設定できます。

# ウェブサービス

ウェブサービスであるため、どこでも作業ができます。
また、専用のモバイルアプリを使用することでモックを動作させることができるため、
ゲーブルなどを全く使わずネットワーク経由で更新および動作確認が可能になります。

## POP

https://marvelapp.com/pop/

スマートフォンアプリのプロト作成に特化したサービスです。
スマートフォンまたはタブレットのアプリをダウンロードして使用します。

スマートフォンで撮影した画面のワイヤーフレームをそのまま使用したり、
最新版ではスマートフォン上でのワイヤーフレーム作成ができます。

手書きでスマーフォンアプリのワイヤーフレームを書きたい人にはうってつけのアプリです。


## Prott

https://prottapp.com/ja/

無料で1プロジェクトを作成することができます。
基本は日本語なのも嬉しいですね。

有料のProプランになると、下記の機能が追加されます。
- ワイヤーフレーム作成
- 画面遷移図作成

また、Sketch向けのプラグインも存在するため、
Sketchで作った画面を転送して表示することができます。

# ローカルアプリ

デザインツールが主となりますが、
機能としてプロトタイプとして動作確認を行うことができます。

## Adobe XD

Mac, Windows両対応のツールです。
AdobeCCのファミリーのためCreativeCloudのコンプリートプランに入っているユーザは無料で使うことができます。
また、無料プランも存在し1プロジェクトのみなら作成できます。

専用のモバイルアプリが存在し、
Wi-Fi経由で作成したモックを表示・画面遷移させることができます。

## Justinmind Prototyper

Mac, Windows両対応のツールです。

デザインに必要な機能が揃っており、
細かい設定がしやすいツールです。

無料版と有料版がありますが、
画面遷移などの設定は無料版で使用可能です。

## Origami Studio

Mac専用アプリ。
デザインツールよりもプロトタイプツールとしての意味合いが強いため、
インタラクションの設定が細かい。
ざっくり指定したい場合には役不足感が否めないが、
細かい指定が必要になった場合には重宝しそう。

## Sketch

Mac専用アプリ。
ちょっと前までは最強とも一部で言われていたデザインツール。
どちらかというとAdobeのIllustratorに近い存在だが、
プラグインの多さやモバイル・Web用のコンポーネントの多さから
愛用者は多い。

専用のモバイルアプリが存在し、
Wi-Fi経由で作成したモックを表示することができます。
(画面遷移などのアクションは使えない）

# さいごに

Webアプリやモバイルアプリを作る際に、
画面モックを作ったりして簡単に動かしてUI/UXの確認をすることが多いかと思います。

エンジニアの皆様はもらったデザインを元にコーディングをしますか？
それともなんとなく自分でHTMLやらXMLやらStoryboardを組みますか？

だいたいそういう場合ってほしい文字を並べていった結果ごちゃっとした内容になりませんか？

もちろん、WebアプリであればHTMLを書いたものをモックとして
使用するという文化はありましたが、
もっと早い動作確認が必要になるケースって結構多いと思います。


開発者だから、と言わずに。
画面設計が必要な場合はいきなりコードを書かずに、
手書きでもいいので画面のワイヤーフレームを書けると
すっきりした画面を作れると思います。

#### お願い

ここに紹介したもの以外にもたくさんのツールがあります。
私自身が使ったことのあるツールのみを紹介していますので、
もっといいツールがあったら是非教えてください。

なお、最近はSketchでアイコンなどを作り、
AdobeXDで画面モックを作ることが多いです。(Illustratorは勉強中・・・）
HerokuアプリからのOutboundIPを固定化するアドオンProximoをPython3で使う

# Herokuアプリも固定IPしたい

外部システムへ接続する際、「特定のIPアドレスからのアクセスのみ許可する」といったセキュリティ条件を提示されることがあります。
Herokuアプリケーションは通常、OutboundIPアドレス（外部システムから見ると接続元IPアドレス）は固定されません。
Enterprise契約してPrivate Space利用するという方法もありますが、（既にEnterpriseな場合を除くと）敷居が高いのではないでしょうか。
そこで [Proximo](https://elements.heroku.com/addons/proximo) というアドオンを利用して、カジュアルに固定IPを実現します。

# Proximoについて
- 公式ページ
    - https://elements.heroku.com/addons/proximo
- 導入
    - https://devcenter.heroku.com/articles/proximo
- 使い方は下記の記事を参考にさせて頂きました :smile: 
    -  [[Heroku]外部接続時に固定IP化する2つの方法[Proximo]](https://qiita.com/sho7650/items/872b5757e250d4b3eb95) 
- アプリ全体で使う場合は、Proximoラッパーを `Procfile` に記述すればよいようです。
- アクセス先のアドレスが特定できるのであれば、`PROXIMO_MASK` 指定で Proximoを経由するかどうか選択できそうです。

# Python3で使う
https://devcenter.heroku.com/articles/proximo にPythonのサンプルも載っていて、`urllib2` を `urllib.request` に読み替えれば動きます。
が、せっかくなので `urllib3` を使ったサンプルを作ってみました。

## urllib3 を使ったサンプル
- 環境変数 `PROXIMO_URL` は、下記のように認証情報を含んだURL形式で設定されます。

```
http://proxy:password@proxy-12-34-45-56.proximo.io
```

- `urllib3.ProxyManager` は認証情報（上記の `proxy:password` 部分）を解釈してくれないようなので、自力でBASIC認証ヘッダを付けて利用します。
- `PROXIMO_URL` が設定されていない場合は直接アクセスするようにしています。



```python
import os
import urllib3
from urllib3.util.url import parse_url
from urllib3.util import make_headers


def get_http():
    proximo_url = os.environ.get('PROXIMO_URL')
    proxy_headers = make_headers(proxy_basic_auth=parse_url(proximo_url).auth)

    if proximo_url:
        return urllib3.ProxyManager(proxy_url=proximo_url, proxy_headers=proxy_headers)
    else:
        return urllib3.PoolManager()


if __name__ == '__main__':
    r = get_http().request('GET', 'http://checkip.amazonaws.com/')
    print(r.status)
    print(r.data)
```

## requests を使ったサンプル
- 上記urllib3を使ったサンプルと同じ動作を `requests` を使って実現
- httpアクセスモジュール色々ありますね

```python
import os
import requests

def get_proxies():
    proximo_url = os.environ.get('PROXIMO_URL')
    if proximo_url is None:
        return {}
    return {'http': proximo_url, 'https': proximo_url}

if __name__ == '__main__':
    r = requests.request('GET', 'http://checkip.amazonaws.com/', proxies=get_proxies())
    print(r.status_code)
    print(r.content)
```
Facade Pattern(in progress)

# Facade Pattern
クライアントが複雑なサブクラスを容易に使えるようにする.
サブクラスが増えすぎてクライアントが使うのが大変になったときに、サブクラスをまとめて使えるクラスを一つ用意する

# Reference
- [tutorialspoint: FacadePattern](https://www.tutorialspoint.com/design_pattern/facade_pattern.htm)
- [journaldev: FacadePattern](https://www.journaldev.com/1557/facade-design-pattern-in-java)
- [geeksforgeeks: FacadePattern](https://www.geeksforgeeks.org/facade-design-pattern-introduction/)
- [github: FacadePattern](https://github.com/iluwatar/java-design-patterns/tree/master/facade)
Decorator Pattern(in progress)

# Decorator Pattern
open-closed principle
同じような処理を行うクラスが追加されても元のクラスに影響がないように

# Reference
- [tutorialspoint: Decorator Pattern](https://www.tutorialspoint.com/design_pattern/decorator_pattern.htm)
- [journaldev: Decorator Pattern](https://www.journaldev.com/1540/decorator-design-pattern-in-java-example)
- [geeksforgeeks_1: Decorator Pattern](https://www.geeksforgeeks.org/decorator-pattern/)
- [geeksforgeeks_2: Decorator Pattern](https://www.geeksforgeeks.org/the-decorator-pattern-set-2-introduction-and-design/)
- [geeksforgeeks_3: Decorator Pattern](https://www.geeksforgeeks.org/decorator-pattern-set-3-coding-the-design/)
- [GitHub: Decorator Pattern](https://github.com/iluwatar/java-design-patterns/tree/master/decorator)
Prototype Pattern(in progress)

# Prototype Pattern
- prepare to create duplicate object(一度作ったらもう一度作らない)
- if you reduce database calls to create an object(処理時間かかる)
- use clone of an object

# Reference
- [tutorialspoint: Prototype](https://www.tutorialspoint.com/design_pattern/prototype_pattern.htm)
- [journaldev: Prototype](https://www.journaldev.com/1440/prototype-design-pattern-in-java)
- [geeksforgeeks: Prototype](https://www.geeksforgeeks.org/prototype-design-pattern/)
- [github: Prototype](https://github.com/iluwatar/java-design-patterns/tree/master/prototype)
Composite Pattern(in progress)

# Composite Pattern
composes objects in term of a tree structure to represent part as well as whole hierarchy

~~~exa.md
- CEO
  - Sales Manager
     - Sales Staff A
     - Sales Staff B
  - Technical Manager
     - Engineer A
     - Engineer B 
~~~

### The Composite Pattern has four participants:
1. **Component**<br>
Component declares the interface for objects in the composition and for accessing and managing its child components. It also implements default behavior for the interface common to all classes as appropriate.
2. **Leaf**<br>
Leaf defines behavior for primitive objects in the composition. It represents leaf objects in the composition.
3. **Composite**<br>
Composite stores child components and implements child related operations in the component interface.
4. **Client**<br>
Client manipulates the objects in the composition through the component interface.
Client use the component class interface to interact with objects in the composition structure. If recipient is a leaf then request is handled directly. If recipient is a composite, then it usually forwards request to its child components, possibly performing additional operations before and after forwarding.

# Reference
- [tutorialspoint: Composite Pattern](https://www.tutorialspoint.com/design_pattern/composite_pattern.htm)
- [journaldev: Composite Pattern](https://www.journaldev.com/1535/composite-design-pattern-in-java)
- [geeksforgeeks: Composite Pattern](https://www.geeksforgeeks.org/composite-design-pattern/)
- [Github-java-design-patterns](https://github.com/iluwatar/java-design-patterns/tree/master/composite)
Builder Pattern(in progress)

# What is the Builder Pattern
複雑なオブジェクトからオブジェクトの動作プロセスを切り離す。
Factory PatternとAbstract Factory Patternがベースで、おそらくそこから要素と動作（作成過程）を切り離すということだと思われる。こうすることで、作成過程は同じでも要素は違う何かが作れたりする

# Reference
- [tutorialspoint: BuilderPattern](https://www.tutorialspoint.com/design_pattern/builder_pattern.htm)
- [journaldev: BuilderPattern](https://www.journaldev.com/1425/builder-design-pattern-in-java)
- [geeksforgeeks: BuilderPattern](https://www.geeksforgeeks.org/builder-design-pattern/)
- [github: BuilderPattern](https://github.com/iluwatar/java-design-patterns/tree/master/builder)
Ubuntuに3DレンダリングエンジンPanda3Dをインストール

#####実行した環境
Ubuntu Stdio 18.04LTS
Python 2.7.15rc1

#####確認

```shell-session
$ pip search panda3d
Panda3D (1.9.4)            - Latest stable release, Python 2 only
cefpanda (0.1)             - Panda3D-friendly wrapper around cefpython
panda3d_inputmapper (0.1)  - Simple input mapper to use with Panda3D
vext.panda3d (0.6.1)       - Use system panda3d from a virtualenv　＜ーvext.panda3dのビルドホイールに失敗しました
panda3d_pman (0.1)         - A Python package to help bootstrap and manage Panda3D applications
render_pipeline (2.0)      - Physically Based Rendering and Deferred Shading for the Panda3D Game Engine　＜ーrender_pipelineの要件を満たすバージョンが見つかりませんでした（バージョン：から）

$ pip3 search panda3d  # Python 2 onlyということなのでインストールしていない
Panda3D (1.9.4)            - Latest stable release, Python 2 only
vext.panda3d (0.6.1)       - Use system panda3d from a virtualenv
panda3d_inputmapper (0.1)  - Simple input mapper to use with Panda3D
cefpanda (0.1)             - Panda3D-friendly wrapper around cefpython
panda3d_pman (0.1)         - A Python package to help bootstrap and manage Panda3D applications
render_pipeline (2.0)      - Physically Based Rendering and Deferred Shading for the Panda3D Game Engine
```

#####インストール

```shell-session
$ pip install Panda3D cefpanda panda3d_inputmapper panda3d_pman
```

vext.panda3d
render_pipeline
がエラーでインストールできないためか？？、サンプルプログラムの一部（多数？？）にエラーがでます。

#####インストール失敗
Panda3Dの古いVerはPython2専用で、最新VerはPython3で使用出来るようですが、ことごとく失敗しました。
ネットで情報を集めようとしましたが、海外のサイトでもほとんど見つけることが出来ませんでした。

ダウンロード（サンプルプログラムは使用できました。マニュアルも使用できるかも知れません。）
https://www.panda3d.org/download.php?platform=ubuntu&version=1.8.0&sdk

https://github.com/panda3d/panda3d

https://www.rosehosting.com/blog/how-to-install-panda3d-on-ubuntu-10-04/
Ubuntu 10.04にPanda3Dをインストールする方法（この中でインストールしているパッケージは現在のUbuntuにはありませんでした。）

海綿のような物が、階段の上から転げ落ちていきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/238800/2a14dcea-7e76-274a-7ee0-a619a7ac7ab2.png)

http://www.cadnav.com/
上記のサイトでPanda3Dで使用出来る3Dモデルが無料でダウンロード出来る。
*.objのファイルをダウンロードして、
3次元のゲームエンジン Panda 3d を使ってみる 
https://www.kunihikokaneko.com/dblab/python3d/panda3d.html
にあるサンプルプログラムで簡単にモデルをマウス・カーソルキーで移動・回転等ができる。
[メモ]RaspberryPiのMathematicaをMacで動かす

# はじめに
最近ラズパイを時々いじっているのですが、実はまだディスプレーもキーボードも購入しておらず、もっぱらMacからイーサネット直接接続で使っています。
ほとんどは、コマンドラインでの操作で済んでいるのですが、時々ラズパイのデスクトップを表示する必要がある場合は、Xtightvncを使っています。
そんな私が、ラズパイに入っているというMathematicaを使おうとしてハマッてしまったので、その経験をメモにしておきます。

(2018-07-15 キーボード設定の話を追加)
(2018-11-23 バージョンアップに伴い全面改定)

# 環境
* **OS**: RASPBIAN STRETCH WITH DESKTOP AND RECOMMENDED SOFTWARE 
  2018-11-13-raspbian-stretch-full.img
* **Mathematica**: 上記にプレインストール済みの 11.3.0.0

# 現象
問題の症状としてはこんな感じでした。
・コマンドラインのMathematicaはちゃんと動く
・GUIのMathematicaも一瞬画面がでてきて動いたように見える。しかししばらくすると、アプリのウインドが消えてしまう。

# 結論
ネットに出ているTigerVNCを使う方法がそもそも間違いで、OSにデフォルトで入っているRealVNCを使えばよかったです。
ただ、MAC接続の場合、Mac側でのOS標準VNCクライアントではうまくつながらず、専用のクライアントを導入する必要があります。

# 対策

## VNCの有効化(ラズパイ側)
VNCサーバーRealVNCはOSに含まれているので、有効化するだけでOKです。

$ sudo  raspi-config
-> Interfacing Options
-> VNC

で有効化にYesで答えて下さい。

![スクリーンショット 2018-11-23 14.09.27.png](https://qiita-image-store.s3.amazonaws.com/0/206130/a3a4f97b-f2b2-a24d-3918-2a4f64a91ad5.png)

![スクリーンショット 2018-11-23 14.09.34.png](https://qiita-image-store.s3.amazonaws.com/0/206130/b702031a-80c9-dfd2-cb89-6512c47eaa6f.png)

## VNCクライアントの導入・起動 (MAC側)

[Real VNCサイト](https://www.realvnc.com/en/connect/download/viewer/)からクライアントソフトをダウンロード、導入します。

設定手順については [PCからRaspberryPiデスクトップ画面にリモートアクセス(VNC)](http://jellyware.jp/kurage/raspi/vnc.html) を参考にして下さい。

記事の最後に書いてある解像度の修正もやっておかないと使い物にならないです。必ず一緒にやっておいて下さい。

# Mathematica起動・実行結果サンプル
無事、VNCクライアント経由でデスクトップ画面が表示されたら、メニューから「プログラミング」「Mathematica」で起動できます。下記に実行画面サンプルを添付しておきます。

![スクリーンショット 2018-11-23 14.14.14.png](https://qiita-image-store.s3.amazonaws.com/0/206130/d289b81c-9cfc-0169-2d1b-e30ce0163cb1.png)



# (補足)キーボード設定の変更
ちょっと使い込んでみてわかったのですが、Mathematicaでは分数、指数などの構造体から抜けるためのショートカットキーがCtrl+Spaceになっています。このキーバインドがMac OSのデフォルトだと他の用途に横取りされているようです。
なんとかならないかググって調べてみたところ　[Mac OS X で Ctrl + Space（ ^ + space ）のショートカットをアプリで使えるようにする](http://d.hatena.ne.jp/ux00ff/20130128/1359332210)というそのまんまの記事を発見。
ここに書いてるとおりの設定をやって、無事MathematicaからCtrl+Spaceが使えるようになりました。
【PHP】数字に3桁ごとカンマをつけるプログラムを作ろう。「10000円」→「10,000円」と表記したい!!

##今回作るプログラム→数字に3桁ごとカンマをつけるプログラム

今回はこんなプログラムを作ります。

↓このようなフォームに・・・

![ 2018-05-17 8.47.53.png](https://qiita-image-store.s3.amazonaws.com/0/254159/f5ba588d-dd1a-3f06-ad65-02926ec644fc.png)

数字を入力すると・・・

![ 2018-05-17 8.48.02.png](https://qiita-image-store.s3.amazonaws.com/0/254159/19114848-45f6-f13b-a3b6-808e27583918.png)

↓このようにカンマつきの数字を返してくれます。

![ 2018-05-17 8.48.09.png](https://qiita-image-store.s3.amazonaws.com/0/254159/f6828d83-00c1-c38e-97dd-985ffdbebd9a.png)

まずはHTMLにてエスケープ処理をする関数「h.php」を書きましょう。

```php:h.php

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>HTMLでのエスケープ処理をする関数</title>
</head>
<body>
<?php 

//HTMLでのエスケープ処理をする関数
function h($var) {
	// is_array() -> $varが配列かどうかを調べる
	// $varが配列だったら・・・
	if (is_array($var)) {
		// array_map() -> 配列の各要素に対して指定した関数を実行する
		// array_map('コールバック関数名',配列)
		return array_map('h', ($var));
	// $varが配列じゃなかったら・・・
	} else {
		// フォームなどからのユーザーのデータをブラウザに表示する場合は、
		// 原則すべてのデータにhtmlspecialchars関数を使用する。
		// ENT_QUOTES -> クオートを変換する
		return htmlspecialchars($var, ENT_QUOTES, 'UTF-8');
	}
}

?>
</body>
</html>
```

次に実際のコードです。require_onceにて、上の「h.php」を読み込んでいます。

```php:form_number_format.php

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>金額にカンマを付けたい！</title>
</head>
<body>
<?php
// エラーを出力（デバッグ用）
ini_set( 'display_errors', 1 );
// h()関数を読み込む
require_once 'h.php';

// 変数に$_POSTの値を代入する
// 三項演算子 -> if ? true : false;
//$_POST['number']->inputのname属性"number"の値を送信した先
$number = isset($_POST['number']) ? $_POST['number'] : '';
// ctype_digit()関数で正の関数および、strlen()関数で4桁以上かどうか判定
// もし、正の数字かつ4桁以上ならば・・・
if (ctype_digit($number) && (strlen($number) >= 4)) {
	// number_format()関数でカンマをつける
	// number_format()->3桁ごとにカンマをつける
	echo "<p>".h(number_format(h($number)))."</p>";
	// もし正の数字かつ4桁以上じゃなかったら・・・
} elseif ($number != '') {
	echo "<p>金額には4桁以上の正の整数を入力してください</p>";
}
?>
<form action="form_number_format.php" method="post">
	<p>4桁以上の金額を入力してください</p>
	<input type="text" name="number" value="送信する">
	<input type="submit" value="送信する">
</form>
</body>
</html>
```

本日は以上です。押忍！

###参考書籍
PHP逆引きレシピ
[Review] Smart Compose: Using Neural Networks to Help Write Emails

This post follows the google AI blog.
https://ai.googleblog.com/

## introduction
Last week at Google I/O, they introduced [**Smart Compose**](https://www.blog.google/products/gmail/subject-write-emails-faster-smart-compose-gmail/), a new feature in Gmail that uses machine learning to interactively offer sentence completion suggestions as you type, allowing you to draft emails faster.
![image2.gif](https://qiita-image-store.s3.amazonaws.com/0/240801/8974f170-4078-27a4-2536-a53ec7fb430d.gif)

This is build upon [**Smart Reply**](https://ai.googleblog.com/2017/05/efficient-smart-reply-now-for-gmail.html) using TPU.

## Key Challenges
In developing Smart Compose, there were number of challenges, including 
1. Latency: To interactively suggest the sentence while user types, the latency play important role. Indeed, since it predicts the sentence on a key-stroke basis, ideally it should be able to respond within 100ms.
2. Scale: Currently Gmail is used almost 1.4 billion diverse users. So the language they use is diversified as well. Hence they had to prepare the multi-language model.
3. Fairness and Privacy: During investigating the dataset, they have realised the difficulty in handling personal information since any emails containing certain information which must not be exposed anywhere. So they seriously made sure that they don't leak or expose the user's personal information.

## Finding the Right Model
They have combined the BoW(Bag-of-Word) and RNN-LM(RNN-Language Model) which is similar to [**FastText**](https://fasttext.cc/) from FaceBook.
<img width="664" alt="Screen Shot 2018-05-17 at 8.41.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/240801/0ce2b9d8-5fab-15d7-c0a8-f0638cd6620d.png">
In fact, the novelty arises in the data pre-processing. They have embedded previous message and subject line averaging them respectively. So the RNN-LM take as input this word embedding and predict next word step-by-step.

## Future Work
They mean to constantly improve the quality of this auto-suggestion of sentence completion. Especially they will work with [**Transformer RNMT+**](https://arxiv.org/pdf/1804.09849.pdf) to improve the performance.
JSPが文字化けしたときの対処

むかーしに書かれたコードを触っていると、文字コードが統一されていなかったりしてJSPで作成したページが文字化けしました。
今回は文字化けの対応する中で、原因等も調べた結果をまとめます。
（統一されていれば何の問題も無いのですが・・・。）

# そもそも何で文字化けするのか
Webアプリケーションで文字化けが発生する原因は、レスポンスされたHTMLのエンコーディングと、
ブラウザが解釈しようとしているエンコーディングが不一致になってしまうことです。
> HTMLがUTF-8でエンコードされているのに、ブラウザがEUC-JPでエンコードしようとする、など。

## ブラウザのエンコーディングはどうやって決まるのか
ブラウザは自動的にエンコーディングを判断します。

* レスポンスヘッダのContent-Type
* 上記がない場合は、HTMLのmetaタグにあるcharset

どちらも指定がある場合はレスポンスヘッダの方が優先されます。
文字化けの対処でmetaタグでcharsetを指定してもエンコーディングが変わらないのは、レスポンスヘッダで別のエンコーディングが指定されているためということがよくあります。

# JSPの文字化け
以上を踏まえて、JSPの文字化けについて述べていきます。

## レスポンスヘッダのcharset
JSPは以下のタグを指定することによって、レスポンスヘッダのContent-Typeを指定することができます。

```html
<%@ page contentType="text/html; charset=UTF-8" %>
```

これで万事解決！といきたいところですが、JSPファイル自体のエンコーディングも関連してきます。

## JSPの簡単な仕組み
JSPはServletに変換されます。実際にHTMLを生成、レスポンスしているのは、ここで生成されたServletです。
デフォルトでは、TomcatなどのAPサーバのworkディレクトリ内に変換されたServletが生成されています。

JSPに書かれた内容をServletに変換していきますが、ここでもエンコーディングが関わってきます。
たとえばUTF-8で作成されたJSPを、EUC-JPだと思い込んでServletに変換すると、この段階で文字化けします。

## 変換処理の中でJSPの文字コードをどうやって判断するか
JSPファイル自体のエンコーディングは以下のタグで指定できます。

```html
<%@ page pageEncoding="UTF-8" %>
```

pageEncodingが指定されていない場合は、contentTypeのcharsetに指定された値で判断します。
つまり以下のような場合、UTF-8と判断します。

```html
<%@ page contentType="text/html; charset=UTF-8" %>
```
contentTypeのcharsetとpageEncodingは異なる値を指定することができるので、
UTF-8で作成されたJSPをShift-JISのHTMLとして返却したい場合は以下のように指定することができます。

```html
<%@ page contentType="text/html; charset=Shift_JIS" pageEncoding="UTF-8" %>
```
ただし、UTF-8で利用できるが、Shift_JISに含まれない文字、たとえば🍔などの絵文字とかが含まれていると、それは文字化けします。

# 結論
JSPのcontentTypeとpageEncodingを適切に指定しましょう。
いっそのこと全部UTF-8にしましょう。

# 参考
contentTypeやpageEncodingをいちいち指定するのが面倒な場合は、web.xmlに以下を設定するといいです。

```xml
<jsp-config>
  <jsp-property-group>
    <url-pattern>*.jsp</url-pattern>
    <page-encoding>UTF-8</page-encoding>
  </jsp-property-group>
</jsp-config>
```

これでJSPで記載しなくても、pageEncodingがUTF-8になります。
また、contentTypeを指定しない場合のcharsetはpageEncodingの指定に従うので、
JSPでは、contentTypeの指定も省略することができます。

ちなみにこの場合、web.xmlで指定した値と異なるエンコーディングをJSP側で指定すると例外が発生します。
Catapult Server のビルドとサーバの立ち上げ

# catapult-server

catapultビルドチャレンジの成果をざっくりですがまとめました。
適宜加筆修正していきますが、おおよそこの辺を踏まえればビルドできると思います。
さらに、ネメシスブロックを生成し、サーバを立ち上げるところまできました。
(というかはよ公式な情報だしてくれ)

このページはある程度手順が固まるまでは適宜更新していく予定です。

## 依存ライブラリ等バージョン(Libraries)

* cmake: 3.11.1
* boost: 1.65.1
* mongoc 1.4.2
* mongo-cxx 3.0.2
* gtest: 1.8.0
* libzmq: 4.2.3
* cppzmq: 4.2.3

## mongo-cxxのビルド時バグ？回避

cmakeにオプションをつけてください。
(build mongo-cxx with this option)
`-DBSONCXX_POLY_USE_BOOST=1`

## Catapult

cmakeに必要なオプションが書かれていないようです。
(build with this option)

```
-DCMAKE_C_FLAGS="-lpthread"
-DCMAKE_MODULE_LINKER_FLAGS="-lpthread"
-DCMAKE_SHARED_LINKER_FLAGS="-lpthread"
-DMONGOCXX_LIB=/usr/local/lib/libmongocxx.so
-DBSONCXX_LIB=/usr/local/lib/libbsoncxx.so
```

pthreadのフラグオンについて、わたしはこれでいきました。
いろんなやり方があるっぽい？

```
-DCMAKE_CXX_FLAGS="-pthread"
```

他、インストール場所が異なるなら適宜パスを通すか、引数を渡してあげる。


## ネメシスブロックの生成からサーバの立ち上げ

[nem catapult\.server 実行 \- HackMD](https://hackmd.io/s/BkpxBlsRz)
[planet★箒星 \(@planethouki\) \| Twitter](https://twitter.com/planethouki)さんによるまとめ


## catapultコマンド

`./catapult.tools.*`は`-h`でヘルプがでるので見ればなんとなくわかると思います。


## リンク

@Daoka氏ビルド成功時のコミットはこちら。
https://github.com/daoka/catapult-docker/commit/6818b4464369dda288e4f6ceefe13fcc7b5aa783

Close済みのissueにだいぶヒントがありました。
https://github.com/nemtech/catapult-server/issues/2

上記参考に、多少整理してます。
https://github.com/44uk/catapult-docker

こちらでもvagrantイメージ上にビルドしている方がいました
[he3labs\-public / catapult\-server\-vagrant · GitLab](https://gitlab.com/he3labs-public/catapult-server-vagrant)

ネメシスブロック生成から立ち上げの手順です。
[planet★箒星 on Twitter: "まとめた。再現できるはず。 https://t\.co/DyAGJvKrx5 \#catapult\_server実行チャレンジ"](https://twitter.com/planethouki/status/997098679554097154)



# Twitter

[\#catapult\_serverビルドチャレンジ \- Twitter Search](https://twitter.com/search?f=tweets&vertical=default&q=%23catapult_server%E3%83%93%E3%83%AB%E3%83%89%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8&src=typd)
事の顛末はこちらをごらんください。

[ハッシュタグ \#catapult\_server実行チャレンジ](https://twitter.com/hashtag/catapult_server%E5%AE%9F%E8%A1%8C%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash)
ネメシスブロックを生成し、開始する手順もわかりました。
ng-packagrに関する参考資料

## 概要 

**ng-packagr** はAngularのためのパッケージ・ジェネレータです。Angular6/cliでは、**ng-packagr** 用の設定ファイルを自動的に出力する機能が付加されました。

これにより、独自のライブラリを作成することが、きわめて簡単になりました。

以下はng-packagrに関する参考資料です。


## プログラム

- "ng-packagr",
<https://github.com/dherges/ng-packagr>

- "ng-packaged",
<https://github.com/dherges/ng-packaged>

- "angular-cli-lib-example",
<https://github.com/jasonaden/angular-cli-lib-example>


## ビデオ

- "How to use ng-packagr in Angular6",
<https://www.udemy.com/angular5-custom-library-the-definitive-step-by-step-guide/learn/v4/t/lecture/10376786?start=0>

- "Packaging Component Libraries | Angular CLI",
<https://www.youtube.com/watch?v=1IO5qGN4jpo&feature=share>

- "Angular6におけるng-packagrの利用方法",
<https://www.udemy.com/angular5-l/learn/v4/t/lecture/10429208?start=0>


## ドキュメント

- "What’s new in Angular 6?",
<https://jaxenter.com/new-angular6-143995.html>

- "Building and publishing Angular libraries using Angular CLI",
<https://medium.com/@faxemaxee/building-and-publishing-angular-libraries-using-angular-cli-140057d21101>

- "Creating Angular NPM packages with ng-packagr",
<https://codewithstyle.info/creating-angular-npm-packages-with-ng-packagr/>

- "Dive Into ng-packagr on this Episode of Angular Air",
<https://www.telerik.com/blogs/dive-into-ng-packagr-on-this-episode-of-angular-air>

- "Building an Angular 4 Component Library with the Angular CLI and ng-packagr",
<https://medium.com/@nikolasleblanc/building-an-angular-4-component-library-with-the-angular-cli-and-ng-packagr-53b2ade0701e>



## Copyright

copyright 2018 by Shuichi Ohtsu (DigiPub Japan)


## License

MIT © [Shuichi Ohtsu](mailto:ohtsu@digipub-net.com)
【Unity】Addressable Asset Systemのリソース読み込みをasync/await対応する

#はじめに

Unite 2018の[そろそろ楽がしたい！新アセットバンドルワークフロー&リソースマネージャー詳細解説](http://events.unity3d.jp/unitetokyo2018/session-lineup.html#session80)にて、`Addressable Asset System`という新アセット管理システムの概要が発表されました。

今回はこの新アセットシステム中で用いられるリソース読み込み「`Addressables.Instantiate`」を`await`できるようにしてみます。

# Addressables.Instantiate<T> の戻り値

`Addressables.Instantiate<T>`の戻り値をみたところ、`UnityEngine.ResourceManagement.IAsyncOperation<T>`型が使われていました。

```cs
public static IAsyncOperation<TObject> Instantiate<TObject>(IResourceLocation location, Transform parent = null, bool instantiateInWorldSpace = false) where TObject : Object
```

そのためこの`IAsyncOperation<T>`を`awaitable`にしてあげればよさそうです。

# 実装

```cs
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
using UnityEngine.ResourceManagement;


public static class IAsyncOperationExtensions
{
    public static TaskAwaiter<T> GetAwaiter<T>(this IAsyncOperation<T> ap)
    {
        var tcs = new TaskCompletionSource<T>();
        ap.Completed += operation => tcs.TrySetResult(operation.Result);
        return tcs.Task.GetAwaiter();
    }
}
```

対象を`await`する場合、そのオブジェクトに`GetAwaiter`メソッドが生えていればよいためこれを拡張メソッドで追加します。
メソッド内部で`TaskCompletionSource`を使って非同期処理を`Task`に変換し、その`TaskAwaiter`を返すことで`await`できるようにしています。


#使用例

```cs
using UnityEngine;
using UnityEngine.AddressableAssets;

public class AddressableTest : MonoBehaviour
{
    [SerializeField] private AssetReference _assetReference;
    private GameObject _target;

    async void Start()
    {
        _target = await Addressables.Instantiate<GameObject>(null);
    }

    void Update()
    {
        if (_target != null)
        {
            _target.transform.Rotate(90f * Time.deltaTime, 90f * Time.deltaTime, 90f * Time.deltaTime);
        }
    }
}
```

# まとめ

 * 対象のオブジェクトに`GetAwaiter`メソッドさえあればawait対象になる
 * そのときに`await`管理用のオブジェクトを返す必要があるが、`TaskCompletionSource`を使えば簡単に生成できる。

# 参考

* [Unityのコルーチンをasync/awaitで待機できるように変換してみる](https://qiita.com/toRisouP/items/45fb1dd09b80bd47a8a8)
本田圭佑の言葉どおり「プロフェッショナル」が「ケイスケホンダ」と言われるようにしてみた

#はじめに
年末のクソアプリ advent calendarでジャルジャルのネタを再現して以来クソアプリを作ることが出来ていなかったが、NHKプロフェッショナルの本田圭佑の会がTwitterで盛り上がっていたので、雑にクソアプリを作ってみた。

何で盛り上がっていたのかというと、プロフェショナルという番組の最後に毎回聞かれる「あなたにとって、プロフェショナルとは？」という質問に「ケイスケ ホンダ」という答えが返ってきたからです。

#作ったもの
Twitter上で「プロフェシッョナル」という単語が出てきたら「ケイスケ ホンダ」に置き換えるChromeのアドオン

[動作しているところ](https://www.youtube.com/watch?v=yNAfnMMVQOY)

#製作時間
2時間

- /../gという部分が何を行っているか理解できず、”プロフェッショナル”って指定していて、なんで一部分しか変わらないんだろう…という点で詰まった

- そもそもエディタで編集していたファイルが思っていたファイルと違っていて、アップロードしたはずなのに何も反映されない…という点で詰まった

#コード

```fuga.js
$(function(){
  $("body").html(
    $("body").html().replace(/プロフェッショナル/g, "ケイスケホンダ")
  );
});
```

```manifest.json
{
  "name": "ProfessionalToKeisukeHondaChromeAddon",
  "version": "0.0.1",
  "manifest_version": 2,
  "description": "プロフェショナルをケイスケホンダに置き換えるChromeアドオン",
  "content_scripts": [
    {
      "matches": ["https://*.com/*"],
      "js": ["jquery-2.1.4.min.js", "fuga.js"],
      "run_at": "document_idle"
    }
  ]
}
```

jQueryとかもうあまり使われていないかもしれないですが、普段営業をしている自分にとってはトレンドフォローして最新の言語を使うというよりは、ギャル電の方が仰っていた様にコピペバンザイで、まず動く物を作るのが大事という精神で作っております。

#参考にしたサイト
[今から３分で，Chromeブラウザの独自アドオンを自作してみよう （jQueryを使ったクローム拡張機能を，開発および動作テストする入門）](http://language-and-engineering.hatenablog.jp/entry/2015/10/22/%E4%BB%8A%E3%81%8B%E3%82%89%EF%BC%93%E5%88%86%E3%81%A7%EF%BC%8CChrome%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%AE%E7%8B%AC%E8%87%AA%E3%82%A2%E3%83%89%E3%82%AA%E3%83%B3%E3%82%92%E8%87%AA)

[[Javascript] ページ内の文字列の置換 replace](http://magnets.link/digital/542)
【Golang】 1つプロセスで複数のサイトを運営する方法【Echo】


すごいことをタイトルで言ってるように見えるが、ただ単にリクエストのURLを見て処理を分けるだけ。


```main.go
package main

import(
	"net/http"
	"github.com/labstack/echo"
)

func main() {
	e := echo.New()
	e.GET("/",root)
	e.Start(":8080")
}
func root(c echo.Context) error {
	if e.Request().Host == "localhost:8080"{
		return c.JSON(http.StatusOK,e.Request().Host)	
	}else{
		return c.JSON(http.StatusBadRequest,e.Request().Host)
	}
}
```

```requset.sh
$curl localhost:8080
localhost:8080
```
ProjectGenerator iOSでハマった（レアケースの可能性高）

## 正解かどうか分からないけど解決した

なんか知らないけどof_v0.9.8_ios_releaseのrojectGenerator_iosがエラー吐いてまともに動かなくなって困ってたんだけど結局PGのソースコード追ってたら解決出来たのでメモ.

of_v0.10.0_ios_releaseを落として解凍, scripts/template/iosの中のmediaAssetsディレクトリを0.9.8のscripts/template/iosの中にコピー.

## 以下雑感

PGのバージョンとoFのバージョンが独立しててだいぶややこしいのとElectronの~/Library/Application Supportは共有されてるのが気になる. そして中身のキャッシュとかはバイナリになっててよく分からない.

PGは凄く大事なツールだと思うけど細かな所でバグが多すぎるのとドキュメントが殆ど無いのが辛い.
addon_config.mkもどこまでが仕様でどこまからがバグなのか分からない.

PG_iosだとADDON_GIT_URLとADDON_MINIMUM_OF_VERSIONでパースエラー吐くのも気になる...

全部自前で設定ファイルのパーサーまで書いちゃってるけどMITライセンスのもう少し良いツールセットは無いもんだろうか...

## 追記

ADDON_GIT_URLとかADDON_MINIMUM_OF_VERSIONとかはコード見る限りそもそも存在しないらしい...
どこで勘違いしたのか.

検索してみたらofxSyphonにそんなのが入ってるからbakerならきっと正しいと信じたんだろうな...
反省.
DLNA対応のゴージャスなメディアサーバソフトPlexをCentOS6.9にインストール

DLNA対応のゴージャスなメディアサーバソフトのPlexのインストール方法について忘れてしまいそうなので個人メモ。

#Plexとは？
https://obel.hatenablog.jp/entry/20170902/1504329551
こちらのサイトを参考にご覧ください。

QNAP製のNASをお使いでしたら利用している方も見えるかもしれません。
SynologyのNASをお使いでしたらVideoStationがとても似ています。


#Plexのインストール
https://www.plex.tv/
![01.jpg](https://qiita-image-store.s3.amazonaws.com/0/240657/eeee5abf-9987-c12d-9602-44f202723c83.jpeg)
PLEXの公式サイトでアカウントを登録して、Linux用のパッケージをインストールします。
![02.jpg](https://qiita-image-store.s3.amazonaws.com/0/240657/de36bc41-994b-d962-4d36-29c30bb8c51c.jpeg)

````
# yum -y install https://downloads.plex.tv/plex-media-server/1.13.0.5023-31d3c0c65/plexmediaserver-1.13.0.5023-31d3c0c65.x86_64.rpm
# /etc/rc.d/init.d/plexmediaserver start
 Starting PlexMediaServer:                                  [  OK  ]
# chkconfig plexmediaserver on
````

#Plexへのアクセス

````
http://[サーバのIPアドレス]:32400/web/index.html
````

にアクセスすることで、Plexを利用可能です。
初回アクセス時は認証を求められますが、「Plexのインストール」の際に登録したアカウント情報を入力することで進むことができます。

#感想
超簡単にインストール→起動ができました。
動作もいい感じでサーバの設定もWeb画面上からできるので、Linuxに不慣れな私には好印象です。
画面もゴージャスですし！

#試したいこと
トランスコードに対応したDLNAサーバソフトを探していました。
とりあえず今回は導入だけですが、mp4(m4v）形式の動画などを変換してDLNA対応機器等で閲覧できるか試してみようと思います。
Chainer + CuPy を Mac OSX にインストールする

Mac OS X High Sierra に Chainer + CuPy をインストールする。

[CuPy](https://cupy.chainer.org/) （クーパイ）は [CUDA](https://developer.nvidia.com/cuda-downloads) （クーダ）の Python ラッパーで、 NumPy の代わりに使うことで GPU で計算出来るようになる。

[CuPy解説 - SlideShare](https://www.slideshare.net/ryokuta/cupy) で概要を把握。

開発機の場合はGPUパワーよりも「CuPyで動く」という事が重要。一通り実装できたら、ちゃんとしたGPUを積んだマシンで動かすという手順になる。

尚、自分の開発機の場合は、作業開始時点で最新の Xcode と、 Command Line Tools for Xcode をインストール済。その他、`brew`, `python`, `pip`, `pyenv` などは既に入っている状態だった。


## Chainer と CuPy のインストール（今回やりたい事）

```sh
pip install chainer
pip install cupy
```

chainer は問題なかったが、cupy が `fatal error: 'cublas_v2.h' file not found` で止まった。
先ずは CUDA を入れる必要がある。

## CUDAインストール

CUDA を入れる為に、先ずは brew cask を入れる。`brew install brew-cask` はエラーになるので、[homebrew-caskがErrorになると思ったら本家に移行してた - Qiita](https://qiita.com/emonuh/items/5dc518a64e6ca722b08a) を参考にインストール。

```sh
xcode-select --install

brew uninstall --force brew-cask; brew update
brew tap caskroom/cask
```

これで brew cask がインストールできたので、続けて CUDA を入れる。

```sh
brew upgrade
brew install coreutils
brew install swig
brew install bazel

# brew cask install cuda の代わりに下記
brew tap caskroom/drivers
brew cask install nvidia-cuda
```

NVIDIAのインストーラが出てくるので、インストールする。
インストールが終わると、システム環境設定に「CUDA」のメニューが追加され、CUDAのバージョンやGPU情報などが確認できるようになる。

## Xcode Command Line Tools のダウングレード

再び CuPy インストールを試みる。

```sh
pip install cupy

nvcc fatal   : The version ('90100') of the host compiler ('Apple clang') is not supported
```

今度はコンパイラーのバージョンエラーが出た。[nvcc fatal   : The version (‘90000’) of the host compiler (‘Apple clang’) is not supported · Issue #137 · fireice-uk/xmr-stak-nvidia](https://github.com/fireice-uk/xmr-stak-nvidia/issues/137) によると、自分のXcodeが新しすぎるらしい。

Xcodeのアップデートの度に同じ様なバージョンエラーが出て困る人が居るようだ。[NVCC does not support Apple Clang version 8.x · Issue #1384 · arrayfire/arrayfire · GitHub](https://github.com/arrayfire/arrayfire/issues/1384) に解決方法が書いてあった。

1. https://developer.apple.com/downloads/ にログイン
2. Xcode CLT (Command Line Tools) の前のバージョンをダウンロード（今回は8.3）
3. Xcode CLT をインストール
4. `sudo xcode-select --switch /Library/Developer/CommandLineTools` を実行してバージョンを切り替える
5. clang がダウングレードされたことを確認する為 `clang --version` で確認

CLTのバージョン下げると他に影響あるかもしれないが、問題あればアップグレードし直せば良い。(App Store のソフトウェア・アップデートに出て来る)

これでバージョンが clang のバージョンが 8.3 になった。


## CuPy インストール

改めて CuPy をインストール。

```
pip install cupy
```

10分ほど待つ。

```
Successfully installed cupy-4.0.0
```

というメッセージが出て、インストール完了！

これで、eGPU で GeForce を繋げばきっと動く様になる。
参考：[MacBook Air(or Pro)でGPUを外付けしChainerを動作させるまでの手順](http://marmarossa.hatenablog.com/entry/2017/09/03/004620)
OmegaT 使い方

## ダウンロード

https://sourceforge.net/projects/omegat/?source=typ_redirect

## プロジェクト > 新規作成

新規作成

## 辞書

http://download.huzheng.org/ja/ から`EJ-GENE95 (English-Japanese dictionary)`をダウンロード。
解凍し、`ej-gene95.dict.dz`と`ej-gene95.idx`と`ej-gene95.ifo`をプロジェクトディレクトリ以下の`dictionary`ディレクトリに入れる。

## グロッサリ（単語集）

プロジェクトディレクトリ以下のglossrayディレクトリに以下の形式のファイルを入れる。

```:hoge.txt
単語<Tab>訳
```

## 参考訳文（TMX）

後述のCtrl+D（終了）を押すと生成される`hoge-omegat.tmx`というファイルをプロジェクトディレクトリ以下のtmディレクトリに以下のファイルを入れる。

## 翻訳

下の行を編集して翻訳します。

## 次へ

Ctrl+U

## 翻訳済みの文へ戻る

Ctrl+Shift+U

## 終了

Ctrl+D

## 参考

http://e-trans.d2.r-cms.jp/blog_detail/&blog_id=8&id=34
http://lingvistika.blog.jp/archives/1066770111.html
http://textmagic.dip.jp/home/translation/1400/
http://omegat.sourceforge.net/manual-latest/ja/chapter.instant.start.guide.html
AWS簡易見積ツールで月あたりは30.5日

# TL;DR

タイトルの通り。
[AWS 簡易見積ツール](http://calculator.s3.amazonaws.com/index.html?lng=ja_JP) において、月あたり100％使用率の場合、30.5日として計算されている

# きっかけ
たとえば、EC2インスタンスの使用量は以下の4種類の単位から選べます。

- 使用率/月
- 時間/日
- 時間/週
- 時間/月

私は普段、月額の見積りで、値:`100` 単位:`使用率/月` を入力していました。
ツールを使って見積もった月額について、「1カ月って30日分ってこと？」とツッコミを受けたので、調べてみることに。

# 調べたこと１
以下のように計算すれば、1カ月は何日分の料金か分かるのではないかと仮定しました。
`（100％使用率/月の金額） ／ （時間料金 × 24）  ＝ （？）`

東京リージョン, Linux, オンデマンドの料金で、各インスタンス（面倒なのでt2のみ）について求めます。（2018年5月16日時点）

|タイプ|月額(ツール) |1時間料金|月額は何日分か※|
|---       |---    |---    |---     |
|t2.nano   |5.57   |0.0076 |30.5373 |
|t2.micro  |11.13  |0.0152 |30.5099 |
|t2.small  |22.26  |0.0304 |30.5099 |
|t2.medium |44.51  |0.0608 |30.5030 |
|t2.large  |89.02  |0.1216 |30.5030 |
|t2.xlarge |178.03 |0.2432 |30.5013 |
|t2.2xlarge|356.05 |0.4864 |30.5004 |
*※小数点5位で四捨五入*

だいたい30.5日分で1カ月の料金のようです。
おそらく、端数を丸めているのでピッタリにはならないのでしょう。

# 調べたこと２
もし1カ月31日だとすると744時間、1カ月30日だとすると720時間なので、以下を入力した結果出力される金額を比べてみることにしました。

- 値:`100` 単位:`使用率/月`
- 値:`744` 単位:`時間/月` （31日分の想定）
- 値:`720` 単位:`時間/月` （30日分の想定）

ところが...
単位に`時間/月`を選んだ状態で、値を`744`と入力すると、強制的に値が`732`に修正されてしまいました。
`732 / 24 = 30.5` なので、やはり1カ月30.5日のようです。

# 調べたこと３
公式資料に記載がありました。
ホワイトペーパーの「AWS 料金表の仕組み」(2018年2月)において、「Amazon EC2 コストの内訳」という項目に以下のような記載がありました。
> インスタンスは 1 月平均 30.5 日として、732 時間/月稼働します。

1月平均30.5日って1年が366日の計算ですよね...

というわけで、1カ月＝30.5日 のようです。

# 参考サイト
- [AWS 課金体系と見積り方法について](https://aws.amazon.com/jp/how-to-understand-pricing/)
- [AWS ホワイトペーパー](https://aws.amazon.com/jp/whitepapers/) 
    - [AWS 料金表の仕組み](https://d1.awsstatic.com/International/ja_JP/Whitepapers/aws_pricing_overview_JP.pdf)
- [オンデマンドインスタンスの料金](https://aws.amazon.com/jp/ec2/pricing/on-demand/)
serverless.yml "logRetentionInDays" に指定できる期間について

以下の記事を見て　serverless.ymlのLambdaのログの保持期間をコスト最適化のため設定したく

- [Serverless Frameworkを本番運用する際にやっておいたほうが良い事](https://qiita.com/keitakn/items/22cbc3e00acb79560b87#_reference-b535f0ccd72aaecc1e69)
- [Serverless Framework v1.26.0リリースノート](https://qiita.com/horike37/items/86d1626b3ee1a2e86b9a)

`logRetentionInDays: 10` (10日間)を指定してデプロイしたら
以下のエラーになった話。英語ちゃんと読まず20分失ったので備忘します。

◆デプロイ時のエラー

```
$ sls deploy
Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading artifacts...
Serverless: Uploading service .zip file to S3 (16.87 MB)...
Serverless: Validating template...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
Serverless: Operation failed!
 
  Serverless Error ---------------------------------------
 
  An error occurred: xxxLogGroup - Invalid retention value. Valid values are: [1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827, 3653] (Service: AWSLogs; Status Code: 400; Error Code: InvalidParameterException; Request ID: 1003f64c-58ff-11e8-a940-ff156e85d74b).
 
  Get Support --------------------------------------------
     Docs:          docs.serverless.com
     Bugs:          github.com/serverless/serverless/issues
     Issues:        forum.serverless.com
 
  Your Environment Information -----------------------------
     OS:                     darwin
     Node Version:           8.10.0
     Serverless Version:     1.27.0

```

エラー内容を見ると、`logRetentionInDays`に指定できる期間は決まっているらしい。
>[1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827, 3653]

とのことなので、１週間にして再デプロイしたら上手く行った。

◆修正後のプロパティ

```serverles.yml
provider:
  logRetentionInDays: 7
```

### 参考: CloudWatchLogsのAPIにも指定できる日付記載あり

https://docs.aws.amazon.com/cli/latest/reference/logs/put-retention-policy.html
>--retention-in-days (integer)
>>The number of days to retain the log events in the specified log group. Possible values are: 1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827, and 3653.

指定できる値は同じですね。

以上です。
大学生がSQLを勉強してみた(0週目)

#なぜSQLを勉強しようと思ったか
どこに行っても使えるなと感じたからです。プログラムの開発言語にはいくつも種類があり、使われている言語も会社によって違うと思います。(プログラムの考え方が分かっていればすぐに対応できるとは思いますが)それに比べてデータベースにアクセスする言語はSQLが圧倒的なシェアを誇っているんじゃないかなと勝手に思ったからです。

#勉強する本
スッキリわかる SQL 入門 ドリル215問付き! (スッキリシリーズ) 
この本を勉強していこうと思います。基本的な知識、select, from, where, 等についてはある程度分かっているつもりなので複数のjoinを抵抗なくできる程度になるのがひとまずの目標です。

#これから
とりあえずsqlの勉強する環境構築は済んだので、少しずつ勉強していきたいと思います。
自分用AWS クラウドサービス活用資料集メモ Elastic Load Balancing編

# AWS クラウドサービス活用資料集メモ

## サービス別資料

### コンピューティング

#### [Elastic Load Balancing (ELB)](https://aws.amazon.com/jp/elasticloadbalancing/)

情報元: [AWS Black Belt Online Seminar 2016 Elastic Load Balancing](https://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-2016-elastic-load-balancing)

* Application Load Balancer
    * L7のコンテントベースのロードバランサー
    * ターゲットグループに対してルーティング
    * コンテナベースのアプリケーションのサポート
    * WebSocketとHTTP/2のサポート
    * 複数のAZで耐障害性が高い
    * 価格はALBの起動時間とLoad Balancer Capacity Units(LCU)の使用量で決まる
* Elastic Load Balancing (ELB)
    * Application Load BalancerとClassic Load Balancerの二種類がある。
        * Application Load BalancerはL7のコンテントベースのロードバランサー
        * Classic Load BalancerはL4および一部L7機能を提供するロードバランサー
* ELBは複数AZに設定できる。DNSラウンドロビンで各AZのELBにアクセスが分散される。その後負荷が均等になるようバックエンドのEC2に振り分けられる
* クロスゾーン負荷分散を使うことで、AZ間のキャパシティ（インスタンス数、サイズ）が異なる場合やクライアントがDNSをキャッシュする環境でも負荷を均等にできる。
* 無通信状態が続くとそのコネクションを自動で切断する。デフォルトでは60秒、最低1秒最高3600秒
* ELBは自動でスケールするが、瞬間的に急増すると503を返す。
    * Pre-Warming（暖機運転）の申請を行うあ負荷を段階的にかける
    * ただしPre-WarmingはBusiness/Enterpriseサポートが必要
* サブネットは最小/27、空きIPは8以上
* ICMP Echo Request/Replyを許可すれば、ELBがpingにも応答する
* Perfect Forward Secrecyのサポート
* Server Order Preference対応
* スティッキーセッション
    * 同じユーザから来たリクエストをすべて同じEC2インスタンスに送信
    * ELBで生成するCookieかアプリケーションで生成するCookieか選べる
* Connection Draining
    * ELBから登録解除したりヘルスチェックが失敗したときに、新規割り振りは中止して処理中のリクエストが終わるまで一定期間末
* CLBはTCP/SSLによる負荷分散が可能
* CLBはバックエンドインスタンスのサーバ証明書認証ができる
* CLBのコンテントベースルーティングはサブドメインかNGINXで行う。
* Load Balancer Capacity Unitsは新規接続数、アクティブ接続数、帯域幅のうち、最も使用量が高いディメンションのみ請求
    * 新規接続数: 1秒あたりの新規接続数
    * アクティブ接続数: 1分あたりのアクティブ接続数
    * トラフィック量（Mbps)
* 1 LCUには1秒あたり最大25の新規接続数 (4KB証明書の場合は最大5), 1分あたり最大3000個のアクティブ接続, 最大2.22Mbpsの帯域幅が含まれている
* Route53 DNS フェイルオーバー対応 (Route53のヘルスチェックに失敗するとS3のSorryページにアクセスさせるようにできる)
* 負荷テスト時の注意事項
    * ELB暖機運転
    * 5分間隔で50%以上のトラフィック増加をしないよう負荷テストを設定
    * テストクライアント側で少なくとも1分に1回DNSの再解決をする
    * スティッキーセッションに注意
    * **バックエンドインスタンスのアイドルタイムアウトをELBのタイムアウト以上**に設定しないと不健全なホストとみなされる可能性がある

#### [Elastic Load Balancing] ロードバランサと Socket 接続を使用したイベント通知サーバの負荷分散

情報元: [WebSocket on AWS (ロードバランサとSocket接続を使用したイベント通知サーバの負荷分散)](https://www.slideshare.net/AmazonWebServicesJapan/socket-15753751)

* WebSocketはセッションごとTCPセッションが作成され、セッション中破継続的に利用する。
    * そのため間にLBを挟むとLBのコネクションも専有し、LBのリソースがボトルネックになる
    * WebSocketはサーバーとクライアントを1対1でセションを確立させそれを維持する仕組みなのでLBはあまり意味がない
    * →セッション確立時の時のみLBを使うのがいい
        * LBにGETし、Responseとしてアプリサーバのアドレスを返す
        * クライアント側で再接続の仕組みも必要

#### [Elastic Load Balancing] ELBを評価するためのベストプラクティス

情報元: [Elastic Load Balancing(ELB)を評価するためのベストプラクティス](http://d36cz9buwru1tt.cloudfront.net/jp/documentation/BestPracticesInEvaluatingELB-ja-final.pdf)

* 負荷テストの際にはDNSの名前解決について留意する
    * ELBがスケールする際にIPアドレスが増えるため
    * 少なくとも1分に1回名前の再解決を行うようにする
* 負荷の増やし方は5分おきに50%未満のレートで負荷を増やすことが推奨される
* メトリクスは次の通り
    * 遅延時間
    * リクエスト数
    * 健全なホスト数
    * 不健全なホスト数
    * バックエンドからの 2xx-5xx のレスポンス数
    * ELB からの 4xx-5xx のレスポンス数
* インスタンスのアイドルタイムアウトは少なくとも60秒に設定する
    * ELBは60秒後にアイドルコネクションをクローズするため
漫画でわかるトピックモデル（LDA）

最近トピックモデルに興味をもち、[『自然言語処理シリーズ　トピックモデルによる統計的潜在意味解析』](
https://www.amazon.co.jp/%E3%83%88%E3%83%94%E3%83%83%E3%82%AF%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AB%E3%82%88%E3%82%8B%E7%B5%B1%E8%A8%88%E7%9A%84%E6%BD%9C%E5%9C%A8%E6%84%8F%E5%91%B3%E8%A7%A3%E6%9E%90-%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E5%87%A6%E7%90%86%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%BD%90%E8%97%A4%E4%B8%80%E8%AA%A0/dp/4339027588/ref=sr_1_2?ie=UTF8&qid=1526480142&sr=8-2&keywords=%E3%83%88%E3%83%94%E3%83%83%E3%82%AF%E3%83%A2%E3%83%87%E3%83%AB
)を読んで勉強しています。２章まで読み、トピックモデルに使われるLDAの概要を理解した（つもりだけかもしれません汗）ので、例のごとくメモがわりに漫画風にまとめました。
<br>
漫画を描くつらさがだんだんわかってきましたが（笑）、時間をかけるぶんだけ頭にちゃんと入ってくるので、頑張ってこれからも続けていきたいと思います。
<br>
本の内容的には３章から各学習アルゴリズム（ギブスサンプリングとか、逐次ベイズとか）の説明になるので、こちらもちゃんと理解できたらわかりやすい形でまとめたいですが、ほとんど数式なのでこれをどう表現するか、エセ漫画家としての血が騒ぎます...
<br>
## 漫画でわかるトピックモデル（LDA, Latent Dirichlet Allocation）
<br>
トピックモデルはその名の通り、文章のトピックを分析するための手法です。

![topic1_1.jpeg](https://qiita-image-store.s3.amazonaws.com/0/211271/37a58da9-4994-fe83-3f53-bbaa06d9d5ae.jpeg)
<br>
LDAでは文書の背後に１つのトピックのみが存在していると考えるのではなく、もともと複数のトピックが存在しており、文書ごとに各トピックの出現確率が変化する、という考え方に近い。
そして、ここでの「文書」とはBoW（Bag of Words）であり、単語の順番は考慮しないことを想定。
![topic1_2.jpeg](https://qiita-image-store.s3.amazonaws.com/0/211271/633420bc-6d96-a64b-2c48-5d23dc393859.jpeg)
<br>
ここを勘違いしていたせいで理解するのが遅くなったのですが、「潜在トピックはその文書の単語の数だけ存在する」のだ！
各潜在トピックはトピック分布θをパラメータにもつ多項分布から生成されると仮定する。
![topic1_3.jpeg](https://qiita-image-store.s3.amazonaws.com/0/211271/4dd2c507-89b5-bd60-7242-036dbbbabeab.jpeg)
<br>
トピック分布・潜在トピックとは独立に、単語の出現分布φを想定する。
これは各トピックにおいてどのような単語が出現（生成）されやすいかのデータ表だと思えば良い。
各単語はφ_z（潜在トピックzにおける各単語の出現確率）をパラメータとする多項分布から生成されると仮定する。
![topic1_4.jpeg](https://qiita-image-store.s3.amazonaws.com/0/211271/878ccf76-fb0e-0abf-c2e2-1ebd51207c03.jpeg)
<br>
![topic1_5.jpeg](https://qiita-image-store.s3.amazonaws.com/0/211271/4ac1414d-fce0-cec2-b50a-40c0599fba50.jpeg)
<br>
漫画の中では説明しませんでしたが、トピック分布θと単語の出現分布φもそれぞれα（K（=トピック数）次元ベクター）,β（V（=全単語数）次元ベクター）をパラメータにもつディリクレ分布から生成されると仮定します。
<br>
##終わりに
時間があれば多項分布・ディリクレ分布、あと本の中で解説されていたLDAの幾何学的解釈もまとめたい...
最初にすごくざっくりと理解したい人向けに書いたものなので、正確でない記述など見つかりましたら教えていただけるとありがたいです！

あと、「これを漫画で理解したい」っていう要望があれば教えてください。
個人的には、VAEとかGANについて要点だけ理解したいです