OmniAICreator/Qiita-1.07M huggingface dataset:
シェルスクリプト(Bash): \ で改行してる時の 1 行コメントアウト

シェルのコマンドで、オプションがたくさんあるときは、読みやすくするために改行することがあると思う。

```bash
somecommand --optionA=xxxx \
            --optionB=yyyy \
            --optionC=zzzz \
            --optionD=wwww
```

しかし、これを部分的にコメントアウトする時（たとえばオプションの組み合わせを試す際）

```bash
somecommand --optionA=xxxx \
            --optionB=yyyy \
            # --optionC=zzzz \
            --optionD=wwww
```

のようにコメントアウトして失敗した経験は、皆さんにはないだろうか？

# echo での例示


たとえば、↓のようなシェルスクリプトを

```bash:sample.sh
#!/usr/bin/env bash

echo 'a' 'x' \
     'b' 'y' \
     'c' 'z' \
     'd' 'w'
```

コメントアウトして

```bash:sample.sh(コメントアウト後)
#!/usr/bin/env bash

echo 'a' 'x' \
     'b' 'y' \
     # 'c' 'z' \
     'd' 'w'
```

のようにして実行すると、

```shell-session:実行結果
$ ./sample.sh
a x b y
./sample.sh: line 6: d: command not found
$
```

と、このように。
コメントアウト以降が独立したステートメントとして扱われるため ```d``` を実行しようとする。
この例では ```d``` というコマンドがなかったから良いものの、
存在するようなケースでは致命傷を生む可能性がある。


# 回避策を考えてみた

よくある ```/*  */``` な範囲コメントアウトができれば、このような悲劇は避けられると思った。
1 行の範囲コメントを発明したい。

## ヒアドキュメントを使う方法

シェルの範囲コメントアウトといえば、ヒアドキュメントとヌルコマンドを利用した方法が一般的だ。
クオートで囲めば、変数やコマンド置換の評価も止められる。

```bash
:<<'EOT'
somecommand
foo
bar
buzz
EOT
```

でもコレは複数行が前提に成ってしまうのでダメだ。
これをオプションの中でやりたい。

# 外側を式で囲む

行を ```$(:``` と ```)\``` で囲む戦法を思いついたのでやってみた。
コマンド置換でヌルコマンドに対して引数が渡るので、置換後は空になるというわけだ。
コマンド置換はダブルクォートで囲まないので、空文字列が挿入されることもない。

```bash:sample.sh(改)
#!/usr/bin/env bash

echo 'a' 'x' \
     'b' 'y' \
     $(: 'c' 'z' \ )\
     'd' 'w' 
```

```shell-session:実行結果
$ ./sample.sh
a x b y d w
$
```

これは一見よさそうだ。
このパターンだけならこれで正解。

# さらなる問題

しかし ↑ ではコメントアウト対象が単なる文字列だったので済んだが、元のスクリプトが次のような例だとダメだ。


```bash:sample2.sh
#!/usr/bin/env bash

function inc () {
    echo 'called!' "$*" > /dev/tty
}

echo 'a' "$(inc 'x')" \
     'b' "$(inc 'y')" \
     'c' "$(inc 'z')" \
     'd' "$(inc 'w')" 
```

これを上記の方法で c の行をコメントアウトして実行してみよう。

```bash:sample2.sh(改)
#!/usr/bin/env bash

function inc () {
    echo 'called!' "$*" > /dev/tty
}

echo 'a' "$(inc 'x')" \
     'b' "$(inc 'y')" \
     $(: 'c' "$(inc 'z')" \ )\
     'd' "$(inc 'w')" 
```

```shell-session:実行結果
$ ./sample2.sh
called! x
called! y
called! z
called! w
a  b  d
$
```

ご覧のとおり、 c の行の ```$(inc 'z')``` は評価されてしまっている。
こいつもトラップだ。

# 短絡評価する

最終的に思いついたのがコレ
```$(:||:``` と ```)\``` で囲む方法

```bash:sample2.sh(改2)
#!/usr/bin/env bash

function inc () {
    echo 'called!' "$*" > /dev/tty
}

echo 'a' "$(inc 'x')" \
     'b' "$(inc 'y')" \
     $(:||: 'c' "$(inc 'z')" \ )\
     'd' "$(inc 'w')" 
```

```shell-session:実行結果
$ ./sample2.sh
called! x
called! y
called! w
a  b  d
$
```

これで平和になった…。

# まとめ

これが今思いついている中では、最も万能な 1 行コメントアウトの方法だと思う。（たぶん）
それにしても、あまりに技巧的なやり方過ぎてしっくりこない……。

そしておそらく、この解決法にもさらなる落とし穴があるに違いない。（落とし穴募集）

# ところで

```bashsh
$(:||: )\
```

ちょっとかわいい顔文字みたいだと思いません？
digitaloceanインスタンスへのHadoop(疑似分散モード)インストール

Hadoop学習のため、digitalocean上のdroplet(インスタンス)にHadoopをインストールしたので記録。

書籍「Hadoop徹底入門　第２版」を見ながら試した。※本にはdigitaloceanでやれとは書いてない。

## digitalocean上でのdroplet起動

Web IFでポチポチ。2GB Ram,CentOS 6.5 x64。インスタンス名は適当にpracticeとしておく。※512MB Ramではサンプルが動かなかった

## Javaのインストール

OpenJDKでなくOracle JDKがいいらしい。Java8でも動きそうだが、変なところでハマりたくないので保守的にjdk-6u45-linux-x64-rpm.binをOracleのサイトからDL。

```shell-session
# chmod a+x jdk-6u45-linux-x64-rpm.bin
# ./jdk-6u45-linux-x64-rpm.bin
```

## Hadoop(CDH)のインストール
[cloudera](http://www.cloudera.co.jp/products-services/cdh/cdh.html)によると、
> CDHは、Apache Hadoopや関連プロジェクトすべてを包含し、機能検証済み、かつ、世界でもっとも導入実績の多いディストリビューションです。
とのこと。これを使います。

```shell-session
# sudo rpm --import http://archive.cloudera.com/cdh4/redhat/6/x86_64/cdh/RPM-GPG-KEY-cloudera
# sudo rpm -ivh http://archive.cloudera.com/cdh4/one-click-install/redhat/6/x86_64/cloudera-cdh-4-0.x86_64.rpm
# rpm -ql cloudera-cdh

# sudo emacs -nw /etc/yum.repos.d/cloudera-cdh4.repo
### - baseurl=http://archive.cloudera.com/cdh4/redhat/6/x86_64/cdh/4/
### + baseurl=http://archive.cloudera.com/cdh4/redhat/6/x86_64/cdh/4.2.1/

# sudo yum install hadoop-0.20-conf-pseudo
```
これでとりあえずインストールOK。

確認

```shell-session
# hadoop version
結果:
Hadoop 2.0.0-cdh4.2.1
Subversion file:///data/1/jenkins/workspace/generic-package-rhel64-6-0/topdir/BUILD/hadoop-2.0.0-cdh4.2.1/src/hadoop-common-project/hadoop-common -r 144bd548d481c2774fab2bec2ac2645d190f705b
Compiled by jenkins on Mon Apr 22 10:26:03 PDT 2013
From source with checksum aef88defdddfb22327a107fbd7063395

# cat /etc/passwd
以下のユーザができていることを確認。
hdfs:x:497:496:Hadoop HDFS:/var/lib/hadoop-hdfs:/bin/bash
mapred:x:496:495:Hadoop MapReduce:/usr/lib/hadoop-0.20-mapreduce:/bin/bash
```

## セットアップ
hosts設定

```shell-session
# sudo vi /etc/hosts
### + 127.0.0.1   practice
```                            

Namenodeのメタデータ領域のフォーマット

```shell-session
# sudo -u hdfs hdfs namenode -format

# sudo service hadoop-hdfs-namenode start
# sudo service hadoop-hdfs-datanode start
```

Namenode, Datanodeのプロセス起動

```shell-session
# sudo service hadoop-hdfs-namenode start
# sudo service hadoop-hdfs-datanode start
```

HDFS上での作業フォルダ等の作成

```shell-session
# sudo -u hdfs hadoop fs -mkdir -p /var/lib/hadoop-hdfs/cache/mapred/mapred/staging
# sudo -u hdfs hadoop fs -chmod 1777 /var/lib/hadoop-hdfs/cache/mapred/mapred/staging
# sudo -u hdfs hadoop fs -chown -R mapred /var/lib/hadoop-hdfs/cache/mapred
# sudo useradd tsujino
# sudo -u hdfs hadoop fs -mkdir -p /user/tsujino
# sudo -u hdfs hadoop fs -chown tsujino /user/tsujino
```

jobtracker, tasktrackerプロセスの起動

```shell-session
# sudo service hadoop-0.20-mapreduce-jobtracker start
# sudo service hadoop-0.20-mapreduce-tasktracker start
```

## example(pi)の動作確認

```shell-session
# sudo -u tsujino hadoop jar /usr/lib/hadoop-0.20-mapreduce/hadoop-examples.jar pi 10 1000000
出力:
...
Job Finished in 41.997 seconds
Estimated value of Pi is 3.14158440000000000000
```

## pigのインストール

```shell-session
# yum install pig
```
FuelPHP で Orm\Model::find('all') の結果をセレクトボックスで表示する

## Arr::pluck を使う

`Model_Option` は `id`, `label` プロパティを持っているとする。

```php
$options = Model_Option::find('all');

echo Form::select('option_id', null, Arr::pluck($options , 'lable', 'id'));
```

## 出力結果

```html
<select name="option_id" id="form_option_id">
    <option value="1">オプション1</option>
    <option value="2">オプション2</option>
</select>
```
Java Pluginメモ


久しぶりにブラウザにJava Pluginを入れたら色々つまづいたのでメモを残しておきます。


* まず、古いJava Pluginが残っている場合、新しいバージョンのJavaをインストールしようとしてもUpdateしてくれなかったので、一旦Javaをアンインストールします。

sudo rm -fr /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin

* 見ようとしていたJavaのコンテンツは既に古く、証明書が切れているためセキュリティ条件に引っかかってエラーになるケースが多いです。Macの場合、システム環境設定 > Javaからセキュリティ条件を設定することができます。見ようとしているサイトのドメインを指定して、そのサイト上では証明書が切れていても閲覧可能にしましょう。
開眼！JavaScriptの2.8のまとめ　for-inループでプロパティを列挙

開眼！JavaScriptの2.8のまとめです。

##2.8　for-inループを使って、プロパティを列挙する
*for-inを使うことによって、オブジェクトのプロパティをひとつひとつ列挙できる。ただしfor-inではプロトタイプチェーンから継承したプロパティも列挙されるため、対象オブジェクト自身のプロパティのみを列挙したい場合は、hasOwnProperty()メソッドを使用する。*

for-inループとhasOwnProperty()メソッドを使って、そのオブジェクト自身が保持しているプロパティを列挙します。

```
var cody = {
    age : 33,
    gender : 'male'
};
for (var key in cody) {
    if (cody.hasOwnProperty(key)) {
        console.log(key);
    }
}
```
結果
age
gender
PHP7調査(17)エラーメッセージ中のlong/doubleをinteger/floatに統一した

PHP7から、エラーメッセージが少しだけわかりやすくなりました。

```php
<?php
date("c", "foo");
```

このコードをPHP5で実行すると次のようなエラーが表示されます。

```
PHP Warning:  date() expects parameter 2 to be long, string given in Command line code on line 1
```

第2引数はlong型だけどstring型が渡されたという、一見すると普通の内容です。しかし、「long型って何？」というのが多くのPHPユーザーの反応ではないでしょうか。筆者の知る限り、PHPマニュアルのどこにもlong型という表記は登場しません。

混乱のもとなので、PHP7ではlongという表記が全てintegerに修正されました。また、doubleという表記もfloatに統一されました。

そんなわけで、PHP7で上のコードを実行すると次のようなエラーが表示されます。

```
PHP Warning:  date() expects parameter 2 to be integer, string given in Command line code on line 1
```

すごい！わかりやすい！！！

# 参照

* [Consistent type names in error messages](https://github.com/php/php-src/pull/955)
CSSのみで画像のマスキング

CSSのみをつかって画像をマスキングする方法を3点紹介します

# 実装方法
## 1.svgをつかったマスキング
```css:svg.css
    .svg {
        -webkit-clip-path: url(#svgPath);
        clip-path: url(#svgPath);
    }
```
```html:svg.html
      <svg height="300" width="300" class="svg">
            <image xlink:href="cat.jpg" x="0" y="0" width="300" height="300"/>
            <defs>
                <clipPath id="svgPath">
                    <circle cx="200" cy="220" r="55"></circle>
                </clipPath>
            </defs>
        </svg>
```

▼実行結果
![svg.png](https://qiita-image-store.s3.amazonaws.com/1643/57611/ad6db084-7b13-a73d-dd2f-dc4327073431.png)


### メリット：
+ SVGなのでじゃぎらない
+ 画像の描画図形の位置やサイズ等に影響されない

### デメリット
+ 複数のSVGをつかったマスキング切り抜くのが上手くいかない（実装方法の問題？）

### 参考記事
>Clipping in CSS and SVG — The clip-path Property and <clipPath> Element
>http://sarasoueidan.com/blog/css-svg-clipping/

## 2.プロパティmask-imageをつかったマスキング
```css:mask.css
.mask{
    -webkit-mask:url(mask.png) no-repeat;
　　-webkit-mask-position: 11% 99%;
}
```

```html:mask.html
<div class="mask">
    <img src="img.png">
</div>
```

circle.png
![circle.png](https://qiita-image-store.s3.amazonaws.com/1643/57611/71a40703-6a0f-a60f-a7ac-04679e50bc6a.png)


▼実行結果
![mask (2).png](https://qiita-image-store.s3.amazonaws.com/1643/57611/b3d696b3-e98b-4cfa-cf0d-024eb1eafe90.png)

### メリット
+ マスキング画像で対応が可能
+ CSSのコードが少なく済む


### デメリット
+ 対応ブラウザが少ない

### 参考記事
>画像による CSS Masking
>http://qiita.com/HAKASHUN@github/items/fbd743336718c64bfe2a
>CSS3のみでマスクをかける【mask-image】
>http://www.html5-monster.com/wp/?p=608


## 3.CSSグラデーションを使ったマスキング
http://hail2u.net/blog/webdesign/css-egg-and-star-clip.html


```css:gradation.css
.gradation{
    display: inline-block;
    line-height: 1;
    background-repeat: no-repeat;
    background-image:
    radial-gradient(
        120px 120px at 200px 140px,
        transparent 70%,
        #fff 70%,
        #fff 100%
    );
    background-position:
        right;
}
.gradation img {
    position: relative;
    z-index: -1;
    vertical-align: bottom;
}
```

```html:gradation.html
<div class="gradation">
    <img src="img.jpg">
</div>

```
▼実行結果
![gradation.png](https://qiita-image-store.s3.amazonaws.com/1643/57611/81f90161-c1ff-5ae8-db07-e75cb4e63c1f.png)

### メリット
+ IE9まで対応
+ 実装をイメージしやすい 

### デメリット
+ 複雑な図形を書くのが大変
+ 指定する項目、オブジェクトが増えると描画に時間がかかる

### 参考記事
>CSSで画像を六角形にくり抜く
>http://hail2u.net/blog/webdesign/css-hex-clip.html


#所感
+ この他にもCanvasをつかったマスキングがあるそう
+ IE系の対応を考えると1,3がよいと思う
【CakePHP】実行されたSQLの確認

##エレメントのsql_dumpを使う方法

Layout/default.ctpのデフォルト版に書いているやつ。

```php
echo $this->element('sql_dump');
```

##DataSourceを使う方法

リダイレクトで遷移してしまう場合や、エレメントのsql_dumpを削除してしまっている場合はこちらを使う。

モデルからDataSourceを取得して、getLog()とすると実行されたSQLやそれに付随する情報が取得できる。

```php
$モデル->getDataSource()->getLog();
```


ちなみに、自分の環境では、sqlを確認するためにデバッグ用でAppModelに以下を定義している。これでモデルからもコントローラーからも簡単にsqlが確認できる。

```php
public function sql(){
  $sql = $this->getDataSource()->getLog();
  
  $this->log($sql);
  return $sql;
}
```

ログで確認したい場合は、

```
$モデル->sql();
```

画面に出して確認したい場合は、

```
debug($モデル->sql());
```

と使う。

エレメントのsql_dumpやdebugkitだと、SQLが全て出て該当のSQLを探すのが面倒だけど、確認したいfind()やsave()のすぐ下に上記を書くと、最後のSQLを見るだけなので便利。
[JAWS-UG CLI] CloudFormation:#5 ハンズオン用IAMユーザの削除


簡易版です。

```bash:コマンド:
aws cloudformation list-stacks
```

```bash:コマンド:
CF_STACK_NAME='削除するスタックの名前' (例: administrator-prj06-mbp13)
```

```bash:コマンド:
aws cloudformation delete-stack --stack-name ${CF_STACK_NAME}
```

```text:結果:
(戻り値なし)
```
クリックしてHTMLを編集できる<textarea>に切り替えるjQuery

# 概要
クリックしたらHTMLを編集できる<textarea>になる、つまり、

![before.png](https://qiita-image-store.s3.amazonaws.com/0/43328/ac0247d0-c537-a274-1a35-4d80c7bd0274.png)

これが

![after.png](https://qiita-image-store.s3.amazonaws.com/0/43328/8a7fe1ac-97fc-b297-02c7-628de0bf54ea.png)

こうなるやつです。

# コード例

上の画像のコードは下記の通りです。

```index.html
<!DOCTYPE html>
<html>
<head>
  <title>sample</title>
  <meta charset="utf-8">
  <style type="text/css">
  .wrapper {
    width:400px;
    padding: 100px;
    text-align: center;
    background-color: #a2edde;
  }
  .click-me textarea {
  	width: 100%;
  	height: 100%;
  	min-height: 3em;
  	padding: 0;
  }
  </style>
</head>
<body>

  <h1>Click to Textarea</h1>
  <div class="wrapper">
    <p class="click-me">
      This <strong>text</strong> is <i>clickable</i>, so <a href="#">click me</a>!
    </p>
  </div>

  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
  <script>

  $(function() {

    $('.click-me').on('click', function() {
      var $editable = $(this);
      
      $editable.html('<textarea>' + $editable.html() + '</textarea>').find('textarea')
        .focus() // これが必要
        .on('focusout', function() {
        	var valueOfTextarea = $(this).val();
          $editable.html( valueOfTextarea );
        })
        .on('click', function(ev) {
        	// p.click-me のクリックイベントの発火を防止
          ev.stopPropagation();
        });
    });

  });

  </script>
</body>
</html>
```
デフォルトでは textarea の幅が非常に狭くなるのでCSSで設定しています。

ハマりどころとしては、

* `<textarea>`を作った直後、`focus()`しないと最初の`focusout`が発火しない
* `stopPropagation()`しないと`.click-me`のイベントが再度発火する

といったところでしょうか。
（個人的にはjQueryのセレクタの扱いでもハマりましたが。。）
【CakePHP】キャッシュ削除


CakePHPではパフォーマンス向上のため、app/tmp/cacheにキャッシュファイルを持っている。

core.phpのデバッグレベルを0にした状態で、テーブル定義を変更すると、テーブル定義のキャッシュと不整合のためエラーになる場合がある。

デバッグレベルを0にした状態（本番環境）でテーブル定義を変更した場合の対策をまとめる。

1.デバッグレベルを1以上にしてアクセス
デバッグレベルを1以上の場合、都度キャッシュファイルが書き換わるので。

2.app/tmp/cache配下のキャッシュファイルを削除
まんまキャッシュファイルを削除

3.キャッシュファイル削除用のコンソールを作成実行
デプロイ時にコンソールを実行してキャッシュを削除する。
自分のところではこれを採用している。

```php
class CacheClearShell extends AppShell {
  function main(){
      $config_list = Cache::configured();
      foreach ($config_list as $value) {
          Cache::clear(false, $value);
      }
      clearCache();
  }
}
```
PHPでスネークケースとキャメルケースの変換

ちょっと必要に駆られて書きました。

```php
<?php

class String
{
    public static function underscore($str)
    {
        return ltrim(strtolower(preg_replace('/[A-Z]/', '_\0', $str)), '_');
    }

    public static function camelize($str)
    {
        return lcfirst(strtr(ucwords(strtr($str, ['_' => ' '])), [' ' => '']));
    }
}
```

```php
$str1 = 'camelString';
$str2 = 'snake_string';

String::underscore($str1); // => 'camel_string'
String::camelize($str2); // => 'snakeString'
```

とくに問題なく動くはず。。
[自分メモ用] @を使ってNSNumberとかNSArrayとか

NSNumberとかNSArrayに値を設定する際に書きやすい方法を教えてもらった。
自分が調べて使ってた方法はどうやら古い方法だったみたいらしい。
備忘録のためにメモ。

# NSNumber

@数値でNSNumber型が生成できる。

```objc:NEW
NSNumber* intNumber = @1;
NSNumber* longNumber = @2L;
NSNumber* longlongNumber = @3LL;
```


* 古い書き方

```objc:OLD
NSNumber* intNumber = [NSNumber numberWithInt:1];
NSNumber* longNumber = [NSNumber numberWithLong:2L];
NSNumber* longlongNumber = [NSNumber numberWithLongLong:3LL];
```

全く知らないで後者のOLD記述を使っていたので、
画期的だと思ってしまいました。

# NSArray

@[]でNSArrayが生成できる。
変数[添字]で取得できる。

```objc:NEW
// 初期化
NSArray* stringArray = @[@"Value1", @"Value2", @"Value3"];
NSArray* intArray = @[@1, @2, @3];

// 要素の取得
NSString* str = stringArray[0];
NSNumber* num = intArray[0];
```

intArrayという変数名にしましたが、NSArrayにプリミティブ型は設定できません。
実際は、@1と記述することで前述のNSNumber型となっています。
なので変数名としてはintNumberArrayなどの方が正確です。

要素の取得も直観的だった...。
objectAtIndex使ってた自分って...。

* 古い書き方

```objc:OLD
// 初期化
NSArray* stringArray = [NSArray arrayWithObjects:@"Value1", @"Value2", @"Value3", nil];
NSArray* intArray = [NSArray arrayWithObjects:@1, @2, @3, nil];

// 要素の取得
NSString* str = [stringArray objectAtIndex:0];
NSNumber* num = [intArray objectAtIndex:0];
```

# NSDictionary

@{}でNSDictionaryが生成できる。
変数[Key名]で取得できる。

```objc:NEW
// 初期化
NSDictionary* dictionary = @{@"Key1": @"Value1",
							 @"Key2": @"Value2",
							 @"Key3": @"Value3"};

// 要素の取得
NSString* str = dictionary[@"Key1"];
```

普通に直観的なKey, Valueの設定の仕方。


* 古い書き方

```objc:OLD
// 初期化
NSDictionary* dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
				@"Value1", @"Key1",
				@"Value2", @"Key2",
				@"Value3", @"Key3",
				nil];

// 要素の取得
NSString* str = [dictionary objectForKey:@"Key1"];
```

Value, Keyの順で設定するため一瞬わからなくなる。
Unity5のStandard Assets Example Projectsを開く


インストール時に選択したサンプルプロジェクトを開いて遊んでみます。
Unityのインストールについては[こちら](http://qiita.com/sonicnaoya/items/aae0dad1b2dd741c3b3b)

##今回の環境
Windows 8.1 Pro
Unity 5 (5.0.1f)


##サンプルを開く
インストール時に追加したStandard Assets Example Projectsを開いてみましょう。
![スクリーンショット 2015-04-13 19.29.43.png](https://qiita-image-store.s3.amazonaws.com/0/15496/7b93cda7-6cdc-5d62-3812-128d24ec6682.png "スクリーンショット 2015-04-13 19.29.43.png")


ロードが完了すると、下図のような画面が表示されます。
![スクリーンショット 2015-04-13 19.30.38.png](https://qiita-image-store.s3.amazonaws.com/0/15496/e8e0804a-b463-102a-7b7a-3f768f821279.png "スクリーンショット 2015-04-13 19.30.38.png")


##サンプルを動かす
とりあえず動かしてみましょう。
画面上部の中央にある「![スクリーンショット 2015-04-13 19.37.30.png](https://qiita-image-store.s3.amazonaws.com/0/15496/eb718956-803e-6ddc-1850-89241a609071.png "スクリーンショット 2015-04-13 19.37.30.png")」ボタンをクリックします。
![スクリーンショット 2015-04-13 19.30.38.png](https://qiita-image-store.s3.amazonaws.com/0/15496/eab0eaa1-61a0-942b-50eb-a647d3fd3bf2.png "スクリーンショット 2015-04-13 19.30.38.png")


車のモデルが表示され、十字キーで操作できるサンプルが動作します。
![スクリーンショット 2015-04-13 19.33.32.png](https://qiita-image-store.s3.amazonaws.com/0/15496/a4df9869-b22e-6d17-3d0e-8dc7bb631c20.png "スクリーンショット 2015-04-13 19.33.32.png")


他にもサンプルがありますので、画面右上にある「MENU」を選択してさまざまなサンプルを開いてみましょう。
![スクリーンショット 2015-04-13 19.31.59.png](https://qiita-image-store.s3.amazonaws.com/0/15496/af89b6e8-deae-3678-f015-327ad6322476.png "スクリーンショット 2015-04-13 19.31.59.png")
Chrome App で <img ng-src> に設定しても画像が表示されない時の対処法

```js
angular.module('MyModule')
  .config(function($compileProvider) {
    $compileProvider.imgSrcSanitizationWhitelist(/^\s*(https?|ftp|mailto|chrome-extension):/);
  })
```
Angularモジュールの`.config`メソッドで`$compileProvider.imgSrcSanitizationWhitelist`に`chrome-extension`で始まるURLを安全なURLだと設定すればOK。

公式ドキュメント
https://docs.angularjs.org/api/ng/provider/$compileProvider
FuelPHP - SessionのGC(ガベージコレクション)設定

# FuelPHP - SessionのGC(ガベージコレクション)設定
FuelPHPのセッション設定とGC設定についてのメモ

## FuelPHPの設定ファイル
> config/session.php

## セッションを保存する場所の指定
> 'driver' => 'db', // or file

## GC実行タイミングの設定箇所
> 'gc_probability' => 5 // 5/100の確率でGCが実行される

## GC設定の優先度
検証した結果、PHPのGC設定よりもFuelPHPのGC設定が優先されました。
（環境によって異なる可能性あり）

## セッションの保存先をDBに設定した場合
こちらのサイトを参考にして、sessionsテーブルを作成します。
[FuelPHPでデータベースにセッションを保持する方法](http://w.builwing.info/2012/03/07/fuelphp%E3%81%AEsession%E3%82%AF%E3%83%A9%E3%82%B9/)

## 参考サイト
[FuelPHPのセッションについて](http://blog.fagai.net/2012/11/04/fuelphp_session/)
[PHPのセッションについて](http://pentan.info/php/session_gc.html)
[PHPマニュアル@gc_maxlifetime](http://www.php.net/manual/ja/session.configuration.php#ini.session.gc-maxlifetime)
css3-mediaqueries.jsがIE8で動かないときの対処方法



・(Sassの場合) CSSのブロックごとにmediaqueryをつけていて、
CSSの記述の中に一定数以上mediaqueryが含まれるとエラーになる。
← 解決
combine_mq で CSS内の media記述を一つにまとめて書き出す
https://github.com/frontendfriends/grunt-combine-mq
SQLの書き方

SQLの書き方で質問です。


データベースに「intro_num」「title」「intro」「part」というカラムがあります。
SQLのWHERE句に次のように条件を書きたいです。

「intro_numが１で、partがaisatsuのtitleとintroを取り出す」

$sqlのwhere句の部分で、$numを１に変えると取り出せるのですが、$numのままだと失敗します。
また、where句を「intro_num = 1 AND part = $value」にすると失敗します。
当然、where句を「intro_num = $num AND part = $value」にしても失敗します。
この場合、どう書いたほうがいいでしょうか。
それともwhere句ではなくそのほかの書き方が間違っているのでしょうか。
ご教授お願いいたいます。

//SQL
$JD = array(1, 'aisatsu');
$num = current(array_slice($JD, 0, 1, true));
$value = current(array_slice($JD, 1, 1, true));

$sql = 'SELECT title, intro FROM oda_intro where intro_num = $num AND part = $value';
$stmt = $dbh->query($sql);
try{
    while($result = $stmt->fetch(PDO::FETCH_ASSOC)){
        print($result['title']);
        print($result['intro'].'<br>');
    }
}catch (PDOException $e){
    print('Error:'.$e->getMessage());
    die();
}
centosでnatto+mecabを使う

普通にmecabが入っているcentosの環境でnattoを使おうとすると以下のエラーが出た。

```
...bundle/ruby/2.1.0/gems/ffi-1.9.3/lib/ffi/library.rb:261:in `attach_function': Function 'mecab_model_new2' not found in [/usr/local/lib/libmecab.so] (FFI::NotFoundError)
```

どうやらmecabをビルドした時に出来るshared object file(soファイル)が古いのが原因のよう、、、orz
もともとmecab-0.98をbuildしてたので、新しくmecab-0.996をインストールして対応する。

方法は2つ。

1.wget でソースファイルをDLしてbuild

[MeCab と MeCab Ruby をインストールする](http://kzy52.com/entry/2014/01/05/173628)

2.yum install でmecabをインストール

[RubyでMeCabを使う](http://qiita.com/xkumiyu/items/50e449235985ca1b0271)

ちなみにnattoを使う際はpathをbash_profileに追加する必要がある。
下記が参考になるかと。

[natto,mecabを使うときに環境変数をセットしろと言われたときメモ](http://gramy.hatenablog.com/entry/2015/01/12/104937)

ちなみに最近新語を定期的に追加してくれる辞書がリリースされてます。
[mecab-ipadic-neologdがすごいという話](http://kivantium.hateblo.jp/entry/2015/03/15/175612)

快適なmecab生活を！
nodebrewでnode.jsをmacに入れる

## 手順

1,2のどっちかでnodebrewを入れる(自分は 2)

1. [nodebrew の README](https://github.com/hokaccha/nodebrew) をみてその通りにやる
2. `brew install nodebrew`叩いてexportとかを書く

nodebrew で node をインストールする

```bash
$ nodebrew install-binary v0.10.38
$ nodebrew use v0.10.38
$ node -v
v0.10.38
```

## なぜなに nodebrew

- さくさく最新版のnodeをインストールできて
- さらにインストール済みのnodeのバージョンをさくさく切り替えできて
- 最近だとiojsもインストールできちゃったりして
- 便利

## おわりに

人に説明する用にまとめたエントリーとなりますので、手抜き勘弁
console.log()の値をサーバに出力


##はじめに

実機デバッグなどでデバッガに接続しない状態でもconsole.log()の出力を見たいということで、処理を横取りしてサーバに送るようにします。

##スクリプト

使い方は簡単で、このスクリプトを差し込んでおけば所定のURLにconsole.log()の値を送ります。
文字列の送り先(feed_url)は適宜変更してください。
console.pngは透明な1ピクセル画像とかを用意してもらえばいいです。
※console.log('%d',123);のような書式付きだとうまく動きません。

```javascript:console_log.js
console.log = function() {
	var feed_url = './console.png';
	var feed = new Image();
	for (var i in arguments) {
		var now  = (new Date()).getTime() + Math.random() * 1000 ;
		feed.src = feed_url + '?tm=' + now + '&' + encodeURI(arguments[i]);
	}
};

```

これだけです。

サンプルHTMLです。ボタンを押すとinputの値をconsole.log()に出力します。
...が、console.log()を横取りしているので、http://~~/console.png?abcのようにサーバに情報を送ります。

```html:index.html
<!DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8" />
	<title>console.logの値をサーバに出力</title>

	<!-- このスクリプトを挿入するとconsole.logの出力をサーバに送ります -->
	<script type="text/javascript" src="console_log.js"></script>

	<script>
		function write_log() {
			var val = document.getElementById('word').value;
			console.log(val);
		}
	</script>

</head>

<body>

	<input type="text" id="word">
	<button onclick="write_log()">console.log</button>

</body>

</html>
```

デバッグがすんだら、このスクリプトを外すだけで解除できます。

#追記 : 普通のコンソールにも併記する。

サーバだけじゃなくて普通のコンソールにも出したい場合は、console_log.jsをこんな感じにしてください。

```javascript:console_log.js
console.original = console.log;//上書き前に退避して
console.log = function() {

	console.original.apply(console,arguments);//呼び戻す

	var feed_url = './console.png';
	var feed = new Image();
	for (var i in arguments) {
		var now  = (new Date()).getTime() + Math.random() * 1000 ;
		feed.src = feed_url + '?tm=' + now + '&' + encodeURI(arguments[i]);
	}
};
```
大文字小文字を区別しない比較 #PostgreSQL

## 方法1: 大文字小文字を統一して比較

```sql
SELECT * FROM table WHERE LOWER(column) = LOWER('KEYWORD');
```

## 方法2: ILIKEを利用して比較

```sql
SELECT * FROM table WHERE column ILIKE 'KEYWORD';
```

## 方法3: POSIX様式を利用して比較

```sql
SELECT * FROM table WHERE column ~~* 'KEYWORD';
```
OS X 10.10.3でRubyから一部サイトへのHTTPS接続時がエラーになる

# 発生する事象

`Net::HTTP`を使って一部のサイトにHTTPS接続すると以下のように`OpenSSL::SSL::SSLError`が発生します。

```
/Users/hideki/.rbenv/versions/2.2.1/lib/ruby/2.2.0/net/http.rb:923:in `connect': SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)
```

# 前提条件

- OS X 10.10.3
- HomebrewからOpenSSLをインストール (10.10.3にアップデートしてからインストールされたもの)
- rbenvなどからHomebrewのOpenSSLをリンクしてRubyをインストール

# 原因

HomebrewからOpenSSLをインストールすると、Keychainから`/usr/local/etc/openssl/cert.pem`を生成するようになっています。[^1]

そして、Homebrewの`28b03c2`のコミットにEquifaxの証明書を`/usr/local/etc/openssl/certs`配下に追加するワークアラウンドが追加されています。[^2]
このワークアラウンドのコメントを見ると、AppleがEquifax Secure CA rootをOS X 10.10.3で削除したためと書かれています。

しかし、どうやらRubyからは`OpenSSL::X509::DEFAULT_CERT_FILE`[^3]に定義されている`/usr/local/etc/openssl/cert.pem`しか参照せず、`/usr/local/etc/openssl/certs`配下の証明書は見ていないようです。

# 対処方法

乱暴ですが、`/usr/local/etc/openssl/cert.pem`のバックアップを取り、`cert.pem`と`/usr/local/etc/openssl/certs`配下にあるEquifaxの証明書を結合したものを新たに`cert.pem`として置くことで解決しました。

    $ cd /usr/local/etc/openssl
    $ mv cert.pem cert.pem.backup
    $ cat cert.pem.backup certs/Equifax_Secure_Certificate_Authority.pem > cert.pem

ひとまずこれでOS X側が修正されるのを待てばよいと思います。

OS X側が修正されたならば、`certs/Equifax_Secure_Certificate_Authority.pem`と`certs/578d5c04.0`を削除し、次のコマンドで再度Keychainから`cert.pem`を再生成するとよいでしょう。

    $ security find-certificate -a -p /Library/Keychains/System.keychain /System/Library/Keychains/SystemRootCertificates.keychain > cert.pem

`Equifax_Secure_Certificate_Authority.pem`を自分でKeychainに入れて上記コマンドを実行するの方法もありますが、SystemのKeychainにホイホイ証明書を入れてしまうのはどうかなと思ってやめました。

他に綺麗な解決法、例えばRubyからも`/usr/local/etc/openssl/certs`を使えるようにする方法などがあれば教えて欲しいです:relieved:

# おまけ

以前はHomebrewからcurl-ca-bundleというFomulaをインストールするのが定番でしたが、現在では削除されています。[^4]

[^1]: https://github.com/Homebrew/homebrew/blob/28b03c2f9ee5dcf861a6ff7de750b147fe3138e4/Library/Formula/openssl.rb#L121
[^2]: https://github.com/Homebrew/homebrew/commit/28b03c2f9ee5dcf861a6ff7de750b147fe3138e4
[^3]: `$ ruby -ropenssl -e "p OpenSSL::X509::DEFAULT_CERT_FILE"`で確認できます。
[^4]: https://github.com/Homebrew/homebrew/pull/28658
ClojureのWebアプリケーション関連の記事・書籍（メモ）

# Webアプリケーション向けで、参考になりそうなもの

追記：以前に書いた記事の方が参考なるかもしれませんので、リンクを追加しておきます。
clojure web関連キャッチアップ 2014冬
http://qiita.com/koji_yusa/items/5fa7a9858c49db807b75


## 実サイト（ソース付き）

### CircleCIのフロントエンド (Om)
https://github.com/circleci/frontend

### 社畜.net
https://github.com/marony/worker

## GUIコンソール系

### JobStreamer Console (Om)
https://github.com/job-streamer/job-streamer-console

### Riemann
https://github.com/aphyr/riemann

## サンプルアプリケーション

### BirdWatch (Om)
https://github.com/matthiasn/BirdWatch

### データ表示 (Om)
https://github.com/annapawlicka/om-data-vis

### swaggerを使ったサンプル
https://github.com/metosin/ks-example


## Web系のライブラリ
それぞれのソース、ドキュメントを参照

### Om
https://github.com/omcljs/om

[チュートリアル](https://github.com/omcljs/om-cookbook)や導入サイトも記載されてる


### The Clojure Toolbox
http://www.clojure-toolbox.com/
用途別に探すなら

## 書籍

### Web Development with Clojure: Build Bulletproof Web Apps with Less Code
https://pragprog.com/book/dswdcloj/web-development-with-clojure

Luminusの作者の本、compojureベースで説明している。

### Building a System in Clojure (and ClojureScript)
https://leanpub.com/building-a-system-in-clojure

scalaからclojureに移行したTwitter関連ツールを説明した本。
最近わかったことを元に、共通ライブラリ化を進めているということで、
現在書籍も書き直ししているとのこと。

### Clojure Reactive Programming
https://www.packtpub.com/web-development/clojure-reactive-programming

> Understand the key abstractions of Functional Reactive Programming (FRP) and Compositional Event Systems (CES)

core.async、future、Reagi、Omなどの解説

## 記事

### Building Clojure Services at Scale
http://blog.josephwilk.net/clojure/building-clojure-services-at-scale.html
SoundCloudで実践しているスケールするClojureサービス。
基本的には、Netflix OSSの導入方法。

Netflix OSSについては
http://wazanova.jp/items/1386

### ArangoDB でアクセスロガー作った
http://apribase.net/2014/08/26/homepage36/

非RDBSで困ったら、ArangoDBという選択肢も。
[Vagrant] 「CentOSのboxでbundle installやgem installが異常に遅い」問題を解決する方法

Vagrantの仮想マシン上でbundle installが遅い。
Bundlerの問題というより、ネットワークの遅延の問題に見える。

```
[vagrant@localhost ~]$ time sh -c 'curl www.rubygems.org:443 > /dev/null'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
132   264  132   264    0     0     49      0  0:00:05  0:00:05 --:--:--  2256
real    0m5.340s
user    0m0.000s
sys 0m0.006s
[vagrant@localhost ~]$ time sh -c 'curl www.rubygems.org:80 > /dev/null'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:05 --:--:--     0
real    0m5.268s
user    0m0.000s
sys 0m0.005s
```

この問題はVagrantはじめ各所で報告されていて、Vagrant向けのCentOS boxの設定が原因らしい。

* [`gem install` is very slow in Vagrant with VirtualBox provider · Issue #513 · rubygems/rubygems](https://github.com/rubygems/rubygems/issues/513)
* [Slow networking (due to IPv6?) on CentOS 6.x · Issue #1172 · mitchellh/vagrant](https://github.com/mitchellh/vagrant/issues/1172#issuecomment-9444659)
* [CentOS VirtualBox 5 second latency on http requests - Stack Overflow](http://stackoverflow.com/questions/12751597/centos-virtualbox-5-second-latency-on-http-requests/12751862#12751862)

具体的には、CentOSがVirtualBoxのNAT DNS Proxy(10.0.2.3)を読みにいくように設定されていると、名前解決が異常に遅くなる、というのが根本原因。
VagrantでVirtualBox Providerを利用していて、NAT DNS Proxyを使うような設定がされているboxを使っていた場合、名前解決に時間がかかるためにbundle installやgem installが異常に遅い、という結果になる。

対策としては、以下のようにVirtualBox Providerを設定することでNAT DNS Proxyを無効化すれば、ホストOSのネットワークから/etc/resolv.confの設定を自動判別するようになり、結果的に解決する。

```rb
config.vm.customize ["modifyvm", :id, "--natdnsproxy1", "off"]
config.vm.customize ["modifyvm", :id, "--natdnshostresolver1", "off"]
```
yum remove hogehogeする時とかに


td-agentのversion 1系を削除しようとして```yum remove -y td-agent```やって綺麗に消えなかったっぽかったので、rpmに含まれているファイルを見たりとかしたのでメモ。

# このファイルがなんのパッケージに紐付いているか見る。
```
rpm -qf /usr/sbin/td-agent
td-agent-1.1.18-0.x86_64 # パッケージ名が出てくる。
```

# rpmで作成されたファイル一覧を見る
```
rpm -ql td-agent
```
ぐあーって出てくる

# rpmの情報を見る
```
rpm -qi td-agent
Name        : td-agent                     Relocations: (not relocatable)
Version     : 1.1.18                            Vendor: Treasure Data, Inc.
Release     : 0                             Build Date: 2013年12月05日 16時22分10秒
Install Date: 2014年11月05日 11時32分58秒      Build Host: ip-10-123-31-198.ec2.internal
Group       : System Environment/Daemons    Source RPM: td-agent-1.1.18-0.src.rpm
Size        : 111682784                        License: APL2
Signature   : DSA/SHA1, 2014年01月10日 16時40分52秒, Key ID 1093db45a12e206f
URL         : http://treasure-data.com/
Summary     : td-agent
Description :
```
eclipseでvm変数を引き渡して実行

eclipseのメニュー
実行＞実行構成＞引数タブのVM引数の欄に以下のオプションを指定すると、
ユーザー指定の変数と値を引き渡して実行することができる

<オプション>
-D変数=値

複数指定する場合は以下のとおり
<オプション>
-D変数1=値1 -D変数2=値2 -D変数3=値3

参照元
https://docs.oracle.com/javase/jp/1.3/tooldocs/linux/java.html
Memoistでメソッドをメモ化して処理を速くする

## Memoist
https://github.com/matthewrudy/memoist

いわゆるメモ化をサポートしてくれるライブラリのようです。
READMEには、ActiveSupport::Memoizableを抜き出した旨が書いてありました。

## インストール

```bash
$ gem install memoist --no-ri --no-rdoc
```

## 使い方

READMEのまんまですが、クラスメソッドの場合はこんな感じで書くと良さそうです。

```ruby
require 'memoist'

module Hoge
  class << self
    extend Memoist
    
    def fib(n)
      if n < 2
        n
      else
        fib(n-2) + fib(n-1)
      end
    end
    memoize :fib
  end
end

Hoge::fib(100) #=> 354224848179261915075
Hoge::fib(200) #=> 280571172992510140037611932413038677189525
```


## ベンチマーク

せっかくなので、どれくらい高速化されたかベンチマークスクリプトを書いてみます。

```ruby:fib.rb
#!/bin/env ruby

# fibonacci
# @param [Fixnum] n
# @return [Fixnum]
def fib(n)
  if n < 2
    n
  else
    fib(n - 2) + fib(n - 1)
  end
end

if __FILE__ == $0
  require 'optparse'
  require 'benchmark'

  # コマンド引数に -m を付けるとメモ化する.
  params = ARGV.getopts('m')
  if params["m"]
    require 'memoist'
    extend Memoist
    memoize :fib
  end

  Benchmark.bm do |bm|
    [20,30,40].each do |n|
      bm.report("fib(#{n})") {
        puts " #=> #{ fib(n) }"
      }
    end
  end
end
```

### 実行結果

メモ化なし版

```bash
$ ruby fib.rb
       user     system      total        real
fib(20) #=> 6765
  0.010000   0.000000   0.010000 (  0.002523)
fib(30) #=> 832040
  0.320000   0.000000   0.320000 (  0.327861)
fib(40) #=> 102334155
 38.940000   0.010000  38.950000 ( 39.023283)
```

メモ化あり版

```bash
$ ruby fib.rb -m
       user     system      total        real
fib(20) #=> 6765
  0.000000   0.000000   0.000000 (  0.000663)
fib(30) #=> 832040
  0.000000   0.000000   0.000000 (  0.000657)
fib(40) #=> 102334155
  0.000000   0.000000   0.000000 (  0.000176)
```

メモ化することで如実に速くなってます。
なにより高速化するにあたり既存のロジックを修正しなくて済むのがラクですね。
Linuxのコマンドやスクリプトをリソース制限付きで実行する方法

先日、自分が書いたスクリプトがサーバのCPU使用率を使いすぎてしまいちょっと困った事態になったのでその対応方法を記録しておきます。

ちなみにどういった事件が起きたかというと、

アプリログからエラーを収集するスクリプトを作成した。
jenkinsにて定期実行した。
アプリのエラーが数千万件発生しておりエラー収集スクリプトが通常であれば数秒で終わるはずが数時間たっても終了しない。
後続のjobが追い討ちをかけてCPUの使用率を上げてしまった。

という事件です。（本番環境ではなくテスト環境だったのが唯一の救い…）

#（方法1）timeoutを使って制限

起動プロセスが設定時間内に終わらなかった場合、
timeoutを使えば子プロセス含めプロセスをkillできるらしいです。
```
timeout [OPTION] NUMBER[SUFFIX] COMMAND [ARG]...
```

# (方法2)　ulimitを使って制限

timeoutは実行時間で制限をかけることはできますが、
CPU実行時間だったり使用メモリ量だったりを考慮して、細かく制限をかけたい場合はulimitを使うと良いです。

```
ulimit [-acdflmnpstuvHS] [N]
```
開発用ビルドにだけ解析ツールを組み込みたい

　Crashlyticsなどのクラッシュ計測ツールを利用するとXcodeに繋いでデバッグしているとき以外でも簡単に、詳細なクラッシュ要因を受け取ることができます。
　ですが、不特定多数のユーザに関する情報を収集することになるので利用規約を準備して、収集内容をユーザに説明した上で収集に同意してもらう必要があります。

　正直なところもの凄く手間な上にチュートリアルの突破率も下がるので、私が開発するアプリではBetaを使ったテスター配布のアプリにだけクラッシュ解析ツールを導入するようにしています。
　今回はその方法について。 Debug/Release版での処理切り分けに使ったり応用性も高いです。


# TARGETSを複製する
　Configurationsを複製するだけでもいいんですが、TARGETSから複数用意した方がヒューマンエラーが減るのでいいと思います。
![ss1.png](https://qiita-image-store.s3.amazonaws.com/0/34166/7bbf7b70-f16b-a340-cf6d-74214b864446.png)
別にiPad版を作るわけではないので、「Duplicate Only」を選択します。

![ss2.png](https://qiita-image-store.s3.amazonaws.com/0/34166/6bf502ec-4fa3-22b9-b7f6-0ada3f75bf1f.png)
　新しく「元になったTARGET名 copy」というTARGETと、勝手に名前を付けられたplistが増えると思います。
　ちょっとこのままだと微妙な名前なのでリネームします。取り合えず適当にdebugとか。
![ss3.png](https://qiita-image-store.s3.amazonaws.com/0/34166/7ddb86ad-b039-d2a5-1905-8f34f7b0314c.png)
![ss4.png](https://qiita-image-store.s3.amazonaws.com/0/34166/a1d0655f-38b6-bb21-920b-a6a8d9bb63e9.png)
　TARGETSに戻って、こちらもcopyからdebugに変更。info.plistの名前を変更したので紐付けが外れてしまってますので、「Choose Info.plist File ...」から先ほどリネームしたファイルを紐付けます。

![ss5.png](https://qiita-image-store.s3.amazonaws.com/0/34166/d3a1c25e-4ba8-ec60-ed8e-64ae9ca95759.png)
　デバッグ用はBundle Identifierを切り分けて別アプリとしてホーム画面に置きたい場合は、直接Bundle Identifierを書き変えるかProduct Nameを別名にしてしまいます。
　※Product Nameを変更したらCrashlyticsへはまた再登録してください

# Preprocessor Macrosを設定する
![ss6.png](https://qiita-image-store.s3.amazonaws.com/0/34166/8dfc4fff-92a1-8f8b-6303-a1e6da6988c9.png)
　Build Settingsから、もしBasicが選択されていたら「All」を選択してプリプロセッサマクロを設定します。
![ss7.png](https://qiita-image-store.s3.amazonaws.com/0/34166/d8eae48f-5666-462d-d6cb-0ba180dae0bc.png)
　取り合えず適当にそれっぽい名前で。これを定義しておくと、ビルドする際にこのTARGETS、このConfigurationsのときにだけこの定義が行われます。

![ss8.png](https://qiita-image-store.s3.amazonaws.com/0/34166/be184248-b428-9665-8164-2186021930d6.png)
　例えばこんな感じで書くことで、CrashlyticsをインストールしたいビルドにだけPreprocessor Macrosで「VALID_CRASHLYTICS=1」を定義することができます。使わないTARGETSではCrashlyticsのライブラリリンク自体切ってもいいかもしれませんね。
　これでストア申請用のバージョン以外は別のTARGETSからビルドする、というオペレーションにしておけば本番用ビルドには解析ツールを導入することなくクラッシュ解析ツールの導入、またCrashlyticsならばBetaによるテスターへの配布ということが行えるようになります。

　例えば私がいま開発中のアプリでは、アプリ名の後ろにdebug、adhocの名称がついているTARGETSを別に用意していてデバッグ版、本番環境のAdHoc版で切り分けるようにしています。


# その他
　Preprocessor Macrosは色々なことに応用できます。
 例えばNSLogの出力内容はリリース後のアプリからでも閲覧可能なので、実機をPCにつないでOrganizerとかiPhone構成ユーティリティを開いてアプリ起動して見ると表示されてしまいます。
　そのため、例えば以下のように記述してNSLogは本番環境では動作しないようにさせることができます。

```objc
#ifdef	DEBUG
#define	NSLog(...);	NSLog(__VA_ARGS__);
#else
#define NSLog(...);	// NSLog(__VA_ARGS__);
#endif
```
インデックスを利用し、PostgreSQLで大文字小文字を無視した検索を行う


# 概要
文字列型（マイグレーションファイルで`string`を指定したカラム）について、PostgreSQL では MySQL と異なり、デフォルトで大文字小文字を区別 (case sensitive) します。

そのため、大文字小文字を無視したクエリを発行するためには工夫が必要です。
また、対応方法によっては関数インデックスという機能が使用でき、高速な検索が可能となります。

## 照合順序
照合順序は特別な設定はしておらず、`en_US.UTF-8`を利用しています。

# 解決方法
以下の2パターンの解決方法があります。

1. ILIKE を使用する
2. LOWER を使用する

インデックスを利用していない状態で両者を試してみましたが、LOWER を使用した場合の方が若干早いように感じました。なんとなくそんな気もしますが、気のせいのような気もします。もっとクエリのコストとかについて勉強しておきたい……。

また、インデックスに関して、以下のような記述が見つかりました。

> LOWER(bar) = LOWER(?) will work on MySQL and Postgres, but is likely to perform terribly on MySQL : MySQL won't use its indexes because of the LOWER function. On Postgres you can add a functional index (on LOWER(bar) ) but MySQL doesn't support this.

なけなしの英語力で一言でまとめると、「LOWER 使うと PostgreSQL だったら関数インデックス使えるけど、MySQL だとそれサポートしてないよ！」ということだと思います。

## 関数インデックス
関数インデックスってなんやねんって感じだったので、調べました。

> インデックス列は、基礎をなすテーブルにある列である必要はなく、そのテーブルの１つ以上の列から計算される関数やスカラ式とすることもできます。 この機能は、ある演算結果に基づいた高速テーブルアクセスを行う時に有用です。
> 
> <cite>[11.7. 式に対するインデックス](https://www.postgresql.jp/document/9.3/html/indexes-expressional.html)</cite>

どうやら、式や関数に食わせた値に対するインデックスを作成できる機能が PostgreSQL にはあるそうです。また、特にその中でも関数を利用したものを関数インデックスと呼ぶことがあるとのことでした。

つまり、LOWER 使っとけば良いんだよ！ってことですね！たぶん！

# 記述方法
実際に Rails で記述する方法です。

## ILIKE を使用する
PostgreSQL では ILIKE を利用すると、大文字小文字を無視した検索が可能です。

```sql
SELECT
  tables.*
FROM
  tables
WHERE
  column ILIKE 'hoge';
```

ILIKE での検索は、Arel の`matches`を利用すれば以下のように書けます。

```ruby
tables = Table.arel_table
Table.where(tables[:column].matches('hoge'))
```

## LOWER を使用する
両者に LOWER を用いることで、大文字小文字を無視した結果を得ることができます。

```sql
SELECT
  tables.* 
FROM
  tables
WHERE
  LOWER(column) = LOWER('hoge');
```

Rails では次のように書けます。

```ruby
Table.where('lower(column) = ?'), 'hoge'.downcase)
```

```ruby
  1 class AddLowerKeywordIndexToTags < ActiveRecord::Migration¬
  2   def change¬
  3     sql = 'CREATE INDEX tags_lower_keyword_idx ON tags (lower(keyword));'¬
  4     ActiveRecord::Base.connection.execute(sql)¬
  5   end¬
  6 end¬
```

# 補足
PostgreSQL で大文字小文字を区別するには、[citext](https://www.postgresql.jp/document/9.3/html/citext.html) という型を使う方法もあります。
こちらは、比較の際に内部で LOWER を適用しているそうです。

関数インデックスに関しては、面倒だったので張っていません。張ったらどれくらい早くなるのか、マイグレーションファイルに書く方法とかないのかとか、気になることはありますが、それはまたの機会に……。
関数インデックスが PostgreSQL 特有の機能だとすると、マイグレーションファイルでいい感じに書くのは無理そうな気もします。

# 追記
関数インデックスを貼ってみました。

> [RailsでPostgreSQL使用時にインデックスを利用したcase-insensitiveな検索を行う](http://qiita.com/necojackarc/items/206dee46f001ad87967e)


# 参考文献
- [PostgresSQL+ActiveRecordのwhereで大文字小文字を無視](http://xoyip.hatenablog.com/entry/2014/05/24/190000)
- [How do you write a case insensitive query for both MySQL and Postgres?](http://115.28.181.12/en/questions/fa0da58e0537bcbd9087c860da601db6cc4ca0b85edc89331cc7b3fe12b2ca3c/)
AWS CLIでのEC2インスタンス起動時Wait


自動化の中でEC2インスタンスを起動させてから、Chefやらなんやらを投入していく流れになると思うが、AWS CLIではWaitが可能になっている。(その他SDKももちろん可能)

特にEC2インスタンス起動においては[doc](http://docs.aws.amazon.com/cli/latest/reference/ec2/wait/index.html)の説明やコマンドのヘルプ等で見ると、2つの状態でWaitが可能。

* instance-running
* instance-status-ok

だが、`instance-running` はサーバの電源ONに近いイメージで起動させただけの状態なので、当然OSも上がっておらず通信は出来ない。
なので、何をチェックしているかの詳細はわからないが、OSレベルでの起動確認までしている `instance-status-ok`をWaitした方が良い。

起動と同時に上記2つをWaitさせた検証結果がこんな感じ。


#### EC2インスタンス起動
```
$ time aws ec2 start-instances --instance-ids i-XXXXXXXX

real	0m0.963s
user	0m0.375s
sys		0m0.073s
```


#### instance-runningでWait
```
$ time aws ec2 wait instance-running --instance-ids i-XXXXXXXX

real	0m15.993s
user	0m0.391s
sys		0m0.066s
```


#### instance-status-okでWait
```
$ time aws ec2 wait instance-status-ok --instance-ids i-XXXXXXXX

real	3m32.230s
user	0m0.471s
sys		0m0.071s
```

環境により実行時間に多少の誤差は出ると思われるが、15秒程度で返ってきている。
でも、`instance-running` を信用して即座にSSH接続なりPingしても普通に返ってこない。。。存在価値があるのだろうか？
Chef Soloをインストールしてsshdのポート番号を変更するまでメモ

### 環境
* CentOS 7 on Win7(VMWare Player)

### 手順
```bash:事前準備
# yum install git
# yum install ruby-devel 
```

```bash:chef-soloインストール
# curl -L https://www.opscode.com/chef/install.sh | bas h
# gem insall chef
# git clone git://github.com/opscode/chef-repo.git
# knife configure
```

```bash:クックブック作成
# knife cookbooks/ create sshdconfig -o cookbooks/
※sshd_configファイルをsshd_config.erbとして「sshdconfig/templates/default」ディレクトリ名に配置。ポート番号を変更(例：12345）
# vim sshd_config.erb
Port 12345
# vim cookbooks/sshdconfig/recipes/default.rb
service "sshd" do
     supports :status => true, :restart => true, :reload => true
     action [ :enable, :start ]
 end

template "sshd_config" do
    path "/etc/ssh/sshd_config"
    source "sshd_config.erb"
    user "root"
    group "root"
    mode "600"
    notifies :reload, "service[sshd]"
end
```


```bash:ChefSoloの実行準備と実行
# vim localhost.json
{
        "run_list" : [
                "recipe[sshdconfig]"
        ]
}
# vim solo.rb
file_cache_pacht "/tmp/chef-solo"
cookbook_path ["/var/chef/cookbooks"]
# chef-solo -c solo.rb -j localhost.json
```

ポートが変わっていることを確認して終わり。


### 参考
chefでsshd_configを設定する | はじめるの終わり http://blog.pseudepigrapha.net/vagrant/chef%E3%81%A7sshd_config/

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00BSPH158/kuredev-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/31u6VLGX2kL._SL160_.jpg" alt="入門Chef Solo - Infrastructure as Code" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00BSPH158/kuredev-22/ref=nosim/" name="amazletlink" target="_blank">入門Chef Solo - Infrastructure as Code</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/" title="amazlet" target="_blank">amazlet</a> at 15.04.13</div></div><div class="amazlet-detail">伊藤直也 (2013-03-11)<br />売り上げランキング: 3,040<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00BSPH158/kuredev-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jpで詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>
（仮）cocostudio連携、Armatureクラス（仮）

メモ

cocos2d−x　3.2
cocostudio　1.6

//　Armatureクラスオブジェクト から取れるパラメタで目ぼしい物
Bone *bone =(armature->getBone("body"));
ArmatureAnimation *anim = (armature->getAnimation());
BaseData* baseData = (armature->getBone("body")->getWorldInfo());

ArmatureAnimationオブジェクトを取得し、
->play(anim名、ほか);メソッドを呼び出して再生。
リモートで削除されたbranchを半自動で削除する

## 経緯
リモートで削除されたbranchが`git br -a`したときに大量に表示され困っていたところ、教えて頂いたのでメモしておく。

## 設定方法

```
$ git config --global fetch.prune true
```

これでgit fetchする度に削除される。`git fetch --prune` を毎回叩く必要がないので便利。
bashでFTPファイル取得とエラー判定

FTPをする機会も最近はないのですが、
shellからファイル取得して、エラー処理したかったので簡単に実装してみました。
エラーコードはRFC参照
http://hp.vector.co.jp/authors/VA002682/rfc959j.htm

```
#!/bin/bash
# 検出したいFTPのエラーをリストにしてエラー判定
FTP_ERROR_LIST=(421 425 426 450 451 452 500 501 502 503 504 530 532 550 551 552 553)

ftp -i -v -n << END > $FTP_LOG
open $FTP_SERVER
user $FTP_USER $FTP_PASSWD
bin
get $GET_FILE
quit
END

for err_no in ${FTP_ERROR_LIST[@]}
do
  grep "^$err_no " $FTP_LOG > /dev/null
  if [ "$?" -eq 0 ]; then
    echo "FTP Failed. [${err_no}]"
    exit 1
  fi
done
```
CloudFormationで新旧LaunchConfigurationをrolling updateで切り替える


# CloudFormationの動作

* LaunchConfiguration に更新があった場合、新規 LaunchConfiguration が作成される
* AutoScalingGroup の UpdatePolicy に従って順次新規EC2インスタンスに切替わる
* 切替え処理が成功すると旧 LaunchConfiguration は削除される

# CloudFormationテンプレート

`AWS::AutoScaling::AutoScalingGroup` リソースの定義内で `UpdatePolicy` を指定する。

* `MinInstancesInService` で指定した台数を残しつつ `MaxBatchSize` で指定した台数の範囲でterminateとrunを繰り返す。
* `WaitOnResourceSignals` がtrueの場合、インスタンス起動時に `cfn-signal` や `aws cloudformation signal-resource` でCloudFormationに起動完了を通知してやる必要がある。
* `PauseTime` は `WaitOnResourceSignals` を指定するかどうかで少し意味合いが変わる。trueの場合 `signal-resource` の通知を待機するタイムアウト時間になり、タイムアウトするとupdate失敗になる。falseの場合は起動成否を確認できないので、単純に次のインスタンスを起動するまでのインターバルになる。

詳細は[UpdatePolicyに関するドキュメント](http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-attribute-updatepolicy.html)を参照。

```json
{
  "Resources": {
    "Group": {
      "Type": "AWS::AutoScaling::AutoScalingGroup",
      "UpdatePolicy": {
        "AutoScalingRollingUpdate": {
          "MaxBatchSize": "2",
          "MinInstancesInService": "5",
          "PauseTime": "PT10M",
          "WaitOnResourceSignals": "true"
        },
        "AutoScalingScheduledAction" : {
          "IgnoreUnmodifiedGroupSizeProperties" : "true"
        }
      },
      "Properties": {
        :
      }
    }
  }
}
```

# 注意点

* LaunchConfiguration内のMetadataに変更があっても検知されずupdateは行われない。
続：Docker でコンテナを立ち上げた時に Hubot を起動したい

[以前の記事](http://qiita.com/KeithYokoma/items/7fc67aae2a2c552f263c) で、`CMD`を使って Hubot を起動することで、`docker run -d`時にコンテナを立ち上げるとともに Hubot が動くようになった。

しかしこの方法の場合、Hubot が何らかの時間のかかるタスクを実行すると、Hubot からの ping が帰ってこなくなって Slack とのコネクションが切られてしまう。そうすると、`CMD`で実行した Hubot の起動コマンドも終了することになり、結果コンテナも止まってしまうことになる。

# forever

https://github.com/foreverjs/forever

npm にある、コマンドを裏で実行し続けてくれるコマンド。これを使って以下のようにすると、Hubot が永続的に実行される。

forever でハマるポイントはここにまとまっている(http://qiita.com/kacky69/items/ee806b8c17bbd70ca55e)。

```
$ forever start -c coffee node_modules/.bin/hubot -a slack
```

ただし、forever は実行したいコマンドをバックグラウンドプロセスに回すだけで、このままではコマンドは正常終了してしまう。
つまり、`CMD`にこの文を突っ込んでも、コンテナ起動後にすぐ停止してしまう。

# tail -f

そこで、`CMD`のコマンドの最後に`tail -f something`を入れる。

```

CMD forever start -o out.log -r err.log -c coffee node_modules/.bin/hubot -a slack; tail -f out.log
```

これで`tail -f`がフォアグラウンドになるので、`docker run -d`後もコンテナが起動したままになってくれる。
CakePHPのMigrations Pluginの使い方

## 初回時
`Console/cake Migrations.migration generate -f`
`Console/cake schema generate -f`

## テーブルも構成が変わった時（スキーマ変更時）
`Console/cake Migrations.migration generate -f`

## 変更の反映
`Console/cake Migrations.migration run all`
SSG140 を使って AWS VPC への VPN を複数構築

主にSSG側の設定について記載します。  
ので、VPC の VPN まわりの設定については省略します。

# 概要構成図
  
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/r/rriifftt/20141005/20141005175037.png" alt="f:id:rriifftt:20141005175037p:plain" title="f:id:rriifftt:20141005175037p:plain" class="hatena-fotolife" itemprop="image"></span></p>

# 前提

* ScreenOS 6.3
* インターネット回線は 1 本でOK
    * もちろん複数あってもよい
* ~~複数の固定IPを持っている~~
    * ~~AWSアカウントが異なる場合は同一IPでも大丈夫かもしれない~~
    * ~~aws で設定するカスタマーゲートウェイのIPは同一リージョンで一意でなくてはならない~~
    * コメント欄をご確認ください
* SSG に空きポートが1つ以上ある
* 1本目のVPNは構築済み
    * bgp / static のどちらでも OK
    * tunnel.1 と tunnel.2 を利用
    * デフォルトの trust-vr を利用

# 概要

* SSG内に新規で仮想ルータを作成して既存に影響を与えないようにする
* 空きポートにグローバルIPを付与する
* 2本目は static  vpn で構築する

# 設定

### vrouter 作成
新規で vrouter を作成する。  

```
set vrouter name "test-vr" sharable
set vrouter "test-vr"
unset auto-route-export
set ignore-subnet-conflict
```

### zone 作成

```
set zone name "test"
set zone "test" vrouter "test-vr"
```

### インターフェイス設定

グローバルIPをインターフェイスに付与。  
このIPで customer gateway が作られていること。  
また、 /32 でないと VPN 設定がエラーになってコマンドが入らない。

```
set interface ethernet0/* zone "test"
set interface ethernet0/* ip ***.***.***.***/32
set interface ethernet0/* nat
```

### ポリシー設定

実際は細かく設定する。

```
set policy top from "test" to "Trust" "Any" "Any" "ANY" permit log
set policy top from "Trust" to "test" "Any" "Any" "ANY" permit log
```

### Amazon から DL したコンフィグを編集してコピペ

* DL するコンフィグは static 、ダメなら bgp を使う
* DLしたコンフィグ内のインターフェイス名(tunnel、及び ethernet)と zone 名 を環境に応じて編集
* 既存で使っているVPNエンドポイント (169.254.252.0/30 の様なサブネット) に重複しないコンフィグをDLする
    * 重複してしまった場合はダミーのグローバルIPを使って customer gateway を作るなどする
        * こちらを参考にさせていただきました

[http://d.hatena.ne.jp/j3tm0t0/20120508/1336492600:embed]

### 既存ルータへのRouting

```
set vrouter "trust-vr"
set route 10.1.0.0/16 vrouter "test-vr" preference 20
set route 169.254.252.**/30 vrouter "test-vr" preference 20
set route 169.254.252.**/30 vrouter "test-vr" preference 20
```

### 新仮想ルータへのRouting

```
set vrouter "test-vr"
set route 0.0.0.0/0 interface ethernet0/* gateway ***.***.***.***/32
set route 10.1.0.0/16 interface tunnel.3 gateway 169.254.252.**
set route 10.1.0.0/16 interface tunnel.4 gateway 169.254.252.**
exit
```
つなぎたいところがあれば続けてルーティングを追加する

# 確認
* management console の vpn status を確認
* get sa コマンドで各 tunnel の status が A/U になることを確認

この方法で複数のVPCに対してVPNを構築できています。  

 # ハマったところ
vpn の static route にカスタマーゲートウェイへのルーティングエントリを追加しないと SSG 側でトンネルがリンクアップしませんでした。

元記事は[こちら](http://rriifftt.hatenablog.com/entry/2014/09/16/120822)
Swift1.2 で `touchesBegan` が変わった


Swift1.2 で Set が使えるようになったのですが、単に使えるようになっただけでなく、一部のメソッドで使われています。
この例が、タッチを検出する
touchesBegan メソッドです。
タッチ位置を知るためにこのメソッドをオーバーライドするケースがありますが、Swift1.1 まででは

`    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
}`

でしたが、Swift 1.2 では、このメソッドが、
`    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
}`

となり、touches のタイプが `NSSet` から `Set<Object>` になります。
NSSetのときには `touches.allPbjects[0].locationInView(viewName)` でポジションが得られたのですがこれがコンパイルエラーとなります。Set<Object> のメンバにAllObjects がないためです。
解決法は、以下のようにしました。

`        let touch = touches.first as! UITouch
        var pos = touch.locationInView(viewName)`

上記の例で、 as! UITouch も Swift 1.1 では as UITouch でOKでしたが、 Swift 1.2 ではこのようにunwrap しないとエラーです。
NSString のエラーは比較的簡単にとれますが、このSet のエラーは、結構時間がかかりました。
なお、Set のメソッドを調べるには、Set を選択して Command + クリックでSet の宣言部のソースが表示されます。
大きいサイズのmarkdownファイルで絵文字がうまく動かない@GitHub

##現象

GitHub上のマークダウン形式のファイルを更新しようとした際、文字数が一定数を超えると、なぜか絵文字が無効化されてしまう現象が起きた。

![zz_スクリーンショット_2015-04-13_14_31_09.png](https://qiita-image-store.s3.amazonaws.com/0/47881/7d5de56b-4963-1553-018f-77f2488238fb.png)


##解決法

調べても解決方法が見つからなかったので、GitHubに問い合わせると、以下のような回答が来た。

>We have temporarily disabled Emoji rendering in large documents because of performance issues. This is a temporary measure while we work on improving the performance of our rendering pipeline. We will restore this functionality as soon as possible. Apologies for the inconvenience.


要約すると「パフォーマンスの問題で一時的にサイズの大きいファイルでは絵文字のレンダリング機能を無効にしているが、できる限り早く元に戻します。ごめんなさい！」とのこと。

以上より、解決策はGitHubがこの機能を元に戻すのを待つしかなさそう。

ちなみに絵文字が動作しなくなるファイルサイズは不明だが、私が遭遇したケースでは16KB前後で絵文字が動かなくなった。