OmniAICreator/Qiita-1.07M huggingface dataset:
Ansibleで基本認証IDの登録・削除をする

AnsibleでApacheの基本認証IDの登録・削除をやってみました。

![gf01a201503241900_Fotor.jpg](https://qiita-image-store.s3.amazonaws.com/0/32789/900dcb40-7d72-8dfc-d195-abea7c68a6cb.jpeg)

# 前提
- Pythonのpasslibを事前にインストールしておきます

```shell-session
% sudo easy_install pip
% sudo pip install passlib
```

# playbook例
## 登録playbook
```yaml:adminadd.yml
---
- hosts:
  - admin.local
  - dev-admin.local
  sudo: true
  vars: 
    name: foo
    password: bar
  tasks:
    - name: add a admin user
      htpasswd: path=/etc/httpd/conf/passwordfile name={{name}} password={{password}} create=no state=present
```

- `hosts`は複数あれば`-`でホスト名を列挙します
- `name`に追加するIDを記載
- `password`に平文でパスワードを記載する
- `path`に基本認証を書き込みファイル名を指定
- `create`を`yes`にすると新規にファイルを作ってくれます
- `state`を`present`とすると「登録」となります

## 削除playbook
```yaml:admindel.yml
---
- hosts:
  - admin.local
  - dev-admin.local
  sudo: true
  vars: 
    name: each
  tasks:
    - name: add a delete user
      htpasswd: path=/etc/httpd/conf/passwordfile name={{name}} state=absent
```

- `state`を`absent`とすると削除されます


# 実行例
## 追加
```shell-session
% ansible-playbook --check adminadd.yml -K
% ansbile-playbook adminadd.yml -K
```

- `--check`で記述に誤りがないか事前チェックをします
- `-K`でsudoパスワード付きで実行できます


## 削除
```shell-session
% ansible-playbook --check admindel.yml -K
% ansbile-playbook admindel.yml -K
```

# 参考
- [Ansibleの基本認証モジュールのドキュメント](http://docs.ansible.com/htpasswd_module.html)


# おまけ
株式会社スピカでは一緒に開発してくれる[仲間募集中](https://www.wantedly.com/companies/spika/projects)です！
■iTween Visual EditorによるiTweenEvent・iTweenPathの使い方（メモ）

●AssetStoreからiTween Visual Editorをインポート
　作者ページ：
　(https://dkoontz.wordpress.com/itween-visual-editor/)
●Examplesフォルダの下のPath Testシーンをまねる。


*******

#1:iTweenエディタの使い方
1.適当に新しいシーンを作る
2.Cubeを作成し、iTweenEventをアタッチする。
3.各パラメーターが設定できるようになる。
4.ただしパラメーターの数は**Event Type**によって異なるので注意すること。

![iTweenEventの使い方.png](https://qiita-image-store.s3.amazonaws.com/0/17904/27329934-fe87-bbfd-7cb3-e1920caf1316.png)

#2:Pathの使用
1.上記**[iTweenエディタの使い方]**で**path**のチェックボックスにチェックを入れた場合、**iTweenPath**を使用することができる。
2.**iTweenPath**側で**PathName**に任意の名前を入れて、**NodeCount(Max10)**を設定して経路の座標(x,y,z)を入力する。
3.上記**[iTweenエディタの使い方]**で**path**を選択し、2.で入力した名前を選択して実行すると**iTweenPath**の
　経路上を**iTweenEvent**で設定したパラメータに基づいてアニメーションする。

![iTweenPathの使い方.png](https://qiita-image-store.s3.amazonaws.com/0/17904/1d5f8a67-479b-f412-9fad-32f0639ea741.png)

#3:スクリプト側からの設定
１．イベントタイプによって設定できるパラメータが違うので、
　　自分の設定したイベントタイプの**EventParamMappings**の配列を取得
　　イベントタイプに関しては　**public enum TweenType{}**を参照すること
　　・EventParamMappings.mappings[イベントタイプ]

2.イベントのパラメーター配列から自分の設定したいキー名の方情報を取得
　System.Type valueType = mappings["speed"];

3.object型の変数に設定値をセットして、適切な方に変換する。
　object speed = Convert.ChangeType(setValue, valueType);

4.iTweenEvent.ValuesにはUnityエディター上でチェックボックスがついていた項目がディクショナリーとして
　追加されている。
　なので、すでに設定済みの項目を変更するのであればSet関数がないのでiTweenEvent.Valuesから
　指定キーのデータをremoveしてからAddする必要がある。
    if (_tweenEvent.Values.ContainsKey("speed")){
        // エディター上でチェック済みのパラメーター
        _tweenEvent.Values.Remove("speed");
    }
    // エディター上でチェック済みのパラメーターではない
    _tweenEvent.Values.Add("speed", speed);


```lang:filename
    _tweenEvent = gameObject.GetComponent<iTweenEvent>();

    // EventTypeからEventParamMappingsのキーマップ配列を取得、これには各パラメータ型情報が入っている
    var mappings = EventParamMappings.mappings[_tweenEvent.type];
    System.Type valueType = mappings["speed"];

    object setValue = 10;
    object speed = Convert.ChangeType(setValue, valueType);

    if (_tweenEvent.Values.ContainsKey("speed")){
        // エディター上でチェック済みのパラメーター
        _tweenEvent.Values.Remove("speed");
    }
    // エディター上でチェック済みのパラメーターではない
    _tweenEvent.Values.Add("speed", speed);
    _tweenEvent.enabled = true;


　```
参照DBを動的に切り替える

環境ごとに違うDBを参照させたいということがあります。

>テスト環境・ステージング環境・リリース環境や開発メンバー毎に検証環境が異なるといった場合

この場合、アップする環境によってDB設定を書き換えたり差し替えたりするのは面倒この上ないです。

もしくは

>アプリの性質上コントローラ側でDBを切り替えたいという場合

複数のDBを参照してひとつのアプリが作られていたり、負荷分散のために切り替える（？）などといったことも無くはないかもです。
かくいう私はテストDBとステージングDBを比較するアプリを作った経験があります。



#環境に応じて参照DBが変わるようにしたい
まず前者は以下のようにDB設定（database.php）を定義することで実現できます。

```php:app/Config/database.php
class DATABASE_CONFIG {
	public $default = array();
	
	//開発用DB設定
	public $develop = array(
		'datasource' => 'Database/Mysql',
		'persistent' => false,
		'host'       => '開発用DBホスト',
		'login'      => '開発用DBユーザ名',
		'password'   => '開発用DBパスワード',
		'database'   => '開発用DB名',
		'prefix'     => '',
		'encoding'   => 'utf8',
	);
	
	//リリースDB設定
	public $release = array(
		'datasource' => 'Database/Mysql',
		'persistent' => false,
		'host'       => 'リリース用DBホスト',
		'login'      => 'リリース用DBユーザ名',
		'password'   => 'リリース用DBパスワード',
		'database'   => 'リリースDB名',
		'prefix'     => '',
		'encoding'   => 'utf8',
	);
	
	public function __construct() {
		//ドメインによって開発用DBとリリース用DBを切り替える
		if(strpos(env('HTTP_HOST'), 'develop.xxxx.com') === false){
			$this->default = $this->develop;
		}else{
			$this->default = $this->release;
		}
	}
}
```

上記ではドメインがテスト用（develop.xxxx.com）なら開発用DBを、そうでなければリリースDBを参照するように定義しています。
上記のように\$develop、\$releaseに相当する定義を必要数だけ用意し、切り替え条件を環境に応じて自由に（ドメイン以外にドキュメントルートでマッチさせるなど）定義できます。


#アプリの性質上、動的にDBを切り替えたい
後者についてはコントローラ内で以下のように変更したいDB定義をsetDataSourceの引数で定義すればOKです。
尚、上述したdatabase.phpで言うと、\$develop、\$releaseがDB定義になります。

```php:ShopsController.php
//Itemモデルを通じてリリース用のDBに参照を動的に切り替える
$this->Item->setDataSource('release');
```

上記例ですと、切り替え前は「default」設定が参照されている状態ですが、切り替え後から「release」を参照するようになります。
golang と gdb (macで)

## 環境

```
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.9.5

$ go version
go version go1.4.2 darwin/amd64
```

## 参照

https://golang.org/doc/gdb

go1.4はdwarfが壊れていたのがなおったみたい。

## gdb の install

mervericks は もうgdb入ってない

``` shell
$ brew install homebrew/dupes/gdb
$ gdb -v
GNU gdb (GDB) 7.9
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin13.4.0".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word".
```

ok

## ビルドするときに オプション をつける

```
$ go build -o ./a -gcflags "-N -l" main.go
```

ok

### ちらうら

https://golang.org/cmd/ld/
-ldflagsに-wつけるとdwarfが含まれなくなってバイナリがちょっと縮む

-w -s!

## gdbで起動

```
$ gdb ./a
```

$GOROOT/src/runtime/runtime-gdb.py
が読み込まれるはずだが、go1.4.2だとうまく動かなかった。

自分の環境ではこれが原因でした。

https://go-review.googlesource.com/#/c/2821/3/src/runtime/runtime-gdb.py


### 実行しようとしておこられたら


```
(gdb) r
Starting program: /Users/a12508/workspace/madrid-deploy/madrid-web/app/t/a
Unable to find Mach task port for process-id 43426: (os/kern) failure (0x5).
 (please check gdb is codesigned - see taskgated(8))
```

[こちら](https://sourceware.org/gdb/wiki/BuildingOnDarwin)を参照して自己証明書を作成する

権限問題などで[System]で作れないときは[Login]でも大丈夫だけれど

```
$ sudo gdb a
```

のようにgdbを起動しないといけなくなる


完了したら、brew install したgdbに署名する
```
$ codesign -s gdb-cert /usr/local/Cellar/gdb/7.9/bin/gdb
```

証明書が見つからない時は taskgated が証明書を認識するように再起動する

(killすると勝手に再起動する. hupはためしていない)

``` shell
$ pgrep taskgated
13
$ sudo pkill -KILL taskgated
Password:
$ pgrep taskgated
44791
```

---

スゲーッ 爽やかな気分だぜ
新しいパンツをはいたばかりの 正月元旦の朝のよーによォ～ッ
(もうprintデバッグしなくていいかとおもうと)
jQueryでタグの置き換え


`replaceWith()`メソッドで差し替える。classやidも渡すようにする。

※replaceWith()が返すjQueryオブジェクトの参照先は削除されたDOMであり、新しく置換された要素では無いので要注意

```js
$('#hoge').replaceWith(function() {
  var this_class = $(this).attr("class") ? ' class="' +$(this).attr("class")+ '"' : '';
  var this_id = $(this).attr("id") ? ' id="' + $(this).attr("id") + '"' : '';
  $(this).replaceWith('<div'+this_id+this_class+'>'+$(this).html()+'</div>');
});
```
EC-CUBE3のメモ -参考資料-

EC-CUBE3の開発にあたって、参考にしているドキュメントのリンク集

# Symfony2
## 日本Symfonyユーザ会
http://docs.symfony.gr.jp/
Symfony2の翻訳ドキュメントが読める。
とくに、[Form Type リファレンス](http://docs.symfony.gr.jp/symfony2/reference/forms/types.html)や[バリデータリファレンス](http://docs.symfony.gr.jp/symfony2/reference/constraints.html)は必須。

## 効率的なWebアプリケーションの作り方
http://gihyo.jp/book/2012/978-4-7741-5082-6
タイトルがわかりにくいですが、Symfony2のサンプルが豊富にあり参考になります。

## Symfony 2のアプリケーション構成を読む
http://blog.asial.co.jp/669
ちょっと古いけど。全体像の把握に。

# Silex
## Silex ユーザーガイド
http://silex-users-jp.phper.jp/
Silexの日本語ドキュメント。

# Doctrine ORM
## 公式サイト
http://www.doctrine-project.org/projects/orm.html

## APIドキュメント
http://www.doctrine-project.org/api/orm/2.4/index.html

とりあえずは、エンティティマネージャ、レポジトリ、クエリビルダあたり。
http://www.doctrine-project.org/api/orm/2.4/class-Doctrine.ORM.EntityManager.html
http://www.doctrine-project.org/api/orm/2.4/class-Doctrine.ORM.EntityRepository.html
http://www.doctrine-project.org/api/orm/2.4/class-Doctrine.ORM.QueryBuilder.html

# Twig
## twig-docs-ja
https://github.com/symfony-japan/twig-docs-ja
Twigの日本語翻訳。
原文は以下。
http://twig.sensiolabs.org/documentation
Java [DateTime]

#1. 概要
Javaの日付関連のクラスを扱いやすくしたOSSライブラリ。
Calendarクラスでは、０から始まっていた月、週は１から始まります。
DateクラスやCalenderクラスよりも使い勝手がよい**DateTime**があります。
#2. 使い方(初期化)
DataTimeの初期化

```java
// 引数がない場合は現在日時で初期化
DateTime dt = new DateTime();

// 引数が年月日時分
DateTime datetime = new DateTime(2015, 3, 23, 12, 00);

// 引数が年月日時分秒
DateTime datetime = new DateTime(2015, 3, 23, 12, 00, 30);

// 引数がDate型
DateTime datetime = new DateTime(new Date());

// 引数がCalendar型
DateTime datetime = new DateTime(Calendar.getInstance());

```

#3. 使い方(便利なメソッド※取得系)
```java
//現在を取得。インスタンスの作成
DateTime datetime = new DateTime();

//年を取得する
datetime.getYear();

//月を取得
datetime.getMonthOfYear();

//日を取得
datetime.getDayOfMonth();

//曜日を取得
datetime.getDayOfWeek();

//時間を取得
datetime..getHourOfDay();

//分を取得
datetime.getMinuteOfHour();

//秒を取得
datetime.getSecondOfMinute();

//当月の末日を取得
datetime.dayOfMonth().getMaximumValue();

//1月1日から何日経過したか
datetime.getDayOfYear();

//1月1日から何週間経過したか
datetime.getWeekOfWeekyear();

```

#4. 使い方(便利なメソッド※比較系)

```java
//1999年1月1日と2015年1月1日を比較する
DateTime old = new DateTime(1999, 1, 1);
DateTime new = new DateTime(2015, 1, 1); 

//oldとnewの時は同じか? 答えは⇒false
old.isEqual(new);

//oldはnewより未来か? 答えは⇒false
old.isAfter(new);

//oldはnewより過去か? 答えは⇒true
old.isBefore(new);

```


#5. まとめ
JavaのDate型やCalendarよりも便利で使いやすい！と思います。
EC-CUBEで動的にブロック配置をする〜フロント側〜

こんにちは。たかぴーです。

# EC-CUBEで動的にブロック配置をする

EC-CUBEには、ブロックレイアウトの管理機能があって、メインコンテンツを真ん中に据えて、周りにブロックと呼ばれる小さなパーツを並べられる。
もちろんブロック自体が独立して動いていて、どこにでも配置できるような形で。

ちなみにblocなのかblockなのかアヤシイ。


## Silexベースで実装してみた

### View

まず、Viewの設計から。
できれば大元ではワンライナーで呼び出してるっぽくしたいと思い、以下のような呼び出しを想定。

```php:site_main.twig

    {{ render(path('bloc', {'position': 'HEAD'})) }}
```

こうすることで、site_main.twigの見通しがダンチ。

次に[before()ミドルウェア](http://silex-users-jp.phper.jp/doc/html/middlewares.html#before-middleware)を使って、DIコンテナに突っ込む。
こうすることでサブリクエスト時には動作せず、何回もクエリが投げられずに済む。

```php:Eccube/Application.php
$app->before( function(Request $request, Application $app) {
            $qb = $app['orm.em']->createQueryBuilder()
                ->select('p, bp, b')
                ->from('Eccube\Entity\PageLayout', 'p')
                ->leftJoin('p.BlocPositions', 'bp', \Doctrine\ORM\Query\Expr\Join::WITH, 'p.page_id = bp.page_id OR bp.anywhere = 1')
                ->innerJoin('bp.Bloc', 'b')
                ->andWhere('p.device_type_id = :device_type_id AND p.url = :url')
                ->addOrderBy('bp.target_id', 'ASC')
                ->addOrderBy('bp.bloc_row', 'ASC');

            $result = null;
            try {
                $result = $qb->getQuery()
                    ->setParameters(array(
                        'device_type_id'    => 10,
                        'url'               => $url,
                    ))
                    ->getSingleResult();
            } catch (\Doctrine\ORM\NoResultException $e) {
            }
            
            $app['eccube.layout'] = $result;
        });
```


続いて、

site_main.twigから呼び出されるControllerはこちら。
ただtargetIdに合致する配列だけを引っ張って$blocに突っ込んでるだけです。

```php:BlocController.php

namespace Eccube\Controller;

class BlocController
{
	public function index(Application $app)
	{
		$position = $app['request']->get('position');

		$blocs = array();
		
		if ($app['eccube.layout']) {
	        foreach ($app['eccube.layout']->getBlocPositions() as $blocPositions) {
	        	if ($blocPositions->getTargetId() == constant("Eccube\Entity\BlocPosition::" . $position)) {
	        		$blocs[] = $blocPositions->getBloc();
	        	}
	        }
	    }

	    return $app['twig']->render('bloc.twig', array(
	        'blocs' => $blocs,
	    ));
	}
}
```

View側は、ループ回してそれぞれのblocのcontroller呼びに行ってるだけなので割愛。

サブリクエストにすることで、before()は１回しか通らないし、リクエストも無駄に投げられないしで、作りながら「もし◯◯だったらどうしよ...」っていうのをことごとく回避してくれてました。
symofnyって本当によく考えられたフレームワークですよね。

というわけでまた次回〜！
Web Audio APIでmp3を再生するだけ

だいたい何処に書かれているサンプルソースも以下のような感じ。

    var context = new AudioContext();
    var buffer = null;
    var source = context.createBufferSource();
    
    var request = new XMLHttpRequest();
    request.open('GET', 'xxx.mp3', true);
    request.responseType = 'arraybuffer';
    request.send();

    request.onload = function () {
      var res = request.response;
      context.decodeAudioData(res, function (buf) {
        source.buffer = buf;
      });
    };
    
    source.connect(context.destination);
    source.start(0);

実際に動作した。

`createBufferSource()`や`decodeAudioData()`が何なのかはまだ理解してないけど、

http://curtaincall.weblike.jp/portfolio-web-sounder/webaudioapi-basic/audio

ここが詳しそうだったので調べる。
MechanizeのCookiesをYAML文字列として外部サービスに保存

#はじめに
今回初めて Mechanize gem を使いました。
Cookies の永続化には `Mechanize::CookieJar#save` メソッドを使って YAML 形式で保存するのが一般的なのだと思われます。
ですが、この `save` メソッドは引数が `IO` かファイル名である必要があります。 Heroku などではローカルファイルが cycle 時に消えてしまいますので、このメソッドを使っても消えてしまいます。これでは役に立ちません。
では Heroku で使うときに、外部サービスへ Cookies を保存するにはどうすればいいか、例えば Redis に保存するにはどうすればいいか、を確認する作業を行いましたので記録しておきます。

#Mechanize インスタンス生成
```rb
require 'mechanize'

agent = Mechanize.new
```
#Redis To Go 設定
外部サービスとして 今回は Redis To Go を選びました。（文字列が保存できるサービスであれば Redis 以外でも問題ないはずです。）
既に [Redis To Go の登録が済んで](https://addons.heroku.com/redistogo) おり、取得した Redis のアクセス URL が `redis://redistogo:cdcddcfedd5ac469f64f4c44f7cc77bf@xxx.redistogo.com:9999/` であるとします。

```rb
require 'redis-objects'

redis_url = "redis://redistogo:cdcddcfedd5ac469f64f4c44f7cc77bf@xxx.redistogo.com:9999/"
Redis.current = Redis.new(url: redis_url)
cookies = Redis::Value.new('cookies')
```
なお `Redis::Value` は文字列のみ保存可能なインスタンスで、セッター/ゲッターは [Redis::Value#value=](http://www.rubydoc.info/gems/redis-objects/Redis/Value:value=) / [Redis::Value#value](http://www.rubydoc.info/gems/redis-objects/Redis/Value:value) です。

#Cookies を保存
`Mechanize` インスタンス `agent` の Cookies を保存します。 `Mechanize::CookieJar#save` メソッドに `StringIO` インスタンスを渡すことにより文字列化します。

```rb
def cookies_to_yaml_string(agent)
  cookies_io_write = StringIO.new("", 'r+')
  agent.cookie_jar.save(cookies_io_write)
  cookies_io_write.string
end
```
この `cookies_to_yaml_string` メソッドを使うと、 Cookies を YAML 形式にした文字列が返されます。
セッターメソッドを使って保存します。今回の Redis の場合は `cookies.value =` でセットします。

```rb
cookies.value = cookies_to_yaml_string(agent)
```

#Cookies 設定
Cookies を `Mechanize` インスタンス `agent` に設定するには `Mechanize::CookieJar#load` メソッドを使います。

```rb
def set_cookies(agent, cookies_yaml)
  cookies_io_read = StringIO.new(cookies_yaml, 'r')
  agent.cookie_jar.clear # 念のために Cookies を削除している
  agent.cookie_jar.load(cookies_io_read)
end
```
この `set_cookies` メソッドを使うと、 YAML 形式にした文字列の Cookies を `agent` に設定することが出来ます。
ゲッターメソッドを使って Cookies の文字列を読み出し、設定します。今回は `cookies.value` を用います。

```rb
set_cookies(agent, cookies.value)
```

#おことわり
`StringIO` クラスを使ったことが無いので、より良い使い方があればお教えください。よろしくお願いします。

#Mechanizeの使い方メモを含めた記事
[Mechanizeの使い方（CookiesはRedisサーバへ保存） - 別館 子子子子子子（ねこのここねこ）](http://d.hatena.ne.jp/riocampos+tech/20150324/mechanize_memo)
URLセーフなトークンを作成

# きっかけ
REST APIをつくる際、クエリに適正なトークンを渡してもらうことで認可を実装することがあると思います。
クエリに渡すからURLセーフなトークンにすべきですね。

# つくりかた
トークンの作り方もいろいろあると思いますが、ユーザーIDなど、ユーザーを識別するための文字列を暗号化したものを返すというのがひとつあげられます。暗号化したものそのままだと、大体は+などのURLの予約語などが含まれてしまって、いけてないです。

というわけで、以下の手順でURLセーフなものをつくります。（あたりまえと言えばあたりまえですが・・・）

1. トークンのもととなるものを暗号化
2. 上記をURLセーフになるようBase64でエンコード

```
String userId = "123"; // トークンのもと
String encrypted = encrypt(userId); // 何かで暗号化
String urlSafe = Base64.encodeBase64URLSafeString(encrypted.getBytes()); 
```

そうすると、復号化の手順は次のようになります。
1. Base64でデコード
2. 上記を復号化

```
byte[] decoded =  Base64.decodeBase64(token); //トークンをBase64デコード
String decrypted = decrypt(new String(decoded)) // 文字列にして復号化処理
```

# JSON Web Token

署名できるURLセーフなトークンをつくる仕組みとして、[JSON Web Token](https://jwt.io)があります。
どういう使い方ができるかは、下記の記事が参考になります。

* [JSON Web Token の効用](http://qiita.com/kaiinui/items/21ec7cc8a1130a1a103a)
* https://stormpath.com/blog/build-secure-user-interfaces-using-jwts/
* [WebCrypto APIでJSON Web Tokenの検証を試してみた](http://qiita.com/tomoyukilabs/items/faa66805a440f4b30cfb)
* https://dwieeb.com/2015/12/31/introducing-jwt/
S3の特定bucketのみアクセス可能にする（他のbucketも見せない）Policy設定


`hoge.fuga.com`というドメインをホスティングする，
`hoge.fuga.com`という名前のbucketを作成しており，

「`hoge.fuga.com` bucket内の読み書き」のみを許すIAMユーザを作成，で，どのようなPolicyを付与するのが正しいか．

* S3サービスのみアクセス可能
* 他のbucket一覧は見えないようにする

想定する使い方としてはCyberduckなどのアップローダーからファイルの上げ下げをしてもらう，という．

下記でうまくいったっぽい．

`````json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:::hoge.fuga.com"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::hoge.fuga.com"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::hoge.fuga.com/*"
            ]
        }
    ]
}
````
Backboneで配列の変更にあわせて通知を送る。

Backboneで配列をsetすると配列を連想配列に変換するという挙動をする。
consoleで軽く試す。

```js
var a = new Backbone.Model([1,2,3,4]);
a.toJSON();//Object {0: 1, 1: 2, 2: 3, 3: 4}
a.attributes;//Object {0: 1, 1: 2, 2: 3, 3: 4} 
```

無理やり連想配列に変換された・・・

Modelの中にArrayをそのまま保存することはできないみたい。
ArrayとModelは相性悪いです。

Collectionの中身はModelのArrayでModelをセットすると、addとかremoveを発火してくれる。
ただこの中身はModel型しかいれることができない。

Numberとか文字列もいれたいので、Collectionのような挙動をするArrayを書いてみた。
CollectionのようにArrayのひと通りの動作毎にBackbone.Eventでイベントを発火する。

これをつかうとこんな感じの動きになる。
```js
var a = new Backbone.Array([1,2,3,4]);
a.toJSON();//[1, 2, 3, 4]

a.on("change",function(e){console(e)},this);//listenToなど好きなbind関数でも可

a.push(5);//addEventとchangeが発火
a.pop(5);//removeとchangeが発火
```

ソースはこちら。

https://github.com/coa00/backboneArray

Backbone.Modelも格納できるのでCollectionのかわりもできる。

需要あるかわからないけど。

CollectionにModel以外もいれることができてもいいと思うのだけどなぁ・・・

pullRequestおくってみようかな。
iTweenメモ

動作させるオブジェクト自身につける事、そうしないとコールバックがよばれない。


```csharp:iTweenSample.cs
using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class iTweenTest : MonoBehaviour {

    public Text text1;
    private Hashtable table = new Hashtable();		// ハッシュテーブルを用意
	// Use this for initialization
	void Start () {
        //**********************************************************************
        // このコードを適用したgameObjectを5秒掛けて(3, 3, 3)の位置まで移動させる
        //iTween.MoveTo(gameObject, new Vector3(3, 3, 3), 5.0f);

        //**********************************************************************
        //// Hashテーブルを使用
        //table.Add("x", 10);			    // xを10まで移動
        //table.Add("y", 5);			    // yを5まで移動
        //table.Add("time", 3.0f);		// トゥイーン時間は3秒
        //table.Add("delay", 1.0f);		// 1秒遅らせてからトゥイーンスタート
        //iTween.MoveTo(gameObject, table);	// 第二引数にハッシュテーブルをセット

        //**********************************************************************
        // Hashを１行
        //iTween.MoveTo(gameObject, iTween.Hash("x", 10, "y", 5, "time", 3.0f, "delay", 1.0f));

        ////**********************************************************************
        //// CallBack
        //table.Add("x", 0);
        //table.Add("onstart", "cb_iTweenStart");  //Handler func when iTween start
        //table.Add("onstartparams", "Start");   //parameter of Handler func when iTween start
        //table.Add("oncomplete", "cb_iTweenComplete"); //Handler func when iTween end
        //table.Add("oncompleteparams", "Complete"); //parameter of Handler func when iTween end
        //iTween.MoveTo(gameObject, table);

        Vector3[] movepath = new Vector3[5];
        for (int i = 0; i < 4; ++i)
        {
            movepath[i].Set(Random.Range(-20.0f, 20.0f), Random.Range(0.0f, 10.0f), Random.Range(0.0f, 30.0f));
        }
        movepath[4].Set(-1.0f, -4.1f, 34.0f);


        //**********************************************************************
        // CallBack
        table.Add("path", movepath);
        table.Add("time", 4);
        table.Add("easetype", iTween.EaseType.easeOutSine);
        table.Add("onstart", "cb_iTweenStart");         //Handler func when iTween start
        table.Add("onstartparams", "Start");            //parameter of Handler func when iTween start
        table.Add("onupdate", "cb_iTweenUpdate");		// トゥイーンを開始してから毎フレームUpdateHandler()を呼ぶ
        table.Add("onupdateparams", "Update");		    // UpdateHandler()の引数に渡す値
        table.Add("oncomplete", "cb_iTweenComplete");   //Handler func when iTween end
        table.Add("oncompleteparams", "Complete");      //parameter of Handler func when iTween end
        iTween.MoveTo(gameObject, table);

//        iTween.MoveTo(gameObject, iTween.Hash("path", movepath, "time", 4, "easetype", iTween.EaseType.easeOutSine));

         
   }

    void cb_iTweenStart(string param){
        Debug.Log("[iTween] cb_iTweenStart: "+param);
    }

    void cb_iTweenComplete(string param){
        Debug.Log("[iTween] cb_iTweenComplete: "+param);
    }

    void cb_iTweenUpdate(string param)
    {
        Debug.Log("[iTween] cb_iTweenUpdate: " + param);
    }

}
```
Androidでロック画面より手前にViewを表示する

#はじめに
他アプリの起動中に、一枚薄いレイヤーを最前面に重ねて、
ニコニコ動画のコメントのようなものを延々とたれ流す...
という実装を試したかったので、WindowManagerについて調査してみました。

#Andoridの表示レイヤーについて
Androidでは、ロック画面やステータスバーを挟んで
情報の優先度として、表示レイヤーとして制御されています。

>優先度[高]
>↑	TYPE_SYSTEM_ERROR
>↑	TYPE_SYSTEM_OVERLAY
>↑	-----ロック画面------
>↑	-----ステータスバー-----
>↑	TYPE_SYSTEM_ALERT
>↑	TYPE_PRIORITY_PHONE
>↑	TYPE_TOAST
>↑	TYPE_PHONE
>↑	-----通常のアプリ-----
>優先度[低]

上にある方が優先度が高いため、
例えばTYPE_SYSTEM_ERRORレイヤーに表示すると、
ロック画面よりも上に表示されることになります。

#表示レイヤーの指定
WindowManager.LayoutParamsクラスを使用すると
Viewの表示レイヤーを指定する事が可能です。

今回使用したのは下記のオプション。
TYPE_TOASTで表示位置は電話の上のレイヤーを指定。
FLAG_NOT_TOUCHABLEでタッチ操作は取得しない設定。

        final WindowManager.LayoutParams params =
                new WindowManager.LayoutParams(
                        width, height,
                        TYPE_TOAST,
                        FLAG_NOT_FOCUSABLE
                                | FLAG_NOT_TOUCHABLE
                                | FLAG_LAYOUT_NO_LIMITS //ステータスバーをActivityにかぶせるように表示
                                | FLAG_LAYOUT_INSET_DECOR //FLAG_LAYOUT_IN_SCREENで必要なoption
                                | FLAG_LAYOUT_IN_SCREEN //FLAG_FULLSCREEN(OverlapするViewを全画面表示)
                                | FLAG_HARDWARE_ACCELERATED, //GPUを使用して画面描画(ハードウェアアクセラレーションの使用)
                        TRANSLUCENT // viewを透明にする
                );

オプションの細かい詳細についてはマニュアルに記載されています。
http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html


#結果
ホームスクリーン上に表示
![cat2.png](https://qiita-image-store.s3.amazonaws.com/0/43766/2b52d991-a62b-cc01-840d-245d8ab24768.png)

ロック画面より上に表示してみた(TYPE_SYSTEM_ERRORを指定)
![cat1.png](https://qiita-image-store.s3.amazonaws.com/0/43766/723b2c45-ed1e-e7ce-a815-4595fff08875.png)

TYPE_TOASTに表示中に TOASTを送信(TOASTが上にくる)
![cat3.png](https://qiita-image-store.s3.amazonaws.com/0/43766/974c9155-0150-8a45-2492-fedfa175468f.png)


#おしまい
TYPE_SYSTEM_ERROR(最前面)に表示したレイヤーに対して、FLAG_NOT_TOUCHABLE(タッチ操作を無効化)を設定し忘れるとロック解除など一切の操作が効かなくなってしまうので注意が必要です。
(推奨された使用方法ではない可能性がありますのであくまで実験サンプルとして記録しておきます。)

(sample)
Github:
https://github.com/oggata/AndroidOverviewDemo

(使用した素材)
ネコの無料イラスト
http://shigenori-terazawa.seesaa.net/article/407247100.html
プログラマ必須、キーボード設定

#速度
![スクリーンショット 2015-03-24 17.25.42.png](https://qiita-image-store.s3.amazonaws.com/0/47947/c4bc7d84-046e-4cd3-17af-a4289663bb21.png)
***
自分で気づくか、誰かに教えられるか、、、、、、。
↑こういう地味な事ほど最初に教えて欲しいと思ったり思わなかったりデスよ。


#ファンクションキー設定
<img width="672" alt="スクリーンショット 2018-05-03 16.39.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/47947/34ebed22-4475-1dbd-55dd-b9e2132a5029.png">
***
Macの場合、Fキーは特殊機能に割り当てられている。
そのため普通のFキーを使う際には、fnキーを押しながらFキーを押す必要がありました。
↑この設定をチェックすると、その仕組みを逆転させる事が出来ます。
（実は、Fキーを普通に使いたいのにできなくてFキーを使わないようにしてました。Macで使う機会がどれほどあるかということもあったと思います。）
IQ20の美少女鯖管「DNSが死んでるなら、AWS Route53使えばいいじゃない」

> お名前.comのDNSが死んでてお祭り状態で仕事にならないので脳内美少女と遊ぶ。
> ただの走り書きですので、何卒ご容赦。

IQ20の美少女鯖管「
切り分けの結果、本日（2015/03/24）の障害はDNSが死んでいるみたい。
ドメインNaviからは入れてDNSサーバを変更できるみたいなんで、
この機会にAWSのRoute53でも弄ってみるといいんじゃない？
BINDやUnboundの設定方法に疎くても、ネットワークの知識さえあれば、
割と簡単に利用できるはずよ！
」
ぼく「いやIQ20って設定ミスってるだろお前」

#Route53とは
http://aws.amazon.com/jp/route53/
超簡単DNSサーバ。
DNSラウンドロビンでの負荷分散なんかもできる。
http://aws.amazon.com/jp/route53/pricing/
ちなみに有料。でも機能を考えれば激安。


今知ってビビったのは、ドメイン管理まで出来るようになったこと。
他社からの移管も可能。普通に安い。
http://aws.typepad.com/aws_japan/2014/08/route-53-domain-reg-geo-route-price-drop.html

#DNSレコード設定をはじめるまで
1. AWSにログイン（または登録）
2. 左メニュー「Hosted Zones」クリック
3. primaryボタン「Create Hosted Zone」クリック
4. お手持ちのドメインとコメントを適当に入れてprimaryボタン「Create」クリック
5. primaryボタン「Create Record Set」クリック
6. 後はそこからレコード設定を行う。他のドメイン管理などを経験してたなら、フィーリングでなんとかなる（と思う）
7. そこの辺りにチラホラ見えてるdnsサーバっぽいドメインはまさしくDNSサーバなので、控えてドメイン管理会社側の設定で、該当ドメインを転記

こんな人をなめたような走り書きでも、運用開始までたどり着けるのが、
このサービスの最大の利点じゃないかなと思う。

#雑感
Route53は使えば使うほど味が出てくるスルメのようなサービス。
サーバも早いし、大きなトラブルも聞かない。
BINDの脆弱性に怯える必要もなし。
多分、他社を探してもないようなオンリーワンなサービスなので、
他のサーバを利用してる方も、EC2やS3に興味がない方も、AWSに抵抗のある方でも、
是非一度試して、よければ上司を口説いてみては。

#リンク
今さっきやった行動、まさしくコレ。

お名前.comで取得したドメインのネームサーバーをRoute53に変更しELB配下のWebページをドメインで引けるようにする
http://qiita.com/ausuited/items/94beec5f588dbdebb7fc
ファイルメーカーのチェックボックスを見栄え良くする

画面レイアウト作成に関するTipを何回かに分けて紹介していきます。
すでに知っている方もいるかもしれませんが、知らないと言う方には役に立つかと思いますのでご紹介です。

今回はチェックボックスの表現方法を変更するTipsです。
そんなに難しい事はしていませんので、初心者の方でも組み込めると思います。

サンプル実装したイメージはこんな感じです。
![チェックボックス](https://qiita-image-store.s3.amazonaws.com/0/68589/3ad58b59-607a-9ae2-4d67-a6e58d1a72af.png)

フラグ値などの設定用にチェックボックスを使いたい場合など、FileMaker標準のチェックボックスで実装するとチェック時はバッテンになるし、値一覧を用意する必要があったりと融通が利きません。
そこで、別の方法で自由に表現したチェックボックスの実装方法をご紹介します。

方法を簡単に説明すると、オブジェクトを非表示するプロパティを利用して表示を切り替えています。

##チェックボックス用フィールドの準備
フラグ用のフィールドを想定しているので、数字の0か1を設定するフィールドを用意します。
サンプルはチェックをはずしたときに0を設定するように実装しているため、初期値も0を設定するようにしています。

![フィールド設定内容](https://qiita-image-store.s3.amazonaws.com/0/68589/480339c2-4635-094d-adbc-8aabb41ad9ba.png)

##レイアウト上の設定
今回はテキストとして「中抜きの丸」と「塗りつぶしの丸」の2つを用意。
各テキストの大きさを上手く合わせてチェックした時の表示位置を揃えます。

###「中抜きの丸」の設定
「中抜きの丸」はボタンとし、設定値を0と1を反転させるように設定します。
具体的には以下のように 「not フィールド名」の設定します。
![ボタンの設定内容](https://qiita-image-store.s3.amazonaws.com/0/68589/5795c574-decf-bde5-d1a0-5f4fcc2d78b6.png)

###「塗りつぶしの丸」の設定
こちらは値が1で無い場合にオブジェクトを隠す設定をします。
![チェックされていないときに隠す設定](https://qiita-image-store.s3.amazonaws.com/0/68589/48803596-9036-224d-8e1a-975a2a6d73d5.png)

以上で設定は完了です。
これでボタン設定した丸の部分をクリックすれば表示が切り替わるはずです。

サンプルファイルは今後説明予定の内容も含まれていますが、以下よりダウンロード可能です。よろしければ参照してください。

[サンプルファイル](http://it-komons.jp/filemaker/samples/LayoutTips.zip)
LeoFSのErlangコンソールに入る

ランタイムの中に入って関数を実行したり、束縛された値を見たり、ごにょごにょしたりできる。

```bash
$ bin/leo_gateway remote_console
Erlang/OTP 17 [erts-6.3] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V6.3  (abort with ^G)
(gateway_0@127.0.0.1)1>
```

Tabで名前の補完も利く。

```erlang
(gateway_0@127.0.0.1)1> leo_gateway_s3_api:module_info().
[{exports,[{start,2},
           {stop,0},
           {init,3},
           {handle,2},
           {terminate,3},
           {onrequest,1},
           {onresponse,1},
           {get_bucket,3},
           {put_bucket,3},
           {delete_bucket,3},
           {head_bucket,3},
           {get_object,3},
           {get_object_with_cache,4},
           {put_object,3},
           {delete_object,3},
           {head_object,3},
           {range_object,3},
           {module_info,0},
           {module_info,1}]},
 {imports,[]},
 {attributes,[{vsn,[104854973627086735130649165131811794768]},
              {author,['Yosuke Hara']},
              {author,['Yoshiyuki Kanno']},
              {behaviour,[leo_gateway_http_behaviour]},
              {author,['Yosuke Hara']},
              {author,['Yosuke Hara']}]},
 {compile,[{options,[{outdir,"ebin"},
                     debug_info,
                     {d,'NOTEST'},
                     warn_obsolete_guard,warn_shadow_vars,warn_export_vars,
                     warn_export_all,
                     {i,"include"}]},
           {version,"5.0.3"},
           {time,{2015,3,23,4,33,33}},
           {source,"/home/makisyu/leofs/deps/leo_gateway/src/leo_gateway_s3_api.erl"}]}]
```

重質量砲に当たった奇居子よろしくデータを吹っ飛ばすこともできる。
モデルに設定された全アソシエーションを解除する

モデルにアソシエーションを設定することはしばしばですが、Pagenateを使用していたり検索処理を軽くするという理由で場所によってアソシエーションを解除したいってことはあります。

```php:ShopsController.php（修正前）
//商品モデルのアソシエーションを一旦全解除する
$this->Item->unbindModel(array('belongsTo' => array('Maker', 'ItemGenre')));
$this->Item->unbindModel(array('hasMany' => array('Shop')));
			:
```
以前は面倒と思いながらも都度unbindModelを書いてたんですが、以下のようにunbindModelAllを定義すれば楽になります。
アソシエーションが解除されるのは１度のみですが、引数の$resetにfalseを指定すればアクション内で永続的に解除できます。

```php:AppModel.php
public function unbindModelAll($reset = true) {
	foreach(array('hasOne','hasMany','belongsTo','hasAndBelongsToMany') as $relation){
		$this->unbindModel(array($relation => array_keys($this->$relation)), $reset);
	}
} 
```

以下のように、上記で定義したunbindModelAllを実行すれば全アソシエーションを解除することができます。

```php:ShopsController.php（修正後）
$this->Item->unbindModelAll();	//商品モデルのアソシエーションを一旦全解除
```
default_url_optionsを使う際の注意


多言語化等でApplicationController#default_url_optionsを使う機会があると思います。

[RailsGuides](http://guides.rubyonrails.org/i18n.html)にも、default_url_optionsを修正したら、いいと書いてあります。

しかし、一つ落とし穴が。。。

Mailerを使った際は、ApplicationController#default_url_optionsは呼び出されないので、下記のように`ActionMailer::Base.default_url_options`を設定する必要があります。


```ruby
ActionMailer::Base.default_url_options[:locale] = params[:locale]
```
PHPのisset,empty,is_nullの引用あれこれ

## 比較表
|値|if($var)|isset|empty|is_null|
|:--:|:--:|:--:|:--:|:--:|
|$var=1|TRUE|TRUE|FALSE|FALSE|
|$var="";|FALSE|TRUE|TRUE|FALSE|
|$var="0";|FALSE|TRUE|TRUE|FALSE|
|$var=0;|FALSE|TRUE|TRUE|FALSE|
|$var=NULL;|FALSE|FALSE|TRUE|TRUE|
|$var|FALSE|FALSE|TRUE|TRUE|
|$var=array()|FALSE|TRUE|TRUE|FALSE|
|$var=array(1)|TRUE|TRUE|FALSE|FALSE|

引用元
http://d.hatena.ne.jp/sngmr/20080209/1202520832
マニュアル：型の比較表 
http://php.net/manual/ja/types.comparisons.php

## isset, empty, is_null の動作まとめ
複雑な表を書き並べている記事が多いですが、実際は
null であれば
null でなければ
空値であれば
空値でなければ
の4種類の内容しか取り扱っていないものがほとんどであり、覚えるのが難しいなどと悩む必要はありません。

引用 mpywさんThaxﾃﾞｽ
http://qiita.com/mpyw/items/51bf42fe1ad8a7e535aa

## null値とunsetの原理的理解
PHPは、シンボルテーブルという変数名と値を結びつける、管理表を内部に持っている。

|変数名|格納場所|
|:--:|:--:|
|a|#0001番地|

のような。※俺はテーブルかくな…と？

$a = null;
は
> シンボルテーブル a → #0001番地　→　nullという値

となる。

unset ( $a );
は
> シンボルテーブル　に　a がない！

という状態になる。


$a='';
は、空文字文字の代入なので、PHPとしては当然に値を持っているものである。
> シンボルテーブル a → #0001番地　→　\0 という値

なお、null 値とは、　null 型　は、ある変数が値を持たないことを表す値、という若干矛盾する表現でしか表現できない特殊な値＆型であるが、私見では、
> null という値を持つ特殊な定数（変数）

と理解するのがよろしいかと思う。


引用元
http://www.cpa-lab.com/tech/097
参照：変数の代入は、値のコピーにあらず
http://www.cpa-lab.com/tech/030
これは超便利！指定のカラムをキーとしたHashを簡単に作る方法

```rb

user = User.all

{
 [name: 'a', category: 1],
 [name: 'b', category: 2],
 [name: 'c', category: 1]
}

user.group_by(&:category)

{
 1 : [{name: 'a'}, {name: 'c'}], 
 2 : [{name: 'b'}]
}

```
D言語でターミナルの大きさを得る

横幅ぴったりに表示させたいとか、lsコマンドのように長いリストを折り返しせずに複数列表示したりするときには、端末(ターミナル)の幅と高さを知る必要があります。

D言語でこの2つを取得したいときは、 `core.sys.posix` を使うと可能です。より簡単な方法があったら教えてください。

```d
import std.stdio;
import core.sys.posix.unistd;
import core.sys.posix.sys.ioctl;

void main(string[] args) {
  winsize ws;
  if(ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) != -1) {
    writeln("width = ", ws.ws_col);
    writeln("height= ", ws.ws_row);
  }
}
```

ターミナルを開いて、ウィンドウの大きさを変えながら何度か実行してみてください。
Windows の場合はまた別の方法が必要です。
SWIFT で ポップアップメッセージを表示する

```
func showAlert( title: String, message: String, btnText: String ){
   let alert = UIAlertController(
        title: "タイトル",
        message: "メッセージです",
        preferredStyle: .Alert
   )
   let defaultAction = UIAlertAction(title: "OK", style: .Default, handler: nil)
   alert.addAction(defaultAction)
   presentViewController(alert, animated: true, completion: nil)
}
```
Embedded FrameworkでのNSBundleの振る舞い


`Embedded Framework`ライブラリ内で以下の２つを実行した際に得られる`NSBundle`について

```swift

//そのライブラリをロードしているアプリのバンドルを取得
NSBundle.mainBundle()

//そのライブラリのバンドルを取得
NSBundle(forClass: self.dynamicType)

```
MongoError (upsert): not okForStorage　がでたときの原因と対処法

mongo2.4.12 で起きたMongoError(2.6系未確認)

MongoError: MongoError (upsert): not okForStorage
query: {"_id":"0023bec94302e15e90e774cd270487a5"}
update: {"\$set":{"data":{"2015032317":{"9aci\$113534":1427100832164　　//⬅ key名に"$"がはいってしまっている}}}}

updateするデータのkey名に "$"が入っているのが原因でした。
ちなみに下の参考urlによると、 "."がkeyにある場合も同様のエラーが出るらしいです。

not okForStorageエラーが出た場合は、updateするデータのkeyに "$"または"."が入ってしまっているか確認する

(参考)
https://jira.mongodb.org/browse/SERVER-5674
http://stackoverflow.com/questions/6041109/mongo-update-query-given-error
Rails4 i18nの日本語フォーマットの半角スペースを取り除く

日本語表示の半角スペースが取り除けなくてハマったのでメモ

```
customer.errors.full_messages
=> ["顧客名 を入力してください。"]
```

スペースが入る(´・ω・｀)

# サンプルコード

```rb:customer.rb
class Customer < ActiveRecord::Base
  validates :name, presence: true
end
```

```rb:customer_spec.rb
it "未入力の場合、エラーメッセージが日本語で表示できること" do
  customer = Customer.new
  customer.name = ''
  customer.valid?
  expect(customer.errors.full_messages).to include('顧客名を入力してください。')
end
```

```yaml:ja.yml
ja:
  errors:
    format: "%{attribute}%{message}"
  messages:
    blank: を入力してください。
  attributes:
    customer:
      name: 顧客名
```

# 注意点

デフォルトは、attributeとmessageの間に半角スペースが入るためformatでスペースを取り除く。この指定がないと`顧客名 を入力してください。`となりテストが通らない

# デフォルトフォーマット

```
format: "%{attribute} %{message}"
```

# 修正後

```
format: "%{attribute}%{message}"
```

巷の情報では、activerecordの中にformat指定してたが、これだとうまく変換されなかったため、ルートにformatを書いたら変換できた。
Rails Ajax で要素を動的に変更する

## やりたい事

大項目 (セレクトボックス) を変更したら、それに紐づく小項目 ( チェックボックス ) を動的に変更したい。

宅配ピザのお店を管理するシステムで、お店の情報を登録する際、県 ( 大項目 ) を選択したら、それに紐づく配達可能な詳細エリア ( 小項目 ) が動的に変更するようなイメージ。


## 前提

||バージョン|
|:--|:--|
|Ruby|2.1.1|
|Rails|4.2.0|


以下のようなアソシエーションを想定。

```app/models/pref.rb
# 県
class Pref < ActiveRecord::Base
  has_many :detail_areas
end
```

```app/models/detail_area.rb
# 詳細エリア
class DetailArea < ActiveRecord::Base
  belongs_to :pref
end
```

```app/models/store.rb
# 店舗
class Store < ActiveRecord::Base
  belongs_to :pref
end
```

店舗への詳細エリアの格納は
[Rails 複数チェックボックスで入力された値をカンマ区切りで DB へ格納する](http://qiita.com/ryo-ichikawa/items/0d30e97c21bc1aa8a033)
を参考に、カンマ区切り形式で detail_areas という string カラムへの格納を想定。


## 1. フォームの詳細エリア部分 ( 動的に変更したい部分 ) を切り出し、部分テンプレートを作成。

```app/views/stores/_form.html.erb
<%= render 'form_detail_areas', store: @store, detail_areas: @detail_areas %>
```

```app/views/stores/_form_detail_areas.html.erb
<div id="detail_areas_select" class="field">
  <%= label_tag 'store[detail_areas]' %><br>
  <%
    checked = store.detail_areas.presence || []

    detail_areas.each do |detail_area|
      checkedval = checked.include?(detail_area.id.to_s) ? true : false

      concat check_box_tag 'store[detail_areas][]', detail_area.id, checkedval, {id: 'store_detail_area_ids_' + detail_area.id.to_s}
      concat detail_area.name
      concat " "
    end
  %>
  </div>
```


## 2. 都道府県の変更を受けて Ajax 通信を行う CoffeeScript を作成。

```app/assets/javascripts/stores.coffee
$(document).on 'change', '#store_pref_id', ->
# form の action をもとに store_id を取得。
# 新規登録の場合は stores が設定される。
work = $(this).parents('form').attr('action').split('/');

$.ajax(
  type: 'GET'
  url: '/stores/detail_areas_select'
  data: {
    store_id: work[work.length - 1],
    pref_id: $(this).val()
  }
).done (data) ->
  $('#detail_areas_select').html(data)
```


## 3. Ajax 通信を受けるコントローラのルーティングを設定。

```config/routes.rb
resources :stores do
  collection do
    :detail_areas_select
  end
end
```

## 4. コントローラへ実際の処理 ( ビューへ渡す値の生成 ) を追加

```app/controllers/stores_controller.rb
def detail_areas_select
  # ajax によるリクエストの場合のみ処理
  if request.xhr?
    if params[:store_id].present? && params[:store_id].to_s != 'stores'
      store = Store.find(params[:store_id])
    else
      store = Store.new
    end

    detail_ares = Detail_area.select(:id, :name).where(pref_id: params[:pref_id])

    render partial: '/stores/form_detail_areas', locals: { store: store, detail_areas: detail_areas}
    end
  end

```
---

以上。
NativeScriptのGetting Startedを試してみる（１

http://docs.nativescript.org/getting-started
では[前回](http://qiita.com/kazusa-qooq/items/3ef17c1d9b9504f1bd49)に引き続いて、
JavascriptでAndoroid,iOS,Windows Phoneのアプリが書けるNativeScriptのGetting Startedを試していきます。今回はサンプル画面の表示までです。

#Getting Started
* NativeScriptはプラットフォームに依存したセットアップとスキルの複雑さを取り除く
* TypeScriptでもよい
* XML, javascript, CSSの知識が必要
* Objective-C, Javaの知識は不要

##1. Choose your tools and set up your system.
開発環境の準備です。
私はWindowsですが、その場合Androidしか実行できないようです。iOSの実行にはOS X環境が必要のようです。Windows Phoneの話が書いてありませんがとりあえず置いておきます。
ローカルで開発しようと思いますので、まずＣＬＩのインストールです。

###Set Up the NativeScript CLI on Windows
http://docs.nativescript.org/setup/ns-cli-setup/ns-setup-win.html
必要なものは以下です。

* [JDK](http://www.oracle.com/technetwork/java/javase/downloads/index.html)
* [Ant](http://ant.apache.org/bindownload.cgi)
* [Android SDK](http://developer.android.com/sdk/index.html)
* [Node.js](https://nodejs.org/)

原文ではChocolateyの使用を推奨してましたが、うまくいかなかったので手動でいれました。
Android SDKのインストールには管理者権限が必要です。また現状Lolipop（API22)に対応してない？ため、4.4(API19)のSDK Platform をマネージャーからインストールしました。
最後に
`npm i -g nativescript`
で本体をインストールして終わりです。

#Hello World from the NativeScript CLI
http://docs.nativescript.org/hello-world/hello-world-ns-cli.html
では本番です。定番のハローワールドです。まずサンプル画面の表示に挑戦します。

##Create New Project
コマンド`tns create hello-world`でプロジェクトを作成します。初回のみ使用方法の統計情報を送るか聞かれるのでお好きにどうぞ。

```
C:\workspace\NativeScript>tns create hello-world
...
Project hello-world was successfully created

C:\workspace\NativeScript>
```

つぎに使用するプラットフォームを追加します。今回はandroidだけです。うまくいかない人は管理者権限とAPI19(Android4.4.2)のSDKをインストールしているか確認してください。

```
C:\workspace\NativeScript>cd hello-world

C:\workspace\NativeScript\hello-world>tns platform add android
Unable to find adb in PATH. Default one from NativeScript resources will be used
.
Copying template files...
Updated project.properties
Updated local.properties
Added file C:\workspace\NativeScript\hello-world\platforms\android\build.xml
Added file C:\workspace\NativeScript\hello-world\platforms\android\proguard-proj
ect.txt
Project successfully created.

C:\workspace\NativeScript\hello-world>
```

つぎにサンプルをエミュレータで表示します。コマンドは`tns run android --emulator`です。いろいろ出力されます。成功したならデモ画面が表示されるはずです。私は失敗しました。

どうもエミュレータが起動に失敗しているようです。AVD Managerでエミュレータを作成して起動しても失敗しました。エラーは`emulator: ERROR: x86 emulation currently requires hardware acceleration!` 。調べた結果、以下のサイトにたどり着きました。

* http://totem3.hatenablog.jp/entry/2014/11/07/055946

以下のサイトから入手できるソフトウェアをインストールする必要があったようです。
https://software.intel.com/en-us/android/articles/intel-hardware-accelerated-execution-manager

失敗するかたはまずAVD Managerからエミュレータが起動するか確認してください。AVD Managerで起動に成功すれば、デモの実行も成功するはずです。

区切りがいいので一端切ります。[次回](http://qiita.com/kazusa-qooq/items/07291caf007f107fc076)
Push通知を受けて深い階層にあるViewControllerを表示し実行する

FacebookなどPush通知から特定のViewを開くようなアプリがあると思います。ああいうのを実現しようとすると、AppDelegateからrootになってるViewControllerを開いて、そこから辿ってっていうことをうまくやらないと行けません。

美しくコードを書く方法を探してみます。
まずは、ViewControllerに依存したヘボ実装

1. push通知のイベントを受けたらNSUserDefaultsに保存

        [[NSUserDefaults standardUserDefaults] setObject:hogehoge forKey:@"pushHogeHoge"];

2. ViewControllerのviewDidLoadで、

        id hogehoge = [[ NSUserDefaults standardUserDefaults ] objectForKey:@"pushHogeHoge" ];
        if ( hogehoge ) {
                // ここでなんかやる
                // ....

                [[ NSUserDefaults standardUserDefaults ] removeObjectForKey:@"pushHogeHoge" ];
        }

いやあ、簡単ではあるもののUserDefaultをフラグっぽく使うのはなんかダサいですね。やはりAppDelegateのなかで、

        [ ViewController->HogeViewControler:openKoreKore ];

みたいにすっきりやりたいと思ってるのですが、ちょっとロジックが複雑で、今はpushからのアプリ起動されたらフラグをセットし、ログイン成功のNSNotificationを受けたときにフラグがあればそれに合う処理を実行する。

1. 起動する。（RootViewControllerは勝手に起動するので放置）
2. フラグをセット

        - (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void (^)())completionHandler;
        - (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forLocalNotification:(NSDictionary *)userInfo completionHandler:(void (^)())completionHandler;

2. あるサービスにログインする（少し時間かかる）。
3. ログイン成功後、指定のViewControllerを表示しactionを実行したい。
4. ログインを待ってる間にRootViewControllerは表示されるので結果的にViewの階層は問題なく表示されている

やはり、美しくない。
Processing.jsを使ってみる （２）

## はじめに
[前回](http://qiita.com/Souj/items/6729925a0145372e3e51)Processing実行環境上で動かしたプログラムを、今回はProcessing.jsを使用してブラウザ上で動作させたいと思います。

## Processing.jsの使い方
Processing.jsの[公式サイト](http://processingjs.org/)の[learningページ](http://processingjs.org/learning/)によると実装方法として二つの方法があるようです。

1. Processingのみを使う方法
1. JavaScriptと共にProcessingを使う方法

### 1. Processingのみを使う方法
Processing言語のみで実装することが出来ます。
既存のProcessing言語で作成したプログラムをブラウザ上で動作させることが出来ます。

**ファイル構成**

|ファイル名|内容|
|:--|:--|
|processing.js|processing.jsライブラリ|
|anything.html|htmlファイル|
|anything.pde|processing言語で記述されている。canvasのdata属性に設定することでこのファイルを読み込ませる。|
※anything.pdeを読み込ませないで、anything.htmlに直接processing言語を記述する方法もあります。

### 2. JavaScriptと共にProcessingを使う方法

JavaScriptでProcessingのオブジェクトを生成するときに引数に描画用関数を渡すことで描画します。

## Processing.jsを使ってみる
### 1. Processingのみを使う方法

はじめに「Processingのみを使う方法」を試してみたいと思います。

ファイル構成は以下の通りです。

|ファイル名|内容|
|:--|:--|
|processing.js|processing.jsライブラリ|
|index.html|anything.htmlの役割|
|processing.pde|processing言語で記述されている。描画処理は基本的にこのファイルに記述する。|

**index.html**

```html:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
  <title>Processing Demo</title>
<script src="./processing.js"></script>
</head>
<body>
  <canvas data-processing-sources="processing.pde"></canvas>
</body>
</html>
```
**processing.pde**
※[前回](http://qiita.com/Souj/items/6729925a0145372e3e51)Processing実行環境上で動かしたプログラムと同じものです。

```pde: 
void setup() {
  size(200, 200);
  background(125);
  fill(255);
  noLoop();
}

void draw() {  
  text("Hello World!", 20, 20);
}
```

**動作結果**

ブラウザでindex.htmlを開くとprocessing.pdeに記述した内容が表示されます。
![running_on_pc_env.png](https://qiita-image-store.s3.amazonaws.com/0/72852/2f533783-e71e-1e1c-8eef-f2dd55aeb575.png)

### 2. JavaScriptと共にProcessingを使う方法

次は、「JavaScriptと共にProcessingを使う方法」を試してみたいと思います。
ファイル構成は以下の通りです。

|ファイル名|内容|
|:--|:--|
|processing.js|processing.jsライブラリ|
|index.html|今回は、このファイルにProcessingオブジェクトを使うJavascriptを記述する|

**index.html**

```html
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Processing Demo</title>
  <script src="./processing.js"></script>
</head>
<body>
  <canvas id="canvas" width="200" height="200"></canvas>

  <script>
  function sketchProc(processing) {
    processing.setup = function() {
      processing.size(200, 200);
      processing.background(125);
      processing.fill(255);
      processing.noLoop();
    }

    processing.draw = function() {
      processing.text("Hello World!", 20, 20);
    }
  }

  var canvas = document.getElementById("canvas");
  var p = new Processing(canvas, sketchProc);
  </script>
</body>
</html>
```

**動作結果**

ブラウザでindex.htmlを開くとindex.htmlのscriptタグに記述した内容が表示されます。
![running_on_pc_env_with_js.png](https://qiita-image-store.s3.amazonaws.com/0/72852/b199adc6-af91-e868-22d2-b67bab30e19b.png)

## おわりに

Processing.jsを使用することにより、ブラウザ上で[前回](http://qiita.com/Souj/items/6729925a0145372e3e51)試したProcessingの開発環境と同等のことが実現できることが分かりました。次回は、Firefox OSを搭載したFx0で、Processing.jsを使ってみたいと思います。

[Processing.jsを使ってみる](http://qiita.com/Souj/items/6729925a0145372e3e51)
[Processing.jsを使ってみる （３）](http://qiita.com/Souj/items/cc4037995ec77d043bed)
[Processing.jsを使ってみる （４）](http://qiita.com/Souj/items/958ada020d2fdda2d2e6)
shellでディレクトリ内にある、任意2文字のディレクトリのみ消すメモ


アルファベッドと数値のみとして、よくランダム文字列とかハッシュ値とかで、頭二文字のディレクトリを作るけど、それをzshシェルで全て消す方法。

多分、bashでも動くんじゃない。ここらへんのGlobの仕様はよくわからん。

```zsh
> rm -rf [a-zA-Z0-9][a-zA-Z0-9]
```
テキスト入力もできるセレクトボックスを一番簡単に作る

## やりたいこと
mysqlのテーブルデータを元にしたリストボックスを作りたい。
さらにリストにないデータも入力できるようにしたい。

## 条件的なモノ
・言語:php + smarty
・jquery 可
・使い方がシンプル
・コード量が少なくていい
・IE対応

## 採用した方法
上記理由により jquery-ui の autocomplete を採用しました。

デフォのデザインがあまりイケてませんがｗ
css上書きすればいいだけですしね。

## 使い方
autocomplete は数文字入力して候補を表示させる使い方が一般的ですが
minLength: 0指定と.focusメソッドを同時に使うことで
セレクトボックスのようにフォーカス時に未入力でも候補を表示することができます。

autocomplete用のsourceの渡し方もajaxとかjsonとか使っても良かったんですが、シンプルにPHPでカンマ区切りのデータ($name_list)を作ってsmartyでhiddenに渡しました。

※PHPでデータ作る部分は端折りました。


```lang:html

<input type="text" id="select_name" name="select_name">
<input type="hidden" name="name_list" id="name_list" value="{$name_list}">

```

```lang:javascript

$(function(){
  var list_str = j$( "#name_list" ).val();
  var list = list_str.split(',');

  $( "#select_name" ).autocomplete({
    minLength: 0,
    source: list
  }).focus(function() {
    $(this).autocomplete("search", "");
  });;
});
```

今どきのやり方ではないとは思うのですが、ご参考までに。

業務外とかIE考えなくてよければHTML5のinputでやりたいとこでした。
Play Frameworkプロジェクト内でJAXBを使っているとなぜかうまく動かないときは GeneratedAccessor

Java標準のXMLシリアライザであるJAXBをPlay Frameworkプロジェクト内で使っていると、こんなランタイムエラーが出てエンティティクラスを解析しそこねることがあります。

```
com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
クラスに同じ名前"name"を持つ2つのプロパティがあります
	this problem is related to the following location:
		at public java.lang.String Hoge.getName()
		at Hoge
	this problem is related to the following location:
		at public java.lang.String Hoge.name
		at Hoge
```

もちろんHogeクラスにはnameフィールドを作っただけで、同名プロパティだと指摘されているgetName()メソッドなんか作った覚えはありません。
勝手にgetterが…？ あ、まさかPlay Frameworkのしわざ？

そうなんです。Playは勝手に各クラスにgetter/setterアクセサをコンパイル後追加してくれるのです。
> Play has been designed to generate getter/setter automatically, to ensure compatibility with libraries that expect them to be available at runtime (ORM, Databinder, JSON Binder, etc). If Play detects any user-written getter/setter in the Model, it will not generate getter/setter in order to avoid any conflict.
https://www.playframework.com/documentation/2.2.x/JavaEbean

これを抑止するにはどうすればいいか？
これはアンドキュメンテッドなのですが、

```
@PropertiesEnhancer.GeneratedAccessor
```

クラス宣言にこの「アクセサ追加加工済み」を意味するこのアノテーションを付けておくと無視してもらえます。
[Unity]iOS8.2でテキストが表示されない


>もしも３ヶ月以上前にUnityで作ったアプリをApp Storeで公開しているのなら、一度iOS8.2でテキストがきちんと表示されているか確認したほうが良いかもしれません。

##症状

しばらく前にApp Storeで公開したアプリが、iOS8.2でのみテキストが表示されないという現象が起きた。

##解決方法

Unity4.6.1以降のバージョンを使ってビルドしなおすと直る。

##原因

iOSでフォントの場所が変わったから（？）とかなんとか…
詳しくは下記の参考URLを参照してください。

##参考

http://forum.unity3d.com/threads/missing-font-characters-on-ios-8-2.310028/