OmniAICreator/Qiita-1.07M huggingface dataset:
Android Studio で google Protobuf

[Protobuf gradle plugin](https://github.com/google/protobuf-gradle-plugin) を Android Studio に適用する方法について Android Studio で Java 初心者で Groovy なにそれな私が指向錯誤。

以下プロジェクト名を `SampleProject` として記述。

# 環境
- Ubuntu 16.04
- Android Studio 2.2.2
- gradle 2.1.4

# SampleProject/build.gradle の編集
このファイルでやる事はリポジトリと classpath の追加

```groovy
buildscript {
  repositories {
    ...
    // mavenCentral を追加
    mavenCentral()
  }

  dependencies {
    ...
    classpath 'com.google.protobuf-gradle-plugin:0.8.0'
  }
}
```

# SampleProject/app/build.gradle の編集
このファイルでの作業は

- プラグインの apply
- protobuf プラグインの設定
- dependencies の変更

```groovy
apply plugin: 'com.android.application'
//必ず com.android.application の後に apply する
apply plugin: 'com.google.protobuf'

android {
    (snip)
}

// protobuf プラグインの設定
protobuf {
    // protoc の設定
    protoc {
        artifact = "com.google.protobuf:protoc:3.0.0"
    }
    // javalite プラグインを使う
    plugins {
        lite {
            artifact = "com.google.protobuf:protoc-gen-javalite:3.0.0"
        }
    }
    // タスク関連
    generateProtoTasks {
        all().each { task ->
            task.plugins {
                lite {}
            }
        }
    }
}

dependencies {
    (snip)
    compile 'com.google.protobuf:protobuf-lite:3.0.0'
}
```

気をつけるべき事は `apply` を `com.android.application` の後に行うこと。
`protobuf {}` の部分については [GitHub の issue](https://github.com/google/protobuf-gradle-plugin/issues/89) を参考にした。

編集後は `Sync Project with Gradle Files` をすること。

# 試しに `.proto` ファイルを追加してみる
> By default, it includes all *.proto files under `src/$sourceSetName/proto`

とのことなので `SampleProject/app/src/main/proto/` 以下に `sample.proto` を追加。

```protobuf
syntax="proto2";

option java_package = "com.foo.sampleproject";

message Persion {
  required string name = 1;
  required uint32 age = 2;
}
```

これでビルドを行うと `SampleProject/build/generated/source/proto/debug/lite/com/foo/sampleproject` に Sample.Java が生成されている。
mac os x sierra で ssh の鍵のパスワードがキーチェインに保存されない対策

# macOS Sierra で、 ssh のときの秘密鍵パスワードがキーチェインに保存さなくなったときの対策

1. sudo vi /etc/ssh/ssh_config に

```
UseKeychain yes
```

を追記

---
それができないとき (sudo できないとき)、

２． ~/.bashrc に

```
ssh-add -K 2> /dev/null
```

を追記
Docker over the proxy

## Dockerをプロキシ越しに使う
* 新しい`docker`は，`systemd`でデーモンの管理をするみたい．
* dockerのサイトに[ドキュメント](http://docs.master.dockerproject.org/engine/admin/systemd/)がある．
* 古いバージョンでは，`/etc/default/docker`に`http_proxy`と`https_proxy`を追加しておけば良い．

### docker.service.d

`/etc/systemd/system/docker.service.d/http-proxy.conf`にファイルを作って，以下のように設定を書いておく．

```
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80/" "NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com"
```

設定を書き換えたら，デーモンをリロードする．

```
sudo systemctl daemon-reload
sudo systemctl restart docker
```

## dockerをsudoなしで使う

dockerユーザグループに自分を追加する．

```
sudo gpasswd -a $USER docker    # グループに追加
sudo systemctl restart docker   # dockerをリロード
```

## nvidia-docker

* プロキシ越しにビルドしようとすると，gpgの鍵のところでこける．
* 素直にバイナリを`dpkg`でインストールすることもできる．[公式](https://github.com/NVIDIA/nvidia-docker/wiki#quick-start)
phpとunityの間での暗号化と復号化

+ 文字コードはUTF-8です。
+ 試してみて暗号/復号できたものを書いただけです。

# PHPで暗号化
```php
function Aes128CBCEncode(String $input, String $key, String $IV) {
    return mcrypt_encrypt('rijndael-128', $key, $input, 'cbc', $IV);
}
```

# PHPで復号化
```php
function Aes128CBCDecode(String $input, String $key, String $IV) {
    $data = mcrypt_decrypt('rijndael-128', $key, $input, 'cbc', $IV);
    // 暗号時にパディングした \n を削除する
    $data = rtrim($data, "\0");
    return $data;
}
```

# Unityで暗号化
```C#
byte[] Aes128CBCEncode(byte[] input, string Key, string IV)
{
    System.Security.Cryptography.AesManaged Aes = new System.Security.Cryptography.AesManaged();
    Aes.KeySize = 128;
    Aes.BlockSize = 128;
    Aes.Mode = System.Security.Cryptography.CipherMode.CBC;
    Aes.IV = System.Text.Encoding.UTF8.GetBytes(Key);
    Aes.Key = System.Text.Encoding.UTF8.GetBytes(IV);
    Aes.Padding = System.Security.Cryptography.PaddingMode.Zeros;
    return Aes.CreateEncryptor().TransformFinalBlock(input, 0, input.Length);
}
```

# Unityで復号化
```C#
byte[] Aes128CBCDecode(byte[] input, string Key,string IV)
{
    System.Security.Cryptography.AesManaged Aes = new em.Security.Cryptography.AesManaged();
    Aes.KeySize = 128;
    Aes.BlockSize = 128;
    Aes.Mode = System.Security.Cryptography.CipherMode.CBC;
    Aes.IV = System.Text.Encoding.UTF8.GetBytes(Key);
    Aes.Key = System.Text.Encoding.UTF8.GetBytes(IV);
    Aes.Padding = System.Security.Cryptography.PaddingMode.Zeros;
    return Aes.CreateDecryptor().TransformFinalBlock(input, 0, input.Length);
}
```
ArrayLike オブジェクトで Array.prototype 系メソッドを使用する

# NodeList オブジェクトは Array.prototype を継承しない

`querySelectorAll` が返す `NodeList` オブジェクトは `Array.prototype` を継承しない為、そのままでは `Array.prototype.forEach` を使用できません。
そこで `Function.protoype.call` を利用してこれに対応するテクニックがよく使われます。

```JavaScript
Array.prototype.forEach.call(document.querySelectorAll('p'), function (element) { console.log(element); });
```

よく使う機能なら関数化したい、という事でいくつか書いてみました。

**(2016/12/22 15:05 追記)**
@gaogao_9 さんより「**HTML Living Standard では `NodeList` に “entries”, “forEach”, “keys”, “values” がある**」との情報を頂きました。
`Array.prototype.forEach` とは別物ですが、使い勝手は同じだそうです。

```JavaScript
console.log(document.querySelectorAll('p').forEach);  // function forEach() { [native code] }
console.log(document.querySelectorAll('p').forEach === Array.prototype.forEach);  // false (Google Chrome 55.0.2883.87 m の結果)

document.querySelectorAll('p').forEach(function (element, i, elements) {
  console.log(element, i, elements, this);
}, []);
```

`Array.prototype` にあるメソッド全ては存在しないので以降は `Array.prototype.filter` 等、他の関数を汎用化するものと置き換えて下さい。
あるいは、HTML Living Standard を実装していないブラウザ向けとお考え下さい。


# 汎用関数 forEach (通常版)

よく見るコードです。

```JavaScript
function forEach (arrayLike, callbackfn) {
  return Array.prototype.forEach.call(arrayLike, callbackfn);
}
```

# 汎用関数 forEach (forEachキャッシュ版)

`Array.prototype.forEach` を何度も参照するのはプロパティ参照コストが無駄なのでキャッシュしました。

```JavaScript
var forEach = (function (_forEach) {
  return function forEach (arrayLike, callbackfn) {
    return _forEach.call(arrayLike, callbackfn);
  };
}(Array.prototype.forEach));
```

# 汎用関数 forEach (forEach,callキャッシュ版)

更に `Function.prototype.call` もキャッシュしました。
`Function.prototype.bind` を利用している為、ES5 (IE9+) を要求しますが、自前で関数式を書く必要がなくなっています。

```JavaScript
var forEach = Function.prototype.call.bind(Array.prototype.forEach);
```

# 実行サンプル

- [Array.prototype.forEach の汎用関数化 - JSFiddle](https://jsfiddle.net/crybeLrt/)

```HTML
<p>test1</p>
<p>test2</p>
<p>test3</p>
<p>test4</p>
<p>test5</p>
<p>test6</p>
<script>
'use strict';
var forEach = Function.prototype.call.bind(Array.prototype.forEach);

forEach(document.querySelectorAll('p'), function (element) { console.log(element); });
</script>
```

# 参考リンク

- [3.2.6. mixin ParentNode - DOM Standard 日本語訳](https://triple-underscore.github.io/DOM4-ja.html#interface-parentnode)
- [22.1.3.10 Array.prototype.forEach - ECMAScript® 2016 Language Specification](http://www.ecma-international.org/ecma-262/7.0/#sec-array.prototype.foreach)
- [19.2.3.3 Function.prototype.call - ECMAScript® 2016 Language Specification](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.call)
- [19.2.3.2Function.prototype.bind - ECMAScript® 2016 Language Specification](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.bind)
C > [続き]define多重定義チェック > defined()が多い場合の対応検討 > 行連結 > #if (defined(DATA_001)+defined(DATA_002) \     +defined(DATA_003)+defined(DATA_004) \     +defined(DATA_005)) != 1 > 読みやすい書き方の別案を教えていただきました

```txt:動作環境
C++ Builder XE4
```

http://qiita.com/7of9/items/8f9fab70fe556b5b6e5c
において @SaitoAtsushi さんに`defined()`を使った多重定義チェック方法を教えていただいた。

その関連コードで#define定義が増えて、現在`defined()`の行は「437桁」の定義になってしまっている。
エディタで「読みにくい」。

ソースコードの可読性の改善方法として行連結を試した。
参考 http://www.tamasoft.co.jp/lc/hlp/F024.html

以下はサンプル
http://ideone.com/HjwzuD

```c
#include <stdio.h>

#define DATA_001 
#define DATA_002
#define DATA_003
#define DATA_004
#define DATA_005

#if (defined(DATA_001)+defined(DATA_002) \
    +defined(DATA_003)+defined(DATA_004) \
    +defined(DATA_005)) != 1
#error "Wrong number of selected cases"
#endif

int main(void) {
	// your code goes here
	return 0;
}
```

適当な項目数で行連結で分けるあたりが手ではありそう。

一方で`#define`で多くのデータセット(現在15データセット)を切り替える、ということ自体が間違いの元かもしれない。

### 教えていただいた事項
(追記 2017/04/28)

@SaitoAtsushi さんの[コメント](http://qiita.com/7of9/items/2bd1ca33ed8ce3dbfb7c/#comment-ba9b6349123eba0f327f)にて読みやすいコードの書き方を教えていただきました。

使いたくなったので、
CSVファイルからJSONファイルを作成するPythonスクリプト

同じ項目でたくさんのデータ作るのに、人手だとスプレッドシート（Excelとか）使ってCSVファイルにするのが楽です。
でも別のツールとかに渡す時、JSONファイルでないとだめ、ってことがあるので、そういう時に使うPythonスクリプトを作りました。
自分は、Pythonのunittestをデータ駆動形で実行させるのに、JSON形式のデータが必要でした。

[Python unittest DDT > Example usage](http://ddt.readthedocs.io/en/latest/example.html)

## 利用の前提
OS : Windows
Python : v3.5.1

## スペック
* 引数に指定したcsvファイルから、JSONファイルを作成し、Pythonスクリプトを実行したディレクトリに保存する
* CSVファイルの行ごとに、カンマ区切りのデータをリストにする
* 作成するJSONファイル名は、[CSVファイル名]_datapool.json
* ファイルのエンコードはCSV、JSONともにShift-JIS(CSVファイルがUTF-8だと動作しない。)
* CSVファイルのデータに日本語が入ってても大丈夫
* CSVファイルの一行目はヘッダ行として、JSONファイルのデータからは除外する（2行目のデータからJSONファイルに書き込まれる）



## ソース
JSONファイルは、人が読みやすいレイアウトになるようインデントかけたりしてます。
日本語のコメント入れると、実行時にjson.dumpsの行でエンコードのエラーが発生したので入れてません。（自己解決できなかったので保留にしてます。LinuxとかMacだと全部UTF-8でエラー出ないのでは、と悶々。）

``` script.py
# -*- coding: utf-8 -*-
import csv
import json
import sys, os, codecs

argvs = sys.argv
for csv_file_path in argvs:
    if csv_file_path == __file__:
        continue
    with codecs.open(csv_file_path, 'r', 'shift_jis') as f:
        json_reader = csv.reader(f)
        name, ext = os.path.splitext(os.path.basename(csv_file_path))
        with codecs.open(name + '_datapool.json', 'w', 'shift_jis') as json_file:
            out = json.dumps([line_json for i, line_json in enumerate(json_reader) if i > 0] ,ensure_ascii=False, indent=4, sort_keys=False, separators=(',', ': '))
            json_file.write(out)
```

## 使い方
上記のスクリプトファイルを、引数にcsvファイルを指定して実行します。(複数指定可)

```
>python script.py csv_file1.csv
```

作られるJSONファイル例は以下。

```csv_file1_datapool.json
[
    [
        "テスト１",
        "テスト２"
    ],
    [
        "てすと１",
        "てすと２"
    ]
]
```
## 参考
* 引数でファイル名取得する
[Python: コマンドライン引数の取得 – sys.argv変数](http://www.yukun.info/blog/2008/07/python-command-line-arguments.html)

* エンコード指定して、ファイルを読み書きする
[Python入門から応用までの学習サイト - ファイル読み書き](http://www.python-izm.com/contents/application/file_rw.shtml)
golang zap v1.0.0 でログの日付をJSTで表示する方法

# 概要

[zap](https://github.com/uber-go/zap)はgolangのloggerライブラリです。
golang標準パッケージのlogでは足りないログレベルや、JSONでの出力などをサポートしているため自分はこのライブラリをloggerとしてよく使っています。
他にもlogrusというライブラリも有名ですが、zapはlogrusに比べて高速に動きます。

# JSTフォーマットでのTIME出力

日本で開発している以上、ログのタイムスタンプも日本時間で表示させたいところです。
zapでは、以下のようにすることでタイムスタンプの形式をJSTフォーマットで表示させることができます。

```go:main.go

package main

import (
    "time"

    "go.uber.org/zap"
    "go.uber.org/zap/zapcore"
)


func main (
    encodeConfig := zap.NewProductionEncoderConfig()
    encodeConfig.EncodeTime = JSTTimeEncoder

    logger := zap.New(
        zapcore.NewCore(zapcore.NewJSONEncoder(encodeConfig))
    )

    logger.Info("This is test.")
)

func JSTTimeEncoder(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
    const layout = "2006-01-02T15:04:05+09:00"
    jst := time.FixedZone("Asia/Tokyo", 9*60*60)
    enc.AppendString(t.In(jst).Format(layout))
}
```

```json:log
{"level":"info","ts":"2016-12-21 12:20:34","msg":"This is test."}
```
地方でLT主体の勉強会を数回やってみた所感と今後の取り組み

#はじめに

* この記事は[IoTLT Advent Calendar 2016](http://qiita.com/advent-calendar/2016/iotlt)の12月21日分です。
* 広島で　IoTLT広島というLT勉強会を開催してみて思ったことをまとめています。
* 12月23日の @wamisnet さんの記事とカブっていたらごめんなさい（汗

#経緯
[IoTLT](https://iotlt.connpass.com/)は東京を中心に本日時点で合計57回のイベントが開催されています。最近の東京開催では、毎回100人を超える参加者で盛り上がっているみたいです。
広島で開催することになったきっかけは、私がたまたま参加した東京開催で @n0bisuke さんから広島もやったらどうっすか？みたいなことを言われて、あ、はいという感じだったと記憶しています。酒が入っていたとはいえ、言ったからにはやるぞ！ということで第0回を経て5月に第1回を開催しました。その後、約2ヶ月に1回ペースで合計4回開催しております。

酒の勢いもありましたが、それよりも大きなポイントは会場の盛り上がり、空気感のようなものでした。東京の会場で肌で感じてみて「これは広島でも是非やるべき！」というなんかよくわからない衝撃が走ったのを覚えています。

#やってみた結果
開催の様子はこんな感じです。
https://togetter.com/li/979643
https://togetter.com/li/1002782
https://togetter.com/li/1047744
https://youtu.be/vAnVC699zho

ざっくりまとめると・・・

* 初回開催はもの珍しさからか、35人の集客（広島としては多い）
* 2回、3回は半分の15人前後
* LT登壇者が固定化傾向にある
* 第4回は他のイベントと共同開催してみた

#仮説として

広島という土地柄なのかはわかりませんが、IT系の勉強会が新しく立ち上がると大体初回は結構な人が集まるような気がしています。まずはどんなものか見に行ってみようという感じでしょうか。しかしながら、2回目以降の開催は初回に比べると集客が非常に大変になってきます。参加者の構成は、2回目以降ほとんどがリピーターです。例えば、IoTLT広島Vol.2では、19人中11名、Vol.3では14人中12名がリピーターです。告知不足というのもありますが、新規参加者は3回目では極端に減っています。

広島で特定の話題に興味ある人の大部分は勉強会の初回開催時に集まり、初回に参加できなかった人も2回目には参加するので、きってしまうのではないかと考えています。つまり、毎回の開催ごとに既存とは異なる層に告知し続けることが新しいメンバーを呼び込むために必要不可欠なのではないかと。そうしないと参加者が固定化する結果となってしまうと感じています。

参加者が固定化するのは悪いことではないのですが、IoTLTのようなものを作ったネタをLTで喋るという形式の勉強会では、少しよろしくありません。「内輪ネタ」感のようなものが出てしまったり、ネタを喋る人も固定化してしまいネタの仕込みが負担となったり、という事になってきます。

上記は傾向としては都会でも同じだと思いますが、広島のような狭い都市圏では早い段階で集客不足という致命的な状況が露呈してしまう結果となります。東京のIoTLTという金看板を単に持ってきただけではダメで、常に新しい層にアプローチしていく事が大切な気がしています。

#施策

東京の事をうらやんでもしょうがないので、どうしていくのが良いかを考えてみます。

####他の勉強会と共同開催
Vol.4では主催者からのお声掛けもあり[PyCon mini Hiroshima 2016](https://pyconjp.connpass.com/event/39164/)の中の1つのセッションとしてIoTLT広島を開催してみました。結果としてこれまでに無い層の人にリーチする事ができ、終了後の懇親会でも新鮮な交流が生まれました。運営方法についてもご意見をいただいたりなどして、非常に収穫がある開催でしたの。広島にある他の勉強会とコラボするというのは、今後も機会をみて実践していこうと思います。

####他会場との同時開催
これは、思いつき段階の案です。登壇者が固定化してくる事の対策として、他地方と同時開催してリモートで接続するのはどうかと考えています。

東京などの面白い人に頼み込んで広島に来ていただくのはすごく良いのですが、移動コストや日程の調整などが大変です。かといって、リモートで登壇していただくだけでは、登壇者の方にメリットがあまり存在しません。そこで、リモートで登壇するけど現地でも盛り上がる形式として、複数会場同時開催を提案します！

方法としては簡単で、複数拠点で同日・同時間帯で開催しお互いにリモートで接続します。その上でLTは両会場に中継する形とします。そうする事で、2拠点であれば2倍、3拠点であれば3倍のLT登壇者を確保する事が可能となります！！
単独でリモート登壇していただく場合のような、懇親会問題も解消するはずです。良さそうじゃないですか？

良さそうだと思った他の地方で主催をされている方がいらっしゃれば @m_ando_japan までお声掛けください！

####面白い事をやり続ける
そして、最後に当たり前の話ですが・・・リピーターの参加者みんなで面白いと感じることをやり続ける事。これは当然やっていく必要があると感じています。IoTっぽい最近の技術で遊ぶ事を純粋に楽しむこと！これを忘れずに継続していきたいと思います。

#まとめ
ということで、つらつらと書いてみました。
技術的な記載が一切無くてすみません。別の機会にQiita本来の趣旨に沿うようなIoTネタはアップしていきます。

IoTというキーワードはもはや地上波のCMでも普通に登場するワードです。エンジニアとして楽しみながら遊ぶ時期から、プロダクトを世に出していく時期にきていると感じます。IoTLTでの話題も徐々にビジネスや高度な技術にシフトしていくかもしれませんが、技術を楽しむという基本スタンスを広島でも布教させていきたいと思います。

さて、明日は @minami1389227 さんです。
仕事中すぐにローカルのメモを書きはじめられるようにしてる話

仕事してるとき、ローカルのテキストファイルへ議事録や作業メモをすぐに書きはじめられるように、[add-note.rb](https://gist.github.com/tily/66b80a5edc807dbaccfce18e04e6ca7a) というスクリプトを書いて使っている。

(Evernote とかでもいい気がするけど、コンプライアンスの観点からアレだし、プライベートのメモと仕事のメモを混ぜたくない。)

`Windows + R` で「ファイル名を指定して実行」を立ち上げ、`add-note.rb` と入力。

![](https://i.gyazo.com/db43cc11e9776ce6ff897f252a890f85.png)

タイトルを聞かれるので適切なものを入力し、Enter を押す。(空でも OK。)

![](https://i.gyazo.com/c9e55442716b2836bfa582a3c418e964.png)

デスクトップに本日日付つきで空のファイルが作成され、

![](https://i.gyazo.com/c972edb7b800b8293823f2345393b0b5.png)

さらにそのファイルを開いた状態でエディタが立ち上がる。

![](https://i.gyazo.com/3e245a94cd9edcc6d975da48ca8cfac0.png)

日付を自動で付与してくれるのと、タイトルが重複した場合に `20161221_メモ-2.txt`, `20161221_メモ-3.txt` ... のように自動で連番を振ってくれるのが工夫したところ。

しばらくデスクトップ上にできたファイルを編集していき、不要になったら `Memo` というフォルダに入れていくようにしている。

非常にローテクなんだけど、割とずっと使い続けているし便利。Ruby をインストールしてなくても使えるように Golang で書き直したいな～。
Docker toolbox on windows マウント：Dockerコンテナの中でホストのフォルダを見たい

# 1. Virtualbox shared folder 設定

以下のように設定。
Folder Nameを覚えておく。

![image](https://qiita-image-store.s3.amazonaws.com/0/99215/4ffa7ce5-7427-01a8-cdf9-e90411e68938.png)


```
docker-machine ssh default 'sudo mkdir -p /e'
docker-machine ssh default 'sudo mount -t vboxsf -o uid=0,gid=0 E_DRIVE /e'

# dockerホストにマウントした共有フォルダをData Volumeとして利用する
docker run -v /e:/e busybox ls -la /e
```

## docker run と exec

```bash:dockerrun.bash
docker run -v /work2:/work2 -it --name work2 hnishi/ubuntu14.04_gromacs-4.6.6:mpi_v1.0_pb07  #/work2を利用できるコンテナを作成
```

一度コンテナを抜けた後にもう一度入りたい↓

```bash:dockerexec.bash
#!/bin/bash -eu
id=`docker ps -ql`  #最後に起動したコンテナ
docker start $id && docker exec -it $id /bin/bash  #終了したコンテナの再起動とbashを実行
```

# 2. Docker machineを起動するたびに自動でマウントする

/mnt/sda1/var/lib/boot2docker/bootlocal.sh にコマンドを書いておくと
Dockerマシンを起動したときに自動でコマンドを実行する。

```
docker-machine ssh default
sudo tee /mnt/sda1/var/lib/boot2docker/bootlocal.sh <<-'EOF'
mkdir -p /e
mount -t vboxsf -o uid=0,gid=0 E_DRIVE /e
EOF
```

# 参考
Dockerにホストのフォルダをマウントしたい！
http://qiita.com/dojineko/items/f623894ef2436bef890e
Docker MachineでDドライブなどUsers以外を自動マウントする
http://qiita.com/Bakudankun/items/d612865440565b10523f
CSSで要素の内側にmarginを作る

## 入れ子要素のmargin/paddingを簡潔に調整したい

CSSでpaddingを付けた親要素の中に子要素を等間隔で並べたい場合、親要素の上下paddingと先頭・末尾の子要素のmarginがダブってしまうため、これまでは以下のような手法を使っていました。

- 子要素のmarginをリセットし、上下間隔は隣接セレクタなどで指定する
- 子要素のmargin分を親要素の上下padding値からあらかじめ引いておく
- 先頭・末尾の子要素を疑似クラスなどで特定し、上下marginを上書きする（サンプル）

```html:example01.html
<blockquote class="example01" cite="http://www.aozora.gr.jp/cards/000148/files/789_14547.html">
  <p>吾輩は猫である。名前はまだ無い。</p>
  <p>どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。～</p>
</blockquote>
```

```css:example01.css
.example01 {
  border: solid 1px #ccc;
  padding: 2em;
  background: #eee;
  color: #333;
}

.example01 > :first-child {
  margin-top: 0;
}

.example01 > :last-child {
  margin-bottom: 0;
}

.example01 p {
  margin: 1em 0;
  padding: .5em;
  border: solid 1px #ccc;
}
```

- [CodePen](http://codepen.io/milkmeta/pen/qqKvaK)

## 疑似要素で作る内側marginの試案

CSSの疑似要素を使うと要素内側の前後に仮想的な要素を配置できるため、親要素の内側上下にmarginを取るパターンを作ってみました。paddingを使った場合とは異なり子要素のmarginと相殺が働くため、先頭・末尾に一定の余白を自然に取ることができます。

（参考: [CSS： marginの正しい理解 \(CSSのmarginが難しい\)｜Web Design KOJIKA17](http://kojika17.com/2012/08/margin-of-css.html)）

```html:example02.html
<blockquote class="example02" cite="http://www.aozora.gr.jp/cards/000148/files/789_14547.html">
  <p>吾輩は猫である。名前はまだ無い。</p>
  <p>どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。～</p>
</blockquote>
```

```css:example02.css
.example02 {
  border: solid 1px #ccc;
  padding: 0 2em;
  background: #eee;
  color: #333;
}

.example02::before,
.example02::after {
  content: "";
  display: block;
  margin-top: 2em;
}

.example02 p {
  margin: 1em 0;
  padding: .5em;
  border: solid 1px #ccc;
}
````

- [CodePen](http://codepen.io/milkmeta/pen/xRzBRW)

## Sassを使ったMixin化

上記のパターンをSass（SCSS）でMixin化した場合のサンプルです。

```html:example03.html
<blockquote class="example03" cite="http://www.aozora.gr.jp/cards/000148/files/789_14547.html">
  <p>吾輩は猫である。名前はまだ無い。</p>
  <p>どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。～</p>
</blockquote>
```

```scss:example03.scss
@mixin margin-inner-top($length: none) {
  &::before {
    @if $length == none {
      display: none;
    } @else {
      content: "";
      display: block;
      margin-top: $length;
    }
  }
}

@mixin margin-inner-bottom($length: none) {
  &::after {
    @if $length == none {
      display: none;
    } @else {
      content: "";
      display: block;
      margin-top: $length;
    }
  }
}

@mixin margin-inner-row($top: none, $bottom: null) {
  @include margin-inner-top($top);
  @include margin-inner-bottom(if($bottom != null, $bottom, $top));
}

.example03 {
  @include margin-inner-row(2em);
  border: solid 1px #ccc;
  padding: 0 2em;
  background: #eee;
  color: #333;

  p {
    margin: 1em 0;
    padding: .5em;
    border: solid 1px #ccc;
  }
}
````

- [CodePen](http://codepen.io/milkmeta/pen/oYyVYP)
【ＶＢＡ】Collectionオブジェクトの使い方

#概要
- 普通の変数(Int, Stringなど)やオブジェクト変数を要素とする独自のオブジェクトを作成できる。
- 連想配列として使える。(配列の方が速い)

#使い方
##宣言

```vbnet
Dim colTest As Collection
Set colTest = New Collection
```

または、

```vbnet
'非推奨
Dim colTest As New Collection
```

##代入
Keyは重複不可であることに注意。

```vbnet
Dim number as Long
Dim arr(3) As String
dim hogeSheet as WorkSheet
number = 1
arr(2) = "2番目"

With colTest
        .Add Item:="アイテム1", Key:="i1"
        .Add Item:=number, Key:="数字" '数値でも
        .Add Item:=arr(), Key:="配列" '配列でも
        .Add Item:=hogeSheet, Key:="ワークシート" 'オブジェクトでも
End With
```


##参照

```vbnet
num = colTest("数字") 'num = 1
str = colTest("配列")(2) 'str = "2番目"
```

#参考
- [コレクションの作成 （Collectionオブジェクト）](https://www.moug.net/tech/exvba/0150076.html)
UI/UX変更の際に、サービス、ユーザ、実装者という3つの観点で気をつけていること

#<i class="fa fa-cubes" style="font-size:1em;"></i> はじめに

本記事は[Salesforce App Cloud Advent Calendar 2016](http://qiita.com/advent-calendar/2016/salesforce-app-cloud)の21日目の記事となっています。

現在社内で進めているプロダクトのカレンダーアプリ[Cu-hacker for Salesforce](https://www.co-meeting.co.jp/products/cu-hacker-for-salesforce/)のUI/UX改善を例に、サービス、ユーザ、実装者という観点で気をつけていることを紹介したいと思います。

※ この記事はCu-hacker for SalesforceのUIの記事であり、[Cu-hacker](https://cu-hacker.com/)とは違ったものです。
Cu-hacker for Salesforceは、Cu-hackerを開発した株式会社ジェネストリームさんとの共同開発のSalesforceユーザ向けに特化したCu-hackerのことです。

#気をつけてること

##<i class="fa fa-cube" style="font-size:1em;"></i> サービスという観点

 - 対象のサービスはカレンダーと言う日常的に使うであろうビジネスツールであることを認識する
  - 色はPOPすぎない、使いすぎないように
  - 過度なアニメーションは避ける
 

 - プラットフォーム(今回の場合Salesforce)に合わせる
  - [Salesforceのガイドライン](https://partners.salesforce.com/s/education/general/Lightning_Experience)に従う(iOSならば[iOS Human Interface Guidelines](https://developer.apple.com/ios/human-interface-guidelines/overview/design-principles/)など)
  - ガイドラインで言及されていない部分も、LEXやSLDSの雰囲気からあまり逸脱しない

##<i class="fa fa-desktop" style="font-size:1em;"></i> 実装者という観点

 - (問題がある部分を除いて)SQLやJSを極力変えない
 - 見た目(html、CSS、アイコン)だけでの変更を心がける
 - 不要な画面、機能はなくす(余分なメンテナンス、コードを減らす)
 - めんどくさい手作業はビルドツールに組み込む
 - 毎週ミーティングを行ってカンプを見せる。ミーティングは確認ではなく候補案から絞ることに注力する
 - 実装しやすいものと、少し手が込んでいるものと複数案を出す
 - プロトタイプを作る。モバイルは実機で動かしてもらう(現在はXdを使用しているが、今後はInVision、Prottも試す予定)


##<i class="fa fa-users" style="font-size:1em;"></i> ユーザという観点

 - UI/UX変更に伴う負荷軽減を意識する
  - ボタンやフォームを配置を既存から極力変えない。混乱させない
  - このサービスの対象ユーザはSalesforceユーザなので違和感を減らすため、操作やアイコンを全体的にSalesforceに合わせる
  - サイトが重くならないようにする
     - アイコンはSVGかWebフォントで表示
 - テキストでの注意書きは極力やめる。できるだけ直感的に
 - アイコンで感覚的に、親しみやすく
 - かといってアイコンの多用はわかりにくいので注意

###<i class="fa fa-eye style="font-size:1em;"></i> <i class="fa fa-eye style="font-size:1em;"></i> ユーザになったつもりで見てみる

今回はリリース間近の青枠に部分に絞って書きます。
現在の画面はこんな感じです。

<img width="900" alt="スクリーンショット 2016-12-20 16.14.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/57210/5c5e1efc-4d4e-d0bb-16db-cd601afd6ce3.png">


ユーザになったつもりでよく見ると問題点がいくつかあります <i class="fa fa-frown-o" style="font-size:1em;"></i>

<img width="862" alt="スクリーンショット 2016-12-20 16.40.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/57210/091dbc4b-04bd-c28a-4439-215e5c95d51d.png">


これらの問題点をこう改善してみました <i class="fa fa-arrow-down"></i><i class="fa fa-arrow-down"></i>

<img width="842" alt="スクリーンショット 2016-12-21 12.21.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/57210/0e825344-b91b-4cc0-6a93-43d507fa6939.png">

リリースまでにはもう少し改善する予定です。自分でも出来上がりが楽しみ。


#終わりに

今後も改善を続けていく中で、気をつけることは変わっていくかもしれませんが、現在はこんな感じです。
アプリデザインの知見は少ないので、他社サービスやデザイナさんの考えも聞いてみたくて、書いてみました。

Cu-hacker for Salesforceはこれから少しずつUX/IU改善を行っていきます！


--
@tbpgrさんの[Qiita の記事の見出しに Font-Awesome を利用して見栄えを良くする #qiita](http://qiita.com/tbpgr/items/361d8aaa38fb57d75216)の記事が大好きなので、絵文字でなく、Font-Awesome使ってみました！カワイイ！！
cocos2d-x TMXTiledMap タイルマップを表示させたら縦に黒いラインが入る (ちらつく)

#cocos2d-x TMXTiledMapでタイルマップを表示させると縦に黒いラインが入る問題を解決させる。

2Dゲームでは当たり前のタイルマップ
何もしないで普通に使用するとマップがスクロールした時に縦に黒いラインが入る。
<img width="414" alt="IMG_3508.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/142882/aa165303-063d-89ed-9de6-2a38febcbca5.png">

これを修正するために
cocos2d/cocos/base/ccConfig.hを修正します
![スクリーンショット 2016-12-21 12.20.05.png](https://qiita-image-store.s3.amazonaws.com/0/142882/38282fde-a373-e50d-ae6b-b31f9937efa4.png)

90行目付近にある
`#define CC_FIX_ARTIFACTS_BY_STRECHING_TEXEL 0`
を
`#define CC_FIX_ARTIFACTS_BY_STRECHING_TEXEL 1`
に修正すると治る

<img width="414" alt="IMG_3510.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/142882/5e34e331-ef1a-510b-b052-f2a725d2a433.png">


この情報は、海外サイトからで日本人の情報が少ないので情報拡散宜しくお願いします。
オープンソースERP Odoo を CentOS にインストールする

## Odoo (旧OpenERP)
ベルギーの OpenERP S.A. 社により開発されているオープンソース業務アプリケーション。従来のERPパッケージ守備範囲以外に、CMS、Eコマース、イベント管理等、多岐にわたる。

## 構成例
* CentOS 7.3.1611
* PostgreSQL 9.2.18
* Odoo 10.0_20161221
* wkhtmltopdf 0.12.1

## インストール
```bash
yum -y install epel-release yum-utils postgresql-server && yum -y update
postgresql-setup initdb
systemctl start postgresql && systemctl enable postgresql
yum-config-manager --add-repo=https://nightly.odoo.com/10.0/nightly/rpm/odoo.repo
yum -y install odoo wkhtmltopdf
systemctl start odoo && systemctl enable odoo
```

## アクセス
8069 ポートにアクセスする。

## セットアップ
![Odoo.png](https://qiita-image-store.s3.amazonaws.com/0/15175/30355c3f-0091-5a02-e1fa-dc50308a3b1e.png)
![アプリ   Odoo.png](https://qiita-image-store.s3.amazonaws.com/0/15175/8d335046-8b69-0954-5b5b-505e987e65d2.png)
Swift3にて、Google Place APIを使って、オートコンプリートを実装してみた。


## はじめに
### やりたいこと
iPhoneアプリで、建物のお店などを検索して取得したい。

### やり方
Google Place APIを使って、名前検索してお店を特定。特定したお店の情報を取得。
Guidesの"Add a full-screen control"をやってみました。
ほぼ、デモの通りでした。

Google Place API
https://developers.google.com/places/ios-api/

参考
http://baroqueworksdevjp.blogspot.jp/2016/03/swiftiosgoogle-places-api-for-ios.html

## バージョン
Swift 3.02
Xcode 8.2

## CocoaPodにて、SDKを取得
```Podfile
pod 'GooglePlaces'
```

```sh
pod install
```

GooglePlaceのバーションは2.1.1

```Podfile.lock
 GooglePlaces (2.1.1):
   GoogleMaps/Base (= 2.1.1)
```

## APIのキーを取得
Google API Consoleに行って、プロジェクトを作成して、
APIキーを取得。

https://console.developers.google.com/flows/enableapi?apiid=placesios&reusekey=true

bundle identifierによる制限をかけれるが、とりあえずスキップ。

```APIキー例
AIzaSyBdVl-cTICSwYKrZ95SuvNw7dbMuDt1KG0
```

## APIキーをAppDelegate.swiftに追記

まず上部でSDKをimport。

```AppDelegate.swift
import GooglePlaces
```

## UIViewController等で、コードを記載
UITextのクリックで、オートコンプリート用のViewが表示され、場所を選択して、選択したものがUITextに表示される。

```InputPlaceViewController.swift
// SDKのインポート
import GooglePlaces

class InputPlaceViewController: UIViewController{
	// UITextのoutlet。
	@IBOutlet weak var name: UITextField!
	
	override func viewDidLoad() {
		super.viewDidLoad()
	}
	
	// StoryBoardと接続。UITextに入力しようとした時のアクション。
	@IBAction func nameInput(_ sender: UITextField) {
        let autocompleteController = GMSAutocompleteViewController()
        autocompleteController.delegate = self
        
        // オートコンプリート用のViewの表示
        present(acController, animated: true, completion: nil)
    }
}

// InputPlaceViewControllerを拡張
extension InputPlaceViewController: GMSAutocompleteViewControllerDelegate {
    
    // オートコンプリートで場所が選択した時に呼ばれる関数
    func viewController(_ viewController: GMSAutocompleteViewController, didAutocompleteWith place: GMSPlace) {
    	 // 名前をoutletに設定
        name.text = place.name
        print(place)
        print("Place name: \(place.name)")
        print("Place address: \(place.formattedAddress)")
        print("Place attributions: \(place.attributions)")
        dismiss(animated: true, completion: nil)
    }
    
    func viewController(_ viewController: GMSAutocompleteViewController, didFailAutocompleteWithError error: Error) {
        // TODO: handle the error.
        print("Error: \(error)")
        dismiss(animated: true, completion: nil)
    }
    
    // User cancelled the operation.
    func wasCancelled(_ viewController: GMSAutocompleteViewController) {
        print("Autocomplete was cancelled.")
        dismiss(animated: true, completion: nil)
    }
}


```
脆弱性診断で重要なクロールとは何なのか

[VAddyは誰でも手軽に使えて、継続的なWeb脆弱性診断ができるクラウド型ツールです](https://vaddy.net/ja/)。

[VAddy Adventカレンダー](http://qiita.com/advent-calendar/2016/vaddy)も残り少なくなってきました。

## クロールとは
クロールは、検査対象のURLとPOST、GETなどのパラメータを登録します。
正しい画面遷移やフォームの入力項目のデータを登録し、その情報を使って脆弱性検査を行います。
開発者の方にはあまり馴染みがないのですが、VAddy以外の検査ツールもクロール機能があり、一般的な機能です。

クロールデータは、検査対象のWebアプリケーションの正常動作を記録したものです。
VAddyを含めた多くのツールでは、ブラウザのプロキシ設定を変更し、プロキシサーバを経由して自分が開発しているWebアプリケーションにアクセスします。
そして、リンクをクリックしたり、フォームを投稿したり、Ajaxのように裏で通信する画面にアクセスするなど、HTTP通信が発生するものをプロキシサーバ側に記録します。これがクロールデータです。

<img width="775" alt="スクリーンショット 2016-12-21 11.17.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/61278/e7748e20-0f4d-d036-ccb4-5a34e5ab35b1.png">


ですので、検査したいWebアプリケーションやAPIサーバのURLやパラメータが含まれるようにクロールデータを作る必要があります。

VAddyではクロールデータごとに名前をつけて、検査の際にクロールデータの指定ができるため、クロールデータごとにシナリオとして扱えます。例えば、ログインしてユーザ情報を変更するシナリオ、のように。


## 検査で使うクロールデータ

VAddyの検査ではクロールデータをどのように扱うか説明したいと思います。
クロールデータにはHTTPリクエストとレスポンスデータが入っています。
検査では、クロールデータの中のHTTPリクエストを使って送信します。その際に、GETやPOSTのパラメータの値を検査データに差し替えます。
シンプルな例でいくと、GETパラメータが
`/index.php?foo=bar`
だった場合はシングルクォートを入れて
`/index.php?foo=bar'`
というような形です。

検査データに差し替えて送信した時のHTTPレスポンスデータを解析して、クロール時に受け取ったレスポンスデータと大きく異なる場合は、さらに詳しい検査を実行していき、脆弱性の有無を判断します。



## 検査データ以外に書き換えるもの

クロールデータのHTTPリクエストは基本的にはパラメータの値を検査データに変えるのみです。
ですので検査で送るHTTPリクエストは、クロール時に記録したユーザエージェント情報のまま送信します。ユーザエージェントで画面が切り替わる場合はPC、モバイルそれぞれクロールを作成すれば検査できます。

ログイン画面があるアプリケーションやCSRFトークンがあるフォーム画面の場合は、セッションやトークンを検査時に取得し直さないと正しい検査ができません。
VAddyでは、クロールデータを解析して、ログイン画面やセッション、CSRFトークンを自動認識します。
そして、検査の途中でセッションが切れた場合はログイン画面からセッションを再度作ります。CSRFトークンも同じです。

## 検査で一番大事なこと
検査で一番有用な点は、検査対象のアプリケーションの動きを正しく把握して動きを再現することです。
そうしなければ、例えばずっとログアウトした状態で検査し続けることになります。これでは検査の意味がありませんよね。
VAddyでは、クロールデータから全て機械が判断していきますので、ユーザがログイン画面やCSRFトークンの設定を事前にする必要はなく、正しい検査ができるようにしています。

ユーザフレンドリー（誰でも使えるぐらい簡単な設定操作）と検査の自動化の両立は大きなチャレンジです。
VAddyでは、これを実現するために独自の検査エンジンを開発して運用しています。


## クロールの手間と精度

正しいクロールデータさえできれば、脆弱性検査の精度は大きくあがります。VAddyでは、クロールの作成をユーザ自身で行うように設計しています。

一番アプリケーションを理解している人（開発者、発注者、ディレクターなど）がクロールデータを作るのが一番良いですし、我々がヒアリングする必要もないためVAddyの料金も低価格を維持できます。
少し手間がかかりますが、メリットはかなり大きいのです。

一方で、いくつかの検査ツールには自動クロール（スパイダー）機能も存在します。
自動クロールはTOPページのURLを与えればあとは自動でサイトを探索してクロールデータを作成します。

これは非常に手軽ですが、時間がかかりますし、クロールデータの精度は落ちます（つまり検査の精度も落ちます）。
例えば、公開前のリンクをつなげていない画面は検査できませんし、フォームの入力項目でラジオボタンを選択すると一部のフォームの内容が変わるなど、仕様を理解していないと辿れない箇所は検査できません。

## さいごに

誰がクロールデータを作るのか、どのように作るのか、それぞれメリットとデメリットがあります。
VAddyではそれを踏まえて、検査対象アプリの仕様を一番把握しているユーザ自身にクロールデータを作成してもらって検査の精度を上げつつ、低価格で提供する道を選びました。

VAddyでは、SeleniumのようなE2Eテストツールを使ったクロールデータの作成もできるように設計しています。この話は今度書きたいと思います。
react.js リロード(更新) や URL直叩き 時に NOT FOUND を回避する方法

## 課題
react-routerのbrowserHistoryを使っていて、
http://xxxxxx/text/1
みたいなURLを直叩きや、リロードするとNOT FOUND 404エラーになってしまう。


## 回避策
nginxに、index.htmlにリダイレクトさせる設定を追加すればOK

```nginx
        location / {
            root /var/webapps/sample/build/;
            index index.html;
            # ↓リダイレクトする設定
            try_files $uri $uri/ /index.html;
        }
```
mysql_tzinfo_to_sql をxampp(windows)で！

#MySQLの日本語対応特にtimezone
MySQL(mariaDB)は最初から日本語設定が入ってないので追加させる必要があります。日本対応なら必ず実行しておかないとって項目です。

##Linux編
Linuxだと簡単です。
MySQLのコマンドで以下を使います。
```
mysql_tzinfo_to_sql
```
以下の通りmysqlコマンドで実行すればOK！
```
mysql -u (ユーザ名) -p mysql
```
(パスワードを聞かれるのでパスワードを入力)
mysqlというデータベース（スキーマ）を選択した状態でmysqlを起動しました。
それで以下のコマンドでいけます。


```mysql:command
 mysql_tzinfo_to_sql /usr/share/zoneinfo/
```


と、ここで終わってはもったいないので解説。
**「/usr/share/zoneinfo/」**
これは、glibcという標準Cライブラリ。まあlinuxのベースになっているとも言えるライブラリです。基本的にはLinuxには標準的に入っていますが、もしソースコードからglibcをインストールしてあると/usr/local/share/zoneinfo/になります。
※これもインストールのデフォルトが/usr/localなのであってインストール時に指定すればもちろん変わります。

##Windows編(xammp)
あと、Windowsが曲者です。glibcが入ってないので独自にtimezoneのファイルを持ってくる必要があります。

[http://dev.mysql.com/downloads/timezones.html](http://dev.mysql.com/downloads/timezones.html)
ここからダウンロードします。


ダウンロードするファイルは、posixと書いてあるsqlファイルです。
名前はアップデートされるのでそんな名前を探してみてください。

中身はSQLファイルなのでそれを実行すればOKです。
phpMyAdminからでもいけます。
phpMyAdminからは、インポートですね。
mysqlというデータベースを選択してダウンロードしたファイルを選択して実行すればOKです。
Heroku Enterprise で SSO を設定した後に heroku CLI でログインする方法

# 結論

下記コマンドでログインします。

```
heroku login --sso
```

組織名を入力したあとに、Webブラウザが実行され、アクセストークンが表示されるので、これを CLI に入力します。

# この状況になるには

- Heroku Enterprise を利用すると、SAMLによる Single Sign-on が出来るようになります。
- 当方では、G Suite (Google Apps for Business) を使っており、G SuiteをIdPとして利用しております。
- これまで個人アカウントでHerokuを利用していたときには、普通にパスワード入力などで CLI でのログインができていたのですが、SAMLでのSSOに切替えた後には、Herokuがパスワードを保存することもできなくなったせいか、ログインできずに困っていました。
- ネタを探していたところ [Authenticating to the Heroku CLI under SSO](https://devcenter.heroku.com/articles/using-single-sign-on-sso-services-with-heroku-for-end-users#authenticating-to-the-heroku-cli-under-sso) という記事を発見。よって解決しました。
VraySun and VraySky Use Background

VraySunとVraySkyを使ったときに、mentalrayのPhysicalSunandSkyのUse Backgroundにチェックをいれたときのような結果が欲しくて、方法を探しました。

これで何がしたかったかというと、レンダリングはVraySunとVraySkyを使う。
でも、背景は自分の好きなものに差し替えたいと思ったとき、白フリンジがでてしまう問題がでました。

結論から言ってしまうと、RenderSettingのOverridesタブ内、EnvironmentのBackground textureにアサインされているものをbreak connectionしてあげるとできました。

<img src="https://qiita-image-store.s3.amazonaws.com/0/148607/366c1409-bc0e-01d4-4e2e-598b00e073df.jpeg" width="200">

結果は下画像。

<img src="https://qiita-image-store.s3.amazonaws.com/0/148607/d59c104f-a214-5987-d214-53e8634e45c7.jpeg" width="400">

画像左側がBackgroundTextureデフォルト（あり）の状態でレンダリングして背景にグレー平面をひいたもの。右側がBackgroundTextureをBreakConnectionした状態でレンダリングしてコンポしたものです。

左側は白フリンジが発生してて、右側は発生していないのがわかると思います。
調べるにあたり下記のサイトが参考になりました。

・コンポジターに必要なアルファチャンネルの知識（後編）
http://compojigoku.blog.fc2.com/blog-entry-5.html
・[3ds max] V-Rayで生じたフリンジについて調べてみました
http://mj31000.blog13.fc2.com/blog-entry-76.html
・VraySkyBackground
http://forums.cgarchitect.com/20545-vray-sky-background.html
New Relicのアプリケーション監視を深く味見できるテストアプリ（New Relic Ruby Kata）

# はじめに
今回ご紹介するのは[New Relic Ruby Kata](https://github.com/jarrighi/newrelic-support-training-apps)です。これはNew Relicをアプリケーション監視サービスを手軽に試せるテストアプリです。

ところで何か新しいサービスを試してみたいとき丁度いいテストドライバがないという経験はないでしょうか？検証環境のリソースも限られていますし、気づいたらサービスを試すためのテストドライバづくりに工数がかかるという本末転倒な事態に陥りかねません。かといって事前検証をそこそこにして見切り発車をすると後から思っていたのと違ったということもあります。ジレンマです。なので[New Relic Ruby Kata](https://github.com/jarrighi/newrelic-support-training-apps)の情報がNew Relicのサービス導入前の事前検証に役立てれば幸いです。

# New Relic Ruby Kataとは？
## 概要
[New Relic Ruby Kata](https://github.com/jarrighi/newrelic-support-training-apps)はRubyで作られたアプリです。New Relicのアプリケーションパフォーマンス監視サービスを実際の利用に近いイメージで試すことができます。GitHubで公開されており、誰でも使うことができます（インストール方法は後述）。New Relicに対して様々な負荷やエラーを与えて、画面をモニターすることができます。

![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/150932/12876e9d-63ea-1212-d462-57952754c456.jpeg)

## 機能
具体的にはループの発生や、大量の画像を読み込みなど様々あります。
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/150932/99f17e5c-49d8-54b4-e24d-2c9bd738f8e6.jpeg)

## The Errorを試す
例としてThe Errorを試してみます。これはゼロ除算をランダムに引き起こす機能です。もともとNew RelicのErrorsは高スループットなWebアプリにおいて、エラーがどの程度パフォーマンス低下に影響するかモニタする機能です。The Errorで意図的にエラーを起こすことができます。

適当にボタン（Left or Middle or Right）を連打します。
![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/150932/13d6d160-d7ee-20b1-1b3e-435fdb46a461.jpeg)

New Relicの画面（APM⇒New Relic Ruby Kata⇒Erros）にエラーが表示されました。25回ゼロ除算が実行されたことがわかります。
![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/150932/3b15e256-4795-9351-a60e-d126b2b7ef0b.jpeg)

さらにdivided by 0をクリックするとその中身が見えます。
![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/150932/c8d1725f-8faf-502a-2236-4c01affe9c3f.jpeg)

こんな感じで使います。

# インストール方法
## 前提 1
あらかじめNew Relicのアカウントを取得しておきます。License Keyが必要になります。無料枠でも大丈夫です。

## 前提 2
Macなら普通にターミナルから手順を実行すればうまくいきます。Windowsの場合はNestedの関係もありやや複雑です。結論からいうとUbuntu on VMware Playerでうまく動作しました。Ubuntu on Virtual Box(Windows)上にVagrant & Virtua Boxを入れると動きませんでした。未サポートかと思います。ちなみにUbuntu on EC2もNGでした。Ubuntu on ESXiもNG（Nestedを有効化しているはずだが…）。とりあえず調査が目的ではないのでこの辺にしておきます。

## 手順
[GitHub](https://github.com/jarrighi/newrelic-support-training-apps
)のの手順にしたがって環境を作ります。基本的にはgit cloneしたものをVagrant上で立ち上げるだけなのでそれほど手間はかかりません。専用のサーバ環境を立てなくてもラップトップPCから実行できます。

## 参考
手順にはないやり方でEC2での起動に成功しています。Vagrantoを使わず、rubyプログラムのみを実行することができました。ラップトップ環境で検証することが難しい場合はEC2という手もあります。

以上
git subtree で最初に add エラーが発生する対応

Stylez Advent Calendar 2016 - Qiita
http://qiita.com/advent-calendar/2016/stylez

株式会社スタイルズの Adventカレンダー 21日目です。

git subtree addでハマったメモ - Qiita
http://qiita.com/tutui/items/7f39b32a93df5c82fdc3

と同じですが。。

subtreeを使っていていつもやってしまうので、メモです。

# 1. Gitlab でレポジトリを作成します。
（割愛）

# 2. Gitlabからクローンします。

```lang:bash
$ git clone git@XXXXXXX:project-XXXXX/XXXXXXX.git
Cloning into 'XXXXXXX'...
  rning: You appear to have cloned an empty repository.
Checking connectivity... done.
```

何の問題もなく終わる。

# 3. Subtree側のGitレポジトリを追加します。

```lang:bash
$ git remote add -f XXXXXXX-base git@XXXXXXX:base-XXXXX/base-ansible.git
Updating XXXXXXX-base
remote: Counting objects: 1735, done.
remote: Compressing objects: 100% (1292/1292), done.
remote: Total 1735 (delta 707), reused 585 (delta 188)
Receiving objects: 100% (1735/1735), 9.61 MiB | 10.36 MiB/s, done.
Resolving deltas: 100% (707/707), done.
From XXXXXXX:base-XXXXX/base-ansible
 * [new branch]      master     -> XXXXXX-base/master
```

これも問題ない。

# 4. subtreeのGitレポジトリをroleディレクトリに出力

```lang:bash
$ git subtree add --prefix=roles --squash XXXXXX-base master
fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
Working tree has modifications.  Cannot add.
```

こんなエラーが出ます。
理由は、まだローカルのレポジトリに何もないので、addする先(ブランチ)がない。
＃のだと思う。

# 5. 対処法

何でも良いので、1つコミットします。

```lang:bash
$ echo '*.swp' >> .gitignore
$ git config --global user.email "you@example.com"
$ git config --global user.name "Your Name"
$ git commit -m 'add initial .gitignore'
$ git push
```

どうせ必要になる、.gitignoreを追加しました。

# 6. 再度addします。

```lang:bash
$ git subtree add --prefix=roles --squash XXXXXX-base master
git fetch owncloud-base master
From XXXXXXX:base-XXXXX/base-ansible
 * branch            master     -> FETCH_HEAD
Added dir 'roles'
```

問題なく完了します。

# 7. ひとまずPushしておきましょう。

```lang:bash
$ git push
Counting objects: 463, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (310/310), done.
Writing objects: 100% (463/463), 9.49 MiB | 0 bytes/s, done.
Total 463 (delta 44), reused 420 (delta 34)
To git@XXXXXXX:project-XXXXX/XXXXXXX.git
   abadefb..f2a0b9f  master -> master
```

良い感じです。
Firefoxだけborder-radiusがなぜか効かないcssコード

# border-radiusとは
block要素の角を丸くするcssです。
指定した長さを半径として、ブロックの四隅が丸くなります。

また、十分大きな長さを指定すると、block要素を円形に切り取ることができます。

参考：https://developer.mozilla.org/ja/docs/Web/CSS/border-radius

# 発生した現象
以下のコードで、div要素を丸く切り取って表示しようとしました。

```html
<style type="text/css">
div {
  width: 100px;
  height: 100px;
  background-color: red;
  border-radius: 1000000000px;
}
</style>
<div/>
```
https://jsfiddle.net/v3mpq4vw/

このコードはMac Chrome, Mac Safari,iOS Safari, iOS Chrome, Android Chrome等では正常に動きましたが、
なぜかFirefoxでは円形に切り取られませんでした。

Mac Chrome
![2eb4744d-9c10-208e-634f-685fb768d16e.png](https://qiita-image-store.s3.amazonaws.com/0/54305/4f085614-89c8-7d21-8f63-d02e79a7937b.png)


Mac Safari
![スクリーンショット 2016-12-20 14.36.40.png](https://qiita-image-store.s3.amazonaws.com/0/54305/94ac720f-14b6-08bd-8bbe-694a3f4c973d.png)

Mac Firefox
![スクリーンショット 2016-12-20 14.36.41.png](https://qiita-image-store.s3.amazonaws.com/0/54305/dd52ef89-b546-4718-4bbc-27ed767c95a8.png)


# 原因
どうやら、Firefoxでは、border-radiusがある一定の値を超えると、エラーを吐かずにcssが無視されてしまうようです。
その「一定の値」がいくつなのか探ってみたところ、**17895697px**という値が境界になっているようです。(当方調べ)

https://jsfiddle.net/v3mpq4vw/2/ ← 17895697px
https://jsfiddle.net/v3mpq4vw/3/ ← 17895698px

この値は32bit integerの0.8%くらいの値だし、一体どうしてここに境界値があるのか本当に謎です。


#まとめ
Firefox対応のwebページを作成する場合は、border-radiusを極端に大きな値にしないようにしましょう。
また、たまには暇を見つけて他のブラウザでちゃんと表示できているか確認しましょう。

**17895697**という数字がなんなのか、だれかご存じないでしょうか。
AWS EC2にphpMyAdminをインストールしてRDSのMySQLに接続するメモ

EC2にphpMyAdminをインストールするのに手こずってしまったのでメモ
##PHP環境構築
[こちら](http://qiita.com/nakau1/items/a24571b374ad266c3f5e)を参考にPHPまでをインストール

##phpMyAdminをインストール
SSHでEC2にアクセス


rootユーザーになる

```
$ sudo -i
```

ディレクトリを作成→移動

```
# mkdir -p /var/www/html/tools
# cd /var/www/html/tools
```

phpMyAdminのパッケージをダウンロード

```
# wget https://files.phpmyadmin.net/phpMyAdmin/4.6.5.2/phpMyAdmin-4.6.5.2-all-languages.tar.gz
```

自分の環境の場合https経由でダウンロードができなかったので手近なサーバーに上げ直してダウンロードしました。

解凍してリネーム

```
# tar xvzf phpMyAdmin-4.6.5.2-all-languages.tar.gz
# mv phpMyAdmin-4.6.5.2-all-languages phpMyAdmin
```

設定

```
# cd phpMyAdmin
# cp config.sample.inc.php config.inc.php
# vi config.inc.php
```

ホストを指定

```
$cfg['Servers'][$i]['host'] = 'localhost';
```

を

```
$cfg['Servers'][$i]['host'] = 'エンドポイント';
```

に変更…。
これで`http://{パブリックIP}/tools/phpMyAdmin/`にアクセスで行けるハズ………がいけません。
mbstringがないというエラーが出てログイン画面がでません。

php-mbstringのインストール

```
# yum install -y php55-mbstring
```
まだダメ…

[こちら](http://yutaihara.com/archives/240)の記事でPDOとpdo_mysqlモジュールが入ってないと動かないとのことでインストール

```
# yum install -y php55-pdo
# yum install -y php-mysqli
```

php.iniのファイルに2行を追記します

```
# vim /etc/php.ini
```

```
extension=mysqli.so
extension=mbstring.so
```

最後に再起動

```
# service httpd restart
```

これで無事アクセスできました。
![phpMyAdmin.png](https://qiita-image-store.s3.amazonaws.com/0/138592/40e63bc7-e077-d3a7-9d8b-b87646efdf38.png)
ASPIREセルフポータルのセキュリティ対策～多要素認証を採用～

ソフトバンクのホワイトクラウドASPIRE(以下ASPIRE)上では、仮想マシンを管理するセルフポータルサイトに、
Webブラウザ上で表示される乱数表を利用した２段階認証を採用しています。


|ログイン画面|続いて２段階認証画面へ|
|---|---|
|![SnapCrab_NoName_2016-12-19_10-21-44_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/143230/4a160d42-f48b-b22d-9ca0-d64c2a94ed16.png)|![SnapCrab_NoName_2016-12-19_10-22-1_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/143230/91252680-f8e2-e00b-578f-30e66fa1939b.png)


２段階認証のステップ
（１）　ユーザ名/パスワードによる認証
（２）　乱数表の位置と順番に基づく、シークレットパターンでの認証
という２ステップでの認証となります。

（２）については、自分自身で予め設定しておいた入力パターンを、ブラウザ上で表示される乱数表を
基に入力します。ハードウェアトークンや、ワンタイムパスワード生成用のデバイスは必要ありません。
ログインの度に乱数表の数字は刷新され、新しいものに変わる仕組みです。利用者は、マス目の位置を
覚えておけばよいので、簡単に利用可能です。

ASPIREの２段階認証では６桁以上の数値を設定することが必須となっています。
認証パターンの「位置」「順番」の変更をしたい場合は、環境設定画面から以下の
「パターンを変更する」ボタンをクリックすることで可能です。


|２段階認証のパターン変更|
|---|
|![SnapCrab_NoName_2017-1-12_15-50-19_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/143230/90658ace-1670-f37d-58c3-8a00aec864c5.png)


● まとめ
・「ユーザID」「パスワード」のみの認証方式にくらべ、ログインに必要な情報が増えるため、
　アカウントを不正に利用されるリスクを低減させることができます。
・乱数表はログインの度に数字が変わるため、ログインの度に別のコードが必要になるため、
　簡単に類推されません。
・ソフトバンクのASPIREでは「ユーザー ID」と「パスワード」を使う認証方法に加え、
　二段階認証を採用することで、セキュリティ意識の高いユーザニーズに対応することが
　可能となっています。
環境変数周りのあれこれ

##環境変数について調べてみた
最近業務でdocker使ってる時に、「あれ、、、AWS credentialがないって言われてる」となり、
.zsh_localには書いてるしなんでや、、となっていた時のあれこれ

##結論
上記の質問については
`.zsh_local`はdockerは読みに行けないから、`.env`に書かなくちゃダメ。
ということらしい。

##よくわからなかったので調べてみた
環境変数っていっぱいありますね。
僕はこういうのが一番嫌いです。環境構築とかとともに。


##環境変数
環境変数とは・・・システムが必要とするさまざまな情報を保管している特別な変数。よくあるやつで、OSは何？、今のユーザ名は何？、カレントディレクトリは何？、Windowsはどこにインストールされているの？っていうやつ。PATHも環境変数のひとつ。

PATHとは・・・コマンドを実行するプログラムのある場所。コンピュータの中のすべてを探すのは、無理(可能だけれど重すぎる)ので、「探し物をするなら、ここを、この順番で」ということをメモ書きしたようなもの
http://pocketstudio.jp/linux/?%A5%D1%A5%B9(PATH)%A4%CE%B3%CE%C7%A7%A4%C8%C0%DF%C4%EA%CA%FD%CB%A1%A4%CF%A1%A9



##.bash_profile, .zsh_local, .zshrc, .env etc...
僕にはまず最初の２つのちがいがわからなかったw
この違いについて先に触れると、bash用の設定ファイルとzsh用の設定ファイルということ。
なので全く別物です。

そしてこれの話をするにはbashとzshの違いが必要になる。
zshは高機能bashなので、Macユーザーはzshを使いましょう、でおわる。
でもそもそもbashって何やねんと言う話になる。その前に

シェルとは・・・ユーザーの入力をカーネルに伝えまたその逆を行う、いわば両者の橋渡しを行うプログラム
bashとは・・・シェルの一つ。UNIX系で多く使われるコマンド
カーネルとは・・・Linuxの核となるもの。アプリケーションとはハードウェアの橋渡しをする役割

参考
http://d.hatena.ne.jp/ryamada/20150722/1437546385
http://blog.tokoyax.com/entry/zsh/bash-to-zsh
http://www.linuxacademy.ne.jp/lablog/infrastructure/203/
http://news.mynavi.jp/column/zsh/001/



なんか調べながら書いてたら深みにはまっていく気しかしない、、、とりあえずこれくらいにしておいて。

上記のように、bash_profileとzsh_localの違いはわかりましたと。（ものがちがうと）
そして私はzshを使ってるのでbash_profileは無視します。

zshにはいくつか設定ファイルがあるみたいで、基本的には
「.zshenv」「.zprofile」「.zshrc」「.zlogin」「.zlogout」
この５つをつかうとのこと。
これの違いについては後述に譲るんですが、違いとしてはどの状態のシェル（ログインシェルなのか、そうじゃないのかなど）に応じて、読み込まれるファイルが違ったり、順番が違うとのこと。でどうしろというと

**基本的に設定は.zshrcファイルに書いておけばいい**

**環境変数を設定するなどログイン時に一度だけ実行すればいいような設定だけ.zprofileに書いておく**
みたいですね。(今zprofile使ってないけど)

うん。。。？.zsh_local いなくね？
結局zsh_localって何かというと、自分用の設定変数であったり、外部に見せたくない設定ファイルの中身なんかを書いておき、それを.zshrcで読み込むようにするものなんですね。
http://mironal-memo.blogspot.jp/2013/02/gist.html
（うちもこれと全く一緒の方法でやってる）
例えばawsのaccesskeyなんかって絶対外部に漏れちゃいけない、けどコードはgithubで公開したいって時に、.zshrcに

```
if [ -f ~/.zsh_local ]; then
  source ~/.zsh_local
fi
```
って書いて、zsh_localに

```
export AWS_ACCESS_KEY=hogehoge
export AWS_REGION=hugahuga
```
みたいな感じで書いちゃえばよいみたい。
あーすっきりしました。。。しました？あれ、これやと最初の回答になってないですね。

##dockerでよみこんでもらうためには
そもそもdockerって種類はどうあれ、自分のPC上にdocker serverを立ち上げて、そのコンテナ（PC）上で作業してるんで要は別PCっすよね。じゃあ自分のマシンで設定してる環境変数使えんやん、、、！

###そこででてきたdotenv先生
ちょっといきなり飛んじゃいますが、今のプロジェクトでrailsを使ってます。docker上にええ感じに
設定ファイル読み込ませるのってどうしたらええんやろ。。そんなときにdotenv先生（gem）です。
なにができるかというと、プロジェクトディレクトリに.envファイルを作って、そこに設定内容（AWSのkeyとか）を書きます。
そうするとあら不思議、そのプロジェクト上でその設定ファイルが読み込まれます。
そして.envファイルを.gitignoreしておくと、pushしても公開されない、、あら便利。
これきっと嬉しいのっていろんなプロジェクトやってるときとか設定内容全部.envに書いておくと、それぞれのプロジェクトごとに必要な設定内容をきにしなくてつかえるから　便利なんでしょうね。

なんでdockerにかぎらず、VM使うときでも、ホスト（ローカルマシン）での設定ファイルはよみこまれません。困ったなと思ったらdotenv先生を使ったらええんです。（gitignoreをしましょう）
dotenvの使い方は下記より
http://qiita.com/closer/items/f8d8ba00ae86d7051764


##今日の総評
ローカルマシンでは.zshrc、各プロジェクトごとの設定内容は.envに書きましょう


<追記>
環境変数書いたあと、ちゃんと
`source .env`
って感じで更新しましょう。
あとlessでちゃんと更新が反映されてるかの確認も
sourcetree で submodule を追加できないとき

```
sourcetree 2.3.1
```

# macでsourcetreeからサブモジュールの追加するときの手順

１、左メニューで右クリック。
![スクリーンショット-2016-12-21-10.42.26.jpg](https://qiita-image-store.s3.amazonaws.com/0/30301/775f3be0-223d-faf6-8f27-f41ab13e9903.jpeg)

２、リポジトリURLを記入して、ローカルのディレクトリも指定
![スクリーンショット-2016-12-21-10.47.10.jpg](https://qiita-image-store.s3.amazonaws.com/0/30301/5205aad4-fe98-6335-84d5-d7eb67d61ef0.jpeg)

３、するとエラー。
![スクリーンショット-2016-12-21-10.50.49.jpg](https://qiita-image-store.s3.amazonaws.com/0/30301/b4854cba-22cc-3b01-d1f6-db999cb5f4ac.jpeg)


[warning: templates not found]ココらへんを調べて見ると
sourcetreeのバグだとか・・・
http://shiro-izu.hateblo.jp/entry/2016/10/28/182252

sourcetreeからは追加できないみたいなんですがコマンドで追加できるとのこと

```
git submodule add ssh://[gitbucket]/user_name/repository.git dir_name
```

追加するとサブモジュールとして追加したリポジトリもsourcetreeで認識されました。よかった。

削除コマンド

```
git submodule deinit path/to/submodule
git rm path/to/submodule
git config -f .gitmodules --remove-section submodule.path/to/submodule
```
＜AWS＞AMIとスナップショットの違いについて

[Lambda](https://aws.amazon.com/jp/lambda/) の 定期実行で、EC2のインスタンスの状態を変更したりAMIを取得したりするサービスのテストをした時に理解の整理に少し戸惑ったのが、AMIとスナップショットの違いでした。

----
##最初の認識
インスタンス ： オンプレ環境でいうサーバー
AMI ： **DBとかでよく使われるスナップショットみたいなもの**
EBS ： オンプレ環境でいうハードディスク

こういった理解でテスティング業務を進めてました。
あまり深く考えずに「AMI ≒ スナップショット」だと思ってたんですね。

##混乱
で、なにげなくネットでAWS関連の記事を読んでたら「スナップショット」という単語がAMIとはっきり区別されて出てきていささか混乱してしまったのです。
あー違うんだって。

##調査
ググって行き着いたのは [こちら](http://aws.typepad.com/sajp/2014/04/trainingfaqbest10.html) のAWSトレーナーの方のブログ。
その中でトレーナーさんは書かれています。

>スナップショット = 「EBS ボリュームの中のデータ」を特定のタイミングで取得しS3に保存したもの

>AMI  = 「EBS ボリュームの中のデータ(スナップショット) とインスタンスを構成する管理情報」を含む起動テンプレート

なるほどこれで理解できました。
AMIはスナップショットを包括して、さらにインスタンスを構成する情報も持っているんですね。
ここでいう「インスタンスを構成する管理情報」っていうのはオンプレ環境でいうOSとかミドルウェアのイメージで解釈してます。

##まとめ
そのあと[こちらの記事](http://qiita.com/murachi1208/items/8be3cd006d31f1f81ee4)を参考に自分の環境でAMIを使ってインスタンスの複製とかもしてみました。
AMIは偉大でした。
こりゃ楽だ。
eclipseを使って最新のdevelopをbranchに取り込む際のコンフリクトを解決した手順

#概要
eclipseを使って最新のdevelopをbranchに取り込む際のコンフリクトを解決した手順

branchにpushした後、githubでコンフリクトが起こっていると表示された

![image](https://qiita-image-store.s3.amazonaws.com/0/108485/68da1028-c638-0a97-69f9-aa3475b5a808.png)

1、以下の手順を行いました
```
git checkout develop
git pull
git checkout [branch名]
git merge develop
git log
```

２、eclipseを起動してみると![image](https://qiita-image-store.s3.amazonaws.com/0/108485/f27bf94f-283c-59b8-a4fc-eda63672fe91.png)競合マークが出現

３、プロジェクトを右クリック、チーム＞ワークスペース同期化(W)　をクリック
４、![image](https://qiita-image-store.s3.amazonaws.com/0/108485/c3adf95e-a32a-2a03-4e7d-cc66b3d511f0.png)このマークの場合
　　競合しているファイルを右クリック、マージ・ツールを選択
　　　![image](https://qiita-image-store.s3.amazonaws.com/0/108485/6df35d24-af73-d68b-8462-91c2fea77aef.png)
　　Javaソースの比較する画面が出てくるので、差分を取り込みます。
　　取り込み後、保存
　　競合しているファイルを右クリック、マージ済みとマーク(A)を選択
　　![image](https://qiita-image-store.s3.amazonaws.com/0/108485/d60fbb11-54e7-035d-f272-17b3d7c5feee.png)
　　OK押下
　　![image](https://qiita-image-store.s3.amazonaws.com/0/108485/e491bcb5-7820-b225-c891-8611b60430e2.png)
５、自動マージされている場合は![image](https://qiita-image-store.s3.amazonaws.com/0/108485/372a7b15-e388-cf4f-c685-12e0f5e428c3.png)マークになっている
　　このマークのものをcommit&pushして完了です