OmniAICreator/Qiita-1.07M huggingface dataset:
Rspec3.1のbefore,afterフックが実行されるタイミング

rspecの実行時にbefore、afterフックが実行されるタイミングがわからずにハマったので調べてみました。

## フックの種類
`:example`,`:context`,`:suite`の三種類。


## :example

デフォルトはこちら。各exampleごとに毎回実行
:eachのエイリアス。

### 実際に試してみる

```rb
require 'rails_helper'

RSpec.describe "フックの実行タイミングを調べる" do
  before :example do
    puts 'before実行'
  end

  after :example do
    puts 'after実行'
  end

  it "実行１" do
    puts 'example1'
  end

  it "実行２" do
    puts 'example2'
  end

  it "実行３" do
    puts 'example3'
  end
end


```

実行結果
わかりやすくするため、テスト結果の出力は省略しています。

```
フックの実行タイミングを調べる
before実行
  example1
after実行
before実行
  example2
after実行
before実行
  example3
after実行
```

exampleごとにbeforeとafterが呼ばれている。

## :context

describe、contextのグループごとに毎回実行 
:allのエイリアス。

### 実際に試してみる
```rb
require 'rails_helper'

RSpec.describe "フックの実行タイミングを調べる" do
  context "context" do
    before(:context) do
      puts "before実行"
    end

    after(:context) do
      puts "after実行"
    end
    
    it "実行１" do
      puts '  example1'
    end

    it "実行２" do
      puts '  example2'
    end
    
    it "実行３" do
      puts '  example3'
    end
  end
end

```
実行結果

```
フックの実行タイミングを調べる
  context
before実行
  example1
  example2
  example3
after実行
```
contextの開始直後、終了直前で呼ばれているのがわかる。
グループ全体で使う初期値の設定などはここで行うのが良さそう。

## :suite

rspecの実行時に一度だけ実行
Rspecのconfigurationに記述する。

### 実際に試してみる
```rb
require 'rails_helper'

RSpec.describe "フックの実行タイミングを調べる" do
  RSpec.configure do |config|
    config.before(:suite) do
      puts "before実行"
    end

    config.after(:suite) do
      puts "after実行"
    end
  end

  it "実行１" do
    puts '  example1'
  end

  it "実行２" do
    puts '  example2'
  end
  it "実行３" do
    puts '  example2'
  end
end


```

実行結果

```
before実行

フックの実行タイミングを調べる
  example1
  example2
  example2
after実行
```
:suiteのみRSpecのconfigurationに記述する
そのためrails_helper.rbやspec_helper.rbにも記述することができる。
specの実行前にbefore、終了後にafterが実行されているのがわかる。

## 全部いっぺんにやってみる
それぞれ同時に設定することができ、その場合の実行順は

```
before :suite
before :context
before :example
after  :example
after  :context
after  :suite
```
となる

### 実際に試してみる
```RSpec
require 'rails_helper'

RSpec.describe "フックの実行タイミングを調べる" do
  RSpec.configure do |config|
    config.before(:suite) do
      puts "before suite"
    end

    config.after(:suite) do
      puts "after suite"
    end
  end

  before(:example) do
    puts "before example"
  end

  after(:example) do
    puts "after example"
  end

  context "context1" do
    before(:context) do
      puts "before context"
    end

    after(:context) do
      puts "after context"
    end

    it "実行１" do
      puts '  example1'
    end

    it "実行２" do
      puts '  example2'
    end

    it "実行３" do
      puts '  example3'
    end
  end
end

```

実行結果

```
before suite

フックの実行タイミングを調べる
  context1
before context
before example
  example1
after example
    実行１
before example
  example2
after example
    実行２
before example
  example3
after example
    実行３
after context
after suite
```

before :suite
before :context
before :example
after  :example
after  :context
after  :suite

の順に呼ばれていますね！

### 参考
https://www.relishapp.com/rspec/rspec-core/v/3-1/docs/hooks/before-and-after-hooks
[MySQL]ユニークキーの衝突によってエラーが吐かれるのを回避する

異なるトランザクション内でuniqueなキーのカラムが追加された時、それと同じキーのカラムを追加出来ない問題への対応です。

例えば、以下のような処理が行われたとします。

|User||
|---|---|
|id|primary key|
|name|unique|


|A (set autocommit=0;)|B (set autocommit=0;)|
|---|---|
|insert into user values(1,"noppe")||
||insert into user values(1,"noppe") **WAIT**|
|commit;||
||deplicete key error|

このような場合、ユニークキーがあるならinsert/ないならupdateすることでエラーを回避出来ます。

```mysql
insert into user values(1,"force") on duplicate key update name = "force";
```

on deplicate key update ~ 
は手前のinsertがユニークキーの衝突によって失敗した時に構文以降(~の部分)の条件でupdateをかけるコマンドです。


上記の構文の場合、1,"force"のinsertに失敗した場合に1のidをforceに変えるということになります。
指定しないカラムについては以前の情報が利用されます。
JSからJSにリダイレクト風

ゆるふわ開発でJavaScriptをビルドするたびサーバに上げて検証してたけど面倒になった。

* サーバのドメインで動かしたい
* htmlは変えたくない
* サーバの挙動(リダイレクト設定など)を変えるのは気が引ける
* 自動化めんどい

で、JSからJSへのリダイレクトっぽいことできないかと思ってたら案外簡単にできたのでメモ。

document.writeでスクリプトタグを挿入すると、その場でscriptタグを読みに行って実行してくれる。
これを利用してJSのリダイレクトっぽいことができる。

サーバにおいたapp.jsを読むふりしてローカルのapp.js読ませる例。

Before

```html:www.yourserver.com/index.html
...
<script src="app.js"></script>
...
```

```js:www.yourserver.com/app.js
console.log('hello!');
...
```

![before.png](https://qiita-image-store.s3.amazonaws.com/0/60243/947d085f-e69e-fe20-4af3-92a3d04303ad.png)


After

```html:www.yourserver.com/index.html
...
<script src="app.js"></script>
...
```

```js:www.yourserver.com/app.js
document.write('<script src="http://yourpc/app.js"></script>');
```

```js:yourpc/app.js
console.log('hello!');
...
```

![after.png](https://qiita-image-store.s3.amazonaws.com/0/60243/f3156f28-70d4-9da1-3f3a-0a083a425fe8.png)


二段読込み中ブロッキングしっぱなしで遅いので、あくまで一時的な利用に留めよう。
Rの関数を%>%でつなげるsyntax sugar

# Context
* Rでdplyrなどを使いデータ処理を行う際に、%>%でつなげて文字列の置換でgsub関数を使おうとすると引数の順番がアレなので使いにくい。
* %>% でつなげられるようにsyntax sugarをかませる。

# コード
```r
library(dplyr)

# 名前空間を整理するために、関数名をモジュールライクに定義する。
Utils.gsub <- function(str,target,replace){ gsub(target,replace,str) }

x <- "hoge"
y <- x %>% Utils.gsub("h","b")   # => "boge"
```

# 課題
* 同じような形でsyntax sugarにすることで使いやすくなる関数は多いはず。
* 些細なネタではあるものの、ソースコードの可読性を高める（カッコの対応が読みにくい！）には意外と効果がある。
* 追加次第編集予定（？）。
【oracle】負荷の高いクエリ調査&デッドロックの解除方法

oracleの負荷が高いときに原因となっているクエリや
デッドロックしているクエリを見つけ対応する方法です。

# 負荷の高いクエリ調査
```
select 
a.sid,a.serial#,a.sql_hash_value, a.sql_address,a.machine,a.username,a.event,
b.sql_text, b.elapsed_time,b.executions,b.disk_reads,b.cpu_time,
b.OPTIMIZER_COST,b.BUFFER_GETS,b.ROWS_PROCESSED
from v$session a,v$sql b
where a.sql_address = b.address
and a.sql_hash_value = b.hash_value
and a.status = 'ACTIVE'
order by b.elapsed_time desc;
```
# デッドロックしているクエリの調査
```
SELECT SID, SERIAL# FROM V$SESSION
WHERE SID IN (SELECT SID FROM V$LOCK WHERE TYPE IN ('TM','TX'));
```
# 解除方法
```
alter system kill session 'sid, serial#' immediate;
例）alter system kill session '103, 42957' immediate;
```
RaspberryPiをWPA2-EAPのID,PASSWORDが必要なwifiに接続

#参考URL
http://yamaryu0508.hatenablog.com/entry/2014/08/15/001312
http://www.haljion.net/index.php/2013-04-16-03-51-44/59-2013-04-12-08-16-40/2015-03-26-06-32-38/raspberrypi/288-2014-06-18-09-58-32
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/982wpasupplicant.html

#環境
Raspberry Pi 2 Model B

#流れ
1.interfaceの編集
参考URLと同じ
2.wifiパスワードの暗号化
資料がたくさんあります
3.wpa_supplicant.confの編集
参考URLの集めた感じ

#interfaceファイルの編集
ファイルの場所とコマンド

```
$ sudo vi /etc/network/interfaces
```

iface eth0 inet manual
↓変更
iface eth0 inet dhcp

wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
↓変更
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
(参考URLにはあったが，今回自分のでは変更の必要はなかった)

追加
iface default inet dhcp

修正後のファイル全体

```interfaces
auto lo
iface lo inet loopback

iface eth0 inet dhcp

allow-hotplug wlan0
iface wlan0 inet dhcp
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

iface default inet dhcp

allow-hotplug wlan1
iface wlan1 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
```

#パスワード暗号化
暗号化のコマンド

```
wpa_passphrase SSID パスフレーズ
```

例えばSSIDが「my-wifi」でパスワードが「12345678」
パスワードは8文字以上

```
wpa_passphrase my-wifi 12345678
```

結果は

```
network={
	ssid="my-wifi"
	#psk="12345678"
	psk=0b01234a240ba..........(省略)
}
```

と出力されます
これをのちのち使うのでコピーし，メモ帳などに残しておきます

#wpa_supplicant.confの編集
ファイルの場所とコマンド

```
$ sudo vi /etc/wpa_supplicant/wpa_supplicant.conf
```

追加
network={
	ssid="my-wifi"
	key_mgmt=WPA-EAP
	identity="myid"
	psk="0b01234a240ba..........(省略)"
}

先ほどコピーしたものに「key_mgmt」と「identity」を追加してます
identityの方はIDなので自分のIDに変えてください

修正後のファイル全体

```wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
	ssid="my-wifi"
    key_mgmt=WPA-EAP
    identity="myid"
    psk="0b01234a240ba..........(省略)"
}
```

これでつながりました！
最悪パスワードが見えてもいいならばpsk=のところを直接編集しちゃってもいいと思います
webpackでTypeScriptからコンパイルしたJavaScriptの関数をうまく呼び出せない。

## 事象
Webpackを利用して、TypeScriptをコンパイル。
その生成物を利用しようとしたら、未定義でエラーになった話。

### 動かなかったコード

```html
<body>
    <div class="ready" onclick="test();"></div>
    <script type="text/javascript" src="test.js"></script>
</body>
```

```
function test() {
    alert("click");
}
```

typescriptはwebpackを利用して、JavaScriptにコンパイルしています。

`testは定義されていないというエラー`

えええっと思って調べると、webpackはグローバルスコープをなるべく露出させないみたい。

http://stackoverflow.com/questions/35781579/basic-webpack-not-working-for-button-click-function-uncaught-reference-error

```
window.test  
=> undefined
```

なるほど～。

### 改善したコード

TypeScriptを以下のように改良したらちゃんと動くように。

```
function test(){
    alert("click");
}

//グローバルスコープに露出させる。
window.test = test

```

```
window.test
=>
    function test() {
	    alert("click");
	}
```

結構詰まってしまいました。
VirtualBox で Ubuntu 16.04 LTS のインストールが始まらないとき

<img width="387" alt="スクリーンショット 2016-04-22 12.44.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/47993/807829ee-0b37-82a6-854a-d3e34ab8b586.png">

＊Ubuntu 16.04 は関係ないような気もしていますが、念のため。

仮想マシンの構成を済ませて、起動しようと思ったらこのザマです。
`VERR_VMM_SMAP_BUT_AC_CLEAR` このエラーメッセージが出ていたら、
以下が参考になるかもしれません。
http://qiita.com/medaka5/items/d70751a562a5604c2115

先の投稿は、vagrant を動かそうとした場合に出たエラーに対する
対応のようでしたが、他のケースでも同様の対応が有効なようです。

# 環境
＊エラーの発生した環境です

- Mac OS X EL Capitan 10.11.3
- VirtualBox 5.0.2

# 解消方法
先の引用記事のとおりですが、VirtualBox を、
古いバージョン (4.x 系の最終バージョン) に戻すことで状態は改善されました。
ダウンロードは以下からどうぞ。
https://www.virtualbox.org/wiki/Download_Old_Builds_4_3

なお、VirtualBox の本日現在の最新バージョンは 5.0.16 だったため、
最新版を適用することでも、エラーを回避することができるかもしれません。
(すみません、試してません。)

無事にセットアップが始まりました！

<img width="1030" alt="スクリーンショット 2016-04-22 17.14.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/47993/aef2b03d-de25-fb36-d17d-ef740df4d085.png">
環境変数の設定方法　開発環境/本番環境(Heroku)　[ 自分用メモ ]

参考サイト
http://qiita.com/satomyumi/items/18db3c97734f32ebdfde
http://qiita.com/cjeecsiy/items/aa855278c923790ea451

開発環境
export SENDGRID_PASSWORD="hogehogehoge"

本番環境(Heroku)
heroku config:set PUSHER_KEY="hogehogehoge"

viewでの使い方
例)
pusher = new Pusher(ENV['PUSHER_KEY']);
[MySQL]シャーディングしているDBでidを一意に振る

データベースを分割（シャーディング）する際にauto_incrementするようにしているとidが重複する問題があります。

例えば、`id = 120`まで振られたDBを'id= 60'を境に２つに分割した場合

||A|B|
|---|---|---|
|現状で一番大きなid|60|120|
|auto_incrementによって付与される次のid|61|121|

のようにidが振られます。
ここでAがauto_incrementによって61を付与されようとしていますが、これはBが保有する61~120までのidと重複します。

このような場合、auto_incrementを使わずにid用のテーブルを用意する事で重複を回避することが出来ます。

`create table seq_log (id bigint(20) unsigned not null)engine=MyISAM;`

このようなテーブルを作り、**同一のトランザクション内**で

```sql
update seq_log set id=LAST_INSERT_ID(id+1);
select LAST_INSERT_ID();
```

を行えば、seq_logが必ず一意なidを返してくれるというわけです。
ここで得られたidを使ってシャーディングしたDBに更新をかければ重複は起こりません。

----

参考：http://engineer.dena.jp/2010/11/mysql-for-socialgame.html

----
追記

MyISAMではトランザクションが存在しないので、ロックを使って擬似的にトランザクションを作ってあげる必要がある
俗にこれを採番テーブルという
メリット・デメリットや採番方式、ロールバックに関する問題等下記の記事が詳しそう
参考：http://qiita.com/NAKANO_Akihito/items/44db44375a464c72606a
Riot.js が気持いぃ


まだ実験中の記法みたいな感じですが、riot.jsのClassサポートによるSPAの書き方が非常に気持ちよかったのでメモ。

## コンポーネントを作る

````
var riot = require("riot")

class Header extends riot.Tag {
    constructor(el) {
        console.log(el)
        super({ tmpl: Header.template() }, { root: el })
        this.msg = 'hello'
    }
    bye() {
        this.msg = 'goodbye'
    }
    static template() {
        return require("../tmpl/header.html")
    }
}

module.exports = function(el){
    console.log("header factory called")

    return new Header(el)
}
````

コンポーネントはコントラクタでDOMを受け取ってマウントする形のクラスで記述できます。

マウントする際にはnewにDOM渡して、mount()をコールするだけ。

## ルーティング

ルーティングも凄いシンプルに書ける。素敵。

````
var riot = require("riot")

var TopModule = require("./module/top");
var HelpModule = require("./module/help");
var 404Module = require("./module/404");

document.addEventListener("DOMContentLoaded", function(){

    riot.route.start();
    var $view = document.querySelector("route");

    riot.route('top',function(){
        $view.textContent = null;
        new TopModule($view).mount();
    })

    riot.route('help',function(){
        $view.textContent = null;
        new HelpModule($view).mount();
    })

    riot.route('*',function(){
        $view.textContent = null;
        new 404Module($view).mount();
    })

}, false);

````
気づいたらTrelloが気味の悪い日本語になっていたので、英語に戻す方法


Trelloが日本語対応したらしいですが、日本語がかなりアヤシイです。
![スクリーンショット 2016-04-22 17.18.12.png](https://qiita-image-store.s3.amazonaws.com/0/74551/072a1140-c7c8-3d0f-010a-7a864753d7c0.png "スクリーンショット 2016-04-22 17.18.12.png")

自動翻訳したような日本語が並び、気持ち悪いんで英語版に戻しましょう。
![スクリーンショット 2016-04-22 17.20.37.png](https://qiita-image-store.s3.amazonaws.com/0/74551/1b952ea0-b8fb-743c-f255-d52e7e0d7d98.png "スクリーンショット 2016-04-22 17.20.37.png")
![スクリーンショット 2016-04-22 17.20.50.png](https://qiita-image-store.s3.amazonaws.com/0/74551/0c3017a5-23b2-b20b-c586-e23626507ea7.png "スクリーンショット 2016-04-22 17.20.50.png")
バイトから適切なファイル単位に変換する

ファイルサイズをバイトで取得した際に適切な単位(MBなど)をつけた文字列で変換するスクリプト。
メガバイトの算出は `2^20 = 1024^2` なのでpowを利用。
ギガバイトなどは上記の応用。

```php
/**
 * ファイルサイズの単位変換
 * @param int $size
 *
 * @return string
 */
function calcFileSize($size)
{
  $b = 1024;    // バイト
  $mb = pow($b, 2);   // メガバイト
  $gb = pow($b, 3);   // ギガバイト

  switch(true){
    case $size >= $gb:
      $target = $gb;
      $unit = 'GB';
      break;
    case $size >= $mb:
      $target = $mb;
      $unit = 'MB';
      break;
    default:
      $target = $b;
      $unit = 'KB';
      break;
  }

  $new_size = round($size / $target, 2);
  $file_size = number_format($new_size, 2, '.', ',') . $unit;

  return $file_size;
}

$size = calcFileSize(1000);
// result -> 0.98KB

$size = calcFileSize(1030);
// result -> 1.01KB

$size = calcFileSize(1000000000000000);
// result -> 931,322.57GB
```

上記の場合は小数点第2位まで表示し、KB未満は `0.1KB` という風に返却となる。
switchの条件文を変更すればTBやbyte単位でも可能。
Vue.jsで親要素のdataを触る時(v-show)

リファレンスみても、あんまり合致するのなかったら
子要素からの呼び方をメモ。

親要素の中のhtmlの定義

```html
<header id="header" v-show="ok"></header>
```

親要素のスクリプトのデータのとこ

```js
<script>
  data(){
    return {
      ok: true,
    }
  }
</script>
```

みたいなんが定義されてたら

子要素のスクリプトに

```js
<script>
ready(){
    this.$parent.ok = false;
}
</script>
```

みたいな感じで親要素のデータを変更できる。
できてみたら、簡単だけど迷った。
Windows 10にChocolatey導入でつまった話

1. Windows10をクリーンインストール
2. 今回はパッケージマネージャを使って環境構築 → [**Chocolatey**](https://chocolatey.org/)を使用

## Windows10のクリーンインストール
省略

## Chocolateyの導入
`[Win] + X, A`でPowerShellを管理者権限で起動して[公式サイト](https://chocolatey.org/install#install-with-powershellexe)から以下を実行

```powershell
PS C:\WINDOWS\system32> iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))
```

### ここでエラーが
---
```powershell
このシステムではスクリプトの実行が無効になっているため、ファイル C:\Users\<username>\AppData\Local\Temp\chocolatey\chocI
nstall\tools\chocolateyInstall.ps1 を読み込むことができません。詳細については、「about_Execution_Policies」(http://go.m
icrosoft.com/fwlink/?LinkID=135170) を参照してください。
発生場所 行:164 文字:3
+ & $chocInstallPS1
+   ~~~~~~~~~~~~~~~
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess
```

言われた通りに[about_Execution_Policies](http://go.microsoft.com/fwlink/?LinkID=135170)を見ると，どうやらPowerShellの実行ポリシーではじかれている模様

```powershell
PS C:\WINDOWS\system32> Get-ExecutionPolicy
Restricted
```

このRestrictedを変えればいいらしい

```powershell
PS C:\WINDOWS\system32> Set-ExecutionPolicy -ExecutionPolicy Unrestricted
実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (http://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): y

PS C:\WINDOWS\system32> Get-ExecutionPolicy
Unrestricted
```

再度インストールスクリプトを試すと出来た

## まとめ
- エラーメッセージをちゃんと読む

## 追記(2019/08/02)
公式ページのスクリプトが更新されてました
記載した作業をひとまとめにしています

```powershell
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
```
組合せ最適化で道路を舗装せよ

# 最短時間で道路を舗装せよ
あなたは、町役場の土木課の職員です。

- 未舗装の道路ネットワークを(人手不足なので)1人で舗装しなければいけません。
- 最後に作業開始地点に戻らないといけません。
- なるべく早く作業を終えたいとします。

# 考え方
全ての辺(道路)を辿る閉路(一周して戻ってくる経路)を求める問題を、[中国人郵便配達問題](https://ja.wikipedia.org/wiki/%E4%B8%AD%E5%9B%BD%E4%BA%BA%E9%83%B5%E4%BE%BF%E9%85%8D%E9%81%94%E5%95%8F%E9%A1%8C)といいます。
ワーシャルフロイド法を用いて多項式時間で計算することができますが、ここでは[組合せ最適化](http://qiita.com/Tsutomu-KKE@github/items/bfbf4c185ed7004b5721)の混合整数最適化問題と捉えて解くことにします。
連結グラフの全ての点の次数(点に接続している辺の数)が偶数であれば、閉路が存在することが知られています。次数が奇数のときは、同じ道路上を往復して偶数になるようにすればよいことになります。

方針としては、道路を往復すべきかどうかを求めることにします。
(次数が全て偶数のグラフの閉路は比較的簡単に求まりますので、ここでは省略します。)

# 定式化

<table>
<tr><td>最小化</td><td>$\sum_i{x_i}$</td><td>往復する道路</td></tr>
<tr><td rowspan="2">変数</td><td>$x_i \in \{0,  1\} ~ \forall i \in 道路$</td><td>往復するかどうか</td></tr>
<tr><td>$y_j \ge 0, \in 整数 ~ \forall j \in 点$</td><td>点の次数の半分</td></tr>
<tr><td>制約条件</td><td>$\sum_{i \in 点jに接続している辺}{~~~~~~~~~~~~ x_i + 点jの次数} = 2 y_j \forall j \in 点$</td><td>次数が偶数</td></tr>
</table>

(この定式化は、あまりよくないので、実際には別の方法がよいでしょう。)

# Pythonで実行

ランダムなグラフを作成します。

```py3:python3
%matplotlib inline
import networkx as nx
from pulp import *
g = nx.random_graphs.fast_gnp_random_graph(8, 0.3, 11)
pos = nx.spring_layout(g)
nx.draw_networkx_nodes(g, pos=pos, node_size=600, node_color='w')
nx.draw_networkx_edges(g, pos=pos)
nx.draw_networkx_labels(g, pos=pos, font_size=20)
print([i for i, l in enumerate(g.adjacency_list()) if len(l)%2])
>>>
[0, 2, 3, 6]
```
![a.png](https://qiita-image-store.s3.amazonaws.com/0/13955/3ace941e-3854-a8c0-5a75-0e06130fe75a.png)

点0, 2, 3, 6 の次数が奇数なので、これらの間を結べばよいことが、わかります。

定式化して解いてみます。

```py3:python3
m = LpProblem()
xs, ys = [], []
for i, j in g.edges():
    g.edge[i][j]['x'] = x = LpVariable('x%d_%d'%(i,j), cat=LpBinary)
    xs.append(x)
m += lpSum(xs)
for i, ad in enumerate(g.adjacency_list()):
    y = LpVariable(
'y%d'%i, cat=LpInteger)
    m += lpSum(g.edge[i][j]['x'] for j in ad) + len(ad) == 2 * y
    ys.append(y)
m.solve()
print([g.edges()[i] for i, x in enumerate(xs) if value(x)])
>>>
[(0, 2), (1, 3), (1, 6)]
```

最短で、点0, 2, 3, 6 が結ばれているのがわかります。

以上
CakePHP3のHABTMのバリデーションについて

# CakePHP3のHABTMのバリデーションについて

## CakePHP2までの場合

[こんな感じ](http://www.webopixel.net/cakephp/259.html)の非常にまどろっこしい書き方をしないといけなかったですよね。  
まぁ、自身のモデルでしかバリデーションはかけられないので当然と言えば当然なんですが・・・

## CakePHP3について

結構なんかいい感じのやり方があるものかと思いきや特に見当たらず・・・。

取り合えず
1. CakePHP2と同じようなことをする
2. customValidationでどうにかする

しか思い当らず・・・。

とりあえず1番についてこんな方法でバリデーション自体は実現

※membersテーブルとhobbiesテーブルがhabtm関係

`src/Template/Members/add.ctp`

```php
echo $this->Form->input('hobbies._ids', ['options' => $hobbies, 'required' => false]);
echo $this->Form->error('hobby');
```

`src/Model/Table/MembersTable.php`

```php
<?php
namespace App\Model\Table;
//useは略
class MembersTable extends Table
{
    public function initialize(array $config)
    {
        parent::initialize($config);

        $this->table('members');
        $this->displayField('name');
        $this->primaryKey('id');
        $this->addBehavior('Timestamp');

        $this->belongsToMany('Hobbies', [
            'foreignKey' => 'member_id',
            'targetForeignKey' => 'hobby_id',
            'joinTable' => 'hobbies_members'
        ]);
    }
    
    public function beforeMarshal(Event $event, ArrayObject $data, ArrayObject $options)
    {
        //beforeMarshalで別フィールドに値をセット
        //(ちゃんとエラーチェックとかしたほうがいいけど一旦無視
        $event->data['data']['hobby'] = $event->data['data']['hobbies']['_ids'];
    }

    public function validationDefault(Validator $validator)
    {
        $validator
            ->add('hobby', ['multiple' => [
		        'rule' => ['multiple', ['min' => 1]],
		        'message' => 'hogehoge'
		    ]]);
        return $validator;
    }
}
```

## まとめ

なんかもっとスマートない方法ないんですかね？
BeagleBone Blackで圧電ブザー

 
http://lchikaamazon.hatenablog.com/entry/2014/12/02/191623

今回、電圧ブザーを用いて音を出してみたいと思います。今回使用するブザーは上記のURLと同じものを使用します。なので、極性を考慮しなくてもおkです。

以下のコードでブザーが鳴ります。

```buzzer.js
  1 var b = require('bonescript');
  2 var buzzerPin = "P8_19";
  3 var volume = 0.02;
  4 var state = 0;
  5
  6 // configure pins
  7 b.pinMode(buzzerPin, b.OUTPUT);
  8
  9 beap = function() {
 10   state = state ? 0 : 1;
 11   if(state == 0) b.analogWrite(buzzerPin, volume, 2000);
 12   else b.analogWrite(buzzerPin, b.LOW);
 13 };
 14
 15 timer = setInterval(beap, 500);
 16
 17 stopTimer = function(){
 18   clearInterval(timer);
 19   b.analogWrite(buzzerPin, b.LOW);
 20 };
 21
 22 setTimeout(stopTimer, 15000);
```

はじめからコードを解析していく。
いつも通りbonescriptを読み込んでいます。
次にPINを指定。今回音を出すためPWMが使えるポートを使用。なぜPWMが使えるかを指定するかは学習不足だが、音を出すため圧電ブザーに周波数を与えてやる必要が有ると推測。そのため、今回はanalogWriteという関数を使用します。詳しくはドキュメントを読んだ方がいい。

それで、今回volumeの値を0.02にしてるけど、この値を小さくしたり大きくしたりすると音の大きさが変わるので、詳しくは調べる必要あり。

今回のプログラムはLEDの時のものを工夫したもので、15秒の間に音を出したり出さなかったりするやつです。

以下にPWM出力可能なPINが載っている画像を載せときます。

![cape-headers-pwm.png](https://qiita-image-store.s3.amazonaws.com/0/76017/52a26c43-510c-6902-3916-e58ecaa93fa3.png "cape-headers-pwm.png")

今回無事音を出せましたが音を出すにあたっての仕組みなどを勉強する必要がありそうです。

次回はスイッチを使ってLEDやブザーを鳴らすか、HC-SR04という超音波センサーを使って遊んでみようと思います。
VisualStudioでバージョンの合わないプラグイン、拡張機能を無理やりインストール


1 *.vsixを*.zipに変更
2 *.zipを解凍
3 でてきたextension.vsixmanifestを開く。
4 Installationタグを探し以下のように内容を変更(Versionは適切なものにする)

```xml
  <Installation InstalledByMsi="false">
    <InstallationTarget Id="Microsoft.VisualStudio.Pro" Version="[11.0,12.0)" />
    <InstallationTarget Id="Microsoft.VisualStudio.Premium" Version="[11.0,12.0)"  />
  </Installation>
```

5  manifestを保存し*.zipに圧縮
6 zip→vsixに拡張子変更
7 ダブルクリックしてインストール
8 成功したら御の字、失敗したらあきらめる。
emacs でgolang編集環境を作る


突然ですが私、go言語を始めました！
いきなりこの人何言ってんだ。
やろうと思って簡単に習得できるものじゃないぞ。


ということで、go言語用にemacsをカスタマイズします。

# 前提条件
 - package.elが導入済みであること。
 - goがインストール済みであること。

# 必要なgo パッケージの導入
 - gofmt（コードを整形してくれるパッケージ。デフォルトで導入済み）
 - godef（関数定義などを参照できるパッケージ）
 - gocode（autocompleteやcompanyと連携して補完をしてくれるパッケージ）
 - golint / errcheck （flycheck で自動的にシンタックスエラーを検知）

```shell-session
go get github.com/rogpeppe/godef
go get -u github.com/nsf/gocode
go get github.com/golang/lint/golint
go get github.com/kisielk/errcheck
```

# 導入した結果
 - 保存時に、コードを自動的に綺麗にしてくれるようになる。
 - syntax error が検出された時、色を変えて教えてくれる。
 - M-. で、関数定義に飛べる。
 - その他、自動補完

# emacs の設定

```el
M-x package-install flycheck
M-x package-install company-go
```

```golang-conf.el
;; Goのパスを通す
(add-to-list 'exec-path (expand-file-name "/usr/local/go/bin/"))

;; go get で入れたツールのパスを通す
(add-to-list 'exec-path (expand-file-name "/Users/ryo/.go/bin"))

;; 必要なパッケージのロード
(require 'go-mode)
(require 'company-go)

;; 諸々の有効化、設定
(add-hook 'go-mode-hook 'company-mode)
(add-hook 'go-mode-hook 'flycheck-mode)
(add-hook 'go-mode-hook (lambda()
	       (add-hook 'before-save-hook' 'gofmt-before-save)
	       (local-set-key (kbd "M-.") 'godef-jump)
	       (set (make-local-variable 'company-backends) '(company-go))
	       (company-mode)
	       (setq indent-tabs-mode nil)    ; タブを利用
	       (setq c-basic-offset 4)        ; tabサイズを4にする
	       (setq tab-width 4)))

```

# 感想とかもっとこうしたほうがいいとか
 - 私の環境ではauto-complete ではなくcompanyを使用していますので、acユーザーの方は参考記事などを参考にしていただけると良いかと思います。
 - 随時記事を更新していこうと思いますが、現状これでかなり満足しています（go勉強中の身なので）

全体的な感想としては、かなり楽に導入できるなと思った次第です。go言語そのものがそうなのですが、導入コストがruby やpython や、低レイヤーでいうとcとかjavaとかと比べると非常に少なく、今からプログラミングを始めようという方にも、これまで別の言語を触ってきた方にも良いんじゃないかな（？）と思っています。


# 参考にした記事とか
 - [EmacsでのGo言語編集環境](http://unknownplace.org/archives/golang-editing-with-emacs.html)
 - [golang用にgo-eldocやflycheckなどを入れました - $shibayu36->blog;](http://blog.shibayu36.org/entry/2013/11/10/143202)

以上になります。
macにUSB接続したRICOH THETA Sで撮影と画像取得してみた

libgptho2とrubyを使ってmacにusb接続したRICOH THETA Sで撮影と画像取得してみた。

# 試した環境

* mac：iMac (21.5-inch, Late 2013) OSX 10.11.4
* RICOH THETA S ファームウェアバージョン 01.42
* libgphoto2-2.5.9
* ruby 2.1.5p273
* gem
 * ffi-gphoto2 (0.5.1)
 * ffi (1.9.10)

# 作成したスクリプト

* Gemfile

```rb
# A sample Gemfile                                              
source "https://rubygems.org"

gem 'ffi-gphoto2'

```

* test.rb

```rb
require 'gphoto2'                                     

p camera = GPhoto2::Camera.first
p camera.can? :capture_image
# => true
file = camera.capture
file.save('test.jpg')
```

# スクリプトの実行手順

* RICOH THETA Sをmacに接続しておく
* libgphoto2インストール

```bash
$ brew install libgphoto2
```

* bundle install

```bash
$ bundle install --path vendor/bundle
```

* OSXのPTPデーモンkill
 * [gPhoto / Mailing Lists](https://sourceforge.net/p/gphoto/mailman/message/27841914/)参照
 * これをしておかないとスクリプトのcamera.captureでエラーとなる

```bash
$ ps axuwww | grep "Image" | grep -v grep
# => /System/Library/Image Capture/Devices/PTPCamera.app/Contents/MacOS/PTPCameraのPID確認
$ sudo kill -9 [確認したPID]
```

* スクリプト実行

```bash
$ bundle exec ruby test.rb
# => 同じディレクトリにtest.jpg作成
```

# おまけ - Windows環境でやってみる

以下のVirutalBox+ubuntu環境で同様にスクリプトを実行できた。

* ホストOS：Windows7 Professional SP1
* VirtualBox 5.0.14
* ゲストOS：Ubuntu 14.04
 * VMのUSB設定でTHETAが繋がるようにする 
 * [gphoto2-updater](https://github.com/gonzalo/gphoto2-updater)でgphoto2 2.5.10.1
 * ruby 2.1.8p440
 * gem - ffi-gphoto2 (0.5.1)、ffi (1.9.10)

----

[oobaring: HowTo: Install gphoto2 in windows 7](http://foobaring.blogspot.jp/2013/10/howto-install-gphoto2-in-windows-7.html)の情報はあるがgphoto2のバージョンが古いビルドしかない。
この手順で試してみて撮影はできたが画像取得でエラーが起きてうまくいかなかった。

----

WIA(Windows Image Acquisition)使ったりすればネイティブアプリでもいけるんだろうけどお手軽にはいけなさそう。
[PTPを使ったデバイス制御](http://books-nekoya.jp/Programming/PTP/ptp_devcont.html)
CloudFrontとS3のCORS設定

##**CloudFrontとS3のCORS設定でハマる…**

- 端末、使用ブラウザよってエラーになったりならなかったり
- 時間がない、色々調べるのに手が回らない
- 見よう見まねでやるもうまくいかず
- とりあえず、良くなった方法を書いてみる

###**S3 バケットの設定**
プロパティ > アクセス許可 > CORS設定の追加(編集)

```lang:CORS設定の追加(編集)
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>http://www.example.com</AllowedOrigin>
        <AllowedOrigin>https://www.example.com</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>HEAD</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>
```

###**ClowdFrontの設定**
Distributions > Distribution Settings > Behaviors > Edit

- 『forward headers』へ『Origin』を追加

###**確認**

**CURLコマンド**
`curl -I -s -X GET -H "Origin: www.example.com" http://example.cloudfront.net/test.jpg`

**Chrome**
デベロッパー ツール > NetWork
varyの項目を表示させて『Origin』となってればOK
Phoenixガイドラインを読んでみた(4) - Plug -

## はじめに

[前回](http://qiita.com/dynamitecoolguy/items/aeded848cde25a871da1)は、Routingについてまとめてみました。
今回は、[公式ドキュメントのPlug](http://www.phoenixframework.org/docs/understanding-plug)です。
なお、[次回](http://qiita.com/dynamitecoolguy/items/7a8061eb16cf66226ebc)は、ガイドラインのControllerです。

## 消火栓

Plugは、HTTPレイヤー間のさまざまな局面で接続を行うことができる仕様です。
おおまかに関数型Plugとモジュール型Plugの二つの書き方ができます。

### 関数型Plug

Plugとして動作するためには、接続データ(`%Plug.Conn{}`)とパラメータ引数を受け取り、接続データを返す必要があります。
例えば、以下のようなControllerを作成します(関連箇所のみ抜粋)。

```
defmodule HelloPhoenix.MessegeController do
  use HelloPhoenix.Web, :controller

  plug :put_headers, %{content_encoding: "gzip", cache_control: "max-age=3600"}

  def show(conn, _params) do
    render conn, "show.html"
  end

  defp put_headers(conn, key_values) do
    # key_valuesがEnum, accumlatorがconn
    # Enum.reduce/3はaccumlator(conn)を返す
    Enum.reduce key_values, conn, fn {k, v}, conn ->
      Plug.Conn.put_resp_header(conn, k, v)
    end
  end
end
```

これは、"show.html"を表示する前に、"content_encoding"と"cache_control"の二つのヘッダを表示します。
なお、このようにControllerに直接Pipelineを書くことができますが、記述することができるPipelineは一つだけです。

### モジュール型Plug

モジュール型Plugを作成する場合、init/1とcall/2の二つの関数を実装するだけです。
init/1は、call/2へのパラメータを生成します。また、call/2は関数型Plugと同じく接続データとパラメータを引数にします。

例えば、以下のような実装を行います(関連する部分だけを抜粋)。

```
defmodule HelloPhoenix.Plugs.Locale do
  import Plug.Conn

  @locales ["en", "fr", "de"]

  def init(default), do: default

  def call(%Plug.Conn{params: %{"locale" => loc}} = conn, _default) when loc in @locales do
    assign(conn, :locale, loc)
  end
  def call(conn, default), do: assign(conn, :locale, default)
end

defmodule HelloPhoenix.Router do
  use HelloPhoenix.Web, :router

  pipeline :browser do
    plug :accepts, ["html"]
    plug :fetch_session
    plug :fetch_flash
    plug :protect_from_forgery
    plug :put_secure_browser_headers
    plug HelloPhoenix.Plugs.Locale, "en"
  end
...
```

Pipeline `:browser`に、モジュール型Plug `HelloPhoenix.Plugs.Locale`を追加しています。
このとき、引数"en"が、init/1関数の引数として与えられます。
Plug(`HelloPhoenix.Plugs.Locale`)が実行されるとき、HelloPhoenix.Plugs.Localeの`call`が呼び出されます。
VirtualBox上にWindows10をインストールする。


## ダウンロードする

[Windows 10 の開発環境を取得する](https://developer.microsoft.com/ja-jp/windows/downloads/virtual-machines)というマイクロソフトのページを参考に開発環境を取得します。

![Kobito.1grHjf.png](https://qiita-image-store.s3.amazonaws.com/0/58800/79d7318a-dadb-4d5e-2161-c7b7a6101bf9.png "Kobito.1grHjf.png")

見ての通り、仮想マシンの実装に関して4つあるんですけど、今回はVirtualBoxでいきます。

VirtualBoxの取得は済ませておきましょう。
[VirtualBox](https://www.virtualbox.org/wiki/Downloads)

VirtualBoxのボタンを押すとダウンロードがはじまります。zipファイルがめっちゃ重くて1時間以上時間かかりました。

### **zipファイルがでかすぎて解凍ができない場合** :cry: 

![Kobito.9rblLk.png](https://qiita-image-store.s3.amazonaws.com/0/58800/6717786d-7bef-0b20-97b1-788f5edd6571.png "Kobito.9rblLk.png")

zipファイルの容量の単位がGBになると、Macのデフォルトのソフトウェアでは解凍できないです。
[Unarchiver](https://itunes.apple.com/jp/app/the-unarchiver/id425424353?mt=12&ign-mpt=uo%3D4)を使いましょう。インストール済だったのになぜかデフォルトのソフトになっていなかったのでちょっと焦りました。

### 配置する

さて、解凍後にできたovaファイルですが、Finderで任意の場所にわかりやすく置いておきましょう。
私の場合は、ユーザー直下にvm-imagesとかいうディレクトリをかつて作ってたので入れておきました。

![Kobito.SSg30W.png](https://qiita-image-store.s3.amazonaws.com/0/58800/879911d1-e939-489a-d52f-09a27c6a1fa5.png "Kobito.SSg30W.png")

## 起動する

ということで何も考えずにダブルクリック。

VirtualBoxが起動してダイアログが出ました。
![Kobito.LRsQ9K.png](https://qiita-image-store.s3.amazonaws.com/0/58800/df38de8c-99d6-d687-10fe-f30ac61d3405.png "Kobito.LRsQ9K.png")

importを選んで進めました。
15分くらいかかりましたが、終わったら左のメニューの中にWindows10が出現しました。

![Untitled-1.png](https://qiita-image-store.s3.amazonaws.com/0/58800/114f6284-5173-7a53-0b9e-8e2ba529aec4.png "Untitled-1.png")


おもむろにダブルクリックするといろいろ表示されてWelcome画面にいきます。

![Kobito.F1o8BR.png](https://qiita-image-store.s3.amazonaws.com/0/58800/e1404b2c-f94e-08e4-5dc3-c67b864f2606.png "Kobito.F1o8BR.png")


何か起動しつつある感じからデスクトップ画面にいきます。

できたという記念でEdgeからQiitaにログインしてみました。

![Kobito.hISd58.png](https://qiita-image-store.s3.amazonaws.com/0/58800/b65012bb-5352-5d71-6de4-c92dfea5d946.png "Kobito.hISd58.png")

終了は仮想マシン上のシャットダウンを選ぶのがふつうだと思います。もちろんMac側から終了もできます。

## 今後の課題

- 日本語の表示に難あり
- MacがJISキーボードでもUSキーボードと認識されている

そこらへんは不満を感じたときにおいおい手を付けようと思います。
こちらからは以上です。
タスクランナーの代わりにnpm-scriptsを使う


仕事で簡単なサイトを作った時に、タスクランナー代わりにnpm-scriptsを使った話

## 個人的フロント環境事情
最近のフロント開発では生でJSやCSSを書くことはほぼ無くなってきていて、何かしらのaltjsやCSSPreprocessorを使っている。

これらを使うにはgulp/gruntのようなタスクランナーが必要だけど、関連ファイルが多くなったり、環境の用意が面倒だったり、規模の小さいプロジェクトで使うには冗長だなーと感じていた。


## npm-scripts

そこで以下の理由からnpm-scriptsを使うことにした。

- package.jsonのみで完結できる
- package.jsonに定義してあるパッケージに依存するので、グローバルにnode-sassとかbrowserifyを入れる必要がなく、環境構築が容易

JS/CSSのビルドとファイル監視のscriptsを含めたpackage.jsonだと以下にようになる。

```:package.json
{
  "name": "npm-scripts",
  "version": "1.0.0",
  "description": "",
  "main": "",
  "scripts": {
    "build:css": "node-sass assets/css/app.sass dist/css/app.css",
    "build:js": "browserify assets/js/app.js -t babelify --outfile dist/js/app.js",
    "watch:css": "watch 'npm run build:css' assets/css",
    "watch:js": "watch 'npm run build:js' assets/js",
    "watch": "npm run watch:js & npm run watch:css"
  },
  "author": "",
  "license": "",
  "devDependencies": {
    "babel-cli": "^6.7.5",
    "babel-preset-es2015": "^6.6.0",
    "babelify": "^7.2.0",
    "browserify": "^13.0.0",
    "node-sass": "^3.4.2",
    "watch": "^0.17.1"
  }
}

```

あとは`npm install`してから`npm run watch`を打てばファイル監視がスタートする。

プロジェクトの規模や状況によるけど選択肢のひとつとしてnpm-scriptsは有りだなと思った。
Aerospikeの監視データをGraphiteに流し込んでGrafanaでカジュアルに見る

# 動機
[AMC](http://www.aerospike.com/docs/amc/)だと最大30分で監視結果が揮発してしまうので、
もっとロングスパンでの監視を、気軽に楽に行う方法をメモ。

# 概要
Aerospikeが提供してくれるasgraphiteを利用してgraphiteに監視データを流し込み、grafanaで楽に見易く。
※zabbixからgraphiteのデータを見て、alertingするのも加筆予定。

[公式ドキュメント-asgraphite](http://www.aerospike.com/docs/operations/monitor/graphite/)

*※以下はCentos 6.7で実施した際の手順になります*


# 手順
## 0. 事前準備
1. Aerospikeは既にInstall済である前提
2. graphite、grafanaも同様。install方法はQiitaで探したらあると思う。
    3. なお、graphiteは認証かけてない状態でのメモになります。


## 1. aerospikeが稼働しているサーバでasgraphiteを稼働させる
```
python /opt/aerospike/bin/asgraphite -n -s -d -l 'latency:' --start -g 192.168.0.X -p 2003"


# このままだと面倒なので、起動時に自動的に実行するように /etc/rc.localに追加しとく。
echo "python /opt/aerospike/bin/asgraphite -n -s -d -l 'latency:' --start -g 192.168.0.X -p 2003" >> /etc/rc.local
```
-g でgraphiteが稼働してるサーバを指定
その他optionについてはこっちを確認 http://www.aerospike.com/docs/amc/


なお、デフォルトでは30秒間隔。以下でマジックナンバーとなってる。。
```lang:/opt/aerospike/bin/asgraphite
INTERVAL = 30
```
1秒でも問題なく動きそうなんだけど、一応デフォルトで運用してます。

この時点でgraphiteにデータが溜まってってるはず。

## grafanaを設定
- 既にgrafanaは稼働して、webから見れるって前提で話を進めます。

1. grafanaにLogin
2. 左上「Data Sources」から、「Add new」
    3. Type:Graphite
    4. Url: http://graphiteのUrlとかIP:80
    5. Access：proxy
    6. その他、nameとかDefaultとかAuthは環境に併せて。
1. 画面上部「Home」から+Newを選択して、新規Dashboard作成
2. 黄緑の資格にカーソル合わせてクリックすることでメニューが出るので「Add Panel」＞「Graph」を選択
3. Metricタブでブラウザから、Metricsを選択していく
    4. instances.citrusleaf.[エアロ稼働サーバ名].latency.reads.*  みたいな形式で、見たいデータを選択。
5. +ADD ROWして新規行を追加したり、Single Statを追加したりしつつ見たいデータを設定してって下さい。



## 結果こんな感じに
![grafana_image.png](https://qiita-image-store.s3.amazonaws.com/0/23127/18856f47-5387-9ef8-5f7b-89e23d2d93dd.png)



**zabbixの見辛いグラフなんかもgrafana流し込んで幸せ監視ライフ！**

だんだん書くの面倒になってきてだいぶ端折ってスミマセン。
bundle exec にaliasを付与してコマンドを短縮する方法（Mac）


ぐぐってみてもあまり情報が出てこなかったのでメモ。
基本的なことを理解していなかったので、合わせてメモ。

##もくじ

1. 手順
2. なぜコマンドを省略じゃなく短縮するか
3. 基本的なこと

### 手順

1. terminalを起動する
2. .bashrcを編集する
3. .bash_profileを修正する
4. 2-3の手順を反映させる

```.bashrc
vim .bashrc
```
* .bashrcがない場合はファイルを新規作成する



#### terminalを起動する

* すでに起動している場合は、ホームディレクトリに移動する

```terminal
cd
``` 

#### .bashrcを編集する

* .bashrcを開く（もしくは新規作成する）

```.bashrc
vim .bashrc
```
* .bashrcがない場合はファイルを新規作成する

* aliasを記載する 

![bashrc.png](https://qiita-image-store.s3.amazonaws.com/0/118590/6a9170c6-1d34-d4b1-f97c-c31740a7a39e.png "bashrc.png")

```be```は```b```でもなんでも構いません。

### .bash_profileを修正する

* .bash_profileを開く（もしくは新規作成する）

```terminal
vim ~/.bash_profile
```

* 先ほどの.bashrcを読み込む
![bash_profile.png](https://qiita-image-store.s3.amazonaws.com/0/118590/67841d81-fa73-b84c-dece-1e3e5bac353c.png "bash_profile.png")


### 2-3の手順を反映させる
```terminal
source ~/.bash_profile
```

## なぜコマンドを省略じゃなく短縮するか

* 忘れるから

ちょっと調べたら出てきた。

>理由は簡単で省略してあるのか、不要なのかが他人からは分かりにくいから。
特に手順周りを自分以外(＝未来の自分も含む)に伝える際にこれが発生する。
また、以下のように仕様変更の際にハマリ易いのも特徴。

http://changesworlds.com/2015/06/bundle-exec-is-better-alias-rather-than-omit/

他人は別にいいとして、「未来の自分」の部分が大事だと思う。
仕様変更は観点になかったので勉強になった。

## 基本的なこと

* alias

別名のこと。
SQLでもFROM句にaliasをよくつける。
そういえば、つけてなくてデグラせた甘酸っぱい思い出が...

* .bashrc / .bash_profile

以下のリンクまとまってた。
ざっくり言うとPCの設定ファイルと理解。

http://qiita.com/magicant/items/d3bb7ea1192e63fba850
http://qiita.com/hirokishirai/items/5a529c8395c4b336bf31

これを読めば、bash_profileを読み込み直す理由もわかる。

* bash

>bashとは、多くのUNIX系OSで標準的に使われるシェル（ユーザからの操作を受け付け、結果を表示するソフトウェア）の一つ。

http://e-words.jp/w/bash.html


知らない、理解してないことが芋づる式に出てくる。
Mac｜QuickTime Player で画面収録を停止するショートカット

#画面収録を停止するショートカット

画面収録を停止するには、以下3つのキーを同時に押す。
>command + control + esc

##その他のショートカット

[QuickTime Player 10.x: QuickTime Player のキーボードショートカット](https://support.apple.com/kb/PH5883)
HAProxy で VirtualHost が動かない

HAProxy で httpd へのアクセスをプロクシしていたら名前ベースの VirtualHost が動かない。
デフォルトの VirtualHost が表示されてしまう。

#解決方法

HAProxy のヘルスチェックが以下のようになっているなら

``` ruby
option httpchk HEAD / HTTP/1.0
```

以下で直った。 ( example.com は VirtualHost 名 )

``` ruby
option httpchk HEAD / HTTP/1.1\r\nHost:\ example.com
```


# 原因

ヘルスチェックの HEAD リクエストに Host ヘッダが無いため、
httpd は名前ベースのヴァーチャルホストを選べない。
選べないのでデフォルトのヴァーチャルホストが選択されるが、そちらのホストは動いていなかった。

今回は偶然デフォルトのヴァーチャルホストがエラーのステータスを返していたため判明したが、もし 200 などを返していた場合は、何の問題もないように見えただろう。

そして、目的のホストが落ちているのに HAProxy 上ではアクティブなままなのでたいへん困ったかもしれない。

# 対策
HAProxy の httpchk のオプションで、リクエストに Host ヘッダを追加した。
Hostヘッダが必須なのは `HTTP/1.1` なので 一応 1.1 にした。

```ruby
option httpchk [<method>] [<uri>] [<version>]
```

# 参考

Checking a HTTP service

> It is possible to send HTTP headers after the <version> string by concatenating them using rn and backslashes spaces. This is useful to send Host headers when probing a virtual host

https://www.haproxy.com/doc/aloha/7.0/haproxy/healthchecks.html

# 補足

apache がヴァーチャルホストについて、どのように把握しているかは `httpd -S` で表示される。
組み込んで利用出来そうな　スプレッド系ソフト

#[DHX](http://dhtmlx.com/)
![dhtmlx.png](https://qiita-image-store.s3.amazonaws.com/0/54159/4fcf5837-9883-d08f-010b-f0a6a0814008.png)

##[dhtmlxGrid](http://www.ark-web.jp/sandbox/wiki/270.html)
javascript スプレッド さんぷるが豊富で使いやすいかも（確認中）

#[jspreadsheet](http://jspreadsheets.com/)
mitライセンス多数

#[jQuery Grid Plugin](http://paramquery.com/)

#[jqgrid](http://www.trirand.com/blog/)
最新版はフリーじゃない（確か、4.7までフリー後で調べて更新します）


#[Simple Spreadsheet](https://osdn.jp/projects/sfnet_simplsheet/)
ESP8266でWPSを実装してみる

http://bbs.espressif.com/viewtopic.php?t=1096
ソース元はこちら

ESP-WROOM-02にはWPSでWiFiの設定をすることができる環境がつくられているようなのでその解説と結果を報告します。

#環境
Arduino IDE 1.6.7
Arduino core for ESP8266 WiFi chip (https://github.com/esp8266/Arduino) v2.2.0

Arduino coreのバージョンが古いと実装されてない可能性があります。

#コード
```cpp:wps.ino
#include <ESP8266WiFi.h>

void Wifi_wait();
void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  //WiFi.begin("","")このようにすることでWPSで保存したデータがある場合そちらに接続するようになる
  WiFi.begin("", "");
  Wifi_wait();
  // Wifiに接続していないときにはWPSを開始します
  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("\nAttempting connection ...");
    WiFi.beginWPSConfig();
    Wifi_wait();
    if (WiFi.status() == WL_CONNECTED) {
      Serial.println("Connected!");
      Serial.println(WiFi.localIP());
      Serial.println(WiFi.SSID());
      Serial.println(WiFi.macAddress());
    } else {
      Serial.println("Connection failed!");
    }
  } else {
    Serial.println("\nConnection already established.");
  }
}

void loop() {
}

void Wifi_wait() {
  int wait=0;
  Serial.println("WiFi　connecting");
  while (wait < 20) {
    if (WiFi.status() == WL_CONNECTED) {
      Serial.println("WiFi connected");
      return;
    }
    Serial.print(".");
    wait++;
    delay(250);
  }
  Serial.println("Connect timed out");
}
```
#使いかた
Wifiに接続失敗したときにWPSで設定中のルータをさがしに行きます。

WPSで設定中のものがあったとき、ESP-WROOM-02はそのルータから設定を取得し、今後そのルータに接続するようになります。

Wifiに詳しくない人でもESP-WROOM-02を手軽に扱えるようになる技術だと思います、

#結果
私の所持しているWifiルータではWPSでの接続は成功しませんでした…

それは、私の持っているWifiルータが悪いのかもしれないのでもしよければ、試して成功したかどうか教えてください。
AWS API GatewayとAWS Lambdaで、HelloWorldを作成する

# Lambda

![lamdba001.png](https://qiita-image-store.s3.amazonaws.com/0/63450/dea767e1-33d8-be83-0bb4-400ee0201eec.png)

![lamdba002.png](https://qiita-image-store.s3.amazonaws.com/0/63450/37ece27a-0477-969c-08ab-676c094e092d.png)

![gate001.png](https://qiita-image-store.s3.amazonaws.com/0/63450/6f68138b-12ef-72cb-c8fb-81754e4df1d6.png)

```js:HelloWorld.js
console.log('Loading event');
 
exports.handler = function(event, context) {
    context.done(null, {message:'Hello from AWS Lambda!'}); 
};
```

![gateway001.png](https://qiita-image-store.s3.amazonaws.com/0/63450/bad1d6e7-77b3-484c-0146-62eb71ee0449.png)


![lamdba005.png](https://qiita-image-store.s3.amazonaws.com/0/63450/6188fb96-2457-e879-6f22-97270bf392dd.png)

![lamdba006.png](https://qiita-image-store.s3.amazonaws.com/0/63450/ca8e7c2f-a3b2-3339-df71-d4364afd61c8.png)

![gate003.png](https://qiita-image-store.s3.amazonaws.com/0/63450/33dff56d-8ca5-01bb-bcaa-81fbad7be65f.png)

![helloPlug001.png](https://qiita-image-store.s3.amazonaws.com/0/63450/ff48b9d6-dcea-7aa2-f237-40716535eecc.png)

# API Gateway

![hello001.png](https://qiita-image-store.s3.amazonaws.com/0/63450/9938c72f-708e-9c4f-dd64-97112e48c157.png)

![hello002.png](https://qiita-image-store.s3.amazonaws.com/0/63450/647a3280-1782-4b15-18b2-bfe870b99098.png)

![hello003.png](https://qiita-image-store.s3.amazonaws.com/0/63450/483abc90-914d-3b75-9280-64c345701a14.png)

![hello005.png](https://qiita-image-store.s3.amazonaws.com/0/63450/6cf0c129-554b-fe90-b85e-92c290b8122d.png)

![hello006.png](https://qiita-image-store.s3.amazonaws.com/0/63450/92d73180-9344-da29-eb39-02843727648d.png)

![hello007.png](https://qiita-image-store.s3.amazonaws.com/0/63450/c2d39671-374e-4c36-d82c-0501c536fe61.png)

![hello008.png](https://qiita-image-store.s3.amazonaws.com/0/63450/ceade09a-5bd8-6923-30ca-d3a648a9f1e6.png)

![hello009.png](https://qiita-image-store.s3.amazonaws.com/0/63450/8915418d-95de-fcb9-612c-2d545ad0aaaf.png)

![hello011.png](https://qiita-image-store.s3.amazonaws.com/0/63450/1212dca6-914a-a8bc-8683-6e4ddde89aae.png)

![hello012.png](https://qiita-image-store.s3.amazonaws.com/0/63450/0315e654-156a-bb0c-5f1d-7f9c473ade54.png)

![hello013.png](https://qiita-image-store.s3.amazonaws.com/0/63450/1d27763a-141d-eb33-ae72-1fe3e81f3c95.png)

![hello014.png](https://qiita-image-store.s3.amazonaws.com/0/63450/bff35c36-37e4-ba71-8c6a-f3567b0bce2a.png)

![hello016.png](https://qiita-image-store.s3.amazonaws.com/0/63450/76cdb7d8-6825-baee-4317-ad6bad5e29e8.png)


![api023.png](https://qiita-image-store.s3.amazonaws.com/0/63450/d368a53c-ee0a-1e0f-2b9a-99e40f22423b.png)
Rubyのtimesメソッド, uptoメソッドを使った簡単なURLリストの作り方とブロックの戻り値の疑問

```
http://hogehoge.com/contents/list/?p=1
http://hogehoge.com/contents/list/?p=2
http://hogehoge.com/contents/list/?p=3
http://hogehoge.com/contents/list/?p=4
```
こんな感じのURLの配列を作りたい。10個とかだったら手で修正してしまうが、50個とかあるとさすがにめんどくさい。この配列をtimesメソッドを使って作ってみる。

```rb
urls = []
i = 0
50.times do
  i += 1
  urls.push "http://hogehoge.com/contents/list/?p=#{i}"
end
```
とりあえず動くことは動く。でもあまりかっこよくないので、uptoメソッドで書きなおしてみた。

```rb
urls = []
1.upto(50) do |i|
 urls.push "http://hogehoge.com/contents/list/?p=#{i}"
end
```
うん、こっちのほうがなんかわかりやすい。で、これをメソッドにしてみる。

```rb
def urls
  urls = []
  1.upto(47) do |i|
    urls.push "http://hogehoge.com/contents/list/?p=#{i}"
  end
end
```
出力結果
```rb
[4] pry(main)> urls
=> 1
```
あら、1が返ってきてしまう。とりあえず return を入れて urls の配列の中身を返してとお願いしてみる。

```rb
def urls
  urls = []
  1.upto(47) do |i|
    urls.push "http://hogehoge.com/contents/list/?p=#{i}"
  end
  return urls
end
```
出力結果
```
[6] pry(main)> urls
=> ["http://hogehoge.com/contents/list/?p=1",
 "http://hogehoge.com/contents/list/?p=2",
 "http://hogehoge.com/contents/list/?p=3",
 "http://hogehoge.com/contents/list/?p=4",
 "http://hogehoge.com/contents/list/?p=5",
 "http://hogehoge.com/contents/list/?p=6",
 "http://hogehoge.com/contents/list/?p=7",
 "http://hogehoge.com/contents/list/?p=8",
 "http://hogehoge.com/contents/list/?p=9",
 "http://hogehoge.com/contents/list/?p=10",
＃以下略
```
おお、返ってきたー。でもここで疑問。さっき戻ってきた1は何だったんだろう。いろいろ検証してみる。

```rb
def urls
 urls = []
 i = 0
 50.times do
   i += 1
   urls.push "http://hogehoge.com/contents/list/?p=#{i}"
 end
end
```
出力結果
```
[10] pry(main)> urls
=> 50
```

```rb
text = [1,2,3]
text.each do |number|
  p number
end
```

出力結果

```
1
2
3
=> [1, 2, 3]
```
ブロックは一番最初の値を返すんですかね？？
きちんと仕様について勉強せねば。。
groupware

#開発のベースとして使えそうなグループウエア
##apache ofbiz　http://ofbiz.apache.org/
ApacheのOFBiz ™は、ERP （エンタープライズ·リソース·プランニング） 、 CRM （顧客関係管理）のためのフレームワークコンポーネントとビジネスアプリケーションを含む企業プロセスの自動化のためのオープンソース製品である、 Eビジネス/ Eコマース、 SCM （サプライチェーンマネジメント） 、 MRP （製造資源計画） 、 MMS / EAM （保守管理システム/エンタープライズ·アセット·マネジメント） 、 POS（販売時点） 。
ApacheのOFBizは、信頼性の高い、安全で拡張性の高いエンタープライズ·ソリューションの基盤と出発点を提供します。 、すぐに使えるそれを使用して、それをカスタマイズしたり、あなたの最も挑戦的なビジネスニーズを実装するためのフレームワークとして使用します。 OFBizを使用すると、すぐに従来のエンタープライズオートメーションシステムの巨大な展開と保守コストをかけずに始めることができます。あなたのビジネスが成長するにつれて、あなたはより洗練されたニーズを満たすために機能を拡張することができます。
ApacheのOFBizは、 Apacheライセンスバージョン2.0の下でライセンスされています。
ApacheのOFBizプロジェクトは、Apache Software Foundationの一部です。

##[INFO scope ](https://www.infoscoop.org/ja/)
###コンセプト

「infoScoop」は個人のワークスタイルに合わせて進化する情報ポータルです。業務システムや社内外の膨大な情報の中から個人にとって重要な情報の提供や、自由な配置と整理を実現し、個人の情報処理スキルやワークスタイルに合わせた 「使いたくなる」 ポータルを実現します。

###機能・特徴

- ポータル機能に特化したオープンでシンプルな導入を実現
- 直感的でわかりやすい軽快なインターフェイス（操作性）でスムーズな全社展開
- 個人の価値観を重視したポータルで生産性向上を実現<br>
※柔軟なRSSリーダーや同一ガジェットの複数登録等、個人のスタイルにあったパーソナライズ設定と操作性が可能です。
- ポータル上のコンテンツがガジェットとして独立して動作するため、連携システムの稼働状況に依存しない運用を実現
- 国産製品、　お客様の　「声」　を反映した共同開発製品
- OpenSocial API対応により様々なアプリケーションと連携可能
capistrano-sidekiqでホストのroleごとにsidekiqのconfigを設定

#やりたいこと

workerなサーバーが複数台あって、それぞれで走らせたいジョブがちがうときに、capistranoのroleでsidekiqのconfigを切り替えたい。

#やり方

[Sidekiq config per host](https://github.com/seuros/capistrano-sidekiq/pull/81)というマージされてないプルリクがあってこれで解決できる。

上記で[コメント](https://github.com/seuros/capistrano-sidekiq/pull/81#issuecomment-103700088)されているように設定したらできる。便利。
タスク管理を使っていくにあたって


# 初めに
ぼくは普段AD（アシスタントの方）をやっており、タスク管理についてメモ書きを残します。

# 個人レベルのタスク管理
現在僕は個人レベルのタスクはtodoistを使っています。
主な理由としては
- UIが簡単
- 個人レベルなら十分な機能
- ただ羅列させるだけでおｋ
- レベルあげたい
などがあります。
実際に使ってみて感想は、メモ書き＋＠の機能があれば個人単位では十分だなって思いました。
個人で管理したいタスクの内容は
- 何を
- いつまでに
- どの優先度で
だけだったので、へんな機能がないシンプルな方が使いやすかったです。
上記内容ならエクセルでもいいかも。。。
スマホでさわれないけど

# 少人数単位のタスク管理
人数が少ないプロジェクトだと僕はtrelloを使っています。
trelloなら
- UIが簡単
- 直感的に何が残っているのかわかる
- コメントでのやり取りが楽
- タイムラインのようなものがあり、やり取りが一応追える
などのことができるので、少ない人数の進捗を管理するのは楽でした。
ただ個人単位のタスクだとすこしできることが多いので、めんどいなって思ってしまいます。。。（コメントなんて使わないし）
少人数でのタスクで管理したいのは
- 誰が
- いつまでに
- 何を
- どれくらいやるのか
- 進捗は
だけなので、（本当はwikiを使ったほうがいい時もあるかも）UIが素敵なtrelloを使いました。カンバン型タスク管理ツールはほかにもありますが、個人的にはこれが一番無料で使いやすいって思います～

# 大人数でのタスク管理
10人を超えると正直trelloだと追い切れなくなってくるときがあるので、その時はbacklogかredmineが使いやすいです。
上記2つだと
- wikiが使える
- ファイル管理もできる
- チケット単位でのやり取りが楽
- ガントチャートが見える(trelloでも拡張すればできる、みにくいけど。。)
- 過去ログを追いやすい
などがあります。ただできることの幅が多く、ルールをしっかりと決めないとただ使いにくいツールになってしまうので、管理責任者のような役割が必要になってきます。

大人数でのタスクで管理したいのは
- 誰が
- いつまでに
- 何の何を
- どの単位で
- どれくらい
- やっているのか
- 進捗は
- 前はどーだった
だと思っています。（あくまで僕はADなので、足りないところは教えてくださいorz）

# まとめ
一言にタスク管理って言っても何がしたいかによってツール選定が変わってきます。
正直付箋に張るが一番楽だったりするのですが、共有できず付箋がはがれてなくすって事件が起きるので、、、
vmware workstation > 入力のグラブ > 仮想マシンにキーボード、マウス入力を限定?

関連 http://qiita.com/7of9/items/c5e39a8c08ca7a6e5af6

http://japan-tips.blogspot.jp/2012/02/vmware-workstation.html

> Ctrlキー+ G	キーボードの入力フォーカスをつかむ

使っているバージョンのvmware workstationの場合、以下となっている。

> 入力のグラブ Ctrl+G


作ろうとしているキー入力転送ソフトに関係するかもしれない。

http://pubs.vmware.com/fusion-5/index.jsp?topic=%2Fcom.vmware.fusion.help.doc%2FGUID-8905F215-ED84-4C5D-80A9-C372670321FC.html

> マウスとキーボードの入力を仮想マシンに取り込むように設定することができます。そうすると、マウス ポインタは仮想マシン ウインドウ内に限定され、キーボードとマウスのすべての入力は仮想マシンに送られます。
通常、VMware Tools がインストールされている場合、仮想マシン内をクリックすると、キーボードとマウスの入力は仮想マシンに送られます。Mac デスクトップ上をクリックすると、キーボードとマウスの入力は Mac ホストに送られます。すべての入力を仮想マシンに送ることができます。

自分の用途としては、使いそうにない。
Let's Encryptで複数サブドメインの証明書を発行して自動更新を設定する

# 動作環境

CentOS 7.2
nginx 1.9.15

# ドメイン1つの場合は

こちらを参考に。
[Let's Encrypt で手軽に HTTPS サーバを設定する - Qiita](http://qiita.com/ww24/items/9fa19594b4e3a8eb9b6f)

# 複数サブドメインのときの変更点

各ドメインのHTTPに対して、以下のように設定する。

```
server {
    include letsencrypt.conf;

    listen 80;
    listen [::]:80;
    server_name your.domain;

    # 証明書作成後に書いてもよい。くくっておかないとwebrootもhttpsに飛ばされる
    # locationは1つしか当たらないことを利用して、webrootについてはhttpで解決するようにしておく
    location / {
        return 301 https://$host$request_uri;
    }
}
```

/etc/nginx/letsencrypt.confを作成する。
下で指定している/var/www/html/letscnryptはディレクトリを作成し、nginxが読み書きできるようにしておく。

```
location ^~ /.well-known/acme-challenge {
    default_type "text/plain";
    root /var/www/html/letsencrypt;
    access_log /var/log/nginx/access_letsencrypt.log;
    error_log /var/log/nginx/error_letsencrypt.log;
}
```
ここでリロード。

```
nginx -t && systemctl reload nginx
```

証明書作成のコマンドは、たとえばこのようになる。

```
/path/to/letsencrypt-auto certonly --webroot -w /var/www/html/letsencrypt -d your.domain1 -d your.domain2 ……
```

一度通れば、更新はこのように。ここはドメイン1つのときと変わらない。

```
/path/to/letsencrypt-auto renew --force-renew
```

あとはこれをcronにセットしておく。

```
0 5 * * * /path/to/letsencrypt-auto renew --force-renew && systemctl reload nginx
```
Sidekiqでqueueごとに並行数を設定する

# 問題

「worker1で複数種類のジョブを実行したいけどそれぞれ並行に動かせる数がちがうので設定したい」
ようなシーンでSidekiqはデフォでは対応できない。

# 解決
[sidekiq-limit_fetch](https://github.com/brainopia/sidekiq-limit_fetch)という素敵gemがある。

```rb:Gemfile
gem 'sidekiq-limit_fetch'
```

して

```rb:sidekiq.yml
:queues:
  - queue_name1
  - queue_name2

:limits:
  queue_name1: 5
  queue_name2: 10
```

したら設定できる。便利。