OmniAICreator/Qiita-1.07M huggingface dataset:
HTML5 音声付き4択クイズを作ってみた

デモ：http://pie.karou.jp/zd.html


Web Speech APIで問題文を読んでもらいます
```
speechSynthesis.speak(new SpeechSynthesisUtterance("問題 1：　問題文"));
```

```
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Javascriptでクイズ作成</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script>
var mondaibun = `
日本で2番目に面積の広い都道府県はどこでしょう,岩手県,a,b,c
日本で2番目に大きな湖はどこでしょう,霞ヶ浦,a,b,c
日本で2番目に長い川はどこでしょう,利根川,a,b,c
`;

var mondai = null;
var sound = [
   "folder3/seikai.mp3",
   "folder3/huseikai.mp3",
   "folder3/start.mp3"
];
sound = sound.map(function(v) {
   var audio = new Audio(v);
   audio.load();
   return audio;
});

function start() {
   $("#start").after('<p id="info"></p><div id="sentaku"></div><hr>');
   $("#start").remove();
   sound[2].play();
   mondai = mondaibun.trim().split("\n");
   setTimeout(function() {
      next();
   }, 200);
}

function next() {
   $("#sentaku").empty();
   if (mondai.length == 0) {
      $("#info").text("終わり");
      return;
   }
   var arr = mondai.shift().split(",");
   var str = arr.shift();
   speechSynthesis.speak(new SpeechSynthesisUtterance("問題。" + str));
   $("#info").text("問題 :" + str);
   var kotae = arr[0];
   arr = _.shuffle(arr);
   arr.forEach(function(v, i) {
      var flag = (kotae == v) ? true : false;
      var html = `<p>${i+1}: <input type="button" value="${v}" onclick="sentaku(${flag})"></p>`;
      $("#sentaku").append(html);
   });
}

function sentaku(x) {
   if (x == true) {
      speechSynthesis.cancel();
      sound[0].currentTime = 0;
      sound[0].play();
      setTimeout(function() {
         next();
      }, 800);
   } else {
      sound[1].currentTime = 0;
      sound[1].play();
   }
}
</script>
</head>
<body>
   <h1>Javascriptでクイズ作成</h1>
   <h3>Web Speech APIを利用したクイズです。 対応ブラウザ: Chrome</h3>
   <hr>
   <button id="start" onclick="start()">スタート</button>
</body>
</html>
```
Pinterest APIで画像を取得する

# はじめに

Pinterestの特定のボードから画像をすべて取得したいなーと思ったときの自分用のメモ。
何度も実行するわけではなかったので、ブラウザで画像だけ一気に表示して保存してしまおうという魂胆。


# ソースコード

早速ソースコードを晒しておく。

`npm init`してpackage.jsonを作成し以下のような感じに。
これくらいならtypescriptなしで書けよという話かもしれませんが。。

```json:package.json
{
  "name": "pinterest_dl",
  "version": "1.0.0",
  "description": "",
  "main": "index.html",
  "scripts": {
    "tsc": "tsc"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "jquery": "^3.1.1"
  },
  "devDependencies": {
    "@types/jquery": "^2.0.32",
    "typescript": "^2.0.3"
  }
}
```

次にHTML。

```html:index.html
<!DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8" />
	<script src=".\node_modules\jquery\dist\jquery.min.js"></script>
	<script src=".\src\index.js"></script>
</head>

<body>
	<div id="images"></div>
</body>

</html>
```
最後はmainとなるTypeScript。
コードを保存したあと、`npm run tsc init`して`tsconfig.json`を作る。
excludeにnode_modulesを追加する。

```json:tsconfig.json
{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es5",
        "noImplicitAny": false,
        "sourceMap": false
    },
    "exclude": [
        "node_modules"
    ]
}
```

以下のコードを作成したあと、`npm run tsc`をルートフォルダで実行すればトランスパイルされる。

```ts:src/index.ts
function getImages(url: string): string[] {
	console.log(url);
	if (url !== undefined && url !== null && url !== "") {
		$.getJSON(url)
			.done(function (res) {
				console.log(res);
				res.data.forEach(element => {
					$('#images').append('<img src="' + element.image.original.url + '">');
				});
				console.log(res.page.next);
				getImages(res.page.next);
			});
	} else {
		return [];
	}
}

var token: string = "<pinterest token>";
var userId: string = "<your userId>";
var boardName: string = "<your board name>";
var link: string = "https://api.pinterest.com/v1/boards/" + userId + "/" + boardName + "/pins/?access_token=" + token + "&fields=image";

getImages(link);
```

Pinterest APIのトークンなどは以下のサイトから取得しておくと便利。

https://developers.pinterest.com/tools/api-explorer/

注意点は、このAPIから返ってくるJSON文字列は25枚の画像しかない。
次の画像へのURLはpage.nextに入っているのでそこを参照していくと連続して取得できる。

# おわりに
完成したらindex.htmlをブラウザで表示。たくさんの画像のみが表示された！
いろんなサービスがどんどんAPIを実装してくれているから非常に助かるなーと思う次第でした。
MacOS Sierra(10.12) に Pyenv で Python3 + openCV3 をインストールする

OpenCVで色々やろうというプロジェクトに巻き込まれたので、MacにPythonでopenCVできる環境を整えることになりました。
ちなみに筆者は今までPythonの使用経験はほとんどありません。
なので、以下の導入方法もこれがベストなのかよくわからず、環境によってはうまくいかないようなものかもしれませんので、悪しからず。

---

# 目次
- 前提
- pyenv のインストール
- python3 のインストール
- openCV 3 のインストール
- numpy の インストール
- 動作確認

---

# 前提

- OS : OSX Sierra (10.12)
- Homebrew は導入済みとします

```
$ brew update // brewを最新に
```

※ ```brew update``` に失敗した場合、OSアップデートの際に ```/usr/local``` 以下のパーミッションの再設定が必要だったということなようなので以下を参考にしてください。
https://blog.ymyzk.com/2016/06/macos-sierra-homebrew/

---

# pyenv のインストール

※参考 github
https://github.com/yyuu/pyenv

```
$ brew install pyenv
```

```~/.bash_profile``` に ```pyenv init```を叩くところを追加

```
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
```
---

# python3 のインストール

```
$ pyenv install --list // これでインストール可能なversionが見られます。お好きなものを。
$ pyenv install 3.5.2
```

僕の環境ではこの時、zlibがないとお怒られました。

```
$ pyenv install 3.5.2
(中略)
zipimport.ZipImportError: can't decompress data; zlib not available
make: *** [install] Error 1
```

どうも最近Xcodeのバージョンを8にしたので、そのせいっぽいです。
※参考
http://qiita.com/maosanhioro/items/bf93540515d4ea75b222

```
$ xcode-select --install
xcode-select: note: install requested for command line developer tools
// GUIのインストーラが立ち上がります
```

これでいけました。

```
$ pyenv install 3.5.2
Downloading Python-3.5.2.tar.xz...
-> https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tar.xz
Installing Python-3.5.2...
Installed Python-3.5.2 to /Users/masaori/.pyenv/versions/3.5.2
```

めでたし。

---

# openCV 3 のインストール

```
$ brew install homebrew/science/opencv3 --with-python3
// なぜか brew install opencv3 だと怒られました・・・
```

ところがこれは失敗

```
/tmp/opencv3-20161008-83364-6nps9q/opencv-3.1.0/modules/videoio/src/cap_qtkit.mm:46:9: fatal error: 'QTKit/QTKit.h' file not found
#import <QTKit/QTKit.h>
        ^
1 error generated.
```

どうも Sierra (10.12) と openCV 3.1 の組み合わせで起こる問題らしいです。
https://github.com/Homebrew/homebrew-science/issues/4104
https://github.com/opencv/opencv/pull/7159

この辺で解決していて、タイムリーにプルリク取り込まれているようなので、オプションで```--HEAD```を設定

```
$ brew install homebrew/science/opencv3 --with-python3 --HEAD
(中略)
==> Summary
🍺  /usr/local/Cellar/opencv3/HEAD-dd379ec_4: 286 files, 48.4M, built in 3 minutes 34 seconds
```

無事インストール成功しました！
※ --HEAD指定ということで、stableではないので他の問題が起こるかもしれません。。

### シンボリックリンクを張る
```brew install```の最後に出てくる、openCVのインストール先のpathに対して張ります。
今回は ```/usr/local/Cellar/opencv3/HEAD-dd379ec_4``` ここ。

```
$ ln -s /usr/local/Cellar/opencv3/HEAD-dd379ec_4/lib/python3.5/site-packages/cv2.cpython-35m-darwin.so ~/.pyenv/versions/3.5.2/lib/python3.5/site-packages/
```

---

# numpy の インストール
```
$ pip3 install numpy
```
これはつつがなく完了。

---

# 動作確認
python上でimportしてみましょう。

```
$ python -V // pyenvが正しいversionを参照しているか確認
3.5.2

$ python
Python 3.5.2 (default, Oct  8 2016, 17:32:08) 
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.38)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.1.0'
```

よくできました！
Ansible を使って Go をインストールする


開発環境を共有しやすくするため、Ansible を使ってツール類をインストールします。
Ansible の Galaxy にある Go の Role がとても分かりやすかったためメモしておきます。

- [joshualund.golang](https://galaxy.ansible.com/joshualund/golang/) - Ansible Galaxy
- [jlund/ansible-go](https://github.com/jlund/ansible-go) - GitHub

## 事前準備

前提条件として、Ansible がインストールされていることとします。

```bash:Ansibleのバージョンを確認
$ ansible --version
ansible 2.1.2.0
  config file = 
  configured module search path = Default w/o overrides
```

必要なファイルは末尾に記載してありますので、ディレクトリにまとめて保存してから作業します。

## 作業手順

まず、Ansible Galaxy から Go をインストールするための Role をダウンロードします。
システムワイドに配置する方法と、ローカルディレクトリに配置する方法があります。
デフォルトは前者ですが、システムや実行ユーザーによっては書き込み権限が問題になることがあります。後者の場合は *-p* オプションを使います。必要に応じて使い分けましょう。

```bash:Roleをダウンロード
$ sudo ansible-galaxy install -r roles.yml
```

```bash:Roleをローカルディレクトリにダウンロードする場合
$ ansible-galaxy install -p ./roles -r roles.yml
```

次に、Playbook を書いて実行します。
一応 `site.yml` を書いていますが、中で呼び出しているファイルを直接指定しても構いません。

```bash:Playbookを実行
$ sudo ansible-playbook -c local -i development site.yml
```

なお、ここではローカル固定にしているので SSH を使わないために *-c local* オプションを付けています。リモートの環境をセットアップする場合はオプションを指定する必要はありません。

Playbook が正常に実行されると、環境変数 *GOROOT* と *PATH* が設定されます。再度ログインしてインストールされた Go のバージョンを確認しましょう。

```bash:インストールされたGoのバージョンを確認
$ go version
go version go1.7.1 linux/amd64
```

インストールするバージョンやアーキテクチャを変更したい場合は変数を設定しておきます。

- *go_tarball*
- *go_tarball_checksum*
- *go_version_target*

## ファイル一覧

以下のファイルを作業ディレクトリにまとめて保存してから実行してください。

- `roles.yml`: Ansible Galaxy からダウンロードする対象
- `site.yml`: Playbook を実行するときのマスターファイル
- `tools.yml`: 今回は Go をインストールするための Playbook
- `development`: 対象とするホスト名

```yaml:roles.yml
- src: joshualund.golang
```

```yaml:site.yml
- include: tools.yml
```

```yaml:tools.yml
- hosts: all
  become_user: yes
  roles:
    - { role: joshualund.golang }
```

```txt:development
localhost
```
オントロジー入門


人工知能（Artificial Intelligence：AI）を学ぶ上でオントロジーという言葉があります。
ここでは、初心者用にオントロジーに関連する言葉をまとめておきます。

#オントロジー（ontology)とは
人工知能を研究する際に「知識」を記述すること自体を研究する過程で研究されたものです。

オントロジーとは
・情報システムの世界でも仕様書があるように、
　知識を書くときも、そこに「仕様書」があるべきという考え方
・哲学用語で「存在論」のこと
・人工知能の用語としては「概念化の明示的な仕様」と定義される

オントロジーには、ヘビーウェイトとライトウエイトというものがあります。

#ヘビーウェイト・オントロジー
・人間がきちんと考えて知識を記述していくためにはどうしたら良いか
という考え方

#ライトウェイト・オントロジー
・コンピュータにデータを読み込ませて自動で概念間の関係性を見つけようという考え方
・効率化を重視し、完全に正しくなくても使えるものであれば良くてややいい加減だけど、現実的な思想
・ウェブマイニング（ウェブデータを解析して知識を取り出す）
・データマイニング（ビッグデータを分析して知識を取り出す）

#ワトソン
IBMが開発した人工知能
ウィキペディアの記述をもとにライトウェイト・オントロジー
を生成する
1997年　IBMのディープブルーがチェスの世界チャンピオンに勝利
2011年　ワトソンがクイズ番組のチャンピオンに勝利
reflectフリーなクエリビルダーsqllaにORM-likeなメソッドを追加した

## sqllaとは

https://github.com/mackee/go-sqlla

- Go向けのクエリビルダー
- 事前にDBのスキーマをstruct tagを用いて定義してクエリビルダーのコードを自動生成

```bash
$ go get github.com/mackee/go-sqlla/cmd/sqlla
```

---

```go
//go:generate sqlla

//+table: user
type User struct {
    ID      uint64 `db:"user"`
    Name    string `db:"name"`
    Age     uint32 `db:"age"`
    IsAlive bool   `db:"is_alive"`
}
```

```bash
$ go generate
```

---

## コード生成のメリット その1

- 型解決がコンパイル時にできる
  - スキーマ定義とは違う型の値を入れようとするとコンパイルエラー
  - reflectを使わなくても良いのでreflectを使うクエリビルダー(github.com/Masterminds/squirrel など)に比べて高速

---

## コード生成のメリット その2

- 補完が効く
  - 当然型も表示される
<a href="https://gyazo.com/a6e77e30a8ca5d774bb8969c5c06f861"><img src="https://i.gyazo.com/a6e77e30a8ca5d774bb8969c5c06f861.gif" alt="https://gyazo.com/a6e77e30a8ca5d774bb8969c5c06f861" width="484"/></a>

---

## ここまでは今まで出来ていたこと

---

## どのように使っていたかというと

```go
query, args, err := NewUserSQL().Select().ID(uint64(1)).ToSql()
if err != nil {
    return fmt.Errorf("unexpected user query build error: %s", err)
}
row := db.QueryRow(query, args...)
err = row.Scan(&u.ID, &u.Name, &u.Age)
if err != nil {
    return fmt.Errorf("user query execute error: %s", err)
}
```

---

## :innocent: だるい :innocent:

---

## ORM-like methods

---

## 一般的なORMの機能

- オブジェクト/構造体への結果のマッピング
- オブジェクト/構造体に対応するDB内のデータへの操作メソッドの付加
- 言語の構文を利用したSQLの組み立て
- 接続/トランザクション管理(コネクションプール / nested transactionなど)
- リレーション
- schemaのmigration

---

## 今までのsqllaの機能

- ~~オブジェクト/構造体への結果のマッピング~~
- ~~オブジェクト/構造体に対応するDB内のデータへの操作メソッドの付加~~
- 言語の構文を利用したSQLの組み立て
- ~~接続/トランザクション管理(コネクションプール / nested transactionなど)~~
- ~~リレーション~~
- ~~schemaのmigration~~

---

## sqllaのORM-like method

- オブジェクト/構造体への結果のマッピング <- New!
- オブジェクト/構造体に対応するDB内のデータへの操作メソッドの付加 <- New!
- 言語の構文を利用したSQLの組み立て
- ~~接続/トランザクション管理(コネクションプール / nested transactionなど)~~
- ~~リレーション~~
- ~~schemaのmigration~~

---

## クエリを組み立てて直接structを取得

```go
u, err := NewUserSQL().Select().ID(uint64(1)).Single(db)
```

---

## 複数行を返すクエリ

```go
// SELECT * FROM user WHERE is_alive = 1;
users, _ := NewUserSQL().Select().IsAlive(true).All(db)
for _, u := range users {
    fmt.Printf("id: %d, name: %s\n", u.ID, u.Name)
}
```

---

## 構造体からUPDATE文の発行

```go
u, _ := NewUserSQL().Select().ID(uint64(1)).Single(db)

// UPDATE user SET is_alive = 0 WHERE id = 1;
// SELECT * FROM user WHERE id = 1;
uu, _ := u.Update().SetIsAlive(false).Exec(db)
```

---

## DELETE文

```go
u, _ := NewUserSQL().Select().ID(uint64(1)).Single(db)

// DELETE FROM user WHERE id = 1;
err := u.Delete(db)
```

---

## :innocent: これで十分やろ :innocent: 

---

## まだ不十分かつ入れたいと思っているもの

- リレーション
  - 単純なアソシエーションメソッドではなくJOINで一気にとってくるやつ
- ORとCASEとHAVING
- Prepare
- 英語のドキュメント
- メモリアロケーション削減

---

## そんなわけで頼む使って見てくれ頼む:pray:
CentOS7にPostgreSQL9.6をGUIで、インストール (KDE Desktop)

#KDE Desktopで、PostgreSQL9.6をGUIで、インストールをしてみました。
http://qiita.com/a23/items/5e53d42bf349352c6762
のKDE版です、
![01.png](https://qiita-image-store.s3.amazonaws.com/0/59472/b0aa5b8c-41aa-4a37-9fdf-5e13c3fb3857.png)
最初に、お気に入りに、必要なものを、表示するようにしておくと、なにかと便利です。
![02.png](https://qiita-image-store.s3.amazonaws.com/0/59472/96aa6e09-463a-022a-cd5c-15c5bb4447e0.png)

手順は、画面の雰囲気が少し変わる程度で、Windows / gonomeと、同じです。
![05.png](https://qiita-image-store.s3.amazonaws.com/0/59472/8769ab16-8149-7c81-3964-d99ea5dd5ecc.png)

注意点は、(自分の環境だけかもしれませんが)GUIのファィアーウォールのチェックが表示されなかったこと。
![29.png](https://qiita-image-store.s3.amazonaws.com/0/59472/a4ff549f-c44a-1410-0a6e-2081eba548c6.png)

***
詳細な手順と画面は、こちら、http://a23.sblo.jp/article/177184883.html?1475916194
Cloud9でPostgreSQLを利用しHerokuにRails5.xをデプロイした時の手順

HerokuにCloud9からRails5.0.0.1をデプロイする時に行った方法です。

# ワークスペース作成
Cloud9に新規でワークスペースを作成
blankを選択
<img width="859" alt="スクリーンショット 2016-10-08 15.31.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/35100/c4609425-a6cf-6703-5ae0-b7bfc31ec210.png">

# Railsのインストール・アプリの作成
```
gem install rails --no-ri --no-rdoc
rails new myapp --database=postgresql
cd myapp
bundle install
```
[Getting Started with Rails 5.x on Heroku](https://devcenter.heroku.com/articles/getting-started-with-rails5#local-workstation-setup)

# Hello World
```
rails generate controller welcome
```

app/views/welcome/index.html.erb

```
<h2>Hello World</h2>
<p>
  The time is now: <%= Time.now %>
</p>
```

config/routes.rb

```
root 'welcome#index'
```

この時点ではPostgreSQLの設定をしていないので `rails s -p $PORT -b $IP` をやってもエラーになります。

# Cloud9でPostgreSQLを使えるようにする
PostgreSQL起動

```
sudo service postgresql start
```

ユーザー作成+α

```
sudo sudo -u postgres psql
postgres=# CREATE USER username SUPERUSER PASSWORD 'password';
postgres=# UPDATE pg_database SET datistemplate = FALSE WHERE datname = 'template1';
postgres=# DROP DATABASE template1;
postgres=# CREATE DATABASE template1 WITH TEMPLATE = template0 ENCODING = 'UNICODE';
postgres=# UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'template1';
postgres=# \c template1
postgres=# VACUUM FREEZE;
postgres=# \q
```

Cloud9の設定にユーザー名とパスワードを保存

```
echo "export USERNAME=username" >> ~/.profile
echo "export PASSWORD=password" >> ~/.profile
source ~/.profile
```

dababase.ymlを編集

```
default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: <%= ENV['USERNAME'] %>
  password: <%= ENV['PASSWORD'] %>
  host:     <%= ENV['IP'] %>
  
development:
  <<: *default
  database: myapp_development

production:
  <<: *default
  database: myapp_production
  username: myapp
  password: <%= ENV['MYAPP_DATABASE_PASSWORD'] %>
  ```

# Cloud9で動作確認

DB作成

```
rails db:create
rails db:migrate
```

起動

```
rails s -p $PORT -b $IP
```

# Herokuにデプロイ

ログイン

```
heroku login
```

コミット

```
git init
git add .
git commit -m "init"
```

デプロイ

```
heroku create
git push heroku master
```

以上となります。
これでうまくいかない場合や不明点などありましたらお知らせ下さい。
PostgreSQLのデータ型とその挙動のまとめ（数値型）

Postgresにテーブルを作成する際に、Postgresのデータ型を見てみると、数値型だけで１０個もある。。どうやって使い分けたら良いのかわからなかったので、調べてみた。

この表は、PostgreSQL公式ページに記載されている内容。
![image](https://qiita-image-store.s3.amazonaws.com/0/77722/b32b637e-74b2-cdec-c92e-a28ce2383454.png)



# 数値型の大まかな区分け

Postgresの数値型には、①整数型、②小数点型、③自動採番型の３つがある。

1. 整数型
    - smallint
    - integer
    - bigint
1. 浮動小数点データ型
    - decimal
    - numeric
    - real
    - double precision
1. 自動採番型
    - smallserial
    - serial
    - bigserial

# 整数型
整数型の特徴は、整数しか格納できないこと。小数を含んだ値を入れようとするとエラーになる。この３つの型の違いは、格納できる数値の最大桁数。

| 型名      | 最小数                | 最大数                | 
|:---------|---------------------:|---------------------:|
| smallint | -32768               | +32767               |
| integer  | -2147483648          | +2147483647          |
| bigint   | -9223372036854775808 | +9223372036854775807 |

最大桁数が多くなれば、それだけハードディスクの容量を消費することになる。公式ページによると、整数型の中ではintegerが一番バランスの取れた型となっているため、整数を扱う場合、特に理由のない場合はinteger型を利用する事との記述があった。

具体的にはHDDのコストが高く、容量を出来る限り節約したい場合のみsmallintを利用し、integerの桁数で足りない値を格納する可能性がある場合はbigintを利用すると言った具合。

## 浮動小数点データ型
浮動小数点データ型の特徴は、小数を格納できること。型によって桁数に制限があるものとないものがある。桁数に制限がある型を利用しているフィールドにそれ以上の桁数を持つ値が入れられた場合、自動的に計算し、値を切り詰めて格納する。
例えば、real型のフィールドに12.34567という値が入った場合、格納後の値は12.3457となる。（最後の桁を四捨五入）

| 型名                 | 精度                                 | 
|:--------------------|:------------------------------------|
| real                | 6桁までの整数及び小数                   |
| double precision    | 15桁までの整数及び小数                  |
| numeric             | 最大 131,072桁の整数部と16,383桁の小数部 |
| decimal             | 最大 131,072桁の整数部と16,383桁の小数部 |

### numericとdecimalの違い
Postgresでは、これらの値の違いはない。pgadminでは、decimal型のフィールドが選択できないようになっている（リストに表示されない）。　sqlではdecimal型を指定することはできるが、**作成後に型を確認するとnumericに変換される。**
![image](https://qiita-image-store.s3.amazonaws.com/0/77722/fa17be90-2b50-4139-4eaa-09d5f57d9211.png)

# 自動採番型
この型は、値を入力しなくても自動的にシーケンステーブルから取得した値が登録される型となる。
serial型を指定すると、**テーブル名_シーケンスの値名_seq**という名前のシーケンスオブジェクトが作成され、関連付けられる。種類によって、最大値が異なる。

| 型名        | 最小数 | 最大数               | 
|:-----------|------:|--------------------:|
| smallserial| 1     | 32767               |
| serial     | 1     | 2147483647          |
| bigserial  | 1     | 9223372036854775807 |

##シーケンスが最大値に達した場合の挙動について
最大値に達した場合の挙動は、DB作成時に選択ができるようになっている。シーケンスオブジェクトの定義をプロパティから開くと、限界リセットというチェックボックスがある。ここがONになっていると限界値に達したときに一旦リセットされる。選択した型よりも限界値が大きくなっていたりすると、値がリセットされずにエラーが出続けてしまうので注意。
![image](https://qiita-image-store.s3.amazonaws.com/0/77722/08496f51-6214-446f-2080-b36df587acab.png)
※キー項目などで限界値リセットすると、当然古い値との重複が避けられない。古いものを順に削除しているログなどの情報以外は、この選択は取れない可能性が高い。

# まとめ
数値を格納する型の数だけを見てもこれだけの数の型があると、どれを使うか迷ってしまいますが、HDDの価格や記録できる領域が劇的に大きくなった昨今では、real型やsmallint型などの精度を犠牲にしてでも利用領域を小さくするような型を利用するシーンは少なくなってきている様に思います。整数を扱うフィールドならinteger型を、小数を扱うフィールドならnumeric型を選択するようにしておけば、間違いなさそうです。


# 参考ページ
https://www.postgresql.org/docs/current/static/datatype-numeric.html
勤怠管理botみやもとさんを導入してみた

[勤怠管理bot - みやもとさん](https://github.com/masuidrive/miyamoto)が便利そうで自分のSlack環境に導入しようとしたら思いの外ハマったので。
※2016/10/08に設定した際の記事です。

## 環境設定
[README](https://github.com/masuidrive/miyamoto/blob/master/README.md)を参考に設定。

一部Slack側のインターフェースが多少変わっている模様で英語が読めない私は以下の箇所で若干ハマる。

[Slack Outgoingの設定](https://github.com/masuidrive/miyamoto/blob/master/README.md#slack-outgoingの設定)
Outgoing WebHooksを追加するためにはここで検索
![スクリーンショット 2016-10-08 15.26.03.png](https://qiita-image-store.s3.amazonaws.com/0/122574/37aa50e4-4063-7c21-0b47-13bac1ef2813.png)

[Slack Incomingの設定](https://github.com/masuidrive/miyamoto/blob/master/README.md#slack-incomingの設定)
Incoming WebHooksも同じように検索
![スクリーンショット 2016-10-08 15.26.29.png](https://qiita-image-store.s3.amazonaws.com/0/122574/cb8136cc-1f27-5678-289b-4dfd42801070.png)

bot名の設定はこんなかんじ
![スクリーンショット 2016-10-08 15.34.23.png](https://qiita-image-store.s3.amazonaws.com/0/122574/43d09d75-2d55-077c-139c-1db6742e4635.png)

その他は問題なく順調に設定。

## いざ動かす
一通り設定が完了したのでLet'sみやもとさん

![スクリーンショット 2016-10-08 15.16.19.png](https://qiita-image-store.s3.amazonaws.com/0/122574/14bc6f1b-c4f5-1272-f1ed-8f741ed56024.png)

ふむ。
動かない。

どうやらここでrowNoがうまく取得できていない様子。
![スクリーンショット 2016-10-08 15.39.13.png](https://qiita-image-store.s3.amazonaws.com/0/122574/df790a8b-e454-5d22-c480-d422c253e875.png)

ここで[先人の知恵](http://qiita.com/DQMerA/items/2bfb9e7e0a20d585ae20#%E3%81%95%E3%82%89%E3%81%AB%E3%82%82%E3%81%86%E4%B8%80%E7%99%BA%E4%BF%AE%E6%AD%A3)を拝借。
カレンダーの取得はiCalから取得するように既に修正されていたので以下のみ設定。

```main.gs
      var year = parseInt(matches[2]);
      var month = parseInt(matches[3].replace(/^0/, ''));
      var day = parseInt(matches[4].replace(/^0/, ''));
```

そしてtest1()のコメントを解除して実行してみると

![スクリーンショット 2016-10-08 15.44.11.png](https://qiita-image-store.s3.amazonaws.com/0/122574/420b3c63-468f-3d65-41fe-7ed979749a08.png)

宛先のユーザがいないので宮本さんが独り言を言いはじめる。
実際にスプレッドシートに時間が記録されている。

よし、これはいけるんじゃないだろうか。

## いざ動かす（二回目）
あとはSlackから連携して終了ー。

![スクリーンショット 2016-10-08 15.46.50.png](https://qiita-image-store.s3.amazonaws.com/0/122574/29f6c87f-b1f3-3aff-0d7c-b26309f48a49.png)

はい。また無視されました。
ここで途方に暮れて[ISSUE](https://github.com/masuidrive/miyamoto/issues)に何か情報がないか探しに行く。

するとこんなISSUEが。
[日付に 2015/08/04 のように 08 が入ると動かない](https://github.com/masuidrive/miyamoto/issues/14)

ん？
今日は・・・10月8日。。。
まさか・・・

あんまり関係ないんじゃないかと思いつつ開始日を変更してみる
2016−10−08 -> 2016-10-01
![スクリーンショット 2016-10-08 15.52.57.png](https://qiita-image-store.s3.amazonaws.com/0/122574/e727e326-bb10-cdc6-158d-dcac05dda067.png)

## いざ動かす（三回目）
ダメもとでお願いみやもとさん

![スクリーンショット 2016-10-08 15.56.11.png](https://qiita-image-store.s3.amazonaws.com/0/122574/a3045680-7b64-9320-e5b6-f765f3b206b3.png)

やっと返事してくれた！
ありがとうございますありがとうございます。

これって、開始日が８月と各月の8日以外に始めればちゃんと動くのでは。。。
まぁ結果的に解決ということで。


## 参考
[Slackでみやもとさんを使おうと思ってし……死んでる……](http://qiita.com/DQMerA/items/2bfb9e7e0a20d585ae20)
[slackで勤怠管理できる「みやもとさん」を使う](http://qiita.com/miyamori/items/ce4ab418ac720c1f7e6b)
経験分布函数

経験分布函数のメモ（ちょっと込み入った話で、どっちかと言うと厳密に

## 経験分布函数とは？
```math
I(x;a):= \left\{
\begin{array}{l}
    1, x\ge a\\
    0, x< a
\end{array}\right.
```

とする。データが$x_1,x_2,\ldots,x_n$のとき

````math
G(x):=\frac{1}{n}\sum_{\alpha=1}^{\infty}I(x;x_{\alpha})
```
と定義します。

## 経験分布函数の微分
KL情報量の近似の計算をする場合など、$\frac{dG}{dx}$の計算をする場合がありますが、通常の意味での微分は意味をなしません。
というのは、$I(x;a)$の値が$0$から$1$にジャンプする時は、通常の意味では微分が定義できませんね。

この点を工夫したのがDiracのδ函数です。形式だけ先に言えば

```math
\frac{I(x;a)}{dx}=\delta(x-a)
```

と表されます。ここでは微分の形で表現しましたが、両辺を積分すると

```math
\begin{eqnarray}
I(x;a)
&=& \int_{-\infty}^{\infty}\frac{dI(x;a)}{dx}dx \\
&=& \int_{-\infty}^{\infty}\delta(x-a)dx \\
&=& \left\{
\begin{array}{l}
    1, x\ge a\\
    0, x< a
\end{array}\right.
\end{eqnarray}
```

という形ですね。
正式にはSchwarzの超関数(連続線形汎関数の枠組み)と呼ばれる形式にまで考えを広げないと矛盾なく話を整理出来ませんが、専門の本に委ねましょう:)

上に述べた$I(x;a)$はHeaviside函数とも呼ばれます。
macOS10.12でマルコフ連鎖のサンプルを動かしてみた

## 準備

* [macOS 10.12 SierraにPython環境を構築する - tnil's memo](http://tnil.hatenadiary.jp/entry/macOS_10.12_SierraにPython環境を構築する)


```bash:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

```bash:
brew install mecab
brew install mecab-ipadic
#
sudo easy_install pip
sudo pip install mecab-python
```

## マルコフ連鎖

* [マルコフ連鎖を使ってブログの記事を自動生成してみた - karaage. [からあげ]](http://karaage.hatenadiary.jp/entry/2016/01/27/073000)

```
git clone https://github.com/karaage0703/TextGenerator.git
cd TextGenerator
python PrepareChain.py sample.txt
```

動作確認

```bash
$ python GenerateText.py 1
あとはサクっとお絵描き。
```

```bash
$ python GenerateText.py 2
東京ではてなブロガーさんであるかが伝わったと思う。今思うとよくあんな面倒くさいことやった方が断然興味深いし、出産の時危うい状況になってしまったという話が身近にあったりした写真を魚眼レンズで撮影した補間して開けば使用できます。
```

### 他のテキストを用いる

```bash:
$ brew install w3m
$ w3m -dump http://karaage.hatenadiary.jp/entry/2016/01/27/073000 > a.txt
$ python PrepareChain.py a.txt
```

```bash:
$ python GenerateText.py 10
```

> □KaraageontheLemonスターをつけましょう。•ROS(7)たw超オシャレ！一番はやはりお金でしょうね？今後、そんな問題が多くなってくるのかもしれません。pysample.ShareonTumblrだとコマンドの羅列になってくるのかもしれませんので、何人かの人にめっちゃ迷惑かけてしまいまし決め手になったか結果を紹介していた。•初めてモノクロフィルムに挑戦したら恐ろしいことになりました。章の流れのようなやり取りが連日繰り返されて、自分のメールの文章にはてなidが紛れています。n

### RFCを読んでみよう

* https://www.ipa.go.jp/security/rfc/RFC3704JA.html

```bash:
w3m -dump https://www.ipa.go.jp/security/rfc/RFC3704JA.html > a.txt
python PrepareChain.py a.txt
```

```bash:
python GenerateText.py 10
```

> ニックは、イングレスフィルタリングを行った」とい8,172.のメモの位置づけ各ISPのアップストリームとが重要です。）この手順は、ISP間において、十分なマシンがあれば、性能を設定することがBCP38,RFC2827は、エッジネットワークは、マニュアルで維持管理は、（準備中）が、特に、非対慮される状況を理解することによって、分散型サービス妨害攻撃の影響をともなう5つのISPに対する複数の領域を識別できます。
Genymotionを導入する

# 目的
ADTを使ったエミュレータはどうさに時間がかかる。
VirtualBoxにて、高速なエミュレートが可能なGenymotionで動作確認を行えるようにする

# 環境
MacOS
Android 5.1

# 手順
## アカウントを登録
![スクリーンショット 2016-10-08 14.59.46.png](https://qiita-image-store.s3.amazonaws.com/0/57455/b3209227-1f5d-5419-e33c-314f3d1dbca7.png)

https://www.genymotion.com/

## ダウンロード
![スクリーンショット 2016-10-08 14.59.55.png](https://qiita-image-store.s3.amazonaws.com/0/57455/0180c8b0-c0d0-327d-af75-c0038067c2f2.png)

https://www.genymotion.com/download/

ダウンロードが完了したら、インストールを行う

## VirtualBoxをインストールする
![スクリーンショット 2016-10-08 15.06.28.png](https://qiita-image-store.s3.amazonaws.com/0/57455/45eece00-042a-2916-16d3-d97c49f7763a.png)

https://www.virtualbox.org/wiki/Downloads

## Genymotionを起動する
### Genymotion側の設定
Applicationからアイコンで起動し、
![スクリーンショット 2016-10-08 15.11.02.png](https://qiita-image-store.s3.amazonaws.com/0/57455/8720ca21-ef9f-c2bc-d2ab-554d096e9458.png)
先ほど登録したユーザーでサインインする

virtual machineを選択し、ダウンロードする
![スクリーンショット 2016-10-08 15.11.35.png](https://qiita-image-store.s3.amazonaws.com/0/57455/30d3b0da-864a-6415-4a47-eb11dd4068cb.png)

ダウンロードが完了したら、
以下より起動が可能になる![スクリーンショット 2016-10-08 15.14.05.png](https://qiita-image-store.s3.amazonaws.com/0/57455/2cfbaf57-6f10-6eac-2202-8dd550d72217.png)

## 開発環境と連携する
android Studio/Preferences/で、brows Repositoryを選択し、
### AndroidStudio側の設定
![スクリーンショット 2016-10-08 15.16.15.png](https://qiita-image-store.s3.amazonaws.com/0/57455/12a0668f-5a68-7235-bae8-c2da736c8ac3.png)

GenyMotionのプラグインのインストールを行う
![スクリーンショット 2016-10-08 15.17.12.png](https://qiita-image-store.s3.amazonaws.com/0/57455/0cd57b5a-1e2a-4335-03fd-67898157a5ad.png)

AndroidStudioを再起動すると、Genymotionようのボタンが追加されている（ツールバー右端の赤いアイコン）
![スクリーンショット 2016-10-08 15.21.23.png](https://qiita-image-store.s3.amazonaws.com/0/57455/da908d3a-6a3d-9d10-3d18-5f6b70f2f24e.png)

選択し、Genynotionが配置されているパスを追加する。
僕の環境の場合は、Applicationに配置したため
Application/Genymotion.appになる
![スクリーンショット 2016-10-08 15.23.58.png](https://qiita-image-store.s3.amazonaws.com/0/57455/fc3912e1-84f2-cd43-d26e-e39597048437.png)

再度Genymotionアイコンを選択すると
マネージャーが起動し、
先ほど作成した仮想環境が表示されている
ここから仮想マシンを実行できる

![スクリーンショット 2016-10-08 15.25.14.png](https://qiita-image-store.s3.amazonaws.com/0/57455/dc8e3330-8258-5de2-212a-1c5afb65aa93.png)

Genymotion Managerから仮想マシンを起動し、

Android Studioでアプリの実行を行う
![スクリーンショット 2016-10-08 15.25.14.png](https://qiita-image-store.s3.amazonaws.com/0/57455/9d64be5c-5b55-645e-374e-86d51be030ce.png)

Genymotionの仮想マシンが、ターゲットの候補に表示される

![スクリーンショット 2016-10-08 15.30.18.png](https://qiita-image-store.s3.amazonaws.com/0/57455/7a29df05-41e1-92bd-40fd-5379da1f0cab.png)
そこで実行すると、即、Genymotion側の仮想マシンでアプリが起動する

### 参考
- VirtualBox
 http://pc-karuma.net/mac-virtualbox-install/
- Genymotion導入
 http://qiita.com/Sam/items/8d551f575b617fa0be7e
numpy > ファイル読み書き > np.save() / np.load() / np.savetxt() / np.loadtxt() > バイナリ読み書き / csv読み書き

```txt:動作環境
Ubuntu 14.04 TLS desktop amd64
```

numpyでのファイル読み書きを調べた。

参考 https://hydrocul.github.io/wiki/numpy/ndarray-io.html

### バイナリ読み書き

```fileIO.py
import numpy as np

x_data1 = np.random.rand(10,3).astype(np.float32)

np.save('test_x.npy', x_data1)

x_data2 = np.load('test_x.npy')

print(x_data1)
print(x_data2)
```

```txt:結果
$ python fileio.py [[ 0.84425318  0.69987315  0.3876062 ]
 [ 0.31025144  0.45909852  0.48562685]
 [ 0.83929896  0.80323225  0.99521893]
 [ 0.22227153  0.96804965  0.45995703]
 [ 0.74783921  0.48443237  0.56863761]
 [ 0.06758564  0.25367704  0.30701843]
 [ 0.20933156  0.38771868  0.81327569]
 [ 0.64947814  0.36773711  0.32540786]
 [ 0.08585044  0.92082411  0.78450251]
 [ 0.51730436  0.69340336  0.64845133]]
[[ 0.84425318  0.69987315  0.3876062 ]
 [ 0.31025144  0.45909852  0.48562685]
 [ 0.83929896  0.80323225  0.99521893]
 [ 0.22227153  0.96804965  0.45995703]
 [ 0.74783921  0.48443237  0.56863761]
 [ 0.06758564  0.25367704  0.30701843]
 [ 0.20933156  0.38771868  0.81327569]
 [ 0.64947814  0.36773711  0.32540786]
 [ 0.08585044  0.92082411  0.78450251]
 [ 0.51730436  0.69340336  0.64845133]]
```

作成されたファイルはバイナリ形式でlessでは見れない。

拡張子は.npyにするようだ。.datという拡張子にしたら.dat.npyというファイルが作成された。

### csv読み書き

同じリンクにテキスト形式での読み書きが記載されていた。


```fileIO_csv.py
import numpy as np

x_data1 = np.random.rand(10,3).astype(np.float32)

np.savetxt('test_x.csv', x_data1, delimiter=',')

x_data2 = np.loadtxt('test_x.csv', delimiter=',')

print(x_data1)
print(x_data2)
```

```txt:結果
$ python fileio_csv.py 
[[ 0.4589383   0.19229905  0.56762594]
 [ 0.78595251  0.62296402  0.69180036]
 [ 0.79244858  0.4788976   0.67316693]
 [ 0.74409723  0.9375959   0.27137175]
 [ 0.92335385  0.46055159  0.99533266]
 [ 0.83741426  0.86077845  0.96400464]
 [ 0.38847181  0.22187459  0.90489089]
 [ 0.36801556  0.47473967  0.79495519]
 [ 0.93096507  0.29290742  0.01023043]
 [ 0.32679453  0.42028335  0.47830898]]
[[ 0.4589383   0.19229905  0.56762594]
 [ 0.78595251  0.62296402  0.69180036]
 [ 0.79244858  0.4788976   0.67316693]
 [ 0.74409723  0.9375959   0.27137175]
 [ 0.92335385  0.46055159  0.99533266]
 [ 0.83741426  0.86077845  0.96400464]
 [ 0.38847181  0.22187459  0.90489089]
 [ 0.36801556  0.47473967  0.79495519]
 [ 0.93096507  0.29290742  0.01023043]
 [ 0.32679453  0.42028335  0.47830898]]
```

```txt:lessの実行
4.589383006095886230e-01,1.922990530729293823e-01,5.676259398460388184e-01
7.859525084495544434e-01,6.229640245437622070e-01,6.918003559112548828e-01
7.924485802650451660e-01,4.788976013660430908e-01,6.731669306755065918e-01
7.440972328186035156e-01,9.375959038734436035e-01,2.713717520236968994e-01
9.233538508415222168e-01,4.605515897274017334e-01,9.953326582908630371e-01
8.374142646789550781e-01,8.607784509658813477e-01,9.640046358108520508e-01
3.884718120098114014e-01,2.218745946884155273e-01,9.048908948898315430e-01
3.680155575275421143e-01,4.747396707534790039e-01,7.949551939964294434e-01
9.309650659561157227e-01,2.929074168205261230e-01,1.023042947053909302e-02
3.267945349216461182e-01,4.202833473682403564e-01,4.783089756965637207e-01
test_x.csv
```
Mac OSXでWebサイトの英語音声を文字起こしする方法

新製品のチュートリアル等、英語で動画を確認するシーンが増えてきました。最近のYouTubeやVimeoの動画には字幕機能がありますが、まだまだ字幕の付いていないものが大半です。ここでは、Webサイトで再生される英語の音声を、なんでも自動で文字起こしする方法を紹介します。2016年10月時点で、20分以内であれば、YouTubeの自動字幕機能と同じぐらいのスピードと精度で、無料で文字起こしできます。

## 作業概要

文字起こしには、[Voice Recognition](https://dictation.io/)というWebサイトを使います。これは、Chromeのビルトインの音声認識エンジンを使用して、入力された音声を文字起こししてくれるものです。

ただ、そのままではWebサイトの音声を取り込んでくれません。そこで、[Loopback](https://www.rogueamoeba.com/loopback/)を使って、ブラウザのサウンド出力を送る音声デバイスを作成します。

作成した音声デバイスをChromeの入力ソースとしたいのですが、Chromeでは設定できないため、システム環境設定でOSX全体の入力ソースを変更します。


## 作業手順

### Loopbackのインストール

https://www.rogueamoeba.com/loopback/

* Loopback.zipをダウンロード
* 解凍し、中のファイル(Loopback)をアプリケーションフォルダ等に格納
* Loopbackを起動
    * 初回起動時に、インストール処理がされます
    * インストール処理が完了したら、閉じて良いです
* Macを再起動


### 入力の設定

* 「システム環境設定」→「サウンド」
* 「入力」タブで「Loopback Audio」を選択

![サウンド.png](https://qiita-image-store.s3.amazonaws.com/0/10290/ca323c8f-de68-542b-01fa-34bca8b47dd4.png)

### 出力の設定

* Loopbackを起動
* +をクリックし、SafariやGoogle Chromeを追加
* Muto audio sourcesのチェックを外す

![名称未設定.png](https://qiita-image-store.s3.amazonaws.com/0/10290/bb93e7a3-a02e-d94b-7fd2-8da7b28205a5.png)

### 文字起こし

Chromeから、以下のサイトにアクセス
https://dictation.io/

![名称未設定-1.png](https://qiita-image-store.s3.amazonaws.com/0/10290/a5c00c2f-e0cd-cb78-149d-56bd216c4f47.png)

* 「START DICTATION」をクリック
* 動画や音声を再生

![名称未設定-2.png](https://qiita-image-store.s3.amazonaws.com/0/10290/1b2884fc-1227-59af-01f1-29fc3d5905a5.png)

* 再生が終わったら、「STOP LISTENING」をクリック
* 「SAVE」で.txtファイルをダウンロードするか、「COPY」でクリップボードにコピー
chart.jsのグラフで軸のラベルを飛び飛びに表示する方法

## 概要

これを
![screencapture-file-Users-kytiken-develop-sandbox-javascript-chartjs-axis_callback_sample-index-html-1475905281791.png](https://qiita-image-store.s3.amazonaws.com/0/2282/27901166-c2d4-585c-84be-88fb6b9b31d4.png)

↓
こうしたい
![screencapture-file-Users-kytiken-develop-sandbox-javascript-chartjs-axis_callback_sample-index-html-1475905544753.png](https://qiita-image-store.s3.amazonaws.com/0/2282/1d5884d7-197f-c7c6-06fc-372ac0d93de7.png)

## 前提
このグラフのhtmlは下記のとおり

``` html:graph.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title></title>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.3.0/Chart.bundle.min.js"></script>
</head>
<body>
  <div style="height: 500px; width: 500px;">
    <canvas id="myChart" width="400" height="400"></canvas>
  </div>
  <script>
    var ctx = document.getElementById("myChart");
    var myChart = new Chart(ctx, {
      type: 'line',
      data: {
        datasets: [{
          label: '# of Votes',
          data: [{
            x: 0,
            y: 0
          }, {
            x: 25,
            y: 50
          }, {
            x: 50,
            y: 25
          }],
          backgroundColor: 'rgba(255, 99, 132, 0.2)',
          borderColor: 'rgba(255,99,132,1)',
          borderWidth: 1
        }]
      },
      options: {
        scales: {
          xAxes: [{
            type: 'linear',
            position: 'bottom',
            ticks: {
              min: 0,
              max: 50,
              stepSize: 1
            }
          }],
          yAxes: [{
            ticks: {
              min: 0,
              max: 50,
              stepSize: 1
            }
          }]
        }
      }
    });
  </script>

</body>
</html>
```

## 方法
xAxesとyAxesのticksにcallbackを設定します


``` html:graph.html

(中略)
      options: {
        scales: {
          xAxes: [{
            type: 'linear',
            position: 'bottom',
            ticks: {
              callback: function(value) {return ((value % 10) == 0)? value : ''},
              min: 0,
              max: 50,
              stepSize: 1
            }
          }],
          yAxes: [{
            ticks: {
              callback: function(value) {return ((value % 10) == 0)? value : ''},
              min: 0,
              max: 50,
              stepSize: 1
            }
          }]
        }
      }
 (以下略)
```
今回のファイルをGistに置いておきます↓
https://gist.github.com/kytiken/8edf90a8c6355cbdde2555ef65133419

以上

## 参考
https://github.com/chartjs/Chart.js/issues/2121
http://www.chartjs.org/docs/
(Tick Configurationの項)
Swift初心者が「ToDoアプリ開発チュートリアル」やってみた

初Qiita投稿。Swift学習のため下記のサイトを参考にToDoアプリを作った。とてもわかりやすくよかったが、ところどころ自分が詰まったところがあったのでまとめておく。

自分のレベルとしてはIT企業のエンジニアインターンとして初心者から３ヶ月Swiftを勉強してきたが、ここ２ヶ月コードを書くことと読むことが皆無だったため勉強しなおす。

今回参考にしたのはこちら
[Swiftで作るToDoアプリ開発チュートリアル](http://easyramble.com/swift-todo-app-tutorial.html)

また[Black Catさん](http://qiita.com/BlackCat)の記事も参考にしました。
[[Swift]Swiftの勉強のためにToDoアプリを作ってみた](http://qiita.com/BlackCat/items/8dcbe1d6f996087ecc3b)

XcodeのバージョンVersion 7.3.1

## vi Podfil eを実行するも閉じられない
コードを書く以前の問題ですが、MagicalRecord をインストールするためにターミナルから `vi　Pod`でPodfileの内容を変更するが、どうやっても保存、終了ができない。。。。`control + c`　を押しても抜け出せず、`Type  :quit<Enter>  to exit Vim`と画面上に表示されるもなんのこっちゃ。

調べてみると、以下の手順で解決した。
`ESC`→ `:` → `q` → `!` → `ENTER`


## パス入力
Objective-C Bridging Headerを導入?するために使うファイルのパスを入力するところがあるが、参考画像通りやってもうまくいかなかった（そもそも保存場所が違うので当たり前だが）

自分の場合以下で解決した。
`/Users/ユーザー名/ファイルまでのパス/ファイル名/`

(例)
`/Users/mimizunomizuno/Desktop/TodoApp/TodoApp/TodoApp-Bridging-Header.h `

## CoreData+MagicalRecord.h file not found
これは、http://qiita.com/BlackCat/items/8dcbe1d6f996087ecc3b を参考にした。
MagicalRecordのバージョンが変わって、ファイル構成が変わったことが原因みたい。

`#import "CoreData+MagicalRecord.h"` ← エラー
`#import "MagicalRecord.h"` ←解決した

しかし、自分の場合2回このアプリを作り、１週目は上記で解決したが２週目の際は上でうまく行かず悩んだが、以下で解決した。原因はわからない。。。

`#import "MagicalRecord/MagicalRecord.h"`←このコードで解決した


## オプショナル型
Xcodeのバージョン変更のため、コードの書き方や返す値のオプショナル値がところどころ違っていた。Black CatさんがXcodeのバージョン７で作成したTodoアプリのコードが公開されていたので詳しくはそれを参考に.

# アプリを作ってみて
無料でアプリの作り方やコードを公開したり、それに対してまた他の誰かが修正箇所や言及する記事をまとめていて、技術を誰にでも公開するこの世界はすごいなと思った。あまり価値のない記事だが自分も頑張って書いていきたい。参考にさせてもらった記事の作成者の方々ありがとうございましたm(_ _)m
超個人的Mac用環境構築覚書

**あくまで超個人的な覚書です。参考にする際は自己責任でお願い致します**

## 環境
OS: El capitan 10.11.6

## homebrewのインストール
homebrewはパッケージマネージャーです。
極力Macに入っているライブラリを使おうとしてくれるのでインストールが短くて良さげ。
なお、インストールにはXcodeのコマンド ライン ツールが必要となるためこちらもインストールしときましょう。
※インストール方法は後日追記予定

### Macportsのアンインストール
MacPortsとHomebrewは共存しない方が良いそうなので、アンインストールしちゃいます。

まず、Macportsがインストールされているか確認します。

```
$ port version
```
**"command not found"**が出ればインストールされていないので、
何も考えずにhomebrewをインストール

バージョンが表示されるようであれば、
以下コマンドを入力しアンインストールします。

```
$ sudo port -fp uninstall installed
```

次にhomebrewをインストールします。
以下、スクリプトをターミナルに貼り付け実行します。

```
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

以下コマンドでインストールを確認します。
バージョンが表示されれば問題ありません。

```
$ brew -v
```

次に以下を実行します。
エラーやアラートが出たら潰します。

```
$ brew doctor
```

## zshのインストール
ここは個人的な好みです。

homebrewを使ってインストールします。

```
$ brew install --without-etcdir zsh
```

/etc/shellsに以下を追記します。

```
/usr/local/bin/zsh
```

以下コマンドでデフォルトで利用するshellをzshに変更し、
ターミナルを再起動します。

```
$ chsh -s /usr/local/bin/zsh
```

~/.zshrcに以下記述を追記してパスを通します。
ファイルがない場合は作成してください。

```
export PATH=/usr/local/bin:$PATH
```
その後、ターミナル再起動して完了です。

## rbenvのインストール
複数のrubyのバージョンを扱いたいので、
homebrewを使ってバージョン管理ソフトのrbenvをインストールします。

rbenvおよびruby-buildをインストールします。

```
$ brew install rbenv ruby-build
```

.zshrcに以下を追記します。

```text:.zshrc
export PATH=$HOME/.rbenv/bin:$PATH
eval "$(rbenv init -)"
```

正しくインストールされているか確認します。

```
$ rbenv --version
```
バージョンが表示されれば問題ありません。

rubyをインストールします。
まず、インストールできるrubyのリストを確認します。

```
$ rbenv install -l
```

リストの中からバージョンを指定してインストールします。
2.1.0をインスコしたかったら...

```
$ rbenv install 2.1.0
```

インストールしたrubyを確認します。

```
$ rbenv versions
* system (set by /usr/local/var/rbenv/version)
  2.1.0
```
※systemは最初からMac入っているruby

システム全体で利用するrubyを選択します。
2.1.0を利用したかったら...

```
$ rbenv global 2.1.0
```

正しいバージョンのrubyが利用されているか確認します。

```
$ ruby -v
```
選択したバージョンが表示されれば問題ありません。

ちなみに、以下のコマンドで、ディレクトリ単位でrubyのバージョンを指定できます。
このフォルダでは**最新のrubyのバージョンで！**なんてときに使いましょう。

```
$ rbenv local 2.2.3
```

## nodebrewのインストール
複数のnodeのバージョンを扱いt(ry

homebrewにnodebrewがすでに入ってる場合はアンインストールします。

```
$ brew uninstall nodebrew
$ brew uninstall node
```

以下、コマンドでnodebrewをインストールします。

```
$ curl -L git.io/nodebrew | perl - setup
```

.zshrcに以下を追記します。

```text:.zshrc
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

正しくインストールされているか確認します。

```
$ nodebrew -v
```
バージョンが表示されれば問題ありません。

Node.jsをインストールします。
まず、インストール可能なNode.jsのリストを確認します。

```
$ nodebrew ls-remote
```

リストの中からバージョンを指定してインストールします。

```
$ nodebrew install-binary v4.2.1
```

nodeがインストールされていることを確認します。

```
$ nodebrew ls
v4.2.1

current: none
```

利用するnodeのバージョンを選択します。
v4.2.1を利用したかったら..

```
$ nodebrew use v4.2.1
```

正しいバージョンのnodeが利用されているか確認します。

```
$ node -v
```
選択したバージョンが表示されれば問題ありません。

## gitのインストール
homebrewでgitをインストールします。

```
$ brew install git
```

以下コマンドを実行します。

```
$ which git
```
**"/usr/local/bin/git"**が表示されれば問題ありません。

## bundlerのインストール

以下コマンドでインストールします。

```
$ gem install bundler
```

rbenvをrehashします。
※しないと、パスが通らないことがあるらしい...。

```
$ rbenv reahsh
```

正しくインストールされているか確認します。

```
$ bundler -v
```
バージョンが表示されれば問題ありません。

以上です。

後日、もう少し見やすく書き直す予定。あくまで予定。
MIDIファイルから特定の楽器の音のみを取り出し別ファイルにする

# はじめに
TensorFlow製の音楽生成プロジェクト「[Magenta](https://github.com/tensorflow/magenta)」をいじっています。

参考：[サカナクションさんをTensorFlow製アート・音楽生成プロジェクト「Magenta」に学習させてみる。]
(http://qiita.com/tackey/items/1295a0347a8b4cc30d46)

その前処理として、MIDIファイルを楽器ごとのファイルに変換したいなと思い、[pretty_midi](https://github.com/craffel/pretty-midi)を用いて分割してみます。

参考：[pretty_midi 0.2.6 documentation](http://craffel.github.io/pretty-midi/#pretty_midi.Note)
参考：[pretty_midiを使って、PythonでMIDIファイルを作成する](http://qiita.com/tackey/items/d0525798bddc4516f4f9)


なお、環境はPython2.7、MIDIファイルはlogic Xでみたりしています。

# サンプルコード1（1つの楽器を取り出し、ファイルにする）
```sample.py
import pretty_midi

# MIDIファイルを読み込む
midi_data = pretty_midi.PrettyMIDI('hogehoge.MID')

# 楽器の一覧
midi_data.instruments

'''
 [Instrument(program=80, is_drum=False, name="hoge"),
 Instrument(program=4, is_drum=False, name="hoge"),
 Instrument(program=0, is_drum=True, name="hoge"),
 Instrument(program=16, is_drum=False, name="hoge"),
 Instrument(program=52, is_drum=False, name="hoge"),
 Instrument(program=71, is_drum=False, name="hoge"),
 Instrument(program=4, is_drum=False, name="hoge"),
 Instrument(program=29, is_drum=False, name="hoge"),
 Instrument(program=30, is_drum=False, name="hoge"),
 Instrument(program=51, is_drum=False, name="hoge"),
 Instrument(program=33, is_drum=False, name="hoge"),
 Instrument(program=27, is_drum=False, name="hoge"),
 Instrument(program=81, is_drum=False, name="hoge")]
'''

# 80番の楽器(ReverseEngineering)を取り出し、インスタンスにする
for instrument in midi_data.instruments:
    if instrument.program == 80:
        ins_80 = instrument
        
# 新規作成用のPrettyMIDIオブジェクトを作る
rev_en_chord = pretty_midi.PrettyMIDI()

# 80番をPrettyMIDIオブジェクトに追加
rev_en_chord.instruments.append(ins_80)

# 保存する
rev_en_chord.write('ins_80.mid')
```

同フォルダ内に、ins_80.midというファイルが作成されます。


# サンプルコード2（すべての楽器を取り出し、各々ファイルにする）

```sample2.py
import pretty_midi
import os

title = "aoi"

midi_data = pretty_midi.PrettyMIDI('sakanaction_'+ title +'.MID')

# outputディレクトリがなければ作成
if not os.path.isdir('output'):
    os.mkdir(output)

# 該当曲のディレクトリを作成
if not os.path.isdir('output/' + str(title)):
    os.mkdir('output/' + str(title))
    
# 楽器を1つ1つ取り出し、インスタンスにする
for i in range(0,len(midi_data.instruments)):
    
    instrument = midi_data.instruments[i]
    program_num = midi_data.instruments[i].program

    # 新規作成用のPrettyMIDIオブジェクトを作る
    rev_en_chord = pretty_midi.PrettyMIDI()

    # instrumentをPrettyMIDIオブジェクトに追加
    rev_en_chord.instruments.append(instrument)

    # 保存する
    rev_en_chord.write('output/'+str(title) + '/' + str(title) +'_ins_' + str(program_num) + '.mid')

```

# 終わりに

もっと綺麗にコードを書ける気がします。
分割したファイルを元に、楽器ごとに音楽を個別に学習させてみたいと思います。

ありがとうございました。
PowerShellメモ　フォルダ選択ダイアログ

# 概要
フォルダ選択ダイアログでフォルダパスを取得する関数。

# コード

```PowerShell
Add-Type -AssemblyName System.Windows.Forms

<#
.SYNOPSIS
    フォルダ選択ダイアログ表示

.DESCRIPTION
    フォルダ選択ダイアログを表示し、選択したフォルダパスを返す。

.PARAMETER Description
    ダイアログに表示する説明文（省略可）

.PARAMETER CurrentDefault
    カレントディレクトリをダイアログの初期フォルダとするか否か（省略可）

.OUTPUTS
    選択したフォルダパス。キャンセル時はnull
#>
function Get-FolderPathG
{
    param(
        [Parameter(ValueFromPipeline=$true)]
        [string]$Description = "フォルダを選択してください",
        [boolean]$CurrentDefault = $false
    )
    # メインウィンドウ取得
    $process = [Diagnostics.Process]::GetCurrentProcess()
    $window = New-Object Windows.Forms.NativeWindow
    $window.AssignHandle($process.MainWindowHandle)

    $fd = New-Object System.Windows.Forms.FolderBrowserDialog
    $fd.Description = $Description

    if($CurrentDefault -eq $true){
        # カレントディレクトリを初期フォルダとする
        $fd.SelectedPath = (Get-Item $PWD).FullName
    }
    
    # フォルダ選択ダイアログ表示
    $ret = $fd.ShowDialog($window)

    if($ret -eq [System.Windows.Forms.DialogResult]::OK){
        return $fd.SelectedPath
    }
    else{
        return $null
    }
}
```

# 実行例
![p03.PNG](https://qiita-image-store.s3.amazonaws.com/0/142879/0aeacfaa-5d14-d806-ef7f-7ec20ab877c8.png)

# 動作確認した環境
* PowerShell V4 (Windows 8.1)
* PowerShell V5 (Windows 10)
Ubuntu 14.04 > ネットワークがつながらない > 別のエラー解消で解決 > ACPI Exception: AE_NOT_FOUND, while evaluating GPE method [_L6F] (20131115/evgpe-580)

```txt:動作環境
Ubuntu 14.04 desktop amd64
ASRock Z170M Pro4S [Intel Z170chipset]
```

使用しているUbuntuにてWiFi接続が不安定になってきた。

dmesg実行時、以下のエラーを見つけた。

```
[   16.729979] ACPI Exception: AE_NOT_FOUND, while evaluating GPE method [_L6F] (20131115/evgpe-580)
[   16.769835] ACPI Error: [PGRT] Namespace lookup failure, AE_NOT_FOUND (20131115/psargs-359)
[   16.769839] ACPI Error: Method parse/execution failed [\_GPE._L6F] (Node ffff88045fd3d320), AE_NOT_FOUND (20131115/psparse-536)
[   16.769843] ACPI Exception: AE_NOT_FOUND, while evaluating GPE method [_L6F] (20131115/evgpe-580)
[   16.881806] ACPI Error: [PGRT] Namespace lookup failure, AE_NOT_FOUND (20131115/psargs-359)
[   16.881810] ACPI Error: Method parse/execution failed [\_GPE._L6F] (Node ffff88045fd3d320), AE_NOT_FOUND (20131115/psparse-536)
[   16.881815] ACPI Exception: AE_NOT_FOUND, while evaluating GPE method [_L6F] (20131115/evgpe-580)
[  
```

こちらの記事の対応でエラーがでなくなり、同時にWiFi接続が安定しだした。
http://qiita.com/kannkyo/items/c1bc70a1856ce140120e

情報提供に感謝です。


<hr>
(追記)

やはりWiFi接続が時々不安定になる。

ルーターの電源を入れなおして、WiFiの接続をトライすると接続ができるようになったりする。
Let’s Encrypt with Certbot


Tried Let’s Encrypt for free HTTPS certification. It seems good and quite convinence. 

Following the instruction of offical site, we use Certbot to deploy it.

https://letsencrypt.org/getting-started/

As example, for Apache and Debian 7:

https://certbot.eff.org/#debianwheezy-apache

## Install

    wget https://dl.eff.org/certbot-auto
    chmod a+x certbot-auto
    ./certbot-auto
    
## Config

    ./certbot-auto --apache
    
It would provide UI.
    
## Automating Renewal

First try this 

    ./certbot-auto renew --dry-run 
    
If no error, set this to cronjob twice a day

    ./certbot-auto renew --quiet --no-self-upgrade
    
### For Nginx Server

If you run it with Nginx, you might need to reload or restart Nginx to make the renew available.

## PS on renew

If you have made Rewrite Rule for Auto-HTTP-to-HTTPS-Redirection, you would face some trouble when renew them if the CertAgent cannot get correct response from the target Domain. For example, you removed the certificate files or SSL configuration from your server, kept using a certificate out of date, lost DNS record, etc. The failure would come with IMPORTANT NOTES like following.


```
IMPORTANT NOTES:
 - The following errors were reported by the server:

   Domain: meinblog.ga
   Type:   unknownHost
   Detail: No valid IP addresses found for meinblog.ga

   To fix these errors, please make sure that your domain name was
   entered correctly and the DNS A record(s) for that domain
   contain(s) the right IP address.
 - The following errors were reported by the server:

   Domain: sinri.cc
   Type:   unauthorized
   Detail: Incorrect validation certificate for TLS-SNI-01 challenge.
   Requested ******HIDDEN******

   To fix these errors, please make sure that your domain name was
   entered correctly and the DNS A record(s) for that domain
   contain(s) the right IP address.
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
```

It is easy to fix after you know the reason -- just keep the target domain alive. Turn off redirection for SSL and leave HTTP only is the suggestion.
Zapierとwerckerでdockerベースのバッチ処理を無料で行う

## 概要
werckerには、APIを使ってpipelineを実行する機能があり、zapierにはscheduleを決めて、webhookとしてpostすることができる。
それらを組み合わせて、werckerを使ってバッチ処理を行う。

## メリット
* werckerはdockerベースなので、言語や環境などを問わない。
* どちらも無料の範囲でやれる。


## やり方
### werkerの設定
まずwerckerでpipelineを設定する。
やりかたは、[このあたり](http://qiita.com/dtan4/items/9bcf5dbfd3dbbd87472b) の記事を参考に設定してください。

pipelineのURLのうち、
https://app.wercker.com/＜ユーザー名＞/＜アプリケーション名＞/workflows/pipelines/＜パイプラインID＞
という構成になっているので、パイプラインIDをメモっておく。

apiキーは、settingsのPersonal tokensから取得しておく。


### zapierの設定
Scheduleをトリガーに、webhookをアクションに設定する。
webhookはPOSTするようにする。
設定は、以下の通り

| 設定       |       内容 | 
|:-----------------|------------------:|
|URL|https://app.wercker.com/api/v3/runs/|
| Payload Type| JSON|
| Data|pipelineId：＜werckerでメモしたパイプラインID＞|
| Headers|Authorization：Bearer ＜APIキー＞|


### werker.ymlを設定する
個人的に使っているのは、google analyticsの流入キーワードを、bigqueryに保存するという処理で使っているのですが、そのwerckerファイルです（かなりやっつけ）。

```
box: ruby
keyword-update:
    steps:
        - script:
            name: gem install
            code: gem install oauth2 legato bigquery signet
        - script:
            name: batch
            code: ruby analytics-batch.rb
```

## 最後に
あとはリポジトリにプッシュしておけば、設定したスケジュールにあわせて勝手に実行されると思います。
pipelineを作るときは、git pushに連動しないようにしておくと、勝手に実行されないのでいいかも？