OmniAICreator/Qiita-1.07M huggingface dataset:
Web MIDI APIによるDAW → ブラウザ → DAW連携の方法

# 概要
Web MIDI APIにより、

DAWで和音を鳴らす
→ ブラウザのアルペジエーターでアルペジオ生成
→ DAWでアルペジオをレコーディング

ができます。そのための方法を記します。
（アルペジエーター以外のアプリも同じです）

# 方法

## 準備
* DAWの和音トラックを和音ごとコピーし、アルペジエーター制御用トラックを作成
* loopMIDI等で仮想MIDI portを2つ作成
  * [仮想 MIDI ポートの設定](https://github.com/tanikawa04/webmidiapi_to_daw_sample/blob/master/virtual_midi_port.md)

## DAW → ブラウザ の設定
* DAWのアルペジエーター制御用トラックで、出力を「仮想MIDI port 1」に
* ブラウザのアルペジエーターで、入力を「仮想MIDI port 1」に  
 * [ブラウザのアルペジエーターの例](http://cat2151.github.io/Web-MIDI-API-play/randomArpeggiator01.html)
* 動作確認
 * DAWで演奏し、ブラウザで 0x90(MIDI CH 1のノートオン) が表示されれば成功

## ブラウザ → DAW の設定
* ブラウザのアルペジエーターで、出力を「仮想MIDI port 2」に
* DAWのアルペジオトラックで、入力を「仮想MIDI port 2」に
* 動作確認
 * DAWで演奏し、DAWのアルペジオトラックで、アルペジオが演奏されれば成功

# 仕組み

* DAWのアルペジエーター制御用トラックのMIDIシーケンサで和音を鳴らし、  
それをDAWのMIDI出力で、仮想MIDI port 1へ出力します。
* ブラウザのアルペジエーターは仮想MIDI port 1から和音のノートMIDIデータを受信し、  
それを元にアルペジオのノートMIDIデータを生成し、  
それを仮想MIDI port 2へ送信します。
* DAWのアルペジオトラックのMIDIシーケンサは、  
仮想MIDI port 2からアルペジオのノートMIDIデータを受信し、  
演奏やMIDIレコーディングを行います。

# 問題対応
* DAWのアルペジオトラックでアルペジオが鳴らない その1  
 → DAWのアルペジオトラックをクリックしてみましょう。  
（DAWの仕様で、クリックされたトラックのみMIDI INを受け付けている可能性があります）  
* DAWのアルペジオトラックでアルペジオが鳴らない その2  
 → DAWがMIDI信号を受け付けているか確認してみましょう。  
DAWのMIDI IN設定を再確認したのち、[DAWにnote onを送信し、DAWが鳴ることを確認してみましょう](http://cat2151.github.io/Web-MIDI-API-play/index03.html)
* アルペジオの間隔が広すぎる  
 → Chromeのアルペジエーターのタブをクリックしてみましょう。  
（Chromeの仕様で、最小化時や他のタブを表示時は、setIntervalの間隔が粗くなります）

# 参考
* ブラウザ → DAW間の連携 については、以下を参考にしました。
 * [Web MIDI API による Web アプリと DAW の連携](http://qiita.com/tanikawa/items/1a820f662791077e5df7)  
      連携の仕組み、設定、それを利用したアプリの作り方が詳しく書かれています。  
     サンプルへのリンクがあり、動作確認ができます。
     * [仮想 MIDI ポートの設定](https://github.com/tanikawa04/webmidiapi_to_daw_sample/blob/master/virtual_midi_port.md)
     * [サンプル](http://tanikawa04.github.io/webmidiapi_to_daw_sample/)
           * [サンプルは、Web MIDI API非対応のブラウザでは動かないので注意してください](http://qiita.com/cat2151/items/0e8c0f58dd46e7f280de)
PHPでLINE BOT APIのSignagureを確認する

公式ドキュメントにはJavaとRubyしかなかったのでメモ

### Signatureの確認の流れ
 - POSTメッセージのbody（$_POST系ではなく生のメッセージ）を取得
 - 取得したPOSTメッセージを、管理画面から取得できるChannel Secretをキーとして、hashを作る
 - 作ったhashを、拡張ヘッダX-LINE-CHANNELSIGNATUREで送られてくるSignatureと比較する

### サンプルコード
```
// Body取得
$rawPost = @file_get_contents("php://input");

// ハッシュ作成
// xxxxxxxxxxは基本情報で「Channel Secret」に設定されている文字列
$hash = hash_hmac('sha256', $rawPost, 'xxxxxxxxxx' , true);

// Signature作成
$sig = base64_encode($hash);

// 拡張ヘッダからAPI側から設定されているSignatureを取得
$compSig = $_SERVER['HTTP_X_LINE_CHANNELSIGNATURE'];

// 確認
if ($sig != $compSig) {
    /*** 不正なメッセージ ***/
}

```

### 備考
- $HTTP_RAW_POST_DATAは非推奨（PHP7からは削除される）のため、php://inputを利用。
scikit learn のアルゴリズムチートシート

scikit learn のアルゴリズムチートシートが、どのアルゴリズムを使うか考えるときに便利そうです。
元画像は[こちら](http://scikit-learn.org/stable/tutorial/machine_learning_map/)からどうぞ。
![image](https://qiita-image-store.s3.amazonaws.com/0/119826/d55114dc-3ed2-8234-ef01-4be375056349.png)
Pythonのexe化、Pyinstaller使用メモ

## はじめに
PyinstallerはPythonの実行環境を固めてexe化してくれるツールです。
使い方は簡単ですが、自分が使う上で注意点があったのでメモしておきます。

## 導入

```
$ # 導入
$ pip install pyinstaller
$ pyinstaller --version
3.1.1

$ # 使用
$ pyinstaller.exe <python_script_file>
$ pyinstaller.exe <python_script_file> --onefile --clean  # １ファイル化、前回ファイル削除
```

## 注意点：`__file__`を使わず`sys.argv[0]`を使う

exe化する場合、スクリプトパスを取得する`__file__`が使えません。元のスクリプトファイル名を取得してしまいます。
exeファイルのパスは`sys.argv[0]`で取得しましょう。

## 注意点：追加モジュールが必要な場合がある

cv2（OpenCV）を使ったアプリをexe化した際、実行時にエラーが出ました。
エラーメッセージに応じて以下のモジュールを追加しました。

```
conda install six
pip install packaging  # conda に無かったのでpipで取得
```
```py
import six
import packaging
import packaging.version
import packaging.specifiers
import packaging.requirements
```

## 補足：過剰にパッケージを取り込んでしまう場合がある
[Pyinstaller で Python スクリプトを Windows で実行可能な .exe にする - Qiita](http://qiita.com/kounoike/items/128f3294362a229005d7)
上の記事にあるように、`matplotlib.pyplot`を取り込むだけで`PyQt`などが取り込まれて大きなサイズになります。
dist配下が140MBほどになりました。`--onefile`を指定すると１ファイルにまとまり、60MBほどでした。
自分は`conda create`で環境を分けてます（virtualenvのようなもの）が、`matplotlib`が`PyQt`等に依存しているようなので切り離すのは難しそうです。

## 補足：UPXでexeファイルが少し圧縮できる
exeファイルを実行可能な形式で圧縮するソフトUPXを使い、ファイルサイズを圧縮できます。[こちらから](http://upx.sourceforge.net/#downloadupx)ダウンロードして、`--upx-dir <UPX_DIR>`など指定しましょう。
前項の例であれば、60MBから49MBになりました。最初に解凍処理が入るので実行は少し遅くなるとの事です。使い分けてみてください。
amazonaws.comドメインをリダイレクト（SEO対策）

AWSでELBを作成した場合、

ELB名-番号.ap-northeast-1.elb.amazonaws.com

というドメイン名が割り当てられます。

また、EC2にグローバルIPを付与すると、

ec2-IPアドレス.ap-northeast-1.compute.amazonaws.com

というドメイン名が割り当てられます。

サービスを本番運用する場合は、独自ドメインを定義し、上記ドメイン名を使うことはほとんどありませんが、これらのドメインもグローバルに公開されているため、何かのきっかけで検索エンジンに登録されてしまう可能性があります。

上記AWSドメインを検索エンジンに登録されてしまうとカニバリゼーションを起こしてしまうため、それを防止するために、リダイレクト処理を入れておくと安全です。

Apacheの設定例：

```
<IfModule mod_rewrite.c>
    RewriteEngine On

    # AWS ドメインの場合は example.com に 301 リダイレクト
    RewriteCond %{HTTP_HOST} .*\.amazonaws\.com
    RewriteRule ^/(.*)$ http://example.com/$1 [R=301,L]
```

Nginxの設定例：

```
server {
    listen 80;
    server_name ~.*amazonaws.com$;

    # AWSドメインの場合は example.com にリダイレクト
    rewrite ^(.*)$ https://example.com/$1 permanent;
}
```
phpenvで複数PHPインストール

## 前提条件
- Vagrant
- CentOS6系

## phpenvインストール
```
$ mkdir ~/src
$ cd ~/src
$ git clone https://github.com/CHH/phpenv.git
$ cd phpenv/bin
$ ./phpenv-install.sh
Installing phpenv in /home/vagrant/.phpenv
remote: Counting objects: 2057, done.
Receiving objects: 100% (2057/2057), 344.17 KiB | 556 KiB/s, done.
remote: Total 2057 (delta 0), reused 0 (delta 0), pack-reused 2057
Resolving deltas: 100% (1272/1272), done.
Success.

export PATH="/home/vagrant/.phpenv/bin:$PATH"
eval "$(phpenv init -)"

Add above line at the end of your ~/.bashrc and restart your shell to use phpenv.

```

### 設定
```
$ vi ~/.bashrc

追記
-----------------------------------------------
export PATH="/home/vagrant/.phpenv/bin:$PATH"
eval "$(phpenv init -)"
-----------------------------------------------
```

## php-buildインストール
php-buildのプラグインとしてインストール

```
$ git clone https://github.com/CHH/php-build.git ~/.phpenv/plugins/php-build
```

## PHPインストール
### ライブラリ等インストール
```
$ yum repolist all | grep epel

- epelがenabled出ない場合、epelリポジトリインストール
$ sudo yum install wget
$ wget http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ sudo yum localinstall epel-release-6-8.noarch.rpm

$ sudo yum install gcc bison httpd-devel libxml2 libxml2-devel openssl-devel \
libcurl-devel libjpeg-turbo-devel libpng-devel libmcrypt-devel \
readline-devel libtidy-devel libxslt-devel re2c freetype-devel
```

### PHPコンパイルオプション設定

```
$ vi /home/vagrant/.phpenv/plugins/php-build/share/php-build/definitions/5.5.22
削除
-----------------------------------------------
install_pyrus                                  
-----------------------------------------------

$ vi /home/vagrant/.phpenv/plugins/php-build/share/php-build/default_configure_options
追記
-----------------------------------------------
--with-apxs2=/usr/sbin/apxs                    
--with-freetype-dir=/usr                       
-----------------------------------------------
```

メモ書き）
php-buildで同じバージョンをコンパイルオプションを変更して、PHPをインストールするときは、PHPビルド前ソースコードを削除したほうがいいかも。Makefileとかは下記に存在。

```
$ rm -rf /tmp/php-build/source/5.5.22 
```

### php-buildのスクリプト修正
下記パーミッションエラーが出るので、スクリプト修正

```
/usr/lib64/httpd/build/instdso.sh SH_LIBTOOL='/usr/lib64/apr-1/build/libtool' libphp5.la /usr/lib64/httpd/modules
cp: cannot create regular file `/usr/lib64/httpd/modules/libphp5.so': Permission denied
apxs:Error: Command failed with rc=65536
```

libphp5.soの出力場所を```~/.phpenv/versions/5.5.22/```へ変更。

ただし、下記参考パッチが最新バージョンのphp-buildではあてられないパッチになっているのと、後ほど出てくるphpenv-apache-versionを想定していないので、独自にパッチ作成

参考）
http://tkuchiki.hatenablog.com/entry/2014/04/08/210022

```
$ wget https://gist.githubusercontent.com/orangehat/04e5a16daccbf5493c6d4d3da3a58dc1/raw/96df8cfcc0aaac444a08ba871c6223842b5aa00c/php-build.patch
$ patch -u ~/.phpenv/plugins/php-build/bin/php-build < php-build.patch
```

### phpenvからPHPインストール
```
$ phpenv install 5.5.22
```

## phpenv-apache-versionインストール
```
$ git clone https://github.com/garamon/phpenv-apache-version ~/.phpenv/plugins/phpenv-apache-version
```

### PHP切り替え
```
$ cd /path/to/project
$ sudo /home/vagrant/.phpenv/bin/phpenv apache-version 5.5.22
```
UbuntuにVim7.4 +Luaを入れる

# 必要なものをインストール
```
# apt install mercurial ncurses-dev lua5.2 lua5.2-dev luajit python-dev python3-dev
```

# Vim7.4のダウンロード・インストール
```
# wget ftp://ftp.vim.org/pub/vim/unix/vim-7.4.tar.bz2
# tar xjf vim-7.4.tar.bz2
# cd vim74

# ./configure \
--with-features=huge \
--enable-multibyte \
--enable-luainterp=dynamic \
--enable-gpm \
--enable-cscope \
--enable-fontset \
--enable-fail-if-missing \
--prefix=/usr/local

# make && make install
```

# Luaの確認
```
$ vim --version | grep lua
+dialog_con      +lua/dyn      +rightleft      +windows
```

---
以上。
強風の日に「今日は風が騒がしいな・・」とLINEに通知してくれるBOT

## 概要
今日は風が強かったので
強風時に「今日は風が騒がしいな・・」って返してくれるLINEのBOTを作ってみた。

風速はyahoo apiから取得。
通知先は最近Line bot apiが使えるようになったで試してみる。
サーバーはherokuを使用。（今回はあまり触れません。）

### 環境
heroku + node6.0 + es6 + express4.13

## 準備

### LINEアカウント設定
- LINEのアカウントは、 https://developers.line.me で取得

- channelsからそれぞれの値を取得して`.env`に保存

- LineのCallback URLを設定
httpsでポート番号443を指定しないとダメっぽい
（`https://hogehoge.com:443/callback`的な）

### 固定IP

- APIの呼び出し元のIPアドレスをLINEのServer IP Whitelistに設定  
今回はherokuで動かしたのでherokuのaddon`Fixie`を使用

## とりあえず動くもの
### 
```text:.env
LINE_CHANNEL_ID=<<Channel ID>>
LINE_CHANNEL_SECRET=<<Channel Secret>>
LINE_CHANNEL_MID=<<MID>>
FIXIE_URL=<<FIX_URL>> // Fixie使う場合
```

```js:app.js
const express = require('express')
const app = express()
const rp = require('request-promise')
const bodyParser = require('body-parser')
require('dotenv').config({silent: true})
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: false }))

const getWind = place =>
  rp.get({
    url: 'https://query.yahooapis.com/v1/public/yql',
    headers: {
      'Content-Type': 'application/json; charset=UTF-8'
    },
    json: true,
    qs: {
      format: 'json',
      env: 'store://datatables.org/alltableswithkeys',
      q: `select * from weather.forecast where woeid in (select woeid from geo.places(1) where text="${place}")`
    }
  })
  .then(result => !result.error ? Promise.resolve(result.query.results.channel.wind) : Promise.reject('can not get wind'))

const lineSendMessage = (to, text) =>
  rp.post({
    url: 'https://trialbot-api.line.me/v1/events',
    proxy: process.env.FIXIE_URL, // proxy使わないならいらない
    headers: {
      'Content-Type': 'application/json; charset=UTF-8',
      'X-Line-ChannelID': process.env.LINE_CHANNEL_ID,
      'X-Line-ChannelSecret': process.env.LINE_CHANNEL_SECRET,
      'X-Line-Trusted-User-With-ACL': process.env.LINE_MID
    },
    json: true,
    body: {
      to: to,
      toChannel: 1383378250, // Fixed value
      eventType: '138311608800106203', // Fixed value
      content: {
        toType: 1,
        contentType: 1,
        text: text
      }
    }
  })

app.post('/callback', (req, res) =>
  getWind('tokyo') // とりあえず東京固定
  .then(wind => {
    // 34ノットあたりから強風と呼べるぽい
    if (+wind.speed > 34) {
      lineSendMessage([req.body.result[0].content.from], '今日は風が騒がしいな・・')
    }
    res.send(wind)
  })
)
app.listen(process.env.PORT || 3000)
```

callback時に発言者のMIDが取れるので、宛先MIDを固定で毎日cronで回すのも良。

### 参考リンク
Yahoo Weather API
>https://developer.yahoo.com/weather

LINE bot API
>https://developers.line.me/bot-api/api-reference

気象庁
>http://www.jma.go.jp/jma/kishou/know/yougo_hp/kaze.html
rails プロジェクト構築手順

# rails プロジェクト構築手順

## はじめに

いつも調べなおして面倒なので、まとめる.

## bundle install

```sh
bundle init
bundle install --path vendor/bundler
rails new
```

gem のインストール先を決めとく。

## gem

```rb
#haml
gem 'haml-rails'
gem 'erb2haml'

# Bootstrap
gem 'bootstrap-sass'
gem 'less-rails'
gem 'twitter-bootstrap-rails', '~> 2.2.8'
```

erb→hamlに変換する

```sh
rake haml:replace_erbs
```

## bootstrap

Bootstrap のページからファイルをダウンロードし、vendor/assets に追加する.

http://getbootstrap.com/getting-started/#download

インストールする

```sh
bundle exec rails g bootstrap:install
bundle exec rails g bootstrap:layout application fluid
```

## git

```sh
git init
```
そのあと、ignoreファイルで vendor/bundler を指定しとく.


## viewに適用

```sh
rails g bootstrap:themed Class名
```

## 参考ページ

- [RailsにTwitter Bootstrapの導入と簡易な使い方 - Rails Webook](https://ruby-rails.hatenadiary.com/entry/20140801/1406818800)
Percona ClusterをChefでインストールする

#初めに
最近Ruby、Ruby on RailsやChefを仕事でも触りだし、PerconaのクラスタリングをChefで行ったのでメモとして手順を残すために投稿。

#対象Percona
Percona XtraDB Cluster 5.6x

#対象OS
* CentOS 6.x
* CentOS 7.x

#事前準備
* chef solo用のサーバとクライアントサーバを用意。例として今回は下記とする。
 - サーバ: 192.168.1.10
 - クライアントサーバ1: 192.168.1.31
 - クライアントサーバ2: 192.168.1.32
 - クライアントサーバ3: 192.168.1.33
* サーバからクライアントサーバへknife solo cook出来る状態まで環境を構築。下記のサイトが参考になった
 - [さくらVPSの初期設定をChef Soloでやってみた〜サードパーティcookbookの使い方〜](http://hivecolor.com/id/126)
 - [chef soloの簡単な使い方、設定方法一覧](https://tsuchikazu.net/vps_chef_solo/)

#手順
*作業は全てサーバ上(192.168.1.10)から行う*

###　site-cookbooksへ下記レシピ(Percona_Cluster)を追加
```
$ git clone https://github.com/UsamiDenki/Percona_Cluster.git
```

###　対象クライアントサーバ用の共通roleを用意
+ 各パラメータ詳細はgitクローン先の[Percona XtraDB Cluster 5.6xをChefでインストールするためのCookbook](https://github.com/UsamiDenki/Percona_Cluster)を参照

```
$ vi roles/percona_cluster.json
```
```
{
  "chef_type": "role",
  "json_class": "Chef::Role",
  "default_attributes": {
    "percona_cluster": {
       "root_password": "mysql",
       "wsrep_cluster_addresses": [ "192.168.1.31", "192.168.1.32", "192.168.1.33" ],
       "wsrep_cluster_name": "my_cluster",
       "wsrep_sst_auth": "sstuser:s3cret"
    }
  },
  "run_list": [
    "recipe[Percona_Cluster]"
  ]
}
```

###　対象クライアントサーバ用のnodeを用意
+ クライアントサーバ1

```
$ vi nodes/192.168.1.31.json
```
```
{
    "percona_cluster": {
        "wsrep_node_address": "192.168.1.31"
    },
    "run_list": [
        "role[percona_cluster]"
    ]
}
```

+ クライアントサーバ2

```
$ vi nodes/192.168.1.32.json
```
```
{
    "percona_cluster": {
        "wsrep_node_address": "192.168.1.32"
    },
    "run_list": [
        "role[percona_cluster]"
    ]
}
```

+ クライアントサーバ3

```
$ vi nodes/192.168.1.33.json
```
```
{
    "percona_cluster": {
        "wsrep_node_address": "192.168.1.33"
    },
    "run_list": [
        "role[percona_cluster]"
    ]
}
```

###　全クライアントサーバへChef-Soloをインストール
```
$ knife solo prepare root@192.168.1.31
```
*各クライアントサーバへrootログインできる前提*

###　全クライアントサーバへChefからPercona XtraDB Cluster 5.6xをインストール
```
$ knife solo cook root@192.168.1.31
```
*192.168.1.31から.33まで順に実施する*

#クラスタされているかテストして完了
確認方法は[CentOS6.7にPercona XtraDB Clusterをインストールする](http://qiita.com/toshiro3/items/67da351a7ea1764c7997)を参照

#注意
```
$ yum update
```
するとPerconaがconflictsするので/etc/yum.confにexcludeを追加すると回避できるが、設定次第でPerconaがyumから除外されてしまうので注意。
AWS SDK for PHPで署名付きURLを生成する小さなサンプル

# 前提/環境
- composerがインストールされていること
- Ubuntu 14.04
- 東京リージョン
- 期限は1分
- AWS SDK for PHP 3.18（手順中でインストールする）
- credencialファイルを作成済であること（http://docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/credentials.html#credential-profiles）

#手順
1.S3に任意オブジェクトをアップロードしておく（バケット名、オブジェクト名を覚えておく）
```手順省略```

2.AWS SDK for PHPのインストール

```
# composer require aws/aws-sdk-php
```

3.署名付きURLの生成（スクリプト作成）

スクリプト作成

```lang:test.php
<?php
require 'vendor/autoload.php';

$s3 = new Aws\S3\S3Client([
    'version' => 'latest',
    'region'  => 'ap-northeast-1'
]);

$command = $s3->getCommand('GetObject', array(
        'Bucket' => '<Bucket Name>',
        'Key' => '<Object Name>',
));

$request = $s3->createPresignedRequest($command, '+1 minutes');
echo (string)$request->getUri();
```

実行

```
# php test.php
```
aria-live属性を使ってフォームのエラーをスクリーンリーダーに伝えよう

# はじめに

ユーザの入力に問題があったときに、フォームにエラーを表示する場合、工夫して実装すると、スクリーンリーダー(画面の内容を読み上げるソフト. 全盲の方などが使用する)のユーザにも、エラーが起きたときにエラーの内容を即時に伝えることができます。その実装方法を紹介します。

# 例

以下のようなフォームを考えます。

![input要素とbutton要素からなるフォーム](https://qiita-image-store.s3.amazonaws.com/0/42728/6cdf3842-38b5-582f-c5ae-11e033f1c9b4.png)

```html
<input type="text" class="input" placeholder="数値を入力してください" />
<button class="okbutton" type="button">OK</button>
<div class="error"></div>
```

input要素に数値でない値を入力してOKボタンを押すと
error要素に「数値を入力してください」というエラーが表示されるとします。

![input要素に「あいうえお」と入力した場合。error要素に「数値を入力してください」と表示されている。](https://qiita-image-store.s3.amazonaws.com/0/42728/2b3f340b-add7-57a9-7295-395362c8998e.png)

```html
<input type="text" class="input" placeholder="数値を入力してください" />
<button class="okbutton" type="button">OK</button>
<div class="error">数値を入力してください</div>
```

# 問題点と解決策

この実装だと、OKボタンを押してエラーが表示されても、スクリーンリーダーはエラーの内容を読み上げません。
error要素に**aria-live=assertive**をつけると、OKボタンをスクリーンリーダーにエラーの内容を即座に伝えることができます。

```html
<input type="text" class="input" placeholder="数値を入力してください" />
<button class="okbutton" type="button">OK</button>
<div class="error" aria-live="assertive">数値を入力してください</div>
```

aria-live属性は、要素に変更があったときに、変更内容をスクリーンリーダーなどの支援技術に伝える属性です。
aria-live属性には、通知するタイミングによって3つの値を設定できます。エラーなど、即時に伝えるべき内容についてはassertiveを使います。

| 値 | 内容 | 
|:--|:--|
| off | 内容が更新されてもユーザーに伝達しない(デフォルト) |
| polite | 現在の読み上げの終了やユーザー入力時など適切なタイミングで、内容が更新されたときにユーザーに伝達する。|
| assertive | 即座に伝達を行う。 |

# スクリーンリーダーで試してみた

OKボタンを押したとき、以下のように読み上げられました。

## NVDAの場合

aria-live=assertiveをつけないとき:
「OK、ボタン、押されました」
aria-live=assertiveをつけたとき:
「OK、ボタン、押されました、**数値を入力してください**」

## VoiceOverの場合

aria-live=assertiveをつけないとき:
「OK」
aria-live=assertiveをつけたとき:
「OK、**数値を入力してください**」

# サンプル(jsfiddle)
https://jsfiddle.net/sukoyakarizumu/nrqcbqzu/
dd-agentでRDSのMySQLを監視してみた

##概要

DatadogではMySQLをモニタリングするためのMySQL Integrationが提供されているが、基本的にMySQLが稼動しているサーバにdatadog-agentをインストールしてlocalhostのmysqldからデータを取得することをを想定して各種ドキュメントなどが書かれている感がある。

RDSでMySQLを利用している場合、CloudWatchで取得できる値は造作もなくDatadogへ食わせることができるわけだが、いかんせんOSリソース的なメトリクスが多く、MySQL固有の値をモニタリングの対象にしたい場合物足りない。

そこで、別のサーバへdatadog-agentをインストールし、そこからRDSへ接続してDatadogへデータをもっていくということができる。

##やったこと

- RDSのセキュリティグループ設定
- Datadog用ユーザの作成
- /etc/dd-agent/conf.d/mysql.yamlへ監視対象の設定
- dashboardでの設定

##RDSのセキュリティグループ設定

AWSエキスパートの諸兄ならば特に解説不要と思われるので省略

##Datadog用ユーザの作成

RDSのMasterUserを使用してもモニタリングは可能だが、後述するように設定ファイル(mysql.yaml)にUserID/Passwordを埋め込む必要があるため権限の強いユーザを使用することは推奨できない。そのため読み取りに特化したユーザを作成するべきである。

MySQL Integrationのインストール画面のConfigurationタブに下記のようなユーザ作成手順がある。

```
sudo mysql -e "CREATE USER 'datadog'@'localhost' IDENTIFIED BY 'GENERATED_PASSWORD';"
sudo mysql -e "GRANT REPLICATION CLIENT ON *.* TO 'datadog'@'localhost' WITH MAX_USER_CONNECTIONS 5;"

If you'd like to get the full metrics catalog please also grant the following privileges:

sudo mysql -e "GRANT PROCESS ON *.* TO 'datadog'@'localhost';"
sudo mysql -e "GRANT SELECT ON performance_schema.* TO 'datadog'@'localhost';"
```

上記の例ではdatadog@localhostというユーザを作成し、\*.\*に対しREPLICATIONを許可するように権限設定している。
また、すべてのメトリクスをとりたい場合はさらに\*.\*に対しSELECT, performance_schema.* に対しSELECTを許可せよとのことである。

このままの手順でユーザをつくるとlocalhostのみが接続できることになってしまうため、下記のように変更した。
(要は @localhostをとっただけ)

```
sudo mysql -e "CREATE USER 'datadog' IDENTIFIED BY 'GENERATED_PASSWORD';"
sudo mysql -e "GRANT REPLICATION CLIENT ON *.* TO 'datadog' WITH MAX_USER_CONNECTIONS 5;"
sudo mysql -e "GRANT PROCESS ON *.* TO 'datadog';"
sudo mysql -e "GRANT SELECT ON performance_schema.* TO 'datadog';"
```

##/etc/dd-agent/conf.d/mysql.yamlへ監視対象の設定

datadog-agentが稼動しているサーバの /etc/dd-agent/conf.d/mysql.yaml に対象RDSの情報を設定する。
もともと mysql.yaml.example が存在しているので、 `cp mysql.yaml.example mysql.yaml` といった感じでオリジナルを保存した状態で mysql.yaml を作成し、修正するのがよいと思う。
筆者が使用しているのは下記のようにサンプル記述をすべて消したものとなっている。

```
init_config:

instances:
  - server: rds1.hogehoge.ap-northeast-1.rds.amazonaws.com
    user: datadog
    pass: YOUR_GENERATED_PASSWORD
    tags:
       - dbname:rds1

  - server: rds2.hogehoge.ap-northeast-1.rds.amazonaws.com
    user: datadog
    pass: YOUR_GENERATED_PASSWORD
    tags: 
       - dbname:rds2
```

上記のように複数のRDSを記述することができる。また、tagsにタグを設定することによりdashboard等で対象RDSを指定する際にタグを使用できるようになる。

##dashboardでの設定

<img width="971" alt="mysql_integration_dashboard.png" src="https://qiita-image-store.s3.amazonaws.com/0/55932/98168176-550c-dd6a-fd63-b92258a38616.png">

以上
powershellで $ErrorActionPreference = "Stop" とすると標準エラー出力が使えなくなる

使えなくなる

```ps1
$ErrorActionPreference = "Stop"
& stdErrCommand 2>$null

```

ダメです。例外が飛びます。えーっとどうやって回避するんだこれ？
stdErrCommandが**普通の** コマンドレットなら`-ErrorAction Continue`とかすればいいんだけどうけど、exeファイルへのエイリアスだった時とかどうすればいいんだ？Start-processダメっぽいけど・・・・

* exeファイルへのエイリアス(パスを通している訳ではない)
* ps1ファイルへのエイリアス(パスを通している訳ではない)

そもそもこのコマンドの時はアンパサンドで実行するのか、表記的には普通のコマンドレッドで書くのかよくわからん

謎が多いな～ というか例外くらい普通に投げて欲しかったかも・・・
関数型プログラミングをわかった気になってみる

# 超初心者（=私）向けの、大ざっぱなslideを作ってみました

![scst.png](https://qiita-image-store.s3.amazonaws.com/0/106694/1be29049-7251-6926-b37f-337d8e87caf4.png)

# スライドありか
https://speakerdeck.com/aremokoremo/guan-shu-xing-puroguraminguwo-wakatutaqi-ninatutemiru
※埋め込み表示法がわからなかったのでURLを、、それにしても、なんだこのURL、、、

# 背景
ふだん、Android関連の開発をしているのですが、Android Nから Lambda/Streamがサポートされることになり、

- 関数型プログラミングとかを避けて通っていたので焦っている
- でも、関数型プログラミングの考え方が理解できず、理解しようとするたびに居眠り
- 「まあ、使わなくてもプログラミングできるし」とか言ってると老害まっしぐらでまずい

という経緯で、自分なりの「ふわっとした」まとめをしてみました。

同僚にも同じような「関数型プログラミングアレルギー」を持った人が何人かいたのですが、「手続き型プログラミングとか、Object志向プログラミングから入った人」にとって、あたまの切り替えがけっこう辛いのかな、という印象で、そういった方々にとっても、関数型プログラミングに触れるきっかけになればな、と思ったのも経緯の一つです。
Learning Rails 23 Refactor transaction2


There might be a lot of functions inside User Model. 
######It will become fat Model.
So we will refactor User Model again.
This Model does not extend ActiveRecord::Base

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

```ruby:user_suspention.rb
class UserSuspension
  attr_reader :user
  def initialize(user)
    @user = user
  end
 
  def create!
    user.class.transaction do
      disapprove_user!
      disapprove_reviews!
      disapprove_items!
    end
  end
 
  private
    def disapprove_user!
      user.update!(approved: false)
    end
 
    def disapprove_reviews!
      user.reviews.each { |review| review.update!(approved: false) }
    end
 
    def disapprove_items!
      user.user_items.each { |user_item| user_item.update!(approved: false) }
    end
end
```

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

Add these lines

```ruby:users_controller.rb
require 'user_suspention'
```

```ruby:users_controller.rb
def suspend
  suspension = UserSuspension.new(@user)
  suspension.create!
 
  redirect_to users_path
end
```

current users_controller.rb

```ruby:users_controller.rb
class UsersController < ApplicationController
  require 'user_suspention'
 
  before_action :set_user, only: [:show, :edit, :update, :destroy, :suspend, :permit]
 
  def index
    @users = User.all
  end
 
  def show
    @items = Item.all.pluck(:name, :id)
  end
 
  def new
    @user = User.new
  end
 
  def create
    @user = User.new(user_params)
    if @user.save
      redirect_to users_path
    else
      render 'new'
    end
  end
 
  def edit
  end
 
  def update
    if @user.update(user_params)
      redirect_to users_path
    else
      render 'edit'
    end
  end
 
  def destroy
    @user.destroy
 
    redirect_to users_path
  end
 
  def suspend
    suspension = UserSuspension.new(@user)
    suspension.create!
 
    redirect_to users_path
  end
 
  def permit
    User.transaction do
      @user.update!(approved: true)
      @user.reviews.each { |review| review.update!(approved: true) }
      @user.user_items.each { |user_item| user_item.update!(approved: true) }
    end
 
    redirect_to users_path
  end
 
  private
 
    def user_params
      params[:user].permit(:name)
    end
 
    def set_user
      @user = User.find params[:id]
    end
end
```

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

current user.rb

```ruby:user.rb
class User < ActiveRecord::Base
  has_many :reviews
  has_many :user_items
  has_many :items, through: :user_items
 
  validates :name,
            presence: true,
            length: {minimum: 3}
 
end
```
Learning Rails 22 Refactor transaction1


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

Add these lines

```ruby:user.rb
  def suspend!
    self.class.transaction do
      disapprove_user!
      disapprove_reviews!
      disapprove_items!
    end
  end
 
private
  def disapprove_user!
    self.update!(approved: false)
  end
 
  def disapprove_reviews!
    reviews.each { |review| review.update!(approved: false) }
  end
 
  def disapprove_items!
    user_items.each { |user_item| user_item.update!(approved: false) }
  end
```

current user.rb

```ruby:user.rb
class User < ActiveRecord::Base
  has_many :reviews
  has_many :user_items
  has_many :items, through: :user_items

  validates :name, presence: true,
                   length: {minimum: 3}

  def suspend!
    self.class.transaction do
      disapprove_user!
      disapprove_reviews!
      disapprove_items!
    end
  end

  private
    def disapprove_user!
      self.update!(approved: false)
    end

    def disapprove_reviews!
      reviews.each { |review| review.update!(approved: false) }
    end

    def disapprove_items!
      user_items.each { |user_item| user_item.update!(approved: false) }
    end
end
```
Learning Rails 21 Transaction


######We will create suspend function
######We will change status in transaction
+ User approved => false
+ Review approved => false
+ UserItem approved => false

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

Add this line

```ruby:routes.rb
get 'suspend_users/:id' => 'users#suspend', as: :suspend_user
```

![スクリーンショット 2016-05-03 22.01.18.png](https://qiita-image-store.s3.amazonaws.com/0/39073/e9c27224-76f0-f5e8-d603-bb12c1c3ab15.png "スクリーンショット 2016-05-03 22.01.18.png")

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

Add these lines

```ruby:index.html.erb
<%= link_to 'suspend', suspend_user_path(user.id), data: {confirm: "suspend?"} %>
```

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

```ruby:users_controller.rb
before_action :set_user, only: [:show, :edit, :update, :destroy, :suspend]
```

```ruby:users_controller.rb
def suspend
  User.transaction do
    @user.update!(approved: false)
    @user.reviews.each { |review| review.update!(approved: false) }
    @user.user_items.each { |user_item| user_item.update!(approved: false) }
  end
 
  redirect_to users_path
end
```

![スクリーンショット 2016-05-03 22.05.19.png](https://qiita-image-store.s3.amazonaws.com/0/39073/42cf6679-90c6-3a4f-97b6-6a7012c0d771.png "スクリーンショット 2016-05-03 22.05.19.png")

######We will create permit function
######We will change status in transaction
+ User approved => true
+ Review approved => true
+ UserItem approved => true

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

```ruby:routes.rb
get 'permit_users/:id' => 'users#permit', as: :permit_user
```

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

```ruby:index.html.erb
<%= link_to 'permit', permit_user_path(user.id), data: {confirm: "permit?"} %>
```

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

```ruby:users_controller.rb
before_action :set_user, only: [:show, :edit, :update, :destroy, :suspend, :permit]
```

```ruby:users_controller.rb
def permit
  User.transaction do
    @user.update!(approved: true)
    @user.reviews.each { |review| review.update!(approved: true) }
    @user.user_items.each { |user_item| user_item.update!(approved: true) }
  end
 
  redirect_to users_path
end
```

![スクリーンショット 2016-05-03 22.11.32.png](https://qiita-image-store.s3.amazonaws.com/0/39073/dba1aab5-13ee-4568-8034-5647ff537451.png "スクリーンショット 2016-05-03 22.11.32.png")
Raspberry Pi のOSインストールでクソハマリ

ラズベリーパイ３をそろそろ使ってみようと思い立ち、OSのインストール。
ネットで調べた手順に従い、
https://www.raspberrypi.org/downloads/
からNOOBSなるものをダウンロード。zipファイル。
こいつを解凍してmicroSDカードにコピーすれば良いらしい。

ところで解凍したときにフォルダを作って入れておくべき？
わからないのでフォルダを作ってやってみた。
⇒電源入れても画面真っ暗。故障かと思った・・・。

調べたら、どうやらフォルダは要らないらしい。
気を取り直してフォルダの中身だけをmicroSDカードにコピーして再度起動。
⇒画面が出て感動した！しかし、microSDカードのフォーマットのしかたが
　良くなかったらしく、「お前よくわかってねぇならキャンセルしてscandiskしろ」
　というようなメッセージが出た。

フォーマットの際には、SDカードフォーマッター
https://www.sdcard.org/jp/downloads/formatter_4/
を使っていたが、オプション指定を無視していた。これのせいか。
「上書き」「論理サイズ調整ON」にしないといけないらしい。
microSDカードのボリュームラベル（名前）は無しにすべきという情報もあったので、
その通りにやってみた。
⇒同じ症状のまま。。。

ここから色々調べたり、NOOBSを使わないインストールを試そうとして、
かなりのクソハマリ・・・。眠くなった。
最後にダメもとで試したのが２点。
１．ボリュームラベルを「RASPBERRYPI」にする。
２．ダウンロードしたzipを、解凍してからmicroSDにコピーするのではなく、microSDに解凍。
⇒どっちが当たったのかわからないけど、起動できた！

よくわかんねぇけど、進んだので嬉しい。早くSonic Piで音を鳴らしたい。
【Rails】Carrierwaveの使用中に画像のexif情報を取得したいとき

Carrierwaveを使用して画像をアップロードしているときにexif情報を取り出したい時が有りました。

exifを取得するgemには、
`gem 'exifr'`　か　`RMagick`
がいいよ見たいなことが書いてある記事がありました。

ので、試してみました。

# まずCarrierwaveで作成したUploaderにメソッドを追加しておきます

get_exif_infoの中で作業します。

Carrierwaveの簡単なセッティングはこちら
http://qiita.com/funao/items/cd4c4e33cf43767338e2

```rb:app/uploaders/image_uploader.rb
# encoding: utf-8

class ImageUploader < CarrierWave::Uploader::Base

  ...

  process :get_exif_info

  def get_exif_info
  end 

  ...

end

```

# じゃあ、早速比較して行きます

## ①exifrの場合

試す場合、gemはインストールしておいてください！

```rb:app/uploaders/image_uploader.rb
# encoding: utf-8

class ImageUploader < CarrierWave::Uploader::Base

  ...

  process :get_exif_info

  def get_exif_info
    exif = EXIFR::JPEG::new(self.file.file)
    binding.pry
  end 

  ...

end

```

取得して表示すると

`$ p exif`

``` rb
{
    :width => 400,
   :height => 390,
     :bits => 8,
 :comments => nil
}
```

こんな感じでとれます
https://remvee.github.io/exifr/api/index.html

めっちゃ便利です

## ②RMagickの場合

```rb:app/uploaders/image_uploader.rb
# encoding: utf-8

class ImageUploader < CarrierWave::Uploader::Base

  ...

  process :get_exif_info

  def get_exif_info
　　　　　　 exif = Magick::Image.read(self.file.file).first
    binding.pry
  end 

  ...

end

```

`$ p exif.properties`

とか書くと

<img width="762" alt="スクリーンショット 2016-05-03 22.56.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/23873/9e1db64c-a2a4-acc6-ab79-e9d9b2885b9c.png">

たくさんとれます

めっちゃ便利！すごい！
（ほたるの光がながれてる！お店がしまる！！やばい！！笑）
nginx ソースコードからのインストール

Apacheとの違い、拡張モジュールを動的に組み込めない

* Mainline,Stable
 * 新機能の追加やバグは最初にMainlineに対して行われ、その後、Stable版にバックポート  

## 環境
 * CentOS 7



## インストール
```
# yum install -y pcre zlib openssl
# yum install geoip*
```
```
# cd /usr/local/src/
# wget http://nginx.org/download/nginx-1.9.15.tar.gz
# tar xvf nginx-1.9.15.tar.gz
# cd nginx-1.9.15
# ./configure --prefix=/usr/local/nginx --sbin-path=/usr/sbin/nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_geoip_module
# make
# make test
# nginx -v
```
```
# mkdir /etc/nginx
# cp /usr/local/src/nginx-1.9.15/conf/nginx.conf /etc/nginx/
# vi /etc/nginx/nginx.conf 
``` 
```bash:/etc/nginx/nginx.conf
location / {
    root   /home/www;
    index  index.html index.htm;
}
```
```
# vi /etc/init.d/nginx
# chmod 755 /etc/init.d/nginx 
```


| モジュール名 | 用途 | |
|:-----------|:-----------|:-----------|
| ngx_http_ssl_module | SSLサポート | --with-http_ssl_module |
| ngx_http_v2_module | HTTP/2サポート | --with-http_v2_module |
| ngx_http_realip_module | リクエスト元IPアドレス | --with-http_realip_module |
| ngx_http_geoip_module | 国、地域ごとのIPアドレスをベースにした変数を生成 | --with-http_geoip_module |


## 参照
* [Red Hat NGINX Init Script](https://www.nginx.com/resources/wiki/start/topics/examples/redhatnginxinit/)
 * 起動スクリプト
Wordpressで変数をphpファイル同士で共有したいとき


例えば

get_header();
や
get_footer();

を使ってheader.phpやfooter.phpを呼び出している場合、
呼び出し元で定義された変数は呼び出し先にて使うことはできない。

それらのファイル同士で変数を共有したいときは、
get_headerでなく、includeを使って出力すると良い。

```
<?php include(TEMPLATEPATH . '/header.php'); ?>
```
【最速シリーズ】最速でCarrierwaveで画像アップロードまで作る

画像を投稿出来るめっちゃ便利なCarrierWave
https://github.com/carrierwaveuploader/carrierwave

# 今日は最速で画像アップロードまで作ります

## ①作りたいModel名でscaffold & Migrate

まず、Modelを用意します。
今回はviewとかをいちいち作ってると最速にならないので面倒なのでscaffoldしちゃいます

`$ rails g scaffold Image content:string`
`$ rake db:migrate`

## ②formを変更

`f.text_field`の部分を`f.file_field`に変更

```rb:app/views/images/_form.html.erb
<%= form_for(@image) do |f| %>
  <% if @image.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@image.errors.count, "error") %> prohibited this image from being saved:</h2>

      <ul>
      <% @image.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :content %><br>
    <%= f.file_field :content %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

```

## ③Gemをインストール

gemfileに追加してbundle install

```rb:Gemfile
gem 'carrierwave'
gem 'rmagick'
```

`$ bundle install`

## ④uploaderをgenerate

Uploaderをgenerateします（とりあえず、引数はImageでOK）

`$ rails g uploader Image`

## ⑤作成したファイルにこれをコピペ

```rb:app/uploaders/image_uploader.rb
# encoding: utf-8

class ImageUploader < CarrierWave::Uploader::Base

  storage :file

  include CarrierWave::RMagick

  process :resize_to_limit => [700, 700]
  process :convert => 'jpg'

  version :thumb do
    process :resize_to_limit => [300, 300]
  end

  def store_dir
    "uploads/photos/"
  end

  def extension_white_list
    %w(jpg jpeg gif png)
  end

  def filename
    Time.now.strftime('%Y%m%d%H%M%S') + original_filename + '.jpg' if original_filename.present?
  end

end

```

## ⑥【完成】Modelにマウント

```rb:app/models/image.rb
class Image < ActiveRecord::Base

  mount_uploader :content, ImageUploader

  ....

end

```

###　これで完成！

## おまけ：作成したUploaderに何かメソッド追加したいとき

なにかメソッドを追加したいときには、process :method_nameで定義すると読み込まれます！

```rb:app/uploaders/image_uploader.rb
# encoding: utf-8

class ImageUploader < CarrierWave::Uploader::Base

  ...

  process :hogehoge

  def hogehoge
    p 'うまくいったはず'
  end 

  ...

end

```

##　おまけ：carrierwaveでexif情報をとりたい時
http://qiita.com/funao/items/ceb7106b4a1ef7e23122

## 最速シリーズ

【最速シリーズ】最速でdeviseでfacebookログインまで作る
http://qiita.com/funao/items/6337589eef8f94b6eae0
Javascriptのオブジェクト指向についての基本まとめ


## 関数をクラスとして扱う
Javascriptでは関数にクラスとしての役割を与えている。
ただし、同一のクラスをもとに生成されたインスタンスだとしても、それぞれが持つメンバが同一とは限らないなど厳密にはクラスではないことに注意。

```js:
// コンストラクタ
var Member = function(firstName, lastName){
  this.firstName = firstName;
  this.lastName = lastName;
};

// プロトタイプにメソッドを宣言
Member.prototype.getName = function(){
  return this.lastName + ' ' + this.firstName;
};

// インスタンス化
var mem = new Member('太郎', '山田');
console.log(mem.getName()); // 山田 太郎
```

まず、関数リテラルでベースのクラス（Member）を定義する。
これでnew Memberでインスタンスを生成できる。

### メソッドの宣言はプロトタイプで行う
しかし、クラス内にメソッドをいくつも書いてしまうとインスタンス化の度にそれらのメソッドがコピーされてメモリが無駄に消費される。
そこで、なるべくベースのprototypeオブジェクトに対してメソッドを定義するようにする。
こうすることでインスタンス化の際には参照するだけになるので、メモリが無駄に消費されることはない。

### プロパティの宣言はコンストラクタで行う
prototypeオブジェクトが利用されるのは「値の参照時だけ」で、値の設定は常にインスタンスに対して行われる。

```js:
var Member = function(){};
Member.prototype.sex = '男';

var mem1 = new Member();
var mem2 = new Member();
console.log(mem1.sex + ' | ' + mem2.sex); // 男 | 男
mem2.sex = '女';
console.log(mem1.sex + ' | ' + mem2.sex); // 男 | 女
```
インスタンスmem2のsexプロパティが書き換えられると、その時点で「インスタンスmem2自身がsexプロパティを持つ」ようになる。
プロパティをプロトタイプで定義してもこのように値が異なってしまう。
インスタンスごとに異なる値をプロトタイプで宣言する意味はないので、基本的にプロパティはコンストラクタで定義する。

### thisはインスタンスを参照する
thisはインスタンスのためのものである。
次の関数triangleのような静的メソッド内では使用できない。

```js:
var Area = function(){};

Area.version = '1.0'; // 静的プロパティの定義

Area.triangle = function(base, height){ // 静的メソッドの定義
  return base * height / 2;
}

console.log('Areaクラスのバージョン：' + Area.version); // 1.0
console.log('三角形の面積：' + Area.triangle(5,3)) // 7.5
```
静的プロパティはコンストラクタに直接追加される。
インスタンスでは使用できないのでthisも使用できない。

### オブジェクトリテラルでプロトタイプを定義する
```js:
// コンストラクタ
var Member = function(firstName, lastName){
  this.firstName = firstName;
  this.lastName = lastName;
};

// オブジェクトリテラルでプロトタイプにメソッドを宣言
Member.prototype = {
  getName : function(){ return this.lastName + ' ' + this.firstName; },
  toString : function(){ return this.lastName + this.firstName; }
};
```
こうすることで以下のようなメリットがある。

- 「Member.prototype.〜」のような記述を何回もしなくてよい
- オブジェクト名に変更があった場合に何回も書きなおさなくてよい
- メソッドがひとつのブロックにまとめられているため可読性が向上する

## プロトタイプチェーン
### 
```js:
var Animal = function(){};

Animal.prototype = {
  walk: function(){console.log('トコトコ...');}
};

var Dog = function(){};
// DogオブジェクトのプロトタイプとしてAnimalオブジェクトをセット
Dog.prototype = new Animal();

Dog.prototype.bark = function(){console.log('ワンワン！');}

var d = new Dog();
d.walk(); // トコトコ...
d.bark(); // ワンワン！
```
DogオブジェクトのプロトタイプとしてAnimalオブジェクトをセットしている。
このときDogオブジェクトをサブクラス、Animalオブジェクトをスーパークラスという。

サブクラスではスーパークラスのメソッドも使用できる。
これはサブクラスにメソッドがなければ、スーパークラス、そのまたスーパークラスと探していくから。
これをプロトタイプチェーンという。

### プロトタイプチェーンはインスタンスが生成された時点で固定化される
```js:
var Animal = function(){};

Animal.prototype = {
  walk: function(){console.log('トコトコ...');}
};

var SuperAnimal = function(){};
SuperAnimal.prototype = {
  walk: function(){console.log('ダダダダダ！');}
};

var Dog = function(){};
Dog.prototype = new Animal();
var d1 = new Dog(); // インスタンスを生成。スーパークラスはAnimal
d1.walk(); // トコトコ...

Dog.prototype = new SuperAnimal();
var d2 = new Dog(); // インスタンスを生成。スーパークラスはSuperAnimal
d2.walk(); // ダダダダダ！
d1.walk(); // トコトコ...
```
インスタンスd1が生成された時点のDogのスーパークラスはAnimal。
それが固定化されるので、d1.walkは常にトコトコ...になる。
後からDogのスーパークラスをSuperAnimalにしても変わらない。
Node.jsでアプリを作ってHerokuにデプロイするときのメモ

[LineBotAPI+Heroku+docomoAPI+Node.jsでBotをつくる](http://qiita.com/ryotahirano/items/dd1093fd413c2d1e938a)をやったときに、デプロイまでにいろいろつまづいたのでデプロイしてちゃんと動くようになったところまでのメモ。

## ディレクトリ構成

> app/
├ .babelrc
├ .eslintrc
├ .gitignore
├ Procfile
├ index.js
├ package.json
├ src/
│　└ index.js 
├ webpack.config.base.js

ES2015+babel+webpackの構成。
`app/src/index.js`をbuildして`app/index.js`に吐き出すような感じ。

ファイルとして見慣れなかったのは、**Procfile**というファイルで、アプリケーションで管理するプロセスを記述する。また、アプリケーションのルートディレクトリに配置する必要がある。
Herokuでは、`process type`に`web`を指定しないとダメ。

```
web: node index.js
```

###### 参考
* https://devcenter.heroku.com/articles/getting-started-with-nodejs#define-a-procfile
* http://qiita.com/7kaji/items/6a59977d2ad85604e7fd


## package.json
アプリで採用するNodeのバージョンや、使用モジュールを`dependencies`に漏れなく記述してないとうまく実行されない。

```
{
  "name": "app-name",
  "version": "0.0.1",
  "private": true,
  "engines": {
    "node": "v4.2.x",
    "npm": "3.8.x"
  },
  ...
  "dependencies": {
    ...
    "async": "^2.0.0-rc.3",
    "body-parser": "^1.15.0",
    "express": "^4.13.4",
    "request": "^2.72.0"
  }
}
```

## webpack.config.base.js
webpackを使ってNode.js向けにjsを生成するときは、

```
module.exports = {
 ...
 target: "node",
 ...
}
```
の記述が必要。記述がないと、
> Error: no window object present

のエラーが出る。

---

また、[request](https://github.com/request/request)を使っていると、
> Module not found: Error: Cannot resolve module 'fs' ...
Module not found: Error: Cannot resolve module 'net' ...
Module not found: Error: Cannot resolve module 'tls' ...

みたいなエラーがたくさん出たので、下記を追加。

```
module.exports = {
  ...
  node: {
    fs: 'empty',
    net: 'empty',
    tls: 'empty'
  },
  ...
}

```
参考：https://github.com/request/request/issues/1529

---

さらに、request関連で
> Error: define cannot be used indirect

とエラーが出たので、以下を追加。

```
module: {
    noParse: /node_modules\/json-schema\/lib\/validate\.js/,
    ...
}
```

参考： https://github.com/request/request/issues/1920

## デプロイ方法

開発が終わったら、Herokuサイトにも書いて通り、

```
git add .
git commit -am 'make it better'
git push heroku master
```
でデプロイします。
うまくいったら、Heroku上でアプリが正しく動いているか確認します。

```
heroku logs --tail
```

ログを見ると、どこでエラーが起こっているかなど確認できるのでデバッグに使えます。
Microsoft Azure  SDK for .NET(VS 2015) - 2.9 のインストール時にエラー


エラーが出たので調査。

> Azure Storage Emulator requires LocalDB to be installed.
> You most enable the Microsoft SQL Server Data Tools feature in Visual Studio 2015 to install LocalDB before proceeding.

![2016-05-03.png](https://qiita-image-store.s3.amazonaws.com/0/54313/4a6765da-0c5c-67fe-ca5e-1278b602e782.png)

設定->アプリと機能->VisualStudio2015->変更

インストーラを選択して、SQLServer Data Tools をインストールするとエラーが無くなりました。
Gauche(0.9.4)とPython(3.5.1)で「logと無限大の関係」を比較する

Gauche(0.9.4)でプログラミング中、無限大の対数をとるという処理を行ったところ、Assertion failedなるエラーが発生、__Gauche自体が終了してしまう__という状況に陥りました。

```
gosh> (log +inf.0)
"libnum.scm", line 347 (libnum_25log): Assertion failed: SCM_BIGNUMP(x)
```

これがGaucheの仕様なのか、予期せぬエラーなのか、正直なところよくわからないのですが、どうやら無限の対数を求めた場合、Assertion failedを引き起こすようです。

```
gosh> (log +inf.0)
"libnum.scm", line 347 (libnum_25log): Assertion failed: SCM_BIGNUMP(x)

gosh> (log -inf.0)
"libnum.scm", line 347 (libnum_25log): Assertion failed: SCM_BIGNUMP(x)
```

ちなみにPython(3.5.1)ではどうなっているかというと……

```
>>> import math
>>> math.log(float('inf'))
inf
>>> math.log(-float('inf'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: math domain error
```

負の無限大だけ、エラーが出るようですね。__ただしPython自体は終了しません。__通常の例外として処理されているようです。

ちなみにPythonについては$log(0)$を求めようとすると、例外が発生します。一方Gaucheでは負の無限大に発散すると解釈するようです。

```
>>> math.log(0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: math domain error
```

```
gosh> (log 0)
-inf.0
```

ゼロや無限大関係はややこしいですね(´・ω・`)
CSVファイルのフィールド数チェックのためのawk

sqlldrで取り込む前にCSVファイルのフィールド数をチェックするためのbash/awkスクリプトメモ。

```bash
#!/bin/bash

n=6

{
cat << EOF
111,222,333,444,555,666
111,,,,,
,,,,,666
111,222,333,444,555,666
111,222,333,444,555
EOF
} |\ 
awk -F, --assign=numfields=$n '{if (NF != numfields) exit 9;}'

```
``if``を使わなくてもパターン指定でフィールド数チェックする下記の書き方も。

```bash
awk -F, --assign=numfields=$n 'NF != numfields {exit 9}'
```
VimからStackage ServerのHoogle検索を使おう

# VimからStackage ServerのHoogle検索を使おう

## About

![ss_about.png](https://qiita-image-store.s3.amazonaws.com/0/84945/c12c2f7f-6284-2f9c-4eb8-fc05a8a28b48.png)

　専用プラグインを作ろうとしたら諸事情により頓挫したので、
今回はthincaさん作の[ref.vim](https://github.com/thinca/vim-ref/)を使用しました。  
なのでstackage hoogle search導入までが超楽です。

「さっさと教えろ」という人は[こちら](#matome)へどうぞ！

## Detail

　さて、僕は未だにneobundle.vimからdein.vimへ移行していないので、neobundle.vimを使用します。

### ref.vimのインストール

　具体的には以下をneobundle.vimの使用法に則り、.vimrcに記述してください。  
今回は遅延ローディングを無効にしていますが、適宜設定をしてください。

```vim
NeoBundle 'thinca/vim-ref', { 'lazy' : 0 }
```

続けてref.vimのインストールを行ってください。

```vim
:source ~/.vimrc
:NeoBundleInstall
```

### stackage hoogle searchのための設定

以下の設定を.vimrcに追記します。 ( resolverがlts-5.15の場合 )

```vim
let g:ref_source_webdict_sites = {
\  'stackage' : {
\    'url' : 'https://www.stackage.org/lts-5.15/hoogle?q=%s'
\  }
\}
```

ここでVimをリスタートします。 ( 一応 )

### stackage hoogle searchする

　もうstackage hoogle searchを実行する準備は整いました。  
以下のコマンドを実行します。

```vim
:Ref webdict stackage tail
```

![search_tail.png](https://qiita-image-store.s3.amazonaws.com/0/84945/6e868a8e-3fb7-03e8-dc26-3c4b64f48f3c.png)


型による検索ももちろんできます

```vim
:Ref webdict stackage Int -> Int
```

![search_by_type.png](https://qiita-image-store.s3.amazonaws.com/0/84945/66384c3a-68a6-cc2b-2b7d-b8f8c95e0d22.png)

## まとめ <a name="matome"></a>

導入の設定例です。

```vim
set rtp+=~/.vim/bundle/neobundle.vim
call neobundle#begin()
NeoBundle 'thinca/vim-ref', { 'lazy' : 0 }
call neobundle#end()

let g:ref_source_webdict_sites = {
\  'stackage' : {
\    'url' : 'https://www.stackage.org/lts-5.15/hoogle?q=%s'
\  }
\}
```

実行コマンド。

```vim
:Ref webdict stackage Int -> Int
```

- - - - -

## おまけ

　型の海を泳ぐ皆さんならば、こんな設定をしておくと楽です。

```vim
cnoreabbr RefStackage Ref webdict stackage
cnoreabbr RefStackageTab tabnew \| Ref webdict stackage
```


- - -

## 型の海を泳ぐ魚のイメージ

![shake](https://qiita-image-store.s3.amazonaws.com/0/84945/f1b8ff3b-3c71-dce7-2c26-521101e3708e.png)
動的に表示したいコンテンツをスプレッドシートで管理する楽なモデル

前々から Web サイト作る時に軽量なコンテンツについて「スプレッドシート使って管理できないかな」と思っていた
調べてみたら普通に存在したので少し触れてみた感想などをまとめる


# 需要

* 簡易的なサイト(ホームページなど)を作りたい
* 表示コンテンツの更新を楽に行いたい
* DB を用意したくない, CMS を作るまでしたくない

# 提案方法

Google Sheets API で参照してデータを表示する

Google Sheets API は，例えば↓の設定をするだけで csv とか json で引っ張れるようになる
<img width="909" alt="gwa_api_-_Google_スプレッドシート.png" src="https://qiita-image-store.s3.amazonaws.com/0/40717/46b24c34-b015-3bbc-c505-98c60196b3a2.png">



# 実装例 (Android)
web の方がサンプルとして良いはずだけど, 久々に Android が触りたかったので, こっちで実装してイメージを掴んでみた
<img width="1138" alt="ss_ 2016-05-03 23.04.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/40717/1c447494-e3ac-e2c8-0306-c6e236aa0d35.png">


Android 側で csv をパースして表示する

<img src="https://qiita-image-store.s3.amazonaws.com/0/40717/51613515-a074-3041-9987-0716bc4e3c7f.png" width="200" />



もちろんスプレッドシートを更新すると反映される
<img src="https://qiita-image-store.s3.amazonaws.com/0/40717/81834e5b-4df2-6fec-d116-c845f10e6fd6.png" width="200"/>



コード: https://github.com/cpslab/GoldenProfiles


# メリット・使い所
(Client 側から参照するだけの場合についてだけど)

* 誰でも管理しやすい
* 権限の管理も Google に依存
* とにかく準備が楽
* Google App Script が使える(バッチなど)

もちろん大規模なものやサービスのコンテンツには向いていないと思う
自分のホームページのプロダクト一覧などはこれで管理したいと思った
更新ログなどにも向いていると思う


# 参考にしたリンク

[Overview  |  Sheets API  |  Google Developers](https://developers.google.com/google-apps/spreadsheets/#about_authorization_protocols)
[GoogleスプレッドシートのデータをJSONで取得してみた](
http://creator.aainc.co.jp/archives/6240)

追記:
調べてたらまだ触ってませんが Google SpreadSheet を api 化する「Sheetsu」というサービスもあった
https://sheetsu.com/?fhp=true
cinema4dでpythonからfbxを読み込む


cinema4dでpythonを使いfbxを読み込んでみた。fbxをgui上から読み込むと読み込みオプションのダイアログがでてしまうが、スクリプトから指定すると出ないようにできるので、必要に応じで使う。

```python:savefbx.py
import c4d
from c4d import plugins

def main():

    # Find the FBX importer plugin
    plug = plugins.FindPlugin(1026369, c4d.PLUGINTYPE_SCENELOADER)
    if plug is None:
        return

    # Access the settings
    op = {}
    if plug.Message(c4d.MSG_RETRIEVEPRIVATEDATA, op):
        print op

    fbximport = op["imexporter"]
    if fbximport is None:
        return

    # Define the settings
    fbximport[c4d.FBXIMPORT_CAMERAS] = False

    # Import without dialogs
    c4d.documents.MergeDocument(doc, "/filepath/001.fbx", c4d.SCENEFILTER_OBJECTS|c4d.SCENEFILTER_MATERIALS, None)

    c4d.EventAdd()

if __name__=='__main__':
    main()
```


##参考
How can I one-click the fbx import?
http://www.plugincafe.com/forum/forum_posts.asp?TID=11784
Itamaeの今のところの個人的ベストプラクティス

## 1. 公式のBest-Practiceを参考に

```itamae g cookbook``` とか ```itamae g role``` とかできるようになったし
モジュール感という意味でも公式のが好き

https://github.com/itamae-kitchen/itamae/wiki/Best-Practice

ここまでで↓の状態
（公式ではroles/web.rbとなっているが、```itamae g role```した状態にしたがう）

```
.
├── cookbooks
│   └── nginx
│       ├── default.rb
│       ├── files
│       │   └── etc
│       │       └── nginx
│       │           └── conf.d
│       │               └── static.conf
│       └── templates
│           └── etc
│               └── nginx
│                   └── conf.d
│                       └── dynamic.conf
└── roles
    └── web
        └── default.rb
        └── files
        └── templates
```

## 2. nodeはYAMLで

JSONよりYAMLの方がconfigurationには適してるのでYAMLで。
ここまでで↓の状態

```
.
├── cookbooks
│   └── nginx
│       ├── default.rb
│       ├── files
│       │   └── etc
│       │       └── nginx
│       │           └── conf.d
│       │               └── static.conf
│       └── templates
│           └── etc
│               └── nginx
│                   └── conf.d
│                       └── dynamic.conf
└── roles
│   └── web
│       └── default.rb
│       └── files
│       └── templates
└── nodes
    └── web-staging.yml
```

## 3. nodeにroleを含める

だいたいnodeはroleと対応するので

```
$ bundle exec itamae local -y nodes/web-staging.yml roles/web/default.rb
```

とするのは冗長

以下を参考に、nodeにroleを含める。
なお、以下ではnode内でrecipeを指定しているが、recipeにすると自由度高くて
つい手抜きしたときにrole外のrecipeも追加したりしてごちゃつくのでroleで縛った方が好き
http://qiita.com/toritori0318/items/00ea2a75c8321aaf9ef6

ここまでで↓の状態。完成。

```
.
├── cookbooks
│   └── nginx
│       ├── default.rb
│       ├── files
│       │   └── etc
│       │       └── nginx
│       │           └── conf.d
│       │               └── static.conf
│       └── templates
│           └── etc
│               └── nginx
│                   └── conf.d
│                       └── dynamic.conf
└── roles
│   └── web
│       └── default.rb
│       └── files
│       └── templates
└── nodes
│   └── web-staging.yml
└── entry.rb
```

```rb:entry.rb
node['roles'] = node['roles'] || []
node['roles'].each do |role|
  include_recipe "roles/#{role}/default.rb"
end
```

```yaml:web-staging.yml
roles:
  - app
nginx:
  worker_processes: 2
```

```bash
$ bundle exec itamae local -y nodes/web-staging.yml entry.rb
```
pip で Ansible がインストール出来ない。


## 状況
5月に入ってから、pip経由で Ansibleの最新を新規に
インストールしようとしたら、インストールできなくなっていた。

以下のようなエラーが出た。

```
fatal error: ffi.h: No such file or directory
```

上記解決後に以下のエラーも発生

```
fatal error: openssl/e_os2.h: No such file or directory
```

## 環境
- 環境は、CentOS7 Minimum（にちかい環境）
- pip　経由でのAnsibleインストール `pip install ansible`
- 確認したAnsibleのバージョンは、2.0.2.0

```
$ ansible --version
ansible 2.0.2.0
```
## 解決

以下のdevel パッケージをインストールすることで解決出来た。

```
yum install libffi-devel openssl-devel
```

その他に、Ansibleをインストールする際には、yumで 以下のようなrpm を事前にインストールしておく
必要がある。

```
yum -y install python-devel python-crypto libffi-devel openssl-devel
```


う〜ん。Ansibleが、肥えていくー。