OmniAICreator/Qiita-1.07M huggingface dataset:
Oracle ANYDATA型


## 内容
ANYDATA型という型を初めて知ったのでメモする。

## ANYDATA型とは
複数の型(CHAR型やNUMBER型など)のデータを格納することができる型のようだ。

## 使い方

### テーブルの作成

``` sql
SQL> CREATE TABLE TEST01 (
  ADT ANYDATA
);
```

### データの格納

``` sql
SQL> INSERT INTO TEST01 VALUES (ANYDATA.CONVERTNUMBER(1));
SQL> INSERT INTO TEST01 VALUES (ANYDATA.CONVERTDATE(SYSDATE));
SQL> INSERT INTO TEST01 VALUES (ANYDATA.CONVERTVARCHAR2('ABCDEFG'));
SQL> INSERT INTO TEST01 VALUES (ANYDATA.CONVERTCHAR('C'));
SQL> COMMIT;
```


### データの内容表示

通常のSELECTでは、以下のように内容が表示されない。

``` sql
SQL> SELECT * FROM TEST01;
ADT()
--------------------
ANYDATA()
ANYDATA()
ANYDATA()
ANYDATA()
```

ANYDATA.ACCESS*で変換する必要がある。

``` sql
-- NUMBER,DATE,VARCHAR2,CHARのみ対応。必要があれば追加する。
SQL> SELECT
      ANYDATA.GETTYPENAME(ADT) TYPE_NAME,
      CASE ANYDATA.GETTYPENAME(ADT)
        WHEN 'SYS.NUMBER'   THEN TO_CHAR(ANYDATA.ACCESSNUMBER(ADT))
        WHEN 'SYS.DATE'     THEN TO_CHAR(ANYDATA.ACCESSDATE(ADT))
        WHEN 'SYS.VARCHAR2' THEN ANYDATA.ACCESSVARCHAR2(ADT)
        WHEN 'SYS.CHAR'     THEN ANYDATA.ACCESSCHAR(ADT)
        ELSE NULL
      END AS DATA
      FROM TEST01;

TYPE_NAME    DATA
------------ -------------------
SYS.NUMBER   1
SYS.DATE     2015-10-28 18:14:26
SYS.VARCHAR2 ABCDEFG
SYS.CHAR     C
```

### データの内容表示（専用ファンクション作成）

ANYDATAをVARCHAR2に変換するファンクションANYDATA2VARCHAR2を作成。
とりあえずNUMBER,DATE,VARCHAR2,CHARに対応。
他に必要があれば追加していく。

``` sql
SQL> CREATE OR REPLACE FUNCTION ANYDATA2VARCHAR2 (ADATA IN ANYDATA)
        RETURN VARCHAR2
        IS
            vSTATE  NUMBER;
            vTYPE   VARCHAR2(30);
            vNUM    NUMBER;
            vDATE   DATE;
            vVCHAR2 VARCHAR2(4000);
            vCHAR   CHAR;
        BEGIN
            vTYPE := ANYDATA.GETTYPENAME(ADATA);
            CASE vTYPE
                WHEN 'SYS.NUMBER'   THEN RETURN TO_CHAR(ANYDATA.ACCESSNUMBER(ADATA));
                WHEN 'SYS.DATE'     THEN RETURN TO_CHAR(ANYDATA.ACCESSDATE(ADATA));
                WHEN 'SYS.VARCHAR2' THEN RETURN ANYDATA.ACCESSVARCHAR2(ADATA);
                WHEN 'SYS.CHAR'     THEN RETURN ANYDATA.ACCESSCHAR(ADATA);
                ELSE RETURN null;
            END CASE ;
        END;
        /

SQL> SELECT ANYDATA.GETTYPENAME(ADT) TYPE, ANYDATA2VARCHAR2(ADT) DATA FROM TEST01;
TYPE         DATA
------------ -------------------
SYS.NUMBER   1
SYS.DATE     2015-10-28 18:14:26
SYS.VARCHAR2 ABCDEFG
SYS.CHAR     C
```

## その他の検証

### 索引を作成することができるか？

``` sql
SQL> CREATE INDEX IND_TEST01 ON TEST01(ADT);
CREATE INDEX IND_TEST01 ON TEST01(ADT)
                                  *
行1でエラーが発生しました。:
ORA-02327: データ型ADTの式に索引は作成できません。
```
→できないようだ。


### VIEWで使いやすくしてみる。

``` sql
SQL> CREATE OR REPLACE VIEW VIEW_TEST01
        AS
        SELECT ANYDATA.GETTYPENAME(ADT) TYPE, ANYDATA2VARCHAR2(ADT) DATA FROM TEST01;
ビューが作成されました。

SQL> SELECT * FROM VIEW_TEST01;
TYPE         DATA
------------ -------------------
SYS.NUMBER   1
SYS.DATE     2015-10-28 18:14:26
SYS.VARCHAR2 ABCDEFG
SYS.CHAR     C
```

## リファレンス

- [241 ANYDATAタイプ(Oracle® Database PL/SQLパッケージおよびタイプ・リファレンス 11g リリース2)](https://docs.oracle.com/cd/E16338_01/appdev.112/b56262/t_anydat.htm)
[Calendar] Highlight today of calendar in the terminal.

Add this alias to the `~/.bashrc`.

```bash
alias ical='cal=`cal`; today=`date "+%e"`; echo -en "${cal/${today} /\033[1;32m${today}\033[0m }\n\n";'
```

Then in the terminal input the command `ical`, it will show something like this:

<img width="150" alt="Screen Shot 2015-10-28 at 18.43.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/51455/51677b3c-98dc-1f62-a07b-e5adfc047958.png">

*When you setup the bashrc file, do not forget to restart your terminal!*
clipboard.jsで、flashなしでクリップボードにコピーする

# clipboard.jsで、flashなしでクリップボードにコピーする

ブラウザからクリップボードにコピーって、結構やりたいことには上がってきますが、ブラウザからはセキュリティの問題でクリップボードにアクセスができないという制限が邪魔して簡単に実装ができないですよね？

実際これまで、flashを利用した[zClip.js](http://akiok-jp.hatenablog.com/entry/2013/04/17/231133)などを利用してきました。

しかし、昨今flashはもう利用するべきでないという流れの中あまり使いたくないですよね。

## clipboard.js

[clipboard.js](http://zenorocha.github.io/clipboard.js/)は、flashを利用することなくクリップボードにコピーできるプラグインです。

execCommandという新しいAPIによって実現ができるようになったようです。

safariがまだ対応していないようですが、その他の主要ブラウザは対応しているようなので使っていけそうです。

## 使い方①

```html
<script type="text/javascript" src="js/clipboard.min.js"></script>
<script type="text/javascript">
    var clipboard = new Clipboard('.btn');
    clipboard.on('success', function(e) {
        //成功時の処理
    });
    clipboard.on('error', function(e) {
      //失敗時の処理
    });
</script>
<button type="button" class="btn" data-clipboard-text="この内容をコピーします">コピー</button>
```

非常に簡単ですね。

## 使い方②

```html
<script type="text/javascript" src="js/clipboard.min.js"></script>
<script type="text/javascript">
    var clipboard = new Clipboard('.btn');
    clipboard.on('success', function(e) {
        //成功時の処理
    });
    clipboard.on('error', function(e) {
      //失敗時の処理
    });
</script>
<input type="text" id="target" />
<button type="button" class="btn" data-clipboard-target="#target">コピー</button>
```

うーん、楽ですね。

## まとめ
safariがまだ対応していないことは難点ですが、かなり簡単に使える上、flashも使用していないので非常に良いと思います。
Safariのautofill buttonのスタイルを変更する方法

Safariのinput[password]にフォーカスした際に表示される鍵マーク。
このカラーを変更する方法です。
背景が暗い場合は、デフォルトだと視認性が良くないでの変更が必要かと思います。
細い箇所ですが、スタイルに一貫性を持たせるにも変更が必要ですね。

### 鍵マーク（オートフィルボタン）
<img width="391" alt="スクリーンショット 2015-10-28 18.26.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/27317/1f8fcc31-d2a3-ff49-1df0-c80c8bf295bc.png">
この黒い鍵マークです。

### ソースコード
<img width="934" alt="スクリーンショット 2015-10-28 18.22.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/27317/db747189-c329-d466-eea2-067468211e5b.png">

### サンプルコード

```scss
input::-webkit-auto-fill-button {
  background-color: #4A90E2;
  &:hover {
    background-color: #4A90E2;
  }
}
```
Railsにおけるルーティングの調整

通常のルートは / だが、Categoryモデルでは /user/ にしたい。
もちろんURLだけでなく、呼び出すアクションやパスも同様だ。
そのためにはroutes.rbをこうする。

```rb:routes.rb
resources :categories, :module => :user,
                       :path   => 'user/categories',
                       :as     => 'user_categories'
```

結果はこの通り。

```text:ルーティング
user_categories_path    POST    /user/categories(.:format)          user/categories#create
new_user_category_path  GET     /user/categories/new(.:format)      user/categories#new
edit_user_category_path GET     /user/categories/:id/edit(.:format) user/categories#edit
user_category_path      PATCH   /user/categories/:id(.:format)      user/categories#update
                        PUT     /user/categories/:id(.:format)      user/categories#update
                        DELETE  /user/categories/:id(.:format)      user/categories#destroy
```

ちなみに、単数形と複数形を間違えると正しくパスがつかないことがある。
CakePHP / 「Call to a member function success() on a non-object」 エラーが発生したら

## CakePHP 2.7.x でのフラッシュメッセージの表示でエラー発生

CakePHP 2.7.0 以降、フラッシュメッセージの表示は FlashHelper にて実装される。

[FlashHelper &mdash; CakePHP Cookbook 2.x documentation](http://book.cakephp.org/2.0/en/core-libraries/helpers/flash.html)

それはいいのだが、初見殺しだと感じた事があったのでメモ。

## 環境

* PHP 5.4.16
* CakePHP 2.7.5  
インストール後特に何もしていないプレーンな状態。
* アプリケーションは `bake all Foo` のように bake コマンドで作成

## 事象

bake コマンドで作成したアプリケーションにて、データの削除や追加などを行うと下記エラーが表示された。

```
Call to a member function success() on a non-object
```

表示されているファイル・該当行を確認すると、下記のような箇所でエラーが発生している。

```php
$this->Flash->success(__('Hoge is foo.'));
```

Flash オブジェクトが無いのだが何故ないのかが最初はわからなかった。
ドキュメント読む限りはセッションにフラッシュメッセージがセットされるようなので、セッションが動作していないかを疑ったが、特に問題なく動作していた。
## 原因

原因はコントローラーにて、コンポーネントが設定されていなかったから。
コントローラーのクラス定義の一番上の方にコンポーネントを設定している箇所がある。

```php
// ここでコンポーネントを設定している
public $components = array('Paginator');
```

下記のように FlashComponent を設定する。

```php
public $components = array('Paginator', 'Flash');
```

これでエラーが解消されて、フラッシュメッセージが無事表示される。
bake コマンドの時点で FlashComponent を設定しておいてくれればいいのに。
FTP 経由の wordmove pull で、DB が反映されないバグを解決する方法

## wordmove 1.3.0 以降には FTP 関連のバグあり

wordmove の最新版である 1.3.1 には、 FTP 経由ではサーバー側のDBがローカルに反映されないというバグがあります。
push でローカル→サーバーはうまくいくんだけど、pull のサーバー→ローカルがうまく反映されません。

github 上の最新版、1.4.0.pre4 でなら解決してるかなーと思ったけど結果変わらず。。

```bash
$ gem list | grep wordmove
wordmove (1.3.1)
$ gem uninstall wordmove
$ rbenv rehash
$ git clone -b v1.4.0.pre4 https://github.com/welaika/wordmove
$ cd wordmove/
$ git checkout -b v1.4.0.pre4
$ git branch
* v1.4.0.pre4
$ gem build wordmove.gemspec 
$ gem install wordmove-1.4.0.pre4.gem
$ gem list | grep wordmove
wordmove (1.4.0.pre4)
```

- [Githubからgemをインストールする方法 - a long log](http://longkey1.net/blog/2012/08/03/gem-install-from-github/)
- [ブランチ、タグを指定してgit cloneする｜WEBデザイン Tips](http://blog.digital-squad.net/article/405317288.html)

rehash が面倒な人はこちらを導入をば。
rbenv の最新版入れてるなら rehash いらないよ？って記事もあるけど、自分の環境では rehash しないと反映されないことがある。。
anyenv を使ってるからかもしれない。

- [sstephenson/rbenv-gem-rehash](https://github.com/sstephenson/rbenv-gem-rehash)
- [Ruby - rbenv を使っているなら rbenv-gem-rehash を使おう - Qiita](http://qiita.com/riocampos/items/f0fe7217972b312c4f3a)
- [riywo/anyenv](https://github.com/riywo/anyenv)
- [anyenvという**env系の簡易マネージャを作った - As a Futurist...](http://blog.riywo.com/2013/06/22/155804/)

次に、github 上の最新版がダメならとバージョンを一つずつ下げて確認。
どうやら 1.3.0 以降から起きてる問題のようで、1.2.0 ではサーバー側のDBがローカルへとしっかり反映されました。

```bash
$ gem uninstall wordmove
$ rbenv rehash
$ gem install wordmove -v=1.2.0
$ gem list | grep wordmove
wordmove (1.2.0)
```
- [gemでバージョンを指定してインストール - おきつです。](http://d.hatena.ne.jp/troopergreen/20080123/1201084441)

ちなみに後から気づきましたが、github でも issue が上がっており、ひとまずは 1.2.0 にダウングレードして対応してくれと書かれてました。

- [Database pull using MAMP 'fails' · Issue #221 · welaika/wordmove](https://github.com/welaika/wordmove/issues/221)

というわけでしばらく 1.2.0 に下げて対応してました。

## 修正のプルリクが来てる

github 見てたら修正のプルリクが来てるのを発見。

- [Fix FTP mysql dump by amchoukir · Pull Request #230 · welaika/wordmove](https://github.com/welaika/wordmove/pull/230)

でもまだ本家には取り込まれていない模様。
ならばプルリク送ってきた人の wordmove を入れればいんじゃね？ってことで修正版を入れてみた。

```bash
$ gem list | grep wordmove
wordmove (1.2.0)
$ gem uninstall wordmove
$ rbenv rehash
$ git clone https://github.com/amchoukir/wordmove
$ cd wordmove/
$ gem build wordmove.gemspec
$ gem install wordmove-1.3.1.gem
$ gem list | grep wordmove
wordmove (1.3.1)
```

- [amchoukir/wordmove](https://github.com/amchoukir/wordmove)
- [Githubからgemをインストールする方法 - a long log](http://longkey1.net/blog/2012/08/03/gem-install-from-github/)

これで見事に最新版（1.3.1）の wordmove でサーバー側のDBがローカルに反映されるようになりました。

次の 1.4.0 ではしっかり対応されるでしょうから、wordmove の 1.4.0 がリリースされるまでは FTP 経由で wordmove を使いたい場合はこの方法で対応して待ちましょう。
FuelPHPのHTMLクラスが便利すぎる

※フロントエンドの人間が「PHPはそんなにワカンネ」レベルで言っています。

#主な使い方

##リンクの生成
```php
html::anchor("http://example.com", "example");
```

結果

```html
<a href="http://example.com">example</a>
```

##画像の生成
```php
html::img("http://example.com/img/photo.jpg", array("alt"=>"image"));
```

結果

```html
<img src="http://example.com/img/photo.jpg" alt="image">
```

この辺のももちろん便利なのだが・・・

#なんでもアリのhtml_tag関数

##リンクの生成
```php
html_tag("a", array("href"=>"http://example.com", "example"));
```

結果

```html
<a href="http://example.com">example</a>
```

##画像の生成
```php
html_tag("img", array("src"=>"http://example.com/img/photo.jpg", "alt"=>"image"));
```

結果

```html
<img src="http://example.com/img/photo.jpg" alt="image">
```

##ネストも可能

```php
html_tag("div", array("class"=>"wrap"),
  html_tag("p", array("class"=>"text"), "テキスト").
  html_tag("p", null, "text")
);
```

結果

```html
<div class="wrap"><p class="text">テキスト</p><p>text</p></div>
```

便利すぎてFuelPHP以外でも使いたい！
なければ用意すればいい！

#html_tag関数を作る

```php
function html_tag($el, $attr, $child = "") {
  $_emptyEl = array("img", "br", "hr", "input", "col", "area", "base", "link", "meta", "param", "source", "track", "wbr", "embed", "command");
  $_attribute = "";
  $_element = "";
  if($attr !== null) {
    foreach($attr as $prop => $value) $_attribute .= ' '.$prop.'="'.$value.'"';
  }

  if(in_array($el, $_emptyEl)) $_element = '<'.$el.$_attribute.'>';
  else $_element = '<'.$el.$_attribute.'>'.$child.'</'.$el.'>';

  return $_element;
}
```

html_tag関数には3つ引数を渡します。

- 第1引数：要素名
- 第2引数：属性配列
- 第3引数：文字列

##要素名
作りたい要素名。HTMLに限らずXMLでも可能。

##属性配列
その要素に付加する属性を配列で渡します。
属性を設定しない場合は`null`にする。
空属性（`disabled` や `required`）には対応していないので、

```php
html_tag("input", array("type"=>"text", "disabled"=>"disabled"));
```

```html
<input type="text" disabled="disabled">
```

このような形になります。（これ自体はinvalidではない）

##文字列

作られる要素の子要素がテキストならばそのままそのテキストの文字列を第3引数に渡せばよいです。
入れ子にするならば`html_tag`関数でネストする形にすれば入れ子になります。
AndroidでDeep Linkを使うときのintent-filterとdataの書き方



アプリをWebページや他のアプリから起動するためにDeep Linkが使われています

起動したいActivityに対してAndroidManifest.xmlに以下のintent-filterを追加すると、`myapp://detail?page=1`のリンクによりアプリを起動することができます

``` AndroidManifest.xml
<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="myapp" android:host="detail" />
</intent-filter>
```

1つのActivityに複数のスキーム、ホストを対応させることもできます。
このとき、1つのintent-filterに複数のdataを持つか、2つのintent-filterにそれぞれdataを持つかどうかで対応するURLが変化します


## Activity,intent-filter,dataの関係
Activity内に複数のintent-filterを持つとOR指定、intent-filter内に複数のdataを持つとsheme, host, pathそれぞれのAND指定となります


## 1つのintent-filterに2つのdata
試しに1つのintent-filterに2つのdata（片方はpathを未設定）を持つと以下のようになります

``` AndroidManifest.xml
<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="myapp" android:host="detail" />
    <data android:scheme="https" android:host="myapp.com" android:pathPattern="/detail.*" />
</intent-filter>
```

起動したURL

```
	myapp://detail/detail?page=1
	https://myapp.com/detail?page=1
```

起動しないURL

```
	myapp://detail/?page=1
	https://myapp.com?page=1
```

ここで、1つめのdataに`pathPattern=".*"`を追加すると、4つ全てのURLでアプリが起動します


## 2つのintent-filterにそれぞれ1つのdata
また、activity内に2つのintent-filterを持ち、それぞれにdataを持たせると以下のようになります

``` AndroidManifest.xml
<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="myapp" android:host="detail" />
</intent-filter>
<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="https" android:host="myapp.com" android:pathPattern="/detail.*" />
</intent-filter>
```

起動したURL

```
	myapp://detail/?page=1
	myapp://detail/detail?page=1
	https://myapp.com/detail?page=1
```

起動しないURL

```
	https://myapp.com?page=1
```

ここで1つ目のdataにpathPatternを追加すると`myapp://detail/detail?page=1`のときアプリは起動しません

複数のintent-filterに対応した気になって、試すと動かなかったのでまとめました

参考：http://ja.stackoverflow.com/questions/457/%E4%B8%80%E3%81%A4%E3%81%AEintent-filter%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6%E8%A4%87%E6%95%B0%E3%81%AEdata%E3%82%BF%E3%82%B0%E3%81%8C%E6%8C%87%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%9Factivity%E3%81%AE%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6
XcodeのBreakPointで式の評価値を確認してデバッグに革命を起こす！


Xcodeでの開発中、BreakPointでとりあえず処理を止めてみたはいいけど、
見たい値が見れずにもどかしい経験をしたことはなかろうか？
わざわざ評価したい式を使いもしないのに変数に入れて確認したり、printしたり…。
でももうそんな日々とはおさらば！そう、この方法を使えばね。

## 方法

とりあえず適当にBreakPointを仕込んでみる。
![スクリーンショット 2015-10-28 17.22.45.png](https://qiita-image-store.s3.amazonaws.com/0/39565/b48116ca-45d0-e9c0-151d-c15994be0bd5.png "スクリーンショット 2015-10-28 17.22.45.png")

そして Debug Area でメニューを開き、`Add Expression`を選択。
![スクリーンショット 2015-10-28 17.26.25.png](https://qiita-image-store.s3.amazonaws.com/0/39565/97da8913-886f-617b-2ebf-cc8e32dfbc65.png "スクリーンショット 2015-10-28 17.26.25.png")

式を入力して`Done`を押すと…
![スクリーンショット 2015-10-28 17.27.43.png](https://qiita-image-store.s3.amazonaws.com/0/39565/1bb2ddd6-de64-27d7-b5bc-4bbeb6c4121a.png "スクリーンショット 2015-10-28 17.27.43.png")

今まで見られなかったviewのframeのパラメータが！見える！見えるぞ！！
![スクリーンショット 2015-10-28 17.28.47.png](https://qiita-image-store.s3.amazonaws.com/0/39565/d1a8210f-67c9-1e42-dd15-62265df27c44.png "スクリーンショット 2015-10-28 17.28.47.png")

## 補足
* 関数や演算子も使える。
* 値を変更するような式を入れてしまうと、本当に値が変わってしまうので注意。
* BreakPointを外しても入力した式を覚えていてくれるので、再度BreakPointを設定すると復活できる。
OSSのワークフローエンジンを使ってみた感想



先日ラスベガスで開催されたre:Inventに参加し、その際にデータ分析基盤系のセッションはほぼ参加したのですが、Job管理ツールの話がかなり出ていたのが印象的でした。

AWSにはData PipelineというJob管理サービスがあるのですが、それではなくOSSのJob管理ツールを使っているところが多い印象でした。

日本では自分の観測範囲だとまだ使っているところがあまり多くない印象ですが(実際自分もほとんど使ったことない)、いくつか候補を絞って触って見たので感想を書きます。

あくまでJenkinsしか使ったことがないような個人の感想としてお読みください。。

## Airflow
* Airbnbが開発元
* re:Inventでは多くのセッションで紹介されており、一番勢いがある印象を受けた。
* 依存関係はPythonで書く
* タスクの登録はUIからやるのではなく、コマンドラインから登録
* Python力を前提にしている感じがある
    * 単純にコマンドを実行したいだけでもAirflowのBashOperatorから実行する必要がある。
    * pipでインストール出来る
* GUIからJobの登録はできない
* UIやデザインはモダンでCoolな印象だがわかりにくい。
* DaemonがUIとWorkerとSchedulerといった形で独立している
* インストールが長い、LocalのMACで30分くらいかかった
* Hadoop(HDFS)との連携機能
* 各種Data Sourceとの連携機能
    * Presto
    * mysql
    * sqlite
    * hive

### 参考
[Airflow’s Documentation — Airflow 1.0.0 documentation](https://airflow.apache.org/index.html)

## Luigi
* 開発元はspotify
* re:Inventでは2番手と言った印象、Workflow Managerの候補には必ず上がっていた。
    * 実際Luigiの説明に時間をかけているセッションもあった。
* Python力を前提にしている感じがある
    * 単純にコマンドを実行したいだけでもPythonを書く必要がある。
    * PythonのClassに決まったメソッド名で処理を記述する(それが1タスクになる)
    * 依存関係もPythonで記述
    * pipでインストール出来る
* GUIからJobの登録はできない
* UIやデザインはモダンでCoolな印象。
* 最近2.0.0というメジャーバージョンアップがされた。(何が変わったかは追いきれてない)
* Hadoop(HDFS)との連携機能
    * もちろんPythonで書く必要がある

### 参考
[Example – Top Artists — Luigi 1.0 documentation](http://luigi.readthedocs.org/en/stable/example_top_artists.html)
[Python - データフロー制御フレームワークLuigiを使ってビッグデータ解析をする - Qiita](http://qiita.com/colspan/items/453aeec7f4f420b91241)

## Azkaban
* 日本ではかなり使われている？使いやすいと評判
* Java製(メモリをもりもり喰うかどうかは不明)
* JavaのProperty file形式でJobを記述
* Property fileの塊をZipでUPLOADする。(GUIからJobの登録が出来る)
* 標準ではないがProperty fileを使わずyamlで依存関係を記述する方法もある([Azkabanについて書く - wyukawa’s blog](http://d.hatena.ne.jp/wyukawa/20151028/1446006572))

### 参考
[Azkaban](https://azkaban.github.io/)
[Azkabanについて書く - wyukawa’s blog](http://d.hatena.ne.jp/wyukawa/20151028/1446006572)
[SIOS　ビッグデータ技術ブログ: Azkabanを使って依存関係のあるジョブの管理を行う（インストール編）](http://sstd-bigdata.blogspot.jp/2014/09/azkaban.html)

## Rundeck
* 試した中ではJenkinsに一番近い(あくまで個人の主観です)
* Java製(メモリをもりもり喰うかどうかは不明)
* yumでインストールできる。
* 基本的にGUIからJobの登録をする。
* Cron、日付指定両方が可能
* UIやデザインはモダンでCoolな印象(あくまで個人の主観です)
* Jenkinsと同様プラグインアーキテクチャが採用されているが、Jenkinsに比べてPluginが圧倒的に少ない。
* Jenkinsからあえて変える理由が見当たらなかった。

### 参考
[Rundeck.org - Job Scheduler and Runbook Automation](http://rundeck.org/)
[ジョブスケジューラ「Rundeck」を試してみる ｜ Developers.IO](http://dev.classmethod.jp/server-side/server/try-rundeck-job/)

## 総括
* イメージ的にはAzkaban, Luigi, Airflowが同カテゴリ、JenkinsとRundeckが同カテゴリという印象
    * 前者はコードでJOBを書き、後者はGUIからJOBを作る
* Pythonがある程度出来る人はLuigi、Airflowはささりそう、逆にそうでないとつらそう
    * アメリカではPython勢力がかなり強いという背景もあり、Luigi、Airflowが人気という部分もありそう。
* GUIの登録だと本番とステージングで設定が乖離していく傾向がある、そこらへんを回避する仕組みがRundeckにあれば迷わず採用していた。
* Jenkinsになれた人ならRundeckが一番入りやすそう
    * とはいえ、あえて変える理由も見当たらない
プログラマーが眠気を飛ばす方法４つ

最近ネットでこんな方法を見た人もいるだろう。

・息を止めてれば生命の危機を感じて目が覚める。

試してみた。
確かに眠気が飛びそうな気がしないでもないが、
それ以前にめちゃくちゃ健康に悪そうなので、
個人的にもう少し健康にマシな感じの、眠気覚まし方法を紹介する。



# １：体温より熱い飲み物をゴクゴク飲む

喉をやけどするのは良くないので、「これ以上熱かったらゴクゴク飲めない」というギリギリの温度に調節してほしい。
それをチビチビではなくゴクゴク飲む。胃の温度を上げる感じに飲む。
冷たい飲み物は効果がない。
どの職場にも、熱湯と冷水くらい手に入れる術はあるだろう。
人間も爬虫類と同じで、腹が温かい方が活発になるのを実感できる。


# ２：『ミンティアDry Hard』をかみ砕きながらペプシゼロを飲む

ネタっぽいけどマジ。
完全にカフェイン頼みだが、コーヒーなんか問題じゃないくらい目が覚める。
ペプシゼロなのは、単にカロリーが怖いから。
温度が低いが、熱いペプシゼロが売ってないので仕方ない。


# ３：歩く

特に階段を上ると効果的。
歩いている間に、机に戻ったら一番にやる作業を考えておくと効果が高い。
ぼんやり歩くのは、机に戻ったとたんに眠気が復活するので不可。


# ４：トイレで１０分寝る

いびきに注意。



**これだけやってもダメなら家に帰った方が良い。**
健康と納期（と家庭）を全て守るのが一流だ。
DynamoDB の ThrottleEvent アラーム一括設定

内容的には下記の EC2 に対しての設定と同じようなものだが…
http://qiita.com/web_se/items/8a969bd0d2aef1395272

DynamoDB のプロビジョンされたスループット超過のイベントである、ReadThrottleEvents/WriteThrottleEvents を通知してほしい。
該当メトリクスの CloudWatch アラームをまとめて設定する ruby スクリプトのサンプル

```rb
#!/usr/bin/env ruby

require 'aws-sdk'

dynamo = Aws::DynamoDB::Client.new(...) # set credentials for your env 
cw = Aws::CloudWatch::Client.new(...)

all_table_names = []
start_table = nil

while dynamo.list_tables(exclusive_start_table_name: start_table).next_page? do
  all_table_names += dynamo.list_tables(exclusive_start_table_name: start_table).table_names
  start_table = dynamo.list_tables.last_evaluated_table_name
end

target_names = all_table_names.select do |name|
  # 何か条件
end

target_names.each do |table_name|
  metrics = ['ReadThrottleEvents', 'WriteThrottleEvents'].each do |metric|
    puts "enable throttle alarm(#{metric}) to '#{table_name}'"
    cw.put_metric_alarm(
      {
        alarm_name: "#{table_name}-#{metric}",
        alarm_description: "#{table_name}-#{metric}",
        alarm_actions: [
          ..., # alarm action の ARN, 例えば SNS の "arn:aws:sns:ap-northeast-1:xxxxxxx:yyyyyyyy"
        ],
        metric_name: metric, namespace: 'AWS/DynamoDB',
        statistic: 'Sum',
        dimensions: [{name: 'TableName', value: "#{table_name}"}],
        period: 60, unit: 'Count',
        evaluation_periods: 1,
        threshold: 0,
        comparison_operator: 'GreaterThanThreshold',
      }
    )
    sleep 1 # API 制限回避…
  end
end

```

AWS CLI でもだいたい似た名前の呼び出しでできるはず。
【Swift】Test時のエラー対処 (随時追記予定)

### ■ Spec
**Xcode:**  version 7.0.1
**Swift:**  version 2.0
**Cocoapods:**  version 0.39.0
　
***
#### **◇ ライブラリのimportがarchitectureの問題でエラーになる**
　→ podsプロジェクトの `BuildActiveArchitectureOnly` が `YES` になっていないか確かめる
　　※pod install 実行後にYESに戻ってしまうので注意
　①Podsプロジェクトを選択
　②プロジェクトを選択
　③BuildSettingsを表示
　④[ Build Active Architecture Only ]を検索し、値を `NO` にする
　⑤再度ビルドしてみる
　![スクリーンショット 2015-10-28 17.17.48.png](https://qiita-image-store.s3.amazonaws.com/0/50890/2e8b5091-b81e-e49c-84c2-8e2e5d262051.png)
　
　

***
#### **◇ buildした `@testable` 対象のプロジェクトが `cannot import module being compiled swift` エラーになる**

![スクリーンショット 2015-10-28 17.07.11.png](https://qiita-image-store.s3.amazonaws.com/0/50890/91a24a77-d62d-e26e-2cc9-36ab00a0e821.png)

　**→ TestTargetの `ProductName` が `BuildTarget` のものと一緒になっていないか確認。**
　**→ Frameworkなどと名前が被っていないか確認。**
　①プロジェクトを選択
　②TestTargetを選択
　③BuildSettingsを表示
　④[ product ]を検索し、ProductNameの項目をCheck
　⑤BuildTargetと同じ名前だったり、frameworkと名前がかぶっていたら修正
　 ※ **`$(TARGET_NAME)`** にしたらだいたい改善します

![スクリーンショット 2015-10-28 17.05.18.png](https://qiita-image-store.s3.amazonaws.com/0/50890/4a676c9a-7ca8-0e05-f53a-6feb394e3e96.png)
NS_DEPRECATEDマクロを理解する

# 具体例

NSManagedObjectContext.h:
> - (instancetype)init NS_DEPRECATED(10_4,10_11,3_0,9_0, "Use -initWithConcurrencyType: instead");

この NS_DEPRECATED(10_4,10_11,3_0,9_0) とは何か？

# 意味

Mac OSX だと 10.4 / iOS だと 3.0 にて登場した API で、OSX だと 10.11/ iOS だと 9.0 で deprecated(非推奨) になりました

# 参考資料

- http://iosdevelopertips.com/best-practices/eveything-you-need-to-know-about-ios-and-os-x-deprecated-apis.html
AutoLayoutでアニメーションを設定する方法(Swift版)


以前書いた[AutoLayoutでアニメーションを設定する方法](http://qiita.com/bohemian916/items/ba46964a3d2ed7ae0dc5)のSwift版です。

## アニメーションで動かしたいものの例
例として、mainViewの上に乗った、movableViewを下に動かすことを考えます。
![autolayout.001.jpg](https://qiita-image-store.s3.amazonaws.com/0/50474/e416e856-c0a4-7557-cee0-8c60d0429c32.jpeg)

movableViewの制約は、superViewであるmainViewに対して、以下のような制約を持っているとします。
<img width="251" alt="スクリーンショット 2015-10-28 16.23.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/50474/d8e9d86a-3785-feaf-bdd3-219c477ac61c.png">

Top Space, Trailing Space, Leading Spaceの各種の制約の値は0になっています。高さは適当です。

## やってみる
基本的な考え方は、既に付いているautoLayoutの制約を外し、別の制約を付ける、ということです。今回の場合、"Top Space to SuperView = 0"　の制約を外し、Top Space to mainView = 30 といった制約をつけます。

まず外す対象の制約をoutletでソースに結び付けておきます。また一緒に、付ける制約をプロパティとして宣言しておきます。

```swift
@IBOutlet weak var topConstraint: NSLayoutConstraint!
var modifiedTopConstraint : NSLayoutConstraint?
@IBOutlet weak var mainView: UIView!
```

次に、付ける制約について設定します。

```swift
self.modifiedTopConstraint = NSLayoutConstraint(
        item: self.mainView, 
        attribute:  NSLayoutAttribute.Top, 
        relatedBy:  NSLayoutRelation.Equal, 
        toItem:     self.movableView, 
        attribute:  NSLayoutAttribute.Top, 
        multiplier: 1.0, 
        constant:   30.0 
        )
```

この制約の設定は、１つ目のアイテム、１つ目のアイテムの場所、関係性、２つ目のアイテム、２つ目のアイテムの場所、係数、定数のように引数をいれます。詳しくは[こちら](http://qiita.com/bonegollira/items/5c973206b82f6c4d55ea)を参考

最後に、制約を外して、つけ直します。

```swift
// 制約を外す
self.mainView.removeConstraint(self.topConstraint!)
// 制約を付け直す
self.baseView.addConstraint(self.modifiedTopConstraint!)
// 更新をかける
       UIView.animateWithDuration(
            0.5,
            delay:0.3,
            options:UIViewAnimationOptions.CurveEaseOut,
            animations: {() -> Void in
                // これが大事!
                self.view.layoutIfNeeded()
            },
            completion: nil
        );
```

これで上にくっついていたmovableViewが下に移動するはずです。
もとに戻したいときは、外す制約と付ける制約を入れ替えてあげればよいです。

## 最後に
基本的な動作のみを説明したので、あとはいろいろ応用してみてください。
横に動かしたり、複数の制約を同時に操作したり、アニメーションの速度、遅延、効果をいじったり。

## 参考
* AutoLayoutでアニメーションを設定する方法(Objective-C版)  
http://qiita.com/bohemian916/items/ba46964a3d2ed7ae0dc5
* コードでAutolayout  
http://qiita.com/bonegollira/items/5c973206b82f6c4d55ea
* animateWithDurationビフォーアフター  
http://qiita.com/hirocueki/items/db22b9578ca43e54e45f
IO<T>からIO<Exception>を抽出しようとしてみた

#何がしたかったか
適当なストリームが吐く例外を集めたストリームを拾ってみたくなった。

例えば、偶数をそのまま通して、奇数を入れるとエラーを吐く`IO<int>`があって、

```csharp
public class EvenReceiver : IObservable<int>
{
    private Subject<int> subject = new Subject<int>();
    public IDisposable Subscribe(IObserver<int> observer)
    {
        var normal = subject
            .Where(x => x % 2 == 0)
            .Subscribe(x => observer.OnNext(x));
        var error = subject
            .Where(x => x % 2 != 0)
            .Subscribe(x => observer.OnError(new ArgumentException("Argument must be even.")));
        return Disposable.Create(() => { normal.Dispose(); error.Dispose(); });
    }

    public void Receive(int x)
    {
        subject.OnNext(x);
    }
}
```
こう書いたら

```csharp
EvenReceiver rcv = new EvenReceiver();
var success = rcv.Retry();
var failure = rcv.Failure();

success.Subscribe(Console.WriteLine);
failure.Subscribe(Console.WriteLine);

rcv.Receive(0);
rcv.Receive(1);
rcv.Receive(2);
rcv.Receive(3);
rcv.Receive(4);
rcv.Receive(5);
```
こうなってほしい

```
0
System.ArgumentException: Argument must be even.
2
System.ArgumentException: Argument must be even.
4
System.ArgumentException: Argument must be even.
```

大本のストリーム(`EvenReceiver`) を `int` ではなく
`Either`などを作ってそいつのストリームにすれば簡単そうだが、
大本がいじれない場合どうするか？

#やってみた
こんな感じだろうか

```
public static class FailureExtension
{
    public static IObservable<Exception> Failure<T>(this IObservable<T> source)
    {
        var error = new Subject<Exception>();
        Reconnect(source, error);
        return error;
    }

    private static void Reconnect<T>(IObservable<T> source, IObserver<Exception> error)
    {
        source.Subscribe(
            _ => { },
            ex =>
            {
                error.OnNext(ex);
                Reconnect(source, error);
            },
            () => { });
    }
}
```

まわりくどいことをしてしまっているような気がしてならない。
Photos.framework でフォトライブラリから最新の写真を取得する


写真を扱うアプリでは、『ライブラリから選択』『写真を撮る』という選択肢を用意するのが普通ですが、そのほかに『最新の写真を使う』という選択肢も用意しておくと便利です。
ここでは iOS の Photos.framework を使ってフォトライブラリから最新の写真を取得する方法を紹介します。

![screenshot.jpg](https://qiita-image-store.s3.amazonaws.com/0/11029/22330cc3-15cb-805d-4444-8d78b52c33be.jpeg "screenshot.jpg")


## サンプルコード

```
var fetchResult = PHAssetCollection.fetchAssetCollectionsWithType(
    .SmartAlbum,
    subtype: .SmartAlbumUserLibrary,
    options: nil
)

guard let assetCollection = fetchResult.firstObject as? PHAssetCollection else {
    return
}

let options = PHFetchOptions()
options.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
fetchResult = PHAsset.fetchAssetsInAssetCollection(assetCollection, options: options)

guard let latestAsset = fetchResult.firstObject as? PHAsset else {
    return
}

// latestAsset を使う
```


## 解説

まずは `PHAssetCollection` の `fetchAssetCollectionsWithType:subtype:options:` というメソッドで写真のコレクションを取得します。
サンプルコードでは `type` に `.SmartAlbum` を、`subtype` に `.SmartAlbumUserLibrary` を指定しているので、いわゆる『カメラロール』から写真を取得することになります。
別のアルバムから取得したい場合は、この `type` と `subtype` の組み合わせを変更する必要があります。

組み合わせについてはこちらが参考になります: [(iOS8.1)PhotoKitで各種アルバムを取得する](http://qiita.com/takabosoft/items/cb3438f3762f1f59a5ef)

```
var fetchResult = PHAssetCollection.fetchAssetCollectionsWithType(
    .SmartAlbum,
    subtype: .SmartAlbumUserLibrary,
    options: nil
)

guard let assetCollection = fetchResult.firstObject as? PHAssetCollection else {
    return
}
```

次に、`PHAsset` の `fetchAssetsInAssetCollection:options:` でコレクションから写真を取得します。
このとき、`PHFetchOptions` の `sortDiscriptor` にディスクリプタをセットすることで、写真をどのような順番で取得するかを指定できます。
サンプルコードでは写真を作成日で降順にソートするよう指定しています。
あとは取得結果の最初の要素を取り出せば、それが最新の写真になっているというわけです。

```
let options = PHFetchOptions()
options.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
fetchResult = PHAsset.fetchAssetsInAssetCollection(assetCollection, options: options)

guard let latestAsset = fetchResult.firstObject as? PHAsset else {
    return
}

// latestAsset を使う
```
Booting WEBrick

$ rails s
=> Booting WEBrick
=> Rails 3.2.14 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
A server is already running. Check /worktest/sample/tmp/pids/server.pid.
Exiting
#起動中のプロセス一覧を表示
$ ps ax
　　：
　　：
　　：
　　：
5441 pts/0 Tl 0:06 /home/vagrant/.rbenv/versions/1.9.3-p448/bin/ruby script/rails s
5582 ? S 0:00 pickup -l -t fifo -u
5855 pts/0 R+ 0:00 ps ax
対処方法　↓
#起動中のプロセスを終了
$ kill -9 5441
（補足）
homeがついてたら、その番号に対応する
簡単な二次元配列の作り方


ググってもなかなかピンとくる書き方が無かったため、メモ。
やっていることは、一次元配列に一次元配列を格納してるだけ。

```ruby
arr = []
#適当に3回ループ
3.times do
	val1 = "a"
	val2 = "b"
	arr << [val1, val2]
end
```

配列の中身

```
[["a","b"],["a","b"],["a","b"]]
```

これで、String[2,3]の二次元配列ができる。

取り出すときは、

```ruby
arr.each do | val1, val2 |
	p val1
	p val2
end
```
みたいに、doの後ろの||の中を増やしてあげれば簡単に取り出せる。

Rubyの多次元配列初めて使ったけど、他の言語に比べて扱いが難しい気がする。
Slack のチャンネルを「進む」「戻る」で移動する方法  ( 履歴順 )

`Alt + ← →` で移動できる。 ( Alt を押しながら左右キー )

Mac なら `Command + [ ]` だ。

「進む」「戻る」みたいな感じでチャンネルを移動できる。
ちなみにチャンネルを見るだけで履歴に記録され、移動の対象になる。

# 補足

- ← 左 が古く、右 → が新しい、
- コメント入力中は移動できない。コメントを消せば移動できる。
- チャンネル移動だけではなく、サイドバーの開閉の履歴もたどるようだ。（よく分かっていない）
- 2015年10月現在、アプリ側のショートカットヘルプには載っていない。(公式サイトのショートカットには載っている)

---
　
Thanks to Yamoto



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
Ｒｏｕｔｉｎｇ　Ｅｒｒｏｒ　Ｎｏ　ｒｕｔｅｓ　matches {GET}"/static_pages/home"

Ｒｏｕｔｉｎｇ　Ｅｒｒｏｒ
Ｎｏ　ｒｕｔｅｓ　matches {GET}"/static_pages/home"
ルーティングエラー
つまりアクセスの許可がないって書いてあります
ActionView::MissingTemplate in StaticPages#home

ActionView::MissingTemplate in StaticPages#home
対処方法↓
1.自分でsharedフォルダを作る。

2.その中に_error_messages.html.erbファイルを作る。

3.以下コードを_error_messages.html.erb内に記述

<% if object.errors.any? %>
<div id="error_explanation">
<div class="alert alert-danger">
The form contains <%= pluralize(object.errors.count, "error") %>.
</div>
<ul>
<% object.errors.full_messages.each do |msg| %>
<li>* <%= msg %></li>
<% end %>
</ul>
</div>
<% end %>

以上で フォーム入力に不備があった場合のエラーを吐き出すパーシャルが設定できます。

もし、deviseを利用したユーザー登録のようなエラーメッセージのスタイルにならなければスタイルシートの記述も同じページにございます。

尚、画像ではエラーが最大6個ほど出ている部分がありますが、現在は最大3個程度のエラー表示になります。

（簡単に言うとパスワードを入力していない時、「パスが入っていない」と「パスワードが一致しない」両方出ていたが、パスが入っていないだけで解決できるため。）
BigQueryで初期費用ゼロ，開発ゼロでプライベートDMPを作る


最近流行りのプライベートDMPですが、その大半はトレジャーデータ（YBI）だったりします。
トレジャーデータはすごい便利（特に[td-js-sdk](http://docs.treasuredata.com/articles/javascript-sdk)）なんですが、ちょっとお高い。

一方で、BigQueryは価格の安さとクエリの実行速度は魅力的なんですがトレジャーデータに比べるとデータの入出力が非常に不便だったりします。

なので、トレジャーデータのような使いやすさをBigQuery上で実現するアプリケーションをGAE(Python)で作ってみました。
自分のソースコードを使うのであれば開発ゼロで構築可能です。

ソースコード：https://github.com/mats116/ElasticBigQuery

※ 改修等は自由にやって頂いて大丈夫ですが、出来ればIssueやPull Request頂けると嬉しいです。
※ ちなみに完全に個人プロジェクトなんで、所属企業とはなーんの関係もないです。
※ `elasticbigquery.appspot.com`は無課金で動かしているので自由に叩いて大丈夫ですが、良識の範囲内でお願いします。

# 出来るようになること

## [td-js-sdk](http://docs.treasuredata.com/articles/javascript-sdk)からのログ取得

- 下記のようにエンドポイントを変更するだけでトレジャーデータと同じように動作します。
	- writeKeyは今のところstaticですが、発行や権限管理を画面上から行えるようにする予定です。
	- v1.4.0ぐらいからデフォルトになったJSONPのみ対応しています。
- BigQueryはスキーマレスではありませんがAPI内で自動識別し、datasetとtableの生成まで自動で行います。
	- 生成されるtable名は`table_id+YYYYMMDD`のように末尾に日付（UTC）が入り、日別テーブルになるようになっています。
- 独自機能として下記パラメータはURLデコードされた状態で取得されます。
	- td_path
	- td_referrer
	- td_url

```html:pageviews.js
<script type="text/javascript">
  var td = new Treasure({
    host: 'elasticbigquery.appspot.com',
    pathname: '/dmp/v1/event/',
    writeKey: 'thie_is_static_setting_yet',
    database: '<dataset_id>'
  });

  td.trackPageview('<table_id>');
</script>
```

## webビーコンからのログ取得
- 下記エンドポイントで透過GIFを返します。
	- `//elasticbigquery.appspot.com/dmp/v1/beacon/<dataset_id>/measurement`
- GETパラーメータが取得出来ます。
	- リファラーなどデフォルトで取得しているパラメータがいくつかあります。

## Cookie IDの発行
- GAEのドメイン`xxx-xxx.appspot.com`の配下に`bqid`を発行します。
	- 用途に応じてドメインやid名は変更して下さい。
- 下記エンドポイントで確認可能です。
	- http://elasticbigquery.appspot.com/dmp/v1/bqid/get
	- GETパラメータに`callback=hoge`を付与するとJSONP的な感じで使えます。

# これから出来るようにしたいこと

## アカウントの制御

- Oauth(Google)でサインアップしたアカウントにBigQueryのdatasetに対する権限をUI上から付与できるようにしたい。

## writeKeyの制御

- UI上からwriteKeyを発行出来るようにしたい。（現状はstatic）
	- 都度、Cloud Datastoreを参照すると辛いので多分memocache？

## エクスポート機能

- クエリ結果をS3やGoogle Cloud Storageへのエクスポート出来るようにしたい。
	- Apps Scriptとなんかいい感じに統合できないかな

# 所感

- 完全に[td-js-sdk](http://docs.treasuredata.com/articles/javascript-sdk)にフリーライドしてます。。
- BigQueryへの投入に失敗したさいに、Taskqueueに積んだりしているので結構固くは作ってます。
- 個人プロジェクトなんで、GAEの負荷検証とかやってくれる会社を募集中です。
- UI作るの苦手なので誰か手伝って下さい。


### ※GAE構築方法

参考までに。GAE初めての人は頑張って。

#### 用意するもの

- Googleアカウント（@gmailのアドレスでもOKです）
- [Google App Engine SDK](https://cloud.google.com/appengine/downloads)が入ったPC

#### プロジェクトの作成

- [Google Developers Console](https://console.developers.google.com/project)で新しくプロジェクトを作成します。
	- App Engineの場所は **us-central** が日本から一番近いかと
	- デフォルトで **BigQuery API** は有効化されているはずですが、念のため確認を

#### ソースコードの取得

- GitHubに公開しているので適当にクローンして下さい。
	- https://github.com/mats116/ElasticBigQuery

#### 設定変更

- `app.yaml`を開いて、プロジェクト名を変更します
	- ソースコードでいうと[ここ](https://github.com/mats116/ElasticBigQuery/blob/master/app.yaml#L1)

#### デプロイ

- Google AppEngineLauncherからデプロイします。
![GoogleAppEngineLauncher_と_BigQueryで初期費用ゼロ，開発ゼロでプライベートDMPを作る.png](https://qiita-image-store.s3.amazonaws.com/0/45249/1858d296-996e-18cb-cecb-51c289a6b840.png "GoogleAppEngineLauncher_と_BigQueryで初期費用ゼロ，開発ゼロでプライベートDMPを作る.png")
Rails 4.2.1 application starting in development on http://0.0.0.0:3000

=> Booting WEBrick
=> Rails 4.2.1 application starting in development on http://0.0.0.0:3000
=> Run rails server -h for more startup options
$
対処法
$ rails server -d -b 0.0.0.0を入力することで、対処できる
※「rails server -d -b 0.0.0.0」でWEBrickを起動する事で、Amazon Linux以外のマシンから3000番ポートの接続を受け付けられるようになります。
WEBrickを停止する

$ id
uid=501(rails) gid=501(rails) groups=501(rails)
$

$ ps awux | grep -v grep | grep 'rails server'
rails 2776 0.0 7.8 539068 80132 ? Sl 00:11 0:00 /usr/local/rbenv/versions/2.2.1/bin/ruby bin/rails server -d -b 0.0.0.0

$ ps awux | grep -v grep | grep 'rails server' | awk '{print $2}'
2776
$

$ ps awux | grep -v grep | grep 'rails server'
rails 2776 0.0 7.8 539068 80132 ? Sl 00:11 0:00 /usr/local/rbenv/versions/2.2.1/bin/ruby bin/rails server -d -b 0.0.0.0

$ kill ps awux | grep -v grep | grep 'rails server' | awk '{print $2}'
$
Can't initialize a new Rails application within the directory of another, please change to a non-Rails directory first.

Can't initialize a new Rails application within the directory of another, please change to a non-Rails directory first.
Type 'rails' for help.
エラー内容としては、rails_projects ディレクトリが既にRailsアプリケーションになっているので、その外で実行してください、です。
Xcodeで「The identity used to sign the executable is no longer valid.」が表示されて実機でビルドできないときの対応方法

# Provisioning Profileのステータスを確認

* iOS Member Centerにログイン > Provisioning Profile > 対象の証明書のステータスがActiveかどうかを確認する
* Activeではなかったら、Edit > Generateで証明書を作り直す

# Provisioning Profileをダウンロードする

* Xcode > Preferences > Apple IDを選択(表示されていなかったら登録する > アカウントを選択して「View Detail」ボタンをクリック > 「Download All」ボタンをクリック

# キーチェーンアクセスで無効な証明書を削除する

無効な証明書があるとビルドが失敗するので、削除します

* キーチェーンアクセス　> 自分の証明書 
* 無効になっている証明書を削除する

(無効な証明書を消しても治らなければ、有効な証明書も削除してみる)

# 再実行

* Xcode > Product > Clean
* Xcode > Product > Run
MovableTypeのData APIのメモ

MTを使ってデモをしなければいけなくなったので、Data APIを触ってみた。
JavaScriptを使って、JSONをごにょごにょできれば、それほど難しい仕様ではない。ただ[MT Data API]などでググっても具体例が少なく、あったとしてもリストを呼び出すサンプルぐらいしかない。

MovableTypeのData APIについて、メモしておく。

## Data APIの確認

下記のURLを叩いて、JSONが吐かれれば利用できる状態

    {path}/mt-data-api.cgi/v2/sites/{site_id}/entries

- [Movable Type Data API v2](http://www.movabletype.jp/developers/data-api/v2-reference.html)
- [Movable Type Data API v3](http://www.movabletype.jp/developers/data-api/v3-reference.html)

## Movable Type JavaScript SDK

下記のJavaScriptを読み込む

```html

<script src="<mt:StaticWebPath>data-api/v2/js/mt-data-api.min.js">
```

### JavaScript SDKのメソッド一覧

[DataAPI SDK japanese MT.DataAPI · movabletype/mt-data-api-sdk-js Wiki](https://github.com/movabletype/mt-data-api-sdk-js/wiki/DataAPI-SDK-japanese-MT.DataAPI)

### JavaScript SDKの基本的な使い方

参照: [DataAPI SDK japanese MT.DataAPI Basic usage · movabletype/mt-data-api-sdk-js Wiki](https://github.com/movabletype/mt-data-api-sdk-js/wiki/DataAPI-SDK-japanese-MT.DataAPI-Basic-usage)

```js

var api = new MT.DataAPI({
  baseUrl:  "https://your-host/mt/mt-data-api.cgi",
  clientId: "your-client-id" // 任意
});

api.listEntries(siteId, function(response) {
  if (response.error) {
    // エラー処理
    return;
  }

  for (var i = 0; i < response.items.length; i++) {
      var entry = response.items[i];
      // ブログ記事を表示
  }
});
```

さらに下記のドキュメントも参照しておくといいかもしれない。

[DataAPI SDK japanese MT.DataAPI Endpoint methods overview · movabletype/mt-data-api-sdk-js Wiki](https://github.com/movabletype/mt-data-api-sdk-js/wiki/DataAPI-SDK-japanese-MT.DataAPI-Endpoint-methods-overview)
syntax error とは

syntax error とは
シンタックスエラーとは、プログラム上の構文の誤りのことである。
シンタックスエラーは、プログラムの文法や構文などが正しくない時に、コンパイラによって発見、あるいは、警告されるコンパイルエラーの一種である。また、コンパイル前のソースコードを目視することによって発見できるエラーでもある。
On branch master　nothing to commit, working directory clean

On branch master
nothing to commit, working directory clean
クリーンな作業コピーである（つまり、追跡されているファイルの中に変更されているものがない）ことを意味します。また、追跡されていないファイルも存在しません（もし追跡されていないファイルがあれば、Ｇitはそれを表示します）。最後にコマンドを実行するとあなたが今どのブランチにいるのかを知ることができます。現時点では、常にmasterとなります。これは、デフォルトであり、ここでは特に気にする必要がありません。
RuntimeError in StaticPagesController#home

RuntimeError in StaticPagesController#home
Circular dependency detected while autoloading constant ApplicationHelper
対処法　
　↓

app/helpers/static_pages_helper.rb
これの中身をこれに↓
module StaticPagesHelper
end

app/helpers/application_helper.rbは
これの中身をこれに↓
module ApplicationHelper
end
form_forの理解をするためのリンク集

## [Rails: モデルオブジェクトとフォーム RailsGuides + API - tkymtk's blog](http://tkymtk.hatenablog.com/entry/2013/11/19/213732)

> 例:

> ```
<%= text_field(:person, :name, class: "create_input") %>
```
>↓

> ```
<input id="person_name" name="person[name]" type="text" value="#{@person.name}" class="create_input"/>
#もし@person.nameがHenryなら、value="Henry"
```

> 
> ## オブジェクトにフォームをバインドする（form_for）
> 上記のやり方でもやりやすくなったが、完璧にはほど遠い
たくさんの属性を持つオブジェクトなら名前を何回も繰り返さなければならない。
そこで、どうにかフォームをモデルにバインドしたい。
それこそが、まさにform_forがしていること。

## [2010-08-29 - ～ odalog ～](http://d.hatena.ne.jp/masaki0303/20100829)

## [Rails4になってから、ActiveModelというAPIもすげシンプルになった。 - Railsプロになろう！](http://d.hatena.ne.jp/senggonghaza/20130707/1373158508)

## [【ruby】ActiveModelを使ってDBと関係ないFormを作成する【Rails】 - tanihiro.log](http://tanihiro.hatenablog.com/entry/2014/01/09/193720)

## [【Rails】formヘルパーを徹底的に理解する - Qiita](http://qiita.com/shunsuke227ono/items/7accec12eef6d89b0aa9)

## [【Rails】fields_for と accepts_nested_attributes_for - kzy52's blog](http://kzy52.com/entry/2013/07/10/200144)

> accepts_nested_attributes_forです。すごく便利。
> **profile_attributes=** と **academics_attributes=** メソッドが追加される

## [coderwall.com : establishing geek cred since 1305712800](https://coderwall.com/p/kvsbfa/nested-forms-with-activemodel-model-objects)
Away3D_複数のカメラ

package 
{
	
	import away3d.cameras.Camera3D;
	import away3d.containers.View3D;
	import away3d.entities.Mesh;
	import away3d.materials.ColorMaterial;
	import away3d.primitives.PlaneGeometry;
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.geom.Vector3D;
	/**
	 * ...
	 * @author umhr
	 */
	public class Canvas extends Sprite 
	{
		private var _view:View3D;
		private var _view2:View3D;
		private var _mesh:Mesh;
		private var _secondCamera:Camera3D;
		public function Canvas() 
		{
			init();
		}
		private function init():void 
		{
			if (stage) onInit();
			else addEventListener(Event.ADDED_TO_STAGE, onInit);
		}

		private function onInit(event:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, onInit);
			// entry point
			
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.align = StageAlign.TOP_LEFT;

			_view = new View3D();
			_view.antiAlias = 2;
			_view.backgroundColor = 0x000000;
			_view.width = stage.stageWidth;
			_view.height = stage.stageHeight;
			addChild(_view);

			_view.camera.z = -1000;
			_view.camera.y = 0;
			_view.camera.lookAt(new Vector3D());
			
			_view2 = new View3D(_view.scene);
			_view2.backgroundColor = 0xFF0000;
			_view2.width = 200;
			_view2.height = 200;
			addChild(_view2);
			
			_view2.camera.z = -1000;
			_view2.camera.y = -1000;
			_view2.camera.lookAt(new Vector3D());
			//_secondCamera = new Camera3D();
			
			
			
			//var material:BitmapViwport
			
			
			// BitmapDataでテクスチャを作る場合
			//var texture:Texture2DBase = Cast.bitmapTexture(new BitmapData(256, 256, true, 0xFFFF0000));
			//var textureMaterial:TextureMaterial = new TextureMaterial(texture);

			var colorMaterial:ColorMaterial = new ColorMaterial(0x00FF00, 1);
			_mesh = new Mesh(new PlaneGeometry(640, 480, 1, 1,false, true), colorMaterial);
			_mesh.x = 0;
			_mesh.y = 0;
			_mesh.z = 0;
			_view.scene.addChild(_mesh);

			addEventListener(Event.ENTER_FRAME, enterFrame);

			
			
		}
		private function enterFrame(e:Event):void 
		{
			_mesh.rotationY ++;

			_view.render();
			_view2.render();
			//trace(_view.renderedFacesCount);
		}
	}
	
}
DKMSインストール時に kernel-devel が見つからない Requires: kernel-devel

#DKMSインストール時に kernel-devel が見つからない

##環境 CentOS release 6.7 (Final)
$sudo yum install dkms --enablerepo=epel

Error: Package: dkms-2.2.0.3-30.git.7c3e7c5.el6.noarch (epel)
           Requires: kernel-devel

$sudo yum install kernel-devel 
No package kernel-devel available.

/etc/yum.conf　の　exclude=kernel*　を消すという記事はあちちでみかけましたが,そもそも yum.confにその行がない。

##解決方法

/etc/yum.repos.d/CentOS-Vault.repo
[C6.5-base]
enabled=1
[C6.5-updates]
enabled=1

としたら
$sudo yum install kernel-devel
で出てきました。

**追記**
/etc/yum.repos.d/CentOS-Vault.repoを書き直すのは面倒なので、下記の方が良いです。

**$sudo yum -y install --enablerepo=C6.5-base,C6.5-updates kernel-devel**

CentOS-6.7-x86_64-minimal.iso 辺りを使ってinstall、yum update後
この1行をやっておけば他の物をinstallする時にも困らないです。
$HOMEへElmをインストール

- osxの話
- 公式installerも`brew cask`も`/usr/local/..`の方に入ってしまう

## nvm入れた上でnpm経由でインストールするすればok

- おそらく`n`でも`nodebrew`でもok

```
npm install -g elm
```
- <del>`@..`をつけずにで入るやつだと、インストール時に走るテストがこけたり、warningがでる</del>
    - <del>まだbug潰し中なのでそのうち安定してインストールできるものがリリースされると期待</del>

- [New (beta!) version of npm installer - Google グループ](https://groups.google.com/forum/#!searchin/elm-discuss/npm/elm-discuss/Dxx0_6TVXuM/yCh1qRB4AwAJ)
    - このMLで紹介されてた
    - 一応公式っぽい
[ODE]dSpaceCollideにメンバ関数を渡す


プロプログラマの皆さんには何言ってんだこいつレベルの記事でしょうが，備忘録的に．

- [OpenDynamicsEngine](http://www.ode.org/)を使用する上で，オブジェクト指向っぽくしたい
- コールバック関数を渡すときにstaticじゃないとメンバ関数を渡せない

ので，

```cpp:main.cpp
class simWorld
{
public:
~~
public:
	simWorld()
	{
      ~~
    };
	
	~simWorld()
	{
		~~
	}
		
	static void nearCallback(void *data, dGeomID o1, dGeomID o2)
	{
		simWorld *tgt = (simWorld*)data;
        
        ~~
	};
	
	void simLoop ()
	{
		dSpaceCollide(space,this,nearCallback);

        ~~
	};

	
	
	
};
```

ってな感じでdataにthisを渡してあげるとイイカンジです．
nearCallback内では[tgt->]な感じでアクセス．

右も左もわからないので，こんなことやっちゃダメとかなにかありましたらコメント頂けると助かります．．．
nginxとphp-fpmでphpがAccess deniedで表示されない

Apacheからコンテンツを順次nginxサイトへ移植中に発生した出来事の対処メモ
検索で引っかかって誰かの役に立てば何より。

環境は[前と一緒](http://qiita.com/f-akazawa/items/a5d0bf61d78a052df85a)

概要
---
myserver.com/othersite/ は表示されているところに
同じドキュメントルートにフラットにコンテンツをコピーした
myserver.com/mysite/　以下が表示されずAccess deniedのつれない表示

nginxのエラーログ
---
```
yyyy/mm/dd hh:mm:ss [error] xxxxx#xxxxx: *1 FastCGI sent in stderr: "PHP message: PHP Warning:  Unknown: failed to open stream: Permission denied in Unknown on line 0
Unable to open primary script: /usr/share/nginx/html/mysite/index.html (Permission denied)" while reading response header from upstream, client: 192.168.xx.xxx, server: localhost, request: "GET /mysite/ HTTP/1.1", upstream: "fastcgi://unix:/var/run/php-fpm/php-fpm.sock:", host: "myserver.com"
```

いろいろ調べましたが[犯人はSELinuxでした](http://stackoverflow.com/questions/22090350/nginx-unable-to-open-primary-script)

対処
---
`sudo setenforce o`

再起動時にまた悪さしないように設定ファイルも編集しておく

```
/etc/selinux/config

SELINUX=disabled
```
Python で漢数字をアラビア数字に変換

ググってみるとあまりサンプルがないし古い (Python2版) のばかりなので作ってみました。
(バグってたので修正)

```python:
import re

tt_ksuji = str.maketrans('一二三四五六七八九〇壱弐参', '1234567890123')

re_suji = re.compile(r'[十拾百千万億兆\d]+')
re_kunit = re.compile(r'[十拾百千]|\d+')
re_manshin = re.compile(r'[万億兆]|[^万億兆]+')

TRANSUNIT = {'十': 10,
             '拾': 10,
             '百': 100,
             '千': 1000}
TRANSMANS = {'万': 10000,
             '億': 100000000,
             '兆': 1000000000000}


def kansuji2arabic(kstring: str, sep=False):
    """漢数字をアラビア数字に変換"""

    def _transvalue(sj: str, re_obj=re_kunit, transdic=TRANSUNIT):
        unit = 1
        result = 0
        for piece in reversed(re_obj.findall(sj)):
            if piece in transdic:
                if unit > 1:
                    result += unit
                unit = transdic[piece]
            else:
                val = int(piece) if piece.isdecimal() else _transvalue(piece)
                result += val * unit
                unit = 1

        if unit > 1:
            result += unit

        return result

    transuji = kstring.translate(tt_ksuji)
    for suji in sorted(set(re_suji.findall(transuji)), key=lambda s: len(s),
                           reverse=True):
        if not suji.isdecimal():
            arabic = _transvalue(suji, re_manshin, TRANSMANS)
            arabic = '{:,}'.format(arabic) if sep else str(arabic)
            transuji = transuji.replace(suji, arabic)
        elif sep and len(suji) > 3:
            transuji = transuji.replace(suji, '{:,}'.format(int(suji)))

    return transuji
```

実際は漢数字かアラビア数字ならなんでも半角アラビア数字に正規化するものになりました。

```
   kansuji2arabic('平成二十七年度予算額１〇億３５００万千百六十4円', True)
   '平成27年度予算額1,035,001,164円'
```
Xcode7.0.1でiOS9.1の開発環境を作成する方法(Yosemite)

# 概要
Xcode7.1のDeviceSupport内のフォルダをコピーしてくるだけです。
初投稿なので訂正・アドバイスなどあればお気軽にお願いします。

# 背景
Mac OS X YosemiteにおいてXcode7.0.1でiOS9.1の端末で実機テストしようとすると端末がunavailableになった。
Xcode7.1ではiOS9.1をサポートしているが、El Capitan上でしか動かない。
Mac OSをEl Capitanにアップデートする勇気はないので、Yosemiteのままなんとかしてみることにした。

# Xcode7.1をダウンロード
ここからXcode7.1を落としてくる。DownloadにはApple Developer登録が必要。
https://developer.apple.com/downloads/

# Xcode7.1をインストール
Xcode_7.1.dmgをマウントし、Xcode.appを/Applicationsにコピー。
ファイル名はXcode7.1.appとでもしてください。
アイコン上に中止マークが出ているが、気にしない。
9GB以上あったので容量に注意。

# Xcode7.0.1のディレクトリにXcode7.1からコピー

```
sudo cp -r /Applications/Xcode7.1.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/9.1\ \(13B137\) /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/
```

# まとめ
古いバージョンのXcodeで新しいiOSの実機テストをしたい時には定番のやり方ですね。
Booting WEBrick


Booting WEBrick
=> Rails 4.0.5 application starting in development on http://0.0.0.0:8080
=> Run rails server -h for more startup options
=> Ctrl-C to shutdown server
Exiting
とエラーが出た場合の対処方法
config/environments/development.rbを変えてあげれば良さそう
アプリ名がSampleAppだったので以下のように修正
Rails.application.configure do
↓
SampleApp::Application.configure do
Programming Language Theory


Reading Notes for the book "Practical Foundations for Programming Languages, 2nd Edition".

# Releases

Each chapter is independent of one another. But it's recommended to read the first three chapters first.

- [Abstract Syntax](https://github.com/seckcoder/PLTheory/blob/master/src/ABT.hs)
- [Inductive Definitions](http://qiita.com/seckcoder/items/ded796a7d7f40c366f3c)
- Hypothetical and General Judgments
- Statics and Dynamics
- Type Safety
- Gödel's T
- Girard's System F
- Plotkin's PCF
- Church's Untyped $ \lambda $ calculus
- Constructive Logic and Classical Logic
- Subtyping
- Continuations
- Lazy Evaluation
- Equational Reasoning