OmniAICreator/Qiita-1.07M huggingface dataset:
Heroku入門

===================

# 目的 #
HerokuにRubyアプリケーションをでプロイする

# 前提 #
| ソフトウェア   | バージョン   | 備考        |
|:---------------|:-------------|:------------|
| OS X           |10.8.5        |             |
| ruby           |1.9.3-p392    |             |
| rvm            |1.24.0        |             |
| heroku-toolbelt   |3.1.1      |             |

+ [Herokuにサインアップしている](https://id.heroku.com/signup/devcenter)
+ [Heroku Toolbeltをインストールしている](https://toolbelt.heroku.com/)

# 構成 #
+ [セットアップ](#chap1)
+ [ログイン](#chap2)
+ [アプリケーションのデプロイ](#chap3)

# 詳細 #

## <a name="chap1">セットアップ ##

    $ rvm use ruby-1.9.3-p392
    $ rvm gemset create heroku
    $ rvm use ruby-1.9.3-p392@heroku
    $ gem install bundler
    $ bundle init
    $ bundle

## <a name="chap2">ログイン ##

    $ heroku login

## <a name="chap3">アプリケーションのデプロイ ##

### アプリケーションの作成 ###
+ [web.rb](web.rb)

        require 'sinatra'
    
        get '/' do
            "Hello, world"
        end


### Gemfileの作成 ###
+ [Gemfile](Gemfile)

        source "https://rubygems.org"

        ruby "1.9.3"
        gem 'sinatra' 

+ bundle installを実行
    
### Procfileの作成 ###

+ [Procfile](Procfile)

        web: bundle exec ruby web.rb -p $PORT

+ Rack appから直接デプロイする場合はconfig.ruを用意してProcfileは以下の内容になる。

        web: bundle exec rackup config.ru -p $PORT

+ ローカルで動作を確認する

        $ foreman start

### Gitレポジトリの作成 ###

    $ git add .
    $ git commit -a -m "init"

### Herokuにデプロイ ###

    $ heroku create
    $ git push heroku master

### アプリケーションの確認 ###

    $ heroku ps:scale web=1
    $ Scaling dynos... done, now running web at 1:1X.

    $ heroku ps
    === web (1X): `bundle exec ruby web.rb -p $PORT`
    web.1: up 2013/12/12 11:01:48 (~ 7m ago)

    $ heroku open

### ログを確認する ###

    $ heroku logs
    2013-12-12T01:58:52.156557+00:00 heroku[api]: Enable Logplex by kakimomokuri@gmail.com
    2013-12-12T01:58:52.189276+00:00 heroku[api]: Release v2 created by kakimomokuri@gmail.com
    2013-12-12T02:01:26+00:00 heroku[slug-compiler]: Slug compilation started
    2013-12-12T02:01:42+00:00 heroku[slug-compiler]: Slug compilation finished

### コンソール ###

    $ heroku run console
    Running `console` attached to terminal... up, run.5214
    irb(main):001:0> 

### Rake ###

    $ heroku run rake db:migrate

### データベースを使う ###

    $ heroku addons:add heroku-postgresql:dev

+ Gemfileに追加

        gem 'pg'

# 参照 #

[Heroku](https://www.heroku.com/)

[Getting Started with Heroku](https://devcenter.heroku.com/articles/quickstart)

[Getting Started with Ruby on Heroku](https://devcenter.heroku.com/articles/getting-started-with-ruby)

[簡単！３分でGithub上のレポジトリをherokuにpushする方法](http://dqn.sakusakutto.jp/2012/04/github-heroku-push.html)
Laravel IDE Helper Generator

Laravel IDE Helper Generator のインストールでまごついたのでメモしておきます。

最初に composer.json に IDE Helper Generator をダウンロードする記述を追加します。

```composer.json
	"require": {
		"laravel/framework": "4.2.*",
		"barryvdh/laravel-ide-helper": "1.*" ← 追加
	},
```

composer update を実行します。

続いてサービスプロバイダーを追加します。
app/config/app.php の providers 配列に次のように記述します。

```app/config/app.php
	'providers' => array(
	   ・
	   ・
		'Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider', ← 追加
	},
```

最後に "php artisan ide-helper:generate", を composer.json に記述するのですが、
必ず clear-compiled の後、php artisan optimize の前に記述してください。

```composer.json
	"scripts": {
		"post-install-cmd": [
			"php artisan clear-compiled",
			"php artisan optimize"
		],
		"post-update-cmd": [
			"php artisan clear-compiled",
			"php artisan ide-helper:generate", ← 追加
			"php artisan optimize"
		],
```

composer update を実行します。

※ 途中の update はせずとも、最後の update だけで大丈夫だと思います。
iOSシミュレータをターゲットとしたビルド時に「has been modified since the precompiled header」が発生したときの対処方法

コンソールで以下のコマンドを実行し、配下にあるpcmファイルを削除

```
$ cd /Users/<User>/Library/Developer/Xcode/DerivedData/ModuleCache
$ rm -rf *
```

Xcodeで対象プロジェクトを開き、[command]-[alt]-[shift]-[k]を押下して、Cleanしたあと、再度ビルドすると問題なくビルドできる。
CSSスプライトのやり方と、_線が入る問題対応



## CSSスプライト用の画像を準備。

* default.png

![default.png](https://qiita-image-store.s3.amazonaws.com/0/25728/3a59863a-8603-bf47-c44e-ed6fa268f598.png)

## 表示例

```html:index.html
<style>
a.sprite {
        line-height:45px;
        display:block;
        background:url(default.png) no-repeat top left;
}
a.sprite:hover {
        background-position: bottom left;
}
a.ok {
        text-decoration:none;
}
</style>

<p>画像が表示されない例</p>
  <a href="#" class="sprite sample1"></a>

<p>画像が表示されるが、画像に_が入る</p>
  <a href="#" class="sprite sample2">&nbsp;</a>

<p>期待どおりに表示</p>
  <a href="#" class="sprite sample3 ok">&nbsp;</a>
```

![pict.png](https://qiita-image-store.s3.amazonaws.com/0/25728/65f2b8fd-3935-084b-d4c4-c14192cb30c9.png)
systemd環境でもpflogsummを使う方法

systemctlになってから/var/log/maillogにログが出力されなくなった。
pflogsummで解析元をそのファイルにしていたため、pflogsummを動かせない。

* [postfixのメール送信状況を把握する (pflogsumm) - Qiita](http://qiita.com/tukiyo3/items/2e6e13e5124ed718b3f3)

# 対応方法

LANG=Cをつけてjournalctlを実行したものをpflogsummに解析してもらえばよい。

```bash:
mkdir -p ~/cron/logs/
```


```bash:~/cron/pflogsumm.sh
#!/bin/sh
set -eu

cd ~/cron/logs/
LOG=postfix.log.`date -I`
LANG=C journalctl --since=yesterday -u postfix > $LOG

/usr/sbin/pflogsumm --problems_first --mailq \
  --verbose_msg_detail -h 15 -u 15 $LOG \
  | mail -s "pflogsumm: $HOSTNAME" my@mailaddr.co.jp
```

```bash:
chmod +x ~/cron/pflogsumm.sh
```

`LANG=ja_JP.UTF-8`だと日付が日本語になって解析できなくてハマった。
RailsでAjaxを使ってインクリメンタルサーチ


案外簡単にできたよ。

User.nameをインクリメンタルサーチする想定。

まずroutesに一覧表示用の`index`とAjax用の`ajax_user_list`を設定

```config/routes.rb
  resources :users, only: [:index] do
    collection do
      get  :ajax_user_list
    end
  end
```
controllerに各アクションのメソッドを定義

```controllers/users_controller.rb
  def index
    @users = User.all
  end

  def ajax_user_list
    # search_by_nameはmodelに定義してあると思ってください
    @users = User.search_by_name(params[:q])
  end
```

viewはこんな感じ。Ajaxを使うので一覧表示部分はpartialで。

```views/users/inde.html.erb
<p>検索名<p>
<input id="inc_search" type="text">

<div id='user_list'>
  <%= render partial: 'user_list' %>
</div>
```

```views/users/_user_list.html.erb
<table>
  <thead>
    <tr>
      <th>ユーザー名</th>
      <th>住所</th>
      <th>電話番号</th>
    </tr>
  </thead>

  <tbody>
    <% @users.each do |user| %>
      <tr>
        <td><%= user.name %></td>
        <td><%= user.address %></td>
        <td><%= user.phone_number %></td>
      </tr>
    <% end %>
  </tbody>
</table>
```

`ajax_user_list`アクションからレンダーされるのはコチラ。
`$("#user_list")`内を新しい`@users`でもってレンダーした`_user_list.html.erb`に置き換える。

```views/users/ajax_user_list.js.erb
$("#user_list").html("<%= escape_javascript(render 'user_list', users: @users) %>");
```

そしてjavascript(jQuery)はこんな感じ。
keyupのタイミングで前回の入力内容と比較し、違っていればajax実行。
でもあまりに連打されすぎると良くないので、最低でも500msは実行間隔を空ける。

コチラを参考にさせて頂きました。-> [memo-mode javacriptでインクリメンタルサーチとjQueryのchange](http://ganmacs.hatenablog.com/entry/2013/08/18/022224)

```
var
preFunc = null,
preInput = '',
input = '',
ajaxPost = function(input)
{
  $.ajax({
    url: "ajax_user_list",
	  type: "GET",
	  data: ("q=" + input)
  });
};

$('#inc_search').on('keyup', function() {
  input = $.trim($(this).val());   //前後の不要な空白を削除
  if(preInput !== input){
    clearTimeout(preFunc);
    preFunc = setTimeout(ajaxPost(input), 500);
  }
  preInput = input;
});
```
iOSのオーディオまわり(CoreAudio)まとめ


iOSでサウンドの再生をしたい。
でもいろいろな再生方法があって、ややこしいので整理しておく。
公式ドキュメント：[Core Audioの概要](https://developer.apple.com/jp/devcenter/ios/library/documentation/CoreAudioOverview.pdf)

なお、OSXでしか扱えないものは割愛している。iOS特化。

## CoreAudioアーキテクチャ
iOSでは、オーディオまわりの機能はCoreAudioというアーキテクチャにまとめられている。
iOSのCoreAudioは5つののフレームワークから成り、各フレームワークにはサービスと呼ばれる各種機能が入っていたりいなかったり。

* AVFoundation.framework
 * AVAudioPlayerクラス(サービスに分類)
* AudioToolbox.framework
 * Audio Converter Services
 * Audio File Services
 * Audio File Stream Services
 * Audio Format Services
 * Audio Processing Graph Services
 * Audio Queue Services
 * Audio Session Services(iOS7.0から非推奨)
 * System Sound Services
* AudioUnit.framework
 * Audio Unit Services
* OpenAL.framework
 * OpenAL（サービスに分類）
* CoreAudio.framework

## フレームワーク概要

### AVFoundation.framework
iOS専用のフレームワーク(OSXでは使えない)。
これだけObjective-Cインターフェイス。
オーディオの再生と録音を行う。ビデオも扱える。

### AudioToolbox.framework
オーディオファイルの再生や録音、フォーマット変換などを行う。
サイズの大きいデータを少しずつ分割して読み込みながら再生する、ストリーミング再生もできる。
普通にサウンドを扱うだけならこれで十分。

### AudioUnit.framework
「オーディオユニット」と呼ばれるオーディオ処理用のプラグインを使用するためのインターフェースを提供する。
任意長のサウンド再生や複数サウンドの同時再生など、低レベルな制御を行う。
凝ったことをしようとしたらこれを使わないといけない。

### OpenAL.framework
オープンソースのクロスプラットフォームAPI、OpenALを使用するためのフレームワーク。
3Dサウンドが扱えたりする。ゲームとの親和性が高い。

### CoreAudio.framework
すべてのCore Audioのサービスに共通のデータ型や、ハードウェアとのやり取りに使用する低レベルのAPI。

## サウンド再生関連サービス概要

サウンドが再生できるサービスはこちら。お手軽順（OpenALの位置が難しいとこだけど）。

* System Sound Services(AudioToolbox.framework)
* AVAudioPlayerクラス(AVFoundation.framework)
* Audio Queue Services(AudioToolbox.framework)
* OpenAL(OpenAL.framework)
* Audio Unit Services(AudioUnit.framework)

### System Sound Services(AudioToolbox.framework)
一番お手軽だけど機能がかなり限られる。
その名の通りシステムサウンド向け。

* 30秒以下のサウンドファイルを再生する
* リニアPCMまたはIMA4（IMA/ADPCM）フォーマット / .caf、.aif、.wav
* 複数同時再生不可
* ボリューム制御不可
* ループ不可

### AVAudioPlayerクラス(AVFoundation.framework)
おそらく大抵の場合はこれで機能的には事足りると思う。

* ファイルだけでなくメモリバッファからのサウンド再生も可能
* 任意の長さのサウンドの再生が可能
* 複数同時再生可
* ボリューム制御可
* ループ可
* サウンドファイル内での特定の位置へのシークが可能
* .aif, .caf, .mp3, .aac, .m4a, .mp4, .wav

以降、AVAudioPlayerクラスと同じことはできるみたい。

### Audio Queue Services(AudioToolbox.framework)
* 再生したいデータアプリケーション側で用意したバッファに入れ、それをキューにためていくと順次再生してくれる方式
* ストリーミング再生だったり、長いオーディオファイルの部分部分を任意の順番で再生だったりに向いている

### OpenAL(OpenAL.framework)
* 以下の3つの要素からなる
 * Buffer: オーディオデータを管理
 * Source: Bufferにあるデータを使って音を発生させるオブジェクト。3次元空間に配置する
 * Listener: Sourceの発生させた音を聞き取るオブジェクト。3次元空間に配置する
* SourceとListenerの位置関係によって、3次元的な音の再生が可能（ドップラー効果やパンニングなど）
* 再生開始までのタイムラグが少ない（低レイテンシ）ので、ゲームのように画面表示と同期させて音を鳴らしたいときなどによい。

### Audio Unit Services(AudioUnit.framework)
* 一番ハードウェアに近い低レベルAPI
* こちらも低レイテンシで再生が可能
* 「オーディオユニット」という、オーディオデータに対して特定の処理を行うプラグインがあり、これを好きなようにつなげていくことで、再生時のオーディオデータの捌き方をカスタマイズできるイメージ。
IPを簡単に数値に変換する方法

アクセスログなどを解析する際、
「"127.0.0.1〜127.255.255.255"までのIPを検索したい」
というような事があるかと思います。
ただ、"127.0.0.1"のような形式のIPは、そのままだと文字列として扱われるので、IPを数値に変換しないと、範囲検索出来ません。

しかし、"127.0.0.1"のような形式のIPを数値に直すといっても、２進数や10進数に変換するのは面倒だし、直感的に扱いにくいと思います。
そこでちょっとした小細工により、簡単に数値化し、しかも直感的に扱いやすくする方法をメモします。

#方法概要

"127.0.0.1"のような値の、"."で分かれている数値の１つ１つは、0〜255までの数値になります。
そこで、それぞれの数値に、3桁分の容量を確保した上で数値にします。
例えば、

```
127.0.0.1
↓
127000000001
```

```
210.171.13.0
↓
210171013000
```

のように、変換していきます。
「0」「13」 のような3桁に満たない数値部分を、「000」「013」のように3桁に増やしているのがポイントです。

具体的には、IPを"."で分割して4つに分け、左からそれぞれ、
1000の3条の倍数、1000の2乗の倍数、1000の倍数、1の倍数
とみなして計算し、値を足します。

例えば

192.168.20.1

なら

```
(192 * 1000 * 1000 * 1000) + (168 * 1000 * 1000) + (20 * 1000) + 1 
= 192000000000 + 168000000 + 20000 + 1
= 192168020001
```

のようになります。

4つに分割したIPのうち、一番左以外を3桁まで0埋めする、という方法でも結果は一緒です。
手動で変換する場合は、こちらの方がやりやすいでしょう。

```
192.168.20.1
↓
192.168.020.001
↓
192168020001
```

のように変換します。

このようなやり方でIPを数値に変換し、DBなどに保存しておくとよいでしょう。


#変換プログラム例

```java

public static void main(String args[]){
	{
		String ip = "111.111.111.111";
		long ipNum = ipToNum(ip);
		System.out.println("IP before : " + ip + " IP after : " + ipNum);
	}
	{
		String ip = "192.168.20.1";
		long ipNum = ipToNum(ip);
		System.out.println("IP before : " + ip + " IP after : " + ipNum);
	}
	{
		String ip = "1.2.3.4";
		long ipNum = ipToNum(ip);
		System.out.println("IP before : " + ip + " IP after : " + ipNum);
	}
}

/**
 * IPを数値に変換する
 * @param ip
 * @return
 */
private static long ipToNum(String ip) {
	// . で分割して4つにする
	String[] ipParts = ip.split("\\.");
	// 分割した数値を、それぞれ 1000の3条の倍数、1000の2乗の倍数、1000の倍数、1の倍数とみなして変換してから足し合わせる
	long ipNum = multiplicationFromStr(ipParts[0], 1000 * 1000 * 1000) + multiplicationFromStr(ipParts[1], 1000 * 1000) + multiplicationFromStr(ipParts[2], 1000) + multiplicationFromStr(ipParts[3], 1);
	return ipNum;
}

/**
 * 指定された文字列xを数値に変換してyと掛け算を行う
 * @param xStr
 * @param y
 * @return
 */
private static long multiplicationFromStr(String xStr, long y){
	Long x = Long.parseLong(xStr);
	return x * y;
}
```

出力結果

```
IP before : 111.111.111.111 IP after : 111111111111
IP before : 192.168.20.1 IP after : 192168020001
IP before : 1.2.3.4 IP after : 1002003004
```
EMRで実行中のジョブのログをすぐに見る方法

EMRで実行中のログは、EMR起動時にDebugging Toolをtrueにしていれば、5分後くらいにコンソールページで見ることができますが、毎回5分待つのがつらいので、すぐに確認したい場合は多いと思います。

そこで、起動中のEMRインスタンスにSSHでログインして、直接ログを見る方法をメモしておきます。

#EMRのセキュリティグループを変更する

まずは、SSHで使う22ポートを開放する必要があります。

EMRのセキュリティグループは、

- ElasticMapReduce-master
- ElasticMapReduce-slave

という名称で用意されていますので、セキュリティグループのページから、22番ポートを開放しておきましょう。

#マスターノードにログインしてログをtail

起動中のマスターノードのホスト名を、EMRのページの「Master public DNS」項目をみて調べます。

その調べた値を使って、SSHコマンドやPuttyでログインします。
ログインユーザー名は、「hadoop」になります。
例えばSSHの場合は、下記のようになります。

```
ssh hadoop@{調べたEMRのホスト名} -i {秘密鍵のパス}
```

接続に成功できれば、次はいよいよログをtailします。
ログはいくつか種類がありますが、例えばstepのエラーログは、下記に出力されています。

```
/mnt/var/log/hadoop/steps/{ステップ番号}/stderr
```

こちらをtailなどして確認しましょう。


#参考
http://docs.aws.amazon.com/ja_jp/ElasticMapReduce/latest/DeveloperGuide/emr-manage-view-web-log-files.html
PHP 5.5.11 から SplFileObject に fread() メソッドが追加されていた

タイトルの通りなんですが、今年 2014 年の 2 月にコミットされ、5.5.11 でリリースされていました。

コミットログ: https://github.com/php/php-src/commit/3c673fed3483ce772612d768a0638ea42d8dd7ac
PHP.net: http://php.net/manual/ja/splfileobject.fread.php

# 何故今まで fread() が実装されていなかったのか

これは私の推測に過ぎませんが、`SplFileObject` は行ベースの処理を行う前提で用意されていたんだと思います。
根拠としては、コンストラクタ引数でセットできるフラグは `DROP_NEW_LINE ` や `SKIP_EMPTY` など、行ベースの処理を前提としたものですし、イテレータとしての振る舞いも `fputs()` により 1 行ずつ読み出す、というものだということが挙げられます。

# fread() でイテレーションしたい

イテレーション時のデフォルトの振る舞いが `fputs()` による読み出しだと、以下のような問題があります。

* バイナリデータの読み出し時にも行としてデータを読み込んでしまう
* ものすごく長い行が含まれているファイルをイテレーションしようとすると、メモリを使い過ぎてしまう

`fread()` を使えばこの問題を回避することができます。
以下は `image.jpg` を読み込んで標準出力を


```php
$file = new SplFileObject($argv[1], 'rb');

while (true) {
    $buffer = $file->fread(8196);

    if ($buffer === false || $buffer === '') {
        break;
    }

    echo $buffer;
}
```

# イテレータでも fread() したい

一応のイテレーションはできましたが、せっかくなので `Traversable` を実装したイテレータとして振る舞ってくれた方が、何も考えず `foreach` できて便利です。
(イテレータについてご存知なければこちらをご覧ください http://qiita.com/yuya_takeyama/items/51fb058ed20d3df8209e)

というわけで `SplFileObject` を継承する形で以下のようなものを作ってみました。

https://github.com/yuya-takeyama/file_byte_iterator

`SplFileObject` を継承した `Yuyat¥FileByteIterator¥File` と `SplTempFileObject` を継承した `Yuyat¥FileByteIterator¥TempFile` を用意しています。

以下のように使用できます。

```php
include __DIR__ . '/vendor/autoload.php';

use Yuyat\FileByteIterator\File;
use Yuyat\FileByteIterator\TempFile;

const BUFFER_SIZE = 1024 * 16;

$file = new File('image.jpg', 'rb');
$file->setBufferSize(BUFFER_SIZE); // ループごとのバッファの長さをセットする

$temp = new TempFile;
$temp->setBufferSize(BUFFER_SIZE);

// File から読み込んで TempFile に書き込む
foreach ($file as $bytes) {
    $temp->fwrite($bytes, strlen($bytes));
}

// TempFile から読み込む
foreach ($temp as $bytes) {
    echo $bytes;
}
```

テストも書いてなくて Packagist にも登録していないので、とりあえずはただの試作品です。
何かの参考になれば。
画像を画面に合わせて拡大縮小したりトリミングする

画面サイズとか画面の縦横比に合わせた画像ファイル用意するのめんどくさいからJavaScriptで動的に用意する！

以下の関数で、指定した幅と高さに合わせつつ、元画像の真ん中部分を使うように拡大・縮小及びトリミングをします。[EaselJS]を使っているので事前に読み込んでおいてください。

```js
function adaptImage(image, width, height) {
    // 作業場所としてのCanvasを作成
    var canvas = document.createElement("canvas");
    canvas.width = width;
    canvas.height = height;
    var workspace = new Stage(canvas);
    var bitmap = new Bitmap(image);

    // フィットさせたいコンテナ（？）と、画像の「横長ぐあい」を計算
    var aspectRatio = width / height;
    var imageAspectRatio = image.width / image.height;
    if (imageAspectRatio < aspectRatio) {
        // コンテナの方が、より横長
        // だから、幅をフィットさせる。画像の上下にはみ出す部分を落とすことになる
        var scale = width / image.width;
    } else {
        // 画像の方が、より横長
        // だから、高さをフィットさせる。画像の左右にはみ出す部分を落とすことになる
        var scale = height / image.height;
    }
    bitmap.scaleX = bitmap.scaleY = scale;

    // デフォルトでは、画像は左上を合わせて、右下部分がトリミングされるので、
    // 位置をずらして「作業場所Canvas」と中心を揃えるように移動させる
    bitmap.x = (canvas.width - bitmap.scaleX * image.width) / 2;
    bitmap.y = (canvas.height - bitmap.scaleY * image.height) / 2;

    // 作業場所Canvasに実際にレンダリングする
    workspace.addChild(bitmap);
    workspace.update();

    // 画像を作って返す
    var adaptedImage = new Image();
    adaptedImage.src = canvas.toDataURL();
    return adaptedImage;
}
var image = new Image();
image.addEventListener("load", function(event) {
    var adaptedImage = adaptImage(event.target, window.innerWidth, window.innerHeight);
    // 画像を何かする。背景としてCSSで設定するとか。
});
image.src = "http://...";
```

`Stage`とか`Bitmap`とかは[EaselJS]のクラスで、EaselJSを読み込む前に`var createjs = this;`しているので修飾無しで使えています。そうではない場合は、`createjs.Stage`のようにして使ってください。

[EaselJS]: http://www.createjs.com/#!/EaselJS
HTML canvasを画面いっぱいに表示したい


canvasのサイズをwindowサイズに合わせて画面いっぱいに表示させたい。
そんなとき、canvasのサイズ指定をjQueryの.css()を使ってやろうとするとうまくいきません。

具体的に書くと、

HTML:

```
<div id="wrapper">
	<canvas id="canvas"></canvas>
</div>
```

というマークアップに対してcanvasのサイズを指定すべく、
windowのloadイベントやresizeイベントが発火したタイミングで

JS:

```
$( '#canvas' ).css({
	width: $( window ).width(),
	height: $( window ).height()
});

```

という風に記述したとしましょう。

つまり、マークアップ上では、

HTML:

```
<div id="wrapper">
	<canvas id="canvas" style="width: XXXpx; height: YYYpx;"></canvas>
</div>
```

となっている状態です。
この状態でcanvasを動かすと、描画が歪んでしまってうまく表示されません。


どういうことかというと、

**canvasのDOMにサイズ指定するには、htmlのattributeに直接widthとheightを記述する必要があるからです。**

つまり、以下のような書き方になります。

```
<div id="wrapper">
	<canvas id="canvas" width="XXX" height="YYY"></canvas>
</div>
```

これを実現するJavaScriptは以下のようになります。

```
$( '#canvas' ).get( 0 ).width = $( window ).width();
$( '#canvas' ).get( 0 ).height = $( window ).height();
```

これで無事正しくcanvasを全画面で描画させることができます。
Xcode6でcocos runからシミュレーターを起動させる

Xcode6入ってるmacだとcocos runでビルドは通るんだけどシミュレーターが起動しない。

***原因はios-simのバージョンが古いこと***でした。

こいつ
cocos2d-x-3.2/tools/cocos2d-console/plugins/project_run/bin/ios-sim

ちなみにバージョンが1.9.0のもので、2.0.1のものに置き換えたらちゃんと起動するようになりました。

あんまりiosの方はコンソールから立ち上げること無いから気にならないんだけど
初めて始める人にとってはここでつまづいて足踏みしそうなので(´・ω・｀)

正直に言おう。とりあえずQiita使ってみたかった(^q^)
マークダウンサクッと書けるように頑張ろう

新しいios-simの入手とかの詳細はこっちに書いてます
http://ichiokumanyen.hatenablog.jp/entry/2014/09/29/015500
gulpでlivereloadしたい時の書き方

**gulp-connect** が **deprecate** されたので記事を更新します。
(過去記事は過去記事として残しておきます)

[gulp-webserver](https://www.npmjs.com/package/gulp-webserver) というのが出て来ました。

オプションが2つほど追加された感じですね。
(地味に嬉しい `directoryListing` と `open`)

また記述がかなり少なくなりました。

```js:gulpfile.js
var gulp = require('gulp');
var webserver = require('gulp-webserver');

gulp.task('webserver', function() {
  gulp.src('./')
    .pipe(webserver({
      livereload: true,
      port: 8001,
      fallback: 'index.html',
      open: true
    }));
});

gulp.task('default', ['webserver']);
```

![movie.gif](https://qiita-image-store.s3.amazonaws.com/0/11101/3dde9bb7-0b56-06c1-d55b-df135d70d422.gif)
(雑なgifアニメだし、分かりづらいですね。。)

で、試してみた結果、reloadのspeed自体1〜2秒程かかっており、gulp-connectよりも遅い感じがあります。
そして、 `directoryListing` を使ってみて戻してみた所reloadしないという状態です。
記述が非常に短くなったのは良いと思うのですが、ミニマムな最小構成で組んでみて1〜2秒ほどかかるので、結構この差はデカいかもしれません。

```sh:構成
[lion-man]$ tree . -I node_modules
.
├── gulpfile.js
├── index.html
├── lib
│   └── index.js
└── package.json

1 directory, 4 files
```

監視するファイル自体を `./` ではなく、 `lib` にしてみたりしたのですが、やはりあまり変わらずと言った所です。

```sh:gulp-webserver
0.96 real         0.57 user         0.08 sys
```
```sh:gulp-connect
1.10 real         0.58 user         0.10 sys
```

あくまで参考程度にUNIXの `time` コマンド使ってみました。
そこまでの違いないんですが、このreloadの遅さはどこから来るんでしょうね。


## 下記は過去記事です(2015/1/29編集時点)

よく忘れるのでメモです。

クライアントサイドJS書こうとした時にすぐ「これは別ファイルでー」とかやろうとしたらセキュリティに引っかかって「あー、忘れてた」って時に手っ取り早くgulpを使ってローカルサーバ作るかと思います。
そんな時にgulp-connect使うと思うのですが、単純に書こうとしてもファイル監視してリロードしてくれなくて、うーんどうだったっけって前にやったやり方とか漁るかと思いますが、時間が勿体無いですね。

なので、メモ書きをしておこうと思った次第です。

```gulpfile.js
var gulp = require("gulp");
var connect = require("gulp-connect");
var path = require("path");

var paths = [
  "./*.md",
  "./*.html",
  "./*.js"
];

gulp.task("connect", function() {
  connect.server({
    livereload: true,
    port: 8001,
    root: path.resolve("./")
  });
});

gulp.task("watch", function() {
  gulp.watch(paths, ["reload"]);
});

gulp.task("reload", function() {
  gulp.src(paths)
    .pipe(connect.reload());
});

gulp.task("default", ["connect", "watch"]);
```
とりあえずChef始めようという人が知っておくべきツール概要


Chefでインフラ構成をするために必要なツールの概念のみをまとめました。

ここで出てくるキーワード：

- chef
- vagrant
- barkshelf
- serverspec
- test-kitchen

（ちなみにこれら全て`gem install xxx`で入れられます)


どう使うかというより、よく出てくるこいつら何やるんだっけ？みたいなところを書いたつもりで、とりあえず細かいことを気にせずに、まずはローカルでインフラを構築してテストする環境を整えてしまいたい人向けです。
実際にどういうふうに運用するのか気になったら、以下のページが参考になると思います。

- http://qiita.com/yshnb/items/854a1770d0d47479ab47
- http://qiita.com/futoase/items/3a77a7d86ea896488b6b
- http://www.ryuzee.com/contents/blog/6466

## Chef

http://learn.getchef.com/

"Infrastructure as Code"を牽引しているChef先生。インフラの設定も全てソースコードでやって、gitで管理できるようにしましょうという話。記述方法がRubyなので、他の独自言語で設定するツールより愛されている気がする。
インフラの設定なんて、シェルスクリプトで書けばいいんじゃないのと思うかもしれないが、シェルスクリプトより優れている点として以下の様な点がパッとあげられる。 

- OS間の違いを吸収。Javascriptで言うjQuery的役割
- 何度やっても同じ結果になるという冪等性を保証した設計
- 他人が書いたものを再利用できるエコシステムの存在
- 複数台サーバーがあった時、サーバーノードごとの設定も自然に記述できる

(注: ただし、最近Dockerが出てきてImageをそのまま配布する流れになってきたことにより、シェルスクリプトに比べての優位性は一時期より下がってきている)

Chefは、recipeとかknifeとかchef-soloとか概念が色々出てきて勉強することが付きないが、習うより慣れろ。ここで立ち止まらずに、さっさと、chefでのインフラを設定を試してテストする環境を整えてしまおう。

## Vagrant

https://www.vagrantup.com

chefでの環境構築を手早く試す、テストするためによく用いられるツール。

Vagrantの説明は、以下のページが導入として良かった。
http://knowledge.sakura.ad.jp/tech/1552/


自分でも簡単に説明しておくと、Vagrantは、様々なOS/設定の(仮想)マシンをコマンドで簡単にセットアップできるというのがメリット。つまり、Vagrantはインターフェース的な役割で、仮想マシンを作るソフトウェアではない。仮想化ソフトとしてはデフォルトでVirtual Boxを使い、VMWareにすることなどもできる。
仮想にカッコを付けたのは、実は仮想マシンだけではなく、Amazon EC2やDegital Ocean等の実マシンや、更にはDockerコンテナも立ち上げることができる。ここまでくれば、インターフェースという意味もわかってくるはず。

Vagrantの使い方の基礎だけ書いておくと、

```bash
vagrant init (hogehoge)
```

でVagrantfileという設定ファイルが作られ、

```bash
vagrant up
```

でその設定に基づく仮想マシンが立ち上がるという仕組み。

```bash
vagrant ssh
```

でその中に入っていろんなことをしたり、テストをすることもできる。


## Berkshelf

http://berkshelf.com/

Chefのcookbook版Gemfileのような存在。
複数のCookbookを、バージョンごとの依存関係を解決しつつインストールすることが出来る。


```bash
berks init .
```

されているberks管理下のディレクトリ以下で`Berksfile`を作り、ここに使いたいCookbookを書いて、


```bash
berks install
```

すれば必要なCookbookがインストールされる。

## Serverspec

http://serverspec.org/
https://github.com/serverspec/serverspec

Serverマシンの状態をrspecのようにテストすることが出来るTestツール。
[chefspec](https://github.com/sethvargo/chefspec)や[minitest-chef-handler](https://github.com/calavera/minitest-chef-handler)と違い、テストがChefに依存しているわけではなく、純粋にサーバーの状態をテストしているため、Chefだけでなく、puppetやシェルスクリプトで構成したものでもテストを行うことが出来る。
RedHat,Debian,FedoraなどUnix/Linux系のOSはだいたい網羅しており、同じspecを書いただけで複数のOSのテストに対応できる。

## Test Kitchen

http://kitchen.ci/
https://github.com/test-kitchen/test-kitchen


サーバーのテストをする時の統合プラットフォームで、`kitchen`という名前のコマンドを提供している。すごくわかりやすい命名。
提供している機能はいろいろあるがメインは以下の2つ。

- 複数プラットフォーム、複数サーバー設定のコンビネーションの構築とそのテストを簡単に行える
- テストをクリーンなOSの状態から始めたり、以前のテストの状態から始めたりを自由に行える

あとは、作成したサーバーに入れる機能などもあり、デバッグ時に助かる。
なお、テストとしてServerspecを用いることが出来る。
ConcurrentHashMapを利用したCache実装メモ


実装する度に迷うので、自分用実装パターンメモ。

cacheするものはそれぞれなので、ひとまず簡略化の為にnewInstance()にしています。throws Exceptionも簡略化のため…

※ 元はClass名.xmlをJAXB.unmarshal()したものをcacheするユーティリティ。

クラス名はRepository等も良いかもしれません。

## Java 8

※ 初めてのJava 8


```java:Registry.java
package cache.test;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

public class Registry {

	private static final ConcurrentMap<String, Object> CACHE = new ConcurrentHashMap<>();

	private Registry() {
	}

	public static Object load(final Class<?> clazz) throws Exception {
		if (clazz == null) {
			throw new IllegalArgumentException();
		}
		return CACHE.computeIfAbsent(clazz.getName(), key -> {
			try {
				return clazz.newInstance();
			} catch (Exception e) {
				throw new IllegalStateException(e);
			}
		});
	}
}
```

## Java 1.5 - 1.7

※ ダイヤモンド演算子は1.7以降

### 一般的（？）

```java:Registry.java
package example;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

public class Registry {

	private static final ConcurrentMap<String, Object> CACHE = new ConcurrentHashMap<>();

	private Registry() {
	}

	public static Object load(final Class<?> clazz) throws Exception {
		if (clazz == null) {
			throw new IllegalArgumentException();
		}
		final String key = clazz.getName();
		Object current = CACHE.get(key);
		if (current != null) {
			return current;
		}
		current = clazz.newInstance();
		final Object anotherCached = CACHE.putIfAbsent(key, current);
		if (anotherCached != null) {
			return anotherCached;
		}
		return current;
	}
}
```


### R-STYLEの趣味

```java:Registry.java
package example;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

public class Registry {

	private static final ConcurrentMap<String, Object> CACHE = new ConcurrentHashMap<>();

	private Registry() {
	}

	public static Object load(final Class<?> clazz) throws Exception {
		if (clazz == null) {
			throw new IllegalArgumentException();
		}
		final String key = clazz.getName();
		if (CACHE.containsKey(key)) {
			return CACHE.get(key);
		}
		final Object newOne = clazz.newInstance();
		final Object anotherCached = CACHE.putIfAbsent(key, newOne);
		if (anotherCached != null) {
			return anotherCached;
		}
		return newOne;
	}
}
```
Laravelで多対多の中間テーブルを用いたDBの作り方と使い方

以下のチュートリアルで紹介されている基本的な使い方を抜粋し、まとめたものです。
http://daylerees.com/codebright/eloquent-relationships

### 0.DB構造について
DB構造は以下を想定します。
`accounts`と`posts`が多対多になっているので、`account_post`という中間テーブルを用いて関係を表現しています。

```lang:スキーマ
accounts
 -id
 -name
posts
 -id
 -url
account_post
 -account_id
 -post_id
```

### 1.スキーマビルダーでテーブルを作成する
スキーマビルダーでテーブルを作成するためにマイグレーションの準備を行います。

`# php artisan migrate:make CreateTables;`

上記に示したテーブルを作成するよう、マイグレーションの定義を以下のように行います。
`# vim app/database/migrations/**CreateTables.php`

```lang:**CreateTables.php
Schema::create('accounts', function($table){
                        $table->increments('id');
                        $table->string('name', 64);
                        $table->timestamps();
                });

                Schema::create('posts', function($table){
                        $table->increments('id');
                        $table->string('url', 128);
                        $table->timestamps();
                });

                Schema::create('account_post', function($table){
                        $table->integer('account_id')->unsigned();
                        $table->foreign('account_id')->references('id')->on('accounts');
                        $table->integer('post_id')->unsigned();
                        $table->foreign('post_id')->references('id')->on('posts');
                });
```
実行すると、テーブルが作成されます。
`# php artisan migrate`

### 2.モデルクラスを作成する

次にEloquentモデルを作成します。作成するのは、`account`モデルと`post`モデルです。
多対多のモデルとなるので、お互いのクラスにお互いについて、`belongsToMany`メソッドを加えることにより、多対多を表現出来ます。中間テーブルについては、モデルは必要無いようです。

```lang:Account.php
<?php
class Account extends Eloquent{
        public function posts(){
                return $this->belongsToMany('post');
        }
}
```

```lang:Post.php
<?php
class Post extends Eloquent{

        public function accounts(){
                return $this->belongsToMany('account');
        }
}
```

### 3.テストする
ここまで来ればあとは使うだけです。
この例では、簡単にテストするため、DBにデータを挿入する処理を`routes.php`に書いてみます。

```lang:routes.php
Route::get('test', function(){
        $account = new Account;
        $account->name = 'test1';
        $account->save();

        $post = new Post;
        $post->url = 'http://go.jp';
        $post->save();

        $account->posts()->save($post);
        return 'test';
});
```
PentahoをDocker+EC2にデプロイする

DockerfileからコンテナをEC2にデプロイする方法は、基本的には [AWS Elastic BeanstalkでDockerコンテナをデプロイしてみた](http://dev.classmethod.jp/tool/docker/aws-elastic-beanstalk-for-docker-1/) の手順に従えばOKだった。

上の記事でデプロイしているGhostのDockerfileの代わりに、[こちら](http://qiita.com/ikuo/items/d3a674a4b3141f594a36)で試したPentahoのものを使った。Elastic BeanstalkにアップロードするDokcer向け設定ファイルは下を使った。

```json
{
  "AWSEBDockerrunVersion": "1",
  "Image" : { "Name" : "wmarinho/pentaho-biserver:5.1-TRUNK" },
  "Ports" : [{ "ContainerPort": "8080" }]
}
```

Elastic Beanstalkのデフォルトの m1.micro インスタンスだとメモリが足りずにコンテナのセットアップに失敗した。なので、コスパなど考慮してt2.small インスタンス (メモリ2GB, $0.04/hour) に変更した。このt2.smallインスタンスはVPC環境でしか使えないやつなので、とりあえずデフォルト設定のVPCサブネットをAWS管理画面から作成しその中にElastic Beanstalkのアプリケーションを作成した。また、今回はお試し起動でロードバランサは不要なので「シングルインスタンス」の環境タイプにした。

Dockerfileのアップロードから10分弱でインスタンスの起動が完了。Beanstaslkアプリの作成時に設定したホスト名 ***.elasticbeanstalk.com にブラウザでアクセスするとPentahoのログイン画面が表示された。サンプルレポートも問題なく表示された。

----

Refernce: [こちら](http://www.youtube.com/watch?v=D85Hgoep9aE)に似たようなことをやっているムービーがある
シーン上のゲームオブジェクトに別々のテクスチャを貼りたい時

シーン上に置かれたゲームオブジェクトに対して別々のテクスチャをアサインしたい場合の方法になります。

やり方としては、シーン上のオブジェクトを配列で取得した後で
Resourceフォルダの中になる画像をアサインする方法になります。

![スクリーンショット 2014-09-28 23.22.32.png](https://qiita-image-store.s3.amazonaws.com/0/38279/01a1dd01-f350-b330-f939-baa893f86f87.png)
※タグで見ているのでスクリプトはどこに貼っても大丈夫です。

```csharp
using UnityEngine;
using System.Collections;

public class ResourcesTextureTag : MonoBehaviour {
    private GameObject[] _instance;

	void Start () {
        _instance = GameObject.FindGameObjectsWithTag("ObjTag");

        for (int i = 0; i < _instance.Length; i++)
        {
            Debug.Log(i);
            _instance[i].renderer.material.mainTexture = Resources.Load("p"+i) as Texture2D;
        }   
	}
}
```

結果としては、以下のようになります。
![スクリーンショット 2014-09-28 23.22.39.png](https://qiita-image-store.s3.amazonaws.com/0/38279/c043ee8c-4dc9-753d-b586-8e6a525c3a3b.png)

オブジェクトの参照を取得する方法は以下のサイトが参考になります。
http://www.happytrap.jp/blogs/2011/12/20/6310/
GCE環境へのVM接続を楽にするalias

GCE環境で複数のProjectで仕事しているのだが、切り替える為のgcloudコマンドを打つのが面倒になってきたので、こんな感じで~/.zshrcに忍ばせています。
(動作確認してないけどbashでも動くと思います。)

```
# ssh VM instance: gssh <VM instance>
## defautl zone set : gcloud config set compute/zone <ZONE>
alias gssh='gcloud compute ssh '
# show config: gcfg
alias gcfg='gcloud config list'
# show current project_id: gpj
alias gpj='gcfg | grep project'
# GCE set current project: <PROJECT_NAME>
alias <PROJECT_NAME>='gcloud config set project <PROJECT_ID> && gpj'
```

難しい事はしてないので見れば分かるかと思いますが、以下解説。

## 1. gssh: VM instance への接続
```
Usage: gssh << VM instance >>
```

`gcloud compute ssh` のalias。
注意点として通常作成時の`gcloud auth login`しただけではconfigに[compute:zone]が作成されないので`gcloud config set compute/zone <ZONE>`を実行して普段VM構築時に使用しているzoneを設定しておく必要がある。
設定していないと毎回zoneを聞かれる。正直うざい。聞かれるのはgcloudコマンドの仕様。

```
For the following instances:
 - [<VM isntance>]
choose a zone:
 [1] asia-east1-b
 [2] asia-east1-c
 [3] asia-east1-a
 [4] europe-west1-b
 [5] europe-west1-a
 [6] us-central1-f
 [7] us-central1-b
 [8] us-central1-a
Please enter your numeric choice:
```

ちなみに`gcutil ssh`はzoneを設定せずとも聞かれることなく適切なzoneを自動で判断してssh接続ができる。やっぱりgcutilの方が使い勝手いいのになんで無くす方向なのかなぁ。


## 2. gcfg: gcloud configの設定値確認

```
Usage: gcfg
```
`gcloud config list`のalias。
設定値がずらっと出ます。

## 3. gpj: gcloud confg で設定されているproject-id設定値確認

```
Usage: gpj
```
`gcfg | grep project`のalias。
projectの切り替えが多いためproject-idだけを確認できるようコマンドを別出しした。

## 4. < PROJECT_NAME >: project-idの切り替え

```
Usage: <PROJECT_NAME>
```

`gcloud config set project <PROJECT_ID>`のalias。
現在PROJECT_NAMEからPROJECT_IDを取得する術がgcloudコマンドにはない為、仕方なくPROJECT数分直接PROJECT_NAMEとPROJECT_IDを記載して設定している。
正直ダサい。
実行後に`gpj`を実行させ切り替わり後のproject-idを表示させている。


## 今後
プロンプト等にPROJECT_IDかPROJECT_NAMEが出ればもっと幸せかな、と思いました。
Amazon S3って何？（リンク集）

Amazon S3が何なのか？が掲載されている情報リンクなど

## Amazon S3(Simple Storage Service)

Amazon Sinple Storage Serviceと呼ばれるオンラインストレージサービスのこと
ユーザは、GET,PUT,DELETE,LISTで簡単にアクセスすることが可能
保存できるデータサイズ、数は無制限。

### 高い信頼性・堅牢性
データは、3箇所以上のデータセンターにレプリケーションされている。このため、
３つ同時に消えない限りはデータが残るということになる
* SLA 99.999999999%
* [Amazon S3の機能停止：SLAが信頼をもたらすか?](http://www.infoq.com/jp/news/2008/03/s3-outage-trust-slas)



### 価格
* 1GBあたり約3円($0.0330/GB)（ちょっとまえまで10円/GBだったような・・）


## アマゾン公式
[Amazon S3](http://aws.amazon.com/jp/s3/)6


## 公式ドキュメント
[入門ガイド](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/gsg/GetStartedWithS3.html)

[APIリファレンス(英語)](http://docs.aws.amazon.com/AmazonS3/latest/API/Welcome.html)

[クイックリファレンスカード(pdf)](http://awsdocs.s3.amazonaws.com/S3/latest/s3-qrc.pdf)

[開発者ガイド](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/Welcome.html)


## SDK
* [AWS SDK for Java](http://aws.amazon.com/jp/sdkforjava/)
 - API Doc:[AWS SDK for Java API](http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/index.html)
* [AWS SDK for Ruby](http://aws.amazon.com/jp/sdkforruby/)
 - API Doc:[AWS SDK for Ruby](http://docs.aws.amazon.com/AWSRubySDK/latest/frames.html)
* [AWS SDK for iOS](http://aws.amazon.com/jp/sdkforios/)
  - API Doc :[AWS SDK for iOS Reference](http://docs.aws.amazon.com/AWSiOSSDK/latest/)


## slideshare
* [AWS Black Belt Techシリーズ Amazon Simple Storage Service (Amazon S3)](http://www.slideshare.net/AmazonWebServicesJapan/aws-black-belttechwebinar2014s3public)

* [JAWS DAYS 2014 ACEに聞け！ S3](http://www.slideshare.net/idacchi/20140315-jawsdays2014s3?next_slideshow=1)

* [Amazon  Web  Services  Japan blog](http://aws.typepad.com/aws_̲japan/)

* [【AWS発表】S3のサーバーサイド暗号化に独自の暗号化キーを使用可能に](http://aws.typepad.com/aws_japan/2014/06/s3-encryption-with-your-keys.html)
* [はじめてのアマゾンウェブサービス @ JAWS DAYS 2014](http://www.slideshare.net/horiyasu/jaws-days-2014?related=2)
app.router を明示的に use する意味

`app.use(app.router);` を書かなくても動いたので、その意味を調べた。

app.js パターンA:

```js
// ..略..
app.use(app.router);
app.use(express.errorHandler());
app.get('/', function(req, res, next){
  // '/' へのアクセスでわざとエラーになるようにする
  throw new Error();
});
// ..略..
```

app.js パターンB:

```js
//app.use(app.router);  // コメントアウト
app.use(express.errorHandler());
app.get('/', function(req, res, next){
  throw new Error();
});
```

これらを実行すると、パターンA だけに `errorHandler` が適用されていた。

`app.router` を明示的に `use` しない場合は、最初の `app.get` (や post や all など) のときに暗黙的に `app.router` を記述したのと同じになる。
Swiftで複数のoptionalな値のunwrapについて考えた


### 2015/03/27追記
**Swift 1.2から、[if let構文の複数宣言に対応](http://qiita.com/karly/items/3e9c4387f60bfea8424d#%EF%BC%92if-let%E3%81%AE%E8%A4%87%E6%95%B0%E5%AE%A3%E8%A8%80%E3%81%AB%E5%AF%BE%E5%BF%9C)していたようです！**
今後はそちらを利用されることをオススメします

### ↓以下過去の情報

swiftでoptionalな値のunwrap

```swift
func foo(a : String?) -> String?{
    if let _a = a{
        return _a + "foo"
    }
    return nil
}
```

これが複数になったとき、

```swift

func foo(a : String?, b: String?) -> String? {
    if let _a = a { 
        if let _b = b {
            return _a + "&" + _b
        }
    }
    return nil
}
```

だとこんな具合になってネストがえらい深くなってその先に処理が書かれることになって悲しみが生まれる。
`if let _a = a && _b = b` みたいなの無いのかなあと思ったけどどうも無いらしい。

ちょっと無理すれば

```swift
func foo2(a : String? , b:String?) -> String?{
    if a == nil{
        return nil
    }
    if b == nil{
        return nil
    }
    
    return a! + "&" + b!
}
```
こんな感じにもできるけど、force unwrapするのはあまりやりたくない・・・
もうちょっと何とかならないかとか色々考えたり調べたりした。

### tupleとswitchを利用

ちょっと調べるとstackoverflow先生に次のような[解法](http://stackoverflow.com/questions/24548999/unwrapping-multiple-optionals-in-if-statement)があった

```swift
func foo(a : String?, b : String?) -> String?{
	switch(a,b){ // tuple化して
	case(let .Some(a), let .Some(b)): //Some型でマッチ
    	return a + "&" + b
	default:
    	return nil
	}
}
```

なるほど。確かにこれならネストを何段も重ねるという点が解消される。記述がちょと面倒な感じはあるけど・・・

### unwrapした場合のメソッドを多重定義する
ネストの深さが解消されるわけではないけど、ネストした先の実処理さえ別関数として分離しておけば多少マシになるのではないかというやり方
 
```swift
// optionalな引数の場合はunwrapするだけ
func foo(a : String? , b: String?) -> String?{
    if let _a = a{
        if let _b = b{
            return foo(a,b)
        }
    }
    return nil
}

// 実際の処理
func foo(a : String, b: String) -> String{
    return a + "&" + b
}

```

うーん。実際の処理はそれなりに複雑にはなるとしても、やっぱりそのまま書くよりはマシという程度。

### 寸感

* switchのやり方はスマートではあるけど一瞬なんだっけってなりそう。でも値が多い時は良さそう
* メソッドの多重定義はまあ書き方としては素直なのである程度色々解決はしそう。
* もうちょっと良いやり方がほしい
WifiのSuspend設定を解除する[Raspberry pi]


一定時間経つとsshがつながらない減少に見舞われたため修正を行った。

## 環境

* Raspberry pi B+ 512MB
* Raspbian
* Elecom WDC-150SU2M(8188euチップセット)

## 参考

http://www.mikeslab.net/?p=178

## 手順

```bash
cat /sys/module/8188eu/parameters/rtw_power_mgnt
```

で1の場合はパワーマネージメントがONの状態。

以下のようにすると設定を0=解除にできる。

```bash
sudo vim /etc/modprobe.d/8188eu.conf
```

で、

```bash:8188eu.conf
# Disable power management
options 8188eu rtw_power_mgnt=0
```

その後再起動する。

```bash
sudo reboot
```
Swift: 共通モジュールを作ってスクリプトから参照


- モジュールはdylibで作る必要あり
- 型の参照が必要なので、.swiftmodule も必要

# Loggerモジュールを用意

~~~
Peeko:Downloads hide$ mkdir sample
Peeko:Downloads hide$ cd sample/
~~~

## logger.swift

~~~
import Foundation

public class Logger
{
    var prefix: String
    
    public init(_ prefix: String) 
    {
        self.prefix = prefix
    }
    
    public func log(msg: String)
    {
        print(prefix)
        println(msg)
    }
}
~~~

# コンパイルしてモジュールとオブジェクトコード作成

## モジュール & doc (swiftc)

~~~
Peeko:sample hide$ xcrun -sdk iphonesimulator8.0 swiftc -emit-module logger.swift -module-name Logger

Peeko:sample hide$ file *
Logger.swiftdoc:    data
Logger.swiftmodule: data
logger.swift:       ASCII Java program text
~~~

## Mach-O オブジェクト (swiftc)

~~~
Peeko:sample hide$ xcrun -sdk iphonesimulator8.0 swiftc -emit-object -o Logger.o logger.swift

Peeko:sample hide$ file *
Logger.o:           Mach-O 64-bit object x86_64
Logger.swiftdoc:    data
Logger.swiftmodule: data
logger.swift:       ASCII Java program text
~~~


# dylib 作成 (libtool)

~~~
Peeko:sample hide$ export SWL=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphonesimulator
~~~

~~~
Peeko:sample hide$ libtool -dynamic  -L$SWL -o libLogger.dylib  Logger.o /usr/lib/libSystem.dylib
ld: warning: -macosx_version_min not specified, assuming 10.10
~~~

こっちでもよさそう

~~~
Peeko:sample hide$ libtool -dynamic  -L$SWL -o libLogger.dylib  Logger.o -lSystem
~~~

~~~
Peeko:sample hide$ file *
Logger.o:           Mach-O 64-bit object x86_64
Logger.swiftdoc:    data
Logger.swiftmodule: data
libLogger.dylib:    Mach-O 64-bit dynamically linked shared library x86_64
logger.swift:       ASCII Java program text
~~~

# アプリ作成

## hello.swift

~~~
import Logger

var logger = Logger("> ")
logger.log(String("Hello"))
~~~

# 実行 (swift)

~~~
Peeko:sample hide$ xcrun -sdk iphonesimulator8.0 swift -I . -L . -lLogger hello.swift
~~~

~~~
> Hello
~~~
Elixir Keywords / Maps / Dicts

# Elixir Keywords / Maps / Dicts

## 概要
Elixir の Keywords / Maps / Dicts について

Elixir では2つの連想データ構造があります。
keyword list と maps です。

## Keyword List
http://elixir-lang.org/docs/stable/elixir/Keyword.html

多くの関数型言語では、 2つのアイテムのタプルを連想データの代用として使います。
Elixir では1つ目のアイテムが atom で、それをキーとしたタプルの配列を用い、
これを keyword list と呼びます。


### basics

~~~
iex> keyword_list = [{:hoge,1},{:hige,2}]
[hoge: 1, hige: 2]
iex> keyword_list == [hoge: 1, hige: 2]
true
iex> keyword_list2 = [hoge: 1, hige: 2]
[hoge: 1, hige: 2]
iex> keyword_list2 == [hoge: 1, hige: 2]
true
iex> keyword_list == keyword_list2
true
iex> keyword_list[:hoge]
1
~~~

### add element

~~~
iex> keyword_list[:hoge]
1
iex> keyword_list ++ [hage: 3]
[hoge: 1, hige: 2, hage: 3]
iex> keyword_list = [hege: 4] ++ keyword_list
[hege: 4, hoge: 1, hige: 2]
~~~

## Maps
http://elixir-lang.org/docs/stable/elixir/Map.html

%{} で maps を定義できます。

~~~
iex> map = %{:hoge => 1, 2 => :hige}
%{2 => :hige, :hoge => 1}
iex> map[:hoge]
1
iex> map[2]
:hige
~~~

## Dicts
Elixir の keyword list も maps も Dict のインターフェースを実装しているため
両者をポリモーフィックに利用することができる。
Elixir ではこのようなものを behaviour と呼ぶ。

http://elixir-lang.org/docs/stable/elixir/Dict.html

~~~
iex> keyword_list = [{:hoge,1},{:hige,2}]
[hoge: 1, hige: 2]
iex> Dict.fetch!(keyword_list, :hoge)
1
iex> Dict.fetch!(keyword_list, :hage)
** (KeyError) key not found: :hage
    erl_eval.erl:572: :erl_eval.do_apply/6
    src/elixir.erl:133: :elixir.eval_forms/3
    /builddir/build/BUILD/elixir-0.8.3/lib/iex/lib/iex/server.ex:73: IEx.Server.eval/4
    /builddir/build/BUILD/elixir-0.8.3/lib/iex/lib/iex/server.ex:26: IEx.Server.do_loop/1
~~~

## 参照
http://elixir-lang.org/getting_started/7.html
iptables で位置を指定してルールを設定する方法

いつも忘れるので、memo。。。

iptables -I Chain rulenum(位置) 


まずは、位置を確認

```
$ iptables -L

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited
```

例）インサートコマンド（-I）で Chain INPUTの4番目に挿入する場合
`$ iptables -I INPUT 4 -p tcp --dport 80 -j ACCEPT`
Groonga Cライブラリ テーブルの基本操作

Groonga は全文検索ライブラリとして知られていますが、
実際は KVS データベースとしての様相が強く、
インデクシングや検索機能はデータベースの一機能として用意されています。
たとえば、インデクスデータはカラムとして作成しますし、
検索結果はテーブルとして返却されます。

今回は、そんな重要なデータベースのスキーマの一つである、
 “テーブル” に関して基本的な操作を紹介します。

## テーブルの作成

```c
  grn_obj *value_type = grn_ctx_at(ctx, GRN_DB_UINT32);
  assert(value_type != NULL);
  grn_obj *table = grn_table_create(ctx, TABLE_NAME, strlen(TABLE_NAME), NULL, GRN_OBJ_TEMPORARY | GRN_OBJ_TABLE_NO_KEY, NULL, value_type);
  assert(table != NULL);
```

grn_table_create() 関数を使います。
このコードでは、以下のような条件でテーブルを作成しています。
（あくまで例示のためのもので、）

- 一時テーブルとして作成
- 主キー値を持たない
- UINT32型のレコード値を持たせる

grn_table_create() 関数の仕様は、公式のドキュメントで確認できます。

- http://groonga.org/ja/docs/reference/api/grn_table.html

主キー値の格納方法は、パフォーマンスに影響する重要な要素の一つですが、
こちらに関しても、公式のドキュメントに詳しい解説がございます。

- http://groonga.org/ja/docs/reference/tables.html

テーブル作成時の注意点をいくつか挙げておきます。

- 明示的に GRN_OBJ_PERSISTENT を指定しなければ、一時テーブル（メモリ上にのみ存在）として作成されます。
- パスは明示的に指定しても良いですが、データベースのサイズが少し増えます。
- 主キー値の型として、ShortText 以外の文字列型は指定できません。
- テーブル作成時のレコード値の型を指定するパラメータですが、NULL を指定できます。
- レコード値の型として、文字列型は指定できません。

## テーブルのオープン

```c
  table = grn_ctx_get(ctx, TABLE_NAME, strlen(TABLE_NAME));
```

grn_ctx_get() 関数を使います。
パラメータとして、作成時に付けたテーブル名を指定します。
テーブルが取得できない場合は、 NULL が返却されますので気を付けてください。

## テーブルのクローズ

```c
  grn_obj_unlink(ctx, table);
```

grn_obj_unlink() 関数を使います。
パラメータとして、クローズしたいテーブルオブジェクトを指定します。

## サンプルコード

今回紹介した一連の操作を使ったプログラムを作成しました。
Gist にて公開しておりますのでご参考ください。

[how_to_use_grn_table.c](https://gist.github.com/msh5/7c8cf799897808d36ea5b4cb342f3d2d)
systemdはどうやってコンテナ・仮想化環境を判別しているのか

systemdにはコンテナやハイパーバイザの検出用関数`detect_virtualization`が存在する。v230現在では、まずコンテナを判別する`detect_container`を実行して、判別できなければ仮想化環境を判別する`detect_vm`を実行する。

## `detect_container`

OpenVZ, LXC, LXC (libvirt), Docker, RKT, systemd nspawnを判別できる。

* OpenVZ
  * `/proc/vz`が存在して、`/proc/bc`が存在しない
     * ルートコンテキストには両方存在する
* それ以外
  * 自分がPID=1であれば、`container`という環境変数を調べる
  * PID!=1であれば、`/run/systemd/container`の中を調べる
     * PID=1のsystemdプロセスが当該ファイルを生成する
  * それもなければ、PID=1のプロセスの`container`環境変数を調べる

## `detect_vm`

KVM, QEMU, Bochs, Xen, UML, VMware, VirtualBox, Microsoft Azure, IBM z/VM, Parallels Desktopを判別できる。

systemdは仮想化環境を判別する方法をいくつか持っており、それらを順次実行していく。

### `detect_vm_dmi`

DMIは[Desktop Management Interface](https://en.wikipedia.org/wiki/Desktop_Management_Interface)のことで、シリアル番号やBIOSのリビジョンといったハードウェア情報を取得するためのインタフェースである。Linuxでは、sysfsで以下のような情報が手に入る。

```shell-session
$ ls /sys/class/dmi/id/
bios_date     board_asset_tag  board_vendor       chassis_serial  chassis_version  product_name    product_version  uevent
bios_vendor   board_name       board_version      chassis_type    modalias         product_serial  subsystem
bios_version  board_serial     chassis_asset_tag  chassis_vendor  power            product_uuid    sys_vendor
```

systemdは以下のDMIを順番に調べる。

* `/sys/class/dmi/id/product_name`
* `/sys/class/dmi/id/sys_vendor`
* `/sys/class/dmi/id/board_vendor`
* `/sys/class/dmi/id/bios_vendor`

最近のVMMだと、これらのファイルのいずれかに識別のための文字列が入っている。

* KVM
* QEMU
* VMware, VMW
* innotek GmbH (VirtualBox)
* Xen
* Bochs
* Parallels

### `detect_vm_cpuid`

CPUIDの調べ方は後述するが、これもDMIと同様に設定されている文字列を元に仮想化環境を判別する。

* XenVMMXenVMM
* KVMKVMKVM
* VMwareVMware
* Microsoft Hv

### `detect_vm_xen`

`/proc/xen/capabilities`が存在しているかチェックする。とりあえず、ここでXenであると判別するが、後でDom0のチェックを行なう(後述)。

### `detect_vm_hypervisor`

`/sys/hypervisor/type`を調べて`xen`と書かれていればXenと判別する。

### `detect_vm_device_tree`

ARM, AArch64, PPC, PPC64の場合はデバイスツリーを調べる。

* `/proc/device-tree/hypervisor/compatible`が存在する場合
    * `linux,kvm`と書かれていればKVMと判別する
    * `xen`と書かれていればXenと判別する
* 存在しない場合
    * `/proc/device-tree`のディレクトリを調べて、`fw-cfg`というファイルが存在すればQEMUと判別する

### `detect_vm_uml`

`/proc/cpuinfo`に`\nvendor_id\t: User Mode Linux\n`という文字列が含まれていればUMLと判別する。

### `detect_vm_zvm`

s390の場合、`/proc/sysinfo`の`VM00 Control Program`というエントリを調べる。

* `z/VM`と書かれていればz/VMと判別する
* そうでなければKVMと判別する

### `detect_vm_xen_dom0`

もしこの段階でXenと判別されていた場合Dom0か否かを調べる。

`/proc/xen/capabilities`の機能リストに`control_d`が存在していれば、Dom0だと判断し、仮想化環境**ではない**と判別する。

### CPUIDの調べ方

ハイパーバイザ用のCPUIDについては、[CPUID usage for interaction between Hypervisors and Linux. [LWN.net]](http://lwn.net/Articles/301888/)に詳しい説明が書かれている。CPUID命令は、EAXレジスタに欲しい情報のIDを入れてCPUID命令を呼び出すと、情報毎に決められた特定のレジスタに情報が設定される ([CPUID - Wikipedia, the free encyclopedia](https://en.wikipedia.org/wiki/CPUID))。EAX=1がプロセッサ情報に対応し、EAXにプロセッサモデルやファミリ、EDXとECXにプロセッサの個々の機能が設定される。ECXの31ビット目はハイパーバイザ向けに予約されており、ハイパーバイザは1にセットして返すことになっている。ハイパーバイザが存在することがわかると、今度はEAX=0x40000000を入れてCPUID命令を呼ぶことで、ハイパーバイザ用ベンダIDを取得することができる。
vagrant上のmysqlに接続する時の設定めも

# 自分用めも

まとめると意外にシンプルだったのに結構ハマってしまったのでメモ。

## ホストのVagrantfileの設定

IPアドレス指定で接続できるようにしておく。

```text:Vagrantfile
〜(省略)〜
# ↓お好きなIPで
config.vm.network "private_network", ip: "192.168.33.10"
〜(省略)〜
```

## ゲストのmysql側の設定

rootでMySQLにログインして、root以外の管理用ユーザを作る。

```text:コマンド
$ mysql -u root

mysql>GRANT ALL PRIVILEGES ON *.* TO sample@"192.168.33.1" IDENTIFIED BY 'sample' WITH GRANT OPTION;
```

## MySQLクライアントの設定

※Sequel Proの場合の設定例

<pre>
[標準タブ]
名前　　　　：お好きな名前で
ホスト　　　：192.168.33.10(Vagrantfileで設定したIPアドレス)
ユーザ名　　：sample
パスワード　：sample
データベース：空白でいい
ポート　　　：空白でいい(3306)
</pre>
今見ているサイトをツイートするJSスクリプト

ツイートしたいページで URL バーに以下のスクリプトをコピペすると、ツイートダイアログが出てくる。
しかもツイート後は自動で閉じるようにした。
こいつをブックマークに登録しておくと、とても便利だ。
※ Chrome の場合、先頭の "javascript:" はコピペされないので注意。自分で入力する必要がある。

`javascript:(function(s,e){open("https://twitter.com/intent/tweet?original_referer=javascript:close&text="+e(document.title)+"&url="+e(location.href),"_blank","width=550,height=420,left="+(s.availLeft+s.availWidth/2-275)+",top="+(s.availTop+s.availHeight/2-210));})(screen,encodeURIComponent)`


## 分解
以下は上の一行 JS の中身である。

```js
(function(s, e) {
  var query = [
        "original_referer=javascript:close", // ツイート後にダイアログを閉じる処理
        "text=" + e(document.title),         // タイトル
        "url=" + e(location.href),           // URL
      ],
      url = "https://twitter.com/intent/tweet?" + query.join("&"),
      target = "_blank",                     // ダイアログとして open
      opts = [
        "width=550",
        "height=420",
        "left=" + (s.availLeft + s.availWidth/2 - 275),
        "top=" + (s.availTop + s.availHeight/2 - 210),
      ],                                     // ダイアログの大きさと位置
      option = opts.join(",");

  open(url, target, option);
})(screen, encodeURIComponent);
```
Atomでモデルだけ初期化した状態で起動スクリプトを挟む

Atom開発者向け

src/window-bootstrap.coffee

atom.startEditorWindowすると起動してしまうのでコメントアウトして自分で定義したブートロードを挟む

```coffeescript
# Like sands through the hourglass, so are the days of our lives.
startTime = Date.now()

require './window'

Atom = require './atom'
window.atom = Atom.loadOrCreate('editor')
atom.initialize()
# atom.startEditorWindow()
# window.atom.loadTime = Date.now() - startTime
# console.log "Window load time: #{atom.getWindowLoadTime()}ms"


cssPath = '/Applications/Atom.app/Contents/Resources/app/static/editor.less'
content = atom.themes.loadLessStylesheet cssPath
css = atom.themes.applyStylesheet cssPath, content

{TextEditorView} = require 'atom'
editorView = new TextEditorView {}
editorView.appendTo 'body'
window.editorView = editorView
editorView.editor.buffer.setText 'testtesttestest`'
```


clone した atomのディレクトリでcoffeeのビルドだけ行う

```
npm install
npm install grunt
grunt --gruntfile build/Gruntfile.coffee coffee install
```
mixedな変数をswitchで条件分岐させる時に気をつけること

PHPはこういう変数の使い方ができる。
> 変数$resは結果コード0~4またはエラーメッセージを格納する。

この変数の値によって条件分岐する処理を書く。

```php
	function echo_res($res){
		switch($res) {
			case 0;
				echo "res = 0\n";
				break;
			case 1;
				echo "res = 1\n";
				break;
			case 2;
				echo "res = 2\n";
				break;
			case 3;
				echo "res = 3\n";
				break;
			case "エラー";
				echo "res = エラー\n";
				break;
		}
	}
```

実行のコードはこんな感じ。

```php
<?php
	$res = 0;
	var_dump($res);
	echo_res($res);

	$res = 1;
	var_dump($res);
	echo_res($res);

	$res = 2;
	var_dump($res);
	echo_res($res);

	$res = 3;
	var_dump($res);
	echo_res($res);

	$res = "エラー";
	var_dump($res);
	echo_res($res);

?>
```

結果はこんな感じ

```
int(0)
res = 0
int(1)
res = 1
int(2)
res = 2
int(3)
res = 3
string(6) "エラー"
res = 0
```

$resの値がエラーメッセージの時に、0と判定されてしまっている。

```php
var_dump( 
	"エラー" == 0, // true
	intval("エラー") // 0
);
```
こういうことみたいです。

思った通りの動作にしたかったら、こんな感じ。

```php
	function echo_res($res){
		switch($res) {
			case "0";
				echo "res = 0\n";
				break;
			case "1";
				echo "res = 1\n";
				break;
			case "2";
				echo "res = 2\n";
				break;
			case "3";
				echo "res = 3\n";
				break;
			case "エラー";
				echo "res = エラー\n";
				break;
		}
	}
```

もしくは

```php
	function echo_res($res){
		switch($res) {
			case 0;
				echo "res = 0\n";
				break;
			case 1;
				echo "res = 1\n";
				break;
			case 2;
				echo "res = 2\n";
				break;
			case 3;
				echo "res = 3\n";
				break;
			case -1; //-1はエラーコード
				echo "res = エラー\n";
				break;
		}
	}
```
エラーメッセージを$resに入れない(´・∀・｀)