OmniAICreator/Qiita-1.07M huggingface dataset:
「午前3時の茨城県」の使用文字を徹底解明！

# 概要
　Twitterにおける有名なサービスの一つに、「[午前3時の茨城県](https://yvt.jp/ibaragi-3am/)」というものがあります。
　これは、**午前3時に「午前3時の茨城県」という文字列をツイートするだけ**……のものなのですが、何故か他の「文字」も付随した代物なことから、各種Twitterクライアントを悩ませています。要するに、**ごちゃごちゃしすぎてきちんと表示できていない**のですね。というわけで、その原因、および本来表示されるべき姿を探ってみました。

※元ネタは恐らく「[午前3時の無法地帯](https://ja.wikipedia.org/wiki/%E5%8D%88%E5%89%8D3%E6%99%82%E3%81%AE%E7%84%A1%E6%B3%95%E5%9C%B0%E5%B8%AF)」だと思われますが詳細は不明です。

# 現時点での表示結果
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/29802/d08972da-29bd-f75c-3171-a17e57849a65.png)

# 文字データの内容
　えっと、「午̷̖̺͈̆͛͝前̧̢̖̫̊3̘̦時̗͡の̶̛̘̙̤̙̌̉͢い̷゙̊̈̓̓̅ば̬̬̩͈̊͡ら゙̜̩̹ぎ̫̺̓ͣ̕͡げ̧̛̩̞̽ん゙̨̼̗̤̂̄」です。……え、文字化けして読めない？
　そんな場合のために[Rubyスクリプトで完璧に再現](http://melpon.org/wandbox/permlink/FpOYmE2eqqWfiqye)してみました。ご査収ください。

```ibaraki.rb
# 「午」＋ダイアクリティカルマーク×7
print "\u{5348 0316 0306 0337 033A 0348 035D 035B}"
# 「前」＋ダイアクリティカルマーク×5
print "\u{524D 030A 0316 032B 0327 0322}"
# 「3」＋ダイアクリティカルマーク×2
print "\u{0033 0318 0326}"
# 「時」＋ダイアクリティカルマーク×2
print "\u{6642 0317 0361}"
# 「の」＋ダイアクリティカルマーク×9
print "\u{306E 0318 031B 0319 0336 0324 0319 030C 0309 0362}"
# 「い」
print "\u{3044}"
# 半角濁点＋ダイアクリティカルマーク×6
print "\u{3099 030A 0308 0337 0343 0343 0305}"
# 「ば」＋ダイアクリティカルマーク×6
print "\u{3070 030A 032C 032C 0329 0348 0361}"
# 「ら」＋ダイアクリティカルマーク×7
print "\u{3089}"
# 半角濁点＋ダイアクリティカルマーク×3
print "\u{3099 031C 0329 0339}"
# 「ぎ」＋ダイアクリティカルマーク×6
print "\u{304E 032B 033A 0315 0313 0363 0361}"
# 「げ」＋ダイアクリティカルマーク×5
print "\u{3052 0327 0329 031B 031E 033D}"
# 「ん」
print "\u{3093}"
# 半角濁点＋ダイアクリティカルマーク×6
puts "\u{3099 033C 0317 0302 0304 0324 0328}"
```

　……実は、[Unicodeの文字列を解析するサイト](http://chattera.net/nickname/unicodeana.php?key=%E5%8D%88%CC%96%CC%86%CC%B7%CC%BA%CD%88%CD%9D%CD%9B%E5%89%8D%CC%8A%CC%96%CC%AB%CC%A7%CC%A23%CC%98%CC%A6%E6%99%82%CC%97%CD%A1%E3%81%AE%CC%98%CC%9B%CC%99%CC%B6%CC%A4%CC%99%CC%8C%CC%89%CD%A2%E3%81%84%E3%82%99%CC%8A%CC%88%CC%B7%CD%83%CD%83%CC%85%E3%81%B0%CC%8A%CC%AC%CC%AC%CC%A9%CD%88%CD%A1%E3%82%89%E3%82%99%CC%9C%CC%A9%CC%B9%E3%81%8E%CC%AB%CC%BA%CC%95%CC%93%CD%A3%CD%A1%E3%81%92%CC%A7%CC%A9%CC%9B%CC%9E%CC%BD%E3%82%93%E3%82%99%CC%BC%CC%97%CC%82%CC%84%CC%A4%CC%A8)のデータを利用しただけなんですけれどね。
　ソースコメントで連発されている**[ダイアクリティカルマーク](https://ja.wikipedia.org/wiki/%E3%83%80%E3%82%A4%E3%82%A2%E3%82%AF%E3%83%AA%E3%83%86%E3%82%A3%E3%82%AB%E3%83%AB%E3%83%9E%E3%83%BC%E3%82%AF)**とは、アクセントやウムラウトのように「文字の上や下などに付ける(合成する)ための文字」という意味です。これを使えば、「濁音がない平仮名に濁点を無理やり付ける」といったことも可能になり、結果として**上記画像のようなゴチャゴチャした表示にできる**のです。
　[午前3時の茨城県について書かれた昔の記事](http://wtrend.blog.so-net.ne.jp/2013-12-05)では、「スマホのツイッターアプリで見ると、『午前3時のい゙ばら゙ぎげん゙』というように表示されます」とあるのですが、これは要するに**昔のスマホ用公式Twitterクライアントはダイアクリティカルマークを無視していた**ということ(今では上記のように無視されず表示されます)。言うなれば、「午前3時の茨城県」は**Unicode表示のベンチマーク**なのです。

# まとめ
　あの「午前3時の茨城県」は、実のところ『午前3時のい゙ばら゙ぎげん゙』にダイアクリティカルマークを57個もつけた結果生まれた産物でした。表示できるかはTwitterクライアントに強く依存しますが、実際のところ**手打ちでダイアクリティカルマークを入れる変態などいない**ので気にすることはないです。
reduxを使うためにいろいろお勉強


# 辞書

redux
	戻ってきた

reductionixm
	還元主義

reducer
	減少する
	還元する

# web+dbをまず参考

http://gihyo.jp/magazine/wdpress/archive/2016/vol92/support

## 環境構築と簡単な実行

compoerのように--save-devと--saveがあるのね。なるほど。

npm run buildなどでbabelコマンドを実行するためには、
package.jsonのscriptプロパティに記載すればよい。

```
npm run
```

は下記のエイリアス

        ```
npm run-script
```

実装してみて。

* なるほど、ディスパッチャを上手に使ってフローをシンプルにして、
* ビュー生成を混乱しないようにしましょうということかな。
* ああ、リダクターの引数がポイントなのかな。

# phpstormについてもいろいろわかってない。

## リソースフォルダ

http://blog.jetbrains.com/jp/2013/12/12/328
        > リソースルート以下に置かれたファイルはIDE上では読み込み専用として扱われリファクタリング対象とはならないので自動生成されたファイルを破損させてしまう心配はありません。

なるほど

## ファイルウォッチャー

監視してコンパイルとかをしてくれるみたい。
大変便利だ。

http://448.jp/blog/article/1459/
        > OKボタンを押して、TypeScriptファイルを編集すると、自動的にコンパイルが行われるようになります。

http://qiita.com/hkusu/items/e6ae07277356d0bbe2d7
        > すかさず watcher に追加するかい？というメッセージが表示されるので、今回は Babel の方の Add watcher リンクを追加します。

作業ディレクトリを下記とすると、プロジェクトエクスプローラーで見やすい。
写経している方式（web+dbの記事）はdistフォルダを別途作っていたので、これを変更した。
拡張子は写経している方式とは違ってしまうけど「.es6」（Ecmascript6）にした。

```
$FileDir$
を変更して下記。
$FileDir$/../dist
```

### メモ

コンパイル中にオラオラとCtrl+Rしてビルドしてみてけど別にそのくらいは大丈夫そう

## create ..

runの設定を簡単に作成できた。便利。

## 設定した

languageのjavascriptをes6にした
file watcherを追加
libraryのes6をチェック（しなくていいのかも

# react.js

また、環境変更した

* webpack-dev-serverのインストールは別途必要だった。
* presetsの変更
* npm startがsudoじゃないとだめだった。パーミッションかしら。

webpackに任せるならファイルウォッチャーはあまりいらないのね。
画面がリアルタイムに変わってきもちよい。

あれ、.babelrcの記述をかえなくても動いていた、、なんでかしら。
きっと、これやってなかったからいろいろ不足モジュールが出たのかな。

gzipのファイルが沢山生成されているけど、、なんとかならないかな。
きっとなる。

あと、コンパイル後のファイルが見たい。
phpstormのファイルウォッチャーをES6からJSXに変更した。

# ES6

以前、なんかでみたような気がするけど、coffee scriptのお勉強の時だな。
() => ..で無名関数とか。
でも、まだよくわかってない。

# connect

 * react-redux のconnect関数が肝
 * 状態が更新されるとmapStateToPropsを呼び出す
 * アクションの発生をする場合、
 * Reactコンポーネントにわたされたdispatchから
 * アクションクリエータを呼び出す
 * 状態が遷移してReducerを通してというデータフローになる

# Provider

Providerでくくるとコンポーネントからアクセスできる

# polyfillのObject.assign()

なんかブラウザでは動くけどインストールしないといけないモジュールがあるってことかな。
バージョンによって対応が変わりそう。。

http://stackoverflow.com/questions/31764414/object-assign-is-not-a-function

```
$ npm install babel-core --save-dev
import 'babel-core/polyfill';
```

ひとまず下記でいけた。

```
import "babel-polyfill";
```

# combineReducers

レデューサーは複数の関数を組み合わせて作る

# ファイル分割のセオリー（import,export）

MDNのドキュメントなど。

export default

# webpack

実行は下記。グローバルだと楽かも。
ファイルウォッチャーで、ソースフォルダを再帰的に監視のスコープにして実行にした。

```
node ../hoge/webpack.js
```

# component

プレゼーションコンポーネント
主にjsx

* 業務ロジックのエレメント的なビュー
* 見た目だけのAPP

# container

どのようなプロパティかを注入するコンテナ
jsファイルが主だがjsxも。

* todoリストのロジック部分
* todoの追加部分のロジック（小さいのでjsxは分離しない）

# 参考

## angular比較

React + Redux + TypeScript でWebアプリを作った感想・勉強法と Angular との比較 - Qiita
http://goo.gl/vCEvPJ

## webpack-dev-server

タスクランナーを使わずに webpack だけでフロントエンド開発する方法 - yukisovのメモ帳
http://goo.gl/Bdly76

webpack dev server
https://goo.gl/S0KrJi

configuration
http://goo.gl/01sWVT

webpack dev server
http://goo.gl/8UmMEu

webpackでbabelを使ってES6の環境を整えてみた感想 | OKLab
http://goo.gl/fzK8pZ

webpack-dev-serverで継続的なクライアントサイドテスト - Namiking.net
http://goo.gl/c43lre
[ESP-WROOM-02]ESP-WROOM-02+土壌湿度センサーでブラウザにアナログセンサーの値を表示させる

#はじめに

このエントリは、以下のエントリの続きです

- [ADコンバータ+土壌湿度センサー+Rubyで土壌の水分を計る](http://qiita.com/jun1_0803/items/6075340cf5d8be4a4f56)
- [[ESP-WROOM-02]ブラウザにHelloWorldを表示させる](http://qiita.com/jun1_0803/items/bba03fb7e7b26596ec96)


育てている盆栽の水やりのタイミングを見える化したかったので、ESP-WROOM-02、土壌湿度センサーを使って、土の中の水分を測ります

ひとまず、ESP-WROOM-02にスケッチ（プログラム）を書き込んで、ブラウザにアナログセンサーの値を表示させてみたいと思います

#電子部品

- [ESP-WROOM-02開発ボード（ピンソケット実装済）](https://www.switch-science.com/catalog/2652/) スイッチサイエンスで購入
- [土壌湿度センサー](http://www.aitendo.com/product/7417) aitendoで購入
- 100Ωと200Ωの抵抗をひとつずつ

#参考

- [Device Plus　第34回](http://deviceplus.jp/hobby/entry0034/)
- [ESP-WROOM-02の記事](http://ht-deko.com/arduino/esp-wroom-02.html)

#計測
##1.計測部品の接続

[ESP-WROOM-02の記事](http://ht-deko.com/arduino/esp-wroom-02.html)のanalogRead()の項目にある接続を参考に、ESP-WROOM-02と土壌湿度センサーを接続した

アナログ入力を行うにはTOUTピンを使う

それぞれの参考にあるように、TOUTピンには1V付近の電圧かけてあげる必要があるので、ESP-WROOM-02から出力される3.3Vを抵抗を使って分圧して、1Vくらいになるようにした
(200Ωと100Ωを使うことで3分の1の1.1Vになる想定)

手書きですが、回路図は以下
![IMG_20160503_204424.jpg](https://qiita-image-store.s3.amazonaws.com/0/106763/b50008c0-5353-36e8-2f2e-de6bc4b82712.jpeg)

![IMG_20160503_202459.jpg](https://qiita-image-store.s3.amazonaws.com/0/106763/20b0d7e2-8feb-ee74-f2d7-ea2eec282120.jpeg)

##2.スケッチの作成

[[ESP-WROOM-02]ブラウザにHelloWorldを表示させる](http://qiita.com/jun1_0803/items/bba03fb7e7b26596ec96)で使ったスケッチを、アナログセンサーの値を読み込めるように修正する
(ArduinoIDEのメニューのファイル>スケッチの例>ESP8266WebServer>HelloServerを選択して、サンプルスケッチを使う)

[Device Plus　第34回](http://deviceplus.jp/hobby/entry0034/)にあるように、analogRead関数ではなく、system_adc_read関数を使う

```lang:arduino
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

const char* ssid = "自分のwifi環境のSSID";
const char* password = "自分のwifi環境のパスワード";

ESP8266WebServer server(80);

const int led = 13;

int analog_value = 0; // アナログセンサーの値を格納する変数の初期化

//ESP-WROOM-02でアナログ入力をするために必要
extern "C" {
#include "user_interface.h"
}

void handleRoot() {
  digitalWrite(led, 1);
  
  // アナログセンサーの値を取得するためsystem_adc_read関数を使う
  // センサーを水につけていない状態で1024を返すので、1024との差を水分の値とする
  analog_value = 1024 - system_adc_read();

  // 画面に表示するため、String型にキャストする
  String analog_value_str = String(analog_value);

  // htmlで出力　第三引数にhtmlタグを書ける
  server.send(200, "text/html", "<center><h1>soil solid sensor value is...</h1><font size='36'>" + analog_value_str + "</font></center>");
  digitalWrite(led, 0);
}
```

修正後、ESP-WROOM-02にスケッチを書き込む

##ブラウザにIPアドレスを入力して土壌湿度センサーの値を表示する

水中から出した状態
![Screenshot_2016-05-03-19-07-23.jpg](https://qiita-image-store.s3.amazonaws.com/0/106763/f8ac61fa-2a26-6ff0-0188-06f1ec82f892.jpeg)

水中に入れた状態
![Screenshot_2016-05-03-19-06-49.jpg](https://qiita-image-store.s3.amazonaws.com/0/106763/5849dc8d-138e-5e0c-dcb5-4c54359736b6.jpeg)

#まとめ

RaspberryPi+ADコンバータで取得するよりも、関数ひとつで値が取得できるので、非常に楽。
次回は、twitter連携をしたい
Web MIDI APIはChromeで動作するがFirefox、IEで動作しない

# 概要
Web MIDI APIが使われているページを開く際は、
Chromeで開けばOKです。

# 詳細
Web MIDI APIのデモは優れたものが多数あります。
がFirefoxやIEだと動きません。

* [Web MIDI APIが動くかチェックするコードを書きました](http://cat2151.github.io/Web-MIDI-API-play/index01.html)

デモで、動かず、動かない原因がブラウザにあることが明示されていない場合、
（よくわからんけど動かないからいいや…）
と離脱してしまったこともあるかもしれませんが、

Web MIDI APIのデモを試したいときは、
Chromeでそのページを開きましょう。

>[注: 現在ネイティブのWeb MIDI APIの実装が進んでいるのはChromeだけであり、それ以外の環境で動作させるには Polyfill(WebMIDIAPIShim)とJazzPluginが必要になります。](http://g200kg.github.io/web-midi-api-ja/)

# ツール化
* [用途は限られますが、  
html側に1行書くだけで使えるチェックツール check-midi-port-exists.js を作りました](https://github.com/cat2151/Web-MIDI-API-play/blob/master/check-midi-port-exists.js)
 * [使用例](http://cat2151.github.io/Web-MIDI-API-play/monoSeqGen01.html)
Auto Scalingまわりを自分用にまとめてみた

# 概要
ELBがEC2をAuto Scalingさせているという基本的な部分で誤った理解をしていたこともあり、
Auto Scaling グループとその周辺（EC2/ELB/CloudWatch・alarm/起動設定）を今一度まとめてみました。
マネージドサービスを使用したアーキテクチャが隆盛してきていますが、まだまだEC2をAuto Scalingさせるケースは多いですね。


# Auto Scaling グループを使用したAuto Scaling（ScaleOut）時の動き
![autoscalinggroup1.png](https://qiita-image-store.s3.amazonaws.com/0/85163/12cd7a41-aadf-1b0e-d4a0-3e6dbad20d6d.png)

- ①CloudWatchがEC2インスタンスのCPU使用率を監視する。
- ②CloudWatchがEC2インスタンスのCPU閾値越えを検知。alarm発動。
- ③Auto Scaling グループが、alarm発生時のアクションを実行する。その時点で動作しているEC2インスタンス数と、スケーリングポリシー（最小サイズ・最大サイズ）と照らし合わせて必要な場合にEC2インスタンスを起動する。
- ④起動設定をもとにAMIからEC2インスタンスが作成・起動される
- ⑤起動したEC2インスタンスに、ELBからのヘルスチェックが成功した時点でELBからのアクセスが割り振られるようになる。



# Auto Scaling グループを使用したAutoHealingの動き
![autoscalinggroup2.png](https://qiita-image-store.s3.amazonaws.com/0/85163/1d8d42d6-ffd8-2b83-1805-1eed20111229.png)

- ①ELBからのヘルスチェックが失敗する。
- ②ヘルスチェック失敗時にAuto Scaling グループがその時点で動作しているEC2インスタンス数と、初期のサイズまたはスケーリングポリシー（最小サイズ・最大サイズ）と照らし合わせて必要な場合にEC2インスタンスを起動する。
- ③起動設定をもとにAMIからEC2インスタンスが作成・起動される。
- ④起動したEC2インスタンスに、ELBからのヘルスチェックが成功した時点でELBからのアクセスが割り振られるようになる。


# 終わりに
本稿で触れた部分は、CloudFormationやBeanstalkもしくはTerraform等のオーケストレーションツールで管理されている部分と思われますので、
素で触るケースは少なくなってきているかと思いますが、ご参考まで。
MacPorts で古い tmux をインストールして使う

tmux 2.2への移行ができたものの，[いろいろと問題](http://qiita.com/river24/items/4d4e4d06cf1b12a2c20d#既知の問題)があり，使いにくいです．

なので，tmuxを古いものに戻すことにしました．

***

# インストール

では，インストール手順から．

1つ前のtmuxは@2.1_3になるので，それをインストールします．半角borderのパッチも，2.2で使ったやつに変更してしまいます．

```shell-session
cd /tmp
svn checkout -r 145953 https://svn.macports.org/repository/macports/trunk/dports/sysutils/tmux
cd tmux
sudo port patch
cd work/tmux-2.1
curl -kL "https://gist.githubusercontent.com/waltarix/1399751/raw/e60e879335bf3b91fef4592b194cc524bcb95388/tmux-ambiguous-width-cjk.patch" | sudo patch -p1
curl -kL "https://raw.githubusercontent.com/silenvx/PKGBUILD/master/tmux/borders.patch" | sudo patch -p1
cd -
sudo port -s install
sudo port activate tmux @2.1_3
```

これで，tmuxが古くなりました．

# 設定ファイル

2.1ではutf8のオプションが必要なので，以下の行を復活させます．

```
set-window-option -g utf8 on
```

半角borderのパッチを変更したので，以下の行は不要（コメントアウトしたまま）です．

```
# set -g pane-border-ascii on
```

# 今後のアップグレード作業

アップグレード時に，全てのパッケージを更新してしまうと，tmuxも最新のものに差し替えられてしまうので，今後のアップグレード作業は以下のようにします．

```shell-session
sudo port -u upgrade outdated and not "tmux*"
```
Learning Rails 20 UserItem by Form


```bash
vi app/controllers/users_controller.rb
```

Add these lines

#####Return array. not ActiveRecord Object.
#####Pluck is a great way to reduce memory

```ruby:users_controller.rb
def show
  @items = Item.all.pluck(:name, :id)
end
```

```bash
vi app/views/users/show.html.erb
```

```ruby:show.html.erb
<% @user.user_items.where(approved: true).each do |user_item| %>
    <li>
      <%= user_item.item_id %>
      <%= user_item.item.name %>
    </li>
<% end %>
```

```ruby:show.html.erb
<li>
  <%= form_for [@user, @user.items.build] do |f| %>
    <%= f.select :id, @items %>
    <%= f.submit %>
  <% end %>
</li>
```

current show.html.erb

```ruby:show.html.erb
<h1>Users Show</h1>
 
<%= @user.name %>:<%= @user.approved %>
 
<ul>
  <% @user.reviews.where(approved: true).each do |review| %>
    <li>
      <%= review.rate %>
      <%= link_to "Delete", user_review_path(review.user_id, review.id), method: :delete, data: { confirm: "Are you sure?"} %>
    </li>
  <% end %>
  <% @user.user_items.where(approved: true).each do |user_item| %>
    <li>
      <%= user_item.item_id %>
      <%= user_item.item.name %>
    </li>
  <% end %>
  <li>
    <%= form_for [@user, @user.reviews.build] do |f| %>
      <%= f.text_field :rate %>
      <%= f.submit %>
    <% end %>
  </li>
  <li>
    <%= form_for [@user, @user.items.build] do |f| %>
      <%= f.select :id, @items %>
      <%= f.submit %>
    <% end %>
  </li>
</ul>
```

```bash
vi app/controllers/items_controller.rb
```

```ruby:items_controller.rb
class ItemsController < ApplicationController
  def create
    @user = User.find(params[:user_id])
    @item = Item.find(params[:item][:id])
    @user.items << @item
 
    redirect_to user_path(@user.id)
  end
end
```

```bash
vi config/routes.rb 
```

```ruby:routes.rb
Rails.application.routes.draw do
  resources :users do
    resources :reviews
    resources :items
  end

  root 'users#index'
end
```

![スクリーンショット 2016-05-03 19.01.17.png](https://qiita-image-store.s3.amazonaws.com/0/39073/589e5deb-99bc-a878-0136-bb3fd725db9c.png "スクリーンショット 2016-05-03 19.01.17.png")
[Slack]Botkitをherokuの無料プランで動かす方法

SlackのBotを作るためのフレームワーク**Botkit**でbotを作成し、
herokuの無料プランで動かす方法です。

#1.SlackでBotを作成する
下記リンクより、SlackのBot設定ページに遷移する。
https://my.slack.com/services/new/bot
Botの名前を設定し、Add integtationボタンを押下する。
![bot1.png](https://qiita-image-store.s3.amazonaws.com/0/92492/e95ace1f-ab33-7fc4-afcc-51ac414ac8d2.png)


API Tokenが発行されるので、メモしておく。
BotのIconや名前などもここで設定できる。
![bot2.png](https://qiita-image-store.s3.amazonaws.com/0/92492/a83836d0-e65a-2bb3-2d2d-92406cdddb27.png)


#2.Botkitをダウンロードする
ローカル環境の適当なディレクトリにBotkitをダウンロードする。
`git clone https://github.com/howdyai/botkit.git`

botkitの依存パッケージをインストールする。
`cd botkit`
`npm install`

#3.サンプルBotをローカル環境で動かす
下記コマンドを実行し、ステップ1でコピーしたAPI Tokenを使ってサンプルBotを動かす。
`token=YOUR_API_TOKEN node bot.js`
※YOUR_API_TOKENを各自のトークンで差し替える。

好きなチャンネルに入り、Botを招待すれば、Botの作成は完了。
`/invite @test-bot`

![bot6.png](https://qiita-image-store.s3.amazonaws.com/0/92492/f0f55b4b-4727-05b2-1dbf-63e69dbd12b2.png)

デフォルトでは以下のコマンドが使える。

```
@test-bot hello
@test-bot call me <Other Name> ※<Other Name>には好きなワードを入れる
@test-bot who am I
@test-bot shutdown
@test-bot uptime
```

テストが終わったら、ローカルで動かしているbotはctrl+cで止める。

#4.GitHubにアップする
herokuでworkerを登録するために、ルートディレクトリにProcfileを作成してからコミットし、Githubにアップする。

```lang:Procfile
worker: node slack_bot.js
```

#5.Herokuにアップする
Herokuにログインし、botkitをアップする。
`heroku login`
`git push heroku master`

Herokuの環境変数にAPI Tokenを追加する。
`heroku config:add token=YOUR_API_TOKEN`
※YOUR_API_TOKENを各自のトークンで差し替える。

#6.workerを起動させる
herokuのDashboardでwebをoffにし、workerをonにする。
![bot3.png](https://qiita-image-store.s3.amazonaws.com/0/92492/1bea030d-888c-34c8-4ab1-2742ad678e8d.png)


#7.Heroku SchedulerでJobを登録する
Herokuの無料プランでは一定時間(30分間)何もアクセスがないと自動的にSleep状態になるため、Heroku Schedulerを使って、定期的にDynoを起こす必要がある。
まずはHeroku Schedulerをインストールする。
![bot4.png](https://qiita-image-store.s3.amazonaws.com/0/92492/372bbd06-c9b2-8fa3-a3bd-3d9f57e57b04.png)


次に、Heroku SchedulerにJobを登録する。
FREQUENCYはHourlyにする。
![bot5.png](https://qiita-image-store.s3.amazonaws.com/0/92492/1aabdd72-c4d6-3c0e-26e5-b513f3a34984.png)


`(seq 22 23; seq 0 3; seq 10 18) | grep -qw $((10#`date -u "+%H"`)) && curl http://xxxxxxx.herokuapp.com > /dev/null 2>&1`
※上記コマンドはGMT表記なので、6-12時、19-27時の合計14時間稼働することになる。

***

<参考>
http://toach.click/slack-botkit/
http://qiita.com/kawanamiyuu/items/3193c74c888b816c6bd4
gitlab+virtualbox+centos7



自分用にgitが欲しくてwindowsのvagrantを使ってにgitlabをインストールしてみました。
[centos7のbox](https://github.com/CommanderK5/packer-centos-template/releases/download/0.7.1/vagrant-centos-7.1.box)を使用して、[gitlab](https://about.gitlab.com/downloads/#centos7)の通りにやりブラウザでアクセスすると
「502 Whoops, GitLab is taking too much time to respond.」とエラーが出た。

https://blog.apar.jp/linux/3555/
で「メモリ２GB以上が推奨」とあったので、virtualboxのメモリ割当を2GBにしたら動くようになった。
ストレージの割当も増やしたほうが良さそう。
Raspberry Pi 3のBluetoothでBLE Peripheral(bleno)を試してみる

## まえおき
ちょっとアプリの対抗として BLE Peripheral を実装(エミュレーション)する必要があったのだが、iOS/AndroidだとMACアドレス周りのセキュリティ考慮や、Android同士だと相性が出るという不治の病などがあって、スマートフォンでやるのは無理があるなぁと思っていた。
また、現場で実際にアプリのテストをやろうとしたりすると、Macのエミュレーションとかも、パラでやるのに向いていないのでなんだかなぁという状態だった。

> 「Raspberry Pi 3 Model B」発表のお知らせ
> https://raspberry-pi.ksyic.com/news/page/nwp.id/24

そんな折、Raspberry Pi 3先生にBluetooth 4.0/Wifiが内蔵されたということで、node.js/blenoあたりで実装すればハードの仕様差も少ないし調達も楽だしで現実的じゃん？と思った。
ただ、恥ずかしながらbleno自体初めてだし、Raspberry Pi 3でPeripheralキメたって話もあまり見つからなかったので、とりあえずミニマムで試してみた。

## 前提
- Raspberry Pi 3 Model B がある
- raspbianはインストール済み
  - Linux raspberrypi 4.1.19-v7+ #858 SMP Tue Mar 15 15:56:00 GMT 2016 armv7l GNU/Linux
  - /etc/debian_version : 8.0
- sudo apt-get update とかはあらかた終了

## 下ごしらえ

### nodebrewでnode.jsをインストール
Macで慣れているという理由で、深く考えずにnodebrewをインストール　
ここらへんを参照
> Raspberry PiにnodebrewでNode.jsをインストールする
> http://qiita.com/yuyakato/items/a1225154445520dc2db3

参照がうまく切り替わらなかったので一旦リブートしてからnodebrewでnode.jsをセットアップ　

```bash
$ nodebrew install-binary v4.4.3
$ nodebrew use v4.4.3
```

### bleno向けモジュール群
https://github.com/sandeepmistry/bleno の言う通りにセットアップ

```bash
$ sudo apt-get install bluetooth bluez libbluetooth-dev libudev-dev
```

## BLE Peripheralサンプル

blenoのサンプルをそのままコピペしてドーンでもいいのだけれど、何を実装しなきゃいけないかを把握したかったので、ミニマムな内容であえて一気通貫で書いてみた。

```json:package.json
{
  "name": "bleno-sample",
  "version": "1.0.0",
  "description": "bleno sample for rspi3",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "bleno": "^0.4.0"
  }
}
```

```js:index.js
var bleno = require('bleno');

var name = 'raspberrypi';
var serviceUuids = ['180F'];

var primaryService = new bleno.PrimaryService({
    uuid: '180F',
    characteristics: [
        new bleno.Characteristic({
            uuid: '2A19',
            properties: ['read'],
            value: new Buffer([100])
        })
    ]
});

bleno.on('stateChange', function(state) {
	console.log('stateChange: '+state);
	if (state === 'poweredOn') {
		bleno.startAdvertising(name, serviceUuids, function(error){
			if (error) console.error(error);
		});
	} else {
		bleno.stopAdvertising();
	}
});
bleno.on('advertisingStart', function(error){
	if (!error) {
		console.log('start advertising...');
		bleno.setServices([primaryService]);
	} else {
		console.error(error);
	}
});
```

内容は、BatteryService/BatteryLevelのみの佗しい感じで。

## サンプルの実行

デバイスいじるのでsudoで実行

```bash
$ sudo node index.js 
stateChange: poweredOn
start advertising...
```

iOSのLightBlueで見るとこんな感じ。
<img width="50%" alt="IMG_9034.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/52410/fb334bda-aef2-8143-5553-1b829c668143.png">


AndroidのB-BLEだとこう。
<img width="50%" alt="Screenshot_20160503-184829.png" src="https://qiita-image-store.s3.amazonaws.com/0/52410/5a497bb0-53ff-9b12-96a8-95a30865eb5e.png">

概ね良好そう。

## 結果

- node.jsのバージョンで最初ハマったけど、それ以外は概ね何もしなくても動いた。
- アドバタイズの停止やリブートなども試したが、iOS/Androidに通知されるPeripheralのMACアドレス(or UDID)はちゃんと固定になっている(当たり前だが)
- NEXUS9やNEXUS Playerで実装した時はAndroid -> Androidの接続が異常に遅かったが、そういうのは無く、iOSと同程度の速さでConnectできた。
- Androidで実装した時と違ってとにかく全体的に早い。
AndroidStudioでReleaseビルドを行うためのメモ

リリース用APKを作成したのでその手順のメモです。

# 目次

1. 　`Generate Signed APK` 画面を表示する
2. 　`New Key Store` 画面で鍵を作成する
3. 　署名の確認
4. 　最適化の確認

# Generate Signed APK 画面を表示する

`Build -> Generate Signed APK...` で `Generate Signed APK` 画面を表示する
<img width="276" alt="スクリーンショット 2016-05-03 17.58.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/53393/f0034119-e5f6-7a35-5736-a9e182bbddb1.png">

Moduleを選択して `Next` を押下
<img width="441" alt="スクリーンショット 2016-05-03 18.00.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/53393/ccbd8a2d-5d7d-efe2-af96-ef4d7d779c9c.png">

`Create new...` を選択してKeyStoreを作成画面を表示します
<img width="440" alt="スクリーンショット 2016-05-03 18.04.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/53393/8f6748e7-c28a-69e1-3b47-049135dbb428.png">

# New Key Store 画面で鍵を作成する

1. Key store path: 任意に設定
2. Password:, Confirm: KeyStoreのパスワードを任意に設定
3. [Key]
    1. Alias: 任意に設定
    2. Password:, Confirm: Keyのパスワードを任意に設定
    3. Validity (years): 有効期限を任意に設定
    4. [Certificate]
        1. First and Last Name: 任意
        2. Organizational Unit: 任意
        3. Organication: 任意
        4. City or Locality: 任意
        5. State or Province: 任意
        6. Country Code (XX): 任意

<img width="524" alt="スクリーンショット 2016-05-03 18.09.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/53393/42865faa-cdf5-10d5-07eb-551f6f0610ee.png">

なんかこの次にマスターパスワードっていうのを設定したけどなんだったんだろう・・・
２回目以降出てこなかった・・・

# 署名の確認

## keytool の場所

```
$ which keytool
/usr/bin/keytool
```

## 確認方法

```
$ keytool -list -printcert -jarfile app-release.apk
```

# 最適化の確認

## zipalign の場所

```
$ which zipalign
/Users/chibi/Library/Android/sdk/build-tools/23.0.3/zipalign
```

## 確認方法

```
$ zipalign -c -v 4 app-release.apk 
```
【TechShop JP】真空成型機Tips

# 型番

Formica 508fs
[メーカーページ](http://www.nsksystem.co.jp/product/formech/index.html)(日本の代理店:日本製図器工業株式会社)

![pre.jpg](https://qiita-image-store.s3.amazonaws.com/0/63450/ffc7c82f-3d9e-b25c-9350-34e253e49f2f.jpeg)


# 操作動画

https://www.youtube.com/watch?v=BqV_jsxD0UA
# 材料

材料のサイズは、500mmx450mmのサイズにする。

|材料|厚み|時間|概要|
|:-:|:-:|:-:|:-:|
|PET|0.3mm|18秒|検証済み|
|PET|0.5mm|25秒|検証済み|
|ABS|1mm|25-30秒|未検証|

# 材料の購入先

|店舗名|材料のリンク|
|:-:|:-:|
|はざいや|[PET板](https://www.hazaiya.co.jp/category/petban.html) [ABS樹脂](https://www.hazaiya.co.jp/category/gousei_abs.html)|
|アクリルアイ|[PET板](http://www.acryl.jp/material/pet.html) [ABS樹脂](http://www.acryl.jp/material/pppeabs.html)|

葛飾区の東四つ木近辺に、材料のお店が多い

- [アクリルアイ株式会社](http://www.acryl.jp/info/company.html)
- [はざい屋](https://www.hazaiya.co.jp/store01.html)

# 型を作る
型は、
- MDF
- ケミカルウッド
- アルミニウム
等で作成する。

台形にする(最低3度)。吸引穴を開ける(1mm-2mm)。MDFは穴がなくても吸い込む。

# Tips

素材を熱し始めた後に

1. 素材がダラんと柔らかくなる
2. 素材がピンと張る

これで、真空成型ができる柔らかさになる。

# トリミング

http://blog.livedoor.jp/omine_chemistry/archives/50866992.html
[debina][個人メモ] mozcの設定画面が消える

#mozcの設定画面が開けない

普段、全角半角切り替えを<Ctrl>Spaceで行っている
設定はmozcのIME有効化、無効化の切り替え

その設定画面が開けなかったのでgoogle先生に聞いた
開けないというより、開いてもすぐに勝手に消える
設定を有効にできない状態

OS debian 8

```bash
--Error message
terminate called after throwing an instance of 'google::protobuf::FatalException'
  what():  CHECK failed: generated_database_->Add(encoded_file_descriptor, size): 
--

$ sudo aptitude purge uim-mozc
```

mozcはibus-mozcを使う
設定後のメッセージでは「次に開くアプリケーションから有効に〜」とかあったけれど
再起動しないと有効にならなかった
【深層学習】再帰ニューラルネットワークに関する良ページまとめ [DW 5日目]

## LSTM
- [Understanding LSTM Networks](http://colah.github.io/posts/2015-08-Understanding-LSTMs/)
- [LSTMネットワークの概要](http://qiita.com/KojiOhki/items/89cd7b69a8a6239d67ca)
- [わかるLSTM ～ 最近の動向と共に](http://qiita.com/t_Signull/items/21b82be280b46f467d1b)
- [Recurrent Neural Networks](http://www.slideshare.net/beam2d/pfi-seminar-20141030rnn)

## REA (Recursive Auto Encoder)
- [Dynamic Pooling And Unfolding Recursive Autoencoders For Paraphrase Detection](http://www.socher.org/index.php/Main/DynamicPoolingAndUnfoldingRecursiveAutoencodersForParaphraseDetection)
- [深層学習時代の自然言語処理](http://www.slideshare.net/unnonouno/ss-43844132)

## Sequence to sequence
- [Sequence to Sequence Learning
with Neural Networks](https://papers.nips.cc/paper/5346-sequence-to-sequence-learning-with-neural-networks.pdf)

## Grid LSTM
- [Grid Long Short-Term Memory](http://arxiv.org/abs/1507.01526)

## 画像+RNN
- [CVPR 2015 論文紹介（NTT研究所内勉強会用資料）](http://www.slideshare.net/YoshitakaUshiku/cvpr-2015-ntt-cs)

## その他
- [How to Construct Deep Recurrent Neural Networks](http://arxiv.org/abs/1312.6026)


# 自分のページヘのリンク
- [Deep Learning を徹底的に勉強してみる [DW 0日目]](http://qiita.com/komakomako/items/d36071567deefe6192f9)
[python3.5] pysideインストールできず (2016/5/3)

#PySideがまだインストールできなかった

```bash
$ pip install pyside                                                                        [~]
Collecting pyside
  Downloading PySide-1.2.4.tar.gz (9.3MB)
    100% |████████████████████████████████| 9.3MB 131kB/s 
    Complete output from command python setup.py egg_info:
    only these python versions are supported: [(2, 6), (2, 7), (3, 2), (3, 3), (3, 4)]
    
    ----------------------------------------
```

しょうが無いのでPyQt5をインストール
ライセンス的にPySideの方が自由度が高かったような
ちょっと調べておかねば
Learning Rails 19 Create UserItem


This table is for association

```bash
rails g model UserItem user:references item:references approved:boolean
```

```bash
vi db/migrate/20160503091723_create_user_items.rb
```

Add this line

```ruby:_user_items.rb
t.boolean :approved, default: true
```

```bash
rake db:migrate
```

Check table

```bash
mysql -uroot learning_development -e "desc user_items"
```

######Set UP associations for user

```bash
vi app/models/user.rb
```

Add this line

```ruby:user.rb
has_many :user_items
has_many :items, through: :user_items
```

```bash
rails c
```

You can check association

```ruby:console
User.first.items
```

![スクリーンショット 2016-05-03 17.21.25.png](https://qiita-image-store.s3.amazonaws.com/0/39073/d00a2f17-acf7-9b86-f849-56534092a295.png "スクリーンショット 2016-05-03 17.21.25.png")

Insert data

```ruby:console
user = User.first
```

```ruby:console
item = Item.first
```

```ruby:console
user.items << item
```

![スクリーンショット 2016-05-03 17.22.44.png](https://qiita-image-store.s3.amazonaws.com/0/39073/0b1091d8-1561-f056-dc8f-eee815b7820a.png "スクリーンショット 2016-05-03 17.22.44.png")

######Set UP associations for item

```bash
vi app/models/item.rb
```

```ruby:item.rb
class Item < ActiveRecord::Base
  has_many :user_items
  has_many :users, through: :user_items
end
```

You can check association.

```bash
rails c
```

```ruby:console
Item.first.users
```

![スクリーンショット 2016-05-03 17.25.17.png](https://qiita-image-store.s3.amazonaws.com/0/39073/2390fc86-d83e-da7d-e8e1-2656ad8bc6d9.png "スクリーンショット 2016-05-03 17.25.17.png")
Visual Studio を Sublime Text のショートカットキーに変更(随時更新)

# IDEが使いたい
Sublime Textから移行する気になったわけではないですが、やはりIDEの補完機能などは魅力的。

そういうわけで、PythonのIDEにもなるし、最近個人的にMS熱があるし、自分がよく使うST3のキーバインドをVisaul Studioで再現する設定を書いていきます。

※ なおキーバインディングは、私の設定になります。キーバインディングの設定対応表みたいな感じで参考にしていただけるといいかなと。
※ Visual Studioは日本語で使っているので設定名も日本語です。
※ 随時更新していきます。

# キーバインド
|Sublime Text|Visual Studio|Key Binding|
|------------|-------------|-----------|
|Navigate to definition (Ctags)|定義に移動|Ctrl+Shift+.|
|Jump prev (Ctags)|表示::戻る|Ctrl+Shift+,|
|Goto Anything|移動|Ctrl+P|
|Toggle Comment|選択範囲のコメント|Ctrl+/|
|Toggle Comment|選択範囲のコメントを解除|Ctrl+Shift+/|
|Jump to Matching Bracket|かっこに移動|Ctrl+M|
|fold|アウトラインの展開/折り畳み|Ctrl+Shift+[|
|unfold|アウトラインの展開/折り畳み|Ctrl+Shift+]|

##### 注釈
私はVisual Studioがすごいかどうかはよく分かってないです。勢いで使おうかと思っただけ。
[debian][個人メモ] pythonにmatplotlibを入れる

#またmatplotlibに詰まった

pyenvの設定ができたのでpython3.5.1でpython開始
ipython, numpy, schipyはpipで何も考えずに終了
matplotlibに詰まった

なんか前もこいつで詰まった覚えがある

```bash
sudo apt-get install libfreetype6-dev
sudo apt-get install pkg-conf
```

freetypeとpngのライブラリが見つからずにインストールが失敗するんだけど、
freetypeインストールしてもうまく動かない

海外の掲示板でpkg-conf入れた動いたとかいう書き込みがあったのでやってみたらビンゴ
インストールできた
Learning Rails 18 Create Items


```bash
rails g model Item name:string deleted:boolean
```

```bash
vi db/migrate/20160503091052_create_items.rb
```
Add this line

```ruby:_create_items.rb
t.boolean :deleted, default: false
```

```bash
rake db:migrate
```

Check items table

```bash
 mysql -uroot learning_development -e "desc items"
```

```bash
rails c
```

```ruby:console
["gold", "silver", "money", "gun"].each do |v|
  Item.create(name: v)
end
```

![スクリーンショット 2016-05-03 17.14.03.png](https://qiita-image-store.s3.amazonaws.com/0/39073/766e96b2-fb8d-03d8-7d0c-99dad3163c1e.png "スクリーンショット 2016-05-03 17.14.03.png")
[debian][個人メモ] vmware player12のインストール、有効化

#VMWare player 12のインストール

vmware playerのインストールファイルをダウンロード

```bash
cd Download
sudo chmod 777 ./VMware-Player-12.XXXXXXXX.x86_64.bundle
bash ./VMware-Player-12.XXXXXXXX.x86_64.bundle
```

起動時にいろいろ必要だと怒られたので以下をインストール

```bash
sudo apt-get install build-essentials
sudo apt-get install linux-headers-$(uname -r)
```

起動時にいろいろ動いて起動完了
[debian][個人メモ] ログインユーザーでsudoが使えるようにする

#sudoを有効化

```
$ su
# visudo

--before
# User privilege specification
root	ALL=(ALL:ALL) ALL

--after
# User privilege specification
root	ALL=(ALL:ALL) ALL
<username>	ALL=(ALL:ALL) ALL

# exit
```

<username>は各人のユーザー名に
文法は下

```
ユーザ ホスト=(権限) コマンド
```
Swift逆引きハンドブック


Swift2.xに対応した逆引きレファレンス参考書です。Swiftでプログラミングする時に実装したい機能に対応するコードを知ることができます。Swiftの持つ機能についてかなり細かく網羅されています。表紙には「iOSアプリ開発者の必携書!」とありますが、内容を見るとあながち大げさではない。著者の自信が伺えます。
逆引きというキーワードでいくと、「Swift逆引き大全 555の極意」という参考書が秀和システムから一足先に出版されていますが、こちらは「Swift逆引き」と謳ってはいますが、Swiftと言うよりは、iOS SDKといった方がマッチしている内容で、むしろ各種のAPIやXCodeの操作などの内容が主体でした。
こちらの「Swift逆引きハンドブック」は本当にSwiftの言語機能に絞って項目を選び、解説をしていますから、文字通りSwiftの逆引きレファレンスです。普段あまり使わないようなディープな内容まで踏み込んでいて、Appleの公式ブックである「Swift Programming Guide」よりも詳しいようです。このハンドブックをめくって初めて出会う組み込みメソッドもかなりあります。
ここまで調べて書籍化していただいた著者の林　晃氏に感謝です。
しかし、これだけ詳細に踏み込んで豊富な内容になっているためか、初版の出版が2016年2月になってしまいました。2016年の秋には多分Swift3.0が出るので、この内容も一部は改変されてしまいます。本来ならSwift3.x対応版が出てから購入したいところですが、この内容の豊富さ、カバーしている内容を見るとやはり早く入手しておきたいと思いました。

![IMG_0410.jpg](https://qiita-image-store.s3.amazonaws.com/0/60473/874b9168-eb3d-ee1f-fcda-2e5ace04e351.jpeg "IMG_0410.jpg")
Learning Rails 17 Delete reviews



|Prefix | Verb | URI | Controller#Action| Explanation |   
|:-----------|:------------|:------------|:------------|:------------|
|user_review |DELETE|/users/:user_id/reviews/:id|reviews#destroy|reviews controller and destroy action|


![スクリーンショット 2016-05-03 16.38.50.png](https://qiita-image-store.s3.amazonaws.com/0/39073/d9f13d36-f446-b8e3-f346-0c5f72e66913.png "スクリーンショット 2016-05-03 16.38.50.png")

```bash
vi app/views/users/show.html.erb
```

```ruby:app/views/users/show.html.erb
<%= link_to "Delete", user_review_path(review.user_id, review.id), method: :delete, data: { confirm: "Are you sure?"} %>
```

current show.html.erb

```ruby:show.html.erb
<h1>Users Show</h1>
 
<%= @user.name %>:<%= @user.approved %>
 
<ul>
  <% @user.reviews.each do |review| %>
    <li>
      <%= review.rate %>
      <%= link_to "Delete", user_review_path(review.user_id, review.id), method: :delete, data: { confirm: "Are you sure?"} %>
    </li>
  <% end %>
  <li>
    <%= form_for [@user, @user.reviews.build] do |f| %>
      <%= f.text_field :rate %>
      <%= f.submit %>
    <% end %>
  </li>
</ul>
```

```bash
vi app/controllers/reviews_controller.rb
```

Add this lines

```ruby:reviews_controller.rb
def destroy
  @review = Review.find(params[:id])
  @review.destroy
  redirect_to user_path(params[:user_id])
end
```

current reviews_controller.rb

```ruby:reviews_controller.rb
class ReviewsController < ApplicationController
  def create
    @user = User.find(params[:user_id])
    @review = @user.reviews.create(review_params)
    redirect_to user_path(@user.id)
  end
 
  def destroy
    @review = Review.find(params[:id])
    @review.destroy
    redirect_to user_path(params[:user_id])
  end
 
  private
    def review_params
      params[:review].permit(:rate)
    end
end
```

![スクリーンショット 2016-05-03 16.54.46.png](https://qiita-image-store.s3.amazonaws.com/0/39073/fb3d569d-5c62-3c9c-f61c-31302fd6edf7.png "スクリーンショット 2016-05-03 16.54.46.png")
[debian][個人メモ] caps to ctrl_L, mouse pointer

# xmodmapでCapslockをCtrlにする
# xmodmapでマウスの戻るをセンタークリックに


みんな知ってるxmodmapを使ったcapslockをCtrlにする方法
ついでにマウスの戻るボタンをセンタークリックに

戻るはマウスジェスチャー使うのでボタンとしていらない
使っているマウスのホイールクリックが使いにくいので2と8を入れ替え

```bash
$ vim ~/.xmodmaprc
pointer = 1 8 3 4 5 6 7 2 9 10 11 12 13
remove Lock = Caps_Lock
keysym Caps_Lock = Control_L
add Control = Control_L

$ xmodmap ~/.xmodmaprc
```

さて、これを起動時に毎回読ませたいんだけどうまく動かない

```bash
echo 'xmodmap ~/.xmodmaprc' >> ~/.profile
```
なんで動かないんでしょう
zsh使ってるからかな

あとbluetoothのトラブルでpulseaudioをkillするとxmodmapの設定が戻る
理由はわからない
Learning Rails 16 Create reviews(Form, Save)


```bash
vi app/views/users/show.html.erb
```

Add this line

```ruby:show.html.erb
<ul>
  <% @user.reviews.where(approved: true).each do |review| %>
    <li><%= review.rate %></li>
  <% end %>
  <li>
    <%= form_for [@user, @user.reviews.build] do |f| %>
      <%= f.text_field :rate %>
      <%= f.submit %>
    <% end %>
  </li>
</ul>
```

Current show.html.erb

```ruby:show.html.erb
<h1>Users Show</h1>
 
<%= @user.name %>:<%= @user.approved %>
 
<ul>
  <% @user.reviews.where(approved: true).each do |review| %>
    <li><%= review.rate %></li>
  <% end %>
  <li>
    <%= form_for [@user, @user.reviews.build] do |f| %>
      <%= f.text_field :rate %>
      <%= f.submit %>
    <% end %>
  </li>
</ul>
```

```bash
vi app/controllers/reviews_controller.rb
```

```ruby:reviews_controller.rb
class ReviewsController < ApplicationController
  def create
    @user = User.find(params[:user_id])
    @review = @user.reviews.create(review_params)
    redirect_to user_path(@user.id)
  end
 
  private
    def review_params
      params[:review].permit(:rate)
    end
end
```

Set up validation

```bash
vi app/models/review.rb
```

```ruby:review.rb
class Review < ActiveRecord::Base
  belongs_to :user
  validates :rate, presence: true
end
```

![スクリーンショット 2016-05-03 16.46.27.png](https://qiita-image-store.s3.amazonaws.com/0/39073/ea6ef0d4-355a-92da-16fe-cacc7a7003bb.png "スクリーンショット 2016-05-03 16.46.27.png")
Learning Rails 15 Create reviews(Model, Controller, Associations)


```bash
rails g model Review user:references rate:integer approved:boolean
```

```bash
vi db/migrate/20160503082945_create_reviews.rb 
```

Add default value to approved column

```ruby:create_reviews.rb
class CreateReviews < ActiveRecord::Migration
  def change
    create_table :reviews do |t|
      t.references :user, index: true
      t.integer :rate
      t.boolean :approved, default: true
 
      t.timestamps
    end
  end
end
```

```bash
rake db:migrate
```

Confirm that table was created

```bash
mysql -uroot learning_development -e "desc reviews"
```

Set UP association

```bash
vi app/models/user.rb
```

Add this line

```bash
has_many :reviews
```

current user.rb

```ruby:user.rb
class User < ActiveRecord::Base
  has_many :reviews
  validates :name,
            presence: true,
            length: {minimum: 3}
end
```

You can check association

```bash
rails console
```

```bash
User.first.reviews
```

We can see 2 Queries

![スクリーンショット 2016-05-03 16.35.26.png](https://qiita-image-store.s3.amazonaws.com/0/39073/3393830a-7328-f8ce-750b-265618b59f62.png "スクリーンショット 2016-05-03 16.35.26.png")

```bash
exit
```

```bash
rails g controller Reviews
```

```bash
vi config/routes.rb
```

```ruby:routes.rb
resources :users do
  resources :reviews
end
```

Check routes

```bash
rake routes
```

![スクリーンショット 2016-05-03 16.38.50.png](https://qiita-image-store.s3.amazonaws.com/0/39073/d9f13d36-f446-b8e3-f346-0c5f72e66913.png "スクリーンショット 2016-05-03 16.38.50.png")
PowerShellを使ってWindows版Itunes com Interfaceを使う

っていうかまずItunes com Interfaceのドキュメントが無いんだよね。
アップロードするのもアレだから情報だけ書くと、俺のPCには2009年タイムスタンプのiTunesCOM.chmがあってファイルサイズは264310バイト。バージョンは8.1.0.52 
。MD5は`315C0D34AE9BAA16CDEF326AC415814289A6D168239A34CE5CDC126A81A41640`ですと


で、iTunesComIterfaceはWin10 Itunes  12.3.1 64bitでも動くけど、iCloudとかの新しい機能に全然対応してない気がする。
このスクリプトではやってないけど、`LibraryPlayList.AddFile`したファイルの曲名とかをスクリプトから設定する処理が入っている時はiTunesのメニュー→ストア からサインアウトすべき＆Addfileして5秒はスリープすべき。
と言うのも、iTunesにサインインをしていると曲が追加された瞬間にiCloudにアップロードしようとする。その処理をしている間は曲名とか 曲のプロパティを書き換える処理は失敗するっぽい。

というのはともかく、以下が全ての曲情報を取得するコード。結構重い。

```ps1:ItunesList.ps1
# utf16です
$iTunes = New-Object -Com "iTunes.Application"
$list=New-Object -TypeName System.Collections.ArrayList
$i.LibraryPlayList.Tracks | foreach{
	$hasArtwork = ""
	if ( $_.Artwork.count -ne 0 ){
		$hasArtwork="○"
	}
	$list += [PSCustomObject]@{
		Name = $_.Name
		Genre = $_.Genre
		SampleRate = $_.SampleRate
		Size = $_.Size
		Year = $_.Year
		Artwork = if ( $_.Artwork.count -ne 0 ){"×"}else{"○"}
		Podcast =  if ( $_.Podcast -eq $false ){"×"}else{"○"}
		Album =  if( $_.Album -eq "" ){"-empty-"}else{$_.Album}
		Artist = if( $_.Artist -eq "" ){ "-empty-" }else{ $_.Artist }
		SortAlbum = if( $_.SortAlbum -eq "" ){ "-empty-"}else{ $_.SortAlbum }
		SortArtist = if( $_.SortArtist -eq "" ){ "-empty-"}else{ $_.SortArtist }
		SortName = if( $_.SortName -eq "" ){ "-empty-" }else{ $_.SortName }
		Comment = if( $_.Comment -eq "" ){ "-empty-" }else{ $_.Comment -replace "`n"," " }
	}
}
#$list | sort-object -property Name | Format-Table -AutoSize | more
$list | where Podcast -eq "×" | sort-object -property Name | Export-Csv "itunesList.tsv" -Delimiter `t -Encoding UTF8 -Force -NoTypeInformation

```
LiveScript で FizzBuzz

# 素直に書いた場合

```livescript
fizzbuzz = ->
  | it % (3 * 5) is 0 => \FizzBuzz
  | it % 3 is 0 => \Fizz
  | it % 5 is 0 => \Buzz
  | _ => it
[1 to 30] |> each fizzbuzz >> console~log
```

# `is_multiple_of`関数を作って抽出する

## 回答1 (バッククォートを想定)

```livescript
is_a_multiple_of = (a, b)-> a % b is 0
fizzbuzz = ->
  | it `is_a_multiple_of` (3 * 5) => \FizzBuzz
  | it `is_a_multiple_of` 3 => \Fizz
  | it `is_a_multiple_of` 5 => \Buzz
  | _ => it
[1 to 30] |> each fizzbuzz >> console~log
```

## 回答2 (パイピングを想定)

```livescript
is_a_multiple_of = (b, a)--> a % b is 0
fizzbuzz = ->
  | it |> is_a_multiple_of (3 * 5) => \FizzBuzz
  | it |> is_a_multiple_of 3 => \Fizz
  | it |> is_a_multiple_of 5 => \Buzz
  | _ => it
[1 to 30] |> each fizzbuzz >> console~log
```

---

# 課題

関数を作る際、バッククォートを想定して作るか、パイピングでの利用を想定して作るかで引数の宣言順番が異なります。
そもそもコンセプトが相反するものなので両対応のものは出来なさそうです。

どっちでも作れそうな時はどっちが美しいんでしょうかね？
ぶっちゃけ好みの問題な気もしますが…

カリー化してある関数のほうがLiveScriptではパイピングや関数合成でポンポン値を変化させられますし、prelude-lsのほぼ全ての関数がパイピングでの利用を想定しています。
そう考えるとパイピング想定の方が素直な気もしますね。

でも、is_multiple_of関数なんて発展性のない2引数しか使わないので、やはりバッククォートを使うべきか？
意外と悩ましい問題です。
Paho(MQTT Client Library) -Python-

# ライブラリのインストール

```
$ sudo pip install paho-mqtt
```


# サンプル

下記の例は、クライアント証明書によるクライアント認証を行うサンプルコードです。
パスワード認証をするときは``username``と``password``が絡む行を有効にしてださい。


## ファイル・ディレクトリ構造

```
 current directory/
   + pub.py
   + sub.py
   + cert/
      + ca.crt              # 認証局の証明書
      + client.crt          # クライアント証明書
      + client_nopass.key   # クライアント証明書の秘密鍵
```

コードを実行する度にパスワード入力が面倒なのでクライアント証明書の秘密鍵のパスワードを解除したファイルで動作確認しています。パスワードを解除していない秘密鍵を指定すると、コード実行時に秘密鍵のパスワードの入力を促されるはずです。


## サンプルコード

```py:pub.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import paho.mqtt.client as mqtt
import ssl

host = 'Server証明書のFQDN'
port = 1883
### パスワード認証を使用する時に使用する
#username = 'mqtt'
#password = 'mqtt'
### SSL
port = 8883
cacert = './cert/ca.crt'
clientCert = './cert/client.crt'
clientKey = './cert/client_nopass.key'

topic = 'paho/mqtt'
message = 'test message'

def on_connect(client, userdata, flags, respons_code):
    """broker接続時のcallback関数
    """
    print('status {0}'.format(respons_code))
    client.publish(topic, message)

def on_publish(client, userdata, mid):
    """メッセージをpublishした後のcallback関数
    """
    client.disconnect()

if __name__ == '__main__':
    ### インスタンス作成時にprotocol v3.1.1を指定
    client = mqtt.Client(protocol=mqtt.MQTTv311)
    ### パスワード認証を使用する時に使用する
    #client.username_pw_set(username, password=password)
    ### SSL
    client.tls_set(cacert,
        certfile = clientCert,
        keyfile = clientKey,
        tls_version = ssl.PROTOCOL_TLSv1_2)
    client.tls_insecure_set(True)

    ### callback function
    client.on_connect = on_connect
    client.on_publish = on_publish

    client.connect(host, port=port, keepalive=60)
    client.loop_forever()
```


```py:sub.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import paho.mqtt.client as mqtt
import ssl

host = 'Server証明書のFQDN'
port = 1883
### パスワード認証を使用する時に使用する
#username = 'mqtt'
#password = 'mqtt'
# SSL
port = 8883
cacert = './cert/ca.crt'
clientCert = './cert/client.crt'
clientKey = './cert/client_nopass.key'

topic = 'paho/mqtt'

def on_connect(client, userdata, flags, respons_code):
    """broker接続時のcallback関数
    """
    print('status {0}'.format(respons_code))
    client.subscribe(topic)

def on_message(client, userdata, msg):
    """メッセージ受信時のcallback関数
    """
    print(msg.topic + ' ' + str(msg.payload))

if __name__ == '__main__':
    ### インスタンス作成時にprotocol v3.1.1を指定
    client = mqtt.Client(protocol=mqtt.MQTTv311)

    ### パスワード認証を使用する時に使用する
    #client.username_pw_set(username, password=password)
    ### SSL
    client.tls_set(cacert,
        certfile = clientCert,
        keyfile = clientKey,
        tls_version = ssl.PROTOCOL_TLSv1_2)
    client.tls_insecure_set(True)

    ### callback function
    client.on_connect = on_connect
    client.on_message = on_message

    client.connect(host, port=port, keepalive=60)
    client.loop_forever()
```


# 参考サイト

- [Paho - Open Source messaging for M2M](https://eclipse.org/paho/clients/python/docs/)
- [17.3. ssl — ソケットオブジェクトに対する TLS/SSL ラッパー &mdash; Python 2.7.x ドキュメント](http://docs.python.jp/2/library/ssl.html)
ROS_01:準備編　Ubutuのインストール

#参考
http://wiki.ros.org/jade/Installation/Ubuntu
を参考にしている。

#Ubutuのダウンロード
”ROS Indigo は Saucy または, Trusty のみサポートします. ”と書かれているの
ubuntu　14.04.4(ubuntu-14.04.4-desktop-amd64.iso)をダウンロードしました。
ダウンロード先：http://ftp.jaist.ac.jp/pub/Linux/ubuntu-releases/trusty/

#インストール
使わなくなったレッツノート(CF-R6)にクリーンインストール
日本語でとりあえずインストール

※格安タブレットとかは32bit UEFI でubutuをインストールし辛いとの情報もある。(ATOM系は要注意）

#設定
##ネットワークの設定
まあ、無線LANを使うでしょうね。。

##パッケージの更新
インストール出来たらパッケージを最新にするために端末を開いて

```
$apt-get update
$apt-get upgrade
```

を実行。
##リポジトリの変更
システム設定->ソフトウエアとアップデータ　ubuntuソフトウエアのタグで、
"restricted", "universe", そして, "multiverse", を許可する設定
これは、最初から設定されていた。


#注意
適宜修正を入れます。
自作クラスの親クラスはModuleでもClassでもなくObjectである

自作クラスの親クラスが`Module`でも`Class`でもなく`Object`であることが不思議に思えたので、`Object`, `Module`, `Class`の影響を調べてみました。これら3つの関係は下の通りです。

![14541f2e9517ce75a743d0e2336a2df3.jpg](https://qiita-image-store.s3.amazonaws.com/0/62881/30daacd5-a4aa-5d88-bf0b-f986f600bcbb.jpeg)

![ee5171ef485420058b7f3b582dd397ac.jpg](https://qiita-image-store.s3.amazonaws.com/0/62881/cb153683-7962-2a96-8cd9-45fda0142bbf.jpeg)


上記3クラスを拡張した場合、互いにどう影響するのでしょうか。

```ruby
class Object
  def self.object_class_method
    "object class method"
  end

  def object_instance_method
    "object instance method"
  end
end

class Module
  def self.module_class_method
    "module class method"
  end

  def module_instance_method
    "module instance method"
  end
end

class Class
  def self.class_class_method
    "class class method"
  end

  def class_instance_method
    "class instance method"
  end
end
```

拡張したメソッドが、各クラス、そのインスタンスから呼び出せるか表にまとめました。赤いマルとバツは自分が気になった部分です。

![ruby-class.002.jpeg](https://qiita-image-store.s3.amazonaws.com/0/62881/40868ed7-10dc-e02b-d608-acc1f9dea589.jpeg)

この結果からわかったことを記述していきます。

# `Class`クラスのインスタンスメソッドは全てのクラスメソッド
```ruby
Object.object_instance_method
Object.module_instance_method
Object.class_instance_method
```
`Object`, `Module`のインスタンスメソッドは子孫クラスの`Class`に引き継がれます。`Class`のインスタンスは他のクラスになり、全てのクラスで`object_instance_method`, `module_instance_method`が使えるようになります。`class_instance_method`が使える理由も同じです。

インスタンスメソッドが他のクラスのクラスメソッドになるのは、`Class`クラスのインスタンスが他のクラスになるからです。

```ruby
Foo = Class.new
# Class.new != Foo.new
```

```ruby
Module.object_instance_method
Module.module_instance_method
Module.class_instance_method
```

`Module`もクラスなので上記と同じ理由で`Class`のインスタンスメソッドをクラスメソッドとして呼び出すことが出来ます。

```ruby
Class.object_instance_method
Class.module_instance_method
Class.class_instance_method
```

こちらが少しややこしいです。全てのクラスは`Class`から出来ています。`Class`もクラスなので、`Class.new`と同じメソッドを持っていることになります。

`Class.class`で`Class`が得られることで、自分で自分自身を定義していることが分かります。

# `Class`のインスタンスメソッドは他のクラスのインスタンスから呼び出せない

```ruby
# 下記のメソッド呼び出しは`new`以外はエラーになります
object = Object.new
object.module_instance_method
object.class_instance_method

foo = Foo.new
foo.module_instance_method
foo.class_instance_method
```

このため、`Class`のインスタンスメソッドは他のクラスのインスタンスから呼び出す事ができません。`Class`クラスのインスタンス、つまりクラスからのみ呼び出すことが出来ます。

# `Class`クラスのクラスメソッドは、他のクラスに受け継がれない。

```ruby
Foo = Class.new
Foo.object_class_method


# 下記のメソッド呼び出しはエラー
Foo.module_class_method
Foo.class_class_method
```

クラスは親クラスを指定しない場合は、勝手に`Object`クラスが親となります。なので`Object`クラスのクラスメソッドが使えます。

`Module`クラスのクラスメソッドは、その子クラスの`Class`クラスのクラスメソッドとなります。クラスメソッドなので`Class.new`では使えません。`Class.new`はクラスであることは先述のとおりです。つまり、`Class`クラスのインスタンスメソッドは他のクラスに影響しますが、クラスメソッドは影響しません。影響するクラスメソッドは継承したクラスのものです。

# 自作クラスの親クラスは、`Module`でも`Class`でもなく`Object`である。
自作クラスの親クラスが`Object`になるのが不思議でした。`Module`や`Class`に追加したインスタンスメソッドが自作クラスにも影響がありますよね。これは`Module`や`Class`を継承しているからなのでは？と思いましたが違いました。その理由は下記のとおりです。

* `Class`のインスタンスメソッドが、自作クラスのクラスメソッドになる。
* 継承した場合は親のクラスメソッドは、子のクラスメソッドになる。

`Class`クラスが自作クラスに影響があるのは、継承ではなくクラス自体の仕様を変えているからです。上記2点のせいで少し勘違いをしてしまいました。
rbenvで最新バージョンのRubyをインストールするplugin、rbenv-install-latestを作った

適当なバージョン(たとえば、1.9.3)のrubyをrbenv installするとき、

```
rbenv install 1.9.3[TAB]
```

ってして補完から最新バージョンを探すのが面倒になったのでプラグイン作りました。
2.0まではパッチレベルを指定しないといけないのが地味に面倒なんですよね。

[rbenv-install-latest](https://github.com/momo-lab/rbenv-install-latest)

## インストール

```
git clone https://github.com/momo-lab/rbenv-install-latest.git "$(rbenv root)"/plugins/rbenv-install-latest
```
当然、[ruby-build](https://github.com/rbenv/ruby-build)を使うので、無ければこれもインストールしてください。

```
git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
```

## 使い方
単純に最新のRubyをインストールするだけなら、引数無しで実行してください。

```
rbenv install-latest
```

これで、2016/5/3現在なら、2.3.1がインストールされます。

1.9.3系ならこんな感じです。

```
rbenv install-latest 1.9.3
```

さっと作った割には、新しい環境を作るのが楽になったのでいい感じです。
anyenv上のrbenvでRubyのバージョンを最新化する


## インストール可能なRubyのバージョンの確認方法
```
$ rbenv install -l

Available versions:
...
  2.3.0-preview2
  2.3.0
  2.4.0-dev
...
```
2016年5月現在の最新の安定版の2.3.1をインストールしたい	

## そうだ、anyenv上にrbenvをインストールしたんだったまで
```
$ brew update
$ brew upgrade ruby-build

Error: ruby-build not installed
```

## anyenv上のruby-buildを最新化
```
$ cd ~/.anyenv/envs/rbenv/plugins/ruby-build && git pull origin master
```

## インストール可能なRubyのバージョンを再確認
```
$ rbenv install -l

Available versions:
...
  2.3.0-preview2
  2.3.0
  2.3.1
  2.4.0-dev
...
```
2.3.1がインストール可能に🎉

## インストールと適用
```
$ rbenv install 2.3.1

$ rbenv versions
  system
* 2.3.0 (set by /Users/yourname/.anyenv/envs/rbenv/version)
  2.3.1

$ rbenv global 2.3.1

$ rbenv versions
  system
  2.3.0
* 2.3.1 (set by /Users/yourname/.anyenv/envs/rbenv/version)
```
めでたし。

## プラグインアップデートの自動化
[anyenv-update](https://github.com/znz/anyenv-update)を使って**env系とプラグインのアップデートを自動化

```
$ mkdir -p $(anyenv root)/plugins

$ git clone https://github.com/znz/anyenv-update.git $(anyenv root)/plugins/anyenv-update

$ anyenv update
```
**env系とそれぞれのプラグインを`anyenv update`コマンドひとつでpullしてきてくれます🎉

## 参考
* [rbenvでRubyのバージョンアップをする(for Mac) - Qiita](http://qiita.com/henteko/items/ef891bece12e7c0cadc9)
* [anyenvを使ってる場合のruby-buildの更新方法 - Qiita](http://qiita.com/henteko/items/ef891bece12e7c0cadc9)
vimから外部コマンドを実行、および、実行結果を挿入する

# コマンドラインモード
## シェルでコマンドを実行
### シェルでプログラムを実行
- !をつけることで外部プログラムを実行できる
```例):!ls```

- 現在編集中ファイルの省略記号である%を使うことで、編集中のプログラム実行も簡単にできる
```例):!ruby %```

- :shellで対話型シェルセッションが実行可能。exitコマンドでシェルを終了してvimに復帰する
- :read !{cmd}でコマンド実行結果の標準出力を、カーソル行の下に挿入できる
Heroku Command


show info

```
heroku info
```


show key

```bash
heroku keys
```

check env

```bash
heroku config
```

confirm addons

```bash
heroku addons
```

Add addons

```bash
heroku addons:create papertrail
```

run command

```bash
heroku run "ls -l"
```

rails console

```bash
heroku run rails console
```

check log

```bash
heroku logs
```

```bash
heroku logs --tail
```

check status

```bash
heroku ps
```

スケジューラーの追加

```
heroku addons:add scheduler:standard 
```

スケジュール画面を開く

```
https://addons-sso.heroku.com/apps/3b8ec3ad-ad86-4839-8ff4-1e0f400eb6a3/addons/3d312221-4d73-476f-9dff-4fafc4c22f6f 
```

Domainを指定

```
heroku domains:add hostname
```

databaseを再構築

```
heroku pg:reset DATABASE
```

restart

```
heroku restart
```

migrate

```
heroku rake db:migrate
```

Add onの追加

```
heroku addons:add sendgrid
```

sendgridのユーザー名確認

```
heroku config:get SENDGRID_USERNAME
```

sendgridのパスワード確認

```
heroku config:get SENDGRID_PASSWORD
```
Railsにて、slim、simple_formとangularjsで使ってみて思ったこと


RailsでView側でslim、simple_formを使っていて、angularjsを使ってみた時に困ったこと。

### angularjsの導入意図
- javascriptのコードの肥大化してきたので、削減したい
- 単に、jQueryに変わるものを使ってみたかった

### やりたいこと
- angularjsとrailsを利用する場合、railsをAPIに徹するのがベストプラクティスなのはわかっているのだが、simple_formも捨てないでやってみる
- クリックイベントなど、現在javascriptでやっているところはangularjsへ、viewの描画などは、既存の通りview（simple_form）等でおこなるう

### 導入
1. rails-bowerをGemに追加
2. Bowerfileにて、angularjs（1.4系）を追加

### 全体的に困ったこと
- javascriptのコードは短くなったけど、slimのコードは長くなった

### 嫌だなと思ったとこ
- input_htmlでつらつらng-model, ng-change等を書く必要がある
- angularjsでdata bindingを使う場合（ng-modelを使う場合）、いちいちng-initで初期値を設定する必要がある。


### 結論
- simple_form（普通のform_forも）の場合、初期値（保存値）の設定が楽なのに、angularjsを使うとめんどくさく感じる
- ng-change等は許容範囲
- directiveを作って、javascriptが綺麗になるのは素敵