OmniAICreator/Qiita-1.07M huggingface dataset:
【Unity3D】共有アセットバンドル

複数のアセットバンドルを扱う際、共通のマテリアル、メッシュ等が無駄に複製されてメモリを浪費する問題を回避する方法について。


# ビルド

```csharp
private void BuildAssetBundle(BuildTarget platform, Object[] commons, Object[] objects)
{
        //DeterministicAssetBundleが必要。
        //後で一部のアセットバンドルを再ビルドする際、オブジェクトの識別に利用される。
        //IDを付けない場合、共有アセットバンドルだけ後で再ビルドした時、リソースの関連付けが出来なくなるらしい。
        BuildAssetBundleOptions option =
                BuildAssetBundleOptions.CollectDependencies |
                BuildAssetBundleOptions.CompleteAssets |
                BuildAssetBundleOptions.DeterministicAssetBundle;

        BuildPipeline.PushAssetDependencies();

        // 共有アセットバンドルをビルド
        BuildPipeline.BuildAssetBundle(null, commons, "common.unity3d", option, platform);

        for(int i = 0; i < objects.Length; ++i)
        {
                // 個別のアセットバンドルもPush, Pop で囲む
                BuildPipeline.PushAssetDependencies();
                
                // 個別のアセットバンドルをビルド
                BuildPipeline.BuildAssetBundle(objects[i], new Object[]{objects[i]}, objects[i].name + ".unity3d", option, platform);
                
                BuildPipeline.PopAssetDependencies();
        }

        BuildPipeline.PopAssetDependencies();
}
```

# ロード

```csharp
IEnumerator LoadAssetBundle(string fileName, bool isCommon, DownloadCallback callback)
{
    // 共有アセットバンドルの読み込み.
    WWW loader = WWW.LoadFromCacheOrDownload("common.unity3d", 0);
    while(!loader.isDone) yield return new WaitForSeconds(0.1f);

    // LoadAll()で一旦全てロードすることで、リソースがメモリ上に乗る。
    // 多分シェーダーのコンパイルも行われる。
    // 依存するアセットバンドルからロードを行うまではUnload()しない。
    AssetBundle commonAB = loader.assetBundle;
    Object[] commonObj = commonAB.LoadAll();

    // 依存しているアセットバンドルA
    loader = WWW.LoadFromCacheOrDownload("AssetBundleA.unity3d", 0);
    while(!loader.isDone) yield return new WaitForSeconds(0.1f);

    // 必要なオブジェクトをロードして、アセットバンドルは即解放.
    AssetBundle ab = loader.assetBundle;
    Object objA = ab.Load("objectA", typeof(GameObject));
    ab.Unload(false);
    
    // 依存しているアセットバンドルB
    loader = WWW.LoadFromCacheOrDownload("AssetBundleB.unity3d", 0);
    while(!loader.isDone) yield return new WaitForSeconds(0.1f);

    ab = loader.assetBundle;
    Object objB = ab.Load("objectB", typeof(GameObject));
    ab.Unload(false);
}
```

# 参考サイト

参考サイト

Unity公式：アセット依存関係の管理 / Managing asset dependencies
http://docs.unity3d.com/ja/current/Manual/managingassetdependencies.html

keijiroさん：アセットバンドルとシェーダー
https://github.com/keijiro/unity-shader-bundle
pebble開発 その１

## pebbleとは
https://getpebble.com/
iOS/androidと連動するスマートウォッチ。短めな充電時間で５日とバッテリ持ちがよく、自分で気軽に？ソフト開発ができる。ただしそのままでは日本語は表示されない。現時点販売されてるスマートウォッチの中で一番使い勝手がよいと思ってる。

## iOS / android
僕はiPhoneを使ってるので、下記はiOSでの話。iOSにpebbleアプリがインストールされてないとダメ。app storeからダウンロード。

## ちょっと使ってみる
app storeからpebbleのアプリをダウンロードして、ちょっと使ってみる。skypeとかlineとかメールとかTELとかいろいろと通知があるたびにpebbleが震えてメッセージを表示してくれる。iPhoneのmusicの再生もできたり。iPhone6Plusユーザーの僕は端末をカバンにしまいっぱなしなことが多く、通知を知らせてくれるのはとても嬉しい。またいろんな人が作成したpebbleアプリを共有してくれてる。iOSのpebbleアプリにストア機能があって、そこでアプリを取得・pebble本体にインストールできる。時計型とアプリ型のアプリがある。どうやら８個のアプリスロットがあって、８個までインストールができるらしい。

## まずはバージョンアップ
最近2.9がリリースされた。まずは日本語を表示させたいので
http://www.texpress.co.jp/pebble_hiragana
をインストールする。iOSのサファリで上記ページに移動。そこでイメージのダウンロード。すると「pebbleで開く」が出てくるので、タッチ。するとpebble実機にイメージがダウンロードされてインストールが正常終了する（はず）。完全に日本語フォントが表示されるわけではないけど、メッセージの推測ができる。日本語版のリリースに感謝。

## pebbleで何ができるか
pebble本体の機能は下記らしい。
>モノクロ液晶144x168
>バイブレーション
>ボタン４つ
>三軸加速度センサ
>明るさセンサ
>bluetooth（スマフォ連動）

pebble本体アプリは２つのタイプがある。
>Watch face
>Watch app

ふーん。これだけ？となるけど、その他必要な情報はiOSから取り出すことができるよう。なるほど。iOSアプリとの連動もできるのか、いわゆるコンパニオンアプリ。例えばPebbGPS。このアプリはapp storeにある。現在地の地図をスマフォで画像作って、その画像をpebble本体に送って、pebble本体に地図を表示させる。なるほど。

## 開発環境
せっかくpebbleを入手したのだから、pebbleの開発をしてみる。開発手法は主に２つ。一つはCloudPebble。もう一つはSDKをdownloadでターミナルで開発。Cloudタイプは環境インストールなしで便利なのでこれを使う予定。Cとjavascriptが利用できるらしい。僕は根っからのC野郎なのでC言語を選択。
http://developer.getpebble.com/getting-started/watchface-tutorial/part1/
まずはここでお作法を習う。エミュレータあり、実機インストールあり、充実してる。

## pebbleで何を作るか考える
時計アプリを作って、公開してみる。平日の8:00/11:00/13:00/18:00に振動するようにしてみる。この時間は自分の都合。そろそろ起きろ、就業時間、ランチタイム、そろそろ帰宅を意識しろというアラート。面倒でなければこの時間は変更できるようにしたいけど、そんなのは後々(v2.0)にする。

## 設計
まずは見た目から。システムフォントがあるので、それを利用。テクスチャは利用しない。表示させるものは
>西暦日付
>曜日
>時計

後々(v2.0)に表示させたいものとして
>今の天気
>今の気温
>明日の天気
>明日の気温

かな。レイアウトは作成しながら決める。

## 次回
実際にコーディング。
dispatch_syncをデッドロックしないよう安全に呼ぶ


`dispatch_sync`は同一キュー内で呼び出すとデッドロックに陥ります。

今までメインスレッドを安全に同期的に呼び出す際は以下のように行っていました。

```swift
func safe_dispatch_sync_main(block: dispatch_block_t) {
    if NSThread.isMainThread() {
        block()
    } else {
        dispatch_sync(dispatch_get_main_queue(), block)
    }
}
```

今回、`dispatch_queue_create`で作成したキューを同期的に実行する方法がないか探した結果をメモします。


## 結論

`dispatch_queue_get_label`を利用するとqueueのラベル名が取得できます。
ラベル名が異なれば`dispatch_sync`を呼び出し、同じであればブロックを直接実行します。


```swift
func safe_dispatch_sync(queue: dispatch_queue_t, block: dispatch_block_t) {
    
    let queue_label = dispatch_queue_get_label(queue)
    let current_label = dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL)
    if queue_label != current_label {
        dispatch_sync(queue, block)
    } else {
        block()
    }
}
```

## 補足

同じキューかどうかかの判断をラベル名で行っているため、同じラベル名で複数作成されると別キューで実行される可能性があります。
※ただ`dispatch_sync`には原理的に入らないのでデッドロックになる最悪のパターンは回避できると思います。
※ラベル名をUUIDやランダムで作成するとより厳密に判別できると思います。
HerokuでのDB移行

お仕事のアプリ移行の前に、ほそぼそとやっている自社サービスの http://l-engine.com で試してみた。DBのバージョンアップも出来たので一石二鳥。

# 準備

Addonの追加でDB追加したらHEROKU_POSTGRESQL_ROSE_URLが割り当てられた。

```bash
heroku config --app myapp
```

などとすると新規のURLの存在を確認できる。

# バックアップ
アプリの管理画面からCapture Backupしてバックアップ作成。何かあったらこれに戻ってくる。


# メンテ開始
以下の手順でメンテ開始＆DBの移行。

## DBのコピー

```bash
heroku maintenance:on --app myapp

heroku pg:copy DATABASE_URL HEROKU_POSTGRESQL_ROSE_URL --app myapp
```

ここまでしたら、新しい方のインスタンスにデータがちゃんと入ったか管理画面で確認する。今回は https://postgres.heroku.com/databases からDBを選択して見た。Rowsの数値などが変わればデータの移動には成功している。

## DBの切り替え

続いて、DBの切り替えを行い、メンテモードを抜ける。

```
heroku pg:promote HEROKU_POSTGRESQL_ROSE --app myapp
heroku maintenance:off  --app myapp
```

# 確認

とりあえず何かDBに書き込まれるような操作を行って、新しいDBに反映されるのかをチェック。管理画面から下記の操作でpsqlできるとわかるのでこれをコンソールに貼り付けて実行。

```
heroku pg:psql --app myapp HEROKU_POSTGRESQL_ROSE
myapp::ROSE=> select * from mytable order by created_at desc
```

新規に書き込んだデータが無事に反映されていれば新DBで動いていることまで確認できる。
AmazonEC2上のubuntuにrbenvでRubyをイントールする（ついでにRailsも）

## 準備
AmazonEC2にインスタンスを作成します。
http://aws.amazon.com/jp/ にアカウントの作成からsshで接続まで詳しい手順が記載されているので割愛します。

## gitのインストール
`$ sudo apt-get install -y git-core`

## rbenvをインストール 
`$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
`

## 設定
コマンドラインでrbenvを使用するためにパスを通します。
`$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
`
続けて自動補完を有効にする`rbenv init`の設定です。
`$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile`

上記の設定を読み込みます。
`$ exec $SHELL -l`

## rbenvの確認
`$ rbenv`と入力してバージョンが表示されたら準備完了です。以下は表示例です。

```
rbenv 0.4.0-131-g1a7f49d
Usage: rbenv <command> [<args>]

Some useful rbenv commands are:
   commands    List all available rbenv commands
   local       Set or show the local application-specific Ruby version
   global      Set or show the global Ruby version
   shell       Set or show the shell-specific Ruby version
   rehash      Rehash rbenv shims (run this after installing executables)
   version     Show the current Ruby version and its origin
   versions    List all Ruby versions available to rbenv
   which       Display the full path to an executable
   whence      List all Ruby versions that contain the given executable

See `rbenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/sstephenson/rbenv#readme
```

## ruby-buildをインストール
rbenvはあくまでrubyのバージョンを切り替えてくれるだけで、rubyをインストールしてくれるわけではありません。rubyのインストールにはruby-buildを使用します。
`$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build`
## rubyをインストール
`$ rbenv install -l`でインストール可能なrubyをリスト表示します。
最新版の2.1.5をインストールしてみます。
`$ rbenv install 2.1.5`
グローバル環境に設定
`$ rbenv global 2.1.5`
バージョンの確認
`$ ruby -v # => 2.1.5`
## Railsのインストール
gemでrailsをインストールします。
`$ gem install rails`
するとエラーが出現。

```
ERROR:  Error installing rails:
	ERROR: Failed to build gem native extension.

        /usr/bin/ruby1.9.1 extconf.rb
/usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- mkmf (LoadError)
	from /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
	from extconf.rb:1:in `<main>'
```
[ここを参照すると](https://coderwall.com/p/_gqqfg/require-cannot-load-such-file-mkmf-loaderror)
`$ sudo apt-get install ruby1.9.1-dev`
すると解決出来そうです。
気を取りなおしてrailsをインストールすると大丈夫そう。
`rails -v`
でバージョン確認してみると
`Rails 4.2.0`
と表示されたので準備完了です。これでrubyとrailsで開発する環境は整いました。
CocosStudioで作成したSceneをLoadする cocos2d-x_3.4


# 環境

- Cocos2d-x_3.4
- Cocos Studio for Mac 2.1.2Beta

# 手順

1. Cocos StudioでPublishしたresフォルダをプロジェクトに追加する
2. 追加する際は *Create folder references* を選択
3. シーンでロードする

\# CocosGUI.h, CocoStudio.h をインポートする。
\# 適宜 namespace を使用する。

```C++:HelloWorldScene.m
#include "ui/CocosGUI.h"
#include "cocostudio/CocoStudio.h"

using namespace cocostudio;
using namespace ui;

bool HelloWorld::init()
{
	if( !Layer::init() )
	{
		return false;
	}
	// （中略）
	
	// searchPathを追加する
	// 実際、createSceneする前のAppDelegate.cpp applicationDidFinishLaunching()など初期化時に行っておけば良いと思う
    FileUtils::getInstance()->addSearchPath("res");
    
    // ロードする
    auto mainScene = CSLoader::getInstance()->createNode("res/MainScene.csb");
    this->addChild(mainScene);
    
	return true;
}
```

# 参考

[cocos2d-x: CSLoader Class Reference](http://www.cocos2d-x.org/reference/native-cpp/V3.4/df/da6/classcocos2d_1_1_c_s_loader.html)
PHP無名関数のuseに渡された変数をクロージャの外から取得する


ReflectionFunction getStaticVariablesで取得できます.
http://php.net/manual/en/class.reflectionfunction.php

```php
<?php
$profile = [
  'name' => 'Isaac Newton',
  'birthday' => '1646-01-04',
];
$closure = function($params) use ($profile) {
  echo "My name is ${$profile['name']}.";
};

$reflection = new ReflectionFunction($closure);
var_dump( $reflection->getStaticVariables() );
  # array(1) {
  #   ["profile"]=>
  #   array(2) {
  #     ["name"]=>
  #     string(12) "Isaac Newton"
  #     ["birthday"]=>
  #     string(10) "1646-01-04"
  #   }
  # }
```

# Environment

```
$ uname -a
Linux *** 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/issue
CentOS release 6.5 (Final)
Kernel \r on an \m

$ /usr/local/php-5.5.4/bin/php -v
PHP 5.5.4 (cli) (built: Mar 11 2014 11:06:57)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2013 Zend Technologies

$ /usr/local/php-5.6.0/bin/php -v
PHP 5.6.0 (cli) (built: Aug 29 2014 06:35:44)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2014 Zend Technologies
```
スクリプトの途中でvimを使いたい

初投稿です。

## したいこと

- Node.jsの
- スクリプトの途中で
- vimで入力できるようにしたい

## 結論

```js:こう
var spawn = require('child_process').spawn;

var vim = spawn('vim', ['filename'], {
  stdio: [
    process.stdin,
    process.stdout,
    process.stderr,
  ],
});

vim.on('exit', function (code) {
  console.log('exit code: ' + code);
  // 終了したらここにくる
});

```

----
以下、過程です。

## みちのり

自分用ツールをnodejsで作っていて、
複数行のテキストを入力したくなり、
「gitのコミットメッセージ入力みたいにvim開くとイカスのでは」
という思いでやってみました。

```js:悪い例１
var spawn = require('child_process').spawn;

var vim = spawn('vim');
```

```bash:悪い例１を実行
$ node sample.js
:q   # 何も出ない
:q!  # :qでもだめ
^C$  # しかたなく Ctrl+c
```

標準出力を出してみます。

```js:悪い例２
var spawn = require('child_process').spawn;

var vim = spawn('vim');

// 出す
vim.stdout.on('data', function (data) {
  console.log(data);
});

// 出す
vim.stderr.on('data', function (data) {
  console.log(data);
});
```

```bash:悪い例２を実行
$ node sample.js
<Buffer 56 69 6d 3a 20 57 61 72 6e 69 6e 67 3a 20 4f 75 74 70 75 74 20 69 73 20 6e 6f 74 20 74 6f 20 61 20 74 65 72 6d 69 6e 61 6c 0a 56 69 6d 3a 20 57 61 72 6e ...>
<Buffer 1b 5b 3f 31 30 34 39 68 1b 5b 3f 31 68 1b 3d>
<Buffer 1b 5b 31 3b 32 34 72 1b 5b 3f 31 32 3b 32 35 68 1b 5b 3f 31 32 6c 1b 5b 3f 32 35 68 1b 5b 32 37 6d 1b 5b 6d 1b 5b 48 1b 5b 32 4a>
<Buffer 1b 5b 3f 32 35 6c 1b 5b 31 3b 31 48 1b 5b 31 6d 1b 5b 33 33 6d 20 20 31 20 1b 5b 6d 0d 0a 1b 5b 31 6d 1b 5b 33 34 6d 7e 20 20 20 20 20 20 20 20 20 20 20 ...>
<Buffer 66 72 65 65 6c 79 20 64 69 73 74 72 69 62 75 74 61 62 6c 65 1b 5b 31 33 3b 32 39 48 53 70 6f 6e 73 6f 72 20 56 69 6d 20 64 65 76 65 6c 6f 70 6d 65 6e 74 ...>
```

dataはBufferのようです。
(アスキーコード　表　でググったのは秘密)

```js:文字列でだす
  console.log(data.toString());
```
```:結果
Vim: Warning: Output is not to a terminal
Vim: Warning: Input is not from a terminal
```

標準入力・出力を**端末とつないでね**とのこと。
`spawn() `の第三引数でストリームを指定して、
`on()`でexitを待ちます。
以上。
なでしこでBASE64エンコードされた画像を復元する

BASE64エンコードテキスト→画像
--------------

```
「｛デスクトップ｝エンコードテキスト.txt」を開いてBASE64デコードして「｛デスクトップ｝デコード画像.jpg」に保存しておわり
```

画像→BASE64エンコードテキスト
--------------------

```
「｛デスクトップ｝デコード画像.jpg」を開いてBASE64エンコードして「｛デスクトップ｝エンコードテキスト.txt」に保存しておわり
```

なでしことは
-------------

- [なでしこ:日本語プログラミング言語](http://nadesi.com/top/)
Substance Painterの使い方 (5) AO Mapを割り当て編

Substance Painter内ではAO Mapを作成することはできません。
ここでは、他ツールで作成したAO MapをSubstance Painterでそれっぽく反映する方法について記載します。

> Substance Painter 1.3でAOや法線含む各種ベイク機能が実装されるとのこと。
> その際に本解説を一新することになりそう、、、。

## AOって何？

AO(Ambient Occlusion)とは、ポリゴンメッシュの各頂点もしくは面上のある点から半球状にレイを複数飛ばし、それが他の形状とぶつかる確率を遮蔽情報として与える方法です。
遮蔽が多い場合は全体的に暗くし、遮蔽少ない場合に明るくします。
これは、黒～白のグレイスケールで与えられます。

以下の図の場合は、地面の赤い点の位置から5本のレイを飛ばして、1つだけ衝突した場合。
この場合は、1/5の影濃度になることになります。
![aomap_00_20150217.png](https://qiita-image-store.s3.amazonaws.com/0/62860/b9085fa3-df59-b9f2-d116-cf159f7f8e2f.png)

これは光源とは関係ない遮蔽となりますのでニセモノの陰影ですが、それっぽい色合いになります。
通常は、拡散反射にAO Mapのテクスチャを乗算合成して使用することになると思います。
AO Mapとは、テクスチャ上にUVが与えられている場合に、UVに対応する元の3D空間でのジオメトリでの面上のAO計算結果を、テクスチャに対して焼き付け（ベイク）たものです。
このときのUVは、他の面で重ならないように配置されている必要があります。

Substance PainterでのAOなしと、AOありの比較。
![Skeleton_aomap_substance_painter_20150217.jpg](https://qiita-image-store.s3.amazonaws.com/0/62860/4cedec44-9bf8-3a6a-b5b8-02637a55630f.jpeg)

## AO Mapの作成

Substance DesignerでのAO Map作成は「[Substance DesignerでAO Mapを作成](http://qiita.com/ft-lab/items/a3fd0962a203b21f0bd6)」に記載してみました。

Shade 3DでのAO Map作成については、「[ポリゴンメッシュでキャラクタを作成（AO 編）](http://shade3d.jp/store/marketplace/articles/polydecharacter/ao.html)」に記載させていただきました（Shade3Dのマーケットプレイス内）。

## Substance PainterでAO Mapを反映

### AO Map用のテクスチャを読み込み

メインメニューの「File」-「Import image」より、AO Mapとして使用するテクスチャを読み込みます。
テクスチャは、2の累乗サイズである必要があります。

### AO Map用のレイヤを追加

各TextureSetのレイヤの一番上に、Fill Layerを追加。
これの右上をクリックしドロップダウンより「Multiply」を選択します。
これは、レイヤを乗算合成するための指定になります。
レイヤの一番上に置いておくことで問答無用にAOの乗算が入りますので、その下のレイヤはいくら塗りたくっても大丈夫です。

![sp_ao_01_20150217.png](https://qiita-image-store.s3.amazonaws.com/0/62860/44411e0f-85fa-09ac-99bd-a040dd31b3d8.png)

Fill parametersビューで、color以外のheight/rough/metalをクリックしてOffにします。これはトグルになっており、再度クリックすると有効になります。

Base Colorをクリックして、AO Mapのテクスチャを選択します。

![sp_ao_02_20150217.png](https://qiita-image-store.s3.amazonaws.com/0/62860/845731b2-41b7-77b5-210c-bee404ed892c.png)

これで、AOでの影の遮蔽的な表現ができるようになります。
AOの影響度を抑えたい場合は、レイヤの100となっているところをクリックし、スライダで値を下げるようにしてください。
この場合は、Base ColorだけにAO Mapの乗算合成してますので、Base Colorに対してAOの影響が反映されます。

以下、左がAOなし、右がAOありの最終画像です。
AOありのほうがよりリアルに見えますね。

![sp_ao_03_20150217.jpg](https://qiita-image-store.s3.amazonaws.com/0/62860/7d00b7dd-9ee0-7043-b17e-9e80f3ceefd7.jpeg)

ただ、Substance PainterでAO込みでDiffuseに焼きつけた形で最終的なテクスチャをエクスポートするか、UnityなどでShaderでAOを乗算させるか、の選択があると思います。
ので、必要にあわせてAOをOn/Offにする（レイヤの左端のマルを選択して表示/非表示を切り替える）ようにしてみてください。
rails-erd gemの反則的使い方で不要なARクラスを整理する

時折、プロジェクトの止むに止まれぬ事情により、railsアプリ内に不要になったクラスやコードが残ってしまっているプロジェクトがあったり、そんなプロジェクトに遭遇したりする・・・

そんな時、rails-erd gemを使って少しでもコードとプロジェクトを健全な状態に近づけるようにしてみよう！

ちなみにrails-erd gemの本来の目的は、ActiveRecordを使っているクラスとそのassociationを使って、ER図を生成するためのgemだ。

rails-erdは、そのER図を生成する際、存在しないテーブルやassociationなどARクラスを精査してエラーを出力してくれる。

そのエラーを用いれば、逆説的に不要なARクラス、associationを簡易に把握でき整理することができる

ちなみに、エラーはこんな感じで出力される。

```
Warning: Ignoring invalid model KnownUser (table know_users does not exist)
Warning: Ignoring invalid model SlowLog (Unknown database 'mysql')
Warning: Ignoring invalid association :tokens on User (uninitialized constant User::Token)
```
Ruby の 定番対話ツール pry 徹底攻略 | Plugins #pry #ruby

# Ruby の 定番対話ツール pry 徹底攻略 | <i class="fa fa-puzzle-piece" style="font-size:1em;"></i> Plugins
## :musical_score: 概要
Ruby の 定番対話ツール pry 徹底攻略
Plugins

## <i class="fa fa-puzzle-piece" style="font-size:1em;"></i> Plugins
Pry は Plugin によって拡張可能です。
Plugin は非常にシンプルで、 Pry のセッション開始時に自動的に読み込まれるただの gem です。

利用可能な Plugin は [Available Plugins wiki](https://github.com/pry/pry/wiki/Available-plugins) にあります。

## :question: What is a plugin?
有効な Pry の Plugin は ` pry-` のプリフィックスを持つ。
例えば `pry-debugger` 。
また、 `lib` 直下に同名の rb ファイルが必要です。
pry-debugger の例なら `lib/pry-debugger.rb` 

Plugin によって提供される機能は、基本的に
[Customization](http://qiita.com/tbpgr/items/d3c9651ac9e35af8b377) と [command system](http://qiita.com/tbpgr/items/b778d4dd00b72abe72f5) からなる。

### :ant: 最小限のサンプル
三角形の面積を計算する Plugin として pry-triangle gem を作ったとします。
その場合、 lib/pry-triangle.rb は以下のようになります。

~~~ruby:lib/pry-triangle.rb
Pry::Commands.create_command "triangle" do
  description "calculate triangle area"

  def process(width, height)
    output.puts (width.to_i * height.to_i) / 2
  end
end
~~~

* Install

~~~bash
$ gem install pry-triangle
~~~

* 試行

~~~
% pry
[1] pry(main)> help triangle
calculate triangle area
    -h, --help      Show this message.
[2] pry(main)> triangle 2 4
4
~~~

## <i class="fa fa-gears" style="font-size:1em;"></i><i class="fa fa-refresh" style="font-size:1em;"></i> Loading and suppression (all plugins)
すべての Plugin を無効化します
pry-triangle ・ pry-toys はともに無効化されたことを確認します。

~~~bash
$ pry --no-plugins
[3] pry(main)> triangle 2 43
SyntaxError: unexpected tINTEGER, expecting end-of-input
[3] pry(main)> Array.toy(2, String)
NoMethodError: undefined method `toy' for Array:Class
from (pry):2:in `__pry__'
~~~

* .pryrc に以下の設定をしても同じです

~~~ruby
Pry.config.should_load_plugins = false
~~~

## <i class="fa fa-gear" style="font-size:1em;"></i><i class="fa fa-refresh" style="font-size:1em;"></i> Loading and suppression (per plugin)
任意の Plugin を無効化します。
pry-triangle のみ無効化し、 pry-toys は動作することを確認します。

~~~bash
% pry -d triangle
[1] pry(main)> triangle 2 4
SyntaxError: unexpected tINTEGER, expecting end-of-input
[1] pry(main)> Array.to
Array.to_enum  Array.to_s     Array.toy
[1] pry(main)> Array.toy(3, String)
=> ["aaaaaaaaa", "wwww", "xx"]
~~~

* .pryrc に以下の設定をしても同じです

~~~ruby
Pry.plugins["triangle"].disable!
~~~

## <i class="fa fa-files-o" style="font-size:1em;"></i> List installed plugins
インストールした Plugin のリストを確認

~~~bash
% pry --plugins
Installed Plugins:
--
byebug            Fast debugging with Pry.
doc               Provides YARD and extended documentation support for Pry
toys              Toy objects for Pry
triangle          test
~~~



## :man::woman: 親記事
<i class="fa fa-external-link-square" style="font-size:1em;"></i> [Ruby の 定番対話ツール pry 徹底攻略](http://qiita.com/tbpgr/items/12a60f2f9e3de61517b5)

## :books: 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [pry Wiki | Documentation browsing](https://github.com/pry/pry/wiki/Documentation-browsing)
preg_replaceでnullが返却される際の対処

# 概要

preg_replaceで一部(sとか)のパターン修飾子を使用しており、かつ処理する文字列の容量が大きいと
正規表現に間違いがないにも関わらずnullが返却されることがある

パターン修飾子参考：
http://php.net/manual/ja/reference.pcre.pattern.modifiers.php

# 対策

pcre.backtrack_limitの値を増やすと問題が解決できる。

http://php.net/manual/ja/pcre.configuration.php

```php
// デフォルト値は1000000
ini_set('pcre.backtrack_limit', 100000000);
```

# 疑問

 - 値を増やすことに対するデメリットが無ければもっと大きな値にしてもいいが、怖い
 - 一部のパターン修飾子しかこのパラメータは反応しないらしい…
     - 今回sしか確認できてない
state と status の違い

コンピュータの世界では、state と status はどちらも、状態を表します。

ステータスバー　StatusBar　現在の状態などを表示する帯状の部分
デザインパターン　Stateパターン　状態に応じて処理内容を切り替える

変数名などで state と status はどう使い分ければ良い？
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=46846&forum=3

state, status and condition : 状態と条件
http://lise-sophia.net/kktm/Essay/state_status_condition.htm

status : 状態を表す情報の入れ物(変数) 
state : 具体的な個別の状況（statusに入りうる状態の１つ）

私もそのような認識をしています。
Infragistics社のNetAdvantageのWinFormでEXCELをいじくる基本

個人的に2007年辺りから使っているInfragistics社のNetAdvantageシリーズでの件です。
使ってる人がいそうでいない、ネットで情報を探すのが結構大変な若干マイナーな物なんです。
が、ライセンスがめんどくさくないのと、価格が某社の物よりかなり安い、コントロール類何でも入り。
と言う事で個人には向いてるなぁと思いまして、気にいって使っております。

ただ先ほども書いたようにマイナーなため、ちょっと躓くと情報が無いのが玉に瑕。

今回はエクセル周りを触ってて躓いたので、「よし、今後はQiitaに書いていこう」とブログみたいに思った訳です。

エクセルを開いて、セルの高さを設定して、セルを結合して、罫線ひいて、値を入れて、保存するまでを簡単にやります。

`using Infragistics.Documents.Excel;`
を宣言しておいて下さい。

```
//エクセルを開く
Workbook wb;
string filename = @"c:\uriage.xlsx";
wb = Workbook.Load(filename);//ブック（まぁエクセルファイルの事だと思えば問題ないかな）を読込
Worksheet ws = wb.Worksheets[0];//シート宣言＆選択

//セルに値を入れる A1がRows:0 Cells:0になる
ws.Rows[1].Cells[2].Value = "C2";
//行の高さ
ws.Rows[row].Height = 330; // 330twip = 16.5pt

//マージ範囲がすでにマージ済みで無いかをチェックする
if (!ws.MergedCellsRegions.IsOverlappingWithMergedRegion(start_row, start_column, end_row, end_column))
{
  //含まれてないのでマージする
  ws.MergedCellsRegions.Add(start_row, start_column, end_row, end_column);
}

//指定の行・列のセルの周りを罫線（今回は[Thin:細線]）で囲む
ws.Rows[row].Cells[column].CellFormat.TopBorderStyle = CellBorderLineStyle.Thin;
ws.Rows[row].Cells[column].CellFormat.BottomBorderStyle = CellBorderLineStyle.Thin;
ws.Rows[row].Cells[column].CellFormat.LeftBorderStyle = CellBorderLineStyle.Thin;
ws.Rows[row].Cells[column].CellFormat.RightBorderStyle = CellBorderLineStyle.Thin;

//保存
string tmpfilename = "";
tmpfilename = @"c:\file_" + DateTime.Today.ToString("yyyyMMdd") + ".xlsx";
wb.Save(tmpfilename);
```

おおざっぱですがこんな感じですね。
ポイントと言うほどでは無いですが注意するのは、お客さんから受け取ったエクセルをテンプレートとして使うような場合が多いと思うんですが、その場合、結合（マージ）済みのセルがある事が多いと思います。
１ページ目は結合済みだけど、2ページ目は結合されてないというパターンです。
その場合は面倒でもセルの結合をプログラム側からやってあげる訳ですが、結合済みセルを含んでる部分をもう一度結合しようとすると問答無用で落ちてくれます。
ですので結合済みセルを含んでいないかをチェックしてから結合作業に入る必要がありました。

自分の覚えも兼ねるのでこれからもたまにはInfragisticsのNetAdvantageについて書いて行けたらと思います。
みんなの為のMySQLまとめ（１２）

参考
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/mysql_15.htm

###■多重判定

  ・Oracle と同じように case が使えるので非常に強力である。

>select key1,
  case
    when key1 = 'a001' then 'aaa'
    when key1 = 'b002' then 'bbb'
    when key1 = 'c003' then 'ccc'
    else 'xxx'
  end c1
  from testm
;
![kobito.1424161064.111206.png](https://qiita-image-store.s3.amazonaws.com/0/59354/dadd3129-d7bf-351d-cb8d-afbd1dcac28b.png "kobito.1424161064.111206.png")

>select key1,
  case key1
    when 'a001' then 'aaa'
    when 'b002' then 'bbb'
    when 'c003' then 'ccc'
    else 'xxx'
  end c1
  from testm
;

###■ヌル判定

  ・coalesce() 関数は、最初の null でないデータを返す。

>```
select coalesce(null, 'abc', 'def');
```
![kobito.1424161225.805742.png](https://qiita-image-store.s3.amazonaws.com/0/59354/95e9abe6-575d-1d04-7a2f-12e82e30182c.png "kobito.1424161225.805742.png")

■ヌル比較

  ・nullif() 関数は、等しければ null が、等しくなければデータ1 が返る。
    次の例は、null が返る。

>```
select nullif('abc', 'abc');
```
![kobito.1424161336.760713.png](https://qiita-image-store.s3.amazonaws.com/0/59354/cc567d4d-6e48-68fe-76a6-3603b183cbb5.png "kobito.1424161336.760713.png")

 ・次の例は、'abc' が返る。

>```
select nullif('abc', 'def') ;
```
![kobito.1424161369.223115.png](https://qiita-image-store.s3.amazonaws.com/0/59354/2e4829ca-25ae-387b-c48f-dce64932ce99.png "kobito.1424161369.223115.png")
iOS版metaio SDKを6.xに移行させる

# 概要
metaio SDKを使っているiOSアプリをXcode6/64bitに対応させる場合、metaio SDKは6.xに移行させなければならない。移行させるときに必要だったことメモ。

# プロジェクト設定変更
・metaioSDK.frameworkを入れ替える。
・MetaioLicenseStringを6.x用に変更する。
・Architectures / Valid Architecturesを armv7 arm64 に変更する。
・C++ Language Dialect は GNU+11に、C++ standard libraryはlibc++に変更する。（違う場合もあるかも）
・GLKit.frameworkは必須。他にもリンカが黙るまで必要なframework追加。

# ソースコード変更
## サンプル見て既存xib繋ぎ直し。xib持ってくるか、あるいは…
・MetaioSDKViewControllerはframework内に入っているのでそれを使う。
・自前EAGLViewから、GLKitView使用に変わっている。
・xib側でglkView、delegateを繋ぎ直す。
・closeButtonはなくなっちゃってるので必要ならプロパティ新設。

## さらに…
・m_metaioSDK は m_pMetaioSDKに変更。
・m_pMetaioSDK->getTrackingValues()で取得したTrackingValues配列はすべて反応したマーカーであったが、6.xの場合そのquality > 0であることも確認しないとだめ。
急にSFTP接続できなくなったら

# 目的
急にcodaからsftp接続できななった時の対処メモ

# 現象
ssh接続はできるけど、sftp接続しようとするとエラーとなって接続出来なくなったこと有りました。
sftpコマンド直接打ち込んでもダメだし、codaとか使用してもダメ。

# 原因
どうやら、.bashrc等の記述が悪さをしているよう。
[昔の投稿](http://qiita.com/y-sugasawa/items/261b47cc1a6a0f2a8392)で.bashrcに書いた記述が悪さをしていました。
なので、対話形式なのかどうかで、対話形式のときのみ処理をするように.bashrcを修正。

```lang:.bashrc
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

[ -z "$PS1" ] && return # 対話形式でなければ終了
source ~/.nvm/nvm.sh
nvm use 0
```
VBA便利関数まとめ


個人的によく使うもの、ありそうでない関数をまとめていきます。

## シート名取得

```vbnet
' アクティブブックの全シート名を取得し、配列で返します。
Public Function SheetNameCollect()

    Dim i As Long
    Dim SheetCnt As Long
    Dim SheetName() As String

    SheetCnt = ThisWorkbook.Sheets.Count

    ReDim SheetName(0 To SheetCnt - 1)

    For i = 0 To SheetCnt - 1
        SheetName(i) = Sheets(i + 1).Name
    Next i
    
    SheetNameCollect = SheetName

End Function

```

## セルの座標(レンジ)を取得
特定シート内の特定の文字列を持つセルのレンジを取得する。

```vbnet
' 引数：key -> 検索文字列
' 引数：SheetName -> 検索するシート名
' 引数：range -> 行や列のレンジ(ex. 1:1)

Public Function SearchRange(key, SheetName, range) As String
    Dim c As Object
    Dim myKey As String, fAddress As String
    
    fAddress = ""
    myKey = key
    With Worksheets(SheetName).range(range)
        Set c = .Find(What:=myKey, LookIn:=xlValues, lookat:=xlPart, _
                          SearchOrder:=xlByColumns, MatchByte:=False)
        If Not c Is Nothing Then
            fAddress = c.Address
        End If
    End With
    
    SearchRange = fAddress
    
End Function

```

## 配列
配列内の特定要素のインデックス番号を取得する。

```vbnet
' 引数：TargetArray -> 添え字を確認したい配列
' 引数：element -> 要素(文字列等)
' 戻り値：インデックス番号

Public Function IndexOf(TargetArray, element)
    For i = 0 To UBound(TargetArray)
        If TargetArray(i) = element Then Exit For
    Next
    IndexOf = i
End Function

```

配列の要素を削除する。

```vbnet
' 引数：TargetArray -> 対象の配列
' 引数：deleteIndex -> 削除したい要素のインデックス番号

Public Sub ArrayRemove(ByRef TargetArray As Variant, ByVal deleteIndex As Integer)
    Dim i As Integer

    '削除したい要素以降の要素を前につめて上書きコピー
    For i = deleteIndex To UBound(TargetArray) - 1
        TargetArray(i) = TargetArray(i + 1)
    Next i

    '最後の要素を削除する（配列を再定義）
    ReDim Preserve TargetArray(UBound(TargetArray) - 1)
        
End Sub

```

## アプリケーション起動
拡張子に紐付くアプリケーションを起動する。

```vbnet
' 引数：path -> 開きたいファイルのパス

Public Sub OpenFile(path)

    Dim WSH As Object
    
    Set WSH = CreateObject("Wscript.Shell")
    WSH.Run path, 3
    Set WSH = Nothing
    
End Sub

```

## TODO
参考にしたページのURLを載せる。ADODB関連も関数にして載せる。
[Angular.js]縦方向だけ自動リサイズしてくれるtextareaのdirective

Slackのようなチャットサービスに使われる、文字が増えると縦方向に自動リサイズしてくれるtextareaのdirective。

``` resizeTextarea.js
app.directive('resizeTextarea', function() {
  return {
    restrict: 'E',
    transclude: true,
    replace: true,
    template: "<textarea placeholder='入力してください'></textarea>",
    link: function(scope, element, attrs) {
      var HEIGHT = 25;
      var el = angular.element(element[0])
      el.css('lineHeight', HEIGHT + "px");
      el.css('height', HEIGHT + "px");

      var resize = function(e) {
        var textHeight = e.target.scrollHeight;
        var height = ~~(textHeight / HEIGHT) * HEIGHT
        el.css('height', height + "px");
      };
      el.on('input', resize);
    }
  }
});
```

## 使い方
repalceをtrueにしているので以下のように書くと自動でtextareaに置換してくれる。

``` index.html
<div>
    <resize-textarea></resize-textarea>
</div>
VagrantインスタンスにSSHでログインする

Vagrantにログインする場合`$ vagrant ssh`を利用するのですが、普通のSSHを利用してサーバーのプロビジョンを他のツールに任せたい場合があります。

Vagrantの構築に関しては [Vagrantで開発環境を手軽に構築し壊す](http://qiita.com/y_arakawa/items/08ef7a4568ef1545313d) を参照してください。

普通のsshコマンドを利用してログインするための設定をしたのでメモ。

## 前提条件

* VagrantfileでIPアドレスが 192.168.33.10に設定しているとします。
* 実行環境はMac OS X 10.10.2
* vagrant boxはCentOS6.5

Vagrantfileを一部抜粋

```
Vagrant.configure(2) do |config|
  config.vm.box = "centos65"
  config.vm.network "private_network", ip: "192.168.33.10"
```

## 接続情報を表示する

秘密鍵の場所、ポート、ユーザなどSSH接続に必要な情報は`$ vagrant ssh-config`コマンドを発行すると表示されます。

```
$ vagrant ssh-config
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/xxxx/.vagrant/machines/default/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL
```

このポート番号やら秘密鍵を指定して接続も可能ですが、それも面倒なので~/.ssh/configに記述してしまいます。

    $ vagrant ssh-config --host 192.168.33.10 >> ~/.ssh/config

~~`$ vagrant ssh-config`で表示された情報の中の、Host defaultの部分を設定したIPアドレス`192.168.33.10`に書き換えます。~~

→　`$ vagrant ssh-config --host 192.168.33.10`とすればよかった。。

```
$ vim ~/.ssh/config
Host 192.168.33.10
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/xxxx/.vagrant/machines/default/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL
```

接続をためしてみます。

```
$ ssh 192.168.33.10
Last login: Tue Feb 17 04:08:54 2015 from 10.0.2.2
[vagrant@vagrant-centos65 ~]$
```

というわけで、接続がうまくいきました。^^
Android Studio で Unit Test 

Android Studioでプロジェクトを作ると、
androidTestが自動的に生成されるので、
Android Studio で Unit Testを試してみました。


##準備

```java
public class Sample {
//めっちゃ適当ですみません。
    public boolean isTest(){
        return true;
    }
    public boolean isNotTest(){
        return false;
    }

}
```
alt + enterで、
![ss1.png](https://qiita-image-store.s3.amazonaws.com/0/35343/0b336583-af75-2f53-47c5-d0cc675bb4fd.png)

Create Testメニューを実行すると、
このようなダイアログが表示されまして、

![ss2.jpg](https://qiita-image-store.s3.amazonaws.com/0/35343/4116f0ac-a270-11c6-2715-13b9a85c25b0.jpeg)

必要に応じて、setUp/tearDownにチェックを入れます。

またすでに実装されているメソッドの一覧が表示され、
チェックを入れると、自動的にtest用メソッドが追加されます。

OKを押し進めると、

![ss3.png](https://qiita-image-store.s3.amazonaws.com/0/35343/a7408cb4-74ce-da7e-35a0-23dfb8b535cc.png)

Test用クラスが生成されます。


##Test実行

メニューの
Run → Edit Configurations..
から
![ss4.jpg](https://qiita-image-store.s3.amazonaws.com/0/35343/7b14b1bc-097b-2d73-d702-5da1122125ee.jpeg)

+ボタンを押し、
![ss5.jpg](https://qiita-image-store.s3.amazonaws.com/0/35343/cf7f484d-1695-a11b-916c-24fc8a84e47c.jpeg)

Android Tests
を選択

初期状態は、 Module が no moduleになっているので、
所定のものを指定。(今回でしたら、app)

![ss6.jpg](https://qiita-image-store.s3.amazonaws.com/0/35343/b362405e-045b-dd88-4b96-925d9aff9dce.jpeg)

Testを実行したい場合は、
ツールバーにて先ほど作成して、Android Testsを指定し、
![ss7.jpg](https://qiita-image-store.s3.amazonaws.com/0/35343/f3ad1456-9128-7903-a836-f49f3f454bfb.jpeg)

実行。

##結果

仮にSampleTestに以下のようなコードを書いた場合

```java

    public void testIsTest() throws Exception {
        Sample sample = new Sample();
        //成功
        assertEquals(sample.isTest(),true);
    }

    public void testIsNotTest() throws Exception {
        Sample sample = new Sample();
        //成功
        assertEquals(sample.isNotTest(),false);
    }

```

とすると、Testとして成功なので、
![ss8.png](https://qiita-image-store.s3.amazonaws.com/0/35343/18e11b80-68aa-7d7c-e4ac-b547262451ea.png)
のような表示となります。

ただ、


```java

    public void testIsTest() throws Exception {
        Sample sample = new Sample();
        //成功
        assertEquals(sample.isTest(),true);
    }

    public void testIsNotTest() throws Exception {
        Sample sample = new Sample();
        //失敗
        assertEquals(sample.isNotTest(),true);
    }

```

仮に失敗した場合は
こんな感じで、
![ ss9.png](https://qiita-image-store.s3.amazonaws.com/0/35343/1b5f2d13-8f9c-5a74-83ee-141d67c577a8.png)

ログも出ます。


ActivityTestCaseなどもあるようなので、
そのあたりはまた試してみて追記するかもしれません(すみません。
django-s3-storageを使う


python3対応のためdjango-storagesのalternativeを探していたら[django-s3-storage](https://github.com/etianen/django-s3-storage)を見つけた。S3の認証周りでやや困ったのでメモ。

INSTALLED_APPSに`django_s3_storage`を追加する。

```python
INSTALLED_APPS += (
    'django_s3_storage',
)
```

AWS周りの設定。

```python
# AWSリージョンの指定。us-east-1以外で動くかは試してない。
AWS_REGION = "us-east-1"

# AWS IAM ACCESS KEY
AWS_ACCESS_KEY_ID = ""

# AWS IAM SECRET ACCESS KEY
AWS_SECRET_ACCESS_KEY = ""

# ユーザアップロード用のS3バケット名（mediaに相当するもの）
AWS_S3_BUCKET_NAME = ""

# 静的ファイル用のS3バケット名
AWS_S3_BUCKET_NAME_STATIC = ""
```

settings.pyのDEFAULT_FILE_STORAGEを定義する。認証が必要な場合、そうでない場合でストレージクラスを使い分ける。

```python
# 認証有りのS3ストレージクラス
DEFAULT_FILE_STORAGE = 'django_s3_storage.storage.S3Storage'

# 認証なしのS3ストレージクラス。本来はSTATICFILE_STORAGE用っぽい？
# DEFAULT_FILE_STORAGE = 'django_s3_storage.storage.StaticS3Storage'
```

----

[django-storages](https://bitbucket.org/david/django-storages/)と違うところ。

* Python3 compatible!!!!!!!!!!
* メディア用バケット、静的ファイル用バケットが分けられる
* S3に対する認証つきアクセスが可能
ReTextを使ってreStructuredTextで書いたときタイトルとサブタイトルが入らない

ReTextを使ってreStructuredTextで書いたときレンダリング結果にタイトルとサブタイトルが入らない。

ReText-3.X までは wpgen を修正する。

```diff
diff -u wpgen/wpgen.py wpgen/wpgen.py
--- wpgen/wpgen.py     2012-04-22 23:52:07.000000000 +0900
+++ wpgen/wpgen.py     2012-04-27 22:00:58.000000000 +0900
@@ -108,7 +109,8 @@
                     pass
           elif ext in (".rst", ".rest") and use_docutils:
                parts = publish_parts(text, writer_name='html')
-               html = parts['body']
+               #html = parts['body']
+               html = parts['html_body']
                if parts['title']:
                     pagename = parts['title']
           elif ext in (".htm", ".html") and bn != "template":
```

ReText-4.0 以降は、Markups を使うようになったので、HTML の body の取り出し方を変えるには、ReText ではなく Markups の方を変更する必要がある。もしかすると変更による副作用があるかもしれない。

```diff
--- markups/restructuredtext.py-	2014-07-23 19:32:40.000000000 +0900
+++ markups/restructuredtext.py	2015-02-17 21:53:02.000000000 +0900
@@ -53,7 +53,8 @@
 		return self.publish_parts(text)['title']
 
 	def get_document_body(self, text):
-		return self.publish_parts(text)['body']
+		#return self.publish_parts(text)['body']
+		return self.publish_parts(text)['html_body']
 
 	def get_stylesheet(self, text=''):
 		origstyle = self.publish_parts(text)['stylesheet']
```
【jQuery】DOM要素の生成


```js:DOM要素の生成
$("<a>")
$("<a></a>")
$("<img>")
$("<img />")
 
// しかし本家サイトでは、互換性の為、中身を取るタグについては、
// 終了タグを付けることを推奨している。
// 中身を取らないタグはどちらでも、OKとしている。
$("<a></a>")
$("<img>")
$("<img />")
```

第2引数にオブジェクトを指定すると、そのオブジェクトのプロパティは、HTMLの属性として設定される。
classは予約語のためダブルコートで囲む。

```js:HTMLの属性も設定
$("<a></a>", {
  href: "abc.html",
  target: "_blank",
  "class": "myClass"
});
```

1.8からはjQueryメソッドを指定することができるらしい。これは便利！

```js:1.8からはjQueryメソッドも設定できる
$("<div></div>", {
  width: 100,
  height: 100,
  css: {border: "5px solid gray"},
  addClass: "my-div",
  on: {
    click: function(event) {
      // イベント設定
    }
  }
});
```

参考：[jQuery入門道場](http://jquery-master.net/basic/#make_dom_detail)
ニフティクラウドmobile backendを利用するときの注意点

ニフティクラウドmobile backendを利用すると、簡単にPush通知などを実装することができます。

Push通知の実装方法については、@yokoyamaさんが記事にしていますので[そちら](http://qiita.com/yokoyama/items/bccb65119fe9c8dba6bb)を。

## ハマったこと

Push通知の実装は簡単にできたのですが、アプリをインストールし直して以降、下記のようなエラーが発生しました。

> com.nifty.cloud.mb.NCMBException: {"code":"E409001","error":"Duplication Error"}

この状態でもPush通知を受け取ることができるのですが、端末の情報をうまく登録できていないらしく、端末のobjectIdを取得するとnullが返ってくるようになりました。


## 原因

mobile backendの[mBaaSのはまりやすいポイント徹底解説より「インスタレーション編」](http://blog.mb.cloud.nifty.com/?p=1878)に、この問題について解説がありました。

> objectIdはユニークですが、同時にデバイストークンについてもユニークなIDとなっています。各デバイスについてデータが登録済みであるかどうかはデバイストークンを使っています。そのため端末のキャッシュやデータを削除するだけでなく、管理画面からもデータを削除する必要があります。
> 前述の通りデバイストークンはユニークになっています。そのため重複して登録しようとするとE409001を返却します。

アプリをインストールし直した場合に、同じデバイストークンを登録しようとしてしまうために発生していたようです。

## 対応方法

mobile backendの[mBaaSのはまりやすいポイント徹底解説より「インスタレーション編」](http://blog.mb.cloud.nifty.com/?p=1878)にあるように、下記の処理を実装することで対応できます。

> 1. E409001が発生したらNCMBQueryを使ってサーバ側から同一デバイストークンを持つオブジェクトを検索します。
> 2. 取得したオブジェクトのobjectIdをcurrentInstallationに設定してfetchします。

Androidの実装例は下記のようになります。([アプリの再インストールを考慮した端末情報の登録](http://mb.cloud.nifty.com/doc/sdkguide/android/push.html#%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E5%86%8D%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%92%E8%80%83%E6%85%AE%E3%81%97%E3%81%9F%E7%AB%AF%E6%9C%AB%E6%83%85%E5%A0%B1%E3%81%AE%E7%99%BB%E9%8C%B2)より)

```java
final NCMBInstallation installation = NCMBInstallation.getCurrentInstallation();
installation.getRegistrationIdInBackground("SENDER_ID", new RegistrationCallback(){
    @Override
    public void done(NCMBException e) {
        if (e == null) {
            try {
                installation.save();
            } catch(NCMBException le) {
                if (NCMBException.DUPLICATE_VALUE.equals(le.getCode()))
                    // レジストレーションIDの重複エラー
                    // ユーザーによるローカルデータ削除や、アプリ再インストールがされた場合に発生。
                    // 以下、クラウド側に既登録の情報からローカルデータを復旧する処理。
                    NCMBQuery<NCMBInstallation> query = NCMBInstallation.getQuery();
                    query.whereEqualTo("deviceToken", installation.get("deviceToken"));
                    try {
                        NCMBInstallation prevInstallation = query.getFirst();
                        String objectId = prevInstallation.getObjectId();
                        installation.setObjectId(objectId);
                        installation.save();
                    } catch(NCMBException le2) {
                        le2.printStackTrace();
                    }
                } else {
                    le.printStackTrace();
                }
            }
        } else {
            e.printStackTrace();
        }
    }
});
```


以上で、無事に端末を登録でき、objectIdを取得できるようになりました。
【javascript,jQuery】イテレーションまとめ

※あまり整理できてないのでこんなのあるよってあれば教えてほしい。

#jQueryのループ

## $(”セレクタ”).each(callback)
各オブジェクトに対して処理を行う。
**jQueryオブジェクトに対してはこれがおすすめ。**

コールバック関数が false を戻すと、ループ処理を停止する。
コールバック関数が true を戻すと、以降の処理をスキップし、次のループを実行する。

###パラメータ
* callback(index,dom)

各オブジェクトに対する処理を記述する。
index：0始まりのインデックス
dom：対象のdom。コンテキスト内のthisと同じ。jQueryオブジェクトではないので、$()することでjQueryオブジェクトとして扱える。

###例

```js
$("li").each(function(index, dom){
  $(dom).toggleClass("example").text("index-" + index);

  //第二引数とthisは同じ。つまり、以下は上記と同じ。
  $(this).toggleClass("example").text("index-" + index);
});
```

参考：[each(callback)](http://stacktrace.jp/jquery/api/core/each.html)

## $.each(collection, callback)
**オブジェクトもしくは配列の、汎用のイテレータ。**
もちろんjQueryオブジェクトに対しても処理できる。

コールバック関数が false を戻すと、イテレーション処理を停止する。
コールバック関数が true を戻すと、以降の処理をスキップし、次のイテレーションを実行する。

###パラメータ
* collection

イテレーション対象の配列、もしくはオブジェクトを設定する。

* callback(index,value)

各オブジェクトに対する処理を記述する。
対象が配列もしくはオブジェクトの場合は以下になる。
index：キー
value：値

対象がjQueryオブジェクトの場合は以下になる。
index：0始まりのインデックス
dom：対象のDOM。コンテキスト内のthisと同じ。$()することでjQueryオブジェクトとして扱える。

###例
```
$.each(["item1","item2","item3","item4","item5"], function(index, value){
    $("#test1_result").append(index + ":" + value).append("<br />");
})
```

参考：[jQuery.each(collection, callback)](http://stacktrace.jp/jquery/api/utilities/jquery.each.html)


#javascriptのループ

##for...in

```js
myObj = {hoge:'hoge',huga:'huga'};

for(var key in myObj) {
  //key
  console.log(key);
  //value
  console.log(myObj[key]);
}
```

###注意点

* プロトタイプ継承している場合
プロトタイプチェーンまで取れてしまうので、設定している場合はチェック処理を入れる。

```js
//プロトタイプチェーンかのチェック
if (myObj.hasOwnProperty(key)) {
  
}
```

* 列挙の順序は保障されない。
多くの場合は、順序通りになるけど、保障されるものではないのでこの順序に依存した処理はダメらしい。

* 列挙されないプロパティがある
配列オブジェクトのlengthなど。
データの可視化「擬似カラー」

さて今回は擬似カラーについて記事を書こうと思う。
記事を書くというよりプログラムを載せるかな

#擬似カラー
擬似カラーとはデータを可視化する際に、数値の変わりに
色でデータを表現することで、データの特徴を分かりやすく把握することができる大変便利な物である。

文章で説明するより見てもらったほうが分かりやすいと思うから一応図を
![擬似カラー.png](https://qiita-image-store.s3.amazonaws.com/0/63344/3909c70d-9067-2bbe-8e58-25c1d4be50fa.png)

これが擬似カラーであらわしたアヒルの図となる。
今回はZ値が大きいほど(右)青い色で、Z値が小さい(左)ほど赤になるように設定している。

##実装する擬似カラー

今回実装する擬似カラーはいつもお世話になっている
画像ソリューションさんのページに記載されている擬似カラーである。


>http://imagingsolution.blog107.fc2.com/blog-entry-171.html

このページの上から2つ目のグラフの擬似カラーですね。

##プログラム
プログラムは下記参照で
あんまり複雑な処理は行っていないので、各自見て理解していただきたい。
SetPseudoColorであらかじめ値を設定しておいて、その値をGetPseudoColorで取得
してもらえれば使うことができる。
ちなみにここで扱っているVector3クラスはOpenTKクラスのものです。


``` PseudoColorProgram

public static Vector3[] RGB = new Vector3[256];

private void SetPseudoColor()
{
　　　　　　　float scale = 4;
            for (int i = 0; i < 256; i++)
            {
                if (i <= 63)
                {
                    RGB[i].X = 0 / 255.0f;
                    RGB[i].Y = scale * i / 255.0f;
                    RGB[i].Z = 255 / 255.0f;
                    continue;
                }
                if (i <= 127)
                {
                    RGB[i].X = 0 / 255.0f;
                    RGB[i].Y = 255 / 255.0f;
                    RGB[i].Z = (255 - (scale * (i - 64))) / 255.0f;
                    continue;
                }
                if (i <= 191)
                {
                    RGB[i].X = (scale * (i - 127)) / 255.0f;
                    RGB[i].Y = 255 / 255.0f;
                    RGB[i].Z = 0 / 255.0f;
                    continue;
                }
                if (i <= 255)
                {
                    RGB[i].X = 255 / 255.0f;
                    RGB[i].Y = (255 - (scale * (i - 192))) / 255.0f;
                    RGB[i].Z = 0 / 255.0f;
                    continue;
                }
            }
}

public static Vector3 GetPseudoColor(float value,float min,float max)
{
            if(max < value)
            {
                return RGB[255];
            }
            if (min > value)
            {
                return RGB[0];
            }
            float length = max - min;
            float scale = 255 * (value - min) / length;
            return RGB[(int)scale];
}
```

##注意点

今回のGetPseudoColor関数では、線形に値を取得するようになってます。
そのため、値が

>例：[0,1,2,3,4,5,100,200,100000];

といいうように最大値だけが異常に大きい、または最小値だけが異常に小さいとなった
場合、色が偏ってしまいます。
上の例の場合、1点だけ真っ赤、それ以外は真っ青というような感じです。
これでは擬似カラーを使っても何の意味もないです。

こういうのを回避するために、非線形で色値を取得するようにしてみたり、
例外処理を加えてみる等してGetPseudoColor関数を自分のデータにあわせた関数に変更してください。
jade に lodashまたは Underscore.js の _.template を記述する方法

* `jade` タグ以外から始まる場合はプレーンテキストとして扱う。
* プレーンテキストの内側に `jade` のタグを入れない。
* 属性の値に入れる場合はエスケープさせないように `!=` を使う。

## 記述例
```jade
script(type="text/template")
  | <% _.each(data, function(v) { %>
  p(class!="<%= v.class %>") <%= v.name %>
  p <%= v.age %>
  | <% }); %>
```

## 注意点
* タグ名や属性名には使えない。（部分的にプレーンテキストにして、通常のHTMLタグを入れれば対応は可能）
* コンパイル後の記述が少し汚い。
* `JS` 文の箇所にインデントが入れられないので、少し見づらい。
半年くらいWindowsで開発してみて、使い続けたツールと使うのをやめたツール


半年くらい前に [半年くらいずっとMacで開発してたエンジニアが、Windowsを使ってアプリの開発をすることになったときにした環境整備](http://qiita.com/kikuchy/items/091329db98db07ddad25) という記事を書きました。
それ以降もちゃんと使い続けたツールと、使うのをやめてしまったツール（代わりに新しく導入したツール）をまとめておきます。


# 環境

* Windows 7
* アプリの開発は主にVisualStudioで行う
* バージョン管理はgit


# <del>劇的</del>ビフォーアフター

## 半年前に使い始めたもの

* MacType (フォントをぼかす)
* KeySwap (キーコンフィグ)
* AutoHotKey (ホットキー設定)
* Chocolatey (パッケージ管理ツール)
* bash (シェル)
* mintty (ターミナルエミュレータ)
* Vim (Vim)
* Clover (タブ付きExplorer)
* launchy (ランチャー)

## 今使っているもの

* MacType (フォントをぼかす)
* KeySwap (キーコンフィグ)
* AutoHotKey (ホットキー設定)
* Console2 (ターミナルエミュレータ)
* NYAGOS (シェル)
* Vim (Vim)
* Clover (タブ付きExplorer)
* launchy (ランチャー)

## 別のものに乗り換えたもの

| Before | After |
|:-------|:------|
| bash | NYAGOS |
| mintty | Console2 |

ターミナル系です。
mingwに付いてくるbashも良かったのですが、やっぱりWindowsのパスなどと相性が良くなかったです。

### シェル
ターミナルを使う一番の理由はgitを使うためでした。
[SourceTree](https://www.atlassian.com/ja/software/sourcetree/overview)とかGUIのgit端末は何をしでかしてくれるかわからないので、コマンドラインから叩きたいのです。

一時期はWindows用のgithubクライアントに付属している[posh-git](http://dahlbyk.github.io/posh-git/) + Powershellを使っていたころもあったのですが、PowerShellもposh-gitも重すぎるので使うのをやめました。

[NYAGOS](http://www.nyaos.org/) はUnix系シェルの操作感を残しつつも、きっちりWindowsに対応してくれている部分が気に入ったので使っています。
動作も軽いので、あとは[git completion](https://github.com/git/git/blob/master/contrib/completion/git-completion.bash)みたいなものがあれば完璧。

### ターミナルエミュレータ
プロジェクトでは用途に分けたいくつかのリポジトリを管理する必要が出てきたので、ターミナルを複数窓開くことが多くなったとき。
minttyはタブとか無く、ウィンドウが散らばってしまったため、タブが使えるConsole2に乗り換えることにしました。

[Console2](http://sourceforge.net/projects/console/)は複数のシェルを扱うこともできるので、PowerShellも扱えるようにしてあります。

日本語のIMEに対応していないとのことなので、以下のページを参考にパッチをあてました。

* [windowsのコマンドプロンプトだって、おしゃれに設定したら愛せる気が…しなかったのでConsole2×Nyaosで愛されターミナルを構築する](http://tenten0213.hatenablog.com/entry/2013/10/01/010808)


## 使うのをやめたもの

* Chocolatey

CLI系のツールを入れても自動でPATH通してくれないし（各パッケージのインストーラーが対応していれば別）、
Chocolateyで入るものは大抵アンインストーラーが付いてくるので、
わざわざChocolateyで管理する意義が見つからなかったため使うのを止めました。

# 現状で使いやすいか？

だいぶストレスは軽減されましたが、細かいところで改善したいところはあります。

* NYAGOSでgit completionを実現
* 普段使いのMacに合わせたホットキースクリプト（特にボリューム操作とか）

どちらも自分で作れば良いんですけれど、なかなか手が回らなくてですね…
Non HTTP stuff on Elastic Beanstalk


No, aws doesn't expose port when running docker. But it uses port information from the container to create an upstream on nginx config.

```shell:/etc/nginx/conf.d/elasticbeanstalk-nginx-docker-upstream.conf 
upstream docker {
	server 172.17.0.33:24224;
	keepalive 256;
}
```

Then another file to do reverse-proxy

```shell:/etc/nginx/sites-enabled/elasticbeanstalk-nginx-docker-proxy.conf 
map $http_upgrade $connection_upgrade {
	default		"upgrade";
	""			"";
}

server {
	listen 24224;

	location / {
		proxy_pass			http://docker;
		proxy_http_version	1.1;

		proxy_set_header	Connection			$connection_upgrade;
		proxy_set_header	Upgrade				$http_upgrade;
		proxy_set_header	Host				$host;
		proxy_set_header	X-Real-IP			$remote_addr;
		proxy_set_header	X-Forwarded-For		$proxy_add_x_forwarded_for;
	}
}
```

I think we need to remove ```http``` from that ```proxy_pass``` line.

I'll post an update when it works.

PS:
Let me know if trying to run fluentd on EB is not a futile effort.

**Update:**
I managed to make it [works](http://qiita.com/neofreko/items/2cca6951c9a6cfd92245)!
【Raspberry PI & Garmin GLO】ラズパイに Bluetooth GPSを接続するまで

# 使用機材
**Raspberry PI B+**
**raspbian**: raspberrypi 3.18.7+ #755 PREEMPT Thu Feb 12 17:14:31 GMT 2015
**Garmin GLO**: Bluetooth GPSレシーバ
Bluetoothドングル: Elecom-Logitec **LBT-UAN04C1** (Linuxだと定評あるCSR社チップセット)

# 準備
モジュール類を導入しましょう
```
apt-get install bluez bluez-utils
```

python ver.2でのコーディングをする向きには apt-get install python-bluez も忘れずに

# コマンドラインでのGarmin GLO接続テスト
**(1) hcitool scan**
Garmin GLO をスキャンします。12:34:56:78:90:AB みたいなアドレスが表示されるはず。
**(2) ポート接続**
```
sudo rfcomm bind /dev/rfcomm1 12:34:56:78:90:AB 1
```
これで、Garmin GLO のVirtual COMポートが、/dev/rfcomm1として作成されます。ですが、GLOのbluetooth状態LEDは、ゆっくりとした点滅のままです。(ペアリングされた状態ではありません)
**(3) ポートからのデータ吸出し**
お手軽は方法としては
```
cat < /dev/rfcomm1
```
です。これを実行すると遅れてGLOのbluetooth状態LEDが点灯した状態（すなわちペアリング状態)となり、コンソールにNMEA出力が表示されます。終了時はctrl-cで抜けてください。

もしくは、
```
dd if=/dev/rfcomm1 of= ...
```
もOKです。

# Python (ver.2)
python ver.2では、PyBluezを使用します。
```
sudo apt-get install python-bluez
```
で導入しましょう。

```py
import bluetooth

bd_addr = "12:34:56:78:90:AB"
port = 1

sock=bluetooth.BluetoothSocket(bluetooth.RFCOMM)
sock.connect((bd_addr, port))
data=sock.recv(1024)

sock.close()
print data
```

この場合、sock.recv()の返す data は、str型となります。

# Python3
python3では、標準のsocketモジュールを使用します。

```py3
import socket

bd_addr = "12:34:56:78:90:AB"
port = 1

sock = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM)
sock.connect((bd_addr, port))
data = sock.recv(1024)

sock.close()

dataReadable = data.decode('utf-8')
print(dataReadable)
```
この場合、sock.recv()の返す data は、bytes型となります。ですので、decode()にてstrへ変換しましょう。
EC2上でのTCP Segmentation OffloadのOff



って、Xen環境の話みたいなんで、EC2だけじゃないと思うけど。

負荷試験時に、

    [280922.592104] xen_netfront: xennet: skb rides the rocket: 19 slots

この様なメッセージがでていてパケットがDropされている場合。

    ethtool -K eth0 tso off

でTSOを無効にした所Dropしなくなった。

http://craftycode.co.za/2014/06/27/dropped-tcp-packets-ec2-xen/

この辺を見る限り、Xen側のドライバの問題の模様。
NIC側のOffloadが使えなくなったのでその分遅くなるかもしれないが、ベンチマーク上の処理件数には明確な違いはないのでいいかという感じ、というかバグが治るまではこれで行くしかなさそうかな。
[CakePHP 2.x]Model,View,Controllerで共通する処理

Model, View, Controllerで共通する処理を下記ブログを参考にVendorに作成。

* http://d.hatena.ne.jp/daffy/20090922
* http://blog.bs-factory.jp/2014/04/cakephp.html

Vendorではファイル名に小文字を使うように記載があったので小文字にする。

* http://book.cakephp.org/2.0/ja/core-utility-libraries/app.html

---

共通処理をVendor配下に作成。
`app/Vendor/util/mylib.php`

```php
namespace Util;

class Mylib {
    public function process() {
        /** 処理 */
    }
}
```

---
* 利用したい箇所の頭に「`App::import('Vendor', 'util/mylib');`」を追加。
* 利用したい箇所で利用する。

---

Controllerで利用。
`app/Controller/SampleController.php`

```php
App::uses('AppController', 'Controller');
App::import('Vendor', 'util/mylib');

class SampleController extends AppController {
    public function index() {
        $mylib = new Util\Mylib();
        $mylib->process();
    }
}
```

---

Taskで利用。
`app/Console/Command/Task/SampleTask.php`

```php
App::import('Vendor', 'util/mylib');

class SampleTask extends Shell {
    public function execute() {
        $mylib = new Util\Mylib();
        $mylib->process();
    }
}
```
---

Helperで利用。
`app/View/Helper/SampleHelper.php`

```php
App::uses('AppHelper', 'View/Helper');
App::import('Vendor', 'util/mylib');

class SampleHelper extends AppHelper {
    public function process() {
        $mylib = new Util\Mylib();
        $mylib->process();
    }
}
```

---
EC2（Amazon Linux）で起動時に自動実行するスクリプト

AWS EC2（Amazon Linux）で起動時に特定のスクリプトと自動実行する方法です。
毎回調べることになるので、関連ページをまとめておきました

# init.dにスクリプト設置 → chkconfig --add
* http://makisuke.seesaa.net/article/6066867.html
* http://anton0825.hatenablog.com/entry/20130515/1372116359
* http://dev.classmethod.jp/cloud/ec2shell/

## 注意
rootユーザー実行なので、sudoを利用しないこと

# User Data を利用する場合
* http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/user-data.html
* http://understeer.hatenablog.com/entry/2012/07/19/123050