OmniAICreator/Qiita-1.07M huggingface dataset:
gugenに、応募してみた。 その2

#概要

gugenに、応募してみた。

#アイデア、発想。

arduino,wemos,raspberry pi,avrのハードとセンサーの組み合わせで、自分の技量の範囲で。

#ハードウェアの選択

メモリー容量で

|  メモリーバイト      |       ハード    |
|:-----------------|:------------------|
| 2K             |              avr        |
| 20K           |            arduino       |
| 50K             |              wemos        |
| 50K超              |     raspberry pi or android        |

インターフェースで

| ハード       |    serial |    i2c |  spi |  usb | can |
|:-----------------|:------|:------|:-----|:----|:---|
| avr             |      O |    O  |   O  |  _  |  _  |
| arduino         |     O |     O  |   O  |  _  |  O  |
| wemos            |     O |    O  |   O  |  O  |  _  |
| raspberry pi     |      O |    O  |   O  |  O  |  O  |
| android          |     O |    _  |   _  |  O  |  _  |

ソフトウェアで

| ハード       |アセンブラ |  C++  | java | python |node-red |
|:-----------------|:------|:------|:-----|:----|:---|
| avr             |      O |    O  |   _  |  _  |  _  |
| arduino         |     _ |     O  |   _  |  _  |  _  |
| wemos            |     _ |    O  |   _  |  _  |  _  |
| raspberry pi     |      _ |    O  |  _  |  O  |  O  |
| android          |     _ |    O  |   O  |  _  |  _  |

#作品のクォリティ

作成したビデオと説明文が論理的に破綻していなければ、応募する。

#成果物

##オセロ
arduino+lcd+タッチペン
c++で、オセロのアルゴリズムは、オリジナル。結構強い。

##自家製ナビ
lazurite+GPS+地磁気センサー+LED+sdcard
目的地を方角と距離で案内する。

以上。
GitHubで出たnpmのセキュリティアラートに対応する。


まだプロトタイプなので気にはしていないのだけれども、ずっとアラートが出っぱなしなのは嫌なので、ちょっと対策をしてみようと思いました。

![FireShot Capture 6 - tukapai_manaka-bot_ manaka-bot - https___github.com_tukapai_manaka-bot.png](https://qiita-image-store.s3.amazonaws.com/0/89244/82f775c5-f789-7715-8650-072fb05acc1d.png)


こんなやつ

簡単に調べたところ、package-lock.jsonに依存パッケージのアップデートを盛り込んで置けばいいみたいなので、こんな感じに修正しました。

```diff

"dependencies": {
	"mime-db": {
@@ -202,7 +202,7 @@
        "finalhandler": "0.4.0",
        "finalhandler": "0.4.0",
-       "fresh": "0.3.0",
+       "fresh": ">=0.5.2",
         }
```

ちなみに実際に修正したコミットはこんな感じ。

[GitHub - fix security problem](https://github.com/tukapai/manaka-bot/commit/c2d9648ef6e6243f3f89611d8a1efbdc98db865e)

npmとか結構依存モジュールが多いので定期的にこういったものは検証やアップデート対応が今後必要な気がします。

自分以外メンテナンスする人がいないので、めんどくさいと思う半面、自分で脆弱性対応を調査しなくてもいいというのは便利な機能でした。

参考にした記事

[GitHubから通知されたセキュリティ上の脆弱性を解決する](http://i-yusuke.com/entry/angular-github-security/)
Python リストを参照してリストをソート

やはり先人の知恵に頼るべき．
~~もっと楽にやる方法が有るかもしれないがとりあえずメモ．~~

`リスト.sort`でも`sorted(リスト)` でも良いと思うがsortedのほうが元のリストを変更しないのでここでは**sorted()を用いる**

# 問題
以下のように2つのリストがある時，片方のリストの値を用いてもう片方のリストをソートしたい．

```
X = ["a", "b", "c", "d", "e", "f"]
Y = [ 0,   5,   3,    1,   4,   2]
```

Yでソートするなら答えはこうなるべき．
`['a', 'd', 'f', 'c', 'e', 'b']`

## 最短解[1]
多分これが一番早そう．

```
Z = [x for _,x in sorted(zip(Y,X))]
print(Z) 
```

やっていることは，

- ZIPで数値と文字列を結合
- sortedで最初のYの値を見てソート
- 2番目の要素だけ取り出す

いろいろと参考になる．こういうのが即浮かばないうちはPython使いにはなれんのか．

## Reference[2]読んで考えて書いたやつ
自分で考えて書くと可読性が低い．

```python
deco = zip(X,Y)
sorted(deco,key=lambda deco:deco[:][1])
```

keyの後ろにはXの要素（アルファベット）を与えるとYの値（順序に使う数値）を出すような関数を書けば良い．
従ってzipでXとYをくっつけてY側の値を取り出すという関数にした．

# 文献

- [1]  [クールな解決策の元記事](https://stackoverflow.com/questions/6618515/sorting-list-based-on-values-from-another-list)
- [2] [Opencv Reference](https://docs.python.jp/3/howto/sorting.html)
VLCで字幕の位置や内容を変える

本記事は東京大学工学部電子情報・電気電子工学科の「[大規模ソフトウェアを手探る](https://doss.eidos.ic.i.u-tokyo.ac.jp/)」という実習の報告書を兼ねています。

# はじめに
これはVLCで副字幕を表示させようと試行錯誤している過程で字幕の位置・内容を変えることに成功した時の記事です。

# 字幕の位置を変更する
字幕の描画はsrc/video_output/vout_subpictures.cで行われていて、描画の領域の設定はSpuRenderRegion関数内で行われていたのでこの部分を変更すればよい。

```c:src/video_output/vout_subpictures.c(722~725行目)
// 字幕位置を上部に変更する例
// 画面の領域外を指定しても領域内に収まるように自動で調節される
*dst_area = spu_area_create(x_offset, y_offset - 10000,
                                region->fmt.i_visible_width,
                                region->fmt.i_visible_height,
                                scale_size);
```

# 字幕テキストの内容を変更する
字幕テキストデータのパースはmodules/codec/subsdec.cのParseSubtitles関数で行われていたのでこの部分を変更すればよい。

```c:modules/codec/subsdec.c(762行目)
// 各字幕セグメントの最初に文字を追加する例
p_first_segment = p_segment = text_segment_New( "added" );
```

テキストの内容だけでなくスタイルの設定もこの関数内で行われていたので、特定の単語を太字や斜体にするといった処理もこの部分を編集することで実現できる。

# まとめ
字幕に手を加えることはできるようになりましたが、この段階では既に選択されている言語の字幕しか送られてきていないので副字幕を表示するにはもっと前の段階に手を加えないといけないということが分かりました。

# 関連記事
[macOS上でVLCをソースからビルドする](https://qiita.com/grayarea/items/d6b8667be60e1fb774ee)
[VLCで副字幕を表示可能にする](https://qiita.com/grayarea/items/3db1c354bb8f7f65e4eb)
技術者の集まる（さいきょうの）Slackの紹介とアドベンドカレンダー

大げさにかいたけど、かなりのエキスパートが参加している　技術者Slackだ
ほんと　すごいメンバーいるので　気軽にきてほしい

https://docs.google.com/forms/d/e/1FAIpQLSfvfuG7ySMQc7CeSCnTo__oa72YxDMLufet6-awNlld7I1vhg/viewform

このフォームにメールアドレス送ると招待がくる


そして　ちょっと困ってる 勢いで作った　アドベントカレンダー
https://qiita.com/advent-calendar/2018/murasame-lab-2018

うまる気がしないので　誰かかいておねがい
GatsbyJSにはてなブックマークとPocketのシェアボタンを設置した

最近流行りの静的サイトGeneratorといえば[GatsbyJS](https://www.gatsbyjs.org/)です。
Reactで実装されデフォルトでSPAとなっているため、ページ表示が爆速などの利点があります。
今回ははてなブックマークとPocketのシェアボタンを設置しました。

## 実装したjsx
Reactということでjsxのコンポーネントという形で実装します。

```PostShare.jsx

    import React from "react";
    import { FaGetPocket } from 'react-icons/fa';
    import "./PostShare.css";
    ...
    
    const formatSiteUrl = (siteUrl, pathPrefix, path) =>
      siteUrl + (pathPrefix === "/" ? "" : pathPrefix) + path;
    
    class PostShare extends React.Component {
      render() {
        const { postNode, postPath, config } = this.props;
        const post = postNode.frontmatter;
        const url = formatSiteUrl(config.siteUrl, config.pathPrefix, postPath);
        ...
        return (
          <section className="share">
            <h4>Share this post</h4>
            <div style={{ display: "flex" }}>
            ...
              <div>
                <a className="HatenaShareButton" href={"http://b.hatena.ne.jp/add?mode=confirm&url="+url+"&title="+post.title} target="_blank" rel="nofollow">
                </a>
              </div>
              <div>
                <a className="PocketShareButton" href={"http://getpocket.com/edit?url="+url+"&title="+post.title} rel="nofollow" rel="nofollow" target="_blank">
                  <FaGetPocket />
                </a>
              </div>
            </div>
          </section>
        );
      }
    }
    
    export default PostShare;

```

なお今回はPocketとはてなブックマークボタンを実装しました。（海外のレイアウトを使ったらデフォルトで入ってなかった…TwitterとかFacebookはあったのに）
内容は単純でaタグでソーシャルリンクを貼ってあるだけです。
このファイルをtemplatesフォルダ内にてimportしましょう。

```post.jsx
...
import PostShare from "../components/PostShare/PostShare";
...
          <PostFooter>
            <AuthorImage author={authorData} />
            <AuthorInfo prefix="/author" author={authorData} />
            <PostShare
              postNode={postNode}
              postPath={location.pathname}
              config={config}
            />
...
```

##CSS
### Pocketについて

PocketはスタイルがFont Awesomeに入っています。なので、それをそのまま使いました。GatsbyJSはReact製ですのでreact-iconsが使えます。ですので下記のコマンドでインストールした後、importすればよいでしょう。


```bash
    npm install react-icons --save
```



### はてブについて

はてブのボタンは「[Font Awesome などアイコンフォントにないはてなブックマークを自力で追加する簡単な方法](https://hayashikejinan.com/webwork/css/913/)」を利用させていただきました。


```PostShare.css
    ...
    .HatenaShareButton:before {
       content: "B!";
       font-family: Verdana;
       font-weight: bold;
        font-size: 0.9em;
        border: solid 3px #6091d3;
        border-radius: 4px;
        color: white;
        background: #6091d3;
        position: relative;
        top: -1px;
    }
    ...
```



## 実装結果

![](https://d2mxuefqeaa7sj.cloudfront.net/s_E5E0F31DB8E0098827880481303A6F8B2CE3CEA49459AA9AB6A9874A8141EDA3_1541352671599_image.png)

Share this postのB!及びPocketボタンが実装例です。元からあったTwitterやFacebookと比べてもあまり違和感はないですね。
[#Maya] Mayaのメニューからスクリプトを呼び出す

すぐ忘れてしまうのでメモ。

# エントリポイント
Mayaが最初に呼び出すスクリプトディレクトリに**userSetup.py**を置きます。
Windowsの場合は
`C:\Users\user\Documents\maya\scripts`
以下に置くことになります。

このディレクトリは、

- MAYA_SCRIPT_PATH
- PYTHONPATH

に任意のパスを追加しておくことで変更することができます。
自分の場合、ツールごとにgit管理しているので、意図的にスクリプトフォルダを開発用ディレクトリに差し替えています。

```bash
# 例
set MAYA_SCRIPT_PATH=MAYA_SCRIPT_PATH;D:\dev\mayatool
set PYTHONPATH=PYTHON_PATH;D:\dev\mayatool
```

中身はこんな感じにしておきます

```python:userSetup.py
# -*- coding: utf-8 -*-

from maya import utils
from MyTool import menu

utils.executeDeferred(menu.main)
```

executeDeferredでMAYAシステム上のすべてのGUIコンポーネントがロードされた後に実行されます。

# メニュー登録用スクリプト
それぞれのツール用ディレクトリにメニュー追加用スクリプトを用意しておいて、userSetup.pyから呼ぶ形にします。

```
root/
　├ userSetup.py
　├ MyTool/
　│　├ __init__.py
　│　├ menu.py
　│　└ Animation/
　│　　　├ __init__.py
　│　　　└ gui.py
```

MyTool内のスクリプトはモジュール化しておいたほうが都合がよいので、`__init__.py`も仕込んでいます。
メニューに追加するスクリプトは次のようにします。

```python:menu.py
# -*- coding: utf-8 -*-

import maya.cmds as cmds

def main():
    cmds.menu(l='MyTool', p='MayaWindow', to=True)
    cmds.menuItem(l='Animation', to=True, sm=True)
    cmds.menuItem(l='MyAnimator',
                    c='from MyTool.Animation import gui;reload(gui);gui.main()')
```

reloadを挟むことで、毎回メニューをクリックした際にGUIのスクリプトに更新を走らせることができるので、
自分は入れる派ですがなくても大丈夫です。

これで追加することができました。
Source Han Code JPをPowerlineで使いたかっただけ．．．

# Source Han Code JP + Powerline

エンジニアでフォントにこだわりがあるって人は多いと思います．（たぶんだけど）

例えばRictyとかMenloとかね．．．

自分は個人的にSource Han Code JP（Source Code Proの和文フォント組み込み）が好きなので全部それ使ってます．

そして何となく思い立ってZshでPowerlineのテーマを使いたいと思って入れたんですが、Powerlineをフォントに組み込むのに結構手間取ったのでシェアしようかなと思います．

Python2とFontForge使って色々こねくり回してます．（FontForgeはbrewとかで入れてください）

## 1. Source Han Code JPを手に入れる

Githubで配布されているのでダウンロードして来るだけ．．．[ここから](https://github.com/adobe-fonts/source-han-code-jp/releases)ダウンロードできます．

解凍するとTTCとOTFの両方が入っていると思います．どっち使ってもいける思うけどただしTTCの場合は一回TTFにバラす作業がいります．こんな感じでいける．

```python
#!/usr/bin/env python2
# -*- coding: utf-8 -*-

import sys
import fontforge


def main(font_collection):
    for font in fontforge.fontsInFile(font_collection):
        f = fontforge.open("%s(%s)" % (font_collection, font))
        f.cidFlatten()
        f.generate("%s.ttf" % font)


if __name__ == "__main__":
    main(sys.argv[1])
```

## 2. PowerlineをSource Han Code JPに組み込む

これは[fontpatcher](https://github.com/powerline/fontpatcher)という便利なものがあるのでそれを使えば一発です．使い方はクローンしてきて下のコマンドを打てばok．

```
fontforge -lang=py -script ./fontpatcher/scripts/powerline-fontpatcher {Font Name}.{Font Type}
```

## 3. Powerlineのフォント調整

上の段階で終わるとPowerlineのフォントがずれてめちゃかっこ悪いので直します．GUIで直す方法もあるっぽいけど面倒くさいのでスクリプトで書きました．

```python
#!/usr/bin/env python2
# -*- coding: utf-8 -*-

import sys
import fontforge
import psMat

GLYPH_UNICODES = [
    0xE0A0,
    0xE0A1,
    0xE0A2,
    0xE0B0,
    0xE0B1,
    0xE0B2,
    0xE0B3
]

def main(font):
    f = fontforge.open(font)

    x_ratio = 1.0
    y_ratio = 1.0
    x_diff = 0
    y_diff = 0

    scale = psMat.scale(x_ratio, y_ratio)
    translate = psMat.translate(x_diff, y_diff)
    transform = psMat.compose(scale, translate)
    for code in GLYPH_UNICODES:
        f[code].transform(transform)

    f.generate()


if __name__ == "__main__":
    main(sys.argv[1])
```

これを生成されたSource Han Code JP + Powelineのフォントに適用すれば完璧．（ただ，これでも多少ずれるので好みでx_diffとかy_diffを修正してください）

これでいけると思います．詳しくはGihubにコード置いてあるので参考にして下さい👍

Github: [https://github.com/ty-edelweiss/source-han-code-jp-powerline](https://github.com/ty-edelweiss/source-han-code-jp-powerline)
【 コピペで OK 】 Laradock で Laravel 5.7 の開発環境を構築する方法

# 事前準備
- Docker をインストールして下さい

# 環境
- macOS Mojave で動作確認済み

# 手順
## Laradock をダウンロード

### シェルでホームディレクトリに移動
```
$ cd
```

### ディレクトリを作成
```
$ mkdir example
```

### 作成したディレクトリに移動
```
$ cd example
```

### git clone で Laradock をダウンロード
```
$ git clone https://github.com/laradock/laradock.git
```

## コンテナを初期化

### 先程ダウンロードした laradock ディレクトリに移動
```
$ cd laradock
```

### laradock ディレクトリ内の env-example を cp コマンドでコピーし .env を作成
```
$ cp env-example .env
```

### docker-compose up コマンドでコンテナを作成してから起動
```
$ docker-compose up -d nginx mysql workspace phpmyadmin
```

## Laravel プロジェクトを作成

### 仮想環境にログイン
```
$ docker-compose exec --user=laradock workspace bash
```

### composer コマンドで Laravel の新規プロジェクトを作成
```
$ composer create-project --prefer-dist laravel/laravel sample
```

### コンテナからログアウト
```
$ exit
```

### Laravel プロジェクトに移動し vim で .env ファイルを開く
```
$ cd ..
$ cd sample
```
```
$ vim .env
```

### 先程 cp コマンドで作成した .env の APP_CODE_PATH_HOST を変更
```
APP_CODE_PATH_HOST=../
```

- 👆 書き換え前
- 👇 書き換え後

```
APP_CODE_PATH_HOST=../sample
```
- 書き換え後に :wp! コマンドで vim を閉じる

### 上記の設定を反映させるためにコンテナを停止してから再起動
```
$ cd ..
$ cd laradock
```
```
$ docker-compose stop
```
```
$ docker-compose up -d nginx mysql
```

### .env で DB の環境変数を変更
```
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
```

- 👆 書き換え前
- 👇 書き換え後

```
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=default
DB_USERNAME=default
DB_PASSWORD=secret
```

### 最後に
- Web ブラウザで localhost にアクセス

# 追記

### xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
- git clone した際に上記のエラーが発生した場合、xcode をインストールして下さい
- xcodebuild -license コマンドまたは xcode のアプリからライセンスに同意すれば git clone できるようになります
Phoenixプロジェクト生成した時に出会ったエラー対処


Phoenixでサーバーを立ち上げたらエラーが発生したのでその対処のメモ

# 環境
mac: 10.14
Elixir: 1.7.4
beam: 10.1.1 
Phoenix: v1.3.4

# 1.プロジェクト生成
Phoenixのプロジェクトを `mix phx.new **` で生成する時に `Fetch and install dependencies? [Yn]` と依存関係のインストールを聞かれる。
この時に`Yes`にするといろいろとインストールしてくれる。
この後で`mix phx.server`としてサーバーを立ち上げるのだが、この時に下記のエラーに遭遇

```zsh
warning: found quoted keyword "test" but the quotes are not required. Note that keywords are always atoms, even when quoted, and quotes should only be used to introduce keywords with foreign characters in them
  mix.exs:57

warning: please add the following dependency to your mix.exs:

    {:plug_cowboy, "~> 1.0"}

This dependency is required by Plug.Adapters.Cowboy
which you may be using directly or indirectly.
Note you no longer need to depend on :cowboy directly.


[info] Application react exited: React.Application.start(:normal, []) returned an error: shutdown: failed to start child: ReactWeb.Endpoint
    ** (EXIT) shutdown: failed to start child: Phoenix.Endpoint.Handler
        ** (EXIT) "plug_cowboy dependency missing"
** (Mix) Could not start application react: React.Application.start(:normal, []) returned an error: shutdown: failed to start child: ReactWeb.Endpoint
    ** (EXIT) shutdown: failed to start child: Phoenix.Endpoint.Handler
        ** (EXIT) "plug_cowboy dependency missing"
```

`plug_cowboy`というモジュールが見つからないというエラー
このエラーが出る前の警告で`mix.exs`に追加しろとあるので警告の内容どおり追加

```zsh
diff --git a/mix.exs b/mix.exs
index aa6ef78..9c842cf 100644
--- a/mix.exs
+++ b/mix.exs
@@ -40,7 +40,8 @@ defmodule React.Mixfile do
       {:phoenix_html, "~> 2.10"},
       {:phoenix_live_reload, "~> 1.0", only: :dev},
       {:gettext, "~> 0.11"},
-      {:cowboy, "~> 1.0"}
+      {:cowboy, "~> 1.0"},
+      {:plug_cowboy, "~> 1.0"}
     ]
   end
```
diffはこんな内容
この状態に編集した後は`mix deps.get`で追加した`plug_cowboy`をインストールしてやる。

```zsh
Resolving Hex dependencies...
Dependency resolution completed:
  connection 1.0.4
  cowboy 1.1.2
  cowlib 1.0.2
  db_connection 1.1.3
  decimal 1.5.0
  ecto 2.2.11
  file_system 0.2.6
  gettext 0.16.0
  mime 1.3.0
  phoenix 1.3.4
  phoenix_ecto 3.6.0
  phoenix_html 2.12.0
  phoenix_live_reload 1.1.7
  phoenix_pubsub 1.1.1
  plug 1.7.1
  plug_cowboy 1.0.0
  plug_crypto 1.0.0
  poison 3.1.0
  poolboy 1.5.1
  postgrex 0.13.5
  ranch 1.3.2
* Getting plug_cowboy (Hex package)
  Checking package (https://repo.hex.pm/tarballs/plug_cowboy-1.0.0.tar)
  Using locally cached package
```

ここまでやったら`mix phx.server`を実行してサーバーが起動する所まで確認

```zsh
==> plug_cowboy
Compiling 5 files (.ex)
Generated plug_cowboy app
==> react
Compiling 13 files (.ex)
Generated react app
[info] Running ReactWeb.Endpoint with Cowboy using http://0.0.0.0:4000
02:19:21 - info: compiled 6 files into 2 files, copied 3 in 3.2 sec
```

# 2.リクエストを送る
これでできたと思い、ブラウザでlocalhost:4000にアクセスしたらまた別のエラー発生

```zsh
[error] Ranch protocol :error of listener ReactWeb.Endpoint.HTTP (cowboy_protocol) terminated
** (exit) :undef
[error] Ranch protocol :error of listener ReactWeb.Endpoint.HTTP (cowboy_protocol) terminated
** (exit) :undef
```
ネットで調べてみたがなかなか解決方法が見つからず試しに`./_build`ディレクトリを消して再度`mix phx.server`を実行してサーバーを立ち上げたら無事リクエストが通りwelcomeページが表示された。
部下を持つようになって実践してすごくよかったこと

# ある日、突然リーダーとなった
新卒2年目の5月、企画から携わっていた案件のリーダーとなった。
きっかけは、担当者の業務が回らなくなってしまったため。
部下には、同期と新卒の3名

その時に実践し、今でも役に立っている内容を備忘も兼ね記載する。

#対話をしないと何も始まらない
人と話すことが苦手でも、部下と話をしないと何も仕事が進まない。
####・何かあったら声を上げることの推奨
　－＞良いことも悪いことも、気合を入れたいときなど、積極的に声を出していくことを推奨した。
　　　最初こそ、気恥ずかしかったが互いの状況がすぐにわかるメリットはとても大きかった。
####・好きなことを認める
　－＞好きなことを否定する人とは、一緒に仕事はしたくないと思うことが人の常
　　　人様に迷惑をかけないことなら、否定しない

#何をやるかより、やってはいけないリストを作成する
やることは、筋道を立てて決まっていくが、まず最初にやってはいけないことを明確にする。
実際に決めていたことは
- 20時以降の残業
- 顧客に言われた内容で、業務にかかわることの返事
- 宗教・政治の話
- 休日出勤
- 失敗を隠す
- 無理をして出社

#1時間以上かかるタスクは課題管理に記載する。
全員が確認できる、課題管理表を作成し（当時はBacklogを使用）1時間以上かかるタスクは記載した。
また、着手した場合は状態を作業中に、中断した場合は未着手に状態を戻すことをルールとしていた。
今何をやっているのか、どれくらいの時間がかかったのかが聞かなくても分かるため、メンバーもリーダーも助かる。


#挨拶は絶対に自分からする
すれ違う際に、挨拶をするだけで普段のコミュニケーションのハードルが恐ろしく下がる。
「おはようございます」や「こんにちは」、「お疲れ様です」から最初ははじめ、何度か交わしたら「今日は天気が良いですね」といった簡単な雑談をすることで、交流が深められる。

#稼働は均等化しないと不平不満が爆発する
　－＞1日2日程度の稼働の不均衡なら、問題ないが常態化すると不平不満が爆発し、大変なコミュニケーションロスになってしまう。
　－＞一人に稼働が集中しているのであれば、細分化して他の人にタスクを振る。
　ー＞もしそれでも調整がつかない場合は、思い切って休暇の取得を勧めることも大切だ。

#バッファは多すぎるくらいがちょうどいい
　－＞一人の稼働を8時間で計算すると、ほぼ間違いなく足が出る。
　　　他の業務や、予期せぬ不具合、体調不良等を考慮し、60％くらいの稼働で計算するとちょうど良い
　　　もし、予定より早く終わったのであれば、顧客や上司に喜ばれるし評価が上がる

#本を読む
　自分の知らない知識を吸収するために、人の話を聞くことも大切だが、一人でもできる読書もとても大切だ
　－＞エリヤフ・ゴールドラットの本は本当にためになった。
　　特に次の2冊は何度も読んだ。
　　[ザ・ゴール](https://www.amazon.co.jp/ザ・ゴール-―-企業の究極の目的とは何か-エリヤフ・ゴールドラット/dp/4478420408/ref=tmm_hrd_swatch_0?_encoding=UTF8&qid=1541351328&sr=8-3)
　　[クリティカルチェーン](https://www.amazon.co.jp/クリティカルチェーン―なぜ、プロジェクトは予定どおりに進まないのか-エリヤフ-ゴールドラット/dp/4478420459/ref=pd_sim_14_3?_encoding=UTF8&pd_rd_i=4478420459&pd_rd_r=68e4f444-e054-11e8-815e-47d3513803cd&pd_rd_w=72KOn&pd_rd_wg=ydgOu&pf_rd_i=desktop-dp-sims&pf_rd_m=AN1VRQENFRJN5&pf_rd_p=b79503b3-46ea-4244-8b06-2f14c40a97b1&pf_rd_r=5W36HFJVV55X43H87GF9&pf_rd_s=desktop-dp-sims&pf_rd_t=40701&psc=1&refRID=5W36HFJVV55X43H87GF9)


そのほか、何かあれば追記します。
個人開発したWEBサービスをGoogle1位にするまでの戦略を語る

# 作ったもの
小説家になろうというネット小説投稿サイトのまとめサイト。
[なろう廃人のすすめ](https://narou-osusume.com/osusumes/2)

2019年1月現在、5ヶ月間安定して月間12000PV以上。
Ruby on Rails + heroku + cloudflareで維持費完全0円でSSL対応して動いています。

ジャンルが元々あって、そこに誰でも登録・レビュー・コメント出来る。

# 1, なにをやるかを決めるまで
### 自分の興味を持てる分野にする
これには2つ理由がある。

1つ目はやる気の継続のため。
2つ目は他にあるサイトとの差別化のため。

個人WEBサービスは注いだ熱量がそのまま差別化になると思っていて、
そこをなんとかするには好きなものをやるしかない。

逆に、他と圧倒的に違うだけのコンテンツを生産する熱量がないとキツいと思う。
（作るサービスのジャンルにもよると思います。）


### ブログで小さく需要確認する

**誰も必要としていないものを作る＝無駄**
なので、需要があるかを先に確かめたかった。

「小説家になろうのまとめサイトを作る」
と決めてから、ブログに15記事、おすすめ小説記事を書いた。

おすすめ記事にgoogleから流入するのを確認してから開発に入った。

###「先に需要確認する」というのが精神衛生上めっちゃ良かった。

個人開発で100％襲われるのが
「これ意味あるのか・・・？」とモチベが落ちる＆不安になることで、
先に需要を確認していたおかげで
この不安を振り切って先へ進めたのがめっちゃよかった。


需要測定は物によってはTwitterとかでもよかったかもしれない。


### [補足]レアカードの話

「ネット小説が好きな人」はめっちゃいる。
「個人でWEBサービスを開発できる人」もそこそこいる。

でも
【ネット小説が好きな人 × 個人でWEBサービスを開発できる人】
は今までいなかったっぽい。
だから、なにもそれ系のサービスがなかった。

個人で開発できる人は
その人が好きな「〇〇」に関するWEBサービスを調べてみて、
空いていたらそこを作れば良いところを狙えるかもよ？と思った。


# 2, 開発の話
### スマホ最優先
7-8割スマホの時代なので、
開発は常にスマホのレイアウトを確認しながら行なっていた。

PC対応したのはデイリーアクセスが100を越えてからくらい。
~~それまではヘッダー画像が寄ったまま放置していた。~~

### 技術的な話
Rails + bootstrap + heroku + GitHub

「作ること」に思考のリソースを取られると
「サービスをどうするか」を考えられない。

なのでとにかく慣れた技術で
高速に作ることを意識。

GitHubにpushして、herokuがオートで更新されるのめっちゃすごい。


# 3, 作っては「これ違う・・・」暗黒期

今の形に辿り着くまで3つ作り直しています。
需要を確認→需要を満たすものを作る
という間にある高い壁を感じました。

1つ目「2ch掲示板形式」
誰かが読みたいジャンルの質問をして、
誰かが答える形式。
**そもそも人がいないと無理だった。**

2つ目「NAVERまとめ形式」
**まとめる人がいないw**

3つ目「ジャンルが元々あって、おすすめ小説登録する形式」
最終的にここに辿り着いた。

同じジャンルのまとめが乱立するのが
めっちゃ鬱陶しいなと思い、
1ジャンル1記事で、そこにレビュー、コメント、いいねランキングを実装した。

みんなのアーカイブ的な使い方をしつつ、
＋αで他の人の感想とかをまとめて読みたいなという感じ。

#学んだこと
### 結局コンテンツ
一番大きかった学びが**「機能よりコンテンツ」**ということ。

**機能はユーザーの求める最小限のもので良い**
ということを肌で理解した。

新機能の開発って楽しいから
ついたくさん付けたくなるけど
とくに初期は全然要らなかった。

見てくれる人への価値になるかどうかを
もっとシビアに判定して作ればよかった。

### コンテンツを情熱もって作れるか

ストック型のCGMサービスにするときは
初期コンテンツは自分で作るor外注しかないと思う。

自分は
40ジャンル作り、
300以上おすすめ小説投稿して
50レビューくらい書いた。

ここで自分が興味持てるものじゃないと
作るのがそもそも辛いし、質も担保できなくなる。

# 反省

### サイトから反応返ってくるようにしたかったなー。
見るたびに何か変わる系のサイト
サイトから何か反応が返ってくる
とかできたらもっとよかったなぁと思う。

twitterとか、見るたびにコンテンツ変わるし、いいね付いたら数字出るし、
その辺が価値＋中毒になっていそう。

Qiitaとかもいいねされるの嬉しいし。

でも、これ系にするとログイン機能を作らなきゃいけなくて
だいぶユーザー側のハードルが上がるんだよね。。

~~しょうもないサービスに登録求められるとかメールくるとかすごく嫌い。~~

###デザインダサすぎ問題・・・。

bootstrapを使ったのに、
信じられないほどダサい。。

まず直すべきはここかもしれない。。

# これからのマネタイズ
all無料で作れているので動かし続けて全く問題はない。
けど、Amazonのアフィリエイトとか入れて
それなりにマネタイズしていきたい。

今回みたいので「僕のおすすめメーカー」とか作れたら面白いなーと思った。
「おすすめの映画20選！」みたいなのを作れて、
貼りたい人はamazonアフィ貼れる的な。

#最後に
長文、読んでくれてありがとうございました！

未来の自分へ、今の自分が何を考えていたのか忘れないように書きました。
もし少しでもあなたの参考になることがあれば嬉しいです。

以下、技術的な発信などしているので
もしよろしければフォローをお願いします。

これからもたくさん個人開発していこうと思います！！
では、また！
[twitterはこちら](https://twitter.com/ko_chan214)
やらかした...をシステム的に防止するTips集

色んなミスを防止する話。

## Git
### 「masterにpushしちゃった」
[[Git] 特定のブランチに対するpushを禁止し、ミスをシステム的に防ぐ](https://qiita.com/sensuikan1973/items/e6ab84403338a874b3aa)

### 「デバックコードをcommitしちゃった」
[Git hook](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%83%95%E3%83%83%E3%82%AF)のpre-commtitを利用するのも手。[このgist](https://gist.github.com/wacko/62560b45c1d191859d6b)がわかりやすくて参考になります。
設定の仕方は↑のpre-pushの記事と同じなので省略。

### 「一時的なcommitを入れたままpushしちゃった」
[Git hook](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%83%95%E3%83%83%E3%82%AF)のpre-pushで、[このgist](https://github.com/bobgilmore/githooks/blob/479e5e6321fc40aef02d57ebff5a3fc5e881d38f/pre-push#L49) みたいに commit-message を検証すればいい。
設定の仕方はry)

### 「インデントのずれがあるままcommitしちゃった」
[Prettier](https://prettier.io/)や[gofmt](https://golang.org/cmd/gofmt/), [rubocop](https://github.com/rubocop-hq/rubocop)みたいな自動フォーマットを言語に合わせて導入するだけでいい。

## Slack
### 「不意のEnterで送信されちゃった」
ワークスペースの環境設定からいい感じに設定できる！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/159680/86ca9af4-87b8-e73b-ab4f-96acce6853d8.png)

## ターミナル

### 「`rm -rf`で消えちゃった」
#### 確認を求めるようにする
```sh
$  echo alias rm="rm -i" >> source ~/.bashrc && source ~/.bashrc
```
しかし`-f`オプションの前には無力..
ちなみに、「>>」を「>」にtypoするだけで詰むこともあるので注意。

#### ゴミ箱にいくようにする
[rmtrash](https://github.com/PhrozenByte/rmtrash)を使う

```sh
$ brew install rmtrash
$ echo alias rt='rmtrash' >> source ~/.bashrc && source ~/.bashrc
```

rmでゴミ箱に行くこと に慣れすぎないように「rt」とかにしておくのが良さそう。

### 「コマンド忘れちゃった」
同一セッションであれば、ここらへんで事足ります。

```sh
# 履歴検索 + 再実行
Ctrl + R

# 履歴検索だけ
$ history | grep hoge
```

過去セッションも含めて検索することが多いなら、ログを自動で保存しておくという手があります。
以下は[iTerm2](https://iterm2.com/)の話です。

「メニューバー」 > 「Profiles」 > 「Default」を選択 > 「Edit Profile」 > 「Session」 > 「Miscellaneous」 > 「Automatically log sessionnうんたら」にチェック > 「Change」から出力先を指定 > 再起動
![image.png](https://qiita-image-store.s3.amazonaws.com/0/159680/b04a5f08-c4f9-00a1-d853-3815782da777.png)
注: この設定をする場合は、増え続けるファイル容量への対策がほぼ必須です。

## ソースコード
### 「FIXMEが未修正のまま生き残り続けちゃった...」
「タスクとして即座に記録しておく」のが一番大事ですがね...

#### FIXMEコメントが強調されるようにする
[TODO HighLight](https://marketplace.visualstudio.com/items?itemName=wayou.vscode-todo-highlight)を使うなどする。
![gif](https://github.com/wayou/vscode-todo-highlight/raw/master/assets/toggle-highlight.gif)

#### pre-pushで通知ストックする
例えば、gitのpre-pushで `FIXME: until 2018_12_12` というコメントを検知したら、2018/12/12まで適当な間隔でSlackに通知流す とかする。
ただこれ、どう考えても大げさでやりすぎです。やっぱり即座にry)

## Gmail
### 「宛先を間違えちゃった」
[gmailで社外の宛先・差出人だけ表示文字色を変える](https://qiita.com/ynakase/items/b5d62b86fd68ad757187)

### 「誤字脱字が多かった」
長文の場合はチェックするのが大変なので、校正機能を入れたエディタで下書き書いてから送るとかするのが良さそう。
ほんの一例ですが、VSCodeなら[テキスト校正くん](https://ics.media/entry/18859)を使ってみたりとか。
![kouseikun](https://ics.media/wp-content/uploads/2018/08/180811_textlint_demo.gif)
Rc<RefCell<T>>で変更可能なポインタ

```rust
use  std::rc::Rc;
use  std::cell::RefCell;

fn main() {
    let c = Rc::new(RefCell::new("aaa"));
    let c2 = c.clone();
    *c.borrow_mut() = "bbb";
    println!("{}", c2.borrow())
}
```

こう定義すればすべての参照がなくなってから破棄されるmutableな値を定義できる
~~`*(*c)`のあたりが忘れそうなのでメモ~~ そんなことする必要がなかった！！
ちなみに　 `thread_local!` を使いつつ変更可能な値を外に出したい時とかに使う(そのためにRcでラップした値が必要になったので調べてた)

---

追記.
@Pctg-x8 さんにコメント頂いたので修正させて頂きました 🙇
Python 3.6 環境に Chainer をインストールする

# Anacondaをインストール

https://www.anaconda.com/download/
上記からAnacondaディストリビューションをダウンロード（現在はPython3.7が入る模様）

# Anaconda promptを起動する
Anaconda promptを起動する

# Chainer のインストール
pip install chainer --user
でインストールする。SuccessすればOK。

（備考）
--userの有無によってchainerがインストールされる場所が異なる。
(--userなし)

c:\users\xxxxx\anaconda3\lib\site-packages\chainer\*

(--userあり)

c:\users\xxxxx\appdata\roaming\python\python36\site-packages\chainer\*

## No module named 'chainer'が出なくなる！
--user つきの pip install をすれば上記エラーが出なくなる。
chainerを使って機械学習を試しましょう。
Zendesk * TOPページのカスタマイズに使えるテンプレート【FAQ特化型CMS】 


## テンプレートの基本
zendeskでのテンプレート言語には{{ }}を使います。
```{{この中に書く}}```


終了を表す場合は{{/ }}を使います。
```{{始まり}}
{{/終わり}}```

コメントアウトは{{!-- --}}を使います。
```{{!--複数行もOK--}}```

## カテゴリ・セクション・記事の出力


zendeskの基本階層はカテゴリ＞セクション＞記事という３階層で、
記事は、必ず１つのカテゴリ・セクションに紐づけられています。
出力には```{{each}}```を利用しますが、いずれを出力する場合もカテゴリから順に表記する必要があります。

##### カテゴリを１つずつ出力する場合

```html:html
{{each category}}
  <p>{{name}}</p>
{{/each}}
```

##### セクションを１つずつ出力する場合

```html:html
{{each category}}
  {{each section}}
    <p>{{name}}</p>
  {{/each}}
{{/each}}
```

##### 記事を１つずつ出力する場合

```html:html
{{each category}}
  {{each section}}
    {{each article}}
      <p>{{title}}</p>
    {{/each}}
  {{/each}}
{{/each}}
```





カテゴリ内・セクション内・記事内で出力できる要素と呼び出し名はそれぞれ決まっています。
```{{title}}```　```{{name}}```　など
[zendesk developers - Objects](https://developer.zendesk.com/apps/docs/help-center-templates/objects#section-object)に詳しく乗っています。


なお、TOPページにおいて、ひとつのカテゴリ・セクションの記事のループは６つまでで、６つ以上記事がある場合は「もっとみる」を表示出来ます。




## 条件分岐

とはいえ、このカテゴリは記事まで出したい！
このカテゴリはセクションまで！
など種類によって出し分けしたい場合があります。

上記のような条件分岐には```{{is}}```があります.
```{{is ●● '××'}}```で●●が××かを判定、trueがかえれば実行されます。

#####「お知らせ」カテゴリの記事を表示

```html:html
{{each category}}
  {{is name 'お知らせ'}}
    {{each article}}
      <p>{{title}}</p>
    {{/each}}
  {{/is}}
{{/each}}
```


#####「お知らせ」カテゴリの記事を表示、それ以外のカテゴリはセクションを表示
```{{else}}```を使うとfalseの場合の処理も合わせて記入できます。

```html:html
{{each category}}
  {{is name 'お知らせ'}}
    {{each article}}
      <p>{{title}}</p>
    {{/each}}
  {{else}}
    {{each section}}
      <p>{{name}}</p>
    {{/each}}
  {{/is}}
{{/each}}
```





#### else if処理を行いたい場合
残念ながらelse if的な構文が無いので、苦肉の策としてこうしてみました

#####「お知らせ」と「重要」以外のカテゴリはセクションを表示

```html:html
{{each category}}
  {{is name 'お知らせ'}}
  {{else}}
    {{is name '重要'}}
    {{else}}
      {{each article}}
        <p>{{title}}</p>
      {{/each}}
    {{/is}}
  {{/is}}
{{/each}}
```
pjaxでPrism.jsを正しく動作させる

WordPressテーマ「[Godios.](https://godios.simmon.design/)」([dev.toに匹敵する速度を出せるWordPressテーマを開発した話](https://qiita.com/Simmon/items/613bb4314278ac30378c))のpjaxモードを使用した際、シンタックスハイライトのライブラリ[Prism.js](https://prismjs.com/)がうまく動かなかったのでその解決法。

Prism.jsは次のように`<code>`のclassに言語を指定することでコードが装飾されます。`prism.js`が実行されると`<code>`タグに指定した`language-{言語}`classが`<pre>`にも動的に追加されます。

```html
<!-- 記述例 -->
<pre>
<code class="language-javascript">
console.log('Prism.js');
</code>
</pre>

<!-- prism.jsが実行されるとpreタグにlanguage-javascriptクラスが追加される -->
<pre class="language-javascript">
<code class="language-javascript">
console.log('Prism.js');
</code>
</pre>
```

一方、pjaxは遷移先ではJavaScriptが実行されないので、`<pre>`タグの書き換えが発生せずに`prism.css`の背景色が適用されません。下は実際の画像ですが`<code>`部分などにはcssが適用されているのがわかります。
![<pre>のCSSが適用されていない](https://qiita-image-store.s3.amazonaws.com/0/65966/b2e6b382-8feb-d48c-1f9e-b0bfbe96824d.png)

問題は`<pre>`の書き換えだけのようなので、遷移先で`prism.js`の関数を再度実行すれば解決しそうです。ググったらドンピシャのがありました。
[How To Re-Run Prism.js On AJAX Content](https://schier.co/blog/2013/01/07/how-to-re-run-prismjs-on-ajax-content.html)

Developper Toolsのコンソールで`Prism.highlightAll();`を実行すると無事変わりました。あとはWebサイトの方でも遷移先で実行するように書いてあげればOKです。(Godiosの場合は子テーマの`/js/god-dispatcher.js`の`godDispatcher`関数に加えます。([参考](https://godios.simmon.design/usage/feature/god-mode/))
DockerのGet Startedを進めながら今思っている各用語への理解

## はじめに

こんばんは。 :waxing_gibbous_moon: 
1日いちqiitaをはじめてから、はじめての週末が終わろうとしています。
やってみていて思うのは、アウトプットって時間がかかるし
インプットだけなら自分の裁量で進めて変更もできますが、
アウトプットっていうのは、何か一つのものについてまとめなければならないということで、
骨の折れる作業だなということです。
でも、そんな中で毎日自分が何を学べているのかを残し、どんなに少しのアウトプットしかなくても、
「keep swimming! :fish: 」進んでるんだと確かめられるのはとてもいいなぁと思いますので、
引き続き頑張りたいと思っています。


Dockerのtutorial Get Startedを現在Part5まで進めました。
本番での動作までもうちょっと、、
https://docs.docker.com/get-started
以下の文章はtutorial part2からの引用ですが、とてもわかりやすく気に入っています。
> A registry is a collection of repositories, and a repository is a collection of images—sort of like a GitHub repository, except the code is already built
（レジストリは、リポジトリの集まりであり、リポジトリは、イメージの集まりです。もうcodeがbuildされた状態である以外は、リポジトリはgithubのリポジトリと同じ。）

## 現時点での各用語を自分なりにまとめる

### イメージ(image)
勉強する前は漠然とプロジェクトとほぼ同意？と思ってた。でも違った。なんだろう？と考えてる。
他のマシンと共通で動かすことのできるソフトウェアの実体と動作環境のパッケージみたいなもの？ :thinking: 

### リポジトリ
githubのリポジトリにあたる単位
### レジストリ

~~githubのブランチにあたる単位~~

リポジトリの集合
### タグ
imageのversion管理をしてくれるので、つけたほうがいい。
githubのコミットみたいな概念かな。

### dokker runがやってること
githubのcloneとpullのイメージ。
- Docker Hubからのpull
- コンテナ立ち上げ。

### swarm
Dockerで複数のホストへのスケールを可能にするクラスタ用ツール。
普通は1つのホストを使用しているけど、このモードにすると複数使えるらしい。
複数のnodeという概念で構成されている。
1つがswarm managerとなる。その他のnodeはworkerとして割り当てられる。

### service
本番環境で動作するアプリケーションのこと?と思ったけど、ちがうかもしれない。。

### stack
docker-compose.ymlにかかれてる内容そのもの？


## 
明日は本番環境で動かす部分をやりたい。
もう夜も遅いので。Happy coding!
Rails-tutorial初心者（6章）（自分メモ）

基本的に、２周目のときにブラッシュアップできたらなぁっておもっています。

### 開発環境
下記vagrantにて構築して利用しています。

```
$ cat /etc/system-release
CentOS release 6.10 (Final)
$ uname -a
Linux localhost.localdomain 2.6.32-754.3.5.el6.x86_64 #1 SMP Tue Aug 14 20:46:41 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
$ rails -v
Rails 5.1.6
$ ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]
```


###６章スタート


@2018/10/30
6.1.4 ユーザーオブジェクトを検索する 
~
6.2 ユーザーを検証する・・・nameのフォーマットとか、重複チェック等
~

model用のテストは、
test/models/配下にrails g したときに生成される。

テストについて -> <https://railsguides.jp/testing.html>

modelのテストを実行
`$ rails test:models`

~
6.2.1 有効性を検証する
setupはテストの最初に実行される。
まで対応。


６章はUserモデルの属性のnameやemailにバリデーションを複数設定することをやります。

・ valid?・・・・有効性チェック
・ 存在チェック
・ 長さチェック
・

また、それらをテスト駆動で開発するために、テストの書き方についてもここで実施しています。




＠2018/10/31
この章はさらっと行きます。

6.2.2 存在性を検証する
presence ... 渡された属性が存在することを検証

assertは真が変えれば、true,偽であればfalseを返す
assert_notは真が変えれば、false,偽であればtrueを返す

Rubyでは、偽はnilかfalse、真はそれ以外

maximum: XXXで定義

6.2.3 長さを検証する

U.errors.messages[:name]とか
ここまで・


＠2018/11/0１
6.2.4 フォーマットを検証する

%wは文字列を配列にわけてくれます。
 %w[foo bar baz] => ["foo", "bar", "baz"]


###`inspectとは？？？？`
railsのデバックのメソッドです。
いい感じに見やすくオブジェクトの情報を出力してくれるメソッドです。
たとえば、ハッシュや配列、クラスの属性等。

```
$ user = User.new(name: "michel", email: "abcdanbcd@example.com")
=> #<User id: nil, name: "michel", email: "abcdanbcd@example.com", created_at: nil, updated_at: nil>

$ user
=> #<User id: nil, name: "michel", email: "abcdanbcd@example.com", created_at: nil, updated_at: nil>

$ user.inspect
=> "#<User id: nil, name: \"michel\", email: \"abcdanbcd@example.com\", created_at: nil, updated_at: nil>"
irb(main):009:0> 

```
これは全ての基礎となっているObjectクラスに実装されたメソッドです。
オブジェクト全てに使えるということです。

また、似ているメソッドに.to_s（to_String)がありますが、それよりもあとのバージョンのrubyに実装されました。
inspectメソッドはオブジェクトを人間が読める形にした文字列として返します。


＠2018/11/02
・正規表現の話
下記サイトで対話的に正規表現をたしかめることができます。
  <http://www.rubular.com/>
\ 正規表現 \
\←エスケープにも使われています。



＠2018/11/03

6.2.5 一意性を検証する

Userのモデルの属性の、name,emailのうち、emailはユーザ名として利用するため
重複しないように一意になるようにバリデーションが必要です。

・userモデルのテストにまずテストをかく
・メールアドレスの大文字小文字関係ない問題
・・・upcaseとuniqueness: { case_sensitive: false }

・トラフィック増のときに一意性を保つために、DB側でインデックスにも一意性を持たす。
`$ rails generate migration add_index_to_users_email`

ファイルを生成する。
db/migrate/20181103042347_add_index_to_users_email.rb

indexを追加する処理を入れる

$ rails db:migrate

testがエラーになる。

fixtures（フィクスチャ）とは？・・・tset関連→DB関連
test/fixtures/テーブル名.yml
事前に用意したテストデータを読み込み、常にDBの内容を一定に保つための仕組みのことを、フィクスチャと呼ぶ
いったんまだ使わないので、あとにしましょう

#### メールアドレスに対するvalidationはいろいろ
 ・長さ、フォーマット（正規表現）、大文字小文字、重複問題



@2018/11/04
### 6.3 セキュアなパスワードを追加する

** マイグレーションついて **
 このタイミングで、パスワード属性をUsersに持たせる必要が発生したが、classを編集したり、新たにクラスを作り直したりする必要はないし、DBにSQLでカラムを追加する必要が本来あるはずだ。
 ただし、それを不要にしてくれるのがRailsのマイグレーションという機能だ。
 
rails g migration によりdb/migrate/XXXXXX.rbが生成され、追加した後続の定義が用意される。
そしてrails db:migrate をすることで、schema.rbに最新のDB構造が反映される。

一旦完了しました。
Handsontableのヘッダーを複数行やセルの結合に見せかける方法

## はじめに
Handsontableで、ヘッダーの複数行表示やセルの結合を行うことになり、実装方法の調査を行った。機能としては有料版にあるが、無料で実装したかったので、@reds26さんの[『Handsontableのヘッダーをカスタマイズして複数行表示や結合に対応』](https://qiita.com/reds26/items/9291efbb028457ae6a33)を拝借させていただくことにした。

## 問題点
ただ、自身が実装するテーブルにおいて、以下の問題点が発生した。

- 列数が多く幅が長くなると、スクロールした時に、ヘッダーとデータのカラムの位置がずれてしまう。 
- ヘッダーとデータの列数が異なる時、列幅調整を行うと、異なる列の列幅が調整されてしまう。（結合されている列数分ずれた位置を調整する。）

## 原因
[afterGetColHeader gets called many times for the same column](https://github.com/handsontable/handsontable/issues/1409)
上記のリンクにafterGetColHeaderイベントに関する内容が記載されていたので、読んでみたところ、このイベントはrender()が呼ばれる度に発生すると書かれていた。自身で検証した際には、列幅調整をしたりスクロールすると、各列に対してイベントが複数回呼ばれていた。（スクロールでは、イベントが発生しないときもあった）
afterGetColHeaderでのヘッダーの生成がうまく処理しきれず、ヘッダーとデータのカラムの位置ずれが発生していたものと思われる。
列幅調整のカラムの位置ずれは、列幅調整時にセルの結合が考慮されていないせいだと思われる。(無料版で意図しない拡張であるから、当然ではあるが。)

## 実装方法
上記の問題を回避する為に、afterGetColHeaderの第2引数にヘッダーのTH要素が渡されるので、そのTH要素の内容を書き換えることにした。TH要素にdivタグを複数埋め込んで複数行に見せたり、罫線の指定で、セルの結合をしているかのように見せかけたりしている。

```index.html
<div id="grid"></div>
```
```style.css
.handsontable th {border-right: none }
.inner-border { border-bottom: solid thin #ccc }
.border-right { border-right: solid thin #ccc }
.student-name { height: 48px; border-right: solid thin #ccc }
```
```script.js
document.addEventListener("DOMContentLoaded", function() {
  var data = [
    ['*** ***', 90, 70, 88, 100, 92, 95, , 98, 99, 100, 55, 60 ],
    ['*** ***', 89, , 88, 100, 92, 95, 97, 98, 55, 92, 55, 60 ],
    ['*** ***', 100, 70, 82, 99, 92, 95, 97, , 69, 88, 55,  ],
    ['*** ***', 77, 91, 81, 75, 91, 75, 96, 91, 77, 96, 55, 60 ],
  ];
  
  var periods = [
    {year: 2018, startMonth: 7, endMonth: 12},
    {year:2019, startMonth: 1, endMonth: 6},
  ];

  var headerHtml = getHeaderHtml(periods);　/* THに埋め込むhtmlを列ごとに作成しておく */
  var colWidths = [ 100 ];
  for (var i = 1; i < colWidths.length; i++) colWidths.push(60);
  
  new Handsontable(document.getElementById('grid'), {
    data: data,
    manualColumnResize: true,
    colHeaders: true,
    colWidths: colWidths,
    afterGetColHeader: function(col, TH) {
      TH.innerHTML = headerHtml[col];
    },
  });
}, false);

function getHeaderHtml(periods) {
  var headerHtml = [getThHtml('氏名', 'student-name')];
  for (var idx in periods) {
    var period = periods[idx];
    for (var month = period.startMonth; month <= period.endMonth; month++) {
      var year = '';
      var yearClsName = 'inner-border';
      if (month == period.startMonth) {
        year = period.year;
        yearClsName += ' empty';
      }
      if (month == period.endMonth) yearClsName += ' border-right';
      headerHtml.push(getThHtml(year, yearClsName) + getThHtml(month, 'border-right'));
    }
  }
  return headerHtml;
}

function getThHtml(text, clsName) {
  // Handsontableが自動で生成するヘッダーの内容に合わせる
  return '<div class="relative '+ clsName +'"><span class="colHeader">' + text + '</span></div>';
};
```
![サンプル.png](https://qiita-image-store.s3.amazonaws.com/0/271280/0c60f1c9-9092-22fc-1e5d-8434f1363646.png)

## 最後に
Handsontableのように、ブラックボックスな部分で複雑な処理を行っているものは、提供されている機能以外で無理に拡張しようとすると不具合を回避するのが難しくなる。今回はやりたいことができて良かったが、基本的には、他のライブラリや有料版の購入を検討した方が良いと思われる。
いまさら聞けない！Gitとは☆ざっくり図で解説してみた

[プログラミング教室ITWORKS](http://listenmaker.1strentalserver.info/itworks/)のayakaです。

あまりにメジャーになりすぎて「いまさら聞けないぞ…」という自分のために簡単な構成図を交えて、まとめてみたいと思います:joy:

#Git = ソースコードを管理するシステム
Gitのできること＝ソースコードを管理する事です。
整理整頓が苦手な人が個人開発し修正をしまくっていると、どのソースコードがいつ時点の物なのか？さらにはどれがリリース版なのか？わからなくなってきす:sob:これは大問題ですよね。。しかしGitのシステムコマンドを使えばコマンドを打った時点のソースコードをファイルの改定順に保管できます。(バージョン管理)
###他にもある!
補足ですが他にもソースコードを管理するシステムは存在します。

- CVS
- Subversion

###違いは"分散型"と"集中型"
ざっくり図のような違いがあります。

- 分散型(Git)
各々ローカルにリポジトリを持ち、そこへコミットできます。まずはローカルへコミットするため、開発者がソースコードを改定する毎にコミットできます。
![分散型.PNG](https://qiita-image-store.s3.amazonaws.com/0/304376/8f87f5be-2001-4629-8118-e46a87967cc1.png)


- 集中型(CVS/Subversion)
![集中型.PNG](https://qiita-image-store.s3.amazonaws.com/0/304376/34ec964c-4569-e48f-53b4-a7d68eab30c9.png)



#GitとGitを利用するサービス
GitとGitを使用したサービスを混同すると設置時に混乱します:cry:
各サービスは個人の用途により選択しましょう。

![Git概要.PNG](https://qiita-image-store.s3.amazonaws.com/0/304376/e2c16902-f5af-bf01-84f2-4338a90bb5de.png)


- Git
commitやpush等のコマンドが利用できるソースコード管理システム

- GitHub
Gitを扱うためのWebUIが用意されたオンラインサービス

- Gitblit
Gitを扱うためのWebUIが用意されたローカル用サービス
Kotlin 1.3 Coroutine async/await 完了処理に修正が必要

Android Studio 3.2.1

Kotlin 1.3 になって、やっとCoroutine(コルーチン)が正式版になりました。それはいいのですが、Kotlin 1.2 で快適に動いていたCoroutineの非同期完了待ち処理が1.3になってコンパイルエラーになり、驚きました。以下の修正が必要でした。

# Kotlin 1.2

``` Kotlin: 
private fun asyncPlus1(value: Int): Deferred<Int> = async(CommonPool) {
    return@async value + 1
}
private fun uiMethod1() {
    // Main thread
    launch(UI) {
        // Background thread
        asyncPlus1(1).await().let {
            // Main thread
            text_view.text = it.toString()
        }
    }
}
```



# Kotlin 1.3

``` Kotlin
private fun asyncPlus1(value: Int): Int {
    return value + 1
}
private fun uiMethod1() {
    // Main thread
    GlobalScope.launch(Dispatchers.Main) {
        // Background thread
        async { asyncPlus1(1) }.await().let {
            // Main thread
            text_view.text = it.toString()
        }
    }
}
```

書き方はもっといろいろな書き方があるようです。
Coroutine 公式ドキュメントはこちらです。
https://kotlinlang.org/docs/reference/coroutines-overview.html

以下は、Kotlin 1.2時代に参考にさせていただいていた記事です。

Kotlin+Androidでasync/await
https://qiita.com/k-kagurazaka@github/items/702c92bc3381af36db12

入門Kotlin coroutines
https://qiita.com/k-kagurazaka@github/items/8595ca60a5c8d31bbe37
Unityで作ったゲームがウイルス扱いされた話

デジゲー博お疲れ様でした。

帰ってきてから、即座にぶっ倒れて起きたら、
**「インストーラーをDownloadしたら、トロイの木馬として検出されました」**

と、ユーザさんからレポートを受けて、
かなり慌てて色々調べたり、検証したりしました。

### 調査1

- Unityの吐いたファイル
- インストーラー（Inno Setup）が吐いたファイル
- 展開されたファイル

全部洗ってみた。
ファイル改竄はどの段階でも見当たらず、また、当然この状態ではアンチウイルスには引っかからない。

### 調査2

アンチウイルスあるある、WhiteListのURL以外からDownloadされたものは、特定の検知ロジックが走る。

これを思い出し、実際に配信に使用している、配信サービスConcaからのダウンロードで検証。

**結果、再現！！**

![IMG_0110.PNG](https://qiita-image-store.s3.amazonaws.com/0/6047/85e81b71-5bc3-e580-a0f1-45a7076d9db8.png)

アンチウイルス系のトラブルは検証環境が作れれば9割解決したも同然なので、一気に対処に突入！

### 対処

参考になったのはこちらの話
https://github.com/felicienfrancois/node-innosetup-compiler/issues/10

どうも、 "setup.exe" という名前のインストーラーは、blacklist的に検知されてしまう模様。
（はー、Windowsくそかー！！と内心ブチ切れてましたwww）

ということで、インストーラー名を変えて、配信データ更新。

**ただ、再度検証するも、変わらず検出されてしまう。。**

この手のアンチウイルスあるある、Downloadして検知したデータの結果は、

- ソースURL
- ファイル名
- +α（サイズを見ることがあれば、ハッシュまでみてくれることも）

でキャッシュするという話、、これを思い出し、exeをアーカイブした時の名前も変更して、再更新。

**そして無事に、解決！！**

### 終わりに

CDでの配布からDL配布に移行する同人ソフト開発の方も多いと思いますが、物理媒体より、アンチウイルス絡みのトラブルに巻き込まれやすいので、気をつけましょう。

> ちゃんとした証明書でインストーラーを署名する、or WhiteListなURLの配信サービスを使用することで、多くの検知ロジックをバイパスできるので、余裕がある人は、無用なトラブルを避けるために、そういう方法の検討も視野にいれてもいいのかもね。

### おまけ

なんか妙にPV伸びたので、この記事を書く元になったUnityのクイズゲーム動画を貼っておきます。
年末のコミケット95、二日目 X-60a 「AloMarron」で頒布予定なので、気になったら是非きてね！

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">クイズ御伽小学校の最新版はこんな感じになりましたわ！J⋈`•ヮ&lt;｡) <br>明日のデジゲー博で試遊展示&amp;頒布するので、ミクサ&amp;リンちゃんと勉強したい人はぜひぜひー <a href="https://twitter.com/hashtag/wlw?src=hash&amp;ref_src=twsrc%5Etfw">#wlw</a> <a href="https://t.co/Y4ucgf0VCG">pic.twitter.com/Y4ucgf0VCG</a></p>&mdash; 月琴かりん✿二日目X-60a (@karinharp) <a href="https://twitter.com/karinharp/status/1058667483442241536?ref_src=twsrc%5Etfw">2018年11月3日</a></blockquote>



-----------------

_というか、この手の話、検証環境をつくるのがそもそもコスト必要だったり、最悪手元に検証環境つくれなかったりすると、マジで不毛な作業の繰り返しになったりと、開発者に絶大なコストとストレスを強いるやつなので、ホイホイ誤検知するアンチウイルスプログラムつくるベンダーは滅んで欲しい。
マイクロソフト、お前のことだぞ！_

自分用の記録
https://twitter.com/Antamanide/status/1059074752566845441
Ruby on Rails環境構築

WindowsのPCにRuby開発環境を構築する方法をシンプルにご紹介します。

## 環境
Windows10 Pro(64bit OS)
Ruby 2.4
Rails 5.2.0

## 手順
1. RubyInstallerのダウンロード
windowsでは、公式サイトで公開されているRubyInstallerというインストーラーを使用して、ウィザードに従って進めていくだけで簡単に実行環境が構築できます。

https://rubyinstaller.org/downloads/

2.4系をダウンロード

![download-installer.png](https://qiita-image-store.s3.amazonaws.com/0/290840/d9156ffe-2d9a-bc8b-c056-4a389370918f.png)

※64bit OSの場合はx64版、32bit OSの場合はx86版を選択してください。

ダウンロードが完了すると、インストーラーのセットアップに進みます。

![select-directory-and-options.png](https://qiita-image-store.s3.amazonaws.com/0/290840/906442e6-9af4-6dd8-d9fb-561be75dda4d.png)

※「Add Ruby executables to your PATH」にチェックを入れると自動で環境変数に加えてくれます。

インストールが済んだら、コマンドプロンプトを起動してRubyのバージョンを確認してみてください。

```
> ruby -v
```

![command-ruby-version.png](https://qiita-image-store.s3.amazonaws.com/0/290840/e8c1f096-6e19-6702-cb70-735c78dfec4f.png)

２. Railsインストール
次に、Railsのインストールです。そのまま、コマンドプロンプトを使用します。

最新バージョンでいい場合

```
> gem install rails
```

バージョン指定したい場合

```
> gem install rails --version “4.2.7.1” -N
```
※4.2.7.1は例です。適宜書き換えてください。

![install-rails.png](https://qiita-image-store.s3.amazonaws.com/0/290840/03e48290-7286-26bc-8651-28419b892204.png)

Railsのインストールが完了したら、バージョンの確認をしてみましょう。

```
> rails -v
```

![rails-version.png](https://qiita-image-store.s3.amazonaws.com/0/290840/82752177-24c6-d07f-8fc8-95c950dae832.png)

## まとめ
手順通り実行していただければ環境構築は簡単ですね。
実際の現場では、Rubyのバージョンが切り替えやすいように、rbenvを使ったり、仮想環境で構築したりしていると思います。
今回はシンプルにwindows環境での構築でしたが、次はdockerと組み合わせて構築してみようと思います。
[Git] 特定のブランチに対するpushを禁止し、ミスをシステム的に防ぐ

## はじめに
ブランチ名をターミナルに表示させていてもなお、pushミスしたことはあるでしょうか。 (はい..あります...)
![sample_image.png](https://qiita-image-store.s3.amazonaws.com/0/159680/7dc7a698-099e-509f-c58a-430f3393574a.png)
そんな己の不注意さへの対策には、もはやpush不可能にしておくしかありません。
プルリクベースの運用なら禁止にして問題ないはず。

## やること
例えばrelease系ブランチにpushしようとしたら、こんな感じに怒られるようにする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/159680/4f1be18b-5a70-a711-a7be-8db4a2451625.png)
[Git hook](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%83%95%E3%83%83%E3%82%AF)を使って実現できる。

## 個人として
**個人のミスを防止する目的だけ**なら、ローカルで個別に禁止すればいい。

### 特定のレポジトリに適用する
```terminal
# 対象のディレクトリに移動する
$ cd ~/tmp_git_practice

# pre-pushファイルを作成する
$ cd .git/hooks
$ vim pre-push   # ここにスクリプトを書く

# 実行権限「x」をつける
$ chmod +x pre-push
```

【pre-pushファイル】[^1]

```.sh
#!/bin/bash

# pushを禁止するブランチ
readonly MASTER='master'
readonly RELEASE='^.*release.*$'  # 「release」文字列を含む全てのブランチ

while read local_ref local_sha1 remote_ref remote_sha1
do
  if [[ "${remote_ref##refs/heads/}" = $MASTER ]]; then
    echo -e "\033[0;32mDo not push to\033[m\033[1;34m master\033[m \033[0;32mbranch\033[m"
    exit 1
  fi
  if [[ "${remote_ref##refs/heads/}" =~ $RELEASE ]]; then
    echo -e "\033[0;32mDo not push to\033[m\033[1;34m release\033[m \033[0;32mbranch\033[m"
    exit 1
  fi
done
```

### 全てのレポジトリに適用する
[git init](https://git-scm.com/docs/git-init)の[template_directory機能](https://git-scm.com/docs/git-init#_template_directory)を使って、init/clone時に自動で適用させる。

```sh
# template用のディレクトリを作る
$ mkdir -p ~/.git_template/hooks

# push直前に実行するスクリプトファイル。ここに先述のコードを置く。
$ vim ~/.git_template/hooks/pre-push

# 実行権限「x」をつける
$ chmod +x ~/.git_template/hooks/pre-push

# テンプレートに指定する
$ git config --global init.templatedir '~/.git_template'
```

ただし、これは既存のレポジトリには反映されない。
それがしたい場合は、対象のレポジトリの`.git/hooks/pre-push`ファイルを置き換え/新規作成すれば良い。

## チームとして
[ブランチ制限の有効化](https://docs.github.com/ja/github/administering-a-repository/enabling-branch-restrictions) をしてください。
[APIも提供されている](https://developer.github.com/v3/repos/branches/)ので柔軟に対応できる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/159680/72224739-d3fb-409b-fbe4-5773d69507ee.png)


[^1]: bashの装飾については、[ANSI Escape sequences](http://ascii-table.com/ansi-escape-sequences.php)が参考になります。
Python + Django でJSONの送受信

アプリケーション開発で、JSONの送受信は必要な場合が多いので、DjangoでJSONを試してみます。

###1.主な環境

| カテゴリ       |       Right align |
|:-----------------|------------------:|
| os               |windows 10 home 64bit | 
| python           |            3.6.5 |
| django             |              2.0.7|
| requests|                2.20.0| 

参考サイト
https://tokkan.net/python/django7.html


###2.アプリケーションを作成する

```cmd.prompt
python manage.py startapp jsontest
```

###3.views.pyを編集する

簡単なパラメータを受信して、戻り値も同様にJSONを返すようにしています。

```jsontest/views.py
from django.shortcuts import render
import json
from django.http.response import JsonResponse
from django.views.decorators.csrf import ensure_csrf_cookie

@ensure_csrf_cookie
def index(request):

    if request.method == 'GET':
        return JsonResponse({})

    # JSON文字列
    datas = json.loads(request.body)

    # requestには、param1,param2の変数がpostされたものとする
    ret = {"data": "param1:" + datas["param1"] + ", param2:" + datas["param2"]}

    # JSONに変換して戻す
    return JsonResponse(ret)

```

###4.urls.pyを作成する

```jsontest/urls.py
from django.urls import path
from . import views

app_name = 'jsontest'
urlpatterns = [
    path('', views.index, name='index'),   
]

```

###5.tests.py

参考サイトに倣って、testからPOSTして確認する。

```tests.py
from django.test import TestCase

import requests
import json


url = "http://127.0.0.1:8000/jsontest/"
sess = requests.session()

print(sess.get(url))

csrftoken = sess.cookies['csrftoken']

# ヘッダ
headers = {'Content-type': 'application/json',  "X-CSRFToken": csrftoken}

# 送信データ
prm = {"param1": "パラメータ１", "param2": "パラメータ２"}

# JSON変換
params = json.dumps(prm)

# POST送信
res = sess.post(url, data=params, headers=headers)

# 戻り値を表示
print(json.loads(res.text))
```

###6.確認

####(1)サーバを起動しておいて

```cmd.prompt
(venv) C:\data\python\myproject>manage.py runserver

```

####(2)testを実行する

別窓でコマンドプロンプトを実行します。

```cmd.prompt
(venv) C:\data\python\myproject\jsontest>python tests.py
<Response [200]>
{'data': 'param1:パラメータ１, param2:パラメータ２'}
```

「Django REST Framework」でAPIを作るほうがよさそうですが、いったん基本的なところを押さえておきたかったのでこのやり方を試しました。
ずんだのMARQUEE問題 C#編

もとねた: [ずんだのMARQUEE問題](https://qiita.com/tbpgr/items/5765ff5bcb418ae6c30e)

この程度の問題だと、正規表現や文字列置換などを利用して、解くことを考えるのが一般的だと思います。"もとねた"でもそのような解き方を採用していますが、せっかくなので別の切り口を考えてみたい。そこで、以下では`<h1>test</h1>`というような文字列をxmlの1要素とみなし、C#に標準で用意されているXML読み込み用のライブラリを利用して、解答を試みています。

```csharp
using System;
using System.Linq;

using System.Xml.Linq;

namespace Zunda
{
    class Program
    {
        static void Main(string[] args)
        {
            var xml = @"
                <h1>test</h1>
                <h2>test</h2>
                <h3>test</h3>
                <div>div test1</div>
                <div>div test2</div>
                <div>div test3</div>
            ";

            var elements = xml.Split(new string[] { System.Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)
                              .Where(line => !string.IsNullOrWhiteSpace(line))
                              .Select(line =>
                              {
                                  var element = XElement.Parse(line);
                                  var name = element.Name.LocalName;
                                  return name.StartsWith("h") ? new XElement("marquee", element.Value, new XAttribute("scrollamount", name.Substring(1))) : element;
                              });

            foreach (var element in elements)
            {
                Console.WriteLine(element);
            }
        }   
    }
}
```

以上の実行結果は次の通りになるはずです。

```
<marquee scrollamount="1">test</marquee>
<marquee scrollamount="2">test</marquee>
<marquee scrollamount="3">test</marquee>
<div>div test1</div>
<div>div test2</div>
<div>div test3</div>
```
[書評]ベイズ推論による機械学習入門

ベイズ統計学に基づいた機械学習をするに当たって、その根底にある数学理論をまとめたのが本書になります。前提知識として、線形代数や微積分の知識があるといいと思いますが、本書はかなり丁寧に書かれており、補足が充実しているので、読みやすいと思います。以下、各チャプターの要約を書きたいと思います。

## Chapter1

本書における機械学習の定義をした後、主なタスク(回帰、分類など)を説明します。その後、確率の基本計算、グラフィカルモデルを一通り説明した後、ベイズ学習の利点と欠点を説明しています。利点と欠点は以下の通りです。

### 利点

- 様々な問題を一貫性を持って解ける
- 対象の不確実性を定量的に取り扱うことができる
- 利用可能な知識を自然に取り入れることができる
- 過剰適合がしにくい

### 欠点

- 数理的な知識を要する
- 計算コストがかかる

## Chapter2

ここではベイズ学習でよく使われる基本的な確率分布の紹介と説明をしています。それぞれの分布の特徴や期待値、分散などが説明されています。

## Chapter3

Chapter3ではChapter2で紹介された分布を使って、ベイズ学習の解説をしています。学習と予測に必要な計算の解説から始まり、分布に基づいた学習について解説しています。また、それ以外にも線形回帰に基づいた学習と予測の解説をしています。 

## Chapter4

Chapter3ではある分布に基づいて学習の解説をしていましたが、画像や自然言語など、より複雑な統計的性質を持つデータに対して、解析をする手法を解説しています。解説される内容として、最初に混合モデルの概要と、ギブスサンプリングや変分推論など、いくつかの近似アルゴリズムの概念的説明から始まり、具体的な実現例として、１次元ポアソン混合モデルと多次元ガウス混合モデルを構築、簡単なデータのクラスタリング実験を解説しています。

## Chapter5

ここではより実践的な確率モデルについて解説をします。内容として、次元削減の手法や隠れマルコフモデル、自然言語処理、ロジスティック回帰、ニューラルネットワークなどです。ここの内容は複雑なモデルが多く、興味がある箇所から読みと良いかもしれません。