OmniAICreator/Qiita-1.07M huggingface dataset:
urlエンコード（コマンドライン／シェルスクリプト）

こんにちは。
urlエンコード（[パーセントエンコーディング](https://ja.wikipedia.org/wiki/パーセントエンコーディング)）[^1]をコマンドライン／シェルスクリプトで行いたいので関数を作ってみました。nkf / ruby に頼って楽をしました。

```bash
function urlencode {
  echo "$1" | nkf -WwMQ | tr = %
}
```

```bash
function urlencode {
  ruby -r cgi -e "puts CGI.escape(\""$1"\")"
}
```

なお、urlエンコードの方法は色々なところで話題に取り上げられているようです。

- [URLエンコード・デコードする](http://qiita.com/richmikan@github/items/fe1af82fe145ae27d53e)
- [Linuxのコマンドから行うURLエンコード、URLデコード](http://www.garunimo.com/program/linux/linux40.xhtml)（Linuxゲリラ戦記）
- [コマンドラインでURLエンコード、デコード](http://blue-red.ddo.jp/~ao/wiki/wiki.cgi?page=%A5%B3%A5%DE%A5%F3%A5%C9%A5%E9%A5%A4%A5%F3%A4%C7URL%A5%A8%A5%F3%A5%B3%A1%BC%A5%C9%A1%A2%A5%C7%A5%B3%A1%BC%A5%C9)（ふなWiki）
- [How to urlencode data for curl command?](http://stackoverflow.com/questions/296536/how-to-urlencode-data-for-curl-command) (Stack Overflow)

[^1]: url-エンコードは話が込み入っている部分もあるようですが、ここでは深くは立ち入りません。
新たにSysmfony2.6でコードを動かしたらでるUncaught Exception: You have requested a non-existent service "fos_user.doctrine_registry". について

既にサポートがおわっちゃってるけど仕方が無くSymfony2.6のシステムを再度作るときに引っかかったことです。
一旦同一のサーバーを立て直す。その後新バージョンに移行とかするときの「同一バージョン」を建てる時です。

以下エラーがSymfonyログに吐き出されました。

# エラー

```prod.log
[2016-03-08 17:42:45] php.EMERGENCY: Uncaught Exception: You have requested a non-existent service "fos_user.doctrine_registry". 
```


# 環境とか

* AmazonLinux
    * https://aws.amazon.com/amazon-linux-ami/2015.09-release-notes/
* PHP5.6.17
* Apache2.4.16(Amazon)
* Symfony2.6.13


# 対処
servicesで定義してやれば動きました。

```config.yml
services:
    fos_user.doctrine_registry:
        alias: doctrine
```

引用元：https://github.com/FriendsOfSymfony/FOSUserBundle/issues/2048

# なんでおこったのか

## 状況
* 元のシステムではおこってない（最近デプロイしていない）
* 今回新しくcomposer install した

## つまり、状況から推測すると..

* 元のシステムでは、今回発症するきっかけとなった依存関係にあるライブラリが古い状態である。
* 今回新しくcomposer install したときに依存するライブラリで [このIssue](https://github.com/FriendsOfSymfony/FOSUserBundle/issues/2048) に関連するものがあった


# 最後に
やっぱり、サポート外のフレームワークなんて使うもんじゃ無いですね。
勉強になりました。
とっととバージョンあげたろう
python > 日付の型からyyyymmddを取得する > parsed = time.strptime(mddt) / yyyymmdd = time.strftime("%Y%m%d", parsed)

```txt:動作確認
Raspberry Pi2 + raspbian
```

http://qiita.com/7of9/items/b35747318a251247a249
の続き。

ファイルの日付からyyyymmdd形式の文字列を取得したい。

参考 http://ja.pymotw.com/2/time/
参考 http://docs.python.jp/2/library/time.html

```py
import os.path
import time

filepath = "/home/pi/BYOP/send.txt"
mddt = time.ctime(os.path.getmtime(filepath))
print mddt
parsed = time.strptime(mddt)
yyyymmdd = time.strftime("%Y%m%d", parsed)
print yyyymmdd
```

```txt:結果
Mon Mar  7 07:18:45 2016
20160307
```
python > ファイル最終更新日を取得する > mddt = time.ctime(os.path.getmtime(filepath)) > Mon Mar  7 07:18:45 2016

```txt:動作確認
Raspberry Pi2 + raspbian
```

send.txt というファイルの最終更新日を使って、message stationのメッセージ投函日にしようかと検討中。

ファイルパスから最終更新日を取得するのは以下でできた。

```160308_fileLastModificationDate.py
import os.path
import time

filepath = "/home/pi/BYOP/send.txt"
mddt = time.ctime(os.path.getmtime(filepath))
print mddt
```

```txt:結果
Mon Mar  7 07:18:45 2016
```

ここから[年月日]の数値を読み取る方法を調べる。
Delphi TStringListの使い方

この記事ではDelphiの文字列リスト操作クラスのTStringListでよく使うパターンを列挙しました。

#まずはこれが基本ですね
TStringListに限ったことではないですがObjectを操作する場合、try, finallyでcreateしたら必ずfreeされるようにしておきます。

```delphi
uses
Classes;

var
 sl:TStringList;
begin
 sl := TStringList.Create;
 try
  //ここでいろいろ処理
 finally
  sl.Free;
 end;
```

#Add, Delete
```delphi
var
 sl:TStringList;
begin
 sl := TStringList.Create;
 try
  sl.Add('1');
  sl.Add('2');
  sl.Delete(0); //0番目を削除
 finally
  sl.Free;
 end;
```

#Iterate
```delphi
var
  sl:TStringList;
  i:integer;
begin
  sl := TStringList.Create;
  try
    for i := 0 to sl.Count - 1 do begin
      WriteLn(sl[i]);
    end;
  finally
    sl.Free;
  end;
```

#カンマ区切りテキスト

```delphi
var
  sl:TStringList;
  i:integer;
begin
  sl := TStringList.Create;
  try
    sl.CommaText := 'a,b,c,d';

    WriteLn(sl[0]); // a
    WriteLn(sl[1]); // b
    WriteLn(sl[2]); // c
    WriteLn(sl[3]); // d

    sl.Add('e');

    WriteLn(sl.CommaText); //a,b,c,d,e
  finally
    sl.Free;
  end;
```

#Delimiterを指定すれば、タブ区切りテキストなども操作可能
```Delphi
var
  sl:TStringList;
  i:integer;
begin
  sl := TStringList.Create;
  try
    sl.Delimiter := #9;
    sl.CommaText := 'a#9b#9c#9d';

    WriteLn(sl[0]); // a
    WriteLn(sl[1]); // b
    WriteLn(sl[2]); // c
    WriteLn(sl[3]); // d

    sl.Add('e');

    WriteLn(sl.CommaText); //a#9b#9c#9d#9e
  finally
    sl.Free;
  end;
```

#IndexOfで要素の位置（0オリジン）を取得

'''delphi
var
  sl:TStringList;
  i:integer;
begin
  sl := TStringList.Create;
  try
    sl.Add('a');
    sl.Add('b');
    sl.Add('c');

    WriteLn(sl.IndexOf('a'));   // 0
    WriteLn(sl.IndexOf('b'));   // 1
    WriteLn(sl.IndexOf('c'));   // 2
    WriteLn(sl.IndexOf('xxx')); // -1
  finally
    sl.Free;
  end;
'''

#連想配列
```delphi
var
  sl:TStringList;
  i:integer;
begin
  sl := TStringList.Create;
  try
    sl.Values['a'] := '1';
    sl.Values['b'] := '2';
    sl.Values['c'] := '3';

    for I := 0 to sl.Count - 1 do begin
      WriteLn(sl.Names[i]);          //a
      WriteLn(sl.ValueFromIndex[i]); //1
      WriteLn(sl[i]);                //a=1
    end;

    WriteLn(sl.IndexOfName('a')); //0
  finally
    sl.Free;
  end;
```
gitとgithubで簡単なチーム作業手順

ハッカソンで行った手順。

空コミット（変更を加えてないけどコミットする機能）する。originにpushする。
↓
githubに移り、そのコミットをmasterにプルリクエストする。
↓
プルリクエストしてからコミットしていくと、その過程がgithubで見える。コメントもできる。
slack（チャットツール）にも知らせが来る。

といった作業方針。

##0. gitのssh接続確認、鍵生成、登録。

まずgithubへ鍵を登録しているか確認する。

gitのssh接続確認
```
ssh -T git@github.com
```

鍵の生成、表示

```
ssh-keygen -t dsa
cd ~/.ssh
cat id_dsa.pub
```

端末に出た情報をコピーして、githubのアカウント情報のkey設定項目で新しいkeyを作り、ペーストして登録する。

接続できるか確認する。

```
ssh -T git@github.com
```

##1. githubのレポジトリのチームメンバーを設定したり、slackのチームメンバーを設定、招待したり、slackとgithubを連帯する設定を行う。

githubのレポジトリの設定からチームメンバーを設定する。

slackにメンバーを招待しよう
http://will-ikusei.blogspot.jp/2015/11/slack_4.html

招待されるとメールが来るので認証する。

slackとgithubを連携させる
http://ryouzis.hatenablog.com/entry/2015/08/14/190349

##2. 開発中のレポジトリをcloneする。

```
git clone ssh:アドレス
```

##3. 作業ブランチを作る

ブランチの確認

```
git checkout -a
```

作業ブランチを新しく作り移る。まだ作業は始めない。

```
git checkout -b hogehoge

```

##4. 空コミットする。そしてoriginにプッシュする。

```
git commit --allow-empty -m "始めます"
git push -u origin hogehoge

```

履歴確認

```
git log
```

##5. githubからプルリクエストする。

githubにブラウザでアクセスし、「Compare & pull request」をクリックし、行う作業なんかをコメントして、「create pull request」をクリック、するとプルリクエストになる。

githubでは、プルリクエストに対して掲示板のようにコメントすることができる。
また、ここから作業を進めてコミットするとコミットもコメントと順に並ぶ。
コメントで、これからする作業の表明をしたり、仕様の相談をしたりすれば履歴のようにできる。

コメント機能ではマークダウンが使えるので、以下のようにチェックリストを書くと良いようだ。

```
- [ ] この機能追加しよう
- [x] あの機能追加

```


#更に作業を進め、作業ブランチをマスターにmergeする手順。

##6. 作業を進める。
変更をコミット、プッシュする。

```
git status
git add .
git commit -m "変更追加"
git push origin hogehoge
```

##7. mergeする。
（現在作業ブランチとして）まずmasterを自分の作業ブランチにmergeして、コンフリクトを解消する。

```
git checkout master
git pull

git checkout hogehoge

git merge master
```

コンフリクトがあって解消したら、そのコードをコミットする。

```
git add .
git commit -m "merge fix conflict"
git push origin hogehoge
```
masterに移って、本題の作業ブランチをmergeする

```
git checkout master
git merge --no-ff hogehoge
git push origin master
```

masterにmergeする作業を始めるときは、周りによく確認する。

こんな感じでmasterを進めていくことができる。たぶん。
Elm用にSVGを変換する


##できたもの

ブラウザ http://giisyu.github.io/svgToElm/
ソース https://github.com/giisyu/svgToElm

この記事、書いてから忘れてて半年立ってから思い出したので投稿しておきます。
リンク先のコード古いので書きなおすかも。

##elm-svgとParser
ElmではSVGもelm-svg というライブラリで扱えます。
Elmのロゴを表示したもの
https://github.com/evancz/elm-svg/blob/master/examples/Logo.elm

SVGは、なめらかなアニメーション、パス画像が有効なロゴなどで利用されているようです。参考([http://d.hatena.ne.jp/rikuo/20150524](http://d.hatena.ne.jp/rikuo/20150524))


例えばイラレとかでsvgデータを作った場合、elm-svg調に書き直さなければなりません。今だと良いツールがあるかもしれません。

ちょうどその時パーサーコンビネータの記事を見まして、探してみるとElmにもシンプルなパーサーコンビネータライブラリ[parser](http://package.elm-lang.org/packages/Dandandan/parser/4.1.1/Parser)というのがあります。
勉強がてらElmで変換するものを書いてみました。


##参考

Elm Parserライブラリ
http://package.elm-lang.org/packages/Dandandan/parser/6.0.1

パーサーコンビネーターの記事
http://gihyo.jp/dev/feature/01/functional-prog/0005

JavaScriptでパーサコンビネータのコンセプトを理解する
http://blog.anatoo.jp/entry/2015/04/26/220026

haskellによるxmlパーサー
http://charlieharvey.org.uk/page/naive_xml_parser_with_haskell_parsec_and_perl_regexen_part_one_haskell


##作った感想
エラーはどうすればいいのか、出力をフォーマットするにはどうすればいいのか、とかまだわからないこと多いですね。。。でもとりあえず作れたし入門できたのでうれしいです。パーサー出来ると夢広がります。

あとElmは勉強したこと作ったものをブラウザで公開できるので勉強言語にいいなぁ、とやはり思うわけです。
「マイクロサービスアーキテクチャ」を読んで　その1（1章～6章）


# 全体
一言でいうと名著ですね。ここ2～3年、洋書を読むをさぼっていて翻訳がでるまで読まないでいたところが反省点です・・・
DevOps逆転だ依頼のインパクトです。他にいい本はあるのですが、インパクトという意味では久々な本です。

そのうえで、MSA（マイクロサービスアーキテクチャ）は概念であり、それぞれの技術がMSAを実現可能にあるいはMSAのために開発されてきているといえるのではないかと思いました。
（特に2章はアーキテクトのあり方、アーキテクチャが実現する原則、目標、標準、プラクティスなどが語られており、その概念を強く感じました）

* 残念なところ
各項目の関係性や粒度が章・節でばらばらに見えてしまうので体系として読みにくいです。ただ、それは逆に整理しながら読めばいいだけなので名著であることは変わりません。逆にいうと、各章、各節単位で興味があるところから読むということも可能だと思います。

## 考えるべきこと(後で加筆予定）
* 疎結合で凝集度の高い面で全体を切ることができるか
* 組織が変わる場合にその境界が分かれることが望ましい
* 非機能要件（機能横断要件）が異なる場合。（NoSQLとDBMSなど）
* 


# 内容
## MSAが必要となる理由
1.2 主な利点に書かれています。
* 技術異質性
* 回復性
* スケーリング
* デプロイの容易性
* 組織面の一致
* 合成可能性
* 交換可能にするための最適化

スケーリング、デプロイの容易性等はそうだろうなと思っていたのですが、まだまだ利点がありました。

## 境界づけられたコンテキストの重要性
3.3に記載がありますが、サービスをどう定義すべきかを考える上で重要に思います。
3.3.1共有モデルと隠れモデル、3.5ずっと下の亀は関係があって、共有モデルをさらに詳細化して、分割して接合部を明確にすると隠れモデルが明確化される関係があるのではと思いました。
このような内容に基づいて、どう接合部を見出すことができるかが鍵だと考えます。
境界づけられたコンテキストがマイクロサービスになり、接合面がインタフェースになるのかなと考えながら読みました。

## 処理方式
前半の山場がここかと思ってます。このあたりをきちんと考えることができればアーキテクチャとしてはしっかりするのではと思ってます。（非機能要件（機能横断要件）次第ではもっと考える必要がありますが、それは別の書籍に詳細が書かれています）

### 同期と非同期 (4.4)
処理方式の基本的な概念が最初に書かれています。

### オーケストレーションとコレオグラフィ（4.5）
最初にリクエストを受け取ったサービスがファサードのように動作し、他のサービスと協調するのがオーケストレーション。
最初にリクエストを受け取ったサービスが自分の処理をおこない、その処理をおこなったイベントを発生させ、そのイベントを受け取って処理する各種サービスが自分のそのイベントに対する対応をおこなうことで処理をおこなうのがコレオグラフィ。

同期と非同期、オーケストレーションとコレオグラフィを組み合わせるといろいろな処理パターンが生まれます。

コレオグラフィってキューを使ったSub/Pubモデルでしか意識していなかったんですが、非同期という軸を外して考えると同期でも確かにできそうですね。待ち合わせや結果の取得を考える必要がありますが。（同期にするメリットはどこだという話もあります）

### 技術選択
* RPC (4.6)
* REST (4.7)
* 非同期イベントベース連携の実装 (4.8)
同期技術としてRPC（リモートプロシジャーコール）、RESTを紹介している。このあたりがこの本のすごいところで、これらのテーマを短いページ数で最新の情報に触れようとしている。（さすがThoughtWorksの人です）

### 注意点
MSAを構成する技術要素として、いくつかのポイントを挙げています。
特に4.13 バージョニング、4.15.5 ストレングラー（絞め殺し）パターンは昔に考えたことがあったので、なるほどと思いました。

## 現状の単一システムをどうサービス化するか（5章）
単一の大きなシステムをどう分割するかという点を記載しています。

### 分割理由
分割理由が明確に書かれているのが素晴らしい。5.3.1 変化の速度がすべての理由かと思ってましたが、チーム編成、セキュリティ、技術もその理由になるのかと思いました。

### データベースの分割（5.5～）
各種サービスに分割して、同じDBMSを見ていた場合、目的を達成できるかわかりません。（コードベースを小さくするという意味ではいいのでしょうが）
そのためにもデータベースの分割は大きなテーマです。
そこについても明確に記載されています。

### 情報系システムへの対応 (5.14～)
いわゆる情報系システムへの対応について、5.16データポンプという概念のソリューションを交えて記載されています。データポンプはETLのETにあたる部分をサービスでもち、サービスの境界内の大きなデータ連携に対してET機能によって、データを提供するというサービスを実現するものです。
情報系システムのデータの鮮度からするとこのやり方で十分で、同期である必要ないので【バッチ】的な考え方でもいいかもしれません。
データだけではなく、イベントをまとめて処理して情報系DBを作るソリューションも記載されていました。（5.17 イベントデータポンプ）

##  デプロイ
デプロイはアプリケーションが先に書かれていましたが、私としてはインフラ（環境）から考えた方が考えやすいので、以下はそう記載しました。

### インフラ
6.4 プラットフォーム固有の成果物から始まり、サービスをどのように配置するか、MSAが要求するスピードでその環境を準備できるかという内容が記載されています。（6.4～6.9、6.11～6.12）
特に、6.9　サービスからホストへのマッピングはパターンをかなり細かく考察しており、再認識しました。

### アプリケーション
CI、リリースをおこなうためのパイプライン、サービス単位のコードベースをどう管理するべきかということが記載されています。
このあたりはMSAでなくても考えなければならないところです。サービス単位のコードベースをどう管理するかは、MSA固有ですが。
Deviseで新しい項目を追加したいとき

[devise](https://github.com/plataformatec/devise)で新しい項目追加したいときどうすればいいか分かったのでメモ。

```rb:application_controller.rb
class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception

  before_filter :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) << [:add_setting1, :add_setting2]
  end

end
```

これを追加することでparameterの受け渡し可能になった！
いいからやる。CentOS7 + PHP7 + mongoDB



PHP7からmongoDBを操作する環境をつくる。
案の定、詳細は先輩方の教えを参考に。
何も考えずこれだけやれば動作環境が手に入るよのメモ。

手順は、以下で作成したVM環境上で検証した
[いいからやる。CentOS7 + Apache + MySQL + PHP7](http://qiita.com/ayayan-z/items/dde3778376248eaa7d99)



## mongoDBをインストールする

以下ルートユーザで作業

* リポジトリを追加する

```
vi /etc/yum.repos.d/10gen.repo
```

```
[10gen]
name=10gen Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
gpgcheck=0
enabled=1
```
* インストール

```
yum install mongo-10gen mongo-10gen-server
```

* 起動する

```
service mongod start
```  

* 自動起動設定

```
chkconfig mongod on 
```

## mongoDBにtest用のcollectionを作成する

* DBを作成する

```
mongo test_db
use test_db
```

* testというcollectionを作成する

```
db.createCollection('test');
```

* collectionにドキュメントを追加する

```
db.test.insert( { name:'tanaka', address:'tokyo' } );
```

* 確認

```sql:DB一覧表示
show dbs
```

```sql:collection一覧表示
show collections
```

```sql:全件表示（select)
db.test.find();
```

```sql:プロンプト終了
exit
```



![スクリーンショット 2016-03-08 19.38.12.png](https://qiita-image-store.s3.amazonaws.com/0/116449/9d5253cb-894d-2b95-df0a-ddd7c5f3a25d.png "スクリーンショット 2016-03-08 19.38.12.png")

## PHPからmongoDBを使えるようにする

* Extensionの一覧を見る

```
yum --enablerepo=epel,remi,remi-php70 search php70
```

* mongoDBのExtensionをインストールする

```
yum --enablerepo=epel,remi,remi-php70 install php70-php-pecl-mongodb
```

* php.iniに設定を追加する

```
vi /etc/php.ini
```

```
extension=mongodb.so
```


（手元の環境ではextension_dirの設定ちゃんとしていないのでフルパスで）
（とにかく動く環境がほしいのだ）

```
extension=/opt/remi/php70/root/usr/lib64/php/modules/mongodb.so
```

* 確認

```sh:httpd再起動
service httpd restart
```

phpinfo()にmongodbの情報が表示されていればOK
http://192.168.33.10/

![Kobito.NF0P8U.png](https://qiita-image-store.s3.amazonaws.com/0/116449/0f1f6fb0-d8c8-0520-084f-ef4b9c9749bb.png "Kobito.NF0P8U.png")


## サンプルPGで動作確認

* サンプルPG
 
```php:sample.php
<?php
// DB接続
$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");

// Insert
$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['name' => '山田', 'address' => '東京']);
$manager->executeBulkWrite('test_db.test', $bulk);

// Select
//$filter = ['address' => ['$gt' => 'tokyo']]; // where句
$filter = [];
$options = [
  'projection' => ['_id' => 0],
  'sort' => ['_id' => -1],
];
$query = new MongoDB\Driver\Query($filter, $options);
$cursor = $manager->executeQuery('test_db.test', $query);

// Select 結果表示
foreach ($cursor as $document) {
  var_dump($document);
}
?>
```


* 実行結果

![Kobito.0QOZoP.png](https://qiita-image-store.s3.amazonaws.com/0/116449/df74fc26-00f1-3281-7b0f-2207dcb4920d.png "Kobito.0QOZoP.png")

* mongoDBの中身

![Kobito.sQm9Rb.png](https://qiita-image-store.s3.amazonaws.com/0/116449/6a84bc9a-0efa-b3fc-b027-2ecabf745433.png "Kobito.sQm9Rb.png")


* mongoDB Extensionのドキュメント

他の操作は以下を参考に実装していく

http://docs.php.net/manual/ja/book.mongodb.php


## 苦労したところ

php7のmongodb拡張は、インターネット上でよく紹介されている```pecl install mongo```ではインストールができなかった。
どうしたらいいんだと、ドキュメント読んだり、ぐぐったりで小一時間・・・
現状は自PCに検証環境がほしいだけだったので深追いはしなかった。
本開発するときになったら、そのときはちゃんとする。
また、旧バージョンとは関数名や使い方が変わっていたりで、コード例も読み替えが必要だったりした。
BigQueryで移動平均を計算したい

# 目的

ログデータの解析やら、株価の分析などで使える移動平均線を作りたいと思った。とりあえず、日が近いほど重みをつけたりなどをしない、単純移動平均としたい。
今回のケースの場合、1分ごとに1,000件以上のデータがあることを想定する。

# データ例

単純なテーブルを作って、データを投入する

| field | type | nullable |
| --- | --- | --- |
| timestamp | TIMESTAMP | false |
| response_time | INTEGER | false |

# レスポンスのイメージ

```json
[{
    "time": "2016-03-01 10:01:00Z",
    "response_time_1mins_avg": 60,
    "response_time_5mins_avg": 50,
    "response_time_10mins_avg": 40,
    "response_time_30mins_avg": 35,
    "response_time_1hours_avg": 30
},
{
    "time": "2016-03-01 10:00:00Z",
    "response_time_1mins_avg": 60,
    "response_time_5mins_avg": 50,
    "response_time_10mins_avg": 40,
    "response_time_30mins_avg": 35,
    "response_time_1hours_avg": 30
}]
```

# クエリを組み立てる

```sql
SELECT
-- 1分ごとに情報を分割するため秒の情報を無視するフィールドを作る
SEC_TO_TIMESTAMP(INTEGER(TIMESTAMP_TO_SEC(timestamp) / 60) * 60) AS time,
-- 1分ごとの平均
AVG(response_time) AS response_time_1mins_avg,
-- 5分ごとの移動平均を1分ごとの平均から出す
AVG(response_time_1mins_avg) OVER (ORDER BY time RANGE BETWEEN (60 * 5 * 1000000) PRECEDING AND CURRENT ROW) AS response_time_5mins_avg,
-- 10分ごと
AVG(response_time_1mins_avg) OVER (ORDER BY time RANGE BETWEEN (60 * 10 * 1000000) PRECEDING AND CURRENT ROW) AS response_time_10mins_avg,
-- 30分ごと
AVG(response_time_1mins_avg) OVER (ORDER BY time RANGE BETWEEN (60 * 30 * 1000000) PRECEDING AND CURRENT ROW) AS response_time_30mins_avg,
-- 1時間ごと
AVG(response_time_1mins_avg) OVER (ORDER BY time RANGE BETWEEN (60 * 60 * 1000000) PRECEDING AND CURRENT ROW) AS response_time_60mins_avg
FROM
table
GROUP BY time
ORDER BY time DESC
```

## OVER とは?

- https://cloud.google.com/bigquery/query-reference#windowfunctions 

Window Function というモノ。
通常の集計関数だと、GROUP によって集計されるが、特定の行数内にあるもので集計したいというときは、この機能を使うと良いようだ。
上記のクエリでは、time (1分ごとのもの) の今の時間を基準に、time の昇順で現在の行から特定の範囲(1分、10分など) で平均値を集計している。
Tensorflow - padding = VALID/SAMEの違いについて

# はじめに
Tensorflowの畳込み層やプーリング層のパラメータの一つpadding
これについて迷ったので備忘までに記述します

# 畳み込み、プーリング層からの出力テンソル次元数

例えば下記の様なコードがあったとします

```py:cnn.py
# 重みを標準偏差0.1の正規分布で初期化
def weight_variable(shape):
  initial = tf.truncated_normal(shape, stddev=0.1)
  return tf.Variable(initial)

# バイアスを標準偏差0.1の正規分布で初期化
def bias_variable(shape):
  initial = tf.constant(0.1, shape=shape)
  return tf.Variable(initial)

# 畳み込み層の作成
def conv2d(x, W):
  return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')

# プーリング層の作成
def max_pool_2x2(x):
  return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],
                        strides=[1, 2, 2, 1], padding='SAME')
# 入力を28x28x3に変形
x_images = tf.reshape(images_placeholder, [-1, 28, 28, 3])

# 畳み込み層1の作成
with tf.name_scope('conv1') as scope:
    W_conv1 = weight_variable([5, 5, 3, 32])
    b_conv1 = bias_variable([32])
    h_conv1 = tf.nn.relu(conv2d(x_images, W_conv1) + b_conv1)

# プーリング層1の作成
with tf.name_scope('pool1') as scope:
    h_pool1 = max_pool_2x2(h_conv1)

# 畳み込み層2の作成
with tf.name_scope('conv2') as scope:
    W_conv2 = weight_variable([5, 5, 32, 64])
    b_conv2 = bias_variable([64])
    h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)

# プーリング層2の作成
with tf.name_scope('pool2') as scope:
    h_pool2 = max_pool_2x2(h_conv2)
```

このようなネットワーク定義があり、仮にゼロパディングをしていないとすると、以下の様な計算を経て、最終出力が得られると考えられます

```
※計算式: (inputのx(y)軸の要素数 - filter(weight)のx(y)軸の要素数) / strideの要素数 + 1
1. 入力イメージ => 28x28x3
2. conv1 => (28 - 5) / 1 + 1 = 24 
3. pool1 => (24 - 2) / 2 + 1 = 12 
4. conv2 => (12 - 5) / 1 + 1 = 8
5. pool2 => (8 - 2) / 2 + 1 = 4 =====> よって  4x4x64 のテンソルが得られる
```

しかし、このコードでは最終的に7x7x64の結果が得られています
これが「padding='SAME'」というパラメータの役割ですね
実際の計算式は以下のとおりとなっています

```
※計算式: (inputのx(y)軸の要素数) / strideの要素数
1. 入力イメージ => 28x28x3
2. conv1 => (28) / 1 = 28
3. pool1 => (28) / 2 = 14
4. conv2 => (14) / 1 = 14
5. pool2 => (14) / 2 = 7 =====> よって 7x7x64 のテンソルが得られる
```

つまりフィルタ分を補うようにゼロパディングされているというわけです

逆に「padding='VALID'」というパラメータでは以下の様な計算をすると考えられます

```
※計算式: (inputのx(y)軸の要素数 - filter(weight)のx(y)軸の要素数 + 1) / strideの要素数
1. 入力イメージ => 28x28x3
2. conv1 => (28 - 5 + 1) / 1 = 24 
3. pool1 => (24 - 2 + 1) / 2 = 11.5 => 12 (ceil処理のため)
4. conv2 => (12 - 5 + 1) / 1  = 8
5. pool2 => (8 - 2 + 1) / 2 = 3.5 => 4 =====> よって  4x4x64 のテンソルが得られる
```

#マニュアル
具体的にどういう計算式になるかというのは以下に記載しています
https://www.tensorflow.org/versions/r0.7/api_docs/python/nn.html#convolution

padding='SAME'

```
out_height = ceil(float(in_height) / float(strides[1]))
out_width  = ceil(float(in_width) / float(strides[2]))
```

padding='VALID'

```
out_height = ceil(float(in_height - filter_height + 1) / float(strides[1]))
out_width  = ceil(float(in_width - filter_width + 1) / float(strides[2]))
```

# 結論
全結合層においては最終プーリング層からの次元数を指定する必要があるので、どう計算されているかが非常に重要になります
まあSAMEを指定すれば単純にstrideの割り算で済むので、こちらを使ってあげればいいのかなあというざっくりとした感想ですかね
SwiftのAnyにOptionalを突っ込むと取り出せなくなる話

なんとなくHackerTackleで喋った内容について思い出したので、共有します。
端的に述べると、引数の型がAnyの場合にOptionalな値を突っ込むと死ぬよって話です。

# 結論
Any?を使いましょう


# まずはじめに
任意の型からStringを取り出す関数`a`を考えます。

```swift
func a(value: Any) -> String? {
    if let string = value as? String {
        return string
    }
    return nil
}
```

`value`が`String`ならそれを返す。違えば`nil`。簡単ですね。
ではこの`a`に次の`b`を引数として与えましょう。

```swift
let b: String? = "text"
a(b) // == nil
```

なぜでしょうか？`b`には確かに"text"を入れたはずです。

# Optionalはただのnil許可ではない
まず`Optional`はnil許可ではなく、構造です。
`Optional`の宣言を見ればわかるとおり、enumで表現された構造です。
[swift/Optional.swift at master · apple/swift](https://github.com/apple/swift/blob/master/stdlib/public/core/Optional.swift#L15-L21)
`a`に渡った時点で、`b`はよろしく解釈されて生の`String`、若しくは`nil`として`Any`にラップされるわけではなく、`Optional<String>`として`Any`にラップされます。

# asは単なるキャストではない
Swiftにおけるキャストであるところの`as`ですが、これは単純なキャストではありません。
型によって、振る舞いが変わります。
左項が単純な型の場合は、キャストします。その型が合致するとキャストに成功します。
左項が`Optional`の場合は、`Optional`が内包する型に対してキャストします。`Some(Wrapped)`であり、かつ`Wrapped`が合致するとキャストに成功します。
管見の及ぶ範囲で`as`の振る舞いはもう一種類凶悪なのがありますが、それについては割愛します。また後日紹介します。

# Anyに隠蔽されたOptionalを考える
では、この`Optional`の有無による振る舞いはいつ決まるのでしょうか？
答えはコンパイル時です。従って、`Any`に`Optional`が隠蔽されていることを`as`は知りません。
なるほど`Any`に対して合致する型のみキャストが成功するわけで、この場合`Any`に隠蔽された型は`Optional<String>`ですから、`String`へのキャストは成功しません。
さっきの`a`を、`Optional<String>`へのキャストに書き換えれば動作しそうです。しかし、`Optional`へのキャストを直接書くと、SorceKitは大激怒です。困った。

```swift
if let string = value as? String? { // Cannot downcast from 'Any' (aka 'protocol<>') to a more optional type 'String?'
    return string
}
```

こういう場合は、一旦Generics funcに型を渡して、SorceKitに認識させないテクニックが有効です。

```swift
func cast<A>(value: Any, type: A.Type) -> A? {
    return value as? A
}
if let string = cast(value, type: Optional<String>.self) {
    return string // == "text"
}
```

動きましたね。値も無事返ってきました。

# 暗黙の型変換
しかし釈然としません。こんな面倒臭いプログラムは書きたくない。
さて、今日のSwiftにおいては、幾つかの暗黙の型変換が存在します。例えば、任意の型`A`は、スーパーセットである`B`に`as`無しで型変換が可能です。
特に`Optional`に関しては幾つかの暗黙の型変換があるので、覚えておくと役に立ちます。

```
1. A -> B => A -> B?
2. A? -> B => A -> B
3. A? => B? (A is a B)
```

1と2は、クロージャの型の一部が`Optional`へ変換されるということです。これについてはまた別の機会に。
重要なのは3で、`A`の`Optional`は、スーパーセットである`B`の`Optional`へ暗黙の型変換が可能なのです。
さて、`Any`は任意のプロトコルなので、全ての型のスーパーセットでありますから、任意の`Optional`は、`Optional<Any>`へ暗黙の型変換が可能になります。

# 引数をAny?にする
結論に書いたように、引数を`Any?`とするのが正解です。
`Optional`の暗黙的型変換、`Optional`における`as`の振る舞いの両者を踏まえ、`a`は思い通りに動くようになりました。めでたしめでたし。

```swift
func a(value: Any?) -> String? {
    if let string = value as? String {
        return string
    }
    return nil
}
```

勿論これは、引数が`Any`ではなくGenericsでも有効です。
Genericsの型推論が働く前に、Optionalの暗黙の型変換が働きます。

# TODO
図は後で差し込むかもしれません。Optionalのキャストのあたり。
Heroku をはじめよう！ 


heroku は paasのサービスです。

git で push するだけで簡単にアプリケーションをデプロイすることが出来ます。

## Heroku 開発の準備　

1. アカウントの作成

https://signup.heroku.com/

Herokuの利用は基本無料ですが、addon などの機能を使用する上ではクレジットカードの登録が必要になります。

2. heroku toolbelt のインストール

https://toolbelt.heroku.com/

heroku の便利な機能を使用するには heroku toolbelt と呼ばれるツールが必須になってきます。

適宜インストールを行い、コンソールでインストールを確認してください。

````
$ heroku version
heroku-toolbelt/3.42.39 (x86_64-darwin10.8.0) ruby/1.9.3
````

## アプリケーションの作成

準備ができたら管理画面にログインしてアプリケーションを作成します。
　
「＋」のボタンからアプリケーションを作成して下さい(「Create new app」)。


## アプリケーションの開始

既存のheroku appをダウンロードする場合は、

````
$ heroku git:clone -a {app_name}
````

既存のリポジトリをherokuで利用する場合には、

````
$ heroku git:remote -a {app_name}
````

## デプロイ

git でpushするだけで簡単にデプロイ出来ます。

````
$ git push heroku master
````
Spring Boot解説第1回(開発環境説明)

はじめまして！株式会社情創 技術開発局の@YAKINIKUです！

この度、情創開発ブログの担当となりました。
このブログではSpring Bootを使用したWebアプリケーション開発について解説していきます！
Spring BootとはJavaのフレームワークSpringを統合し
簡単に使えることを目的とした新しいフレームワークのことです。


今回は初めてなのでまずは実際に使用する開発環境のリストを掲載します。

#実行環境
開発中　　⇒　組込みTomcat
本番運用　⇒　Tomcat8
#Java
JAVA 1.8.0_60
#DB
postgres 9.4.5-3
#ビルドシステム
gradle 2.10
#ソース管理
Gitbucket 3.9
#Spring Boot
springBootVersion 1.3.1.RELEASE
#IDE
pleiades-e4.5-java-jre_20151002
#プラグイン
Spring Tool Suite (STS) for Eclipse 3.7.2 RELEASE
	Gradle IDE Pack 3.7.x + 1.0.x
	MyBatipse1.0.14
	lombok 1.16.6

#ライブラリ
org.springframework:springloaded:1.2.1.RELEASE
	org.springframework.boot:spring-boot-gradle-plugin:1.3.1.RELEASE
	org.springframework.boot:spring-boot-starter-web:1.3.1.RELEASE
	org.springframework.boot:spring-boot-starter-thymeleaf:1.3.1.RELEASE
	org.springframework.boot:spring-boot-starter-jdbc:1.3.1.RELEASE
	org.springframework.boot:spring-boot-starter-aop:1.3.1.RELEASE
	org.springframework.boot:spring-boot-starter-logging:1.3.1.RELEASE
	org.springframework.boot:spring-boot-starter-actuator:1.3.1.RELEASE
	org.springframework.boot:spring-boot-starter-security:1.3.1.RELEASE
	org.springframework.boot:spring-boot-starter-velocity:1.3.1.RELEASE
	org.springframework.boot:spring-boot-starter-mail:1.3.1.RELEASEl
	net.sourceforge.nekohtml:nekohtml:1.9.22
	org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16
	org.postgresql:postgresql:9.4-1206-jdbc41
	org.mybatis:mybatis:3.3.0
	org.mybatis:mybatis-spring:1.2.3
	com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.6.5
	com.google.guava:guava:18.0
	org.thymeleaf.extras:thymeleaf-extras-java8time:2.1.0.RELEASE
	org.thymeleaf.extras:thymeleaf-extras-springsecurity4:2.1.2.RELEASE
	com.univocity:univocity-parsers:1.5.6
	com.sun.mail:javax.mail:1.5.2

使用している開発環境はこのようになっていますが、
これだけ載せられても訳が分からないと思いますので
第二回からはこの開発環境の構築について解説していきます。

それでは皆様、これから宜しくお願いします！
Nutanix Community Edition - Version ce-2016.03.03-stable リリース

Nutanix Community Editionの最新版『Version ce-2016.03.03-stable』がリリースされました！
今回のリリースは、商用版における Acropolis Base Software 4.6 がベースとなっています。

ダウンロードする方は、下記リンク先から右側の[Download Software]をクリックしてください。（要ログイン）
http://next.nutanix.com/t5/Nutanix-Community-Edition/ct-p/Nutanix-Community-Edition

翻訳や補足は別途行いたいと思いますが取り急ぎ、新機能一覧を転載します。
# **新機能一覧** 
- **Acropolis File Services**  
Provides file server capability within a Nutanix AHV cluster, as one or more network-attached VMs, to form a virtual file server.
- **Acropolis App Mobility Fabric - Windows or Linux Guest Customization**    
Customize or clone Windows or Linux guest VMs hosted by AHV. Includes automated OS installation and custom ISOs by using sysprep (Windows) or cloudinit (Linux).
- **Acropolis Drivers for OpenStack**  
These drivers facilitate consuming the Nutanix Acropolis infrastructure as a cloud service or for use in a data center. For example, an OpenStack implementation might require using features such as single sign-on, orchestration, role based access control, and so on. Drivers include Acropolis compute, image, volume, and network drivers.
- **Volume Group Support Improved**  
REST API and intuitive Prism web console support has been added, as well as including Acropolis command line support.
- **Guest VM VLAN Trunking**  
AHV supports guest VM VLAN tagging, where the tag passes through a single port from the physical network to a VM. It allows the VLAN ID tags to be included in an Ethernet packet to be passed to the guest VM. Guest VM operating systems can use this feature to enable Virtual Guest Tagging (VGT) and simulate multiple virtual NICs.
- **Nutanix Guest Tools**  
Nutanix Guest Agent (NGA) service. Communicates with the Nutanix Controller VM.
File Level Restore (FLR) CLI. Performs self-service file-level recovery from the VM snapshots.
VSS requestor and hardware provider for Windows VMs. Enables application-consistent snapshots of Windows VMs.
Application-consistent snapshot for Linux VMs. Supports application-consistent snapshots for Linux VMs by running specific scripts on VM quiesce.
- **Self-Service Restore**  
Self-service restore allows a user to restore a file within a virtual machine from the Nutanix protected snapshot with minimal Nutanix administrator intervention. To perform these operations, you need to install and configure NGT on the VMs.
- **AHV Security Updates**  
New users or anyone performing a fresh install will already have an updated glibc and openssl packages. Existing users should "yum update" on the host and update at least these two packages, preferably everything that yum will offer updates for.
 
Prism Central does not currently operate with Community Edition. When the next CE release occurs, Prism Central will allow registration of CE clusters and support the full functionality.
Zoteroで日本語文献のまともなBibTeX作成

## この記事で扱うこと

この記事では、Zoteroを用いて**日本語文献のまともなBibTeXキー作成**を行う方法を紹介する。具体的には、LaTeXで文章を書く際に挿入しやすいBibTeXを作ることができる**zotero-better-bibtex**について日本語のドキュメントがなかったので、（自分のためのメモを兼ねて）紹介する。

## Zoteroについて

Zoteroはオープンソースの文献管理ソフトである。なぜ、Zoteroを使うかというと以下のことが可能であるため。

* JstageやJSTORなどの論文サイトで書誌情報を簡単にかつ正確にインポートできる
* 書誌情報だけでなくPDFも一発で保存してくれる
* 書誌情報と共にPDF・その他のファイルを一元管理することができる
* メモを添付することができるので自分で作った論文要約の蓄積ができる
* rsyncを使えば、文献の情報を複数のPCで完全に同期できる（**公式HPでは非推奨の方法として紹介されている**）
* **BibTeXでエクスポートできる**
* 以上のことが無料でできる

このようにZoteroは機能が盛りだくさんであり、文献管理ソフトの中でも使いやすい方だと思う。

## 日本語のBibTeXエクスポートの問題

**ただし、Zoteroでは日本語文献を扱うと次のことが起きる。**

* BibTeXキーがエクスポートするごとに異なる
→ZoteroがBibTeXキーを毎回生成するため

* 生成されるBibTeXキーがわけわからないことになっている
* yomiフィールドが出力できない

例えば、こんな感じになる

```bibtex
@book{_latex2_2013,
	edition = {改訂第6版},
	title = {{LaTeX}2ε文書作成入門},
	url = {http://ci.nii.ac.jp/ncid/BB13745762},
	abstract = {LaTeX2ε美文書作成入門 奥村晴彦, 黒木裕介著 技術評論社, 2013.11 改訂第6版},
	urldate = {2016-03-08},
	publisher = {技術評論社},
	author = {奥村, 晴彦 and 黒木, 裕介},
	year = {2013}
}
```

今までは、出力したあとに手作業でBibTeXを変更する必要があった。
しかし、次の方法を使えば、その地獄から開放される！！

## 解決方法

### 1. zotero-better-bibtexのインストール

解決するには[zotero-better-bibtex](https://github.com/ZotPlus/zotero-better-bibtex)を用いる。
インストールは`Installation`→`zotero-better-bibtex-*.*.*.xpi`からできる。

### 2. BibTeXキー・yomiフィールドの追加・編集

インストールするとZoteroの書誌情報の項目にBibTeXキーが現れる。

![Screenshot from 2016-03-08 19:17:24.png](https://qiita-image-store.s3.amazonaws.com/0/89329/a0a7534d-e6bf-d6c4-bdc0-eff07a8139dd.png)


これを編集するには下にある`その他`の項目を編集すればよい。

**編集前**
![zotero-bibtex-sample2.png](https://qiita-image-store.s3.amazonaws.com/0/89329/40bcdd9b-2ae1-6185-213b-abab44e76f2b.png)

**編集後**
![Screenshot from 2016-03-08 19:01:24.png](https://qiita-image-store.s3.amazonaws.com/0/89329/8e8a1b06-2964-89b9-87c9-a1487fe50dad.png)

### 3. エクスポートする

あとは`BetterBibLaTeX`もしくは`BetterBibTeX`でエクスポートする。
ちなみに、`Keep updated`を使用すれば、コレクションが変更された時、自動でアップデートしてくれる。

![zotero-bibtex-sample4.png](https://qiita-image-store.s3.amazonaws.com/0/89329/3622f578-6965-d667-6efb-fbb4b6e7bb3f.png)

**出力結果（BetterBibLaTeX）**

```bibtex
@book{okumura_kuroki_2003,
  edition = {改訂第6版},
  title = {{{LaTeX2ε美文書作成入門}}},
  url = {http://ci.nii.ac.jp/ncid/BB13745762},
  abstract = {LaTeX2ε美文書作成入門 奥村晴彦, 黒木裕介著 技術評論社, 2013.11 改訂第6版},
  timestamp = {2016-03-08T09:50:42Z},
  publisher = {{技術評論社}},
  author = {奥村, 晴彦 and 黒木, 裕介},
  urldate = {2016-03-08},
  date = {2013},
  yomi = {okumura, haruhiko and kuroki, yuhsuke}
}
```

**出力結果（BetterBibTeX）**

```bibtex
@book{_latex2_2013,
  edition = {改訂第6版},
  title = {{{LaTeX2\ensuremath{\epsilon}美文書作成入門}}},
  abstract = {LaTeX2\ensuremath{\epsilon}美文書作成入門 奥村晴彦, 黒木裕介著 技術評論社, 2013.11 改訂第6版},
  timestamp = {2016-03-08T10:17:19Z},
  urldate = {2016-03-08},
  publisher = {{技術評論社}},
  author = {奥村, 晴彦 and 黒木, 裕介},
  year = {2013},
  yomi = {okumura, haruhiko and kuroki, yuhsuke}
}
```

## おわりに

本記事で紹介したように[zotero-better-bibtex](https://github.com/ZotPlus/zotero-better-bibtex)を用いることによって、Zoteroでまともな日本語文献のBibTeX作成ができる。その他にもBibTeXを作成する上で便利な機能が多く含まれているので、ぜひ皆さんも使ってみてほしい。
最終更新者の一覧表示

```vbnet
Sub 最終更新者の一覧表示()    
    Set ms = ActiveWorkbook.Sheets("sheet1")
    For i = 2 To 644
        Application.ScreenUpdating = False
        file = ms.Cells(i, 1)
        Set wb = Workbooks.Open(file)
        ms.Cells(i, 2) = wb.BuiltinDocumentProperties.Item(7)
        wb.Close
        Set wb = Nothing
        Application.ScreenUpdating = True
    Next i
End Sub
```
Phoenixのapiでsessionを使う時に(ArgumentError) session not fetched, call fetch_session/2が出た時の対処

# 環境
OS X Yosemite 10.10.5
Phoneix 1.1.4
Erlang OTP 18 erts-7.2.1
Elixir 1.2.2

# 原因
デフォルトでapiのパイプライン上にsessionをfetchする部分が無い事が原因

# 対処
```ex:web/router.ex
pipeline :api do
  plug :accepts, ["json"]
  plug :fetch_session # ←これを加える
end
```
※ 2019-02-20追記
この編集を書いてる時点でのファイルパスは**lib/app_name_web/router.ex**です

# 雑記
sessionがfetchできねぇ！fetch_session/2をcallしてくれ！って言われて???ってなってたので、fetch_sessionとはなんぞやから始まった
Implementing functional languages を頑張って読む.13日目

# 13日目

やるきがでない

## 59ページ目
ただコピペして2.3.5を終わらせた.文章を理解していないので明日以降読む.
instantiateConstrとかLetとかの型宣言がないのはいいのだろうか
ねむい

```hs
scStep :: TiState -> Name -> [Name] -> CoreExpr -> TiState
scStep (stack, dump, heap, globals, stats) sc_name arg_names body = (new_stack, dump, new_heap, globals, stats)
    where
    new_stack = result_addr : (drop (length arg_names+1) stack)
    (new_heap, result_addr) = instantiate body heap env
    env = arg_bindings ++ globals
    arg_bindings = zip2 arg_names (getargs heap stack)

-- now getargs since getArgs conflicts with Gofer standard.prelude
getargs :: TiHeap -> TiStack -> [Addr]
getargs heap (sc:stack) = map get_arg stack
    where get_arg addr = arg where (NAp fun arg) = hLookup heap addr

instantiate :: CoreExpr -- Body of supercombinator
    -> TiHeap -- Heap before instantiation
    -> ASSOC Name Addr -- Association of names to addresses
    -> (TiHeap, Addr) -- Heap after instantiation, and
-- address of root of instance

instantiate (ENum n) heap env = hAlloc heap (NNum n)
instantiate (EAp e1 e2) heap env = hAlloc heap2 (NAp a1 a2)
    where
    (heap1, a1) = instantiate e1 heap env
    (heap2, a2) = instantiate e2 heap1 env
instantiate (EVar v) heap env = (heap, aLookup env v (error ("Undefined name " ++ show v)))
instantiate (EConstr tag arity) heap env = instantiateConstr tag arity heap env
instantiate (ELet isrec defs body) heap env = instantiateLet isrec defs body heap env
instantiate (ECase e alts) heap env = error "Can’t instantiate case exprs"

instantiateConstr tag arity heap env = error "Can’t instantiate constructors yet"
instantiateLet isrec defs body heap env = error "Can’t instantiate let(rec)s yet"
```

**2.3.5のコードをコピペした**
Git | 現在のブランチルートからの差分を表示する

.gitconfig にエイリアスを登録する。

```bash:.gitconfig
[alias]
  branch-root = merge-base master HEAD

  remember = !git diff $(git branch-root)
```

これにより。 `$ git remember` と打つだけで。
**現在のブランチルートからの差分** を表示してくれるようになる。

# 環境

- git version 2.3.8 (Apple Git-58)



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
2TB以上のHDDをUbuntuで認識

fdsiskだと2TB以上のHDDをフォーマットできないらしい。
なので、Partedというコマンドを利用してフォーマットしてみた。

## 状況把握

```
# sudo parted -l

モデル: ATA WDC WD30EZRZ-00Z (scsi)
ディスク /dev/sdc: 3001GB
セクタサイズ (論理/物理): 512B/4096B
パーティションテーブル: msdos

番号  開始    終了    サイズ  ファイルシステム  名前  フラグ
 1    17.4kB  3001GB  3001GB
```

## パーティションの作成

GPT形式へ変更(2TB以上認識するために)

```
(parted) mklabel                                                          
新しいディスクラベル? gpt                                                 
警告: いま存在している /dev/sdb のディスクラベルは破壊され、このディスクの全データが失われます。続行しますか？
はい(Y)/Yes/いいえ(N)/No? y
```

パーティションを下記コマンドにて作成

```
# sudo parted /dev/sdc

GNU Parted 2.3
/dev/sdc を使用
GNU Parted へようこそ！ コマンド一覧を見るには 'help' と入力してください。
(parted) mklabel
新しいディスクラベル? gpt
警告: いま存在している /dev/sdc のディスクラベルは破壊され、このディスクの全データが失われます。続行しますか？
はい(Y)/Yes/いいえ(N)/No? Y
(parted) mkpart
パーティションの名前?  []? disk2
ファイルシステムの種類?  [ext2]? ext4
開始? 0
終了? 3001GB
警告: 操作の結果できるパーティションはアライメントが正しくないためにパフォーマンスがでません。
無視(I)/Ignore/取消(C)/Cancel? I
(parted) quit
```

## フォーマット

```
sudo mkfs.ext4 /dev/sdc1
```

＊必要であれば*/etc/fstab*に設定を記載
JavascriptサイトのためのGooglebot対策ガイダンス

[An update (March 2016) on the current state & recommendations for JavaScript sites / Progressive Web Apps [1] in Google Search.](https://plus.google.com/+JohnMueller/posts/LT4fU7kFB8W)
の話。目新しい情報はないかもしれませんが、興味ある方は一読すると良いかもしれません。以下は抄訳ではなく、ただのメモです。なお、 https://twitter.com/addyosmani/status/705921670096228352 や https://twitter.com/paul_irish/status/706985006426562560 経由で知りました。

- Don't cloak to Googlebot. Use "feature detection" & "progressive enhancement" 
Googlebot は現時点では Service Worker、Fetch API、Promises、requestAnimationFrameなどをサポートしていない。なので、それらの技術を使うときは、polyfill入れたりfeature detectionなりしてfallbackしたりして、Googlebotでも表示できるようにがんばるといい。

-  Use rel=canonical 
うん

- Avoid the AJAX-Crawling scheme on new sites.
[Ajax Crawling](https://developers.google.com/webmasters/ajax-crawling/docs/learn-more) は、Single Page Application で生成したページをGoogleBotが表示できていなかったので、その対策として提案されていたもの。でも今ではGooglebotもJavascriptを処理できるので、deprecate([Deprecating our AJAX crawling scheme](https://googlewebmastercentral.blogspot.jp/2015/10/deprecating-our-ajax-crawling-scheme.html))という扱いになっている。

- Avoid using "#" in URLs (outside of "#!"). Googlebot rarely indexes URLs with "#" in them. Use "normal" URLs with path/filename/query-parameters instead, consider using the History API for navigation.

- Use Search Console's Fetch and Render tool
Search Console の「Fetch as Google」を使うと、Googlebotでのどうレンダリングされるかを見ることができます（ついでに「インデックスに送信」ボタンを押すとGoogleの検索インデックスにかなり早く登録される）。

- Ensure that all required resources (including JavaScript files / frameworks, server responses, 3rd-party APIs, etc) aren't blocked by robots.txt.
現在のGooglebotはJavascriptも処理できるので、ブロックする必要はないと。

- Limit the number of embedded resources, in particular the number of JavaScript files and server responses required to render your page.

- Google supports the use of JavaScript to provide titles, description & robots meta tags, structured data, and other meta-data.
[AMP(Accelerated Mobile Pages Project)](https://www.ampproject.org/)は、Static Contentを素早くレンダリングする方法らしいんだけど、imgタグを[amp-img](https://www.ampproject.org/docs/get_started/create/include_image.html)に置き換えないといけないんだけど、amp-imgはwidthとheightが必須だから、、うーん、、と思ったところで鉱物と生物の中間の生命体になりそうだったので考えるのをやめた。

- Finally, keep in mind that other search engines and web services accessing your content might not support JavaScript at all, or might support a different subset. 
Bing、使っている人いるのかな。

あと、検索エンジンのHTML5のサポートどうなってるのかについて https://twitter.com/Paul_Kinlan/status/706842917743144960 でツイートしていて、https://twitter.com/html5test/status/706856174021419008 https://twitter.com/html5test/status/706855872316755968 https://twitter.com/html5test/status/706855648185679872 などが紹介されてました。
dashDB のマニュアル

dashDBのマニュアルは以下のURLより参照する事ができます。
（現時点では英語のみ）

IBM dashDB cloud data warehouse documentation
http://www.ibm.com/support/knowledgecenter/SS6NHC/com.ibm.swg.im.dashdb.kc.doc/welcome.html


また、dashDB　のWhat's New も定期的に更新されているみたいです。
見てみるとほぼ毎月何かの新機能が追加されているみたいです。

http://ibm.com/support/docview.wss?uid=swg21961758


ちなみに2016年2月のWhat's Newは
>Update Feb 17, 2016
SOC 2 Type 1 compliance
dashDB is now SOC 2 Type 1 compliant. 

新たにセキュリティ監査報告のSOC2 Type1を取得。
で、何がすごいのはこれから勉強するとして、利用する側として厳しいセキュリティ基準を満たしているのは安心するものです。

>Row and column access control (RCAC)
Row and column access control (RCAC) is an extra layer of data security for the dashDB™ database in the Enterprise plan. For more information, see: Row and column access control (RCAC) overview.

行と列のアクセスコントロールの機能がdashDbでも使えるようになったみたいです。
これができると、ユーザーに応じて表の特定の列を参照不可にしたり、簡単なマスキングの機能を使ったり出来るようになります。
ただこれEnterprise Planって書いてあるのでBluemix上のクレジットカード課金のユーザーだと利用できなくって、別途契約が必要な専用環境のユーザーのみみたいですね。。。

RCACとは何？とかどうやって使うのかはこちらのリンク先の資料が役に立つと思います。
http://ibm.com/developerworks/jp/data/products/db2/db2_10-workshop/pdf/06_security.pdf


>Access dashDB programatically using a RESTful API

>Start using the IBM dashDB REST API to load and analyze your data without launching your browser. You can use the API to load delimited data in multiple .CSV, .XLS, and .XLSX files into dashDB, and monitor the status of load jobs if you’re loading a lot of data. You can also analyze data using your custom R scripts or ones you’ve created in the RStudio development environment integrated with dashDB.

ちょっとまだCRUD操作とまではいかないですが、データのロードやRスクリプトの実行が出来るようになったみたいです。
[ServersMan@VPS]CentOS7でServersMan@Diskを使う


レンタルVPSとしては、お安いで有名のServersMan@VPS。

CentOS7でセットアップし、バックアップ用にServersMan@Diskをマウントして使おうとしましたが、いろいろと躓いたので、ここに書いておきます。

# CentOS7用クライアントのインストール方法が公開されていない！
ServersMan@VPSでCentOS7が利用できるようになり、1年以上経ちますが、
ServersMan@Diskのインストール方法が公開されていません。(2016/03/07現在)
（バックアップを取るには「ServersMan@Disk」を契約するように書かれているのに…。）
[ServersMan@Diskのマウント手順（CentOS版） | マニュアル](http://dream.jp/vps/support/manual/mnl_disk_01.html)

最初、公開されているCentOS6の手順でやってみたところ、サーバ再起動後に接続できなくなってしまいました…。

サポートに問い合わせて、ちゃんとした手順を入手したので、公開しておきます。
（サポートの方で、公式サイトでの公開を進めているそうですが、未だ公開されていません。）

# CentOS7でのServersMan@Diskのマウント方法
## 1.ダウンロード

```bash:コマンド
[root@dti ~]# wget http://vpsrepo.ub-freebit.net/smdisk/smdisk-1.2-22.x86_64.centos7.tar.gz
```

## 2.ファイル確認

```bash:コマンド
[root@dti ~]# md5sum smdisk-1.2-22.x86_64.centos7.tar.gz
d4e533bea7ae4db1de83fc7296726cd2  smdisk-1.2-22.x86_64.centos7.tar.gz
```

## 3.解凍

```bash:コマンド
[root@dti ~]# tar zxvf smdisk-1.2-22.x86_64.centos7.tar.gz

[root@dti ~]# ll smdisk-1.2-22.x86_64.centos7
合計 256
-rw-r--r-- 1 root root 86392 10月 28  2014 fuse-2.9.2-5.el7.x86_64.rpm
-rw-r--r-- 1 root root 94804 10月 28  2014 fuse-libs-2.9.2-5.el7.x86_64.rpm
-rw-r--r-- 1 root root 61071  7月 16  2014 smdisk-1.2-22.x86_64.rpm
```

## 4.インストール

```bash:コマンド
[root@dti ~]# rpm -ivh smdisk-1.2-22.x86_64.centos7/fuse-2.9.2-5.el7.x86_64.rpm

[root@dti ~]# rpm -ivh smdisk-1.2-22.x86_64.centos7/fuse-libs-2.9.2-5.el7.x86_64.rpm

[root@dti ~]# rpm -ivh smdisk-1.2-22.x86_64.centos7/smdisk-1.2-22.x86_64.rpm
```

## 5.マウントポイント作成

```bash:コマンド
[root@dti ~]# mkdir /mnt/smdisk
```

## 6.fstabファイルの編集

```bash:コマンド
[root@dti ~]# vi /etc/fstab
```

```bash:/etc/fstab
#最終行に追加
/usr/sbin/smdisk /mnt/smdisk fuse _netdev,allow_other,umask=0000,username=(ServersMan@Disk用アカウント名),password=(ServersMan@Disk用パスワード),ope_src=(ホスト名、または任意) 0 0
```
**:bangbang:注意:bangbang:：「_netdev」が抜けると、再起動後、ログインできなくなります！**

## 7.マウント実施

```bash:コマンド
[root@dti ~]# mount /mnt/smdisk
```
エラーが出た場合は、アカウント名かパスワードを見直してください。

## 8.設定結果の確認

```bash:コマンド
[root@dti ~]# df -h
・・・・・
・・・・・
serversman@disk    10G  5.0G  5.1G   50% /mnt/smdisk
```

# 最後に
「6.fstabファイルの編集」で設定をミスると、最悪、再起動後サーバに接続できなくなります。
サポートに問い合わせても、「初期化してください」と言われるので、お気をつけ下さい。
（頼み込めば1回ぐらいは対応していただけるかも知れません。）
Git | 一括で commit する

コマンドは次のとおり。

`$ git add .`
`$ git commit`

git ではコミットを作る前に、いちど「ステージング」という作業が必要だ。
なので「いったんすべてを add してから」「普通に commit する」というのが解だ。

前記のコマンドでは **「カレントディレクトリ以下の全変更」** を対象に、新しいコミットを作ることが出来る。

# コマンド一発

エイリアスを登録すれば。コマンド一個ですべて commit できる。

```bash:.gitconfig
[alias]
  commit-force = !git add . && git commit
  cmf = !git commit-force
```

以下をコマンドするだけ。

```
git commit-fource
```

短縮名だともっと早い。

```
git cmf
```

# 環境

- git version 2.3.8 (Apple Git-58)



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
ChefでCentOS 6.7 + nodejs + npmを設置する。


## 関連記事

* [Chefを使ってより効率的にサーバを管理しよう。まずは用語から](http://qiita.com/park-jh/items/9e2e358d2e82a7736cf7)
* [Berkshelfを使って外部クックブックをノードに適用する。](http://qiita.com/park-jh/items/751464a4cc6d8abcd6fd)
* [クックブックを作成してノードに適用する。- その１](http://qiita.com/park-jh/items/8d641809850b5930d39c)
* [クックブックを作成してノードに適用する。- その２](http://qiita.com/park-jh/items/88237342cfd202e6893f)
* [ChefでCentOS 6.7 + rbenv + ruby 2.3.0の環境を構築する。](http://qiita.com/park-jh/items/f249a18793899f2eb4bf)
* [ChefでCentOS 6.7 + Vim 7.4 + luaを設置する。](http://qiita.com/park-jh/items/371d179d5e71618a1f14)
* [ChefでVimプラグインマネージャーNeoBundleを設置する。](http://qiita.com/park-jh/items/ec09e40f9b4aaf9fedfd)
* [Chefのレシピをデバッグしてみよう。](http://qiita.com/park-jh/items/96a076e167327a6a5a39)
* [ChefでCentOS 6.7 + nginxを設置する。- 外部クックブック](http://qiita.com/park-jh/items/3013c49494e524fced31)
* [ChefでCentOS 6.7 + nginxを設置する。- カスタムクックブック](http://qiita.com/park-jh/items/43451cea21ee1724c24b)
* ChefでCentOS 6.7 + nodejs + npmを設置する。
* [ChefでVimプラグインマネージャーvim-plugを設置する。](http://qiita.com/park-jh/items/ba27ad412ce9926fd94d)
* [ohaiのカスタムプラグインを作ってみよう。](http://qiita.com/park-jh/items/34be55abb7c63b36cddb)
* [Chef SoloからChef Zeroへ](http://qiita.com/park-jh/items/44c249c9de768c53b423)
* [Chefでnginx + php(php-fpm) + mariadb + wordpressを設置する。](http://qiita.com/park-jh/items/7515e47dddc38257a454)

## rubyからjavascriptコードを実行

* railsではassets precompileなどのjavascriptの実行のためにtherubyracerというgemを提供している。
* しかし、therubyracerはメモリ使用量が大きくてHerokuでは非推奨となっている。
* therubyracerの代わりにnodejsを設置することを推奨する。
* どうせphantomjsを設置するためにはnodejsは必要だ。

## クックブックの作成

* Chef社のSupermarketであるnodejsをみたが、簡単に設置することだけなのに余計に複雑だったので自作する。

```sh
% bin/knife cookbook create nodejs -o site-cookbooks
```

## レシピの作成

* nodeはyumで設置しても構わないが、npmはsourceで設置することを推奨する。
* yumで提供するnpmは余計なpackageがたくさん設置されるし古い。
* site-cookbooks/nodejs/recipes/default.rb

```ruby
package "nodejs" do
  action :install
end

execute "install npm" do
  command "curl -L https://www.npmjs.com/install.sh | sh"
  not_if "which npm"
end

%w(phantomjs).each do |pkg|
  execute "npm install #{pkg}" do
    command "npm -g install #{pkg}"
    not_if "npm -g ls --depth=0 | grep #{pkg}"
  end
end
```

## 実行結果

```sh
% bin/knife node run_list add dev 'recipe[nodejs]' -z
% bin/knife solo cook dev -E development

... snip ...

Recipe: nodejs::default
  * yum_package[nodejs] action install
    - install version 0.10.42-4.el6 of package nodejs
  * execute[install npm] action run
    - execute curl -L https://www.npmjs.com/install.sh | sh
  * execute[npm install phantomjs] action run
    - execute npm -g install phantomjs
```

## ノード上で確認

```sh
% ssh dev
$ node -v
v0.10.42
$ npm -v
3.7.5
$ npm -g ls --depth=0
/usr/lib
├── npm@3.7.5
└── phantomjs@2.1.3

$ which node
/usr/bin/node
$ which npm
/usr/bin/npm
```

## 参考

* Chef活用ガイド
* Chef実践入門
Ubuntu 14.04からWindows10に戻った時にやったことを個人的にメモする


## Ubuntu時代からお世話になっていたアプリケーション

+ Google Chrome
+ FireFox
+ Slack
+ Skype
+ Atom

**あとは言語の実行環境**

+ PHP 5.5
+ Ruby 2.2.4
+ Rails 4.2
+ Python 2
+ Python 3
+ Apache 2
+ Mysql 

## Windows10に移行するときに新たにお世話になることになったアプリケーション

+ Visual Studio 2013　_C#やASP.NETの勉強のため_
+ Unity 5.3.3　_ゲームを作りたくなったため_
+ Kobito　_MarkDownの記法になれるため_
+ Kingsoft Internet Security 2015　_念のため_
+ Google Drive　_ブラウザからアクセスよりも便利なため_
+ Cygwin　_念のため_

**あとはUbuntuで使っていたものの亜種など**

+ GitKraken　_UbuntuではSmartGitを使っていた_　
+ LINE　_UbuntuではWineで使っていた_
+ MS Officeソフト　_UbuntuではLibre系を使っていた_

## Ubuntuから移行するときにお役御免になったアプリケーション

+ Monodepelop　
+ Chromium
+ GIMP
+ Clementine

## Atomのパッケージ一覧

+ Remote-FTP
+ Autocomplete-paths
+ Color-picker
+ File-types
+ git-control
+ Highlight-Selected
+ linter
    + linter-jshint
    + linter-php
+ Merge-conflicts
+ pigments
+ Remote-atom
+ script
+ terminal-panel

**テーマ**

UI : seti
　&
Fonts : Dracula
　or
UI : seti
　&
Fonts : atom-monokai
## Windows10に移行して快適になった部分

+ Kingsoft Internet Security 2015内のWifiテザリング機能によってAndroid端末をどこでもインターネットに接続しやすくなった
+ エクスプローラーのクイックアクセスが便利
+ MSのOfficeを使えるようになった
+ Google driveを直接エクスプローラーで使えるようになった
+ iTunesを使うことができ、iPhoneとの連携が取りやすくなった
+ Kobitoが使えるようになり、紙媒体を使うことが減った
+ Visual Studio 2013を使えるようになり、Azureとの連携が取りやすくなった
+ 自分のPC限定ではあるが、指紋認証機能が使うことができた

## Windows10に移行して不便になったと感じたところ

+ **Ubuntuに比べて**起動速度は遅くなった
+ **Ubuntuに比べて**メモリ使用量が増え、32bitの限界を感じるようになった
+ sudo rebootの**偉大さ**を知った。（shutdown -r -t 0思った以上にめんどい）
+ 謎の**Ctrl+Alt+矢印**の挙動。（デスクトップ移動しようとするたびに起きる画面反転…
Git | 一括で add する

ドットを使う。

`$ git add .`

これで **カレントディレクトリ以下の全変更**をステージング出来る。

# 環境

- git version 2.3.8 (Apple Git-58)



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
EasySelectBoxで元々のchangeを呼ぶ

[jQuery EasySelectBox Plugin](https://github.com/kosinix/easyselectbox)を利用している場合に、&lt;select&gt;タグのchangeイベントを捕捉できなかったので、その時のメモ。

# 要約

EasySelectBoxのonClickではなく、jQueryの on('change') で&lt;select&gt;タグの変化を認識したい。というお話し。

# 前提

以下のようなHTMLでEasySelectBoxを使っているとします。

```html
<script type="text/javascript">
  $(function () {
    $('#select').on('change', function () {
      alert('選択は ' + $(this).val() + 'だよ');
    });

    $('#select').easySelectBox();
  });
</script>

<select name="select" id="select">
  <option value="A">A</option>
  <option value="B">B</option>
</select>
```

ここで期待しているのは、&lt;select&gt; の選択が切り替わったら
「選択は A だよ」
とか
「選択は B だよ」
とアラートがでることなのですが選択を切り替えても何もおきません…。

って、これだけであればEasySelectBoxの初期化時にオプションで onClick を指定すれば解決です。

```js
$('#select').easySelectBox({
  onClick: function (data) {
    alert('選択は ' + data.text + ' だよ');
  }
});
```

こんな感じ。

でも・・・元々 $('#select').on('change', ...) で処理を作ってある場合、全部書き直すのか！？！！
とか、$('.select').easySelectBox() とクラスセレクタ使ってるから個別にonClickイベントの指定なんて出来ないぞ！！
ということが起こる。
(自分の場合は、コーダーから貰ったHTMLにEasySelectBoxが使われてて on('change') が呼ばれなくなった。。。)

そこで、これ

```js
$('#select').easySelectBox({
  onClick: function (data) {
    var selectObj = $(this).data('easySelectData').selectObj;
    selectObj.trigger('change');
  }
});
```

こうすると、元々処理を書いておいた &lt;select&gt; に対して change イベントが発火されてJavaScriptの書き換えが最小限で済む＋EasySelectBoxを使わなくなったとしても大丈夫。

懸念としては、EasySelectBoxの内部構造が変わって

```js
$(this).data('easySelectData').selectObj;
```

が使えなくなるかもというところかな。

# 雑感

EasySelectBox、見た目はいいんだろうけどプログラマブルには使いにくかったな。。。
この他にも、動的に&lt;select&gt;の中の&lt;option&gt;を作り替えてもEasySelectBoxの初期化時にリストが作られてしまっているから反映されないとか・・・(DOMオブジェクト作り直して対応)
El Capitanでruby-oci8をインストールする

古いバージョンのOSでの環境構築を参考した時、結構手間取ったのでメモとして残します。
基本的にはhomebrewでインストールするだけです。

#1.Oracle Install Clientをダウンロード
http://www.oracle.com/technetwork/topics/intel-macsoft-096467.html
下記のファイルをダウンロード
・Instant Client Package - Basic
・Instant Client Package - SDK


#2.homebrewでインストール
```
brew install InstantClientTap/instantclient/instantclient-basiclite
brew install InstantClientTap/instantclient/instantclient-sdk
```
brewでファイルがないとかエラーが出る場合は、1でダウンロードしたファイルをエラーに記載されているパスにmv後に再度実行して下さい。

環境変数を設定します。

```
export OCI_DIR=$(brew --prefix)/lib
```

#3.ruby-oci8をインストール

下記のコマンドでgemをインストールします。

```
gem install ruby-oci8
```