OmniAICreator/Qiita-1.07M huggingface dataset:
react-router v4 でtransitionTo()を使う(HOCパターン版もあり)

react-routerのv4で例えば何かの処理で分岐して遷移を行いたい場合、context.router.transitionTo()を使うことになる。
以下参考
http://stackoverflow.com/questions/39894547/navigating-programatically-in-react-router-v4

ただ、各コンポーネントがcontextに依存するのがなんとなく気持ち悪く感じたのでHOCで改善するやり方も考えてみた。

## サンプルコード(contextをそのまま使う場合)

```Root.js
// 省略 
import { BrowserRouter, Match } from 'react-router';
// 省略 
class Root extends Component {
// 省略 
  return (
    <BrowserRouter>
      <Match exactly pattern="/" component={Home} />
      <Match exactly pattern="/sub" component={Sub} />
    </BrowserRouter>
  );
}
// 省略

```

```Home.js

class Home extends Component {
// 省略
  // contextから取得したいものを定義する。
  static get contextTypes() {
    return {
      router: PropTypes.object.isRequired,
    };
  }
  onClick() {
    this.context.router.transitionTo('/sub');
  }
  return (
    <div>
      <button
        onClick={this.onClick}
      >click</button>
    </div>
  );
}
// 省略

```

## サンプルコード(HOC版)

withRouter関数を定義する。
これによりpropsにrouterが追加される。

```withRouter.js
import React, { Component, PropTypes } from 'react';

const withRouter = (WrappedComponent) => {
  return class WithRouter extends Component {
    static get contextTypes() {
      return {
        router: PropTypes.object.isRequired,
      };
    }
    render() {
      return <WrappedComponent {...this.props} router={this.context.router} />;
    }
  };
};

export default withRouter;
```

```Home.js
// 省略
import withRouter from './path/withRouter';
// 省略
Class Home extends Component {
  onClick() {
    this.props.router.transitionTo('/sub');
  }
  return (
    <div>
      <button
        onClick={this.onClick}
      >click</button>
    </div>
  );
}

// withRouterの引数にHomeを渡す。
export default withRouter(Home);
```

HOCを複数適用したい時は(flux-utilsのContainerとか)lodashのflowRight()を使うと見やすくなる。

```
export default _.flowRight([
  withRouter,
  Container.create,
])(Home);
```

_.flowRightで参考にした記事
http://qiita.com/numanomanu/items/2b66d8b2887d44f857dc
kintone 電子回路シミュレータ 10進カウンター作成

#kintone 電子回路シミュレータ 10進カウンター作成

kintone 電子回路アプリで、部品登録まで、出来るようになったので基本的なカウンターを作ってみます。

#JK-FF 16進カウンター作成

16進カウンターは、FF をつなげるだけなので簡単です。

![2017-01-09_17h03_27.png](https://qiita-image-store.s3.amazonaws.com/0/100572/6e540039-36be-050e-798d-6597b7a25eee.png)

#JK-FF 10進カウンター作成

10進カウンターは、10 になったら 0 に戻すロジックが必要です。

![2017-01-09_16h58_48.png](https://qiita-image-store.s3.amazonaws.com/0/100572/5ae9b959-76e5-07a0-4c6e-ef272bfea078.png)

#クリア機能付き10進カウンターの作成

次にクリア機能付き10進カウンターを作成してみます。
ただし、標準の JK-FF にクリア端子がありませんので　CLR 付き JK-FF 部品から作成していきます。

#標準のJK-FF

まず、SimcirJS 標準で登録されている JK-FF を調べてみます。
残念ながらCLR 端子がありません。

![2017-01-09_15h06_50.png](https://qiita-image-store.s3.amazonaws.com/0/100572/ed46edc2-c905-044a-a028-340c5cb46f31.png)


#JK-FF CLR PRE　の作成

DC、入出力端子などは、標準のJK-FF を参考にして、CLR 端子付きのJK-FF を作成します。
論理回路部分は、ネット上の回路図を参考にしました。
何十年ぶりの回路図なので、一から作るのはすぐにあきらめました。
とりあえず、動作検証すると大丈夫そうです。CLR、PRESET 動作も問題ありません。
部品を配置して、スイッチをパチパチ（クリックなので実際にはカチカチ）すると簡単に動作確認できるのは素晴らしい。

部品が多くなると、線が交差してかなり見通しが悪くなります。
Join を使うともう少し見やすくなるのかもしれません。

![2017-01-09_15h11_51.png](https://qiita-image-store.s3.amazonaws.com/0/100572/9016b3a6-7c57-3207-44db-82e6632bf11a.png)


#JK-FF CLR PRE を部品として登録
早速、作成したJK-FF CLR PREを部品登録（JK-FF CP）します。
作業は、部品グループアプリのサブテーブルに、部品として登録するだけです。

![2017-01-09_15h26_56.png](https://qiita-image-store.s3.amazonaws.com/0/100572/1a0e7c20-3de9-2f1b-6fb0-de5ec9fe971c.png)

#JK-FF CP部品を使ってみる

新規レコード追加画面で、部品グループを指定すると、ToolBox にJK-FF CPが表示されます。
これをスイッチ類と一緒に配置して、動作検証すると、ちゃんとJK-FF として動作するのが確認できます。

![2017-01-09_15h32_11.png](https://qiita-image-store.s3.amazonaws.com/0/100572/a2ba1f18-635c-9b6c-246b-5c4205dfd227.png)

#クリア付き10進カウンター作成

最初の10進カウンターと同じように並べて、CLEAR機能を追加します。
ついでにSTART/STOP ボタンを付けると、１桁のストップウオッチになります。
ちょっと複雑なロジックでも部品として登録することで、より複雑な機能を実現できます。

![2017-01-09_16h38_44.gif](https://qiita-image-store.s3.amazonaws.com/0/100572/db8f111a-374a-31c2-461d-aaa24534992a.gif)
GetObject(, "Excel~")だけで無く、GetObject(ファイル名)も活用しよう

# はじめに
> [GetObject([*PathName*][, *Class*])](https://msdn.microsoft.com/ja-jp/library/cc410234.aspx "GetObject 関数")

GetObjectの第1引数指定時の動作を知っておくと、便利な場面もあるという話。

# 具体例

Excel外部から特定のExcelファイル（例：C:\hoge.xlsx）を操作する場合、以下のような記述をしたとする。

```vb
Dim fileName As String
fileName = "C:\hoge.xlsx"

Const XlProgID$ = "Excel.Application"
Dim xlApp As Object 'As Excel.Application

On Error Resume Next
    Set xlApp = VBA.GetObject(, XlProgID)
On Error GoTo 0

If xlApp Is Nothing Then
    Set xlApp = VBA.CreateObject(XlProgID)
End If

Dim myWorkBook As Object 'As Excel.Workbook
Set myWorkBook = xlApp.Workbooks.Open(fileName)
```

対象のファイルがすでにExcelで開かれているとき、この記述だと以下のような問題が発生する。

+ 2重に開くことになるので存在判定が必要
+ Excelが複数起動している場合、GetObjectで取得したExcelとは別のExcelでファイルが開かれている可能性がある（読み取り専用で開かれる）

## GetObject(*PathName*)を使うと

上の記述はGetObject(*PathName*)を使用することで以下のようにできる。

```vb
Dim fileName As String
fileName = "C:\hoge.xlsx"

Dim myWorkBook As Object 'As Excel.Workbook
Set myWorkBook = VBA.GetObject(fileName)

Dim xlApp As Object 'As Excel.Application
Set xlApp = myWorkBook.Application
```

# GetObject(*PathName*)の動作（例：Excel）

## Excelが起動していない場合

Excelを非表示で起動し、対象のファイルを非表示状態で開く。
開いたファイル（Excel.Workbook）を返す。

## Excelが起動しているが、対象のファイルが開かれていない場合

すでに起動しているExcelのインスタンスで、対象のファイルを非表示状態で開く。
開いたファイル（Excel.Workbook）を返す。

## Excelが起動していて、対象のファイルが開かれている場合

現在開かれている対象のファイル（Excel.Workbook）を返す。

複数のExcelが起動していても、現在編集中のファイルが捕捉される。



# メリット

確実に対象のファイルを捕捉できる。

# デメリット

テンプレート（.xltxなど）の場合、新規作成では無くテンプレートそのものを開いてしまう。

インターネット上のファイル（OneDrive上など）にはうまく動作しない。
CでIFTTTのMaker にProxy経由でアクセスする

#はじめに
C言語でIFTTTのMakerチェンネルにProxy越えでアクセスする方法

#コード
http://qiita.com/edo_m18/items/cef278d0c14d1371db3b を参考にしています。

```
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/param.h>
#include <unistd.h>

#define proxy_url "*******" //Proxyサーバの名前を入力
#define proxy_port 8080

#define BUF_LEN 256

struct URL {
    char host[BUF_LEN];
    char path[BUF_LEN];
    char query[BUF_LEN];
    char fragment[BUF_LEN];
    unsigned short port;
};

int main(int argc, char **argv) {

    // ソケットのためのファイルディスクリプタ
    int s;

    // IPアドレスの解決
    struct addrinfo hints, *res;
    struct sockaddr_in *addr_in;
    struct in_addr addr;
    int err;

    // サーバに送るHTTPプロトコル用バッファ
    char send_buf[BUF_LEN];
    struct URL url = {
         "maker.ifttt.com",
         "/trigger/*****/with/key/*******","","",80
    }; //内容は適宜変更

    printf("http://%s%s%s を取得します。\n\n", url.host, url.path, url.query);

     // 0クリア
     memset(&hints, 0, sizeof(hints));
     hints.ai_socktype = SOCK_STREAM;
     hints.ai_family   = AF_INET;

     char *serviceType = "http";

#ifdef proxy_url
    if ((err = getaddrinfo(proxy_url, serviceType, &hints, &res)) != 0){
        printf("error %d\n", err);
        return 1;
    }
#else
    if ((err = getaddrinfo(url.host, serviceType, &hints, &res)) != 0) {
        printf("error %d\n", err);
        return 1;
    }
#endif

    // ソケット生成
    if ((s = socket(res->ai_family, res->ai_socktype,res->ai_protocol)) <0) {
         fprintf(stderr, "ソケットの生成に失敗しました。\n");
         return 1;
     }

#ifdef proxy_port
     addr_in = (struct sockaddr_in *)(res -> ai_addr);
     addr_in -> sin_port=htons(proxy_port); #endif

     // サーバに接続
     if (connect(s, res->ai_addr, res->ai_addrlen) != 0) {
         fprintf(stderr, "connectに失敗しました。\n");
         return 1;
     }

     // HTTPプロトコルの開始 ＆サーバに送信
#ifdef proxy_url
    sprintf(send_buf, "POST http://%s%s%s HTTP/1.0\r\n", url.host, url.path, url.query); #else
    sprintf(send_buf, "POST %s%s HTTP/1.0\r\n", url.path, url.query);
#endif
    write(s, send_buf, strlen(send_buf));
    sprintf(send_buf, "Host: %s:%d\r\n", url.host, url.port);
    write(s, send_buf, strlen(send_buf));

    sprintf(send_buf, "\r\n");
    write(s, send_buf, strlen(send_buf));
    // 受信が終わるまでループ
    while(1) {
        char buf[BUF_LEN];
        int read_size;
        read_size = read(s, buf, BUF_LEN);

        if (read_size > 0) {
            write(1, buf, read_size);
        }
        else {
            break;
        }
    }

    // ソケットを閉じる
    close(s);
    return 0;
}

```
文字列前後の全角スペースを除去する (python)

小ネタです．

```py:test.py
line = ' 　本日の天気は晴天なり　晴天なり　 '
NG_example = line.strip()    # '　本日の天気は晴天なり　晴天なり　'
OK_example = unicode(line).strip()    # u'本日の天気は晴天なり　晴天なり'
OK_example2 = line.decode('utf-8').strip().encode('utf-8')    # '本日の天気は晴天なり　晴天なり'
```
MacVimでフォントとテーマを設定するminimum example

```vim:.gvimrc
set guifont=Fira\ Code\ Retina:h12
" set linespace=2.5
colorscheme solarized
```

* `set guifont=（フォント名）:h（フォントサイズ）`
    * フォント名にスペースが入る場合はエスケープします
        * 例: `SF\ Mono\ Semibold` とか
* `set linespace=x.x` とすると行間を設定できます
* `colorscheme （テーマ名）
    * vimrcと同じです
CでMQTTを利用する。

##OS
Ubuntu

##内容
IFTTTの下りをProxy越えをするのにBeebotteを経由してMQTTで行おうと思って試しましたが、MQTTのProxy越えはできませんでした。Proxyなしでは動いたのでメモを残します。

CではないですがProxy越えが出来るパターン（Webを利用）
http://qiita.com/NextWorld/items/d3b3d382fc658b244273

**以降メモ**
http://qiita.com/mayfair/items/e761c788a9d8787bc610
を元にBeebotteを設定。
IFTTTからBeebotteへのデータの注意
http://qiita.com/yacchin1205/items/29d31707a535eeb85a96

PahoのCをインストール

以降は
http://www.eclipse.org/paho/files/mqttdoc/Cclient/subasync.html
を書き直して見ました。

```
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "MQTTClient.h"

#define ADDRESS     "tcp://mqtt.beebotte.com:1883"
#define CLIENTID    "test"
#define TOPIC       "ifttt/action"
#define PAYLOAD     "{\"params\":{\"content\":\"from C\"}}"
#define TOKEN	    "token:*****" \\*****にtokenを書く
#define QOS         1
#define TIMEOUT     10000L

volatile MQTTClient_deliveryToken deliveredtoken;

void delivered(void *context, MQTTClient_deliveryToken dt)
{
    printf("Message with token value %d delivery confirmed\n", dt);
    deliveredtoken = dt;
}

int msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message)
{
    int i;
    char* payloadptr;

    printf("Message arrived\n");
    printf("     topic: %s\n", topicName);
    printf("   message: ");

    payloadptr = message->payload;
    for(i=0; i<message->payloadlen; i++)
    {
        putchar(*payloadptr++);
    }
    putchar('\n');
    MQTTClient_freeMessage(&message);
    MQTTClient_free(topicName);
    return 1;
}

void connlost(void *context, char *cause)
{
    printf("\nConnection lost\n");
    printf("     cause: %s\n", cause);
}

int main(int argc, char* argv[])
{
    MQTTClient client;
    MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
    int rc;
    int ch;

    MQTTClient_create(&client, ADDRESS, CLIENTID,
        MQTTCLIENT_PERSISTENCE_NONE, NULL);
    conn_opts.keepAliveInterval = 20;
    conn_opts.cleansession = 1;
    conn_opts.username = TOKEN; //ADD

    MQTTClient_setCallbacks(client, NULL, connlost, msgarrvd, delivered);

    if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS)
    {
        printf("Failed to connect, return code %d\n", rc);
        exit(-1);       
    }
    printf("Subscribing to topic %s\nfor client %s using QoS%d\n\n"
           "Press Q<Enter> to quit\n\n", TOPIC, CLIENTID, QOS);
    MQTTClient_subscribe(client, TOPIC, QOS);

    do 
    {
        ch = getchar();
    } while(ch!='Q' && ch != 'q');

    MQTTClient_disconnect(client, 10000);
    MQTTClient_destroy(&client);
    return rc;
}
```
コンパイルは ```gcc ソース -lpaho-mqtt3c```で行う。
Swiftで正規表現を使って文字列を置換する

`String.replacingOccurrences`のオプションに`.regularExpression`を指定します。また、後方参照は`\1`や`{1}`でなく`$1`です。以下、twitterのプロフィール画像URLを置換する例です。

```swift
extension String {
    func twttrPhoto() -> String {
        return replacingOccurrences(
            of: "^https?://(.+)_normal(.+)$",
            with: "https://$1$2",
            options: .regularExpression,
            range: self.range(of: self))
    }
}
```

```swift
let url = "http://pbs.twimg.com/profile_images/1610656772/nTotani_normal.jpg"

url.twttrPhoto()
// => https://pbs.twimg.com/profile_images/1610656772/nTotani.jpg
```

先頭が`https`になり、`_normal`が取り除かれています。
Mac(El Capitan)にpythonのデータ分析環境を構築

Mac(El Capitan)でpythonを使ってデータ分析をするための環境を構築します。

# 事前準備

## homebrew
http://brew.sh/index_ja.html
macのパッケージ管理ツールであるhomebrewをインストールします。

```bash
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

## homebrew cask
https://caskroom.github.io/

後述のminicondaがhomebrewには存在していないため、homebrew caskをインストールします。

```bash
$ brew tap caskroom/cask
```

## miniconda
http://conda.pydata.org/docs/

仮想環境を管理するためのツールとしてminicondaをインストールします。

```bash
$ brew cask install miniconda
```

インストールしたminicondaにPATHを通すため、.bash_profile等に以下の記述を追加します。`<user_name>`を任意のユーザに置き換えてください。

```bash:~/.bash_profile
export PATH="/Users/<user_name>/miniconda3/bin:$PATH"
```

pythonの環境管理ツールは色々あるようですが、今のところcondaだけでも不便はしていません。
不便な点をご存知の方は教えてください。


# 仮想環境の構築
minicondaで分析するための仮想環境を作ります。
環境作成時に必要なパッケージを指定するとインストールされます。pandas, numpy, matplotlib, scikit-learn, jupyter等でしょうか。基本的にはanacondaで全部入ります。

```bash
$ conda create -n testenv python=3 anaconda
```

仮想環境に切り替えます。プロンプトの先頭に(環境名)が表示されます。

```bash
$ source activate testenv
(testenv) $
```

仮想環境から元の環境に戻る時は以下の通り。

```bash
(testenv) $ source deactivate
$
```

# 追加パッケージのインストール
## conda
仮想環境にパッケージを追加したい時はcondaで探してインストールできます。

```bash
(testenv) $ conda search graphviz
Fetching package metadata .......
graphviz                     2.38.0                        2  defaults        
                             2.38.0                        3  defaults        
                             2.38.0                        4  defaults        
(testenv) $ conda install graphviz
```

探して見つからなくてもGoogleで検索して見つかればchannelを指定してインストールすることもできます。
jupyter notebook起動時に"No module named 'nbbrowserpdf'"という警告が出るので、インストールしてみます。

```bash
(testenv) $ conda install --channel anaconda-nb-extensions nbbrowserpdf
```

## pip
それでも見つからない、またはcondaで希望のバージョンが提供されていない、などであれば、pipを使ってその仮想環境にパッケージをインストールすることもできます。

```bash
(testenv) $ pip install tansorflow
```

# その他
## Jupyter notebookのTips

* 数式の横に表示される縦棒を消す

```py3:~/.jupyter/jupyter_notebook_config.py
c.NotebookApp.mathjax_url = 'https://cdn.mathjax.org/mathjax/latest/MathJax.js'
```

* コードと出力のフォントを変更

```css:~/.jupyter/custom/custom.css
.CodeMirror pre, .output pre { font-family: "Source Han Code JP", monospace; }
```

* 拡張機能のメニューを追加

```bash
$ conda install -c conda-forge jupyter_contrib_nbextensions
```
Google App Engine / Python Standard Environment の Runtimeバージョン

## この記事の要旨

Google App Engine / Pythonで・・・

- 「Standard Environment」のPythonバージョンは2.7.5
- 「Flexible Environment」のPythonバージョンは2.7.9 (と3.5.2)

(2017年1月9日現在)


## 解説
 
ちょっとハマったので個人メモ。

Google App Engineには「Standard Environment」と「Flexible Environment」の2種類がある。詳細は省くが、「Standard Environment」には[1日28時間分のインスタンス起動について無料枠](https://cloud.google.com/appengine/docs/quotas#Instances)があり、ちょっとぐらいの使用であれば無料で「Standard Environment」を使用していられる。

で、各環境のRuntimeで使用できるPythonのバージョンは何か？を調べると、「Flexible Environment」は[ドキュメント](https://cloud.google.com/appengine/docs/flexible/python/runtime)に書かれているものの・・・
![スクリーンショット 2017-01-09 15.34.26.png](https://qiita-image-store.s3.amazonaws.com/0/107160/a92fd53f-4078-2f44-2e79-eb98cc166447.png)

「Standard Environment」についてはドキュメントが無かったので、「sys.version_info」をログで吐き出させて調べてみた。

```
sys.version_info(major=2, minor=7, micro=5, releaselevel='final', serial=0)
```

Pythonのバージョンは2.7.5でした。

(2018/03/24 追記)

```
sys.version_info(major=2, minor=7, micro=12, releaselevel='final', serial=0)
```
ということで今は2.7.12に更新されている模様。


* * *

ここからは個人的なハマったポイントなのだが。

hmacを使用する際・・・

>digest() の出力結果と外部から供給されたダイジェストを検証ルーチン内で比較しようとするのであれば、タイミング攻撃への脆弱性を減らすために、 == 演算子ではなく compare_digest() を使うことをお奨めします。

というのだが、このcompare_digest()が使用できるのは2.7.7以降だったりする。当然、「Standard Environment」でこのメソッドを使うとエラーになる。
pipでpyAudioインストール時にはまった回避策。

#問題
pyaudioインストール時にはまりました。

```
sudo pip install pyaudio
```

```
  cc -fno-strict-aliasing -fno-common -dynamic -arch x86_64 -arch i386 -g -Os -pipe -fno-common -fno-strict-aliasing -fwrapv -DENABLE_DTRACE -DMACOSX -DNDEBUG -Wall -Wstrict-prototypes -Wshorten-64-to-32 -DNDEBUG -g -fwrapv -Os -Wall -Wstrict-prototypes -DENABLE_DTRACE -arch x86_64 -arch i386 -pipe -DMACOSX=1 -I/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c src/_portaudiomodule.c -o build/temp.macosx-10.12-intel-2.7/src/_portaudiomodule.o
  src/_portaudiomodule.c:29:10: fatal error: 'portaudio.h' file not found
  #include "portaudio.h"
  ^
  1 error generated.
  error: command 'cc' failed with exit status 1
```

portaudio.hが見つからないと言われて落ちます。
ところがpyaudioで必要とされるportaudioは、macportでインストール済みです。。

```
port list portaudio
portaudio                      @19.20140130    audio/portaudio
```

#回避策
なぜかpipがportaudioを見つけられてないことが問題です。
portのデフォルト/opt/local/以下にあることを確かめた上で、

```
sudo env LDFLAGS="-L/opt/local/lib" CFLAGS="-I/opt/local/include" pip install pyaudio
```

として直接指定してあげることでインストールできました。
terminalで私が一番みやすい設定

##自分用のメモ
###デフォルトデザイン
Pro

### フォント
* ファミリー : Menio
* 書体 : レギュラー
* サイズ : 13
* 文字間隔 : 0.996
* 行間隔 : 1

### テキスト
* ボールドフォントを使用
* 点滅テキストの使用を許可
* ANSIカラーを表示

### カーソル
ブロック

こんなもんかな。。。
入門書を読み終わったらゲームを作ろう　#1「数当てゲームをつくる」

某所の某ゲーム制作系Wikiに「段階別学習」という記事があったのですが、先日久しぶりにアクセスしてみたら消失してしいて、スパムの巣窟になっていました。サルベージも叶わなさそうなので、それっぽいような記事を記憶と経験から書き起こしてみようと思います。

##1. はじめに
「ゲームが作りたかったら悪いことは言わないからRPGツクールを使え」というのが20世紀末から伝わる金言であり、私もこれには大いに賛成する次第である。しかし本記事は敢えてそれに逆らい、入門書を読み終わって、あろうことか**ゲーム制作などという茨の道**を進もうとする際の手助けとなるような課題をいくつか用意した。「ゲームを作りたくてプログラミングを学んだ、でも使い所も目標も無いけどいつか100万本を売り上げるゲームを作るんだ！」と意気込む勇者が、この記事をひとつの足がかりとしてくれたら幸いである。

##2. 開発言語
本記事はC/C++の使用を想定する。しばらくは言語特有の機能を使う予定が無いので、他の言語を使用する者は各自読み替え等して頂きたい。

#最初の課題「数当てゲームをつくる」
以下の要件に従って「数当てゲーム」を作成せよ。

1. プログラムを起動するとコンピュータが1～100までの整数をランダムに一つ決定する。以下、この数を「ナンバー」とする。
2. 「数を入力してください：」と表示する。
3. プレイヤーが数を入力する。
4. プレイヤーの入力値に応じて、以下の動作を行う。
    + 1～100の範囲外の数値、または数値以外のものが入力されたら2.に戻る
    + 入力値よりもナンバーのほうが大きいならば、「それよりも大きいです」と表示して2.に戻る
    + 入力値よりもナンバーのほうが小さいならば、「それよりも小さいです」と表示して2.に戻る
    + 入力値とナンバーが同じ数ならば、「正解！」と表示してプログラムを終了する

#テスト項目
1.0を入力したときに再度入力を求められるか？
2.-1を入力したときは？
3.数値以外の文字を入力したときは？

#解説
くだらないほど簡単なゲームだが、これも立派なゲームである。
というのも、コンピュータゲームは凡そ私の知る限り、以下のルーチンを繰り返しているだけだ。

（初期化）　→　[描画]　→　[入力]　→　[処理]　→　[描画]　→　[入力]　→　[処理]　→　[描画]　→　[入力]　→　[処理]　→　・・・

今回は(初期化)を1.、[描画]を2.で行い、[入力]が3.、[処理]が4.と流れる。
スーパーマリオブラザーズさえも、1秒間に何十回というペースでこのループをしているにすぎない。初期化でコースを生成して描画、コントローラーの入力を待って、ジャンプの処理を行う・・・
**つまり、これでゲーム制作の真髄を余す所なく伝えたことなる。これからは君だけのゲームを作ろう！**

---
というのはもちろん冗談で、次回はもう少しマシなゲームを作る。まだまだ黒い画面のゲームからは逃げられないが、その点は覚悟して頂きたい。
Mac OS X での最近の不具合

最近の不具合のメモ。

##1.Sierra

Sierraに上げるとMicrosoft Officeがクラッシュするらしい。
あと学校とか会社のネットワークに繋げなくなる。
まあ公共のネットーワーク構成変えるのは大変だから互換性が悪くなる、これはいつものこと。

##2.Xquartz 2.7.11
Xquartz 2.7.11にアプデしたらXquartz起動しなくなった。(Yosemite)
仕方がないので元に戻した。

しばらくこの二つはアプデしないほうが良いかもしれないです。
VirtualBoxを使って２つのゲストOS間で通信してみる

#はじめに
元々は、VirtualBoxにゲストOSを２つ(ubuntu)を入れて、
その２つのホスト間で通信させようとしてました。
で、調べたらすっと出てきたので、さらっと設定して使おうとしています。

#参考サイト
http://linux2.g.hatena.ne.jp/lnznt/20120131/1328021979

##環境

使用した環境は以下の通り。

|HostOS|version|
|:-----|:------|
|macOS |Sierra(10.12.2)|

|VirtualSW|version|
|:-----|:-----|
|VirtualBox|5.1.12|

|ServerName|GuestOS|Memory|Storage|
|:-----|:--------------------------------|:-----|:-----|
|サーバ１号機|ubuntu-ja-16.04-desktop-amd64|2.0GB|16.0GB|
|サーバ１号機|ubuntu-ja-16.04-desktop-amd64|2.0GB|16.0GB|

#構成
構成は以下の図のような感じです。
<img width="599" alt="VirtualBox.png" src="https://qiita-image-store.s3.amazonaws.com/0/105220/51516c7b-9df9-3f11-5cfd-2e0958de7c13.png">
NAT側につながるethernetは自動的にVirtualBoxが割り当ててましたので、今回は使いません。
外に出るように設定をそのままにしておきます。

今回は、内部ネットワークを作成してそちら側でゲストOS間の通信をして見ることとします。

#設定
設定については、参考サイトに書かれていることがほとんではありますが、
一部異なっていた点がありましたので、以下に記載します。

注意）二つのゲストOSで異なる設定情報は、内部ネットワークのIPアドレスだけになります。

##ゲストOSの設定
まずは、VirtualBoxマネージャーから設定を行います。
<img width="774" alt="virtualbox-setting.png" src="https://qiita-image-store.s3.amazonaws.com/0/105220/6935e028-2acf-7928-47f4-c28c7eccbcd9.png">
①対象となるゲストOSを選択します。
②「設定」ボタンをクリックします。

設定画面が出たら、以下の操作を行います。
<img width="787" alt="virtualbox-netoworksetting.png" src="https://qiita-image-store.s3.amazonaws.com/0/105220/c8b39c21-5e2c-8acc-d0ee-0bddb076433a.png">
①「ネットワーク」をクリックする
②「アダプター２」をクリックする
③「ネットワークアダプターを有効化」にチェックして、「割り当て」に「内部ネットワーク」を選択する
④「OK」ボタンをクリックする

##ゲストOSの起動
ゲストOSの設定ができたら、ゲストOSを起動します。

##/etc/network/interfacesの変更
ゲストOSが起動したら、ネットワークインタフェースの設定をしていきます。
まずはネットワークの設定ファイルを開きます。
```$ sudo vi /etc/network/interfaces```

パスワードを入力して、ファイルを開いたら、以下の情報を追記していきます。
追記が終わったら、保存してください。
```auto enp0sp8
iface enp0sp8 inet static
 address 172.168.0.1
 netmask 255.255.255.0```

###<<<注意点>>>
※「address」に書かれている内容は、サーバ１号機の内容です。サーバ２号機は「172.168.0.2」にしてください。
※参考サイトでは「eth1」と書かれていますが、VirtualBoxだからかubuntu 16.04だからかはわかりませんが、「enp0s8」になります。

##ゲストOSの再起動
ファイルの保存が完了したら、再起動してください。
コマンドプロンプトで以下を実行してください。
```$ sudo reboot```

##ゲストOSの動作確認
再起動が完了したら、ターミナルを起動して、IPアドレスを確認します。
IPアドレスの確認ができたら、もう一方のゲストOSもIPアドレスを確認し、
両方の確認ができたら、双方でpingを実行して疎通できているかを確認してください。


#さいごに
知っていれば意外と簡単ですが知らなければ知らないまま・・・。
ゲストOSのネットワーク設定はまだ他にもあるので、また時間のあるときに試してみます。
（だいたい、こう書くとやらない傾向・・・）
mac OS X でのCGContextEraseというエラーの解決法

半年だか１年ぐらい悩んでいた'CGContextErase'についてのエラー。JAVAやらOCamlのプログラムやらを実行するたびに

`<Error>: The function ‘CGContextErase’ is obsolete and will be removed in an upcoming update. Unfortunately, this application, or a library it uses, is using this obsolete function, and is thereby contributing to an overall degradation of system performance.`

というエラーメッセージがターミナルに出力される。
聞いたところさほど害のあるものではないので放っておいて良いとの事だったが、一々出てきて邪魔。
プロジェクターで自分の実行画面映した時にこれ見えるの嫌だし。

半年だか１年ぐらい悩んでいてあれやこれややり挙げ句の果てに他のものが動かなくなったりとか途方に暮れていたのだが...

**解決しました！**

#解決方法
原因はシステム環境設定にあるInkというパネル(システム?)だったようでInkというパネルをOFFにすればエラーは消えた。
CGContextEraseについて検索するとWacomのペンタブソフトが原因だった〜というのが一番多いのだがWacomのペンタブ使ってない人には思い当たる節なしであった。
このInkというパネルはペンタブなどを接続すると出てくるものでペンタブ使ってなくてもドローソフトなどが原因で出てくることもある。(出そうと思えば出せるもの笑)
私の場合Inkscapeが原因で出てたような気がする。
とりあえず解決。でもこれInkパネル使いたい人はどうするんですか。

[参考]https://discussions.apple.com/thread/6887986?tstart=0
BracketsからAdobe製品用JavaScriptを実行する


無料で使えるAdobe製テキストエディタ [Brackets](http://brackets.io/)
[brackets-to-photoshop](https://github.com/JavierAroche/brackets-to-photoshop) というプラグインで、ExtendScript（Adobe製品を操作するためのJavaScript）を実行できるので紹介します。
> **CAUTION** 
> Macのみ対応です。WINDOWSでは動作しません。

## プラグインのインストール

1. ファイル > 機能拡張マネージャ を開く
1. 入手可能 タブを開き、「photoshop」で検索
1. 「Brackets to Photoshop」を見つけたら、「インストール」をクリック

## 実行方法

スクリプトの先頭に `#target indesign` のようにバージョンを記入
⌘ + shift + P でスクリプトを実行できます。

![brackets_to_photoshop.png](https://qiita-image-store.s3.amazonaws.com/0/3956/2439e0e0-4d0a-65a0-5bc4-3ed28a5dd49e.png "brackets_to_photoshop.png")

ExtendScript Toolkitのようにコード補完は効きません。
以下のアプリに対応しているみたいです。

* Photoshop
* Illustrator
* After Effects
* InDesign
* Bridge

`#target indesign-11.4` のように記述すれば、バージョン別にも対応できます。
詳しくは [brackets-to-photoshop](https://github.com/JavierAroche/brackets-to-photoshop) のREADMEを見ればわかると思います。

Bracketsの使い方については、以下の記事が詳しいです。電子書籍としてKindleに出版もされてるようです。
[Bracketsの機能紹介、使い方解説【Ver.1.0対応】 - Qiita](http://qiita.com/assialiholic/items/c8137321c7599a168b16)

### 2018/11/21 追記

なんか **Mac の ExtendScript Toolkit が 11/20 時点で動かなくなる** ということがあったみたいです。
[ESTKが動かない…？ - DTPab](http://uske-s.hatenablog.com/entry/2018/11/21/094726)

Brackets の他に VSCode のランナーも試しているので、こちらもどうぞ（現状の自分のメインエディタは VSCode の方です）
[Visual Studio Code から Adobe製品用JavaScriptを実行する - Qiita](https://qiita.com/kanemu@github/items/0f905e50ac75197d619f)
CodeBuildのコンテナで設定される環境変数

## TL;DR

ビルドごとに特有の情報としては、Build ID や Build ARN ぐらい。

CodePipelineトリガであっても、その情報とかは含まれない。Build ARNを指定してAPIを呼び出しても、こちらにも含まれない。

## 環境変数

Python 2.7 のDocker Image (`aws/codebuild/python:2.7.12`)のときの環境変数。


```
AWS_CONTAINER_CREDENTIALS_RELATIVE_URI=/v2/credentials/...
AWS_DEFAULT_REGION=us-west-2
AWS_REGION=us-west-2
CODEBUILD_AGENT_ENV_AWS_CONTAINER_CREDENTIALS_RELATIVE_URI=/v2/credentials/...
CODEBUILD_AGENT_ENV_BUNDLE_APP_CONFIG=/usr/local/bundle
CODEBUILD_AGENT_ENV_CODEBUILD_BUILD_ARN=[Build ARN]
CODEBUILD_AGENT_ENV_CODEBUILD_BUILD_ID=[Build ID]
CODEBUILD_AGENT_ENV_CODEBUILD_CONTAINER_INFO==...
CODEBUILD_AGENT_ENV_CODEBUILD_CONTAINER_TOKENS=...
CODEBUILD_AGENT_ENV_CODEBUILD_CTS_ENDPOINT=https://codebuild-builds.us-west-2.amazonaws.com
CODEBUILD_AGENT_ENV_CODEBUILD_DEPRECATED=false
CODEBUILD_AGENT_ENV_CODEBUILD_KMS_KEY_ID=[KMS ARN]
CODEBUILD_AGENT_ENV_CODEBUILD_LOG_GROUP=CodeBuild/BuildStreams
CODEBUILD_AGENT_ENV_CODEBUILD_LOG_STREAM_INFO=...
CODEBUILD_AGENT_ENV_CODEBUILD_REGION=us-west-2
CODEBUILD_AGENT_ENV_CODEBUILD_SECRET_KEY_BASE=...
CODEBUILD_AGENT_ENV_DB_NAME=build-agent-sql
CODEBUILD_AGENT_ENV_DB_USER=root
CODEBUILD_AGENT_ENV_GEM_HOME=/usr/local/bundle
CODEBUILD_AGENT_ENV_MYSQL_DATA_DIR=/var/lib/mysql
CODEBUILD_AGENT_ENV_MYSQL_LOG_DIR=/var/log/mysql
CODEBUILD_AGENT_ENV_MYSQL_RUN_DIR=/run/mysqld
CODEBUILD_AGENT_ENV_MYSQL_USER=mysql
CODEBUILD_AGENT_ENV_RUBY_MAJOR=2.2
CODEBUILD_AGENT_ENV_RUBY_VERSION=2.2.0
CODEBUILD_AGENT_NAME=/.../CODEBUILD_AGENT
CODEBUILD_AGENT_PORT=tcp://172.17.0.2:3000
CODEBUILD_AGENT_PORT_3000_TCP=tcp://172.17.0.2:3000
CODEBUILD_AGENT_PORT_3000_TCP_ADDR=172.17.0.2
CODEBUILD_AGENT_PORT_3000_TCP_PORT=3000
CODEBUILD_AGENT_PORT_3000_TCP_PROTO=tcp
CODEBUILD_AUTH_TOKEN=...
CODEBUILD_BMR_URL=https://CODEBUILD_AGENT:3000
CODEBUILD_BUILD_ARN=[Build ARN]
CODEBUILD_BUILD_ID=[Build Id]
CODEBUILD_LOG_PATH=...
CODEBUILD_SRC_DIR=/tmp/.../src
GPG_KEY=...
HOME=/root
HOSTNAME=...
LANG=C.UTF-8
PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/tmp/.../src
PYTHON_PIP_VERSION=8.1.2
PYTHON_VERSION=2.7.12
```
[PowerShell]コマンドの実行にタイムアウトを設定する

一定時間以上経過したら強制的にコマンドを終了させるには、以下のようにします。


```ps1
$timeoutSeconds = 5    #タイムアウトの秒数

$j = Start-Job {
    #ここに時間がかかりそうなコマンドを記述する
    Get-ChildItem *
}

Wait-Job -Job $j -Timeout $timeoutSeconds | Out-Null

if($j.State -eq "Completed"){
    "完了！"
    Receive-Job $j    #結果を出力する
}elseif($j.State -eq "Running"){
    "中断"
}elseif($j.State -eq "Failed"){
    "例外発生"
}

Remove-Job -force $j    #cleanup
```

#参考
http://stackoverflow.com/questions/21176487/adding-a-timeout-to-batch-powershell

#関連記事
[[PowerShell]Start-Jobで共通の関数を使う](http://qiita.com/Kamo123/items/940910502671d1c195da)
[[PowerShell]Start-Jobのスクリプトブロックでの例外を取得する](http://qiita.com/Kamo123/items/01b5c7f4696fa1b7b171)
[CodeIQ]サイコロの確率分布を書いてみた(CodeIQ機械学習のための数学講座【確率分布編】より)

#はじめに
このエントリは、CodeIQの[池澤あやかとプログラミングで学ぼう！機械学習のための数学講座【確率分布編】](https://codeiq.jp/magazine/2017/01/46932/)の後半部分の、サイコロの確率分布の記事中のコードが理解できなかったので、自分の理解できる範囲でコードを作った際の備忘です。

pythonは初心者のため、書き方が変な部分があるかもしれません。

#環境
Python 2.7.10

#サイコロの確率分布の公式の理解
##公式
![math-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/106763/aa537128-a021-4d90-b2e7-2803c4db533c.jpeg)
＊画像は記事から引用

##課題
>Q. サイコロを5回投げて出る目の回数の確率分布を求めてください。確率分布は確率を列挙したものです。

サイコロの確率分布の公式は上記の式です。
公式の解説、確率分布とはということは、記事に詳しく書いてあるので、ここではコードを作るために必要な情報を書いていきます。

N
→
試行回数なので、課題では「サイコロを5回投げる」ので、N=5

N！
→
5の階乗。mathライブラリのfactorialメソッドを使います

k1 k2 k3 k4 k5 k6
→
サイコロをN回投げたとき、各サイコロの目の出た回数の組み合わせ
たとえば、5回投げた場合、

5回すべて1がでた場合、k1=5 k2=0 k3=0 k4=0 k5=0 k6=0
5回中６以外が１回ずつ出た場合、k1=1 k2=1 k3=1 k4=1 k5=1 k6=0

となります。
確率分布ではこの組み合わせごとの確率を求めていきます(という理解)。

#確率分布を求めていく
まずはサイコロを５回投げたときの出目の組み合わせを洗い出します。

k1=5 k2=0 k3=0 k4=0 k5=0 k6=0のとき
k1=4 k2=1 k3=0 k4=0 k5=0 k6=0のとき
k1=4 k2=0 k3=1 k4=0 k5=0 k6=0のとき、、、

を考えてコードを書くのは大変なので、いったんkXが0~5すべて入った場合のk1~k6の組み合わせを全部出します

たとえばこんな感じ

```
#k1-k2-k3-k4-k5-k6
0-0-0-0-0-5
0-0-0-0-1-4
0-0-0-0-2-3
...
5-5-5-5-5-3
5-5-5-5-5-4
5-5-5-5-5-5
```

全組み合わせは下記のコードの再帰関数(create_pattern(k, list))で作っていきます。
その後、組み合わせのうち、k1~k6の合計が5になる組み合わせのみし、公式に合わせて確率を計算します。

```lang:python
#!/usr/bin/env python
import math 

#再帰関数で全組み合わせを作る
#ハイフン区切りの組み合わせにする
def create_pattern(k, list):
  if k ==  1:
     for i in xrange(0, 6):
      list.append(str(i))
  else:
    new_list = []
    for pattern in list:
      for j in xrange(0, 6):
        new_list.append(pattern + '-' + str(j))

    list = new_list

  if k == 6:
    return list
  else:
    k = k + 1
    return create_pattern(k, list)


# サイコロを投げる回数
n = 5

all_pattern_str_list = create_pattern(1, [])

#ハイフン区切りの組み合わせを分解して、合計が5の組み合わせのみ、確率を計算していく
for all_pattern_str in all_pattern_str_list:
  tmp_list = all_pattern_str.split('-')

  pattern_sum = 0
  pattern_list = []
  for tmp_str in tmp_list:
    pattern_list.append(int(tmp_str))

  if sum(pattern_list) == 5:
    print pattern_list

    #公式の分母(k1!k2!k3!k4!k5!k6!)を計算
    denom = 1
    for p in pattern_list:
      denom = denom * math.factorial(p)

    #確率の計算
    print (math.factorial(n) / denom) * (1.0 / 6.0 ** n)
```

#まとめ

記事中にもありますが、コードに落とすと、数学も理解しやすくなりました。
選択しているテキストフレームから各段落ごとにcontentsを取得する。

[前回記事](http://qiita.com/onebitious/items/56680bf57a5c2b8b3d3e)から改良してみました。
・テキスト選択からではなく選択しているテキストフレームからcontentsを取得するように変更。
・正規表現から各段落を取得するのではなくparagraphsプロパティで取得するように変更。

```JavaScript:getContents.jsx
var myDoc = app.activeDocument; //ドキュメント
var mySel = myDoc.selection; //選択しているテキストフレーム

for (var i = 0; i < mySel.length; i++) {
    var myParaLen = mySel[i].paragraphs.length; //段落数を取得
    for (var j = 0; j < myParaLen; j++) {
        var myPraContents = mySel[i].paragraphs[j].contents; //段落ごとのコンテンツを取得
        alert(myPraContents); //確認用
    }
}
```

![image](https://qiita-image-store.s3.amazonaws.com/0/122812/e61c0b4e-cc82-3b1c-2f41-d781cfa10f53.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/122812/18379b6e-f334-d5d8-1f55-456e41f48c8d.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/122812/47f99db3-97fe-0ac5-fe8f-0a6bf0fc5911.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/122812/e9cd2737-5d90-d4fc-ec85-f4965e2b5650.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/122812/b192026c-d394-3301-08aa-c58bd372b2ab.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/122812/46336163-09de-c5ef-e326-20a68fb2b215.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/122812/b6a1e075-2435-237d-934e-1b6bc2cca294.png)

いい感じに取得できました。
ここから段落スタイル名(タグ名)、サイズ(font-size)、フォントファミリー(font-family)、フォントスタイル(font-weight)、カラー(color)、行揃え(text-align)、行送り(line-height)を取得し、HTML、CSS生成するツールを作ってみましょう。。。
（実はもうできている。。。）
s3でのメンテナンス画面への移行

アプリを運用しているとメンテナンス画面どうしようかと考えることがあると思います。
同じサーバでメンテナンス画面を用意している人もいるかもしれませんが、サーバ自体を落としたりしたいときはそれができないですよね。
だからと言って、それ専用のサーバなんか立てたくない。と思い、メンテナンス画面をs3でホスティングして、切り替える方法を検討しました。

## 手順
今回はメンテナンス画面も独自ドメインかつhttps対応しています。
1. [AWS S3でのhttps対応含む静的ウェブサイト公開](http://qiita.com/THHacker/items/11eadffe6b3ce3491e3b)の手順でメンテナンス画面を公開する
2. 上記のCloudFrontのDistributionを作成するときに、[Alternate Domain Names (CNAMEs)]に対して、メンテナンス画面に移行する元のurlもコンマ区切り、もしくは改行で入れる(アプリがapp.XXX.co.jpでメンテナンス画面がmaintenance.XXX.co.jpであればこれを二つ入れる)
3. これだけだと、例えばapp.XXX.co.jp/topとかのようにアプリのどこかのページを開いている時にメンテナンスモードになると、s3バケットの/topを探しに行き、ないので、403が返ってきてしまう。そのため、CloudFrontのError Pagesで403が帰ってきたらmaintenanceのhtmlに飛ばすよう設定する
4. Route53で[create record set]で[name]=[app.XXX.co.jp],[Type]=[CNAME],[value]=[maintenance.XXX.co.jp.]とする(既にRoute53でELBなどにルーティングしている場合は、[app_.XXX.co.jp]などのnameでAレコードを作成し、そのALIASにELBを設定する。その上で通常は[app.XXX.co.jp]のCNAMEレコードを作成し,[value]を[app_.XXX.co.jp]としておく。)


上記であれば、通常時は[app.XXX.co.jp]へのアクセスは[app_.XXX.co.jp]にルーティングされ、それがELBに流れる
メンテナンス時は[app.XXX.co.jp]へのアクセスが[maintenance.XXX.co.jp]にルーティングされ、メンテナンス画面が表示される。メンテナンス画面の更新も、s3のファイルを置き換えるだけなので便利。

## 追記
上記はiOS/androidのwebviewで見せるためのものだったのですが、通常のPCブラウザやiOSのwebview,androidのブラウザなどはOKだったんですが、androidのwebviewのみDNSの名前解決ができず、エラーとなってしまいました。。。
原因は結局わかりませんでしたので、最終的にはapp.XXX.co.jpのAレコードのAliasをapp.XXX.co.jpに向いているELBのDNSと, maintenance.XXX.co.jpに向いているcloudFrontのDNSで切り替えてやることで対応しました。
ただし、この場合はELBやCloudFrontを立て直した場合は、動的に取得してやらないとrakeタスクなどでコマンド一発で切り替えようとすると不便です。。。
やはりandroid謎。。。


何か修正、コメントあればお願いします！
Edge.jsで.NETクラスの参照を追加する方法

node.jsからC#、C#からnode.jsを使えるライブラリEdge.jsでハマった(個人的に)のでメモ

node.jsからC#を使ってWindowsサービス状態を取得する、というテストをしていたところ、以下のエラー

![ref_error.png](https://qiita-image-store.s3.amazonaws.com/0/79414/cb236320-180b-40fa-c43a-5fffd6017874.png)

Visual Studioで開発を行っている場合、ソリューションの設定から参照を追加すれば済む話だが、Edge.jsでの参照追加の方法がわからず...


#解決方法

呼び出し側のjsで、必要な名前空間を参照する
`references` で指定します

```js:test.js
let test = edge.func({
    source : require('path').join(__dirname, 'service-status.cs'),
    references : ["System.ServiceProcess.dll"]
});

```

※思いっきりドキュメントに記載がありました
How to: specify additional CLR assembly references in C# code: [tjanczuk/edge](http://qiita.com "https://github.com/tjanczuk/edge#how-to-specify-additional-clr-assembly-references-in-c-code")
[PowerShell]Start-Jobのスクリプトブロックでの例外を取得する

Start-Jobのスクリプトブロック内で例外が起きた場合、呼び出し側ではReceive-Jobするときに例外が発生します。

```ps1
$sb = {
    #何らかの処理

    #例外発生
    throw
}

$j = Start-Job $sb
Wait-Job -Job $j | Out-Null

try {
    #Receive-Jobで例外が発生する
    Receive-Job $j -ErrorAction Stop
}
catch {
    "catch"
}

Remove-Job $j
```

```text:output
hoge
catch
```

Receive-Jobする前に例外が起きたかどうかを確認するには、JobのStateの値を確認します。
例外が発生するとFailed、正常に終了したならCompletedになります。

```ps1
$sb = {
    #何らかの処理

    #例外発生
    throw
}

$j = Start-Job $sb
Wait-Job -Job $j | Out-Null

#JobのStateを取得する
$jobState = $j.State

Write-Host ("jobstate = " + $jobState)

if($jobState -ne "Failed"){
    Receive-Job $j -ErrorAction Stop
}

Remove-Job $j
```

```text:output
jobstate = Failed
```

注意点としては、$ErrorActionPreference="Stop"にする必要があること、それと例外をキャッチしたらもう一度例外を投げる必要があることです。

```ps1
$sb = {
    #ErrorActionPreferenceを設定
    #スクリプトブロックの外側の設定とはまた別なので注意！
    $ErrorActionPreference = "Stop"

    try {
        #存在しないコマンドを呼び出して例外発生
        hoge
    }
    catch {
        #ここで例外処理をする

        #例外をもう一度投げる
        throw
    }
}

$j = Start-Job $sb
Wait-Job -Job $j | Out-Null

$jobState = $j.State

Write-Host ("jobstate = " + $jobState)

if($jobState -ne "Failed"){
    Receive-Job $j -ErrorAction Stop
}

Remove-Job $j
```

```text:output
jobstate = Failed
```

#参考
http://stackoverflow.com/questions/8751187/how-to-capture-the-exception-raised-in-the-scriptblock-of-start-job
Gradleで依存関係を見るのーと

* Gradle 3.3

`mvn dependency:tree`のようなことをしたい場合。

# 実行コマンド

dependenciesタスクで階層表示される。
バージョンやomitの状況もわかる。

```
gradle dependencies
```

スコープは設定次第。

## `build.gradle`なし

`build.gradle`がなくても実行できる。

```
% gradle dependencies
:dependencies

------------------------------------------------------------
Root project
------------------------------------------------------------

No configurations

BUILD SUCCESSFUL

Total time: 0.824 secs
```

## java plugin入り

```
% gradle dependencies
:dependencies

------------------------------------------------------------
Root project
------------------------------------------------------------

archives - Configuration for archive artifacts.
No dependencies

compile - Dependencies for source set 'main'.
No dependencies

compileClasspath - Compile classpath for source set 'main'.
No dependencies

compileOnly - Compile dependencies for source set 'main'.
No dependencies

default - Configuration for default artifacts.
No dependencies

runtime - Runtime dependencies for source set 'main'.
No dependencies

testCompile - Dependencies for source set 'test'.
No dependencies

testCompileClasspath - Compile classpath for source set 'test'.
No dependencies

testCompileOnly - Compile dependencies for source set 'test'.
No dependencies

testRuntime - Runtime dependencies for source set 'test'.
No dependencies

BUILD SUCCESSFUL

Total time: 0.864 secs
```

# フィルタリング

`--configuration`の指定でフィルタリングできる。
指定したものだけ出力される。

```
gradle dependencies --configuration runtime
```


# メモ

* https://docs.gradle.org/current/userguide/tutorial_gradle_command_line.html
iOS9からのhttp接続での通信エラー対策

#ATSを無効にする

アプリのinfo.plistに下記を追加し、ATSを無効にする。
推奨はされていない。

```:info.plist
<key>NSAppTransportSecurity</key>
<dict>
	<key>NSAllowsArbitraryLoads</key>
	<true/>
</dict>
```

特定ドメインのATSの無効化

```:info.plist
<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>tadamatu0001.web.fc2.com</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                <true/>
            </dict>
        </dict>
    </dict>
```
はじめてのcontainerd

Dockerの理解を深めるためには、[containerd](https://containerd.io/)についてもある程度知っておくべきらしいのでメモ。

## containerdとは
Docker社が開発しているcontainerのruntime。

https://www.docker.com/docker-news-and-press/docker-extracts-and-donates-containerd-its-core-container-runtime-accelerate

にある通り、オープンなコミュニティに寄贈する予定。
実行中のコンテナの管理・監視であったり、コンテナイメージの管理(レジストリへのpush, pullなど)が主な役割。
コンテナ実行レイヤのランタイムは、runCを利用しているが、OCI準拠だったら何でも使えるようになる予定。

## Dockerとcontainerd
https://containerd.io/images/chart-c.png

Dockerは、コンテナを利用するために必要な機能を全て持ったプラットフォーム。
containerdは、プラットフォームとしてのDockerを実現するためのコンポーネントの一つ。
リンク先の図にあるように、コンテナランタイムとしての役割を果たす。

## containerdとrunc

https://containerd.io/images/chart-a.png

同じコンテナランタイムという位置付けのrunCとの役割分担はリンク先の図の通り。

## Getting started
https://github.com/docker/containerd/blob/v0.2.x/README.md
READMEの通りに実行。コマンドだけ列挙しておく。

- install

https://github.com/docker/containerd/releases からバイナリインストール。

```
$ ctr --help
NAME:
   ctr - High performance container daemon cli

USAGE:
   ctr [global options] command [command options] [arguments...]
   
VERSION:
   0.2.3
   
COMMANDS:
   checkpoints	list all checkpoints
   containers	interact with running containers
   events	receive events from the containerd daemon
   state	get a raw dump of the containerd state
   version	return the daemon version
   help, h	Shows a list of commands or help for one command
.
..
```


- OCI bundle作成

https://github.com/docker/containerd/blob/v0.2.x/docs/bundle.md 参照。

```
$ mkdir -p redis/rootfs
$ docker pull redis
$ docker create --name tempredis redis
$ docker export tempredis | tar -C redis/rootfs -xf -
$ docker rm tempredis
$ vi redis/config.json // config file作成
省略。
$ sudo mv redis /containers/
```


- 実行

```
// containerdの実行
$ sudo containerd
// container実行
$ sudo ctr containers start redis /containers/redis
$ sudo ctr containers list
ID                  PATH                STATUS              PROCESSES
redis               /containers/redis   running             init
```
テストコードとホワイトボックステストとブラックボックステストの運用方針

#はじめに
　人間だれしもミスをする。コーディングに明確な正解はない、それゆえに複雑なコードをミスせずに書くことは不可能だ。ミスをしない開発者がいたとしたらそれは難しい作業をこなしていないだけで何の自慢にもならない。
　でも納品したプログラムで致命的なバグが発見されると大変だ。評判が下がるし、追加作業が発生したり、損害賠償を請求されたりする。ミスは発生するものだが、納品までには取り除いておきたい。だから被害防止のためにどこの会社でもテストをやっている。

　私がいた現場ではホワイトボックステストとブラックボックステストを区別せずに適当に実施していた。まず行っていたのがブラックボックステストを後でまとめて行なうやり方、これをテストコードを書かずに手動で行っていた。そのうち「テスト駆動開発が流行っている」という意見が出てきたのでブラックボックステスト風のテストコードを書きながら開発を行なうという方法になった。
　しばらくなんとなくテストコードを書いている状態で開発は続けられた。しかし、ある簡単なプロジェクトで開発者が書いたテストコードのみでテストを済ませ納品したのだが、いろいろとバグが発生して問題となった。当前のことだが開発者が書いたテストコードでは開発者が予想できるバグしか発見できなかった。

　では一体どうすれば良かったのか。ようは__ホワイトボックステストとブラックボックステストのバランス__を大切にしてテストを進めて行こうということだ。


#基本方針

　ホワイトボックステストとブラックボックステストのバランスを意識するために__テスト設計の前に__チーム内で基本方針を定める。これによってテスト工程全体の短縮を行いたい。

####品質

* 品質の担保はブラックボックステストの際にテスト内容をダブルチェックすることで行なう。

####工程順序

* ホワイトボックステスト → ブラックボックステスト(自動) → ブラックボックステスト(手動)

　ブラックボックステストの設計には時間が必要なのでホワイトボックステストの後の実施になる予定(前後することもあり)。
　手動テストはテスト実施に時間がかかるため、工程の後ろの方に持っていく。これはテスト観点以外でエラーが発生し、無駄な手戻りを防ぐため。

####テストコードの扱い

* __ホワイトボックステスト、ブラックボックステストのテストコードはそれぞれ分離して区別できるように管理する。__

#ホワイトボックステスト
####定義
* 開発者が開発のために書くテストコードを用いる


####目的
* 開発者の意図通りの動作をすることを確認するため行なう
* 開発者がコードを書いた際の変更範囲、コードが動作するかのフィードバックを得ることで開発をスムーズにする

####手法
* テストコードのロジックの正確性についてのレビューは行わない(もちろん通常のコードと同様に保守性は考慮する)
* 開発とテストコード記述は同時に行われる
* 全パターン網羅しなくとも良い
* 境界値テストのようにブラックボックステストで行なうテストは行わない

#ブラックボックステスト
####定義
* 開発者以外が作成するテスト
* __開発者の意思が入るとホワイトボックステストになってしまう__ので開発者の意思とテスト内容を分離すること
* テストコードだけとは限らず手動テストも含む

####目的
* 品質を確保するために行なう

####手法
* テストコードについては、ダブルチェックを行いロジック間違いを防ぐこと

#さいごに
　具体的にどのようなテスト設計にすればいいかは今後勉強していく予定。
温度・湿度・気圧センサーBME280をSPI通信でアクセスする


温度・湿度・気圧センサーBME280をESP8266 ArduinoのSPI通信でアクセスするライブラリーを作りました。

# やりたいこと

[ESP8266 Arduinoで環境モニターを作っています](https://ambidata.io/samples/temphumid/weatherstation-1/)。今まではBME280をI2C通信でアクセスして温度、湿度、気圧を測定していましたが、これに加えてフォトトランジスター(NJL7502L)で照度を測ることにしました。ESP8266にはアナログ入力が一つありますが、これは電池の電圧を測るのに使っているので、照度の測定にはADコンバーター(MCP3002)を使いました。BME280はI2C通信とSPI通信のどちらでもアクセスできますが、MCP3002はSPI通信でしかアクセスできません。そこで、BME280もSPI通信でアクセスするようにしました。

# BME280とESP8266の接続

SPI通信には3線で通信する方式と4線で通信する方式があります。BME280は3線式、4線式の両方に対応できますが、MCP3002が4線式なのでBME280も4線式で使うことにします。ESP2866とBME280は以下のように接続します。

| ESP8266 | BME280 |
|:-------:|:------:|
| IO14: HSPI_CLK | SCK |
| IO12: HSPI_MISO | SDO |
| IO13: HSPI_MOSI | SDI |
| IO15: HSPICS | CSB |

　　　　      　　　　
複数のSPIデバイスを接続するときはCLK、MISO、MOSIは共通に(バス状に)接続し、CSはデバイスごとに個別に接続します。つまりデバイスの数だけESP8266のピンが必要になります。ESP8266のマニュアルにはIO15ピンがHSPICSに割り当てられていますが、CSはSPIデバイスと通信するときに対応するピンをLOWレベルにすればいいので、別のGPIOピンも使うことができます。

# SPI通信版BME280ライブラリー

BME280にアクセスするプログラムは再利用しやすいよう、ライブラリーにしました。

BME280を制御するクラスを定義し、メンバー関数として初期化(begin)と温度、湿度、気圧の読み出し(readTemperature、readHumidity、readPressure)を用意しました。

使い方はこんな感じです。

```cpp
#include <SPI.h>
#include "BME280_SPI.h"                 // SPI通信版BME280ライブラリーのヘッダーファイル

BME280 bme280;                          // BME280のデーターを定義

    bme280.begin(BME_CS);               // BME280の初期化

    temp = bme280.readTemperature();    // 温度の読み出し
    humid = bme280.readHumidity();      // 湿度の読み出し
    pressure = bme280.readPressure();   // 気圧の読み出し
```

ライブラリーの全体とサンプルプログラムはGithubに公開しました。
* [https://github.com/TakehikoShimojima/BME280_SPI](https://github.com/TakehikoShimojima/BME280_SPI)

次はこれを使って環境モニター3号機を作ります。
Reactで画面遷移を router.push() で行う時に、オブジェクトを遷移先のコンポーネントに渡す方法

[APIドキュメント](https://github.com/ReactTraining/react-router/blob/0625e7656d21863563cf59019cfc16b800b79e85/docs/API.md#pushpathorloc)よく見たら書いてあるんですが、気づくまで1時間くらいかかったので、ここで詰まった人も多かろうと思い共有…。

以下のVersionで確認しました

* react: 15.4.1
* react-router: 3.0.0

基本的にプログラマブルに遷移させようとすると

     this.props.router.push('/some/path')
という風に書きますが、オブジェクトも渡したいという場合は、_state_というパラメータをくっつけてあげればできます。
具体的には下記のような感じ。
     
     this.props.router.push({
        pathname: '/some/path',
        state: { somedata: data }
     })

遷移先のコンポーネントでは

    this.props.location.state.somedata
で、オブジェクトを使用することができます。
う～ん便利。ていうかこれなかったら相当めんどくさかった…
QiitaのMarkdownで間違えやすい箇所のメモ


Markdownを書くときに忘れがちな事についてのメモ

# 注釈の付け方

**半角スペースを忘れない**

```
\[^1]:＜ここに半角スペース＞
```

ちなみに、何故だかわからないけど、上のコード部分もバックスラッシュを入れないとこの記事自体の注釈がバグる

# 太字や強調 [^1]

**半角スペースを入れない**

```
太字　**＜ここに半角スペース要らない＞太字＜ここに半角スペース要らない＞**
打ち消し　~~＜ここに半角スペース要らない＞打ち消し＜ここに半角スペース要らない＞~~
```

# Heading [^1]
そもそものhtmlの設計にそぐわない事だからなのかもしれないが、Headingの順序の**途中**をぬかすと、自動表示の目次がバグる

## 正しい奴

```
### h3
#### h4
### h3
#### h4
```

こうなる
### h3
#### h4
### h3
#### h4

## 表示がバグるやつ

```
### h3
##### h5
### h3
#### h4
```

するとこうなる **自動生成される目次に注目**
### h3
##### h5
### h3
#### h4


# 更新記録

1. 1月9日　記事の投稿、間違っている内容の削除
1. 1月10日　Kobitoタグの追加
1. 1月11日　題名から記事の内容が分かりにくかったため、題名を変更しました。

# 注釈

[^1]: kobitoのプレビューではバグっていることが分からない
【UnityEditor】Projectビューで現在開いているディレクトリを取得する

#はじめに
Projectビューで開いている場所のパスを取得する方法を調べてみました。

<img height = 100 src = "https://qiita-image-store.s3.amazonaws.com/0/44288/fccb2aec-8e68-9a66-d7f2-49a1b6689cf6.png">

# 環境
Unity 5.5.0f3
Windows 10

# カレントディレクトリの在りか
```UnityEditor.ProjectBrowser``` クラスの ```GetActiveFolderPath()``` メソッドを実行するとカレントディレクトリが取得できます。
このメソッドは非公開なのでリフレクションを使って呼び出してやります。

# ソースコード
以下のメソッドを実行するとカレントディレクトリが取得できます

```csharp
static string GetCurrentDirectory()
{
    var flag = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance;
    var asm = Assembly.Load("UnityEditor.dll");
    var typeProjectBrowser = asm.GetType("UnityEditor.ProjectBrowser");
    var projectBrowserWindow = EditorWindow.GetWindow(typeProjectBrowser);
    return (string)typeProjectBrowser.GetMethod("GetActiveFolderPath", flag).Invoke(projectBrowserWindow, null); 
}
```

#活用例 (Windows 10)
### コマンドプロンプトを起動してProjectビューのカレントディレクトリへ移動する
Ctrlキー + Tで コマンドプロンプトが起動します。

```EditorRunTerminal.cs
using UnityEditor;
using System.Diagnostics;
using System.Reflection;

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

    static string GetCurrentDirectory()
    {
        var flag = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance;
        var asm = Assembly.Load("UnityEditor.dll");
        var typeProjectBrowser = asm.GetType("UnityEditor.ProjectBrowser");
        var projectBrowserWindow = EditorWindow.GetWindow(typeProjectBrowser);
        return (string)typeProjectBrowser.GetMethod("GetActiveFolderPath", flag).Invoke(projectBrowserWindow, null); 
    }
}
```

結果
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/de28e739-5106-1fe2-4dc2-485a6d37e1e4.png)
Unity で公式 Google Analytics SDK を使う

# はじめに

* 基本的に下記ドキュメントのとおりだが自分用メモ＆Qiitaで検索すると古い情報しか無いので書いておく

# ドキュメント

* [Unity 向け Google アナリティクス プラグイン - デベロッパー ガイド](https://developers.google.com/analytics/devguides/collection/unity/v4/devguide?hl=ja)

# 簡単なまとめ

## ダウンロード

* http://github.com/googleanalytics/google-analytics-plugin-for-unity から `GoogleAnalyticsV4_bitcode.unitypackage` か `GoogleAnalyticsV4_nobitcode.unitypackage` をダウンロード
  * 違いが完全にわかっていないが `GoogleAnalyticsV4_bitcode.unitypackage` を使った
  * 現時点のドキュメントのリンクには不要な空白が入っており 404 になるので注意

## Android の場合

* `Assets/Plugins/Android/AndroidManifest.xml` に以下の権限を追加

```xml
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
```

## iOS の場合

* プラットフォームを iOS にしてビルドし XCode で開く
* 中央ペインのメニュー `General` の `Linked Frameworks and Libraries` の `+` 押下で下記の項目を追加する
  * `AdSupport.framework` については広告を使わない場合にリンクしていると審査で落とされるような噂を聞いたので外してみたところ正常に動いてそうだった。スクリーンとイベントの通知をするくらいだったら問題ない様子。たぶん UserID とか送信する場合は必要なのかも。

```
AdSupport.framework 
CoreData.framework
SystemConfiguration.framework
libz.tbd
libsqlite3.tbd
```

## Google Analytics の準備

* アカウントとプロパティとビューを作成する
  * アカウントは iOS, Android 共通にした
  * プロパティはデフォルトでできているものをその他(Unity Editor)用にし、iOS、 Android それぞれ専用のプロパティを追加
  * ビューはデフォルトのものを使用

## Unity の準備

* ダウンロードした unitypackage を import する
* `Assets/Plugins/GoogleAnalyticsV4/GAv4.prefab` をプロジェクトの開始シーンのヒエラルキーに追加
* GAv4 のインスペクターから Android, iOS, Other Tracking Code を設定する
* コンテキスト的に使っていて `DontDestroyOnLoad` になっているスクリプトがすでにあったので `public GoogleAnalyticsV4 googleAnalytics;` を追加してインスペクターで `GAv4` と紐付けてここから参照するようにした

## Google Analytics のログを送信する

* 詳細は [Unity 向け Google アナリティクス プラグイン - API リファレンス](https://developers.google.com/analytics/devguides/collection/unity/v4/reference?hl=ja) を参照

### セッションの開始終了

* セッションとは、ゲームに対するユーザーの接点が発生した一期間を表す
* 今回は 1 プレイの開始終了を 1 セッションとした

```cs
// 開始
googleAnalytics.StartSession();
// 終了
// アプリ起動から終了までを 1 セッションとして扱うので良い場合は明示的に呼び出さなくても良い
googleAnalytics.StopSession();
```

### スクリーンの通知

* スクリーンはゲーム内でユーザーに表示されるコンテンツを指す
* 今回はシーン切替時にスクリーンの通知を行った

```cs
googleAnalytics..LogScreen("Main Menu");
```

### イベントの通知

* イベントはゲーム内のインタラクティブな要素に対するユーザーの接点（特定のアイテムの利用など）のデータを収集する目的で使用すると便利
* 今回は API 通信が発生する毎にイベントを通知した
* 他の通知もそうかもしれないがイベントは Start や Update などの Main Thread でしか呼び出しできないので注意が必要
* デフォルトのレポート上では下記の `イベントカテゴリー` と `イベントアクション` でまとめられる

```cs
googleAnalytics.LogEvent("イベントカテゴリー", "イベントアクション", "イベントラベル", someLongValue);
```

### 動作確認

* エディター上でプレイし、`その他プロパティ` のレポートで `リアルタイム` 項目から確認を行う
CentOSの古いバージョンのパッケージのインストール方法

古いバージョンのパッケージはデフォルトのリポジトリからは削除され、そのままではインストールできません。

そのため、古いパッケージが保存されている[vaultリポジトリ](http://vault.centos.org/)のパッケージを直接指定してインストールします。

大まかな手順は次のとおりです。

1. vaultリポジトリからインストールしたいパッケージを探す
2. 探したパッケージをyumを使ってインストールする

以下OpenSSLの例を取って説明します。

## インストールしたいパッケージを探す

1. http://vault.centos.org/ にアクセスします。
2. CentOSバージョン, "os", アーキテクチャ, "Packages"の順にディレクトリを辿ります。
CentOS6.6でx86アーキテクチャの場合は次のURLとなります。
http://vault.centos.org/6.6/os/x86_64/Packages/
3. 希望するパッケージのURLをメモします。
今回はOpenSSLをインストールしたいので、下記URLをメモします。
http://vault.centos.org/6.6/os/x86_64/Packages/openssl-1.0.1e-30.el6.x86_64.rpm
http://vault.centos.org/6.6/os/x86_64/Packages/openssl-devel-1.0.1e-30.el6.x86_64.rpm

## Yumでインストール

既に新しいバージョンが入っている場合は```yum downgrade```、新しくインストールする場合は``` yum install```を実行します。

今回はopensslは既に新しいバージョンが入っていますが、openssl-develはインストールされていないので次のように実行します。

```
yum downgrade http://vault.centos.org/6.6/os/x86_64/Packages/openssl-1.0.1e-30.el6.x86_64.rpm
yum install http://vault.centos.org/6.6/os/x86_64/Packages/openssl-devel-1.0.1e-30.el6.x86_64.rpm
```
windows セットアップめも

Windows7での話

Windows Updateおわらない問題

↓を手動でいれる
KB3172605
kb3177467

その他
sfc /scannow　REM Windowsのシステム修復機能
chkdsk c: /f　REM Windowsのドライブチェック
WindowsUpdateDiagnostic.diagcab　チェックのソフト
C++ Builder XE4, 10.2 Tokyo > debug > 複数のString文字列を確認する > コード中の文字列をダブルクリックして Ctrl+F5

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/28)
```

String str;
String res;

上記2つの文字列をデバッグ時に確認したい。

##「評価/変更」ウィンドウを使う方法

前準備: Ctrl+F7で「評価/変更」ウィンドウを開く

### 評価する式での連結表示

`str + res`
にて2つの文字列が連結した状態で表示される。
改行がないため、確認しにくい。

`str + L"\r\n" + res`
にすると以下のエラーとなった。

> E2094 'operator+' not implemented in type 'System::UnicodeString' for arguments of type 'wchar_t *'

### 監視式一覧で確認

`str`と入力して「監視」ボタンを押す
`res`と入力して「監視」ボタンを押す

「監視一覧ウィンドウ」に2つの文字列が表示され、比較確認しやすい。

## お薦め > 直接、監視式一覧に送る方法

コード中の`str`をダブルクリックして Ctrl+F5
コード中の`res`をダブルクリックして Ctrl+F5


## インスペクタを使う方法

比較閲覧はしにくい。

## ローカル変数の一覧

ローカル変数ペインに一覧表示されていれば、そちらを使うのがいいだろう。