OmniAICreator/Qiita-1.07M huggingface dataset:
電子工作 / youtube > Link > IMU (gyroscope and accelerometer)を使ってローカル位置情報を取得

IMU (gyroscope and accelerometer)を使って、ローカルの位置情報を取得している例。
[3D Tracking with IMU](https://www.youtube.com/watch?v=6ijArKE8vKU&index=50&list=PL_MJualihC5CAtnZHphK-hli8aSL3PRRz)

階段を上っている様子が分かる。

動画の作者はSebMadgwickResearchで、IMUのAHRS algorithmの作者らしい。
http://www.x-io.co.uk/open-source-imu-and-ahrs-algorithms/

ハンディ3Dスキャナには欲しい技術ではあるが、今は同化できる気がしない。
SQL Server エージェントの拡張ストアド プロシージャを使用できるようにする

#Agent XPs の設定
Agent XPs の設定をして、SQL Server エージェントの拡張ストアド プロシージャを使用できるようにする。
このオプションを有効にしないと、SQL Server Management Studio のオブジェクト エクスプローラーに SQL Server エージェントのノードが表示されない。
#設定方法
SQL Server に接続して、以下のクエリを実行する

```sql
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Agent XPs', 1;
GO
RECONFIGURE
GO
```
lite-server(Browsersync) - クロスドメイン制約を回避する

開発時のシミュレーションでローカルに立てた別のサーバーにアクセスしてファイルをダウンロードするといったことを試すときに、手軽に実行したかったので`lite-server`とコマンドを打つだけでローカルサーバーになる、[lite-server](https://github.com/johnpapa/lite-server)（[Browsersync](https://www.browsersync.io/)のラッパー）を使用した。

そこへXMLHttpRequestすると、'Access-Control-Allow-Origin'の指定がヘッダーにないよ～アクセス出来ないよ〜と言われてしまう。

```
XMLHttpRequest cannot load http://localhost:3000/honyarara.json. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3002' is therefore not allowed access.
```

Browsersyncのオプションとして、プロキシとしてたてる事でも回避できるけれど、別ドメインという想定で実装を行いたかったので、browsersyncでたててるサーバー側のヘッダにどこからでもアクセスしていいよ〜という設定を追加する。

```
// ヘッダを追加する
function setHeader(req, res, next) {
    res.setHeader('Access-Control-Allow-Origin', '*');
    next();
}

module.exports = {
    server: {
        middleware: {
            0: setHeader
        }
    }
};
```

これでうまくアクセスできるようになりました。

- [broser-sync Options](https://github.com/BrowserSync/browser-sync/wiki/options)
ZDNetの記事インタビューを受けた感想

#インタビュー
今年、ZDNet Japan様から記事のインタビューを受けました。SAP製品の技術的内容やビジネス上のメリットに関するインタビューです。[鼎談(3人でのディスカッション)](https://kotobank.jp/word/%E9%BC%8E%E8%AB%87-574523)という形で技術的なトピックを扱った2ページに渡る記事です。
人生の初のインタビューでした。今回の記事はその雑記です。これから、インタビューを受ける予定の方、どんなものだろうと興味を持った方向けです。
#思ったこと
####記者の能力高い
鼎談の中では、議論が混沌とすることもあったり、技術的に深すぎるところまで触れることもあったりですが、非常によくまとめてくれました。比較対象がないので、相対的に担当頂いた記者の能力が高いかわかりませんが、優秀な方々だったと思います。
つまり、**インタビューがわかりにくくてもまとめてくれる**ので安心してもいいと思います(もちろん、わかりやすいにこしたことはありません)。
####事前準備
上司と**想定問答のシミュレーションをし回答の骨子を決め、肉付けと推敲をしました。**そのため、インタビューで困ることは特になかったです(むしろ、他人が回答している内容を奪いたい場面もありました)。私はアドリブうまいタイプではないので、やはり準備の必要は身にしみました。
####感想
**純粋に楽しかったです。**また、機会があったらやってみたいです(そんな機会はめったに無いでしょうが)。ちなみに、私の名前でググると自分の画像がトップに出るようになりました(笑)
Mauticで「composer install」時「"'cache:clear --no-warmup'" command.」

##問題

Mauticでアップデート作業中、バージョンの違うブランチに切り替えるため、composer installしようとしたら、

「 An error occurred when executing the "'cache:clear --no-warmup'" command.」

というエラーが出て、先に進まない。

##解決方法

app/cache/prodを削除したら解決した。

##参考サイト

https://www.mautic.org/community/index.php/1405-after-updating-mautic-to-1-2-3-configuration-error/0
JavascriptでGeneratorを使う 


Generator 手を付けようか迷っていた所でAsync Awaitとかも出てきたしもういいやぁ…と思ってたんですが、何かとやっぱり使いドコロはありそうだったので。

http://qiita.com/kidach1/items/d997df84a0ede39d76ad#%E7%9B%B4%E5%88%97%E5%87%A6%E7%90%86%E6%8E%A1%E7%94%A8


例えばp5.jsとかみたいなアニメーション関連でdrawとかがループされるようなやつ。

繰り返し処理になるので Generator が活きてくる。

````
const newMessage = function* (mes) {
    var counter = 500;
    while (true) {
        fill("#fff");
        text(`${mes.user}\n${mes.text}`, counter, 200)
        counter = counter - 10;
        yield false;
        if (counter < 20) {
            break;
        }
    }
    yield true;
}
````

アニメーションでありがちな状態の管理をジェネレータの中に閉じ込めることが出来る。

呼び出し側のコードはこんなん

````
p5.draw = () => {
	// ...

    if(storeChanged){
        if(gen === null){
            gen = newMessage(newMessage)
        }
        if(gen.next().value){
            store.message = newMessage;
            gen = null;
        }
    }
}
````

そしてめんどくさかったのがWebpackでのgenerator

````
regeneratorRuntime is not defined
````

なるエラーが出て使えなかったので色々探しまわった。

結果、Webpack側の設定で、

````
module: {
    loaders: [
        { 
        	test: /\.js/,
        	exclude: /node_modules/,
        	loader: "babel" ,
        	query:{
        		presets:["es2015"],
        		plugins:["transform-runtime"]
        	}
        },
    ]
}
````

としてやればいいことが判明。

プラグインは下記コマンドで入ります。

````
$  npm install babel-plugin-transform-runtime
````

こちらの内容は、7/26開催の [Processing/p5.jsもくもく会@大阪](http://connpass.com/event/36015/)にて試してきました。

p5.jsは実際に自分で書くのは初めてだったけど(コードリーディングは何度か…程度)まぁ色々出来ることも多くてとっつきやすそうな印象でした。
Frisby+Jasmine+google-spreadsheets-parserでREST APIの試験

## 背景
開発で既存のREST APIの調査・改修に関わったので、とりあえず正しく動く確認できる環境を作りたかった。
Google Chromeアプリの「ARC」などがよく紹介されていて、単発でのチェックにはとても良いけど、「まとめて動作試験」だと人力作業になってしまうし、パラメータの共有などがしづらい。

## テストのコード化
ということで、コードでの動作確認方法として、「Frisby+Jasmine」を使ってみた。
参考文献も多く、確かに便利。JSONでやり取りする場合の内容チェックもやりやすい。
ただ、テストは「インプット→アウトプット」の組み合わせチェックとなるので、その分かなり定型コードを書かなければいけない。

なので、APIに渡すJSON(インプット)、APIから返るJSON(アウトプット)、をGoogleスプレッドシートで集中管理できると嬉しい。
今回は、簡単にスプレッドシートからデータを読み出せる"google-spreadsheets-parser"を使ってコードを作成。

Googleスプレッドシートで、一列目に「title」「post」「expected」というタイトル列を作成し、二列目以降にテストデータを入力して、下記を実行する。
エンドポイント周りなどは、試験するREST APIに応じて変わったりすると思う。

```sample_spec.js
var category = "<category>"; // シートのタブ名

var GoogleSpreadsheetsParser = require('google-spreadsheets-parser');
var frisby = require("frisby");

var gss = new GoogleSpreadsheetsParser("<公開したスプレッドシートのリンク>",
        { sheetTitle: category, hasTitle: true });
var API_END_POINT = "<http://localhost:8080/api>"; // 環境に合わせて

var paramsJson = gss.toJson();
var params = JSON.parse(paramsJson);

for (var index in params) {
    var obj = params[index];

    var title = obj.title;
    var post = obj.post;
    var expected = obj.expected;

    frisby.create(title)
    .addHeaders(
            { "Content-Type":"application/json" }
    )
    .post(
            API_END_POINT,
            null,
            { "body": post }
    )
    .expectStatus(
        200
    )
    .expectJSON(JSON.parse(expected))
    .toss();
}
```

```command
% npm install --save-dev jasmine-node frisby google-spreadsheets-parser
% node_modules/jasmine-node/bin/jasmine-node sample_spec.js
```

駆け足のメモ程度ですが。
テストのパラメータをスプレッドシート化できると、テスト実行コードはシンプルになるので良い。
定型的なものには、自動化・データ集約のメリットは大きい。

### 参考
http://frisbyjs.com/
https://www.npmjs.com/package/google-spreadsheets-parser

http://qiita.com/zaburo/items/8f967acd26ea08e2a54a
http://ttr-hamasaki.hatenablog.com/entry/2015/09/27/070557
http://qiita.com/tanakaworld/items/48cf222e1e911e1761c4
Mautic初回設定時orログイン時に「The CSRF token is invalid. 」

##問題
Apacheユーザを変更した際、初回設定のNextstepボタン押下後、またはログイン時、先に進まず、

「The CSRF token is invalid. Please try to resubmit the form.」

と表示される、という問題が発生した。

##解決方法
PHPセッションデータの所有者権限を変更後のApacheユーザにしてあげると解決した。

```shell-session
#自分の場合apacheからdeployに変更
$ sudo chown -R deploy:deploy /var/lib/php/session
drwx------. 2 deploy deploy 4096  7月 26 18:14 session
...
```

sessionのディレクトリはphp infoを見ると分かるらしい。
自分の場合はCentOS6.5のphp5.6で、上記の場所にあった。


##参考サイト
https://www.mautic.org/community/index.php/962-invalid-csrf-token-at-install/0
http://tweeeety.hateblo.jp/entry/20121218/1355802787
https://ymyk.wordpress.com/2012/03/15/PHPセッションデータの保存先
slickでslick-arrowをオリジナル画像に変える一番簡単な方法

シンプルにこれで終わりです。

```js:style.css
.slick-prev:before {
  content: "" !important;
}

.slick-prev:after {
  content: url(/assets/arrow_left.png);
}

.slick-next:before {
  content: "" !important;
}

.slick-next:after {
  content: url(/assets/arrow_right.png);
}
```

ページ内にカルーセルが複数ある場合、ググると逆にハマります。。。
Xeon > E5-16xx と E5-26xxの違い > 1 way / 2 way

数値計算用のXeonについて調査中。

Broadwell-EPのXeon E5-16xx / E5-26xxあたりが最近のものだろうか。

この2つの違いは以下にある。
http://ascii.jp/elem/000/000/931/931363/
> 登場したのは1way向けの「Xeon E5-1600 v3」シリーズと、2way向けの「Xeon E5-2600 v3」シリーズ。

1wayと2wayとは何かは以下。
http://ameblo.jp/nx-station/entry-10039326654.html
> 例えば、1wayサーバは 1個のCPUが搭載されたサーバ。形状は主に、省スペース型もしくは1Uラックマウント型です。
2wayサーバは、2個のCPUが搭載可能なサーバです。マザーボードのCPUソケットの数なので。CPUを1つか2つ載せるかの選択が可能です。
Scala の implicit parameter のスコープと左辺値型推論で困った話

Scala の特徴的言語仕様の一つであり、憎まれたり便利だったりする implicit の小ネタです。いろいろ検証過程を書いてるので、結論だけ知りたい人は最後を見てね。

# 便利な implicit parameter

implicit には何種類かあるのはご存知という前提で。implicit parameter 便利ですよね。

```scala
implicit val g = "Hello "

def hoge(name: String)(implicit greet: String) {
  println(greet + name)
}

hoge("Biacco") // 2番めのパラメタ群については implicit に渡される
```

ただ、この implicit が解決されるスコープと型推論が組み合わさるとややこしいことになるようです。

# implicit parameter の解決スコープと型推論がうまく動かない例

今回ハマったのはこれ。

```scala
object Main extends App{
    import Hoge._
    val h = new Hoge
    h.hoge
}

class Hoge {
    def hoge(implicit s: String) { println(s) }
}

object Hoge {
    implicit val hs = "hoge!"
}
```

一見動きそう。でもコンパイルすると

```
error: could not find implicit value for parameter s: String
```

なるほどわからん。

## 検証1: スコープを確認する

スコープに正しく入ってないのかな？と思って以下を試す。

```scala
object Main extends App{
    import Hoge._
    val h = new Hoge
    h.hoge(hs) // 明示的に hs を渡してみた
}

class Hoge {
    def hoge(implicit s: String) { println(s) }
}

object Hoge {
    implicit val hs = "hoge!"
}
```

動くんですよねこれが。コンパイル通ります。おっかしいな〜〜〜〜〜〜〜〜〜〜

## 検証2: ローカルスコープにおいてみる

というわけで、スコープに存在しないわけではないというのがわかった。じゃあ間違いなくアクセスできるということで試しにローカルスコープにおいてみる。

```scala
object Main extends App{
    import Hoge._
    
    implicit val hs = "hoge!"
    
    val h = new Hoge
    h.hoge
}

class Hoge {
    def hoge(implicit s: String) { println(s) }
}

object Hoge {
}
```

これもOK. この辺でかんべんしてくれという気持ちになり始める。

# 問題の定義: implicit な変数がスコープ内にいるにもかかわらず implicit parameter で解決されない

というわけで、現在の問題は

- implicit な変数はスコープ内にいる
- implicit parameter がそれを解決できない
- implicit な変数はローカルスコープではなく import のスコープにいる

になります。一応 [暗黙のパラメータ解決優先順位](http://eed3si9n.com/ja/implicit-parameter-precedence-again) なんかを見てみるものの、import した場合は Prefix なしの状態で参照できることとなっているが、 ```import Hoge._``` しているのでそこも問題なさそうである。

# 解決法

まぁ、タイトルにもしているのでお気づきかと思いますが、この問題は implicit parameter と左辺値型推論が組み合わさると発生するようです。なので明示的に型注釈を与えてみます。

```scala
object Main extends App{
    import Hoge._
    
    val h = new Hoge
    h.hoge
}

class Hoge {
    def hoge(implicit s: String) { println(s) }
}

object Hoge {
    implicit val hs: String = "hoge!"　// implicit な変数に型注釈をつける
}
```

と、コンパイルできるようになりました！出力もちゃんと ```hoge!``` になる。なんだったんだこれ...

解決した後に見つけたんですが [OE さんがもう書いてた](http://taisukeoe.github.io/blog/2015/07/11/scala-implicits/)。死にたい。

Scala コミュニティでは定期的に話題になる問題のようです。きびしい。

今回のは良くなかったね...
fluent-logger-node 2.0.1

[fluent-logeer-node](https://github.com/fluent/fluent-logger-node) の 2.0.1 をリリースしました :smile: 

2.0.0 はCIの設定が間違っていたのでリリースをやり直したら 2.0.1 になりました :sweat_smile: 

# 主な変更点

* require ack response に対応
* tag_prefix
* エラー処理の改善
* winston transport の追加

## require ack response に対応

Fluentd v0.12 以降でサポートされている [at-least-once semantics](http://qiita.com/repeatedly/items/78fcd7e14e31b931f7eb#%E3%83%AD%E3%82%B0%E8%BB%A2%E9%80%81%E3%81%A7%E3%81%AEat-least-once-semantics) を fluent-logger-node でも利用できるようになりました。

`requireAckResponse` オプションを `true` に設定すると使えるようになります。

```js
var logger = require('fluent-logger').createFluentSender('tag_prefix', {
   host: 'localhost',
   port: 24224,
   requireAckResponse: true
});
```

実装するときには以下のドキュメントを参考にしました。

* [Forward Protocol Specification v0 · fluent/fluentd Wiki](https://github.com/fluent/fluentd/wiki/Forward-Protocol-Specification-v0)

## tag_prefix

`tag_prefix` に `null` を指定できるようになりました。
これで `emit` するごとに全く別のタグを指定できるようになりました。

```js
var logger = require('fluent-logger').createFluentSender(null, {
   host: 'localhost',
   port: 24224
});

logger.emit('tag', 'message');
```

これに対応したことでメジャーバージョンを上げました。

## エラー処理の改善

エラー処理をまとめて書けるようになりました。

```js
var logger = require('fluent-logger').createFluentSender(null, {
   host: 'localhost',
   port: 24224
});

logger.on('error', function(error) {
  console.log(error);
});

logger.emit('tag', 'message');
```

以前は `emit` のコールバックで似たようなことができたのですが、`emit` のコールバックは `emit` が成功したときも失敗したときも呼ばれてしまうのでコールバック内で条件分岐する必要があって不便でした。

## winston transport の追加

以前、要望があった [winstonjs/winston: a multi-transport async logging library for node.js](https://github.com/winstonjs/winston) 用の Transport を追加しました。

似たことをやっている外部のプロジェクトもあったのですが、winston はよく使われているようだったので fluent-logger-node 側で、サポートすることにしました。

# まとめ

fluent-logger-node の最近の変更点についてまとめました。
html, css, jsをS3から配信してオンプレサーバ上のSPAのデプロイを簡素化する

## 概要/背景

オンプレサーバ上の簡単な登録フォームをサーバレスっぽく作り直した


### before

#### 構成 

- フォーム(html+js) + バリデーション/データ保存する APIという構成のアプリをN個のWEBサーバにデプロイしていた
- 各WEBサーバにAPIのコードとHTMLなどのアセットを配置
- サブミットされた登録内容はWEBサーバのローカルファイルに保存


#### いまいちだった点

- 各WEBサーバへのファイルのデプロイを手動で行っていた
- 登録データのファイルをN個のWEBサーバからコピーしないとすべてのデータが集まらない


### after
 
#### 構成

- 各WEBサーバにはプレースホルダのHTMLだけを配置
- HTMLの中身,JS, CSS, 画像などはS3から配信
- データ保存は[firebase](https://www.firebase.com)を使う
- fireabse上のデータのダンプと変換をaws lambdaで行う
    1. firebaseからダンプして
    2. JSONからCSVへ変換
    3. アクセス制限したS3バケットへアップロード
    4. URLをメール(SNS)で関係者に送信
- APIで行っていたバリデーションは[firebase rules](https://www.firebase.com/docs/security/quickstart.html)で実現

#### 改善点

- S3上のファイルを更新すればコンテンツの更新ができる
- firebaseにデータを集約できる
- データの保存はfirebaseにまかせてコンテンツの作成に集中できる
- コンテンツの更新が複数サーバ上へのデプロイではなくS3 APIの操作で完結できる

#### まだいまいちな点

- データ量やトラフィック量によってはオンプレでの運用よりもお高くなる
- firebaseからダンプしてくるjsonファイルはエンジニア以外には扱いづらいので一工夫が必要

----

## 設定ファイルとか

#### package.json

```json

 "devDependencies": {
    "babel": "^6.5.2",
    "babel-loader": "^6.2.4",
    "babel-plugin-transform-inline-environment-variables": "^6.5.0",
    "babel-preset-es2015": "^6.6.0",
    "css-loader": "^0.23.1",
    "file-loader": "^0.8.5",
    "html-loader": "^0.4.3",
    "style-loader": "^0.13.1",
    "url-loader": "^0.5.7",
    "webpack": "^1.12.14",
    "webpack-dev-server": "^1.14.1"
  },
```


#### webpack.config.js

```js

module.exports = {
	context: __dirname,
	entry: "./js/app.js",
	output: {
		path: "./dist/",
		filename: "bundle.js"
	},
	module: {
		loaders: [
			{test: /\.js$/, exclude: /node_modules/, loader: "babel-loader"},
			{test: /\.css$/, loader: 'style-loader!css-loader'},
			{test: /\.(jpg|png|jpeg|gif|ttf|woff|woff2|svg|eot)$/, loader: 'url-loader'},
			{test: /\.html$/, loader: 'html-loader'}
		]
	}
};
```


#### app.js(エントリポイント)


```js

// CSSのロード
require('../css/some.css')
// HTMLをロード
const BODY = require('../body.html')


//<body>を置き換える
$(function(){
	$('body').html(BODY);
})
```


#### index.html(プレースホルダHTML)

```html

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <script type="text/javascript" src="<S3上のbundle.js>" charset="UTF-8"></script>
  </head>
  <body></body>
</html>
```


#### データの取得

```bash

curl -o https://<appId>.firebaseio.com/.json?auth=<SECRET>&print=pretty
```
新卒2年目SEの備忘録[バッチ・API・トリガーファンクション調べてみた]

#明確な違いとは・・
SEの現場ではよく耳にする単語だが、それぞれの"意味"や使う"場面の違い"が
よく分かっていなかったので、調べてまとめてみることにした。

#それぞれの概要
・[バッチ](https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%83%81%E5%87%A6%E7%90%86)
⇒バッチ処理を行う際の処理内容（命令）を記述したバッチファイル（.bat）のことであり、
　バッチ処理とは、処理目的ごとに区切られたプログラムを順次実行・回分処理する処理を指す。

・[API](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%95%E3%82%A7%E![キャプチャ1.PNG](https://qiita-image-store.s3.amazonaws.com/0/123834/b9c733b4-6300-5520-cfc0-871c650cd7be.png)
3%83%BC%E3%82%B9)
⇒"A"pplication"P"rogramming"I"nterfaceの略であり、
　アプリケーションから各種ライブラリを利用する際の入り口を指す。

・[トリガーファンクション](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%88%E3%82%A2%E3%83%89%E3%83%97%E3%83%AD%E3%82%B7%E3%83%BC%E3%82%B8%E3%83%A3#.E3.83.95.E3.82.A1.E3.83.B3.E3.82.AF.E3.82.B7.E3.83.A7.E3.83.B3.E3.81.AE.E4.BE.8B1.EF.BC.88DB.E6.93.8D.E4.BD.9C.E3.81.AA.E3.81.97.EF.BC.89_3)
⇒ストアドプロシージャの1つであり、あるきっかけをもとに実行されるあらかじめ用意された処理を指す。
　ストアドプロシージャは、[RDBMS](https://ja.wikipedia.org/wiki/%E9%96%A2%E4%BF%82%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0)内に保存したデータベースに対する一連の処理をまとめたものを指す。

##つまり・・
・「バッチ処理」「トリガーファンクション」は、”一連の処理をまとめたもの”
・「API」は、"あらかじめ用意された処理を簡単に使える決まりごと（規格）のようなもの"
といったところだろうか？

##使うとしたらどんな時？
それぞれの使用例は以下のようなものであった。
![キャプチャ1.PNG](https://qiita-image-store.s3.amazonaws.com/0/123834/083c19aa-274b-efc5-680b-412140dd6752.png)

#調べてみて・・
実際に調べてみると、それぞれ全く違った用途であることや
それぞれの特徴をつかむことが出来た。
特に、「バッチ」と「トリガーファンクション」については
処理のまとまりという点で同じだが、それぞれの違いを理解することが出来た。
View#onTouchEvent を実装したが最初のタッチのイベントしか来ない

解を先に書くと「onTouchEvent の戻り値を true にせよ」

検索してもなかなか見つからず解決に行き着くのに苦労してしまったのでメモ。

##経過

* 動機：マルチタッチのイベントの様子を観察してみよう。
* 実装：
  * 既存アプリに導入しやすくするには透明な View として実装すればいいかな。
  * View レベルで実現するには `android.view.View` を継承して onTouchEvent を実装すればよいと。
  * Android Studio で onTouchEvent 補完、どん。（この時点で自動生成されたコードは `return super.onTouchEvent(event);` になっている。これが間違い。）
  * 引数の MotionEvent を適当にログに吐き出してみると。
* 実行してみる：
  * あれ？最初のタッチの ACTION_DOWN しか制御がこない。なんで？
  * UP さえもこない。
  * 全部離して再度タッチすると、その最初は来るな。
* 調べる：
  * 公式チュートリアルみても onTouchEvent を実装って書いてある。
  * マルチタッチを受け取るために何か set 系や request 系などの設定は必要ないみたいだし。
  * Activity に onTouchEvent を実装するとちゃんと来てる。ということは環境の問題ではない。
  * マルチタッチの実装記事を見ても何も無いし。なんで～？ →探し回る。
  * http://stackoverflow.com/a/12588509/3180048 これかー

##対策

**View の onTouchEvent が false を返すと、そのジェスチャーに関する以降のイベントはその View に送られなくなる。** なので true を返せ、と。

##後知恵

onTouchEvent のドキュメントの戻り値の説明は

> True if the event was handled, false otherwise. 

となっている。以降のイベントがどうのなんて書いてない...。

そして自動生成された `return super.onTouchEvent(event);` は false を返すと。

##追加考察

となると、今回狙おうとしたイベント的に透明な View というのは書けないようだ。
[Android のタッチイベントを理解する(その1)](http://blog.lciel.jp/blog/2013/12/03/android-touch-event/) によれば、
ViewGroup にして onInterceptTouchEvent を使うと子への配信前に呼ばれるらしい。ただし requestDisallowInterceptTouchEvent があるので子からの干渉が可能と。
【Docker】FluentdとElasticsearchとKibanaの環境構築


FluentdとElasticsearchとKibanaの組み合わせが流行ってる？みたいなのでdocker環境で作ってみました。

## 前提

* ログは行にJSON
* FluentdとElasticsearchとKibanaは同じサーバ上に存在

## 構成

```bash
.
├── docker-compose.yml
├── elasticsearch
│   └── Dockerfile
├── fluentd
│   ├── Dockerfile
│   ├── fluent.conf
│   └── plugins
└── log
    └── hoge_log # 収集するログ
```

## Docker

```docker-compose.yml
elasticsearch:
  build: elasticsearch
  ports:
    - 9200:9200
fluentd:
  build: fluentd
  ports:
    - 24284:24284
  volumes:
    - ./log:/var/log/hoge
  links:
    - elasticsearch
kibana:
  image: kibana
  ports:
    - 9204:5601
  environment:
      - ELASTICSEARCH_URL=http://elasticsearch:9200
  links:
      - elasticsearch
```


## Fluentd

```Dockerfile
FROM fluent/fluentd:latest-onbuild

USER fluent

WORKDIR /home/fluent
ENV PATH /home/fluent/.gem/ruby/2.3.0/bin:$PATH
RUN gem install fluent-plugin-secure-forward # セキリュティ対策
RUN gem install fluent-plugin-elasticsearch # Elasticsearch連携

EXPOSE 24284

CMD fluentd -c /fluentd/etc/fluent.conf -p /fluentd/plugins -vv
```

```fluent.conf
<source>
  type tail
  path /var/log/hoge/hoge_log
  tag json.hoge
  pos_file /var/log/hoge/hoge_log.pos
  format json
</source>

<match json.**>
  type copy

  <store>
    type elasticsearch
    host elasticsearch
    port 9200
    logstash_format true
  </store>

  <store>
    type stdout
  </store>
</match>
```

## Elasticsearch


```Dockerfile
FROM elasticsearch

RUN bin/plugin install mobz/elasticsearch-head

EXPOSE 9200

CMD  ["bin/elasticsearch", "-Des.insecure.allow.root=true"] # root=trueが無いと初回起動で失敗する
```

## 起動

```bash
$ docker-compose up --build
```


Elasticsearch ページ

```
http://[IP]:9200/_plugin/head/
```

Kibanaページ

```
http://[IP]:9204/
```

こんな感じで試しにログを追加してみる

```bash
$ echo "{ hoge :"hoge" }" >> log/hoge_log
```

Elasticsearchにログが入っていればOK

## github

今回のプロジェクトを公開しています。
https://github.com/naruminn/fluentd-elasticsearch-kibana
[Windows][VirtualBox] VirtualBoxの既存のVMの追加でUUIDがすでにあると言われる場合の対応

# 環境変数PATHにVBoxManage.exeへのPATHを追加
このエラーをわりと頻繁にみかけるので、今後便利になるようにまずは `VBoxManage.exe` があるディレクトリにPATHを通します。
環境によって違いますが、Windowsではだいたい以下のような箇所にあるはずです。

```text:VBoxManage.exeが存在するディレクトリにPATHを通す
C:\Program Files\Oracle\VirtualBox
```

PATHを追加しない場合は、上記にある `VBoxManage.exe` を直接実行してももちろん問題ありません。

# vdiのUUIDのでエラーになる場合 (Cannot register the hard disk...)

以下のコマンドでuuidの変更を行います。

```console:uuidの変更を実行
$ VBoxManage.exe  internalcommands sethduuid <vdiの存在パス>
```

以上でvdiのuuidの変更は完了です。


# VBoxGuestAdditions.iso の UUID でエラーになる場合 (Cannot register the DVD image...)

こちらは余り頻度は高くないですが、`Cannot register the DVD image...` のようなエラーが発生するケースがありました。
原因はわからないですが、解決方法はあったので記載しておきます。

## 1. 仮想メディアマネージャーを開く

![2.png](https://qiita-image-store.s3.amazonaws.com/0/37721/24d65ef1-beb3-dd2a-7878-ac5d7a18b3df.png)

## 2. VBoxGuestAdditions.iso を解放 -> 除去する

![1.png](https://qiita-image-store.s3.amazonaws.com/0/37721/a3fb9268-9c1d-b4af-7ef9-56a0f25868e0.png)

これでもう一度追加を実行すればエラー無く追加ができました。

# *.vbox の UUID でエラーになる場合

そのまま使用する解決法は見つかりませんでしたので、一度消して、新規作成から作り直したところエラーが無くなりました。

# 参考
[VirtualBoxで仮想diskのUUIDを変更する - リジェクトされました](http://ri.hateblo.jp/entry/2013/10/22/232749)
[virtualbox.org • View topic - "Cannot register the DVD image" error on Mac](https://forums.virtualbox.org/viewtopic.php?f=8&t=51911)
無名クラス(匿名クラス)によるインタフェース実装。

```java



interface Hoge{
	public abstract void method();
}
class Fuga implements Hoge{
	public void method(){
		System.out.println("method.");
	}
}
public class Test {
	public static void main(String[] args){
		Hoge hoge = new Fuga();
		hoge.method();
	}
}



//は、



interface Hoge{
	public abstract void method();
}
public class Test{
	public static void main(String[] args){
		//無名クラスによる実装を伴うならば
		//new インターフェース名() から始まる記述は可能。
		Hoge hoge = new Hoge(){
			public void method(){
				System.out.println("method.");
			}
		};
		//ここまでメソッドの実行は無し。
		hoge.method();
	}
}



//と等価(同じ挙動)。



```
ポケモンGoでピカチューに夢中なオトナたちを、Twitter × dashDBで観察してみた

ポケモンといえば、人気者ピカチュー・・ということで、
　「ポケモンGoをプレイしている方々の、ピカチューに関するtweetはどんなもんか」というのを、Bluemixのサービスの【Insight for Twitter】と【dashDB】を組み合わせて、調べてみました。

## 用意するもの
・ポケモンを愛する心
・Insight for Twitter
・dashDB
・若干のSQLのスキル

## 手順

### ポケモンGo+ピカチューに関するtweetをdashDBのテーブルに格納する

**ハッシュタグを指定**
![スクリーンショット 2016-07-27 10.05.47.png](https://qiita-image-store.s3.amazonaws.com/0/119378/9adc08e9-846a-a7cd-b712-03b7be480e4c.png)

**ロード！**
どきどき・・・。
![スクリーンショット 2016-07-27 0.59.13.png](https://qiita-image-store.s3.amazonaws.com/0/119378/8945b188-839f-b72f-fb15-6ba33ea99481.png)

### 結果を見てみる
![スクリーンショット 2016-07-27 1.04.52.png](https://qiita-image-store.s3.amazonaws.com/0/119378/31692377-8698-7e0e-3a54-4e3600923306.png)

国別・・・とか、色々書いてありあますが、今回は**Sentiment information**に注目してみました。
ピカチューという人気者に関するツイートなのに。なんでNEGATIVEが多いのか・・・？

**人気者ピカチューでNEGATIVEツイート？！**
どんなツイートか見てみたかったので、クエリを投げて、具体的にどんな内容のツイートかを見てみました。

```sql
select poke_pika_tweets.message_body from poke_pika_tweets,poke_pika_sentiments 
where poke_pika_tweets.message_id=poke_pika_sentiments.message_id
and
poke_pika_sentiments.sentiment_polarity='NEGATIVE';
```

![スクリーンショット 2016-07-27 1.18.42.png](https://qiita-image-store.s3.amazonaws.com/0/119378/f6cd4b3f-5d09-d470-0adf-56fbb4cc2400.png)

スクロールしていくと・・・
![スクリーンショット 2016-07-27 1.19.44.png](https://qiita-image-store.s3.amazonaws.com/0/119378/54799864-62b3-aa00-a059-23a0d6841f7e.png)

**もうちょいで捕まえられたのに・・・悲しい・・・**といったようなツイートの数々・・
なるほど、ピカチューそのものに対するNEGATIVEではなく、人気者ピカチューを捕まえられなかったオトナたちの愚痴や悔しさがTwitterを賑わせていたわけですね。。

### 考察
ピカチューの人気は、やはり絶大！（含む、独断と偏見）


## ご参考
手順もある程度この記事にも載せますが、若干端折っています。

丁寧に解説/ログを残したのはこちらの記事です。
http://qiita.com/azzeten/items/4145ab0200e9af834994
【Windows】Unity上からコマンドプロンプトを起動したい


#はじめに
Unity上からWindowsのコマンドプロンプトを起動するにはどうすればいいのか気になったので調べてみました。

OSはWindows 10です.

#ソースコード
``` EditorRunTerminal.cs
using UnityEditor;
using System.Diagnostics;

public class EditorRunTerminal
{
    [MenuItem("Window/Run Terminal %t")]
	static void RunTerminal()
    {
        Process p = new Process();
        p.StartInfo.FileName = System.Environment.GetEnvironmentVariable("ComSpec");
        p.StartInfo.Arguments = "/k cd Assets";
        p.Start();
    }
}
```

#結果
Ctrl + Tを押すとコマンドプロンプトが起動します
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/1bdd71f0-f011-55be-093b-ff809705765e.png)


#参考
外部アプリケーションを起動する、ファイルを関連付けられたソフトで開く
http://dobon.net/vb/dotnet/process/shell.html

DOSコマンドを実行し出力データを取得する
http://dobon.net/vb/dotnet/process/standardoutput.html

コマンドプロンプト起動時のオプション一覧(windows)
http://blog.layer8.sh/ja/2011/12/16/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%AE%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3/
Windows10のKB3172985のインストールに失敗する


Windows10のKB3172985のインストールに失敗するのでなんとかしたい

##トラブルシューティングしてみる
http://answers.microsoft.com/ja-jp/windows/forum/windows_10-update/windows-10-windows-update/a8a3a4cb-9d67-406e-8ae6-d25451c237d7?auth=1


**できなかった**

## とりあえず非表示にする

Windows7ならWindows Updateでインストール項目を非表示にできた。（Windows8は知らない)
Windows10はそういったオプションは存在しないようだ。

### どうするのか


下記URLで解説されている。
https://blogs.technet.microsoft.com/jpsecurity/2015/07/30/windows-10-windows-update-12/

要はツールをダウンロードする。
http://download.microsoft.com/download/F/2/2/F22D5FDB-59CD-4275-8C95-1BE17BF70B21/wushowhide.diagcab

これを実行するとインストール項目を非表示にしたり再表示にしたりできる。
【論文読み】A Neural Conversational Model

# [A Neural Conversational Model](https://arxiv.org/pdf/1506.05869.pdf)
## どんなもの？
sequence2sequenceモデルを対話に使ったシンプルなモデルで対話を実現した。

## 先行研究と比べてどこがすごい？
従来の対話モデリングのアプローチは、特定のドメイン(例:飛行機のチケット予約)に対してであり、手でルールを書く必要があった。提案するsequence2sequenceモデルではend-to-endで学習を行うことができ、ルールもほとんど書く必要がない。Noisyなドメインでも検証。

## 技術や手法のキモはどこ？
sequence2sequenceモデルを使うことで、与えられた発話、あるいは発話履歴から次の発話を予測する。
<img width="555" alt="スクリーンショット 2016-07-27 9.51.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/77079/d52a59d7-682c-f2b1-fd39-5ca56aabcec5.png">

## どうやって有効だと検証した？
クローズドメインのデータセットとオープンドメインのデータセットを使って学習し、作成したモデルについて人間が評価した。
なお、データセットについてはそれぞれ以下の通り:

* クローズドメイン: IT Helpdesk Troubleshooting dataset
* オープンドメイン: movie transcript dataset

ある質問に対する答え方を既存の対話システム(CleverBot)と作成したモデルを比較することで行った。
作成したモデルでは200の質問の中97が好ましく、CleverBotは200のうち60が好ましいという結果となり、無事勝利。

## 議論はある？
一貫性がないのでチューリングテストを通過するのは難しそう。
>**Human**: what is your job ?
>**Machine**: i ’m a lawyer .
>**Human**: what do you do ?
>**Machine**: i ’m a doctor .

## 次に読むべき論文は？
[Sequence to Sequence Learning with Neural Networks](https://papers.nips.cc/paper/5346-sequence-to-sequence-learning-with-neural-networks.pdf) かな。
RailsでBootstrapのナビゲーションでアクティブメニューに自動でclassを付与


表題の通りなのだけれども、RailsでBootstrap3を使い、以下のようなナビゲーションを作って、Views/layouts/application.html.rbに書いている場合

~~~html:Views/layouts/application.html.rb
<nav class="navbar navbar-default">
	<div class="container-fluid">
		<div class="navbar-header">
			<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbarEexample">
				<span class="sr-only">Toggle navigation</span>
				<span class="icon-bar"></span>
				<span class="icon-bar"></span>
				<span class="icon-bar"></span>
			</button>
			<a class="navbar-brand" href="#">タイトル</a>
		</div>
		
		<div class="collapse navbar-collapse" id="navbarEexample">
			<ul class="nav navbar-nav">
				<li class="active"><a href="#">メニューＡ</a></li>
				<li><a href="#">メニューＢ</a></li>
				<li><a href="#">メニューＣ</a></li>
			</ul>
		</div>
	</div>
</nav>
~~~

##表示
![kobito.1469580112.171089.png](https://qiita-image-store.s3.amazonaws.com/0/134471/7aa8a063-ff29-984b-fd4a-9f60352b28f5.png "kobito.1469580112.171089.png")


ページが切り替わる度に該当するメニューのところだけactiveクラスを付与したい。
というときがありますね。
そういう場合、例えば

~~~erb:Views/layouts/application.html.rb
<ul class="nav">
  <li class="<%= 'active' if current_page?(root_path) %>"><%= link_to "Home", root_path %></li>
  <li class="<%= 'active' if current_page?(about_path) %>"><%= link_to "About", about_path %></li>
  <li class="<%= 'active' if current_page?(contact_path) %>"><%= link_to "Contact", contact_path %></li>
</ul>
~~~

みたいにすることでクラスをつけられるのですが、若干面倒だし見栄えがイマイチ。。

そこで、以下のGemの登場。

comfy/active_link_to: View helper to manage &quot;active&quot; state of a link
https://github.com/comfy/active_link_to

早速やってみる。

~~~ruby:Gemfile
gem 'active_link_to'
~~~

上記を追加したら、`bundle install`を実行
すると、こんな感じで書ける。

~~~erb:Views/layouts/application.html.rb
<ul class="nav">
  <%= active_link_to 'TOP', root_path, :wrap_tag => :li, :active => [['welcome'], ['index']] %>
  <%= active_link_to 'About', about_path, :wrap_tag => :li %>
  <%= active_link_to 'Contact', contact_path, :wrap_tag => :li %>
</ul>
~~~

クール！
一点、rootを含むパスの指定だとうまくいかない場合がある模様。
その場合は、:active要素に、[[コントローラ名], [アクション名]]
を指定してやると良い。

参考：
active linkでroot pathの設定 - 開発メモ帳
http://d.hatena.ne.jp/runatubu/20121013/1350096568

以上
c++ builder XE4, 10.2 Tokyo > fileIO > フォルダパスの最下層フォルダ名にprefixをつける

```txt:動作確認
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2018/01/09)
```

## やりたいこと

```
C:\Users\user\Documents\RAD Studio\Projects\00-work
```

の最下層フォルダ00-workを以下のようにprefix文字(L"PRE_"など)をつけたい。

```
C:\Users\user\Documents\RAD Studio\Projects\PRE_00-work
```


## code v0.1

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <IOUtils.hpp>
#include <memory>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------

String getDeepestDir(String srcstr)
{
    // [AAA\\BBB\\CCC\\DDD]から[DDD]を取得する

	std::unique_ptr<TStringList> list(new TStringList);

    list->StrictDelimiter = true;
    list->Delimiter = L'\\';
    list->DelimitedText = ExcludeTrailingPathDelimiter(srcstr);

	return list->Strings[list->Count - 1];
}

String addPrefixToDeepestDirName(String srcstr, String prefix)
{
	String dpst = getDeepestDir(srcstr);
	String prnt = TDirectory::GetParent(srcstr);

	return prnt + L"\\" + prefix + dpst;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
	String path = L"C:\\Users\\user\\Documents\\RAD Studio\\Projects\\00-work";

	String res = addPrefixToDeepestDirName(path, L"PRE_");
	OutputDebugString(res.c_str());

}
//---------------------------------------------------------------------------
```


```txt:結果
デバッグ出力: C:\Users\user\Documents\RAD Studio\Projects\PRE_00-work プロセス Project1.exe (3176)
```

関連 
[c++ builder / fileIO > 最下層フォルダ名を取得する実装](http://qiita.com/7of9/items/f788bfacf06a9fa99610)


## code v0.2

addPrefixToDeepestDirName()を以下のように修正した。
文字列の最後に`L"\\"`がついている時に置換が失敗して、最下層フォルダのさらに下にフォルダを作ってしまう不具合に気づいたため。

```
String addPrefixToDeepestDirName(String srcstr, String prefix)
{
	String wrksrc = ExcludeTrailingPathDelimiter(srcstr);

	String dpst = getDeepestDir(wrksrc);
	String prnt = TDirectory::GetParent(wrksrc);

    return prnt + L"\\" + prefix + dpst;
}
```
c++ builder / fileIO > TStringDynArray と TStringListの受け渡し > copy manually

```txt:動作確認
C++ Builder XE4
```

TDirectory::GetDirectories()などで使われるTStringDynArray型は使い慣れていない。

TStringListとの関係を見ていて、以下を見つけた。
[How to convert a TStringDynArray to a TStringList](http://stackoverflow.com/questions/26380689/how-to-convert-a-tstringdynarray-to-a-tstringlist)

> TStringList and TStringDynArray do not know anything about each other, so you will have to copy the strings manually:

あえて変換しないといけない場面にはまだ出くわしていない。
プルリクでやられると困っちゃうことまとめ

最近めっきり便利屋さんみたいなポジションになってしまい、サーバーにしろアプリにしろ「プルリクお願いします」と言われることが多くなってきました。

僕もスーパーなエンジニアでは全くないのであれこれ試行錯誤しながらコードを見ているのですが、今回はそんな中でやられると困っちゃう（オブラート10枚くらいで包んだ表現）ことをまとめます。

# ちょっと困っちゃうやつ
* プルリクの説明がコミットログ（しかもテキトーに書いたやつ）の羅列
* プルリクのタイトルがない
* 改行コードが変わったのか、ファイル全体が差分になる
* 明らかに不要なコメントアウトが残ってる
* 個人的なデバッグ用のコードが残ってる（sysoutとか）
* 指摘された部分を修正した際、同じ内容の他の箇所が直っていない

# 困っちゃうやつ
* コードに明らかに実装漏れ（空のメソッドとか）があったので指摘したら、「あ、それ別のブランチで対応予定です」って言われる
* プルリクの説明にない対応が一緒に入っている

# とても困ったちゃん
* 時間かけていろいろ指摘したら、「プルリク出せば完成だと思ったので修正時間は確保してませんでした」って言われる。なんなら「いちいちうるせーなー早く承認してよ」みたいな反応される。
* そもそもの設計から指摘したくなるボリュームのソースコードをいきなりプルリクされる

# 解説
> * プルリクの説明がコミットログ（テキトーに書いたやつ）の羅列
> * プルリクのタイトルがない

このあたりはプルリク出すときに、きっと流れ作業のようにプルリクボタンを押しているのだと思います。
チェックする人はコンピューターではないので、コードを見れば全てを理解できるわけではありません。ぜひ人間の言葉でこのプルリクが何を表すのかを書いておいてほしいところです。
後々見返すときにもとても重要です。

> * 改行コードが変わったのか、ファイル全体が差分になる
> * 明らかに不要なコメントアウトが残ってる
> * 個人的なデバッグ用のコードが残ってる（sysoutとか）

プルリクを出す前に、必ず自分がレビュワーになったつもりで一度変更を全て確認してほしいと思います。
この手の見返せば自分で気づける系の指摘をするのはとても時間の無駄ですし、場合によってはそれがミスなのか意図的なのか、意図的だとしたらどんな意図があるのか、などを推察したり確認したりと余計な手間がかかってしまいます。

> * 指摘箇所を修正した際、同じ内容の他の箇所が直っていない

これはちょっと「こことここも以下同文で直しておいてね」と一言言っていないレビュワーにも原因があるので何とも言えないのですが、一応気を付けてほしいこととして載せてみました。


> * コードに明らかに実装漏れ（空のメソッドとか）があったので指摘したら、「あ、それ別のブランチで対応予定です」って言われる

ならそうどこかに書いておいてください。
上記と同様、何か理由があるのかと思って余計な労力を使ってしまいます。
ちゃんと事情があれば、それを踏まえてチェックすることができます。

> * 時間かけていろいろ指摘したら、「プルリク出せば完成だと思ったので修正時間は確保してませんでした」って言われる。なんなら「いちいちうるせーなー早く承認してよ」みたいな反応される。

何のためにプルリクしているのかを考えてほしいところです。
プルリクは偉い人が書類にハンコを押す作業ではありません。複数人の目で見ることによって、ひとりで開発しているときには気づけなかった観点を入れ、プロダクトをより良いものにするための工程です。流れ作業のように確認して終わり、ではありません。

指摘が入るのは当たり前ですし、そこから議論を重ねて「なんでこう書いたのか」をチームとして説明できるようになって初めて最終的なリリース物として世に出すことができるソースコードになります。

もし何らかの事情があって、指摘に対する議論や修正の時間がないほど切羽詰まっているのであればそう言ってください。それならTODOを残しておいて後で修正する等の対処ができます。

> * そもそもの設計から指摘したくなるボリュームのソースコードをいきなりプルリクされる

どこからツッコめばよいのか分からなくなります。事前（コーディング前）に設計レビューの場を用意してください。

# まとめ

プルリク見てると実感するのですが、プルリク見るのって相当エネルギーを使います。

本当に一行一行、一文字一文字について変なミスがないか、そのコードで1年後に問題が出ないか、人が変わっても大丈夫か、などいろいろなことを考えながらチェックします。なんなら自分でコーディングするときより気を遣ってます。数行の変更や追加でも時間を使います。それでもプロダクトをよりよくするためにリソースを確保するわけです。

そのため今回挙げたような、そのリソースが無駄になったり余計なリソースを使わせたりさせられることをされると「困っちゃう」わけです。特にプルリクを単なる承認作業だと思われるのが一番ツラいです。

全てはより良いプロダクトを世に出し、ユーザーも開発者も幸せになるための大事な工程ですので、プルリク出す方も見る方も少しの気遣いで建設的に進めたいと思う今日この頃です。

----

__追記__ (2016/07/27)
この記事だけだと僕がプルリク嫌いな人みたいな印象を与えてしまうような気がしてきたので、[プルリクでやられると嬉しいことまとめ](http://qiita.com/chooyan_eng/items/d8add0a86028eb1fb681) という記事を書きました。

よろしければ併せて読んでみてください。
c++ builder XE4, 10.2 Tokyo > fileIO > 親ディレクトリを取得する > TDirectory::GetParent()

```txt:動作確認
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2018/01/09)
```

あるフォルダパス文字列から一つ上のフォルダパスを取得したい。

参考
http://stackoverflow.com/questions/14639230/directory-path-manipulation-in-delphi

TDirectory::GetParent()を使うようだ。

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <IOUtils.hpp>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	String path = L"C:\\Users\\user\\Documents\\RAD Studio\\Projects\\00-work";

	String upper = TDirectory::GetParent(path);
	OutputDebugString(upper.c_str());

}
//---------------------------------------------------------------------------
```

```txt:結果
デバッグ出力: C:\Users\user\Documents\RAD Studio\Projects プロセス Project1.exe (3196)
```

`00-work`がなくなったフォルダパスを取得できた。
Rails4.2 ActiveModelで最大値を取得する方法


ActiveModelで一番新しい日付のレコードを取得する方法

~~~ruby
result = Article.where(site_id:1).maximum(:created_at)
~~~

site_idが1でレコード作成日時が最大のものを取得する。

最大はmaximumで、最小はminimumで指定。
Where句で条件指定する場合は、maximum,minimumの前にwhereを指定。逆だとエラーになる。
Linuxについて

# Linuxの特徴
・UNIX互換のOS
・オープンソース
・種類がたくさんあり、自分にあったディストリビューションが選択可能

## Linuxディストリビューション
Linuxを操作できるようなパッケージがまとまっているもの。

### Linuxディストリビューションの種類・特徴
・Debian系
 Knoppix,Ubuntu,Linux Mint

フリーのOSを作成するために連携した個人の集団によって開発されたOSである。
PCを動作されるための、必要最小限の、基本プログラムやユーティリティーで作らている。
インストールする時に個々の必要なアプリケーションを指定しなければならないため手間はかかるが，必要最小限のシステム構成にできる。アプリケーション構成を柔軟に設定できる。手間はかかるが、相互依存性のあるアプリケーションは自動的にインストールされる。例えば，Webブラウザの「Firefox」をインストールするときに，ライブラリを一つひとつ指定する必要はない。Firefoxを指定すれば，必要なプログラムはすべてインストールされる。

・Slackware系
 S.u.S.E Linux,openSUSE

各ソフトウェアとライブラリーの依存関係は自分で管理しなければならない。
なんかいろいろ大変そう。
ソースコードからインストールする。
多くのディストリビューションに比べると、セキュリティ上の落とし穴に陥ることが少ない。
かなり検証をしてからバージョンアップしたものをリリースする。
ユーザーが必要とするコンポーネントのみをインストールすることによって、またSlackwareのリリースポリシーによって、ほとんどのディストリビューションよりも高速な動作が可能になっている。

・RedHat Linux系
 Fedora,RHEL,Scientfix Linux,CentOS

有償。（RHEL）
Linux -> Fedora -> RHEL -> CentOS (無償)
サーバー向き？

(RHEL7)
パフォーマンス改善のためのツールがある。パフォーマンスの計測や監視、チューニングのために、Performance Co-Pilot（PCP）やThermostatなどのツールが提供される。
コンテナ型仮想化の機能。cgroup、namespaceといったLinuxカーネルの機能を利用したLXCにより、、1つのカーネルの上で複数のOS環境を作り出せる。
Windowsとの相互互換あり。
システム管理フレームワークのOpenLMI？。管理対象マシンにエージェントをインストールし、複数のサーバーをリモートから統合的に管理できるという。

・独立系
 ArchLinux,Micro Core Linux


[主な違い]
　・アプリケーションのディレクトリ構成が違う
　・パッケージ管理システムが違う


#### Linuxカーネル
 Linux(OS)の核となるもの。
 アプリケーションから命令を受けて、ハードウェアを制御してる
Processing / ControlP5 > serialPlotter (v0.3, v0.4) > String split()使用 / for文でのシリーズ処理の準備

```txt:動作環境
Processing 3.1.1 on Windows 8.1 pro(64bit)
Library: ControlP5 v2.2.6
Library: Serial
```

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

## code v0.4

[v0.4 @ github](https://github.com/yasokada/processing_160726_serialPlotter/releases/tag/v0.4)

以下を実装した。

- v0.3 
  - String split()を使用して、受信文字列のparsing
- v0.4
  - シリーズの処理をfor文でまとめるための変更 (途中)

動作そのものはv0.2と変化なし。

String splitを使うことでずいぶんすっきりできた。

```java
void serialEvent(Serial myPort) {
  String mystr = myPort.readStringUntil('\n');
  mystr = trim(mystr);
  println(mystr);
    
  String wrk;
  for(int si = 0; si < maxnumSeries; si++) { // si: series index
    wrk = mystr.split("\\s+")[si];
    if (wrk.length() > 0) {
      datamatrix[si][numSeriesData[si]] = float(wrk);
      numSeriesData[si]++;
    }
  }
}
```

マトリックスのインデックス指定に`[si][numSeriesData[si]]`には違和感がある。
`numSeriesData[si]`を一時変数に置くかどうか。


## code改良版

[shiracamusさんの改良コメント](
http://qiita.com/7of9/items/2e6e3c7880fafe8014d4#comment-bddcd30f2cd808cc7dba)
を参照ください。
技術英語 >  but it’s not [negligible]. 

@ LOE > July 11, 2003

http://www.loe.org/shows/shows.html?programID=03-P13-00028
>  but it’s not <font color=red>negligible</font>.

http://www.merriam-webster.com/dictionary/negligible
> : very small or unimportant

この用語は１０年前くらいはよく目にしていたが、環境が変わってからとんと目にしなくなった。

前の環境で使っていた英語と今の環境で使っている英語はやはり違うのだろう。

再び必要になった時に記憶の宮殿から戻せればいいし、忘れていてもまた憶えればいい。
Windows 7 日本語化 覚書

#仮想マシンのインストール
1. [Microsoft 公式イメージ](https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/) をダウンロードする。
   *Note:* 3.54 GB と結構重たいので要注意。
2. 圧縮ファイルを展開する。
3. VirtualBox を起動し、以下の順に操作する。

ファイル > 仮想アプライアンスのインポート

#Guest Additions の更新
デバイス > Guest Additions CD イメージの挿入 > Run VBoxWindowsAdditions.exe

#Windows Update の正常化
kb3168965 をインストールする。これをインストールすると、
いつまで経っても更新プログラムのダウンロードやインストールが終わらない、
という症状を解決できるらしい。
(実のところ効果があるのかよく判らないのだが ......)

##パッケージのダウンロード
1. IE を起動する。
2. [Microsoft Update カタログ](https://catalog.update.microsoft.com/v7/site/Home.aspx) を開く。
3. 検索窓へ ``kb3168965`` と入力して検索する。
4. ``製品`` のフィールドをクリックして並び替える。
5. 32 bit 版のパッケージをクリック。
6. ``バスケットに追加`` をクリック。
7. ``バスケットの表示`` をクリック。
8. ``ダウンロード`` をクリック。
9. ``参照`` をクリック > 任意のフォルダを選択 > ``続行`` をクリック。

##パッケージのインストール
1. コマンドプロンプトまたは PowerShell を管理者権限で起動する。
2. ``net stop wuauserv`` を実行して Windows Update を停止する。
3. kb3168965 のインストーラを起動する。

#言語パックのインストール
Windows Update > Optional > Japanese Language Pack > OK

*Note:*
何だかよく解らないのだが、インストールされるまでに 30 分以上かかる。
なかなか耐え難いものがあるが、ゲームでもしながらひたすら待つしかない。

#表示言語の日本語化
Control Panel > Region and Language

* Formats > Format > Japanese
* Location > Current location > Japan
* Keyboards and Languages > Change keyboards
  * General > Japanese(Japan) - Microsoft IME
  * Japanese(Japan) が最優先されるように順番を変える。
* Keyboards and Languages > Choose a display language > 日本語
* Administrative > Change system locale > Japanese(Japan)

#キー配列の日本語化
コントロールパネル > ハードウェアとサウンド > デバイスマネージャー > キーボード > プロパティ

* ドライバー > ドライバーの更新 >
  コンピューターを参照してドライバーソフトウェアを検索します >
  コンピュータ上のデバイスドライバーの一覧から選択します >
  ``互換性のあるハードウェアを表示`` のチェックを外す > 次へ
  > (Standard keyboards) > Japanese PS/2 keyboard(106/109) > 次へ

#タイムゾーンの変更
忘れがちな作業だが、システム時計のタイムゾーンを変えておく。

1. タスクバー下部右端の時間と日付の表示部分をクリック
2. 日付と時刻の設定の変更
3. タイムゾーンの変更
4. (UTC+09:00) 大阪、札幌、東京
5. OK
Working Setを作ってSTS(Eclipse)のプロジェクトをグループ化する

今回は、STS(Eclipse)のプロジェクトをWorking Setをつかってグループ化する方法を紹介します。（今携わっている案件のメンバーがWorking Set知らない感じだったので :sweat_smile: ）

STS(Eclipse)のワークスペース内にプロジェクトを作成 or インポートすると、以下のようにフラットにプロジェクトが表示されます。

<img width="1351" alt="スクリーンショット 2016-07-27 2.13.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/117313/8f3a55bf-bd8c-ee69-9546-68afef87f5b6.png">


プロジェクトの数が少なければ特に問題になることはありませんが、プロジェクトの数が多くなるとグループ化して表示したい願望が生まれます。そんな時に使えるのが、Working Setという機能です。

Working Set機能を利用すると、以下のような感じでグループ化して表示することができます :v: 

<img width="333" alt="スクリーンショット 2016-07-27 2.51.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/117313/7b301a51-bdbd-eb59-4195-a56aa7255d30.png">


では、Working Setを作ってプロジェクトをグループ化しましょう。まず、「Package Explorer」の右側の「▽」マークをクリックし「Select Working Set...」を選択してください。

<img width="1350" alt="スクリーンショット 2016-07-27 2.32.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/117313/c9c99d68-c75c-5b2c-974f-a44d23fb0089.png">

<img width="366" alt="スクリーンショット 2016-07-27 2.35.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/117313/8fbe0497-742b-5b74-c814-145c7715db57.png">

「New...」を選択後、グループ化するプロジェクトのタイプを選択します。（ここでは「Java」を選択することにします）

<img width="522" alt="スクリーンショット 2016-07-27 2.36.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/117313/9960bae6-fcc8-76c9-3738-309ebd55d8cf.png">


Working Setの名前を入力し、Working Setに含めるプロジェクトを選択します。左側のエリアでWorking Setに含めたいプロジェクトを選択して「Add ->」ボタンを押下してください。

<img width="628" alt="スクリーンショット 2016-07-27 2.40.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/117313/875bc05a-8146-4299-14c7-88cc494c9cad.png">

<img width="619" alt="スクリーンショット 2016-07-27 2.42.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/117313/d29fde45-8362-b48d-955e-162bdd60efa9.png">

「Finish」ボタンを押下後、「OK」ボタンを押下します。

<img width="371" alt="スクリーンショット 2016-07-27 2.45.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/117313/fe0c57dd-9669-1e35-ca8f-e33d889eb2e4.png">

最後に「Package Explorer」の表示方法を変更します。「Package Explorer」の右側の「▽」マークをクリックし「Top Level Elements」→「Working Sets」を選択するだけです。

<img width="1347" alt="スクリーンショット 2016-07-27 2.50.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/117313/88f89223-275a-7c23-4d71-748edf9a1d40.png">


完成 :v: 

<img width="333" alt="スクリーンショット 2016-07-27 2.51.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/117313/7b301a51-bdbd-eb59-4195-a56aa7255d30.png">


Working Setは表示だけではなく、プロジェクトのクローズやオープンなどの操作もまとめて行うことができます。さらに検索する時の検索範囲として指定することもできます。

###### Working Set単位の操作

<img width="330" alt="スクリーンショット 2016-07-27 2.55.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/117313/a0068d8a-52bb-88d6-62c0-ecbeefe18d5c.png">

###### Working Setの範囲で検索

<img width="1139" alt="スクリーンショット 2016-07-27 2.54.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/117313/0adbef0c-63bb-bf5a-db06-9c9dcc64b024.png">
ionicでlivereloadで真っ白になる問題

ionicのios platform 4.0以上の場合起こるようです。

下記のふたつのプラグインを入れる

```
ionic plugin add https://github.com/apache/cordova-plugin-whitelist.git
ionic plugin add cordova-plugin-transport-security
```


```
ionic address
```

でlocalhostではない方のIPアドレスを選択


config.xmlに書き込む

```
<allow-navigation href="http://先ほど選択したIPアドレスを記入:8100/*"/>
```

```
ionic emulate ios -l -c
```


以上で動きました。
MavenプロジェクトをSTS(Eclipse)にインポートする

今回は、MavenプロジェクトをSTS(Eclipse)にインポートする方法を紹介します。（今携わっている案件の開発環境構築手順が地道にインポートする方法になっていたので・・・ :sweat_smile: ）

STSを起動してワークスペースを開いたら、Package Explorerを右クリックして「Import...」を選択します。


<img width="1347" alt="スクリーンショット 2016-07-27 2.05.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/117313/a1f0be13-d4ae-e008-6177-446cdd9db307.png">


「Existing Maven Projects」を選択して、「Next >」を押下します。

<img width="524" alt="スクリーンショット 2016-07-27 2.12.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/117313/59e52812-1f29-f0c3-e51e-0d33446af046.png">

Root Directoryにプロジェクトが格納されているパスを入力すると、配下にあるMavenプロジェクトがインポート候補として表示されます。インポートしたいプロジェクトを選択して「Finish」を押下します。

<img width="644" alt="スクリーンショット 2016-07-27 2.13.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/117313/7824fdad-3db0-6278-9546-b04fb09c8f2e.png">


選択したプロジェクトがインポートされました :clap: :clap: :clap: 

<img width="1351" alt="スクリーンショット 2016-07-27 2.13.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/117313/8d66d29f-d83f-46a9-f632-4d4b98bebc3a.png">
Spineランタイム：アニメーションの再生スピードを調整する

こまめにまとめるシリーズで、今回はアニメーションのスピードの調節方法についてです。
以下、SpineランタイムはSpine-Starlingの4.3を使います。どの言語のランタイムでも大きさな差はないと思われます。

#SkeletonAnimation全体のスピード調整

SkeletonAnimationまたはAnimationStateのtimeScale値を調整します。値を大きくするとスピードが速くなります。2で設定すると２倍速です。デフォルト１です。両者は別のパラメータなので両方設定することもできます。下記のようにすると4倍速になります。

```sample.as
skeletonAnimation.timeScale = 2;
skeletonAnimation.state.timeScale = 2;
```

#トラック毎のスピード調整
アニメーションの再生毎に、スピード設定をする事もできます。トラック設定オブジェクトである`TrackEntry`がアニメーション再生命令の戻り値になっているので、ここにtimeScaleを設定します。(トラックについては[前回の記事](http://qiita.com/harayoki/items/05544f90ccc600119f9c)を参照。)

```sample.as
var trackIndex:int = 0;
var track:TrackEntry = 
    skeletonAnimation.state.setAnimationByName(trackIndex, "animName");
track.timeScale = 2;
```

次のアニメーション再生がされた場合、timeScale値は1に戻りますので注意です。指定されたトラック番号のトラックにtimeScale値が設定されるのでなく、アニメーション指定(=TrackEntry)毎にtimeScaleが指定されています。

現在再生中のTrackEntryを取得する事もできます。番号指定されたトラックが再生中でない場合、nullが戻りますので、 コードでは存在チェックをしましょう。

```sample.as
var track:TrackEntry = skeletonAnimation.state.getCurrent(0);
if(track) {
    track.timeScale = 0.5;
}
```

#おまけ
キャラクターやアニメーション毎にスピードの設定が可能なので、細かい調整が可能です。また、アニメーションの再生中も各timeScale値の変更が可能です。これによって、走っているキャラクターの移動量が減るに従っての体のアニメーションはだんだんスローにしつつ、風になびく髪はそのままのスピード、というような表現が可能になります。再生しているキャラクターの位置によって、スピードが変化するような(セルフフィードバック的な感じか)スピードの重み付けもできるので、画面を横切るキャラクターが真ん中あたりにいる際はスローモーションになる、というような映画的な表現も実現できます。(すべてものものとにアニメーション側でなくランタイムで動的に対応するという意味です。）

```sample.as
//再生が時間とともに速くなったり遅くなったりする例
stage.addEventListener(
    EnterFrameEvent.ENTER_FRAME,
    function(ev:EnterFrameEvent):void{
        _skeletonAnimation.timeScale = 1.0 + Math.sin(getTimer()*0.001);
	}
);
```

これらは、全体が１つのfpsで動いているFlashタイムラインアニメーションだとできない芸当ですね。

以上です。
AWS CLIの使いどころ

AWSはWebコンソールでほぼ全ての操作ができるが、CLIでも制御できる。
今まではちょこっとインスタンスのパワーON/OFFしたりする（Webのログインが面倒）程度であまり気合入れて使っていなかった。
そこでAWS CLIはWebコンソールの代替となり得るかという視点で触ってみた。

#TL;DR
 - CLIのみで全てを完結させるのは現実的ではない。
 - 所謂ネットワーク機器のように既存環境コピペでコンフィグ流しこみ的な事は難しい。
    - 予め作っておいたコマンド一覧の投入は可能かもしれない（未検証）。
    - 既存構成をコピーして別環境で再利用は不可能。
 - シェルスクリプト等での自動化には使い易い。
 - 操作ツールというよりはAPIの一種と捉えるべき。


#コマンド体系
体系立っていてドキュメントもしっかりしたものがあるため調べながら使う事自体は問題無い。
が、設定したい項目が増えると大量のオプションを付ける必要がある。
設定項目をJSONでまとめて渡す事もできるが、わざわざ手打ちするくらいならCloudFormationでいいのでは？
GUIのように流れの中で設定していく事ができないため構築手順の前後関係を考えるのが異常に大変。

　一例：東京リージョンのEC2インスタンスパラメーターをJSONで表示

```shell-session
root@localhost#aws ec2 describe-instances --region ap-northeast-1 --output json
```


#レスポンス内容
json, text, tableの3種類が選べるがどれも人間が見ることには向かない。
AWS側で設定されるあらゆる項目（インスタンスID、IPアドレス、AMI-ID、他多数）が表示されるためほんの2,3台インスタンスを立てるだけでとても読む気がしない量が帰ってくる。
絞り込みする機能もあるにはあるが、結局ドキュメントやJSONと睨めっこして指定内容を吟味する必要がありとても面倒。
table形式をテキストファイルに貼り付ければ一応パラメーターシート的な体裁にはなる。
それでも人間が読むには不適なので、実用しないけど名目上（監査とか？）シートが必要、というようなケースでは使えるかもしれない。


#スクリプト例
スナップショット取得　→　yumアップデート　→　リブート　を自動的に行うスクリプト。
イチイチ手動でバックアップを取る必要が無く楽チン運用。
動かなくなったらスナップショットから戻すだけ。
Zabbix-AgentとかJenkinsからKickしてあげるとボタン一発で最新になって面倒なSSHログインも要らない。
　　※Zabbix-Agentでそのままやるとタイムアウトエラーを起こすので非同期処理になるよう工夫する。
やっつけ製作＋エラー処理ほぼ無しです。自己責任でご利用下さい。

 - 前提条件
    - AWS上のEC2インスタンスにスクリプトを配置
    - EC2サービスのフルアクセス権限がある（IAM-Role設定を推奨）
    - バックアップ対象はrootディスクのみ

```bash:update-with-snapshot.sh
#!/bin/bash

#自インスタンスID取得
INSTANCE=`curl -s http://169.254.169.254/latest/meta-data/instance-id`

#自リージョン取得
REGION=`curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e 's/.$//'`

#bootボリュームID取得
VOLUME=`/usr/bin/aws ec2 describe-instances --region $REGION --instance-ids $INSTANCE --query 'Reservations[].Instances[].[BlockDeviceMappings]' --output text | awk '{printf$5}'`

#日時取得
TODAY=`date '+%F %T'`

#スナップショット作成
CREATE=`/usr/bin/aws ec2 create-snapshot --region $REGION --volume-id $VOLUME --description "$TODAY automated backup, update, and reboot" --output text`
echo $CREATE

#スナップショットID取得
SNAPID=`echo $CREATE | awk '{printf$10}'`

#スナップショット作成状況表示(10秒ごと)
while :
do
    STATUS=`/usr/bin/aws ec2 --region $REGION describe-snapshots --snapshot-id $SNAPID --output text | awk '{printf$14}'`
    case $STATUS in
       "completed") echo "`date '+%F %T'` snapshot completed"
                    break ;;
       "pending") echo "`date '+%F %T'` making snapshot..." ;;
       *) echo "`date '+%F %T'` unknown error"
          exit 1 ;;
    esac
    sleep 10
done

#アップデート後リブート
yum -y update && reboot

exit 0
```