OmniAICreator/Qiita-1.07M huggingface dataset:
Ceph Storage on Proxmox

# 参考

* [Ceph Storage on Proxmox | JamesCoyle.net](http://www.jamescoyle.net/how-to/1213-ceph-storage-on-proxmox)
* [Manually Mount a Ceph Storage Pool in Proxmox | JamesCoyle.net](http://www.jamescoyle.net/how-to/1253-manually-mount-a-ceph-storage-pool-in-proxmox)


## cephタブが見えるようになるまで

```bash:各proxmoxで実行
pveceph install
pveceph init --network 192.168.30.0/24
# /etc/pve/ceph.conf が作成される。
pveceph createmon
```

ここまで成功。


## OSDの作成

以下コマンドラインでもできるし、WebUIの`ceph->Disks->Create: OSD`でも出来る。

WebUIのほうが推奨。

```bash:osdの作成
# pveceph createosd /dev/sdc
create OSD on /dev/sdc (xfs)

***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format.
***************************************************************

GPT data structures destroyed! You may now partition the disk using fdisk or
other utilities.
The operation has completed successfully.
Information: Moved requested sector from 34 to 2048 in
order to align on 2048-sector boundaries.
The operation has completed successfully.
Information: Moved requested sector from 10485761 to 10487808 in
order to align on 2048-sector boundaries.
The operation has completed successfully.
meta-data=/dev/sdc1              isize=2048   agcount=32, agsize=22851740 blks
         =                       sectsz=512   attr=2, projid32bit=0
data     =                       bsize=4096   blocks=731255665, imaxpct=5
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0
log      =internal log           bsize=4096   blocks=357058, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
The operation has completed successfully.
```

## フォーマット

```bash:
# ceph-disk zap /dev/sdc
Caution: invalid backup GPT header, but valid main header; regenerating
backup header from main header.

Warning! Main and backup partition tables differ! Use the 'c' and 'e' options
on the recovery & transformation menu to examine the two tables.

Warning! One or more CRCs don't match. You should repair the disk!

****************************************************************************
Caution: Found protective or hybrid MBR and corrupt GPT. Using GPT, but disk
verification and recovery are STRONGLY recommended.
****************************************************************************
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
GPT data structures destroyed! You may now partition the disk using fdisk or
other utilities.
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
The operation has completed successfully.
```

OS再起動し、再度OSDタブを確認

![スクリーンショット 2014-11-19 8.10.49.png](https://qiita-image-store.s3.amazonaws.com/0/25728/0924f93b-7768-cff2-e5e7-10b331158f1b.png)

見えていることを確認。

ここから先の使い方はわからなかった。
processingインストールメモ

https://processing.org/download/から落としたとのインストールの際に
特にインストール先を選ばないので自分できちんと指定　Windows
MACはそのまま動いたのでやはり適当な場所　アプリケーション関連に移動
ただ実行ファイルは　ユーザー\Myドキュメントかにできるようになっていた
bundle exec xxxのスクリプト中でbundle installする

capistranoを使って、ローカルにrailsアプリをclone/assetes precompileまでやってからrsyncでデプロイしようとしたらハマった。
capistranoに限らずbundle exec scriptして、その中でbundle installすると発生するようなのでメモしておく。

# 現象

bundle exec scriptした中でbundle installすると、scriptを実行した時点の設定が引き継がれていて、bundle installが期待通りに走らない。

sctiptを実行するディレクトリのGemfileがこうなっていて

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

gem 'capistrano'
gem 'capistrano_colors'
gem 'capistrano-bundler'
gem 'capistrano-rails'
```

以下のようなテストコードを走らせてみると

```test.rb
Dir.chdir("tmp/deploy") do
  puts "--- current dir ----"
  system "pwd"
  puts "--- current bundle config ---"
  system "bundle config"
  puts "--- bundle install ---"
  system "bundle install --path=vendor/bundle --without development test"
end
```

bundle execしたところの情報が引き継がれていて、bundle installが期待通りに走らない

```
$ bundle exec ruby test.rb
--- current dir ----
/home/paty/work/git/capistrano3/tmp/deploy
--- current bundle config ---
Settings are listed in order of priority. The top value will be used.

path
Set for your local app (/home/paty/work/git/capistrano3/.bundle/config): "vendor/bundle"

gemfile
Set via BUNDLE_GEMFILE: "/home/paty/work/git/capistrano3/Gemfile"
...

--- bundle install ---
Using rake (10.3.2)
Using json (1.8.1)
...
(tmp/deployのGemfileは参照されない)
```

# 対応方法
こちらのサイトを参考にさせていただいた http://blog.kyanny.me/entry/2012/04/25/074256
どうやらbundlerの環境変数を引き継いだままになっているのが問題とのこと

今回はBundler.with_clean_envを使うことで期待通りの挙動にできた。

```test.rb
Dir.chdir("tmp/deploy") do
  Bundler.with_clean_env do
    ...
  end
end
```
C# on Mono を一発実行できないか調べてみた

macでUnity 3Dの開発とかをしている時に、ちょっとしたテストコードをUnityで実行するのもめんどくさいし、mono developから実行するのもめんどくさい。

test.cs とか作ってもいいんだけど.exe作って実行して…の二度手間が面倒なので調べた。

# monoのインストール方法
適当に調べてください。
Unityインストールしてると自動でついてきます。


# オンラインコンパイラ
すぐに思いついたのはこれ。
http://www.compileonline.com/compile_csharp_online.php とか
でもこれじゃ独自ライブラリとか使えない…。

# monoDevelop上で新規にコンソールプロジェクトを追加する
今はXamarinStudioですが。
結局これが一番楽で早くて汎用性高かったです（Unity使用の場合）。

# C#インタプリタを使う
※ http://qiita.com/iwadon さんに教えて頂きました。
`csharp`コマンドで対話型実行環境が作れます。
rubyの `irb` 、 python の `python` コマンド と同じ、というとわかりやすい？

短いテストコードの場合は、圧倒的にこれが便利ですね！
vagrant-omnibus利用時に、site-cookbooks内に作成したcookbookが見つからないエラー

こんなかんじでchefのcookbookを作り

~~~sh
knife cookbook create -o site-cookbooks hoge
~~~

こんなかんじでVagrantfileを書き

~~~
# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "chef/centos-6.5"
  config.omnibus.chef_version = :latest

  config.vm.provision "chef_solo" do |chef|
    chef.add_recipe "hoge"
  end
end
~~~

vagrant up で起動したらchefのエラー(T_T)

~~~
INFO: *** Chef 11.12.8 ***
INFO: Chef-client pid: 6877
INFO: Setting the run_list to ["recipe[hoge]"] from CLI options
INFO: Run List is [recipe[hoge]]
INFO: Run List expands to [hoge]
INFO: Starting Chef Run for localhost
INFO: Running start handlers
INFO: Start handlers complete.
ERROR: Running exception handlers
ERROR: Exception handlers complete
FATAL: Stacktrace dumped to /var/chef/cache/chef-stacktrace.out
ERROR: Cookbook hoge not found. If you're loading hoge from another cookbook, make sure you configure the dependency in your metadata
FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)
completed! Any errors should be visible in the
fix your recipes so that they properly complete.
~~~

cookbookが見つからないって言われるらしい

~~~
ERROR: Cookbook hoge not found. If you're loading hoge from another cookbook, make sure you configure the dependency in your metadata
~~~

Vagrantfileに、cookbooks_pathを追加したらうごいた！！

~~~
# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "chef/centos-6.5"
  config.omnibus.chef_version = :latest

  config.vm.provision "chef_solo" do |chef|
    chef.cookbooks_path = ["./cookbooks", "./site-cookbooks" ] # この行追加
    chef.add_recipe "hoge"
  end
end
~~~
あとからまとめて.gitignoreする方法

## .gitignore を設置

GitHub に `.gitignore` のテンプレートがあるのでそれを使うとらくです。

* [github/gitignore](https://github.com/github/gitignore)

## .gitignore をコミット

チームで開発していたり、複数のマシンで編集する可能性がある場合は、他の環境でも同様にこれらのファイルを無視してくれるように、`.gitignore` 自体をコミットしてしまいましょう。

```bash
$ git add .gitignore
$ git commit -m "Add ignore pattern"
```

## 無視したいファイルをリポジトリから削除

`.gitignore` を設置しても、既にリポジトリに登録されているファイルは無視されないので、無視したいファイルを管理対象から外します。

```bash
$ git rm --cached hoge.tmp
```

（なお、管理対象から外れるだけで、ローカルにあるファイルは削除されません）

ただ、既に大量のファイルが登録されている場合、これをひとつひとつやっていたら大変なので、以下のように `git ls-files` の `-i` と `--exclude-from` オプションを使って、まとめて除外するとらくです。

```bash
$ git rm --cached `git ls-files --full-name -i --exclude-from=.gitignore`
```

* `-i` は `--ignored` の略で、Git に登録されているファイルの内、次に指定する方法で無視するファイルの一覧を出力します。
* `--exclude-from=<ignore-file>` を指定すると、`<ignore-file>` に記述されたパターンにマッチするファイルを、無視するファイルとして扱います。
* `--exclude-standard` を指定すると、Git が標準で無視リストとして扱う `.gitignore` や `.git/info/exclude` などのファイルに書かれたパターンにマッチするファイルを、無視するファイルとして扱います。

`--exclude-standard` を使う場合は、以下のように入力します。

```bash
$ git rm --cached `git ls-files --full-name -i --exclude-standard`
```

最後に、確認して問題なければコミットしましょう。

```bash
$ git status
$ git commit -m "Remove ignore files"
```


# 追記

* 2014/07/07 まとめて除外するコマンドを修正しました。
* 2014/10/10 説明をわかりやすくなるように編集しました。
即時関数をcall(this)で呼ぶことについて


## 即時関数あれこれ

JavaScriptの即時関数はいろんな書き方が出来る

```js
// よく見かける即時関数
(function () {
  // ...
})();

// underscore.jsの即時関数
(function () {
  // ...
}).call(this);
```

## `underscore.js`の即時関数

[underscore.js](http://underscorejs.org/)は何故callで関数を呼び出しているのかというと
JavaScripstのstrictモードでは関数内の`this`が`undefined`になる

```js:e.g.
'use strict';

// よく見かける即時関数
(function () {
  console.log(this); // undefined
})();

// underscore.jsの即時関数
(function () {
  console.log(this); // 即時関数の外のthisが表示される
}).call(this);
```

strictモードでない場合はどちらの記述でも関数内の`this`は実行時の`this`が引き渡されるので
strictモードとそうでない場合の振る舞いの違いを吸収するため
`call(this)`で無名関数を呼んでいるのだと思われる

## 蛇足

`grunt-contrib-coffee`などでCoffeeScriptから変換されるJavaScriptも`(function () {}).call(this);`にラップされている
たぶん同じ理由なんだと思う
Slim3でjava.io.CharConversionException: Not an ISO 8859-1 character:が出てきた時

## Slim3 on GAEやってたらこんなエラーが返ってきた

```
java.io.CharConversionException: Not an ISO 8859-1 character: 日
```

うわわわ。なんだこれ・・
丁度メール送信の部分やってたせいで、絶対メールの文字化けとかだろ、とか思ってたんですが、大外れでした。。

## 犯人

↓↓こういうことすると発生します。↓↓

```
@Override
public Navigation run() throws Exception {
    response.setCharacterEncoding("utf-8");
    response.setContentType("application/json");
    // ... なんやかんや
    response.getOutputStream().println("日本語のメッセージを返したかったんだよー");
}
```

## 正しくは・・

```
public void writeResponseBody(HttpServletResponse response, String body)
        throws UnsupportedEncodingException, IOException {
    Writer writer = new PrintWriter(new OutputStreamWriter(
            response.getOutputStream(), "utf-8"));
    writer.write(body);
    writer.flush();
    writer.close();
}
```

代わりにこんな子を書いて呼んであげれば良い。

## 結論

別にSlim3は悪くない・・
悪いのはちゃんとエンコード指定無しにOutputStreamを使う人。。
springでrspecの実行時間を早くする

https://github.com/rails/spring

Gemfile
```
group :development do
  gem 'spring'
  gem "spring-commands-rspec"
end
```

```
% bundle exec spring binstub rspec
```

springを停止して起動することで、再読み込みかな
```
bundle exec spring stop
bundle exec spring start
```


# 時間を測定

## 1回目

```
bin/spring rspec spec/models/auto_comment_spec.rb

Finished in 17.44 seconds (files took 5.62 seconds to load)
17 examples,  0 failures
```

## 2回目

```
Finished in 6.83 seconds (files took 2 minutes 15.9 seconds to load)
17 examples,  0 failures
```
php、explode()、文字列を文字列により分割する

php、explode()
==========


■about
----------

文字列を文字列により分割する




■code
----------

```php:php
list($a_qnum, $a_anum) = explode("_", $anum);
```




■reference
----------

PHP: explode - Manual
http://www.php.net/manual/ja/function.explode.php
AWS EC2の情報を取得するスクリプト


```ruby:ec2.rb

#!/usr/bin/env ruby

##ライブラリのロード
require 'rubygems'
require 'aws-sdk'
require 'yaml'

config = YAML.load(File.read("yamlファイル名"))

AWS.config(config)

#################################################################
##       EC2                                                     #
##################################################################
##EC2をNEWする
ec2 = AWS::EC2.new

#EC2のインスタンス情報を取得して表示
#instance.ip_address IPアドレス
#instance.public_dns_name PublicDNS名
ec2.instances.each do |instance|
      puts "#{instance.ip_address}\t#{instance.public_dns_name}"
end
```
***
リージョンの一覧は下記URLをご覧ください。
http://docs.aws.amazon.com/general/latest/gr/rande.html

```yaml:test.yml
access_key_id: アクセスKey
secret_access_key: シークレットアクセスKey
auto_scaling_endpoint: autoscaling.ap-northeast-1.amazonaws.com
cloud_front_endpoint: cloudfront.amazonaws.com
cloud_watch_endpoint: monitoring.ap-northeast-1.amazonaws.com
emr_endpoint: elasticmapreduce.ap-northeast-1.amazonaws.com
elasticache_endpoint: ec2.ap-northeast-1.amazonaws.com
elastic_beanstalk_endpoint: elasticbeanstalk.ap-northeast-1.amazonaws.com
elastic_load_balancing_endpoint: elasticloadbalancing.ap-northeast-1.amazonaws.com
elastic_transcoder_endpoint: elastictranscoder.ap-northeast-1.amazonaws.com
ec2_endpoint: ec2.ap-northeast-1.amazonaws.com
iam_endpoint: iam.amazonaws.com
s3_endpoint: s3-ap-northeast-1.amazonaws.com
rds_endpoint: rds.ap-northeast-1.amazonaws.com
```
HyClops for Zabbix に関するメモ

◆できること
・AWSコンソール-EC2-INSTANSES　で見ることが出来る情報を収集する
・Zabbixの画面からEC2サーバの起動停止、SSH接続ができる

◆できないこと
・ELBやRDSなどAWS上の他のものに関しては情報収集できない。EC2のみ

◆ログの出力先
/opt/hyclops/logs

◆hyclops関連の実行ファイルの置き位置
/usr/lib/python2.6/site-packages/hyclops-0.2.0-py2.6.egg/hyclops/connector

◆HyClopsにてAWSのEC2を登録すると、PrivateIPによる登録となり、Zabbx-Agentとの紐付きが確保されない。

下記のファイルの修正を行う。
/usr/lib/python2.6/site-packages/hyclops-0.2.0-py2.6.egg/hyclops/connector/ec2.py

```pyson:ec2.py
#下記の行を探し、⇒private を public に修正

#193行目
"interfaces": self.addresses_to_interfaces([node.extra["dns_nam
e"]] + node.private_ips),

#235行目
for new_addr, old_interface in
map(None, [node.extra["dns_name"]] + node.private_ips,
old_interfaces):

```

private→publicにするとZabbix Server上の表記がPublicIPになる。
だけど、標準でDNS側を使用しているので、IP側に切り替えないとAgentと紐付かない（検討中）
php、ini_set()、設定オプションの値を設定する

php、ini_set()
==========


■about
----------

設定オプションの値を設定する




■code
----------

```php:php
ini_set('session.use_cookies', 0);
ini_set('session.use_only_cookies', 0);
ini_set('session.use_trans_sid', 1);
```




■reference
----------

PHP: ini_set - Manual
http://jp1.php.net/manual/ja/function.ini-set.php
php、trim()、文字列の先頭および末尾にあるホワイトスペースを取り除く

php、trim()
==========


■about
----------

文字列の先頭および末尾にあるホワイトスペースを取り除く




■reference
----------

PHP: trim - Manual
http://jp1.php.net/manual/ja/function.trim.php
proxmoxで以前のホスト名がNode一覧に表示される場合

mox01からvirtualmoxにホスト名を変更し再起動したところ、
以前のホスト名mox01が表示された。
また、vzlist -aでコンテナ一覧が表示されない。

調査したところ、以下のように/etc/pve/nodes/mox01/が存在することが原因。

```bash:今の
/etc/pve/nodes/virtualmox
/etc/pve/nodes/virtualmox/openvz
/etc/pve/nodes/virtualmox/pve-ssl.key
/etc/pve/nodes/virtualmox/pve-ssl.pem
/etc/pve/nodes/virtualmox/qemu-server
/etc/pve/nodes/virtualmox/priv
```

```bash:以前の
/etc/pve/nodes/mox01
/etc/pve/nodes/mox01/openvz
/etc/pve/nodes/mox01/openvz/100.conf
/etc/pve/nodes/mox01/openvz/101.conf
/etc/pve/nodes/mox01/pve-ssl.key
/etc/pve/nodes/mox01/pve-ssl.pem
/etc/pve/nodes/mox01/qemu-server
/etc/pve/nodes/mox01/priv
```

```bash:ファイルを移動
# cd /et/pve/nodes
# mv mox01/openvz/*conf virtualmox/openvz/
```

100と101がvirtualmoxに移動した。

![スクリーンショット 2014-06-20 13.40.30.png](https://qiita-image-store.s3.amazonaws.com/0/25728/94f3a209-9508-89d6-c976-14778fae16ae.png)

```bash:ざっくり削除
# rm -r mox01
```
郵便番号や市区町村データを取り扱うときにはまったこと

今とりかかってる案件で、郵便番号から自治体を特定して云々という処理をやっているんですが、いくつかはまりポイントがあったので備忘録的にポストしときます

## 自治体コードは6桁のものと5桁のものがある

これはすごく単純なお話で6桁のものは最後の1桁はチェックディジット
残りの上5桁から機械的に計算できます


## 郵便番号は必ず1つの町名に紐づいているわけではない

郵便番号→住所入力というフォームを作るときにハマる
例）郵便番号 807-0042
福岡県	遠賀郡水巻町	吉田
福岡県	遠賀郡水巻町	吉田団地

私の住んでいる宮城県にも
例）郵便番号 981-2114
宮城県	伊具郡丸森町	赤堀
宮城県	伊具郡丸森町	泉
宮城県	伊具郡丸森町	泉下
宮城県	伊具郡丸森町	大目
宮城県	伊具郡丸森町	北前
宮城県	伊具郡丸森町	天王

合併で旧・西春日井郡春日町を編入した愛知県清須市にこういうすさまじいデータがあります
例）郵便番号 452-0961 
愛知県	清須市	春日明河原
愛知県	清須市	春日一番割
愛知県	清須市	春日壱屋敷
愛知県	清須市	春日一本松
愛知県	清須市	春日稲荷
愛知県	清須市	春日杁前
愛知県	清須市	春日午
愛知県	清須市	春日落合
愛知県	清須市	春日上丑
愛知県	清須市	春日上川畑
愛知県	清須市	春日上河原
愛知県	清須市	春日上須ケ田
愛知県	清須市	春日上高畑
愛知県	清須市	春日上堤クロ
愛知県	清須市	春日上中割
愛知県	清須市	春日河原
愛知県	清須市	春日桑
愛知県	清須市	春日小塚西
愛知県	清須市	春日小塚南
愛知県	清須市	春日小松生
愛知県	清須市	春日郷裏
愛知県	清須市	春日郷前
愛知県	清須市	春日三番割
愛知県	清須市	春日下丑
愛知県	清須市	春日下河原
愛知県	清須市	春日下堤クロ
愛知県	清須市	春日下中割
愛知県	清須市	春日新田畑
愛知県	清須市	春日新堀
愛知県	清須市	春日新堀北
愛知県	清須市	春日定ノ割
愛知県	清須市	春日須ケ田
愛知県	清須市	春日須ケ畑
愛知県	清須市	春日大河戸
愛知県	清須市	春日高畑
愛知県	清須市	春日堤クロ
愛知県	清須市	春日寺廻り
愛知県	清須市	春日樋
愛知県	清須市	春日酉
愛知県	清須市	春日中河原
愛知県	清須市	春日長畑
愛知県	清須市	春日西須ケ畑
愛知県	清須市	春日西牧前
愛知県	清須市	春日西牧南
愛知県	清須市	春日西余部
愛知県	清須市	春日二番割
愛知県	清須市	春日弐屋敷
愛知県	清須市	春日野方
愛知県	清須市	春日八幡
愛知県	清須市	春日八幡裏
愛知県	清須市	春日八幡前
愛知県	清須市	春日八幡南
愛知県	清須市	春日東小塚
愛知県	清須市	春日東須ケ畑
愛知県	清須市	春日東出
愛知県	清須市	春日二ツ池
愛知県	清須市	春日振形
愛知県	清須市	春日堀田
愛知県	清須市	春日宮越
愛知県	清須市	春日宮重
愛知県	清須市	春日宮重町
愛知県	清須市	春日向河原
愛知県	清須市	春日屋敷
愛知県	清須市	春日夢の森
愛知県	清須市	春日四番割
愛知県	清須市	春日蓮花寺前


## 市区町村をまたいで同じ郵便番号を持つケースがある
政令指定都市や隣同士の町などによくあるパターン
前者の理由の場合は同じ町名なのに区が違うなどで、仙台市でも五橋という地名が1～2丁目は青葉区、3丁目は若林区などの例があります（仙台市の場合、区によって郵便番号の頭の98xのところが違うのでこのケースにははまらない）

例）
郵便番号 950-0000
新潟県	新潟市北区
新潟県	新潟市東区
新潟県	新潟市中央区
新潟県	新潟市江南区
新潟県	新潟市西区
新潟県	新潟市西蒲区

郵便番号 432-8053
静岡県	浜松市中区	法枝町
静岡県	浜松市南区	法枝町

郵便番号 907-0000
沖縄県	石垣市
沖縄県	八重山郡竹富町

## 市区町村はおろか県を飛び越えて同じ郵便番号を持ちうるケースがある
おそらく県境などで地理的・文化的な理由で集配局が同じケースじゃないかなというところで、こちらはレアながら3件あります

いずれも「以下に記載がない場合」のデータですがそこに該当する住所もあるわけで除外するわけにはいかない

郵便番号 498-0000
愛知県	弥富市
三重県	桑名郡木曽岬町

郵便番号 618-0000
京都府	乙訓郡大山崎町
大阪府	三島郡島本町

郵便番号 871-0000
福岡県	築上郡吉富町
大分県	中津市
HyClops for Zabbix のインストール

公式URL
http://tech-sketch.github.io/hyclops/jp/

リポジトリの追加
`sudo su -
curl http://download.opensuse.org/repositories/home:/fengshuo:/zeromq/CentOS_CentOS-6/home:fengshuo:zeromq.repo > /etc/yum.repos.d/zeromq.repo`

関連パッケージの追加
`su ec2-user
sudo yum install gcc gcc-c++ zeromq zeromq-devel python-devel python-setuptools ipmitool`

Pipのインストール
`sudo wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py`

Pythonモジュールのインストール
`sudo pip install apache-libcloud==0.13.2 zabbix-api pyzmq psphere python-daemon==1.6 configobj
sudo pip install ordereddict argparse
sudo pip install boto`

HyClopsのインストール
`sudo wget https://github.com/tech-sketch/hyclops/archive/0.2.0.tar.gz
sudo tar zxvf 0.2.0.tar.gz
sudo su -
cd /root
cd hyclops-0.2.0
python setup.py install`

サービスの自動起動設定
`#in case of SysV init
cp -a ./misc/init.d/redhat/hyclops /etc/init.d/`
`#in case of Upstart
cp -a ./misc/init.d/ubuntu/hyclops.conf /etc/init/`

外部スクリプトのコピー
`cp -a ./misc/externalscripts/* /usr/lib/zabbix/externalscripts`

権限設定
`chown zabbix:zabbix /usr/lib/zabbix/externalscripts
chmod u+x /usr/lib/zabbix/externalscripts/*`

HyClopsの設定
`vi /opt/hyclops/hyclops.conf`

サーバ起動設定
`chkconfig hyclops on
service hyclops start`

値のマッピング
名前:Script Return Code
0⇒uccess
1⇒failure

名前：Libcloud Node State
0⇒running
1⇒rebooting
2⇒terminated
3⇒pending
4⇒stopped

Zabbixに自動登録するための設定
`cd /root/hyclops-0.2.0/misc/import_data
vi globalmacros.xml`
⇒Zabbix サーバとHyClopsサーバが一緒の場合は不要

Zabbixのダッシュボード画面関連ファイルの置換
`sudo su -
cd /root/hyclops-0.2.0
python setup.py replace -d /usr/share/zabbix --zabbix-version=2.2`

Zabbix templates,scripts,globalmacroデータのインポート
`cd /root/hyclops-0.2.0
python setup.py import -f <zabbix frontend url> -u <zabbix username> -p <zabbix password>
python setup.py import -f http://localhost/zabbix -u Admin -p zabbix`

Cronの設定		
`crontab -u hyclops -e`

居なくなった仮想サーバに対する処理の記述を行う。（例　5分間隔）	
```crontab
*/5 * * * * /opt/hyclops/cron_scripts/delete_not_exist_hosts.py		
```	

削除時間を設定する場合 -d 日にち（例 10日後に削除を行う場合）
`*/5 * * * * /opt/hyclops/cron_scripts/delete_not_exist_hosts.py -d 10`
cocos2d-x 3.0でandroidのビルドをする時に、常にデバッグフラグが立ってしまう問題


cocos2d-x 3.0で `cocos run -p android -m release` を使ってandroidのリリースビルドをしても、
`COCOS2D_DEBUG` フラグが立ってしまっています。
このフラグが立っていると、ログ出力やassertなどが無効化されません。

## 原因

`proj.android/jni/Application.mk` が以下のようになっているためです。

```proj.android/jni/Application.mk
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -DCC_ENABLE_CHIPMUNK_INTEGRATION=1 -DCOCOS2D_DEBUG=1 -std=c++11 -fsigned-char
```

## 対処方法

### ちょっとした問題を抱えた方法

`proj.android/jni/Application.mk` が以下のように変更します。

```proj.android/jni/Application.mk
APP_STL := gnustl_static
ifdef NDK_DEBUG
  APP_CPPFLAGS := -frtti -DCC_ENABLE_CHIPMUNK_INTEGRATION=1 -DCOCOS2D_DEBUG=1 -std=c++11 -fsigned-char
else
  APP_CPPFLAGS := -frtti -DCC_ENABLE_CHIPMUNK_INTEGRATION=1 -std=c++11 -fsigned-char
endif
```

#### 解説
これは、デフォルトで `cocos run` が `ndk-build` を呼ぶ時に、
デバッグビルドの時は `NDK_DEBUG=1` を付加して呼んでいるためです。

そのため `Application.mk` ファイルで場合分けすれば、デバッグフラグを自動的に調整できます。

### ライブラリファイルが更新されない問題

以上の方法を実行すればデバッグビルドとリリースビルドでデバッグフラグを自動的に調整できますが、	1つ大きな問題があります。
それは、ndk-buildがライブラリファイルである `*.a` や `*.so` ファイルの出力先を
デバッグビルドとリリースビルドで共用しているため、
オブジェクトファイルである `*.o` の作り分けができても、ライブラリファイルの更新が上手くいかない可能性があります。

例えば、`Application.mk` ファイルを変更した状態で

1. デバッグビルド
1. リリースビルド
1. デバッグビルド

を順に実行すると、最後のデバッグビルドの時は変更がないため `*.o` ファイルが更新されず、
リリースビルドでできた最終生成物より日付が新しくならず、
ライブラリファイルが更新されません。
そのためデバッグビルドにも関わらず、実際にインストールされるのはリリースビルドのものになります。

### ライブラリファイルを常に新規作成する方法

ビルド実行前に `proj.android/obj/local/armeabi` にある `*.a` ファイルを常に削除すれば、ライブラリファイルは常に新規作成されます。
ただし `ndk-build clean` では、オブジェクトファイルまで消してしまいます。 

そこでビルド実行前に
`find proj.android/obj -name "*.a" | xargs rm -v`
を実行してしまいましょう。

さらにちょっと荒っぽいですが、
cocos2d-xのpythonスクリプトを書き換えることで、削除コマンドを自動的に実行させます。
具体的には、cocos2d-xのソースフォルダ (not プロジェクトルート) にある
`tools/cocos2d-console/plugins/project_compile/build_android.py` ファイルを以下のように書き換えます。

```python:tools/cocos2d-console/plugins/project_compile/build_android.py
(略)

    def do_ndk_build(self, ndk_root, ndk_build_param, build_mode):
        select_toolchain_version(ndk_root)

        app_android_root = self.app_android_root
        cocos_root = self.cocos_root
        ndk_path = os.path.join(ndk_root, "ndk-build")
        module_paths = [os.path.join(app_android_root, path) for path in self.ndk_module_paths]

        # delete *.a files
        rm_cmd = 'find %s/obj -name "*.a" | xargs rm -v' % app_android_root
        self._run_cmd(rm_cmd)

        # windows should use ";" to seperate module paths
        if cocos.os_is_win32():
            ndk_module_path = ';'.join(module_paths)
        else:
            ndk_module_path = ':'.join(module_paths)

(略)
``` 

これで全自動でデバッグビルドとリリースビルドを分けられるようになりました。
これがバグとしていつか修正されるといいですね。
またもっとスマートな方法を知っている方がいらしゃれば、ぜひ教えて下さい。
AWS SDK for Rubyのインストール


RVMのインストール
`sudo su -
\curl -L https://get.rvm.io | bash -s stable
su - ec2-user`

環境変数の再読み込み
`source /etc/profile.d/rvm.sh`

グループの追加
`sudo gpasswd -a root rvm
sudo gpasswd -a ec2-user rvm
sudo gpasswd -a zabbix rvm
`

Rubyのインストール（2.1.2）
`rvm install 2.1.2`

Rubyのバージョン確認
`ruby -v`

Rubyのデフォルトバージョンの指定
`rvm use 2.1.2 --default`

関連パッケージのダウンロード
`sudo yum install ruby-devel 
sudo yum groupinstall "Development Tools"
sudo yum install -y gcc libxml2 libxml2-devel libxslt libxslt-devel`

Rubyが導入されている環境にnokogiriをインストールする再にエラーを回避する方法を記述する。nokogiri 1.6.0からlibxml2 および libxslt を同梱し、導入先環境に合わせてビルドするようになったが、バグがありエラーとなってしまうことがあります。
■確認できている組み合わせ

Ruby
・1.9.3
・2.0.0
・2.1.2

Nokogiri
・1.6.0
・1.6.2

回避策：nokogiriに同梱されているパッケージではなく、元々システムにインストールされている						パッケージを使用する。
`NOKOGIRI_USE_SYSTEM_LIBRARIES=1 gem install nokogiri --no-rdoc --no-ri`

AWS SDKのインストール
`gem install aws-sdk`
pyramidフレームワークのiniファイルを分割する

<img src="http://cdn-ak.f.st-hatena.com/images/fotolife/s/sjisjis/20140213/20140213233620.png">


環境依存の設定を書くiniファイルを分割する方法を調べたのでメモ。

pythonは標準で定数定義をする機能が無いので現在iniファイルに定数を書いたりしてます。  
環境ごとにiniファイルは作るので同じ内容を複数に記述してしまっていて管理が煩雑になってしまうので共通のiniファイルを作って各環境iniファイルに読み込ませることにしました。

development.ini,production.iniの他にcommon.iniを用意する。

    #common.ini
    [common]
    name = 山田太郎
    tel = 03-xxxx-xxxx

development.ini,production.iniの環境ファイルに以下のようにしてcommon.iniのファイルパスを定義。(同じ階層においてる場合)

    common.path = %(here)s/common.ini


アプリの起動設定が書かれている \__ini__.pyでcommon.iniを読み込ませる関数を作成。


    def common_ini(settings):
        import os
        from ConfigParser import SafeConfigParser
        ini = settings.get("common.path")
        if ini is None:
            return
        if not os.path.exists(ini) and os.path.isfile(ini):
            raise ConfigurationError("ini is not found")

        conf = SafeConfigParser()
        conf.read(ini)
        return dict(conf.items('common'))


上記関数をmain関数でconfig.add_settingsする。

    def main(global_config, **settings):
        """ This function returns a WSGI application.
        from pyramid.config import Configurator
        config = Configurator(settings=settings)
        config.add_settings(common_ini(settings))

これで各環境iniファイルのほかに共通iniファイルを追加で読み込ませることが出来ます。
Bash:substring (例:7.* というファイルを 8.* に変更する)



```bash

    for i in 7* ; do git mv  $i 8${i:1:${#i}} ; done
    
```    

変数:

```bash

    $ export VAR=0123456789

```

変数の文字列長:

```bash

    $ echo ${#VAR}
    10
```

変数の切り出し${VAR:開始(0起点):長さ):

```bash

    $ echo ${VAR:5:2}                                                                                                
    56
```
クロージャの例

#クロージャを理解するためのメモ書き

一つの変数を、複数のクロージャが補足している例。

```js
function myFunc() {
  var name;

  func = {
    input: function(n) {
      name = n
    },
    output: function() {
      console.log(name);
    }
  }

  return func;
}

func = myFunc();

// ２つのクロージャが変数nameを補足している。
// そのため、関数inputで変数nameの値を操作すると
// 関数outputの出力結果も当然ながら変わる。

func.input('foo');
func.output();
// ブラウザのコンソールに、文字列fooが出力される
```

# ループとクロージャ
ループの中でクロージャを使うときに遭遇する不具合（というか、言語仕様の理解不足）の例と対策。

良いサンプルが思いつかなかったので、Mozillaが公開しているコードを引用。
[Mozilla](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Closures#Creating_closures_in_loops.3A_A_common_mistake)

## 期待通りに動いてくれない例

まずは、うまく動いてくれないコードから。
このコードは、それぞれの入力フォームにフォーカスがあうと、対応したメッセージが表示されるというもの。
しかし、実際に動かしてみると分かるのだけど、どのフォームを選択しても同じメッセージしか表示されない。
（具体的には、どれを選択しても「あなたの年齢 (17 歳以上)」というメッセージが出てくる）

```html
<p id="help">ここにヘルプが表示されます</p>
<p>Eメール: <input type="text" id="email" name="email"></p>
<p>名前: <input type="text" id="name" name="name"></p>
<p>年齢: <input type="text" id="age" name="age"></p>
```

```js
function showHelp(help) {
  document.getElementById('help').innerHTML = help;
}

function setupHelp() {
  var helpText = [
    {'id': 'email', 'help': 'あなたのEメールアドレス'},
    {'id': 'name', 'help': 'あなたのフルネーム'},
    {'id': 'age', 'help': 'あなたの年齢 (17 歳以上)'}
  ];

  for (var i = 0; i < helpText.length; i++) {
    var item = helpText[i];
    document.getElementById(item.id).onfocus = function() {
      showHelp(item.help);
    }
  }
}

setupHelp();
```

## 解説
**＊それは違うよ！！ってところがあるかもしれません。**

クロージャの話をしているので、どこが悪いかってのは大体予想が出来てしまうと思うけど。
悪さをしているのは、この部分。

```js
for (var i = 0; i < helpText.length; i++) {
  var item = helpText[i];
  document.getElementById(item.id).onfocus = function() {
    showHelp(item.help);
  }
}
```

ここで重要になってくるのは、どの変数が補足されているのか、そしていくつのクロージャが生成されているか、だ。

まず、クロージャの生成がされているコードを抜き出してみる。

```js
// 変数itemを無名関数が補足することでクロージャが生成される。
// もとのコードでは、クロージャの生成がループの中で行われているので
// ループの回数分、変数itemを補足したクロージャが生成される
var item = helpText[i];
document.getElementById(item.id).onfocus = function() {
  showHelp(item.help);
}
```

ループのたびに変数itemを補足したクロージャが生成されるのは別に良いのだけど
問題は、ループが進む事に変数itemの値がくるくると変更されているという点。
変数itemの値が変わるということは、それを変数itemを補足して生成されたクロージャにも当然影響があるということ…。

流れとしてはこんな感じかな

1. 変数itemを補足した１個目の無名関数がクロージャ化（以降、クロージャ1st）になる
1. ループが進んで変数itemの値が更新される（クロージャ1stが補足している変数） 
1. 2個目の無名関数も変数itemを補足してクロージャ化（クロージャ2nd）になる
1. ループが進んで変数itemの値が更新される（クロージャ1st, 2ndが補足している）
1. 3個目の無名関数も変数itemを補足してクロージャ化（クロージャ3rd）になる 
1. ループ終了
Bitbucketでソースコードリンクをシェアする際に最新バージョンを指定するやり方



##Bitbucket上の特定ファイルのリンクをシェアしたいとき
こんな感じで
![](http://i.gyazo.com/8879dc2c28091662fc561273fed1e1ec.png)
アドレスバーのURLを使ってます。
アドレスはこんな感じ -> [https://bitbucket.org/n0bisuke/git.practice/src/0077151930fb42f541a294fbab7e5fb13e859e10/lesson1/README.md?at=master](https://bitbucket.org/n0bisuke/git.practice/src/0077151930fb42f541a294fbab7e5fb13e859e10/lesson1/README.md?at=master)

###URLの内訳

```
https://bitbucket.org/[ユーザー名]/[リポジトリ名]/src/[コミットid]/lesson1/README.md?at=[ブランチ名]
```

###上記のURLだと特定のバージョンのファイルのリンクになります。
上記の例だとコミットidが`0077151930fb42f541a294fbab7e5fb13e859e10`のバージョンのlesson1/README.mdがシェアされます。


##変更があって、最新のコードを利用したいときは?

###この[コミットid]の部分をHEADにすればOK

[https://bitbucket.org/n0bisuke/git.practice/src/HEAD/lesson1/README.md?at=master](https://bitbucket.org/n0bisuke/git.practice/src/HEAD/lesson1/README.md?at=master)

これで最新のlesson1/README.mdをシェアできます。
等式制約を含む型制約の型シノニムは、haskell-src-extsでパース出来ない

~~~~haskell
{-# LANGUAGE ConstraintKinds, TypeFamilies #-}

-- GHCは問題なく処理するが、haskell-src-extsではパース出来ない
type Unavailable a b = (a ~ b)

hoge :: Unavailable a b => a -> b -> a
hoge = undefined
~~~~

なので、haskell-src-extsを使ったツールなどでパースされる事を期待するソースコードでは関数等の型制約を記述する部分に書こう！
Raspberry Pi でビルドがこんな感じで失敗したときの対処 ”collect2: ld terminated with signal 9 [Killed]”


#結論
メモリ不足でリンクが失敗している。対処は
1. CPU に偏った（GPUにメモリをあげない）メモリ設定
2. スワップファイルを増やす
前者ですめばラッキーですが、だめなときは後者、ただし物凄く時間がかかります...

#経緯
メモリが256MByte しかない初期型 Raspberry Pi 上で ffmpeg をビルドしていて表題の現象でリンクに失敗しました。調べてみると[メモリ不足によるリンクの失敗](http://forums.mozillazine.org/viewtopic.php?f=42&t=2300015)なのだそうです。
そこで、raspi-config で CPU と GPU のメモリ配分を極端に CPU 側に倒し(GPU 16MByte、残り CPU)にしたのですが現象は変わらず。
仕方がないのでスワップファイルをデフォルトの100MByte から1GByte に増やしたら、なんとか4時間かけてビルドできました

```bash:これに4時間かかりました...
pi@raspberrypi /usr/src/ffmpeg $ sudo make
LD	ffmpeg_g
CP	ffmpeg
STRIP	ffmpeg
CC	ffprobe.o
ffprobe.c: In function ‘value_string.isra.11.constprop.16’:
ffprobe.c:256:21: warning: ‘vali’ may be used uninitialized in this function [-Wuninitialized]
LD	ffprobe_g

CP	ffprobe
STRIP	ffprobe
CC	ffserver.o
LD	ffserver_g
CP	ffserver
STRIP	ffserver
pi@raspberrypi /usr/src/ffmpeg $ 
```

#作業
##1. メモリ設定の変更
###1.1 raspi-config を起動する
 
```bash
pi@raspberrypi /usr/src/ffmpeg $ sudo raspi-config
```
###1.2 こんな画面が開くので、8. Advanced Option を選択

![スクリーンショット 2014-06-20 12.18.49.png](https://qiita-image-store.s3.amazonaws.com/0/46544/f9d0da9b-cf46-5ad7-3d9f-6aa94da650d0.png "スクリーンショット 2014-06-20 12.18.49.png")

###1.3 A3 Memory Split を選択
![スクリーンショット 2014-06-20 12.19.31.png](https://qiita-image-store.s3.amazonaws.com/0/46544/c2d921f6-95e2-8597-b745-83681e01e213.png "スクリーンショット 2014-06-20 12.19.31.png")

###1.3 GPU のメモリを 16MByte に設定
![スクリーンショット 2014-06-20 12.19.53.png](https://qiita-image-store.s3.amazonaws.com/0/46544/b5dfbef0-9ca0-ad28-5f4f-056f58ab6bfa.png "スクリーンショット 2014-06-20 12.19.53.png")

###1.4 下矢印キーで Finish を選択

![スクリーンシ![アップロード中 スクリーンショット 2014-06-20 12.19.53.png]()ョット 2014-06-20 12.20.33.png](https://qiita-image-store.s3.amazonaws.com/0/46544/17ac2a58-f367-da97-2402-624a361a050e.png "スクリーンショット 2014-06-20 12.20.33.png")

###1.5 Yes でreboot。No で後でリブートしてもよいです
![スクリーンショット 2014-06-20 12.20.52.png](https://qiita-image-store.s3.amazonaws.com/0/46544/406eb09b-ae26-c19a-1330-56276433b918.png "スクリーンショット 2014-06-20 12.20.52.png")

##2. スワップファイルの増加
```bash
$ sudo service dphys-swapfile stop
$ sudo nano /etc/dphys-swapfile
$ sudo service dphys-swapfile start
```

###2.1 dphys-swapfile を止める
###2.2 nano editor が開いたら、デフォルトで 100になっている CONF_SWAPSIZE を 1024 に変更
![スクリーンショット 2014-06-20 12.35.23.png](https://qiita-image-store.s3.amazonaws.com/0/46544/569e153b-3b85-9495-7f01-f3fe2c389f90.png "スクリーンショット 2014-06-20 12.35.23.png")
###2.3 control + o で保存、control + x で nano を終了
###2.4 dphys-swapfile を再起動

#感想
リンクに物凄く時間がかかってしまうので swap を増やすのは最後の手段なんでしょうけど... メモリ512MByte の raspi が欲しい気も...
Dockerで簡単にElasticsearchのクラスタを試してみる

#やりたいこと
Dockerを使って手軽にElasticsearchクラスタを作る

##環境
* Windows8(ホスト)
* CoreOS(仮想マシン)
* Docker(仮想コンテナ)

#環境の準備
##CoreOSの準備

###VirtualBoxとVagrantをインストールする
ダウンロード先は以下
https://www.virtualbox.org/wiki/Downloads
http://www.vagrantup.com/downloads.html

###coreos-vagrantをインストールする

```bat:Windows
git clone https://github.com/coreos/coreos-vagrant/
cd coreos-vagrant
```

###coreos起動

```bat:Windows
vagrant up
```

###CoreOSにログイン
```bat:Windows
vagrant ssh
```

##dockerの準備
ここからはCoreOSでの作業になります

###Dockerfileの作成
公式の[イメージ](https://registry.hub.docker.com/u/dockerfile/elasticsearch/)にHEADプラグインを追加したいのと、ノード名を環境変数で指定したいのでDockerfileを作ります

```Dockerfile:Dockerfile
FROM dockerfile/elasticsearch

RUN /elasticsearch/bin/plugin --install mobz/elasticsearch-head
RUN sed -ri 's/^#node\.name.*/node.name: "${NODE_NAME}"/g' /elasticsearch/config/elasticsearch.yml

EXPOSE 9200

CMD  /elasticsearch/bin/elasticsearch
```

###Dockerfileをビルドする
```bash:CoreOS
docker build -t trial/elasticsearch .
```
これで準備完了

#クラスタの確認

##nodeを起動してみる

```bash:CoreOS
docker run -d -p 9201:9200 -e "NODE_NAME=es1" --name es1 trial/elasticsearch
```
-p で9201ポートをElasticsearchの9200にポートフォワード
-e "NODE_NAME=es1"で環境変数を設定
--name で起動したコンテナにes1という名前をつけています



##ブラウザからアクセス
ちゃんと起動してます。
![es1.png](https://qiita-image-store.s3.amazonaws.com/0/46832/d316ff96-ad14-c13b-c31e-5c9512aea82e.png)


##データ投入
とりあえず適当なデータを投入すると

```bash:CoreOS
curl -XPUT 'http://localhost:9201/twitter/tweet/1' -d '{
    "user" : "kimchy",
    "post_date" : "2009-11-15T14:12:12",
    "message" : "trying out Elasticsearch"
}'
```

indexが作成されshardの状況が表示されました

![create_index.png](https://qiita-image-store.s3.amazonaws.com/0/46832/15a33577-05c3-1cf1-02e0-7212c6727286.png)


##nodeを追加してみる
```bash:CoreOS
docker run -d -p 9202:9200 -e "NODE_NAME=es2" --name es2 trial/elasticsearch
```
nodeが自動でクラスタに追加されてreplicaが作られました。
cluster healthもgreenになっています。

![es2.png](https://qiita-image-store.s3.amazonaws.com/0/46832/d2a04472-5f6f-8067-e9ba-a11ccab1c126.png)

![replica.png](https://qiita-image-store.s3.amazonaws.com/0/46832/18e5d2ee-c2d3-7b76-b8f4-4a487418e829.png)


##更に追加
```bash:CoreOS
docker run -d -p 9203:9200 -e "NODE_NAME=es3" --name es3 trial/elasticsearch
```

いい感じに分散されました

![es3.png](https://qiita-image-store.s3.amazonaws.com/0/46832/c69fecb4-a0f4-a779-105b-e454be963a1b.png)

#次は

クラスタ環境ができたので、nodeを落としたり上げたりして色々試してみようと思います。
Wordpress functions.php内で使っている変数をJSで使いたいとき

javascriptから使いたい時がたまにあるのでメモ

e.g. functions.phpのget_currentuserinfoをJSで使いたいとき

```php:functions.php
function functionsInfoToJs() {
  get_currentuserinfo();
  global $user_level;
  echo '<script type="text/javascript">var _g_user_level = "' . $user_level . '";</script>';  // JS内はよしなに
}
// 管理画面内に出力
//add_action( 'admin_print_scripts', 'functionsInfoToJs' );
// 全体の画面内に出力
add_action( 'wp_print_scripts', 'functionsInfoToJs' );
```
調子に乗ってvimを使い始めた


変態キーバインドってのを教えてもらって、セミコロンをエンターにしてしまってから7年ほど経つけれど、その時以来の不便を感じながら使ってるw

VimがいいとかEmacsがいいとか、、、そういうレベルでコードを書いているプログラマではないので、正直どっちもいらないなーって思ってた。

・マウスを使うとキーボードから手を離して効率が下がるっていうんで、変態キーバインドを導入。具体的にはセミコロンをエンターに変えて（セミコロンはctrl+セミコロンで打てます）BSはctrl+U、delはctrl+コロン、ctrl+hjklでカーソル移動
・ThumnbSence入れてトラックパッド触ってる時だけ、Fが左クリック、Dが右クリックになって、s押してるとスクロール、さらにトラックパッドを親指で操作できるように練習

とかホームポジションから手を移動しないように色々やってきたけど、[脱初心者を目指すなら知っておきたい便利なVimコマンド25選 (Vimmerレベル診断付き)](http://qiita.com/jnchito/items/57ffda5712636a9a1e62)を見て使ってみようかなと。

現在の自分のVimmerレベルは0ですね。i/a で編集モード、escでモード切り替え、xで削除、ddで行削除、rで上書き、hjklでカーソル移動くらいしかできません。コピペもよくわからないくらいのレベルです。

## vimインストール
.Brewfile
install vim
cask install macvim

今はeclipseでjavaの開発をやっているんだった。

Eclipse
	Vrapperってプラグイン
	更新サイト
	http://vrapper.sourceforge.net/update-site/stable

紹介記事
http://yuroyoro.hatenablog.com/entry/20100218/1266477264

Vrapper
optional Java Extensionも入れてみる

## 使ってみる
そんなに一気に覚えられないので、ちょっとづつ覚えていこうと思います。
その都度更新していこうかな。

### w/e/b/W/E/B/ge/gEの移動系のを使ってみる

確かにマウスで移動するよりも良さそう。
まだ頭で考えながらやってるのでしばらくこれだけを意識して使ってみることにします。
これだけだと、不便なだけのエディタ。だけどだんだん使えるようになってくると信じてる。
Guacamoleの設定

http://guac-dev.org/

VPNやRDPを中継して、html5なクライアントつまりWebブラウザでリモートデスクトップさせてくれる「Guacamole」。前から使おうと思ってて、そろそろ評価しようとインストールしてみたら、公式サイトのドキュメントが古くなっててハマったのでメモ。

RHEL系もUbuntuもパッケージで入れられると書いてあるんだけど、書いてあるパッケージが見つからなかったり、最新版のパッケージがないようだったりしたので、ソースから入れることにしました。

Guacamoleは、guacamole-server(guacd)と、tomcat上でクライアント部を担当するguacamole.warから構成されます。試した範囲では、まあ、当たり前ですが、2つのモジュールは同じ版である必要があるようです。

まずはguacamole-serverから。
http://guac-dev.org/release/release-notes-0-9-1
の「guacamole-server-0.9.1.tar.gz」を持って来て、バラして、makeします。これについては、公式サイトのドキュメントの通りで。makeかけて足りないとか言われたライブラリを入れたりはしましたが、割とドキュメントの通りでした。

次にtomcat用のwarで、ドキュメントにはmaven使えって書いてますが、
http://guac-dev.org/release/release-notes-0-9-1
に「guacamole-0.9.1.war」があるので、これ使いました。tomcat6が動くようにして、これをdeployしました。

あと、tomcatの待ち受けポートが8080なのを、設定ファイルで80にしようとしたけど、上手く働かなかったので、iptablesで80受けて8080に流す設定にしました。

これで無事動くようになったのですが、proxyサーバ噛んでる環境だと、もう一捻りしないと通れないようです。

おわり。
WEBAPIサイトへのBASIC認証につきまして

またいきずまってしまいました。御教授ください。

ユーザー許可リストで取得したAuthorization Codeを利用することはわかっているのですが、

Basic認証のコードのユーザー名には何を設定するのでしょうか。

Yahoo Japan IDを設定してAPIを呼びましたが、401が返ってきます。

【コードフラグメント】

httpclient = new DefaultHttpClient();

        	Credentials credentials = new UsernamePasswordCredentials(とりあえずYahoo Japan ID,auth);
        	AuthScope scope = new AuthScope(TARGET_HOST, 443);
        	httpclient.getCredentialsProvider().setCredentials(scope, credentials);

■ authは、
String auth = yconnect.getAuthorizationCode(state);
を使っています。

宜しくお願い致します。
hhkb lite 2英語配列が日本語配列で認識される

## Mac OS X 10.9.3でhhkb lite2を使う
キーボード接続→アシスタント起動→ANSIを選択
公式サイトからドライバを落としてインストール、再起動

しかしながら、配列が日本語配列として認識されてしまう。
例えば[を押すと＠が出力される状態。

システム環境設定→キーボード→入力ソースで、USを追加すると、英語入力の時は配列がまともになった。

![スクリーンショット 2014-06-20 11.47.50.png](https://qiita-image-store.s3.amazonaws.com/0/42742/d39a2a5a-c11e-7f45-e1ba-e29b212850c9.png)

が、日本語入力の時は相変わらずダメだったので、google IMEをインストールし、ことえりを消すことで解決。
英語配列で入力できるようになった。

ただ、本来は◇+spaceで日本語、英語切り替えができるはずなのだが、それができない。原因不明。
KeyRemap4MacBookでcmdキー空打ちで切り替えできるように設定できるので特に問題はないが少し気になる・・

とりあえずはこれで動くようになったので、キーボード配列で困っている場合は試してみるといいかもしれません。

追記
キーボードショートカットで「前の入力ソースを選択」のチェックが外れていただけった。
![スクリーンショット 2014-06-20 13.37.18.png](https://qiita-image-store.s3.amazonaws.com/0/42742/2d8e8f27-d6fb-e5a8-9e5b-f0c48471ee47.png)

チェックつけたらcmd + spaceが動作しました。
Freematics OBD2 Adaptor v2について


[Freematics OBD2 Adaptor V2](http://freematics.com/store/index.php?route=product/product&product_id=52)を買ってみた。BLE, GPSオプションを付けた。ATMega328P搭載でAruduino UNO互換。

![写真 1.JPG](https://qiita-image-store.s3.amazonaws.com/0/29860/f5715b9b-a53f-408a-efe4-48f8efd0ad70.jpeg "写真 1.JPG")

どういうものかというと、

* OBDポート搭載の自動車に接続できる
* スロットル開度、移動速度、燃料消費量などなど、もろもろのセンサの情報が取得できる
* microSDに位置情報を含めてログ出来る
* BLEでセンサ情報を飛ばせる

という感じ。

ハードウェア工作やらないし、電源も無いから、車がないと起動すら出来ません（笑）。エミュレータも一緒に買えば良かった。

後付のGPSモジュールがどこに載っているか分からなかったので早速分解。写真右下のパッチケーブルを先に抜くこと（抜かないで作業したら割れた）。次に、表面のステッカーを剥がすとプラスネジが4本あるので外す。GPSモジュールは写真上側に接続されているので、手前から奥へ開くようにして分解。

開けるとこんな風になっている。

![写真 2.JPG](https://qiita-image-store.s3.amazonaws.com/0/29860/5ca6fe80-6acd-d81c-0dd3-f1b8e0607cf8.jpeg "写真 2.JPG")

GPSモジュールは[MTK3329](http://inmotion.pt/documentation/diydrones/MediaTek_MT3329/mediatek_3329.pdf)を使用している。位置情報は10Hzで取得可能。残念ながらQZSS（みちびき）には非対応。上位モデル？のMTK3339は対応しているらしい。GPSチップセット貼り替えたらそのまま動くのかな。

うちの車（Ford Kuga 2011 RHD）に取り付けてみた。KugaのOBD2ポートは運転席側のダッシュボード部分。

![写真.JPG](https://qiita-image-store.s3.amazonaws.com/0/29860/8935970d-15ea-09a8-29b4-ef142ef0d1a0.jpeg "写真.JPG")

Freematicsを挿し込むとこんなかんじ。オプションで付けたハーネスがちょっと邪魔。

![写真 1.JPG](https://qiita-image-store.s3.amazonaws.com/0/29860/a947155c-f23d-ca25-15e6-b5b5b58259e1.jpeg "写真 1.JPG")

OBD2は常時電源が取れる（常時電源しか取れない）のでエンジンをかけていなくても動作する。Freematicsの動作はLEDランプが点灯するので何となく分かる。App Storeにある[Freematics OBDアプリ](https://itunes.apple.com/jp/app/freematics-obd/id707482884?mt=8)で動作確認をしたが…加速度計の値以外取れない。泣いた。

![写真 2.PNG](https://qiita-image-store.s3.amazonaws.com/0/29860/81abeaa1-e386-505c-5a56-938b35472d14.png "写真 2.PNG")
Struts2 + Tomcat-SSL 実行時の catalina.policy

メモ

```py:catalina.policy
grant {
        permission java.util.PropertyPermission "xwork.loggerFactory", "read";
        permission java.util.PropertyPermission "xwork.saxParserFactory", "read";
        permission java.util.PropertyPermission "xwork.saxTransformerFactory", "read";
        permission java.util.PropertyPermission "freemarker.development", "read";
		permission java.util.PropertyPermission "file.encoding", "read";
		permission java.util.PropertyPermission "user.dir", "read";

		permission java.io.FilePermission "<<ALL FILES>>", "read"; 

        permission java.lang.reflect.ReflectPermission "suppressAccessChecks";

        permission java.lang.RuntimePermission "accessDeclaredMembers";
	    permission java.lang.RuntimePermission "accessClassInPackage.org.apache.struts2";
	    permission java.lang.RuntimePermission "accessClassInPackage.com.opensymphony.xwork2";
};
```

* 以下は本番実装時は適切な値を設定してください。
    * `permission java.io.FilePermission`
    * `grant`
macでcisco-vpn(Cisco IPsec)を利用した際、ルーティングを自動で設定する方法


## 概要

cisco-vpnのclientは最初からmac用意されている。しかしPPTPなどのプロトコルではできる、routingの設定がなぜかできない。vpn接続先がinternetへoutboundできない場合、ネットが使えなくてこまる。なので、なんとかroutingを書き換える。


### 下記shellscriptを起動すればOK

```bash
#!/bin/bash

if [[ $EUID -ne 0 ]]; then
    echo "Run this as root"
    exit 1
fi

# cisco-vpnを設定したネットワーク(hogehoge)を起動
networksetup -connectpppoeservice hogehoge 

# パスワード入力を待つループ
for i in `seq 1 1 500`
do
    # cisco-vpnのデフォルトのif名はutun。ifconfigで接続確認。
    if ifconfig utun0 > /dev/null 2>&1 ; then
        # routing設定 vpnを利用したいipを指定
        route -nv add -net xxx.xxx.xxx.xxx -interface utun0
        # default route変更
        route change default yyy.yyy.yyy.yyy
        # dnsも必要に応じて変更
        networksetup -setdnsservers hogehoge '8.8.8.8'
        break
    fi
    sleep 0.2s
done

```
OpenVzのIPアドレス割り当てに失敗するとき

```bash:
# vzctl start 101
Starting container ...
Container is mounted
Adding IP address(es): 192.168.30.201
arpsend: 192.168.30.201 is detected on another computer : 00:24:e8:69:35:e0
vps-net_add WARNING: arpsend -c 1 -w 1 -D -e 192.168.30.201 vmbr0 FAILED
Setting CPU units: 1000
Setting CPUs: 1
Container start in progress...

# arp -d 192.168.30.201
192.168.30.201のARPエントリがありません

# vzctl stop 101
Stopping container ...
Container was stopped
Container is unmounted

# arp -a
? (192.168.30.1) at 00:11:38:13:c3:12 [ether] on vmbr0
? (192.168.30.201) at 00:24:e8:69:35:e0 [ether] on vmbr0
? (192.168.30.201) at <from_interface> PERM PUB on vmbr0

# ping 192.168.30.201
PING 192.168.30.201 (192.168.30.201) 56(84) bytes of data.
64 bytes from 192.168.30.201: icmp_req=1 ttl=64 time=0.633 ms
^C
```

IPがかぶっている？？
別のIPを割り当てて解決。
IJuliaではじめるJulia入門


> 長くなったら複数ページに分けるかもしれない

# Juliaとは

RやMATLABのような科学技術計算向けのプログラミング言語です。
大規模数値計算のための高速化はもちろん、動的な要素だったり色々盛り込んだ言語のようです。
MITの人達が主だって作っています。（[Why We Created Julia](http://julialang.org/blog/2012/02/why-we-created-julia/)）

[公式サイト](http://julialang.org/)のベンチマークを見ると、その爆速度合いが伺えます。(Octaveぇ...)

## IJuliaとは

Webブラウザベースで、コーディングや実行結果の確認が出来る環境です。
Markdownも書けたりします。[IPython Notebook](http://ipython.org/notebook.html)を拡張しています。

Juliaを使って解析などをしていると、計算結果を図にして確認したり、数式や表等をコメント的に挿入しておきたいことがあるかと思いますので、IJuliaを主な開発環境にしたいと思います。

![ijulia](http://julialang.org/images/ijulia.png "http://julialang.org/より")

# インストール

IJuliaをセットアップする際、既存ライブラリの際等に悩まされたりするので、いっそのことVM上に構築したいと思います。以下の手順に沿って進める事ができれば、簡単に構築可能かつお使いのマシン内を散らかすこともないかと思うのでオススメします。利用環境は、RubyとBundlerがインストールされた、MacやLinuxを想定しています。

### VirtualBoxのインストール

https://www.virtualbox.org/

### Vagrantのインストール

http://www.vagrantup.com/

### IJulia on Ubuntuのセットアップ

```
$ git clone https://github.com/hassaku/vagrant-chef-ijulia.git
$ cd vagrant-chef-ijulia
$ vagrant up
$ vagrant ssh-config --host julia-vagrant >> ~/.ssh/config
$ bundle install --path vendor/bundle
$ bundle exec knife solo prepare julia-vagrant
$ bundle exec berks vendor cookbooks
$ bundle exec knife solo cook julia-vagrant nodes/julia-vagrant.json 
```

### 動作確認
```
$ ssh julia-vagrant
...
vagrant@julia-vagrant:~$ ipython notebook --no-browser --ip=0.0.0.0 --port=8888 --profile julia 
```

1. ホストマシンのブラウザで0.0.0.0:8888にアクセスする
2. New Notebookのボタンを押す
3. 以下を入力し、Ctrl + Enterを押し、正弦波のグラフが表示されること

```julia
using PyPlot
x = [0:0.01:2*pi]
plot(x, sin(x))
```

##### ERROR: could not open file /home/vagrant/.julia/Nettle/src/../deps/deps.jlが出た場合

```
vagrant@julia-vagrant:~$ julia
julia> Pkg.build("Nettle")
```

（たぶんつづく...）
rvmのインストール・使い方

## インストール
<pre>$ curl -L https://get.rvm.io | bash -s stable
$ source ~/.rvm/scripts/rvm
$ rvm requirements
</pre>
## rubyインストール
<pre>$ rvm install 2.0.0
</pre>
## コマンド一覧
* インストール可能なもの一覧
<pre>$ rvm list known</pre>
* インストール済み
<pre>$ rvm list</pre>
JavaScript の undefined と void 0 と

とあるライブラリを眺めていて、以下のような関数呼び出しを見つけました。

```js
resetVal(attr, void 0);
```

void はご存知の方も多いと思いますが、与えられた式を評価して undefined を返す演算子です

通常は内部で undefined 以外の評価結果になるような処理をしつつ、でも結果は undefined
であって欲しい。といったようなケースで使われると思います。
html のアンカータグをクリックしたケースで使われるシーンは昔からよく見かける例です。

でもこの関数呼び出し、以下の書き方じゃダメなのかなと思いました。

```js
resetVal(attr, undefined)
```

グローバルオブジェクトの undefined プロパティを参照する方法です。

少し調べて以下のことがわかった。

* グローバルオブジェクトの undefined プロパティは ECMAScript3までは書き込み可
* 読み込みのみになったのは ECMAScript5 から

結果以下の可能性が捨てきれない

* グローバルオブジェクトの undefined プロパティが書き換えられていて undefined を返さない可能性がある
* グローバルもしくは関数内で undefined という名前の変数が定義されてグローバルオブジェクトの undefined を参照しない可能性がある

結論

* 確実に undefined を渡したい場合は void 演算子を使うのが安全そう。
behat 3.0 でBDD:待ち時間設定

インストールして終わりではない

[behat]:http://behat.org/
[behat3]:http://behat.readthedocs.org/en/latest/
[zombie.js]:http://zombie.labnotes.org
[phantomjs]:http://phantomjs.org/
[Behat Custom Helper]:https://github.com/sanpii/behatch-contexts

関連記事:

 * [behat3とzombiejsでBDDに挑戦(1)]
 * [behat3とzombiejsでBDDに挑戦(2)]
 * [behat 3.0 とzombiejsでBDDに挑戦(3)]
[behat3とzombiejsでBDDに挑戦(1)]:http://qiita.com/dozo/items/be0ff9e9443413a32d25
[behat3とzombiejsでBDDに挑戦(2)]:http://qiita.com/dozo/items/4cb29ee55c4bd8891786
[behat 3.0 とzombiejsでBDDに挑戦(3)]:http://qiita.com/dozo/items/ec0448ffcbb703df9e43

ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪

------------------- ↓ 余談はここから ↓-------------------

さて、前回の記事でインストールが完了し、
さぁ使おうとすると早速困ることがある。
それは

> wait設定

Webサービスっていうのはリクエスト投げて返答があるまでタイムラグがあり、
JavaScriptを解析するとさらに時間がかかる。
そこで何秒間か待機してから内容確認や次の動作などにつなげるようにする。

------------------- ↑ 余談はここまで ↑-------------------

ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪

------------------- ↓ 本題はここから ↓-------------------

# 待ち時間のfeature追加

FeatureContext.phpに以下のものを追加する

```FeatureContext.php
  /**
   * @Given :arg1 秒間待機
   * @Given /^I wait for (\d+) seconds$/
   */
  public function iWaitForSeconds($arg1)
  {
    $this->getSession()->wait($arg1 * 1000);
  }
```

では登録状態を確認してみよう。

```shell-session
$ ./bin/behat -dl
default | Given :arg1 秒間待機
default | Given /^I wait for (\d+) seconds$/
・・・
```

あとはこの文言をフィーチャに追加すればよい
http://asciiwwdc.com のコンテンツ（字幕）の作り方


## 字幕テキストの生成方法
どうやってテキストを生成しているのか調べたところ、このrubyスクリプトを使っていました。
[asciiwwdc-scraper.rb](https://gist.github.com/mattt/1b407afc546d914c1c6b)

WWDCのビデオには字幕付きのものがあります。字幕付きのビデオには、「Web Video Text Track (WebVTT:キャプション対応ビデオを作る際に使用する、キャプションを記述したテキストファイル）」が付属していて、そのファイルから字幕テキストを抽出していました。

大まかな流れは次のとおりです。

1. https://developer.apple.com/videos/wwdc/2014/ のHTMLを取得
2. HTMLからmovファイルのパスを探す
3. 2.のパスを基に、subtitles/eng/prog_index.m3u8をダウンロードする
4. prog_index.m3u8のテキストデータから、ファイル名.webvttの文字列を探す（例:fileSequence0.webvtt）
5. webvttファイルをダウンロードする
6. webvttのテキストデータを読み込んで、バッファに追加する
7. 5.から6.を繰り返す

スクリプトを実行すると、セッション毎のvttファイルが作成されます。


## MU3ファイル
http://ja.wikipedia.org/wiki/M3U

`http://devstreaming.apple.com/videos/wwdc/2014/403xxksrj0qs8c0/403/subtitles/eng/prog_index.m3u8`

1つの.webvttファイルに、60秒分の字幕情報が記述されている。

```
$ curl http://devstreaming.apple.com/videos/wwdc/2014/403xxksrj0qs8c0/403/subtitles/eng/prog_index.m3u8

#EXTM3U
#EXT-X-TARGETDURATION:60
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:60.00000,
fileSequence0.webvtt
#EXTINF:60.00000,

以下、省略
```


## Web Video Text Track (WebVTT) ファイル
キャプション対応ビデオを作る際に使用する、キャプションを記述したテキストファイル

http://msdn.microsoft.com/ja-jp/library/jj152136(v=vs.85).aspx
http://d.hatena.ne.jp/sparkgene/20111216/1323988362


```
$ curl http://devstreaming.apple.com/videos/wwdc/2014/403xxksrj0qs8c0/403/subtitles/eng/fileSequence1.webvtt
WEBVTT
X-TIMESTAMP-MAP=MPEGTS:181083,LOCAL:00:00:00.000

00:00:59.246 --> 00:01:02.206 A:middle
and how you can use them
to make your code safer.

00:01:02.826 --> 00:01:05.245 A:middle
We're going to talk to you
about memory management in Swift

00:01:05.245 --> 00:01:06.856 A:middle
and how it's largely automatic.

00:01:07.966 --> 00:01:09.916 A:middle
We're also going to talk
about initialization

00:01:10.486 --> 00:01:13.386 A:middle
and how you can take advantage
of the power of closures

00:01:13.686 --> 00:01:15.226 A:middle
and pattern matching
in your code.

以下、省略
```
Qiita:TeamをMacアプリ化する



**[訂正]** KobitoからQiita:Teamへの投稿はできるとのことでした。誤読してました^^;単純にアプリ化する記事としてご覧ください。

<del>現在、セキュリティ的な理由でKobitoからQiita:Teamに投稿できなくなっている。</del>

> ![ホーム_-_c16e___Qiita_Team.png](https://qiita-image-store.s3.amazonaws.com/0/889/f0d1b31d-8298-f03d-82da-d49887402f21.png "ホーム_-_c16e___Qiita_Team.png")

<del>Kobitoが対応されるまで、[Fluid]でQiita:TeamをMacアプリ化してしのぐ方法を紹介する。</del>


# Fluidをインストールする

Fluidはウェブサイトならなんでもアプリ化できるアプリ。

Homebrew caskでインストールする。

```console
$ brew cask install fluid
```

# FluidでQiita:Teamをアプリ化する

Fluidを立ち上げると、アプリ作成画面が出てくる。ここに、URLとアプリ名を入力し、作成する。

![](https://qiita-image-store.s3.amazonaws.com/0/889/30131da7-2c8b-6498-ed8f-e9392e0ac0a9.png)


すると、ApplicaitonsディレクトリにQiita:Teamアプリがインストールされ使える状態になる。

![ホーム_-_c16e___Qiita_Team.png](https://qiita-image-store.s3.amazonaws.com/0/889/23478ff2-644f-618e-32bb-0fcddae1b17c.png "ホーム_-_c16e___Qiita_Team.png")



[Fluid]: http://fluidapp.com
俺が書いたGitHubのgistやQiitaの記事を探すには

# 背景

<blockquote class="twitter-tweet" data-cards="hidden" lang="ja"><p>qiita今日も検索できない。が、&#10;site:<a href="http://t.co/7zgtUbEMkO">http://t.co/7zgtUbEMkO</a> キーワードでググればqiitaの記事検索出来るから、そんなに支障無い</p>&mdash; kjunichi (@kjunichi) <a href="https://twitter.com/kjunichi/statuses/479420209954959360">2014, 6月 19</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

なんて、呟いた後に同様のエントリーを複数みたのでｗ

# Gistに書いといたけど、どこ行った？

```
site:gist.github.com/kjunichi あれどこいった
```

# Qiitaに記事書いた記憶があるんだけどー

```
site:qiita.com/kjunichi すごい内容の記事
```

# おまけ

## ツイッターのエゴサーチ

```txt
-from:kjunichi kjunichi
```

## 俺英語だめだから日本語のWebCLの事知りたいなぁ

```
lang:ja -不登校 webcl
```

# まとめ

Google検索のsite:ってホスト名以降も指定できる模様
nginxで'_'を含むリクエストヘッダのパラメータが消失

# リクエストヘッダのパラメータが消えた
nginxにリバースプロキシしてもらう構成にしたら、バックエンド側でHTTPリクエストヘッダが効かないという現象が発生した.

# パラメータ名に'_'を含むリクエストヘッダは破棄される
nginxのデフォルト設定では、リクエストヘッダに'_'が含まれたパラメータ名は無視する仕様になっている.

nginxの設定にひと手間必要だった.

~~~nginx:/etc/nginx/nginx.conf
http {
  ...
  underscored_in_headers on;  ## これを記述する.
  ...
}
~~~

nginx再起動後、'_'が付いたパラメータも破棄されずバックエンドへ到達した.

~~~bash
$> /etc/init.d/nginx restart
~~~

HTTPリクエストヘッダでごく一般的に用いられるパラメータ名に'_'が付く場合はほとんどないが、Webサービス特有のヘッダを自身で用意する場合等は気を付けた方がよろしいです.