OmniAICreator/Qiita-1.07M huggingface dataset:
CentOS6.4 Apach2.2環境にJenkinsをインストール

まずはここを見てみた
http://treeapps.hatenablog.com/entry/2014/06/11/233027

yumでインストールする。

##まずはjenkins用リポジトリ追加

```
# sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
# sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
```

##インストール

```
# sudo yum -y install jenkins
```

jenkinsではデフォルトでポート8080を使用する。今回はそのまま使用する。

##ポート8080を解放する

```
# iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
```

###解放したらiptable再起動

```
# service iptables restart
```

##サブドメインを登録
自分の場合はjenkins.ドメイン名でアクセスしたかったので
お名前つかってたのでそこでやった。
参考 http://wdw-blog.info/subdomain/

##Jenkinsの設定ファイルをいじる
参考サイト　http://d.hatena.ne.jp/katsuren/20121030/1351569655

```
 vim /etc/sysconfig/jenkins
```

###ApacheからJenkinsを見えるようにする

```
JENKINS_ARGS=""
	↓
JENKINS_ARGS="--prefix=/jenkins"
```

##Apacheのバーチャルホストの設定をする

```
 vim /etc/httpd/conf/httpd.conf
```

```httpd.comf
<VirtualHost *:80>
    ServerName jenkins.ドメイン名
    ServerAlias jenkins.ドメイン名
    DocumentRoot "/var/lib/jenkins"
    ErrorLog logs/jenkins-error_log
    CustomLog logs/jenkins-access_log combined env=!no_log
    ProxyPass /jenkins http://localhost:8080/jenkins retry=5
    ProxyPassReverse /jenkins http://localhost:8080/jenkins
    ProxyRequests Off
    <Proxy http://localhost:8080/jenkins*>
        Order deny,allow
        Allow from all
    </Proxy>
</VirtualHost>
```

を追記。現実にはJenkinsに誰でもアクセス出来るのはあり得ないのでまた別でそのへん投稿するかも。

##Apache再起動　Jenkins起動

```
# service httpd restart
# service jenkins start
```


###ここで若干詰んだ
Jenkinsにアクセス出来るか確認

```
# curl localhost:8080
```

```
curl: (7) couldn't connect to host
```
できない。

####Jenkinsのステータス確認した

```
# service jenkins status
```

```
jenkins dead but pid file exists
```

死んでいるけどプロセスファイルはあるよ
なんでや！

ググる
http://jenkins-ci.361315.n4.nabble.com/jenkins-dead-but-pid-file-exists-td4489352.html

##Javaのバージョンが1.5だった...

```
# java -version
```
1.5だと動かない

###openjdk java 1.7インストール

```
# yum install jenkins dejavu-sans-fonts fontconfig java-1.7.0-openjdk
```

##もう一度起動して確認

```
# service jenkins start
```

```
# service jenkins status
```

```
jenkins (pid  8279) is running...
```

成功！


##アクセス

jenkins.ドメイン名/jenkins

にアクセス出来れば成功！


![ジェンキンス.png](https://qiita-image-store.s3.amazonaws.com/0/59914/dffcf839-a063-6cb4-dab0-991c6053477a.png)

成功！
$GLOBALSに_SERVERや_ENVが登録される条件

## $GLOBALS
$GLOBALS — グローバルスコープで使用可能なすべての変数への参照
http://php.net/manual/ja/reserved.variables.globals.php

この`$GLOBALS`変数のキーに`_SERVER`や`_ENV`が登録される時とされない時があります。

## auto_globals_jit

これはphp.iniの[auto_globals_jit](http://php.net/manual/ja/ini.core.php#ini.auto-globals-jit)の設定で決定されます。

スクリプト

```php
print_r(array_keys($GLOBALS));
```

`auto_globals_jit=On`の結果

```
Array
(
    [0] => _GET
    [1] => _POST
    [2] => _COOKIE
    [3] => _FILES
    [4] => GLOBALS
)
```

`auto_globals_jit=Off`の結果

```
Array
(
    [0] => _GET
    [1] => _POST
    [2] => _COOKIE
    [3] => _SERVER
    [4] => _ENV
    [5] => _REQUEST
    [6] => _FILES
    [7] => GLOBALS
)
```

`auto_globals_jit=On`でも`$_SERVER`に一度でもアクセスすると登録されます。

```php
$_SERVER; // 値を利用しなくてもよい
print_r(array_keys($GLOBALS));
```

```
Array
(
    [0] => _GET
    [1] => _POST
    [2] => _COOKIE
    [3] => _FILES
    [4] => _SERVER
    [5] => GLOBALS
)
```

## まとめ

* php.ini.の設定に関わらず`$GLOBALS['_SERVER']`が存在する事を*前提とするなら*`$GLOBALS`使用の前に$_SERVERにアクセスする。

```php
$_SERVER;
$method = $GLOBALS['_SERVER']['REQUEST_METHOD'];
```
 * パフォーマンス向上のためには`auto_globals_jit=On`にする
 * ライブラリ開発時の設定は`auto_globals_jit=On`に
 * `$_REQUEST`対応はPHP5.3以降、その他はPHP5.0以降対応の模様 ([ドキュメントにないとの指摘](http://php.net/manual/ja/ini.core.php#ini.auto-globals-jit))
 
## 参照

* https://bugs.php.net/bug.php?id=65223
* http://stackoverflow.com/questions/17545710/php-globals-missing-server
EspruinoとMacでBLEシリアル通信する


とりあえず[5日目の記事](http://qiita.com/rockymanobi/items/6e1dad4ffb1644b60b51)でEspruinoにパーツつけて色々する、、的なところにたどり着いた感があるので、今度はデータを飛ばします。今回はBLEです。[7日目の記事](http://bathtimefish.hatenablog.com/entry/2014/12/07/185047)でシリアル通信が出てきたので乗っかってみようと思います。

# 目標

Espruinoで取得した温度をBLEで飛ばしてMac上のコンソールに出力します。Mac側のプログラムはnode.jsで動かします。一応全部JavaScriptですね。BLEモジュールは種類がたくさん出ていますが、今回は浅草ギ研さんのBLEシリアルモジュールを使い、温度センサの情報をMacに送ってみます。

# 必要なもの

* 温度センサ : [5日目の記事](http://qiita.com/rockymanobi/items/6e1dad4ffb1644b60b51)を参照
* [浅草ギ研 BLEシリアルモジュール](http://www.amazon.co.jp/%E6%B5%85%E8%8D%89%E3%82%AE%E7%A0%94-BLE%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB-BLESerial/dp/B00H3TLBV8)
* BLEが使えるMac(最近のならOK 2013も大丈夫)
  * node.js / npm も入っているとスムーズ。

このBLEシリアルモジュールは、その名の通りBLEでシリアル通信が出来るモジュールです。`tx`,`rx`等のキャラクタリスティクスをもつサービスが最初から提供されているので、Espruino側で必要なのは単純なシリアル通信のプログラムを書くことだけです。なんのこっちゃ分からん人はとりあえず読み進めましょう。

# 結線

[公式のこの記事](http://www.robotsfx.com/robot/img/radio/BLESerial/BLESerial_how6.html)にArduinoでの結線例がありますので、これをそのままEspruinoで再現します。モジュールの`tx`をEspruinoの`A10`に、モジュールの`rx`をEspruinoの`A9`に接続します。また、モジュールの`CTX`と`RTX`をワイヤーで接続します。電源は`GND`と`vBAT`でOKです。
ちなみに`tx`は送信機、`rx`は受信機を指します。だからEspruino側の`tx`とモジュール側の`rx`を結線するわけですね。

温度センサの結線方法については[5日目の記事](http://qiita.com/rockymanobi/items/6e1dad4ffb1644b60b51)と同様です。

# Espruino側のプログラム

BLEとしての動きはほぼ全てBLEシリアルモジュールがやってくれているので、Espruinoに記述するプログラムは単純なシリアル通信のプログラムでOKです。`Serial#write`がメインになるので、[7日目の記事](http://bathtimefish.hatenablog.com/entry/2014/12/07/185047)のプログラムとセットアップまでは同様。読み書きに関しては真逆になります。

```js
// 温度センサのセットアップ
var ow = new OneWire(A1);
var sensor = require("DS18B20").connect(ow);

// シリアル通信のセットアップ
Serial1.setup(9600,{ tx: A9, rx: A10  });

// 温度をコンソールに出しつつシリアル通信で送信
var writewrite = function(){
  console.log( sensor.getTemp() );
  Serial1.println( sensor.getTemp() );  
};

// 1秒間隔で繰り返す
setInterval( writewrite, 1000);
```

# Mac側のプログラム

[Github](https://github.com/rockymanobi/Espruino-BLESerial/blob/master/index.js) にアップロードしました。Readmeの通りに進めるとプログラムが起動して、BLEを探して接続しようとします。

node.jsの`noble`というライブラリを使ってBLE通信のプログラムを記述しています。BLE対応機器の電波を探し、見つけたら提供するサービスを`uuid`を指定して取得、さらにそこからキャラクタリスティクスを....詳しくはプログラム内のコメントを見てください。BLEの基本構造についての記事は[こちら](https://sites.google.com/site/bluexeyexcrow/bluetooth/ble_basic)が参考になるかと思います。

Espruinoの温度センサで検知した値がコンソールログに出力され始めたら成功です。
SQLite3で時刻の差分を求める


# やりたかったこと

実験用のWebアプリを作る際に，アプリへのアクセスログから，あるアクションから他のアクションに至るまでの滞留時間などをロギングする必要がありました．
そこで，SQLを用いて，あるレコードに記された時刻と，他のレコードに記された時刻の差分を取りたかったのですが，あまりまとまった記事がないようなのでまとめておきます．

SQLiteはRuby on Rails 4.0.0にバンドルされているもので，バージョンは3.8.2．

## SQLiteにおける時刻の差分の計算

SQLiteにはdatetime型が存在せず，時刻の情報は，フォーマットに従った文字列に格納されます．
これを，strftime関数を用いてUNIX時間に変換し，1970年1月1日からの経過秒数を取得します．
この差を求めることで，秒単位の差分を求めることができます．

例えば，テーブルaがid，created_at(レコードが作られた時刻)，updated_at(レコードが最後に更新された時刻)というカラムを持っているとすると，

```sql:diff.sql
select a.id, strftime('%s', a.updated_at) - strftime('%s', a.created_at)
from a
where a.id = 100;
```

とすることで，idが100のレコードについてのupdated_atとcreated_atの差分，すなわち，レコードが作られてから最後に更新されるまでの時間(秒)を求めることができます．

## レコード間の時刻の差分

本題です．

例えば，'accesses'という名前の，

|     id     |     type    |  created_at |  updated_at  |
|:----------:|:-----------:|:-----------:|:------------:|
| 100 | search | 2014-12-08 14:01:30.634287| 2014-12-08 14:01:30.634287 |
| 158 | result | 2014-12-08 16:23:01.541760 | 2014-12-08 16:26:41.654827 |
| 160 | result | 2014-12-08 16:23:01.541760 | 2014-12-08 16:26:41.047661 |

のようなテーブルがあって，idが100(typeが'search')のレコードのupdated_atと，他のレコードのupdated_atの差分の集合を取得したい時は，

```sql:diff_records.sql
select a.id, b.id, strftime('%s', b.updated_at) - strftime('%s', a.updated_at)
from accesses as a, accesses as b
where a.id = 100 and b.id <> 100;
```

のように，自己結合を使うとよいかと思います．

これで問題なくログが取れそうです！

## 参考

http://www.dbonline.jp/sqlite/function/index8.html
Rails runnerを使ってファイルを実行しました

Railsにrunnerというバッチ処理などを実行できるものがあるので、runnerを実行しました。

# 実行用スクリプトを用意
実行用に、lib/batch/helloworld.rbというスクリプトを用意しました。

```rb:helloworld.rb
class Batch::Helloworld
  def self.helloworld
    puts "HelloWorld!"
  end
end
```

# runnerで実行
helloworld.rbを実行します。

```bash:runnerでファイルを実行
bundle exec rails runner Batch::Helloworld.helloworld
# 出力
HelloWorld!
```

## おまけ
lib/batch/get_api.rb というスクリプトを用意しました。

```rb:get_api.rb
class Batch::GetApi
  def self.get_api
    # API を取得する処理
    puts "GET API"
  end
end
```

```bash:runnerでファイルを実行
bundle exec rails runner Batch::GetApi.get_api
# 出力
GET API
```

# runnerの実行でエラーが出る場合
runnerを実行した際にエラーが発生することがありました。

```bash:エラーが発生
/home/vagrant/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/railties-4.2.0/lib/rails/commands/runner.rb:62:in `<top (required)>': uninitialized constant Batch (NameError)
```
これは/lib以下が読み込めていないことが原因のようです。
config/application.rbに読み込み設定を記述します。

```rb:application.rbにautoload_pathsを追加
class Application < Rails::Application
  略
  config.autoload_paths += Dir["#{config.root}/lib"]
  略
end
```
このように書くことでエラーは発生せず、runnerを実行することができました。

# おまけ Herokuでrunnerを実行
Herokuでrunnerコマンドを実行する場合は、`heroku run`をつければ動くみたいです。

```bash:herokuでrunnerを実行
heroku run rails runner Batch::GetApi.get_api --app pugiemonn
```
同じキーを持つログが連続した場合に最初の1つしか送信しないようにするfluent-plugin-dedupを作りました


## モチベーション

とあるテーブルにレコードが挿入されると通知するようなのが欲しくて [fluent-plugin-sql](https://github.com/fluent/fluent-plugin-sql) を使ったのですが、fluentdの最新版だと依存関係のコンフリクトがあったり、ポジションファイルが無かった時にテーブルの最初から全部SELECTしていくのが使いにくかったり、そもそもActiveRecordがtinyintをboolに変換するせいでパッチをあてていたのが辛かったので、テーブルの最新レコードをJSONで返すようなスクリプトを作ってそれを`in_exec`で叩くように変更しました。

ところが、`exec`するたびに毎回通知が送られてほしいわけではなく、テーブルにレコードが挿入された時だけ通知してほしいので、2回以上同じレコードが続いた場合に2回目以降を無視するようにしなければいけならず、ググってもそういうプラグインが無かったので作りました。

https://github.com/edvakf/fluent-plugin-dedup

## 使い方

READMEにも載せましたが、こういう風に使うことを想定しています。

```aconf
<source>
  type exec
  command latest_state_of_something.rb
  format json
  keys unique_id,foo,bar
  tag some.thing
  run_interval 1s
</source>

<match some.thing>
  type dedup
  key  unique_id
</match>

<match dedup.some.thing>
  type stdout
</match>
```

この場合だと`unique_id`というキーの値が同じものが2回以上続いたら2回目は無視することになります。`dedup`というプレフィックスがタグにつきます。（fluentdのv0.12だとこういうのは推奨されていませんので、filterプラグインとして書き直してプレフィックスを使わないようにするつもりです）

### 状態をファイルに保存

以下のようにするとfluentdが終了するときにファイルに状態を書き出してくれるため、再起動後の最初のログが再起動前の最後のログと同じであれば無視されます。

```aconf
<match some.thing>
  type dedup
  key  unique_id
  file /tmp/dedup_state.json
</match>
```

### ユニーク性はタグごとに持つ

対象とするタグが1種類ではない場合はどうしようか迷ったのですが、タグごとに状態を記憶するようにしました。下の場合だと、同じ`unique_id`を持つ`some.hoge`と`some.fuga`のログが続いた場合は **無視されずに両方とも流れます** 。

```aconf
<match some.**>
  type dedup
  key  unique_id
</match>
```

### 直近N個のログに一致する場合に無視したい

`in_exec`で実行するコマンドが「データベースの最新10件」を返すコマンドだった場合に、前回実行時の10件と今回実行時の10件のうち、今回新たに増えたものを通知したいので、LRUキャッシュを使いました。設定ファイルをこのようにすると、直近10件のユニークな`unique_id`のどれか一致すれば無視されます。

```aconf
<match some.**>
  type dedup
  key  unique_id
  cache_per_tag 10
</match>
```

## fluent-plugin-suppressとの違い

作ってから気づいたのですが、そういうプラグインがあるそうです。

http://d.hatena.ne.jp/sfujiwara/20121122/1353571085
https://github.com/fujiwara/fluent-plugin-suppress

見たところ、fluent-plugin-suppressはN秒間バッファリングして同じログならM個までしか通さないという動きをするようです。

fluent-plugin-dedupは最初の1個はいち早く流し、次からは同じものは無視するという動きなので、ちょっと違いました。
Chefでapacheを入れる

#目次
1. はじめに
2. 実行環境
3. 手順
4. まとめ

## はじめに
最近やっとChefを初めました。
まだやり方が手探りなのですが、環境構築をどんどんChefで自動化していきたいと思っています。
とりあえず、apacheのインストール手順をChefで行ってみます。

bundle,ruby,vagrantはインストール済みを前提にしております。

##実行環境
* Mac:10.9.5
* ruby:ruby 2.1.3p242 (2014-09-19 revision 47630) [x86_64-darwin13.0]
* vagrant box:[opscode-centos-5.11-i386](http://opscode-vm-bento.s3.amazonaws.com/vagrant/vmware/opscode_centos-5.11-i386_chef-provisionerless.box)(Chef社の[Bento](https://github.com/opscode/bento)で公開されているboxを使いました。)


##手順
作業用ディレクトリ作成して、移動。
bundleを初期化してGemfileを生成

```bash
bundle init
```

生成されたGemfileを編集して、knife-soloとberkshelfをインストール

```rb:Gemfile
gem 'knife-solo'
gem 'berkshelf', “2.0.16"
```

gemをインストール

```bash
bundle install
```

vagrant を初期化させる。

```bash
vagrant init
```

Vagrantfileを編集する
box指定は割愛いたします。
private_networkを指定して、ホストから確認できるようにする

```rb:Vagrantfile
config.vm.network "private_network", ip: “192.168.33.10"
```

仮想環境を立ち上げる

```bash
vagrant up
```

knife soloを初期化。とりあえず、カレントディレクトリをChefのリポジトリにする。

```bash
knife solo init .
```


ゲスト側にsshでログインできるようにする

```bash
vagrant ssh-config --host webdb >> ~/.ssh/config
```

この設定で

```bash
ssh webdb
```
でゲストにsshでログインできるようになる。
knife solo bootstrapでゲスト側にchefをインストールする

```bash
knife solo bootstrap webdb
```


ホスト側でapacheインストール用のcookbookを作成する。

```bash
knife cookbook create apache -o site-cookbooks
```

nodes/webdb.jsonを編集し、
nodesの下のapacheレシピをノード対象にする

```json:nodes/webdb.json
  "run_list": [
       "recipe[apache]"
  ]
```

apacheインストールのレシピを作成する。
serviceでインストール後に

```rb:site-cookbooks/apache/recipes/default.rb
package "httpd" do
     action :install
end

service "httpd" do
     action [ :enable, :start]
end
```

ゲスト側にレシピを実行。

```bash
knife solo cook webdb
```

http://192.168.33.10/ 
にアクセス
apacheのデフォルトのページが表示されていたら成功。

![スクリーンショット_apache.png](https://qiita-image-store.s3.amazonaws.com/0/31587/1431960f-773a-7cb0-c7bc-fc38b2ccd237.png)

##まとめ
とりあえず、今日はここまで。
でもインストールだけではまだまだ足りない。
apacheを入れるなら、特定のサブドメインを作って、それにベーシック認証をかけるところまでいきたい。
引き続き、Chefのやり方を見ていきます。

##参考
[Chef実践入門　コードによるインフラ構成の自動化](http://gihyo.jp/book/2014/978-4-7741-6500-4)
.emacsの設定

# emacsの.emacsの設定

なお，この記事の筆者はLispも知らないのでネットから拾ってきた設定をただメモしているだけです．
##基本設定

### スタートアップ非表示

> (setq inhibit-startup-screen t)

### 行番号の表示

> (global-linum-mode t)
> (set-face-attribute 'linum nil:foreground "#090":height 0.9)

### タブ幅

> (custom-set-variables '(tab-width 4))

### バックアップを残さない

> (setq make-backup-files nil)

### 1行ずつスクロール

> (setq scroll-conservatively 35
      scroll-margin 0
      scroll-step 1)
(setq comint-scroll-show-maximum-output t) ;; shell-mode
OpenSSLの0.9.8系のバージョニングがExcelみたいになってる

現在のOpenSSL 0.9.8系の最新バージョンは0.9.8zcです。

OpenSSLのバージョニングって0.9.8→0.9.8a→0.9.8b→…みたいになってるんですけど、0.9.8yの次どうするのかなーと思ってたら0.9.8y→0.9.8za→0.9.8zb→…ってノリで続いてました。

参照：[OpenSSL: OpenSSL 0.9.8 Release Notes.](https://www.openssl.org/news/openssl-0.9.8-notes.html)

他では見たことがないバージョニングだったので記録として。
【Android：無償アプリ→有償にするときなどに役立ち！】お手軽パッケージ変更方法

とあるコンテストがあって。
けど、有償版にできる完成度を目指すと、〆切に間に合わなかった…

ために無償アプリで出したところ

「いちど無償アプリで出したものは、有償にはできません」

と、Google Playに云われて…いろいろやっていたら

つまりはパッケージをかえて、他のアプリとして出せ、と！

http://kumikomi.asablo.jp/blog/2011/07/04/5942336
↑こちらにお世話になりました(｀･ω･´)

ありがとうございました(*´ω｀*)
Linux(Debian系)を導入した直後にやる設定の殴り書き


# Lubuntu14.04デスクトップ向けで最初にやる設定
Linux初心者ですが，Linux特にLubuntu 14.04を古いネットブックに導入した時の設定を自分用としてまとめておきます．普段使い兼研究用なのであんまり使わないようなソフトも入っています．また，無線LANなどのデバイスドライバはシステムの更新したら使えるようにしてくれることが多いです．（ここらへんは全くわからないので非常にありがたい）できない場合「追加のドライバー」から色々やってみるといいかも．

* ホームディレクトリの名前を英語にする．

> $ LANG=C xdg-user-dirs-gtk-update

ホームディレクトリの名前が日本語だと色々不便なので英語にします．むしろ日本語でインストールするとディレクトリ名が日本語になるのはやめてほしいいのですが・・・

* emacsを追加する．

> $ sudo apt-get install emacs24

ネットで調べるとvimのほうが優勢な気もしますが，初めて触れたものがemacsなので使っていきたいです．vimは最低限書いて保存して閉じれる程度は使えるようにしないと・・・．.emacsの設定は別でまた書こうと思います．

* gccなどC/C++の開発環境を整える．

> sudo apt-get install build-essential

実はこのコマンドを知らなくてわざわざ必要な物を一つずつパッケージをダウンロードしていたのは内緒です

* 日本語入力mozcをインストールする

> sudo apt-get install fcitx fcitx-mozc fcitx-libs-qt5 fcitx-frontend-qt5

インストールが完了したらGUIで設定を行います．

> 「設定」→「言語サポート」→「キーボード入力に使うIMシステム」→fcitxに設定→リログ

初期設定ではAnthyだったのでmozcをインストールします．デスクトップ用途も兼ねているのでmozcは非常に使いやすいです．

* gnuplotのインストール

> sudo apt-get install gnuplot-x11

グラフ描画ツールです．

* scilabのインストール

> $ sudo apt-get install scilab

何かと便利なscilabです．matlabなんて買ってる余裕がないのでこちらで行列やベクトルの演算を行います．

* java開発環境のインストール

> $ sudo add-apt-repository ppa:webupd8team/java
> $ sudo apt-get update
> $ sudo apt-get install oracle-jdk7-installer

javaもたまに使うことがあるので導入しておきます．Eclipseもソフトウェアセンターから導入しました．

*****

## 追加したアプリ一覧（ソフトウェアセンターからインストール）

1. Dropbox
2. Thunderbird
3. LibreOffice
4. GIMP
5. Eclipse
6. Cairo-Dock
7. Skype
Goの組み込み型

こんにちは、[@Solpha](https://twitter.com/solpha)です。

今後プログラムを書くうえで色々な型を知っておく必要があるので、主要な組み込み型を整理してみました。

#組み込み型一覧
|  　　  型      |    　　　　　 概要 　　　　　　　    |
|:-----------|------------:|
| bool    |     trueまたはfalseによる論理値を表現 |
| uint    |     符号なし-32bit以上の整数 |
| uint8       |   符号なし-8bit整数 |
| uint16     |    符号なし-16bit整数 |
| uint32       |  符号なし-32bit整数 |
| uint64         |符号なし-64bit整数 |
| int    |     符号なし-32bit以上の整数 |
| int8       |    符号あり-8bit整数 |
| int16    |     符号あり-16bit整数 |
| int32    |     符号あり-32bit整数 |
| int64    |     符号あり-64bit整数 |
| float32    |   IE-754 32bit浮動小数値 |
| float64    |   IE-754 64bit浮動小数値 |
| complex64    | float32の実数部と虚数部を持つ複素数 |
| complex128    | float64の実数部と虚数部を持つ複素数 |
| byte    |     uint8のエイリアス |
| rune    |     int32のエイリアス |
| uintptr    |  ポインタの値を格納する大きさの符号なし整数 |
| error   |     エラーコンディションを表すインターフェース |
| string    |     8bit文字列の集合体 |

何か漏れているような気もしますが、ざっとこんなものでしょう。
（うまく使い分けられる自信はありませんが・・・）
【Android Studio】エミュレータのスクショを楽々キレイ☆簡単に撮る方法！

Androidのアプリを提出するにあたり。。。

「タブレットの7inchと10inchの画面も提出してね★」とかってさ
しれっと書いてあって

む　か　つ　い　た♪（はあと★）

けどエミュレータの画面でいいらしい。

Android Studioの方ならここから

![スクリーンショット_2014-12-09_00_33_26.jpg](https://qiita-image-store.s3.amazonaws.com/0/58253/201e4e95-ec2d-db92-c7bd-7faccadd70fe.jpeg)

バーチャルデバイス一覧を選んで

![スクリーンショット_2014-12-09_00_34_08.jpg](https://qiita-image-store.s3.amazonaws.com/0/58253/e3729638-4ec2-b97a-e311-653ada2f9777.jpeg)

鉛筆のところから詳細を選んで、

ここのチェックをはずしちゃってチョーダイ！！


![スクリーンショット_2014-12-09_00_34_16.jpg](https://qiita-image-store.s3.amazonaws.com/0/58253/361600e6-d371-a02d-0dab-8ac24cae15c3.jpeg)


あとはこの御本家のサイトが本当にわかりやすいです。。。

http://androidstudio.hatenablog.com/entry/2014/07/26/164203

私のような「アホの子」も、開発者目指してがんばります(*´ω｀*)
みなさま、応援よろしくお願いいたします☆
KDG体験学習用cpp その２

12.08.2014 T.Nonaka Written.

質問があればお受けいたします。多分ないと思います。（笑）
九州、博多の専門学校の体験学習用のノートです。
ggggnonaka@gmail.com

前提　Mac、Linuxの場合、gccがインストール済み。
学習用作業ディレクトリに移動済み。
確認コマンドは、pwd
必要であれば、学習用作業ディレクトリをカレントにすること.
Winの場合、ｂcc32がインストール済み。
学習用作業ディレクトリに移動済み。
確認コマンドは、dir
必要であれば、学習用作業ディレクトリをカレントにすること.

```cpp:Grid.cpp
#include <iostream>
#include <string>

//Drawing　Grid by for.

using namespace std;

int main(){
	for (int i=0; i<20; i++ ){
    	for ( int j=0; j<50; j++ ){
       		cout << "□";
    	}
    	cout << endl;
	}
}
```


![スクリーンショット 2014-12-09 0.20.14.png](https://qiita-image-store.s3.amazonaws.com/0/33317/37c8fbe2-eb89-2c8c-665f-a71ddc7a9168.png "スクリーンショット 2014-12-09 0.20.14.png")


COMPILE

```gcc:Linux
	g++ -o Grid Grid.cpp 
```

```gcc:Mac
	g++ -o Grid Grid.cpp 
```

```dos:Win
	bcc32 Grid.cpp
```
GAE/managedVMとDart

http://qiita.com/advent-calendar/2014/dart

Dartアドベントカレンダー ９日め。


社会のピエロ @mogettaです。
本日は最近β版が動き出したManagedVMをDartで動かしてみようと思います。
普段はフロントエンド業で、Unityとかしてる人間なので、穴がおおい記事とは思いますが、補足等いただけると幸いです。


# GAEってなに

これ読んどきましょ。
https://cloud.google.com/appengine/docs
サーバーサイドのインフラをGoogleさんがやってくれるので我々がコードに集中しましょ。

というのがまぁ趣旨です。逆にマイナスな点としては、GAE専用のコードになってしまいがち。というところ。

# ManagedVMってなに

いままでのGAEはPython,Java,PHP,Goなどの言語がサポートされていましたが、Docker等の技術の躍進により、それ以外の言語でもGAEのサポートを受けつつ開発が行えるようになりました。それがManagedVMです。

# インストール

基本はこちらに沿って行えば問題ないはず。OSなどの環境によって手順も違うのでここでは補足を中心に
https://www.dartlang.org/server/google-cloud-platform/app-engine/setup.html

以下インストール業が続きます。大まかな手順としては

* Dartのインストール
* boot2dockerのインストール
* イメージの取得 (docker pull google/docker-registry
* gcloudツールのインストール https://cloud.google.com/sdk/#Quick_Start
    * path設定で躓いたりしました。zshとか使ってる人は自動でお任せしているとPath通らない
    * google-cloud-sdk/path.zsh.inc　とかあるのでそちらを使う。
* プロジェクト作成 https://console.developers.google.com/project
    * クレジットカードが必要になります。課金アカウントを設定
    * 「課金と設定」から課金を有効にするボタンを押す。
    * プロジェクトの課金設定をONにします。

# Hello World

https://www.dartlang.org/server/google-cloud-platform/app-engine/run.html#deploying-to-app-engine
↑のURLにそって進めていきます。プロジェクトの用意面倒だな。と思ったら
https://github.com/dart-lang/appengine_samples
のHello Worldを取ってくるのがよいかと。

## プロジェクトの作成

普通のDartアプリケーションと違う点は
- app.yamlの作成
- dockerfileの作成

くらいかな。事前に

    pub get

もお忘れなく

## ローカルで試してみよう。

app.yamlのあるディレクトリで以下を実行しましょう localhostでサーバーが立ち上がります。

    gcloud preview app run app.yaml

## 公開してみよう。

app.yamlのあるディレクトリで以下を実行しましょう、設定が適切であればDeployが始まります。

    gcloud preview app deploy app.yaml

## 自分がつまづいたところ

- そもそもプロジェクトを作成してなかった。
    - プロジェクトを作成しましょう　->　https://console.developers.google.com/project
- 課金状態がOFFになっていた。↓こんなかんじのエラーがでる

     12:35 AM Host: appengine.google.com
     Error 400: --- begin server output ---
     Failed Project Preparation (app_id='s~dart-sandbox'). Billing not enabled.
     --- end server output ---

### 補足

忘れると地味に課金され続けて痛手になります。デプロイが終わって、いろいろ試せたら課金設定OFF

#Client-server

じゃあ、ファイルの転送とかルーティングもやってみようか。というのが以下のページ。こっから本格的なアプリ作成が可能になります。 
https://www.dartlang.org/server/google-cloud-platform/app-engine/client-server/

## 自分がつまづいたところ

- 自分のPCなどでプレビューを行う場合、pub serveで立ち上げたサーバーをそのままにする。
- その後、 gcloud preview を実行する。

これを勘違いしていたため、 gcloud preview　しても503が返り続ける。という現象に苦しみました。

# Dart-force

せっかくのDartなので、Server,Client共にDartにした上でWebsocketとか試したいなーという方。 
こちらのサンプルをどうぞ。Dart-forceさんがサンプルを用意してくれています。

https://github.com/ForceExamples/appengine-force-example

ローカルで試す場合はapp.yamlに

    env_variables:
        DART_PUB_SERVE:  'http://192.168.59.3:7777'

を追加するのを忘れずに。

明日は@laco0416さんの「Dartの最新情報を集める」です。
DigitalOceanにお名前.comで独自ドメイン設定


最近、話題に感じているDigitalOcean(でじたるおーしゃん)でサーバーを立てて見て独自ドメイン設定までしたのでまとめてみます。DigitalOceanというよりお名前.com側でハマってた時間が大半ですが笑

![](http://i.gyazo.com/525c57e648e5c978f33ba062afa73596.png)

##DigitalOceanって?

DigitalOceanはyutaponさんの[DigitalOceanことはじめ](http://yutapon.hatenablog.com/entry/2014/04/15/102832)の記事を見ると分かり易いです。(実は大学の先輩です。)

DigitalOceanは`1時間1円から使えるSSD VPS`です。
**360,000を超えるエンジニアが利用している**らしいです。
あのJohn Resig氏(jQuery作者)も使っているらしいですね。
![](http://i.gyazo.com/e536c216865fdba4bb653bbd46d3a7fb.png)


さくらVPSが有名ですが、触ってみた感覚で個人的な感想ですが、こちらの方が分かり易いUIでした。

## サーバーインスタンスを作成しておきます。
yutaponさんブログ参照です。 DigitalOceanではインスタンスをDropletsと呼ぶみたいです。

## DNS設定をします。(DigitalOcean側)

`Name`に自分が所持しているドメインを、`IP Address`に先程作ったサーバー(Droplets)のIPアドレスを入力します。
![](http://i.gyazo.com/8c7058e4212401e08a0238e29305eb05.png)

入力したら`create domain`を押して確定します。

![](http://i.gyazo.com/6c303e4d1299fc9cc398edbb823702e6.png)
登録が完了すると、
NSレコードに`ns1.digitalocean.com.``ns2.digitalocean.com.``ns3.digitalocean.com.`
と記載があると思います。これを後ほど使います。

## DNS設定 (お名前.com)
ドメインプロバイダーは色々とあると思いますが、今回はお名前.comを使っていたので紹介です。

基本的に先程のNSレコードの値をネームサーバーに設定してあげれば完了です。

https://www.onamae.com/domain/navi/ns_update/input?btn_id=navi_menu_domain_nsupdate_leftmenu_13

![](http://i.gyazo.com/fdc954042e38cf6a1d16613e3562cc45.png)


入力するのですが、 **DigitalOcean側で最後に.(ドット)が付いていますが、これは省略して書かないとエラーになります。**

* ダメな例
![](http://i.gyazo.com/c363c3054160eea6e5e5322cdd1ce465.png)

* 正しい例
![](http://i.gyazo.com/b1f18dbcf21799bb1c6603b7e93a7e1c.png)

あとは完了をおせばおk。

hoge.comにアクセスすると設定したサーバー(でwebサーバー起動していれば←雑)
でwebページなりが見れると思います。
【メモ】開発時に考慮すべき運用のこと

開発のことだけ考えてると、考慮し漏れるので備忘録。
何かあれば追記する予定。
疑問、質問、指摘あればコメントください。
答えられるかは分かりませんが、考えるキッカケになるので。

# ログを出す
基本ですね。

障害発生時はまずはログを確認します。

ログに情報が出ていないと障害調査が進みません。

ログに出す情報も重要です。

なんでもかんでも出せばいいものではありません。

ログでサーバーの容量圧迫してあぼーんは避けましょう。

Javaだとlog4jとかね。

***

# 障害発生時のリラン方法について考慮する
>リランとは
>http://e-words.jp/w/E383AAE383A9E383B3.html

例えばバッチ処理でcsvファイルをDBに登録する必要がある。

csvファイルを読み込んでDBに登録するだけなら非常に簡単。

でもその処理はいつも必ず成功するだろうか？

たとえば1,000レコードあって100レコード目のデータがおかしくて異常終了した場合どうする？

テーブルをトランケートして入れなおす？

もしも、そのテーブルには既に以前入れたデータが入っていて、そいつは消せないとしたら？

異常の原因調査して取り除いて、どこまで処理されたかを確認して・・・ってやればいい？
バタバタしている障害時にそんなことやってらんないのよ。

**いかにリランを簡単にするか。
これが結構重要。障害時にはスピードが命。
障害時に更にエラーを発生させうる手順は極力避けたいところ。**

[上記ページ](http://e-words.jp/w/E383AAE383A9E383B3.html)には
>すべてのデータを実行前の状態に戻し(ロールバック)てから再起動する方法と、障害で処理ができなかったデータのみを対象に途中から処理を再開する方法の二通りがある。

とある。その二通りについて以下に記載する。

## ロールバック
一つ目のロールバックは簡単。

csvファイルのデータをすべて読み込んで、最後にコミットするようにすればいい。

それが許されるなら、それができるならそれで問題ない。

でも、それが出来ない場合もある。

そういう場合はどうするか。
それが2つ目。

# ワークテーブル
そのような場合にはワークテーブル（TEMPテーブル）を用意する方法がある。

データをいきなり本テーブルに入れるのではなく、一旦ワークテーブルに入れるのである。

ワークテーブルはあくまでワークテーブルなので、処理前にはテーブルは綺麗さっぱりトランケートしている。（トランケートし放題！！！✿(ღ✪ｖ✪)｡ﾟ）

*手順*
1. csvファイルのデータをワークテーブルに入れて、ワークテーブルから本テーブルに入れる。
1. 本テーブルに入れることが出来たレコードの処理済みフラグをtrueにする。

こうすることで、レコードを二重にテーブルへ登録することを避けられ、単純リランが可能となる。
Emacsでもこふ語したいっ！

これは [こふ語 Advent Calendar 2014](http://www.adventar.org/calendars/392) 8日目 の記事ですっ

昨日は ぱんにゃあ(p°ω°)p : pan_nyaa さんによる [PSPで作曲できる「PSPRhythm」講座　～基本編](http://panya3runya9tolala.blog.fc2.com/blog-entry-39.html) でしたっ

今回はっこふ語をEmacsで手軽に書くためのｲﾝﾀﾌｪｰｽをご紹介いたしますっ

[けんこふさんの記事](http://blog.kenkov.jp/2014/12/01/kovlive.html)によって、ﾖｯｶﾕ環境でこふ語変換が出来る [kovlive](https://github.com/kenkov/kovlive) が発表されましたっこれを用いてEmacsにてっ指定ﾘｯｼﾞｮﾝの日本語をこふ語に変換するﾂｰﾙをつくりましたっ


- emacs-kovlive
   - https://github.com/kiwanami/emacs-kovlive

ちょっとやっつけ感がありますがっ使い方は以下のようですっ

まずっ必要なものは python3 ですっﾃﾞﾌｫﾕﾄでは `python3` というｺﾏﾝﾄﾞで実行できると仮定していますっ

次に[deferred.el](https://github.com/kiwanami/emacs-deferred)をｲﾝｽﾖｯﾙしますっmelpaﾊﾟｯｹｯｼﾞから入れてもいいですしっ手動でｲﾝﾖｯﾙしても構いませんよっ

そしてっｲﾝﾖｯﾙ用の適当なﾃﾞｨﾚｸﾖﾘで以下のようにおもむろにgit cloneしますっ

```
$ git clone https://github.com/kiwanami/emacs-kovlive.git emacs-kovlive
$ cd emacs-kovlive
$ git submodule init
$ git submodule update
```
(※2014/12/25 submoduleの取得を忘れていたので追加)

あとはっこのﾃﾞｨﾚｸﾖﾘを `load-path` に加えて `M-x load-library kovlive` してくださいっ

これで準備完了ですっ適当な日本語をﾘｯｼﾞｮﾝで囲ってっ `M-x kov:translate-region` してみましょうっ

動きませんかっ？動きますよねっ！

気に入ったらっ設定ﾌｧｲﾕで `require` したり `auto-load` するようにしておけばいいでしょうっ

以上ですっ！

それでは次は [@morinezumiiii](https://twitter.com/morinezumiiii) 様ですっ 
今日も一日ぞいっ♡
Ruboty | Extract gem Pattern を用いて Ruboty Plugin 内で利用する一塊の機能を持つロジックを外部 gem 化する #ruboty

# Ruboty | Extract gem Pattern を用いて Ruboty Plugin 内で利用する一塊の機能を持つロジックを外部 gem 化する
## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
Extract gem Pattern を用いて Ruboty Plugin 内で利用する一塊の機能を持つロジックを外部 gem 化します
## <i class="fa fa-question-circle" style="font-size:1em;"></i> Extract gem Pattern とは？
一塊の機能を持つプログラムを外部 gem 化するパターン。
**私が勝手に命名しました。**
すでにどこかで命名されているかもしれませんし、ただ単に単一機能を切り出して gem にするだけの話です。

Extract ○○ という命名は <i class="fa fa-external-link-square" style="font-size:1em;"></i> [リファクタリングカタログ](http://refactoring.com/catalog/) の

* Extract Class
* Extract Method

などに合わせた命名です。
## <i class="fa fa-exclamation-circle" style="font-size:1em;"></i> Ruboty Plugin 開発時の課題
* Ruboty の仕組みの中でテストをするので、内部に 一塊の機能を持つロジックを含む場合、
  本来のテスト対象の In - Out をテストするよりもコストが高くなる。

## <i class="fa fa-level-up" style="font-size:1em;"></i> Extract gem の効果

* 単一の機能に専念することでテスタビリティが上がる
* 他のプログラムからも利用可能になる

## <i class="fa fa-frown-o" style="font-size:1em;"></i> Extract gem 適用前の構成
![extract_gem_before.png](https://qiita-image-store.s3.amazonaws.com/0/43480/725feb2a-b2f3-a240-16db-770af0816aa6.png)

## <i class="fa fa-smile-o" style="font-size:1em;"></i> Extract gem 適用後の構成
![extract_gem_after.png](https://qiita-image-store.s3.amazonaws.com/0/43480/58fa398b-f181-6618-df25-96967effd6a0.png)

## 補足
* 外部 gem 化するほどでもない機能なら、 <i class="fa fa-external-link-square" style="font-size:1em;"></i> [Extract Class](http://refactoring.com/catalog/extractClass.html) で別ファイルにしてテスタビリティを上げるのもよい。
* Hubot も・・・

## <i class="fa fa-arrow-circle-right" style="font-size:1em;"></i> 参照
<i class="fa fa-external-link-square" style="font-size:1em;"></i> [Martin Fowler | Catalog of Refactorings](http://refactoring.com/catalog/)
キーに予約語があるときのNSPredicateの作り方

外部から取得したなどのデータのなかに
NSDictionary *dict = @{ @"no" : @(0) };
のようにNumberをnoと省略して登録されていたため、NSPredicateの作成が出来ないと言うことがあります。


上の場合、たとえば

``` objc:
NSArray *array = @[
    @{ @"no" : @(0) },
    @{ @"no" : @(9) },
    @{ @"no" : @(32) }
    ];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"no = %@", @(9)];

NSArray *filteredArray = [array filteredArrayUsingPredicate:predicate];
NSLog(@"%@", filteredArray);
```
としても、予想に反しfilteredArrayは空になります。
これは no が Boolean の NO として処理され、すべてのデータが偽となるからです。

処々の事情でキーnoの変更が出来ない場合、大変困ります。
しかし、NSPredicateの書式に含まれる %K を利用することでキーがnoのままでも正しいNSPredicateの作成が可能です。
%Kは「ここに入るものはkeyです」という書式です。

上の場合は、こうすれば作成可能です。

```objc
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K = %@", @"no", @(9)];
```

%Kを使用すれば ANDやORなどの予約語もキーとして使用可能です。
teeにご用心

# ストーリー

初めてAnsibleを触った半年前まで、私はchefばかりを使っていた。
そもそも当初Ansibleを使おうとしたのは別の人間が使っていたCapistranoの代わりに、chefのレシピを多ノードで同時に実行させるためである。
Capistranoにはあまり詳しくなかったため（なので実は私はほとんど使っていなかった）、使ってみたかったAnsibleに変えてしまえ、と考えたわけだ。

そんなわけで最初にAnsibleを使って行ったのはshellモジュールでchef-clientを実行してノードにchefのレシピを適用してまわることだった。
それまで私はchef-clientを実行する時にteeを使って標準出力とファイルとの両方に出力していた。
そのため私はそのまま考えなしにplaybookにこう書いたわけだ。

```
tasks:
- shell: "chef-client | tee /root/chef-client.log"
```

最初だということもあっていくらか試行錯誤はしたが、最終的にはエラーなく実行できるようになり、私はこれで構築できたと思っていた。

しかし1月ほど経った後、実は1箇所だけ想定通りに構築できていないことに気付くことになる。

# その原因

何が起こったのか。

パイプを使って`A | B`とした場合、終了ステータスはAのものではなくBのものが返ってくる。
teeが失敗することはまずないので、Bがteeの場合Ansibleはこのコマンドは上手く行っていると判断してしまう。
つまりchef-clientはエラー終了していたのに、まったくそれを掴むことはできていなかった、というわけだ。

そしてAnsibleがエラーを検知していなければ、ansible-playbook実行時の出力を見てもエラーが出ていたことがわかるようなものはないので気付きようもなかった。せっかくteeでファイルにログを出力していてもエラーがなければ見もしなかったのだ。

# 解決方法

そもそもAnsibleを使っている時にshellモジュールで実行されるコマンドの実行結果を標準（エラー）出力に出力する必要はあまりないだろうから、ファイルに出力したいならリダイレクトすれば良い。リダイレクトはパイプと違って終了ステータスに影響しない。
私が失敗したchef-clientの例なら、chef-clientには-Lというオプションでログをファイル出力できるので、当然そのようなオプションを使っても良い。

どうしてもteeを使って標準（エラー）出力にもファイルにも出力しないとならない場合（標準出力を拾って内容によって処理を変える必要があるなど）、registerとfailed_whenを使ってエラーの際は失敗させる方法が考えられる。
一例として、操作対象がbashなら以下のようなものでいける。

```
tasks:
- shell: "chef-client | tee /root/chef-client.log; echo $'\n'${PIPESTATUS[0]}"
  register: res
  failed_when: res.stdout_lines[-1] != '0'
```

bashなら、というのはパイプで連結した各コマンドの終了ステータスを保持してくれるPIPESTATUS変数がbashでしか使えないため。
`${PIPESTATUS[0]}`はzshだと`$pipestatus[1]`となるそうだ（未検証）。

もちろん、標準出力の中にエラーかどうか判別できる文字列があればそれをfailed_whenの中で拾ってやる、という方法でも良い（`failed_when: "'文字列' in res.stdout"`）。

別解として、bash 3.0以降やzsh 5.0以降ならpipefailオプションを使えば、パイプで繋がれたうちの1つでも終了ステータスに非0があれば最後の非0を終了ステータスにしてくれるので、もっと短い記述でエラーにすることができる。
bash 3.0はともかくzsh 5.0はかなり最近のバージョンであり、CentOSだと6の標準リポジトリにあるのはzsh 4.3.10。7で5.0.2。

```
tasks:
- shell: "set -o pipefail; chef-client | tee /root/chef-client.log"
```

pipefailオプションの効果はshellモジュール1回分で切れるので、後のshellモジュールで`set +o pipefail`で元に戻すとかはしなくて良い。

# まとめ

ま、shellモジュールでパイプを使う場合は注意する、と10回唱えてからshellモジュールを使え、ってことだ。
KDG体験学習用cpp その1


KDG体験学習用cpp
12.08.2014 T.Nonaka Written.

***
質問があればお受けいたします。多分ないと思います。（笑）
九州、博多の専門学校の体験学習用のノートです。
ggggnonaka@gmail.com
***
前提　Mac、Linuxの場合、gccがインストール済み。
		学習用作業ディレクトリに移動済み。
		確認コマンドは、pwd
		必要であれば、学習用作業ディレクトリをカレントにすること.
     Winの場合、ｂcc32がインストール済み。
		学習用作業ディレクトリに移動済み。
		確認コマンドは、dir
		必要であれば、学習用作業ディレクトリをカレントにすること.

```cpp:Hello.cpp
#include <iostream>
using namespace std;

int main() {
    cout << "Hello World !" << endl;
    return 0;
}
```

compile

	Mac or Linux
	Type follow command from terminal.

	```
	g++ -o Hello Hello.cpp 
	```

	If you look at any errors? You must install gcc.
	Type follow command from terminal.

	```
	g++ -v
	or
	which g++ 
	``` 

	Win
	Type follow command from cmd.

	```
	bcc32 Hello.cpp 
	```
	If you look at any errors? You must install gcc.
	Type follow command from cmd.

	```
	bcc32 
	```

Run
	
	Mac or Linux
	Type follow command from terminal.
	```
	./Hello 
	```	
	Win
	Type follow command from cmd.
	```
	Hello
	```
マクロを使って便利にOpenCL

OpenCLのソースコードってどう扱えばいいのかわからん！
っていうのはわりと使い始めた頃から感じていました。
ホスト側のコードの中にソースを埋め込むのもいいけど修正しにくそうだし可読性とかよろしくないし、じゃあ別ファイルに分けたとして実行時にそのファイルないと動かないしとか。
そんなことを考えていて、みんなどうしてるんだろうといろいろ探しまわった結果見つけたのがこれです。

#マクロを使えばいいんだ！
偉そうに便利って書いてますが、この方法はプリプロセッサを使える言語に限られてくると思います。
そもそも私自身がC++からでしか使ってないので他の言語からのことが頭からサッパリ抜けてました。
というかC、C++以外で使えないような気しかしませんが、ご了承下さい。

さてその方法ですが、とても単純で__VA_ARGS__というものを使います。
ご存知の通り__VA_ARGS__は可変個引数マクロというもので、これを活用することによってコンパイル時に別ファイルにあるソースコードを実行ファイルに埋め込むことができます。
用法はこちら。

```cpp:
#define OCLSTRINGIFY(...) #__VA_ARGS__
```

まずさきほど説明した__VA_ARGS__を使い__OCLSTRINGIFY__を定義します。
もちろん名前はなんでもいいです。
そして__OCLSTRINGIFY__でOpenCLのコードを囲みます。
ちなみに中身は適当です。

```cpp:test_device.cl
OCLSTRINGIFY(

__kernel void test( __global int* dst, __global const int* src )
{
    dst[get_global_id(0)] = src[get_global_id(0)];

 return;
}

);
```

そしてホスト側のコードから#includeで先ほど__OCLSTRINGIFY__で囲んだソースコードのファイルパスを指定します。
ここでは同じディレクトリ内にあるということにし、下記のようにします。

```cpp:test_host.cpp
char src[] = 
#include "test_device.cl"
```

こうすることによって実行時にソースコードが埋め込まれることになります。
あとは煮るなり焼くなり好きなようにclCreateProgramWithSourceでプログラムオブジェクトを作りましょう。

#おわり
こういう使い方はわりと一般的なものかもしれませんが、私みたいな哀れな子羊が存在する可能性があるかもしれないので書きました。
正直こんだけでいいのかと自問自答してますが、他に書くものがないので仕方ないね。
ちなみにオープンソースの物理演算エンジンであるBulletでもこういう使い方してるみたいです。
ともかく些細なことでもいいので便利にOpenCLが使えるようになって、豊かな並列コンピューティングな人生を歩みましょう。

次の担当は@telmin_orcaさんです！
Pepperハッカソンのススメ

<h1>はじめに</h1>
Pepperに興味がある、もしくは触ったことがある方の中には、
**Pepperの”ハッカソン”に関心はあるけれど、どのようなものかわからない！**
という方も多いのではないでしょうか？

この記事では、**Pepperハッカソン** とはどんなものなのか、定期開催されている「公式ハッカソン（※）」を例に紹介します。
**プログラミングやハッカソンに馴染みのない方向けの内容**です。

※公式ハッカソン ： アルデバラン・アトリエ秋葉原 with SoftBank が主催・会場となっている、公式のイベント。
有志や他の企業によるPepperハッカソンについては、私の参加経験が乏しいので、ここでは触れません。

<h1>そもそも、ハッカソンとは？</h1>
**半日～数日間、会場に集まった人たちでチームを組み、プログラミングによる制作をしよう！**というイベントです。
詳しい説明は[Wikipedia](http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%83%E3%82%AB%E3%82%BD%E3%83%B3)に譲りましょう。
「ゲッ、難しそう！」と思った方も大丈夫。次項ではPepperハッカソンの特徴をご紹介します。

<h1>Pepperハッカソンの特徴</h1>
<h3>プログラミング未経験者も多い！</h3>
「ハッカソン」という言葉に敬遠してしまうあなた。こんなふうに思っていませんか？

**自分はプログラミング未経験だし、ついていけるか心配…
エンジニアの人が集まる場でしょ？**

大丈夫！
Pepperはエンジニア以外の参加者も多いです。
開発環境が積み木を組み合わせる感覚なので、難しい”言語”を覚える必要はありません。
年齢層も幅広く、下は**小学生から**上は定年退職されている**ご年配の方まで**、ごちゃまぜになって作業しています。
**私自身もプログラミング初心者の文系学生**ですが、過去3回抵抗なく、作品を仕上げることが出来ました。

<h3>半日かけてガッツリPepperを試せる！</h3>
Pepperの”アトリエ”では、Pepperの開発を学ぶワークショップや、「タッチ＆トライ」を行っていますが、
1回あたり1時間半程度なので、不完全燃焼で終わってしまうこともしばしば。

しかし、Pepper公式ハッカソンは**5時間**ほどかけてPepperを使った作品を仕上げるため、
かなり満足度の高いイベントになっていると感じます。
**月一回、休日開催**なので、お仕事をされている方でも参加できますよ！

<h3>一人では作れないものでも、チームで完成させられる！</h3>
ハッカソンでの作品制作は、基本的にチームごとに行われます。
”Pepperを子育てに使いたい” ”Pepperを職場で役立てたい” ”Pepperとゲームをしたい” など…
やりたいことに沿ってチームを編成します。

作業の進め方は様々ですが、メンバーの得意分野によって分業したり、さらに小さなチームを作ることが多いです。
こうすることで、**一人ではなかなか完成させられなかった作品も、形にすることができます。**
終了間際の作業の追い込みには苦労しますが、とても大きな達成感をチーム全体で味わえますよ！

<h1>ハッカソンをより楽しむために！</h1>
Pepperハッカソンの参加前に**準備しておくといいこと・注意点**をまとめました。

<h3>申し込みを忘れずに！</h3>
Pepperハッカソンのイベント申し込みは、以下の**Doorkeeper**で行います。
月イチ開催のハッカソンは人気なので、定期的にチェックすることをおすすめします！
ワークショップやタッチ＆トライの申し込みもここから。
http://pepper.doorkeeper.jp/

<h3>ワークショップで一度Pepperに触れておこう！</h3>
お手軽開発がウリのPepperですが、一度**ワークショップ**に参加して、入門編を済ませておくと吉。
Pepperでどんなことができるのかを知ると、アイデアも思いつきやすくなりますし、
開発で使う画面に触れておけば、ハッカソンでも抵抗なく動かすことができます！
申込方法については先述のリンクからどうぞ。

<h3>やりたいこと、作りたいものを考えておこう！</h3>
ハッカソンで半日かけてどんなものを作りたいか、**ぼんやりでいいのでイメージしておくといいです。**
自己紹介やチーム選びに困りませんし、納得の行く作品制作につながります。

<h3>自分のノートPCがあれば持って行こう！</h3>
ノートPCがあればぜひ持っていくのが吉です。**慣れた環境で作業するために大切です！**
もちろん、会場でも貸し出してもらえますが、台数限定かつMacBookなので、
特にWindows派の方で、ノートPCを持っているようなら、必ず持って出かけましょう！

<h1>おわりに</h1>
念のため断っておきますが、**ステマではありません**（笑）
Pepper愛が強いがゆえに、書き殴ってしまいましたが、いかがだったでしょうか？

この記事を読んで、**Pepperハッカソンなら行けるかも！**と思っていただけたら幸いです。
エンジニアの方はもちろんですが、他にもいろんな参加者がいることで、Pepperの開発は間違いなく面白くなります。
Pepperに興味があるあなた、臆さずにぜひ参加してみてください！

それでは、Pepperハッカソンでお会いしましょう！
baserJSでスクロール位置の移動をアニメーションさせる


コーポレートサイトにちょうどいいJavaScriptライブラリ **baserJS** の解説記事です。

Webサイトと詳しいAPIリファレンスはこちら [baserJS Webサイト](http://baserproject.github.io/baserjs/)

## 基本

### HTML

aタグのhrefの中の文字列をセレクタとして、その場所に徐々にスクロールするようになります。

```html
<a href="#target1">target1</a>
<a href="#target2">target2</a>
<a href="#target3">target3</a>

. . .

<div id="target1">...</div>

. . .

<div id="target2">...</div>

. . .

<div id="target3">...</div>
```

### JavaScript

```js
$('a, area').bcScrollTo();
```

href属性をもつことのできる要素に限るので、aタグか、もしくはイメージマップのarea要素が対象になります。

## 任意のセレクターでJS側から呼び出す

```js
$.bcScrollTo('selector');
```
静的メソッドを使って、プログラム側から制御することもできます。

### 数値で指定

```js
$.bcScrollTo(1200);
```
任意のスクロール位置を数値で指定することもできます。


## オプション

```js
$('a').bcScrollTo({
    offset: 60
});
```

`offset`オプションに数値を指定すれば、目的のスクロール位置をずらすことができます。

固定ヘッダのUIがあるページなどで有効です。
Ansible を使って AWS 環境をセットアップする


## 環境

Amazon Linux

## Ansible 実行環境の準備

### Vagrant で CentOS 6.5 環境を構築

```
  config.vm.box = "chef/centos-6.5"
```

を指定した Vagrantfile を用意して `vagrant up` を実行する。Vagrant の内容は割愛。

### EPEL を有効にする

```
$ sudo rpm -ivh http://ftp.jaist.ac.jp/pub/Linux/Fedora/epel/6/i386/epel-release-6-8.noarch.rpm
```

### Ansible をインストール

```
$ sudo yum install ansible -y
```

### EC2 インスタンスと疎通確認

```
$ ansible -i <hosts ファイルのパス> --private-key=<秘密鍵のパス> -u ec2-user -m ping <EC2インスタンスのIP>

<EC2インスタンスのIP> | success >> {
    "changed": false,
    "ping": "pong"
}
```

-i オプションで指定する hosts ファイルには、ansible を実行する対象のホスト名またはIPを指定する。
デフォルトは `/etc/ansible/hosts` なので、こちらにホスト名を追記している場合はこのオプションは不要となる。

## MySQL をインストールする

### playbook を作成する

MySQL をインストールし、初期DB・ユーザーを登録する playbook を作成してみた。
`MySQL-python` は mysql_db, mysql_user といったモジュールを利用するために必要だった。
各項目の詳細は参考サイトを参照すべし。

```
- hosts: <EC2インスタンスのIP>
  remote_user: ec2-user
  sudo: yes
  gather_facts: no
  vars:
    db:
      - name: <DB名>
        user: <DBユーザー>
        pass: <DBユーザーパスワード>
  tasks:
    - name: install mysql 
      yum: name={{ item }} state=latest
      with_items:
        - mysql
        - mysql-devel
        - mysql-server
        - MySQL-python

    - name: run mysqld
      service: name=mysqld state=running enabled=yes

    - name: create database
      mysql_db: db={{ item.name }} state=present encoding=utf8
      with_items: db

    - name: create database user
      mysql_user: name={{ item.user }} password="{{ item.pass }}" priv={{ item.name }}.*:ALL state=present
      with_items: db
```

### playbook を実行する

```
$ ansible-playbook --private-key=<秘密鍵のパス> ./playbook-mysql.yml
```


## 参考サイト

- Ansible:  http://docs.ansible.com/
- Ansible 入門:  http://qiita.com/ArimaRyunosuke/items/1f9d840311584d8160bc
- Ansible Tutorial: http://yteraoka.github.io/ansible-tutorial/
PHPの拡張モジュール

PHPには拡張モジュールというものがあります。モジュールとは機能単位のことで、エクステンションといえばわかりやすいです。

エクステンションの配布先としてはPECL（ピックル）などが有名。

php.iniでPHPの起動時にその拡張機能を読み込むことができ、また、スクリプトの中でdl()関数を用いることによって動的に読み込むことができる。

```linux
php -m
```

コマンドで現在導入している拡張モジュールの一覧がみれる。


参考
*拡張モジュール PHPエクステンション：http://www.weblio.jp/content/%E6%8B%A1%E5%BC%B5%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB
Watson Analyticsを使ってみる

ベータ版が公開されたようなので、軽く使ってみる。

# IBMアカウント作成

https://watson.analytics.ibmcloud.com/
にアクセスしてIBM IDを作成します。

![A.jpg](https://qiita-image-store.s3.amazonaws.com/0/39243/bd1f0175-a072-231d-d3cf-5059076d637c.jpeg)

# Watson Analytics

http://www.ibm.com/analytics/watson-analytics/

上記で作成したIBM ID（メールアドレス）を入力するとIBMから

メールが届きます。

「Watson Analytics Beta - Confirmation of your trial」

# ログイン
![B.jpg](https://qiita-image-store.s3.amazonaws.com/0/39243/a053e49f-0a03-f236-2ed0-ed409b7cdc49.jpeg)

# とりあえず日本語に切り替える
![C.jpg](https://qiita-image-store.s3.amazonaws.com/0/39243/945ffeec-f261-8b31-c9a1-63d475131532.jpeg)

![D.jpg](https://qiita-image-store.s3.amazonaws.com/0/39243/7d3bec92-e1b2-ab3e-95e9-24509b695b12.jpeg)

LanguageをJapaneseに切り替えましょう。

# データ投入
http://www.ibm.com/analytics/watson-analytics/
から右上ログインリンクでログインすると
以下のような画面が現れます。
![E.jpg](https://qiita-image-store.s3.amazonaws.com/0/39243/ed4a82a7-b16c-9c43-a0bb-b393bbae3ece.jpeg)

そこですかさず、「目標をセンターに入れてスイッチ…」

![F.jpg](https://qiita-image-store.s3.amazonaws.com/0/39243/81ebc311-5dd8-a8f7-1055-cf26ebeadfff.jpeg)

Drop your file・・・をクリックしてデータをアップロードしましょう

データはなにがいいか・・・

おっ！この間作ったデータあるやん！

http://qiita.com/FScoward/items/326479ba990c7c6d805e

こいつ突っ込んじゃえ！

![G.jpg](https://qiita-image-store.s3.amazonaws.com/0/39243/2b966d07-eadf-ca28-1931-f04a1beb9c98.jpeg)

100%を超えただとｯ？！

![H.jpg](https://qiita-image-store.s3.amazonaws.com/0/39243/669fe06b-3083-bfca-8466-5d70f0369b7b.jpeg)

データが悪いようです、文字化けってるし。残念。

しょうがないので

http://www.data.go.jp/data/dataset/env_20140904_0079/resource/a203d5f3-d1f9-436a-a61d-be9f231398f1

のデータをお借りします。

![G.jpg](https://qiita-image-store.s3.amazonaws.com/0/39243/2b966d07-eadf-ca28-1931-f04a1beb9c98.jpeg)

なんか出来た。

![I.jpg](https://qiita-image-store.s3.amazonaws.com/0/39243/495c17bd-ea1f-e3b4-462d-23794cdd7621.jpeg)

# データを見る

![J.jpg](https://qiita-image-store.s3.amazonaws.com/0/39243/fe2866e6-2c46-9ccf-ae25-2de9d2181204.jpeg)

左のExplorationをクリック

![K.jpg](https://qiita-image-store.s3.amazonaws.com/0/39243/819c0dda-e8be-7794-8179-6a224142229f.jpeg)

やべぇ・・・

文字化けってる

とりあえず左のやつクリック

# なんか出た

![L.jpg](https://qiita-image-store.s3.amazonaws.com/0/39243/2cb4e5a8-42f0-7a65-7f4b-c89b3d4e5886.jpeg)

けど文字化けってるので、よく分からん

# 今回はここまで

とりあえずは動かせたので、なんか出来るといいなぁ～
Javaのクラスを継承してScalaでサブクラスを定義する

# Scalaの継承
本題に行く前にScalaの継承のおさらい。

```scala
class Shain(val name: String)

class SeiShain(n: String, val baseSalary: Int) extends Shain(n)

val s1 = new Seishain("taro", 200000)
s1.name  // taro
s1.baseSalary  // 200000
```

# Javaクラスの継承
まずは親クラスShain.javaを定義。

```java:Shain.java
public class Shain {
  private String name;

  public Shain(String name) {
    this.name = name;
  }

  public String getName() {
    return this.name;
  }
}
```

次に継承したSeiShain.scalaを定義してみる。
おぉ、親クラスJavaだけどScalaの時同様にフツーに定義出来た。

```scala:SeiShain.scala
class SeiShain(n: String, val baseSalary: Int) extends Shain(n)
```

使ってみる。特に問題なし。
あまりにもフツーだった。

```scala
val s1 = new Seishain("taro", 200000)
s1.getName()  // taro
s1.baseSalary  // 200000
```

# objectもJavaクラスを継承してみる
こちらも期待通りの定義方法で特に問題なし。

```scala:GodShain.scala
object GodShain extends Shain("kami")
```
baserJSでGoogleMapsを埋め込む


コーポレートサイトにちょうどいいJavaScriptライブラリ **baserJS** の解説記事です。

Webサイトと詳しいAPIリファレンスはこちら [baserJS Webサイト](http://baserproject.github.io/baserjs/)

## GoogleMaps API必須

```html
<script src="//maps.google.com/maps/api/js?sensor=false"></script>
```

## 基本

### HTML

```html
<div class="map" data-lat="33.606785" data-lng="130.418314"></div>
```

<iframe height='257' scrolling='no' src='//codepen.io/YusukeHirao/embed/EjoYPw/?height=257&theme-id=9760&default-tab=result' frameborder='no' allowtransparency='true' allowfullscreen='true' style='width: 100%;'>See the Pen <a href='http://codepen.io/YusukeHirao/pen/EjoYPw/'>bcRadio v0.6.0-RC</a> by Yusuke Hirao (<a href='http://codepen.io/YusukeHirao'>@YusukeHirao</a>) on <a href='http://codepen.io'>CodePen</a>.
</iframe>

### JavaScript

```js
$('.maps').bcMaps();
```

### CSS

```css
.maps { width: 400px; height: 300px; }
```

高さと幅はCSSなどで設定しておく必要があります。

## 応用

```html
<div class="map" data-address="住所 or キーワード"></div>
```

**注意**: キーワード（検索）で住所を特定できるケースがありますが、GoogleMapsのGeocoder APIを利用するため、Googleの仕様変更などによって予告なくキーワードや住所が使用できなくなる可能性があります。なるべくキーワードは使わないようにしてください。


## 各種オプション

```js
$('.maps').bcMaps({
    zoom: 17
});
```

オプションを渡してマップをカスタマイズできます。

プロパティ名|型・クラス|説明
---|---|---
zoom|`number`|ズーム率
mapTypeControlOptions|`google.maps.MapTypeControlOptions`|マップのコントロールオプション
scrollwheel|`boolean`|スクロールホイールが有効かどうか
center|`google.maps.LatLng`|地図の中央の座標
styles|`google.maps.MapTypeStyle[]`|地図のスタイル

Goole Mapsの型については[APIリファレンス](https://developers.google.com/maps/documentation/javascript/3.exp/reference?hl=ja)を参照して下さい。
PHPコードのレビュー結果を共有してみる

[PHP Advent Calendar 2014](http://qiita.com/advent-calendar/2014/php) の9日目として書いています。

昨日は [PHP CS Fixerで快適PHPライフ](http://fivestar.hatenablog.com/entry/2014/12/08/033345) で、コーディング規約に沿うよう修正してくれるツールのお話でしたね。

今日は、最近、PHP初心者が書いたソースコードをレビューする機会があったのですが、その結果をいくつか共有してみようと思います。


# 1. `range()` (連続した配列作成)

```php:修正前
$expected = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23];
```

```php:修正後
$expected = range(0, 23);
```

こちらのほうが可読性が高く、意図も伝わりやすく、ミスも起こりづらいです。

参考: [PHPマニュアル range](http://php.net/manual/ja/function.range.php)



# 2. `$array[] = "aa"` (要素を末尾に追加)

```php:修正前
array_push($array, "aa");
```

```php:修正後
$array[] = "aa";
```

要素１つを追加するだけなら、こっちのほうが早いし、可読性も高いです。

参考: [PHPマニュアル array_push](http://php.net/manual/ja/function.array-push.php)


# 3. BOM 撤去は `fgetcsv()` 前で

```php:修正前
$labels = fgetcsv($fh, 0, ",");
$this->__stripUtf8Bom($labels[0]); //UTF-8 の BOM を撤去する
```

`fgetcsv` の結果でBOMチェックしてますが、BOMはこのようには判定すべきではありません。

これだと、ラベルの最初の列が `"label 1"` のように `"` で囲まれていた場合、
`$labels[0]` には `[BOM]"label 1"` のように `"` が解釈されていない値が入ってしまって、意図通りには動きません。

`fgetcsv` は通常、文字コードレイヤーの問題は解決済みのファイルを処理することが前提になっているからです（つまり `fgetcsv` 後に文字コードに関する情報を扱うのは正しくないです）。

```php:修正後
//一旦開いてBOM撤去
$contents = file_get_contents($path);
if ($this->__stripUtf8Bom($contents)) { //UTF-8 の BOM を撤去したらtrueを返す
    fclose($fh);
    $path2 = tmpfile();
    file_put_contents($path2, $contents);
    $fh = fopen($path2);
}
$labels = fgetcsv($fh, 0, ",");
```

`file_get_contents` を使っているのでファイルサイズが大きくなる可能性がある場合は、この例の通りにはできませんので気をつけてください。


# 4. テストの後始末は必ず `tearDown()` で

```php:修正前
public function testファイルを作成してテストするメソッド() {
    $path = "/tmp/hoge_test.dat";
    $fh = fopen($path);
    $result = $this->Hoge->hogehoge($fh);
    $this->assertTrue($result);
    fclose($fh);
    unlink($path); //テストで作成したファイルを消す
}
```

これだと、 `$this->Hoge->hogehoge($fh)` が例外を起こした場合や `$this->assertTrue($result)` でエラーとなった場合には `fclose($fh)` や `unlink($path)` が走りません。

```php:修正後
public function tearDown() {
    if (!empty($this->fh)) {
        fclose($this->fh);
        $this->fh = null;
    }
    if (!empty($this->path)) {
        unlink($this->path);
        $this->path = null;
    }
}

public function testファイルを作成してテストするメソッド() {
    $this->path = "/tmp/hoge_test.dat";
    $this->fh = fopen($this->path);
    $result = $this->Hoge->hogehoge($this->fh);
    $this->assertTrue($result);
}
```

こうすることで、エラーが発生しても、確実に後始末をすることができます。


# 5. PHPDoc のコメントには型宣言を

```php:修正前
/**
 * ○○を返す
 * @param $aa       aaを渡す
 * @return エラーメッセージ or string で○○
 */
```

PHPStorm で開発していると、PHPDoc にかかれた型で、静的な文法チェックやメソッドの補完が可能なのですが、`@return` の後の最初に登場した単語を型と見なしてしまうので、使用するときに警告が出てうるさいのです。

```php:修正後
/**
 * ○○を返す
 * @param string $aa  aaを渡す
 * @return array|string エラーメッセージ or string で○○
 */
```

特にライブラリなどを作成する場合には型宣言が欲しいです。


今日は、この辺で。

明日は、「AspectMockについて」ですね！
テスト大好きなので Mock と聞くと、ワクワクが止まりません。
Google Apps Toolboxについて

[Google Apps Toolbox](https://toolbox.googleapps.com/apps/main/)という便利ツールについてまとめてみます。
以下のツールがセットになっています。

* Browserinfo
ブラウザベースのデバッグツール。クライアント側の様々な情報を表示してくれます。IPアドレスとか、UAとか。

* Check MX
ドメイン名を入力するとMXレコード関連の設定をチェックしてくれるツール。SPF、MX、DKIM、DMARC、NSなどなどメール関連を中心に様々なDNSの設定をチェックして判定してくれます。

* Dig
いわゆるdigコマンドの機能をブラウザ上から実行できるツール。普通にコマンドラインからdig叩けば済む話ですが、ブラウザさえ使えればどんな環境からでも利用できるのが便利。

* HAR Analyzer
キャプチャ済みのHTTPアーカイブの分析ツール。あまり使う機会がないので放置。

* Log Analyzer
Google Apps系の様々なSync系ツールのログやChrome OSのログを解析するツール。これもあまり使う機会がないので放置。

* Messageheader
メールヘッダの解析＆可視化ツール。Receivedヘッダからメールがリレーされたルートをわかりやすく表示してくれる。
その他重要なヘッダについても見やすく表示してくれる。

* その他ツール
  * Encode / Decode  
Base64エンコード（デコード）、URLエンコード（デコード）、MD5ハッシュなどよく使われるエンコード系ツール。  

などなど。
こんな説明読むより使ってみる方が早い。
fluentd WindowsブランチをRuby 2.1上で動かす

## 0. 前書き
ついにWindowsにもRuby(Installer)の 2.1 がやってまいりました！（ちょっと前ですけどね）
ということで**fluentd Windows版もRuby 2.1で動かします！**

といってもやることは基本こちらの投稿と変わりませんが、2点異なる点があります。

[Windowsでfluentdを動かす](http://qiita.com/okahashi117/items/0203badd77c9df564166)

変更点のみ記述します。


## 1. Ruby 2.1のインストール
[Windowsでfluentdを動かす](http://qiita.com/okahashi117/items/0203badd77c9df564166) の「1. Windows用Rubyの導入」ではRubyの2.1系を選びましょう。
![ruby21.jpg](https://qiita-image-store.s3.amazonaws.com/0/31816/fcff5b1c-59ad-aa8c-1b42-3c5df6bd0d14.jpeg)

> 2015/01/13 追記
> kiyotoさんよりOpenSSL POODLE関連によりgemコマンドが使えないという点についてコメント頂きました。ありがとうございます。以下引用します。
>
>>こちらですが、OpenSSL POODLE事件により、現在だとRubyInstallerで同梱されているgemコマンド (v2.2.2)が使えなくなっております。解決策としては、gemコマンドをv2.2.3に上げる必要がありますが、gemがrubygemsと通信できなくなっているため、gem update --systemが使えません。
> 具体的には、ビルドされたgemコマンドインストールスクリプトを使うことになります。詳細はこちら＞
> https://gist.github.com/luislavena/f064211759ee0f806c88

## 2. fluentd gemパッケージ
[Windowsでfluentdを動かす](http://qiita.com/okahashi117/items/0203badd77c9df564166) の「1. Windows用Rubyの導入」の「4. ダウンロードファイルに含まれているgemパッケージを使ってインストール」では pkg\fluentd-0.10.46.gem をインストールしていますが、現時点（2014/12/08）のpkgフォルダには fluentd-0.10.46.win141021001.gem というパッケージが含まれています。こちらをインストールします。

```
gem install fluentd-0.10.46.win141021001.gem
```

やや変則的なパッケージング/バージョニングですが、事情もあるようです。まぁ大目にみましょう。

## 3. その他
Windows上のRuby 2.1 ではコマンドプロンプトに対するシグナルの出方？が今までと違うみたいです。上記のfluentd Windows版ではその辺りの対応とバグ修正がおこなわれています。
以前のパッケージを利用するとfluentdの終了時に終了できず、CPUの使用率が異常にあがる状況が発生します。

また、その他Windows操作に関わるライブラリが自前ではなくdjberg96さんのものに、ごそっと入れ替わっており、コードの可読性とエラーのハンドリングの妥当性が向上しています。気になる人は注意しましょう。

> 2015/03/16 追記
> @nidcodeさんより頂きました。ありがとうございます。
> 上記手順でfluentdの導入自体は完了しますが、実行時にmsgpackのLoadErrorがおきることがあります。この場合以下の手順で回避可能です。

>>gem uninstall msgpack
>>gem install msgpack --platform=ruby

>本件、msgpackの中の人@nahiさんより以下のコメントをもらっていますので、参考にしてください。
>https://github.com/msgpack/msgpack-ruby/issues/38

おわり。
ListView は Graphical Layout で作ったまま使ってはいけない 

ためになる記事をみつけたのでメモメモ。

「ListView は Graphical Layout で作ったまま使ってはいけない」らしい。
layout_width と layout_height が両方共 fill_parent じゃないと、
無駄な処理が発生するとのこと。
ListView の height が以下のように wrap_content になっていました。

>main.xml
><?xml version="1.0" encoding="utf-8"?>
><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
>    android:layout_width="fill_parent"
>    android:layout_height="fill_parent"
>    android:orientation="vertical" >
>
>    <ListView
>        android:id="@+id/listView"
>        android:layout_width="fill_parent"
>        android:layout_height="wrap_content">
>    </ListView>
>
></LinearLayout>

wrap_content だと、一度描画してみないと ListView 全体のサイズがわからない。
よって、全部（仮想的に）描画してサイズを測り、画面をはみ出ることを確認した後、
もう一度描画する必要がある。

とのこと。
まあ・・・いろいろあるねぇ。