OmniAICreator/Qiita-1.07M huggingface dataset:
Composerでライブラリを試す手順

やることはタイトル通りです


#composerをインストール

以下のコマンドをかましましょう

```
curl -sS https://getcomposer.org/installer | php
```

#composer.jsonに入れたいライブラリを記述

```json
{
   "require": {
      "guzzlehttp/guzzle": "~6.0@dev"
   }
}
```

#ライブラリインストール

```
php composer.phar install
```

installは初回はjsonを見て実行し、composer.lockが存在する場合はそちらを見てinstallする
ので、開発途中にライブラリの更新を行いたいときは

```
php ./composer.phar update
```

でライブラリのインストールを行いつつ、composer.lockの更新を行い、本番環境ではcomposer.lockを読み込んでinstallする

※composer.jsonに自動で追記して欲しい時は

```
php ./composer.phar require fabpot/goutte
```

のようにするとcomposer.jsonの更新もライブラリのインストールもcomposer.lockの更新もやってくれる

#試すPHPファイル作成

ついでにディレクトリとファイルはこんな感じになる

```bash
>ls
composer.json  composer.lock  guzzle_test.php  vendor
```

```php:guzzle_test.php
<?php

// autoloadを読み込む
require 'vendor/autoload.php';

// Guzzle使うため
use GuzzleHttp\Client;

// 使うコード書く
$client = new Client([
    // Base URI is used with relative requests
    'base_uri' => 'http://httpbin.org',
    // You can set any number of default request options.
    'timeout'  => 2.0,
]);
```

その他のメモ

```php:php
$client = new \GuzzleHttp\Client([
    // Base URI is used with relative requests
    'base_uri' => 'http://httpbin.org',
    // You can set any number of default request options.
    'timeout'  => 2.0,
]);
        
$res = $client->request('GET');
echo $res->getStatusCode();
// 200
echo $res->getHeaderLine('content-type');
// 'application/json; charset=utf8'
echo $res->getBody();
```

## namespaceで自作のクラスを読み込みたい時

手順としては
1. `composer.json`に自分で指定するnamespaceとディレクトリをpsr-4で設定する
2. `php ./composer.phar dump-autoload`でautoload.phpを更新する
3. 指定するnamespaceのクラスを作成
4. 作ったクラスを使いたいファイル内でuseして使う

例えばアプリケーションルートディレクトリ以下に`src`というディレクトリが存在していたとする
その中には`Original.php`

```
/composer.json
/composer.lock
/guzzle_test.php
/src/
    /Original.php
/vendor
```

### 1. composer.jsonのautoload項目を追加

```json:composer.json
{
    "autoload": {
        "psr-4": {
            "Mysrc\\": "src/",
        }
    }
}
```

psr-4の解説は[ここ](http://tec-blog.beaglee.com/?p=406 "ここ")でなんとなくわかります

知っておきたいのは
PSR-4の場合

- ネームスペースの区切りがディレクトリの区切りとなる。
- 完全修飾クラス名の指定したネームスペースプレフィックス以降がベースディレクトリ内に存在する。
- ファイル名は<クラス名>.phpとなる。

ということですね、ファイル名をクラス名と同じにしていなかったのでハマったことがあります…


### 2. autoloadの更新

以下のコマンドを入力するだけ

```
php ./composer.phar dump-autoload
```


### 3. 指定するnamespaceのクラスを作成

Original.phpの実装

```php:Original.php
<?php

// 使いたいnamespaceを宣言 composer.jsonで宣言したMysrc
namespace Mysrc;

class Original
{
    public function eeecho()
    {
        echo "オリジナルです。\n";
    }
}
```


### 4. 作ったクラスを使いたいファイル内でuseして使う

```php
<?php

// autoloadを読み込む
require 'vendor/autoload.php';

// Originalを使うようにする
use Mysrc\Original;

$orig = new Original();
$orig->eeecho();
```

みたいな感じで使えます。


流れはこんな感じです
以上。



## 参考
[PHPの名前空間とcomposerのautoload (PSR-4) サンプル](http://qiita.com/yotasasaki/items/cc1a4936c0c92099db5a "PHPの名前空間とcomposerのautoload (PSR-4) サンプル")
combineReducersでハマったメモ

`redux`の勉強にとおもって、簡単なカウンターアプリを１から作ってみたんだけれど、
reducerの分割時に`combineReducers()`でしばらく悩んだので書き残しておきます。

# 返却値

### まずはreducerが１つの場合

```./reducer/counter.js
const initialState = {
    count: 0,
};

function counter(state = initialState, action) {
...
    default:
        return state;
    }
}

export default counter;
```
```./reducer/index.js
import counter from './counter';

export default counter;
```
```./app.js
import {createStore} from 'redux';
import {Provider} from 'react-redux';
import reducer from './reducer';

let store = createStore(reducer);

console.log(store.getState());

render(
    <Provider store={store}>
        <RootComponent />
    </Provider>,
    document.querySelector('#app')
);
```
この状態で途中に記述してある`console.log()`の返却値は

```
Object {
  count: 0
}
```

### 次にreducerを分割するために、２つに増やした場合
`combineReducers()`を使って２つのreducerをｶﾞｯﾁｬﾝｺしてからexportします。

```./reducer/index.js
import {combineReducers} from 'redux';
import counter from './counter';
import counterB from './counterB';

const reducer = combineReducers({
    counter,
    counterB
});

export default reducer;
```
そうすると、`app.js`側の`console.log()`の返却値は

````
Object {
  counter: {
    count: 0
  },
  counterB: {
    countB: 0
  }
}
````

Objectが一階層ネストされて返却されます。
これを発見するのにしばらく悩みました。

# Component側のmapStateToPropsに注意

Component側でstateをひも付けてやる必要があるんですが、その際に

１つの場合はこれでいいんですが、

```js
const mapStateToProps = (state) => {
    return {
        count: state.count
    };
};
```

`combineReducers()`を使った場合には、ネストされた分を考慮してやる必要があります。

```js
const mapStateToProps = (state) => {
    return {
        count: state.counter.count
    };
};
```

---

オブジェクト構造を蔑ろにして実装を進めていくと、くだらない所でこける気がしたのでご注意を。
あとthisとか特に。
wgetでサイト全体をまるごとダウンロードする(認証後ページも)



```
wget --mirror \
     --page-requisites \
     --span-hosts \
     --quiet --show-progress \
     --no-parent \
     --convert-links \
     --no-host-directories \
     --adjust-extension \
     --execute robots=off \
     https://example.com
```

## パラメータの説明

* `--mirror`: リンクを辿って再帰的にダウンロードする。タイムスタンプをチェックして新しいものだけダウンロードする。
* `--page-requisites`: ページが使っている画像・CSS・JSをダウンロードします。
* `--span-hosts`: ホストをまたがってダウンロードします。
* `--quiet --show-progress`: 進捗を1ダウンロードあたり1行で表示する設定です。コンソールがうるさくなくなって良い。
* `--no-parent`: 親ディレクトリは辿らない。ダウンロードしない。
* `--convert-links`: CSS・JSへの参照がURLになっている部分を相対パスに変換します。
* `--no-host-directories`: ホスト名でディレクトリを作らない設定です。
* `--adjust-extension`: 拡張子がついていないファイルに拡張子をつける。例えば、/usersというHTMLはusers.htmlとして保存されます。
* `--execute robots=off`: robots.txtを無視する。
* `https://example.com`: ダウンロードを開始する起点です。起点をサブディレクトリにするとサブディレクトリ以下がダウンロードされます。たとえば、`https://example.com/foo`のようにすると、`/foo`以下がダウンロード対象。

## ケースバイケースの設定

### 認証しないと閲覧できないコンテンツがある場合

認証しないと閲覧できないページがある場合、セッションIDが含まれているCookieヘッダを追加する。Cookieヘッダはブラウザの開発ツールで調べると良い。`--header`オプションを追加する。

```
wget --mirror \
     --header='Cookie: _session_id=xxxxxxxxxxxxxxxxxxxxxxxxx' \
     ... \
     https://example.com
```

### 保存先のディレクトリを指定したい場合

2つ方法がある。

1. 保存先に`cd`して`wget`する。
2. `--directory-prefix`を指定する。

```
wget --mirror \
     --directory-prefix=mywebsite \
     ... \
     https://example.com
```

この場合、カレントディレクトリに`mywebsite`ディレクトリが作られ、その中にダウンロードしたファイルが集まる。

### 保存対象のディレクトリを指定したい場合

保存する対象をしぼるときは、`--include-directories`を使う。複数指定できる。

```
wget --mirror \
     --include-directories=/foo,/bar,/buz \
     ... \
     https://example.com
```

関連

* [wgetでログイン認証の先のページを落とす - Qiita](http://qiita.com/uedatakeshi/items/4660dfda727315b21f12)
* [wgetでページとそれに付随するCSS・JSなどを保存する - Qiita](http://qiita.com/suin/items/5347e92371741c2d29c6)
IDCFクラウド プライベートコネクト自動化

本日、2016/2/26、IDCFクラウドのプライベートコネクトがコンパネから操作可能に、しかもリージョン間費用が無料となりリリースされました。
http://www.idcf.jp/cloud/connect/

「IDCFのリージョン間接続は、インターネットVPNと比較しても通信速度が2～3倍高速とのこと」とあるので、ホントかどうか確かめてみました :punch: 
半分自作自演ですが :dash: 

結果はこんな感じ。
## VyOSとの比較

|jp-east~jp-west            | RTT          | loss         |  Throughput   |
|:-----------|:------------:|:------------:|:------------:|
|Internet(参考)    |    23.0msec |     0.00%    |  445Mbps     |
|VyOS(IPsec) |    23.7msec |     0.00%    |  144Mbps     |
|PrivateConnect|    21.0msec |     0.00%    |  820Mbps     |

VyOSのスペック、チューニング次第、というところは勿論ありますが、インターネットVPNと比べて**5倍以上の性能差**があるということは言えそうです。
1Gbps程度はコンスタントに使える設計になってます :rocket: 

## 構築がラク

性能差以外にも何よりも構築がラクです。VyOSでIPsec設定するのは[このマニュアル](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwipiez6i5XLAhWCKKYKHfSkBpwQFggbMAA&url=http%3A%2F%2Fwww.idcf.jp%2Fpdf%2Fcloud%2Fself%2Fvyos_self.pdf&usg=AFQjCNEp5wFn_KmytDB0oae3iZclQpdksQ&bvm=bv.115339255,d.dGY)を使えばワリと簡単にできますが、それでもナンダカンダで1hくらいはかかります。（久しぶりに設定したら、ちょっとハマって2hくらいかかった・・ :sweat_drops: ）

プライベートコネクトを使えば、この接続ボタンをポチット押せば1分程度でつながります :sunglasses: 
（VM側でのstatic route設定は必要なのでお忘れずに）

![image](https://idcf-developers.qiita.com/files/69d643c0-08d7-bc59-a53e-bf5361e8d2a1.png)

## 信頼性

当然ながらプライベートコネクト含む自社インフラ部分は全て冗長化されています。
VyOSは基本シングルで、IPsec含めて完全に冗長構成で構築するのは至難の業だったりします。
切れたら困るようなシステムは悪いことは言いません、プライベートコネクト使った方が良いです :four_leaf_clover: 

## 裏話

実はプライベートコネクト用のDBもPXC（Percona XtraDB Cluster）を組んでいて、白河、東京、北九州に3分散・冗長しています :construction_worker: 

データ保全のために3分散させる、というのは最近の流行な感じですし、その際にはある程度遠距離で構成を組む必要があります。1000kmというのはDRも考えると丁度良い距離な気もします。

そんな構成もIDCFクラウドであれば即座に簡単にお安く作ることが出来ます:moneybag: 

IDCFクラウドはゾーン、リージョン問わず、One Cloudな感覚でシステムを作ることができますので、色々お役立ていただければと思います :muscle:
2日目 => 即時関数ってなんだ

即時関数というものがあるらしい。

JavaScriptにはブロックスコープというものが無くて、
for文の外でもfor文で宣言した変数が使える。
（でも新しいECMAScriptだとブロックスコープが扱えるようになってるらしいというのをQiitaの他の記事で読んだ気がする）

```js
for(var i = 0; i < 10; i++){
  console.log("i: " + i);
}

console.log("ループ外 i: " + i);

/*
i: 0
i: 1
i: 2
i: 3
i: 4
i: 5
i: 6
i: 7
i: 8
i: 9
ループ外 i: 10
*/
```

関数の中の変数に外からアクセスは不可。

```js
function roop(){
  for(var i = 0; i < 10; i++){
    console.log("i: " + i);
  }
}

roop();

console.log("ループ外 i: " + i);

// roop関数は残り続ける
// roop();

/*
i: 0
i: 1
i: 2
i: 3
i: 4
i: 5
i: 6
i: 7
i: 8
i: 9
Uncaught ReferenceError: i is not defined
*/
```

即時関数ってのを使うとこんな感じになるらしい。
一個上のやつだと関数自体はグローバルスコープに残ってしまっていつでも呼び出せる。
これだと実行したら終わりなので、後々使わない関数を定義したりしなくて済むみたい。

```js
(function (){
  for(var i = 0; i < 10; i++){
    console.log("i: " + i);
  }
}());

console.log("ループ外 i: " + i);

/*
i: 0
i: 1
i: 2
i: 3
i: 4
i: 5
i: 6
i: 7
i: 8
i: 9
Uncaught ReferenceError: i is not defined
*/
```

あとは、オブジェクトを以下のように作ると、
外からアクセスさせたくない`name`という変数に外からアクセスできてしまう。

```js
var sample = {
  name: "SAMPLE",
  displayName: function (){
    console.log("私の名前は" + this.name + "です。");
  }
}

sample.displayName();
console.log(sample.name);
sample.name = "JOHN";
sample.displayName();

/*
私の名前はSAMPLEです。
SAMPLE
私の名前はJOHNです。
*/
```

即時関数を使うと、`name`は外からアクセスできない。

```js
var sample = (function (){
  var name = "SAMPLE";

  return {
    displayName: function (){
      console.log("私の名前は" + name + "です。");
    }
  }
}());

sample.displayName();
console.log(sample.name);

/* 
私の名前はSAMPLEです。 
undefined
*/
```

`(function(){}());`ってなんだか変な書き方。
`function(){}()`ってとこは関数実行してるんだなって感じがするけど、
これを囲んでる`()`は一体なんだ？
`function(){}()`で実行したらエラーで怒られた。

以下はエラーにならないみたい。

```js
var sample = function(){
  console.log("さんぷる");
}();
```

やたら括弧を増やしてみてもいけるみたい。

```js
(((function(){
  console.log("sample");
}())) + function(){
  console.log("sample2");
}());
```

```js
(((((((((((((((((((((((((((((
  function(){console.log("括弧多い");}()
)))))))))))))))))))))))))))));
```

```js
// これはだめ
(
  console.log("test");
);

// これはOK
(
  console.log("test")
);

// 変数の宣言はダメらしい
(
  var name = "SAMPLE"
)

// ifもだめ
(
  if(true){
    console.log("てすと");
  }
)

// これはOK
(
  document.write("あいうえお")
)

// 括弧だけはダメ
();

// 数字はOK
(1);
```

括弧何者？

```js
function(){}();
// だと
function(){

}

();
// と解釈されてエラーらしい
```

括弧で囲むとこいつらは関数と`()`は別々のものじゃなくて２つで一緒なんだよって解釈されるってこと？
うーむ、わからん。
JavaからIPアドレスベースなSSLサイトと通信しようとして嵌った

JavaアプリからSSLサイトに通信する必要があって、開発環境で嵌ったので備忘メモ。

環境：

- Java 1.6
- Apache 2.1

ものすごく「え、えぇ？イマドキ？？」という環境だけど、まぁ世の中いろいろある。

で、本番環境なら問題なかったんだけど、IPアドレスベースのVirtualHostでApache運用してる開発環境で嵌った。

Apache に登録してる証明書を Java の truststore に登録すれば良いんでしょ？

```lang:bash
# keytool -importcert -v -trustcacerts -file server.crt -keystore cacerts -alias www
```
と登録して、通信させてみると、

```lang:java
javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names present
```
と言われてびびる。
ぐぐってみると、Atlassian のサイトに解決方法らしき話が載ってた。さすがあとらしあん！
[No Subject Alternative Names](https://confluence.atlassian.com/stashkb/no-subject-alternative-names-693896719.html)

ほうほう、CN が IPアドレスのとき、Subject Alternative Names を見るようになったのね…ってそれはNameベースのSSLで使う拡張じゃないのか？
とにかくそいつを有効にすれば良いのね。
openssl.cnf を編集して、

-  [ req ] セクションに `req_extensions = v3_req`って追加
-  [ v3_req ] セクションに `subjectAltName = @alt_names`って追加
-  [ alt_names ] セクション追加して`IP.1 = <YYY.YYY.YYY.YYY>`って追加

それを使って証明書を再作成。

```lang:bash
# openssl x509 -in www.csr -days 365 -req -signkey server.key -sha256 -out www.crt -extensions v3_req -extfile openssl.cnf
```

その証明書をもっかい truststore に登録。

```lang:bash
# keytool -delete -alias www -keystore cacerts    # 元のやつを一旦削除
# keytool -importcert -v -trustcacerts -file server.crt -keystore cacerts -alias www
```

さぁこれでいけるか、と通信させてみると、

```lang:java
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
```

えええええ。
それ証明書を truststore に登録してないときと同じ例外やん。

つまり証明書としてマッチしてないわけですかJava的には。
しばし考えて、これはつまり Apache から送ってる証明書情報に拡張の情報（Subject Altenative Names）が乗っかってないってこと？と思い当たって、httpd.conf に記述を追加してみる。

```
<VirtualHost YYY.YYY.YYY.YYY:443>
+   ServerName YYY.YYY.YYY.YYY
……
```

IPアドレスベースの VirtualHost なので、ServerName は設定してなかったんだけど、Nameベースの拡張使うんなら、設定もNameベースに準拠しないといけないのかなと。
そもそもIPアドレスベースで`ServerName`使えなかったらどうしようかと思ったけど、`apachectl -t`でチェックした限りでは問題ないみたい。

で、もう一度通信させてみると、無事通信できた！

……もしかして Apache の設定だけでいける？と思ったけど、未確認です。
Laravel5入門として画像投稿機能付き掲示板作成を目指す: FatalError編

migrationでハマっていたので備忘録を。

#問題点
responsesテーブルをmigrateしたが、結局いらないと思い `*_create_responses_table.php`を削除した。
すると、`php artisan migrate:rollback`等が出来なくなった。
こんなエラーが出てしまう↓

```
  [Symfony\Component\Debug\Exception\FatalErrorException]
  Class 'CreateResponsesTable' not found
```

#解決策
migrationテーブルの最新のmigrateデータを削除した。
その際、「ユニークなキーがないから消せないよ！」と注意されるので、インクリメントなIDを追加して対処した。

#まとめ
対症療法的な対策ですが、なんとか上手くいきました。
本来ならば、マイグレーション時の参照ファイル等をいじるほうが良い気がするのですが...
POSTリクエストの内容をアクセスログに出力する方法

# httpd.conf

`%r` の代わりにレスポンスヘッダを使ってログファイルに値を渡す

```apache
LogFormat "(前略) \"%{X-MYQUERYSTRING}o\" (後略)" post_logformat
SetEnvIf Request_Method "POST" method_is_post
CustomLog "|/usr/local/apache/bin/rotatelogs post_log.%y%m%d 86400 540" post_logformat env=method_is_post
```

# CGI側でレスポンスヘッダを1つ追加する

```pl
if($ENV{REQUEST_METHOD} eq 'POST'){
	%vars = $cgi->Vars;
	$qs = join('&', map{ join('=', $_, $vars{$_}) } keys %vars);
	print 'X-MYQUERYSTRING: '.'POST '.$ENV{REQUEST_URI}.'?'.$qs.' '.$ENV{SERVER_PROTOCOL}."\n";
}
```

エスケープは必要だと思う
DockerでJupyter Notebook環境をお手軽に準備する(TensorflowやGraphvizもあるよ）


はじめに
========

ちょっとデータ分析や機械学習をやってみたい、んだけど環境準備が少し面倒だとか、
ハンズオンとかやるんだけど環境セットアップの説明だけで結構時間を使ってしまう、ということがなきにしもあらずかと思います。

Jupyter Notebookは機能的にも素晴らしい環境ですし、Webブラウザがあれば使うことができます。そういう環境はDockerに入れておくと便利で、各自のLocalで起動して使うか、クラウドサーバで起動しておけば、Webブラウザがあれば誰でも使えるのでお手軽です。

既に公開されているDocker Containerもあるのですが、いくつか欲しいものが足りないので追加したものを作ったので共有します。

Jupyter Notebook Docker Container
=============
Dockerファイルはここにあります。
https://github.com/mokemokechicken/jupyter-tensorflow

何が入っているか
------------

* https://github.com/jupyter/docker-stacks/tree/master/datascience-notebook の中身

	```
	* Jupyter Notebook 4.1.x
	* Conda Python 3.x and Python 2.7.x environments
	* pandas, matplotlib, scipy, seaborn, scikit-learn, scikit-image, sympy, cython, patsy, statsmodel, cloudpickle, dill, numba, bokeh pre-installed
	* Conda R v3.2.x and channel
	* plyr, devtools, dplyr, ggplot2, tidyr, shiny, rmarkdown, forecast, stringr, rsqlite, reshape2, nycflights13, caret, rcurl, and randomforest pre-installed
	* Julia v0.3.x with Gadfly and RDatasets pre-installed
	```

* tensorflow-0.7.1 (python2, python3), skflow
* pydot2, pygraphviz


使い方
-------
* 8888ポートで動かす
* ホストマシンのカレントディレクトリ以下の `notebooks/` にファイルを永続化
* パスワードは環境変数PASSWORDにセット

という感じで動かす場合は、以下のようになります。

```sh:run.sh
docker run -d -p 8888:8888 -v `pwd`/notebooks:/home/jovyan/work -e PASSWORD="$PASSWORD" -e GRANT_SUDO=yes --user root mokemokechicken/jupyter-tensorflow start-notebook.sh
```


基本的にOptionは https://github.com/jupyter/docker-stacks/tree/master/datascience-notebook と同じなので、そちらも参考にしてください。

さいごに
========

社内に一つこういうのを配備しておくと、ちょっとした作業の共有や勉強などに便利かなーと思っています。
UE4 Build.cs機能メモ

# 最適化を行う

```csharp:Hoge.build.cs
public class HogeModule: ModuleRules
{
	public HogeModule(TargetInfo Target)
	{
        	this.OptimizeCode = CodeOptimization.Never; // 最適化を防ぐ

		.... (以下略
```
* 最適化用の列挙値

|列挙値|説明|
|:----|:---|
|CodeOptimization.Never|可能な場合は最適化しない|
|CodeOptimization.InNonDebugBuilds|非デバッグビルドでコードは最適化されるべきです|
|CodeOptimization.InShippingBuildsOnly|シッピングビルドでは最適化されるべき|
|CodeOptimization.Always|コードは常に可能な場合に最適化されるべきです|
|CodeOptimization.Default|ゲームモジュール:InNonDebugBuild それ以外:Always|

[GithubのURL:RulesCompiler.cs](https://github.com/EpicGames/UnrealEngine/blob/2a0f069ec25f949ef18954d949294904d29b7f95/Engine/Source/Programs/UnrealBuildTool/System/RulesCompiler.cs)

# .Net機能を使う

.NetのConsole機能などを活用出来る為、ユーザー名を使ったりして特定のユーザーのみ最適化を防ぐ等が出来ます。

```csharp:Hoge.build.cs

if( Environment.UserName == "山田太郎" )
{
	this.OptimizeCode = CodeOptimization.Never; // 指定のユーザーの時のみ最適化を防ぐ
}
	
Console.WriteLine("ログも出せます");
```
複数のEC2インスタンス(Linux)が同じホストに同居しているかツールを用いてインスタンス内部から調べる


##概要
複数のEC2インスタンスが同じホストに同居しているか調べる。
現在EC2には物理的に分離されたホストを調達する機能 Dedicated Host があるが、今回はこの機能を用いる。

https://aws.amazon.com/jp/ec2/purchasing-options/dedicated-instances/

##検証内容
インスタンスA、Bの2インスタンスを立ち上げ、インスタンスA側のテストデータに値を書き込み、その値をインスタンスBから上書きできるか検証する。

##検証手順
* 専用ホストを取得して、同一ホスト上にインスタンスA、Bを立ち上げる。

https://aws.amazon.com/jp/ec2/purchasing-options/dedicated-instances/

* インスタンスA、Bに下記等から必要なツールをインストールし、設定する(設定は割愛するが、需要があれば後日)。

http://xenbits.xen.org/

* (インスタンスA上)自身のdata配下に対する読み書きを許可する。

```
#/usr/local/bin/xenstore-chmod -r /local/domain/[instanceA domid]/data b[instanceA domid]
```

* (インスタンスA上)共有データにテストデータを書き込む。

```
#/usr/local/bin/xenstore-write data/hashimoto_kanna "once in 100"
```

* (インスタンスB上)インスタンスAの共有データ確認する。

```
#/usr/local/bin/xenstore-read /local/domain/[instanceA domid]/data/hashimoto_kanna
once in 100
```

* (インスタンスB上)インスタンスBからインスタンスAの共有データを上書きする。

```
#/usr/local/bin/xenstore-write /local/domain/[instanceA domid]/data/hashimoto_kanna "once in 1000"
```

* (インスタンスA上)インスタンスAによって上書きされた共有データの値を確認する。

```
#/usr/local/bin/xenstore-read data/hashimoto_kanna
once in 1000
#/usr/local/bin/xenstore-ls /local/domain/[instanceA domid] | grep kanna
hashimoto_kanna = "once in 1000"
```

##まとめ
同居するインスタンスのデータを書き換えることができた。
今回はDedicated Hostを用いた検証であったが、インスタンスの名前とかIDとかのユニークっぽいキーとdomidを使って社内で利用しているインスタンス全部をデータベース化しておけば、各インスタンス間の同居ホスト情報がまとめられるかもしれない。
Macで簡単な画像処理をしたい時に使うツール 3選

まさにQiitaに投稿したりする時に、ぱっとスクリーンショットをとって、ちょっと加工してアップします。

フォトショでもいいのかもしれませんが、そこまでヘビーな操作をするわけでもない。そんな時に使っているツール群を紹介します。


## サイズを縮小したい

これだけならMac標準のプレビューツールでできます。
右肩のかばんみたいなマークをクリックすると編集ツールが出てきます。

<img width="598" alt="preview.png" src="https://qiita-image-store.s3.amazonaws.com/0/74328/27b62565-266f-e9b8-0a31-074df02199ba.png">



サイズ縮小だけでなく、文字を載っけたり枠で囲ったり投げ縄でくりぬいたりもできます。
以外と高機能


## モザイクをかけたい

そんなときはToyViewer。
https://itunes.apple.com/jp/app/toyviewer/id414298354?mt=12

App Storeから入手できます。
プレビューツールでできることも当然できます。
モザイクは、Menu > Effect > Noise/Mosaic で範囲選択できるようになるのでモザイクをかけたい部分を囲みます

<img width="675" alt="Screen Shot 2016-02-26 at 17.47.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/74328/8c303396-2444-e8af-625e-eb07b12bce72.png">




## 矢印つきで文字を載っけたい

そんなときはMonosnap。
https://itunes.apple.com/jp/app/monosnap/id540348655?mt=12

これもApp Storeから入手。
矢印+文字くらいはプレビューツールでもできますが、一挙に片付けられるので重宝しております。

<img width="801" alt="Screen Shot 2016-02-26 at 17.50.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/74328/ee89496a-8436-fd6a-caa2-384d1d63dcb8.png">



こんな感じで半分気分で使い分けております。
ぜひオススメのツールがあれば教えてください。
Java8ならinterfaceもメインクラスにできるぞ

どうでもいい思いつきをやってみたら動いたので。

コードゴルファーの皆様はおなじみかと思いますが、Javaのメインクラスはclassである必要がありません。enumもメインクラスにできます。

```Test.java
enum Test {
  _;
  public static void main (String[] args){
    System.out.println("hello, world.");
  }
}
```

これは普通に実行できます。

そこで思いつき。Java8からinterfaceがスタティックメソッドを持てるようになったけど、じゃあこういうことは⋯？

```Test.java
interface Test {
  static void main (String[] args){
    System.out.println("hello, world.");
  }
}
```

結果 → https://ideone.com/qh5h22 うは、走った(笑)
[Android] コードでタブレット判定する


#コードを使った方法
調べると色々な方法がでてきますが
googleI/O 2015の[アプリ](https://github.com/google/iosched)の中では以下のようにやってました。

```java
public static boolean isTablet(Context context) {
        return context.getResources().getConfiguration().smallestScreenWidthDp >= 600;
}
```

#リソースを使った方法
一応リソースを使った方法も
res/values-sw600dp/bool.xml

```xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="is_tablet">true</bool>
</resources>
```

res/values/bool.xml

```xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="is_tablet">false</bool>
</resources>
```
判定

```java
public static boolean isTablet(Context context) {
        return context.getResources().getBoolean(R.bool.is_tablet);
}
```
terminalのショートカットキー


###カーソルを左端に
`Ctrl -> a`

[![https://gyazo.com/204ed99c59950fbb181aa5736a6eed4f](https://i.gyazo.com/204ed99c59950fbb181aa5736a6eed4f.gif)](https://gyazo.com/204ed99c59950fbb181aa5736a6eed4f)

###カーソルを右端に

`Ctrl -> e`

[![https://gyazo.com/8ccaea2c48d10c04b14953dd47bf9191](https://i.gyazo.com/8ccaea2c48d10c04b14953dd47bf9191.gif)](https://gyazo.com/8ccaea2c48d10c04b14953dd47bf9191)

###clearコマンド同じキー

`Ctrl -> l`

[![https://gyazo.com/3a1d4789ec1d22d22d19e728cc8aa2a8](https://i.gyazo.com/3a1d4789ec1d22d22d19e728cc8aa2a8.gif)](https://gyazo.com/3a1d4789ec1d22d22d19e728cc8aa2a8)

##参考

[ターミナルでのカーソル移動のショートカット](http://lealog.hateblo.jp/entry/2012/11/16/010648)
WebPayも少し弄ってみる

昨日はPayPalのsandboxを使えるようにアカウントを作るところまでやりました。

そのあとドキュメントみたりWebで調べたりしていたのですが、「日本語のドキュメントは信用するな」「見るなら英語」というコメントが多いように見受けられたのでめんどくさくなりました。初めてやるペイメントなんで「英語の理解に齟齬があったら洒落にならん」という判断で日本製のWebPayも使ってみようと思いました。最終的な支払いシステムは、PayPalもWebPayも最近API公開したらしいVisaを個別に扱うことも、逐次全部やっちゃえばいいですし。

というわけで今回はWebPay。こちらもまずはアカウント作成から。
[https://webpay.jp/](https://webpay.jp/)
こちらはsandboxを使うのが非常にわかりやすい。
公式通りにやればサンプルが動きます。

アカウントを作ったら、Java側を実装。
私はMaven使いなので、Mavenでライブラリを取得。最新は2.2.2でした。

```
<dependency>
  <groupId>jp.webpay</groupId>
  <artifactId>webpay</artifactId>
  <version>[2.2.2,3.0.0)</version>
</dependency>
```

ここからはまだ試していないのですが、多分問題なく動くはず。
HTMLに以下のスクリプトを貼り付けます。

```
<form action="/purchase" method="post">
  <script src="https://checkout.webpay.jp/v3/" class="webpay-button" data-key="test_public_2nAdAMdum5p44cM6Nhc1r5hI" data-lang="ja"></script>
</form>
```

前提として自分のサーバーのバックエンドがJavaで、エンドポイントとして`http://xxxx.xxx:xxxx/purchase`があるとします。

WebPayの上で説明したデフォルトの設定では、`/purchase`に`webpay-token`というnameで値が渡されます（はずです）。それをJava側で

```
WebPay webpay = new WebPay([your-token-secret]);
webpay.charge.createRequest()
        .amount(400)
        .currency("jpy")
        .card([webpay-token])
        .execute();
```

という形で実行してやると、あなたのアカウントにお客様から400円の支払いが実行されます。`your-token-secret`はあなたのアカウントに紐付いた秘密鍵です。`webpay-token`は一回限りで利用できなくなるので、万が一これが漏れても悪用されることはないとのことです。

ただし、このままだとお客様は支払いのたびに毎回クレジットカード情報を入力する必要が出てきます。それを避けるために、WebPayにお客様情報を登録することができます。以下のようにやります。

```
<form action="/register" method="post">
  <script src="https://checkout.webpay.jp/v3/" class="webpay-button" data-key="test_public_2nAdAMdum5p44cM6Nhc1r5hI" data-lang="ja"></script>
</form>
```

```
WebPay webpay = new WebPay([your-token-secret]);
webpay.customer.createRequest()
        .card([webpay-token])
        .execute();
```

新たに`/register`というエンドポイントを作りました。入力されたお客様クレジットカード情報はまずWebPayにセキュアに接続され`webpay-token`をもらって`/register`に届けられます。そしてサーバー側でWebPayにお客様情報を登録してくれと依頼を出します。確認していないので申し訳ないですが、多分`execute()`の返り値に`CustomerResponse`を取るので、そこにお客様に紐付いたアクセストークンが入っているのだと思います。私はWebPayのダッシュボードからお客様のアクセストークンを取得しました。

仮にお客様のアクセストークンを`customer-token`とします。この`customer-token`を自分のサーバーで保管しておけば、何かとトラブルの素になるクレジットカード情報を自分のサーバーで全く持たずに、支払い機能を作れます。

`customer-token`を使った支払いは

```
WebPay webpay = new WebPay([your-token-secret]);
webpay.charge.createRequest()
        .amount(400)
        .currency("jpy")
        .customer([customer-token])
        .execute();
```

という形で、400円を請求できます。
ちなみに、これらはすべて公式サイトに情報が載っています。

今回少し使ってみた印象は「非常にわかりやすい」です。
ただ、私の作っているサービスの特徴上、双方向に送金ができたほうがありがたいです。WebPayはそれには対応していません（たぶん）。そのうち対応するのでしょうか？そうだとありがたいのですが。

PayPalは双方向の送金もできるみたいです。
・・・めんどうですが、もう少しPayPal情報を調べてみようと思います。
> 一回覚えてしまえばなんてことはないと思うのですが、、、spring frameworkもそうだったし。気に入らないのは、英語版の機能が日本版では使えないことがあって、せっかく調べてもいざ実践しようとしたら「日本では使えません」とか言われたら・・・ムキー。
Regexp によるマッチングのベンチマーク

以下の 3 つについて比較します。

* `Regexp#=~`: 文字列中のマッチする位置を整数で返す。しなければ `nil`。
* `Regexp#===` マッチするかどうかを `true` or `false` で返す。
* `Regexp#match`: マッチしたら `MatchData` オブジェクトを返す。しなければ `nil`。

もちろん、これらはいずれも返す値が違うが、例えば以下のようにマッチするかどうかだけをチェックしたいときにどれを使うと速いのかだけ考える。

```rb
do_hoge if re =~ str
```

## ベンチマークコード

```rb:bench.rb
require 'benchmark'

N = 10_000_000
REGEXP = /Chrome/
STRING = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36'

Benchmark.bm do |b|
  b.report('Regexp#=~   ') do
    N.times { REGEXP =~ STRING }
  end

  b.report('Regexp#===  ') do
    N.times { REGEXP === STRING }
  end

  b.report('Regexp#match') do
    N.times { REGEXP.match STRING }
  end
end
```

## 実行結果

```
$ ruby regexp.rb
       user     system      total        real
Regexp#=~     2.670000   0.020000   2.690000 (  2.696319)
Regexp#===    2.660000   0.020000   2.680000 (  2.699713)
Regexp#match  9.460000   0.270000   9.730000 (  9.837536)
```

## まとめ

`Regexp#=~` と `Regexp#===` の差は誤差の範囲。
繰り返し実行しているとどっちが勝つケースもあった。
個人的には `Regexp#=~` の方が「正規表現マッチングしてるんだ」という意図性がわかりやすいので好み。
(`===` は JavaScript や PHP だと同一性のチェック等に使われているから、というのもある)

しかし `Regexp#match` は有意に遅いので、`MatchData` オブジェクトが必要ない限りは使わないほうが良さそう。
やはり `MatchData` オブジェクトの生成コストによる差だと思われる。

## ひとこと

個人的には `String#=~` の方が読みやすくて好き。
ちなみにベンチマーク的には `Regexp#=~` と特に違いませんでした。
chown使い方の基本


`chown`はファイルやディレクトリの所有権を変更するコマンド

$`chown user_1 file_1`
は
file_1の所有権をuser_1に変更する。

`-R`のオプションで
指定したディレクトリ以下のディレクトリすべて所有権を変更する
（でいいのかな？）
httpプロキシサーバがわかればGitHubは使える

# きっかけ

GitHubで、リポジトリのcloneのURLが、気づいたらhttpsにrecommendedをつけるようになっていて、httpsが通る環境ならGitHubが使えるのではと思い、すこし調べてみました。

# https推奨なのは？

[公式のwhich-remote-url-should-i-use](https://help.github.com/articles/which-remote-url-should-i-use/)によると、要はfirewallとかで制限されていても、httpsはproxy経由などで使えるでしょう、ということ。GitHubにwebブラウザでアクセスできる環境なら、使えるはずと。

# 使い方（プロキシなしなら）

プロキシ経由しないでhttps通信してるなら、URLをhttpsのにするだけでOKです。（まず、ありえないでしょうが...）

`git clone https://github.com/[user_name]/[repo_name].git`

```
$ git remote -v 
origin  https://github.com/[user_name]/[repo_name].git (fetch)
origin  https://github.com/[user_name]/[repo_name].git (push)
```

となっていれば、 `git push origin master` でmasterにpushできます。

この際、GitHubのユーザ名とパスワードでの認証が必要になります。
二段階認証にしていたら、アクセストークンでの認証に変わります。（[詳細はこちら](https://help.github.com/articles/which-remote-url-should-i-use/#when-2fa-is-enabled)）

[git-credential-cache](https://www.kernel.org/pub/software/scm/git/docs/git-credential-cache.html) などで、認証情報を保持していれば、毎回やる必要はなくなるようです。

# プロキシが必要なとき

このときは、gitにproxyサーバの設定を追加すれば、上記のやり方が使えるようになります。
ネットワーク管理者などにhttpプロキシサーバの情報を教えてもらいましょう。

`git config --global http.proxy http://[proxy_host]:[proxy_port]`

## プロキシサーバの情報を気軽に聞けないとき

自分のマシンの設定から辿っていきましょう。（ここから先は自己責任でお願いします。）

IEの場合、

* 自動構成スクリプト (proxy.pac)
* プロキシサーバー

のいずれかが、レジストリに設定されているでしょう。

`HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionInternet Settings` の下の

* AutoConfigURL
* ProxyServer

proxy.pacの場合、アクセス元とアクセス先に応じたproxyサーバの設定があるはずなので、そこから使えそうなを探しましょう。

ProxyServerの場合は、それをそのまま使えばいいはずです。

（unix系のマシンなら探しやすいかな...?）

# やっぱりSSHでやりたいとき

ありがたいことにhttpsのポート443でgithubにssh接続できます。
https://help.github.com/articles/using-ssh-over-the-https-port/

sshにhttpプロキシの設定をつけくわえればOKです。
`~/.ssh/config` に次を追記します。

```
Host github.com
    User hoge
    HostName ssh.github.com
    Port 443
    ProxyCommand connect -H [proxy_host]:[proxy_port] %h %p
```

**注**
windowsの場合は、connectに対応するものは、git for Windowsとセットになっているconnect.exeなどにする必要があります。

これで、つぎのようにできれば成功です。（githubに公開鍵を登録して、その秘密鍵で認証しているものとします。）

```
$ ssh -T git@github.com
Hi username! You've successfully authenticated, but GitHub does not
provide shell access
``` 

# 結論

webブラウザでGitHubにアクセスできるなら、proxyサーバがわかればGitHubは原理的には使えます。
認証が必要なproxyサーバだったり、proxyサーバの情報が秘匿されている場合などは、簡単には使えないですが...

# 参考サイト

http://blog.engineer-memo.com/2014/07/28/ie-11-%E3%81%AE%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E8%A8%AD%E5%AE%9A%E3%82%92%E5%9F%BA%E6%9C%AC%E8%A8%AD%E5%AE%9A%E3%81%A7%E3%83%AC%E3%82%B8%E3%82%B9%E3%83%88%E3%83%AA%E5%A4%89%E6%9B%B4%E3%81%AB/

https://help.github.com/articles/which-remote-url-should-i-use/

https://help.github.com/articles/using-ssh-over-the-https-port/

http://blogs.technet.com/b/jpieblog/archive/2015/02/09/3644793.aspx

http://cohakim.com/archives/5849

https://mistymagich.wordpress.com/2013/10/07/git-credential-helper%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6http%E8%B6%8A%E3%81%97%E3%81%A7%E8%AA%8D%E8%A8%BC%E3%81%8C%E3%81%8B%E3%81%8B%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%83%AA%E3%83%9D%E3%82%B8/

http://ymotongpoo.hatenablog.com/entry/20110325/1301039272

http://qiita.com/usamik26/items/c655abcaeee02ea59695

http://qiita.com/hnakamur/items/cb04882cc69f2d1a7367

http://qiita.com/zaki-yama/items/bfb0c2bef516af58c3fa
infinidbのtableにremote serverからアクセスさせる設定

- アクセスするテーブルへの権限設定
- infinidb_vtableへのアクセス権限設定

```
mysql> show databases;
+---------------------+
| Database            |
+---------------------+
| information_schema  |
| calpontsys          |
| infinidb_querystats |
| infinidb_vtable     |
| mysql               |
| test                |
+---------------------+
8 rows in set (0.00 sec)

```

```
mysql> grant all privileges on infinidb_vtable.* to あんた@"どっか" identified by 'ぱすわーど' with grant option; 
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

```
Cakebox(VirtualBox)からメールを送れるようにする


Cakebox便利〜([前回の投稿](http://qiita.com/ran/items/0744700e4582d1cf43f8))と思ってたのですが、メールが送れないことに気がつきました。
そもそもmailコマンドとかもなかったので、postfixとmailutilsを入れました。

```bash
sudo apt-get install postfix
sudo apt-get install mailutils
```

インストールできたので、`mail 自分のメールアドレス`でメール送信してみましたが来ない…。

`/var/log/mail.log`を見ると、メールアドレスのドメインに繋ぎに行ってconnection timed outとか言われてるのですが、`nslookup -type=mx メアドのドメイン`の実行結果がローカルとCakeboxで違っていて、そもそも繋ぎに行くべきところが違うよう。

`/etc/resolv.conf`に

```
nameserver 8.8.8.8
```

と書くのを教えてもらいました。8.8.8.8はGoogleのPublic DNSだそうです。

```bash
sudo /etc/init.d/postfix restart
```

でpostfixを再起動したら送れるようになりました。 :clap: 

# 追記

Cakeboxを再起動したら、`/etc/resolv.conf`が元に戻ってしまいました…。 :scream: 

どうやらUbuntu14.04では`/etc/resolv.conf`を直接編集せずに、`/etc/network/interfaces`に書くのが正しいようです。
`/etc/network/interfaces`の`iface lo inet loopback`の下に`dns-nameservers 8.8.8.8`を追加しました。

```
iface lo inet loopback
      dns-nameservers 8.8.8.8
```

を書き再起動すると、`/etc/resolv.conf`に`8.8.8.8`が追加されていました。
Windows環境でバベられなかった

DeNAさんの「[Babelで先取り次期JavaScriptの仕様（ES6）を体験してみよう！](http://connpass.com/event/27206/)」へお邪魔してきました。
解説の方がMacで、孤高のThinkPadder(私)はてんやわんやでした 笑
Windows環境についてネットに転がってなかったのでメモメモ

##１．node.jsをインストール
https://nodejs.org/en/
node.js現在の最新版「v5.7.0 Stable」をインストールしました。
インストールするとコマンドラインでnpmが使えるようになります。

```cmd.exe
> npm -v
3.6.0
```

##２．Babelをインストール
npmでBabelをインストールします。
-gはグローバルオプションで、どのディレクトリでもBabelが使えるようになります

```cmd.exe
> npm install -g babel-cli
```

インストールが完了するとこんな画面
![install.png](https://qiita-image-store.s3.amazonaws.com/0/45865/de432f22-0561-ade6-0013-8b19d8ea19b7.png)


Babelコマンドが使えるようになります

```cmd.exe
> babel --version
6.5.1 (babel-core 6.5.2)
```


##バベられなかった

Babelを試すために作ったディレクトリに、ES6のJavaScriptをつくります。

```js:script.js
class User {
  constructor(name) {
    this._name = name;
  }

  say() {
    return 'My name is ' + this._name;
  }
}
```

babelコマンドで対象のスクリプトを指定すると、ES5に変換後のソースが表示されます。

```cmd.exe
> babel script.js
class User {
  constructor(name) {
    this._name = name;
  }

  say() {
    return 'My name is ' + this._name;
  }
}
```

( ･3･)ｱﾙｪｰ 変わってないよー


##３．BabelのES2015プリセットをインストール
Babelを試す用のディレクトリへ移動し、プリセットをインストールします。

```cmd.exe
> cd /d D:\DevTool\Babel
>
> npm install babel-preset-es2015 --save-dev
```

##４．プリセットの設定ファイルをつくる
Babelを使う時のプリセット設定ファイル(.babelrc)をつくります。
.babelrc は拡張子のみのファイル名なので、コマンドラインで出力します

```cmd.exe
> echo {"presets" : ["es2015"]} > .babelrc
```

##５．バベられた！！（成功）
神に許された！
ES6のコードがES5で動くように変換されました！

```cmd.exe
> babel script.js
'use strict';

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var User = function () {
  function User(name) {
    _classCallCheck(this, User);

    this._name = name;
  }

  _createClass(User, [{
    key: 'say',
    value: function say() {
      return 'My name is ' + this._name;
    }
  }]);

  return User;
}();
```

-oオプションで出力ファイルを指定したり

```cmd.exe
> babel script.js -o script-es5.js
```


-wオプションで元ファイルが変更されるたびに再出力したりできます

```cmd.exe
> babel script.js -w -o script-es5.js
```
AndroidStudio1.5にupdateしたらbuild.gradleがwarningだらけに・・・

## こんな警告エラー

```
default config cannot be applied to groovy.lang.closure
```

## とりあえず検索してみた
- 検索してみたらこんな感じの記事がでてきた。
 - http://stackoverflow.com/questions/29133601/buildtypes-cannot-be-applied-to-groovy-lang-closure

- どうやら設定しているgradleの場所に指定したgradleがない模様:cry:

##　解決方法
- Preferences -> Buildm, Execution, Deployment > Build Tools > GradleのGradle homeの設定を存在するgradleに変更してあげてください。



 原因はきっとAndroidStudioのアップデート時に前回の環境設定を引き継いだからだと思われですね・・・ :sweat:
開発環境を考える

# 開発環境って
閉じたネットワークでの開発環境を考えたとき、どんな開発ツールを使うのがいいのか。
頭の中のモヤモヤをメモしておく。

## バージョン管理
* GitBucket

GitHubのクローンプロジェクト。
Gitで資材のバージョン管理を実施し、課題をissueで、マージレビューをPull Requestで管理する。

## ライブラリ管理
* nexus

Mavenプロジェクトにしてライブラリはnexus経由にする。
閉じたネットワークの中でnexusだけ外に繋がるようになんとかしたい。
ダメだったらいろいろダウンロードしてnexusにアップかなぁ。。。

## CIツール
* Jenkins

GitHubであればTravis CIがあって便利だが、閉じた環境を想定するとやはりJenkinsかな。
GitHubPullRequestBuilderプラグインを入れてPull Requestのビルド確認を実施できる。
Embeddable Build Statusプラグインを入れて最新のビルドステータスを常に一目で確認することができる。

## カバレッジ＋コードスタイルチェック
* SonarQube

カバレッジの測定に使用。
コードスタイルのチェックにも使える。


もっといいの（使いやすい、お金がかからない、閉じた環境で使える）あるのかなぁ。
レガシーインターフェース > IEEE1394a / ExpressCard/34

IEEE1394a接続用インターフェイスを調査中

[kakakucom](http://kakaku.com/pc/interface-card/itemlist.aspx?pdf_Spec001=1)

- ノートPCなら[このあたりか](http://kakaku.com/item/05678010290/)
- 最近のデスクトップPCならPCIe対応の[このあたりか](http://kakaku.com/pc/interface-card/itemlist.aspx?pdf_Spec001=1&pdf_Spec101=3)

上記の製品が手に入るかというのと、ドライバが最近のOSで動くかが不明。

中古PCを手に入れて対応することも検討しないといけないのかも。

## EXpressCard/34

どうもExpressCard/34というインタフェースのものを使うことになりそう。

PCMCIAへの変換アダプタは見つけた。
http://direct.sanwa.co.jp/ItemPage/400-ADRPCEX

- 対応OS：Windows7、Vista、XP（SP1以降）、2000（SP4以降）
MacからRDP接続時、US配列になるのを解決

* β版のRDPクライアントを使うと日本語入力できた。
    * Version 8.2.18 (8.2.18.561)

## 参考

* [Microsoft Remote Desktop Beta 8.2.9 日本語スムーズに入力できます | mac野郎なのか](http://fanblogs.jp/macyarounanoka/archive/185/0)


## ダウンロード

* [Introducing the new Microsoft Remote Desktop Preview app for Mac | Remote Desktop Services Blog](https://blogs.msdn.microsoft.com/rds/2015/08/11/introducing-the-new-microsoft-remote-desktop-preview-app-for-mac/)
    * [Microsoft Remote Desktop for Mac – HockeyApp](https://rink.hockeyapp.net/apps/5e0c144289a51fca2d3bfa39ce7f2b06/)
静的なTextAttributeを超簡単に設定する

#用意するもの

* TextEdit.app
* Xcode

#手順

![スクリーンショット 2016-02-26 16.32.45.png](https://qiita-image-store.s3.amazonaws.com/0/24979/6e11de0f-e321-9e55-c70e-cb29d5d8cccc.png)

TextEdit.appで文字を装飾します。

これを全選択してコピー

Xcodeに移動してUILabelのインスペクタからText: Planeとなっている部分をText: Attributedにして装飾用のインスペクタを開きます。

<img width="258" alt="スクリーンショット 2016-02-26 16.33.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/24979/7d93d676-e76f-5282-429d-51dca9efef36.png">

↓

<img width="257" alt="スクリーンショット 2016-02-26 16.34.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/24979/bcfbda8f-4047-718f-6aba-2debcd5b59b1.png">

あとは先程のコピーしたテキストをペーストすると

<img width="258" alt="スクリーンショット 2016-02-26 16.35.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/24979/6e5ce434-ddd5-add5-81c0-38b4810da279.png">

装飾もそのままペーストされて

<img width="685" alt="スクリーンショット 2016-02-26 16.35.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/24979/b590cb23-1bc3-0842-8e2f-9fa98e40827c.png">

ストーリーボードにも反映されます。Happy
Math - 円周率を3.14どころか3.141592653589793としても丸く収まらなかった件

[算数の問題「円周率を3.14とするとき、半径11の円の面積を求めよ」の解を379.94とするのは誤り？]なんて話題が数日前にあったようですが、ちょうどその頃、3.14どころか3.141592653589793にしても不十分だったという体験をしたので。

ちなみに3.141592653589793というのは、おそらく過半のコンピューター「πを〜と」している数値。[16進表記では]`0x1.921fb54442d18p+1`となります。

[16進表記では]:  http://qiita.com/dankogai/items/a333bed751e4b0a71975

````shell
% irb
irb(main):001:0> Math::PI
=> 3.141592653589793
````

[算数の問題「円周率を3.14とするとき、半径11の円の面積を求めよ」の解を379.94とするのは誤り？]: http://togetter.com/li/940931

今、私は[PONS]で数(値型)を再発明している真っ最中なのですが、そのPONSにおける実数型==`POReal`プロトコルに準拠する型にはもれなく`wrapAngle()`という関数が付いてきます。

[PONS]: http://qiita.com/dankogai/items/7af3565d7657785211dc

要はその数値XをXラディアンとみなして、それを±πの範囲に正規化する関数で、角度を扱う際に重宝するのですが、なぜ単純に

````swift
normalized = original % (2*pi)
````

とかではダメなのでしょう?

問題は、上記の`pi`は円周率そのものではなく、近似値に過ぎないということそのものにあります。本物より最悪 [epsilon] / 2 ずれているのですから、「一回転」ごとにこれが蓄積することになります。一回転や二回転ならとにかく、何万、何億、何兆回転もすればもう「元の角度」なんかわからなくなります。非現実的な数字?なにをおっしゃいます。たかが一年でも1000万π秒もあるのですぞ。

[epsilon]: https://en.wikipedia.org/wiki/Machine_epsilon

「それって`atan2(cos(theta), sin(theta))`とかで行けね?」といった方、さすがですね。しかしPONSでは、その`cos`と`sin`こそが`wrapAngle`を必要としていたのでした?そのために`cos`と`sin`を使うのでは本末転倒です。さあどう数る?

結局PONSで採用したの、ある意味最も豪快な方法でした。

````swift:wrapAngle
 public static func wrapAngle(x:Self, precision px:Int = 64)->Self {
        var angle = x
        let onepi = pi(px)
        if angle < -2*onepi || +2*onepi < angle {
            let precision = px + angle.toMixed().0.msbAt
            let twopi = 2*pi(precision)
            angle = angle % twopi
            angle.truncate(px)
        }
        if angle < -onepi { angle += 2*onepi }
        if +onepi < angle { angle -= 2*onepi }
        return angle
    }
````

なんのことはない、「`M_PI`が正しくなければ、もっといい値を使えばいいのに」というわけです。そのために必要とあらば、PONSはπを必要な精度まで計算しなおします。どれくらいの精度が必要?n回転ならlog2(n)倍ですか。見ての通り、n回転ではなくnラジアンで見積もっているので、必要な精度よりも少し過剰気味に計算していることにはなりますが、そのためにわざわざlog2(n)を計算するより、整数部分のビットを数えた方がずっと安価なのでそうしています。

余談ではありますが、PONSではπをはじめとする定数はメモ化してます。精度が足りない時だけ再計算し、足りていればキャッシュから低精度版を生成しています。ここでも面白いノウハウを見つけたのですが、別記事にしましょう。

そうした工夫の甲斐あって、PONS搭載の初等関数は、`±DBL_MIN`から`±
DBL_MAX`に至るまで、`libc`の初等関数と倍精度で比較して最終ビット以外すべて一致します。

````shell:REPL
29> Double.cos(DBL_MAX) 
$R23: Double = -0.99998768942655991
 30> BigFloat.cos(BigFloat(DBL_MAX)).toDouble()
$R24: Double = -0.99998768942655991
````

「最終ビット以外」というのは、PONSの方が高精度で計算する分、丸め誤差が健在化するため。そのため test suite を書くのも一苦労ではありました。

`Double`にとっては`DBL_MAX`の先に待っているのは`inf`しかないのですが、PONSの`BigFloat`なら、その先にも行けます。

````shell:REPL
 42> DBL_MAX*2 
$R35: Double = +Inf
 43> (BigFloat(DBL_MAX)*2).description 
$R36: String = "359538626972463141629054847463408713596141135051689993197834953606314521560057077521179117265533756343080917907028764928468642653778928365536935093407075033972099821153102564152490980180778657888151737016910267884609166473806445896331617118664246696549595652408289446337476354361838599762500808052368249716736.0"
````

````shell:REPL
 44> Double.cos(DBL_MAX*2) 
$R37: Double = NaN
 45> BigFloat.cos(BigFloat(DBL_MAX)*2).toDouble() 
$R38: Double = 0.99995075800934008
````

とりあえず倍先まで行ってみました。計画通り!


それではなぜPONSの三角関数が`wrapAngle`を利用するようになったのか。続きは次の記事で。

Dan the Transcendental Coder
Unity ボタンのクリックと画面のタップを排他制御する。


　■下記ページを参照しました、めっちゃ助かりました。
　http://denshikousaku.net/unity-memo-4

　■return results.Count > 0の部分はいろいろ検討の余地あり、
　テクスチャーが裏に１枚入れば、
　それだけでカウントは１になる。

    /// <summary>
    /// タップ位置にオブジェクトが存在するか？
    /// </summary>
    /// <returns></returns>
    private bool IsPointerOverUIObject()
    {
        PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current);
        eventDataCurrentPosition.position = new Vector2(Input.mousePosition.x, Input.mousePosition.y);

        List<RaycastResult> results = new List<RaycastResult>();
        EventSystem.current.RaycastAll(eventDataCurrentPosition, results);
        return results.Count > 0;
    }


    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            if (!IsPointerOverUIObject())
            {
                // タップ位置に何も存在しない
            }
        }
    }
AzureWebAppsのスロットごとにNode.jsのconfig設定を使い分ける

# 背景
- デプロイスロットごとにテストのためにDB接続やメール設定を変えたい。
- node-configを使って実現できそう。

# 準備
## node-config
node-config自体の詳細はGithubを参照(https://github.com/lorenwest/node-config)
package.jsonのdependenciesにある状態で、azureにPushしてください。

```
npm install node-config --save
```

# Azureの設定
- NODE_ENV : default.json, staging.jsonなどの名前部分を設定します。
- NODE_CONFIG_DIR : configファイルを置く場所を設定します。以下の例では"..\config"フォルダに格納されている**.jsonがNODE_ENVの値に応じて読み込まれます。

![node-config.PNG](https://qiita-image-store.s3.amazonaws.com/0/67206/05090f71-67ff-6624-c139-d7c234b94d77.png)
Movable Type for AWS のインスタンス起動後にやることまとめ


Movable Type for AWS は、AWS Marketplsce で提供している Movable Type のライセンス形態の一つですが、AWS Marketplace が US のサービスであることも相まって、東京リージョンで起動した場合でも、Timezone などが日本にはなっていません。

ということで、インスタンスを起動して Movable Type のセットアップを開始する前にやっておくこと、やったほうがいいことのまとめです。

Movable Type for AWS を利用するまでは、[これ](http://www.sixapart.jp/movabletype/aws/how-to-use.html)を見ればいいと思う。

# 最新パッケージにアップデート
Movable Type for AWS は、最新の Amazone Linux をベースに構成されていますが、Amazone Linux 自体パッケージの更新は頻繁に行われているので、まずは最新のパッケージに更新しましょう。

````console
$ sudo yum clean all
$ sudo yum update -y
````


# タイムゾーンの変更
デフォルトでは UTC になっているので、Asia/Tokyo に。もちろん、Tokyo じゃない都市ならそれに。バックアップは各自随意に。

## /etc/localtime の変更

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

## /etc/sysconfig/clock の変更
任意のエディタでファイルを開いて書き換えます。

````console
$ sudo vi /etc/sysconfig/clock
````

以下のように変更

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

# mt-config.cgi の変更
mt-config.cgi は、インスタンス起動直後にすでに作成されていますが、こちらも US モード全開なので、日本向けに変更します。

任意のエディタでファイルを開いて書き換えます。

```` console
$ sudo vi /app/movabletype/mt-config.cgi
````

以下の内容を追記（場所はどこでも。まあ、一番最後にでも）

````mt-config.cgi
DefaultLanguage ja
````

# 再起動
諸々の変更を適用するためにサーバーを再起動します。

````console
# sudo reboot
````

再起動が完了したら、http:// *your-host* /mt/admin にアクセスして Movable Type のセットアップを開始しましょう。

# 以下、やっておいたほうがいいもの
セキュリティに配慮する場合、以下のこともやっておいたほうがいいです。
具体的な方法は Qiita にいっぱいあるよ。

* いらないサービスを停止する
* ec2-user アカウントを削除して独自のアカウントにする
* sshd のポート変更
gitのTab補完とプロンプト設定

# gitのTab補完とプロンプト設定

### 環境
* CentOS 7
* Git 2.5.0

### インストール

#### ファイルの場所について
   * ソースからインストールした場合
   `git-[version]/contrib/completion`からコピーします。

   * ファイルがない場合
   [GithubのGitリポジトリ](https://github.com/git/git)から使っているバージョンのファイルをダウンロードします。

```sh
wget https://raw.githubusercontent.com/git/git/v2.5.0/contrib/completion/git-completion.bash
wget https://raw.githubusercontent.com/git/git/v2.5.0/contrib/completion/git-prompt.sh
```

#### ファイルをコピーしてインストール

```shell-session
cp /usr/local/src/git-2.5.0/contrib/completion/git-completion.bash ~/.git-completion.bash
cp /usr/local/src/git-2.5.0/contrib/completion/git-prompt.sh ~/.git-prompt.sh
```

### 設定

以下の設定をホームディレクトリの.bashrcに追記します

```sh:.bahsrc
# Source git completion
if [ -f ~/.git-completion.bash ]; then
    . ~/.git-completion.bash
fi

# Source git prompt
if [ -f ~/.git-prompt.sh ]; then
    # リポジトリの状態によって表示が変わる設定を有効にする
    GIT_PS1_SHOWDIRTYSTATE=1
    . ~/.git-prompt.sh
    PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
fi
```

保存後、`. ~/.bashrc`でソースを有効にする

### git <tab>で補完でき、リポジトリ内に移動するとプロンプトにカレントブランチ名が表示されたりする。

```git:completion
[root@localhost myapp (develop)]# git push origin origin/<tab>
origin/develop   origin/master
```

```git:prompt
[root@localhost www]# cd myapp
[root@localhost myapp (master)]# git co develop
[root@localhost myapp (develop)]# vi README.md
[root@localhost myapp (develop *)]# git add .
[root@localhost myapp (develop +)]# git commit -m "Add tooltips to README.md"
[root@localhost myapp (develop)]#
```

べんり
Macを手に入れたらやること


自分用。開発環境が変わった時にひとまず何も考えずにやる作業リスト。自動化できそう。


## System Preference

- General
    - Show scroll bars: Always
- Keyboard
	- Keyboard
		- Modifier Keys
			- Caps LockをControlに当てる
	- Text
		- Correct spelling automatically
		- Capitalize words automatically
		- Add period with double-space
		- Spelling: U.S.English
		- Use smart quotes and dashes: **OFF**

		
	- Shortcuts
		- Full Keyboard Access: All Controls		- Keyboard
			- Move focus to next window: **Command+`**
		- Input Sources
			- Select the previous input source: **Command+Space**
		- Spotlight
			- Show Spotlight Search: **Control+Space**
				

- Mission Control
	- Automatically rearrange Spaces based on most recent use: **OFF**
	- Dashboard: As Overlay

- Date & Time
	- Timezone
		- Set time zone automatically using current location
	- Clock
		- Display the time with seconds
		- Use 24-hour clock
		- Show the day of the week
		- Show date
- Desktop & Screen Saver
    - Screen Saver
        - Start after **10** Minutes
        - Show with clock
- Security & Privacy
	- General
		- Require password **immediately** after sleep on screen saver begins
- Bluetooth
	- Show Bluetooth in menu bar
- Network
	- WiFi > Advanced > DNS
		- add 8.8.8.8
- Sound
	- Sound Effects
                - Select an alert sound: Submarine
		- Play user interface sound effects: **OFF**
- Energy Saver
    - Show battery status in menu bar
- Displays
    - Night Shift
        - 適当に設定
		
### トラックパッド使う場合
- Trackpad
	- Point & Click
		- Tap to click
- Accessbility
	- Mouse & Trackpad
		- Trackpad Options
			- Enable Dragging without drag lock
		

		
## Terminal
- Profiles
	- Homebrewを選ぶ
	- Text
		- Font Size: 18pt
		- Antialias text
	- Windows > Background > Color & Effects > Opacityを適当に調整
	- Advanced > Audible bell: **OFF**
	- ANSI Colorsを黒背景に埋もれないように適当にいじる

## Finder
- Advanced
    - Show all filename extensions
    - Remove items from the Trash after 30 days
    - When performing a search: **Search the Current Folder**

## インストールするもの
- Chrome
	- デフォルトブラウザにする
	- メニューのChrome > Warn before Quitting
- Google日本語入力
	- ひらがなだけにする

- Evernote
- Slack
- Homebrew
- Dropbox
- Vim関連
	- NeoBundle
	- Pathogen

## その他
- 自分のdotfilesをgithubからgit cloneしてsymlink貼る

- screenshot保存先変更

```
$ defaults write com.apple.screencapture location ~/Pictures/
$ killall SystemUIServer
```
知ってるとちょっと便利なMacの固有コマンド


地味に便利なおもしろコマンドが割とあるのでまとめてみるよ
よく使う順（思いついた順）で書いていくよ

## open
Finderでダブルクリックするのとほぼ同じ

### ディレクトリパスを指定するとFinderが開く
`open ~/Downloads`

### ファイルを指定するとデフォルトアプリで開く
`open ~/Downloads/index.html`

### -a でアプリ指定も可
`open -a /Applications/Firefox.app ~/Downloads/index.html`

### .appは省略可能、また/Applicationsの下ならパスも省略可能
`open -a Firefox ~/Downloads/index.html`

### URLも開ける
`open https://www.facebook.com/`

### ぐぐれる
`open "http://www.google.co.jp/search?q=kobito"`

### 辞書アプリも開ける
`open dict://apple`

### 参考
+ [MacWiki](http://macwiki.osdn.jp/wiki/index.php/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/open)

## pbcopy
クリップボードにコピーする

### 作業ディレクトリのパスをコピー
`pwd | pbcopy`

### ファイルのフルパスをコピー
`ls -d $PWD/index.html | pbcopy`

### 日付をコピー
`date "+%H%M%S" | pbcopy`

### おまけ(zsh)
`alias -g C='| pbcopy'` というグルーバルエイリアスを設定しておくと
`pwd C`って感じに出来るので便利

## pbpaste
pbcopyほど使いどころが見つからないけどセットっぽいので...

### クリップボードの中身をファイルにする
`pbpaste > 作業ログ.txt`

## qlook
QuickLookで見る（FinderでSpaceキー押すやつ）

### ファイル参照
`qlmanage -p ~/Downloads/index.html`

### 参考
+ MarkdownをHTMLにして見る事が出来るプラグインを入れておくと良い
 + プラグインは何種類かあるので試してみると良いかも

## say
発声してくれるので「これなんて読むんだ？」って時に使える

### デフォルトボイス
`say Hello`

### ボイス指定
`say -v Princess Hello`

### 参考
+ [MacWiki](http://macwiki.osdn.jp/wiki/index.php/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/say)

## mdfind
コマンドライン版Spotlightらしい
最近知ったので使い方は模索中...

### ファイル検索
`mdfind index.html`

### 参考
+ [MacWiki](http://macwiki.osdn.jp/wiki/index.php/OSX%E3%81%AE%E5%9B%BA%E6%9C%89%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89#mdfind_--_Spotlight_.E3.81.AE.E3.82.B3.E3.83.9E.E3.83.B3.E3.83.89.E7.89.88)

## 他
### Total Tarminal
+ これがないと生きていけない
+ 上から（設定次第）ターミナルがシュッと出てくる

### percol(peco)
+ これがないと生きていけない
+ 標準入力の絞り込みコマンド
 + python製
+ peco
 + 後継ツール?
 + Go製

### 参考
+ 調べている時に[こんなページ](http://macwiki.osdn.jp/wiki/index.php/OSX%E3%81%AE%E5%9B%BA%E6%9C%89%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89)を見つけた
Mac OSXでSlackアプリが落ちる（開けない）ときの対処法

# 症状

Mac（私の環境はOSX 10.9.5）でSlackのアプリを何回開いても、メッセージを読み込んでるときに予期せぬ理由で終了する。

挙動を細かく見ると、特定のチャンネルのメッセージを読み込むときに落ちている感じでした。

何がきっかけでこの症状になったのかは全然わかりません。

# 対策

以下の記事に対策が載っていました。
http://www.cpierce.org/2015/09/slack-wont-open-or-you-need-to-clear-your-settings-from-a-computer/

Slackアプリのユーザー情報が`~/Library/Containers/com.tinyspeck.slackmacgap`に入っているので、こいつをフォルダごと消してSlackアプリを再インストールしたら直りました。

記事内にもあるように`~/Library/Preference`や`~/Library/Application Support`とか以外に、`~/Library/Containers`っていうとこにもアプリのユーザー情報が入ってるとか全然知らなかったので結構悩みました。


※追記(2016-02-28)：解決したと思ったら、特定のチャンネルを追加したらまた落ちるようになりました。。もうこのチャンネルだけはアプリに追加せずにWebブラウザで見るようにするしかないようです。。
複数ログの目視監視

複数のログを目視監視したいとき、Poderosa でタブをたくさん開いて tailf でも良いけど。

> watch -n 1 "tail -n 10 log/case1-*.log"

n秒ごとに更新してくれて、しかも画面がチラつかない。

DeepLearning等時間のかかる実験を複数走らせているときに、途中経過を見るのに便利。