OmniAICreator/Qiita-1.07M huggingface dataset:
Tomcatのトラブルハック

# はじめに

業務経験で遭遇したTomcatの対処法を述べます。

# EL式のパースエラー

Tomcatのversionを6.0.20から6.0.45にマイグレーションを行った時に、
JSPファイルへのアクセスで発生した。
背景として「java6からjava7」への対応も同時期に行った。
ログファイルから解析するに、JSPをコンパイルしたときのjavaファイルで発生していた。
問題箇所は、４桁以上の数値をカンマ区切りに成形した文字列と「0」のイコール比較をEL式内で行っている箇所でした。

暫定対応として、EL式内の「0」を「''」でくくってみると、うまく動作しました。

```jsp
<c:if test="${human.count eq '0'}">
</c:if>
```
マイグレーション前では何故動作していたかは正直不明です。

# パッケージ管理下でない状況のTomcatマイグレーション

（１）シンボリックリンクを活用し、運用中のTomcatと同一ディレクトリにあるかのようにふるまう。
（２）古いTomcatはバックアップを残して置き、リリース不備時に切り戻しを行えるようにする。
＊あくまで一例です。

# スタート、シャットダウンを素早く行いたい

エイリアスを張る。エイリアスはシンボリックリンクを参照する。

# パフォーマンスダウン

tomcat起動時からしばらく経つとCPU利用率が跳ね上がる事象。
背景として「java6からjava7」への対応も同時期に行った。

下記URLの解決策をtomcatのstartup.shに適応するとパフォーマンス劣化を確認しなくなった。
参考）http://blog.cybozu.io/entry/2016/04/13/080000

# web.xml

## JDKマイグレーション時に動作しない

「java6からjava7」への対応時にtomcatのweb.xmlの下記要素を書き換えることにより対応。

> compilerSourceVM
> compilerTargetVM

## jsp 65535 bytes limit

### mappedfile

1メソッドのサイズが64KBを超えた場合に発生するようです。
tomcat起動時にjspをコンパイルした時に発生したため、antやjenkinsで検知できそうもない。
tomcatのweb.xmlのmappedfile属性をfalseにすることでとりあえずの処置ができました。
(そもそもそんなサイズにしないようにリファクタリングするのがベストです)

```
<init-param>
　<param-name>mappedfile</param-name>
　<param-value>false</param-value>
</init-param>
```
### genStringAsCharArray

genStringAsCharArrayをtrueにすることでもとりあえずの処置を行えます。
ただ、効かないことを確認したため調べてみたら変数名がバージョンで異なる模様。

6.0.38以前：genStrAsCharArray
6.0.38以降：genStringAsCharArray

## パラメータが異なる

```古
  <!--   isVirtualWebappRelative                                            -->
  <!--                       Should "virtual" paths be interpreted as       -->
  <!--                       relative to the context root, instead of       -->
  <!--                       the server root?  (0=false, 1=true) [0]        -->
```

```新
  <!--   isVirtualWebappRelative                                            -->
  <!--                       Should "virtual" paths be interpreted as       -->
  <!--                       relative to the context root, instead of       -->
  <!--                       the server root? [false]                       -->
```
PHPで1行ずつ読み込んで何かしら加工したいときのサンプル

この記事は移行しました！[最新の内容はこちら](https://naoqoo2.github.io/blog/PHP%E3%81%A71%E8%A1%8C%E3%81%9A%E3%81%A4%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%93%E3%81%A7%E4%BD%95%E3%81%8B%E3%81%97%E3%82%89%E5%8A%A0%E5%B7%A5%E3%81%97%E3%81%9F%E3%81%84%E3%81%A8%E3%81%8D%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB/)をご覧ください😀

# はじめに
大量のデータを何かしら処理したいときってありますよね。
１行ごとに正規表現とか使って特定の文字列を抽出したいときとか。
たいていはテキストエディタだけで解決できるんですが、
たまーに複雑なことしたくてPHP使いたいときがあります。私はあります。

で、毎回ファイル読み込みとか出力の処理書くのが面倒なので
今後は下記を使おうと思います。

# １行ずつ読み込んで何かしら処理して出力するサンプル

```php
$input_filename = 'before.txt'; // 処理したいファイル
$output_filename = 'after.txt'; // 処理後のファイル

$fpr = fopen($input_filename, 'r');
$fpw = fopen($output_filename, 'w');
while ($line = fgets($fpr)) {
    
    // -----
    // ここに$lineに対して何かしらの処理を書く
    // -----
    
    fwrite($fpw, $line);
}
fclose($fpr);
fclose($fpw);
```
俺のgitコマンド

この記事は移行しました！[最新の内容はこちら](https://naoqoo2.github.io/blog/%E4%BF%BA%E3%81%AEgit%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/)をご覧ください😀

個人的によく使うgitコマンドメモ。

## 作業ディレクトリを編集前の状態に戻したい

1. 編集したファイルを直前のコミット時の状態に戻す
`git reset --hard`

2. 管理していない新規ファイルやディレクトリを削除
`git clean -df`

## 直前のコミットをなかったことにする
1. コミットログを確認
`git log`

2. 取り消す
`git reset --soft HEAD^`

3. コミットログから消えたことを確認
`git log`

## コンフリクトした時にマージしようとしたブランチの状態に戻す

masterマージしたらコンフリクト激しくて一旦masterを正としてしまいたいとき。

`git checkout --theirs {ファイルパス}`

作業ブランチの状態に戻したい時は`--ours`でいける模様。
参考）https://qiita.com/nirasan/items/27cdd75e8117bf41d2be#%E5%85%88%E3%81%AB%E7%B5%90%E8%AB%96

## リモートのブランチをローカルにチェックアウト
1. まずはfetch
`git fetch`

2. リモートのブランチ確認
`git branch -a`
※ -aオプションでリモートブランチを表示

3. ローカルブランチ名を指定して、リモートブランチをチェックアウト
`git checkout -b other_branch origin/other_branch`
※ -bオプションで自動的にそのブランチに切り替わる

## 強制的にブランチを切り替える
1. 強制的にcheckout  
`git checkout -f branch_name`

## 強制的にpull
1. resetを使う  
`git reset --hard origin/master`

## リポジトリをエクスポートする

1. ※cloneしておく必要あり  
`git checkout-index -a --prefix=/target_dir/`

## pullする前に変更点を確認

```git:差分を見る
git diff HEAD..リモート名/ブランチ名
```
```git:差分を見る（ファイル名のみ）
git diff HEAD..リモート名/ブランチ名  --name-only
```
```git:差分を見る（ファイル名と変更量）
git diff HEAD..リモート名/ブランチ名 --stat
```

## マージコミットをrevertする

```
git revert -n -m 1 {コミットID}
```
-n: コミットしない（差分見てからコミットしたいため）
-m: マージのrevertでは必須。1or2を指定してどちらのブランチに戻すか指定する（1でやって差分ダメなら2にしてみるとかでいいかもw）

## 以前の状態に戻してそれを新規コミットとしたい

※resetだと新規コミットとはならないので、あえてコミットとして残したい場合
複数コミットをrevertすればOK


```:コミットが連続している場合
git revert -n {戻したい時点のコミットID}..HEAD
```

```:コミットが連続していない場合
git revert -n {コミットID}
git revert -n {コミットID}
```

-n: コミットしない（差分見てからコミットしたいため）
最後にコミットする

## チェリーピック！

```
git cherry-pick -n {コミットID}
```
-n: コミットしない（差分見てからコミットしたいため）
matplotlibで複数のグラフをアニメーションさせる


matplotlibで複数の図形をアニメーションさせるサンプルを書きました。
アニメーション前に動かしたい図形を描画しておかないとエラーが出ます。

##サンプルコード


```python3
#!/usr/local/bin/python3.5
# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig = plt.figure(1)
ax = fig.add_subplot(111)

#アニメーションさせる前に初期状態を描いておく
x = np.arange(0, 10, 0.1)
y = np.sin(x)
sin01, = ax.plot(y, 'b')
sin02, = ax.plot(y, 'g')

#フレーム更新
def update(i):
    sin01.set_ydata(np.sin(x-i))
    sin02.set_ydata(np.sin(x+i))

ani = animation.FuncAnimation(fig, update, 1000, blit=False, interval=100, repeat=False)
#ani.save('./animation.mp4')

plt.show()
```

##結果
![animation.gif](https://qiita-image-store.s3.amazonaws.com/0/49838/de99dae0-c333-792b-0b1d-3dc37117ce9e.gif "animation.gif")
Ajaxを使ったJSONの受け渡し【JavaScript】【Node.js】

#Ajaxとは？
Asynchronous + JavaScript + XMLの略
XMLHttpRequest(HTTP通信を行うためのJS組み込みコンストラクタ)による非同期通信を利用し、
通信結果に応じてダイナミックHTMLで動的にページの一部を書き換えるというアプローチを取る。
#XMLHttpRequest(XHR)とは？
非同期なデータの通信を実現するためのAPIです。
IE5でActiveX オブジェクトとして実装されましたが、他のブラウザでも互換性のある同等の機能がXHRとして利用できるようになりました。
#XMLHttpRequestオブジェクトについて
|プロパティ   |型    |説明                                          |
|:-----------|:-----|:---------------------------------------------|
|readyState  |Number|XHR通信の状態を取得する。                       |
|status      |Number|HTTPステータスを取得する。                      |
|responseText|String|レスポンスボディの内容を取得する。               |
|responseType|String|レスポンスボディのデータ型を指定する。           |
|response    |*     |レスポンスボディの内容を任意のデータ型で取得する。|

|メソッド|説明                                   |
|:------|:--------------------------------------|
|open() |サーバに対するHTTPリクエストを作成します。|
|send() |実際にサーバへ送信する。                 |

|イベントハンドラ    |型   |説明                                   |
|:-----------------|:----|:--------------------------------------|
|onreadystatechange|Event|XHR 通信の状態が変化するたびに実行される。|

#XMLHttpRequestオブジェクトの使用例
```js:main.js
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
        if (xhr.readyState === 4) {
            if (xhr.status === 200) {
                console.log(xhr.responseText);
            }
        } else {
            console.log("status = " + xhr.status);
        }
    }
xhr.open("GET", url);
xhr.send();

```
#JSONとは？
JavaScript Object Notationの略
軽量なデータ記述言語の１つである。
公文はJavaScriptにおけるオブジェクトの表記法をベースとしているが、JSONはJavaScript専用のデータ形式では決してなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しに使えるように設計されている。
#Node.js(express)サーバがJSONを返す
```node.js:app.js
var express = require("express"),
    router = express.Router();

router.get("/", function(req, res) {
    res.contentType("application/json");
    res.end(JSON.stringify({"test": "hoge"}));
}
```
#クライアント(JS)からJSONの呼び出し
```js:getJson
var xhr = new XMLHttpRequest();

xhr.onreadystatechange = function() {
    if (xhr.readyState === 4) {
        if (xhr.status === 200) {
            console.log(xhr.response);
        } else {
            console.log("status = " + xhr.status);
        }
    }
};

xhr.open("GET", url);
xhr.responseType = "json";
xhr.send();
```
#参考したサイト
[XMLHttpRequest - Web API インターフェイス](https://developer.mozilla.org/ja/docs/Web/API/XMLHttpRequest)
[JavaScriptプログラミング講座【XMLHttpRequest について】](http://hakuhin.jp/js/xmlhttprequest.html)
[jQueryを使わない書き方 ajax](http://mae.chab.in/archives/2821)
[CakePHP3] CakePHP3の環境をMAMPで構築する！

MacとMAMPで使用しているPHPのバージョンが違うことで、CakePHP3 をインストールする際にエラーが出るようです。
ですので、MacとMAMPの使用しているPHPのバージョンの違いを把握してから、composer, CakePHP3 のインストールを進めていきます。

## 1. MAMPのPHPのパスを通す
* Mac の PHP のバージョンを確認

このMacに入っているphpのバージョンは

```
php -v
```

で確認できる。

* MAMP の PHP のバージョンを確認

MAMP の「設定」から PHP の標準バージョンを確認できます。
私のMAMPの場合は php5.6.10 だったので、下記が MAMP の PHP のパスとなります。

```
/Applications/MAMP/bin/php/php5.6.10/bin/php
```

## 2. composerをインストールする
cakephp3をインストールする場所（今回はcakephp3）に移動して、下記コードを実行する
```
curl -sS https://getcomposer.org/installer | /Applications/MAMP/bin/php/php5.6.10/bin/php
```
## 3. CakePHP3をインストールする
composerをインストールしたら、そのまま下記コードを実行します。
今回は hoge フォルダに CakePHP3 をインストールしてみます。
```
/Applications/MAMP/bin/php/php5.6.10/bin/php composer.phar create-project --prefer-dist cakephp/app hoge
```
パーミッションをデフォルトの設定にするかと聞かれたら、Y にしておく。

ちゃんとインストールできていれば、ブラウザで CakePHP の画面を確認できると思います。

![スクリーンショット 2016-06-25 10.43.28.png](https://qiita-image-store.s3.amazonaws.com/0/109866/d11c00e1-c58b-aaba-45b2-93e9d9951f17.png)

## 4. データベースを接続
まだ、Database が　「CakePHP is able to connect to the database.」
となっていないと思いますので、データベース接続の設定をしましょう。

/cakephp3/hoge/config/app.php の下記箇所を変更します。

* ホスト名  
'host' => 'localhost'
* DBログインのユーザー名 （例 hoge）  
'username' => 'hoge'
* DBログインのパスワード （例 hogepass）  
'password' => 'hogepass'
* データベース名（例 hoge_db）  
'database' => 'hoge_db'


```
    'Datasources' => [
        'default' => [
            'className' => 'Cake\Database\Connection',
            'driver' => 'Cake\Database\Driver\Mysql',
            'persistent' => false,
            'host' => 'localhost',
            /**
             * CakePHP will use the default DB port based on the driver selected
             * MySQL on MAMP uses port 8889, MAMP users will want to uncomment
             * the following line and set the port accordingly
             */
            //'port' => 'non_standard_port_number',
            'username' => 'hoge',
            'password' => 'hogepass',
            'database' => 'hoge_db',
            'encoding' => 'utf8',
            'timezone' => 'UTC',
            'flags' => [],
            'cacheMetadata' => true,
            'log' => false,

```

Database が　「CakePHP is able to connect to the database.」
となれば DB の接続も完了です！！


CakePHP3 のインストールに苦戦しましたが、この方法でローカル開発環境を構築することができました！！
React + Redux + TypeScriptとImmutable.js


こちらの記事の続編です。
http://qiita.com/uryyyyyyy/items/30733e9cd140e60c52bd

## 問題提起

今時、型のない言語とか使いたくないですよね！（JSerにケンカ売る挨拶）
今回はtodoListのサンプルを通じて、immutableJSの良さを再確認しましょう。

## 環境

- NodeJS 5.x~
- React 15.1
- TypeScript 1.8

## 構成

こちらをご参照ください。
https://github.com/uryyyyyyy/react-redux-sample/tree/immutable

## Immutable.jsとは

JSでListやMapなどのコレクションを扱えるもの。
TypeScriptで使うと、ネイティブのArrayやObjectと比べて使えるメソッドが増えるのでオススメです。
（逆にJSで使うのであれば、ネイティブの型と混同しがちなのでlodashとかの方が良いのではないでしょうか？）

```
npm install immutable --save
typings install dt~immutable --global --save
```

### ネイティブ型の場合

```ts
let list:number[] = [1, 2]

//そんなものはない。
list.isEmpty()

list.push(3)
list // [1,2,3]　破壊的メソッドコワイ
```

### Immutable.jsのList型の場合

```ts
import {List} from "immutable";

let list:List<number> = List.of<number>(1, 2)

//ある！
list.isEmpty()

let newList = list.push(3)
list // [1,2]　Immutable!
```

## Immutable.jsでTodoList

https://github.com/uryyyyyyy/react-redux-sample/tree/immutablejs

基本コードを見てもらったほうが早いように思いますが、要点だけ。

```ts:src/todo/Reducer.ts

const initialState:TodoState = {todos: List.of<Todo>(), marks: marks};

export function todoReduce(state: TodoState = initialState, action: MyAction): TodoState {

    function changeStatus(state: TodoState, action: MyAction):TodoState {
        const newTodos = state.todos.map(v => {
            if (v.id === action.id) return new Todo(v.id, v.text, !v.isComplete);
            return v
        });
        return objectAssign({}, state, {todos: newTodos});
    }

    function addTodo(state: TodoState, action: MyAction):TodoState {
        let newNumber = 1;
        if(!state.todos.isEmpty()) newNumber = state.todos.map(v => v.id).max() + 1;
        const newTodo = new Todo(newNumber, action.text, false);
        return objectAssign({}, state, {todos: state.todos.push(newTodo)});
    }

    function deleteTodo(state:TodoState, action:MyAction):TodoState {
        return objectAssign({}, state, {todos: state.todos.filter(item => item.id !== action.id)});
    }
}
```

```ts:src/todo/TodoItem.tsx
export interface Props {
    /* ... */
    marks: Map<boolean, string>
}

render () {
        return (
            <li>
                <span>{this.props.marks.get(this.props.item.isComplete)}:  {this.props.item.text} </span>
         /* ... */
        );
    }
```

どうですか。Immutable.Listのおかげで綺麗に書けてる気がしませんか？
（うーん。。この例だと言うほど便利じゃなさそうかも？まぁ、SetやStackなど色々な便利コレクションが同梱されているので、それ系に慣れている方だとかなり便利かと思います。）

注意点としては、jsonサーバーとの通信で来るjsonは勝手にImmutable.jsのオブジェクトにならないので、都度変換する必要があります。

```ts
  const json: TodoInterface[] = [
    {id: 1, text: "todo 1", isComplete: true},
    {id: 2, text: "todo 2", isComplete: false}
  ];
  const todos: List<TodoInterface> = List.of(...json);
```

逆にimmutable.jsオブジェクトからjsonへの変換は期待通りになります。

https://facebook.github.io/immutable-js/#converts-back-to-raw-javascript-objects-
僕が思うnullがダメな理由 - なぜOptionalを使うのか？


# なんかピンと来なかった #
Scalaで初めて`Option`型に出会い、その時に「なぜ`Option`を使うのか？」を調べてもなかなかピンと来なくて、いま`Optional`を使う利点の一つに気がつけたので、書こうと思います。

# なぜ`null`がダメなのか #
初めて出てきた概念だったので、「`Optional`の利点」ばかり調べていました。
ですが、「`null`のダメな理由」分かったとき「なぜ`Optional`を使うのか」が分かってきました。

僕が思う`null`が悪い理由は「**`null`がどんな型にもなれる**」ことです。

```java
String str  = null;
Integer num = null;
int[] array = null; 
```

なぜ「`null`がどんな型にもなれる」ことが悪いかというと、「**メソッドが呼び出せる保証が失われる**」からです。

具体的に言えば、`String`なら文字の長さが取得できる`length()`が使える保証があるはずです。ですが、`str`がnullであれば、`length()`は呼び出せず、エラーしてしまいます。

```java
str.length();
```

このエラーの原因を「**コンパイル時に型エラーとして検出することができない**」ことが問題なのだと思います。



まとめると、`str`が`String`型なら`String`型が持っている`length()`, `charAt()`などのメソッドが呼び出せる保証していると思います。
`str`が`null`なら、メソッドが呼びだせずにエラーし、メソッドが呼び出せる保証を壊してしまいます。そしてこれをコンパイル時にはチェックできず、実行している最中にいきなりエラー(Javaならヌルポ）が発生します。

# Optionalを使う理由 #

「コンパイル時に型エラーとして検出することができない」ことが問題なので、「**コンパイル時に型のエラーとして検出できる**」ようにすればいいと思います。

そこで、型エラーとして検出できるように新しい型を導入したくなります。
**「あること」と「ないこと」を表す型の導入**です。これが「`Optional`型」だと思います。

つまり、`Optional`を使う理由は`null`が抱える問題の「コンパイル時に型のエラーとして検出できない」ことを解決することだと思います。

# Optionalを使ってみる #

`List`をインデックスで指定した要素を取得するメソッドを作ることにします(Javaで書きます)
注意点は、指定した「**要素がない場合**」があることです。この「要素がない場合を」`null`で扱った方法が以下の方法です。

## `null`を使ってしまう方法 ##

```java
String getAt(List<String> list, int index){
	// indexがlistの範囲のとき
	if(0 <= index && index < list.size()){
		String elem = list.get(index);
		return elem;
	} else {
		return null;　// 範囲外なのでnullを返す
	}
}
```

使うときはこんな感じです

```java
String elem = getAt(list, 9); // nullが返るかもしれない
```

### `null`が戻り値の問題点 ###

要素がないときは「Stringな`null`」が返ってきてしまいます。この`getAt()`を使うときは**`null`が返ってくることを常に意識**してプログラムを書く必要があります。

一度`null`が返るかもしれないメソッドを呼べば、その戻り値を使うたびに`null`であることを常に意識があります。


## Optionalを使う ##

```java
Optional<String> getAtOpt(List<String> list, int index){
	// indexがlistの範囲のとき
	if(0 <= index && index < list.size()){
		String elem = list.get(index);
		return Optional.ofNullable(elem); // elemをOptionalで包んで返す
	} else {
		return Optional.empty(); // ないので、empty()を返す
	}
}
```

使うときはこんな感じなります

```java
Optional<String> elemOpt = getAtOpt(list, 9);
```

### `Optional`が戻り値の利点 ###

「`null`を使ってしまう方法」とは違い、「**`null`が返ってくることを意識**してプログラムを書く必要がない」です。

他の利点として、戻り値の`Optional<String>`が**「あるかも」しれない「ないかも」しれないことを表すドキュメントみたい**になっているように見えることです。他の人が作った関数でも、戻り値が`Optional`なら「結果がないかもれないんだなぁ」とすぐに分かります。それに対し、`null`を返す場合があることはソースコードを実際に読まないと分からないです。

### おまけ - 値があるときに実行 ###

ちなみに、`Optional`の値があるときに実行させたければ、`isPresent`が便利です

```java
elemOpt.ifPresent(elem -> {
	System.out.println(elem); // elemOptの中身があるときに中身elemを表示
});
```

# まとめ #


`null`はどんな型にでもなれる
　　　　　　　　↓
`null`の時はメソッドが呼び出せる保証が失われる
（コンパイル時にチェックできない）
　　　　　　　　↓
コンパイル時にチェックできるように
「ある」、「ない」を表す新しい型を導入したくなる
　　　　　　　　↓
「ある」、「ない」を表す`Optional`の導入
Windowsでリモートデスクトップ接続すると実行中のWPFアプリケーションのUnloadedイベントが発生する

# 環境
Windows 8 (Windows2012Serverでも同様の結果となりました)

# 検証用アプリ
WindowとListBoxのInitialized, Loaded, Unloadedイベントを捕捉するようにしただけのアプリ

```xaml:MainWindow.xaml
<Window x:Class="TestApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        Initialized="Window_Initialized"
        Loaded="Window_Loaded"
        Unloaded="Window_Unloaded">
    <Grid>
        <ListBox Name="list"
                 Initialized="list_Initialized"
                 Loaded="list_Loaded"
                 Unloaded="list_Unloaded"/>
    </Grid>
</Window>
```
```cs:MainWindow.xaml.cs
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_Initialized(object sender, EventArgs e)
        {
            list.Items.Add(DateTime.Now.ToString("hh:mm:ss.fff") + " Window_Initialized");
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            list.Items.Add(DateTime.Now.ToString("hh:mm:ss.fff") + " Window_Loaded");
        }

        private void Window_Unloaded(object sender, RoutedEventArgs e)
        {
            list.Items.Add(DateTime.Now.ToString("hh:mm:ss.fff") + " Window_Unloaded");
        }

        private void list_Initialized(object sender, EventArgs e)
        {
            list.Items.Add(DateTime.Now.ToString("hh:mm:ss.fff") + " list_Initialized");
        }

        private void list_Loaded(object sender, RoutedEventArgs e)
        {
            list.Items.Add(DateTime.Now.ToString("hh:mm:ss.fff") + " list_Loaded");
        }

        private void list_Unloaded(object sender, RoutedEventArgs e)
        {
            list.Items.Add(DateTime.Now.ToString("hh:mm:ss.fff") + " list_Unloaded");
        }
    }
```

# 検証開始
0. 検証用アプリを実行する  
![wpf_1.png](https://qiita-image-store.s3.amazonaws.com/0/45961/f9a0ab16-359e-06ca-71c3-3333e360506e.png)  
検証用アプリのウインドウが表示され、Loadedイベントまで実行されたことがわかる
0. リモートデスクトップ接続  
検証用アプリを実行している環境に対して、リモートデスクトップ接続を試みる  
![rdc_1.png](https://qiita-image-store.s3.amazonaws.com/0/45961/52d7f44a-ebbf-4754-a6c8-57bd1926d290.png)
0. リモートデスクトップで接続後の検証用アプリの様子  
![wpf_2.png](https://qiita-image-store.s3.amazonaws.com/0/45961/d931d2b5-57e9-e06d-880f-468f7ebec0af.png)  
ListBoxのUnloadedイベントとLoadedイベントが実行されたことがわかる  
WindowのUnloadedイベントは呼ばれず、ControlだけUnloaded, Loadedが実行される模様。

開発中のアプリで「リモートデスクトップした時になんかおかしな動きをしている』と言われて調べて初めてわかりました(常識？)
Windowが閉じられるまで発生しないだろうと思っていたので、とあるコントロールのUnloadedイベントに終了処理を書いていたのがいけなかったみたいです。
swiftでアクションシートを使う

アクションシートとはぴょこっと出てくるあれです。

これ
<img width="317" alt="スクリーンショット 2016-06-25 10.36.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/64331/5e6f3b20-3835-9ebb-a095-0dc5f5ec4090.png">




#追加方法
以下をコピペでボタンアクションのところとかにコピペすればokです。

```
        // styleをActionSheetに設定
        let alertSheet = UIAlertController(title: "title", message: "message", preferredStyle: UIAlertControllerStyle.ActionSheet)

        // 自分の選択肢を生成
        let action1 = UIAlertAction(title: "1", style: UIAlertActionStyle.Default, handler: {
            (action: UIAlertAction!) in
        })
        let action2 = UIAlertAction(title: "aka", style: UIAlertActionStyle.Destructive, handler: {
            (action: UIAlertAction!) in
        })
        let action3 = UIAlertAction(title: "cancel", style: UIAlertActionStyle.Cancel, handler: {
            (action: UIAlertAction!) in
        })
        
        // アクションを追加.
        alertSheet.addAction(action1)
        alertSheet.addAction(action2)
        alertSheet.addAction(action3)
        
        self.presentViewController(alertSheet, animated: true, completion: nil)
```
Ralisの初期設定 (備忘録)

## はじめに

久しぶりにRails触ることがあったので、初期設定を書いておこうと思います.
しょうもない記事です.

## 環境 & 前提

rubyはrbenvで管理しています(あまり関係ないけど)

```
% ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin15]
```

.zshrc ( or .bash_profile)には以下のエイリアスが設定してあります

```
# alias : rails
alias bundle install="bundle install --path=vendor/bundle"
alias rails="bundle exec rails"
alias rake="bundle exec rake"
```

## 初期化手順

```
mkdir newapp
bundle init    #=> Gemfileができる
vim Gemfile    #=> 編集(※1)
bundle install #=> railsのインストール
rails new .    #=> rails projectを作成
```

#### ※1 : Gemfileの編集

`gem rails`をコメントインしましょう. (もしなければ書き足すと最新のものが入るはず)

```
source "https://rubygems.org"

gem "rails"
```

## その他

`bundle exec` に関しては、project毎に管理するためです。 全体にrailsが入ってもいいって人は `sudo gem install rails`を叩くがいいさ..


Sublime, Atomを使う人は以下の設定しておくと便利かも..?

```
# .zshrc

alias sublime="open -a 'Sublime Text'"
alias atom="open -a Atom"
```
git stashをコミットもなしに消してしまった時の対応

# git stash 消えた・・・　しかも、コミットしてない・・・
SourceTreeで変更の適用をしようとした瞬間、手元が狂って、「変更の削除」を選択。そのstashは返らないものに思われた・・・。

「また１から実装か・・・」と嘆いておりましたがぐぐったら以下の方法がヒット。
しかもコミットしてなくても使えます。git stash復元・復活が可能です。

[git stash save で一時退避した変更を、誤って git stash clear で消してしまったときの回復法](http://d.hatena.ne.jp/t-wada/20090407/p1)

## 方法
MacであればTerminalを開きます。

```
$ git fsck | awk '/dangling commit/ {print $3}'
```
と打ちます。

```
[shtr_t@localhost myproject]$ git fsck | awk '/dangling commit/ {print $3}'
Checking object directories: 100% (256/256), done.
Checking objects: 100% (93244/93244), done.
70a401ef9784b3cbb6697b6d335888728384fa62
[shtr_t@localhost myproject]$ git cherry-pick -n -m1 70a401ef9784b3cbb6697b6d335888728384fa62
```
※消したスタッシュが多ければ多いほどたくさん出るので、cherry-pickしつつ変更内容を確認する作業が必要になります。


![スクリーンショット-2016-06-16-10.37.18.png](https://qiita-image-store.s3.amazonaws.com/0/13595/37b2f93a-5e88-849e-1e22-90f0cba4c7dc.png)

戻ったあぁあああああああ！

### 資料
[git stashをコミットもなしに消してしまった時の対応](https://wandering-engineer.tech/git-stash-removed-to-recover)
tig の キーバインド設定メモ


`bind {keymap} {key} {action}` の形式

keymap はどの view に対する設定かを指定。 generic は全てに反映

```
main, diff, log, help, pager, status, stage, tree, blob, blame, branch, generic
```

key は割り当てるキー。特殊なキーは以下

```
Enter, Space, Backspace, Tab, Escape, Left, Right, Up, Down, Insert, Delete, Hash, Home, End, PageUp, PageDown, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12.
```

Control キーとの組み合わせはプレフィクスとして `^` を使用。

```例)
bind main ^f scroll-page-down
```

action は `:` で始まるものは tig の内部コマンド、 `!` で始まるものは外部コマンドと解釈される。

内部コマンドは `man tigrc` を参照

外部コマンドはさらに以下のプレフィクスが使用できる

* `@` バックグラウンドで実行
* `?` プロンプトを表示
* `<` コマンド実行完了とともに tig を終了


## tigの例


```~/.tigrc
bind main B !git rebase -i %(commit)^
bind diff B !git rebase -i %(commit)^
bind status D !?rm %(file)
```
Python のはじめ方


# はじめに

- この記事の目的: 解析環境を整える
	- 自分のPCに解析環境を!!
	- 解析を自動化する
	- 解析を手順化する(先人の知恵を借りるだけでなく, 後輩にも知恵を残そう)

(MATLABなどライセンス縛りのあるものでなく, 誰でも利用出来る環境で研究(仕事)をしよう.)

----

# Pythonを知ろう

- 概要
- 出来る事

----


## 概要
以下のURL先で, Python を知ろう.

- [本家 Python.org](https://www.python.org/)
- [Python 日本語](http://www.python.jp/)
- [Pythonのモジュール](https://pypi.python.org/pypi)
	- MATLAB でいうToolbox に相当する

----

## 出来る事

- 文字列処理
- 科学計算: データ解析, データの描画
- 通信: 各種産業IOでの通信(USB, RS-232C, ....; 計測器の制御など), ネットワーク
- その他: web, マニュアル, レポート?の作成

とにかく, なんでも出来そう.

----

# 環境を整える
現在Python は, 2.7系と3.5系があるがサポート期間が長い3.5系を使いましょう.

- 参考: [【リンク集】Python科学技術計算パッケージ (Enthought Canopy, Anaconda, Pythonxy )の導入記事集](http://derivecv.tumblr.com/post/110760336530)

----

## Windows

- [こちらからダウンロードする](https://www.continuum.io/downloads)
	- Anaconda
- 参考: [Windowsでpython環境を作る](http://cartman0.hatenablog.com/entry/2016/03/23/005430)
    - conda環境で, pythonのversion管理が出来る事は知りませんでした。


----

## Mac/Linux

- Homebrew(パッケージ管理ツール)
- git
- Ruby(system; 最初から入っているもので良い)

[anyenv と pyenv](https://github.com/riywo/anyenv) を使ってインストールします。

----

### 準備
```
# Mac/ Homebrewを入れます
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

# gitを入れましょう
$ brew install git # Mac
$ sudo apt-get install git # Debian 系
$ sudo yum install git # RedHat 系

```

----

### Pythonを入れます
```
# anyenv と pyenv をインストールします。
$ git clone https://github.com/riywo/anyenv ~/.anyenv
$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> $HOME/.zshrc
$ echo 'eval "$(anyenv init -)"' >> ~/.zshrc
$ exec $SHELL -l

$ anyenv install pyenv

$ pyenv install anaconda3-*.*.* # その一番新しい番号
$ pyenv global anaconda3-*.*.* && pyenv rehash && exec $SHELL -l

```
zsh以外の人は, それぞれ読み替えてください

----

## モジュールのインストール

以下のモジュールは入れておこう

- Scipy関係: Numpy, Scipy, Matplotlib, iPython, pandas
- Jupyter
- pyserial

```
> pip install numpy
```

----

# Python を始めよう

ここにやりたい事があると思いますが, Googleなどで"python 入門"や"python 回帰分析"などと検索してみよう. また, 以下のページを参考にする. 

- [Python チュートリアル](http://docs.python.jp/3.5/tutorial/)
- [Scipy Lecture Notes (日本語訳)](http://www.turbare.net/transl/scipy-lecture-notes/)
- [ドットインストール : python](http://dotinstall.com/lessons/basic_python_v2)
Spark FrameworkとGoogleのライブラリでWeb開発

[Spark Framework](http://sparkjava.com/) で非常に簡単にWebアプリケーション開発を開始できるということは、多くの記事でご覧になれると思います。さて、実際のWeb開発を行うには、さらにデータベースへ接続したり、JSONを返してAPIを作成したり、さらにサーバサイドレンダリングを行うならテンプレートエンジンが必要です。

このようなコンポーネントを組み合わせて開発する上で、実際にどのようなライブラリを組み合わせればよいのかというあたりを紹介したいと思います。

# Guice

Java 8 のラムダ式で簡単に `Route` が書けるとはいえ、すべてを main に書くのはつらいものがあります。トランザクションなどを含む少し長めの処理は、 Java 7 時代に戻って `Route` を実装したクラスを書くのが賢明でしょう。

しかし、ラムダ式の部分を `Route` クラスとして実装するとなると、キャプチャとして解決できていた変数は全てコンストラクタの引数として渡さなくてはいけません。これは非常に面倒です。そこで、 `Route` に依存するオブジェクトを DI で解決することにしましょう。

有名な DI フレームワークとしては Spring がありますが、 Spark Framework と一緒に使うには少しおおげさです。それならそのまま Spring Boot を利用した方が素直でしょう。また、 Spring は `Map<String, Object>` 的な名前による DI を基本としているのに対して、 Guice は `Map<Class, Object>` が基本なので、 IDE が名前を見つけられてリファクタリングがしやすいコードになる点が個人的には好みです。あと設定も Guice の方がわかりやすいと感じる人が多いのではないでしょうか。

# args4j

コマンドラインを解析するライブラリはいくつかありますが、その中でも [args4j](http://args4j.kohsuke.org/) は一番親切なオプションを作れる気がします。似たようなツールに [JCommander](http://jcommander.org/) や [JOpt](https://pholser.github.io/jopt-simple/) がありますが、どれか好きなのを使えば良いかと思います。

[Lombok](https://projectlombok.org/) の `@Data` で getter/setter を作成し、 `Guice` の `toInstance` で `bind` すれば、アプリケーション全体の設定として各コンポーネントで共有することができます。さらにオプションを yml なんかで書けるようにすると今風ですが、とりあえずは `envsubst` と `xargs` で十分です。

# Sql2o

データベースの操作には、 [Spark Framework のチュートリアル](https://sparktutorials.github.io/2015/04/29/spark-and-sql2o.html) に習って、 [Sql2o](http://www.sql2o.org/) を利用します。 args4j で取得した JDBC URL の設定によって Guice で DAO の bind を切り替えていれば、非標準の SQL を書いてしまうのもそれほど怖くはありません。そもそもマイクロサービスの思想的にも、2人週程度の工数で作り直せないレベルのものを作るべきではありません。

SQL なんて人の書くものではないという方は、 Hibernate や jOOQ あたりが選択肢に入ってくると思います。

2016/10/14 追記： [HikiriCP](https://github.com/brettwooldridge/HikariCP) との組み合わせも良いと思います。

# Gson

JSON の Serialize/Deserialize には、 [Jackson](https://github.com/FasterXML/jackson) と [Gson](https://github.com/google/gson) の選択肢がありますが、どうやら
 [小さめのJSONなら、GSONの方が速いらしい](http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/) です。 Spark Framework のドキュメントでも Gson を紹介していますので、素直に Gson を使うことにします。もし作製した後でパフォーマンスの良い方を選択したいのであれば、 Adapter となるオブジェクトを作成し、 Guice に切り替えてもらいましょう。

# Closure Templates

[Closrue Templates](https://developers.google.com/closure/templates/) は Java と JavaScript の両方から利用できるテンプレートエンジンです。 [{{ mustache }}](https://mustache.github.io/) も様々な言語から利用できますが、 i18n 対応のあたりまで考えるとこちらの方が機能的にありがたいです。

最後に文字列にすればよいので、 Closure Templates をそのまま利用しても良いのですが、[サーバを起動したまま変更を検知してテンプレートの再コンパイルを行うライブラリ](https://github.com/utisam/spark-template-soy) を書きましたのでご活用ください。

# まとめ

* GuiceのシンプルなDIで各コンポーネント間の依存関係を解決します
* Sql2oは `java.sql` のラッパーとして十分な機能を提供しています
* APIに用いられる程度のサイズであれば、Jackson以外にGsonも悪くないの選択肢だと思います
* Closure Templatesを利用すると、JavaでもJavaScriptでも利用可能なテンプレートを作成できます

Spark Frameworkを用いたパターンの一つとして参考にしていただければと思います。
RailsとMySQLでend_of_dayが想定通りに動かない問題

Rails側でTime.now.end_of_dayした時刻をMySQLにぶち込むと以下のような感じになる問題

---------------
 2016-04-25 14:59:59　#理想
      ↓
 2016-04-25 15:00:00　#現実

----------------

#既出でした
この記事がまんまそれ。
http://techlog.voyagegroup.com/entry/2015/04/09/162629

どうやらミリ秒が原因らしい。
最新のRailsだと解決済みの問題らしい
ミリ秒は別に要らない要件だったのでミリ秒を切り捨てることにする

#コード
```
endtime   = Time.at(endtime.end_of_day.to_i)
```
これでミリ秒が切り捨てられるのでMySQLにぶち込んでやれば理想の時刻が入るようになる。
Rubyはあまり触らないのでもう少し効率的なミリ秒切り捨てがあるかもしれない。
ESP8266 > Link > watchdogのdisable / enable > wdt_disable() / wdt_enable(WDTO_8S)

```txt:動作環境
ESP-WROOM-02
```

## wdt_disable() / wdt_enable()

watchdog resetがかかるESP8266の調査をしている中で、setup()内の処理時間が長くなる場合にwatchdogを無効にして処理をして、setupが終わったらwatchdogを有効にすればいい、という記載が以下で見つかった。

https://github.com/esp8266/Arduino/issues/34

> igrr commented on 2 Apr 2015
> I meant something like this:

```
void setup() {
  wdt_disable();
 /// some initialization
  ThirdPartyLibrary.begin();
/// more stuff
  wdt_enable();
}
```

上記を実際にESP8266のコードに追加してみた。
wdt_enable()を引数なしでコンパイルすると以下のエラーが出る。

```
 void wdtEnable(WDTO_t timeout_ms = WDTO_0MS);

              ^

exit status 1
コンパイル時にエラーが発生しました。
```

wdt_enable()は以下のように引数が必要だった。WDTO_8Sだと初期値の8秒にセットできる。

```c
void setup() {
  wdt_disable();

  Serial.begin(115200);
  Serial.println("");

  // 時間のかかる処理

  wdt_enable(WDTO_8S);
}
```

## ESP.wdtDisable()とESP.wdtEnable(15000)

上記と同じリンク
https://github.com/esp8266/Arduino/issues/34

その下の方に以下の関数が示されている。

```
ESP.wdtDisable();
ESP.wdtEnable(15000); 
```

wdt_enable()だと http://www.nongnu.org/avr-libc/user-manual/group__avr__watchdog.html に記載の通り設定時間の選択子が9通りしかない。
ESP.wdtEnable()だとmsec単位で指定でき、その制限がないのだろうか。
OpenFOAMが提供する並列計算用クラス

# Pstream

## 参考リンク

[OpenFOAM C++ Documentation : Pstream](http://www.openfoam.com/documentation/cpp-guide/html/a02100.html)

## メンバー関数

- Pstream::nProcs() : プロセッサー数
- Pstream::myProcNo() : 自身のプロセッサーID
- Pstream::blocking, scheduled, nonBlocking : プロセッサー間のコミュニケーションの方法
- Pstream::parRun() : 並列計算ならばtrueを返す。

など

# OPstreamとIPstream

## 参考リンク

[OpenFOAM C++ Documentation : OPstream](http://www.openfoam.com/documentation/cpp-guide/html/a01785.html)
[OpenFOAM C++ Documentation : IPstream](http://www.openfoam.com/documentation/cpp-guide/html/a01240.html)

## メンバー関数

### コンストラクタ

- OPstream(const commsType, const int toProcNo, const label bufSize, ...)
- IPstream(const commsType, const int fromProcNo, const label bufSize, ...)

### 使い方の例

OpenFOAMをインストールしていればapplication/test/parallelディレクトリにテストコードがありますのでそちらを参照してください。

[github: OpenFOAM-2.1.x/applications/test/parallel/Test-parallel.C](https://github.com/OpenFOAM/OpenFOAM-2.1.x/blob/master/applications/test/parallel/Test-parallel.C)

例えばこんな使い方。

```cpp
labelList sizes(Pstream::nProcs(), 0);             // プロセッサー数と同サイズのlabelListを作成し0で初期化
sizes[Pstream::myProcNo()] = Pstream::myProcNo();  // 自身のプロセッサー番号をプロセッサー番号と同じ番地に代入

if (Pstream::parRun())
{
    // データ送信
    for (label procI = 0; procI < Pstream::nProcs(); procI++)
    {
        if (procI != Pstream::myProcNo()
        {
            OPstream toProc(Pstream::blocking, procI);
            toProc << sizes[Pstream::myProcNo()];   // 自身のデータを他のプロセッサーに送る
        }
    }


    // データ受信
    for (label procI = 0; procI < Pstream::nProcs(); procI++)
    {
        if (procI != Pstream::myProcNo()
        {
            IPstream fromProc(Pstream::blocking, procI);
            fromProc >> sizes[procI];              // 他のプロセッサーから送られてきたデータを受信 
        }
    }
}
```

# Reduce Operation

## 参考リンク

[OpenFOAM C++ Documentation : PstreamReduceOps](http://www.openfoam.com/documentation/cpp-guide/html/a08023.html)
[OpenFOAM C++ Documentation : PstreamCombineReduceOps](http://www.openfoam.com/documentation/cpp-guide/html/a08246_source.html)

- void reduce(T& value, const BinaryOp& bop, ...)
- void returnReduce(T& value, const BinaryOp& bop, ...)
- void combineReduce(T& value, const CombineOp& cop, ...)


など。

BinaryOpはOpenFOAMが用意している並列計算用のオペレーションクラス
[OpenFOAM C++ Documentation : ops.H](http://www.openfoam.com/documentation/cpp-guide/html/a09141.html)
を使用する。

- sumOp\<T>()
- maxOp\<T>()
- minOp\<T>()
- andEqOp\<T>()

などが用意されている。


combineReduceはList専用のreduce関数で、combineOpはUPstream::listEq()のみ使用できる。List<List<T> >型オブジェクトを共有するために使用する。ただしfoam-extendには用意されていない。
[OpenFOAM C++ Documentation : UPstream.H](http://www.openfoam.com/documentation/cpp-guide/html/a08255_source.html)


# syncTools

## 参考リンク

[OpenFOAM C++ Documentation: syncTools Class Reference](http://cpp.openfoam.org/v4/a02631.html)

## 説明

syncToolsは各プロセッサーのメッシュのpoint, edge, face, cellのうち、processorPolyPatch上のものを同期させるユーティリティーツールです。
【悲報】WebGLでは複数コンテキスト間のリソース共有が（現時点では）できなかった！


# はじめに

皆さんこんにちは。貴方を心の中で見守るもう一人の貴方自身、エマ・デュランダルです（もう挨拶ワケわかんなくなってきたね）。

いやまったく悲報ですよ悲報！　悲しみの報せ以外の何物でもないですよ！

私、不肖ながら自作の[WebGLライブラリ](https://github.com/emadurandal/GLBoost)なんぞを作っておりまして、そこで複数のWebGLコンテキストを作った場合のリソースの扱いをどうしようかと悩んでおりました。

せっかくなら、汎用的な仕様にしたかったのです。

# リソース共有ってステキ☆

汎用的な仕様というのは、 **『OpenGL系は「〜〜〜Object」と名前の付くリソースは、複数のコンテキスト間で共有できる』** という特性をちゃんと考慮した仕様です。

ええ〜〜〜！？　そんなことできるんですか？　できるんです。

OpenGLもOpenGL ESもできます。

具体的には、例えば以下のようなリソースが共有できます。

* Program Object
* Frame Buffer Object
* Vertex Buffer Object
* Index Buffer Object
* Texture Object

ということで、「じゃあこれWebGLでも当然できるんじゃね？w」とエマさん思ったわけですよ。

例えば、Canvasを複数ページに配置しておいて、それぞれのCanvasから取得したコンテキスト間で、同じリソースをシェアすればGPUリソースの節約につながるよね！　と……。

# ここで悲報

で、やってみたらですね。 **できないでやんの（爆笑）**

`WebGL: INVALID_OPERATION: bindBuffer: object not from this context`とか`WebGL: INVALID_OPERATION: getUniformLocation: object does not belong to this context`といったエラーの嵐で、全然使えません。

ん？　本当に使えんのか？　WebGLはOpenGL ES 2.0をベースにしているんだぞ。おかしくね？

と思って、ググって調べてみましたよ私。

そしたら、以下の感じのページがヒットしましてね。

[StackOverFlow](http://stackoverflow.com/questions/9122361/is-it-possible-to-have-two-webgl-contexts-on-the-same-page)

[SharedResouces](https://www.khronos.org/webgl/wiki/SharedResouces)

[WEBGL_shared_resources](https://www.khronos.org/registry/webgl/extensions/WEBGL_shared_resources/)

# 一応、偉い人たち議論はしてるみたい

早い話が、

「WebGLでの複数コンテキスト間のリソース共有は、標準では非サポート」

なんだけれども、一応「できるようにしたいね」って議論はされていて、実際に`WEBGL_shared_resources`という拡張も提案されてます。

なんだけど、調べてみたところ、この`WEBGL_shared_resources`に対応しているブラウザが今の所 **皆無（爆）**

なんなんでしょうね。ANGLEの制約とかあるんでしょうかね。よー事情はわからんけども。

一応、この`WEBGL_shared_resources`を（将来サポートしたブラウザで）使うと、コンテキストの初期化時に

```
var canvas1 = document.createElement("canvas");
var canvas2 = document.createElement("canvas");
var ctx1 = canvas1.getContext("webgl");
var sharedResourcesExtension = ctx1.getExtension("WEBGL_shared_resources");
var ctx2 = canvas2.getContext("webgl", {
    shareGroup: sharedResourcesExtension.group
});
```

ってやると、ctx1で作ったリソースをctx2でも使えるようになるみたいです。

早く実現されるといいなー。

あ、ちなみに。OpenGL / OpenGL ESではすでに複数コンテキスト間のリソースの共有はできますが。
バインド状態などのステートに関しては、それぞれのコンテキスト固有の情報で、それらの状態は共有でないので、そこは留意してください。（WebGLで実現されるようになったとしても、同じようになるはずです）

あーあ、残念だったなー。

# 謝辞

本記事の執筆にあたって、株式会社トップゲート／山下武志様が書かれた以下の書籍を参考にさせていただきました。お礼申し上げます。

「[マルチプラットフォームのためのOpenGL ES入門　応用編](http://www.amazon.co.jp/dp/4877833439)」
技術英語 > Elani, please, put that down. / Put that down gently / Put one lever down, gently

@ Star Trek Voyager > INNOCENCE

船の修理を始めるTuvokが子どもたちに言い聞かせる

> I expect each of you to sit quietly and not touch any of the equipment.

子どもたちの回答は

> We promise.

次の場面では子どもたちがはしゃぎ、ある子どもは船の部品を興味深げに触っている。それに対してTuvokが

> Elani, please, put that down.

<hr>
関連して思い出したのは

put that down <font color=red>gently</font>
> そっと置く

https://ninatrackschanges.wordpress.com/claras-memoirs/jobs/
> <font color=red>Put that down gently</font>, and turn the mirror in the second lever.

同じページにPut … genltyとして以下の例文もある。

> <font color=red>Put one lever down, gently</font>, too hard and the mirror gets smashed and you have glass all over the place;
RaspberryPi - ENC28J60(SPI-Ethernet)設定

- I2C-RTC, SPI-Ethernet, UART(USB-Serial)を接続の図<br>
![RPiZero_RTC_Ether.jpg](https://qiita-image-store.s3.amazonaws.com/0/75594/ef684b91-84bd-98cc-29cb-d35f0cc2b71c.jpeg)

## 環境
- `2016-05-27-raspbian-jessie-lite.img`
- Raspberry Pi Zeroで確認
- [ENC28J60](http://ww1.microchip.com/downloads/en/devicedoc/39662a.pdf)のモジュール(SPI-Ethernet Port) <br>ワイヤーを7本。
    - SPI - SI, SO, SCK, CS0
    - INT - GPIO25 デバイスからの割り込み
    - 電源 - VCC(3.3V), GND
- 参考: [Ethernet On Pi Zero – How To Put An Ethernet Port On Your Pi](http://raspi.tv/2015/ethernet-on-pi-zero-how-to-put-an-ethernet-port-on-your-pi)

## 手順
1. `sudo raspi-config`
    - SPI有効化<br>`9 Advanced Options > A5 SPI > Enable` 
2. `sudo vi /boot/config.txt`

    ```txt:/boot/config.txt以下を最後に追加
...
#dtoverlay=enc28j60  - 25MHzというのがかいてあったので、25Mhzに設定.
dtoverlay=enc28j60,int_pin=25,speed=25000000
```
3. `sudo reboot`<br>再起動

4. `ifconfig`<br>`eth0`あらわれた？




## その他

### [DOCUMENTATION > HARDWARE > RASPBERRYPI > SPI](https://www.raspberrypi.org/documentation/hardware/raspberrypi/spi/README.md)によると

- SPEED
The CDIV (Clock Divider) field of the CLK register sets the SPI clock speed:

    ```
SCLK = Core Clock / CDIV
If CDIV is set to 0, the divisor is 65536. The divisor must be a 
power of 2. Odd numbers rounded down. The maximum SPI clock rate is 
of the APB clock.
```

    ```
     cdiv    speed
        2    125.0 MHz
        4     62.5 MHz
        8     31.2 MHz
       16     15.6 MHz
       32      7.8 MHz
       64      3.9 MHz
      128     1953 kHz
      256      976 kHz
      512      488 kHz
     1024      244 kHz
     2048      122 kHz
     4096       61 kHz
     8192     30.5 kHz
    16384     15.2 kHz
    32768     7629 Hz
```

### SPIクロックとスピード
- `pi@raspberrypi:/tmp wget https://www.python.org/ftp/python/2.7.11/Python-2.7.11.tgz`
- `/tmp` は、tmfs (RAM)
- 実際に設定されるクロックは↑の制限があるので、設定値にちかいものになるらしい。

    - default = 395KB/s

        ```txt:dtoverlay=enc28j60,int_pin=25
Python-2.7.11.tgz   100%[=====================>]  16.08M   395KB/s   in 42s
```
    - 12MHz(おそらく7.8MHz) = 366KB/s 

        ```txt:dtoverlay=enc28j60,int_pin=25,speed=12000000
Python-2.7.11.tgz   100%[=====================>]  16.08M   366KB/s   in 43s
```

    - 25MHz(おそらく15.6MHz) = 543KB/s

        ```txt:dtoverlay=enc28j60,int_pin=25,speed=25000000
Python-2.7.11.tgz   100%[=====================>]  16.08M   543KB/s   in 32s
```

    - 2MHz(おそらく1953kHz) = 134KB/s

        ```txt:dtoverlay=enc28j60,int_pin=25,speed=2000000
Python-2.7.11.tgz   100%[=====================>]  16.08M   134KB/s   in 2m 41s
```



   - 参考: <font color='blue'>**Raspberry Pi 3**</font>のEthernet = 9.57MB/s

        ```txt:参考：RaspberryPi3のEthernet
Python-2.7.11.tgz   100%[=====================>]  16.08M  9.57MB/s   in 1.7s   
```
特定のディレクトリ配下にあるファイルから、指定したキーワードを含むファイルを検索するスクリプト


```bash
#!/bin/bash

pattern=$1
directory=$2
name=$3

if [ -z "$directory" ] ; then
  directory=.
fi

if [ -z "$name" ] ; then
  name='*'
fi

find "$directory" -type f -name "$name" | xargs grep -nH "$pattern"
```
SourceHanCodeインストールで嵌った

SourceHanCodeをUbuntu14.04にインストールする時に嵌りました。

インストール手順は[こちら](http://qiita.com/nullpointer_t/items/45aabe140301b0183cbf)を参考にしました。

command.sh実行時にエラー発生。

```
Please re-install the FDK. 
The executable directory '/home/randika/FDK/Tools/linux' is missing the tools: ['tx', 'makeotfexe']. 
for the files referenced by the shell script is missing.
```


調べてみるとFDKが32bit版にしか対応していないようなので、lib32z1をインストールして64bitOS上で32bitソフトウェアを実行できるようにします。


```
sudo apt-get install lib32z1
```

しかしまたエラー・・・
```
ERROR: FontTools Python module is not installed. 
```
PythonのFontToolsモジュールが必要なようなので、pipでFontToolsをインストール。

```
sudo pip install fonttools
```

再びcommand.shを実行し、無事インストールすることができました。


参考URL:
https://github.com/adobe-type-tools/afdko/issues/55
https://github.com/behdad/fonttools/blob/master/README.md
WindowsXPにPythonをインストールできない人へ

#背景

MicrosoftがXPのサポートを停止して随分経ちました。
ネットで面白いライブラリやソフトを見つけてもXPではインストールできない事が多々あります。
オープンソースならば自分でコンパイルする手も有りますが経験上殆ど成功しません。
依存ライブラリや英語の説明文など壁は厚いです。
今日はGoogle App Engineに挑戦するためPython2.7をインストールしました。

#方法

ActivePythonを使います。
これはPythonを幅広い環境で使えるようにしたインストーラです。
Pythonとしての機能は本家と差が無いです。
Python本家とは違い、こちらはXPでも使えました。
[http://www.activestate.com/activepython/downloads](http://www.activestate.com/activepython/downloads)
にアクセスしDownload Active Python for Windows
をダウンロードして実行

おめでとうございます。これであなたもPythonian

#失敗経験

####本家msi
実行時エラー
####本家ソースコード
PCフォルダからコンパイルできる。環境変数PATHから登録
しかしGoogle App Engineから標準HTTPライブラリが使えねーぞと怒られる。原因を調べようとしても英語の壁は厚い。
インストーラのコンパイルも出来るようだがafxres.hが無いと怒られる。
どうもMfcに依存しているようだ。面倒臭い。
RaspberryPi - DS3231(RTC)設定

- I2C-RTC, SPI-Ethernet, UART(USB-Serial)を接続の図<br>
![RPiZero_RTC_Ether.png](https://qiita-image-store.s3.amazonaws.com/0/75594/1b2ed881-833e-1ce8-4e67-6ee476c8e479.png)

## 環境
- Raspberry Pi (Zero/2/3で確認)
- DS3231 (RTC バックアップ電池つき)
- Raspbian: `2016-05-27-raspbian-jessie-lite.img`

## 手順
1. `sudo raspi-config`
    - I2C有効化<br>`9 Advanced Options > A6 I2C > Enable` 
2. `sudo vi /boot/config.txt`

    ```txt:/boot/config.txt以下を最後に追加
...
dtoverlay=i2c-rtc,ds3231
```
3. `sudo reboot`<br>再起動

4. `sudo vi /lib/udev/hwclock-set`

    ```txt:/lib/udev/hwclock-set以下をコメントアウト
...
#if [ -e /run/systemd/system ] ; then
#    exit 0
#fi
...
```

5. サービス停止(fake-hwclock,ntp)、`ntpdate`で時刻補正をして、RTCに保存、`shutdown`

    ```bash
sudo update-rc.d fake-hwclock disable
sudo update-rc.d ntp disable
sudo apt-get -y install ntpdate i2c-tools
sudo sh -c 'ntpdate pool.ntp.org ; hwclock -w'
sudo shutdown -h now
```

6. 電源をおとして、ちょいとまってから、電源を入れなおして、時刻確認: `date`

- 1970年とかになってる???
- 数秒(電源を落としていた時間くらい)ずれてる???


## その他

### `fake-hwclock`
- `/sbin/fake-hwclock`
    - シャットダウン時に、現在時刻を`/etc/fake-hwclock.data`へ保存。<br>(`date -u '+%Y-%m-%d %H:%M:%S' > $FILE`)
    - 起動時に、`/etc/fake-hwclock.data`を読み込み、現在時刻として、設定。
    - 参考:

        ```shell-session:fake-hwclock.dataの中身
pi@raspberrypi:/etc/init.d$ cat /etc/fake-hwclock.data
2016-06-25 01:17:01
```

- サービス: `/etc/init.d/fake-hwclock` は `/sbin/fake-hwclock`を呼ぶ
    - `stop|reload|restart|force-reload)`

        ```
            echo "Stopping fake hwclock: saving system time."
            fake-hwclock save;;
```
    - `start)`

        ```
            echo "Starting fake hwclock: loading system time."
            fake-hwclock load $FORCE ;;
```
- 通常の時刻は、`ntp`で補正... してるんだよね?
POSIX 互換シェルスクリプトでのエラトステネスの篩いろいろ

追記@2016/06/29:: 実は posix 対応じゃなかった。。ので、それを修正。

# 動機

エラトステネスの篩を実装してみようと思い立った。せっかくなので、２０年後もポータブルに動くように、 POSIX の範囲でシェルスクリプトで実装してみようと思い立った。

# 最初の実装: 関数型っぽく

シェルには標準入力・標準出力・パイプの機構がある。これらを組み合わせれば、関数型っぽく、簡潔に、記述できるのではないか、と思い立って実装してみた。

```shell-session:primes1.sh
#!/bin/sh

# usage: ./primes.sh THE_MAX_INT

elato_filter() (
    read n &&
        echo $n &&
        awk '$1 % '$n' != 0 { print $1 }' | elato_filter
)

seq 2 "$1" | elato_filter
```

素晴らしく簡潔に記述できたので、ウキウキしながら実行した結果が次。

```shell-session:実行結果
$ ./primes1.sh 100000
2
3
5
7
(略)
2833
./primes1.sh: 9: ./primes1.sh: Cannot fork
```

というわけで、篩のかずだけプロセスを実行している== fork しているので、ある種の fork 爆弾の様相を呈して、最後には fork の限界数に達して死亡した。

(与える数字が小さければ、正しく動きますヨ。。)

# 次の実装: 仕方がないので while loop で

fork をしなければいいよね！ということで、上の実装を while 文に直したものが次。パイプで並列実行するのではなく、一回一回計算しきって、その結果を変数に収納した。

```shell-session:primes2.sh
#!/bin/sh

# usage: ./primes.sh THE_MAX_INT

candidates=$(seq 2 $1)
next_prime=2

view_candidates() {
    cat <<EOF
$candidates
EOF
}

# sieve prime
sieve() {
    awk '$0 % '$1' != 0 { print $0 }'
}

while ! [ -z "$next_prime" ]
do
    echo $next_prime
    candidates=$(view_candidates | sieve $next_prime)
    next_prime=$(view_candidates | head -n 1)
done
```

ちょっと冗長になったけれども、きちんと POSIX の範囲ないで記述できたので、喜びながら実行した結果が次。

```shell-session:実行結果
$ ./primes2.sh 100000
2
3
5
(略)

$ ./primes2.sh 1000000
(略)

```

というわけで、きちんと動くようにはなったが、動きがちょっともっさりしている。

# で、結局。。 -> すべて awk で

```shell-session:primes-awk.sh
#!/bin/sh

if [ $# -ne 1 ]
then
    echo "usage: $0 MAX_INT" 1>&2
    exit 1
fi


awk -v upper=$1 '

function is_empty(arr) {
    for(elem in arr)
        return 0
    return 1
}

BEGIN {
    for(i=2; i<=upper; i++)
        candidates[i] = 1
    next_prime=2
    while (1) {
        print next_prime
        for(j=next_prime; j<= upper; j += next_prime) {
            delete candidates[j]
        }
        if(is_empty(candidates))
            break
        while(!(next_prime in candidates))
            next_prime++
    }
}'
```

```shell-session:実行結果
$ ./primes-awk.sh 1000000
2
3
5
(略)
999983
```

十分に高速に実行できるようになりました。

# 結論

POSIX シェルスクリプトで計算をごりごりやりたくなったら awk を使いましょう。
enumからNSErrorを作成する

# 初めに

`ErrorType` が追加され使用頻度が減ったとはいえ、iOSアプリ開発ではやはり必須な`NSError`。

自前のエラーを定義したい場合に、毎回domainやらcodeやらを指定してinitするのはめんどくさい。
というわけで、rawValue が `Int` なenumを使うと楽に`NSError` が作成できる。

# コード

## Enumの定義

```
let ErrorDomain = "com.hoge.hoge"

enum MyError: Int {
    case Hoge = 0
    case Fuga = 1

    func createError(userInfo: [String : AnyObject]? = nil) -> NSError {
        return NSError(domain: ErrorDomain, code: self.rawValue, userInfo: userInfo)
    }
}
```

## 使うときはこんな感じ

```
let error = MyError.Hoge.createError()
let errorWithUserInfo = MyError.Hoge.createError(["hoge" : "fuga"])

print(errorWithUserInfo) // Error Domain=com.hoge.hoge Code=0 "(null)" UserInfo={hoge=fuga}
```

# 終わりに
この方がいいんじゃね？ 的なものがあったらご教示ください。
re:dashにslack bot機能が追加されたよ！

re:dashにSlack bot機能が追加されたよ！

# 導入方法

下のページに行って、３ステップで導入可能だよ！
http://redash.io/slack

## 1. Add to Slackを押す

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

## 2. Slack botを招待する

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

## 3. re:dashのURLとuserのapikeyを入力

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

# 何ができるか

## クエリの検索とグラフの描画

`/redash query_name`でクエリを検索してそのグラフとかを描画してくれる。

## URLを貼るとグラフの描画

re:dashのクエリのURLをslackに貼ると、グラフ描画する。

# 懸念点

USERのAPIKEYが一つしかないのと、re:dash上でなんでもできてしまうので、それをbotに使うのはどうなんだ・・・というところがあるので、APIKEYのアクセスログがあると嬉しいですね。

あとは、re:dashをプライベート環境で使っている場合には、slackからのリクエストが届かないので動かないですね。これはどうしよもないですが。。。

そいえば、hipchat連携もあるみたいですね。
https://github.com/getredash/redash/tree/master/redash/destinations
Jetson TX1にOn-LapモバイルモニタとK400rワイヤレスキーボードを接続してグラフィカルモードで起動する


　[Tegra X1](http://www.nvidia.co.jp/object/tegra-x1-processor-jp.html)を搭載した開発キットの[Jetson TX1 Developer Kit](http://www.nvidia.com/object/jetson-tx1-dev-kit.html)を購入したのですがしばらく手をつけられませんでした。ようやく周辺機器を接続してOSをグラフィカルモードで起動するところまでやってみます。


## モバイルモニタ

　Raspberry PiなどPCからシリアル接続していたのですが、Jetson TX1は液晶ディスプレイを使った方が良いみたいなので、11インチモバイルモニタの[Gechic On-Lap 1101H](https://www.amazon.co.jp/dp/B018587LG4)を用意しました。USB電源できるので、フィールドでもモバイルバッテリーが使えます。

## ワイヤレスキーボード

　Jetson TX1のCPUはARM Cortex-A57です。OSはUbuntuベースの[L4T(Linux For Tegra)](https://developer.nvidia.com/embedded/linux-tegra-archive)が動作しています。ついでにUbuntuでも標準で使えるLogitechの[K400r](https://www.amazon.co.jp/dp/B009QTTI6S)ワイヤレスキーボードも揃えました。単三電池２本で動きます。右端にタッチパッドが付いているのでGUI環境もマウスなしで操作できます。

## グラフィカルモードで起動する

　Jetson TX1は付属の19V ACアダプターから電源供給します。

* HDMIポート: On-Lap 1101Hを接続
* USBポート: K400rの無線アダプターを接続

　Jetson TX1のPWRボタンを押して電源を入れます。初回はテキストモードで起動します。ubuntu:ubuntuでログインできます。

* uesrname: ubuntu
* password: ubuntu

　インストールスクリプトを実行してグラフィカルモードに切り替えます。

```bash
$ cd NVIDIA-INSTALLER
$ sudo ./install.sh
```

　スクリプトの実行が終わったらrebootします。

```bash
$ sudo reboot
```

　reboot後はグラフィカルモードで起動します。K400rのタッチパッドもそのまま認識してくれるので操作ができます。