OmniAICreator/Qiita-1.07M huggingface dataset:
アイコンがアニメーションするドロワメニュー

ちょっと気になったので、作ってみた。
ハンバーガーアイコン　-> ☓ボタン

```html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
</head>
<body>
  <nav class="toggle-menu">
    <div class="menu-contents">
    </div>
    <div class="hum-icon">
      <div class="hum"></div>
    </div>
  </nav>
  <div class="main-contents">
    <div class="nav-bar"></div>
  </div>

<style>
  html,body{
    height: 100%;
    margin: 0;
  }
  .toggle-menu{
    display: block;
    min-height: 100%;
    width: 300px;
    background-color: #E91E63;
    position: absolute;
    top: 0;
    left: 0;
    -webkit-transform: translateX(-300px);
    transform: translateX(-300px);
    -webkit-transition:ease 0.5s;
    transition:ease 0.5s;
    z-index:9999;
  }
  .open{
    -webkit-transform: translateX(0px);
    transform: translateX(0px);
    box-shadow:0px 0px 3px;
  }
  .hum-icon{
    display:block;
    height: 40px;
    width: 40px;
    position:fixed;
    top:5px;
    left:305px;
    cursor: pointer;
    -webkit-transition:ease 0.5s;
    transition:ease 0.5s;
  }
  .open-icon{
    -webkit-transform: translateX(-45px);
    transform: translateX(-45px);
  }
  .hum{
    display:block;
    position: absolute;
    top: 35%;
    height: 2px;
    width: 100%;
    background-color: #555;
    -webkit-transition:ease 0.3s;
    transition:ease 0.3s;
  }
  .hum.cross-mark{
    width: 0;
    background-color: white;
  }
  .hum-icon:before{
    content: '';
    position: absolute;
    top: 15%;
    width: 100%;
    height: 2px;
    background-color: #555;
    -webkit-transition:ease 0.5s;
    transition:ease 0.5s;
  }
  .hum-icon.open-icon:before{
    transform: rotate(-45deg);
    background-color: white;
    top: 45%;
  }
  .hum-icon:after{
    content: '';
    position: absolute;
    top: 55%;
    width: 100%;
    height: 2px;
    background-color: #555;
    -webkit-transition:ease 0.5s;
    transition:ease 0.5s;
  }
  .hum-icon.open-icon:after{
    transform: rotate(45deg);
    background-color: white;
    top: 45%;
  }
  .nav-bar{
    width: 100%;
    height:40px;
    box-shadow: 0px 0px 1px;
  }

</style>
<script>
  $(function(){
    $('.hum-icon').click(function(){
      $('.toggle-menu').toggleClass('open');
      $(this).toggleClass('open-icon');
      $('.hum,hum-icon').toggleClass('cross-mark');
    });
  });
</script>
</body>
</html>
```
[Unity] Monobehaviourを継承せずにタイマー処理を行う


普通にC#のクラスを使うだけなのだけど、「 **Unity　タイマー処理** 」という感じでタイマーについて探すと大体において`StartCouroutine`か`Invoke`が出てきて、なかなかこのタイマーにたどり着かなかったのでメモ。

ちなみに`Monobehaviour`を継承しないと`StartCouroutine`、`Invoke`が使えないためです。

（Unityではそもそもそうやらねーよ！っていうツッコミがあればお願いします＞＜）

### System.Timers.Timerを使う

System.Timers.Timerクラスを使ってタイマーを実現します。
タイマーのセットアップ方法は以下。

```c#
using System.Timers;

// ... 中略

void Start() {
	// タイマーを生成
	System.Timers.Timer timer = new System.Timers.Timer(2000f);
	
	// コンストラクタで設定しない場合は以下で設定可能
	// timer.Interval = 2000f;
	
	// 繰り返し処理をするか（繰り返す場合は`true`。デフォルト）
	timer.AutoReset = false;
	
	// コールバックを設定
	timer.Elapsed += (System.Object source, ElapsedEventArgs e) => {
		Debug.Log("The timer has done.");
		// timer.Stop();
		// timer.Close();
		// timer.Dispose();
	};
	
	// タイマーを実行
	timer.Start();
}
```

`Elapsed`が、規定時間経過後に呼び出されます。（繰り返しの場合は規定時間間隔で呼び出される）
あとはその中に必要な処理を記述してやればOKです。

参考:[タイマにより一定時間間隔で処理を行うには？（サーバベース・タイマ編）](http://www.atmarkit.co.jp/fdotnet/dotnettips/374timerstimer/timerstimer.html)
HiveQLでneocomplete.vimのシンタックス補完を使う

Hive用のsyntaxファイルが[autowitch/hive.vim](https://github.com/autowitch/hive.vim)にあるけど、
そこに書いてあるように

```vim
" for .hql files
au BufNewFile,BufRead *.hql set filetype=hive expandtab

" for .q files
au BufNewFile,BufRead *.q set filetype=hive expandtab
```

設定をすると、neocomplete.vimのsyntax補完がでてこない。
neocomplete.vimのソースを調べてみると、[neocomplete.vim/syntax.vimの145-150行目](https://github.com/Shougo/neocomplete.vim/blob/2965282216a28dbbcfe3774e52e55e7eea993a8f/autoload/neocomplete/sources/syntax.vim#L145-L150)に

```vim
    if line =~ 'Syntax items' || line =~ '^\s*links to' ||
          \ line =~ '^\s*nextgroup=' ||
          \ stridx(tolower(group_name), filetype_pattern) != 0
      " Next line.
      continue
    endif
```

という記述があり、上の3行目で、シンタックスグループ名がファイルタイプでは始まらないものは、キーワードを抽出していない事がわかる。
[hive.vimのシンタックスファイル](https://github.com/autowitch/hive.vim/blob/master/syntax/hive.vim)を見るとsqlで始まっているため、ファイルタイプをhiveにしてしまうとシンタックス補完ができない。

一方、sqlのシンタックスファイルを見てみると

```vim:$VIMRUNTIME/syntax/sql.vim
" Default to the standard Vim distribution file
let filename = 'sqloracle'

" Check for overrides.  Buffer variables have the highest priority.
if exists("b:sql_type_override")
    " Check the runtimepath to see if the file exists
    if globpath(&runtimepath, 'syntax/'.b:sql_type_override.'.vim') != ''
        let filename = b:sql_type_override
    endif
elseif exists("g:sql_type_default")
    if globpath(&runtimepath, 'syntax/'.g:sql_type_default.'.vim') != ''
        let filename = g:sql_type_default
    endif
endif

" Source the appropriate file
exec 'runtime syntax/'.filename.'.vim'
```

`b:sql_type_override`または`g:sql_type_default`にsqlのタイプが設定されていると、そのシンタックスファイルを読み込むことがわかるので、


```vim:vimrc
NeoBundleLazy 'autowitch/hive.vim', {
\   'autoload': {'filetypes': ['sql']}
\}
:
:
augroup MyVimrc
    autocmd!
augroup END
autocmd MyVimrc BufNewFile,BufRead *.hql,*.q
\   let b:sql_type_overrride = 'hive'
\|  setlocal filetype=sql
```

こんな風にSQLのタイプを設定してから、ファイルタイプを設定すると、hiveのシンタックスファイルが読み込まれ、シンタックス補完も効くようになる。

ちなみにmysqlのシンタックスファイルを見てみると、こちらはmysqlでシンタックスグループが始まっているので、ファイルタイプをmysqlにしないとシンタックス補完が効かない…。
Windows10 + VirtualBox + Vagrant + Homestead2.0 を動かす。


Windows10 環境上でVirtualBox 5.0.0を使おうとすると、現在エラーが発生して VagrantゲストOSが起動しない状態となっています。

# VirtualBox5.0.0 を削除
2015/08/07 現在 Windows10 に正式にリリースされている最新ヴァージョンですが、これを削除します。

# VirtualBox5.0.1（TestBuild）をインストール
私は https://www.virtualbox.org/download/testcase/VirtualBox-5.0.1-101902-Win.exe をインストールしました。
（既にもっと新しい TestBuild も存在します。）

# Homestead.rb を編集

```rb
17行目
    config.vm.network :private_network, ip: settings["ip"] ||= "192.168.10.10"
    ↓
    # config.vm.network :private_network, ip: settings["ip"] ||= "192.168.10.10"
```

# action.rb を編集
C:\HashiCorp\Vagrant\embedded\gems\gems\vagrant-1.7.4\plugins\providers\virtualbox 配下にある、action.rb を編集

```rb
64行目
          b.use ClearNetworkInterfaces
          ↓
          #####b.use ClearNetworkInterfaces
```

# VirtualBox の設定を変更
1. Oracle VM VirtualBox マネージャを起動
2. ファイル > 環境設定 を選択し ネットワーク > ホストオンリーネットワーク > [任意の VirtualBox Host-Only Ethernet Adapter ]を編集
3. IP に192.168.10.10 を設定
4. VM一覧から homestead の仮想OSを選択し、設定 > ネットワーク > アダプター2 へ編集
5. ネットワークアダプターを有効化
6. 割り当てをホストオンリーアダプター
7. 名前を(2)で編集したホストオンリーネットワークを選択

# Homestead 再起動など
```cl
$ homestead up
$ homestead provision
```

# 起動確認
以上の操作で Windows10 環境でも Homestead 起動時にエラーが出ることなく立ち上がり、HTTPのポートフォワード側のネットワークアダプターも有効になります。
【翻訳練習】Dockerを使用してマルチノードKubernetesを起動する

#Kubernetes公式マニュアル

勉強がてらにKubernetesの資料を翻訳してみます。

英語のスキルは無いので、きちんとソース元を参照下さい。

* http://kubernetes.io/v1.0/docs/getting-started-guides/docker-multinode.html

#Dockerを使用してマルチノードKubernetesを起動する


note:マルチノード構成は、[シングル構成](http://kubernetes.io/v1.0/docs/getting-started-guides/docker.html)より進んでいます。もしKubernetesの調査に興味が有るのであれば、そこから始めるのをおすすめします。

note:Docker 1.7.0で発生する[バグ](https://github.com/docker/docker/issues/14106)があります。Docker 1.6.2を導入するか、Docker 1.7.1を待って下さい。


###目次

* 事前準備
* 概要
    * Bootstrap Docker
* Masterノード
* Workerノードの追加
* クラスタのテスト

#事前準備

1. Dockerがインストールされたマシンが必要です


#概要

このガイドは、2ノードのKubernetesクラスタで構成されています。MasterノードはAPIサーバーとオーケストレーター、WorkerノードはMasterからタスクを受け取ります。

あなたは、任意の数の大規模なクラスタを作成するWorkerノードを追加できます。

イメージ図
![img](http://kubernetes.io/v1.0/docs/getting-started-guides/k8s-docker.png)

#Bootstrap Docker

このガイドでは、2インスタンスのDockerデーモンを上げるパターンを使います。

１）bootstrap Dockerインスタンス（flanneldとetcdを起動するデーモン）
２）main Dockerインスタンス（Kubernetesとユザーのスケジュールされたコンテナ）

このパターンは必要です、なぜならflannelデーモンはKubernetesによって作成された全てのDockerコンテナの内部接続ネットワークの管理と設定を共有されるためです。

これを成し遂げるため、main Dockerデーモンとは別にbootstrap Dockerインスタンスを起動する必要があります。

しかしbootstrap Dockerインスタンスは、コンテナのデプロイと管理を簡単にしてくれるので、私達はbootstrap Dockerを用意します。


#Masterノード

最初のステップはMasterノードの初期化です。

詳細な構成は[ここ](http://kubernetes.io/v1.0/docs/getting-started-guides/docker-multinode/master.html)をみてください。


#Workerノードの追加

Masterノードが起動したら、別のマシンにWorkerノードを追加できます。

詳細な構成は[ここ](http://kubernetes.io/v1.0/docs/getting-started-guides/docker-multinode/worker.html)をみてください。


#クラスタのテスト

クラスタができたら[テスト](http://kubernetes.io/v1.0/docs/getting-started-guides/docker-multinode/testing.html)をしましょう。

より完全なアプリケーションについては、[example](http://kubernetes.io/v1.0/examples/)を参照してください。
ansible.cfgで起動するシェルを指定する


## やりたいこと

[これ](http://qiita.com/FGtatsuro/items/2366c93131c47aef8dfe)を見て、毎回 `/bin/bash -lc`を書かずに処理できる方法はないだろうかと思った

## やったこと

`ansible.cfg`の `executable`で指定した

```bash:ansible.cfg
[defaults]
executable = /bin/bash -l # ログインシェルとしてbashを起動
```

## 参考

[Configuration file — Ansible Documentation](http://docs.ansible.com/ansible/intro_configuration.html#executable)
rvest でログインしてスクレイピング #rstatsj

ログインしないと見れないページをスクレイピングしたい。
rvest パッケージを使えばお手軽にできる。

試しに slideshare にログインしてみる。

```r:R
library(rvest)

# ログイン状態のセッションを作る ------------------------------------------------------------
login_page <- html_session("https://www.slideshare.net/login")

login_form <- html_form(login_page)[[1]] %>% 
  set_values(user_login="hoxo_m@gmail.com", user_password="****")

session <- submit_form(login_page, login_form) 

# ログイン状態でスクレイピング ----------------------------------------------------
session %>% 
  jump_to("http://www.slideshare.net/") %>% 
  html_node(xpath='//*[@id="hp-hero"]/div[1]/div/a/h1/div[2]') %>%
  html_text
```

```:結果
[1] "Hoxo_m, how do you inspire creativity in yourself and others?"
```

hoxo_m でログインできていることがわかる。

それでは、ログインしないと見れない My uploads のページから、自分のスライドに関するデータをスクレイピングしてみる。

```r:R
library(lambdaR)

data <- session %>%
  jump_to("http://www.slideshare.net/hoxo_m/edit_my_uploads?type=public") %>%
  html_nodes(xpath = '//div[starts-with(@id, "my-")]') %>%
  Map_(node: {
    title <- node %>%
      html_node(xpath='div[1]/div[2]/div[1]/div/a') %>%
      html_text
    data <- node %>% 
      html_nodes(xpath='div[1]/div[2]/div[3]/ul/li') %>% 
      html_text %>% 
      as.numeric
    result <- Reduce_(data, cbind, init = data.frame(title))
    colnames(result) <- c("title", "view", "like", "comment", "download")
    result
  }) %>%
  Reduce_(rbind)

knitr::kable(data)
```

|title                                                  |  view| like| comment| download|
|:------------------------------------------------------|-----:|----:|-------:|--------:|
|R で超簡単に並列処理を書けるpforeach パッケージ        |  2058|   18|       0|       10|
|for を捨てよ、foreach を書こう                         |  1817|   19|       0|       13|
|データの不備を統計的に見抜く (Gelman’s secret weapon) |  2661|   14|       0|       12|
|カップルが一緒にお風呂に入る割合をベイズ推定してみた   | 48378|  118|       0|      149|
|pipeR の使い方【ノーカット版】                         |  2469|   15|       0|       11|
|可視化で理解するマルコフ連鎖モンテカルロ法             | 15380|   35|       0|       88|
|Bokete player の裏側 ～R で作る Web アプリケーション～ |  4048|   12|       0|       12|
|Stan で欠測データの相関係数を推定してみた              |  4600|   17|       0|       23|
|チェビシェフの不等式                                   |  5154|   10|       0|       20|
|swirl パッケージでインタラクティブ学習                 |  2960|   13|       0|       16|
|RPubs とその Bot たち                                  |  5067|   12|       0|        8|
|5分でわかるベイズ確率                                  | 61582|  139|       0|      321|

おー、できた！

みなさんベイズが好きなんですねー。

Enjoy!

## 関連

- [rvest すげえ。](http://qiita.com/hoxo_m/items/264b45684fcb657cf285)
- [ggplot2 に依存しているパッケージ一覧を rvest で取得する](http://qiita.com/hoxo_m/items/c53b6cfbd5ada5fe1642)
- [rvest で声優の男女データをスクレイピング](http://qiita.com/hoxo_m/items/b9002b7b05954e882148)
- [rvest で OAuth 認証してスクレイピング](http://qiita.com/hoxo_m/items/ea2db3b32621a6260926)
FuelPHP リソースを共通化して複数サイトを構築する

※ 追記
この記事を書いてからしばらくして、単純に model だけであれば一方を主として他方から `include()` すればOKということに気づきました。

```php:app_admin/classes/model/modalname.php
<?php
include (dirname(dirname(dirname(dirname(__FILE__)))) . '/app/classes/model/modalname.php'); 
```
追記ここまで※

#この記事の趣旨
FuelPHP で複数サイトを作る場合、通常は `fuel/app` レベルで分かれて、`fuel/app`, `fuel/app_admin` ... のようになってしまうので、下層の Model等のファイル類が冗長になります。全く別のサイトであれば問題無いのですが、フロントサイトと管理サイトなど同じサービスにいくつかの顔を作ってそれぞれにドメインをあてる場合などに問題となります。調べると、Modelのディレクトリをシンボリックリンクで共有するなどの方法が知られているようですが、各環境の構築手順が重たくなります。

今回は routes.php をサイト毎に切り換える形で抜本的に対応し、個人的には文句のない快適な状態になりました。
以下に例として、構築中のフロントサイトに別ドメインの管理サイトを共存させる方法を挙げます。

#手順

*1. public ディレクトリをサイト数分作成する。*
`/public` をコピーして `/public_admin` を作成します。

*2. ウェブサーバでサイトの定義をする*
http://example.com のドキュメントルートを `/public`、
http://example-admin.com のドキュメントルートを `/public_admin`
と設定します。

*3. ドキュメントルート直下の `index.php` に定数 ROUTS_FILENAME を定義する*

```php:public/index.php
define('ROUTS_FILENAME', 'routes.front.php');
```
```php:public_admin/index.php
define('ROUTS_FILENAME', 'routes.admin.php');
```

*4. サイト毎の `routes.php` を作成する*

```php:app/config/routes.front.php 
<?php
// フロントサイト用の routes.php 
return array(
	'_root_'  => 'index',  // The default route
	'_404_'   => 'index/404',    // The main 404 route

	'admin(.*)'  => 'index/404',  // controller_admin へのアクセスを防ぐ
);
```

```php:app/config/routes.front.php 
<?php
// 管理サイト用の routes.php
return array(
	'_root_'  => 'admin/index',  // The default route
	'_404_'   => 'admin/404',    // The main 404 route

	'(.+)' => 'admin/$1'   // すべて controller_admin 以下にアクセスする
);
```

*5. 本来の `routes.php` では4で作ったファイルを読むように記載する*

```php:
<?php
return include ROUTS_FILENAME;
```

*6. コントローラ等を実装する*
http://example.com にアクセスすると `app/classes/controller/index.php` が使われ
http://example-admin.com にアクセスすると `app/classes/controller/admin.php` が使われます。

# 注意点
controller が共通なので切り分けはきっちりするべきです。例ではフロントサイトでいかなるURLにアクセスしても管理用のコントローラーに繋がらないようにしています。
Atomでパッケージを作ってみた その3

主要なクラスを試してみた。

```
#プロジェクトのパスを取得する。
console.log atom.project.getPaths() 
# =>"C:\Users\tajihiro\github\sample01"
```

### TextEditor

アクティブなエディタを`atom.workspace.getActiveTextEditor()`で取得可能。

```
#アクティブエディタを取得する。
editor = atom.workspace.getActiveTextEditor()
```

```
#アクティブなエディタのフルパスを取得する。
console.log editor.getPath()
# => "C:\Users\tajihiro\github\sample01\lib\sample01.coffee" 
```

```
#アクティブなエディタのタイトルを取得する。
# => sample01.coffee 
editor.getTitle()
```

```
#アクティブなエディタの内容を取得する。
editor.getText()
```

```
#アクティブなエディタのカーソルで選択した内容を取得する。
editor.getSelectedText()
```

```
#アクティブなエディタの最上位に移動する。
editor.scrollToTop
#アクティブなエディタの最下位に移動する。
editor.scrollToBottom
```

```
#選択した内容をクリップボードにコピーする。
editor.copySelectedText()
#選択した内容をクリップボードへカットする。
editor.cutSelectedText() 
```

その他たくさんあるので、試してみよう。
本日はここまで。
Railsで月毎の配列を簡潔に作る

下記のような配列が欲しい。中身はDateクラスで

```rb
[2014/8/1, 2014/9/1, 2014/10/1, ...2015/8/1]
```

同僚に聞いてこんな感じで実装

```rb
(Date.new(2014, 8, 1) .. Date.today).select{|date| date.day == 1}
```

こんな候補もあった

```rb
(Date.new(2014, 8, 1) .. Date.today).map(&:beginning_of_month).uniq
```

もうちょっとスマートに書けないかな。
Crystalで並行化する方法: 6秒かかる処理を3秒にしよう


# この記事の目的

6秒かかる直列処理を並行処理に改修し、3秒で終わるようにする

# 準備

まずは、適当にフォルダを作る

```
mkdir ~/Desktop/crystal
cd ~/Desktop/crystal/
```

つぎに、main.crファイルを作る

```
vim main.cr
```

# まず直列実行するプログラムを書く

* 1秒待つコマンド
* 2秒待つコマンド
* 3秒待つコマンド

上記を順番に実行していくプログラムを `main.cr` の中身を書く。
つまり、合計で6秒かかってしまう。

```rb:main.cr
require "logger"

log = Logger.new(STDOUT)

log.info "started."

# 1秒かかるコマンド
log.info "sleep1 started."
sleep 1
log.info "sleep1 finished."

# 2秒かかるコマンド
log.info "sleep2 started."
sleep 2
log.info "sleep2 finished."

# 3秒かかるコマンド
log.info "sleep3 strated."
sleep 3
log.info "sleep3 finished."

log.info "all finished."

```

ともあれ、実行してみる

```
% crystal run main.cr
I, [2015-08-07 18:21:57 +0900 #9884]  INFO -- : started.
I, [2015-08-07 18:21:57 +0900 #9884]  INFO -- : sleep1 started.
I, [2015-08-07 18:21:58 +0900 #9884]  INFO -- : sleep1 finished.
I, [2015-08-07 18:21:58 +0900 #9884]  INFO -- : sleep2 started.
I, [2015-08-07 18:22:00 +0900 #9884]  INFO -- : sleep2 finished.
I, [2015-08-07 18:22:00 +0900 #9884]  INFO -- : sleep3 strated.
I, [2015-08-07 18:22:03 +0900 #9884]  INFO -- : sleep3 finished.
I, [2015-08-07 18:22:03 +0900 #9884]  INFO -- : all finished.
```

やはり、6秒かかった。

これを並行化したい。

# spawnを使って並行化し、3秒で終わるようにする

Crystal言語には、Go言語の`go`のように処理を簡単に並行にできる`spawn`がある。

ただし、`spawn`だけでは、並行化した処理が終わる前に、メインの処理が終わってしまう。つまり、待ってくれない。各処理が終わるまで待つには、`Channel`というAPIを使う。

なお、各ルーチンの実行結果を、呼び出し元に戻すときにもチャネルを使う。今回は、特に実行結果は必要ないので、チャネルに適当な値を入れることにする。ここでは、とりあえずbool値にする。

以上を踏まえて、さきほどの `main.cr` を改修する:

```rb:main.cr
require "logger"

log = Logger.new(STDOUT)

log.info "started."

channel = Channel(Bool).new

# 1秒かかるコマンド
spawn do
  log.info "sleep1 started."
  sleep 1
  log.info "sleep1 finished."
  channel.send true
end

# 2秒かかるコマンド
spawn do
  log.info "sleep2 started."
  sleep 2
  log.info "sleep2 finished."
  channel.send true
end

# 3秒かかるコマンド
spawn do
  log.info "sleep3 strated."
  sleep 3
  log.info "sleep3 finished."
  channel.send true
end

# 終わるまで待つ
3.times do
  channel.receive
end

log.info "all finished."
```

実行してみよう

```
% crystal run main.cr
I, [2015-08-07 18:34:31 +0900 #10590]  INFO -- : started.
I, [2015-08-07 18:34:31 +0900 #10590]  INFO -- : sleep3 strated.
I, [2015-08-07 18:34:31 +0900 #10590]  INFO -- : sleep2 started.
I, [2015-08-07 18:34:31 +0900 #10590]  INFO -- : sleep1 started.
I, [2015-08-07 18:34:32 +0900 #10590]  INFO -- : sleep1 finished.
I, [2015-08-07 18:34:33 +0900 #10590]  INFO -- : sleep2 finished.
I, [2015-08-07 18:34:34 +0900 #10590]  INFO -- : sleep3 finished.
I, [2015-08-07 18:34:34 +0900 #10590]  INFO -- : all finished.
```

並行化ができて、3秒で終わるようになった＼(^o^)／

# まとめ

6秒かかる処理を、`spawn`と`Channel`を組み合わせて並行化し、3秒で終わるようになった。

# 関連

[Goルーチンで並行化する方法: 6秒かかる処理を3秒にしよう - Qiita](http://qiita.com/suin/items/82ecb6f63ff4104d4f5d)

# 更新

[2015-08-07]
Crystalの作者の @asterite さんから「終わるまで待つ」部分をもっとシンプルに書けると教えていただきました。ありがとうございます！
【WordPress】DBの文字コードをのエラーがでたときの対処法メモ

ローカルのWordPressをテストサーバに移そうとしたら
```Unknown collation: 'utf8mb4_unicode_ci'```
ってエラーが出たので、対処法をメモ。
★エラー内容としては（サーバのバージョンが低いなどの理由で）utf8mb4が使えないよ（意訳）ってことらしい。

#まずコマンドで文字コードを変換する

※MAMPの場合

```js
cd /Applications/MAMP/Library/bin
./mysql -u root -p ;
// パスワードの入力

//１つ１つテーブルを変換
ALTER TABLE 【テーブルの名前】 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
```

#エクスポート

照合順序の「utf8mb4_general_ci」が「utf8_general_ci」に変わっていることを確認して、
エクスポート

#SQLの修正

エクスポートしたSQLをテキストエディタで開いて、「utf8mb4」→「utf8」に置換
URL等も変更する

#【重要】wp-config.phpを修正

```js
define('DB_CHARSET', 'utf8mb4');
↓
define('DB_CHARSET', 'utf8');
```
terraform cloudwatchの通知先をsnsにしてsns subscriptionをlambdaで登録する

# terraform cloudwatchの通知先をsnsにしてsns subscriptionをlambdaで登録する

iamを作って、lambdaをつくってsnsを作っていきます。

lambdaで指定するzipの中身は、index.jsにコードを記述して

```bash:
zip dev-notify_to_slack.zip index.js
```
したものです。ここでファイル名をミスっててもエラーになりません。
AWSコンソール上で見るとlambdaのコードが見えない状態になってました。

slackに通知するlambdaは下記からいただきました。

* [CloudWatchのAlertをAWS Lambda経由でSlackに飛ばす](http://qiita.com/tmtysk/items/7161b11e20ac5e2dfc01)


```
#--------------------------------------------------------------
# iam
#--------------------------------------------------------------
resource "aws_iam_role" "lambda" {
  name = "lambda"
  assume_role_policy = "${file("./iam/lambda_assume.policy")}"
}

resource "aws_iam_policy" "lambda" {
  name = "lambda"
  path = "/"
  description = "for lamdbda policy"
  policy = "${file("./iam/lambda_role.policy")}"
}

resource "aws_iam_policy_attachment" "lambda_role_attachment" {
  name = "lambda_role_attachment"
  roles = ["${aws_iam_role.lambda.name}"]
  policy_arn = "${aws_iam_policy.lambda.arn}"
}

#--------------------------------------------------------------
# Lambda
#--------------------------------------------------------------
resource "aws_lambda_function" "notify_to_slack" {
    filename = "lambda/dev-notify_to_slack.zip"
    function_name = "notify-to-slack"
    role = "${aws_iam_role.lambda.arn}"
    handler = "index.handler"
}

#--------------------------------------------------------------
# SNS
#--------------------------------------------------------------
resource "aws_sns_topic" "notify_to_slack" {
    name = "notify_to_slack"
}

resource "aws_sns_topic_subscription" "notify_to_slack" {
    topic_arn = "${aws_sns_topic.notify_to_slack.arn}"
    protocol = "lambda"
    endpoint = "${aws_lambda_function.notify_to_slack.arn}"
}
```

後は`aws_cloudwatch_metric_alarm`のactionsに登録していきます。

```
    alarm_actions = [ "${aws_sns_topic.notify_to_slack.arn}" ]
```

これで完成といいたいところですが

https://www.terraform.io/docs/providers/aws/r/sns_topic_subscription.html

`aws_sns_topic_subscription`の`protocol`には`lambda`がサポートされてません。
そのせいか、AWSコンソール上でCreate Subscriptionしたときには作られる、lambdaのEvent SourceにSNSが登録されていないのです。

仕方がないのでここだけ手で登録してあげます。
成功すればcloudwatchからslackへの通知が来るはずです。

![Slack.png](https://qiita-image-store.s3.amazonaws.com/0/63168/a3f51092-9627-c05f-5d0c-474ac0d6276f.png)


cloudwatchのactionにSNSが登録されてくれるだけでも嬉しいのでバージョンアップで対応されることを期待します（それっぽいissueは上がってました）。
node.jsのclusterにてworker間でリソース共有を行ってみた

node初心者の僕はnode.jsでcluster構成を取っている場合、
worker間でリソースを共有する方法が分からず、とりあえず以下のような実装をしてみました。

もし他に良いやり方を知っている方がいたら教えてください。

```server.js
var cluster = require('cluster');                                                                                                      
var http = require('http');
var numCPUs = require('os').cpus().length; // worker数

if (cluster.isMaster) {
  var sharedData = {}; // worker間で共有されるデータ
  var counter = 0;
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
  
  Object.keys(cluster.workers).forEach(function(id) {
    var worker = cluster.workers[id];
    worker.on('message', function(msg){
      sharedData[counter++] = msg.data; // 共有されていることをチェックするためのdataを作成する
      worker.send({"requestKey":msg.requestKey,"data":sharedData});
    }); 
  }); 

  cluster.on('exit', function(worker, code, signal) {
    console.log('worker ' + worker.process.pid + ' died');
  }); 

} else {
  var reqMap = {}; 
  var counter = 0;

  http.createServer(function(req, res) {
    res.writeHead(200);
    res.end();
    var requestKey = Math.random(); // 本来ならrequest毎に一意になるkeyを付ける必要があるが
    reqMap[requestKey] = function(data) {
      //他のworkerのdataも見れるかチェック
      console.log(data);
    };
    var workerData = process.pid + ":" + counter++; // worker間で共有したい情報
    process.send({ "requestKey": requestKey, "data": workerData }); 
  }).listen(8000);
 
  process.on('message', function(msg) {
    reqMap[msg.requestKey](msg.data);
    reqMap[msg.requestKey] = null;
  }); 
}
```
実行結果

$ node server.js 
{ '0': '68512:0' }
{ '0': '68512:0', '1': '68511:0' }
{ '0': '68512:0', '1': '68511:0', '2': '68513:0' }
{ '0': '68512:0', '1': '68511:0', '2': '68513:0', '3': '68514:0' }
chefでrbenv・ruby環境作り

chefでrbenv・rubyの環境を作るためのレシピを作ったのでメモ。
レシピを実行するとruby-2.2.2がインストールされる。

```rb
# rbenvインストール
git '/usr/local/rbenv' do
  repository 'https://github.com/sstephenson/rbenv.git'
  reference 'master'
  user 'root'
  group 'root'
  action :checkout
end

directory "/usr/local/rbenv/shims" do
  owner 'root'
  group 'root'
  mode 00755
  action :create
end

directory "/usr/local/rbenv/versions" do
  owner 'root'
  group 'root'
  mode 00755
  action :create
end

directory "/usr/local/rbenv/plugins" do
  owner 'root'
  group 'root'
  mode 00755
  action :create
end

cookbook_file "/etc/profile.d/rbenv.sh" do
  source 'rbenv.sh'
  owner 'root'
  group 'root'
  mode 0644
end

# ruby-buildインストール
git '/usr/local/rbenv/plugins/ruby-build' do
  repository 'https://github.com/sstephenson/ruby-build.git'
  reference 'master'
  user 'root'
  group 'root'
  action :checkout
end

# ruby install
execute 'rbnev-install' do
  not_if 'source /etc/profile.d/rbenv.sh; rbenv versions | grep 2.2.2'
  command 'source /etc/profile.d/rbenv.sh; rbenv install 2.2.2'
end

# rubyバージョン設定
execute 'rbnev-global' do
  not_if 'source /etc/profile.d/rbenv.sh; rbenv global | grep 2.2.2'
  command 'source /etc/profile.d/rbenv.sh; rbenv global 2.2.2; rbenv rehash'
end
```
bashでファイルやディレクトリの存在確認方法まとめ

よく忘れるのでまとめ

パスが存在するか
`if [ -e ./test ]; then`

ファイルが存在するか
`if [ -f ./test ]; then`

ディレクトリが存在するか
`if [ -d ./test ]; then`

リンクが存在するか
`if [ -L ./test ]; then`

空ファイルではないか
`if [ -s ./test ]; then`

ファイルが書込可能か
`if [ -w ./test ]; then`

ファイルが実行可能か
`if [ -x ./test ]; then`
EC-CUBE3のデバッグモードはパラメーターではなくURLだった

# 結論）EC-CUBE3.0のデバッグモードはパラメーターではなくURL

2.13までのデバッグモードは、パラメーター管理からDEBUG＿MODEをtrueにしてしまえば、簡単にデバッグモードになっていたが、EC-CUBE3ではどうするのか？

パラメーター管理はないので、app/config/eccube/とかにあるのかと思って探してしまいますよね？  
実は、デバッグモードではなく、URLを変えることでデバッグモードになる！

### デバッグモードのURL

URLに、index_dev.php を加えるとできるようです。

通常） http://example.com/products/detail/2
だとしたら
デバッグモード） http://example.com/index_dev.php/products/detail/2

とすることでデバッグモードでのアクセスになります。

### IP制限もされている

このデバッグモード 安全のためにIP制限がされており、もしデバッグモードでのアクセスして

```
You are not allowed to access this file. Check index_dev.php for more information.
```
というようなエラーが表示された場合
自分がアクセスしているIPを

index_dev.php の$allow に自分のIPを追加すればOK

```php 
$allow = array(
    '127.0.0.1',
    'fe80::1',
    '::1',
    '追加するIP',
);
```

### デバッグモードでアクセスすると

 - Twigのキャッシュの影響が受けない
 - Symfonyのデバッガーで実行されているSQLやログを見る事ができる  

等、いろいろと出来そうです。
IdentityUser機能にユーザ情報を新たに追加する

「Add custom user claims here」の下に値を追記する。
※自動生成されるテーブル「AspUserInfo」？をカスタムしてUserに変更しています。それのEntityパーシャルして追記。

```lang:filename
    public partial class User : IUser<decimal>
    {
        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<User, decimal> manager, string authenticationType)
        {
            // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
            var userIdentity = await manager.CreateIdentityAsync(this, authenticationType);
            // Add custom user claims here
            userIdentity.AddClaim(new Claim(ClaimTypes.Email, "xxxxx@xxxx.xxx.xx"));
            return userIdentity;
        }
    }
```

取り出し方は

```lang:filename
var principal = HttpContext.Current.User as ClaimsPrincipal;
var email = principal.Claims.Where(x=> x.Type == ClaimTypes.Email).Value;
```

C#ってわかりずらいね。誰からも使われないようにするための戦略なんだろう。

ビバ！ユーザーアイデンティティ！！
コピーしたCentOS6系のVMがネットワークに接続できない

無償版のESXiではESXi間でのコピーがサポートされていません。
ですが、OVF形式で落としたり、scpコマンド等で移動させることができます。

CentOS6系でESXiの別ホストにVMを移動した場合、MACアドレスが異なる
NICが追加されるたびに　
`/etc/udev/rules.d/70-persistenet-net.rules`
へ別のエントリが追加されてしまい、同じNICとして認識されないために起きてしまう
現象です。

以下のように修正をすれば再認識するようになります。

1.ネットワークサービスの停止
　`service network stop`

2.70-persistenet-net.rulesの再作成
　70-persistenet-net.rulesを適当な名前に変更します。
 `mv /etc/udev/rules.d/70-persistent-**net**.rules /etc/udev/rules.d/70-persistent-**net**.rules_BAK`
　ネットワークサービスを再起動させると、70-persistenet-net.rulesが再作成
　されているので中身を確認します。
そこに記載されているMACアドレスを控えておきましょう。

3.ifcfg-eth*ファイルのMACアドレスの編集
　`/etc/sysconfig/network-scripts/ifcfg-eth*`
を編集し、古いMACアドレスを上で控えた新しいマックアドレスに
書き換えましょう。

その後もう一度ネットワークサービスを再起動すれば元通り
つながります。
MacとEmacs(24.5)でのRust学習環境作成

最近、ちょいとRustという言語が気になっているのでMac上に遊べる環境を作成してみたのでメモを残す。使用エディタはEmacs(今回は24.5)。
***
# Rust本体のインストール
軟弱なので
[Rustの公式ページ](https://www.rust-lang.org) 
ここからInstallをクリックして、Mac用のインストールパッケージをダウンロードしてインストールするだけ。これでRust単体で使えるようになるはず。

> 2016/5/31 追記
>> Ver1.9.0においてもMac用のインストールパッケージは署名されていないので、お使いのMacの設定システム環境設定のセキュリティからインストーラーの実行操作をする必要がある。

>> Ver1.9.0においても、以下の手順を元にで環境構築出来る事を確認済み。

# Emacsへのrust-modeの導入
これまた軟弱なので、

```el
M-x package-install
```
で`rust-mode`を選択してインストール。

# flycheck-rust（文法チェッカ）の導入
毎度おなじみ軟弱なので、`package-install`から`flycheck-rust`を選んで導入。もしflycheck自体を使ってなかった場合はflycheckの導入から。flymakeを使ってたりするのであればそちらでどうぞ。

# ここまでの確認

これでシンタックスハイライトとか文法されるようになる。試しに

```rust:test.rs
fn main(){
    println!("test");
}
```

とか打ち込んで、シンタックスハイライトを確認。flycheckのアラートはたまに馬鹿な時があるけど、まぁ気にしない(笑)

# quickrunの導入（未導入かつ必要なら）
結構いろんな言語に対応してくれているquickrun。ソース適当に書きながら切りの良い所で実行確認するのに便利。
軟弱なのでこいつも`package-install`から`quickrun`を選択して導入。
導入完了したら適当なソース（例えば上記のtest.rs)を書いて

```el
M-x quickrun
```

で実行結果が表示される（コンパイルエラーがあれば、エラーが表示される）。
これから学習してく所なので、スニペットレベルで実行出来ると色々捗りそう。


# racer（コード補完）の導入
racerは本体のコマンドと、Emacsから利用するElispの二系統に分かれる。

## 事前準備
利用にはRustのソースコードが必要なので
[Rustのダウンロードページ](https://www.rust-lang.org/install.html)
からソースのTarballをダウンロードして、適当な場所（今回は/usr/local/src/）に展開しておく。

## Rustのダウンロードとビルド
次に、[racerのサイト](https://github.com/phildawes/racer)からGitでracer本体のクローンを行う。今回は/usr/local/rust/にクローンした。

```bash
git clone https://github.com/phildawes/racer.git
```

Git使ってない人（はRust試そうと思わないか？）はZipダウンロードして展開してもよい。
ダウンロードが終わったら、当該ディレクトリに移動した後

```bash
cargo build --release
```
でビルドを行う。ビルドが完了したら、/usr/localあたりに丸ごとmvしておく（この辺は個々の環境の好みで調整してください）。

## 環境変数の設定
racerにrustのソースの場所を教えてあげるため、.bash_profileあたりに

```bash
export RUST_SRC_PATH=/usr/local/src/rustc-1.1.0/src
```
を追加して`source .bash_profile`で反映する。展開先が違う場合は適宜書き換えて下さい。

## elispの配置
僕はelispはまとめて配置したい人なので、.emacs.d/配下のディレクトリにracer/editors/emacs配下をracerという名前でフォルダ丸ごとコピーしました。load-pathが及ぶ場所なら、お好みで配置すれば良いと思います。

## init.elに環境系の設定追加
elispの配置が終わったら、以下のように設定を加えました(racer.elの配置場所には既にload-pathが通っている前提)。

```el
(setq racer-rust-src-path "/usr/local/src/rustc-1.1.0/src/")
(setq racer-cmd "/usr/local/racer/target/release/racer")
(eval-after-load "rust-mode" '(require 'racer))
```

こいつも配置場所によっては、適当にパスを変更して下さい。

## fook設定の追加
rustのソース開いた時に補完と定義ジャンプが有効になるように、以下の設定を追加。

```el
(add-hook 'rust-mode-hook 
  '(lambda () 
     (racer-activate)
     (local-set-key (kbd "M-.") #'racer-find-definition)
     (local-set-key (kbd "TAB") #'racer-complete-or-indent)))
```

これで補完と定義ジャンプが使えるようになったはず。

## ちょいと確認
拡張子.rsのファイルを開いて

```rust

use std::

```
と入力後にTABを押して、補完ウィンドウが出てくればOK。これでここまでの設定は概ね終了。

## ちょいと不便なとこ
racerで出てくる補完ウィンドウ、Ctrl系のカーソル移動が使えず、カーソルキーかマウスでの選択となっているようなので、ちょいと不便。。。
> コメントいただいたので加筆（ありがとうございます！）
>> 手元の環境では、M-n, M-p などで候補の選択ができます。多分、デフォルトのキーバインドだと思います。


# おしまい
ここまでで適当にRust学習しながら遊べる最低限の環境は出来たと思います。ひょっとしたらここで導入したelispの前提となっているものがあるかもしれませんが、その時はごめんなさい。
楽天APIサンプル「アフィリエイターのためのWeb APIプログラミング入門」のサンプルプログラムが動かない場合

<a href="http://www.amazon.co.jp/gp/product/4861007623/ref=as_li_tf_il?ie=UTF8&camp=247&creative=1211&creativeASIN=4861007623&linkCode=as2&tag=ka4k-22"><img border="0" src="http://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4861007623&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=ka4k-22" ></a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=ka4k-22&l=as2&o=9&a=4861007623" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
↑を読んだかた向けの情報です。

##Chaptor 5 p129の楽天ランキングAPIが動かない
→現在取得できるapiアドレスは変わってしまっているのと、ｘｍｌファイルも新しいツリー構造になってるみたいです。

以下のように修正したら動きました。

```php:rwsranking.php
<?php
require_once("apiconfig.php");
require_once("apifunc.php");
$url="https://app.rakuten.co.jp/services/api/IchibaItem/Ranking/20120927?format=xml&page=1&affiliateId=$rwsaffid&applicationId=$rwsdevid";//新リクエストURL
//http://api.rakuten.co.jp/rws/3.0/rest?developerId=$rwsdevid&operation=ItemRanking&version=2010-08-05&affiliateId=$rwsaffid  //旧リクエストURL
//echo $url;

$rwsBuff = file_get_contents($url);
//$rwsBuff = str_replace('header:Header','headerHeader',$rwsBuff);  //新バージョンのｘｍｌには不要な：が含まれてないのでこの処理は必要ない。
//$rwsBuff = str_replace('itemRanking:ItemRanking','itemRankingItemRanking',$rwsBuff);
$xml = simplexml_load_string ($rwsBuff);
$hits=$xml->Items->Item;//ここのアドレスも変えました
//$hits=$xml->Body->itemRankingItemRanking->Item; //旧アドレス

?>
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>chapter5 楽天商品ランキングAPI ランキング表示</title>
</head>

<body>
<h1>ランキング</h1>

<ol>
<?php foreach ($hits as $hit) { ?>
<li><a href="<?php echo h($hit->affiliateUrl); ?>"><?php echo h($hit->itemName); ?></a><br>
<?php echo h($hit->itemPrice); ?>円<br>
<a href="<?php echo h($hit->affiliateUrl); ?>"><img src="<?php echo h($hit->mediumImageUrls->imageUrl); ?>" style="float:left;margin:10px;"></a><!--<?php echo h($hit->itemCaption); ?>--><br>
<br style="clear:both;"></li>
<?php } ?>
</ol>

</body>
</html>
```
StreamAPIでだいたいList順に並行処理をしていく

### List#parallelStream はList順に処理されるわけではない

```java
List<Integer> list = IntStream.range(0, 100)
        .mapToObj(Integer::valueOf)
        .collect(Collectors.toList());

System.out.println("順番にならない");
list.parallelStream().forEach(System.out::println);
```

順番あるから、先頭から並列処理に投入されるかなと思ってたんですが、そうはならず結構飛び飛びで処理される形になります。

### Listの先頭から並行処理に投入する

```java
List<Integer> list = IntStream.range(0, 100)
        .mapToObj(Integer::valueOf)
        .collect(Collectors.toList());

System.out.println("だいたい順番になる");
list.stream().forEach(i -> {
    ForkJoinPool.commonPool().execute(() -> System.out.println(i));
});
ForkJoinPool.commonPool().awaitQuiescence(1, TimeUnit.MINUTES);
```

これでも結局commonPool次第なので、完全に順番通りにはならないし飛んだりしますが、それでもわりと順に動いてくれます。
毎回スレッド作るとかやるので、parallelStreamよりコストは高くなってしまいますが。

地味にやらかしてしまったので備忘録として……
NetBeansでのlog4j2.xmlファイルの置き場所

[log4j2](http://logging.apache.org/log4j/2.x/)を使ってみようと思いlog4j2.xmlファイルの設定まで行ったが起動時に

**ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.**

と出てlog4j2.xmlファイルを読み込んでくれない。
どこへ置けばいいか悩んだ末にソースディレクトリ直下へ置いたら読み込んでくれた。
でも気持ち悪いので他の場所から読み込むようにしたい・・・・。
git.ioで短縮URLを作成する

[git.io](http://git.io)では、`https://git.io/foo`などのような短縮URLを作成できます。以下の様なコマンドでURLと`foo`の部分に来る文字列を指定します。

```bash:
$ curl -i http://git.io -F "url=https://github.com/syui" -F "code=syui"
```

これで`http://git.io/syui`にアクセスすると、`https://github.com/syui`に飛ばされるようになります。

参考

http://git.io

https://github.com/blog/985-git-io-github-url-shortener

```bash:
$ curl -i http://git.io -F "url=https://github.com/..."
HTTP/1.1 201 Created
Location: http://git.io/abc123

$ curl -i http://git.io/abc123
HTTP/1.1 302 Found
Location: https://github.com/...

$ curl -i http://git.io -F "url=https://github.com/technoweenie" \
    -F "code=t"
HTTP/1.1 201 Created
Location: http://git.io/t
```
Android SDK Toolsからadbコマンドをインストールする方法

ArchLinuxの場合は、以下のコマンドでOKです。

```bash:
$ yaourt -S android-sdk-platform-tools
```

https://wiki.archlinux.org/index.php/Android

Macの場合は、`Homebrew`にパッケージはあるのだろうか。`brew search`で検索してみてください。

http://developer.android.com/sdk/index.html

```bash:
$ curl -O http://dl.google.com/android/android-sdk_r24.3.3-macosx.zip

$ if [ `openssl sha1 android-sdk_r24.3.3-macosx.zip | cut -d '=' -f 2` = 41f0f3e76d6868018740e654aefb04fd765c357d ] ;then;echo ok;fi
ok

$ unzip android-sdk_r24.3.3-macosx.zip

$ mv android-sdk-macosx ~/Applications/

$ ~/Applications/android-sdk-macosx/tools/android

# ~/.${SHELL##*/}rcに追記しましょう
$ export ANDROID_HOME=$HOME/Applications/android-sdk-macosx
$ export PATH=${PATH}:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools

# 追記後は読み込みます
$ source ~/.${SHELL##*/}rc
```

ここで、Android SDK Platform Toolsをインストールします。

`android-sdk-macosx/platform-tools/`以下に`adb`コマンドなど各種がインストールされます。

```bash:
$ which adb
~/Applications/android-sdk-macosx/platform-tools/adb
```
Meteor 開発者が知っておきたい REPL の使い方(meteor shell)


Meteor には REPL(Read-Eval-Print-Loop:対話型実行環境) が標準で付いています(v1.0.2以降)。
Meteor サーバー側の変数やコレクションの内容を確認したり、ドキュメント操作したり、コードをサクッと試したい時に役立ちます。

# Meteor REPL (shell) 基本操作

## REPLの起動

Meteor アプリケーションが起動している状態で、別のターミナルウィンドウを開いて、Meteor プロジェクトのディレクトリ内で以下のコマンドを実行すると REPL が起動します。

```bash:bash$
meteor shell
```

```bash:実行結果
Welcome to the server-side interactive shell!

Tab completion is enabled for global variables.

Type .reload to restart the server and the shell.
Type .exit to disconnect from the server and leave the shell.
Type .help for additional help.

>
```

## REPLの終了

```bash:>
.exit
```

## Meteor 再起動(reload)

```bash:>
.reload
```

## ヘルプ表示

```bash:>
.help
```

```bash:実行結果
.break  Terminate current command input and display new prompt
.clear  Alias for .break
.exit   Disconnect from server and leave shell
.help   Show this help information
.load   Load JS from a file into the REPL session
.reload Restart the server and the shell
.save   Save all evaluated commands in this REPL session to a file
```

## いろいろ試してみる

```bash:環境の確認
> Meteor.isServer
true

> Meteor.isClient
false

> process.env.ROOT_URL
'http://localhost:3000/'
```

```bash:ドキュメント操作例
### Mongoコレクションの作成
> Articles = new Mongo.Collection("articles")
{ _makeNewID: [Function],
  _transform: null,
  ...
  trackable: [Function] }}
  
### ドキュメントの追加
> Articles.insert({title: "Hello, World!", content: "This is example!"})
'3LjiwRMKjEnCDB9FQ'

### ドキュメント数取得
> Articles.find().count()
1

### ドキュメントの取得
> var article = Articles.findOne()
> article
{ _id: '3LjiwRMKjEnCDB9FQ',
  title: 'Hello, World!',
  content: 'This is example!' }

### ドキュメントの更新
> Articles.update({_id: article._id}, {$set: {title: "Hello, Meteor!"}})
1

> var article2 = Articles.findOne(article._id)
> article2
{ _id: '3LjiwRMKjEnCDB9FQ',
  title: 'Hello, Meteor!',
  content: 'This is example!' }
  
### ドキュメントの削除
> Articles.remove(article2._id)
1
> Articles.count()
0

```

便利ですね。

# Q&A

## Q1. クライアントサイドで REPL を起動するには？

A1. ブラウザで Meteor アプリケーションにアクセスし、「要素の検証」でWebインスペクタを起動してください。
WebインスペクタがREPLの役割を持っています。

## Q2. meteor shell を実行したら「Server unavailable (waiting to reconnect)」とでます

A2. Meteor アプリケーションに meteor shell が接続できていない状態です。
別のターミナルウィンドウを開いて meteor アプリケーションを起動してください。

```bash:bash$
# ターミナル1: Meteor アプリケーション起動
meteor

# ターミナル2: (別のターミナルウィンドウで) REPL 起動
meteor shell
```

# 参考

- [Meteor 1.0.2: Meteor shell, faster tool performance](http://info.meteor.com/blog/meteor-102-meteor-shell)
ログローテート logrotate メモ

## 手がかり

http://server-setting.info/centos/loglotation.html

yum install logrotate

awsか、yumでインストールしたものは自動的に logrotate の設定をしてくれてるのかな。

## やったことまとめ

/www 下の (アプリフォルダ)/log/*.log ファイルについて
1日ごと変わり、で30日間残すログローテートを設定した。

## 基本設定

グローバルな設定
/etc/logrotate.conf

個別設定
/etc/logrotate.d

```
[XXX logrotate.d]# cat httpd
/var/log/httpd/*log {
missingok
notifempty
sharedscripts
delaycompress
postrotate
/sbin/service httpd reload > /dev/null 2>/dev/null || true
endscript
}
```

以下を追加設定しとく

```
daily
dateext
compress
rotate 30
```

実行できるか確認してみる。

```
logrotate -dv ./httpd
```

+ -d : デバッグ実行、実行したらどうなるか試してくれる
+ -v 詳細表示

全体実行は
```
/usr/sbin/logrotate /etc/logrotate.conf
```

## 自動実行してるのか？確認

```
cat /var/lib/logrotate.status
```

各項目がいつローテートされたかこれでわかる。

## cronに設定されているか？

```
/etc/cron.daily
[XXX cron.daily]# cat logrotate
#!/bin/sh
(略)
/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
(略)
```
cronに設定されてると判断。
Android Studioで"Filesystem Case-Sensitivity Mismatch"エラーを回避する


# "Filesystem Case-Sensitivity Mismatch"

Android Studioを入れると、"Filesystem Case-Sensitivity Mismatch"というエラーが出た。

デフォルトと違って、HFS+で大文字小文字を区別する設定にしているからだろう。

## 回避方法はわかったのだけど
エラーのリンクをたどると、解決方法は書かれている。
idea.propertiesにidea.case.sensitive.fs=trueを設定してやるといいらしい。

Configuring Android Studio: IDE & VM Options, JDK, etc - Android Tools Project Site
http://tools.android.com/tech-docs/configuration

##が、それはどこから開くのか？

GUIな設定には、そらしい項目はなさそう。
*~/Library/Preferences/AndroidStudio1.3/* の下には *idea.properties* がない。
*~/Library/Preferences/AndroidStudio/* にもない。

ファイル作って置けばいいかなと思ったのだけど、テンプレが用紙されていた。
ここから落として来て置けばいいのかな？
[tools.android.com/tech-docs/configuration/mac-idea.properties?attredirects=0&d=1](http://tools.android.com/tech-docs/configuration/mac-idea.properties?attredirects=0&d=1)

置いてみる。
```
$ mv ~/Downloads/mac-idea.properties ~/Library/Preferences/AndroidStudio1.3/idea.properties
$ vi ~/Library/Preferences/AndroidStudio1.3/idea.properties
```
```
idea.popup.weight=heavy
idea.dynamic.classpath=false
swing.bufferPerWindow=false
CVS_PASSFILE=~/.cvspass
idea.smooth.progress=false
idea.max.intellisense.filesize=2500
idea.xdebug.key=-Xdebug
apple.awt.fullscreencapturealldisplays=false
idea.cycle.buffer.size=1024
com.apple.mrj.application.live-resize=false
java.endorsed.dirs=
sun.java2d.noddraw=true
sun.java2d.pmoffscreen=false
idea.use.default.antialiasing.in.editor=false
idea.fatal.error.notification=disabled
apple.awt.graphics.UseQuartz=true
idea.no.launcher=false
sun.java2d.d3d=false
apple.laf.useScreenMenuBar=true
idea.case.sensitive.fs=true```

Android Studioを起動しても、エラーがでなくなった。
めでたしめでたし。
terraformで複数のvpc_subnetを一つにまとめる



```main.tf
resource "aws_vpc" "main" {
    cidr_block = "${var.main_cidr}"
    enable_dns_hostnames = true
}
resource "aws_subnet" "main" {
    vpc_id = "${aws_vpc.main.id}"
    cidr_block = "${var.main_subnet.cidrs[count.index]}"
    availability_zone = "${var.main_subnet.availability_zones[count.index]}"
    map_public_ip_on_launch = true
    count = "${length(var.main_subnet.cidrs)}"
}
variable "main_cidr" {
    description = "AWS vpc main cidr"
}
variable "main_subnet_cidrs" {
    type = "list"
}
variable "main_subnet_availability_zones" {
    type = "list"
}
```

```terraform.tfvars
main_cidr = "172.17.0.0/16"
main_subnet.cidrs = ["172.17.0.0/20","172.17.16.0/20"]
main_subnet.availability_zones = ["us-east-1b","us-east-1e"]
```

これでvpc_subnetを参照するようなときに一つの値で記述できます。

```
# aws_elbのsubnetsとか
 subnets = ["${aws_subnet.main.*.id}"]
# autoscaling_groupのvpc_zone_identifierとか
 vpc_zone_identifier = ["${aws_subnet.main.*.id}"]
# countを使ったインスタンスのsubnetを交互に選択させるとか
  subnet_id = "${element(aws_subnet.main.*.id, count.index%length(aws_subnet.main.*.id))}"
```
Rubyでのメモリ使用量調査

# このオブジェクトがどれ程のバイト数使っているか知りたい

Ruby でラインメモリプロファイラ
http://qiita.com/sonots/items/c14b3e3ca8e6f7dfb651
http://docs.ruby-lang.org/ja/2.2.0/method/ObjectSpace/m/memsize_of.html

```
ObjectSpace.memsize_of(obj)
```
を使えばとれるのか。
しかし obj が Hash の場合、データ数が同じだと中のオブジェクトが異なるけど同じバイト数が出ている…？

→参照先のオブジェクトのバイト数は見に行っていないのかなと推測。

# じゃあ今の全てのオブジェクトのバイト数がわかるか？

http://docs.ruby-lang.org/ja/2.0.0/method/ObjectSpace/m/memsize_of_all.html
```
ObjectSpace.memsize_of_all
```
であっさり取れる。
直前に GC.start できればある程度正確になるかと。
Chrome印刷時のヘッダ・フッタってオンオフしか無いの？

# Chrome印刷時のヘッダ・フッタってオンオフしか無いの？

…って、タイトルのママです…

フッタ情報の編集がしたいだけなんですが…

https://productforums.google.com/forum/#!topic/chrome/3KYcXfRIQ74
Windows 標準の ISOBURN.EXE で ISO ファイルをディスクに書き込む

# 環境

- Windows 10 Pro x64

# コマンド

```
ISOBURN.EXE /Q I: "Windows 10 Pro x64.iso"
```

# 使用法

![howtouse.png](https://qiita-image-store.s3.amazonaws.com/0/58889/cee10cb3-08fb-6cf0-1c58-c8d11ec69bc6.png)

# 書き込み中イメージ

![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/58889/b1e7f046-930f-299c-7568-bc71c07eb2a2.png)
Unity入門メモ     キャラとかバーとか上下左右に移動したいコード

![スクリーンショット 2015-08-07 15.52.42.png](https://qiita-image-store.s3.amazonaws.com/0/76843/41098368-88e1-596f-c2e2-9f0f709d3655.png)


Unity入門してる方、一緒にがんばりましょ〜

Vector3型の移動する力作って、AddForce！


```csharp:sample

using UnityEngine;

public class BarController : MonoBehaviour {

	// 動くスピード
	public float speed;
	

	// Update同様、毎フレーム呼ばれる（物理演算が更新されるタイミング)
	void FixedUpdate(){

		// 水平方向のキー入力取得
		float hForce = Input.GetAxis("Horizontal");
		
		// 垂直方向のキー入力取得
		float vForce = Input.GetAxis("Vertical");

		// 動く力生成
		Vector3 moveForce = new Vector3(hForce,  0, vForce) * speed;

		// 力を加える 
		GetComponent<Rigidbody>().AddForce(moveForce);

	}
}

```
Emacsを使いこなす(1) - Emacsをソースからビルドする


## 背景

emacs23とemacs24では結構違う部分も多いのですが、apt-getやyumで入れたりするとemacs23が入ってしまいます。そこで、emacsをソースからビルドします。


## 最初に

emacsをビルドするために必要な gcc, make などをインストールします。とりあえずyumでのインストール方法だけ載せておきます。

```shell
sudo yum -y install gcc make ncurses-devel 
```

Macはdeveloper toolsを入れておけば問題ないような気がします。ubuntuの場合は、apt-getで↑と似たような名前のパッケージが配布されていると思います。またubuntuでやったら追記したいと思います。


## ビルドしたいバージョンのemacsを探す

http://ftp.jaist.ac.jp/pub/GNU/emacs/ から、ビルドしたい emacs のバージョンのtar.gzを探します。今回は24.3だとします。


## ダウンロードしてビルドする

emacs 24.3 のURLは http://ftp.jaist.ac.jp/pub/GNU/emacs/emacs-24.3.tar.gz  なので、これをダウンロードして解凍してビルドします。

```shell
$ wget http://ftp.jaist.ac.jp/pub/GNU/emacs/emacs-24.3.tar.gz 
$ tar xvf emacs-24.3.tar.gz 
$ cd emacs-24.3 
$ ./configure 
$ sudo make
$ sudo make install
```


## path を通す

古いemacsが存在していたりすると、pathが通らなかったりするのでpathを通します。

```shell
$ emacs --version
GNU Emacs 23.1

$ which emacs
/usr/bin/emacs
sudo rm /usr/bin/emacs

$ sudo ln -s /usr/local/bin/emacs-24.3 /usr/bin/emacs
```


## おわりに

とりあえず最初はemacsの最新版を入れる方法について書きました。これから、Emacsの操作方法やプラグインなどについてまとめていき、これを読んでいくとEmacsが使いこなせるような、そんなドキュメントを書いていきたいと思います。（ついでに自分のEmacsの勉強になればと思っています）
Microsoft EdgeのHTML5 videoを検証してみた

Microsoft Edge の HTML5 video を検証しました。

# 結論
no plugin での HTML5 video をネイティブサポート

# 細かくみると
- FlashなどのpluginなしでHLSとMPEG-DASHの再生をネイティブサポート
- Media Source Extensions (MSE)もネイティブサポート
- Encrypted Media Extensions (EME) and Common Encryption (CENC) もネイティブサポート

つまり、DASH EME / PlayReady によるpluginなしの次世代DRMに対応

# 検証環境
- Windows 10 Pro - 64 bit
- Microsoft Edge - 20.10240.16384.0
GR-SAKURAのローカル開発環境を整える

[GR-SAKURA][link-1]のローカル環境をMac上（OS X Yosemite 10.10）に構築したので作業ログをまとめておきます。

[こちら][link-2]や[こちら][link-3]を参考にさせて頂きました。
ほぼほぼ参考サイト通りでしたが、現行の[クラウドWebコンパイラ][link-4]とはソフトウェアのバージョンが違っていたりした程度の差異がありました。

# 前準備

Xcodeをインストールしておきましょう。

homebrewの諸々をアップデートしておきます。

```lang:sh
$ brew doctor
$ brew update
$ brew upgrade
```

# 必要なソフトウェアのインストール

以下のソフトウェアが必要なのでhomebrewでインストールします。

* mpfr
* gmp
* libmpc
* libelf texinfo
* gcc (今回はgcc5を選択)

```lang:sh
brew install mpfr gmp libmpc libelf texinfo
brew install homebrew/versions/gcc5
```

# [KPIT][link-5]からソースコードを取得する

FreeDownloadsのSource Codeから以下をダウンロードする。

* GDBRX v14.03 Source Code of GDB
* GNURX v14.03 Source Code of GCC
* GNURX v14.03 Source Code of Newlib
* GNURX v14.03 Source Code of Binutils

ダウンロードしたら、解凍しておきましょう。

```lang:sh
$ tar -jxvf (ファイル名)
```

# インストール先の準備

インストール先を用意しておく。
（自分はホームディレクトリに.KPIT_GNU_Toolsというディレクトリを作りました。）

.bash_profileにパスを追記

```lang:vim
export PATH=$PATH:(インストール先)/bin
```

.bash_profileを読み込み直しておきます。

```lang:sh
$ source ~/.bash_profile
```

# binutilsのインストール

rx-elf用にビルドします。

```lang:sh
$ cd binutils-2.24
$ ./configure -target=rx-elf -prefix=(インストール先) -disable-werror CC=gcc-5
$ make
$ make install
```

# gccのインストール

rx-elf用にビルドします。
参考サイトにもあるように、やはりmakefileのある場所でビルドするとエラーになるので別のディレクトリを用意して作業します。また、newlibを一部使うのでシンボリックリンクを貼っておきます。

現行の[クラウドWebコンパイラ][link-4]のmakefile内のライブラリのリンク先パスを合わせるために「--enable-multilib」を指定しておきます。

```lang.sh
cd ../gcc-4.8.3
mkdir build
ln -s ../newlib-2.1.0/newlib
ln -s ../newlib-2.1.0/libgloss
cd build
../configure --prefix=(インストール先) --target=rx-elf --enable-languages=c,c++ --disable-libstdcxx-pch --enable-multilib --with-newlib --disable-nls --disable-libgfortran --with-gmp=/usr/local --with-mpfr=/usr/local --with-mpc=/usr/local
make
make install
```

# newlibのインストール

rx-elf用にビルドします。

```lang:sh
cd ../../newlib-2.1.0
./configure --enable-newlib-hw-fp --target=rx-elf --prefix=(インストール先)
make
make install
```

# gdbのインストール

rx-elf用にビルドします。

```lang:sh
cd ../gdb-7.7.1
./configure --prefix=(インストール先) --target=rx-elf --disable-werror
make
make install
```

# ローカルビルドをしてみる

[クラウドWebコンパイラ][link-4]の左側にあるエクスプローラのファイルを全てツリー構成そのままにダウンロードしてきます。

makefileの「GNU_PATH := ～」という行があるので、rx-elf用に各種ソフトウェアをビルドした際のインストール先(prefixに指定したパス）を記載してください。

その後、makeコマンドを実行すればビルドが通ると思います。
上手くビルドできれば「sketch.bin」が出来ます。
GR-SAKURAへ転送して動作確認してください。

# 参考サイト

* [GR-SAKURA - がじぇっとるねさす][link-1]
* [Mac OS X上にGR-Sakuraのローカルビルド環境を構築 - La Strada][link-2]
* [GR-SAKURAでmrubyを使う - Qiita][link-3]
* [クラウドWebコンパイラ - がじぇっとるねさす][link-4]
* [KPIT GNU Tools][link-5]

[link-1]:http://japan.renesas.com/products/promotion/gr/overview/index.jsp#board "GR-SAKURA - がじぇっとるねさす"
[link-2]:http://d.hatena.ne.jp/futoshi0417/20131025#1382722024 "Mac OS X上にGR-Sakuraのローカルビルド環境を構築 - La Strada"
[link-3]:http://qiita.com/jjzak/items/8e9d9d98370181aa97fa "GR-SAKURAでmrubyを使う - Qiita"
[link-4]:http://japan.renesas.com/products/promotion/gr/overview/index.jsp#cloud "クラウドWebコンパイラ - がじぇっとるねさす"
[link-5]:http://www.kpitgnutools.com/ "KPIT GNU Tools"