OmniAICreator/Qiita-1.07M huggingface dataset:
Nodeのストリームで.tar.gzを解凍する方法

メモ程度に、.tar.gzのファイルを解凍する方法です。

gunzipの部分は[zlib](https://nodejs.org/api/zlib.html)で、`tar`の中身を取り出すのは[node-tar](https://github.com/npm/node-tar)を使います。

```js
var fs   = require('fs');
var zlib = require('zlib');
var tar  = require('tar');

var tarballPath = '/path/to/my/tarball.tar.gz';
var outputPath  = '/path/to/my/output';

var gunzip    = zlib.createGunzip();
var extractor = tar.Extract({path: outputPath});

fs.createReadStream(tarballPath).pipe(gunzip).pipe(extractor);
```

で終わります。エラー処理や終わった時のコールバックはパイプの`.on('error', cb)`と`.on('finish', cb)`で簡単に実現できます。

## ジェネレーターを使う場合は

ES6のジェネレーターを使うと、コールバックはやや不便ですが、[co](https://github.com/tj/co)を使うと、`Promise`も`yield`できるので、[パイプをpromiseとして返してくれるライブラリ](https://github.com/epeli/node-promisepipe)を使うときれいに書けます。


```
fs.createReadStream(tarballPath).pipe(gunzip).pipe(extractor);
```

を

```js
var promisePipe = require('promisepipe');
yield promisePipe(readStream, gunzip, extractor);
```

に変えれば終わりです。
カーネルとは直感的に説明するとなんなのか？

[How to intuitively explain what a kernel is?に対する回答](http://stats.stackexchange.com/a/153134/43986)がわかりやすかったので和訳

---
まずは質問の意図から。
質問者は、「カーネルとは直感的に説明するとなんなのか？」を聞いています。それに対する回答のひとつが、上記のリンク先です。

# 和訳
カーネルとはふたつのベクトル $\boldsymbol{x}$ と $\boldsymbol{y}$ の内積を(たいていはとても高次元の)特徴空間で計算する方法であり、これがカーネル関数が時々「一般化内積」と呼ばれる理由です。

$\mathbb{R}^n$ 上にあるベクトルをなんらかの特徴空間 $\mathbb{R}^m$ へ写す写像 $\varphi:\mathbb{R}^n \rightarrow \mathbb{R}^m$ があるとします。すると、その空間での $\boldsymbol{x}$ と $\boldsymbol{y}$ の内積は $\varphi(\boldsymbol{x})^\top\varphi(\boldsymbol{y})$ です。カーネルとはこの内積に対応する関数 $k$ で、つまり $k(\boldsymbol{x}, \boldsymbol{y}) = \varphi(\boldsymbol{x})^\top\varphi(\boldsymbol{y})$ です。

どうしてこれが便利なのか？カーネルは、特徴空間が何なのか、そして $\varphi$ が何なのかを知ることなしに、その特徴空間上で内積を計算する方法を提供します。

例えば、$\boldsymbol{x}, \boldsymbol{y}\in\mathbb{R}^2$ について、単純な多項式カーネル $k(\boldsymbol{x}, \boldsymbol{y}) = (1 + \boldsymbol{x}^\top \boldsymbol{y})^2$ を考えます。これはどんな写像 $\varphi$ にも対応しているようには見えず、単に実数を返す関数です。
$\boldsymbol{x} = (x_1, x_2), \boldsymbol{y} = (y_1, y_2)$ とおいて、上の式を展開してみます：
$$
\begin{align*}
k(\boldsymbol{x}, \boldsymbol{y}) &= (1+\boldsymbol{x}^\top\boldsymbol{y})^2 \\\
 &= (1+x_1 y_1 +x_2 y_2 )^2 \\\
 &= 1+x_1^2 y_1^2 +x_2^2 y_2^2 +2x_1 y_1 +2x_2 y_2 +2x_1 x_2 y_1 y_2
\end{align*}
$$
これは次のふたつのベクトルの内積以外の何者でもないことに注意してください：
$(1, x_{1}^2, x_{2}^2, \sqrt{2}x_{1}, \sqrt{2}x_{2}, \sqrt{2}x_{1}x_{2})$ と
$(1, y_1^2, y_2^2, \sqrt{2}y_1, \sqrt{2}y_2, \sqrt{2}y_1y_2)$、そしてこのとき、
$\varphi(\boldsymbol{x}) = \varphi(x_1, x_2) = (1,  x_1^2, x_2^2, \sqrt{2}x_1, \sqrt{2}x_2, \sqrt{2}x_1x_2)$ です。
だから、カーネル $k(\boldsymbol{x}, \boldsymbol{y}) = (1+\boldsymbol{x}^\top\boldsymbol{y})^2 = \varphi(\boldsymbol{x})^\top\varphi(\boldsymbol{y})$ は、6次元空間での内積を計算していることになります。明示的にその空間を訪れずに。

もうひとつの例はガウシアンカーネル $k(\boldsymbol{x}, \boldsymbol{y}) = \exp(-\gamma||\boldsymbol{x}-\boldsymbol{y}||^2)$ です。この関数をテイラー展開すると、これが無限次元への写像 $\varphi$ に対応することがわかるでしょう。

最後に、カーネルに基づいた手法のよい導入として、Yaser Abu-Mostafa教授のオンライン講義["Learing from Data"](https://work.caltech.edu/telecourse.html)をおすすめします。特に、["Support Vector Machines"](http://www.youtube.com/watch?v=eHsErlPJWUU&hd=1), ["Kernel Methods"](http://www.youtube.com/watch?v=XUj5JbQihlU&hd=1), ["Radial Basis Functions"](http://www.youtube.com/watch?v=O8CfrnOPtLc&hd=1)がカーネルについてのレクチャーとなっています。
戦術勝利を積み重ね戦略勝利を掴み取るために本当に必要だったこと

# 前振り
この前のAmazon Kindle 50% pointバックセールで銀河英雄伝説が50%offだった。
あれのせいで有能とか無能とか言い始めたのは私の黒歴史である。

さてそれはいい。
私はあれで戦略と戦術の違いを学んだ。

この前雑誌をパラパラ見ていたら、最近は戦略(Starategy)と戦術(Tactics)の間にさらに作戦(Operation)というものがあるらしい。

# [作戦の注目のきっかけ]
80年代、日本はバブルでイケイケだったんだけど、アメリカはどん底の不況真っ只中だった。
当時アメリカは超大国で、現場では局面レベルでは物量と資金力をいかし「圧倒的ではないか、我が軍は！」ができ、おおきな戦術レベルの勝利を収められた。
しかし戦術的勝利が戦略レベルでは影響を与えず、むしろ負け続けた。

野球でいうヒットは相手の二倍以上打ったのに得点になかなかつながらず、継投策はだめだめで負けた感じである。
アメリカ人は「なんで負けたんだ」と真剣に考えた結果、戦略目標にそって戦術的成果を積み重ね、勝利に向かわせる構想の部分、作戦(Operation)がほぼ無視されていることがわかった。
教科書には載っていたが実践においてはあまり重視されず、役員が考えるレベルの戦略と現場チームが考える戦術に間におおきなギャップがあり、両方が連携せずに戦略目標に貢献しない戦術行動の数々にいたずらにコストだけが注ぎ込まれた。

これはなんとかしないといけないと考え、野中郁次郎だったり半世紀前のロシアの偉い人だったりほかいろいろの資料をあさりつつ１つの概念をまとめたのがArt of Operationである。
各級ディレクターは上位のディレクターの設定した戦略的ゴールに沿うように構想と実施手段、チームの指揮、その他もろもろをまとめ指示を出す。

戦略目標は企業戦略(Grand Strategy)にそって設定される。
作戦目標は戦略目標にそって段階的に設定される。

# [作戦の例]
たとえば企業戦略のゴールが「自社を県内一番のExcellentな会社にする」というレベルだったとすると戦略目標は「自社を県内の業界トップシェア、利益率トップに押し上げる」まで具体化する。
作戦目標は戦略目標にそって段階的に設定される。
「新店舗充当用人材の手当てと新店舗進出可能地域の調査」
「新店舗の進出攻勢とブランドイメージの県内への普及」
「新店舗の競合店舗の退場を目的とした値引き攻勢」
「競合店舗退場後の集客の維持と売値回復の両立」
みたいな感じ。

# [戦術の例]
戦術は作戦目標を達成するために実施される
戦術レベルの１例
作戦目標の「新店舗充当用人材の手当て」のために「既存店舗の教育の体系化による教育能力の強化と教育コストの削減」
作戦目標の「値引き攻勢」のための「仕入れ量の大きさの保証による仕入れ値の値下げ交渉」
みたいなかんじになる。

# [プラクティス]
企業戦略までならふわっとしていてよいが、戦略、作戦、戦術とレベルが低下するにつれてどんどん具体的になり、訴求する対象セグメントも狭くなる。

# [作戦術の実施にあたって]
原典だと３つの要素を担当する人間が必要だとある。
これらは１人の人間が兼ねてもよいが、優劣はなくすべて同等である。
a.「勝算の高いプランを作る人間」
b.「勝算の高いプランを立てるに当たって、前提となる情報を集める人間」
c.「プラン実施に必要になるノウハウや経験のある人間、資金、モノを用意する人間」

もっとも原始的な段階だとa.の人だけに脚光があたる(原典だとここで某ビッグエゴの人が超Disられている)。情報がないから作り手の都合が優先され顧客の要望は置いてきぼりになる。情報がないから希望や楽観論が現実に取って代わる。

次の段階で a.とb. の人間が並列とされる。勝算の高い計画には情報が重要だからだ。

一番進歩した段階だとa.b.c.が同列になる。複雑かつ柔軟で高速な展開には練度の高い人間と十分な資金と物資が必要だから。
逆にいうとこれらがないと複雑かつ柔軟で高速な計画を実行することはできない。
PHPで手軽にExcelの表を読みたい

データを Excel 形式で入手したときに、とにかくパッとデータを扱いやすい形式に変換したい、という時に便利です。

Excel は御存知の通り色々できるので、読んだデータが何かと加工されていたらプレーンテキストに変換するなどの処理が必要かもしれません。 (けど、私は幸いにも特にそういった必要性がなかったのでそのことには触れません)

# PHPExcel を使う

そういうライブラリがあるので使います。

https://github.com/PHPOffice/PHPExcel

```shell
composer require phpoffice/phpexcel
```

# データを配列として取得する

```php:excel_dumper.php
<?php

require_once __DIR__ . '/vendor/autoload.php';

function excel_dump($path)
{
    $excel = PHPExcel_IOFactory::createReader('Excel5');
    $book = $excel->load($path);
    $sheet = $book->getActiveSheet();
    return $sheet->toArray(null, true, true, true);
}

$data = excel_dump('/path/to/excel/book.xls');
echo json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
```

# 結果

```json
[
  {
    "A": "107-0062",
    "B": "東京都",
    "C": "港区",
    "D": "南青山",
    "E": "2丁目2番15号",
    "F": "ウイン青山1403",
    "G": "Increments株式会社"
  },
  {
    "A": "省略……",
    "B": "省略……",
    "C": "省略……",
    "D": "省略……",
    "E": "省略……",
    "F": "省略……",
    "G": "省略……"
  }
]
```

# 補足

```*.xls``` ではなく ```*.xlsx``` の場合は ```createReader``` に渡す引数を ```Excel2007``` にして下さい。
Java 8 で ruby の flatten

ruby には flatten という配列のメソッドがあります。

```rb
arr = [1, 2, 3, [4, 5], [6, [7, 8]]]
p arr.flatten
```

これを Java 8 でやろうとすると多分これが一番楽だと思います。

```java
int[][] list = {{1, 2, 3}, {4}, {5, 6}};
int[] a = Arrays.stream(list).flatMapToInt(Arrays::stream).toArray();
```

List だとこんな感じ

```java
List<List<Integer>> list = Arrays.asList(
        Arrays.asList(1, 2, 3),
        Arrays.asList(4),
        Arrays.asList(5, 6)
);
List<Integer> flatten = list.stream().flatMap(Collection::stream).collect(Collectors.toList());
```

これが一番楽だよ……ね……？

さっそく追記：このコード、2次元配列限定でしか動かないですね。引用してるrubyの例を再現できてない。。めんどうなんでこれ以上掘り下げないですが、3次元でもいけそうではあるかな。
bashの計算式で、秒数をHH:MM:SSフォーマットに変換する

ほぼこれ。

* [linux - Convert seconds to formatted time in shell - Stack Overflow](http://stackoverflow.com/questions/13422743/convert-seconds-to-formatted-time-in-shell)

ただし、上記記事のコードだと`$i`を上書きしてしまうので、そこだけ直した。

`%`は余りを求める。`/`は余りを除いた商を求める。

```bash
i=6789
((sec=i%60, min=(i%3600)/60, hrs=i/3600))
timestamp=$(printf "%d:%02d:%02d" $hrs $min $sec)
echo $timestamp
```

総計を60*60で割った余りをさらに60で割ることで、分の位を求める。
PHPでfizzbuzz問題にトライした話


# 縛り
- PHPで書く
- 剰余は使わない

# トライ
## 3の倍数
* 3の倍数は数値のそれぞれの位を足しても3の倍数になるので、9より小さくなるまで足し算を繰り返す
* 3, 6, 9 のいずれかにマッチすれば Fizz

## 5の倍数
* 5の倍数は1の位が必ず0か5になるはず
* 0, 5にマッチすれば Buzz


## ソースコード
```lang:fizzbuzz.php

<?php

for($num = 1; $num <= 100; $num++) {
    $flag = false;
    $sum = $num;
    while($sum > 9) {
        $sum = array_sum(array_map('intval', str_split((string)$sum, 1)));
    }
    if(in_array($sum, array(3, 6, 9), true)) { $flag = true; echo 'fizz'; }
    if(in_array(substr((string)$num, -1), array('0', '5'), true)) { $flag = true; echo 'buzz'; }
    if(!$flag) echo $num;
    echo "\n";
}
```

# 振り返り
- 型指定を厳密にやったら $sum の計算が気持ち悪いことになった。
- array_sumは内部の計算で動的に型を変換してるようだ。気持ち悪い・・・
- ループの頭で変数初期化するの無駄感ある。特に $flag
Rubyでファイルの所有ユーザ・グループを調べる

ミドルウェアの設定ファイルなどを書くときにディレクトリの権限をいじる必要が時たまあると思う。1個ならlsたたけばすぐわかるけどいっきにいろいろなディレクトリを調べたいときにはコードで書く必要がありそうなので調べた。

Fileコマンドでは取れなかったので[Etc](http://docs.ruby-lang.org/ja/2.2.0/class/Etc.html)や、[File::Stat](http://docs.ruby-lang.org/ja/2.2.0/class/File=3a=3aStat.html)を利用したりする。

```rb
require 'etc'

path = '/'
user = Etc.getpwuid(File.stat(path).uid).name
group = Etc.getgrgid(File.stat(path).gid).name
puts "#{user}:#{group} #{path}" #=> root:root /
```
Atomのスペースをはっきり見えるようにする


Settingsにある `Show Invisibles` にチェックを入れるだけで、半角スペースや改行が見えるようになるんですが、テーマによってはまだ薄かったりします。
なのでAtomのCSSをいじってちょっと濃くしてみたいと思います。

SettingsのThemesから `your style sheet` のリンクをクリックすると、styles.lessが開かれます。
そのstyles.lessの一番後ろにでもこんな感じで記述します。

```less:styles.less
〜略〜

@invisible-color: rgba(197, 200, 198, 0.4);

atom-text-editor::shadow {

  .indent-guide {
    color: @invisible-color;
  }

  .invisible-character {
    color: @invisible-color;
  }

}
```

そうすると
<img src="https://qiita-image-store.s3.amazonaws.com/0/37435/6727ed84-6517-0b55-4431-9ceef69e6fa8.png" width="60%" />

が、こうなります。
<img src="https://qiita-image-store.s3.amazonaws.com/0/37435/16e8eeaa-2a98-525e-76f1-f43c78a527cf.png" width="60%" />

ちなみにAtomのエディタのスタイルはShadow DOMで書かれているので、atom-text-editorに::shadow擬似要素をつけていないと変更されないのでご注意を。

あと、文字と文字の間の半角スペースはこれでは見えるようになりませんでした。残念。。。

### 参考リンク
http://blog.atom.io/2015/01/05/enable-shadow-dom.html
angularでhttpリクエストの前後に共通処理をする

httpリクエスト全体に対して共通の処理がしたい場合、`$httpProvider.interceptors`を使って、リクエストの前後に共通の処理を挿入することができます。

https://docs.angularjs.org/api/ng/service/$http
のInterceptorsにサンプルコードがあり、

`request` : リクエスト前の処理
`requestError` : リクエストエラー時の処理
`response` : レスポンス成功時の処理（個別の`$http.success()`が呼ばれる前）
`responseError` : レスポンスエラー時の処理（個別の`$http.error()`が呼ばれる前）

の４つが定義できます。

例えば、認証エラーの場合は必ずログイン画面に飛ばしたい場合は、以下のように書くことができます。

```
angular.module('myApp')
  .config(['$provide', '$httpProvider', function($provide, $httpProvider) {
    $provide.factory('myHttpInterceptor', ['$q', '$location', '$rootScope', function($q, $location, $rootScope) {
      return {
       'responseError': function(rejection) {
          if (rejection.status === 401) { 
            $location.path('/login');
          }
          return $q.reject(rejection);
        }
      };
    }]);

    $httpProvider.interceptors.push('myHttpInterceptor');

  }]);
```

個別の `$http.error()`ハンドラは、上記の共通処理の後に呼ばれます。
OpenAMをeclipseでデバック実行する方法

**前提条件**
・OpenAM 12.0.0を使用(最新のリリース版）
  https://svn.forgerock.org/openam/tags/12.0.0/openam/
  からソースを取得し、mavenを使用してビルドを行う。
　※trunkのソースは13.0.0だったが、trunkのソースはビルドに失敗した。

・eclipse lunaを使用
　※eclipse keplerだと対応してないMavenプラグインがあるようで、プロジェクトのインポートが出来なかった。

**実施手順**
1.SVN からソース取得
   `svn co https://svn.forgerock.org/openam/tags/12.0.0/openam/`

2.mavenビルド
   `cd ${HOME}/openam`
   `export MAVEN_OPTS=-Xmx512m`
   `mvn -DskipTests=true clean install`
  ※${HOME}/openam/openam-server/targetの下にビルドモジュールが作成されます。

3.eclipseの設定
 １．実行用プロジェクトの作成
　Dynaminc Web Projectを作成
　作成したプロジェクトのWebContent配下を2で作成した
　${HOME}/openam/openam-server/target/OpenAM-12.0.0-SNAPSHOT/
  で上書き更新する。

　２．ソース参照・変更用プロジェクトの作成
　eclipseのimportでExisiting Maven Projectsを選択して、
　${HOME}/openamを指定する。
　※依存するプラグインのエラーは無視して読み込む。

※参考
・ソースのチェックアウトとビルド
https://wikis.forgerock.org/confluence/display/openam/Build+OpenAM+from+Source

・SAML連携の設定方法
http://codezine.jp/article/detail/6321

SAML連携とeclipseでのデバッグ実行が出来ると、
OpenAMの障害調査にとても役立ちます。
また、ソースを改変してビルドすることも出来ます。
ganalytics で invalid multibyte string エラー #rstatsj

日本語使ってないのになぜ(´；ω；｀)

```r:R
Sys.setlocale("LC_ALL", "C")
```

で行けた。

追記

```r:R
Sys.setlocale("LC_TIME", "C")
```

で行けた。なんのバグなんだろう？
_s でできたテーマを写経しながら SCSS に書き直す

Automattic 製のスターターテーマ「`_s`(アンダースコアエス)」の Sass が使いこなせるようになりたかったので、`_s` をベースにつくられたテーマを写経してみました。

書き始めると長くなりそうなので、箇条書きにしたものを置いておきます。
気が向いたら詳しく書き直します。

## 前提条件
- 今回はスタイルシートのみの写経（PHP もやってもいいかも）
- 成果物は子テーマ
- Git が使える

## やりかた

1. Underscores をインストール
2. 親テーマをインストール
3. 新しいフォルダをつくり、Underscores の Sass フォルダと、親テーマの style.css をコピーしてくる
4. style.css 内のコメントに Template: 欄をつくり保存して、子テーマを有効化
4. Git にコミットして、バージョンをきる
5. Sass を変換して style.css を上書き
6. Git にコミットして、別のバージョンをきる
7. 2つのバージョンを比べながら、差分を修正してゆく
8. Mixin とか variables-site にできそうな要素を置き換えてゆく
子要素が追加されたことを検知して処理を行う


ある要素になにかしら子要素が追加された場合に処理をしたいことがある。

```html
<div class='any-element'>
  <div class='child'>子要素</div>
</div>
```

# イベント

DOM4 Events以降に対応しているブラウザであれば、MutationObserverを使用すれば良いが、それ以前のブラウザではDOMNodeInsertedイベントにフックする方法がある。
（IEだと11以上からMutationObserverを使える）
https://developer.mozilla.org/ja/docs/Web/API/MutationObserver

```javascript
if (typeof MutationObserver !== 'undefined') {
  var mo = new MutationObserver(function(mutations) {
    $.each(mutations, function(i, mutation) {
      var target = $(mutation.target);
      // hogehoge
    });
  });
  $.each($('.any-element').get(), function(index, elem) {
    mo.observe(elem, {childList: true});
  });
} else {
  $('.any-element').bind('DOMNodeInserted', function(event) {
    var target = $(this);
    // hogehoge
  });
}
```


# ポーリング

その他にも、子要素を追加するタイミングで親要素に unread のようなクラスを付与する、という前提で、下記のようにポーリングすることもできる。
※複数の子要素を同時に追加する、というケースだと重複して処理しないよう制御が必要

```javascript
$('input[type=file]').on('change', function() {
  var interval = setInterval(function () {
    var target = $('.any-element');
    if (target.length > 0 && target.hasClass('unread')) {
      // hogehoge
      target.removeClass('unread');
      clearInterval(interval);
    }
  }, 100);
});
```
AndroidでJSR310

追記
今は以下を使うのがよいと思います。
https://github.com/JakeWharton/ThreeTenABP

2年程前にAndroidを始めたばかりの頃、日付時刻を扱うときは`android.text.format.Time`を使えみたいな話を聞いて日付時刻処理には極力`Time`クラスを使うようにしていたのですが、数ヶ月前に`@deprecated`になってしまっていたので代替となるものを探していました。

公式ドキュメントには代わりに`GregorianCalendar`を使えと書いてあったけれど、今更感があったのでJava8のDate and Time APIのバックポートライブラリである[threetenbp](https://github.com/ThreeTen/threetenbp)を使うことにしました。**（何かの機会でJava8書くときに勉強しなくていいし）**

2015/06/04追記
正式にJava8サポートされる可能性が出てきたのでちょうど良いかも
https://android-review.googlesource.com/#/c/150214/

## 導入

### 依存関係を追加
```groovy:build.gradle
compile 'org.threeten:threetenbp:1.2'
```

### proguardの設定を追加
```text:proguard-rules.pro
-dontwarn java.util.spi.LocaleServiceProvider
-dontwarn sun.util.calendar.*
-keep class org.threeten.bp.zone.*
```

### よく使うクラス

`org.threeten.bp.LocalDate`
`org.threeten.bp.LocalDateTime`
`org.threeten.bp.ZonedDate`
`org.threeten.bp.ZonedDateTime`
`org.threeten.bp.Instant`

簡単な用途なら

- 日付のみを扱うか、日付+時刻を扱うか
- タイムゾーンを含めるか

で使うクラスを決めて、

- エポックタイムを扱う場合は`Instant`を使う

と覚えておけばなんとかなると思います。
MongoDBとElasticsearchを同期させる

## それRiverでできるじゃん

はい、そうです
素直に[River Plugin](https://github.com/richardwilly98/elasticsearch-river-mongodb/)使えばいいのですが

* River用にレプリケーションを組まなきゃない
* Elasticsearch本体のバージョンとプラグインのバージョン違いが思わぬところで地雷になる
* その他の事情

などの理由でRiverを使わない場合はどうすんべという話

Mongooseには[middleware](http://mongoosejs.com/docs/middleware.html)という機能があり、他のRDBMSのTrigger機能のように各種のメソッドコールに処理を差し込めるので、これを使うことにします



## 実装

予めElasticsearch側のインデックスを作っておく

そしてMongooseとElasticsearchを結ぶようなモデルを作る
個人的にはapp.jsの下にlib/model.jsだったりlib/model/db名.jsとか作るのが好みです

```js:lib/model.js
module.exports = function(){
    var mongoose = require('mongoose');
    var connection = mongoose.createConnection('mongodb://localhost:27017/foobar');
    var Model = {};
    var Schema = {};

    var elasticsearch = require('elasticsearch');
    var es = new elasticsearch.Client({
        host: 'localhost:9200'
    });

    Schema.Foo = new mongoose.Schema({
        /**
        *   Schema定義をいろいろ
        */
        message: {type: String, default: ''}
    });

    Schema.Foo.post('save', function(doc){
        es.index({
            index: 'foobar',
            type: 'foo',
            id: doc._id.toString(),
            body: JSON.parse(JSON.stringify(doc))
        }, function(err, response){
            next(err);
        });
    });

    Schema.Foo.post('remove', function(doc){
        es.delete({
            index: 'foobar',
            type: 'foo',
            id: doc._id.toString()
        }, function(err, response){
            next(err);
        });
    });

    Model.Foo = connection.model('Foo', Schema.Foo, 'foo');

    return Model;
};


```
使うときは

```js
var Model = require('lib/model.js')();
var data = new Model.Foo();
data.message = 'あぁ^～心がぴょんぴょんするんじゃぁ^～';

data.save(function(err){
    console.log(err);
});

```
として普通にModel経由で操作をしてれば更新があったときにElasticsearch側も裏側で更新されてるという寸法

## ところが

この方法だとMongooseのsave()メソッドのみにおいて有効で、findOneAndUpdateやupdateなどネイティブなクエリ構文を使う場合に更新されない

これは[割と前からIssueとしてあげられていましたが](https://github.com/Automattic/mongoose/issues/964)、middlewareのページに曰くMongoose4.xだと、

> Middleware (also called pre and post hooks) are functions which are passed control during execution of asynchronous functions. Middleware is specified on the schema level and is useful for writing plugins. Mongoose 4.0 has 2 types of middleware: document middleware and query middleware. Document middleware is supported for the following document functions.

> * init
> * validate
> * save
> * remove

> Query middleware is supported for the following Model and Query functions.
> * count
> * find
> * findOne
> * findOneAndUpdate
> * update

> Both document middleware and query middleware support pre and post hooks. How pre and post hooks work is described in more detail below.

とあり、クエリを使う場合のミドルウェアはクエリごとに書いてね、とあるので

```js
var foo = function(doc){
    es.index({
        index: 'foobar',
        type: 'foo',
        id: doc._id.toString(),
        body: JSON.parse(JSON.stringify(doc))
    }, function(err, response){
        next(err);
    });
};

Schema.Foo.post('save', foo);
Schema.Foo.post('update', foo);
Schema.Foo.post('findOneAndUpdate', foo);

```
のような形がいいのかな？と思います
codeception を使ってみたメモ


http://codeception.com/

PhantomJSをWebdriverとして使ってみる。プロジェクトはVagrantのホスト上で動かしている状態。

## phantomJSのインストール

面倒だったので `brew install phantomjs` でインストール

## プロジェクトにインストール

基本全部のプロジェクトは `Composer` を使ってるので、下記の一行を実行

```shell
> composer require "codeception/codeception" --dev
```

設定ファイルとか必要なので作成させる

```shell
> ./vendor/bin/codecept bootstrap
```

設定が作成されたら簡単な Acceptanceなテストを作ってみる。

```shell
> ./vendor/bin/codecept generate:cept acceptance Welcome
```

内容をこんな感じにしてみる。

```php
<?php
$I = new AcceptanceTester($scenario);
$I->wantTo('perform actions and see result');
$I->amOnPage('/');
$I->see('Homepage'); /* replace this with your own text */
```

## 設定とか

一番やりたいのは、Acceptance なので、それの設定だけ少しいじる。

```tests/acceptance.suite.yml
# Codeception Test Suite Configuration

# suite for acceptance tests.
# perform tests in browser using the WebDriver or PhpBrowser.
# If you need both WebDriver and PHPBrowser tests - create a separate suite.

class_name: AcceptanceTester
modules:
    enabled: [WebDriver]
    config:
        WebDriver:
            url: 'http://192.168.13.14:8054/'
            browser: phantomjs
            window_size: 1024x768
            wait: 1
```

## 動かし方

二つのターミナルを開いて、一つをphantomjsを、一つをcodeceptに使ってみる。他の方法はよくわからんない。

```shell
> phantomjs --webdriver=4444
```

```shell
> ./vendor/bin/codecept run
Codeception PHP Testing Framework v2.0.14
Powered by PHPUnit 4.6.7 by Sebastian Bergmann and contributors.

Acceptance Tests (4) ----------------------------------------------------------------------------------------------------------------------
Perform actions and see result (WelcomeCept)                                                                                         Ok
```

## エラーとか

エラーが出れば、 `tests/_output` などに出力されるから、それを見ればいい感じ。スクリーンショットも撮っているので。

## XPathとか

テストでDom指定もできるし、Xpathの指定もできる。ただ、XPathを書く気は無いので、[XPathHelper](https://chrome.google.com/webstore/detail/xpath-helper/hgimnogjllphhhkhlmebbmlgjoejdpjl) を使ってみる。

### XPathHelper の使い方

1. Ctrl-Shift-X を押したら上にクエリーウィンドウが開く
2. シフトを押しながらマウスを移動すれば、クエリーウィンドウにパスが出力されるから、それを利用する。

多分他にも。
CSS Font 調査


最近の企業は、どのようなフォントを web ページに使用しているのか調べた。ちなみに、どこを調べたら良いのかよくわかってないので、最近の企業、昔ながらの企業、広報系のサイトを選択した。

- Cookpad

```CSS
font: 14px/1.5 "Hiragino Kaku Gothic Pro", "ヒラギノ角ゴ Pro W3", "Meiryo", "メイリオ", "Osaka", "MS PGothic", arial, helvetica, clean, sans-serif;
```

- Cacoo

```CSS
font-family:"Lucida Grande","Hiragino Kaku Gothic ProN",Meiryo,"ＭＳ Ｐゴシック",Verdana,Arial,sans-serif
```

- Qiita

```CSS
font-family:"lucida grande", tahoma, verdana, arial, sans-serif
```

- Microsoft

```CSS
font-family:Meiryo,Tahoma,Verdana,Arial,sans-serif
```

- Apple

```CSS
"Apple TP","Helvetica Neue","Helvetica","Hiragino Kaku Gothic Pro","ヒラギノ角ゴ Pro W3","メイリオ","Meiryo","ＭＳ Ｐゴシック","Arial","Verdana","sans-serif"
```

- Web担当者フォーラム

```CSS
font-family:"lucida grande", tahoma, verdana, arial, "hiragino kaku gothic pro",meiryo,"ms pgothic",sans-serif;
```

- アドタイ

```CSS
ont-family:"lucida grande", tahoma, verdana, arial, "hiragino kaku gothic pro",meiryo,"ms pgothic",sans-serif;
```

----
■ 雑感

意外だったのは、Windows8.1 や Mavericks で正式採用された字游工房の游ゴシック体と游明朝体が指定されていなかったことだ。

調べていくうちに Font 沼にはまりそうだったので、下記のQiita の記事を参考に自分なりの設定をすることにした。
http://qiita.com/llsmrsll/items/f019b8daadf798066001


- ゴシック

```CSS
font-family: "游ゴシック", "YuGothic", "Hiragino Kaku Gothic ProN", "Hiragino Kaku Gothic Pro", Meiryo, sans-serif
```

- 明朝

```CSS
font-family: "游明朝", "YuMincho", "Hiragino Mincho ProN", "Hiragino Mincho Pro", Meiryo, serif;
```
Railsで(動的に)柔軟にバリデーションを変更する方法

# Railsで(動的に)柔軟にバリデーションを変更する方法

運用上、バリデーションを(動的に)柔軟に変更したいということがある。
例えばパスワードに含まれてもよい記号を追加するとか、10進数だけでなく16進数の入力も許すようにするとか。

validates_...(validates_format_of, ...)はモデルの初期化時（=railsの起動時)にのみバリデーションを定義する。
すなわちvalidates_...で設定用の変数を読み込むようにして、後からその設定用の変数の値を変えても適応されない。

## validateメソッド

設定用の変数を使って、動的にバリデーションを変更したいという場合には以下のようにvalidate do~endを使いましょう。
validateメソッドはバリデーションの際に毎回ブロック内のコードが実行されます。

例）名前の正規表現が記述された設定変数(name_config)を使ったバリデーション

```rb
validate do
  errors.add(:name, :name_error) if name !~ /#{name_config}/
end
```


### 補足（別の方法）

#### Modelに動的にバリデーションを追加する
self.singleton_class.class_eval()を使って、動的にModelにバリデーションを追加できますが、この方法では前回のバリデーションが残ったまま重複してしまいます。

#### Controllerの\#createや\#updateでチェックする
それでも良いですが、バリデーションはmodelにまとめた方が分かりやすいかと思います。
タイムマシンのように過去のデータを参照できる！？ Temporal テーブルを試す

先日、[SQL Server 2016 CTP2](https://www.microsoft.com/en-us/evalcenter/evaluate-sql-server-2016) が公開されました。2016になって色々な新機能が追加されていますが、その1つである「Temporal テーブル」について確認してみました。


## Temporal テーブル って何？

レコードの更新履歴をRDBMS側で自動的に記録してくれるテーブル、のことっぽいです。
自動的に記録してくれるだけでなく、特定時点のデータをSQLで抽出することも当然できます。
[Temporal Tables](https://msdn.microsoft.com/en-us/library/dn935015(v=sql.130).aspx)
うっかりDELETEしちゃった！（うっかりすぎる）なんて場合でも、DELETE前のデータを見ることができたりするわけですね。
世の中にはDELETE前のデータを見ることができたりするお高いツールもあったり（[これ](http://www.apexsql.com/sql_tools_log.aspx)とか[これ](http://www.vivouac.co.jp/sarasa/index.html)とか）しますが、そんなもんいらんかったんや！……となるのかどうか。


## とりあえず使ってみる

まず、こんな感じにテーブルを作ります。

```sql
CREATE TABLE temporaltest (
     id CHAR(5) NOT NULL PRIMARY KEY
    ,name VARCHAR(10) NOT NULL
    ,starttime DATETIME2 GENERATED ALWAYS AS ROW START NOT NULL -- (1)
    ,endtime DATETIME2 GENERATED ALWAYS AS ROW END NOT NULL     -- (2)
    ,PERIOD FOR SYSTEM_TIME (starttime,endtime)                 -- (3)
) WITH (SYSTEM_VERSIONING=ON);                                  -- (4)
```

idとnameだけのシンプルなテーブルに、データの有効期限を表わす列を2つ（starttime,endtime）追加しました。
(1)(2)`GENERATED ALWAYS AS ROW START/END`と(3)`PERIOD FOR SYSTEM_TIME`をつけることにより、starttime列とendtime列がそれぞれ開始日時と終了日時を表わすフィールドになります。
(4)`WITH (SYSTEM_VERSIONING=ON)`をつけると、裏で履歴管理用のテーブルを自動生成してくれます。

テーブルができたら、適当にデータ更新をしてみましょう。

```sql
--14:24頃に実行
INSERT INTO temporaltest(id,name) VALUES('00001','テスト1'),('00002','test 2'),('00003','てすと３');

--14:26頃に実行
UPDATE temporaltest SET name='TEST II' WHERE id='00002';

--14:30頃に実行
DELETE FROM temporaltest WHERE id='00002';

--14:35頃に実行
INSERT INTO temporaltest(id,name) VALUES('00002','復活2');

--14:36頃に実行
UPDATE temporaltest SET id='00013',name='元てすと３' WHERE id='00003';
```

まず普通にSELECTします。

```sql
SELECT id,name FROM temporaltest
ORDER BY id;
```

|id|name|
|:--:|:--:|
|00001|テスト1|
|00002|復活2|
|00013|元てすと３|

普通ですね。
では14:24頃のINSERT文実行直後のデータを見てみましょう。
なお、日時は(5)のようにUTCに変換します。日本なら-9時間すればOKです。

```sql
SELECT id,name FROM temporaltest
FOR SYSTEM_TIME AS OF '2015-05-29 05:24:30' -- (5)
ORDER BY id;
```

|id|name|
|:--:|:--:|
|00001|テスト1|
|00002|test 2|
|00003|てすと３|

(5)の値をいろいろ変えてみると、それに合わせて結果が変わることが確認できます。
`FOR SYSTEM_TIME AS OF`で特定の日時を指定する以外にも、`FOR SYSTEM_TIME FROM … TO …`、`FOR SYSTEM_TIME BETWEEN … AND …`、`FOR SYSTEM_TIME CONTAINED IN (…)`といった指定ができます。


## 「お高いツールなんていらんかったんや！」と、なる？

んー、どうでしょう？
いろんなテーブルを事前に Temporal にしておけば、要らなくなるかもしれません。
でもTemporalとして運用し続けるにはそれなりのコスト（処理のオーバーヘッドとか履歴データ分のディスク容量とか）が必要なわけで、その辺をどう考えるか次第ではないでしょうか。
そして、Temporalにしていないテーブルに限ってうっかりDELETEが発生したりするような気もｗ


## 余談

 * Temporalは[SQL:2011](http://en.wikipedia.org/wiki/SQL:2011)で規格化されている
 * [Oracleは同様な機能を12cで既に実装している](http://www.oracle.com/technetwork/jp/database/application-development/total-recall-1667156-ja.html)

つーことは、今後ほかのRDMBSでも実装されるかも？
AssetBundle.CreateFromFileのクラッシュ回避

以下のコードでクラッシュした。

```lang:unityC#
string path = "hoge";
AssetBundle NoCompress = AssetBundle.CreateFromFile(path);
```

out of memoryが出てたのでそれ系の原因を探してたけど、全く別の原因だった。
原因は無圧縮を指定せずにアセットバンドルを作成したことだった。

解決法：

アセットバンドルを作るときに

```lang:unityC#
BuildPipeline.BuildAssetBundles(OutPutPath, BuildAssetBundleOptions.UncompressedAssetBundle, EditorUserBuildSettings.activeBuildTarget);

```

こんな感じで、第二引数に
BuildAssetBundleOptions.UncompressedAssetBundleを指定してやる。

参考：
http://docs.unity3d.com/ScriptReference/AssetBundle.CreateFromFile.html

追記：
エラーや例外返すんじゃなくてクラッシュするのどうにかしれ('A`)
JSAI2015 3日目 2015.06.01(月)




## 高速なウェブサイト最適化のための KPI 設計手法の提案

### 背景 / 目的
ユーザーの行動を換気させるウェブサイトを構築するための手法
ex. ABテスト

KPIの長期化問題
広告クリック率, MAU, 検索エンジン順位数など

### 提案手法

KPIが長期化する要因

* ユーザーの行動頻度要因
* 外部サービス行動頻度要因（メインの要因）

Webサイトのバリエーションをx, ユーザーのフィードバックをyとして
x: ボタンの配置の変更, 色の変更
y: 滞在時間, 直帰率, 離脱率
z: 外部サービスによるモニタリング結果

y → z
を予測する関数を形成できれば代替KPIを設計することが可能

### 実験

実際のWebサイトに広告クリックに最適化する実験を実施
最適化アルゴリズムは, ε-greedy
外部サービスによるKPIよりも速く最適化できる



## 段階的詳細化能力とプログラミング学習の関係に関する研究

### 段階的詳細化能力
段階を踏んで, 抽象的な内容から具体的な内容に変換する能力
プログラムの概要から具体的なプログラムの詳細に落としこむ能力

### 実験
プログラミングのグループ学習
ビデオ再映をして会話文を文字起こしする
＋PISAによる国語力, 問題解決能力, 段階的詳細化能力テスト

会話量, プログラムに関する会話量（会話主題量）とプログラミングテスト結果を相関分析
会話量が多いかつ会話主題量が多いほどプログラミングテストの結果がよい

未経験者
プログラミング * 段階的 * 問題解決能力に相関が見られた

経験者
段階的 * 問題解決能力に相関が見られた
メタ認知による影響ではないか？



## 検索連動型広告におけるテキスト自動生成とその評価指標の検討

### 目的
検索連動型広告のTD（Title & Description）を自動生成したい
人が考えるテキストと同等の効果を持つTDの生成

### TDにおける制限 / 重要点

* Title15文字, Description38文字の制限
* 目につきやすい, 惹きつける文書
* ユーザーに飽きられないようにできるだけ多くの種類を用意する

### 提案手法

入力文書から重要文書を抽出する
入力文書＝広告主のアプリストアへの説明文

1. 文書同士の単語の頻度（or tf-idf）から類似度を計算
2. 閾値を設定し, 類似度からネットワークを形成
3. 接続エッジ数が多い文を重要文書とする

Wikipedia文書をword2vecに食わせる
重要文書内の名詞をword2vecで抽出した類似語に入れ替える

Title部分の抽出

* ルールベースの抽出
* 体言止めへの変換

### 実験
GoogleAdwordsで実施
広告主A: 2週間
広告主B: 1週間

CTRと有効率（人力判断）でテスト

既存の人力のTDとほぼ同等のCTR
tdidfを使ったほうが有効率, CTRが高い
word2vecを使うと無駄な文が生成されすぎて有効数は上がるが, 有効率は下がる



## 嗜好の類似性に着目したソーシャルネットワーク影響力分析

### 背景 / 目的

SNSにおけるインフルエンサの存在
情報配信先の嗜好に基づいた情報伝播モデルの提案

### 手法

k-meansで各ユーザーをクラスタリング
嗜好ベクトルを利用し情報の影響力が最大のクラスタを選択
情報配信の上限になるまでそのクラスタから影響力が高いノードを選択していく

嗜好ベクトルは始めの情報の配信でのみ使われている



## スマートフォンにおけるコンテンツ閲覧と共有行動の分析

Gunosy × 東京大学

### 背景 / 目的

バイラルメディアの成長
既存のメディアもバイラルメディア的戦略を取り入れている

共有行動の背景の閲覧に対してはあまり研究が行われていない
ユーザーの閲覧情報と共有情報を分析する

### データ

85%ほどが閲覧, 残り15%ほどが共有
共有のうち, 30%は閲覧なしで起こる

### トピックによる分析

tf-idfで重み付けした文書をLSIで次元圧縮
トピック数は300
最も大きいトピックが文書数の5%以下になる用に設定

|Description|該当トピック|
|---|---|
|シェア率上位|自然科学 音楽 健康 デザイン|
|シェア率下位|恋愛 炎上ネタ|
|閲覧なしシェア率上位|野球 アニメ ソシャゲ 医療 働き方|
|閲覧なしのシャア率下位|仕事 おもしろ画像 労働問題 ベンチャー 教育|

アニメや恋愛記事の閲覧は多いが, シェアは少ない
ユーザーは記事を閲覧し, 記事の内容によってシェアするかどうかきちんと判断している



## ユーザーの期待する反応に応じたツイート分類

### 背景 / 目的

SNS疲れが近年よく言われている
意図と解釈のずれ・誹謗中傷（フィルタリングで解決できる）
ex. 経緯の欠如, マジレス
ズレをシステムで検知してフィルタリングすることを目的

### 提案手法
期待する行動を定義して機械学習で分類
無反応, RT, Fav, RT+Fav

機械学習モデル
SVM + Bi-Normal Separation（特徴選択）

素性
N-gram（N=1,2,3）
parallax rfid card readerをprocessingで動かしてみた

RFIDカードのparallax rfid card readerをprocessingで動かしてみたついでに、Serialライブラリのみ使ってちょっとシリアルの勉強もしてみた。

#parallax rfid card readerとは
![Kobito.u5pWyp.png](https://qiita-image-store.s3.amazonaws.com/0/76572/5c6480f9-fc93-1d9f-8144-679d9096f2ee.png "Kobito.u5pWyp.png")

いわゆるsuicaとかpasmoとかの仲間
仲間であって同義ではないけど・・・
suicaとかはRFIDの一部のNFCという部類
http://okwave.jp/qa/q7255792.html


#parallax rfid card readerとシリアル通信
仕様詳細など
http://www.trossenrobotics.com/store/p/5378-Parallax-RFID-Card-Reader-Serial.aspx

今回注目する仕様は
・bps
(http://www.ocn.ne.jp/support/words/abc/bps.html)
・メッセージの長さ

の２つだけ
今回の仕様は上の仕様URLから
・2400bps
・8 data bits
だそうです。

#さっそく繋げてprocessingサンプルコード書いて実行
```java:rfidSample.pde
import processing.serial.*;

Serial myPort;

int lf = 10;
int cr = 13;
String str;

void setup() {
  printArray(Serial.list());
  myPort = new Serial(this, Serial.list()[0], 2400);//bps 2400
  //myPort.bufferUntil(lf);
  //myPort.bufferUntil(cr);
  myPort.buffer(12);//data bits 8
}

void draw() {
}

void serialEvent(Serial p) {
  str = trim(p.readString());
  println(str);
}

```

シリアルのbuffer関数を使うとデータ取得に便利でした。
なので先に仕様を見て区切るバイト数を見ておくのがいいんですね！
あれ？けどここで疑問が・・・
myPort.buffer(12);//data bits 8
の部分で、8とか言いながら12を入れてます・・・。
これにはわけがあります。

#シリアル通信学んだこと
学んだこととか言いながらここから予想になりますが・・・
参考URL
http://www5e.biglobe.ne.jp/~komichan/network/n1_douki.html
ここがすごくわかりやすかったですが、たぶんここでのフラグ同期方式が使われているかなぁと思っています。
んで、やってみたらわかりますが12ビットで区切ると、最初に10進数での「10」文字コードでは「lf」が、最後に10進数の「13」文字コードでは「cr」が来てました。
つまり改行ですね。
フラグパターンってやつが今回はそういうことになっているらしいです。
(buffer()使わなかったりしたときに受け取った数が2桁だったり3桁だったりに見えたことがある人はたぶんそういうことです。)
なぜそういうことになっているかわからないですが、processngのシリアルライブラリが親切にやってくれているのか、フラグパターンってのは結構自由だったりするのか・・・。

ってことで長くなりましたが、なぜ8とか言いながら12を入れているかというと、最初と最後の2bitづつフラグパターンがあるからなんですね。
シェルスクリプトでデフォルト値の代入




#概要

```sh
if [ "${addr:-X}" = X ]; then
	echo "hoge"
fi
```

みたいにコロン使った場合にどうなるかのお話です。
常識的な話かもしれませんが、自分が知らずかつググりにくかったのでメモしておきます。

`if`で比較する場合に、

```sh
if ["x$addr" = "x"]; then
    echo $addr
fi
```
のようにするのは知っていたのですが、コロン使った場合は知らなかったので一応メモしておきます。

#参考サイト
[初心者向け、「上手い」シェルスクリプトの書き方メモ](http://qiita.com/m-yamashita/items/889c116b92dc0bf4ea7d)

# コロンの使い方
基本的に変数に値がセットされているかどうかの確認のために使われるようです。

## - の場合

```sh
${addr:-value}
```
こうすると変数`addr`が空白であれば`value`がその値となるそうです。

## + の場合

```sh
${addr:+value}
```
`-`とは逆に`addr`が空白でない場合に`value`がその値となります。

## = の場合

```sh
${addr:=value}
```
変数`addr`が空白であれば`value`が`name`にセットされます。

## ? の場合

```sh
${addr:?value}
```
変数`addr`が空白であれば`value`を標準エラー出力に出力し、シェルスクリプトの実行を終了します。

## 何も付けない場合

```sh
${addr:begin}
${addr:begin:end}
```

変数`name`の「begin」バイト目から「end」文字出力します。

# おまけ
なんでいちいち`x`とかつけるのかについて説明します。

```sh
if ["x$addr" = "x"]; then
    echo $addr
fi
```

これは変数`addr`が`null`だった場合にエラーが出るからです。

```sh
if [$addr = ""]; then
```

ではダブルクォーテーションで囲えばよいのかというと、`-f`などの時に怒られるらしいです（自分の環境では怒られませんでした。誰か詳しい人教えてください）。

```sh
if ["$addr" = ""]; then
```

最も安全な記述方法は確実に文字列として評価されるようにすることらしいです。
自分はハマるのめんどくさいので`x`つけちゃってます。

```sh
if ["x$addr" = "x"]; then
    echo $addr
fi
```
homebrewインストール、libcurlをhomebrewインストール


ターミナルを開く、下記コマンド入力
参考ページ：http://liginc.co.jp/web/tool/mac-iphone/151069

コマンド：
　ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

curlをhomebrewでインストール、下記コマンドを入力
参考ページ：http://brewformulas.org/Curl

　brew install curl
Symfony2でCookieにJSONを書いたり読んだりする

# 書く

```
$name  = 'hoge';
$value = array('foo', 'bar');
$response->headers->setCookie(new Cookie($name, json_encode($value)));
```

# 読む

```
$name    = 'hoge';
$cookies = $this->container->get('request')->cookies;
$value   = json_decode($cookies->get($name), true);
```

# 余談
端末毎のCookieサイズ上限であるとか、そもそもCookieに対応してない端末の存在とか、secure属性を付けるべきか否かとか、セッションを使うべきではないかとか、ユーザが送信してくるデータなので信用せず毎回バリデーションしなければならないとか、仮に4KBのcookieを付けると設定したパスの全てのリクエストで4KBのcookieを受信する事になるから静的な画像とかcssとかjsとかはクッキーレスの別ドメインから配信した方がいいんじゃないとか、色々あるけど割愛。

# 参考
+ http://api.symfony.com/2.7/Symfony/Component/HttpFoundation/Cookie.html
+ http://api.symfony.com/2.7/Symfony/Component/HttpFoundation/ResponseHeaderBag.html#method_setCookie
+ http://symfony.com/doc/current/components/http_foundation/introduction.html#setting-cookies
Git rebase -iでコミットした内容が破棄できない場合

git rebase -iでコミットした直後であれば、以下のコマンドで巻き戻せる。
`git reset --hard ORIG_HEAD`

また、
`git reflog`
で取り消したいrebaseがどこの履歴にいるかを確認して、
`git reset --hard HEAD@{n}`
でも巻き戻せる模様。

上記の方法でもダメな時は以下を使用する。
`git rebase --abort`
PHPとの私的交際履歴を振り返ってみた

|年月|出来事|URL|私|
|---|---|----|---|
|2004.07|PHP5.0 リリース|http://php.net/ChangeLog-5.php#5.0.0|まだプログラマではない|
|2005.11|PHP5.1 リリース|http://php.net/ChangeLog-5.php#5.1.0|まだプログラマではない|
|2006.11|PHP5.2 リリース|http://php.net/ChangeLog-5.php#5.2.0|まだプログラマではない|
|2008.01| | |アルバイトでPHP4のコードを書く|
|2008.10| | |PHP5.1を使いはじめる|
|2009.06|PHP5.3 リリース|http://php.net/ChangeLog-5.php#5.3.0|PHP5.1で開発|
|2012.03|PHP5.4 リリース|http://php.net/ChangeLog-5.php#5.4.0|PHP5.1で開発|
|2013.06|PHP5.5 リリース|http://php.net/ChangeLog-5.php#5.5.0|PHP5.1で開発|
|2013.09|||PHP5.4を使いはじめる|
|2014.08|PHP5.6 リリース|http://php.net/ChangeLog-5.php#5.6.0|PHP5.4で開発|
|2015.08|||PHP5.6を使いはじめる|

# 振り返って感想など

* 2008年時点でPHP4の開発現場があったというのが驚き。PHP5が登場して4年たっても、Web業界の末端までは浸透していなかった。
* 自分がPHP5.1を使い始めた時点で既に3年遅れ。(個人的にはPHP5.1時代が長かった。)
* PHP5.4を使い始めたときには1年遅れ。だいぶ差が縮まった。
* PHP5.6は1年遅れで使いはじめる予定。(1年遅れ程度なら順当)

PHPは5.3で大きなパラダイムシフトがあったので、その波に乗り遅れたのは個人的に痛かったなと思います。

来たる7.0のビッグウェーブには早々に乗っかりたい。
ipaのProvisioning差し替え＆再署名をGUIで実施する方法


## 前提条件
* iOS Developer Programに加入済み
* XCodeのpreferenceでAccountsに上記Apple IDを追加済み

## 事前準備

### Provisioning fileの用意

[iOS Provisioning Profiles](https://developer.apple.com/account/ios/profile/profileList.action)で、差し替え先のProvisioning Profileを作成してダウンロード
※DistributionはAd Hocを選択
※App IDはXcode iOS Wildcard App IDか、別途[iOS App IDs](https://developer.apple.com/account/ios/identifiers/bundle/bundleList.action)で追加したものを選択

### iReSignのダウンロード

[maciekish/iReSign](https://github.com/maciekish/iReSign)よりダウンロード
※右側サイドバーのDownload ZIPからダウンロード可能

## Provisioning差し替え＆再署名

1. iReSignを起動（初回はiReSign.appを2本指でタップして開く）
2. Provisioning差し替え＆再署名するipaをBrowseで選択
3. 差し替え先のProvisioning fileをBrowseで選択
4. 最下段のプルダウンメニューから、署名を選択
5. 最後にReSign!で実行
Homebrewを使ってMySQLインストールする

# MySQLのインストールと設定
```bash
# インストール
$ brew install mysql

# MySQLの起動
$ mysql.server start

# MySQLの停止
$ mysql.server stop

# MySQLの再起動
$ mysql.server restart

# パスワードの変更
# rootユーザのパスワードを変更するには下記コマンドを実行し、新しいパスワードを入力します。
$ mysqladmin -u root password 'new-password'
# 一度パスワードを設定した場合
$ mysqladmin -u root -p password 'new-password'
old-password入力

# rootユーザでログイン
# パスワード入力を求められるので入力
$ mysql -u root -p password
```
## 起動時に自動起動
```bash
$ mkdir -p ~/Library/LaunchAgents
$ ln -sfv /usr/local/opt/mysql/*.plist ~/Library/LaunchAgents
# 今すぐ再起動せずに起動したい場合
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist

```
c++ builder XE4, 10.2 Tokyo > TeeChart > 凡例 > シリーズ名に変更

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

フォームデザインでは
.Chart > Legend > Style > Legend Style
を「SeriesName」に変更する。

コードでは以下のようにする。

```
Chart1->Legend->LegendStyle = lsSeries;
```

lsSeriesでF1すればlsXXXの他の値がわかる。
c++ builder XE4, 10.2 Tokyo > TeeChart > 3Dでなくす > Chart1->View3D = false;

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


グラフの3D表示を解除するにはコードで以下のようにする。

```
Chart1->View3D = false;
```

フォームデザインでは
.Chart > 3D > Options > 3 Dimensions
のチェックを外す。
Golangでソースにバージョン番号を埋め込む方法


分散型のサバクラ？エージェント式？のツールを作ってると、各クライアントのバージョンを集中して確認したくなることがあると思う。
たとえばこういうものとか → [HighBatch](https://github.com/nobuhito/HighBatch)(宣伝)

Webでちょっと探した感じだとビルド時にGitから取得するのが一般的な感じ[^1]だけど、それってGitが入ってない環境でZipとかでダウンロードした時ってどうなるの？って考えたら夜も眠れなくなりそうなのでコミット時にバージョンをつける方法を考えてみた。

```bash
cat .git/hooks/pre-commit

#!/bin/sh
a=(`git describe | tr -s '-' ' '`)
echo "package hogehoge" > hogehoge/version.go
echo "const Version = \"${a[0]}-${a[1]}\"" >> hogehoge/version.go
```

要は `git describe` を使ってプレコミットフックのタイミングでバージョン用のソースを自動で作ってるだけなんだけど、一応レビジョン番号はカットしている。
Gitのインストール元にもよるんだろうけど、一応WindowsのHookでも動作確認済み。

でも、複数人でコミットする場合はどうするの？とかHookの共有はどうするの？とか、どの環境でもうまくいく方法ではないのがイマイチな感じ。
複数人でコミットしあうときには `ver.0.9-23-nobu` とかってもう少し情報を与えないとダメだったりするので、うまくまわるのは一人で開発してる時だけかもしれませんね...
でも、ビルド痔に付加させるのもビルドするコマンドを矯正できるかどうかってのも疑問なんでそっちよりはいい感じがするかな？どっちがいいんだろう？

個人的には、ソースに埋め込む方法だとレビジョンをカットしても検索で引っかけることができるという副次的なメリットもあって良さそうだけど。

なるべく複雑なことはしたくないし。

[^1]: http://qiita.com/harukasan/items/37698ec799678c12e71d
bundle installでErrno::ENOENT: No such file or directory @ rb_file_s_statが出た時の対処法

```
--- ERROR REPORT TEMPLATE -------------------------------------------------------
- What did you do?

  I ran the command `/Users/masked/.rbenv/versions/2.1.6/bin/bundle install`

- What did you expect to happen?

  I expected Bundler to...

- What happened instead?

  Instead, what actually happened was...


Error details

    Errno::ENOENT: No such file or directory @ rb_file_s_stat - test/test_activerecord_compat.rb
    ...


Environment

    Bundler   1.10.2
    Rubygems  2.2.3
    Ruby      2.1.6p336 (2015-04-13 revision 50298) [x86_64-darwin13.0]
    Git       1.9.3 (Apple Git-50)

--- TEMPLATE END ----------------------------------------------------------------

Unfortunately, an unexpected error occurred, and Bundler cannot continue.

First, try this link to see if there are any existing issue reports for this error:
https://github.com/bundler/bundler/search?q=No+such+file+or+directory+%40+rb_file_s_stat+-+test%2Ftest_activerecord_compat.rb&type=Issues

If there aren't any reports for this error yet, please create copy and paste the report template above into a new issue. Don't forget to anonymize any private data! The new issue form is located at:
https://github.com/bundler/bundler/issues/new
```

bundlerをダウングレードすればいい
```
gem install bundler -v 1.9.6
```
leftBarButtonItemをカスタマイズしたらエッジスワイプが無効になった


タイトル通りの現象にはまった。

で、以下のようにしてやるとエッジスワイプが使えるように

```swift
override func viewDidLoad() {
  navigationItem.leftBarButtonItem = buildCustomBarButtonItem()
  
  if let d = navigationController as? UIGestureRecognizerDelegate {
    navigationController?.interactivePopGestureRecognizer?.delegate = d
  }
}
```
アクティビティクラスを文字列で指定して起動する


機能評価のアプリを作る際、評価する機能毎にアクティビティを分割することがよくある。 

ListViewのタップされた位置から起動するアクティビティをif文の分岐で書くのが簡単だが、アクティビティが増えると表示するテキストとアクティビティの指定を間違えやすくなる。

なので、最近はこんな風にクラスの文字列からクラスを取得するようにしている。

```java
        try {
            String classname = "HogeActivity";

            Class<?> cls = Class.forName(getActivity().getPackageName() + "." + classname);
            Intent intent = new Intent(getActivity(), cls);
            startActivity(intent);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
```

具体的には、 strings.xmlでアクティビティのリストを定義して

```xml:strings.xml
    <string-array name="activities">
        <item>Sample1Activity</item>
        <item>Sample2Activity</item>
        <item>Sample3Activity</item>
    </string-array>
```

以下の様なリストフラグメントを作って

```java:MainActivityFragment.java
public class MainActivityFragment extends ListFragment {

    private String[] mStrings;

    public MainActivityFragment() {
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        mStrings = getActivity().getResources().getStringArray(R.array.activities);
        ListAdapter adapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, mStrings);
        setListAdapter(adapter);
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        try {
            String classname = mStrings[position];

            Class<?> cls = Class.forName(getActivity().getPackageName() + "." + classname);
            Intent intent = new Intent(getActivity(), cls);
            startActivity(intent);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
```

MainActivityでこれを表示する。

```java:MainActivity.java
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (savedInstanceState == null) {
            setContentView(new FrameLayout(this));
            MainActivityFragment fragment = new MainActivityFragment();
            getSupportFragmentManager().beginTransaction().replace(android.R.id.content, fragment, "fragment").commit();
        }
    }
    
    ...
```
MacにPHPのImagickを楽にインストールする

ImageMagick周りとかpeclのimagick周りとかネットに氾濫する情報を参考にしててハマりどころ多かったので現時点で楽に動くメモ。

# 1. PHPのインストール

brewでインストール。MacのApacheに組み込むときはwith-apxs2付加。

```
brew install php56 --with-apxs2=/usr/sbin/apxs
```

# 2. ImageMagick

brewでインストールするとハマりどころが多い。
インストーラでインストールした方が早い。

http://cactuslab.com/imagemagick/

# 3. Imagickのインストール

PECLで入れる、との情報が多い。が、以下を実行するとimagickなんてないと言われる。

```
$ pecl install imagick
No releases available for package "pecl.php.net/imagick"
install failed
```

ソースからビルドはめんどうなのでbrewでインストール。

```
$ brew install php56-imagick
```

# 4. テスト

```php
	public function test_imagick()
	{
		$img = new Imagick();
		$this->assertNotNull($img);
	}
```
技術英語 > interim fix > 暫定的なfix > This interim fix is minimal for the benefit of stable...

https://github.com/torvalds/linux/commit/1c220c69ce0dcc0f234a9f263ad9c0864f9718

> This interim fix is minimal for the benefit of stable@ because the more comprehensive cleanup of passing a sector_t to all DM targets' merge function will impact quite a few DM targets.

http://www.hydrocad.net/interimrelease.htm
> As part of ongoing software development, interim versions of HydroCAD are sometimes made available for evaluation and comment.

http://ejje.weblio.jp/content/interim
> an interim certificate : 仮証書

「仮」に関連して思い出したのが
- makeshift tents
Dropboxの共有リンクから ruby の httparty gem でファイルを読む方法

リンクの引数の dl=0 を raw=1 に変更することと、リダイレクト先をおっかけるオプションをつけることがポイントです。

```rb
require "httparty"
response = HTTParty.get("https://www.dropbox.com/s/xxxxxxxxxxxxxxx/a.txt?raw=1", :follow_redirects => true)
response.body                   # => "a.txt の中身です。\n"
```
gifアニメみたいなのがoFでやりたい

oFでちょっとしたgifアニメみたいなのをやりたくなった時のメモ
こちらを参考にしました。
http://www.slideshare.net/tado/itamabi-13-3iphone-1
田所先生に感謝です！


```cpp:ofApp.h
#pragma once

#include "ofMain.h"

#define FRAME_NUM 4 // コマ画像の枚数

class ofApp : public ofBaseApp{

	public:
		void setup();
		void update();
		void draw();
    
    // コマ画像を配列にしまう
    ofImage img[FRAME_NUM];

    // 現在のフレーム
    int currentFrame;
		
};

```

```cpp:ofAp.cpp
//--------------------------------------------------------------
void ofApp::setup(){
    
    ofSetFrameRate(10);
    
    // 画像全部読み込み
    for (int i = 0; i < ENGELE_FRAME_NUM; i++) {
        char pathStr[32];
        sprintf(pathStr, "img%d.png", i);;
        img[i].loadImage(pathStr);
    }
    
    currentFrame = 0;

}

//--------------------------------------------------------------
void ofApp::update(){

}

//--------------------------------------------------------------
void ofApp::draw(){
    
    img[currentFrame].draw(500, 500);
    
    
    // 最後のフレームまで++
    if(currentFrame != FRAME_NUM -1){
        currentFrame++;
    }

}
```
laravel5でMailクラスにメールアドレス等の引数渡すときのTips


Laravel5のMailクラス便利ですよね。

公式ドキュメントだと、こんな感じで書いてあります。
http://readouble.com/laravel/5/0/0/ja/mail.html

```php:
Mail::send('emails.welcome', ['key' => 'value'], function($message)
{
    $message->to('foo@example.com', 'John Smith')->subject('Welcome!');
});
```

この
'foo@example.com', 'John Smith'あたりは変数で行きたいところです。

PHPの無名関数に引数を渡すときは、useを使うのだそうです。

```php:

$user = $this->user->whereId('hogehoge')->first();

Mail::send('emails.welcome', ['key' => 'value'], function($message) use($user)
{
    $message->to($user->email, $user->name)->subject('Welcome!');
});
```
消費税が8%になってgoogle playのdeveloper consoleで困ったこと

##事の発端
iOSのtierに合わせる形でgoogle playのアプリ内アイテムの価格を修正したんです。
google playは皆さんご存じ、税抜きと税込みの価格を入れれるようになっててwallet側で消費税を設定しておけば、税抜き価格から税込価格を自動で計算して代入してくれるという便利機能があるんです。
で、税抜き価格を入れて、税込み価格を自動換算して、公開設定したところアプリが落ちる・・、という事態になりました。

##落ちた原因
私の場合、アプリ内で、google playに接続してアイテムの表示名とか価格とか取ってくるようになってるんですが、価格をとってきたらlongにキャストしてるんです。
月にいくら買ったかとか計算したいから。
そこで型が合わないという理由で落ちてました。

##解決策
１．とりあえず落ちたら困るのでdoubleでキャストする
２．自動換算機能は使わない（税込価格も手動で入力する）

##その他
ストアから取得できる価格は2種類で、一つはキャストしやすいように数字の価格で計算用？のもの。今回キャストするときにアプリを落とした張本人です。
それと、表示用でしょうか。通貨単位記号とコンマが入った文字列があります。『￥9,800』という感じ。
表示だけなら後者を使うのも手です。￥記号が邪魔ですが・・・。

---
追記：2015.07.13
後から分かった部分ですが、課金のライブラリのバグでした。
OpenIABというUnityのライブラリを使っているのですが、そいつが(OpenIAB/SkuDetails.cs)Googleから価格の情報(price_amount_micros)を受け取ったのち、floatにキャストをしていて、そこで誤差が生じて小数点が発生していました。
Googleのみなさん疑ってごめんなさい。そしてOpenIABはバグ修正頼む。
pylab で plot するときに、x軸の値を n 倍する

matplotlib で プロットするときに、

* 軸はそのまま自動で生成させたい。
* でも軸のラベルは全部 10 倍にしたい

みたいなときは、 xticks でラベルと取ってきて、
それを編集して書き戻せば良い。 

    xticks, strs = pylab.xticks()
    pylab.xticks(xticks, ["%d" % x for x in 10 * xticks])
注文詳細API

ヤフーショッピングの注文詳細APIの項目につきましてご質問がございます。

Yahoo管理画面から注文情報をCSVダウンロードする際の項目に「 ItemCouponDiscount 	定額・定率クーポン値引額」という項目がございますが、注文詳細APIでこれに該当する項目はどれになりますでしょうか（「CouponDiscount」の総和になりますでしょうか）。

ご教示いただけますと幸いです。
どうぞよろしくお願いいたします。
Bracketでフォントのアンチエイリアスを調整する(Macの場合)


[Bracket](http://brackets.io/)は便利なエディターです。  
但し、私の環境だとデフォルトでかかっているアンチエイリアスの設定(`-webkit-font-smoothing: antialiased;`)
の見た目がどうしても許せず発狂しそうになります。

期待値としては、Atomのような感じでアンチエリアスがかかって欲しい...。
という訳で、スタイル設定を以下のように弄りました。

## 設定方法
`Brackets.app/Contents/www/index.html`を開いて、styleを追加します。

```html
    <!-- Pre-load third party scripts that cannot be async loaded. -->
    <script src="thirdparty/thirdparty.min.js"></script>
    <!-- 以下を追加する -->
    <style type="text/css">
      .main-view {
        -webkit-font-smoothing: auto;
      }
    </style>
</head>
```

これで、全体のフォントのアンチエイリアス設定を変更出来ました。

## 反映結果
ちなみにそれぞれこんな感じになります。
`auto`か`subpixel-antialiased`が個人的に気に入りました。

| -webkit-font-smoothing | Image |
|:-----------|------------|
| antialiased (Bracketのデフォルト | ![kobito.1433125762.403250.png](https://qiita-image-store.s3.amazonaws.com/0/11214/0119b4e9-57df-8484-ab4a-50dec07730fa.png "kobito.1433125762.403250.png") |
| auto | ![kobito.1433125819.916649.png](https://qiita-image-store.s3.amazonaws.com/0/11214/2395d78a-4fb2-b59f-1995-4e4414cb367f.png "kobito.1433125819.916649.png") |
| inherit | ![kobito.1433125863.557654.png](https://qiita-image-store.s3.amazonaws.com/0/11214/ffe63475-6b17-1358-ebb1-53731965094c.png "kobito.1433125863.557654.png") |
| initial | ![kobito.1433125908.804741.png](https://qiita-image-store.s3.amazonaws.com/0/11214/4f3363c6-2b3c-9a5b-eb25-8b6cfb800437.png "kobito.1433125908.804741.png") |
| none | ![kobito.1433125946.120273.png](https://qiita-image-store.s3.amazonaws.com/0/11214/9b6f3f6f-ecd1-88ed-369e-911e9ed4f457.png "kobito.1433125946.120273.png") |
| subpixel-antialiased | ![kobito.1433125986.062938.png](https://qiita-image-store.s3.amazonaws.com/0/11214/9f7211dc-ec35-0b4d-05a7-6cf18f500c87.png "kobito.1433125986.062938.png") |


## オマケ
Bracketはユーザー任意のStyleSheet定義出来ないんだなーと思っていたらこんなissueがありました。
* [user stylesheet — feature request #10548](https://github.com/adobe/brackets/issues/10548)
Visual Studio 2015 RC をインストールしてみた！

Visual Studio 2015 RC をインストールしました。種類には 無料版の Community Edition、Professional 版、Enterprise 版がありますが、インストールしたのは **Community Edition (無料版)**です。

**関連リンク**
[Visual Studio 2015 Product Offerings](https://www.visualstudio.com/en-us/products/vs-2015-product-editions.aspx)

Community Edition は正式版でも無料のはずですが、いろいろ制限があるようです。下の記事は VS2013 についてのものですが、VS2015 も同じと予想されます。

**BuildInsider**
[「Pro相当機能が無料！」と話題になった「Visual Studio Community」の光と“影”](http://www.buildinsider.net/hub/insidersbreak/2014112101)

この記事によると、個人の開発者の利用は自由のようですが、企業での利用は制限がきついです。実業務で使う場合は、Professional 版以上を使う必要がありますね。

仮にライセンス違反をしたまま使い続けるとどうなるんでしょうね。ネット経由でマイクロソフトのサイトにアクセスしたとき Community Edition であることがわかりますし、IP アドレスから企業名が特定できてしまう可能性があります。

インストール後のメニューですが、こんな感じになっています。IDE が２つあります。１つは従来の IDE、もうひとつは Blend (画面デザイン用) です。

メニューを見ると非常に高機能でたしかに Professional 版相当ですね。

![VS15menu](https://s3-us-west-2.amazonaws.com/big10be/images/vs2015/VS15menu.png)
インストール後のメニュー (Windows 8.1)

メニューの構成はこんな感じになっています。

![Vs2105IDE](https://s3-us-west-2.amazonaws.com/big10be/images/vs2015/Vs2105IDE.png)
Visual Studio 2015 RC Community Edition

![MenuFile](https://s3-us-west-2.amazonaws.com/big10be/images/vs2015/MenuFile.png)
File メニュー

![MenuEdit](https://s3-us-west-2.amazonaws.com/big10be/images/vs2015/MenuEdit.png)
Edit メニュー

長いので以下省略。
[続きもあります](http://bonk.red/show.php?id=39)