OmniAICreator/Qiita-1.07M huggingface dataset:
fifoを使った外部プロセス実行


```
mkfifo /tmp/cmd
while(true)
do
	source /tmp/cmd
done
```

fifoをsourceコマンドで実行する仕組みを予め用意しておき、JavaからはProcessBuilderでコマンドを実行するのではなく、FileOutputStreamでコマンドを書き込むだけにする。

結果が必要であれば結果用のfifoを作り、リダイレクトしておく。JavaからはFileInputStreamで読む込むとよい。
passengerで個々のアプリケーションプロセスにアクセスする

デバッグでpassengerの個別のアプリケーションプロセスにアクセスしたい場合があったのでその手順を調べてメモする。

## 参照手順

* 公式文書に書いてあった
 * [Phusion Passenger users guide, Apache version - 10.4. Accessing individual application processes](http://www.modrails.com/documentation/Users%20guide%20Apache.html#_accessing_individual_application_processes)

## アクセス手順

 * アプリケーションプロセスのアクセス先とパスワードを確認する

```bash
$ passenger-status -v
...
  * PID: 24235   Sessions: 0    Processed: 7       Uptime: 17s
      URL     : http://127.0.0.1:58122
      Password: nFfVOX1F8LjZ90HJh28Sd_htJOsgRsNne2QXKf8NIXw
...
```

 * 確認したパスワードでアクセスする

```bash
$ curl --header X-Passenger-Connect-Password:nFfVOX1F8LjZ90HJh28Sd_htJOsgRsNne2QXKf8NIXw http://127.0.0.1:58122
```
MTA転送設定してるホストのfromアドレスの調整

なんかソフトバンクのMTAからドメインが無いとかで蹴られてたので修正した記録です

xxx-admin01にpostfixが入っててrelayhostにxxx-mail01を指定しててxxx-mail01側にはqmailが入ってる感じです。
xxx-admin01からsoftbankあてにメールして届かず以下のようなログがxxx-mail01に出ていました。

送信失敗したsoftbank宛てメールに関するログ：

```
# grep 35579 /var/log/maillog
Mar  3 10:33:46 xxx-mail01 qmail: 1393810426.138145 starting delivery 35579: msg 153145 to remote xxxxxxxx_k@i.softbank.jp
Mar  3 10:33:46 xxx-mail01 qmail: 1393810426.214778 delivery 35579: failure: Connected_to_117.46.11.72_but_sender_was_rejected./Remote_host_said:_553_xxx-admin01.xxxxxxxx.com_does_not_exist/
```

みたかんじxxx-admin01.xxxxxxxx.comがMX登録されていないのでリジェクトされた風です。
たしかにMX登録されてるドメインはxxxxxxxx.comとかstaging.xxxxxxxx.comだけなので
fromのドメイン修正が必要なもよう。

参考：
http://d.hatena.ne.jp/think-t/20120930/p1
あとメール職人の先輩からのmyoriginのデフォルトはmyhostという情報

設定ファイルの修正を以下のように行いました。

```
# diff main.cf{,.`date +%Y%m%d`}
77,78d76
< #myhostname = xxx-admin01.xxxxxxxx.com
< #myhostname = xxxxxxxx.com
85c83
< mydomain = xxxxxxxx.com
---
> mydomain = xxx-admin01.xxxxxxxx.com
101c99
< myorigin = $mydomain
---
> #myorigin = $mydomain
167,168c165,166
< #mydestination = $myhostname, localhost.$mydomain, localhost
< mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
---
> mydestination = $myhostname, localhost.$mydomain, localhost
> #mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
```

設定はこのほかに以下のような感じ。（ローカル内のMTAに転送するだけのクライアント的な）

```
inet_interfaces = localhost
inet_protocols = ipv4
relayhost = [xxx.xx.10.22]
```

設定をリロード

```
# service postfix reload
postfix を再読み込み中:                                    [  OK  ]
```

送ってみる

```
# printf "test2\ntest"|mail -s "testmail_`date +%Y%m%d.%H:%M`" xxxxxxxx_k@i.softbank.jp
```

このあとめでたくメール受信できました。

`myorigin = $mydomain`
として、
`mydestination`に`$mydomain`を含める
といいようでした。

`myorigin`変えただけだと、`(mail for mydomain loops back to myself)`というログが出て、
転送先MTAに到達すらしないようでした。

設定されている値は
`postconf|grep myorigin`
という感じで確認できます

`sendmail`だとfromの調整は`/etc/mail/submit.cf`の`Dj`のところにドメイン指定するだけです。
もしMTA切替たい場合、CentOS6だと`alternatives --config mta`で切り替えるかシンボリックリンク修正するか。
今回はいまさら何台も入れなおすのもアレだったので修正してみました。

以上です。
jQueryで後から描画された要素にもイベントをbindするためのonの書き方


よく忘れる...

```javascript:OK
elem.on('click', '.flag', -> $(this).hide())
```

```javascript:NG
elem.find('.flag').on('click', -> $(this).hide())
```

NGの書き方だとJSで後から追加した要素にclickがbindされない
DirectoryAPIでユーザを追加する際、ライセンス数の上限を上まった時のエラー

# DirectoryAPIでユーザを追加する際、ライセンス数の上限を上まった時のエラー

```
{
  "code" : 412,
  "errors" : [ {
    "domain" : "global",
    "location" : "If-Match",
    "locationType" : "header",
    "message" : "Domain user limit reached.",
    "reason" : "limitExceeded"
  } ],
  "message" : "Domain user limit reached."
}
```

com.google.apis:google-api-services-admin-directory を使っている場合は、`GoogleJsonResponseException#getStatusCode()`が412である事を確認すれば良い。
日付/時間フォーマットのデフォルトを設定

Railsで日時を表示する際のデフォルトフォーマットが気に入らなかったので、
デフォルトフォーマットを設定。

まず、Railsのデフォルトはこんな感じ。

```shell-session
> Time.now.to_s
 => 2014-03-03 15:21:57 +0900 
```

IT関連ではない日本人にとって、 `YYYY-MM-DD` は慣れていないだろうし、
`+0900` は言わずもがななので、 `YYYY/MM/DD HH:mm` に統一したい。

デフォルトフォーマットの設定は `config/initializers/time_formats.rb` に。
ファイルがなければ新規作成。
中身はこんな感じに。

```ruby:config/initializers/time_formats.rb
Time::DATE_FORMATS[:default] = '%Y/%m/%d %H:%M'
Time::DATE_FORMATS[:datetime] = '%Y/%m/%d %H:%M'
Time::DATE_FORMATS[:date] = '%Y/%m/%d'
Time::DATE_FORMATS[:time] = '%H:%M:%S'
Date::DATE_FORMATS[:default] = '%Y/%m/%d'
```

設定したらWebサーバを再起動。
そうするとこんな感じに表示される。

```shell-session
> Time.now.to_s
 => "2014/03/03 15:22" 

> Time.now.to_s(:date)
 => "2014/03/03" 

> Time.now.to_s(:datetime)
 => "2014/03/03 15:23" 

> Time.now.to_s(:time)
 => "15:23:07" 
```

ここで使えるフォーマット文字列は `strftime` の通り。
[class Time.strftime](http://docs.ruby-lang.org/ja/2.0.0/class/Time.html#I_STRFTIME "class Time.strftime")
PhoneGap(Cordova) のプラグインのインストールと設定方法



PhoneGapが仕様変わりすぎなので、メモ。

phonegapのバージョン

```
phonegap -v                                   
3.3.0-0.18.0
```

## PhoneGap 3 以前との違い

以前は、プラグインがデフォルトで含まれていたが、バージョン3から含まれないようになった?

## コマンドラインの公式ドキュメント(英語)

[PhoneGap API Documentation](http://docs.phonegap.com/en/3.3.0/guide_cli_index.md.html#The%20Command-Line%20Interface "PhoneGap API Documentation")

## プラグインを単語で検索

bar code で検索する場合

```
 $ cordova plugin search bar code

    com.phonegap.plugins.barcodescanner - Scans Barcodes
```

## プラグインのリスト

以下のプラグインが、コマンドラインで追加できる、らしい

ASF Git Repos
https://git-wip-us.apache.org/repos/asf?s=cordova-plugin

## プラグインのインストールと設定

inAppBrowser プラグインを使う場合で説明

### プラグインのダウンロード

inAppBrowserプラグインの場合

```
phonegap plugin add org.apache.cordova.inappbrowser
```

Media プラグインの場合

```
phonegap plugin add org.apache.cordova.media  
```

プラグインが外部のサイトの場合、以下で追加

```
cordova plugin add https://github.com/apache/cordova-plugin-console.git
```


### プラグイン一覧の表示

```
phonegap plugin ls
```

### config.xml ファイルに追加

この作業が必要か?は、ちょっとわからないです。

* [アプリのディレクトリ]/www/config.xml を開く
* </widget> 行の次に以下を追加

```xml
<feature name="InAppBrowser">
 <param name="ios-package" value="CDVInAppBrowser" />
</feature>
```

### 確認事項

1. version=”0.0.1″ を正しいバージョンに変更する
 バージョンは、developer console に入れたバージョンと合ってないといけない
2. <description>行を変更
3. <author>セクションを変更
4. “widget id” をdeveloper console のAppIDと同じか確認


ref.
http://iphonedevlog.wordpress.com/2013/12/19/using-phonegap-3-3-cli-on-mac-os-x-mavericks-to-build-ios-projects/


 


## 検索用語

phonegap, cordova, plugin, プラグイン, 拡張, インストール, setup, 設定
phpでDDoS対策、総当り対策、連続アクセス制限

####特定のページだけに連続アクセスを遮断する機構をつける必要性があったので実装
外部のAPIをリクエストするページをつくったが、誰かが連打するとAPIに自分のサーバがDDoS攻撃したとされそうなので連続アクセスを遮断する機構を作った。  
#####注意
サーバに対するDDoS攻撃とかはiptablesとかでやるべき
以下の実装はファイル書き込みの読み書きを行うので大量のアクセスがあると重たくなる
あとデフォのままつかうとテンポラリディレクトリをかなり汚す
#####方法
- 任意の場所(デフォルトだとテンポラリ)にアクセスしてきたIP名のファイルを作る
- IP名のファイルにUnixtimeを打刻
- IP名のファイルを読み取り、過去に打刻したUnixtimeがあれば比較する
- 比較し結果連続アクセスと判断した場合遮断する

```php
<?php

//アクセス記録を残すPath（テンポラリ/IP）を決定
$file = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'apache' . DIRECTORY_SEPARATOR . $_SERVER['REMOTE_ADDR'];

//アクセスログを記録
//ファイル名はIPで中身はunixtime
//厳密に書き込むならロック制御が必要(ロックされてるとE_NOTICEかE_WARNINGがでるハズ)
file_put_contents($file, time() . PHP_EOL, FILE_APPEND | LOCK_EX);

//読み取り間隔を設定
//lineSizeはunixtime10桁+改行固定(11桁になるのは2286年)
$lineSize = 11;
//読み取り行数
$maxRow = 5;
//連続アクセスしたとするしきい値（秒）
$limitTime = 30;
//読み取るバイト数
$readByte = $lineSize * $maxRow;
//バイト数分後ろから読む
$readContent = file_get_contents($file, false, null, filesize($file) - $readByte);
$lines = explode(PHP_EOL, $readContent);
//バイト単位で読むので先頭がかけてる場合を想定して予め先頭行を切り落とす
array_shift($lines);

//初回と連続アクセス規制に満たなければ通過させる
if ($lines[0] + $limitTime < time() || count($lines) < $maxRow) {
    echo 'おっけー';
    exit;
}
echo $lines[0] - (time() - $limitTime) . '秒まってね';
exit;

/* 以下バグ
//設定時間より未来の時間だったら遮断する
if ($lines[0] > time() - $limitTime){
    echo $lines[0] - (time() - $limitTime) .'秒まってね';
    exit;
}
echo 'おっけー';
exit;
*/
```

###連続アクセスの調整

実装とは異なるがほぼ以下のように読み替えることができると思う

```php
//1分間に10回あったら制限する場合
$maxRow = 10;
$limitTime = 60;
```

誤ってるところがあれば報告してくださると助かります
PhoneGap(Cordova) のインストールと始め方



PhoneGap公式ドキュメントがぐちゃぐちゃなので、メモ。

実行バージョン: phonegap 3.3.0-0.18.0
2014/03/03 時点

cordovaを使いたい場合は、以下のphonegapをcordovaに置き換えればそのまま問題ない! わけではなくCLIコマンドは振る舞いがちがうようです。


## 大まかな流れ

* Node.jsをインストール
* npm で phonegap (or cordova) をインストール
* phonegap create でプロジェクト作成
* ビルド
* 実行

## スクリーンショット付きで知りたい場合

スクリーンショット有りで詳しく知りたい人は、以下を読む方がわかりやすいです。
http://www.atmarkit.co.jp/ait/articles/1308/28/news014.html

さくっと知りたい人は、以下を読みましょう。


## Node.jsのインストール

以下の公式サイトから、ダウンロード&インストールして下さい。
(Node.jsのバージョンごとの管理をしたい場合は、ググって下さい。)

http://nodejs.org/

理由: npm で phonegapをインストールするため


## PhoneGap(Cordova) のインストール

```
npm install -g phonegap 
```


## プロジェクトの作成

```
phonegap create プロジェクト名
```


## ビルドのみの場合

```
phonegap build [プラットフォーム名(ios|android)]
```

## エミュレータ実行のみの場合

```
phonegap emulate [プラットフォーム名(ios|android)]
```


## ビルド&実行 (iOS)

```
phonegap run ios
```

ios-sim のバージョンが古いと言われたので、以下を実行

```
npm install -g ios-sim
```


## ビルド&実行 (Android)

```
phonegap run android
```

Androidのエミュレータは、遅いので実機が良い


## cordova と phonegap コマンドの違い

phonegap には、platform add コマンドがない

cordova では、以下が必要だそうです。

```
cordova platform add [プラットフォーム名]
```




## その他

プラグインのダウンロード、インストールは、別記事に書きます。

## 検索用語

phonegap, cordova, install, インストール, setup, セットアップ, 始め方, ios, android
GAEからGoogle Cloud Storageへファイルをアップロードした際のファイルへの参照の取得方法ふたつ

# BlobstoreServiceでGoogle Cloud storageへファイルをアップロードした際のファイルの参照の取得方法ふたつ

`BlobstoreServiceFactory.getBlobstoreService().createUploadUrl()`の第二引数に`UploadOptions.Builder.withGoogleStorageBucketName(BUCKET)`のような引数を渡すと、Google Cloud StorageにファイルをアップロードするためのURLを取得する事ができます。そこへファイルをアップロードされた場合に、アップロードされたファイルを取得するためのポインタ情報を取得する方法が二種類あります。ひとつは、Blobstoreへのキーとなる`BlobKey`オブジェクトを取得する方法、もうひとつはGoogle Cloud Storageのパスを取得する方法、です。
どちらも、`BlobstoreServiceFactory.getBlobstoreService().createUploadUrl()`の第一引数として渡した、アプリケーション内のWebハンドラ内で処理を行うのは同じです。

## アップロード対象を指すBlobKeyオブジェクトを取得する

```
BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
Map<String, List<BlobKey>> blobs = blobstoreService.getUploads(request);
...
```

## アップロード先のGoogle Cloud Storageのパスを取得する
```
BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
Map<String, List<FileInfo>> fileInfos = blobstoreService.getFileInfos(request);
...
```
取得した`FileInfo`オブジェクトの`getGsObjectName()`メソッドを使うとGoogle Cloud Storageのオブジェクト名を取得できます。`FileInfo`オブジェクトからは、オブジェクト名の他にもサイズ等の情報も取得できます。

Google Cloud Storage上のオブジェクト名を使うと、次のような実装でその内容を取得できます。

```
GcsFilename filename = new GcsFilename(BUCKET, objectName);
GcsService gcsService = GcsServiceFactory.createGcsService(RetryParams.getDefaultInstance());
GcsInputChannel readChannel = gcsService.openReadChannel(filename, 0);
...
```


- https://code.google.com/p/googleappengine/source/browse/trunk/java/src/main/com/google/appengine/api/blobstore/FileInfo.java
Macの環境構築

新品のMacBookAirを業務用に入手したので環境設定をメモしておく。

# Homebrewを入れる
なにはともあれパッケージ管理。[Homebrew](http://brew.sh/)を使います。会社のproxyを通すので.curlrcにプロキシ設定を書いておく。

```
# curlのプロキシ設定
echo proxy=YourProxyName:YourProxyPort > ~/.curlrc

# Homebrewのインストール
ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
```

# homebrew-caskなるものがあるそうな
今のところMacユーザーはひとりなのでBoxenは仰々しいかなー？ [hombrew-cask]("https://github.com/phinze/homebrew-cask")なるものがあるらしいので入れておく。必要なものをBrewfileに入れてbrew bundleする。Brewfileはおいおい整理しよう。

```Brewfile
update

# Add repositories.
tap phinze/cask || true

# CUI Packages.
install zsh
install git
install brew-cask

# GUI Packages.
cask install google-chrome
cask install kobito
cask install virtualbox
cask install vagrant

# Remove outedated versions.
cleanup
```

# Proxyの設定のこと
Proxy下でmac使うの始めてなのですが、設定が面倒ですね。vagrant-configみたいに入っているアプリケーションみてdotfileに適宜追加してくれる便利ツールはないのでしょうか。自分で書けって話ですかね。
RSpec, capybara memo


RSpec とカピバラメモです。 :rat: 
少しずつ増えるかもしれない。増えないかもしれない。です。

# rspec

## 対象を絞って実行

### focus: true のテストのみ実行する

- spec_helper で以下の設定をしておく

```ruby
  config.treat_symbols_as_metadata_keys_with_true_values = true
  config.filter_run :focus
  config.filter_run_excluding :skip
  config.run_all_when_everything_filtered = true

```

- it とか context とか describe とかに focus: true を付けて実行する
- 外すの忘れがちなので、git hooks/pre-commit とかで弾くと便利です。

```ruby
  describe "テスト対象", focus: true do
    ...
  end
```

- `it` に `focus: true` をつけたい場合、f を頭につけるだけで便利。とくに `shared_example` のなかにやるやつとかね。

```
  fit 'hogehoge' do
  # spec...
  end
```

### hamlのhelperメソッド使う

```
# spec_helper
RSpec.configure do |config|
  config.include Haml, type: :helper
  config.include Haml::Helpers, type: :helper
  config.before(:each, type: :helper) do |config|
    init_haml_helpers
  end
end

```

## 高速化

```ruby
# config/environments/test.rb

  # Speed up tests by lowering BCrypt's cost function.
  require 'bcrypt'
  silence_warnings do
    BCrypt::Engine::DEFAULT_COST = BCrypt::Engine::MIN_COST
  end
```
- DEFAULT_COST は 10
- MIN_COST は 4
- 僕は `BCrypt::Engine::DEFAULT_COST = 1` にしてみました

### 参考
- http://www.railstutorial.org/book/sign_up#top
- http://blog.syncopelabs.co.uk/2012/12/speed-up-rspec-test.html

- [Document Explicit Dependencies Through Tests](http://robots.thoughtbot.com/document-explicit-dependencies-through-tests ) ミニマムにすると速くなる


# capybara

### Ajax
- [Automatically wait for AJAX with Capybara](http://robots.thoughtbot.com/automatically-wait-for-ajax-with-capybara ) 

### クリックする
- click_link('link_text')
- click_link('#id')
- find('#id').click


## その他 

### XPath 覚えられない
- XPath その昔よく使ったはずなんだけど...覚えられない。
- 僕には読みにくい感じがするので、なるべく使うの避けてる
- ときどきやむを得ず使う時がある
- でも憶えられないし、ググって取りたいやつ取るの時間かかる。


## 便利ツール
- なんかラクに取得できるのありそうだな〜調べてみたらあった。
- 右クリックして Copy XPath
- ブラウザの開発ツールに付いてたわ〜
  - Chrome と Firefox の Firebug にはありました。
Ansible の基礎　メモ


まだ書き途中。
だけど、誰かに役立つかもなので公開。

## 基礎知識

* 類似ソフトウェア: puppet, Chef, CFEngine
* Python製(2.6以上)。だけど、Pythonの知識必要なし。
* 操作内容(モジュール)を操作対象にsftpで送って、sshでログインして実行する

## Ansible基礎用語

* module: モジュール
 * 操作対象にさせる作業内容
* playbook: プレイブック
 * 作業(モジュール)をまとめたもの
* plugin: プラグイン
* roles: ロール(役割)
* inventory: インベントリ
 操作対象のホスト(ノード)のIPアドレスを入れる

## 仕組み

* Ansible Node(実行ノード) -> Target Node(対象ノード)に実行する
* sftpでコードを送って、ssh で対象ノードにログイン、実行

なので、操作対象に特別なソフトウェアをインストールを必要がない。



## コマンド

外部モジュールの使い方を表示

```
$ ansible-doc [モジュール名]
```

ping

```
$ ansible -i hosts all -u [ユーザ名] -k -m ping
```

## コマンドの利用例

### serviceモジュールで操作対象のhttpdを再起動する

```
$ ansible -i hosts all -u [ユーザ名] -k -K -m service -a "name=httpd state=restarted"
```

### yumモジュールでlibselinux-pythonパッケージをインストールする

```
$ ansible -i hosts all -u [ユーザ名] -k _K -m yum -a "name=libselinux-python state=present"
```


## 参考

[Ansible quickstart](http://www.slideshare.net/h-saito/ansible-quickstart "Ansible quickstart")
3の倍数と3の付く数だけ!!を付けてツイートするスクリプト

python twitter toolsを利用します。

```
pip install twitter

```

次に https://apps.twitter.com/ でtwitterアプリの登録をします。
このとき、Access levelはRead and writeにしておきます。
必要な登録をしてAPI key, API secret, Access token, Access token secretを取得してください。

以下のスクリプトを実行します。
<br>

```py3
from twitter import *

api_key = "自分の api key"
api_secret = "自分の api secret"
access_token = "自分の access token"
access_token_secret = "自分の access token secret"


twitter = Twitter(auth=OAuth(access_token, access_token_secret, api_key, api_secret))

text = '3の倍数と3の付く数だけ!!を付けてツイートするスクリプトを実行します'
twitter.statuses.update(status=text)

tweet = []
for i in range(1,31):
    if i % 3 == 0:
        tweet.append(str(i) + '!!')

    elif '3' in str(i):
        tweet.append(str(i) + '!!')

    else:
        tweet.append(str(i))

tweet = " ".join(tweet)

twitter.statuses.update(status=tweet)
```

<br>
結果
![tweet.PNG](https://qiita-image-store.s3.amazonaws.com/0/37662/30031e7a-fbd2-5904-e968-7867ba8a6ffa.png)


<br>
【参考】
[Python Twitter Tools 利用ノート](http://www.geocities.jp/showa_yojyo/note/python-twitter-tools.html)
[hirooka.pro Python Twitter Tools](https://hirooka.pro/?p=2252)
CentOS6.5にOpenVzをインストール

```bash:これだけやればOK
#!/bin/sh
set -e
if [ `whoami` != "root" ];then
    echo "use root user."
    exit 1
fi

yum install -y wget yum-utils vim screen openssh-clients telnet

cd /etc/yum.repos.d
wget http://openvz.tsukuba.wide.ad.jp/openvz.repo
rpm --import http://openvz.tsukuba.wide.ad.jp/RPM-GPG-Key-OpenVZ
yum install -y vzkernel.x86_64 vzkernel-headers.x86_64 vzctl.x86_64 vzquota.x86_64 vzstats.noarch
yum-config-manager --disable openvz-kernel-rhel6 openvz-utils
rpm -ivh http://apt.sw.be/redhat/el6/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
rpm --import http://dag.wieers.com/rpm/packages/RPM-GPG-KEY.dag.txt
yum --enablerepo=rpmforge install -y cstream perl-LockFile-Simple
yum-config-manager --disable rpmforge
rpm -ivh http://openvz.tsukuba.wide.ad.jp/contrib/utils/vzdump/vzdump-1.2-4.noarch.rpm
wget -O - http://ovz-web-panel.googlecode.com/svn/installer/ai.sh | sh

echo "done"
```

OpenVzをインストール
=============

```bash:OpenVzのインストール
$ cd /etc/yum.repos.d
$ sudo wget http://openvz.tsukuba.wide.ad.jp/openvz.repo
$ sudo rpm --import http://openvz.tsukuba.wide.ad.jp/RPM-GPG-Key-OpenVZ
$ sudo yum install -y vzkernel.x86_64 vzkernel-headers.x86_64 \
  vzctl.x86_64 vzquota.x86_64 vzstats.noarch
$ sudo yum-config-manager --disable openvz-kernel-rhel6 openvz-utils
```

```bash:vzdumpのインストール
$ sudo rpm -ivh http://apt.sw.be/redhat/el6/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
$ sudo rpm --import http://dag.wieers.com/rpm/packages/RPM-GPG-KEY.dag.txt
$ sudo yum --enablerepo=rpmforge install -y cstream perl-LockFile-Simple
$ sudo yum-config-manager --disable rpmforge
$ sudo rpm -ivh http://openvz.tsukuba.wide.ad.jp/contrib/utils/vzdump/vzdump-1.2-4.noarch.rpm
```

参考: [CentOS6.2をホストにしてopenVZ入れてコンテナのバックアップとバックアップからのコンテナの作成メモ | Bamboo lath　日々の記録](http://www.mogumagu.com/wp/wordpress/?p=729)

OS再起動しOpenVz対応カーネルで起動。

OSテンプレートをダウンロード
============

* [openvz.org](http://openvz.org/Download/template/cache)からtar.gz.のまま/vz/template/cache/に保存
  * /vz/template/cache/centos-5-x86_64.tar.gz 


OSテンプレートを使用してOSインストール
============

```bash:101番のOSを作成
vzctl create 101 --ostemplate centos-5-x86_64
vzctl set 101 --onboot yes --save
vzctl set 101 --ipadd 192.168.100.65 --save
vzctl set 101 --nameserver 8.8.8.8 --save
vzctl set 101 --hostname centos5.local --save
vzctl set 101 --diskspace 10G --save
vzctl start 101
vzctl exec 101 passwd
```

OpenVz Web Panel 2.4をインストール
==============

```bash:
# wget -O - http://ovz-web-panel.googlecode.com/svn/installer/ai.sh | sh
```

5分ほど待つと、http://localhost:30000 に admin/admin でログインが出来る管理画面が表示される。

![スクリーンショット 2014-03-04 6.15.26.png](https://qiita-image-store.s3.amazonaws.com/0/25728/3fd490da-bc54-1c48-1bec-eaec2cc5b83c.png)

![スクリーンショット 2014-03-04 6.15.44.png](https://qiita-image-store.s3.amazonaws.com/0/25728/114366da-e486-4d2c-bc33-b1805d310daa.png)

OpenVz Web Panel からバックアップ、リストア
==============

わかりづらかったのでメモ

物理サーバー ＞ ホスト名(ここではlocalhost) ＞ VEID(101)をクリック ＞ ツール ＞ バックアップ ＞ バックアップ か リストア を選択。

![スクリーンショット 2014-03-04 6.45.32.png](https://qiita-image-store.s3.amazonaws.com/0/25728/665bfbd5-4899-f6cd-3984-f76413a5d74e.png)
Node.jsのdaemon化について(foreverを使ってみる)

# Node.jsのdaemon化について

nodeアプリを作成したは良いけど

```
node app.js&
```

のような実行ではdaemon化したいアプリケーションがうまく動かない。
簡単に調べたところforeverを利用すると便利だったのでまとめる

## foreverとは
サイト
https://github.com/nodejitsu/forever

以下機能についてです。便利機能満載です

- nodeアプリをdaemon化する
- 落ちた場合に自動的に再起動してくれる
- foreverで起動したプロセスをCLIで管理可能
- ログ管理もしてくれる


## foreverのインストール

簡単npmでサクッと行けます


```
npm install -g forever
```

### daemon化

```
forever start (js名)
```

### 稼働中daemonリスト表示

```
forever list 
```


### 停止方法
uidを指定(4文字程度のアルファベットであることが多い)

```
forever stop (listで確認したuid)
```
OpenVzで動かすNFSサーバ(unfsd)

* [OpenVZのVPSで動かすNFSサーバ | おもむくがままに](http://blog.k-sakabe.com/?p=1510)を参考。
* [RPM resource unfs3(x86-64)](http://rpmfind.net/linux/rpm2html/search.php?query=unfs3(x86-64))
    * unfs3-0.9.22-2.el6.rf.x86_64.rpm
    * unfs3-0.9.22-2.el5.rf.x86_64.rpm
    * unfs3-0.9.22-1.el5.rf.i386.rpm

```bash:/etc/exports
/var/log 192.168.11.0/24(ro,async,no_root_squash)
/tmp 192.168.11.0/24(ro,async,no_root_squash)
```

```bash:syntaxチェック
$ /usr/sbin/unfsd -T
```

* 何も出力されなければOK

```bash:unfsd起動
$ sudo service portmap start
$ sudo /usr/sbin/unfsd
```

```bash:/etc/rc.localにスタートアップ登録
/usr/sbin/unfsd -T && runuser -l root -c "/usr/sbin/unfsd"
```


# 設定ファイル作った

```bash:puppet
class unfs3::centos5() {
  package { ['unfs3']:
    ensure => installed,
  }
  service { 'portmap':
    ensure => running,
    enable => true,
  }
  file { '/etc/exports':
    owner  => 'root',
    group  => 'root',
    mode   => 644,
    notify  => Reload['unfs3'],
    source => "puppet:///etc/exports";
  }
  file { '/etc/init.d/unfs3':
    owner  => 'root',
    group  => 'root',
    mode   => 755,
    source => "puppet:///etc/init.d/unfs3";
  }
  file { ['/etc/rc0.d/K86unfs3',
          '/etc/rc1.d/K86unfs3',
          '/etc/rc2.d/S14unfs3',
          '/etc/rc3.d/S14unfs3',
          '/etc/rc4.d/S14unfs3',
          '/etc/rc5.d/S14unfs3',
          '/etc/rc6.d/K86unfs3']:
    ensure => link,
    target => '/etc/init.d/unfs3',
  }
  reload { 'unfs3':
    command => '/usr/sbin/unfs3 -T && /etc/init.d/unfs3 restart',
  }
}
```

```bash:/etc/init.d/unfs3
#!/bin/sh

unfsd_configtest() {
  if [ ! -r /etc/exports ]; then
    exit
  elif ! grep -v -e '^#' -e '^$' /etc/exports | grep -q '/' ; then
    exit # no uncommented shares in /etc/exports
  fi
  if [ -x /usr/sbin/unfsd ]; then
    /usr/sbin/unfsd -T
  fi
}

unfsd_start() {
  unfsd_configtest

  echo -n "Starting UNFS server daemon(s):"

  if [ -x /sbin/portmap ]; then
    if ! ps axc | grep -q portmap ; then
      echo -n "  /sbin/portmap"
      /sbin/portmap
    fi
  
    if [ -x /usr/sbin/unfsd ]; then
      echo "  /usr/sbin/nfsd"
      /usr/sbin/unfsd
    fi
  else
    echo "WARNING:  Cannot start RPC portmapper daemon needed for UNFS."
    echo "          /sbin/portmap (a required daemon) is not executable"
    echo "          or is not present on your system."
    echo
  fi
}

unfsd_stop() {
  echo "Stopping UNFS server daemon..."
  killall unfsd 2> /dev/null
  sleep 1
  killall -9 unfsd 2> /dev/null # make sure :)
}

unfsd_restart() {
  unfsd_stop
  sleep 1
  unfsd_start
}

case "$1" in
'start')
  unfsd_start
  ;;
'stop')
  unfsd_stop
  ;;
'restart')
  unfsd_restart
  ;;
'configtest')
  unfsd_configtest
  ;;
*)
  echo "usage $0 start|stop|restart|configtest"
esac
```
最強!?Ensimeを利用したSublime Text3のScala開発環境(playでもliftでも)

EnsimeはEmacsでScala開発環境を構築するときに使うことで有名ですが、実はSublime Textでも利用することが可能です。

Ensimeはコード補完だけではなく、文法エラー表示、import追加機能、クラスやメソッドへのコードジャンプ、デバッグ機能などもあり、より強力な開発環境を構築することが出来るようになります。

個人的にはテキストエディタで作るScala開発環境では今のところ最強に感じています。

![play_controller.gif](https://qiita-image-store.s3.amazonaws.com/0/20707/48f694f4-be00-d059-fa80-e738491c69db.gif)

## 今回の環境
 - Mac OS 10.9
 - Sublime Text 3 (Build3059を利用)
 - Scala 2.10.3
 - sbt 0.13.1
 - とりあえずplay2.2.1もインストールしておきました。

## インストール手順

1. Sublime Text3にEnsimeプラグインを追加
2. Ensimeサーバーのインストール
3. sbtにEnsimeプラグインを追加
4. sbtコマンドによる.ensimeファイルの作成

### 1. Sublime Text3にEnsimeプラグインを追加
Package ControlからEnsimeを検索してインストールします。

### 2. Ensimeサーバーのインストール
[こちら](https://www.dropbox.com/sh/ryd981hq08swyqr/V9o9rDvxkS/ENSIME%20Releases)より、サーバーをダウンロードします（2014/3時点の最新であるensime_2.10.0-0.9.8.9.tar.gzを選択）。
解凍後、以下を実施。

```
$ cd ~/Library/Application Support/Sublime Text 3/Packages
$ mkdir -p Ensime/Server
$ cd Ensime/Server
$ mv (ダウンロード場所)/ensime_2.10.0-0.9.8.9/* .
```

### 3. sbtにEnsimeプラグインを追加
~/.sbt/0.13/pluginsにあるplugin.sbtに以下を追加します（ファイルがなければ作成）。

```plugin.sbt
addSbtPlugin("org.ensime" % "ensime-sbt-cmd" % "0.1.2")
```

### 4. sbtコマンドによる.ensimeファイルの作成
サンプルとして、playアプリケーションで.ensimeファイルを作成します。

```
$ play new hello-play
$ cd hello-play
$ sbt
> ensime generate
```

クラスパスが通っているものについては全てコード補完が効くようになります。

## 実行
Sublime Text3を起動し、右クリックから[Ensime] - [Maintenance] - [Startup]を選択。

### 実行サンプル
自作のcase classも（もちろん別ファイルで定義されていても）、Scala標準Listの関数もPlayのクラスも問題なく補完が効きます。
![list.gif](https://qiita-image-store.s3.amazonaws.com/0/20707/4515dd35-4b84-be27-d715-956ac15afdf6.gif)

## うまく動かないときは
- Ensimeのstartupを忘れている
- .ensimeファイル作成時のsbt compileでコンパイルエラーが残ったまま
- Sublime Text3のEnsimeプラグインを一度removeして再度インストールする
 - Consoleを見るとptyhonのエラーが出てうまく動いていない事がありましたが入れなおすことでうまく動くようになりました
GithubのWeb Hookを受け取るプロキシサーバー 「Octogate」


JenkinsのGithubフックの受け口がどうにも不安定でしかも設定に柔軟性が無い。
せっかくGithubのフックが送ってくれるデータには色々な情報が含まれているのにイマイチ活用し切れない。

というわけで、間に噛ませるプロキシサーバーを作ってみた。

[joker1007/octogate](https://github.com/joker1007/octogate "joker1007/octogate")

特徴は以下のとおり。

- Sinatra製でHerokuで簡単に動かせる
- gemになっていて、コマンド一発で起動できる
- どこに転送するかの定義をRubyのDSLで記述する

現在は、PushとPullRequestで発生するイベントにのみ対応してます。

フックの情報を元に送ったり送らなかったり、パラメーターにリポジトリやコミットの情報を利用したかったので、
設定ファイルの書式を柔軟にした方が良いだろう、ということでRubyで設定のためのDSLを定義しました。
一応、YAMLも考えたんですが、正規表現でリポジトリ名とマッチさせたりとか考えると無理がありそうなので止めました。


## 利用方法
起動時にコンフィグファイルやポートを指定して起動します。

設定ファイルの内容はこんな感じで書きます。

```ruby
token "token_string"

target "jenkins" do
  hook_type [:push]
  url "http://targethost.dev/job/JobName"
  http_method :post

  parameter_type :query
  params key1: "value1", key2: "value2"

  match ->(event) {
    event.ref =~ /master/
  }
end
# if event type is push and event.ref contains "master",
# octogate requests "http://targethost.dev/job/JobName" via POST method, request body is {key1: "value1, key2: "value2"} params

target "json_params" do
  hook_type [:push, :pull_request]
  url "http://targethost.dev/job/JobName"
  http_method :post

  parameter_type :json
  params key1: "value1", key2: "value2"

  match ->(event) {
    case event
    when Octogate::Event::PullRequest
      event.try(:pull_request).try(:head).try(:ref) =~ /json_params/
    when Octogate::Event::Push
      event.ref =~ /json_params/
    end
  }
end
# if event type is push or pull_request, and ref name contains "json_params",
# octogate requests "http://targethost.dev/job/JobName" via POST method, body is {key1: "value1, key2: "value2"} as JSON FORMAT


```

```sh
% bundle exec octogate -h
Usage: octogate [options]
    -c config                        Set config file (default = ./config.rb)
    -p port                          Set port number (default = 4567)
    -o address                       Set address to bind (default = 0.0.0.0)

% bundle exec octogate -c config.rb
  # => Endpoint is http://hostname:4567/token_string
```

適当にアクセスされると少し困るので、エンドポイントには設定ファイルのトークン文字列を利用します。
充分に長いランダムな文字列を設定しておきます。

リポジトリにはもう少し設定例があります。
[octogate/spec/config_sample.rb](https://github.com/joker1007/octogate/blob/master/spec/config_sample.rb "octogate/spec/config_sample.rb")

## Herokuでホストする時

適当にディレクトリを作りGemfileを用意します。

```sh
% bundle init
```

```ruby:Gemfile
gem "octogate"
gem "thin"
```

```sh
bundle install --path .bundle
```

Procfileを書きます。

```yaml:Procfile
web: bundle exec octogate -c ./config.rb -p $PORT
```

上記の例を参考にコンフィグファイルを書き、gitリポジトリを作ります。

```sh
% git init .
% echo ".bundle" > .gitignore
% git commit -am "init"
```

Herokuにアプリを作ってpushします。

```sh
% heroku create your-app-name
% git push heroku master
```

後は、githubのhookポイントにエンドポイントを設定すればOKです。
assetのビデオをアプリ内のディレクトリにコピーする方法

asset-library:// にあるビデオをアプリケーション内のディレクトリ(NSDocumentDirectory)とかにコピーしたいこととかありますよね。この場合、NSFileManagerではダメです。

```objc

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library assetForURL:assetURL resultBlock:^(ALAsset *asset) {
        ALAssetRepresentation *rep = [asset defaultRepresentation];
        Byte *buffer = (Byte*)malloc(rep.size);
        NSUInteger buffered = [rep getBytes:buffer fromOffset:0.0 length:rep.size error:nil];
        NSData *data = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES];
        [data writeToURL:outputURL atomically:YES];
    } failureBlock:^(NSError *error) {
        NSLog(@"%@", [error description]);
    }];


```

画像の場合はこんな感じかな？

```objc

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library assetForURL:assetURL resultBlock:^(ALAsset *asset) {
        ALAssetRepresentation *rep = [asset defaultRepresentation];
        CGImageRef cgImg = [rep fullResolutionImage];
        UIImage *img = [UIImage imageWithCGImage:cgImg];
        NSData *data = UIImagePNGRepresentation(img);
        [data writeToURL:outputURL atomically:YES];
    } failureBlock:^(NSError *error) {
        NSLog(@"%@", [error description]);
    }];


```
jsp でヒープ使用量が大きい場合の対処法

Java Servlet + jsp 環境で実運用した結果、日に日にヒープ使用量が増え、fullGCしても減らない、
という場合は、web.xml の JspServlet の設定の見直しをおすすめします。

JspServlet のパラメータ __development__ はデフォルトが true になっています。
これは jasper （JSPエンジン）を開発モードにするか否か、というパラメータになっており、
詳しくは調べていないですがこれを true にすると、
なんらかのエラーが起きた時に詳細情報を出力するためにヒープ上に情報を保持しておくらしいです。

Tomcat をインストール直後の web.xml を見てみると以下の様な設定になっています。

```xml
  <servlet>
      <servlet-name>jsp</servlet-name>
      <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
      <init-param>
          <param-name>fork</param-name>
          <param-value>false</param-value>
      </init-param>
      <init-param>
          <param-name>xpoweredBy</param-name>
          <param-value>false</param-value>
      </init-param>
      <load-on-startup>3</load-on-startup>
  </servlet>
```
__development__ パラメータがないので、値としては true が設定されているものとして動作します。

__development__ パラメータのことを知らないと、このまま実運用してしまいそうで怖いです。
必須パラメータにしてくれればいいのに・・・。

これを以下の様に書き換えると、ヒープがどんどん増えていく現象は解消されます。

```xml
  <servlet>
     <servlet-name>jsp</servlet-name>
     <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
     <init-param>
         <param-name>fork</param-name>
         <param-value>false</param-value>
     </init-param>
     <init-param>
         <param-name>xpoweredBy</param-name>
         <param-value>false</param-value>
     </init-param>
     <init-param>
         <param-name>development</param-name>
         <param-value>false</param-value>
     </init-param>
     <init-param>
         <param-name>checkInterval</param-name>
         <param-value>60</param-value>
     </init-param>

  </servlet>
```

__checkInterval__ というパラメータが増えていますが、
__development__ を false に設定した場合は、jsp の逐次コンパイルをしてくれません。
そのため __checkInterval__ で、jsp のコンパイル間隔を設定する必要があります。
（development = false と checkInterval はセットです）
上記の設定だと、jsp ファイルのリコンパイルを60秒間隔でおこなう、という設定になります。
Macで「開発元が未確認のため開けません」の対処法

# Macで「開発元が未確認のため開けません」の対処法

## そもそもこのエラー自体を出さず、未確認のものもジャンジャン許可するなら

ぼくが書くより丁寧な解説を見つけました。[Mac OS X Mountain Lionでアプリ起動時に「開発元が未確認のため開けません」エラーが出るときは | memobits](http://m.designbits.jp/12110214/)を読んどけばいいと思います。

## このファイルのみ個別に許可するなら

ターミナルでそのファイルのあるディレクトリに行き、下記コマンドを打つと開けるようになります。

```
$ xattr -d com.apple.quarantine <filename>
```

特定ディレクトリ以下すべてに適用する場合は、 `man xattr` によると `-r` オプションを付与すれば `recursively` になるらしいです（英単語が読めない）。

```
$ xattr -r -d com.apple.quarantine <dirname>
```

# 参考文献

* [Mac OS X Mountain Lionでアプリ起動時に「開発元が未確認のため開けません」エラーが出るときは | memobits](http://m.designbits.jp/12110214/)
* [オデの日記&#65312;WEB系: macでlsしたときの&#65312;&#65288;アットマーク&#65289;](http://koexuka.blogspot.jp/2012/05/macls.html)
boost::counting_rangeで数字を数えるforをすっきりと書く

動機
============
C++11のrange based forでfor文が結構すっきりと書けるようになったけれども、「0から5までの数字について」みたいなfor文を書く機会は依然としてある。普通は以下のようになる。

```cpp
for(int i = 0; i < size; ++i)
{
  std::cout << i << std::endl;
}
```

このforの条件式が煩雑でとても気に食わない。

Pythonだと
================

```py
for i in range(0,size):
  print(i)
```

なかなかすっきり

boost::counting_rangeを使う。
========================================

```cpp
// ヘッダオンリー
#include <boost/range/counting_range.hpp>

// ...

for(auto i : boost::counting_range(0,size))
{
  std::cout << i << std::endl;
}
```

オーケー。

オーケー？
==================
オーケーじゃない。

```cpp
for(auto i : boost::counting_range(0,size))
{
  std::cout << "some text" << std::endl;
}
```

一見、先の例と似たコードだがブロック内で i を使用していない点が異なる。このコードを警告を厳しくして（g++ であれば -Wall -Weffc++。以下g++を想定して記述）コンパイルすると「unused variable」の警告が発生する。-Werror を指定しているときにコンパイルが成功しないので困る。

この警告をスマートに回避する方法はない。

boost::for_each を使用する場合、記述が煩雑で本末転倒。

```cpp
boost::for_each(boost::counting_range(0,size)),
  [](int){
    std::cout << "some text" << std::endl;
  });
```

__attribute__((unused)) の使用はたかだかfor文にattributeを使うのは大げさ。

```cpp
for(auto i __attribtute__((unused)) : boost::counting_range(0,size))
{
  std::cout << "some text" << std::endl;
}
```

困ったものです。
iOSの標準キーボード上に情報を表示する方法

拙作のArrow NoteのiPhone版では、画面を節約するため、標準キーボードの上に文字数などの情報をはみ出して表示しています。その方法を共有します。

```objc:ObjectiveC
@interface ViewController : UIViewController
@property IBOutlet UITextView *textView;
@end

@implementation ViewController
- (void)viewDidLoad
{
    [super viewDidLoad];
    UIView *inputAccessoryView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
    inputAccessoryView.clipsToBounds = NO;
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 44, 100, 22)];
    label.text = @"Hello, World";
    [inputAccessoryView addSubview:label];
    self.textView.inputAccessoryView = inputAccessoryView;
}
@end
```
AngularJSでselect要素のデータバインド

AngularJSでselect要素を利用するTipsです。

```controller.js
$scope.colors = [
    {name:'black', shade:'dark'},
    {name:'white', shade:'light'},
    {name:'red', shade:'dark'},
    {name:'blue', shade:'dark'},
    {name:'yellow', shade:'light'}
];
$scope.color = $scope.colors[2]; //←注目！
```


```template.html
<select ng-model="color" ng-options="c.name for c in colors"></select>
```

上記が簡単なselect要素のデータバインドになります。

template.htmlのng-modelは、このselect要素をスコープで紐付けるために
使用するので、他のスコープ変数とは被らないようにしましょう。

ng-optionsの中身は、
__ラベル for 配列の値 in 配列__
という指定になります。
optionsのvalueには自動的に配列のキー値が入ります。

ここでの注目はcontroller.js内の"注目！"と書かれた部分。
これは __デフォルトで"selected"を適用する箇所__ を指定しています。

サンプルだと、model="color"のselectedはcolors[2]の要素に
適用するという事になります。
言葉だとわかりづらいので、一度お試しください。便利です。

サンプルでは配列形式の適用ですが、オブジェクト形式でも適用が可能です。

今回は解説しませんが、グループ指定等も簡単にできますので、
興味がある方は↓詳しい解説の公式リファレンスをご覧ください


##詳しい解説
http://docs.angularjs.org/api/ng/directive/select
↑公式リファレンス

http://js.studio-kingdom.com/angularjs/ng_directive/select
↑日本語リファレンス
統計のウソを見破るための 5 つの視点

本日はさらに根本的な議論に立ち返り、統計のウソを見破るための視点について記したいと思います。

世の中には何らかの意図に基づいて歪められたデータ、あるいは悪意はなくとも失敗しているデータ、これらを可視化したグラフが散見されます。

素人が統計学者や経済学者などの専門家の調査結果を正確に検証することができるわけではありません。しかしこのようなときに忘れずに疑問を持つことで検証可能性を探ることはでき、また答えが分かれば歪みを看破することができます。

## 統計のウソを見破る 5 つの視点

1) 誰がそう言っているか (統計の出所に注意)

たとえばある政治政党に支持をする人にだけアンケートをおこなえば歪んだ世論を作りあげることができます。労働者の意見だけを吸い上げて、多くの人が社会に不満を持っているという統計を取ることもできます。

2) どういう方法でわかったか (調査方法に注意)

1200 社にアンケートをとって、そのうちわずか 1 〜 2 割しか回答が無かったとします。そこから商品の値段についての満足度調査をおこなっても、有意なサンプルから統計を取ったとは言えません。

3) 足りないデータはないか (隠された資料に注意)

地方の村におきたある天災で 20 代女性の 3 人に 1 人は死亡したというセンセーショナルな統計があったとします。この村にそもそも 20 代女性がたった 3 人しかいなければ、たまたま 1 人が亡くなったというだけにすぎません。この場合は母数というデータが足りてないことになります。

4) 言ってることがまちがっていないか (問題のすりかえに注意)

会計士が剰余金という言葉は聞こえが悪いとし、貸借対照表からこの言葉を削除して固定資産償却など別の言葉を割り当てたとします。これにより今年の剰余金は昨年度と比較して大幅に減少し 0 となりましたと言っても、これは問題のすりかえにすぎません。

5) 意味があるか

アメリカのテレビの普及台数は 1947 年から 5 年間でほぼ 10,000% 増加しました。この増加率をその後の 5 年間に見込みとしてそのまま当てはめると、アメリカ全土でのテレビ普及台数は 20 億台になり、 1 家庭あたり 40 台のテレビがあることになります。このような統計には意味がありません。

### 参考

今回は下記の書籍を参考にしました。下記書籍は本物のデータをもとにした統計的誤りを例を交えてやさしく解説しており、ウソにだまされないようにするために専門家以外のかたにも万人にオススメできる本です。

統計のウソをつく法―数式を使わない統計学入門 (ブルーバックス) [新書]
http://www.amazon.co.jp/dp/4061177206

### 考察

統計数理に基づいた手法を駆使する場合でも、意味のある誠実な統計分析をしなければなりません。高度な計算におぼれる前に、良いデータを集めて作るというところからはじめましょう。

失敗は時として避けられないとしても、歪んだ結論を意図的に導き出そうとするような悪意は持たないようにしましょう。職業倫理を大切にしましょう。
Kobito の記事を複数環境で共有する Ruby スクリプトを作りました。


日頃、ローカル環境では、愛用している Kobito ですが、記事を投稿するのは初めてです。
Kobito はプログラムの仕様や、システムの設計を書くのに重宝しています。コーディングを進めながらドキュメントを補完することも多く、仕事を家に持ち帰った時に、Kobito に書いた記事を別の Mac でも再現できたらと思い、バージョン管理システムと Kobito のファイル連携機能を利用して、複数環境で記事を共有する Ruby スクリプトを書きました。
Github に公開しましたので、使ってみてください。
https://github.com/zeneffect/quna

## 使い方

使い方を簡単に説明します。詳しくは Github の Readme をご覧ください。

### Quna の構成

```bash
/quna
  /data              # デフォルトの記事保存ディレクトリ。
  /private           # 読み込んだファイルのパスのリストを格納。初回実行時に作られます。
  .gitignore
  config.yml.default # 設定ファイルのひな形
  LICENSE
  quna.rb            # スクリプト本体
  README.md
  
```

### 保存ディレクトリの作成

まず、複数の環境で共有したい記事を保管するディレクトリを git などのバージョン管理システムの配下に作ります。

```bash
mkdir /Users/you/kobito/articles
```

### 設定ファイルの作成

Quna の設定ファイルを有効化して、保存ディレクトリを指定します。

```bash
cd quna
cp config.yml.default config.yml
```

```diff
  config:
-   data_dir: !str data
+   data_dir: !str /Users/you/kobito/articles
```

### 新しい記事の作成

new 引数で新しい記事が作れます。

```bash
ruby quna.rb new article-title
```

### 記事の共有

他の環境で追加した記事を pull した後で Quna を起動すれば、Kobito にその記事を追加してくれます。

```bash
git pull origin master

ruby ~/path/to/quna.rb
```

エイリアスを作ればもっと便利です。

```bash
echo -e "\nalias quna='ruby ~/path/to/quna.rb'" >> ~/.bash_profile

quna new article-title
```
Ubuntu 13.10でJBoss Developer Studioのメニューバーが表示されない時の対処

Ubuntu 13.10にJBoss Developer Studio（以下、JBDS）をインストールすると、画面上部のメニューバーが表示されないことがある。

どうやら、Ubuntu 13.10のバグのようだが、これに対処する方法。

# 前提条件
- JBDS 7.1.0が正常にインストールされていること
- JBDSを一度でも起動していること

```bash
% cd ~/.local/share/applications
% vi Red Hat JBoss Developer Studio 7.1.0.GA-1393810184916.desktop
```

Red Hat JBoss Developer Studio 7.1.0.GA-1393810184916.desktopに以下を記載

```bash
# 6行目あたりに、「Exec」の記述があるはずなので、以下のように編集
Exec=env UBUNTU_MENUPROXY=0 /home/hoge/jbdevstudio/studio/jbdevstudio
```

「UBUNTU_MENUPROXY=0」が重要なようだ。

# 参考URL
[Eclipse menus don't show up after upgrading to Ubuntu 13.10](http://stackoverflow.com/questions/19452390/eclipse-menus-dont-show-up-after-upgrading-to-ubuntu-13-10 "Eclipse menus don't show up after upgrading to Ubuntu 13.10")
[Eclipse IDE's Ubuntu Integrated Menus Hack | Hanynowsky](http://hanynowsky.wordpress.com/2012/05/08/eclipse-ides-ubuntu-integrated-menus-hack/ "Eclipse IDE's Ubuntu Integrated Menus Hack | Hanynowsky")
Androidアプリアイコンが変わってくれないときの対処法


追記：ただプロジェクトクリーンをすれば良かった。。。

ic_launcher.pngを書き換えているのアイコンが変わってくれない事がありました。

Eclipseで開発している場合、bin内のcrunchフォルダを削除してビルドし直すことで反映されます。

	プロジェクト名/bin/res/crunch
CoffeeScript等をグローバルにインストールしない方法


## 概要
`npm exec`はこう作ります。

## 背景

CoffeeScriptやTypeScript、Cordovaなどを使う場合、
コマンドの使いやすさからどうしてもグローバルにインストールしがち。

```bash
npm install -g coffee-script
```

しかしこの方法だとプロジェクトごとに異なるバージョンのCoffeeScriptを持つことができない。

ああ、Rubyだったら `bundle exec` があるというのに

## 対応

npm には`npm exec`コマンドが無いのに(1.4.3現在) なぜか`npm bin`コマンドがあるのでそれを使う

```bash:npm-exec
#!/bin/bash
PATH="$(npm bin):$PATH" "$@"
```

上記のスクリプトに `npm-exec`という名前をつけて実行フラグをつけてパスの通っているところにおけばよい。

確認

```bash
npm install coffee-script
npm-exec coffee --version
```
ファイルの変更時刻を表示

```bash:mac
$ ls -lc ファイル名 #Modify
$ ls -lu ファイル名 #Access
$ ls -lU ファイル名 #Create
$ stat -x ファイル名 #Access,Modify,Changeを表示
```

```bash:linux
$ ls --full-time ファイル名
$ stat ファイル名
```
VyattaのSNMPエージェントを設定し、Zabbixから監視する（続く）

#今回のお題は
今回はVyattaにSNMPエージェントを設定して、Zabbixから監視できるようにしてみます。
#VyattaのSNMPエージェントの設定
必要最低限でさくっと設定します。ここでは、コミュニティ名をsecretとします。
CommitとSaveを忘れずに。私は前回、DHCPとNATの設定でSaveを忘れて内容が飛びました。

```
# set service snmp community secret
# commit
# save
```

#SNMPクライアントからのアクセス確認
##Net-SNMP
###仮想マシンの準備
Zabbixインストール用の仮想マシンを、Vyattaで構成している192.168.3.0/24のセグメントに作成。OSはCentOS6.4にします。ほんとに仮想環境は便利ですねぇ。CentOSのインストール手順は割愛します。
###Net-SNMPのインストール
yumでさくっとインストールします。

```
# yum install net-snmp
# yum install net-snmp-utils
```

これでsnmp-walkを使えるようになったので、VyattaのSNMPエージェントにアクセスしてみます。

```
# snmpwalk -v2c -c secret 192.168.3.1
```

結果はこんな感じでずらっと出てきます。

```
[root@zabbix ~]# snmpwalk -v2c -c secret 192.168.3.1
SNMPv2-MIB::sysDescr.0 = STRING: Vyatta VC6.6R1
SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::enterprises.30803
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (82650) 0:13:46.50
SNMPv2-MIB::sysContact.0 = STRING: root
SNMPv2-MIB::sysName.0 = STRING: vyatta
・・・きりがないので後略
```

いやあ、今日はさくっと動いて助かるなぁ。

##Zabbixをインストールする
Zabbixは [こちら](https://www.zabbix.com/documentation/2.2/manual/installation/install_from_packages#red_hat_enterprise_linux_centos "こちら") に従ってインストールします。
ほんとに従うだけなので、手順は割愛で。しかし、Vyatta経由でインストールてきていると思うと、Vyatta愛が高まりますなぁ。
![zabbixのログイン画面](https://qiita-image-store.s3.amazonaws.com/0/37930/eeff0a46-f9e6-40a3-31de-35d51539772b.jpeg)

##ZabbixでVyattaのSNMPエージェント情報を参照する
何の記事かわからなくなってしまうので、Zabbixの設定は割愛で。ここで設定が面倒なので泣きがはいり、コミュニティ名をPublicに変更しました。
ZabbixのSNMP監視の設定って、ほんとに面倒で、社内利用も頓挫しています。おすすめ情報があったらどうか教えてください～。
どうやら、SNMP Genericテンプレートで取れる情報は下図参照のみみたいなので、今日は挫折します。こんなのグラフ化しても面白くないしねぇ。
![snmp-agent.jpg](https://qiita-image-store.s3.amazonaws.com/0/37930/14973705-b8db-7085-e409-21001411a757.jpeg)

#まとめ
ということで、ZabbixでVyattaを監視しつくす設定はまたそのうちチャレンジします。お楽しみに～。
C++でのswapChildrenとgetChildIndexの実装例

```cpp
vector<flash::DisplayObject*> children;

void DisplayObjectContainer::swapChildren(flash::DisplayObject* child1, flash::DisplayObject* child2) {
    int index1 = getChildIndex(child1);
    int index2 = getChildIndex(child2);
	
    if(index1 == -1 || index2 == -1) return;	
    for(int i = 0; i < children.size(); i++) {
        if(children[i] == child1 || children[i] == child2) {
            children.erase(children.begin() + i--);
        }
    }
	
    if(index1 < index2) {
        children.insert(children.begin() + index1, child2);
        children.insert(children.begin() + index2, child1);
    } else {
        children.insert(children.begin() + index2, child1);
        children.insert(children.begin() + index1, child2);
    }
}


const int& DisplayObjectContainer::getChildIndex(flash::DisplayObject* child){
    for(int i = 0; i < children.size(); i++){
        if(children[i] == child) return i;
    }
     
    return -1;
}

```
C++でのsetChildIndexの実装例

```cpp
vector<flash::DisplayObject*> children;

void DisplayObjectContainer::setChildIndex(flash::DisplayObject* child, const int& index) {
    if(index < 0 || index > children.size() - 1) throw "DisplayObjectContainer::setChildIndex\n";

    for(int i = 0; i < children.size(); i++) {
        if(children[i] == child){
            children.erase(children.begin() + i);
            children.insert(children.begin() + index, child);
            return;
        }
    }
}
```
C++でのremoveAllChildrenの実装例

```cpp
vector<flash::DisplayObject*> children;

void DisplayObjectContainer::removeAllChildren() {
    int i = 0;
    int l = children.size();
    
    DisplayObject* child;
    for(i; i < l; i++){
        child = children[i];
        //ステージとの参照を切る
        child->stage(NULL);
        //親コンテナとの参照を切る
        child->parent(NULL);
        //配列から削除
        children.erase(children.begin() + i);
        --i;
        --l;
    }
}
```
C++でのremoveChildAtの実装例

```cpp
vector<flash::DisplayObject*> children;

flash::DisplayObject* DisplayObjectContainer::removeChildAt(const int& index) {
    //対象の子がなかったらエラー
    if(index < 0 || index > children.size() - 1) throw "DisplayObjectContainer::removeChildAt\n";
    
    DisplayObject* child = children[index];
    //ステージとの参照を切る
    child->stage(NULL);
    //親コンテナとの参照を切る
    child->parent(NULL);
    //配列から削除
    children.erase(children.begin() + index);

    return child;
}
```
C++でのremoveChildの実装例

```cpp
vector<flash::DisplayObject*> children;

flash::DisplayObject* DisplayObjectContainer::removeChild(flash::DisplayObject* child) {
    for(int i = 0; i < children.size(); i++) {
        if(children[i] == child) {
            //ステージとの参照を切る
            child->stage(NULL); 
            //親コンテナとの参照を切る
            child->parent(NULL);
            //配列から削除
            children.erase(children.begin() + i);
            return child;
        }
    }
    
    //対象の子がなかったらエラー
    throw "DisplayObjectContainer::removeChild\n";
}
```
C++での型のチェックと比較


```cpp
//任意のクラス内での自身の型名とhogeObjectの型名とを比較  ※.name()した方がよかったっけ？？
const type_info& this_id = typeid(*this);
const type_info& client_id = typeid(*hogeObject);

//コンソールに出力
cout << bool(this_id == client_id) << endl;
```

[参考URL]

第５０章　型チェック
http://www7b.biglobe.ne.jp/~robe/cpphtml/html03/cpp03050.html

オブジェクトの型を知る
http://wisdom.sakura.ne.jp/programming/cpp/cpp36.html
MikuMikuPenguinのビルド in Windows






## 目的 ##
sn0w75氏の公開しているオープンソースMMD環境MikuMikuPenguin(MMP)
をWindows環境でビルドするために、MinGWの環境を整備する。

## 必要なもの ##

- [MinGW-Builds GCC Compiler 4.8.2(SEH) ](http://sourceforge.net/projects/mingwbuilds/files/host-windows/testing/4.8.2/64-bit/threads-posix/seh/)
- [MSYS](http://sourceforge.net/projects/mingwbuilds/files/external-binary-packages/)
- [CMake 2.8](http://www.cmake.org/cmake/resources/software.html)

## CMake および MSYS, MinGW の導入 ##

### CMake ###
基本的にインストーラに従うだけでOK.ただし、インストールパスに
空白が入らないようにしておくとベター

### MSYS ###
入手した、msys+7za+wget+svn+git+mercurial+cvs-rev13.7z 解凍して
C:\msysに配置。このパッケージ一つで、7z, w-get, svn, git, mercurial など
いろいろ入っていて非常に便利。

### MinGW ###
MSYS と同様に入手したアーカイブをC:\mingw64に配置。

### 各種設定 ###

#### fstab の設定 ####

C:\msys\etc\fstab に以下を追加

```
C:/mingw64     /mingw
C:/CMake       /cmake
D:/sdk/mingw64 /usr/local
```

/usr/localを別のディスクにしてあるのは、残り容量が
心許無いためです。

#### .bashrc の設定 ####

```bash:.bashrc
!/bin/sh.exe
export PATH=/usr/local/bin:/usr/local/lib:/c/msys/bin:/mingw/bin
export PATH=${PATH}:/cmake/bin
```

最低限これくらいセットしておけば大丈夫なんじゃないでしょうか。


## MMP 関連ライブラリのビルド ##

### glfw ###
現状公開されている glfw はバージョン3.0以降であり、
MMPが要求する2.x系のコードが必要となります。
これは [glfw-legacy](https://github.com/glfw/glfw-legacy)を用います。

```
$ git clone git://github.com/glfw/glfw-legacy.git
$ make win32-msys
$ make msys-install
```

### glew ###

glew は基本的に最新のソースで大丈夫だと思います。
glew のMakefileに以下のように記述がありますが、

```diff
-GLEW_DEST ?= /usr
+GLEW_DEST ?= /usr/local
```

に変更しましょう。
あとは ```make && make install```

### glm ###
glm はヘッダのみで提供されているライブラリです。
[glmダウンロードページ](http://sourceforge.net/projects/ogl-math/files/)
から、0.9.4系の最新のアーカイブを取得します。

インストールは展開したディレクトリの中にある glm ディレクトリを
/usr/local/include に移動するだけでOKです。

### Bullet ###

物理演算ライブラリ bullet のソースコードをダウンロードします。[配布先](http://code.google.com/p/bullet/downloads/list)
以下、bullet のソースコードが格納されているディレクトリを
bullet\_sourceとします。

```
$ cd $bullet_source
$ mkdir build
$ cd build
$ cmake -G "MSYS Makefiles" -DINSTALL_LIBS=on \
	-DBUILD_DEMOS=off -DBUILD_EXTRAS=off ..
$ make && make install
```

### SOIL ###

同様にソースを取得しビルドを行います。
[SOIL](http://www.lonesock.net/soil.html)よりソースコードをダウンロードしつつ展開します。

```bash
cd ${SOIL_DIR}/projcets/makefile
mkdir obj
make -f makefile
```

これで、```${SOIL_DIR}/lib/libSOIL.a``` が出来ている。
これを ```/usr/local/lib``` にコピー。
また、SOIL.h は /usr/local/include/SOIL/ へコピーする。

とりあえず MMP の依存する小規模なライブラリ群のビルドは
ここまで、次回からは MMP が現在取り組んでいる Qt5 を含めた
ビルドと、MMP 自体のビルドについて書く予定。
メールに添付された diff をカラフルにする Thunerbird編

https://code.google.com/p/colorediffs/ から xpi ファイルをダウンロードしてインストールする。

[Colored Diffs](https://addons.mozilla.org/en-us/thunderbird/addon/colored-diffs/) は更新されなくなっていて、最近の Thunderbird へはインストールできない。

今のところ、Thunberbird 24.3.0 + colorediffs-0.6.2011.11.22.17.42.09.xpi の組み合わせで問題なく動いている。
Windows azure 仮想マシンをコマンドラインツールから操作する


# 準備
まずインストール。実行環境は Ubuntu 13.10。
azure-cli は node.js 上で動くので、それからインストール。

```
# apt-get install nodejs npm
# npm install azure-cli -g
```

これで azure コマンドが使えるようになる。
次にアカウントの設定をするため、必要なファイルを準備する。
これは、次のコマンドを実行すると、ダウンロードするための URL (今回は http://go.microsoft.com/fwlink/?LinkId=254432 だった) が表示されるので、ブラウザでそれを開く:

```
azure account download
```

azure コマンドは #!/usr/bin/env node を実行しようとする。
しかし apt-get でインストールすると node ではなく nodejs になるので、vim \`which azure\` して shebang を編集するか、nodejs \`which azure\` なりして実行する必要がある。 

さて、サブスクリプションが有効なアカウントでログインすると、ダウンロードが始まる。

ここで取得したファイルを、次のように反映する:

```
azure account import Visual\ Studio\ Professional\ with\ MSDN-3-1-2014-credentials.publishsettings
```

これで実行できるようになっているはずなので、確認してみる:

```
$ azure vm location list
info:    Executing command vm location list
+ Getting locations                                                            
data:    Name          
data:    --------------
data:    East Asia     
data:    East US       
data:    Japan East     <<<
data:    Japan West     <<<
data:    North Europe  
data:    Southeast Asia
data:    West Europe   
data:    West US       
info:    vm location list command OK
```

# SSH 用の鍵の生成

Windows azure では openssh 形式の公開鍵を受け付けてくれないので、以下のように openssl コマンドで作成しておく:

```
$ openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout azure.key -out azure-cert.pem
  # パラメータは適当でいいようだ
$ mv -i azure* ~/.ssh
$ chmod 600 ~/.ssh/azure.key

$ cat >> ~/.ssh/config <<EOB
Host *.cloudapp.net
    User azureuser
    IdentityFile $HOME/.ssh/azure.key
EOB
```

# VM を起動してみる

VM イメージ一覧:

```
$ azure vm image list
```

作成 & 起動:

```
$ azure vm create \
 --location 'Japan East' \
 --vm-size ExtraSmall \
 --ssh \
 --ssh-cert ~/.ssh/azure-cert.pem \
 --no-ssh-password \
 azuretest-vm1 \
 b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu_DAILY_BUILD-saucy-13_10-amd64-server-20140223-en-us-30GB \
 azureuser
```

--ssh を付けておかないと、--no-ssh-password が、--ssh-cert が無いと言って、エラーになるし、そもそも sshd が起動しないので注意。

[ココ](http://www.windowsazure.com/ja-jp/develop/nodejs/how-to-guides/command-line-tools/) には 22/tcp を開けるようにとあるけど、勝手にやってくれるので不要。

起動するまでしばし待つ。心なしか WebUI から作るよりも早い気がする。

```
$ ssh azuretest-vm1.cloudapp.net
```

# 後片付け

VM を停止 & 削除する。--blob-delete を付けると、ディスクも一緒に削除してくれる... ハズなんだけど、削除されない。謎。

```
azure vm shutdown azuretest-vm1
azure vm delete [--blob-delete] azuretest-vm1
```
NSManagedObjectサブクラスをrenameしたい

アプリ公開後にCoreDataのNSManagedObjectサブクラスをrenameしたくなってしまった場合に、使用中のデータベース内のデータを使い続けるためには、わざわざマイグレーションしなきゃいけないのか？と思っていましたが、簡単な方法がありました。

環境：Xcode 5.0.2

Data Modelファイルをクリックして、Data Model Inspectorを選択。
ここのクラス名を、renameしたいクラス名に変更する。

![スクリーンショット 2014-03-03 1.02.50.png](https://qiita-image-store.s3.amazonaws.com/0/38775/cef4249c-517c-00aa-6a35-9df2cd166ba7.png)

あとは最初の作成時と同じように、「New File」→「NSManagedObject subclass」と選択し、ナビゲーションに従ってクリックしていけばOK。

![スクリーンショット 2014-03-03 1.03.12.png](https://qiita-image-store.s3.amazonaws.com/0/38775/e40411da-11a4-ce50-f4d6-4cf056b6d2eb.png)

renameされる前のファイルは消してしまってOKです。
作業はこれだけ。

クラス名とEntityの名前の同期が取れなくなってしまうので、全く違う名前になる場合はどこかにコメントを残した方がよいかもしれませんね。