OmniAICreator/Qiita-1.07M huggingface dataset:
【Android】RetrofitのGETリクエストで配列を渡したい

サーバー側で、Parameters: {"hoges"=>["1", "2", "3"]} みたいな感じで、配列を受け取りたい。
POSTやPUTだと、

```java
@Field("hoges[]") List<String> hoges
```
とできるが、GETだとできない。[公式](http://square.github.io/retrofit/)にものっていない。

https://github.com/square/retrofit/issues/472
Jake本人による説明があった。
インターフェースで可変長引数を使えば良い。

```java:インターフェース側
@GET("/hoges.json")
    public Observable<Hoges> getHoges(@Query("hoges[]") String... hoges);
```
```java:呼び出し側
String[] hoges = {"1", "2", "3"};
observable = restAdapter.create(RetrofitApi.class)
                    .getHoges(hoges);
```
```:生成されるリクエスト
/hoges.json?hoges[]=1&hoges[]=2&hoges[]=3
```
CSSの基本単位としてremを使うと超絶便利

皆さんはremという単位を聞いたことがあるでしょうか？
知っている方は「フォントサイズ指定が%とかemとかよりすっきりしたやつ」という印象を持たれているのではないでしょうか。
「remはフォントサイズだけのものではない」という事実を知ると、実はかなり便利な単位だったりします。

詳細については[こちらのページ](http://butchi.github.io/remhack/)にも解説・デモがあります。

## remとは

[Mozillaの説明](https://developer.mozilla.org/ja/docs/Web/CSS/Length)によると、

> rem
ルート要素の font-size (例えば、html 要素の font-size) です。ルート要素で使うと初期値を表します。

とあります。

```css
html {
  font-size: 15px;
}

p {
  font-size: 1.2rem;
}

strong {
  font-size: 1.4rem;
}
```

p要素には18px、strong要素には21pxのフォントサイズが適用されます。
emや%だと``<p>``の中に``<strong>``があったときのように2重掛けが起こってしまうので、そのような煩雑なサイズの継承から逃れられます。

なお、上述の記事には

> この単位は完全に拡縮可能なレイアウトを作るのに役立ちます。対象ブラウザのサポートがない場合には em 単位を使って同様のレイアウトを実現可能ですが、やや複雑になります。

とも書かれているので、本稿で述べている使用方法も想定内なのかもしれません。


## ズームコントロール

まずは、ズームコントロールの簡単な比較デモを用意しました。
http://jsdo.it/butchi/remhack

CSSを利用した既存の手法として``zoom``と``transform``と比較しましたが、それぞれ

- zoomはFirefox未対応
- transformはボックスサイズに影響を与えないので、relative配置の場合は余白の付け方に非常に困る

という大きな弱点があるので、remを使うことによりこれらの問題は解消されます。

ただし、後述のChromeの制約により、文字を含むコンテンツの縮小には限界があるという欠点があります。

なお、emとの併用でローカルなズームコントロールも可能となるハックが公開されていますので、このような使い方をすればより柔軟なレイアウトを作れると思われます。
[Font Size Idea: px at the Root, rem for Components, em for Text Elements | CSS-Tricks](https://css-tricks.com/rems-ems/)（英語）

## レスポンシブ対応

デモ: http://butchi.github.io/remhack/

transformでまるごと半分にする強引な方法もありますが、
SNSボタン、ウィジェット、その他iframeまで縮小されてしまう問題があります。
本ハックでは可変のものはrem、不変のものはpxと使い分けることができるのも強力なポイントです。

## 問題点

Google Chromeでは「最小フォントサイズ」というものが存在するので、中途半端なサイズまでしか縮小できません。なので、

```css
html {
  font-size: 1px;
}
p {
  margin-top: 30rem;
}
```

のようにするとレイアウト崩れするので

```css
html {
  font-size: 10px;
}
p {
  margin-top: 3rem;
}
```

のように、10px〜20pxぐらいの値を入れるのが丁度よいかと思われます。
（逆に、筆者がこの手法を発見したのも、Apple公式サイトがremのせいでレイアウト崩れが起こってたからでした。）


## 対応環境

remは比較的最近導入されたCSS3の単位で、IE9から対応しています。
ただし、IE10以下では一部バグあり（恐らく擬似要素のみ）とのことなので、あまりに気軽に使うと泥沼にハマる可能性があります。ご注意ください。

[Can I use... Support tables for HTML5, CSS3, etc](http://caniuse.com/#feat=rem)

[IE10/11 のバグを考えると CSS では rem 単位を使わない方が良い | かきしちカンパニー Web Magazine](http://www.webmagazine.kakisiti.co.jp/?p=571)
[AWS]LambdaからVPC内のリソースにアクセスした際のレイテンシーについて

## LambdaからVPC内のリソースにアクセスすると初回実行がものすごく遅い
先日、待ちに待ったLambdaのVPC内へのリソースへのアクセスが可能となりました。

早速テストコードを書いて、これでもうTomcatとはおさらばできると小躍りしたのもつかの間、あることに気が付きました。
**「初回実行がものすごく遅い」**
ものすごく遅いのです。
数秒とかのレベルではなく数十秒とかかかっています。

## VPC内のリソースにアクセスした際のレイテンシーの原因
これはLambda functionがVPC内のリソースにアクセスする際にはENI(Elastic Network Interface)が作成されることが原因のようです。
このENIの作成には数十秒から1分程度の時間を要します。
また、このLambdaによって作成されたENIは一定時間使用されないと自動で破棄されます。

このレイテンシーはバッチ処理などでは問題にならないかもしれませんが、API GatewayのバックエンドでLambdaを使ってWebAPIなどを構築する場合には大きな問題となります。

## 解決方法(案)
これに対する解決策のひとつとして**「定期的にLambda functionをinvokeする」**という方法が考えられるのですが、果たしてそれが根本的な解決となるか、また最適な間隔を検証すべく、以下の確認を行いました。

- 同一のVPC設定の場合、作成済みのENIは再利用されるか。
- 同一のVPC設定の場合、作成済みのENIは別functionでも再利用されるか。
- 作成されたENIが保持される時間はどのくらいか。

## 解決方法(案)の検証
テスト用のLambda functionを作成し、ひとまず10分間隔で定期的にinvokeするように設定し、ENIがどのように作成・破棄されるかを見てみます。

VPC設定は以下のようにしました。

<dl>
  <dt>VPC</dt>
  <dd>VPC-1</dd>
  <dt>Subnets</dt>
  <dd>subnet-a, subnet-c</dd>
  <dt>Security Groups</dt>
  <dd>sg-00000001</dd>
</dl>
※それぞれの項目の名前は便宜上つけたものです

## 検証結果
結果は以下のとおり。

- 最初の実行ではENIが一つ、「VPC-1, subnet-a, sg-00000001」に対応したものが作成された。
- 二度目の実行ではENIは作成されなかった。
- 三度目の実行ではENIが一つ、「VPC-1, subnet-c, sg-00000001」に対応したものが作成された。
- その後、何回か実行を監視したが新たにENIは作成されなかった。

この結果を見ると**同VPC、同Security GroupのsubnetごとにENIが作成され、再利用されている**ことがわかります。

ここまでは良かったのですが、さらにしばらく様子を見たところ、
**上記2つのENIは残っている(破棄されていない)にもかかわらず「VPC-1, subnet-a, sg-00000001」に対応したENIが新たに作成されていました**。

つまり、**再利用できるはずのENIが保持されているにもかかわらずENIが作成されることもある**、ということです。

また、同じVPC設定を行った別のfunctionをinvokeしてみたところ、新たにENIは作成されませんでした。
つまり**別functionでも同じVPC設定なら作成済みのENIは共有される**ということです。

さらに、ENIの作成のタイミングや条件を見るために、「VPC設定を行ったが実際にはアクセスしないfunction」を試してみました。
結果としては実際にVPC内のリソースへのアクセスをするかどうかにかかわらず、**invokeされた時点でENIが作成される**ことが確認できました。

## ENIの保持期間について
ENIの保持期間については下記のブログ記事のとおり、Lambdaの実行環境はコンテナなので、コンテナの保持期間と等しいようです。
https://aws.amazon.com/blogs/compute/container-reuse-in-lambda/
ただし、コンテナの寿命については公開されていないため、結局のところ**ENIの保持期間は不明**ということになります。

## まとめると

- 作成されるENIはVPCの設定による。実際にそのVPCにアクセスするかどうかは関係ない。
- ENIの保持期間はコンテナ依存だが、コンテナの保持期間は公開されていない。つまり不明。
- 同一のVPC設定の場合、**「基本的には」**ENIは共有・再利用されるが必ず再利用されるわけではない。

## 結論
以上から、**「定期的にLambda functionをinvokeする」**については
**「効果はあるが確実ではない」**、
また、
**「定期的にinvokeする最適な間隔は不明」**
ということになります。

なかなか厳しい結果ですが、他に有効な方法も今のところ見つかっていないので現状では最も有効な方法なのかなと思います。

そもそもLambdaにVPC設定させるのじゃなくて、任意のENIをアタッチできるようになってくれればよさそうですが。

API GatewayのバックエンドとしてLambdaを使用したWebAPIってかなり需要があると思うので、なんとかなって欲しいですね。
入力フォームとかで部分テンプレートをレンダリングするとき、render から変数を渡す方法

例えば、こんなの 


```rb
#new.html.erb
<% @page_title = "会員の新規登録" %>

<h1><%= @page_title %></h1>

<%= form_for @member do |form| %>
<% render "form", form: form %>
<p><%= form.submit %></p>
<% end %>
```

_form.html.erbをレンダリングするが、ブロックパラメータである変数formをレンダリング先に渡さないと、フォームビルドできない!!

そこで、renderメソッドの第2引数として、変数formをレンダリング先に渡す!!

```rb
<% render "form", form: form %>
```

ハッシュのインデックス部分(form:)が、レンダリング先で使えるようになる。
☆参考: render から変数を渡す方法
http://d.hatena.ne.jp/shio_chan/20120323/1332511842
テスト開発駆動について一連の流れ(唯のメモ)


新しい機能を実装したいとき…
* railsだと、gemのFactory Girlって機能が便利

## 1.まず、rails gで新機能をつくる

## 2.開発用のシードデータを準備

## 3.テストスクリプトを書いてテスト
 * 機能の__「抜け」をテスト__するので、最初はテストが__失敗するのが正しい__ 
 * 成功してしまった場合は、テストスクリプトがうまく書けていないってこと。
 * 正常に失敗したら、エラー症状を調べる。
  
## 4.テストが成功するように、機能を実装する(コーディング)
* 今度は上記テストが必ず通るように実装
  
## 5.リファクタリング
* 上記コーディングを綺麗にする。
* __「テストが通る」ことを維持したまま__修正していくので、大幅修正でも安全に作業できる。
lastafluteでhttpメソッド毎にアクションメソッドを切り替える


ものすごく簡単にですが、
こんな感じです。

```java

// MaihamaAction
@Execute
public JsonResponse get$index() { // GET で受け取る
}
@Execute
public JsonResponse post$index() { // POST で受け取る
}
@Execute(urlPattern="{}/@word") // @word はメソッド名のキーワード、{}は引数パラメーター
public JsonResponse get$sea(Integer dockside) { // maihama/3/sea というように順番をひっくり返せる
}
```

参考実装はこちら
https://github.com/dbflute-session/lastaflute-test-catalog/blob/master/src/main/java/org/docksidestage/app/web/wx/restapi/WxRestapiAction.java
テキストでブランチの表記メモ

最近書く機会が多いので、パターンを貯めて行こうかと。。“〆(ﾟεﾟ*). ｻｻｻ...

## パターン1: asciiのみ

```text
A---B---D-----------------------* feature/1
    `-C---E--(G)--J-------------* feature/2
          `-F-'--I--------------* feature/3
            | `-H---K--(M)--O---* feature/4
            |       `-L-'--N----* feature/5
            `-----------------P-* feature/6
※()はマージコミット
```
underscoreコードリーディング（pick）



underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##pickとは


###[underscorejs.orgのpick](http://underscorejs.org/#pick)

こんな説明。
>####_.pick(object, *keys) 
>Return a copy of the object, filtered to only have values for the whitelisted keys (or array of valid keys). 
>Alternatively accepts a predicate indicating which keys to pick.


```javascript
_.pick({name: 'moe', age: 50, userid: 'moe1'}, 'name', 'age');
=> {name: 'moe', age: 50}
_.pick({name: 'moe', age: 50, userid: 'moe1'}, function(value, key, object) {
  return _.isNumber(value);
});
=> {age: 50}

```

------------- 
ホワイトリストにしていされたキーを通過した値のオブジェクトのコピーを返します。
もしくは、keyを抽出するのにpredicateを指定するというのも受け付けられます。

###[underscore.pick](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L1022)
コード的にはこのあたり。

```javascript
  // Return a copy of the object only containing the whitelisted properties.
  _.pick = function(object, oiteratee, context) {
    var result = {}, obj = object, iteratee, keys;
    if (obj == null) return result;
    if (_.isFunction(oiteratee)) {
      keys = _.allKeys(obj);
      iteratee = optimizeCb(oiteratee, context);
    } else {
      keys = flatten(arguments, false, false, 1);
      iteratee = function(value, key, obj) { return key in obj; };
      obj = Object(obj);
    }
    for (var i = 0, length = keys.length; i < length; i++) {
      var key = keys[i];
      var value = obj[key];
      if (iteratee(value, key, obj)) result[key] = value;
    }
    return result;
  };
```

返り値用のresult、oiteratee,keysを宣言し、objにobjectを代入する。

objがnullの場合result(空のオブジェクト)を返す。
oiterateeがfunvtionの場合、keysに_.allKeys(obj)の返り値を入れ、iterateeにoiterateeをoptimizeCbした返り値を入れる。
そうではない場合は、keysをflattenを用いてargumentsをarrayにして代入する。
iterateeにkeyがobjに入っているかどうかを判定するだけの関数を代入する。

for文でi=0からkeysのlengthまで回す。
keyにkeysのi番目を代入する。
valueにobjのkey番目を代入する。
iterateeを用いて、vakue,key,objが条件に一致するかを判定し、一致した場合resultのkey番目にvalueを代入する。

その後、resultを返す。
メール本文が一行1000バイトを超えると文字化ける問題


sendmail、qmail、Postfixで送信するメールで一行あたり1000バイトを超えると、自動で改行コードが挿入される問題。
マルチバイト文字列とか全然考慮されないまま改行コードが挿入されるらしく、それが原因で日本語が文字化けてしまう。
上記のMTAに限らずどのMTAでもだいたいそういう仕様になってるっぽい。

[RFCのドキュメント](http://srgia.com/docs/rfc2822j.html#p2.1.1)にも、一行1000バイト超えたメール本文を作っちゃだめだよーって明記されている。
ので、おとなしくアプリケーション側で長い行に対して改行文字を差し込む。

以下、長い行に改行文字を入れるPHPのメソッド書いた。

```php
function _preventGarbledCharacters($bigText, $width=249) {
    // wordwrap()はマルチバイト未対応のため正規表現を使う。
    $pattern = "/(.{1,{$width}})(?:\\s|$)|(.{{$width}})/uS";
    $replace = '$1$2' . "\n";
    $wrappedText = preg_replace($pattern, $replace, $bigText);
    return $wrappedText;
}
```

これで強制改行が原因の文字化けは無くなるはず。



## 参考
http://srgia.com/docs/rfc2822j.html#p2.1.1
http://www.geek.sc/archives/743
https://siiz.biz/memo/detail.php?id=70
sbtでプロジェクトを作ってみるメモ


参考はここ
[sbt](http://www.scala-sbt.org/0.13/docs/ja/Hello.html "sbt")


実際ここ見るより上のページ見たほうがわかりやすいですが自分用のまとめとしてここに載せときます


#sbtプロジェクトの作成

ディレクトリの中に
`〜〜.scala`(main関数あり)と
`build.sbt`
を作成

実行

```
sbt

>run
```


#sbtのメインファイルの場所

これはsbtプロジェクトのディレクトリ構成が関連してくる
sbtが自動検知するソースファイルは

1. ベースディレクトリにあるソースファイル
2. `src/main/scala`か`src/main/java`内のソースファイル
3. `src/test/scala`か`src/test/java`内のテストソースファイル
4. `src/main/resources`か`src/test/resources`のデータファイル
5. lib内のjarファイル

上記の通りなので
main関数が存在するscalaファイルは
ベースディレクトリか`src/main/scala`に置ける

`appfolder/main.scala`
`appfolder/src/main/scala/main.scala`

に

```scala:appfolder/main.scala|appfolder/src/main/scala/main.scala
object HelloMain {

  def main(args: Array[String]) = {
    
    (1 to 10).foreach( s => ((x: String) => println(x))(s.toString) )
    
  }

}
```

ベースディレクトリで`sbt`からの`run`でいける



#sbtプロジェクトのパッケージの付け方

```scala:/src/main/scala/main.scala
package mypack

〜〜〜
```

`src/main/scala/`以下のディレクトリ名をpackageに追加していけばいい

`src/main/scala/com/test/pack/main.scala`
にpackage名をつける時は

```
package com.test.pack
```

でOK


#ライブラリの追加

libraryDependenciesに追記していく

```sbt:build.sbt
lazy val root = (project in file(".")).
  settings(
    name := "hello",
    version := "1.0",
    scalaVersion := "2.11.7",
    libraryDependencies ++= dervy
  )

lazy val dervy = {
  Seq(
    "commons-codec" % "commons-codec" % "1.6"
  )
}
```
[Atom]atom.keymaps.simulateTextInputはスペースをうまく扱えない


## 現象と対策

タイトルどおりです。

AtomのKeymapManagerの ***プライベートメソッド*** simulateTextInputは、渡されたキーイベントがスペース(0x20)だと何も表示しないようです。

[Issue](https://github.com/JunSuzukiJapan/atom-keyboard-macros/issues/2)で気づきました。

下記のように、スペースだけ処理をわけてごまかしました。

```coffee:CoffeeScript
    for e in @events
      if e.keyCode != 0x20
        atom.keymaps.simulateTextInput(e)
      else
        # space(0x20)
        textInputEvent = document.createEvent("TextEvent")
        textInputEvent.initTextEvent("textInput", true, true, window, ' ')
        e.path[0].dispatchEvent(textInputEvent)
```

## 蛇足

おそらくこの記事は自分以外には何の役にも立たないと思いますが、一応メモ代わりに記録しておきます。
プライベートメソッド使ってる時点でアレなんですよね…。
vagrantから外環境へ繋ぐための設定

Vagrantファイルに下記を追記

```
# ローカル環境から外環境へ繋ぐためのトンネル設定
  config.vm.provision "shell", inline: <<-SHELL
    sudo cp -p /vagrant/PEMファイル /home/vagrant/.ssh/
    sudo chmod 600 /home/vagrant/.ssh/PEMファイル
    sudo ssh -f -N -C -oStrictHostKeyChecking=no -L 繋げるためのローカルのポート:外部サーバ:外部サーバでの受け口のポート 外部サーバでのユーザ名@外部サーバ -i /vagrant/PEMファイル
    # ↑のプロセスを切る方法
    # ps aux | grep ssh ⇒ kill -9 XXXXXX
  SHELL
```
mysql 複数行のupdate

# 大量にUPDATEしたい

場合に

```

update work_shops set point = 10 where id = 1;
update work_shops set point = 20 where id = 2;
update work_shops set point = 30 where id = 3;
update work_shops set point = 40 where id = 4;
update work_shops set point = 50 where id = 5;
update work_shops set point = 60 where id = 6;
update work_shops set point = 70 where id = 7;

```


こんなのを何行も書いてやってましたのでまー時間がかかっちゃいますね。


# INSERT ... ON DUPLICATE KEY UPDATE 構文

を使ったらいいと。



まずはふつうにINSERT文を作る

```

INSERT INTO work_shops (id, point) VALUES
(1,10),
(2,20),
(3,30),
(4,40),
(5,50),
(6,60),
(7,70)

```

で

```

ON DUPLICATE KEY UPDATE point = VALUES(`point`);

```

更新したい値を指定。

でOK。

id はプライマリーキー

で

work_shops.id に 同じキーが
なければINSERT。
あればUPDATE。

される。

OK。
ES6でprotectedメンバを簡潔に定義する


自分がよく使っている方法メモ。
WeakMapを使った ~~privateメンバ~~ protectedメンバの実装の見た目を少しスッキリさせただけ。
(最初privateメンバ実装したつもりでしたが、コメントでご指摘いただいた通りprotectedだったので修正しました)

まず、以下のような関数をどこかに適当なファイル内で定義する。
この関数は、外部からアクセスできないWeakMapに値を出し入れすることで、
privateな変数を実現している。

```js
const privates = new WeakMap();
module.exports = (self) => {
  if (!privates.has(self)) {
    privates.set(self, {});
  }

  return privates.get(self);
}
```

次に、privateなメソッドを定義したいクラスで上記関数を読み込んで使う。

```js
const _ = require('./private.js');

class Person {
  constructor(name) {
    _(this).name = name;
  }

  print() {
    console.log(_(this).name);
  }
}
```

いえい

```
const person = new Person('test');
person.print(); // "test"
```

## 実はprotectedですらない
外部から_(person).nameとかやればアクセスできてしまうので厳密にはprotectedでは無いが、
明示的にアクセスしない限りはアクセス出来ないので、余程の事がない限り問題無いはず。
Bootstrap　でパネルのオープン/クローズ




[2016.4.20 追記]

ui-bootstrapに以下よりも便利なuib-accordionのAccordionがあったので
そっちを使ったほうがいい
http://angular-ui.github.io/bootstrap/#/getting_started
http://plnkr.co/edit/?p=preview

---
Bootstrapベースで、パネルにオープン・クローズの機能を付けたい場合の備忘録

![WS000006.JPG](https://qiita-image-store.s3.amazonaws.com/0/49910/3f775eb1-89ba-fb53-461d-daefb2226e99.jpeg)



![WS000007.JPG](https://qiita-image-store.s3.amazonaws.com/0/49910/d3d8f32e-52af-fce3-c4ed-5c52626590b1.jpeg)



```html
ページまたはCSSに以下を追加する
<style>
    /* Icon when the collapsible content is shown */
    .panel-heading a:after {
        font-family: "Glyphicons Halflings";
        content: "\e114";
        float: right;
        margin-left: 15px;
    }
    /* Icon when the collapsible content is hidden */
    .panel-heading a.collapsed:after {
        content: "\e080";
    }
</style>


<!--パネル -->
<div class="panel panel-info">
    <div class="panel-heading">
        <h3 class="panel-title">
            <a href="#panelCollapse" data-toggle="collapse">パネルタイトル</a>
        </h3>
    </div>
    <div class="panel-body">
        <div id="panelCollapse" class="collapse">
            Lorem ipsum dolor sit amet, consectetur adipisicing elit,
            sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
            quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
        </div>
    </div>
</div>
```


##デフォルトでオープン、またはクローズにしたい場合は以下を追加
```js
<script>
    $(function () {
        $("#panelCollapse").collapse('show'); //デフォルトでオープン
        $("#panelCollapse").collapse('hide'); //デフォルトでクローズ
    });
</script>
```
IBM Blockchain As A Service がクラウド上でデベロッパー向けに試験サービスとして提供開始されたようです

今現在、個人的にIoTについて色々調査中なのですが、
次のHPにて、ビットコインで使われている技術のブロックチェーンが実はIoTでも利用できるのでは？と
言われていて、IBMもその技術に注目していると記載されているのを目にしました。
[IBMが注目するブロックチェーンとは何か](https://www.change-makers.jp/post/10463)

それが、つい最近ブロックチェーンのコードをクラウド上で開発者に提供し、
すばやくビジネスに活用できるようにしたと発表がありました。
[IBM Delivers Blockchain-As-A-Service for Developers](https://www-03.ibm.com/press/us/en/pressrelease/49029.wss)

早速Bluemixで見たところ、追加されてました。
公開日が2016年2月15日となっていました。
試験サービスです。

まだ、Bluemixに慣れていないので、すぐに辿り着けなかったため、開くまでの方法を記載します。

①Bluemixへログインします。
　なお、地域は米国南部にしてます。（他の地域は未確認です）

②そして、赤枠のカタログを開きます。
![catalog.png](https://qiita-image-store.s3.amazonaws.com/0/113879/596ce68f-35f2-8303-967b-0ecd1a326b71.png)

③カタログの最下部にある赤枠の「Bluemix Labs Catalog」のリンクをクリックします。
![labs link.png](https://qiita-image-store.s3.amazonaws.com/0/113879/0b5d1c8e-822d-9f5d-2193-1de960074071.png)

④ネットワークのところに、Blockchain試験とあります。
![Blockchain_link.png](https://qiita-image-store.s3.amazonaws.com/0/113879/058c8b2f-8f5f-2397-e6bf-1d9ff855e681.png)

⑤開くと、公開日が2016年2月15日となっています。
![blockchain.png](https://qiita-image-store.s3.amazonaws.com/0/113879/0f322d92-b5af-136b-9113-f7fa39e7ec5a.png)

辿り方は以上です。

さて、どんな風に使えるか、時間があれば次回試してみます。
glibc ライブラリの脆弱性 (CVE-2015-7547) を上からなぞると確認できる手順

# 概要
上からなぞれば脆弱性の確認と対応ができますが、検証環境で確認するための手順です。
**サービス影響のあるサーバではやらないでください。**

# 作業内容

``` shell
### 検証用サーバにログイン
$ ssh (対象サーバ)

### 検証コードをclone
$ git clone https://github.com/fjserna/CVE-2015-7547.git

### 検証コード実行
$ sudo CVE-2015-7547/CVE-2015-7547-poc.py &

### 検証用の設定
$ sudo cp -ip /etc/resolv.conf /tmp/resolv.conf
$ sudo vi /etc/resolv.conf
================================================
nameserver 127.0.0.1
================================================

### テスト
$ ssh www.example.jp
================================================
[UDP] Total Data len recv 32
[UDP] Total Data len recv 32
Connected with 127.0.0.1:50788
[TCP] Total Data len recv 68
[TCP] Request1 len recv 32
[TCP] Request2 len recv 32
セグメンテーション違反です  <-これが出るとアウト
================================================

### resolv.confの設定を戻す
$ sudo cp -ip /tmp/resolv.conf /etc/resolv.conf

### updateする(2.12-1.166.el6_7.7以上になっていることを確認)
$ sudo yum update glibc

### OS再起動する
$ sudo shutdown -r now

### ログイン
$ ssh (対象サーバ)

### 検証コード実行
$ sudo CVE-2015-7547/CVE-2015-7547-poc.py &

### resolv.confの設定を入れる
$ sudo vi /etc/resolv.conf
================================================
nameserver 127.0.0.1
================================================

### テスト
$ ssh www.example.jp
================================================
[UDP] Total Data len recv 32
[UDP] Total Data len recv 32
Connected with 127.0.0.1:34103
[TCP] Total Data len recv 68
[TCP] Request1 len recv 32
[TCP] Request2 len recv 32
ssh: Could not resolve hostname www.example.jp: Name or service not known  <- 正常な出力
================================================

### resolv.confの設定を戻す
$ sudo cp -ip /tmp/resolv.conf /etc/resolv.conf

### 検証コードを停止する
$ fg
================================================
sudo CVE-2015-7547/CVE-2015-7547-poc.py
================================================
(Ctrl + Cを押す)
================================================
^CTraceback (most recent call last):
  File "CVE-2015-7547/CVE-2015-7547-poc.py", line 176, in <module>
    tcp_thread()
  File "CVE-2015-7547/CVE-2015-7547-poc.py", line 105, in tcp_thread
    conn, addr = sock_tcp.accept()
  File "/usr/lib64/python2.6/socket.py", line 197, in accept
    sock, addr = self._sock.accept()
KeyboardInterrupt
================================================
```
D3.jsで要素をコピーして追加する

z-indexが効かないsvgでは、特定の要素を最前面に出したいときなどに要素をコピーして他の要素よりあとに追加するなどの処理が頻繁に必要になる。

# サンプル

「circle要素を属性値丸ごとコピーしたい」ってときは以下の方法でコピーできる。

```html:html
<svg>
  <circle cx="100" cy="60" r="40" fill="red" stroke="black" />
  <circle cx="300" cy="120" r="60" fill="blue" stroke="black" /> 
</svg>
```

```js:javascript
var svg = d3.select("svg")

d3.selectAll("circle") //コピーする対象をセレクト
  .each(copy);

function copy(){
  var nodeName = d3.select(this).node().nodeName;
  var nodeAttr = d3.select(this).node().attributes;

  var objAttr = {}
  Object.keys(nodeAttr).forEach(function(key){
    objAttr[nodeAttr[key].name] = nodeAttr[key].value;
  });

  svg.append(nodeName).attr(objAttr); //コピーした要素を追加する
}

```
明日、敗訴しないためのAndroidセキュアコーディング・フォローアップ

本日(2016/02/18)、DroidKaigi 2016で「明日、敗訴しないためのAndroidセキュアコーディング」をお話させていただきました。終わった際にいくつか質疑応答を頂いたので振り返ったのですが、私が質問の意図を完全に把握出来ず変な回答をしている気がしたので、発表の緊張から解放された今、改めて自分の考えを記載しようと思いました。

[資料はこちら](http://www.slideshare.net/KengoSuzuki1/ss-58412489)

# 質問1: パスコードを暗号化してファイルにぶっこんでも、引張だしたら解析されてしまうのでは？
* これに対する回答はYesです。共通鍵だろうと公開鍵だろうと、それをアプリ上で作る以上、複合は余裕です。正直、アプリ上で作る以上その呪縛からは逃れられない(回答時に言えなかったこと)
* ただ私が作っているアプリ上で、暗号化しているものはパスコードのみです。ぶっこ抜いたパスコードは遠隔からでは使えない様にしているため、遠隔からの攻撃についてはセーフ。物理的に入手した端末から更にパスコードを抜くのは、そもそもそこまでするモチベーションが攻撃者にとってのコストメリットがないと考えているため、そのリスクは許容しています（回答時に言おうとしてたかったこと）
* ただ上記は私が製作しているアプリでは,,,という話です。設計なのでアプリによってその辺の考えはケース・バイ・ケースになります（本当に言いたかったこと）
* その後に教えて頂きましたが、keyStoreを使った方法があるみたいですね。release build時のみに発動するようにすれば、それが普遍的に使える手段になり得るかもしれないです。


# 質問2: 標準的なガイドに従う以外の方法はとっているのか
* 第三社にセキュリティ診断を定期的に依頼している(回答した答え)
* 常に攻撃者の視点を持って開発をしています。攻撃者はアプリのどの資産をどのように入手したいのか。その入手可能な資産は、入手仮定のコストに見合っているのか、等々を考えながら、設計しています（本当に言いたかったこと）
* そもそもJSSECのセキュアコーディングガイドは標準ではないです（別の聴講者様のフォロー）
    * IPAは経済産業省所管の独立行政法人となります。なので、裁判所も根拠として利用しやすかったのかと思われます。一方JSSECは企業の人間が集まった一般社団法人です。なので、そのセキュアコーディングガイドがデファクトにはまだなってないと思います（更にフォロー）

# 最後に
* 本日はお忙しい中、私の発表を聞いていただきまして誠にありがとうございました。もし何かご指摘があれば是非お願い致します。よりセキュアなサービスを出して、別の方向からも付加価値をつけていきたいと思います。

# KeyStore Provide使ってみた
[これ](http://developer.android.com/intl/ja/training/articles/keystore.html)を参考にやってみました。が、結局root権限を取得できた端末からだと、下記の通りKeyStore Providerで作られた秘密鍵をぶっこ抜けてしまうので、ぶっこ抜き＆解読問題の解決は難しそうです。

```
root@vbox86p:/data/misc/keystore/user_0 # ls -l                                
-rw------- keystore keystore      788 2016-02-21 13:15 10091_USRCERT_hogehoge
-rw------- keystore keystore     1252 2016-02-21 13:15 10091_USRPKEY_hogehoge　<-------秘密鍵
```

build.gradleで指定したsignInConfigで出来ないか試してみましたが、そもそもsignInConfigを参照をできない（私が試した限りでは）。

なので、ぶっこ抜き問題に関する解決方法あったら教えて頂けるとありがたいです（涙
ELBと使われてる証明書のリストを出す

```bash
aws elb describe-load-balancers | jq '.LoadBalancerDescriptions[] | [.LoadBalancerName, .ListenerDescriptions[].Listener.SSLCertificateId]'
```

どのELBの証明書を更新しなきゃいけないかを確認したかったのです。

ちなみに、 `aws iam delete-server-certificate` で証明書を削除するときに、使われてる証明書だとエラーになるので、期限が切れた証明書は削除するようにすれば、更新漏れは起きなさそうです。

しかし、[AWS Certificate Manager](https://aws.amazon.com/jp/certificate-manager/) ができてしまったし、Let's encrypt の流れもあり、更新作業からはじょじょに開放されそうですね :smile:
VDI環境とインターネット分離における落とし穴

# はじめに
昨今「インターネット分離」という言葉をよく耳にします。
インターネット分離とは、業務で使う社内端末や基幹系システムをインターネットと分離することであり、総務省が推奨していることもあってこのコンセプトが注目されています。
# 仮想デスクトップ（VDI）導入
業務端末をインターネットから分離する場合でも、メールのやり取り、ウェブブラウザでの情報検索、ウェブベースの業務アプリケーションなどインターネットを使わないと仕事にならない業務が多いのが現状です。そこで仮想デスクトップ（VDI）環境を導入し、インターネットを使う業務は業務端末からVDI環境へログインした上でVDI上で行うことにすれば業務端末はインターネットから分離したままで済みます。
# クラウド上のVDI環境との接続
サーバなど機器の購入や機器を設置するデータセンターの契約をすることなく、簡単に導入できるのがクラウド上のVDI環境です。VMware Horizon Airもその中の1つです。接続方法としてIPSec VPNまたは閉域網を活用したDirect Connectが使えるため、クラウド上のVDI環境へセキュアに接続ができます。
![Qiita-1.png](https://qiita-image-store.s3.amazonaws.com/0/113341/d10742ce-6ea9-8a24-39fe-b31a3b9d8325.png)
# SSL証明書の実装
仮想デスクトップ環境にはポータルサイトがあり、管理者が仮想デスクトップを管理したり、ユーザが仮想デスクトップにアクセスするときに必ずポータルサイトにアクセスします。ポータルサイトはブラウザでアクセスしたり、端末にインストールする仮想デスクトップ接続用のクライアントアプリケーションからアクセスします。ポータルアクセスをセキュアにするためにポータルを管理するサーバにSSL証明書をインストールしますが、インターネット分離の環境ではこのSSL証明書に関連する仕様に注意が必要です。
## CRLとCTL
SSL証明書は通常Digicertなど第三者の証明期間から発行されます。社内端末から仮想デスクトップ環境のポータルにアクセスすると、SSL証明書が有効なものであるかどうかを検証するためにCRL（証明書失効リスト）とCTL（証明書信頼リスト）を確認します。
## CRLについて
CRLについては下記のURLを参照してください。
https://jp.globalsign.com/service/knowledge/ca/
## CTLについて
CTLについては下記のURLを参照してください。
http://blogs.technet.com/b/jpsecurity/archive/2013/06/12/3578245.aspx
## インターネット分離の落とし穴
ここで注意しなければならないのは「インターネット分離」によって、インターネットへのアクセスが遮断された社内端末はインターネット上にあるCRLとCTLを参照することができません。結果として社内端末上でポータルにアクセスしようとしているブラウザまたはクライアントアプリケーションはエラーを返します。SSL証明書の検証を無視するように設定した場合はポータルアクセスできるものの、確認作業がタイムアウトするまでブラウザまたはクライアントアプリケーションは「応答なし」の状態になります。ネットワーク環境によって違いはあるものの、CRLとCTLの確認のタイムアウトはそれぞれ5秒から7秒程度です。一旦ポータルにアクセスして仮想デスクトップを使うようになった後も、15分に1回程度はSSL証明書の検証が発生して10秒から15秒程度「応答なし」の状態となるため、ユーザにとってはかなりのストレスとなります。
![Qiita-3.png](https://qiita-image-store.s3.amazonaws.com/0/113341/4f59a883-66d9-fc78-62d5-c85032679990.png)

## CRLに対するアクション
CRLの確認先はSSL証明書によって異なります。発行機関の確認は下記URLを参照してください。
https://jp.globalsign.com/service/ssl/knowledge/authentification.html
CRLに対するアクションは以下の3つのいずれかです。
1. インターネット接続できる社内ファイルサーバでCRLを定期的に取得し、社内端末ログインスクリプトでCRLをそのサーバから取得して更新するように設定する。
2. インターネット接続できる社内ファイルサーバでCRLを定期的に取得し、社内DNSを設定してCRL確認先をそのサーバに向けるようにする。
3. 社内のWindowsサーバで証明書を発行する（下記URL参照）。
http://www.infraexpert.com/study/sslserver6.html
https://technet.microsoft.com/ja-jp/library/cc753296.aspx
## CTLに対するアクション
下記のURLを参考にしてCTLの確認先を最新のCTLがダウンロードできる社内サーバに変更するか、CTL更新動作の機能を無効にしてください。
http://blogs.technet.com/b/jpsecurity/archive/2013/06/12/3578245.aspx
##
![Qiita-2.png](https://qiita-image-store.s3.amazonaws.com/0/113341/484d06bb-5ee7-8417-68b8-ae441e443ade.png)
draw.io > プリントの不具合 > previewにしてから印刷する

関連 http://qiita.com/7of9/items/c1db7b137caf2a452ece

draw.ioというツールにてブロック図を作成中。

かなり直観的に図が作成できるのがいい。これまでmindmupにて作っていたブロック図だが、今後はこちらで作ろうかと思う。

一つ不具合があるようだ。作成した図を印刷しようとして、Ctrl+Pしてからprintとすると白紙が出てくる。
以下で対応できる。

1. previewを選択
2. previewしたものを印刷
ビルド時の情報をアプリ側から確認できるようにする

# 環境
　Unity5.3.2f1で確認
# 前書き
　プロジェクトの進行がゴタゴタしてくると
「このビルドほんとにこの設定で出力したヤツ？　ってか何時の？」
「いやちょっとわかんないっす」
　みたいなやり取りが発生して辛かった記憶があるので幸せになる為の方法を調べました。
　デバッグ用のスクリーンショットを出力する時にでも一緒に表示させておくとデバッグが楽になると思います。
# やりたいこと
- ビルド時のタイムスタンプとシンボル定義をコードから参照出来る形で生成する

# サンプル

```BuildInfoGenerator.cs
using UnityEditor;
using System.IO;

public class BuildInfoGenerator {
    const string TEMPLETE = @"
public class BuildInfo {{
    public const string BUILD_SYMBOLS = ""{0}"";
    public const string BUILD_TIMESTAMP = ""{1}"";
}}
";

    [MenuItem("Tool/MakeBuildInfo")]
    public static void MakeBuildInfo() {
        File.WriteAllText(
            "Assets/BuildInfo.cs",
            string.Format(TEMPLETE, new string[] {
                PlayerSettings.GetScriptingDefineSymbolsForGroup(BuildTargetGroup.Standalone),
                System.DateTime.Now.ToString("yyMMdd_HHmm")
            }));
    }
}
```

上記のスクリプトをメニューから実行すると以下のようなスクリプトが生成されるので、これをアプリ側から参照して画面に表示するなどします。

```BuildInfo.cs
public class BuildInfo {
    public const string BUILD_SYMBOLS = "TEST1;TEST2";
    public const string BUILD_TIMESTAMP = "160218_1812";
}
```

※Unityにはビルド前のフックが存在しないので、[ビルドのパターンを定義して一発で出力する](http://qiita.com/soyliquid/items/483c3f8eda70a3827ef9)と組み合わせて使用します。

# あとがき
- [ビルドのパターンを定義して一発で出力する](http://qiita.com/soyliquid/items/483c3f8eda70a3827ef9)と組み合わせずに使用する場合はビルド前にMakeBuildInfoを手動で実行する必要がありますが大抵忘れます。
Git と sed で一括置換


## やりたいこと

- Sassファイル中の[Compass](http://compass-style.org/)用の mixinを、普通のプロパティ表記に置き換えたい。
- `+border-radius(6px)` → `border-radius: 6px`、または、`+border-radius($size)` → ` border-radius: $size` みたいな置換がしたい
- つまり、Gitにインデックスされた全Sassファイルから、`+border-radius(なんちゃら)` を  `border-radius: なんちゃら` に置換したい

## コマンド

```
$ git ls-files *.sass|LC_ALL=C xargs sed -E -i '' 's/\+border-radius\((.+)\)/border-radius: \1/g'
```

## しくみ

- `git ls-files *.sass` でGitにインデックスされたファイルの中から、なんちゃら.sass の一覧を出す。
- `LC_ALL=C` は Mac のsed で `sed: RE error: illegal byte sequence` が出てつらいのを回避。
- `xargs` で | の前のコマンドの結果を1行ずつ評価する。
- `sed -E` とすると、拡張正規表現を使って置換できる。
- `-i` はファイルを直接置換する。
- `'s/\+border-radius\((.+)\)/border-radius: \1/g'`
    - `\((.+)\)` は ()内に何文字でも自由な文字列が入り、 `\1`は1つめの()を参照する 
    - 後方参照という

正規表現、使えると便利ですね(ΦωΦ) 使いこなしたい…
AWS時刻設定(RedHat,ubuntu)

# 現在時刻確認

ずれてる

```
[ec2-user@ip-172-31-xxx-xxx ~]$ date
2016年  2月 18日 木曜日 03:38:51 EST
```




# RedHatの場合

```
sudo yum install ntp
```

``` /etc/ntp.conf
#server 0.rhel.pool.ntp.org iburst
#server 1.rhel.pool.ntp.org iburst
#server 2.rhel.pool.ntp.org iburst
#server 3.rhel.pool.ntp.org iburst
server ntp.nict.jp
server ntp.nict.jp
server ntp.nict.jp
```

```
sudo service ntpd restart
```

#### timezone変更

```
ln -sf  /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```

``` /etc/sysconfig/clock
ZONE="Asia/Tokyo"
UTC=false
```

# ubuntu

```
sudo apt-get install ntp
```

``` /etc/ntp.conf
#server 0.rhel.pool.ntp.org iburst
#server 1.rhel.pool.ntp.org iburst
#server 2.rhel.pool.ntp.org iburst
#server 3.rhel.pool.ntp.org iburst
server ntp.nict.jp
server ntp.nict.jp
server ntp.nict.jp
```

```
sudo /etc/init.d/ntp restart
```

#### timezone変更
```
$ sudo echo Asia/Tokyo > /etc/timezone
$ sudo dpkg-reconfigure --frontend noninteractive tzdata
```
転職活動の際のヒアリングシート

転職先の会社の環境をヒアリングする際にご利用ください！

#労務、福利厚生関連
|項目|ヒアリング結果|備考|
|:------------|:------------|:------------|
|産休・育休||実績も聞くとよし|
|社会保険|||
|36協定|||
|残業代|||
|休日、深夜作業時の割りまし|||
|ストックオプション|||
|社員持株会|||
|ボーナス|||
|人事制度|||
|休憩スペース||男女別、仮眠の可否など|
|喫煙所|||
|社食|||
|家賃等の補助|||
|社員寮|||
|シャワー|||
|トイレの数||１つで男女共有だと悲惨|
|駐輪場|||
|駐車場|||
|自転車通勤の可否|||
|自動車通勤の可否|||
|託児所|||
|仮眠スペース|||
|資格等による報酬など|||

#インフラ関連
|項目|ヒアリング結果|備考|
|:------------|:------------|:------------|
|バージョン管理||git hub enterpriseとか|
|LANからの外部接続|||
|カレンダー||google apps、サイボウズ|
|貸与されるディスプレイの数|||
|貸与されるマシンの数|||
|事務所の照明||蛍光灯、LED、その他|
|事務椅子の種類|||
|冷房||なしw、全体で温度調整、部屋毎に温度調整|
|大型シュレッダー||あると超便利|
|災害時の食料、ヘルメット等の備蓄|||

#自動化
|項目|ヒアリング結果|備考|
|:------------|:------------|:------------|
|サーバ構築|||
|単体テスト|||
|E2Eテスト|||
|ビルド・デプロイ|||

#社員構成
|項目|ヒアリング結果|備考|
|:------------|:------------|:------------|
|男女比率|||
|平均年齢|||
|エンジニア比率|||
|正規・非正規比率|||
|新卒退職率|||
|中途退職率|||

#実績
|項目|ヒアリング結果|備考|
|:------------|:------------|:------------|
|既存顧客|||
|既存製品・サービス|||

#財務
|項目|ヒアリング結果|備考|
|:------------|:------------|:------------|
|設立|||
|株主構成||オーナーだけなのか、VCも入っているのか等々|
|資本金|||
|直近2期の決算||TDB等で入手|

#知財
|項目|ヒアリング結果|備考|
|:------------|:------------|:------------|
|保有する特許など|||
|Office等のライセンスをちゃんと購入しているか|||

#その他
|項目|ヒアリング結果|備考|
|:------------|:------------|:------------|
|オープンソースコミュニティへの還元|||

#認証
|項目|ヒアリング結果|備考|
|:------------|:------------|:------------|
|Pマーク|||
|ISMS|||
|その他ISO|||
無料のSSL証明書 [ Let's Encrypt ] を ubuntu にインストールする。

WEBサーバーでPort:80とPort:443を有効にしておきます。
(自動更新用にPort:80のrootディレクトリは777とかに設定しておく。)

```
$ chmod -R 777 /var/www/public_html
```

letsencryptのダウンロードとインストールを実行します。

```
$ git clone https://github.com/letsencrypt/letsencrypt
$ ./letsencrypt/letsencrypt-auto
```

ドメイン名とかメールアドレスを入力してインストールが終わると証明書ファイルが以下のディレクトリに生成されます。

```
$ cd /etc/letsencrypt/live/YOUR_HOSTNAME/ ; ls

cert.pem
chain.pem
fullchain.pem
privkey.pem
```

自動更新を設定するためにクーロンを追加します。

```
$ crontab -e
```

以下の通り反映されました。(毎月1日に更新)

```
* * 1 * *　/path_to_letsencrypt/letsencrypt-auto certonly --webroot -w /var/www/letsencrypt -d [YOURDOMAIN] --renew-by-default && service restart nginx
```

これで完了です。
RabbitMQ + php-amqplib でメッセージキューイング試してみた


## 動機と背景
下記のような理由から、RabbitMQでメッセージキューイングを試してみたので、記録として残しておきます。

- PHP + Silex(Symfony2.3+)で、BtoBtoCなWebアプリケーションを開発・運用している
- 管理画面で時間のかかる処理がある（CSVファイルのダウンロードなど）
- データベースに、キューイング用のテーブルを作って、cronで一定間隔でキューがあるかチェックする、というような実装をしている
- cron使いたくない（１分おきに実行とかなんとなく）
- もっと汎用的な仕組みに置き換えたい

## RabbitMQ
メッセージキューイングで調べると下記のようなライブラリが見つかります。

- [Kestrel](https://twitter.github.io/kestrel/)
- [ActiveMQ](http://activemq.apache.org/)
- [RabbitMQ](http://www.rabbitmq.com/)

チームのエンジニアに意見を聞いて、RabbitMQは使いやすかったということだったので、試してみることにしました。

### php-amqplib
RabbitMQの[Clients and Developer Tools](http://www.rabbitmq.com/devtools.html#php-dev)を見ると、PHP用のライブラリがいくつかあります。
ただ、公式の[tutorial](http://www.rabbitmq.com/tutorials/tutorial-one-php.html)を見ると、[php-amqplib](https://github.com/php-amqplib/php-amqplib)が使われているので、これを採用しました。

## CUI版のexampleを作成
ほぼほぼ、tutorialにしたがって、CUI版のexampleを作りました。
https://github.com/imunew/php-rabbitmq-example

ざっとポイントを列挙すると、以下のようになります。

- vagrant + ansible で実行環境構築を自動化
- コンソールを２つ起動し、１つは受信用、１つは送信用として使う
- 送信側でスクリプトを実行すると、受信側にメッセージが表示される

## GUI(Web)版のexampleを作成
次に、GUI(Web)版を実装してみました。
https://github.com/imunew/silex-rabbitmq-example

より実戦に近いイメージで、実装をしてみました。
CUI版との違いを列挙すると、以下のようになります。

- supervisorで受信側スクリプトを常駐化（デーモン化）
- redisを経由して、処理結果を画面側に渡すようにした
- 重たい処理は`usleep(1000000);`を10回実行することで再現

## ハマったところ
### メッセージをどう管理するか
複数のメッセージを非同期で扱うことになるので、一つ一つのメッセージがそれぞれユニークになる必要があります。
exampleでは、画面表示したときに、md5(time())でハッシュを作り、それをメッセージのIDとするようにしました。

```php
// src/controllers.php
$app->get('/example', function (Request $request) use ($app) {
    $result = $request->get('result', []);
    /** 
     * 初期表示のときに、md5(time())でハッシュが作られ、それがメッセージのIDとなる
     */
    $hash = $request->get('hash', md5(time()));
    $startTime = $request->get('startTime', '');
    $endTime = $request->get('endTime', '');
    return $app['twig']->render('app/example.html.twig', [
        'result' => $result,
        'hash' => $hash,
        'startTime' => $startTime,
        'endTime' => $endTime,
    ]);
})
;
```

### supervisorのセットアップ
正直ハマりましたw。
yumでインストールすると、2.x系がインストールされるので、easy_installから（3.x系を）インストールします。
supervisordコマンドで常駐化するというのも、はじめ分かりませんでした。
最終的には、ansibleに手順がまとまっていますので、参照ください。

[ansible/roles/supervisor/tasks/main.yml](https://github.com/imunew/silex-rabbitmq-example/blob/master/ansible/roles/supervisor/tasks/main.yml)


## 使いどころや課題など
チームで話し合って実戦投入するか決めたいと思いますが、なんとなく課題になりそうなところを想像してみました。

- 使いどころ
    - 重たいドキュメント系処理（CSV、PDF出力）
    - メール送信（spoolしておいて非同期に送信）
- 非同期にするだけで、単純に実装の難易度あがる
    - いい感じにパッケージ化してあげないと、オレオレな実装が増えそう 
- 受信側プロセスをどこで動かすか
    - 各Webサーバーに分散するか、中央集権的なサーバーを作るか
    - どこで処理しても、結果を受け取れなければいけない

実戦で投入したら、記事を更新しようと思います。
exampleの実装などで、ご意見ご感想ありましたら、githubでpull-requestやissueください。
もちろん、本投稿にコメントいただいても結構です。
MavenのAssemblyでファイル名を変更する方法

例えソースにサンプルの設定ファイルがあります、製品に正式のファイル名にコーピーしたい場合、`assembly`の`files`要素が役に立ちます。

```xml

<?xml version="1.0" encoding="UTF-8"?>
<assembly>
  <files>
    <file>
      <source>somewhere/app.properties.sample</source>
      <outputDirectory>webapps/ROOT/WEB-INF/classes</outputDirectory>
      <destName>app.properties</destName>
    </file>
  </files>
</assembly>
```

これは`somewhere/app.properties.sample`を`app.properties`にコーピーされます。
Boostnoteの使い方

# Boostnoteとは
公式サイト
https://b00st.io/jp/
簡単に言うと、プログラミング用のメモ帳である。

## 特徴
+ Markdown記法に対応
>
プレーンテキストで記述するだけで読みやすく美しい記事を作成することが可能です。開発ノウハウのメモや議事録の作成も簡単です。

+ シンタックスでコードもきれいに
>
100種類のシンタックスハイライトに対応しており、コードを記述するのにもピッタリです。

# Boostnote使い方

1. Folderを作る(最初だけ)
2. Folderを選択する
3. スクリプトを新規作成する
4. プログラミング言語を選択
5. 書く！
6. 共有する

## Folderを作る
![image](https://qiita-image-store.s3.amazonaws.com/0/96970/7a81fa4c-4a9c-24d6-2762-dc35ea109f87.png)

## Folderを選択する
![image](https://qiita-image-store.s3.amazonaws.com/0/96970/bc368b5d-758a-ef8b-2f69-8e5679d088cc.png)

## スクリプトを新規作成する
![image](https://qiita-image-store.s3.amazonaws.com/0/96970/f461b372-88b1-6a3a-b540-95c00838d36d.png)


## プログラミング言語を選択
![image](https://qiita-image-store.s3.amazonaws.com/0/96970/f0bf0f41-4031-8a3d-bbd2-fe8263854907.png)

## 書く！
![image](https://qiita-image-store.s3.amazonaws.com/0/96970/64b941c7-c190-99a3-093f-a292a2d65142.png)

## 書いたスクリプトをリンクで共有する

![image](https://qiita-image-store.s3.amazonaws.com/0/96970/92d0670b-4b47-832e-2971-8866129b8b9a.png)

このスクリプトの共有リンクはコチラ
https://b00st.io/shared/992b37c0d80176b76043491a8bdd22d750283374

これで自分が書いたメモを他人に渡すことができます。

# Markdownも選択可能
このようにMarkdownの選択もすることができます。

![image](https://qiita-image-store.s3.amazonaws.com/0/96970/08d64e56-5496-9ebc-dcbb-3ceead30e965.png)

できあがりはこんな感じ
https://b00st.io/shared/876795b21e62cb82c384b91a098503b75b265b5d

それでは、楽しいBoostnoteライフを！
Symfony1.2をPHP5.5以降でセットアップする方法

## はじめに

諸事情で**Symfony1.2**環境を用意する事になったので、手順をまとめました。
あくまでメモ代わりなのでわかりづらくても勘弁してください。


## 実行環境

* OS X Yosemite 10.10.5
    * Apache 2.4.16
    * MariaDB 10.0.21

    * ドキュメントルート
        * `~/Sites/`
    * ダウンロード
        * `~/Download/`


## Symfony1.2のインストール

### Download

[Symfony1 Legacy](http://symfony.com/legacy)から1.2系の最終版**1.2.12**をダウンロードします。

![screenshot 2016-02-18 16.31.34.png](https://qiita-image-store.s3.amazonaws.com/0/13487/7241809d-8342-9ccf-e5a3-d4bb0f2bcfee.png)

### Installation

CakePHPなどと違い、解凍したファイル群の中でそのまま開発に入れません。
[ドキュメント](http://symfony.com/legacy/doc/jobeet/1_2/en/01?orm=Propel)に従い、環境を準備します。
**PROJECT_NAME**と**APP_NAME**の部分は適宜変更します。

> `mkdir -p ~/Sites/PROJECT_NAME/lib/vendor`
> `cd ~/Sites/PROJECT_NAME/lib/vendor`
> `mv ~/Download/symfony-1.2.12.tgz ~/Sites/PROJECT_NAME/lib/vendor`
> `tar zxpf symfony-1.2.12.tgz`
> `mv symfony-1.2.12 symfony`
> `rm symfony-1.2.12.tgz`
> `cd ../..`
> `php lib/vendor/symfony/data/bin/symfony generate:project PROJECT_NAME`
> `php symfony generate:app --escaping-strategy=on --csrf-secret=UniqueSecret APP_NAME`

PHP5.5以降で**Symfony1.2**を動かすためにパッケージを一部修正します。

`PROJECT_NAME/lib/vendor/symfony/lib/config/sfApplicationConfiguration.php`の157行目

```diff:sfApplicationConfiguration.php
- ob_start(sfConfig::get('sf_compressed') ? 'ob_gzhandler' : '');
+ ob_start(sfConfig::get('sf_compressed') ? 'ob_gzhandler' : null);
```

`PROJECT_NAME/lib/vendor/symfony/lib/response/sfWebResponse.class.php`の407行目

```diff:sfWebResponse.class.php
- return preg_replace('/\-(.)/e', "'-'.strtoupper('\\1')", strtr(ucfirst(strtolower($name)), '_', '-'));
+ return preg_replace_callback('/\-(.)/', function() { return '-'.strtoupper('\1'); }, strtr(ucfirst(strtolower($name)), '_', '-'));
```

初期アセットに対するシンボリックリンクを設定します。

> `cd ~/Sites/PROJECT_NAME/web`
> `ln -s ../lib/vendor/symfony/data/web/sf sf`

`http://localhost/PROJECT_NAME/web/APP_NAME_dev.php`にアクセスしてインストール確認します。

![screenshot 2016-02-18-17.35.09.png](https://qiita-image-store.s3.amazonaws.com/0/13487/c4a9472f-a61b-3799-528b-331c9302a03f.png)
PHPでファイルを暗号化


以前、[単純な文字列を暗号化する方法書きました](http://qiita.com/zaburo/items/e2f08d40d8f8d9ae875f)。

今回はAES256以上でファイルを暗号化して！と言われたのでテストしてみました。

文字列の際と同様に、基本は、[openssl_encrypt()](http://php.net/manual/ja/function.openssl-encrypt.php)を使う。

文法的には、

```php
string openssl_encrypt ( string $data , string $method , string $password [, int $options = 0 [, string $iv = "" ]] )
```

となっており、第一引数に暗号化する対象データをstringで渡す。
この第一引数に、

```php
file_get_contents('plain_file')
```

を渡してやることで、ファイル全体を暗号化の対象とする。
あとは、`file_put_contents()`で保存してやります。

変に関数化して見難いですが、コードは下記の通り。


```php
<?php

	//暗号化パラメータ
	define('PASSWORD','hogehogefoofoo');
	define('IV','1234567890123456');
	
	//入出力ファイル
	$plain_file = './plain.txt';
	$enc_file = './enc.txt';
	$out_file = './out.txt';

	//暗号化
	encData($plain_file,$enc_file);
	//復号化
	decData($enc_file,$out_file);


	/* --------------------------------------------------------- */


	//暗号化関数
	function encData($plain_file,$enc_file)
	{
		//パラメータ設定
        $password = PASSWORD;
        $method   = 'aes-256-cbc';
        $options  = OPENSSL_RAW_DATA;
        $iv       = IV; //これは16桁じゃないとだめ。

        //暗号化
        $enc_data = openssl_encrypt(
		        		file_get_contents($plain_file),
		        		$method,
		        		$password,
		        		$options, 
		        		$iv
		        	);

        //出力
        $res = file_put_contents($enc_file, $enc_data);

        //結果
        if($enc_file != FALSE && $res != FALSE)
        {
        	return true;
        }else
        {
        	return false;
        }

	}

	//復号化関数
	function decData($enc_file,$plain_file)
	{
		//パラメータ設定
        $password = PASSWORD;
        $method   = 'aes-256-cbc';
        $options  = OPENSSL_RAW_DATA;
        $iv       = IV; //これは16桁じゃないとだめ。

        //復号化
        $dec_data = openssl_decrypt(
        				file_get_contents($enc_file),
        				$method,
        				$password,
        				$options,
        				$iv
        			);

    	//出力
    	$res = file_put_contents($plain_file, $dec_data);

    	//結果
        if($dec_data != FALSE && $res != FALSE)
        {
        	return true;
        }else
        {
        	return false;
        }
	}
```

##その他

###ivの生成

ivは通常、

```php
$iv = openssl_random_pseudo_bytes(16);
```

などとします。但し、`$iv`は復号の際も必要なので、明示的に指定してもいいです。

###モードについて

なお、恐らく単にAES256として利用した場合は、ECBモードで動作します。ECBは、同じ情報からは、同じパターンとなるため、MD5と同様に辞書化のリスクが０ではありません。CBCは、都度パターンが違うので、セキュリティー的にECBより優れているとされます。

モードについては[こちら](https://ja.wikipedia.org/wiki/%E6%9A%97%E5%8F%B7%E5%88%A9%E7%94%A8%E3%83%A2%E3%83%BC%E3%83%89)。

###opensslコマンドでの復号化

普通？の方法では復号できませんでした。やり方の[メモ](http://qiita.com/zaburo/items/ffb7728cb9a9efe907d9)。
input要素のtext属性（他）の左内側の余白を空ける方法

メモしておく。

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

スマフォやタブレットを考慮して、width属性を横幅いっぱいに設定しておきたい。

```css
input {
  padding: 0 0 0 2%;
  width: 98%;
}
```

横幅は100%にするのに、width + padding-left = 100%で当然考えるわけで。
けど、この2%って相対指定なので、スマフォを横にしたり、タブレットのような解像度のものであったりするとデバイスによって左の余白が空きすぎてしまうので、これを固定（一定）にしたかった。

うんうん悩んで、隣の席のエンジニアに聞いてみたら、あっさり解決した。

```css
input {
  text-indent: 1em;
  width: 100%;
}
```

きれいに空いた！＼(^o^)／
単純だけど気付かなかった自分にビンタしたい。頭固くなってるのかな...... :scream:
spark yarn modeのアプリのintellij上でjunit test caseの実行



- yarnのresource managerが読めないっておこられたら、yarn-site.xml等のhadoop config fileを src/main/resources以下に配置する。
 - yarn-site.xmlでhost nameを設定しているが、logでは0.0.0.0:8032をRMProxyが読もうとしてエラー 
 - 環境変数を設定してもだめだった。。。 
- original jarはtest case内で setJarsする。
 - intellijで依存性を設定してもだめだった。。。 
- これで、テストできる。


```Test.scala

/**
  * Created by mrikitoku on 16/02/18.
  */
class Test {

  @Test
  def testAsRdd(): Unit = {
    val conf = new SparkConf().setAppName(s"Test")
    // for yarn client mode
    conf.setMaster("yarn-client")
    // set original jars
    conf.setJars(Array("./target/scala-2.10/ほげほげ.jar"))
    conf.set("deploy-mode", "client")
    val sc = new SparkContext(conf)
    
    // target methods for test
    val rdd = asRdd(sc, arg1, arg2...)
    assertTrue(rdd.isDefined)
    val c = rdd.get.count()

    println(s"#rdd: $c")
  }
}

```
gcloud docker pushして"push or pull is already in progress"と怒られる時の対処法

GKEで

`$ gcloud docker push asia.gcr.io/***/***-app`

を`C-c`で中断したりすると、次回同コマンド実行時に

`The push refers to a repository [asia.gcr.io/***/***-app] (len: 1)
push or pull asia.gcr.io/***/***-app is already in progress`

と怒られた。この解決法はdocker-machineの場合

`docker-machine restart ***`

としてdocker machineの再起動をした後で

`$ docker build -t asia.gcr.io/***/***:latest .`

などとして再度imageのbuildから実行すれば再度実行可能でした。
herokuでDB壊しちゃったときにリカバったはなし



# この記事は何？

HerokuのBackupとかrecoveryってどうやって使うのかをまとめます。

# 今更こんな当たり前なことを書いた理由

ミスでテスト環境のDBをdrop&createで殲滅。
藁にもすがる思いでこの機能を試した所見事復活。
これは「Heroku様のお力を広めなければ！」思いたち記事書きました。

# コンテンツ

## データベースの状態を確認

とりあえずDBのステータスを確認する
データが無くなってしまったことを確信・・・。

```lang:bat
>heroku pg:info --app "XXXXXXXXX"
=== DATABASE_URL
Plan:               Standard 0
Status:             Available
Data Size:          14.4 MB
Tables:             83
PG Version:         9.4.4
Connections:        4/120
Fork/Follow:        Available
Rollback:           earliest from 2016-02-13 08:14 UTC
Created:            2015-09-13 16:31 UTC
Region:             virginia
Maintenance:        not required
Maintenance window: Wednesdays 19:00 to 23:00 UTC
Add-on:             postgresql-animated-3037
```

ん？
**Rollback:           earliest from 2016-02-13 08:14 UTC**

なんか１週間前から戻せるとか言ってませんか？


## DBのRestoreをしてみる

Restoreすると新しいDBが作られます。
あまり高いプランでRestoreすると死亡するので気をつけて！

### 管理コンソールから試す

なぜか怒られる・・・なぜ？
理由誰かおしえてください。。。
![image](https://qiita-image-store.s3.amazonaws.com/0/84539/ced28dbb-98bf-a13d-c6e8-9379e397a28d.png)


### cliから試す

仕方ないのでcli・・・成功・・・なぜ？

```lang:bat
>heroku addons:create heroku-postgresql:standard-0 --rollback postgres://xxxxxxx:xxxxxxx@XXXXXX.compute-1.amazonaws.com:9999/xxxxxx --to '2016-02-17 16:00:00+09' --app  "XXXXXXX"
Creating postgresql-parallel-32612... done, ($50.00/month)
Adding postgresql-parallel-32612 to XXXXXXX... done
Setting HEROKU_POSTGRESQL_COBALT_URL and XXXXXXX... done, v1009
Database will become available after it completes rolling back
to 2016-02-17 07:00:00 +0000 (01:18:36 ago)
Use `heroku pg:wait` to track status
Use `heroku addons:docs heroku-postgresql` to view documentation.
```

## スナップショット作る

Restoreした過去のDBから「New PG Backup」でスナップショットを作る

![image](https://qiita-image-store.s3.amazonaws.com/0/84539/f920440a-ba0b-c69b-bb04-866bf4f067d5.png)


## スナップショットから戻す

作ったスナップショットをAPのメインDB（ぶっ壊しちゃったやつ。。。）に反映！

```lang:bat
>heroku pg:backups restore XXXXXXXXX::b006 DATABASE_URL --app XXXXXXXXX

 !    WARNING: Destructive Action
 !    This command will affect the app: XXXXXXXXX
 !    To proceed, type "XXXXXXXXX" or re-run this command with --confirm XXXXXXXXX

> XXXXXXXXX
Use Ctrl-C at any time to stop monitoring progress; the backup
will continue restoring. Use heroku pg:backups to check progress.
Stop a running restore with heroku pg:backups cancel.

r007 ---restore---> DATABASE
Restore completed
```

## ミッションコンプリート！

戻った！DBが過去に戻ったよ！
皆さんもデータふっとんだ時は慌てず試してください。
Lubuntu + compiz

* Virtualboxの2Dアクセラレーションが有効なのはwindowsゲストのみ。
* 3Dアクセラレーションはlinuxゲストで有効なのでcompiz使えば描画早くなるのでは！？と思い設定。

## 参考

* [漢(オトコ)のコンピュータ道: CompizとGlx-Dockを極める！LinuxデスクトップをOSX風にカスタマイズしよう。](http://nippondanji.blogspot.jp/2011/02/compizglx-docklinuxosx.html)
* [Lubuntu の備忘録 CompizとCairo-dockを使ってMacっぽく - プログラミング 見習い](http://code-c.hatenablog.com/entry/2014/03/16/104215)
* [Vagrant+RancherOS,Ubuntu - Qiita](http://qiita.com/tukiyo3/items/b2ca19fbb146d84a50f7)

## インストール

```bash:
sudo apt-get install -y compiz
```

```bash:~/.config/lxsession/Lubuntu/autostart
@/usr/bin/compiz --replace
```


## 設定

```bash:
ccsm
```

![deco.png](https://qiita-image-store.s3.amazonaws.com/0/25728/22b36eec-8e2d-52cc-9423-1fce62cea8e6.png)

![move.png](https://qiita-image-store.s3.amazonaws.com/0/25728/41a41520-42ba-f49f-f0ad-12bce7e0fe55.png)

面倒なのでcinnamon使おうかな。
[Linux Mint 17 非公式日本語ISO kumasan](http://kumasan1949.zouri.jp/down-mint.html)
MongoDB 2.4.3 を 3.2.1 にバージョンアップしてはまったこと～データベース入門者の場合～

# 背景
MongoDB 2.4.3 と 3.2.1 の両バージョンで動作比較を実施。
そのために、2.4.3 と 3.2.1 を一台のサーバーにのせた。
# はまったことその１
## データが破損
2.4.3 と 3.2.1 でバイナリを分け、`dbpath` を 共有したまま 2.4.3 を停止後に 3.2.1 を起動を試みた。しかしデータフォーマット差異により物理データが破損。その結果、両バージョンとも起動しなくなってしまった。
`dbpath` は必ず分けよう！

```
[ec2-user@ip-hoge ~]$ tail -200 /hoge/logs/mongodb.log

***** SERVER RESTARTED *****

Fri Jan 15 01:26:51.083 [initandlisten] MongoDB starting : pid=3228 port=27017 dbpath=/data/db 64-bit host=ip-hoge
Fri Jan 15 01:26:51.083 [initandlisten] db version v2.4.3
Fri Jan 15 01:26:51.083 [initandlisten] git version: xxxxxxxxxxxxxxxxxxxxxxxx
Fri Jan 15 01:26:51.083 [initandlisten] build info: Linux ip-fuga
Fri Jan 15 01:26:51.083 [initandlisten] allocator: tcmalloc
Fri Jan 15 01:26:51.083 [initandlisten] options: { dbpath: "/data/db", fork: true, logappend: true, logpath: "/hoge/logs/mongodb.log", port: 27017 }
Fri Jan 15 01:26:51.091 [initandlisten] journal dir=/data/db/journal
Fri Jan 15 01:26:51.091 [initandlisten] recover : no journal files present, no recovery needed
Fri Jan 15 01:26:51.100 [initandlisten] ****
Fri Jan 15 01:26:51.100 [initandlisten] ****
Fri Jan 15 01:26:51.101 [initandlisten] need to upgrade database hogeCollection with pdfile version 4.21, new version: 4.5
Fri Jan 15 01:26:51.101 [initandlisten]          Not upgrading, exiting
Fri Jan 15 01:26:51.101 [initandlisten]          run --upgrade to upgrade dbs, then start again
Fri Jan 15 01:26:51.101 [initandlisten] ****
Fri Jan 15 01:26:51.101 dbexit:
Fri Jan 15 01:26:51.101 [initandlisten] shutdown: going to close listening sockets...
Fri Jan 15 01:26:51.101 [initandlisten] shutdown: going to flush diaglog...
Fri Jan 15 01:26:51.101 [initandlisten] shutdown: going to close sockets...
Fri Jan 15 01:26:51.101 [initandlisten] shutdown: waiting for fs preallocator...
Fri Jan 15 01:26:51.101 [initandlisten] shutdown: lock for final commit...
Fri Jan 15 01:26:51.101 [initandlisten] shutdown: final commit...
Fri Jan 15 01:26:51.101 [initandlisten] shutdown: closing all files...
Fri Jan 15 01:26:51.101 [initandlisten] closeAllFiles() finished
Fri Jan 15 01:26:51.101 [initandlisten] journalCleanup...
Fri Jan 15 01:26:51.101 [initandlisten] removeJournalFiles
Fri Jan 15 01:26:51.107 [initandlisten] shutdown: removing fs lock...
Fri Jan 15 01:26:51.107 dbexit: really exiting now
```

https://docs.mongodb.org/manual/release-notes/2.4-upgrade/

## はまったことその２
クラスタ構成を組んでいたため、バージョンアップする場合は `mongod` だけでなく `mongos` もする必要があった。
`hoge`サーバーには `mongod` が、`fuga` サーバーには `mongos` が起動している。
MongoDB クライアント（`mongos`）も一緒にバージョンアップしよう！

```
[ec2-user@ip-hoge ~]$ less /hoge/logs/mongodb.log
2016-01-14T10:15:55.701+0000 E COMMAND  [conn1] Writeback functionality is no longer present in v3.0 mongod, a v2.6 mongos may be running in the v3.0 cluster at ip-fuga
```

https://fossies.org/linux/misc/mongo-r3.0.9.tar.gz/mongo-r3.0.9/src/mongo/db/commands/writeback_compatibility_shim.cpp