OmniAICreator/Qiita-1.07M huggingface dataset:
$0 ? なにそれ？ $PROGRAM_NAME なら分かる。 English ライブラリで特殊変数の可読性を上げる #ruby

## <i class="fa fa-smile-o" style="font-size:1em;"></i> 概要
Ruby の特殊変数（ `$0`, `$&` など ）を English ライブラリで可読性の高い変数名で扱う

## <i class="fa fa-question-circle" style="font-size:1em;"></i> English ライブラリ とは？
Ruby の特殊変数 `$0`, `$&` などに対して、 `$PROGRAM_NAME` , `$MATCH` などの変数名を
追加し、可読性を高めるためのライブラリです。

## <i class="fa fa-list" style="font-size:1em;"></i> English で定義される変数の一覧

|Name|Origin|
|:--|:--|
|$ARGV|$*|
|$CHILD_STATUS|$?|
|$DEFAULT_INPUT|$<|
|$DEFAULT_OUTPUT|$>|
|$ERROR_INFO|$!|
|$ERROR_POSITION|$@|
|$FIELD_SEPARATOR|$;|
|$IGNORECASE|$=|
|$INPUT_LINE_NUMBER|$.|
|$INPUT_RECORD_SEPARATOR|$/|
|$LAST_MATCH_INFO|$~|
|$LAST_PAREN_MATCH|$+|
|$LAST_READ_LINE|$_|
|$MATCH|$&|
|$OFS|$,|
|$ORS|$\|
|$PID|$$|
|$POSTMATCH|$'|
|$PREMATCH|$`|
|$PROGRAM_NAME|$0|

## <i class="fa fa-cloud-download" style="font-size:1em;"></i> おまけのスクレイピングスクリプト
変数名の表を手動で作成するのが嫌だったので、るりまのページをスクレイピングして
Markdown のテーブルを生成しました。

### <i class="fa fa-code" style="font-size:1em;"></i> プログラム
~~~ruby
require 'open-uri'
require 'nokogiri'

uri = 'http://docs.ruby-lang.org/ja/2.2.0/library/English.html'
page = URI.parse(uri).read

document = Nokogiri::HTML(page, uri)
english_variables = document.xpath('//a').map(&:text).select { |e|e.match /\$[A-Z_]+/ }
english_variables.each do |english_variable|
  without_dollar = english_variable.delete('$')
  origin_uri = "http://docs.ruby-lang.org/ja/2.2.0/method/Kernel/v/#{without_dollar}.html"
  origin_page = URI.parse(origin_uri).read
  origin_document = Nokogiri::HTML(origin_page, origin_uri)
  origin_variables = origin_document.xpath('//a').map(&:text).select { |e|e.match /\$.+/ }.first
  puts "|#{english_variable}|#{origin_variables}|"
end
~~~

### <i class="fa fa-file-o" style="font-size:1em;"></i> 出力

~~~
|$ARGV|$*|
|$CHILD_STATUS|$?|
|$DEFAULT_INPUT|$<|
|$DEFAULT_OUTPUT|$>|
|$ERROR_INFO|$!|
|$ERROR_POSITION|$@|
|$FIELD_SEPARATOR|$;|
|$IGNORECASE|$=|
|$INPUT_LINE_NUMBER|$.|
|$INPUT_RECORD_SEPARATOR|$/|
|$LAST_MATCH_INFO|$~|
|$LAST_PAREN_MATCH|$+|
|$LAST_READ_LINE|$_|
|$MATCH|$&|
|$OFS|$,|
|$ORS|$\|
|$PID|$$|
|$POSTMATCH|$'|
|$PREMATCH|$`|
|$PROGRAM_NAME|$0|
~~~

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [library English - るりま](http://docs.ruby-lang.org/ja/2.2.0/library/English.html)
Kibana入門

## Kibana インストール & 起動

```
$ wget https://download.elastic.co/kibana/kibana/kibana-4.0.2-linux-x64.tar.gz
$ tar zxvf kibana-4.0.2-linux-x64.tar.gz
$ cd kibana-4.0.2-linux-x64
$ ./bin/kibana
```

### Firewallポートを開ける

```
# firewall-cmd --zone=public --add-port=5601/tcp
```

http://example.com:5601
へアクセスするとKibanaの画面になる
LCSymbolFontの使い方

以下の記事の補完です。
[iOS向けのアイコンフォントライブラリを生成 & GitHubにPushするサービスを作った](http://qiita.com/hayashi311/items/259e7e007fd865861012)

# 使いかた

`Podfile`は以下のようになります。

```rb
platform :ios, '8.0'

use_frameworks!

target 'IBSymbolDemo' do
  pod 'LCSymbolFont', :git => 'git@github.com:iconfont/LCSymbolFont.git'
  pod 'LCSymbolFont/UI', :git => 'git@github.com:iconfont/LCSymbolFont.git'
end
```

`LCSymbolImageView`は必要ない場合もあるかと思い、subspecに入っています。

CocoaPods 0.36から`use_frameworks!`が使えるようになりました。
CocoaPods経由で組み込むライブラリをframeworkとして扱う機能です。（普通はstatic library)

ざっくり説明すると、swiftで使える、`IBDesignable`を使えるなどのメリットがありますが、frameworkはbundleなのでリソースのパスなどが変わります。
新しく始めるプロジェクトでは`use_frameworks!`を使うことを個人的にはお勧めします。

`use_frameworks!`を使わなくても`LCSymbolFont`を使うことができますが、`IBDesignable`が効かなくなります。
(Xcode 6.3では`IBDesignable`関連の不具合があるので、6.3.1以降を使ってください)

### UIAppFontsは?
Xcode6からカスタムフォントを組み込む際、`Info.plist`に`UIAppFonts`を設定しなくても自動で組み込んでくれるようになりました。

# デザインのワークフローに組み込む

出力されたアイコンフォントを使えば、PhotoShopやSketchから文字を入力するのと同じ要領でアイコンを呼び出すことができます。
bashからSQL*Plusを起動してSQLを実行する


## 0.概要

bashのシェルスクリプトからSQL*Plusを起動してSQLを実行してます。
基本ではあるんだけど、やっぱり動いた実績のあるソースを
備忘として残しておきたいので記事化。
bash側で受け取った引数をそのままSQLに渡すとかもやってます。

## 1.コード本編

まずはbash側。
引数で日数を受け取って、チェック後SQLに渡してます。
また削除対象のテーブルを引数に応じて変更したりもしてます。
例によってちょくちょく出てくるファイル内で宣言していない変数は
全て共通環境変数から引っ張ってます。

```bash:DEL_TBL.sh

#!/bin/bash
# 機能名：テーブルデータ削除
#
# 引数(1):日数
# 引数(2):種類(1:ログテーブル 2:取込テーブル 3:データテーブル)

#共通環境変数読み込み
.COMMON.sh

SCRPT_NAME="DEL_TBL.sh"

${SCRPT_SHLOG} ${SCRPT_NAME} "I" "テーブルデータ削除開始 $1 $2"

#日数チェック
num=`expr "$1" : [0-9]`
if [[ ! $num -eq 1 ]]
then
	${SCRPT_SHLOG} ${SCRPT_NAME} "E" "引数1が不正です"
	${SCRPT_SHLOG} ${SCRPT_NAME} "E" "異常終了"
	exit 9
fi

#削除対象テーブル決定
if [ $2 -eq 1 ]
then
	SQL_FILE=$SCRPT_SHELL/LOGTBL_DEL.sql
elif [ $2 -eq 2 ]
then
	SQL_FILE=$SCRPT_SHELL/TORIKOMITBL_DEL1.sql
elif [ $2 -eq 3 ]
then
	SQL_FILE=$SCRPT_SHELL/DTTBL_DEL.sql
else 
	${SCRPT_SHLOG} ${SCRPT_NAME} "E" "引数2が不正です"
	${SCRPT_SHLOG} ${SCRPT_NAME} "E" "異常終了"
	exit 9
fi

#ora_connはuser/pass@host[:port]の構成
ora_conn=${ORA_CONN}
#sqlplus起動 ここからEOFまでsqlplus側のコード
sqlplus -s /nolog << EOF
conn $ora_conn
-- エラー時の戻り値設定
WHENEVER OSERROR EXIT 9
WHENEVER SQLERROR EXIT 9
SET SERVEROUTPUT ON SIZE UNLIMITED
-- 不必要な項目の表示抑制
SET NEWPAGE NONE
SET SPACE 0
SET TIME OFF
SET TIMING OFF
SET ECHO OFF 
SET FEEDBACK OFF 
SET HEADING OFF 
SET PAGESIZE 0 
SET VERIFY OFF
-- 問い合わせ結果非表示
SET TERMOUT OFF

-- SQL実行
@$SQL_FILE $1
exit COMMIT

EOF

#[正常終了ログ出力]
${SCRPT_SHLOG} ${SCRPT_ID} I ${MSG_N_END}

exit 0

```

SQLはそれぞれこんな感じ
&1で渡してるのが引数です。

```sql:LOGTBL_DEL.sql
DELETE 
  FROM LOG_TBL
 WHERE 
   TO_CHAR(OUTPUTTIME , 'YYYYMMDD') < TO_CHAR(CURRENT_TIMESTAMP-&1, 'YYYYMMDD')

```

こちらは複数テーブルの削除をしたいので
SQLファイルの中から別のSQLファイルを呼んでいます。
その際引数もそのまま引き継いで渡してます。

```sql:TORIKOMITBL_DEL1.sql
DELETE 
  FROM TORIKOMI_TBL_H
 WHERE DELFLG = '1'
   AND TO_CHAR(INSDATE , 'YYYYMMDD') < TO_CHAR(CURRENT_TIMESTAMP - &1 , 'YYYYMMDD')

@TORIKOMITBL_DEL2.sql &1

```

呼ばれた先がこちら。

```sql:TORIKOMITBL_DEL2.sql
DELETE 
  FROM TORIKOMI_TBL_D
 WHERE DELFLG = '1'
   AND TO_CHAR(INSDATE , 'YYYYMMDD') < TO_CHAR(CURRENT_TIMESTAMP - &1 , 'YYYYMMDD')

```

最後の一つも同じような感じです。

```sql:DTTBL_DEL.sql
DELETE 
  FROM DT_TBL
 WHERE DELFLG = '1'
   AND TO_CHAR(INSDATE , 'YYYYMMDD') < TO_CHAR(CURRENT_TIMESTAMP - &1 , 'YYYYMMDD')

```
class のなかに decorator なんて書く必要がなかったんだ ありがとう contextmanager

[前投稿](http://qiita.com/trsqxyz/items/2634fb04f6406b8e2346)  
[![よつばと！ 凄い かっこいい](http://tiqav.com/5JL.th.jpg)](http://tiqav.com/5JL)
デコレーターなんてむずかしいことしないで始めから `contextmanager` をつかっていればよかったんだ……  

```py3:yo.py
from contextlib import contextmanager
import random

class Prot:
    def __init__(self):
        pass

    @contextmanager
    def yoyo(self, hey):
        print('gacha.') #  __enter__
        yield hey # as
        print('Everything Done Right.') #  __exit__

    def yo_gacha(self, y):
        yo = [y*i for i in range(10)] 
        return yo[random.randint(0, 9)]    

if __name__ == '__main__':
    p = Prot()
    with p.yoyo('hey') as y:
        print(p.yo_gacha(y))

```

`contextlib.contextmanager` は `with` をイイ感じに適用してくれるデコレーターで `yield` をはさんで `__enter__` と `__exit__` にわけてくれます 　
インデントがひとつ犠牲になるけど記述も楽だしとてもわかりやすい
`yield` で渡すと `as` で受け取れるのも理解しやすいかんじ  
いろいろラップしたいときはデコレーターを使ったほうがイイかもですが 勉強になりました
Yii 2 で Sort リンクをクリックしたときにページを 1 ページ目に戻す方法

## はじめに
デフォルトでは \yii\data\Sort クラスでリンクを作成する場合、ページが 3 ページ目ならば page=3 というパラメータを引き継いだままソートされます。これをソートリンクをクリックしたときにはページは 1 ページ目になるようにカスタマイズしてみます。

一応、GitHub の issue にもありますが、放置気味なので今後どうなるかはよくわかりません。
https://github.com/yiisoft/yii2/issues/4790

## Sort クラスを継承してカスタマイズする

\yii\data\Sort クラスを継承した独自の Sort クラスを作成。createUrl() で GET パラメーターの処理が書かれているみたいなので、処理の間に page パラメータがあればそれを削除する、みたいなコードを書き足しました:

```php:Sort.php
<?php

namespace app\data;

use Yii;

class Sort extends \yii\data\Sort
{
    /**
     * Returns the page paramater.
     * @return string
     */
    public function getPageParam()
    {
        return (new \yii\data\Pagination())->pageParam;
    }

    /**
     * @inheritdoc
     */
    public function createUrl($attribute, $absolute = false)
    {
        $params = $this->params;

        if ($params === null) {
            $request = Yii::$app->getRequest();
            $params = $request instanceof Request
                ? $request->getQueryParams()
                : [];
        }
        if (isset($params[$this->getPageParam()])) {
            unset($params[$this->getPageParam()]);
        }
        $params[$this->sortParam] = $this->createSortParam($attribute);

        $params[0] = $this->route === null
            ? Yii::$app->controller->getRoute()
            : $this->route;

        $urlManager = $this->urlManager === null
            ? Yii::$app->getUrlManager()
            : $this->urlManager;

        if ($absolute) {
            return $urlManager->createAbsoluteUrl($params);
        } else {
            return $urlManager->createUrl($params);
        }
    }
}
```

## \yii\data\Sort をすべて独自のものに変更する

あとは今までのものをすべて独自のクラスを使うように設定します:

```php
\Yii::$container->set('yii\data\Sort', [
    'class' => 'app\data\Sort',
]);
```
Open Network Lab 選考面接

![ons.png](https://qiita-image-store.s3.amazonaws.com/0/64177/87b3d630-862f-c0df-8130-a3e1af3a498d.png)

今日、企業家育成プログラム[Open Network Lab(onlab)](https://onlab.jp/)の選考面接を受けてきました。その内容について簡単にまとめておきます。

今回の面接を受けるにあたって、体験談のようなものがどこかにないか、事前にWebを調べたんですね。雰囲気や質問内容がある程度わかっていれば、事前に心づもりができますし。

でも、あまり有用な情報はなくて、参考になったのは[@kojimafujio氏のエントリ](https://onlab.jp/blog/archives/2012/03/open-network-lab-3.html)くらいでした。それで、後に続く人の参考になるかもと思ってこれを書きます。自分が面接を受けるときのイメージができるよう、印象や感想だけをざっと書くのではなく、全体の流れを書き下ししておきます。

# 面接について

今日ぼくらが受けたのは、書類面接を通った後の1回目の面接でした。1回目の面接ではSkypeかオフラインかを選べるのですが、僕らは東京にいることもあってオフラインで受けました。

場所は恵比寿にある『Open Network Space』というコワーキングスペースで、そこにある定員6名くらいの小さな会議室が会場でした。ぼくらは15分くらい前に到着したのですが、会議室で別のチームが面接を受けていました。おそらく同じ日に集中的にやっているのでしょう。ちなみに会議室の写真はOpen Network SpaceのWebサイトで見ることができます。

受付で面接に来たことを伝えると、適当な場所で待つように言われます。時間になると呼ばれて会議室に通され、アイスブレークなしで早々にスタート。1回目の面接は30分間で、最初5分でやろうとしていることのプレゼンをし、残り25分で質疑応答という流れです。

先方は3人で、こちらは友人とぼくの2人。先方がどういう方なのかはよくわからず。

# プレゼンテーション

会議室にはプロジェクタが設置されており、自分のノートPCを接続してプレゼンをします。デモをするのにインターネット接続が必要なら、Open Network SpaceのWifiを使わせてもらえます。（ぼくらはパワポ資料だけなので使いませんでした）

途中でコメントや質問を受けることはなく、こちらが事前の準備通りにプレゼンする感じでした。

# 質疑応答

先方からこちらのチームややろうとしていることに質問をするのと、こちらからonlabについて質問をする時間です。ぼくらの面接では以下のような質問を受けました。

### チームメンバーのプロフィール

友人とぼくがそれぞれ、自分のキャリアやチームでの立ち位置について簡単に述べる。また、友人の知人で専門的なアドバイスを貰えそうな人がいるので、その人についても述べる。

### 顧客をどのように獲得するのか。そのための計画はあるのか。

使ってくれそうな見込み顧客がいるので、動くものができたら持っていくつもり。他にもニーズはあると思うので顧客を獲得していきたい、みたいなことを述べる。

（※ぼくらの作ろうとしているのはB2Bなサービスで、公開すればユーザがどんどん使ってくれるものではなく、おそらく顧客開拓みたいなことをしないと使ってもらえるようにならないのです）

### 直近で何をするのか

「onlabの3か月でこれをやります」みたいなスライドを付録で作ってあったので、それを見せながら説明。

### 作ろうとしているサービス固有の具体的な質問

詳細は省くけれど、サービスのビジネスモデルに関わるものだけで、技術面に関わるものはなかった。

ニーズを見込めるのか、競合するサービスに対して優位な点があるのかを気にされていたと思われる。

# 面接全体の印象や感想

どうも、手応えがあるともないとも言えない、ふわっとした印象の面接でした。

この面接を受けるにあたって、ぼくらは事前にスタバに集まって作戦会議のようなことをして、突っ込まれそうなことをあれこれ考えてあったんですね。ですが、ぼくらのチームや作ろうとしているサービスの問題点を細かく詰められるという感じではなくて、ぼくらが考えてあった回答が役に立つ機会はほぼありませんでした。もちろんサービスについていくつか質問を受けましたが、どちらかというと概要レベルの質問だったと思います。

ぼくらのチームは動くプロダクトが何もないし(これはよくないことで、何かしら動くものがあってデモができるのが好ましい)、体制的にも足りない(向こうからはたぶんそう見える) ので、ツッコミどころは多々あるはずなのですが。

雰囲気はどちらかというと固かったです。時間がプレゼン込みで30分しかなく、アイスブレークや雑談に使う時間がないというのが大きいでしょうか。ぼくらのチームのキャラクタもあったかもしれません。

ああいう場所だと緊張してしまう人も多いでしょうから、何かしら雰囲気を和らげる工夫があるとよいかなとは思いました。

Open Network Labは今回が11期目で、たぶん先方はこういう面接を何百回とやっていて、応募者を評価して合否を決めるための基準やフレームみたいなものを持っているのでしょう。それに当てはめてぼくらがどうだったのか、就活の面接なんかだと先方の態度からそれを伺えることが多いですが、今回はそんなこともなくて、どうだったのかなあ。面接を受けた直後にこれを書いているので、まだ結果を知らされていないんですね。受かっているとよいのだけど。
MySQLでutf8mb4のマルチバイト文字を置換する


## 前提

MySQLのcharsetをutf8mb4に設定しておくとマルチバイト文字を保存することができます。
しかし、クライアント側の環境でマルチバイト文字を扱えない場合、SQL中に埋め込むことができなかったりします。

```sql
mysql> select name from user;

+-----------+
| name      |
+-----------+
| 𠮷田       |
+-----------+
| 尾𥔎       |
+-----------+

mysql> select replace(name, 'ð ®·', '吉') from user;

+-----------------------------+
| replace(name, 'ð ®·', '吉') |
+-----------------------------+
| 𠮷田                        |
+-----------------------------+
| 尾𥔎                        |
+-----------------------------+
```



## 解決方法

この場合、いったんhex関数で16進数のコードを取得して、0x〜のリテラルで文字を指定すればSQLに埋め込むことができます。

```sql
mysql> select hex(name) from user;

+----------------+
| hex(name)      |
+----------------+
| F0A0AEB7E794B0 |
+----------------+
| E5B0BEF0A5948E |
+----------------+

mysql> select replace(name, 0xF0A0AEB7, '吉') from user;

+---------------------------------+
| replace(name, 0xF0A0AEB7, '吉') |
+---------------------------------+
| 吉田                            |
+---------------------------------+
| 尾𥔎                            |
+---------------------------------+
```
【PHP】【CakePHP】CSVダウンロード

ダウンロードためにCSVを作る場合、implode()などを使って、変数上でCSVを作成する方法では、値内のダブルコートや改行のエスケープが面倒なためfputcsv()を使うと良い。

```php:php
fputcsv(リソース,配列)
```

参考：[PHPでCSVを生成する](http://lab.flama.co.jp/archives/1139/)


現実的な方法として、一旦メモリ上にCSVを作成してから出力する方法とCSV形式を都度出力する方法がある。

##一旦メモリ上にCSVを作成してから出力
都度で出力に比べ一旦作ることで、Content-lengthを出力することができるので、ブラウザの「ダウンロード残り時間」を表示できる。
一旦ファイルにCSVを作成してからreadfileで出力する方法は、ディスクIOが大きくパフォーマンスに問題があるので、一旦作るならメモリ上に作成するのが良い。

###PHPでの書きかた

```php:php
//メモリ上に領域確保
$fp = fopen('php://temp/maxmemory:'.(5*1024*1024),'r+');

$user_list = [
  [...],
  [...],
  [...],
];

foreach($user_list as $user){
  fputcsv($fp, $user);
}

header('Content-Type: text/csv');
header("Content-Disposition: attachment; filename=hoge.csv");

//ファイルポインタを先頭へ
rewind($fp);
//リソースを読み込み文字列取得
$csv = stream_get_contents($fp);

//CSVをエクセルで開くことを想定して文字コードをSJIS-winSJISへ
$csv = mb_convert_encoding($csv,'SJIS-win','utf8');

print $csv;

fclose($fp);
```

php://tempやphp://temp/maxmemoryやphp://memoryを使うことでメモリ上に領域を確保することができる。
メモリリークの危険性を考えると、使用するメモリの上限値を設定できるphp://temp/maxmemoryを使うと良い。
php://temp/maxmemoryは上限値を超えると自動削除される一時ファイルを作る。

参考：[PHPで一時的なファイルポインタを扱う方法](http://qiita.com/mpyw/items/f24d3764fe3eedf132ff)

mb_convert_encodingで変換するときは、SJISじゃなくてSJIS-winを使う。

参考：[SJISじゃなくてSJIS-win、EUC-JPじゃなくてeucJP-winを使おう](http://pentan.info/php/sjiswin_eucjpwin.html)

###CakePHPでの書きかた

```php:CakePHP

//メモリ上に領域確保
$fp = fopen('php://temp/maxmemory:'.(5*1024*1024),'a');

$user_list = [
  [...],
  [...],
  [...],
];

foreach($user_list as $user){
  fputcsv($fp, $user);
}

//ビューを使わない
$this->autoRender = false;

//download()内ではheader("Content-Disposition: attachment; filename=hoge.csv")を行っている
$this->response->download("hoge.csv");

//ファイルポインタを先頭へ
rewind($fp);

//リソースを読み込み文字列を取得する
$csv = stream_get_contents($fp);

//Content-Typeを指定
$this->response->type('csv');

//CSVをエクセルで開くことを想定して文字コードをSJIS-win
$csv = mb_convert_encoding($csv,'SJIS-win','utf8');

$this->response->body($csv);

fclose($fp);
```

参考：[【CakePHP】ファイルダウンロード](http://qiita.com/kazu56/items/5667f963624b603f9277)


##都度で出力
一旦作成するよりもこちらの方が早い。ただし、Content-lengthを出力できないため、ブラウザの「ダウンロード残り時間」は表示されなくなる。

###PHPの書きかた

```php:php
header('Content-Type: text/csv');
header("Content-Disposition: attachment; filename=hoge.csv");

$fp = fopen('php://output','w');

//CSVをエクセルで開くことを想定して文字コードをSJISへ変換する設定を行う
stream_filter_append($fp, 'convert.iconv.UTF-8/CP932', STREAM_FILTER_WRITE);

$user_list = [
  [...],
  [...],
  [...],
];

foreach($user_list as $user){
  fputcsv($fp, $user);
}
fclose($fp);

```

###CakePHPの書きかた

```php:php

//ビューを使わない
$this->autoRender = false;

//Content-Typeを指定
$this->response->type('csv');

//download()内ではheader("Content-Disposition: attachment; filename=hoge.csv")を行っている
$this->response->download("hoge.csv");

$fp = fopen('php://output','w');

//CSVをエクセルで開くことを想定して文字コードをSJISへ変換する設定を行う
stream_filter_append($fp, 'convert.iconv.UTF-8/CP932', STREAM_FILTER_WRITE);

$user_list = [
  [...],
  [...],
  [...],
];

foreach($user_list as $user){
  fputcsv($fp, $user);
}

fclose($fp);

```
elastic beanstalk cliの結果をshell内で待つようにした

aws cliでのコマンドは非同期のため、以下のようなコマンドを連続で実行しようとすると怒られます。

```
aws elasticbeanstalk update-environment --environment-name $PROD_ENV --template-name production

aws elasticbeanstalk swap-environment-cnames --source-environment-name $PROD_ENV --destination-environment-name $STAGE_ENV
```
```
A client error (InvalidParameterValue) occurred when calling the SwapEnvironmentCNAMEs operation: Environment 'tekitouna-env-name' is pending deployment.  Wait until the environment is available and try again.
```

なので待つようにしました。

```
npm install -g underscore-cli
```

```
while [ "Green" != $(aws elasticbeanstalk describe-environments --application-name $APP_NAME --environment-names $PROD_ENV | underscore select '.Environments .Health' --outfmt text) ]
do
  echo "hoge"
  sleep 5s
done

echo 'owatta'
```
オレオレREST API レスポンスフォーマット


## 前提

- 一つのAPIはひとつの関心を返す
- 一つのAPIは一通りのResponseTypeを返す。

### ResponseType

- RetrieveOne系: パラメータ等に応じて一つのオブジェクトを返す。
- RetrieveList系: パラメータ等に応じてオブジェクトの配列を返す。

## RetrieveOne系 

データが正常に返送できる場合には、妥当なキーでレスポンスを返す。
この時エントリのキー名がクラス名とバインドしていると処理が楽だったり。

````
HTTP 200

{
  status: "OK",
  product: {
    ...
  }
}

````

データが存在しない。取得する権限が無い。は400系エラー。
指定されたリクエストフォーマットの先にデータが存在しないことを示し、
リクエスト自体の無効を意味する。

````
HTTP 400

{
  status: "BAD",
  message: ...  // optional
}

````

サーバ上の障害等、システム要因に伴うエラーを示す。

````
HTTP 500

{
  status: "ERROR",
  message: ...  // optional
}

````

## RetrieveList系 

配列を返すレスポンスの場合、データの取得に用いたパラメータconditionとデータ全体に関する情報pagerを付与する。
配列の中身が空であってもリクエストとしては有効であるとして、200系レスポンスを返す。

````
HTTP 200

{
  status: "OK",
  productList: [ ... ]
  condition: { ... }
  pager: { ... }
}

````

パラメータの異常、取得する権限が無い。は400系エラー。

````
HTTP 400

{
  status: "BAD",
  message: ...  // optional
}

````

サーバ上の障害等、システム要因に伴うエラーを示す。

````
HTTP 500

{
  status: "ERROR",
  message: ...  // optional
}

````
CreateRecurringPaymentsProfile failedエラーについて

PayPalの[CreateRecurringPaymentsProfile failed]のエラーについて、
以下の様なエラーコードで、この原因がわかりますでしょうか。

<pre>
CreateRecurringPaymentsProfile failed: Array ( [TIMESTAMP] => 2015-05-14T13:05:45Z [CORRELATIONID] => 48737e91e72a8 [ACK] => Failure [VERSION] => 120.0 [BUILD] => 8077598 [L_ERRORCODE0] => 11505 [L_SHORTMESSAGE0] => Start Date should be greater than current date [L_LONGMESSAGE0] => Subscription start date should be greater than current date [L_SEVERITYCODE0] => Error )
</pre>
ペイパルの10486エラーについて

DoExpressCheckOutで「10486」エラーが頻発しています。

以下のエラーがレスポンスされているようなのですが原因が何かわかる方いらっしゃしますか？

<pre>
{L_LONGMESSAGE0=This transaction couldn't be completed. Please redirect your customer to PayPal., VERSION=120.0, BUILD=6444009, L_ERRORCODE0=10486, ACK=Failure, CORRELATIONID=77f3094193aa, TIMESTAMP=2015-05-17T09:32:53Z, L_SEVERITYCODE0=Error, L_SHORTMESSAGE0=This transaction couldn't be completed.}
</pre>
Atomで特定のキーバインドによる操作が遅い場合の対策


## 例えば`ctrl-k`による行削除が遅い場合

設定画面で`ctrl-k`のキーバインドを表示すると、term2パッケージが`ctrl-k`をプレフィックスキーに使っていることが確認できる。
この場合該当するキーバインドを`unset!`で上書きしても速度は改善されない。(`Version 0.204.0`で修正されている)

![](http://i.gyazo.com/3f5c2ff16e673466cbfe6aa628b9417b.png)

## 対策1: `init.coffee`でキーバインドを削除する

```coffeescript
# 特定のパッケージのキーバインドを削除する
removeKeymaps = (name) ->
  return unless pack = atom.packages.getLoadedPackage(name)
  for [keymapPath, map] in pack.keymaps
    console.log "remove keymap: #{keymapPath}"
    atom.keymaps.removeBindingsFromSource(keymapPath)

removeKeymaps('term2')

```

## 対策2: キーバインド無効化用のパッケージを使う

その為に以下のパッケージを作った。

[disable-keybindings](https://atom.io/packages/disable-keybindings)

![](http://i.gyazo.com/d571e6b5874432f0ed18081f2c0801d6.png)

## 対策3: `keymap.cson`で該当するキーバインドを全て`unset!`で上書きする

```coffeescript
'atom-text-editor':
  'ctrl-k t down': 'unset!'
  'ctrl-k t left': 'unset!'
```

## 関連リンク

* [Bundled prefixed keys bindings delay even if 'unset!' by user keymap · Issue #78 · atom/atom-keymap](https://github.com/atom/atom-keymap/issues/78)
* [Direct bindings should override prefixes? · Issue #49 · atom/atom-keymap](https://github.com/atom/atom-keymap/issues/49)
* [Key-binding hell - features - Atom Discussion](https://discuss.atom.io/t/key-binding-hell/12075)
Windows版のKobitoがMacでも全然動いてすごい


まとめ
-------

Windows版のKobitoが[ELECTRON](http://electron.atom.io/)でできていると[知って](http://blog.qiita.com/post/118842984159/kobito-for-windows-release-tech)、それならMacでも動くだろと思って動かしてみたらこの投稿に支障なかったのですごい。

あと個人的にはVim like keymapが使えるのがすごく嬉しくて、これだけでも乗り換える価値ありだと思いました。(早くMac版出ないかな)

やり方
-------

### Node.jsをインストール

Node.jsを好きなようにインストールしてください

```
$ brew install node
```

### electron-prebuiltパッケージをインストール

```
$ npm install electron-prebuilt -g
```

### Windows版Kobitoをダウンロード

Windows版Kobitoを[ここ](http://kobito.qiita.com/win)からダウンロードして解凍

### electronで実行

```
$ electron ~/Downloads/kobito/resources/app/
```

※ダウンロードフォルダに解凍した場合

以上。

Mac版がでたら
----------------

ELECTRONでのKobitoの正式なMac版がでたらこれができたらうれしいです。

* Vim like keymapでのインサートモード時 `control + w` での単語削除
* `command + h` での Kobito を隠す
1時間以内に解けなければプログラマ失格となってしまう5つの問題の問題5

#1時間以内に解けなければプログラマ失格となってしまう5つの問題の問題5

##問題5を解けず、プログラマ失格。JavaからPHPに変更しただけ。
###問題5
1,2,…,9の数をこの順序で、”+”、”-“、またはななにもせず結果が100となるあらゆる組合せを出力するプログラムを記述せよ。
例えば、1 + 2 + 34 ? 5 + 67 ? 8 + 9 = 100となる
***

```php
define('TARGET_SUM', 100);

function add($digit, $str, $array) {
	for ($i=0; $i < count($array); $i++) {
		$array[$i] = $digit . $str . $array[$i];
	}
	return $array;
}

function f($sum, $number, $index) {
	$VALUES = array(1,2,3,4,5,6,7,8,9);
	$digit = abs($number % 10);
	if ($index >= count($VALUES)) {
		if ($sum == $number) {
			$array = array();
			$array[] = (string)$digit;
			return $array;
		} else {
			return array();
		}
	}

	$branch1 = f($sum - $number, $VALUES[$index], $index + 1);
	$branch2 = f($sum - $number, -$VALUES[$index], $index + 1);

	$concatenatedNumber = $number >= 0? 10 * $number + $VALUES[$index]: 10 * $number - $VALUES[$index];
	$branch3 = f($sum, $concatenatedNumber, $index + 1);

	$results = array();

	$results = array_merge(array(), add($digit, "+", $branch1));
	$results = array_merge($results, add($digit, "-", $branch2));
	$results = array_merge($results, add($digit, "", $branch3));

	return $results;
}

$VALUES = array(1,2,3,4,5,6,7,8,9);
$answer = f(TARGET_SUM, $VALUES[0], 1);
foreach ($answer as $ans) {
	print_r($ans);
	echo '<br>';
}
```

本家の回答
https://blog.svpino.com/2015/05/08/solution-to-problem-5-and-some-other-thoughts-about-this-type-of-questions
【PHPStorm】extractを使うとPHPStormで未定義エラーとみなされる

extractで変数を作成するとPHPStormの未定義エラーになる。
PHPDocのコメントをextractのあとに書くと未定義エラーが消える。

/** @var データ型 変数 */

```php
$hoge = [
  'foo'=>'111',
  'bar'=>'222',
];

extract($hoge);

/** @var int foo */
echo $foo;
```

参考
[PHPStromでextract関数を使うとundefined variableが発生するときの対処方法](http://matomerge.com/undefined-variable-extract-function-phpstorm/)
Android sdkのパスが通っているのに、zipalign not foundが発生する

##課題

タイトルの通り、Android sdkのパスは通っているのに、
zipalignコマンドが使えない。


##解決策


.bash_profileに下記を追加したら解決した。

```bash
export PATH=$ANDROID_SDK_ROOT/build-tools/22.0.1:$PATH
```

*※versionはその時の一番新しかったものを選択したがどれでも良さそう？*
UnityYamlMerge

# UnityYamlMergeの設定

## 導入

* UnityYamlMergeとは  
    * Unity5以降のバージョンではシーン(unity)ファイルやプレハブ(prefab)ファイルの構造が整理され、マージされやすくなった。  
しかし、それでもコンフリクトが発生した場合にコンフリクトを解消しやすくしてくれるツールとして UnityYamlMerge がある。
* 詳しくは以下のリンクを参照のこと
    * [Unity - Manual: Smart Merge](http://docs.unity3d.com/Manual/SmartMerge.html)
    * [概要UnityYAMLMerge](http://labs.gree.jp/blog/2015/04/13836/)
    * [Unity5 数名で一つのSceneやPrefabを編集しスマートにマージする](http://tsubakit1.hateblo.jp/entry/2015/05/14/040852)

## 設定方法

* 以下のページなどを参考にしつつ各種VCSツールに設定する。
    * [Unity - Manual: Smart Merge](http://docs.unity3d.com/Manual/SmartMerge.html)
    * gitの場合は .git/config や ${HOME}/.gitconfig に以下の設定をする。
(UnityYAMLMergeへのパスは適時設定してください)

        ```
        [merge]
            tool = unityyamlmerge
        [mergetool "unityyamlmerge"]
            trustExitCode = false
            cmd = "/Applications/Unity/Unity.app/Contents/Tools/UnityYAMLMerge" merge -p "$BASE" "$REMOTE" "$LOCAL" "$MERGED"
```

* マージしきれなかった場合のfallbackツールを設定する。
    * レポジトリルートディレクトリに "auto" という名前のファイルを配置  
    * UnityYAMLMergeと同じディレクトリにある`mergespecfile.txt`というファイル
に設定例が記載されています。
    * 行頭の`*`はファイルタイプ指定(未検証)なので省略不可
    * UnityYamlMergeのオプションの--fallbackで指定することも可能？(未調査)
        * e.g. `echo '* use "/Applications/p4merge.app/Contents/MacOS/p4merge" "%b" "%l" "%r" "%d"' > auto`

                置き換え前のマーカー|内容|意訳
---|---|---
%l| is replaced with the path of you local version|ローカルバージョン(--ours)
%r| is replaced with the path of the incoming remote version|マージ対象のバージョン(--theirs)
%b| is replaced with the common base version|マージ対象のベースバージョン
%d| is replaced with a path where the result should be written to|コンフリクト発生中のファイル(?) **編集対象**

## 使用方法

* マージ作業などでコンフリクトを発生させます。  
`both modified:   Assets/TestScene.unity`
* コンフリクト解消のためにUnityYAMLMergeを起動させます。  
`git mergetool`
* コンフリクトが解消できた場合は以下の表示が出るので、そのままyを押下します。

```
Normal merge conflict for 'Assets/TestScene.unity':
  {local}: modified file
  {remote}: modified file
Conflicts:
Conflict handling:
Assets/cube.unity seems unchanged.
Was the merge successful? [y/n] 
```
* コンフリクトを解消できなかった場合は、autoファイルで指定されているマージツールが起動するのでマージを解消します。
    * この際は上記の[y/n]の確認は表示されません。
    * ただし、マージツールがエラーコードで終了した場合は確認されます。

## vimdiffの場合の設定(書きかけ)

* コンフリクト解消が難しい場合
    * :cq でエラーコード終了させましょう。
    * :q でそのまま終了してしまうと、マージ成功として処理されてしまいます。
* autoの内容
    * 編集対象のファイルが空のままで表示される  
` * use "/usr/local/bin/vimdiff" -c "wincmd J" "%d" "%l" "%b" "%r"`
* 参考
    * [git/vimdiff at master · git/git · GitHub](https://github.com/git/git/blob/master/mergetools/vimdiff)
    * [Three-way merging for git using vim](http://www.toofishes.net/blog/three-way-merging-git-using-vim/)
mindwave mobileをprocessing(MacOSX yosemite)で使用する方法

mindwave mobile（黒いやつ）をprocessing for mac

#参考URL
ドライバ
http://store.neurosky.com/products/mindwave-mac-drivers

ThinkGearというアプリケーション？ドライバも含まれているかも？？
http://developer.neurosky.com/docs/doku.php?id=thinkgear_connector_tgc

processingライブラリgit
https://github.com/ericblue/Processing-Brain-Grapher

サンプルと動画
http://www.magicandlove.com/blog/2012/03/15/neurosky-mindwave-and-processing/

日本語説明書？PEF
http://developer.neurosky.com/docs/lib/exe/fetch.php?media=qsg_japanese_version.pdf


#手順
1.参考URLからドライバインストール
URL先のページ先は白いやつ用って出てる。最初間違ってインストールしたけどドライバは共通かな？
2.ThinkGearインストール
3.PCとmindwaveでペアリング
mindwaveのつまみをonの方向に3秒ほどスライドする
LEDが2連続点灯したらペアリング開始らしい
(参考のPDFから)
4.processing起動、サンプル起動（どれでも）
5.動いてたら動いた


#自分の使用したサンプル
さらに試しでHashMap使ってたくさんある変数をまとめてみた

```java:sample.pde
import java.net.*;
import java.util.Map;
import neurosky.*;
import org.json.*;
ThinkGearSocket neuroSocket;

HashMap<String, Integer> mess;

void setup() {
  size(600, 600);

  mess = new HashMap<String, Integer>();

  ThinkGearSocket neuroSocket = new ThinkGearSocket(this);
  try {
    neuroSocket.start();
  } 
  catch (ConnectException e) {
    println("Is ThinkGear running??");
    println(e.getMessage());
  }
}

void draw() {
  background(255);

  //println(mess.entrySet());
  String txt = "values list\n";
  for (Map.Entry m : mess.entrySet ()) {
    print(m.getKey() + " : ");
    println(m.getValue());
    
    txt += m.getKey()+" : "+m.getValue()+"\n";
  }
  fill(0);
  text(txt, 20, 20);
}


void poorSignalEvent(int sig) {
  println("SignalEvent "+sig);
  mess.put("sig", sig);
}

public void attentionEvent(int attentionLevel) {
  println("Attention Level: " + attentionLevel);
  mess.put("attentionLevel", attentionLevel);
}


void meditationEvent(int meditationLevel) {
  println("Meditation Level: " + meditationLevel);
  mess.put("meditationLevel", meditationLevel);
}

void blinkEvent(int blinkStrength) {
  println("blinkStrength: " + blinkStrength);
  mess.put("blinkStrength", blinkStrength);
}

public void eegEvent(int delta, int theta, int low_alpha, int high_alpha, int low_beta, int high_beta, int low_gamma, int mid_gamma) {
  println("delta Level: " + delta);
  println("theta Level: " + theta);
  println("low_alpha Level: " + low_alpha);
  println("high_alpha Level: " + high_alpha);
  println("low_beta Level: " + low_beta);
  println("high_beta Level: " + high_beta);
  println("low_gamma Level: " + low_gamma);
  println("mid_gamma Level: " + mid_gamma);

  mess.put("delta", delta);
  mess.put("theta", theta);
  mess.put("low_alpha", low_alpha);
  mess.put("high_alpha", high_alpha);
  mess.put("low_beta", low_beta);
  mess.put("high_beta", high_beta);
  mess.put("low_gamma", low_gamma);
  mess.put("mid_gamma", mid_gamma);
}

void rawEvent(int[] raw) {
  //println("rawEvent Level: " + raw);
}

void stop() {
  neuroSocket.stop();
  super.stop();
}
```

結果
![スクリーンショット 2015-05-27 18.17.29.png](https://qiita-image-store.s3.amazonaws.com/0/76572/d4ba0698-f45e-7372-6264-0e98b9c91725.png "スクリーンショット 2015-05-27 18.17.29.png")
gitでファイルの一部だけコミットから無視する

# やりたい事

ファイルやディレクトリは`.gitignore`に指定すれば良いが、
ファイルの一部分(特定の行など)だけ無視するにはどうすれば良いのか?

例えば認証が必要なProxy環境でgitを使用する場合は以下のプロキシ設定が必要だが、
パスワードを含む部分だけはリポジトリにはコミットしたくない。

```text:.gitconfig
[core]
    quotepath = false
    autoCRLF = false
:
[http]
    proxy = http://username:password@proxy.sample.jp:8080
[https]
    proxy = http://username:password@proxy.sample.jp:8080
```

素直にプロキシ設定を外部ファイル(例：`.gitconfig.local`)に分けるべきだがそれはできない状況だとして。

```test:.gitconfig
[include]
    path = .gitconfig.local
```

# 対応方法

下記リンクのようにキーワード展開などで利用されるfilterを利用すれば実現できる。

[How to tell git to ignore individual lines, i.e. gitignore for specific lines of code [duplicate]](http://stackoverflow.com/questions/16244969/how-to-tell-git-to-ignore-individual-lines-i-e-gitignore-for-specific-lines-of)

ただしリンク先の方法は本来やりたい"無視"ではなく"除外"する方法なので、
ここでの方法とはちょっと異なるためその点は注意。
（ローカルのみでデバッグ用コードを挿入したいような場合はリンク先の方法が有効）

## 1. 属性の設定

まず以下の内容で`<project root>/.gitattributes`を作成。

```text:.gitattributes
.gitconfig filter=ignoreproxy
```

* ファイル名が`.gitconfig`なら`ignoreproxy`という名前のフィルタを適用せよという意味
* `*.rb filter=ignoreproxy`などの指定も可能
* `<project root>/.git/info/attributes`に記述しても良し(その場合は`attributes`はコミットされない)

## 2. フィルタの定義

次に`~/.gitconfig`に`ignoreproxy`というフィルタを追加する。

```text:.gitconfig
[filter "ignoreproxy"]
    smudge = cat
    clean = sed '/^\\ *proxy/s!http://[^@]*!http://username:password!'
```

* `smudge`はcheckoutする時、`clean`はステージする時に適用される([参考](http://git-scm.com/book/ja/v1/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%81%AE%E5%B1%9E%E6%80%A7#キーワード展開))
* `smudge`では何もしないので`cat`コマンドでそのまま出力しているだけ
* `clean`では強制的に変更後の`username`と`password`を元に戻している
* グローバルに適用したくなければ`<project root>/.git/config`に書いても良し

# 確認

この状態で`username`や`password`を変更しても、この部分だけはちゃんとコミットされない。

```text:.gitconfig
[core]
    quotepath = false
    autoCRLF = true
:
[http]
    proxy = http://taro:123abc@proxy.sample.jp:8080
[https]
    proxy = http://taro:123abc@proxy.sample.jp:8080
```

確認のため`git diff`としても

```diff
 [core]
     quotepath = false
-    autoCRLF = false
+    autoCRLF = true
 :
 [http]
     proxy = http://username:password@proxy.sample.jp:8080
```

プロキシ設定部分に関しては差分とならない。
#PostgreSQL Window関数で行番号や順位を抽出

## 行番号を抽出

### 行番号 ... ROW_NUMBER()

* 抽出順に1から始まる行番号を付ける。

```sql:sql
SELECT ROW_NUMBER() OVER (), *
FROM tables;
```

* レコードの作成日時createdが古いものから順に番号をつける。

```sql:sql
SELECT ROW_NUMBER() OVER (ORDER BY created ASC), *
FROM tables;
```

### 各ブログのコメントの内もっとも古いもの1件を抽出などのような場合に用いた。

* PARTITION BYを用いて同じblog_idの中で何番目とする。

```sql:sql
SELECT a.*
FROM (
    SELECT ROW_NUMBER() OVER (PARTITION BY blog_id ORDER BY created ASC) AS no, *
    FROM comments
) AS a
WHERE a.no = 1
```

## 順位を抽出

### 同率で番号を飛ばす順位 ... RANK()

* ポイントの高いものから順に順位をつける。
* 同ポイントは順位が同じ、同率で番号を飛ばす。
* ページ切り替えを考慮する場合、ORDER BYにユーザ番号なども加え抽出順が変わらないようにする。OVER()内に加えると条件が変わり順位が変わる。

```sql:sql
SELECT RANK() OVER (ORDER BY point DESC), *
FROM points
ORDER BY point DESC, user_id ASC
```

```text:結果
rank  user_id  point
1  9004  337
2  222  312
3  4  295
3  56  295
5  10120  286
：
```

### 比率 ... PERCENT_RANK()

* ポイントの高いものから順に比率を算出し1位=100%、最下位=0%とする。
* ページ切り替えを考慮する場合、ORDER BYにユーザ番号なども加え抽出順が変わらないようにする。OVER()内に加えると条件が変わり比率が変わる。

```sql:sql
SELECT (1 - PERCENT_RANK() OVER (ORDER BY point DESC)) * 100, *
FROM points
ORDER BY point DESC, user_id ASC
```

```text:結果
?column?  user_id  point
100  102  149
99.9957131221331  8  146
99.991426244266  107  49
：
```

## 参考

* http://codezine.jp/article/corner/71
* http://www.postgresql.org/docs/9.3/static/functions-window.html
Swiftのenum型の列挙子をfor inを使って列挙したい

例えばこんな感じのenumを定義して

```swift
enum Fruit: Int {
    case Apple
    case Orange
    case Banana
}
```

この全ての列挙子（ここではAppleとOrangeとBanana）を`for in`を使って列挙したくなったとする。どう考えても`for fruit in [Fruit.Apple, Fruit.Orange, Fruit.Banana]`なんてしたくない。

## GeneratorOfを使って`[Fruit]`を返す

たどり着いたのが`GeneratorOf`を使って動的に`[Fruit]`を返すプロパティを生やすやり方。

```swift
enum Fruit: Int {
    case Apple
    case Orange
    case Banana

    static var fruits: [Fruit] {
        var index = 0
        return Array(
            GeneratorOf<Fruit> {
                return Fruit(rawValue: index++)
            }
        )
    }
}

for fruit in Fruit.fruits {
    println(fruit)
}
```

これはこれで覚えておくとして、もっとスマートなやり方があるのかないのか。というか、言語機能として列挙子返してくれないのかしら。

## `SequenceOf`を使って`SequenceOf<Fruit>`を返す

@satoshia さんのコメントより、こちらは`SequenceOf`を使って`SequenceOf<Fruit>`を返却している。

```swift
static var fruits: SequenceOf<Fruit> {
    return SequenceOf { () -> GeneratorOf<Fruit> in
        var index = 0
        return GeneratorOf {
            Fruit(rawValue: index++)
        }
    }
}
```

配列を生成しない分スマートに見える。配列ではなく`SequenceOf<Fruit>`だけど、`for`で列挙する分には何ら問題ない。

## 自前で初期化して`[Fruit]`を返す

@takabosoft さんのコメントより。

```swift
static let fruits3: [Fruit] = [.Apple, .Orange, .Grape, .Berry, .Banana]
```

簡単だし、わかりやすいし、動的じゃない分パフォーマンスも良さそう。その反面、列挙漏れ・enumの宣言順が反映されない・追加や削除の度に更新しなくてはならないというリスクもある。とはいえ、列挙子の数が少なければこれでも良いような気も。

## パフォーマンスの比較

予想通りの結果になった。`SequenceOf`が`GeneratorOf`より若干遅いのは、配列を生成するしないに加えて、`SequenceOf<Fruit>`をループするのか`[Fruit]`をループするのかの差もあるのかと（予想だけど）。

![enum-1.png](https://qiita-image-store.s3.amazonaws.com/0/10549/2cd98727-57a0-22cd-0f9e-1f903f8a5c00.png)
gradle-node-plugin 使って Sass をコンパイルしたりすればいいじゃない

[gradle-node-plugin](https://github.com/srs/gradle-node-plugin) という神プラグインを知りました。

これ使うと `./gradlew build` とかした時に Sass をコンパイルしたり、`./gradlew jettyRun` でサーバ動かしてる時も Sass が編集されたらコンパイルしたり　が割と簡単に書けそうだなと思い、下記のような build.gradle と package.json でやってみました。

## 実際のコード

### build.gradle

```groovy
plugins {
  id "com.moowork.node" version "0.9"
}

apply plugin: 'com.moowork.node'

// Sass をコンパイルします
task sassCompile(type: NpmTask, dependsOn: 'npm_install') {
  args = ['run', 'sass:build']
}

// Sass ファイルをウォッチして自動コンパイルします
task sassWatchStart(type: NpmTask, dependsOn: 'npm_install') {
  args = ['run', 'sass:watch:start']
}

// Sass ファイルのウォッチを停止します
task sassWatchStop(type: NpmTask) {
  args = ['run', 'sass:watch:stop']
}

processResources.dependsOn sassCompile
jettyRun.dependsOn sassWatchStart
jettyRun.finalizedBy sassWatchStop
```

### package.json

```json
{
  ...
  "scripts": {
    "sass:build": "node-sass src/main/assets/css --output src/main/webapp/static/css",
    "sass:watch": "nodemon --watch src/main/assets/css --ext sass,scss --exec 'npm run sass:build'",
    "sass:watch:start": "forever start -c \"npm run sass:watch\" ./",
    "sass:watch:stop": "forever stop ./"
  },
  ...
  "dependencies": {
    "node-sass": "^3.1.2"
  },
  "devDependencies": {
    "forever": "^0.14.1",
    "nodemon": "^1.3.7"
  }
}
```

（会社コードからの抜粋なので、タイポあるかも。すみません）

## ポイント

`sass:watch:start` では、[forever](https://github.com/foreverjs/forever) を使って Sass を監視するプロセスを daemon 化し、gradle の実行を止めないようにしています。そのため、build.gradle で `jettyRun.dependsOn sassWatchStart` と書いても jettyRun までタスクが止まらずに進んでくれるようになっています。

`sass:watch:stop` で forever のプロセスを終了するコマンドが書いてあるので、`jettyRun.finalizedBy sassWatchStop` と書くことで、jettyRun 終了時に Sass 監視プロセスを終了させています。

## 余談

[gradle-compass](https://github.com/robfletcher/gradle-compass) という、その名の通り compass を gradle から便利に使えるプラグインがあります。これめっちゃ便利！と思ったんだけど、compass gem のインストールに使ってるリポジトリ <http://rubygems-proxy.torquebox.org/> が今朝から多分死んでて困ったので、がんばりました。

でも結果的に幅広く応用できそうな対応ができたからよかったかも。browserify とかもこんな感じで行けそうだし、若干夢が広がった感があります。
Rails Tutorial 第1章で助けてもらったサイトリンク集

すいません完全に個人的な覚え書きです。随時追加予定。

* githubのエラー fatal: remote origin already exists.
http://d.hatena.ne.jp/iwahei0813/20140324/1395652080
* githubのエラー fatal: Unable to read current working directory
http://stackoverflow.com/questions/5743071/error-with-git-after-importing-changes-from-a-server
* bundle install時のエラー http://stackoverflow.com/questions/19342044/in-ruby-your-ruby-version-is-1-9-3-but-your-gemfile-specified-2-0-0

###行き詰まり状況
チュートリアル1.4.1通りにGemfileに
>group :development do
  gem 'sqlite3', '1.3.8'
end

を追加するとbundle installで
>An error occurred while installing sqlite3 (1.3.8), and Bundler cannot continue.
Make sure that ``gem install sqlite3 -v '1.3.8'`` succeeds before bundling.

とのエラー。
gem install sqlite3 -v '1.3.8'をやってもエラー。

1.3.8ではなく1.3.9にしてみたらあっさり通る。
1.3.8は何なんだ？
ruby2.2.2との相性とかあるのだろうか？
誰かお分かりの方がいらっしゃったら教えてください。
MySQL utf8からutf8mb4への変換

# 絵文字など使う場合には文字コードをutf8mb4にする必要がある

## my.cnfを修正
```
innodb_large_prefix = ON
innodb_file_format = Barracuda
innodb_file_format_max = Barracuda
```
RDSの場合はparameter groupを修正

## パラメータ説明
### innodb_large_prefix
そのまま、alterで文字コードを変えようとするとエラーが出る

```
alter table user_messages convert to character set utf8mb4;
```
エラー

```
Index column size too large. The maximum column size is 767 bytes.
```

mysqlのデフォルトの限界に引っかかる。varchar(255)とかのutf8のカラムがあると、utf8mb4は4byte文字なので、256 x 4 で767を超える。

### innodb_file_format = Barracuda
### innodb_file_format_max = Barracuda

この二つは、innodb_large_prefixを有効にする為に必要。

## 対応順序
1 my.cnf修正
2 mysqld restart
3 (railsなどアプリ側でmigrateなど行うアプリケーションの場合は、migrate時にrow_formatを指定するように修正)

```
ActiveSupport.on_load :active_record do
  module ActiveRecord::ConnectionAdapters

    class AbstractMysqlAdapter
      def create_table_with_innodb_row_format(table_name, options = {})
        table_options = options.merge(:options => 'ENGINE=InnoDB ROW_FORMAT=DYNAMIC')
        create_table_without_innodb_row_format(table_name, table_options) do |td|
          yield td if block_given?
        end
      end
      alias_method_chain :create_table, :innodb_row_format
    end

  end
end
```

5 データベースの文字コードを修正する

```
alter database <DBNAME> character set utf8mb4;
```

6 既存のrow_formatデータを修正する

```
alter table <TABLENAME> ROW_FORMAT=DYNAMIC;
```

7 既存のテーブルの文字コードをutf8mb4に修正する

```
alter table <TABLENAME> convert to character set utf8mb4;
```

## 便利なワンライナー

```
(mysql -uroot -p <DATABASE_NAME> -e "show tables" --batch --skip-column-names | xargs -I{} echo 'alter table `'{}'` convert to character set utf8mb4;') > /tmp/alters.sql
```
Herokuのpgbackup:captureがエラーになった時の対処法

 はじめに
---

herokuの[PG Backupsアドオン](https://devcenter.heroku.com/articles/pgbackups)でバックアップコマンドとなるpgbackup:captureを打ったら、エラーになった時の記録です。

pgbackups:captureしたらerrorになる
---

~~~
$ heroku pgbackups:capture --app your-app-name --expire
HEROKU_POSTGRESQL_VIOLET_URL (DATABASE_URL)  ----backup--->  error
 !    a transfer is currently in progress
~~~

定期バックアップがEnqueued(待機状態) となって動いてない
---

前日の定期backupが待機状態のままになっていました。

~~~
a1097  2015/05/26 08:01.24 +0000  Finished @ 2015/05/26 08:03.25 +0000  158.7MB  DATABASE_URL
b817   2015/05/26 10:21.36 +0000  Finished @ 2015/05/26 10:22.29 +0000  158.7MB  HEROKU_POSTGRESQL_VIOLET_URL (DATABASE_URL)
コレ→ a1098  Enqueued                                                         unknown  DATABASE_URL
~~~


待機状態になっているbackupID(a1098)を削除する
---

困った時は公式ドキュメント、その次にstackoverflowが吉。
少し古い記事ですが、近い現象がみつかりました。

[migration - Heroku: rogue transfer in progress - Stack Overflow](http://stackoverflow.com/questions/11071048/heroku-rogue-transfer-in-progress)

問題の起こっているbackupIDを消したら
I could get on with using pgbackups again properly.
とのこと。

~~~
# 問題の起っているbackupIDを削除

$ heroku pgbackups:destroy a1098 --app your-app-name
Destroying a1098... done

# capture 再実行
$ heroku pgbackups:capture --app your-app-name --expire
HEROKU_POSTGRESQL_VIOLET_URL (DATABASE_URL)  ----backup--->  b818

Capturing... done
Storing... done
~~~


無事pgbackups:captureすることができました。
CentOS/RHELで古いカーネルを削除して/bootを整理する方法

#はじめに
カーネルを更新し続けると、どんどん/boot領域に蓄積されて行き、ついには残り容量がなくなって更新さえできなくなってしまうことがあります。不要なカーネル情報は削除したいのですが、気をつけなければいけないのは、/etc/grub.confなどのようにカーネル情報を参照しているファイルが存在することです。よってこのあたりまで含めて綺麗にクリーンアップしてくれるツールがあると良いですね。

#解決方法

yum-utilsパッケージのpackage-cleanupコマンドを利用します。例えば、下記の例だと

* --oldkernelsを指定することで、古いkernel/kernel-develを削除すします。
* --count=2にすることで、2世代残します。

```text:実行例
# df -m /boot
Filesystem     1M-blocks  Used Available Use% Mounted on
/dev/xvda1           248   137        99  59% /boot

# yum install -y yum-utils
（途中略）

# package-cleanup --oldkernels --count=2
（途中略）
Is this ok [y/N]: y
（途中略）

# ls -l /boot
total 51779
-rw-r--r--  1 root root   106313 Mar 11 17:31 config-2.6.32-504.12.2.el6.x86_64
-rw-r--r--  1 root root   106313 Apr 22 02:16 config-2.6.32-504.16.2.el6.x86_64
drwxr-xr-x. 3 root root     1024 Dec  2 09:13 efi
drwxr-xr-x. 2 root root     1024 May 27 04:27 grub
-rw-------  1 root root 19389459 Mar 21 13:27 initramfs-2.6.32-504.12.2.el6.x86_64.img
-rw-------  1 root root 19386450 May 13 00:37 initramfs-2.6.32-504.16.2.el6.x86_64.img
drwx------. 2 root root    12288 Dec  2 09:10 lost+found
-rw-r--r--  1 root root   200256 Mar 11 17:32 symvers-2.6.32-504.12.2.el6.x86_64.gz
-rw-r--r--  1 root root   200317 Apr 22 02:17 symvers-2.6.32-504.16.2.el6.x86_64.gz
-rw-r--r--  1 root root  2545042 Mar 11 17:31 System.map-2.6.32-504.12.2.el6.x86_64
-rw-r--r--  1 root root  2545609 Apr 22 02:16 System.map-2.6.32-504.16.2.el6.x86_64
-rwxr-xr-x  1 root root  4152720 Mar 11 17:31 vmlinuz-2.6.32-504.12.2.el6.x86_64
-rwxr-xr-x  1 root root  4151344 Apr 22 02:16 vmlinuz-2.6.32-504.16.2.el6.x86_64

# cat /etc/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/xvda2
#          initrd /initrd-[generic-]version.img
#boot=/dev/xvda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.32-504.16.2.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-504.16.2.el6.x86_64 ro root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx console=hvc0 crashkernel=auto SYSFONT=latarcyrheb-sun16 LANG=en_US.UTF-8 KEYTABLE=us
        initrd /initramfs-2.6.32-504.16.2.el6.x86_64.img
title CentOS (2.6.32-504.12.2.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-504.12.2.el6.x86_64 ro root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx console=hvc0 crashkernel=auto SYSFONT=latarcyrheb-sun16 LANG=en_US.UTF-8 KEYTABLE=us
        initrd /initramfs-2.6.32-504.12.2.el6.x86_64.img

# df -m /boot
Filesystem     1M-blocks  Used Available Use% Mounted on
/dev/xvda1           248    62       175  26% /boot

```

#補足

/etc/yum.confにinstallonly_limitとうパラメーターを設定しておくと、自動的に世代管理されるようです。SoftLayerのCentOS6では、下記のように設定されていたので、これを2とか3ぐらいに設定しておくと/bootがあふれる可能性は少なくなるのではないでしょうか。

```text:世代管理
# cat /etc/yum.conf | grep install
installonly_limit=5

```
VagrantfileでApacheのドキュメントルート変更。

- Apacheの.confに書いてあるドキュメントルートを/var/www/publicから/var/wwwへ変更。
- 変更後Apache再起動。

~~~ ruby:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "scotch/box"
  config.vm.network "private_network", ip: "192.168.11.11"
  config.vm.hostname = 'testsite.dev'
  config.vm.synced_folder "./www", "/var/www", :mount_options => ["dmode=777", "fmode=666"]
  config.vm.provision "shell", inline: <<-EOT
        sed -i -e "s%/var/www/public%/var/www%" /etc/apache2/sites-available/000-default.conf
        /etc/init.d/apache2 restart
  EOT
end
Apple Watchを初めて触っていきなり開発しようとして躓いた点

## ホーム画面の出し方がわからない
デジタルクラウンは回すだけではなく押すことが出来る。
デジタルクラウンを押すことでホームボタンを表示出来る。

## 「AppをApple Watchで表示」をONにした時にエラー
Apple WatchにもUDIDがあり、登録が必要。
iTunesからApple WatchのUDIDは確認出来ず、Xcodeから確認を行う。
Xcodeのメニュー > Window > Devices > ペアリングしている端末 > Paired Watch Information > Identifier
iPhoneなどと同じくiOS Dev Centerからデバイスを登録し、親アプリのプロビジョニングにApple WatchのUDIDを登録する。

## 画面遷移ってどうするんだ？
iOSでのUIViewControllerにあたるWKInterfaceControllerは現状Storyboardでしか作成できない。
各画面をStoryboardで作成し、以下のメソッドにStoryboard IDを指定して画面遷移を行う。
contextを使って遷移後の画面にオブジェクトを渡せる。

```objc
- (void)pushControllerWithName:(NSString *)name context:(id)context;
```

## Apple Watchに通知が飛ばない
Apple Watchに通知が表示されるのは以下の3点を満たしている時。
1.　Apple Watchが腕に装着されている
2.　ロックが解除されている
3.　iPhoneを使用していない
机の上に置きながらや充電しつつ通知の実機デバッグが出来ない。

## 超初級チートシート書きました
http://qiita.com/ktysne/items/1ab5703053ffaded73a3
LaravelのSeeder単体で実行。

Laravelの開発環境でusersテーブルにあるユーザーを削除してから作業したかったのでSeederを作ったメモ。
ユーザーを開発用の自分だけにする。

~~~ php:database/seeds/UserTableSeeder
<?php
use Illuminate\Database\Seeder;
use App\Models\User;

class UserTableSeeder extends Seeder {

    public function run()
    {
        // DatabaseSeeder.phpを使用せず単体で実行する場合必要
        Eloquent::unguard();
        // 全部消す 　
        DB::table('users')->delete();
        // 開発用のユーザー追加
        User::create([  'id'         => 1,
                        'username'   => '佐藤',
                        'email_flag' => '',
                        'email'      => 'kick@punch.org',
                        'password'   => Hash::make('pass')
                    ]);
    }

}
~~~

usersテーブルのみデータ更新。

~~~
% php artisan db:seed --class=UserTableSeeder
~~~
CoffeeScriptで、テンプレートエンジン用にevalで変数展開

#evalで変数展開
やばいけど、ローカルツールならいいよねえ。strictモードだと、これは使えません。第三者が実行できるコードだととてもやばいです。でも、構文解析とかせずとも、Javascriptの構文が使えて楽ちんなのです。

express-generatorはどうしてるんだろう、と思ったら、オプション毎に一々雛形を作っていました。ちぇ。やはり割とパブリックなツールだと、そういうところは真面目なのね。

```coffeescript:template.coffee
templatecopyfile = (__dstpath__, __srcpath__, __dstfile__, __srcfile__, __param__) ->
  #予約語をオブジェクトに入れるよ。CoffeeScriptをコンパイルすると、
  #使用している変数を冒頭でまとめて宣言してくれるので、そこからコピペすればOK
  # i とか len とか勝手に作っているのが分かるね。
  __reserved__ =
    __reserved__:true
    __dstpath__:true
    __srcpath__:true
    __dstfile__:true
    __srcfile__:true
    __param__:true
    __detail__:true
    __inputlines__:true
    __key__:true
    __line__:true
    __linenumber__:true
    __result__:true
    __resultlines__:true
    __scanscope__:true
    __script__:true
    __stack__:true
    __usekey__:true
    __usescope__:true
    __usevalue__:true
    __value__:true
    __whenvalue__:true
    i:true
    len:true

  #予約語判定して、変数をローカルに展開するよ
  for __key__,__value__ of __param__
    if __key__ in __reserved__
      console.log 'a variable name ['+__key__+'] is reserved.'
      process.exit 1
    else
      eval 'var '+__key__+' = __value__;'


  ###
     中略
  ###


  #変数を使うときは、がっつりevalしちゃうよ
  if /^switch\s+(\S.*)$/.test(__script__)
    __detail__ = __script__.match(/^switch\s+(\S.*)$/)
    __stack__.push()
    __stack__[__stack__.length-1].mode = 'switch'
    __stack__[__stack__.length-1].value = eval __detail__[1]
    __stack__[__stack__.length-1].phase = null
    __stack__[__stack__.length-1].matched = false
    __stack__[__stack__.length-1].usescope = false
```
c++ builder XE4, 10.2 Tokyo > TeeChart > 時系列グラフ

```txt:動作環境
C++ builder XE4
    TeeChart Lite v2013.08.130414
RAD Studio 10.2 Tokyo Update 2 (追記 2018/01/09)
    TeeChart v2016.17.160129 32bit VCL
```

時系列グラフをTChartで作る方法

[SO](http://stackoverflow.com/questions/4791053/plotting-a-tchart-with-time-as-the-x-axis)

```cpp
#include <DateUtils.hpp> // for IncSecond()
...

Chart1->Series[0]->XValues->DateTime = true;
Chart1->BottomAxis->DateTimeFormat = L"nn:ss";

TDateTime dt;

dt = Now();
for (int idx=0; idx < 10; idx++) {
	Series1->AddXY(dt, 1+idx, "", clRed);
	dt = IncSecond(dt, 1);
}
```

Add()ではラベルになってしまうとのこと。
AddXY()とすることでtime scaleで扱える。


XValues->DateTime = true;はフォームデザインでは.Series->Series1->General->Horizontal Axis:のDateTimeのチェックをつける。

BottomAxis->DateTimeFormat = L"nn:ss";はフォームデザインでは.Chart->.Axis->Bottom Axis->Labels->Format->DateTime Format:にてnn:ssを指定すればよい。

横軸の範囲指定

```cpp
TDateTime start, end;
start = StrToDateTime(L"2015/5/27 12:00");
end = StrToDateTime(L"2015/5/28 12:00");
Chart1->BottomAxis->SetMinMax(start, end);
```
Swiftのタプルをクロージャ引数にするとき


ちょっとした小ネタです．クロージャ内でタプルな引数の各要素に変数名をバインドさせたいときの話です．

### 素直な書き方
クロージャの引数がタプルタイプだった場合，どのようにクロージャを記述していますか？

```swift
let f = { (t: (Int, Int)) -> Int in  t.0 + t.1 }
```

と，このように記述するのが普通かと思います．
しかし，`t.0`とか`t.1`とかとタプルの要素番号を使うのではなく，個々の要素に名前をつけて使いたいと思うことがしばしばあります．となると，

```swift
let f = { (t: (Int, Int)) -> Int in
	let (x, y) = (t.0, t.1)
	return x + y
}
```
こんな感じで最初にタプルパターンで各要素に名前をつけるかと思います．

### 裏技的書き方，使い方
しかし，使う局面によっては以下のようなクロージャを使うことも可能です．

```swift
let f = { (x: Int, y: Int) -> Int in x + y }
```
なんてことはない，ただの2引数のクロージャですね．
さて，これをタプルを要素とするArrayのmapに放り込むと，

```swift
let a = [(1,2),(3,4),(5,6)]
let b = a.map(f)
println(b)        // [3,7,11]
```
普通に実行できてしまいます．
クロージャのパラメータリストをタプルとして見なしてタプルパターンが使えてしまいます（そのように見える）．
クロージャをダイレクトに与えれば，

```swift
a.map { (x, y) in x + y }
```
と（型推論によって）省略形が使えて見た目がスッキリする上，タプルの各要素への名前付け(変数束縛）が直接伝わってくる感じがして個人的にお気に入りです．
なぜ，こんなことができるのかは「[Swiftの関数の引数は、常に一つ](http://qiita.com/dankogai/items/46fedc447dd93d1e0fbc)」に解説があります．
この仕掛けを知らないと，「なぜ2引数のクロージャをmapに渡してるんだ？」とパニックになります．

### 制約
なお，Swiftの文法上，パラメータリストはタプルとは別物なので入れ子構造な書き方は許されていません（当たり前）．つまり，

```swift
let c = [(1,(2,3))]
c.map { (x, (y, z)) in x + y + z }    // error
```
というネストしたパラメータリストは記述できないということです．こういう場合には，少々面倒ですが，

```swift
c.map { (x, y:(a: Int, b: Int)) in x + y.a + y.b }
```
のように，2要素目に要素名付きタプルをタイプとして書けば，一応全ての変数に名前をつけることができます．要素番号を使うよりは多少はマシという程度ですが．
Mac OSXで起動時にスクリプトを実行する方法

いくつか方法があるようだがこれがお手軽だった。StartupItemsは動かなかった。なんだあれ。
正確には、指定したユーザーがログインしたときに起動するような感じなのかも。
自分の用途にはこれで十分だったが、場合によっては使えないかもしれない。

# 環境

* Mac OSX 10.10.3 (Yosemite)

# 実行用アプリの作成

まず、「アプリケーション→Automator.app」からAutomatorを起動する。
次に、書類の種類を「アプリケーション」にして、左側の一覧から「シェルスクリプトを実行」を選択、右のエリアにドロップする。

するとコマンドを入力するエディタが出てくるので、そこに実行したいコマンドを入れる。
最後にそれを保存すると、アプリケーション形式で保存されるので、Finderからダブルクリックしてみたりして実行を確認する。

# 自動起動するように登録する

右上リンゴマークの「システム環境設定→ユーザとグループ」を起動して、「ログイン項目」を選択。
そこに、先ほど作ったappを登録する。

# 参考

http://blog.kazuya.co/tips/2013/11/24/mac-shell-script.html