OmniAICreator/Qiita-1.07M huggingface dataset:
GoogleAnalyticsをenumで


## わかりやすいコードで管理しておきたい

これが良いコードかわかりません。今日、個人プロジェクトにイベントのトラッキングを入れようと思ってふと思いついて書いてみました。

コードを書いて、その後説明をします。おかしなことを書いているかもしれません。その場合はご指摘いただけるとありがたいです。

## コード

前提として、分析系のコードは`Analyzer`というclassに入っています。Screenのtrackingなどはここでまとめてやっていて、今回はそれにeventのトラッキングを追加してみました。

Swift1.2です。Swift2系ならprotocol extensionとか使ってもっとすっきり書けそうです。

```swift
protocol Tracker {
    static var category: String { get }
    func track(label: String?)
}

extension Analyzer {
    
    enum Category: String {
        case Article = "Article"
        case Settings = "Settings"
    }
    
    enum Article: String, Tracker {
        static var category = Category.Article.rawValue
        case Stock = "Stock"
        case Unstock = "Unstock"
        case Share = "Share"
        case Show = "Show"
        case StockAction = "StockAction"
        case ShowStockers = "ShowStockers"
        case CommentAction = "CommentAction"
        case ShowComment = "ShowComment"
        case OtherAction = "OtherAction"
        
        func track(_ label: String? = nil) {
            Analyzer.trackEvent(self.dynamicType.category, action: rawValue, label: label)
        }
    }
    
    ...
    
    static func trackEvent(category: String, action: String, label: String? = nil) {
        let builder = GAIDictionaryBuilder.createEventWithCategory(category, action: action, label: label, value: nil)
        gai.defaultTracker.send(builder.build() as [NSObject: AnyObject])
    }
}
```

使う時はこうなります。

```swift
Analyzer.Article.Unstock.track(title)
Analyzer.Settings.Logout.track()
```

## 説明

特徴としては、

- Category毎のアクションが一箇所にまとまるので測定しているアクションをパッと見で把握できます。
- enumで書いているので使えるActionの制約がわかりやすいです。その場で文字列で書いていくと散らかってくるので...。
- Analyzer... Article... Unstock ... track と、補完が出てくるので簡単です。
- コードもそんなに長くなりません。
- valueは今の所使っていませんが、追加も簡単です。

とりあえず、ArticleよりもArticleTrackerの方が良いかもなどと思えてきました。
Google Spreadsheetsに内容を追記するshell script + Google apps scripts

大したタイトルなんだが、なんてことはない、[Google Apps ScriptだけでSpreadSheetへのPOST APIを持つWebアプリケーションを公開する](http://qiita.com/kazuph/items/8fb8b9b04bcb6070fca8)の通りのGoogle apps script(以下GAS)を用意し、ターゲットとなるspread sheetsに設定、あとはそのスクリプトめがけてPOSTメソッドでクエリー与えて叩くだけです。

ただ、すこしGASスクリプトは改変してある

````javascript
function doPost(e) { 
  var ss = SpreadsheetApp.openById("###_API_TOKEN_###");
  var sheet = ss.getSheetByName("シート名");
 
  //formデータを取り出して、配列に格納
  var array = [e.parameters.timestamp[0],e.parameters.hostname[0],e.parameters.plan[0],e.parameters.uri[0]];
  
  //一発で最終行に書込みする
  sheet.appendRow(array);
}
````

なんか`e.parameters`には来てるんだけど、、謎の配列だったので、`.queryname[0]`で取ってしまってる。クエリー名は任意に決めておきましょう。`array`にこうやって連結した配列分のセルが出来る。↑の例だと4カラム分。

`sheet.appendRow()`でアペンドしてる。内容が存在する行の次に追加してくれるので、内容を上書きしたりもしない。また背景色とかは無視されるので、列ごとの色分けも先にしておける。

````bash
nowdata='現在時刻'
hostname='ホスト名'
plan='プラン'

curl -F "timestamp=${nowdate}" -F "hostname=${hostname}" -F "plan=${plan}" -F "uri=https://${hostname}/${dirname}/" https://script.google.com/macros/s/###_API_TOKEN_####/exec > /dev/null
echo ">> Added for Google spreadsheet"
````

1. `###_API_TOKEN_###`は自分のに変えること
1. 参照したqiitaの記事では`curl -L`だったが、全部`curl -F`じゃないとだめだった(CentOS6, bash環境)
2. curlの出力を `> /dev/null`に投げないと都合が悪い
3. 最後の`echo`はあってもなくてもいい

ちなみに、概ね10秒ぐらいかかる。httpsへのPOSTなので概ね安全なはずだが、どうだろう？

こうやって、アカウント作成時とかに勝手に追加されていくと、管理が楽です。

![スクリーンショット 2015-11-05 2.19.png](https://qiita-image-store.s3.amazonaws.com/0/97659/eadd4dcc-6d80-79ff-78ac-4be7d6a10d3d.png)

ちなみに見出しをつけてるけど、無くても上のGASの`array[]`に突っ込んだ順列通りに出てきます。
Amazon LinuxでRootDeviceを拡張した時の覚書

対象　Amazon Linux AMI release 2015.03 日本語コンソールVersion

>サマリ
>Cleate Snapshot　＞　Cleate Volume　＞　Stop Instances　＞　Volume Detach　＞　VolumeAttach　＞　Start Instances

#拡張対象のボリュームでSnapshotを作成
１．　マネジメントコンソール　＞　ボリューム　
２．　拡張対象ボリューム選択　＞　アクション　＞　スナップショットの作成
３．　Nameタグ、説明を任意で入力　＞　作成
※３にてNameタグを入れておくと、後続作業で認識し易い

#新規ボリュームの作成
４．　マネジメントコンソール　＞　スナップショット　＞　先ほど作成したスナップショット選択　＞　アクション　＞　ボリュームの作成
５．　タイプ、拡張後サイズ、アベイラビリティーゾーンを選択　＞　作成
※５にてアベイラビリティーゾーンはアタッチするインスタンスと同じゾーンにする事

#拡張対象インスタンスのボリューム確認＆停止
６．　マネジメントコンソール　＞　インスタンス　＞　対象インスタンス選択　＞　ルートデバイス名をメモ　（/dev/xvda等）
７．　マネジメントコンソール　＞　インスタンス　＞　拡張対象インスタンス選択　＞　アクション　＞　インスタンスの状態　＞　停止
※念の為コンソールからではなく、ssh接続後、# sudo shutdown -h now とした

#既存ボリュームのデタッチ＆拡張ボリュームのアタッチ
８．　マネジメントコンソール　＞　ボリューム　＞　デタッチ対象ボリューム選択　＞　アクション　＞　ボリュームのデタッチ
９．　マネジメントコンソール　＞　ボリューム　＞　アタッチ対象ボリューム選択　＞　アクション　＞　ボリュームのアタッチ
※９では６のデバイス名を入力すること

#拡張対象インスタンスの起動
１０．　マネジメントコンソール　＞　インスタンス　＞　拡張対象インスタンス選択　＞　アクション　＞　インスタンスの状態　＞　起動

SSH接続後
`# df -h`

拡張対象RootDevice容量が増えている事を確認

参考
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-expand-volume.html
[Python]ファイルの指定行を読み込む

#指定行を読み込む
ファイルから指定行のみをプログラム中で取り出したい時のメモ

##linecache
ソースコード：https://hg.python.org/cpython/file/3.4/Lib/linecache.py
参考URL：http://docs.python.jp/3.4/library/linecache.html
>linecache モジュールは、キャッシュ (一つのファイルから何行も読んでおくのが一般的です) を使って、内部で最適化を図りつつ、Python ソースファイルの任意の行を取得するのを可能にします。 traceback モジュールは、整形されたトレースバックにソースコードを含めるためにこのモジュールを利用しています。

`linecache.getline(filename, lineno)`で指定行を読み込むことができます。`filename`にはファイルネームを、`lineno`には行数を指定します。`lineno`は、`1~`の整数です。
下記で使った`sample.txt`は、0行目から1000行目までN行目と1行ごとに記述してあるファイルです。（最初`lineno`が`0`から始まると思ったら`1`からだったので、０から始まってる。）

今回作ったコード：https://github.com/KodairaTomonori/Qiita/tree/master/default_module/linecache
##サンプル
```test_linecache.py
import linecache

a = input('取り出したい行数は？：')
target_line = linecache.getline('sample.txt', int(a))
print(target_line)
linecache.clearcache() 
```
##出力
```
$ head sample.txt 
0行目
1行目
2行目
3行目
4行目
5行目
6行目
7行目
8行目
9行目
$ python test_linecache.py 
取り出したい行数は？：100
99行目

```

##解説
`linecache.getline`でその指定した行の文字列を返してくれています。
最後の`linecache.clearcache()`は、最初に引用した文にも書いてある通り、キャッシュを使っているので、そのファイルを使わなくなったら、クリアをしておきましょう。

ファイルサイズが小さいものだと、普通に`readlines()`でリスト作ってやったほうが早いと思います。(速度的な話ではなく）
また、指定行を確認したいだけならば、
`head -100 sample.txt | tail -1`
で普通に見ることができます。
指定されたディレクトリ内部でgit pullするのをディレクトリ分、繰り返すshell script

最近[L2ME](https://l2me.jp/)というサービスを作ったのだが、このサービスではユーザーごとにディレクトリを作成している。
そのディレクトリ内ではgit cloneされた本体がいて、つまり1user:1dirという関係。

そこでデプロイとして、gitのmasterブランチがPullRequestなんかでマージされたりなんぞして更新時に、なんかCIが走ると仮定して、各々のdirで`git pull`されてほしい。それもディレクトリ分繰り返して欲しい。

で、以下のようにした。ちなみに、対象ディレクトリ以外は無視するように[`git config core.sparsecheckout true`](http://qiita.com/icoxfog417/items/8b16681213d0fd33602c)の設定を前もってしてある。（ユーザー作成時にするようにしている）

なお、個人的な趣味嗜好で`bash`である。めんどいので、ほぼまんまなコードを貼る。

````bash
#!/bin/bash

set -eu

nowdate=`date "+%Y/%m/%d %T"`
host=`hostname -f`

echo -e '!!start git pull carnival!!' | ./slack.sh

find /var/www/html -mindepth 1 -maxdepth 1 -type d | while read FILE
do
        echo '----------'
        echo 'find: '${FILE}
        cd ${FILE}

        pwdmsg=$(pwd)
        gitmsg=$(git pull)

        slackpost=${pwdmsg}'\n'${gitmsg}
        echo -e ${slackpost} | ./slack.sh
done

echo -e '!!done git pull carnival!!' | ./slack.sh
````

1. `nowdata`, `host` は通知用に取得している
1. `slack.sh`というのは、[slackへ発言するshell script](http://qiita.com/tt2004d/items/50d79d1569c0ace118d6)である
1. `find`分で`/var/www/html `の中にあるディレクトリを探索している
  - `-mindepth 1`で探索最下位を1にしている、自分を含まないようにしている（無いと自分`./html`を含む）
  - `-maxdepth 1`で探索最上位を1にしている、`./*`にあるものだけを対象とするため
  - `-type d`でファイルタイプがディレクトリのみとしている
1. `FILE` がいわゆる`this`
2. `pwd`しないと今どこやってんのか不明である
3. `git pull`はお好みで、cloneなりfetchなりなんなりに変えればいい
2. 変数にコマンドを格納し、標準出力をslackに流すようにしている
3. 最後になんか言わないと終わったかわからん

ただこれでもエラーハンドリングは出来ていない（というか`set -eu`によってエラーが出てる時点で処理が止まる）ので本格的に自動化するならもうちょっとエラー内容とかもslackに来るようにしないといけないかな。

自分は手動でかけているので、いまんところは困っていない。しかし、shellはなんでも出来ていいもんですね。
バックグラウンドで動作するNode.jsプロセスを停止させる


## 現在動作しているNodeプロセスのプロセスIDを調べる

```shell-session
$ ps -e | grep node | awk '{print $1}'
```
プロセスIDが表示されます

```shell-session
(例) 30098
```

## プロセスを停止させる
```shell-session
$ kill -9 [プロセスID]
```
MongoDB 3.2 新機能アナウンスの説明


> (2016/1/11追記)
このブログはMongoDB 3.2がリリースされる前に公表された情報であり、3.2の正式なリリース情報ではありません。MongoDB3.2の正式なリリース情報は[MongoDB3.2リリースノートの説明](http://qiita.com/fetaro/items/cd570d70623b58b5deef)を見てください。

# はじめに

MongoDB 3.2のアナウンスが出ましたので、ざっくり説明します。

基本的には[アナウンス](https://www.mongodb.com/blog/post/announcing-mongodb-3-2)を元に、足りない部分は[リリースノート(RC版)](https://docs.mongodb.org/master/release-notes/3.2/)で補足しています。

# アナウンスの要約

## ドキュメントバリデーション

ドキュメントの中身にバリデーション(キー名や値のチェック)がかけられます。

例えば、`{ age : { $gte : 0, $lte : 150 } }`とすると、ageが0～15の間の数値であるかチェックできるといった感じです。

## 部分的インデックス

ドキュメントの中のある値によって、インデックスに含めるかどうかを分けれるようになります。

例えば、ユーザドキュメントの中にアクティブ化非アクティブ化のフラグがあり、アクティブなユーザしか検索しない要件であれば、非アクティブのフラグのデータはインデックスに含めないことができ、これによりメモリを効率的に利用できます。

## ストレージエンジンの追加

今まではMMAPとWiredTigerだけでしたが、新たにインメモリのストレージエンジンと、暗号化できるストレージが追加されます。

ただし、暗号化ストレージは有償のEnterprise版のみのようです。

## BIツールとのコネクタ

BIツールとのコネクタがつくようです。予想するにおそらくTableauでしょう。


## configサーバがレプリカセットに

今まではconfigサーバはmongod 3台で2PCで更新でしたが、今後は非推奨になり、代わりにレプリカセットでconfigを構築するようです。

## JavascriptのエンジンがまたSpidermonkeyに

今はJavascriptのエンジンはV8ですが、Spidermonkeyになるようです。

たしか2.4でSpidermonkeyからV8にしているので、戻ったことになります。

## mongodumpとmongorestoreが圧縮&ストリーム転送対応

mongodumpとmongorestoreが圧縮に対応します。さらに、リモートのmongodに対してdumpしたデータをストリームで転送しrestoreすることができるようになります。

## アグリゲーションフレームワークの改良

アグリゲーションフレームワークに沢山のオペレータが追加されました。その中から一つだけ紹介すると、`$lookup`というパイプラインのステージが導入されたことです。これはSQLのLEFT OUTER JOINのようなもので、他のコレクションから紐づくデータを結合することができます。

## 全文検索の改善

全文検索が英語以外に対応しました！が、残念ながら日本語は対応していません。
追加された言語はアラビア語、ペルシャ語、ウルドゥー語、中国語です。

ほかにもいくつか改善があるようです。

## 新しいCRUDのAPI

今までのCRUDは、一回のクエリで更新されるドキュメントの数が一つだったり複数だったりでわかりにくかったので、新しいAPIが追加されました。

例えば、`update()`であれば、一つを更新する`updateOne()`や複数を更新する`updateMany()`を代用できます。

他にも`findAndModify()`もわかりにくかったんで、更新と置換と削除の３つの代用APIができてます。

## Ops Manager(旧MMS)の改善

ファイルシステムのバックアップ、クエリのプロファイラ、インデックスの示唆、そしてレプリカ全体のインデックスをローリングアップデートできるようになったそうです。

## さいごに

リリースは2015年内を予定しているそうです
修正差分ファイルのみで本番適用した状態をローカルで確認する方法

現行サイトのオリジナルデータを支給してもらえず、テスト環境も存在しない案件で、
修正ファイルを差分で納品する必要に迫られるケースがあります。
こういう場合はだいたい、以下の様な状態だったりします。

* CSSやJavaScriptを修正するので事前のクロスブラウザによる動作チェックが必要。
* 検証のために関連データをブラウザ越しにダウンロードするのメンドい。
* 手持ちのデータは修正差分にして、関連データを作業場所に格納したくない。

これを解決する方法として幾つか考えられる方法があります。

## 1. ブラウザについてる開発者ツールを使う

特定環境下で検証するだけであればコレで十分ですが、結局ファイルを修正する必要があるので二度手間になるうえ、自分以外の人も確認する必要があったり、クロスブラウザで検証する必要が有る場合は不十分です。

## 2. base 要素を使い、CSS やJavaScript を head 要素内でオーバーライドする

head 要素内に `<base href="http://www.example.com/" />` を挿入した上で、style 要素やscript要素を追記する方法です。
お手軽に確認できますが、CSS は後続の定義が優先されるので、実際に適用すると何故か中間にオーバーライドしている定義がいた場合、想定通り CSS が当たらないことがあります。
JavaScript も既存のコードに編集を加えたいケースの方が多かったりします。
また、納品HTML から base 要素を削除し忘れると、いろいろマズイことになるので、できれば検証用の記述を別途せずに納品と同じ状態のもので検証ができる状態にしたいところ。

## 3. Charles を使う

[Charles Web Debugging Proxy](http://www.charlesproxy.com/)

たぶんこれが一番簡単。Map Local 機能を使えばドメインも本番と変わらないため、事前検証も確実に行えます。
Charles は他にもウェブ開発に必要な機能が揃ってるので、開発用PCに入れておくと便利です。

## 4. Apache + mod_rewrite + PHP でリダイレクト処理させる

Charles は機能制限は無いものの、有料アプリ（$50）なので導入に二の足を踏んだり、諸事情によりインストールが出来ない環境では、それ以外の方法で…ということであれば以下のコードを使います（これが本題）。
XAMPP 環境や一般的なレンタルサーバでもお手軽にセットアップできます。

```php:_redirect.php
<?php

$domain = 'http://www.example.com'; // 対象のドメイン

$uri    = $domain . $_SERVER['REQUEST_URI'];
$headers = get_headers($uri, 1);
if (preg_match('/^HTTP\/.*\s+(200|302)+\s/i', $headers[0])) {
  $handle = fopen($uri, 'r');
  $data   = '';
  if ($handle) {
    header('Content-Type: '. $headers['Content-Type']);
    while (!feof($handle)) {
      $data .= fread($handle, 8192);
    }
    echo $data;
    fclose($handle);
  }else{
    header('Status: 404 Not Found');
  }
}
```
```apache:.htaccess
RewriteEngine on
RewriteBase /
RewriteRule ^_redirect\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /_redirect.php [L]
```

_redirect.php の $domain を任意のドメインに変更し、Document Root 直下に .htaccess とセットで格納します。
ローカルにファイルがあればそれを参照し、無ければ _redirect.php を経由して指定ドメインのリソースを読みに行く挙動となるため、ローカルには修正対象となるファイルのみとなります。
Real-Time Combined 2D+3D Active Appearance Models

#Real-Time Combined 2D+3D Active Appearance Models
2Dと3Dを組み合わせたリアルタイムなAAM

##概要
- AAMは顔画像のモデル化に用いられる生成モデルである
- 他に関係している顔のモデルは3DMMがある
- AAMは2Dであるが，様々な方向に動く顔のような3Dの現象のモデル化にもまだ使われる
- 一つ目の研究はAAMの表現能力であり，3DMMがなんでもモデル化することができることを示した．しかし，どうしてもたくさんの形状パラメータが必要になる．
- パラメータがいくらいるのか測定した．そして，2DAAMは3DMMと同等ではないモデを生成することを示した．
- そして，モーションからの非剛体構造アルゴリズムが2DAAMの対応する3D形状を構築するためにどのように使われるかを示した．
- その後，3DモデルがAAMを拘束するためにどのように使われるかを示し，そしてそれは3Dモデルを生成することができるモデルのみを生成する
- 最終的に制限の強制と"Combine 2D+3D AAM"と呼ばれるものを生成しながらリアルタイムにAAMにFittingするアルゴリズムを提案する．
CodeIgniter初めの一歩

さっぱりの初心者がCodeIgniter3を使うことになったので、つまずいて解決したらメモ残してきます。

##あれ、静的ページすら表示できないぞ…
　チュートリアルが無事終わって、「さあやるぞ！まずは静的ページからだっ！」ということでスタートしました。さっそくcontrollerとviewを作成して、チュートリアルでやった通りのコードを書きました。

　しかし、なぜか指定したファイルが読み込まれない。ブラウザにはCI404が表示されているので、controllerもviewもルートも通ってはいるのだが……


##先輩、助けてください！涙
　自分のなかで設けてる初心者は15分ググっても分からないなら人に聞けルールを過ぎたので、先輩に助け舟を求めました。すると……

　原因はconfig/routs.phpのコードに！
　`$route['(:any)'] = 'pages/view/$1';`
　だと、どのファイルを読み込んだとしてもpages/view/$1に飛ぶ設定になっています。
　そのため、これを消すことで解決☆
　
　ちなみに、開発環境がMAMPなので階層の問題かとも疑いましたが、違いました。
FabricEngineでフラクタルブラウン運動を試してみる

フラクタルブラウン運動の記事（[ランダム地形生成 Part2～フラクタルブラウン運動](http://qiita.com/y_li/items/290754b9c3ba18e9fb2b)）で紹介されているノイズを[FabricEngine](http://fabricengine.com/)で試してみました。

こんなかんじです。
![fabric.gif](https://github.com/Ushio/FractalBrownian/blob/master/fabric.gif?raw=true)

パッチでもできそうかと思ったのですが、
今ひとつfor文にあたるパッチが見当たらず、結局kl言語で実装しています。
以下がそのパッチです

```

dfgEntry {
  outpositions.resize(inpositions.size());
  
  SInt32 N = 10;
  Float32 kPersistence = persistance;
  
  for(SInt32 i = 0 ; i < inpositions.size() ; ++i) {
    Vec3 p = inpositions[i];
    
    Float32 noise = 0.0f;
    Float32 sum_amp = 0.0f;
    for(SInt32 j = 0 ; j < N ; ++j) {
      Float32 freq = 0.5 * pow(2.0, Float32(j));
      Float32 amp = pow(kPersistence, Float32(j));
      Float32 value = perlinNoise(p.x * freq, 0.0, (p.z + offsetz) * freq) * amp;
      noise += value;
      sum_amp += amp;
    }
    noise /= sum_amp;
    p.y = noise;
    
    outpositions[i] = p;
  }
}

```

perlinNoiseが標準で存在するので実装はとてもシンプルです。
（ただこれ、１次元２次元４次元の実装が見当たらない・・・？）

インプットとアウトプットの設定は以下になります。

![Fabric_Engine_-__Users_Ushio_Documents_Fabric_FractalBrownian_FractalBrownian_canvas 2.png](https://qiita-image-store.s3.amazonaws.com/0/8588/15b76875-0107-1d18-a9e8-5c5652879a59.png)

パッチの構造は以下のようになっています

![Fabric_Engine_-__Users_Ushio_Documents_Fabric_FractalBrownian_FractalBrownian_canvas.png](https://qiita-image-store.s3.amazonaws.com/0/8588/51b3581e-ce45-6b6a-bcb9-e1e77996be58.png)

処理の流れを追ってみると、

1.GetPlaneで元のメッシュを作る
2.GetAllPointPositions頂点を全部取り出す
3.フラクタルブラウン運動でy座標を変更
4.SetAllPointPositionsでメッシュに再設定
5.法線がくずれるので、RecomputeNormalsで修正
6.DrawPolygonMeshで描画

ちなみに動いているのは時間を使っているからです。
どうやらFloat32でtimelineをexposeすると自動で入れてくれるようです。

という感じですね、このあたりはパッチで組めるのは楽でいいですね。
まだ全体的にパッチが少ない感じがして、ちょっと不自由な印象です。

C++から処理を呼び出したりもできるらしいので、そのうちちょっと試してみたいなと思ってます。

一応canvasファイルをgithubにあげておきました。
[https://github.com/Ushio/FractalBrownian](https://github.com/Ushio/FractalBrownian)
[Eclipse] AutoCloseable のリソース・リークの警告


# 目的

- Eclipse では AutoCloseable の変数を作って、クローズしないと「リソース・リーク」の警告が出ます
- でも、AutoCloseable を実装しているはずの `java.util.stream.Stream` はクローズしなくても警告は出ない
- どんなときに出るのか、少しだけ確認してみました

# 実験

```java:Test.java
public class Test {

	public static void resourceLeaks() throws Exception {

		Stream<String> a = Stream.of("test.txt"); // #1. OK
		a.count();

		Stream<String> b = new MyStream<>(); // #2. ▲警告あり
		b.count();

		Stream<String> c = getMyStream(); // #3. OK
		c.count();

		Reader d = new StringReader("test.txt"); // #4. OK
		d.read();

		Reader e = new FileReader("test.txt"); // #5. ▲警告あり
		e.read();

		Reader f = getReader(); // #6. OK
		f.read();

		Reader in1 = new FileReader("test.txt"); // #7. OK
		Reader bis1 = new BufferedReader(in1); // #8. ▲警告あり
		bis1.read();

		Reader in2 = new StringReader("test.txt"); // #9. OK
		Reader bis2 = new BufferedReader(in2); // #10. OK
		bis2.read();

	}

	private static <E> MyStream<E> getMyStream() {
		return new MyStream<>(); // #11. OK
	}

	private static Reader getReader() throws IOException {
		return new FileReader("test.txt"); // #12. OK
	}

	private static class MyStream<E> implements Stream<E> {
        // 省略
    }
}
```

# とりあえずのまとめ

Eclipse のリソース・リークのチェックは以下のようになっていると思われます。

- クローズしなくてもよいクラス・インタフェース・メソッド等を知っているみたい(#1, #4)
    - java.util.stream.Stream
    - java.io.StringReader
    - 他にもあるはず
- それ以外の AutoCloseable はクローズしないとダメ(#2, #5)
    - java.io.FileReader
    - 独自に継承・実装したクラスも同様
    - おそらく「クローズ不要な物」のホワイトリスト方式なんでしょうね
- メソッドの戻り値などで受け取ったものは良くわからんから黙っておく(#3, #6)
    - 今のところ、メソッドの中まで追いかけて解析はしていないみたい
- ラップするクラスも知っていると思われる
    - java.io.BufferedReader など
    - ラップされたものがクローズ要なら、ラップした側が警告(#7, #8)
    - ラップされたものがクローズ不要なら、ラップした側も警告なし(#9, #10)
- 当然、リソースをリターンする場合には警告は出ない(#11, #12)

Eclipse の設定をざっとみた感じだと、クローズ不要のリストを追加することはできなさそう。
（Preferences の Java / Compiler / "Errors/Warning" / "Potential programming problems" / "Resource leak:" で報告レベルを変えることはできますね）

また、「このクラスはクローズ不要」だというアノテーションをつけることもできなさそう（何かあるのかな？）。
もちろん、使う変数やメソッドのところで `@SuppressWarnings("resource")` をつければ警告は抑止できますが。

もし AutoCloseable を実装したクローズ不要のクラスを提供する場合には（コンストラクタではなく）インスタンスを生成するメソッドを用意した方がよさそうですね(上記#3,#6)。たぶん。
[試行錯誤編]　Ansible on cygwinを活用した、実用開発環境構築　②少し苦労してgit+java+sbt

#(序) cygwin知識のなさではまる。
以下、試行錯誤の末、git+java+sbtをcygwin 32bit版に導入した記録。
前提は、[こちら](http://qiita.com/kmry2045/items/25a3f42f55e9bbe1539f)で構築した"Ansible on cygwin with zsh"。

*...構築時に入れた、apt-cygがチェックサム周りの不整合によりgitやcurlのパッケージを入れられなくなっていた。zshだけはすんなり入っていたので、原因究明が遅れる。原因さえわかっていれば、実作業時間はわずかなので、以下、cygwin+java+sbtなどモダンな周辺環境を何らかの理由で必要とする人向けのメモとして残しておく。*

#1) javaをlinux流に入れる。

"cygwin java"でググり、このあたり、いかにも、と思ったので、
>Windows用のJavaをCygwinで使おうとすると、パスの書き方をWindowsのパスの書き方にしないといけなかったりで、なかなか煩わしい（Windowsのディレクトリ構造を表す円マークはCygwinではエスケープ文字という扱いがされていたりして）

[出典](http://promamo.com/?p=4118)の指示に従い、java_wrapper経由で、windows上のJavaをcygwinで扱えるようにする。

Tips:

- windows上のJavaを予めインストール(私の環境ではintelliJを使った時に既にインストール済)
- JAVA_HOMEの設定が必要となるため、"windowsキー+Pauseボタン"でシステムを起動し、作業

#2) gitを使うために...
java自体は動作している。ということで、マイクロサービスをscalaとkotlinとかで動かしたい人間として、とりあえず、scalaベースをfinatraを持ってきて動作確認・・・というところで、問題発生。gitがdll不足で動かない。ついでに、curlもdll不足で動かない。

64bit版windows環境とcygwin or apt-cygの不整合かと思い、
```uname -m```
してみるとと、案の定i686の文字を発見(cygwinは32bit版)。
64bit版windowsの上に、cygwin32bit版を入れたことが問題かと思い、その手の問題に関する先人の苦労([ここ](http://d.hatena.ne.jp/stealthinu/20130829/p1)とか)を読み、対策を考える。

...が、そうではなくて、"[Cygwinはversion 2.867からmd5sumを使うのをやめてsha512sumに切り替えたのに、パッケージ管理システムのapt-cygがその切り替えに対応できていなくて](http://nulltaba.com/computer/windows-management/apt-cyg-error-md5sum/)"、という問題だったことを知り、apt-cygコマンドの”md5sum”を”sha512sum”で置換。

Tips:

- "cygstart ."でカレントディレクトリをwindowsフォルダとして開くことができる。MacのOpen相当なので、普段Mac使いな人は、.zshrcに、alias open='cygstart'とか、alias o='cygstart'とかしておくのが良いかも。
- apt-cygコマンドのチェックサムが正常化した後は、誤動作していたものをいったんremoveし再びinstall(今回は、apt-cyg install git curl) *※ curlはsbtの動作に必要*



#3) sbtでwebサーバを動かす。
今回は、[finatra](https://twitter.github.io/finatra/)をsbtで動かす。
sbtをどうしようか迷ったが、力技で、[scala-sbtサイトの配布箇所](http://www.scala-sbt.org/download.html)からAll platforms版を直接ダウンロードし、解凍版をcygwinの/usr/local/binディレクトリ(windows上では、C:\cygwin\usr\local\bin)に放り込む。
64bit版のjavaを32bitのcygwin上のjarが呼ぶとかなにか気持ち悪いが、動くはずなので、とりあえず、 解凍先の /usr/local/bin/sbt/binで、java -jar sbt-launch.jarを実行し、sbt環境を導入する。

あとは、finatraのホームフォルダで 例えば、
> /usr/local/bin/sbt/bin/sbt helloWorld/run

を実行すれば、helloworld環境が構築され、localhostでアクセスできるサーバが立ち上がる。一安心。

#4) 感想
cygwinで快適java環境構築(javaに慣れていれば)、なんとかなりは、する。
誰得、という感じがひしひしとしてきたが、、

バージョンアップが続くnode環境については、もはや嫌な予感しかしないので、素直に、ansible経由でdockerなどを使うこととしたい。

Finatraとnodeの連携など、そのうち書くかも。
mp4box と ffmpeg で m4a を mp3 に変換する

音声の m4a ファイルを mp3 へ変換するのにネット検索で見つかる方法を使っていたら、Windows Media Player で警告が出て、その対処をした際のメモ書きです。
ちなみに自分は MacOSX Yosemite で作業してます。ffmpeg と mp4box は brew でインストールしました。

# よくみる方法と問題

```shell
$ ffmpeg foo.m4a -acodec libmp3lame -f mp3 foo.mp3
```
このコマンドで生成した mp3 ファイルを Windows の Media Player で再生したところ 「拡張子がmp3とは違うが、ファイルによっては再生出来るものもある」的な警告がでました。音声の再生自体は出来ます。(Windows10 では特に問題なかったので、Windows7,8 辺りまでの問題かも)
なお、MacOS の QuickTime では特に不都合がないです。

# 原因推測

(前提知識) 動画ファイルは Atom、(いまどきだと MP4コンテナ)[^1]と呼ばれるバイナリ形式で保存する事が多いです。これは様々なデータを含む事ができる汎用的な形式でコンテナと表現されます。

[^1]: 仕様としてはISOBMFF形式(ISO/IEC 14496-12)を参照の事。

- 参考) https://developer.apple.com/library/mac/documentation/QuickTime/QTFF/QTFFChap2/qtff2.html

m4a はこの Atom コンテナで AAC 音声ストリームを格納します。

上記のコマンドだと m4a のAtomコンテナをそのまま引き継いで、Atomコンテナに包まれた mp3 ファイルが生成されます。

![ffmpeg.png](https://qiita-image-store.s3.amazonaws.com/0/1798/b866085c-e9ab-48b0-c620-30ca8b360901.png)

-  ffmpeg -i foo.mp3 でコンテナを確認
 
```shell
$ ffmpeg -i foo.mp3
＜略＞
Input #0, mp3, from 'foo.mp3':
  Metadata:
    major_brand     : M4A
    minor_version   : 0
    compatible_brands: M4A mp42isom
```


Windows Media Player は .mp3 の拡張子でファイルを受け取った際、RIFF コンテナに包まれた mp3 か、生の mp3 ストリームを期待していて、Atom コンテナだと都合が悪いようです。

# 多分正しい方法

track 1 に音声が入っていると仮定して (mp4box -info foo.m4a で調べられます)

```shell
$ mp4box -raw 1 foo.m4a # 生の AAC ストリームを抜き出す
$ ffmpeg -i foo_track1.aac foo.mp3
```
まず mp4box で音声の AAC ストリームだけ抜き出して、それを MP3 ストリームに変換します。

![mp4box+ffmpeg.png](https://qiita-image-store.s3.amazonaws.com/0/1798/d0f363de-14e5-36a8-21e3-3fbb791394a0.png)

- ffmpeg -i foo.mp3 でコンテナ(に入ってないの)を確認

```shell
$ ffmpeg -i foo.mp3
＜略＞
Input #0, mp3, from 'foo.mp3':
  Metadata:
    encoder         : Lavf56.25.101
  Duration: 00:02:47.63, start: 0.025057, bitrate: 64 kb/s
    Stream #0:0: Audio: mp3, 44100 Hz, mono, s16p, 64 kb/s
```

# 蛇足的なメモ

- シェルでまとめて処理するなら (bash版)

```shell
for i in *.m4a ;
  do b=`basename $i .m4a` ;
  mp4box -raw 1 $i ; ffmpeg -i "$b"_track1.aac $b.mp3 ;
  done
```

# 最後に

<del>ffmpeg だけでもオプションで頑張れば出来そうだけど、誰か方法知りませんか？</del>

コメントを頂きました。オプションで対応できるようです(元々の問題を再現できなかったので未確認のまま)。こちらが参考になりそうです。

- https://qiita.com/yoya/items/2cefa9755c825ef84471#comment-1fb09c84f9676ddc590e

- https://ffmpeg.org/ffmpeg-formats.html#mp3

```shell
$ ffmpeg -i input.wav -write_xing 0 -id3v2_version 0 out.mp3
```
よくわからないが undefined method `preload' といわれる

はっきりしたことは言えないが、

`モデル.preload`
のようにクラスからのメソッド呼び出しならok.

`モデル::ActiveRecord_Associations_CollectionProxy`
や
`モデル.all.preload`このallのクラスは`モデル::ActiveRecord_Relation`
からの呼び出しならok.

`モデル.all[0].preload`は
> undefined method `preload' for #<モデル:...>

と言われる....

今のところ言えることは、モデル単体のインスタンス変数がpreload呼ぼうとするとundefined methodと言われる...
めんどくさい操作はもういらない！簡単コマンドでiOS Push 通知用証明書を作成する


iOS の Push 通知用の証明書の作成ってめんどくさいですよね。年に一回とか新しいアプリを作る時にしかやらないので作る時には前回のことをほとんど覚えていなかったり。

でも今は[fastlane](https://github.com/fastlane/fastlane)があります。

fastlane はiOSアプリの開発に関するめんどくさい手続きを自動化してくれるツールセットです。

最近 Twitter社 の開発者用ツール Fabric の仲間入りをしたそうです。
参考：https://fabric.io/blog/welcoming-fastlane-to-fabric

# 準備

## fastlane のインストール
というわけでまず fastlane を導入します。

参考：https://github.com/fastlane/fastlane/blob/master/docs/Guide.md

手順は簡単で、
1. gem で fastlane をインストール
2. Xcodeのコマンドラインツールをインストール
3. 古い gem を削除
を実行します。

```
sudo gem install fastlane --verbose
xcode-select --install
gem cleanup
```

## Fastfile のセットアップ

これができたらiOSアプリのプロジェクトのルートディレクトリに移動して、

```
fastlane init
```

を実行します。

すると、いろいろ聞かれるので

1. App Identifier の入力
2. Apple ID の入力
3. deliverやsighなどfastlaneのツール群のセットアップ(ここは今回重要ではないのでスキップしてOK)

をします。これが終われば準備完了です。

# Push 通知用証明書を作成する

ここが本題です。Fastfile のセットアップが終わったら下記コマンドを実行すれば10秒くらいで証明書が作成されます。
＃-p の部分はパスフレーズになるので適宜変更してください。

## Development 用証明書の作成コマンド

```
pem --force --development -p "hogehoge"
```

## Production 用証明書の作成コマンド

```
pem --force -p "hogehoge"
```

fastlane すごく便利でいいですね。
データ構造の操作とロジックのコードは区別しよう。

　C++言語でSTL(Standard Template Library)を使ってソースコードを書くようになって感じたことは、データ構造の操作は標準のライブラリに用意されているので、ロジックの部分がわかりやすくなったということだ。
####**独自データ構造のライブラリ**
　STL以前の独自のデータ構造を使っているコードを読むと、データ構造の操作とロジックとの区別がつきにくいことが、コードの理解を妨げていることに気づいた。たとえば、領域を確保済みの構造体の配列を使っているコードがあっても、初期値の代入のコードや、i番目の配列要素に有効な値を代入するコード、有効な値がどこまで入っているのか、どこから無効な値になっているのかを知るマジックナンバー、それらが構造体をべたに操作しているとデータ構造の操作と、実装しているロジックとの区別がつかないということです。
####**結局必要になる共通操作**
　ですから構造体配列などの独自のデータ構造を使う場合でも、データの追加、データの代入、データのコピー、データの表示、データの削除などを行う関数を結局は作らなくてはならない。ましてやmemcpyで構造体データのコピーをすることはしてはいけない（注１）。Cの範囲の中でコーディングする場合でも、それらのデータ構造に対する操作(事実上のメソッド)を実装（カプセル化）してテストしておくことが必須になる。そのようなメソッドをテストしておくことで、安心して構造体配列が使えるようになる(注２)。
####**データ構造の操作とロジックを分離しよう**
　そのような事実上のメソッドが準備されているときには、データ構造の操作とロジックのコードは明確に区別できるようになり、プログラムのロジックがわかりやすくなる。
　ですから、データ構造の操作とロジックのコードは区別するようにソースコードを書いていきましょう。

####**レガシーコードの改善**
レガシーコードを改善していく際には、リファクタリングから始めていくこと。いきなりSTLで書き換えようとしないこと。レガシーコードに単体テストを追加していくこと。単体テストによってそのコードの正しさを確保しよう。レガシーコードが何をしているのか、十分に自明なコードになりきる前にSTLを使って書き換えようとはしないこと。




追記：
　Python屋の私としては、Pythonの標準的なデータ構造、リスト(C++
のstd::vectorに相当)、辞書(C++のstd::unsorted_map)に相当を使うことで、標準的なデータ構造を使うように仕向けられていたと言える。またPythonの豊富な標準ライブラリ群は、C++のBoostライブラリを使ってOS依存性のない標準的な豊富な信頼できるライブラリを使うのと同様な効果をもたらしていたといえるだろう。
「すべてをゼロから書き直したい衝動に駆られることもありますが、その誘惑に打ち克たなければなりません。」出典　[[06] リファクタリングの際に注意すべきこと](http://xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com/%E3%82%A8%E3%83%83%E3%82%BB%E3%82%A4/%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E9%9A%9B%E3%81%AB%E6%B3%A8%E6%84%8F%E3%81%99%E3%81%B9%E3%81%8D%E3%81%93%E3%81%A8)

追記：
　プログラム開発していると、データ構造の操作とロジックのコードでは、データ構造の操作の方がコードが確定していきやすい。データ構造の操作が確定していくとそのコードは十分に枯れたコードになりやすい。一方アルゴリズムは、既に完成したアルゴリズムを移植しているのではない限り、試行錯誤の関係で幾度となく変更ということになりやすい。だからデータ構造の操作の分を別ファイルにしておくとよい。

注１：memcpyでは意図しない浅いコピーを行ってしまいやすく、ある構造体の文字列(の開始位置のポインタ)とコピー先の構造体の文字列（の開始位置のポインタ）とが同じになってしまい、一方を変更すると他方にも変更が及ぶ。
　特に、memcmpを構造体の比較にはおこなってはならない。
　[EXP04-C. 構造体を含むバイト単位の比較を行わない。](https://www.jpcert.or.jp/sc-rules/c-exp04-c.html)

注２：STLを使えばいいのではないかというのが、個人的見解です。既存のプログラムで、構造体配列をSTLに置き換えるには、なかなか手をつけにくい場合もあります。そのような場合には、事実上のメソッド関数を追加していって、構造体配列に対するむき出しのデータ構造への操作を減らしていくことだと考えています。
[Apache httpd]複数ドメイン名のCORS対応ホワイトリスト設定


# 前提1 経緯
* Web上でCORS設定についての記事をあさると、All or Nothing な感じだったのが不満だった
  * 自社の要件としても不足していた

# 前提2 httpd バージョン
* 2.4.4 以降
  * 本件で採用している ```req_novary``` が当該バージョンから採用されたため
  * 2.2.x のコードを見た限りでは採用を確認できていないので

# 参考URL
* [Expressions in Apache HTTP Server - Apache HTTP Server Version 2.4](https://httpd.apache.org/docs/2.4/expr.html "Expressions in Apache HTTP Server - Apache HTTP Server Version 2.4")
* [Access-Control-Allow-Originヘッダで複数のオリジンドメインを許可する方法 - ぷれすとぶろぐ](http://blog.applest.net/article/20131219-access-control-allow-origin-multiple/ "Access-Control-Allow-Originヘッダで複数のオリジンドメインを許可する方法 - ぷれすとぶろぐ")

# CORS対応ホワイトリスト用conf

以下のような形式で羅列していけばよい

* Zone Apex な場合のFQDNに対して正規表現して対応する気力がなかったので割りきって別出しとした
  * 「hogeexample.comみたいなのが許可されてしまったら」と考えると精神衛生上よくない
  * 時間がなかった
* プロトコル部を区別する場合には、```https?``` を変更すればよいと思う
* ```req_novary``` 行でマッチしたものに対して直接後方参照を利用する方法を見つけられなかった
  * のでわざわざ ```SetEnvIf ~~~``` からの ```%{ORIGIN_URI}e``` の挿入を行っている
* ``` =~ m#regexp#``` は便利
  * ``` =~ /regexp/``` だと ```/``` がデリミタとなりどれだけエスケープしてもURLが入らずエラーとなった
  * 当初は ```-strmatch``` を利用していたが正規表現が使えてるのかよくわからず追うのをやめた
* /etc/httpd/conf/cors.d 配下としたのは ```Include /etc/httpd/conf.d/*.conf``` に含めたくなかったから
  * 明示的にしたかっただけで本件において必須ではない

```:/etc/httpd/conf/cors.d/cors-pattern.conf
<If "req_novary('Origin') =~ m#^https?://example.com$#">
  SetEnvIf Origin "^(.*)$" ORIGIN_URI=$1
  Header set Access-Control-Allow-Origin "%{ORIGIN_URI}e" env=ORIGIN_URI
  Header set Access-Control-Allow-Credentials "true" 
</If>

<If "req_novary('Origin') =~ m#^https?://(.+).example.com$#">
  SetEnvIf Origin "^(.*)$" ORIGIN_URI=$1
  Header set Access-Control-Allow-Origin "%{ORIGIN_URI}e" env=ORIGIN_URI
  Header set Access-Control-Allow-Credentials "true" 
</If>

<If "req_novary('Origin') =~ m#^https?://(.+).example.net:8080$#">
  SetEnvIf Origin "^(.*)$" ORIGIN_URI=$1
  Header set Access-Control-Allow-Origin "%{ORIGIN_URI}e" env=ORIGIN_URI
  Header set Access-Control-Allow-Credentials "true" 
</If>
```

# 上記ホワイトリスト用confをIncludeすればよい

```:(例)/etc/httpd/conf/extra/httpd-ssl.conf
Include /etc/httpd/conf/cors.d/cors-pattern.conf
```

# 付録

```:ホワイトリスト出力用の雑なスクリプト
for FQDN_PORT in "example.com" "(.+).example.com" "(.+).example.net:8080" 
do
  echo " 
  <If \"req_novary('Origin') =~  m#https?://${FQDN_PORT}#\">
    SetEnvIf Origin "^\(.*\)\$" ORIGIN_URI=\$1
    Header set Access-Control-Allow-Origin \"%{ORIGIN_URI}e\" env=ORIGIN_URI
    Header set Access-Control-Allow-Credentials \"true\" 
  </If>
" 
done
```

---
* ご指摘あればご遠慮なくお願いいたします。
  * 間違った知識を修正できるのでむしろうれしいです！
Rでファイル・ディレクトリの情報取得＆変更

## はじめに

- あるディレクトリ内のファイルやディレクトリの検索や大きさや所有者とかを取得したかった。それをRで実際にやってみたときのメモ。

## あるファイルの存在判定：file.exists(filename)

```R
> file.exists("/data/dataset1/data1.txt")
[1] TRUE
```

## あるディレクトリのファイル検索：list.files()

```R
> list.files("/data")
 [1] "dataset1"                        "dataset2"             
 [3] "dataset3"
```

## あるディレクトリのファイル検索（階層的に）：list.files()

```R
> list.files("/data/dataset1/", recursive = TRUE)
[1] "data1.csv" "data/data2.csv"  
```

## あるディレクトリのファイル検索（フルパスで）：list.files()

```R
> list.files("/data/uci/hayes-roth", full.names = TRUE)
[1] "/data/uci/hayes-roth/accuracy.txt"                 
[2] "/data/uci/hayes-roth/hayes-roth-test1-1.tsv"
<snip>
```

## ファイル・ディレクトリ所有者：file.info()

```R
> file.info("/data/dataset1/")
             size isdir mode               mtime               ctime               atime  uid
/data/dataset1/ 4096  TRUE 2770 2015-09-10 17:36:53 2015-11-04 15:50:47 2015-05-07 19:26:31 1119
              gid           uname grname
/data/dataset1/ 2031 hoge.hogehoge  hohoge
```

```
> file.info("/data/dataset1/")$uname
[1] "hoge.hogehoge"
```

## ディレクトリのサイズ：file.info()で処理
- 参考は[こちら](http://r.789695.n4.nabble.com/Folder-size-td4704011.html)

```
sum(file.info(paste("/data/dataset1/",list.files("/data/dataset1", all.files=TRUE, recursive = TRUE),sep=""))$size)
[1] 372407977
```

## ディレクトリ内のファイル数：litt.files()

```
> length(list.files("/data/dataset1/", all.files = TRUE, recursive = TRUE))
[1] 100
```

## ディレクトリ作成:dir.create()
- 再帰的には、```reccursive = T```

```
DIR <- "/data/dataset2/dataset3"
dir.create(DIR, showWarnings = F, recursive = T)
```

## chmod
```
Sys.chmod("/data/dataset1/data.csv"), mode = "0770", use_umask = FALSE)
```

## おわりに
atime,ctime,mtimeも取れる。意外とシンプルにできて助かる。
Godot Engine メモ

すぐに忘れるのでメモ。


###3Dのエディター画面でorbit回せなくて困る俺にはコレ！

"Settings">Editor Settings>3d Editor"に"Navigation Scheme"があるじゃろ？　それを"Maya"にするんじゃ。いつものaltキー+三本指ドラッグでパースペクティブカメラが動かせるぞ。


###Androidで確認したい俺にはコレ！

ExportでAndroidの設定がしてあれば、ドロイド君アイコンで実機（USB接続してあるやつ）でRunできるぞ（2.0Alpha）。"Live Editing"は試してないからまだわからぬぞ。とりあえず実機確認してからapkにしたらいいのだと思うぞ。

###Android用にbuildする設定ファイルはコレ！
2.0Alphaと1.1切り替えると設定消えるっぽい。

abd > ``~/Library/Android/sdk/platform-tools/adb``

jarsigner > ``/usr/bin/jarsigner``

Debug Keystore ``~/.android/debug.keystore``

###悩み中ポイントはコレ！

* 2.0Alphaで3DのシーンがAndroid実機表示できない。2Dだと動く。
Atom で便利なパッケージをとっととインストールする

おすすめ具合とかは別記事に＆パッケージの詳細は本家のリンク先ページに任せるとして、便利と思われるパッケージ名と要点だけをつらつらと綴ります。
とりあえずこれらを突っ込めばそれなりの開発エディタになるかと。

## 共通設定

パッケージ名|説明|備考|記載日
:--|:--|:--|:--
[japanese-wrap](https://atom.io/packages/japanese-wrap)|日本語と画面幅での改行をいい感じにする||
[minimap](https://atom.io/packages/minimap)|Sublime Textでお馴染みのミニマップ||
[sublime-style-column-selection](https://atom.io/packages/Sublime-Style-Column-Selection)|矩形選択できるようになる||
[file-icons](https://atom.io/packages/file-icons)|ファイルアイコンをわかりやすく||
[highlight-line](https://atom.io/packages/highlight-line)|横のラインをハイライトしてくれる||
[highlight-column](https://atom.io/packages/highlight-column)|縦のラインをハイライトしてくれる||
[highlight-selected](https://atom.io/packages/highlight-selected)|選択したワードをハイライトしてくれる||

## 言語関連

パッケージ名|説明|備考|記載日
:--|:--|:--|:--
[atom-beautify](https://atom.io/packages/atom-beautify)|言語フォーマッター|各言語で別途設定が必要|
[docblockr](https://atom.io/packages/docblockr)|ドキュメントブロック自動補完||
[regex-railroad-diagram](https://atom.io/packages/regex-railroad-diagram)|正規表現を図解||
[script](https://atom.io/packages/script)|選択範囲のコード実行||
[term2](https://atom.io/packages/term2)|Atomでターミナル||
[linter](https://atom.io/packages/linter)|エラーを教えてくれる|linter-* で各言語の設定|
[autoclose-html](https://atom.io/packages/autoclose-html)|HTMLを自動に閉じる||
autocomplete-* |言語自動補完|例）autocomplete-php, autocomplete-ruby|
language-* |言語サポート|例）language-php, language-ruby|

## Git関連

パッケージ名|説明|備考|記載日
:--|:--|:--|:--
[git-control](https://atom.io/packages/git-control)|GitをAtom内のGUIで操作||2015/11/08
[git-history](https://atom.io/packages/git-history)|開いているファイルのログを見れる＆ログのファイルをAtomで開ける||2015/11/08
[git-log](https://atom.io/packages/git-log)|logをGraphで見れる||2015/11/08
[git-plus](https://atom.io/packages/git-plus)|GitコマンドがAtomから直接使える||2015/11/08
[git-status](https://atom.io/packages/git-status)|git statusをAtomで表示できる||2015/11/08
[merge-conflicts](https://atom.io/packages/merge-conflicts)|コンフリクトを見やすく編集できる||2015/11/08
[tree-view-git-status](https://atom.io/packages/tree-view-git-status)|tree viewにgit statusの状態を表示できたりbranchも表示||2015/11/08
UIButtonでLongPress

```swift
    let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: "longPressed:")
    button.addGestureRecognizer(longPressRecognizer)
    }

    // MARK: IBAction
    internal func tapBtn(sender: UIButton){
        print("tap equprozer")
    }
    
    func longPressed(sender: UILongPressGestureRecognizer)
    {
        switch sender.state{
        case UIGestureRecognizerState.Began:
            print("long tap begin")
        case UIGestureRecognizerState.Ended:
            print("long tap end")
        default:break
        }
    }
```

だいたいこんな感じで書いた
rabbitmqの各種コマンド一覧 

# rabbitmqctl

## rabbitmqの環境設定を確認する.
```
[selmertsx@rabbitmq]$ rabbitmqctl environment
Application environment of node rabbit@localhost ...
[{auth_backends,[rabbit_auth_backend_internal]},
```

## rabbitmqの実行状態を確認する.
```
[selmertsx@rabbitmq]$ rabbitmqctl status
Status of node rabbit@localhost ...
[{pid,16570},
 {running_applications,
     [{rabbitmq_management,"RabbitMQ Management Console","3.3.4"},
      {rabbitmq_web_dispatch,"RabbitMQ Web Dispatcher","3.3.4"},
      {webmachine,"webmachine","1.10.3-rmq3.3.4-gite9359c7"},
```


## list_queues queueのmessageの状態を見る
```
[selmertsx@color-server]$ rabbitmqctl list_queues name messages_ready messages_unacknowledged
Listing queues ...
amq.gen-2oo35vOvojjfIvoNXQLHSw	0	0
amq.gen-Lx64bchkvkTI6qrtzSxPHw	0	0
amq.gen-PU03OHSwGzxTwIBFKSkq2A	0	0
amq.gen-h73HZznBoHBdA_Gug40QTA	1	0
```

# rabbitmq-server
## RabbitMQ のブローカーを立ち上げる
```
[selmertsx@~]$ rabbitmq-server

              RabbitMQ 3.3.4. Copyright (C) 2007-2014 GoPivotal, Inc.
  ##  ##      Licensed under the MPL.  See http://www.rabbitmq.com/
  ##  ##
  ##########  Logs: /usr/local/var/log/rabbitmq/rabbit@localhost.log
  ######  ##        /usr/local/var/log/rabbitmq/rabbit@localhost-sasl.log
  ##########
              Starting broker... completed with 10 plugins.
```

# rabbitmq-plugins
## 利用するpluginの一覧を確認

``` 
[selmertsx@~]$ rabbitmq-plugins list -e
[e] amqp_client                3.3.4
[e] mochiweb                   2.7.0-rmq3.3.4-git680dba8
[E] rabbitmq_amqp1_0           3.3.4
[E] rabbitmq_auth_backend_http 3.3.4
[E] rabbitmq_management        3.3.4
[e] rabbitmq_management_agent  3.3.4
[E] rabbitmq_mqtt              3.3.4
[e] rabbitmq_web_dispatch      3.3.4
[e] webmachine                 1.10.3-rmq3.3.4-gite9359c7
```
xcodeをAppStore以外からインストールする

## <i class="fa fa-leaf"></i> 経緯
ある一件によりジャンクPC上でxcodeを使用したい場面に出くわした。
使いたいxcodeのバージョンは7.0.1なのだが、使うジャンクPCにはバージョン6.4しか入っていない。
そのため、AppStoreからアップデートを実行しようと試みた。

...(´・ω・\`) アップデートボタンを押して30分ほど経過してもダウンロードすら実行されない。
...(´・ω・\`) こりゃダメだ

(´・ω・`)  なんとか別の方法でxcodeをアップデートする方法はないものか...

## <i class="fa fa-leaf"></i> 解決手段
AppleのDeveloperサイトをいろいろ探してみるとそれらしきものを発見する。
ということで、忘備録を兼ね、その後の手順をまとめておく。

### <i class="fa fa-cog"></i> Appleのdeveloperサイトからdmgをダウンロード＆インストール

- AppleのDeveloperサイトの中で、[xcodeのページ](https://developer.apple.com/xcode/download/)にアクセス。

- ページ下部の「See more downloads」というリンクをクリック。
- Apple IDを入力してログイン。
- 欲しいアプリケーション（今回はxcode7.0.1）の左側の「+」の部分をクリック。
![Screen Shot 2015-11-04 at 9.34.33 PM.png](https://qiita-image-store.s3.amazonaws.com/0/77522/18adbbf6-b37a-53c9-e8f7-681c80a85227.png "Screen Shot 2015-11-04 at 9.34.33 PM.png")

- dmgのダウンロードリンクが現れるので、クリックしてダウンロード。
- あとはdmgを実行してインストールすればOK ~~（のはず。まだ作業途中なので出来次第追記予定）~~ これで問題なくインストール成功！














<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css">
RailsのDBマイグレーションでデータ自体も移行する

Railsではデータベースの構造をマイグレーションという形で統一的に管理できますが、時にはテーブルの変更に合わせて既存のデータを新しいテーブルに合うように移行する必要が出てきます。そのような場合にも、移行作業を行う場所としてマイグレーションをそのまま使うのがいいのではないか、というのが今回書こうとしている主張です。

（追記）ここで触れる、移行すべき「データ」とは、ユーザー投稿や顧客情報、操作ログといった、システムの運用に合わせて蓄積されるものを指します。「マスターデータ」と呼ばれるような、システムを稼働させるために最初から用意しておくようなデータについては、ここでは触れません。

# マイグレーションに書くメリット
データを移行させる方法としては、マイグレーションに書く以外に、「手動でSQL文を実行させる」、「移行専用のメソッドを本体コードに追加する」などの方法があります。これらと比較して「マイグレーションに書く」ことのメリットをあげていきます。

## ソース管理できる（手動SQLに対するメリット）
プロジェクトにSQLコードを置くような場所がないケースは多々あるので[^1]、移行用のSQLを別管理で置いておくと、やがて忘れ去られたり、複数のサーバで移行する場合に一部だけ忘れたりしてしまいます。マイグレーションならコードベースへ一緒に置いておけますし、`schema_migrations`として実行したかも管理してくれます。

## Rails的に書ける（手動SQLに対するメリット）
SQL文を書くのに慣れているなら苦にならないかもしれませんが、そうでない場合、また複数のDBエンジンで動かす可能性がある場合など、ふつうのRailsと同様にデータ処理を行えることは便利です。

## 責任分担の徹底（本体追加に対するメリット）
不特定多数に配布していて、移行スクリプト自体を第三者である利用者が適切なタイミングで実行できる必要がある、あるいは移行作業が機械的に行えず、人間が介入する作業のためプロンプト処理が必要になる、というようなシチュエーションであれば本体ロジックに準じる必要があるかもしれません。逆に、そうでない場合には、一回限りしか使わない移行処理を本体に取り入れてしまうと見通しが悪くなるので、マイグレーションに追い出せたほうがすっきりします。

## 前提条件が明確になる（両者に対するメリット）
マイグレーションは順を追って実行されるので、データベースの構造と結びついて実行される位置が明確となります。

# マイグレーションに書くデメリット
公平に、デメリットについても書いておくことにします。

## 一般的でない手法なので、わかりづらい
最大のデメリットはこれです。ふつう「マイグレーション」はDBの構造だけを触るものなので、そこにデータまで操作を入れてしまうとわかりづらい、という見方があるかもしれません。

## 普通のモデルを使うと複雑化する
マイグレーションの中でモデルを使うこともできるのですが、普段使っているモデルを使うと、通常使用のために設計されている加減で「コールバックやバリデーションが邪魔になる」、あるいはバージョンが変わったことで「存在しないモデルを参照している」となってしまいかねません。後述のように、仮のモデルを作ってそれを使いましょう。

# 仮モデルの生成
ActiveRecordのおかげで、一時的なモデルクラスも簡単に生成できます。

```rb
class TempModel < ActiveRecord::Base
  self.table_name='テーブル名'
end
```
もちろん、本来のクラス名を使ってもいいのですが、一時的なものだと強調するため、クラス名も違えておいたほうが混乱しなくていいでしょう。あとは、ふつうにActive Recordでデータを検索・生成して`save`、`update`など何でもできます。

# 外部リンク
* [マイグレーションによるデータ移行について](http://blog.r-learning.co.jp/archives/205)



[^1]: ある意味、「それがマイグレーション」と言えなくもないかもしれませんが。
最低限の出費でプログラミング未経験者がRailsを学ぶ方法

プログラミングを学ぶために数十万円かけてブートキャンプに通う方もいますが、高いお金を払えないという方も多くいると思うので、できる限り出費を抑えつつも効率的にRuby on Railsを勉強してエンジニアになるためのロードマップをご紹介します。
※本記事はRuby on RailsでWebアプリケーションを開発したい方を対象にしており、Railsでの開発にあたりRubyの学習も必要であるためRubyとRuby on Railsの学習方法を記しています。

## 1. RubyとRailsの概要を本とチュートリアルで学ぶ
![](http://prtimes.jp/i/15015/1/origin/d15015-1-576061-3.jpg)  
「プログラミングって楽しい」と感じつつも、RubyとRuby on Railsの全体像を把握しましょう。まずは[progate](http://prog-8.com/)を使うのがおすすめです。なぜなら初心者の多くが躓きがちな**環境構築**が必要なく、RubyやRuby on Railsの学習にすぐに取り掛かれるためです。また、UIが素晴らしく、サクサクと学習をすすめることができ、プログラミングの楽しさを味わうことができます。

ただし、注意しなければいけない点が1つあります。progateやドットインストールなどのチュートリアル系サービスでは必ずしもRubyやRailsの全体像を体系的・網羅的に学習できないことがあります。したがって、この時期に並行してRubyとRailsの本を購入するのが良いです。progateと本を並行して進めていくことで二軸から学習を行い、「あっこれ本で出てきてた」「progateでやったやつだ」と頭に入りやすくなってきます。

以下がオススメの2冊です。
- Ruby: [たのしいRuby](http://www.amazon.co.jp/%E3%81%9F%E3%81%AE%E3%81%97%E3%81%84Ruby-%E7%AC%AC4%E7%89%88-%E9%AB%98%E6%A9%8B-%E5%BE%81%E7%BE%A9/dp/4797372273)
- Rails: [Ruby on Rails 4 アプリケーションプログラミング](http://www.amazon.co.jp/dp/4774164100?_encoding=UTF8&isInIframe=0&n=465392&ref_=dp_proddesc_0&s=books&showDetailProductDesc=1#product-description_feature_div)

Railsの本は必ず買うことをおすすめしますが、Rubyは必ずしも買う必要はありません。自身のご予算に合わせてください。
それと、本を読む時に「わからない」ポイントが多々でてくると思いますが、あまり肩肘を張って全てを理解しようとしなくていいです。わからない部分は一度読み飛ばして後から読みなおそうくらいの感覚の方が、初心者の方は挫折する可能性を減らすことができます。

さて、この段階での出費は**progate ¥0 + Ruby本 ¥2,808 + Rails本 ¥3,780の計¥6,588**です。

## 2. 本やチュートリアルで学んだ内容を復習する
![](http://rails.pocket-programming.com/assets/ogp_1200x630_jp-16be7632ec366a60580606b374c4afd2.png)  
高校受験や大学受験の数学を勉強していた頃を思い出してください。必ず自分で復讐することが必要でしたよね。プログラミングも同様です。本を読んだだけであったり、progateで見よう見まねで勉強しただけでは十分な力はつきません。高校数学でいうならば、チャート式の例題を解説を読みながら解いて見ただけで、その下にある練習問題を解いていないようなものです。ですので、必ず学習した内容を復習する時期を取りましょう。

復習する方法としては、購入した上記の本をもう一度流して読んでみたり、よくわからなかったポイントを再読するのが良いです。
加えて、初心者の方が効率的にRubyとRailsの内容を復習することができるように設計された[Pocket Programming](http://rails.pocket-programming.com/ja)というAndroidアプリがあります。¥298しますが、初心者の方が理解するのに苦労するポイントや重要なポイントをクリアにできるように設計された問題集型のアプリです。電車の中などのスキマ時間にやるのが良いでしょう。

## 3. 自分の作りたいサービスを作ってみて、デプロイする
次のステップとして、実際にゼロベースで自分の作りたいサービスをRailsを使って製作してみましょう。そっくり真似できるお手本があるわけではないので今までより大変になりますが、今まで勉強した内容が頭に入っているはずなのでくじけずトライしましょう。

## 4. プログラミング経験者がいる環境に飛び込み、一緒に作る
ここまで来たら「お金をもらいながらプログラミングを勉強する」ようにしましょう。つまり、インターンシップなどにエンジニアとして応募して時給をもらいながら実戦経験を積んで行くのです。お金をもらうことはそこまで重要ではないので、報酬が少ないインターンシップに参加しても良いです。大切なことは、先輩エンジニアと一緒に働くことです。これを実現できれば学習効率や伸びが圧倒的に変わってきます。Wantedlyなどを使って頑張って探しましょう。

正直なところ、ここは運や粘り具合などに左右されるのが事実です。なぜなら、ステップ3までやった所で実践的なレベルに到達してるとは言いがたく、インターンとして採用してくれるスタートアップやベンチャー企業はそう多くないからです。また、インターンシップに参加したとしても、実務内容はバグ修正だったりして思っていたものと違うこともあります。

しかし、その時点のレベルでも採用してくれる企業があることも事実です（もちろん、1〜3のステップでのやり込み具合に左右されます）。あとは、面接等での交渉やアピール次第です。トライして無駄になることはありません。

もしくは、インターンシップ先が見つからない場合は友達などを誘って複数人でプロダクト開発するのも1つの手です。できるだけ自分より経験がある人を探して、口説き落としましょう。

## まとめ
出費をできる限り抑えながら勉強したい人は、以上のロードマップで進めてみてください。合計出費は約7,000円程度です。こればっかりは自分への投資なので、いくらまでお金を掛けるかは人次第なのでなんともいえませんが、最低限押さえた場合はこんなもんになりますということで参考にしてください。
DoctrineのDQLと仲良くなるなる方法【その1】

# Doctrineって便利
みなさん今日も楽しくDoctrine(以降ドク)と仲良くやってますか
初めのころは、こいつ使えねええ!!と正直思ってましたが、DQLを制するものはEC-CUBE3を制す。。。
う～～んなんか今日は文章がさえねえ感じなので早速本題。
## 必須のメソッド
EC-CUBE3でDQL生成の基本的な事は、こちらの大先生の内容をごらんくだいさい。

[Doctrine QueryBuilder使い方メモ](http://qiita.com/chihiro-adachi/items/3901c8865f926d913e67)

### HIDDENキーワード( 呼称が正しいかは不明 )
例えばですが、こんなSQLを発行したとします。

``SELECT c, MIN(pc.price02) as price_min, p.id as pid FROM dtb_product AS c INNER JOIN dtb_product_class as pc ON p.id = pc.product_id GROUP BY pid ORDER BY pid ASC; ``

これをDQLでただ作成するとこんな感じかなと( Repositoryで作成 )

            $qb = $this->createQueryBuilder('p');
            $qb->addSelect('p.id as pid');
            $qb->addSelect('MIN(pc.price02) as price02_min');
            $qb->innerJoin('p.ProductClasses', 'pc');
            $qb->groupBy('p.id');
            $qb->orderBy('price02_min', 'ASC');
            $res = $qb->getQuery()->getResult();
            
これで完璧じゃんと思って、結果 ( $res ) を見ると、当たり前なんですが、余計なSELECTの内容が結果の配列に追加されていて「Productオブジェクトだけが欲しいのに」って時に残念になります。

`$res[0][c] => ( 取得結果Object ) → いい！！
$res[0][pid] => ごにょごにょ  →残念
$res[0][price02_min] ごにょごにょ →残念`
       
まあforeachでグリグリして取っ払えばいいですが。。。
健全なプログラマなら。。んんぁっーー無駄ってなると思います。

そんな時に「***HIDDEN***」の登場

            $qb = $this->createQueryBuilder('p');
            $qb->addSelect('p.id HIDDEN←これ as pid');
            $qb->addSelect('MIN(pc.price02) as HIDDEN←これ price02_min');
            $qb->innerJoin('p.ProductClasses', 'pc');
            $qb->groupBy('p.id');
            $qb->orderBy('price02_min', 'ASC');
            $res = $qb->getQuery()->getResult();
            
 ってすると
 
`$res[0][c] => ( 取得結果Object ) → いい！！！！！！！！！！！`
 
ってんんぁっーーとはなりません。

### resetDQLpart
これもスングォイ便利なんですが。。。。
今日は帰りたいのでまた明日追記。。。。。スマン...zzzzzz

......................................................................
おはようございますです！！
さあ朝がきたので、続き仕上げちゃいますです。
でこの「resetDQLpart」ができるやつです

またもや同じソースで説明するです


            
            $qb = $this->createQueryBuilder('p');
            $qb->addSelect('p.id as pid');
            $qb->addSelect('MIN(pc.price02) as price02_min');
            $qb->innerJoin('p.ProductClasses', 'pc');
            $qb->groupBy('p.id');
            $qb->orderBy('price02_min', 'ASC');
            

このソースを使いまわして、別の情報を取得するです。
※「検索条件」をそのままで「COUNT」したいとか。。。
そうなるとこの場合ORDER BYが無駄です

その時にこの「resetDQLpart」が登場するです

        //トータル件数を取得
        $counter = clone $qb;
        $counter->resetDQLpart('orderBy');←ここ
        $counter->select('count(pid)');
        $total = counter->getQuery()->getSingleScalarResult();
        
とすると。。。

「getDQL()」から「str_replace」「preg_replace」などしなくても。
ほれ、もうステキなのです！！
今日は語尾を「です」しばりで書いてみたのですが。。。
次回はまじめにかくです。。
SwiftでTreasureDataを使おうと思ったらうまくいかなかった->なんとかしたつ


## どんな物語ですか？

SwiftでTreasureDataを使おうと思って、SDKを入れたんだけどうまくいかなかった。それをなんとか解消した物語です。

入れようと思ったライブラリは、

- [TreasureData-iOS-SDK](https://cocoapods.org/?q=treasuredata)

です。Cocoapodsでやろうと思いました。

- Xcode 6.4
- Swift 1.2
- TreasureData iOS SDK 0.1.6.1

## どううまくいかなかったんですか？

Cocoapodsでライブラリを入れてBridging-Headerにimport文を書いたところで、めんどうそうなエラーが出ました。具体的に言うと、

```Objective-C
#import <KeenClientTD/KeenClient.h>
#import <TreasureData_iOS_SDK/TreasureData.h>
```

と書いたら、

![Screen_Shot_2015-11-04_at_20_53_43.png](https://qiita-image-store.s3.amazonaws.com/0/24041/58106b33-bfcf-0aea-0c0b-972c82f40d12.png "Screen_Shot_2015-11-04_at_20_53_43.png")

となりました。ただ、このエラー見たことある。名前空間的に、TreasureData-iOS-SDKが依存しているKeenClientを読み込めていないんだと思います。

そこで、Forkしてimport文を書き換えました。

![Screen Shot 2015-11-04 at 21.09.30.png](https://qiita-image-store.s3.amazonaws.com/0/24041/47fe8fe3-c91e-4d64-6fc4-83d6b5de922b.png "Screen Shot 2015-11-04 at 21.09.30.png")

これで、Bridging-Headerは読み込めました。

## 次にどんなエラーが出たんですか？

```swift
import TreasureData
```

って書いたんですよ。そしたら、下記のようなエラーが出ました。

![Screen Shot 2015-11-04 at 21.01.26.png](https://qiita-image-store.s3.amazonaws.com/0/24041/55fd8aa3-2ad1-3a71-9e7d-fcfaf6447eac.png "Screen Shot 2015-11-04 at 21.01.26.png")

モジュールはこれではないですねということで、書き変えました。

```swift
import TreasureData_iOS_SDK
```

Done!

使えるようになりました。修正した部分については[プルリク](https://github.com/treasure-data/td-ios-sdk/pull/3)にしています。

使っている人すくなそうだし、誰かの役に立つかな。。あと、何か根本的な間違いをしていて勝手にはまっていたら恥ずかしのですが公開します。

## 追記

プルリクがマージされましたー。

## 参考

- [Treasure Data - データ分析をクラウドで、シンプルに。 - Treasure Data](http://www.treasuredata.com/jp/)
- [Treasure Data iOS SDK | Treasure Data](http://docs.treasuredata.com/articles/ios-sdk)
JavaScriptからPOST送信（同ウインドウ、ポップアップウインドウ）

#概要
JavaScriptからpost送信したい、というときの汎用関数です。
jQueryを使っています。

##同ウインドウでpost送信する

・第一引数にジャンプ先のURL
・第二引数にセットするデータ名を配列でいれる
・第三引数にセットする値を配列でいれる（第二引数と同じ長さ）

```js
function postJump(_url, _keys, _vals){
	var html = '<form method="post" action="'+_url+'" id="postjump" style="display: none;">';
	for(var cnt=0;cnt<_keys.length;cnt++){
		html += '<input type="hidden" name="'+_keys[cnt]+'" value="'+_vals[cnt]+'" >';
	}
	html += '</form>';
	$("body").append(html);
	$('#postjump').submit();
	$('#postjump').remove();
}

```


##ポップアップウインドウを開いて、そこにpost送信する

・第一引数にジャンプ先のURL
・第二引数にポップアップで開くウインドウ名
・第三引数にセットするデータ名を配列でいれる
・第四引数にセットする値を配列でいれる（第三引数と同じ長さ）

```js
var popWinObj;
function popPostJump(_url, _win, _keys, _vals){
	$('#postjump').remove();
	if( (popWinObj) && (!popWinObj.closed) ){
		popWinObj.close();
	}
	popWinObj = window.open("about:blank",_win,"width=660,height=600,scrollbars=yes");
	var html = '<form method="post" action="'+_url+'" id="postjump" target="'+_win+'" style="display: none;">';
	for(var cnt=0;cnt<_keys.length;cnt++){
		html += '<input type="hidden" name="'+_keys[cnt]+'" value="'+_vals[cnt]+'" >';
	}
	html += '</form>';
	$("body").append(html);
	$('#postjump').submit();
	$('#postjump').remove();
}

```


#おわりに
特段新しいテクニックでもないですが、備忘録として。
それぞれ最後に ```.remove()``` していますが、これをしないと上記関数の複数回呼び出しでバグります。
Google APIをCLIから利用する手順


- GoogleDeveloperConsoleから認証情報を選択
- OAuth同意画面でサービス名を登録、その他は任意
- 認証情報タブから認証除法を追加>OAuth2.0クライアントIDを選択、アプリケーションの種類はその他
- Downloadリンクからjsonファイルを取得
- 以下URLのquickstart.phpの手順に従い定義されている情報を編集する
https://developers.google.com/drive/web/quickstart/php?hl=ja

```php
#変更箇所
define('APPLICATION_NAME', 'Drive API PHP Quickstart'); #任意の名前
define('CREDENTIALS_PATH', '~/.credentials/drive-php-quickstart.json'); #認証後のtokenファイルを格納する場所（任意）
define('CLIENT_SECRET_PATH', 'client_secret.json'); #ダウンロードしてきたjsonファイル
#利用したいサービス名が入る
define('SCOPES', implode(' ', array(
  Google_Service_Drive::DRIVE_METADATA_READONLY)
));
```

- 書き込み完了したらコマンドラインから、`php quickstart.php`を実行
- 認証画面へのURLが表示されるのでブラウザで開く,承認後にでるIDをターミナル上で入力すると指定した場所にtokenファイルが生成されている
- GoogleDrive内のファイルリストが表示されればOK

#Drive REST APIでFileの情報を取得する

```php
$file = $service->files->get($fileId); //$servie is Google Service Object
```
リファレンス https://developers.google.com/drive/v2/reference/files/get

#GoogleAppsScriptのRESTExecutionAPIを使ってSpreadsheetsをDB代わりに使う

__経緯__
どうも2015年11月時点ではもともとあったSheetsAPIが使えなくなっているようで、GoogleDevelopersのサイトではAppsScriptを使うといろいろできますよ的なことが記載されている。今年の夏くらいまでは利用できたようなのだが、、仕方ないので初AppsScriptを使って作ってみます。

##Google Apps Script
https://developers.google.com/google-apps/spreadsheets/

- Apps ScriptでSheetsを編集するTutorials　https://developers.google.com/apps-script/articles
- PHPでのApps Script連携 https://developers.google.com/apps-script/guides/rest/quickstart/php
- 上記記載のcomposerでインストールをするとApps Scriptのクラスが無いバージョンになるので、gitからcloneして来る
https://github.com/google/google-api-php-client.git
- ここでつまづく、認証はされるがScriptが実行されない

```
Caught exception: {
  "error": {
    "code": 403,
    "message": "The caller does not have permission",
    "errors": [
      {
        "message": "The caller does not have permission",
        "domain": "global",
        "reason": "forbidden"
      }
    ],
    "status": "PERMISSION_DENIED"
  }
}
```

- - ↑Scriptエディターの画面でリソース>DevelopersConsoleプロジェクト>プロジェクトを設定でプロジェクトを登録する

##Google playgroundでの実行
参考にしたリンク http://qiita.com/soundTricker/items/1bcfc5c9e80d29a7ae4b

##未解決の内容
コマンドラインから実行するofflineでのアクセスの場合セッションが途切れるためか、tokenが失効されてしまい毎回認証画面で認証する必要があり、コレに関しては解決案は見つからず。。

##ちなみに
Google Apps Scriptにはcronのような機能があり、URL Fetch Service(UrlFetchApp)との合わせ技で自動phpスクリプトの実行が実現可能というのを初めて知った。
これはいつか役に立ちそうです。
Rails: FactoryGirlでafter_createで自動生成される関連モデルを作る



ユーザーにユーザーの詳細プロフィールがぶら下がってるような1対1のモデル(DB設計)

```ruby:models/user.rb
class User < ActiveRecord::Base

  has_one :profile, class_name: 'UserProfile', dependent: :destroy, inverse_of: :user  
  
  after_create do |record|
    UserProfile.create(user: record)
  end
# (略)
```

ユーザに対して、詳細プロフィールをafter_createでプロフィールを生成するときのFactoryGirl

```ruby:spec/factories/user.rb
FactoryGirl.define do
  factory :user do
	# (略)
    after(:create) do |user|
      profile = UserProfile.find_by(user: user)
      profile.update!(attributes_for(:user_profile))
    end
  end
end
```

associationで書くとmodel本体のafter_createが走ってしまうので、
一旦after_createで生成してから、profileのattributeをupdateで埋めています。