OmniAICreator/Qiita-1.07M huggingface dataset:
こういうダイエットアプリがほしい

# こういうダイエットアプリがほしい
誰かiPhoneアプリにして
##動機
今までのカロリー管理系ダイエットアプリ
一日の上限カロリーと食べたものの合計カロリーの差を表示
⇒夜食の誘惑
今何を食べて良いのかわからない

##解決策
一日の可能な取得カロリーを秒単位に分割、積み上げていく
今食べられる＝使用可能な取得カロリー
次に食べたいものまでどれだけ我慢すればいいかも時間表示

````c++
# include <Siv3D.hpp>

int foodToTime(String food);
String nameEatableFood(double kcal);
String nameNextFood(double kcal);

String food_name[] = { L"松屋のプレミアム牛めし", L"マクドナルドのハンバーガー", L"マクドナルドのチキンクリスプ", L"水", L"日高屋の中華そば", L"クラッシュタイプの蒟蒻畑ライト ぶどう味" };
double food_kcal[] = { 962.0, 275.0, 366.0, -0.01, 669.0, 39.0};
int kakin = 0;
double allowed_kcal = 0.1;
double kcal_per_sec = 0.0307;



void Main()
{
	const Font font(14);

	while (System::Update())
	{
		String food_name = nameEatableFood(allowed_kcal);
		kcal_per_sec = 0.0307 + 0.1*kakin*kakin;
		allowed_kcal += kcal_per_sec/60;
		font(L"今なら", food_name, L"が食べられます。").draw(0, 0);
		food_name = nameNextFood(allowed_kcal);
		int next_time = foodToTime(food_name);
		font(food_name, L"\nが食べられるのは", next_time, L"秒後です。").draw(0, 100);
		font(DecimalPlace(3), allowed_kcal , L"kcal").draw(80,200);
		Circle(400, 300, 40).draw(Palette::Orange);

		if (((Mouse::Pos().x - 400)^2 + (Mouse::Pos().y - 300)^2) < 100 && Input::MouseL.clicked){
			kakin++;
		}
		font(kakin, L"課金").drawCenter({ 400, 280 });
		font(kcal_per_sec, L"kcal/sec").drawCenter({ 400, 320 });

	}
}

int foodToTime(String food){
	for (int i = 0; i < sizeof(food_name) / sizeof(food_name[0]); i++){
		if (food_name[i] == food){
			return (food_kcal[i] - allowed_kcal) / kcal_per_sec;
		}
	}
	return 0;
}

String nameEatableFood(double kcal){

	double return_kcal = -1.0;
	String return_name;
	for (int i = 0; i < sizeof(food_name) / sizeof(food_name[0]); i++){
		if (food_kcal[i]>return_kcal && food_kcal[i] < kcal){
			return_kcal = food_kcal[i];
			return_name = food_name[i];
		}
	}
	return return_name;
}

String nameNextFood(double kcal){

	double return_kcal = 99999;
	String return_name;
	for (int i = 0; i < sizeof(food_name) / sizeof(food_name[0]); i++){
		if (food_kcal[i]<return_kcal && food_kcal[i] > kcal){
			return_kcal = food_kcal[i];
			return_name = food_name[i];
		}
	}
	return return_name;
}

````
WSHでスクリプトファイル自身が存在するフォルダパスを取得する

すぐ忘れてしまうのでメモ

```vbnet
'vbsの場合
dim fso
set fso = createObject("Scripting.FileSystemObject")
msgbox fso.getParentFolderName(WScript.ScriptFullName)
```

```js
//JScriptの場合
var fso = new ActiveXObject("Scripting.FileSystemObject")
WScript.Echo(fso.getParentFolderName(WScript.ScriptFullName))
```
Goでsliceに要素追加, slice同士の結合


スライスは`[]<型>`で定義する. 要素の追加は`append`

````go
var tasks []string
append(tasks, "todo1")
````

スライス同士の結合(concat)もappendだが, 第二引数に`...`を付けるのが妙な感じ.

````go
var tasks_without_due []string
append(tasks, tasks_without_due...)
````
Sidekiqメモ

Sidekiq
=======

インストール
----------

```rb:Gemfile
# Sidekiq
gem 'sidekiq'
gem 'sidetiq'
gem 'sinatra', require: false
gem 'slim'
```

```shell-session
bundle install --path vendor/bundle
```

設定
----

```rb:config/initializers/sidekiq.rb
require "sidekiq/web"
require "sidetiq/web"

REDIS_URL = { url: 'redis://localhost:6379/1' }

Sidekiq.configure_server do |config|
  config.redis = REDIS_URL
end

Sidekiq.configure_client do |config|
  config.redis = REDIS_URL
end

Sidekiq::Web.use(Rack::Auth::Basic) do |user, password|
  [user, password] == ["user", "password"]
end
```

sidekiqの起動設定

```yaml:config/sidekiq.yml
:verbose: false
:daemon: true
:pidfile: tmp/pids/sidekiq.pid
:logfile: log/sidekiq.log
:concurrency: 5
:queues:
  - default
```

管理画面のmount

```rb:config/routes.rb
Rails.application.routes.draw do
  # snip
  mount Sidekiq::Web, at: "/sidekiq"
end
```

Worker Example

```rb:app/workers/hard_worker.rb
class HardWorker
  include Sidekiq::Worker
  include Sidetiq::Schedulable

  recurrence { daily }

  def perform
    # snip
  end
end
```

起動/停止
--------

```shell-session
cd /path/to/rails
RAILS_ENV=production bundle exec sidekiq -C config/sidekiq.yml
kill -QUIT `cat tmp/pids/sidekiq.pid`
```
【ピュアJava】サンプルソース勉強会用

#初めに
こちらの記事では主にピュアJavaで書いたサンプルソースでも載せようかなと思います。
基本的には、初心者に教えるときや、ローカルテストなどで使うために少し書いたものが多いですが、参考程度に

#Listのチェック時の注意
まずは、Listのnullチェック時の挙動テストです。
設計もせず、またコメントが1つもないのですが、やってることとしては
* List<String>で渡されたものがisEmpty()、null、equals(null)、size()でチェックした時の戻り値がどうなるかという話です。
* コンソールに吐かれるのが、その結果です。
* もちろん、インスタンスができてないListを渡してしまうとオブジェクトでないのでisEmpty()から落ちます。ですが、エラーを握りつぶしてログ吐かせます。

##サンプルソース

```CheckList.java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * {@link List}のnullチェックサンプル<br>
 *
 */
public final class CheckList {

    public static final String CONSOLE_LOG = "[%s: %s] \r\n";

    public static void list(final List<String> strs) {
        System.out.print(isEmpty(strs) == null ? "" : String.format(CONSOLE_LOG, "isEmpty", isEmpty(strs)));
        System.out.print(nullptr(strs) == null ? "" : String.format(CONSOLE_LOG, "nullptr", nullptr(strs)));
        System.out.print(equals(strs) == null ? "" : String.format(CONSOLE_LOG, "equals", equals(strs)));
        System.out.print(size(strs) == null ? "" : String.format(CONSOLE_LOG, "size", size(strs)));
    }

    static Boolean isEmpty(final List<String> strs) {
        try {
            return strs.isEmpty();
        } catch (Exception e) {
            System.out.print(String.format(CONSOLE_LOG, "isEmpty", e));
        }
        return null;
    }

    static Boolean nullptr(final List<String> strs) {
        return strs == null;
    }

    static Boolean equals(final List<String> strs) {
        try {
            return strs.equals(null);
        } catch (Exception e) {
            System.out.print(String.format(CONSOLE_LOG, "equals", e));
        }
        return null;
    }

    static Integer size(final List<String> strs) {
        try {
            return strs.size();
        } catch (Exception e) {
            System.out.print(String.format(CONSOLE_LOG, "size", e));
        }
        return null;
    }
}
```

##Input
それでは、このソースに以下の3つのオブジェクトを渡します。

```imput.java
final List<String> newNulls = new ArrayList<String>();
final List<String> nulls = null;
final List<String> newNotNulls = Arrays.asList("test");
```

##Output
Inputに対する上から順に見ていくと
* インスタンスを作ったオブジェクトに対してはnullptrが発生せずに安全に判定をすることができています。
* nullを入れたまま渡すと、nullptrが発生してしまいます。

```output.txt
#リストでnew ArrayList<String>()
[isEmpty: true] 
[nullptr: false] 
[equals: false] 
[size: 0] 

#リストでnull
[isEmpty: java.lang.NullPointerException] 
[nullptr: true] 
[equals: java.lang.NullPointerException] 
[size: java.lang.NullPointerException] 

#リストでArrays.asList("test")
[isEmpty: false] 
[nullptr: false] 
[equals: false] 
[size: 1] 
```

##チェックする時
nullで渡さないこと。newするタイミングなどを気をつける。
nullチェック後→isEmpty()で判定するなどのnullptrに気をつける必要があります。
Vagrant + Chef + Ruby2.1.0

# 前提条件
* Mac OS X(10.9.3)
* Virtualbox 4.3.6
* Vagrant 1.4.3

# インストール
* 下記のGEMをインストールする。
<pre>
$ gem install chef
$ gem install knife-solo
$ gem install berkshelf
</pre>

# Vagrantfile作成
* Vagrantfileを新規作成し、編集する。
* boxイメージは、下記参照。今回はCentOS6.5を使用する。
 * https://github.com/opscode/bento

<pre>
$ vagrant init ruby
$ vim Vagrantfile
</pre>

```rb:Vagrantfile
config.vm.box_url = "http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-6.5_chef-provisionerless.box"
config.vm.network :private_network, ip: "192.168.33.10"
config.omnibus.chef_version = :latest
config.vm.provision :chef_solo do |chef|
   chef.cookbooks_path = ["./chef-repo/cookbooks", "./chef-repo/site-cookbooks"]
  chef.roles_path = "./chef-repo/roles"
  chef.add_role "local"
end
```

# Chefリポジトリ作成
<pre>
$ knife solo init chef-repo
</pre>

# Community Cookbookダウンロード
<pre>
$ cd chef-repo
$ berks init
$ vim Berksfile
$ berks vendor cookbooks
</pre>

```rb:Berksfile
source "https://supermarket.getchef.com"
cookbook 'ruby_build'
cookbook 'rbenv', github: "fnichol/chef-rbenv"
```

# Chef Cookbook作成
<pre>
$ vim nodes/local.json
$ vim roles/local.json
</pre>

```rb:nodes/local.json
{
  "run_list": "role[local]"
}
```

```rb:roles/local.json
{
  "name": "local",
  "default_attributes": {
    "rbenv": {
      "rubies": ["2.1.0"],
      "global": "2.1.0",
        "gems": {
          "2.1.0": [
            {"name": "bundler"}
          ]
        }
      }
    },
  "override_attributes": { },
  "json_class": "Chef::Role",
  "description": "local",
  "chef_type": "role",
  "run_list": [
    "recipe[ruby_build]",
    "recipe[rbenv::system]"
  ]
}
```

# Vagrantプラウグインインストール
<pre>
$ vagrant plugin install vagrant-omnibus
</pre>

# Vagrant起動
<pre>
$ vagrant up
</pre>

# プロビジョニング
<pre>
$ vagrant provision
</pre>
Androidに最適化されたJavaクラス一覧

## はじめに
Androidではモバイル端末での処理に最適化されたいくつかの代替クラスが用意されています。
ほとんどがHashMap関係のメモリ消費を抑えるためのものですが、Android Developersにも代替クラスをまとめたページはないようなので、知っている範囲でまとめてみました。

## SparseArray
似ている機能：`HashMap<Integer,T>`
SparseArrayはAndroid向けにパフォーマンスが改良された`HashMap<Integer,T>`の代替クラス。
Supportライブラリに最新の`SparseArray`と同じ実装になった`SparseArrayCompat`がある。
http://developer.android.com/reference/android/support/v4/util/SparseArrayCompat.html

## LongSparseArray
似ている機能：`HashMap<Long,T>`
API level 16から追加された、keyが`int`から`long`になった`SparseArray`。
Supportライブラリにもある。
http://developer.android.com/reference/android/support/v4/util/LongSparseArray.html

## SparseBooleanArray
似ている機能：`HashMap<Integer,Boolean>`
valueが`boolean`型の`SparseArray`。
`HashMap<Integer,Boolean>`の置き換えができるが、value型が`Boolean`ではなく`boolean`なので注意。
http://developer.android.com/reference/android/util/SparseBooleanArray.html

## SparseIntArray
似ている機能：`HashMap<Integer,Integer>`
valueが`int`型の`SparseArray`。
`HashMap<Integer,Integer>`の置き換えができるが、value型が`Integer`ではなく`int`なので注意。
http://developer.android.com/reference/android/util/SparseIntArray.html

## SparseLongArray
似ている機能：`HashMap<Integer,Long>`
API level 18から追加された、valueが`long`型の`SparseArray`。
`HashMap<Integer,Long>`の置き換えができるが、value型が`Long`ではなく`long`なので注意。
Supporライブラリには存在しない。
https://developer.android.com/reference/android/util/SparseLongArray.html

## ArrayMap
似ている機能：`HashMap<K,V>`
API level 19で追加された、`Map<K,V>`の新しい実装。
`HashMap`よりもメモリ効率が良い。
Supportライブラリにもある。
http://developer.android.com/reference/android/support/v4/util/ArrayMap.html

## SimpleArrayMap
似ている機能：`HashMap<K,V>`
Supportライブラリにしか存在しない。
`ArrayMap`から`Map`インターフェイスの実装を外したバージョン。
…というよりも、`ArrayMap`がこのクラスに`Map`の実装を追加している。
おそらくこちらのほうが軽い。
http://developer.android.com/reference/android/support/v4/util/SimpleArrayMap.html

## FloatMath
似ている機能：`Math`(一部)
`float`専用の数値演算処理クラス。
~~javaの`Math`に比べて速いが、肝心のメソッドが少ない…。~~
`Math`より遅い場合もあったのでAPI 23でdeprecatedになりました([AOSP Issue 36199](https://code.google.com/p/android/issues/detail?id=36199))。
http://developer.android.com/reference/android/util/FloatMath.html

## Pair
似ている機能：`AbstractMap.SimpleEntry<K,V>`
key,valueの2つの値を任意の型で保持することができるクラス。
AndroidSDK上では`Pair`のほうが先に実装されているが、`AbstractMap.SimpleEntry<K,V>`とほぼ同様。
http://developer.android.com/reference/android/util/Pair.html
bash の prompt をカスタマイズする

本番機に入ってる時には prompt を赤くしたりホスト名を表示するなどして、注意喚起したいですよね。

# 例

```.bashrc
RED="0;31"
START_COLOR="\[\e[${RED}m\]"
END_COLOR="\[\e[0m\]"
export PS1="[\u@${START_COLOR}FRONT-PRODUCTION${END_COLOR}(\h) \W]\$ "
```

# 解説

## prompt の上書き

環境変数 `PS1` を上書きます。
`export PS!="...."` してください。ダブルクォート(`"`)で囲わないと、変数(`${COLOR}`)が使えないのでご注意。

デフォルトは以下です。

```
PS1=”[\u@\h:\w]\$ ”
```

こちらを `.bashrc` または `.profile` `.bash_profile` 辺りに記述します。
記述後は、再読み込みも忘れずに。

```bash
$ source ~/.bashrc
or 
$ . ~/.bashrc
```

## 特殊文字

予め `bash` に定義された特殊文字を使うと、環境に応じた変数が表示されます。

| 表記 | 内容 | 
| :-- | :-- | 
| `\u` | ログインユーザ名 |
| `\h` | ホスト名（最初の`.`まで） | 
| `\H` | ホスト名（フル） | 
| `\w` | 現在の作業ディレクトリ（絶対パス） | 
| `\W` | 現在の作業ディレクトリ（最後の箇所だけ） | 
| `\$` | prompt の最後の `$` の部分<br>ROOTユーザの場合は`#`になる | 
| `\d` | 曜日＋日付（例: Fri Jan 5 ） | 
| `\t` | HH:MM:SS（24時間） | 
| `\T` | HH:MM:SS（12時間） | 

## 色のつけかた

色をつけたい箇所を、以下の文字列で挟みます。

```
START_COLOR="\[\e[${COLOR}m\]"
END_COLOR="\[\e[0m\]"
```

※ `[` が２箇所にあるので、注意してください

正確には、`\[\]` で色のコードを挟みます。これは非表示文字のシーケンスを使いたい時の宣言です。
 `\e[0m` は色のリセットをするコードです。

色コードの定義は以下の通り。

| 色 | 番号 | コード | 
| :-- | :-- | :-- | 
| 黒 | 0;30 | `\e[0;30m` |
| 赤 | 0;31 | `\e[0;31m` |
| 緑 | 0;32 | `\e[0;32m` |
| 黄 | 0;33 | `\e[0;33m` |
| 青 | 0;34 | `\e[0;34m` |
| 紫 | 0;35 | `\e[0;35m` |
| シアン | 0;36 | `\e[0;36m` |
| 白 | 0;37 | `\e[0;37m` |
| リセット | 0 | `\e[0m` |

# 参考

http://www.atmarkit.co.jp/flinux/rensai/linuxtips/002cngprmpt.html
https://wiki.archlinux.org/index.php/Color_Bash_Prompt
XPathでWebから欲しい場所だけ抜き取る

最近、カレー専門の機械学習エンジンを運用している関係で、Webからコーパスを作成している。具体的にはグルメサイトなどから有益な情報をコピペして貯めこんでいるのだが、手作業で広告などを除去するのが面倒で、そういえばXPathというのがあったっけ、と思いだしてみた。

配列を入れ子にして、ひとつのドキュメントから複数の箇所を抜き出せるようにしてあるのが工夫ポイントかな。

```php
<?php
$s = "";
$url = "http://www.goo.ne.jp/";
$patterns = [
    'www.goo.ne.jp' => [
        '//title',
        'id("news-chu-new")'
    ],
];

foreach( $patterns as $domain => $xpaths ){
    if( strstr($url,$domain) ){
        @$content = file_get_contents($url);
        @$page = new DOMDocument();
        @$page->loadHTML($content);
        $xpath = new DOMXPath($page);
        foreach( $xpaths as $path){
            $textContent = $xpath->query($path)->item(0)->textContent;
            $s = $textContent." ".$s;
        }
    }
}
$s = strip_tags($s);
$s = str_replace(["\r\n","\r","\n","\t"], ' ', $s);
echo $s;
?>
```
Expressにて未定義のパスへのリクエストを受け取った際に返す404をerrorhandlerで扱うようにする

Expressには[errorhandler](https://github.com/expressjs/errorhandler)というMiddlewareがあります。
サーバー側の処理で例外が発生した際にリクエストのAcceptの内容にあわせたエラーを返してくれてとても便利です。

ですが、未定義のパスへのリクエストを受け取った際の404を返すとき、errorhandlerの処理を通らずにExpressのデフォルトの処理を通ってしまい、Acceptの内容にかかわらず、```Cannot <メソッド名> <URLパス>```というテキストが返ってしまう問題に遭いました。

解決方法をメモとして残しておきます。

## 誤った書き方

最初、以下のようなコードを書いていました。

```JSON:package.json
{
  "name": "test",
  "version": "0.1.0",
  "main": "server.js",
  "dependencies": {
    "express": "4.8.4",
    "errorhandler": "1.1.1"
  }
}
```

```javascript:server.js
var express = require('express');
var errorhandler = require('errorhandler');
var app = express();
var port = 3000;

app.get('/', function(req, res) {
  res.send('Hello world!');
});
app.use(errorhandler());

app.listen(port);
console.log('listening on port ' + port);
```

このコードでブラウザから```http://localhost:3000/aaa```などの未定義のパスにアクセスすると、errorhandlerの処理を通らず「Cannot GET /aaa」とだけ書かれたテキストが表示されます。

## 正しい書き方

以下のようにしました。

```javascript:server.js
var express = require('express');
var errorhandler = require('errorhandler');
var app = express();
var port = 3000;

app.get('/', function(req, res) {
  res.send('Hello world!');
});

//---- ここから ----
app.use(function(req, res, next) {
  var error = new Error('Cannot ' + req.method + ' ' + req.path);
  error.status = 404;
  next(error);
});
//---- ここまで ----

app.use(errorhandler());

app.listen(port);
console.log('listening on port ' + port);
```

このコードでブラウザから```http://localhost:3000/aaa```にアクセスすると、errorhandlerの処理を通って以下のように表示されます。

![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/10443/3f22ebd1-328f-3b71-617b-677bd36ad4a2.png)
（Herokuで）Sinatraを使うためのあれこれ


#ファイル構成

他にもいろいろあるけど、とりあえず。

```
sinatra_app/
- views/
    - index.erb
- config/
    - database.yml
- app.rb
- Rakefile
- config.ru
- Gemfile
- model.rb
```

#app.rb

* model.rbを読み込ませる

```app.rb
require 'sinatra'
require 'sinatra/activerecord'
require './model.rb'

get '/' do
  'hoge'
end
```

#Gemfile

* ローカルは、sqlite3を使う
* herokuは、Posgresqlを使う

```Gemfile
source 'https://rubygems.org'

ruby '1.9.3'

gem 'sinatra'
gem 'sinatra-activerecord', :require => 'sinatra/activerecord'
gem 'sinatra-reloader'
gem 'rake'

group :development, :test do
  gem 'sqlite3'
end

group :production do
  gem 'pg'
end
```

#Rakefile

よくわかってない

```Rakefile

require './app'
require 'sinatra/activerecord/rake'
```

#config.ru

`bundle exec rackup config.ru`でSinatraアプリが起動する

```config.ru
require 'rubygems'
require 'bundler'
Bundler.require
require './app'
run Sinatra::Application
```

#model.rb

### ローカル環境（:development, :test）
* Databaseの設定は`config/database.yml`を読み込む
* Basic認証は、`User:admin`,`Password:admin`とする

### Heroku（:production）

* Databaseの設定は、herokuに従う（だめなら、`postgres://localhost/mydb`に接続する）
* Basic認証は環境変数ENVを参照する

```model.rb
configure :development, :test do
	ActiveRecord::Base.configurations = YAML.load_file('config/database.yml')
	use Rack::Auth::Basic do |username, password|
  		username == 'admin' && password == 'admin'
	end
end

configure :production do
	ActiveRecord::Base.establish_connection(ENV['DATABASE_URL'] || 'postgres://localhost/mydb')
	use Rack::Auth::Basic do |username, password|
  		username == ENV['BASIC_AUTH_USERNAME'] && password == ENV['BASIC_AUTH_PASSWORD']
	end
end
```

#database.yml

開発状況にあわせて編集

```config/database.yml
development:
  adapter: sqlite3
  encoding: utf8
  database: db/development.db

test:
  adapter: sqlite3
  encoding: utf8
  database: db/test.db

production:
  url: <%= ENV['DATABASE_URL'] %>
```

なお、herokuの仕様変更により、ActiveDirectroy4.1以降はdatabase.ymlを自動生成しないので、ちゃんと記述する必要があるようです。
（参考：[The config/database.yml file no longer generated for applications using ActiveRecord 4.1+](https://devcenter.heroku.com/changelog-items/709))

#環境変数ENVの登録（Heroku側）
たとえば、PASSWORDの追加は下記のようにする。

```
$heroku config:add PASSWORD="hogehoge"
```

追加した環境変数ENVは、下記のコマンドで確認できる。

```
$heroku config
```
Rails ERDの導入と実行

パーフェクトRuby on Rails で紹介されていたので、使ってみました。
簡単に導入できるので、テーブル間の関係を素早く把握したい時には便利だと思いました。
公式サイト(http://rails-erd.rubyforge.org/)
がリンク切れになっており、実行オプションなどが参照できなくて困りましたが、ググってhelpを見たら何とかなりました。

## 準備
### Ubuntu

` $ sudo apt-get install graphviz `

```rb:Gemfile
group :development, :test do
  gem 'rails-erd'
end
```

###Mac

`$ brew install graphviz`

```rb:Gemfile
group :development, :test do
  gem 'rails-erd', github: 'paulwittmann/rails-erd', branch: 'mavericks'
end
```

## 実行(デフォルト)
以下、実行すると、Railsのrootにerd.pdfが生成されます．

`$ bundle exec erd`

__※ 以下だと失敗した__

`$ rake erd`



## 出力されるER図の例(デフォルト)

![erd.png](https://qiita-image-store.s3.amazonaws.com/0/7902/0968ac11-6888-01ef-4720-e7042065081e.png)


## help

`$ erd -h`

```bash
Usage: erd [-v]


        --title=TITLE                Replace default diagram title with a custom one.
        --notation=STYLE             Diagram notation style, one of simple, bachman, uml or crowsfoot.
        --attributes=TYPE,...        Attribute groups to display: content, primary_keys, foreign_keys, timestamps and/or inheritance.
        --orientation=ORIENTATION    Orientation of diagram, either horizontal (default) or vertical.
        --inheritance                Display (single table) inheritance relationships.
        --polymorphism               Display polymorphic and abstract entities.
        --direct                     Omit indirect relationships (through other entities).
        --connected                  Omit entities without relationships.
        --only                       Filter to only include listed models in diagram.
        --exclude                    Filter to exclude listed models in diagram.


        --filename=FILENAME          Basename of the output diagram.
        --filetype=TYPE              Output file type. Available types depend on the diagram renderer.
        --no-markup                  Disable markup for enhanced compatibility of .dot output with other applications.
        --open                       Open the output file after it has been saved.


        --help                       Display this help message.
        --debug                      Show stack traces when an error occurs.
    -v, --version                    Show version and quit.
```

## 実行(オプション付き)

プライマリーキーやcreated_atなどのカラムも出力するようにしました。
pdfではなく、名前を指定したpngファイルで出力するようにしました。

`$ erd --attributes=foreign_keys,primary_keys,content,timestamp --filename=erd_sample --filetype=png`

## 出力されるER図の例(オプション付き)

![erd_sample.png](https://qiita-image-store.s3.amazonaws.com/0/7902/2fe2c7b6-85de-6e76-7c18-f4d36cfe6fee.png)



### 参考


* 本家(1年半近く更新されてない)  
https://github.com/voormedia/rails-erd  
 ※ プルリクが放置されてたりで、あまりメンテナンスされていないようでした。。
* 上記、Macで利用したやつ  
https://github.com/paulwittmann/rails-erd/tree/mavericks
* オプションを探す時に見た  
[Creating a Database Diagram with Rails-ERD](https://appcasts.io/blog/creating-a-database-diagram-with-rails-erd)
WindowsユーザがUnix系のOSに触れてみる方法

2014年の8月に発表されたOSのシェアは圧倒的にWindowsです。
http://news.mynavi.jp/news/2014/08/05/247/

そのため、多くの人はWindowsしか触ったことがないかもしれません。
しかし、職業プログラマとなると、Windowsだけ触ってればいいというものではありません。

ここでは、Windowsユーザだった人間が、Unix系のOSに触ってみる方法を考えてみます。

#Unix系のOSに触ってみる方法
##MinGWやCygwinをWindowsにインストールする。
特定のコードをgccでコンパイルしたり、UNIXライクなCUIを使ってみるだけならMinGWやCygwinをインストールするといいでしょう。

MinGWの場合は、POSIX APIを提供していないので、Cygwinでコンパイルができるが、MinGWではコンパイルできない場合があります。

Cygwin
https://www.cygwin.com/

MinGW
http://www.mingw.org/

msysGit
http://msysgit.github.io/
以下のページにインストールをした例を記述している。
http://qiita.com/mima_ita/items/1483f2e589605abe2ea4#2-1

あくまでエミュレーションしているだけなので、完全に動作を再現できると期待するべきではないでしょう。

##レンタルサーバーを借りる
実際のUNIX系のOSを安価に操作する場合、レンタルサーバーを利用する手もあります。

http://www.sakura.ne.jp/
サクラインターネットで共有サーバーをスタンダードプラン以上で借りることで、SSHを利用してログインできます。
これにより、コマンドの実験や、gccを利用した任意のアプリケーションのコンパイルや実行を行うことができます。

共有サーバーであれば、最低限の環境がそろった状態で使用することが可能です。
ただし、いくつかの制約があります。
・ApachやMySQL等の共有で使っているアプリケーションの再起動や設定は変更はできません。
・負荷のかかるプロセスを動作させると、怒られて途中で落とされます。
・メンテナンスで環境が変わります。Pythonのバージョンは勝手にあがり、OSはいつのまにか32ビットから64ビットに変更されます。
　そのたびに、自分のアプリケーションの動作チェックが必要になります。

##仮想環境をインストールする
VMware PlayerにDebianなどのOSをインストールします。
以下のページはVMware PlayerにDebianをインストールする例を記述しています。
http://www.infraeye.com/study/linux5.html

必要なアプリケーションは、すべて自分でインストールする必要があり、自由にそれらの設定を変更できます。

仮想環境の強みとして、ファイルとして保存されているので、それを複製することで特定の環境への復旧が容易になることです。
このことは、慣れていない人間が壊す覚悟で色々実験できることを意味しており、学習する上では非常に大きなアドバンテージだと思います。

弱点として、VMWare Playerを動作させるマシンはそれなりの性能をもっていないと厳しいです。メモリはWindows7で動かしている場合、メモリが8GB程度あった方が安定して動作しました。（4GBだと体感でちと厳しい印象）

##パソコンごと用意する
自作PCにインストールするのもいいですし、MacOSならBSD UNIXベースで作ってあるので、それで代替するのもいいかもしれません。

#まとめ
いくつかの方法を紹介しました。
他にも、ここで紹介していない方法もあるかと思います。（専用サーバー借りるとか）

ここで紹介した方法で、コストパフォーマンスに優れる方法としては仮想環境だと思います。

VMWare Playerは個人使用なら無償、会社で使う場合でも、10,800円で調達できます。
好きなOSをインストールでき、環境を自由に入れ替えられるのは大きな魅力でしょう。

環境を自由に入れ替えなくていいので、触ってみるという意味ではレンタルサーバーも選択肢としてあります。
２週間は無料期間があり、その後、月500円程度で、Webサービスの作成の実験をかねて使う分には十分だと思います。

いずれにせよ、一昔前と違い、より楽に、安価にUNIX系のOSを試してみるということができるかと思います。
Swiftまとめ - クラス -

関数はこちらにまとめました。

http://qiita.com/merrill/items/2e143c0e3ecfb04243a2

## インスタンス変数・メソッド

```swift
class User {
  var name: String
  let number: Int
    
  // 初期化時に呼ばれる
  init(name: String, number: Int) {
    self.name = name // 引数の変数名とクラスのプロパティを区別するため、selfをつける
    self.number = number // 定数もinitの中なら設定できる
  }
    
  func hello() -> String {
    return "hello, \(name)"
  }
}

var user: User = User(name: "taro", number: 100)
user.hello()
```

## クラス変数・メソッド

変数・メソッドの宣言前に`class`をつける。

```swift
class User {
  class var name: String = "taro" // swift1.1では未サポート
    
  class func hello() -> String {
    return "hello"
  }
}

User.hello()
```

## Getter/Setter

プロパティの参照時に`getブロック`、設定時に`setブロック`を介してアクセスするプロパティ（swiftでは`Computedプロパティ`と呼び、それ以外のプロパティは`Storedプロパティ`と呼ぶ）は、以下のように定義する。

```swift
class User {
  var name: String = "太郎"
  var nameSama: String {
    get {
      return name + "様"
    }

    set(name) {
      self.name = name
    }
  }
}

var user: User = User()
user.nameSama // => "太郎様"

user.name = "次郎"
user.nameSama // => "次郎様"

```

setの引数が省略された場合、`newValue`という変数に格納される。

また、以下のようにname自身にGetter/Setterメソッドを定義するのは無理らしい。。。

```swift
class User {
  var name: String {
    get {
      return self.name + "様"
    }
        
    set(name) {
      self.name = name
    }
  }
}

var user: User = User()
user.name // エラー
```

## レイジープロパティ

実際にアクセスされるまで初期化されないプロパティ。変数の宣言前に`lazy`をつける。メモリの節約に。

```swift
class User {

}

class AdminUser {
  lazy var user: User = User() 
}

var adminUser: AdminUser = AdminUser() // ここではまだuserは初期化されない
adminUser.user // ここで初期化される
```

## プライベートクラス・変数・メソッド

同一ファイル内からしか参照できない。クラス・変数・メソッドの宣言前に`private`をつける。

```swift
private class User {
  private var name: String = "太郎"
  private func hello(){
    print(name)
  }
}
```

Computedプロパティのsetだけprivateにする場合はこちら。

```swift
class User {
  private(set) name: String = "太郎"
}
```

## 継承

継承は1つまで。

```swift
class User {
  var name: String = "太郎"
  func hello() -> String {
    return "hello, \(name)"
  }
}

// Userを継承
class ChildUser: User {
}

var childUser: ChildUser = ChildUser()
childUser.hello() // => "hello, 太郎"
```

## オーバーライド

```swift
class User {
  var name: String = "太郎"
  func hello() -> String {
    return "hello, \(name)"
  }
}

class ChildUser: User {
  override func hello() -> String {
    return "hi, \(name)"
  }
}

var childUser: ChildUser = ChildUser()
childUser.hello() // => "hi, 太郎"
```

## プロトコル（Protocol）
クラスで必ず実装いなければならない変数やメソッドを定義したもの。プロトコルは複数採用できる。

```swift
protocol TelevisionProtocol {
    var volume: Int { get set }
    func on()
    func off()
}
```

プロトコルの実装

```swift
class MyTelevision: TelevisionProtocol {
  # プロトコルに定義された変数、メソッドが未実装だとエラーになる
}
```

## 拡張（extention）

継承することなく、既存のクラスに独自のメソッドを追加する方法。元になるクラスに対して`Computed`プロパティとメソッドを追加できる。

* NSDateを拡張する場合
 
```swift
extension NSDate {
    # 月末の日付を返す
    var lastDay: Int {
       ...
    }
}
```
暗黙のgetterなのかな？

この２日悩んだ
ちゃんとこちらにもまとめておこう

■疑問点
　下記ソースにて
　aaa=1とDebug.Log("***");にブレークポイントを設定し、
　MonoDevelopのwatcherにABCと入力したところ
　Debug.Log("***");にはブレークしないが
　ABCの値は更新される。

　aaa=1→aaa=5 までの間はgetterが呼ばれないので
　ABCの値は変動しないと思っていた、
　つまりaaa=5を通過した時点ではABCは0のままのはず。
　そして、Debug.Log("ABC=" + ABC.ToString());　の行にて
　初めてABCのgetterが動き、ABCの値が更新されると思っていました。

■検証
　aaa=1とDebug.Log("***") に
　ブレイクポイントを貼り
　watcherにABCが存在する時は
　ステップオーバーしてメソッドの終わりまで進めたところ
　コンソールにログの*** が６回分出力されていた。
　そしてDebug.Log("***") にはブレークしませんでした。

　つまりwatcherは表示するために
　getterをコールしているようですが、
　開発環境側でブレークしないように作られているのでは
　ないか？

　また、Debug.Log("ABC=" + ABC.ToString());に
　ブレークポイントを貼って実行した時は
　コンソールにログの*** が表示されるのは
　Debug.Log("ABC=" + ABC.ToString());をコールした
　１回だけ。
　これに関しても開発環境自身が
　呼び出したときはブレークしないように作られているではないか？

■結論
　●プロパティ名のwatcherが存在する時は、
　　ステップ実行すると内部的にgetterが動く。
　　ステップ実行しない時はブレークポイントを
　　セットしブレークした時点で内部的にgetterが動く。
　　ただしどちらのケースもプロパティ側ではブレークポイントを
　　セットしてもブレークできない。
　　プロパティ側でブレークするのは明示的にgetterを
　　読んだときのみ。


■ソース
public class NewBehaviourScript : MonoBehaviour {


private int aaa;

public int ABC{
get {
Debug.Log("***");
return aaa;}
}

// Use this for initialization
void Start () {
aaa = 1;
aaa = 2;
aaa = 3;
aaa = 4;
aaa = 5;
aaa = 6;
Debug.Log("ABC=" + ABC.ToString());
}


}
OculusRiftのDK1とDK2の違い

RDKを使わず直接扱ってみた。DK2のファームウェアは届いたのそのままなので古いかも知れない。結論から述べるとカメラを除くとそんなに違わない。

センサ回りはそのまま使える。アプリケーションから見るとProductIDがDK1だと0x0001なのがDK2だと0x0021になってるくらいしか違わなくてIDを変えればDK1のコードがそのまま使える。

感度が違うとかもないけど加速度センサはDK2の方がちゃんとしててDK1みたいにフラフラしないのでカメラなしでポジショントラッキングできそう。それと角速度センサにローパスが入っているような印象を受けるが断定はできない。

DK2が受け付ける画面解像度は２種類だけ。1080x1920ともう一つ1080x9**(たぶん960)。後者は左右画面が分かれてなくてオフセット付きで振り分けられるだけのモードのようだ。それと60Hzも選べるけどVSYNCのレートが75Hzじゃないと気に入ってくれないことがある。

ちなみに、DK2のLEDは映像信号が入っていないと橙、映像が入っていると青に点灯する。映像が入っていても気に食わないと橙と青の交互点灯になる。

...しかしDK2はLEDの横の電源スイッチでOFFにすると画面が繋がってないことになるのはいただけないなー。

結局のところ、アプリから見ると画面が縦長でちょっと高解像度になって、レンズの収差が酷くなって加速度計のドリフトが減ってIDが変わって75Hzがデフォルトになったくらいの差しかない。
Raspberry Pi の温度センサーデータを fluentd で Treasure Data に集める


[温度データがとれた](http://qiita.com/daicham/items/ecc29cc7ab3990e0c7c1)ので fluentd で Treasure Data に入れてみたときのメモ。

## fluent-plugin-td インストール

[以前インストールした fluentd]() は gem 版なので、Treasure Data のプラグインをインストールする。

```bash:Console
$ sudo fluent-gem install fluent-plugin-td
```

## Treasure Data の API キーを確認する

### アカウント作成

[ここから](https://console.treasuredata.com/users/sign_up)サインアップしてアカウントを作成する。

### API キー確認

[Treasure Data のコンソール](https://console.treasuredata.com/)で `My profile` にいってパスワードを入れて API キーを確認する。

## fluentd 設定

[以前 Raspberry Pi につけた温度センサー(DS18B20)](http://qiita.com/daicham/items/ecc29cc7ab3990e0c7c1)は 1 エントリ 2 行出力される。
今回は `in-exec` でやってみた。

```/etc/fluent/fluentd.conf
<source>
  type exec
  command tail -1 /sys/bus/w1/devices/28-00000xxxxxxx/w1_slave | awk '{print substr($10,3)}'
  tag td.myapp.temp
  format tsv
  keys temp
  run_interval 10s
</source>

<match td.*.*>
  type tdlog
  apikey YOUR_API_KEY
  auto_create_table
  buffer_type file
  buffer_path /var/log/td-agent/buffer/td
  flush_interval 1m
  use_ssl true
</match>
```

- in-exec で `{"temp":"24500"}` といったデータを取り込む。
- 温度計測タイミングは `run_interval` で、Treasure Data への送信は `flush_interval` でコントロールする。
- `auto_create_table` によりタグ名から Treasure Data 上にデータベースとテーブルを自動的に作成してくれる。上記の場合、データベースは `myapp`、テーブルは `temp` となる。

反映には fluentd を再起動する。

buffer 出力先のディレクトリを作成する。また、オーナを fluentd 実行ユーザにする。

```bash:Pi
$ sudo mkdir /var/log/td-agent/buffer
$ sudo chown -R fluentd:fluentd /var/log/td-agent
```


## 動作確認

しばらくすると(`flush_interval`の設定時間) [Treasure Data コンソールの Databases](https://console.treasuredata.com/databases) にデータベースが追加されている。
テーブルの中にデータが書き込まれていればOK。

## 参考

- [execインプットプラグイン | Fluentd](http://docs.fluentd.org/ja/articles/in_exec)
- [treasure-data/fluent-plugin-td](https://github.com/treasure-data/fluent-plugin-td)
- [td-agent(fluentd)の運用でTreasure Data使ってみたメモ③ - Application Supportを使ってみる(fluent-logger-php) - tweeeetyのぶろぐ的めも](http://tweeeety.hateblo.jp/entry/2014/05/19/223954)
- [Treasure Data](https://console.treasuredata.com/)
androidプロジェクトを作成した時に、appcompat_v7が作成されないようにする。

2014年3月のAndroid SDK Tools r22.6へのリリースに伴い、androidプロジェクトの作成時にappcompat_v7というプロジェクトが自動生成されるようになってしまいました。プロジェクトを作成する毎にappcompat_v7_2、appcompat_v7_3...と作成されてしまうので非常に邪魔です。

これは、API 13以前のアプリケーションで新機能のActionBarを使用するためのものであるため、APIレベルを14以上を最低レベルにすればいいわけです。

プロジェクトを作成する際の「最小必須SDK」の欄をAndroid4.0(IceCreamSandwich)などにすればappcompat_v7が作成されることは無くなります。

【参考】
http://note.chiebukuro.yahoo.co.jp/detail/n271769
CSS3 のみで display: none からフェードインさせる

CSS3 のみで `display: none;` の状態からからフェードインさせる方法を調べてみました。たとえば特定のクラスがついたときにフェードインさせるには下記のようにすればできました。 `display` の `animation` はできないので、下記のように 1% のキーフレームを追加して 表示かつ `opacity: 0;` としておくのがポイントです。

* [Gist](https://gist.github.com/youcune/551f082b6cabe4f4ae5c)
* [動作サンプル](http://bl.ocks.org/youcune/raw/551f082b6cabe4f4ae5c/fadein.html)

```html
<!DOCTYPE html>
<html>
<head>
  <meta charst='utf-8'>
  <title>TEST</title>
  <script src="//code.jquery.com/jquery-1.11.1.min.js" type="text/javascript"></script>
  <style>
    .box {
      background: #000000;
      display: none;
      height: 240px;
      opacity: 0;
      width: 240px;
    }

    .visible.box {
      display: block;
      opacity: 1;
      animation-duration: 0.5s;
      animation-name: fade-in;
      -moz-animation-duration: 0.5s;
      -moz-animation-name: fade-in;
      -webkit-animation-duration: 0.5s;
      -webkit-animation-name: fade-in;
    }

    @keyframes fade-in {
      0% {
        display: none;
        opacity: 0;
      }

      1% {
        display: block;
        opacity: 0;
      }

      100% {
        display: block;
        opacity: 1;
      }
    }

    @-moz-keyframes fade-in {
      0% {
        display: none;
        opacity: 0;
      }

      1% {
        display: block;
        opacity: 0;
      }

      100% {
        display: block;
        opacity: 1;
      }
    }

    @-webkit-keyframes fade-in {
      0% {
        display: none;
        opacity: 0;
      }

      1% {
        display: block;
        opacity: 0;
      }

      100% {
        display: block;
        opacity: 1;
      }
    }
  </style>
  <script>
    $(function() {
      $('#btn').click(function() {
        $('.box').toggleClass('visible');
      });
    });
  </script>
</head>
<body>
<div class='container'>
  <div class="box"></div>
  <div>
    <button id='btn'>START</button>
  </div>
</div>
</body>
</html>
```

## 参考文献

* [css - Animation CSS3: display + opacity - Stack Overflow](http://stackoverflow.com/questions/8449933/animation-css3-display-opacity)
Raspberry Piの初期設定

#Raspberry Piのセットアップ
##概要
Raspberry Piをセットアップする方法は、2種類あります。
1つは、フォーマット済みのSDカードの中に、NOOBSという初心者用インストーラーをコピーして起動する方法とWin32DiskImagerを使って、SDカードに直接OSのイメージを焼き込む方法です。
NOOBSは、コンピューターに不慣れな人で、マウス、キーボード、モニタを接続して小さなパソコンとして利用する人には便利なインストーラーです。
公式サイトには、利用方法が動画で説明されているので、小学生とかでも分かりやすくインストールが行えます。
SDカードに直接OSのイメージを焼き込む方法は、慣れれば素早く行えるので、実験で壊したOSを初期化するなどを繰り返す場合には、こちらのほうが簡単です。
私は普段Ubuntuに慣れ親しんでいるので、raspbianを利用することにしました。

##インストール
###OSイメージのダウンロード
OSイメージを公式サイトからダウンロードします。
http://www.raspberrypi.org/downloads/

###Win32DiskImagerのダウンロードとインストール
SDカードへの書き込みは、Win32DiskImagerというツールを利用します。
![Win32DiskImager.png](https://qiita-image-store.s3.amazonaws.com/0/7839/48792e99-b513-8618-8187-27cf82f12651.png)
http://sourceforge.jp/projects/sfnet_win32diskimager/releases/
Ruby でも Optional Chaining がしたいんじゃ〜！

> もう type = database.first ? database.first.type : nil とかみたいに書くのはつかれたお……。
> Swift みたいに type = database.first?.type って書きたいお……。

というわけでなるべくお手軽に実装。
（NilClass で method_missing して nil を返すと Swift の実装に近づくが、確実にデバッグで死ぬのでおすすめしない）

2015/12/09　追記。
Ruby 2.3.0 から safe navigation operator が実装されましたね。（[参考](http://qiita.com/jnchito/items/0faac073cb77417d61c7#nil-でもメソッド呼び出しがエラーにならない-safe-navigation-operator)）

```rb
foo = Foo.new
p foo&.hello
```

ActiveRecord でいえば try! のほうなので、注意は必要ですが標準でサポートされたというのは大きいと思います。

****

```rb
class Object
  def _?
    self
  end
end

class NilClass
  class Ghost < BasicObject
    def method_missing(*argv)
      nil
    end
  end

  def _?
    @@ghost ||= Ghost.new
    @@ghost
  end
end

class Foo
  def hello
    "hello"
  end

  def foo
    Foo.new
  end
end

foo = Foo.new
p foo._?.hello          # => "hello"
p foo._?.foo._?.hello   # => "hello"

foo = nil
p foo._?.hello          # => nil
p foo._?.foo._?.hello   # => nil
```

オブジェクトを _? でつなげれば、中身があればそのまま返して、nil なら nil を返すぞ！
_ という名前にしてもいいが、 ? をつければなんとなくわかりやすいかもしれない。
実際に使うならもっとまともな名前をつけような！

ActiveSupportのtryとどっちがいいかは一考の余地あり
MySQLですべてのテーブルのすべてのカラムの一覧を取得する


データベース内のテーブルとそのカラムの一覧がほしい！と思いました．

information_schema にいろんな情報が含まれているよ〜というアドバイスをもらったので調べたらこんな感じで取得できました．

```
SELECT
	table_name,
	column_name,
	data_type
FROM
	information_schema.columns;
```
PHP開発でCIするならScrutinizer使ってみよう

# Scrutinizerが凄い！！

ScrutinizerというサービスがPHPの静的解析出来て凄いというスライドを読んで試しに使ってみたら思いの外すごかった。

公式サイトURL
https://scrutinizer-ci.com/
スライドの記事
http://www.slideshare.net/hinakano/scrutinizer-ciphp

オープンソースのリポジトリ(publicリポジトリ？)なら無料で利用出来るようです。

## 静的解析が優秀！

Scrutinizerでは初期設定の段階で、php-sim、pdepend、php-analyzerツールが有効になっています。

これらツールの他に設定で、

* PHP Code Sniffer
* PHP Change Tracking Analyzer
* PHP CS Fixer
* PHP Mess Detector
* Security Advisory Checker

といったツールを利用することも可能です。
これは凄い！

## 使い方は簡単！

Sucrutinizerのサイトにアクセスして、Githubへのアクセスを承認したら、
自分のリポジトリに`.scrutinizer.yml`という名前でファイルを作成したら
あとは利用したい機能や設定を`.scrutinizer.yml`ファイルに記載するだけです。

また、`.scrutinizer.yml`ファイルを作成していなくても初期状態からいくつかの解析状態が登録されており、その内容はブラウザ上から設定することも可能です。

![scrutinizer-config.png](https://qiita-image-store.s3.amazonaws.com/0/28406/f63bebb4-099c-fcdc-d05a-d7ccfb99c204.png)

## レポートのUIがリッチ！

静的解析を主目的とするサービスだけあって、解析結果のレポートUIが豊富です。

### 総合解析結果画面

コードの解析結果は10点満点の点数で評価されます。
この画面からビルドプロセス、カバレッジ、コードの評価点数のバッジURLも取得出来ます。

![scrutinizer-top.png](https://qiita-image-store.s3.amazonaws.com/0/28406/cb838178-d131-7c8e-c918-f39465e2edf9.png)

### issue画面

問題のあるファイルが一覧で確認出来ます。

![scrutinizer-issue.png](https://qiita-image-store.s3.amazonaws.com/0/28406/8de47b52-5e8e-328d-d638-6b5fc6676095.png)

ファイルのリンク先はコードの何処にどんな問題があるのかを確認出来ます。

![scrutinizer-issue-detail.png](https://qiita-image-store.s3.amazonaws.com/0/28406/aca10ed9-29df-18a9-8c2f-b40a942a41f9.png)

### コードの解析結果画面

コードの解析結果を一覧で確認出来ます。

![scrutinizer-code.png](https://qiita-image-store.s3.amazonaws.com/0/28406/fd8693dd-92e2-ba2f-3f3a-4d8df44c3139.png)

リンク先では対象のソースコードがまるまる確認出来ます。
欲を言えばハイライト表示されていて欲しいところですが；；

![scrutinizer-code-detail.png](https://qiita-image-store.s3.amazonaws.com/0/28406/7e0e930a-bbfc-0dd0-181a-48c810adab65.png)

## Unitテストは自動実行、ビルドも出来てカバレッジも取れる！

Scrutinizerでは、リポジトリに`PHPUnit`、`phpspec`、`code ception`、`behat`を利用出来る状態になっていれば、それらを自動で実行してくれます。

もし、PHPUnitの設定の中にカバレッジを取得する設定が入っていればカバレッジも取得してバッジを生成してくれます。
coverollsのようなサービスを別途利用する必要はありません。

もし、独自のビルドプロセスが必要な場合は、`.scrutinizer.yml`というファイル、または設定画面上で以下のような記述を加えることでビルドプロセスを加えることが可能です。

```yaml:.scrutinizer.yml
build:
  # 依存モジュールのインストール
  dependencies:
    before:
      - pecl install ssh-beta
  # デプロイ
  deployment:
    -
      branch: master
      commands:
        - cd deploy && cap deploy
```

カバレッジについても専用のUIが用意されており、
Coverrollasのようなサービスを別途利用する必要もありません。
欲しいものはほぼScrutinizerのサービス内で揃ってしまいます。

## コードの改善案を自動で生成してpull requestしてくれる！

コードの問題がある箇所の修正パッチを自動で生成して、
pull requestとして開発ブランチに取り込む事が出来ます。

![scrutinizer-patche.png](https://qiita-image-store.s3.amazonaws.com/0/28406/5a6e035d-97d2-e9a6-c44a-2e645bb44ac3.png)

# 利用する時の注意

Scrutinizerは開発が活発なサービスです。
今回記載した内容は直ぐに変更される可能性があります。
（実際、UnitTestの自動実行はつい先日追加されたばかりの機能です。）

機能が劣化していくことはないと思いますが、公式サイトのドキュメントは常にチェックしておいたほうがいいでしょう。
PuTTYの青文字が見づらいので変更する方法

リモートサーバーへ接続するのに、PuTTYを愛用しているのですが、青色がとにかく見づらい。
なぜこの色なのか理解不可能なほど暗い色が設定されています。
変更は簡単にできる。

###タイトルを右クリックして、メニューのChange Setting...を選択
![putty1.png](https://qiita-image-store.s3.amazonaws.com/0/7839/919e823c-9f84-24d7-b0ba-b2663ec6c29d.png)

###Window > Colors > ANSI Blueを選択して、色設定を変更
![putty2.png](https://qiita-image-store.s3.amazonaws.com/0/7839/bf8f6f52-b8e9-6726-2b4e-4ae803343e30.png)
UnityにAndroid外部ライブラリ(google-play-services_lib)の導入方法

#はじめに
Androidアプリをネイティブで開発する際、外部ライブラリを導入して開発することはよくあると思います。
Unityでも同様に、外部ライブラリを使って開発したい！！
今回は題材として**「google-play-services_lib」**を**Unity**に導入してみたいと思います。


#外部ライブラリのダウンロード
まずは、必要なライブラリをインストールします。
![Android_SDK_Manager.png](https://qiita-image-store.s3.amazonaws.com/0/49347/4dbf4ca6-fa5e-a596-950f-10c99db640f7.png)


#外部ライブラリをUnityにインポート
インポートといっても特別なことをするわけではありません。
インストールした外部ライブラリ(google-play-services_lib)を
図のようにAndroidディレクトリに外部ライブラリを入れるだけです。

※**google-play-services_libはSDK/home/extras/google/google_play_services以下にあります。**

![Untitled_-_New_Unity_Android_debug_-_Android.png](https://qiita-image-store.s3.amazonaws.com/0/49347/b90bd301-45ec-b748-e6f9-0ecacadd678b.png)

#AndroidManifestに下記コードを追加(google-play-services_libの場合)
```java:Androidmanifest
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
```

以上がUnityにAndroid外部ライブラリの導入方法です。
簡単に出来ると思うので、是非お試しあれ。
シェルスクリプトで IPアドレス計算

会社で、ローカルIPアドレスを何千件とインクリメントして、テストに利用しているのを見て、IP の計算ってどうやるんだ？ってことで、試しにやってみた。

具体的に「IPの計算」ってのは、以下を想定

- ネットワークアドレスを求める
- ブロードキャストアドレスを求める
- 連続したIP の一覧を求める
- あるIP が特定のネットワークの範囲にあるか判定する

## どうやって計算するか

人間が使う IPアドレスは見やすいように、オクテット単位に区切られて、10進で表記されている。こんな感じ。

```
192.168.0.1
```

でもこれでは計算しづらいので、実際の 32bit値に変更して計算するのが良さそう。

```
# 10進数
3232235521

# ２進数
11000000 10101000 00000000 00000001
```

## 前準備
32bitの値で計算する必要があるので、以下のような関数があると便利。

1. IPアドレス表記 -> 32bit値 に変換 (ip2decimal)
1. 32bit値 -> IPアドレス表記 に変換 (decimal2ip)
1. CIDR 表記のネットワークアドレスを 32bit値に変換 (cidr2decimal)

3 については、ぱっと見、意味がわからないが、
192.168.0.0/24 の`24`を 32bit値`4294967040`(255.255.255.0)に変換するという意味。

で、作成した関数が、以下のようなもの。

```no-highlight:bash:shellscript
# IPアドレス表記 -> 32bit値 に変換
function ip2decimal(){
    local IFS=.
    local c=($1)
    printf "%s\n" $(( (${c[0]} << 24) | (${c[1]} << 16) | (${c[2]} << 8) | ${c[3]} ))
}

# 32bit値 -> IPアドレス表記 に変換
function decimal2ip(){
    local n=$1
    printf "%d.%d.%d.%d\n" $(($n >> 24)) $(( ($n >> 16) & 0xFF)) $(( ($n >> 8) & 0xFF)) $(($n & 0xFF))
}

# CIDR 表記のネットワークアドレスを 32bit値に変換
function cidr2decimal(){
    printf "%s\n" $(( 0xFFFFFFFF ^ ((2 ** (32-$1))-1) ))
}
```
```shell-session
$ ip2decimal 192.168.0.1
3232235521
$ decimal2ip 3232235521
192.168.0.1

$ ip2decimal 255.255.255.0
4294967040
$ cidr2decimal 24
4294967040
```

やってることは、なんとなくわかると思いますが、一生懸命、頭にビット列の思い描きながら作りました。

## 計算

で、実際の計算。

### 1. ネットワークアドレスを求める

```shell-session
$ IP=192.168.0.1
$ CIDR=24
$
$ decimal2ip $(( $(ip2decimal $IP) & $(cidr2decimal $CIDR) ))
192.168.0.0
```
対象のIPアドレスを、ネットワークアドレスで AND（論理積`&`）すればよい。そのまま。

### 2. ブロードキャストアドレスを求める
```shell-session
$ IP=192.168.0.1
$ MASK=255.255.255.0
$
$ decimal2ip $(( $(ip2decimal $IP) | (0xFFFFFFFF ^ $(ip2decimal $MASK)) ))
192.168.0.255
```
対象のIPアドレスを、ネットワークアドレスの論理否定（ビット反転）と OR（論理和`|`）すればよい。(ただ、論理否定 `~` がうまく使えなかったので、XOR(排他的論理和)で代替)

### 3. 連続したIP の一覧を求める

```sh
function iplist(){
    local num=$(ip2decimal $1)
    local max=$(($num + $2 - 1))

    while :
    do
        decimal2ip $num
        [[ $num == $max ]] && break || num=$(($num+1))
    done
}
```
```shell-session
$ iplist 192.168.0.253 5
192.168.0.253
192.168.0.254
192.168.0.255
192.168.1.0
192.168.1.1
```

32bit値にしてインクリメントしているので、オクテットの境界と考える必要がない。

### 4. あるIP が特定のネットワークの範囲にあるか

```sh
function ipwith(){
   local addr=$1
   local mask=$2

   local num=$(ip2decimal $3)
   local net=$(( $(ip2decimal $addr) & $(ip2decimal $mask) ))
   local brd=$(( $(ip2decimal $addr) | (0xFFFFFFFF ^ $(ip2decimal $mask)) ))

   [ $net -le $num -a $num -le $brd ] && return 0 || return 1
}
```

`192.168.0.200` `192.168.1.200` が特定範囲(192.168.0.1/255.255.255.0)にあるか

```shell-session
$ ipwith 192.168.0.1 255.255.255.0 192.168.0.200
$ echo $?
0
```
```shell-session
$ ipwith 192.168.0.1 255.255.255.0 192.168.1.200
$ echo $?
1
```

指定されたIPが、ネットワークアドレスとブロードキャストアドレスの間にあるかどうかで判定。

## まとめ

~~まぁ、使うことなさそう。~~ たまに使ってます (2016/03 追記)。
Raspberry Pi B+ モデルで無線LANアダプタ(Elecom WDC-150SU2M)を利用する

## 大事なこと

**ドングル型無線LANアダプタだと給電性能が足らずに安定稼働しないため、現在は使っていません。**

## ではどうぞ

hubotをRaspberry Piに乗っけてプロジェクトのアレやコレをつぶやかせてやろうとワクワクしてRaspberry Piを買った。Raspberry Piを初めて触っているので、[こじ研さんのページを参考にセットアップしていた](http://www.myu.ac.jp/~xkozima/lab/raspTutorial1.html)。こじ研さんのページには無線LANのドングルを適当に買って来ればつながるんじゃないか？と書かれていたので、[Elecom WDC-150SU2M](http://www2.elecom.co.jp/network/wireless-lan/adapter/wdc-150su2m/)を買ってみて楽しみに挿してみたらウンともスンとも言わない。1000円の買い物なのでそれほど高い買い物ではないけど、なんか悔しい。いろいろ調べたら動作させられたのでまとめておく。


## やったこと

1. Raspbianの更新
1. kernel headerのビルド
1. 無線LANアダプタドライバのソースコード入手&ビルド

実際にやったのはこの逆順なのだけど(^_^;) では見ていこう。

### Raspbianの更新
僕はRaspberry PiにOSを準備するのにNOOBSを利用し、Raspbianをインストールした。NOOBSを使うとRaspbian以外のOSも選択できる。けど、カメラモジュールが使いたいので、たぶん他のOSは使わないと思う。
さて、Raspbianを更新するには下記のコマンドを実行する。

```sh
sudo rpi-update
```

Raspbianは結構な頻度で更新されているらしく、公開されている2014/6/20以降にも更新があったようで、上記のコマンドを実行すると更新された。Raspberry Piのファームウェアもアップデートできた。

### kernel headerのビルド

ドライバをソースコードからビルドするにはヘッダーファイルが必要になる。だが、[Raspberry Piのフォーラムによると](http://www.raspberrypi.org/forums/viewtopic.php?f=71&t=17666&p=179845)、Raspbianは容量を抑えるため、パッケージリポジトリにもkernel headerのパッケージを用意しておらず、ソースコードからヘッダーを作成しなければならないとのこと。手順をまとめる。まずRaspberry Piのソースコードを取得し、展開する。

```sh
sudo bash
cd /usr/src
wget https://github.com/raspberrypi/linux/tarball/rpi-3.12.y
tar xzf rpi-3.12.y
```

```rpi-3.12.y``` というのは、GitHubに公開されているブランチ名。ダウンロード時に必要があれば変更する。続いてモジュールのビルドを行う準備を行う。

```sh
cd raspberrypi-linux-*
zcat /proc/config.gz > .config
make oldconfig
make modules_prepare
wget https://github.com/raspberrypi/firmware/raw/master/extra/Module.symvers
```

最後にダウンロードしてきたのは、新しいカーネルをビルドするときに必要なものらしく、誰かがビルドしたものがfirmwareのリポジトリにあるので、持ってきておくといいらしい。ここまでできれば後はシンボリックリンクを貼る。

```sh
KSRC=`pwd`
pushd /lib/modules/`uname -r`
ln -s ${KSRC} source
ln -s ${KSRC} build
popd

pushd /usr/src
ln -s ${KSRC} linux-`uname -r`
ln -s ${KSRC} linux
popd
```

```uname -r``` は動作中のlinux kernelのバージョン。pushdをする時にうまくいかないことがあるので、その時は予めこのコマンドでバージョンを調べておき、実行時に置換する。これでkernel headerを利用できる準備が整った。

### 無線LANアダプタドライバのソースコード入手&ビルド

Elecom WDC-150SU2Mは、Realteckの8188euというチップを使っているらしい。[Raspberry Pi用にドライバを作成されている方がいる](https://github.com/lwfinger/rtl8188eu)ので、その方のリポジトリをcloneし、ビルドする。gitは標準でRaspbianに含まれている。

```sh
git clone https://github.com/lwfinger/rtl8188eu
cd rtl8188eu
make all
sudo make install
```

さっき[Elecom WDC-150SU2Mに対応するpull requestを投げてみた](https://github.com/lwfinger/rtl8188eu/pull/69)けど、マージされていないようならkompiroのリポジトリからcloneしたほうが確実かもしれない。(ただし、カーネルのバージョンが上がるとヘッダーの内容が変わることがあるようで、動作しないことがあるかも。早くマージされると助かる。)
What Every Programmer Should Know About Memory

"What Every Programmer Should Know About Memory", Ulrich Drepper, 2007
http://www.akkadia.org/drepper/cpumemory.pdf

> **Abstract**
> As CPU cores become both faster and more numerous, the limiting factor for most programs is now, and will be for some time, memory access. Hardware designers have come up with ever more sophisticated memory handling and acceleration techniques –such as CPU caches– but these cannot work optimally without some help from the programmer. Unfortunately, neither the structure nor the cost of using the memory subsystem of a computer or the caches on CPUs is well understood by most programmers. This paper explains the structure of memory subsystems in use on modern commodity hardware, illustrating why CPU caches were developed, how they work, and what programs should do to achieve optimal performance by utilizing them.

（参考訳）
> **概要**
> CPUコアが高速化かつメニーコア化するにつれて、メモリアクセスが、現時点および当面の間も、大抵のプログラムに対する制限要因となるでしょう。ハードウェア設計者たちは、例えばCPUキャッシュといった、より精巧なメモリハンドリングや高速化手法を考案してきましたが、これらを有効活用するためにはプログラマによる助けが必要です。残念ながら、大抵のプログラマは、コンピュータ・メモリシステムやCPUキャッシュに関する構造および利用コストについて、十分に理解していません。本稿では、なぜCPUキャッシュが開発され、またどのように動作するかといった、最近の一般的なハードウェアで用いられるメモリ・サブシステムの構造について解説し、さらにそれらを利用して最適なパフォーマンスを引き出すために、プログラマがすべき対応を説明します。


**目次**（Level2まで）
1 Introduction
2 Commodity Hardware Today
2.1 RAM Types
2.2 DRAM Access Technical Details
2.3 Other Main Memory Users
3 CPU Caches
3.1 CPU Caches in the Big Picture
3.2 Cache Operation at High Level
3.3 CPU Cache Implementation Details
3.4 Instruction Cache
3.5 Cache Miss Factors
4 Virtual Memory
4.1 Simplest Address Translation
4.2 Multi-Level Page Tables
4.3 Optimizing Page Table Access
4.4 Impact Of Virtualization
5 NUMA Support
5.1 NUMA Hardware
5.2 OS Support for NUMA
5.3 Published Information
5.4 Remote Access Costs
6 What Programmers Can Do
6.1 Bypassing the Cache
6.2 Cache Access
6.3 Prefetching
6.4 Multi-Thread Optimizations
6.5 NUMA Programming
7 Memory Performance Tools
7.1 Memory Operation Profiling
7.2 Simulating CPU Caches
7.3 Measuring Memory Usage
7.4 Improving Branch Prediction
7.5 Page Fault Optimization
8 Upcoming Technology
8.1 The Problem with Atomic Operations
8.2 Transactional Memory
8.3 Increasing Latency
8.4 Vector Operations
A Examples and Benchmark Programs
A.1 Matrix Multiplication
A.2 Debug Branch Prediction
A.3 Measure Cache Line Sharing Overhead
B Some OProfile Tips
B.1 Oprofile Basics
B.2 How It Looks Like
B.3 Starting To Profile
C Memory Types
D libNUMA Introduction
E Index
F Bibliography
G Revision History
特定フォルダ内のファイル名と更新日付を取得する方法(VBA)

**特定フォルダ内のファイル名と更新日付を取得する方法(VBA)**
--------------------------------------------------------------------

特定フォルダに格納されているファイルの名称と更新日付を取得したい場合、プロンプトでdirコマンドを使用したほうが効率は良いので率先してVBAで行うのは好ましくありません。そのため当記事はあくまでVBAで行う場合の参考程度にサンプルソースを記載します。

**■実装方法**
・ExcelのVBEを使用

```vbnet
Sub GetFileName()
    
On Error GoTo Err

        Dim number
        '(x,0):ファイル名称　(x,1):最終更新日
        Dim fileInfo(300, 2) As String
        
        'セルのE2(行2,列5)にディレクトリパスが記載されている前提でディレクトリパスを取得
        target = ThisWorkbook.ActiveSheet.Cells(2, 5) 
        
        'セルから取得した値（target）を元に、フォルダ情報を取得する
        Set FS = CreateObject("Scripting.FileSystemObject")
        Set Fol = FS.getFolder(target)
        Set Fil = Fol.Files
        
        'フォルダに格納されているファイル名を取得
        Counter = 0
        For Each Fx In Fil
            sFile = Fx.Name                'ファイル名称取得
            lastUpdate = Fx.DateLastModified
            fileInfo(Counter, 0) = sFile   'ファイル名称を格納
            fileInfo(Counter, 1) = lastUpdate '最終更新日を格納
            Counter = Counter + 1
        Next
        
        'ファイル名称、最終更新日出力
        'ループ文で任意の列(2)のi行に取得結果を出力
        For i = 0 To Counter - 1
            showName = fileInfo(i, 0)
            showLastDay = fileInfo(i, 1)
            Cells((2 + i), 2) = showName
            Cells((2 + i), 3) = showLastDay
        Next i
        
        'ファイル件数出力
        ThisWorkbook.ActiveSheet.Cells(5, 6) = Counter
Err:
    Select Case Err.number
        Case (0)
            '正常終了の場合はメッセージは表示しない
        Case (5)
            MsgBox ("フォルダを選択してください。")
        Case Else
            MsgBox (Err.number & ":" & Err.Description) '予期しないエラーの場合はエラー内容を表示する
    End Select
    
End Sub
```

以上、参考まで。
Keyが一意なJSONをJacksonでパースする。

「普通、それ値だろ」という情報がキーになってるJSONをJacksonでパースしたい場合。

```json
{ 
  "cat001": { "name": "momo" },
  "cat002": { "name": "chaa" },
  "cat003": { "name": "maru" } 
}
```

ほぼ下記に書いてあるとおり。
[java - how whould I parse JSON with numerical object keys in Jackson JSON - Stack Overflow](http://stackoverflow.com/questions/21759625/how-whould-i-parse-json-with-numerical-object-keys-in-jackson-json)

```java
public class Main {
	private static String json = "{ \"cat001\": { \"name\": \"momo\" }, \"cat002\": { \"name\": \"chaa\" }, \"cat003\": { \"name\": \"maru\" } }";

	public static void main(String[] args) throws JsonProcessingException, IOException {
		ObjectMapper mapper = new ObjectMapper();
	    JsonNode root = mapper.readTree(json);
	    Iterator<String> fieldNames = root.getFieldNames();
	    while (fieldNames.hasNext()) {
	        String fieldName = fieldNames.next();
	        JsonNode node = root.get(fieldName);
	        System.out.println(node.toString());
	    }
	}
}
```

結果:

```bash
{"name":"momo"}
{"name":"chaa"}
{"name":"maru"}
```
TypeScriptでクライアントとサーバで共用できるjsを作る

```ts:hoge.ts
declare var module : any;
module Hoge{
    if(typeof window === 'undefined'){
        module.exports = Hoge;
    }
}
```

上記のようなファイルをコンパイル時に```tsc -out hoge.js hoge.ts ...```のような感じで組み込んでやればいい感じになる。
Hogeの部分は自分が作成しているモジュール名に変えること。

この方法で作成したjsファイルは以下のように使うことができる

* クライアント側
scriptタグで読み込む
```<script src="hoge.js"></script>```

* サーバ側
requireで読み込む
```var Hoge = require('./hoge.js')```